From 1232afc4702e5a946518e1546ea1d838d32ddd0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20K=C3=BCppers?= Date: Sun, 11 May 2014 13:19:56 +0200 Subject: [PATCH] Fixed a bug where the wrong SPI mode for the external dataflash has been used in Memory.c/.h --- Firmware/Chameleon-Mini/Chameleon-Mini.bin | Bin 21344 -> 20354 bytes Firmware/Chameleon-Mini/Chameleon-Mini.eep | 2 +- Firmware/Chameleon-Mini/Chameleon-Mini.elf | Bin 281656 -> 321459 bytes Firmware/Chameleon-Mini/Chameleon-Mini.hex | 2460 ++- Firmware/Chameleon-Mini/Chameleon-Mini.lss | 21393 +++++++++---------- Firmware/Chameleon-Mini/Chameleon-Mini.map | 2819 +-- Firmware/Chameleon-Mini/Chameleon-Mini.sym | 507 +- Firmware/Chameleon-Mini/Memory.c | 6 +- 8 files changed, 13142 insertions(+), 14045 deletions(-) diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.bin b/Firmware/Chameleon-Mini/Chameleon-Mini.bin index 181609a6dabfac9d73dca7cf1093dce81a4b50f4..f3e24621d8a02e2464a836b71fc2f6185f9b0a93 100644 GIT binary patch literal 20354 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 literal 21344 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 R07)@1ECksKI<64J1prFodgK5A diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Chameleon-Mini.eep index 8515437..df5640e 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.eep @@ -1,3 +1,3 @@ -:100000000010210600060006000600060006000695 +:1000000000002106000600060006000600060006A5 :03001000000600E7 :00000001FF diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.elf b/Firmware/Chameleon-Mini/Chameleon-Mini.elf index 6128a8c68a357d5d59cf706cdff4793d47803ad9..fcea746a15aaa9ae0ecfda753c35e9dd2a11f946 100644 GIT binary patch literal 321459 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 literal 281656 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
- 69c: 0c 94 5d 29 jmp 0x52ba ; 0x52ba <_exit> + 69c: 0c 94 76 27 jmp 0x4eec ; 0x4eec <_exit> 000006a0 <__bad_interrupt>: - 6a0: 6f c0 rjmp .+222 ; 0x780 <__vector_default> + 6a0: 78 c0 rjmp .+240 ; 0x792 <__vector_default> 000006a2
: @@ -454,689 +456,725 @@ Disassembly of section .text: int main(void) { SystemInit(); - 6a2: 74 d0 rcall .+232 ; 0x78c - 6a4: f2 d6 rcall .+3556 ; 0x148a + 6a2: 7d d0 rcall .+250 ; 0x79e SettingsLoad(); - 6a6: 80 e3 ldi r24, 0x30 ; 48 - 6a8: e0 e0 ldi r30, 0x00 ; 0 + 6a4: ae d6 rcall .+3420 ; 0x1402 extern uint8_t LEDPulseMask; static inline void LEDInit(void) { LED_PORT.DIRSET = LED_MASK; - 6aa: f6 e0 ldi r31, 0x06 ; 6 - 6ac: 81 83 std Z+1, r24 ; 0x01 - 6ae: 4e d2 rcall .+1180 ; 0xb4c - 6b0: 16 d1 rcall .+556 ; 0x8de + 6a6: 80 e3 ldi r24, 0x30 ; 48 + 6a8: 80 93 01 06 sts 0x0601, r24 LEDInit(); MemoryInit(); - 6b2: b3 d7 rcall .+3942 ; 0x161a - 6b4: 9c d1 rcall .+824 ; 0x9ee + 6ac: 27 d2 rcall .+1102 ; 0xafc ConfigurationInit(); - 6b6: 73 d5 rcall .+2790 ; 0x119e - 6b8: e0 e0 ldi r30, 0x00 ; 0 + 6ae: 0d d1 rcall .+538 ; 0x8ca TerminalInit(); - 6ba: f2 e0 ldi r31, 0x02 ; 2 - 6bc: 81 e0 ldi r24, 0x01 ; 1 + 6b0: 6d d7 rcall .+3802 ; 0x158c RandomInit(); - 6be: 80 93 00 02 sts 0x0200, r24 + 6b2: 81 d1 rcall .+770 ; 0x9b6 ButtonInit(); - 6c2: 11 82 std Z+1, r1 ; 0x01 - 6c4: 92 e0 ldi r25, 0x02 ; 2 + 6b4: 35 d5 rcall .+2666 ; 0x1120 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE) static inline void AntennaLevelInit(void) { ADCA.CTRLA = ADC_ENABLE_bm; - 6c6: 92 83 std Z+2, r25 ; 0x02 - 6c8: 93 e0 ldi r25, 0x03 ; 3 - 6ca: 94 83 std Z+4, r25 ; 0x04 - 6cc: 80 a3 lds r24, 0x50 - 6ce: 88 e3 ldi r24, 0x38 ; 56 + 6b6: 81 e0 ldi r24, 0x01 ; 1 + 6b8: 80 93 00 02 sts 0x0200, r24 ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; - 6d0: 81 a3 lds r24, 0x51 + 6bc: 10 92 01 02 sts 0x0201, r1 ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; - 6d2: cc d0 rcall .+408 ; 0x86c - 6d4: c0 e0 ldi r28, 0x00 ; 0 + 6c0: 92 e0 ldi r25, 0x02 ; 2 + 6c2: 90 93 02 02 sts 0x0202, r25 ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; - 6d6: da e0 ldi r29, 0x0A ; 10 - 6d8: ff 24 eor r15, r15 + 6c6: 93 e0 ldi r25, 0x03 ; 3 + 6c8: 90 93 04 02 sts 0x0204, r25 ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; - 6da: f3 94 inc r15 + 6cc: 80 93 20 02 sts 0x0220, r24 ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc; - 6dc: 00 e0 ldi r16, 0x00 ; 0 - 6de: 16 e0 ldi r17, 0x06 ; 6 + 6d0: 88 e3 ldi r24, 0x38 ; 56 + 6d2: 80 93 21 02 sts 0x0221, r24 AntennaLevelInit(); SystemInterruptInit(); - 6e0: a1 d7 rcall .+3906 ; 0x1624 - 6e2: e0 91 fb 20 lds r30, 0x20FB - return RTC.CNT; + 6d6: ce d0 rcall .+412 ; 0x874 } INLINE bool SystemTick100ms(void) { if (TCE0.INTFLAGS & TC0_OVFIF_bm) { - 6e6: f0 91 fc 20 lds r31, 0x20FC TCE0.INTFLAGS = TC0_OVFIF_bm; - 6ea: 09 95 icall - LED_PORT.OUTSET = Mask; -} - -static inline -void LEDTick(void) { - LED_PORT.OUTCLR = LEDPulseMask; - 6ec: e0 91 01 21 lds r30, 0x2101 + 6d8: c1 e0 ldi r28, 0x01 ; 1 while(1) { TerminalTask(); - 6f0: f0 91 02 21 lds r31, 0x2102 + 6da: 5d d7 rcall .+3770 ; 0x1596 INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); } INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); - 6f4: 09 95 icall - 6f6: 80 91 0c 0a lds r24, 0x0A0C - 6fa: 80 ff sbrs r24, 0 - 6fc: f1 cf rjmp .-30 ; 0x6e0 + 6dc: e0 91 eb 20 lds r30, 0x20EB + 6e0: f0 91 ec 20 lds r31, 0x20EC + 6e4: 09 95 icall INLINE void ApplicationInit(void) { ActiveConfiguration.ApplicationInitFunc(); } INLINE void ApplicationTask(void) { ActiveConfiguration.ApplicationTaskFunc(); - 6fe: fc 86 std Y+12, r15 ; 0x0c - 700: 91 d1 rcall .+802 ; 0xa24 - 702: b1 d7 rcall .+3938 ; 0x1666 - 704: 53 d5 rcall .+2726 ; 0x11ac - 706: 80 91 a3 20 lds r24, 0x20A3 + 6e6: e0 91 f1 20 lds r30, 0x20F1 + 6ea: f0 91 f2 20 lds r31, 0x20F2 + 6ee: 09 95 icall return RTC.CNT; } INLINE bool SystemTick100ms(void) { if (TCE0.INTFLAGS & TC0_OVFIF_bm) { - 70a: f8 01 movw r30, r16 - 70c: 86 83 std Z+6, r24 ; 0x06 - 70e: 10 92 a3 20 sts 0x20A3, r1 + 6f0: 80 91 0c 0a lds r24, 0x0A0C + 6f4: 80 ff sbrs r24, 0 + 6f6: f1 cf rjmp .-30 ; 0x6da + TCE0.INTFLAGS = TC0_OVFIF_bm; + 6f8: c0 93 0c 0a sts 0x0A0C, r28 CodecTask(); ApplicationTask(); if (SystemTick100ms()) { RandomTick(); - 712: e6 cf rjmp .-52 ; 0x6e0 + 6fc: 6f d1 rcall .+734 ; 0x9dc + TerminalTick(); + 6fe: 6a d7 rcall .+3796 ; 0x15d4 + ButtonTick(); + 700: 16 d5 rcall .+2604 ; 0x112e + LED_PORT.OUTSET = Mask; +} -00000714 : +static inline +void LEDTick(void) { + LED_PORT.OUTCLR = LEDPulseMask; + 702: 80 91 93 20 lds r24, 0x2093 + 706: 80 93 06 06 sts 0x0606, r24 + LEDPulseMask = 0; + 70a: 10 92 93 20 sts 0x2093, r1 + 70e: e5 cf rjmp .-54 ; 0x6da + +00000710 : + break; + } + + *DescriptorAddress = Address; + return Size; +} + 710: 29 2f mov r18, r25 + 712: 33 27 eor r19, r19 const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) - 714: 92 30 cpi r25, 0x02 ; 2 - 716: f9 f0 breq .+62 ; 0x756 - 718: 93 30 cpi r25, 0x03 ; 3 - 71a: a1 f0 breq .+40 ; 0x744 - 71c: 91 30 cpi r25, 0x01 ; 1 - 71e: 49 f0 breq .+18 ; 0x732 + 714: 22 30 cpi r18, 0x02 ; 2 + 716: 31 05 cpc r19, r1 + 718: 39 f1 breq .+78 ; 0x768 + 71a: 23 30 cpi r18, 0x03 ; 3 + 71c: 31 05 cpc r19, r1 + 71e: a9 f0 breq .+42 ; 0x74a + 720: 21 30 cpi r18, 0x01 ; 1 + 722: 31 05 cpc r19, r1 + 724: 49 f0 breq .+18 ; 0x738 { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - 720: 80 e0 ldi r24, 0x00 ; 0 - 722: 90 e0 ldi r25, 0x00 ; 0 + 726: 20 e0 ldi r18, 0x00 ; 0 + 728: 30 e0 ldi r19, 0x00 ; 0 const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; - 724: e0 e0 ldi r30, 0x00 ; 0 - 726: f0 e0 ldi r31, 0x00 ; 0 + 72a: 80 e0 ldi r24, 0x00 ; 0 + 72c: 90 e0 ldi r25, 0x00 ; 0 } break; } *DescriptorAddress = Address; - 728: da 01 movw r26, r20 - 72a: ed 93 st X+, r30 - 72c: fc 93 st X, r31 - 72e: 11 97 sbiw r26, 0x01 ; 1 + 72e: fa 01 movw r30, r20 + 730: 80 83 st Z, r24 + 732: 91 83 std Z+1, r25 ; 0x01 return Size; } - 730: 08 95 ret + 734: c9 01 movw r24, r18 + 736: 08 95 ret switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); - 732: 82 e1 ldi r24, 0x12 ; 18 - 734: 90 e0 ldi r25, 0x00 ; 0 + 738: 22 e1 ldi r18, 0x12 ; 18 + 73a: 30 e0 ldi r19, 0x00 ; 0 uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; - 736: e6 e7 ldi r30, 0x76 ; 118 - 738: f2 e0 ldi r31, 0x02 ; 2 + 73c: 86 e7 ldi r24, 0x76 ; 118 + 73e: 92 e0 ldi r25, 0x02 ; 2 } break; } *DescriptorAddress = Address; - 73a: da 01 movw r26, r20 - 73c: ed 93 st X+, r30 - 73e: fc 93 st X, r31 - 740: 11 97 sbiw r26, 0x01 ; 1 + 740: fa 01 movw r30, r20 + 742: 80 83 st Z, r24 + 744: 91 83 std Z+1, r25 ; 0x01 return Size; } - 742: 08 95 ret + 746: c9 01 movw r24, r18 + 748: 08 95 ret + 74a: 99 27 eor r25, r25 case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: switch (DescriptorNumber) - 744: 81 30 cpi r24, 0x01 ; 1 - 746: 81 f0 breq .+32 ; 0x768 - 748: 81 30 cpi r24, 0x01 ; 1 - 74a: 98 f4 brcc .+38 ; 0x772 + 74c: 81 30 cpi r24, 0x01 ; 1 + 74e: 91 05 cpc r25, r1 + 750: a1 f0 breq .+40 ; 0x77a + 752: 82 30 cpi r24, 0x02 ; 2 + 754: 91 05 cpc r25, r1 + 756: b9 f0 breq .+46 ; 0x786 + 758: 89 2b or r24, r25 + 75a: 29 f7 brne .-54 ; 0x726 { case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); - 74c: e4 e3 ldi r30, 0x34 ; 52 - 74e: f2 e0 ldi r31, 0x02 ; 2 - 750: 84 91 lpm r24, Z - 752: 90 e0 ldi r25, 0x00 ; 0 + 75c: e4 e3 ldi r30, 0x34 ; 52 + 75e: f2 e0 ldi r31, 0x02 ; 2 + 760: 24 91 lpm r18, Z + 762: 30 e0 ldi r19, 0x00 ; 0 + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = &LanguageString; + 764: cf 01 movw r24, r30 + Size = pgm_read_byte(&LanguageString.Header.Size); break; - 754: e9 cf rjmp .-46 ; 0x728 + 766: e3 cf rjmp .-58 ; 0x72e Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); - 756: 8e e3 ldi r24, 0x3E ; 62 - 758: 90 e0 ldi r25, 0x00 ; 0 + 768: 2e e3 ldi r18, 0x3E ; 62 + 76a: 30 e0 ldi r19, 0x00 ; 0 case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; - 75a: e8 e3 ldi r30, 0x38 ; 56 - 75c: f2 e0 ldi r31, 0x02 ; 2 + 76c: 88 e3 ldi r24, 0x38 ; 56 + 76e: 92 e0 ldi r25, 0x02 ; 2 } break; } *DescriptorAddress = Address; - 75e: da 01 movw r26, r20 - 760: ed 93 st X+, r30 - 762: fc 93 st X, r31 - 764: 11 97 sbiw r26, 0x01 ; 1 + 770: fa 01 movw r30, r20 + 772: 80 83 st Z, r24 + 774: 91 83 std Z+1, r25 ; 0x01 return Size; } - 766: 08 95 ret + 776: c9 01 movw r24, r18 + 778: 08 95 ret Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); break; case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); - 768: ea e1 ldi r30, 0x1A ; 26 - 76a: f2 e0 ldi r31, 0x02 ; 2 - 76c: 84 91 lpm r24, Z - 76e: 90 e0 ldi r25, 0x00 ; 0 + 77a: ea e1 ldi r30, 0x1A ; 26 + 77c: f2 e0 ldi r31, 0x02 ; 2 + 77e: 24 91 lpm r18, Z + 780: 30 e0 ldi r19, 0x00 ; 0 + case 0x00: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); break; - 770: db cf rjmp .-74 ; 0x728 - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - switch (DescriptorNumber) - 772: 82 30 cpi r24, 0x02 ; 2 - 774: a9 f6 brne .-86 ; 0x720 + case 0x01: + Address = &ManufacturerString; + 782: cf 01 movw r24, r30 + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + 784: d4 cf rjmp .-88 ; 0x72e + case 0x02: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + 786: ec ef ldi r30, 0xFC ; 252 + 788: f1 e0 ldi r31, 0x01 ; 1 + 78a: 24 91 lpm r18, Z + 78c: 30 e0 ldi r19, 0x00 ; 0 + case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); break; case 0x02: Address = &ProductString; + 78e: cf 01 movw r24, r30 Size = pgm_read_byte(&ProductString.Header.Size); - 776: ec ef ldi r30, 0xFC ; 252 - 778: f1 e0 ldi r31, 0x01 ; 1 - 77a: 84 91 lpm r24, Z - 77c: 90 e0 ldi r25, 0x00 ; 0 break; - 77e: d4 cf rjmp .-88 ; 0x728 + 790: ce cf rjmp .-100 ; 0x72e -00000780 <__vector_default>: +00000792 <__vector_default>: #include "System.h" #include "LED.h" ISR(BADISR_vect) { - 780: 1f 92 push r1 - 782: 0f 92 push r0 - 784: 0f b6 in r0, 0x3f ; 63 - 786: 0f 92 push r0 - 788: 11 24 eor r1, r1 - 78a: ff cf rjmp .-2 ; 0x78a <__vector_default+0xa> + 792: 1f 92 push r1 + 794: 0f 92 push r0 + 796: 0f b6 in r0, 0x3f ; 63 + 798: 0f 92 push r0 + 79a: 11 24 eor r1, r1 + 79c: ff cf rjmp .-2 ; 0x79c <__vector_default+0xa> -0000078c : +0000079e : while(1); } void SystemInit(void) { if (RST.STATUS & RST_WDRF_bm) { - 78c: 80 91 78 00 lds r24, 0x0078 - 790: 83 ff sbrs r24, 3 - 792: 0a c0 rjmp .+20 ; 0x7a8 + 79e: 80 91 78 00 lds r24, 0x0078 + 7a2: 83 ff sbrs r24, 3 + 7a4: 0a c0 rjmp .+20 ; 0x7ba /* On Watchdog reset clear WDRF bit, disable watchdog * and jump into bootloader */ RST.STATUS = RST_WDRF_bm; - 794: 88 e0 ldi r24, 0x08 ; 8 - 796: 80 93 78 00 sts 0x0078, r24 + 7a6: 88 e0 ldi r24, 0x08 ; 8 + 7a8: 80 93 78 00 sts 0x0078, r24 CCP = CCP_IOREG_gc; - 79a: 88 ed ldi r24, 0xD8 ; 216 - 79c: 84 bf out 0x34, r24 ; 52 + 7ac: 88 ed ldi r24, 0xD8 ; 216 + 7ae: 84 bf out 0x34, r24 ; 52 WDT.CTRL = WDT_CEN_bm; - 79e: 81 e0 ldi r24, 0x01 ; 1 - 7a0: 80 93 80 00 sts 0x0080, r24 + 7b0: 81 e0 ldi r24, 0x01 ; 1 + 7b2: 80 93 80 00 sts 0x0080, r24 asm volatile ("jmp %0"::"i" (BOOT_SECTION_START + 0x1FC)); - 7a4: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f2e9c> + 7b6: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f327a> } /* 32MHz system clock using internal RC and 32K DFLL*/ OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm; - 7a8: 80 91 50 00 lds r24, 0x0050 - 7ac: 86 60 ori r24, 0x06 ; 6 - 7ae: 80 93 50 00 sts 0x0050, r24 + 7ba: 80 91 50 00 lds r24, 0x0050 + 7be: 86 60 ori r24, 0x06 ; 6 + 7c0: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_RC32MRDY_bm)) - 7b2: 80 91 51 00 lds r24, 0x0051 - 7b6: 81 ff sbrs r24, 1 - 7b8: fc cf rjmp .-8 ; 0x7b2 + 7c4: 80 91 51 00 lds r24, 0x0051 + 7c8: 81 ff sbrs r24, 1 + 7ca: fc cf rjmp .-8 ; 0x7c4 ; while(!(OSC.STATUS & OSC_RC32KRDY_bm)) - 7ba: 80 91 51 00 lds r24, 0x0051 - 7be: 82 ff sbrs r24, 2 - 7c0: fc cf rjmp .-8 ; 0x7ba + 7cc: 80 91 51 00 lds r24, 0x0051 + 7d0: 82 ff sbrs r24, 2 + 7d2: fc cf rjmp .-8 ; 0x7cc ; OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; - 7c2: e0 e5 ldi r30, 0x50 ; 80 - 7c4: f0 e0 ldi r31, 0x00 ; 0 - 7c6: 16 82 std Z+6, r1 ; 0x06 + 7d4: 10 92 56 00 sts 0x0056, r1 DFLLRC32M.CTRL = DFLL_ENABLE_bm; - 7c8: 21 e0 ldi r18, 0x01 ; 1 - 7ca: 20 93 60 00 sts 0x0060, r18 + 7d8: 21 e0 ldi r18, 0x01 ; 1 + 7da: 20 93 60 00 sts 0x0060, r18 CCP = CCP_IOREG_gc; - 7ce: 88 ed ldi r24, 0xD8 ; 216 - 7d0: 84 bf out 0x34, r24 ; 52 + 7de: 88 ed ldi r24, 0xD8 ; 216 + 7e0: 84 bf out 0x34, r24 ; 52 CLK.CTRL = CLK_SCLKSEL_RC32M_gc; - 7d2: 20 93 40 00 sts 0x0040, r18 + 7e2: 20 93 40 00 sts 0x0040, r18 /* Use TCE0 as system tick */ TCE0.PER = F_CPU / 256 / SYSTEM_TICK_FREQ - 1; - 7d6: 83 ed ldi r24, 0xD3 ; 211 - 7d8: 90 e3 ldi r25, 0x30 ; 48 - 7da: e0 e0 ldi r30, 0x00 ; 0 - 7dc: fa e0 ldi r31, 0x0A ; 10 - 7de: 86 a3 lds r24, 0x56 - 7e0: 97 a3 lds r25, 0x57 + 7e6: 83 ed ldi r24, 0xD3 ; 211 + 7e8: 90 e3 ldi r25, 0x30 ; 48 + 7ea: 80 93 26 0a sts 0x0A26, r24 + 7ee: 90 93 27 0a sts 0x0A27, r25 TCE0.CTRLA = TC_CLKSEL_DIV256_gc; - 7e2: 86 e0 ldi r24, 0x06 ; 6 - 7e4: 80 93 00 0a sts 0x0A00, r24 + 7f2: 86 e0 ldi r24, 0x06 ; 6 + 7f4: 80 93 00 0a sts 0x0A00, r24 /* Enable RTC with roughly 1kHz clock */ CLK.RTCCTRL = CLK_RTCSRC_ULP_gc | CLK_RTCEN_bm; - 7e8: e0 e4 ldi r30, 0x40 ; 64 - 7ea: f0 e0 ldi r31, 0x00 ; 0 - 7ec: 23 83 std Z+3, r18 ; 0x03 + 7f8: 20 93 43 00 sts 0x0043, r18 RTC.CTRL = RTC_PRESCALER_DIV1_gc; - 7ee: 20 93 00 04 sts 0x0400, r18 + 7fc: 20 93 00 04 sts 0x0400, r18 /* Enable EEPROM data memory mapping */ NVM.CTRLB |= NVM_EEMAPEN_bm; - 7f2: 80 91 cc 01 lds r24, 0x01CC - 7f6: 88 60 ori r24, 0x08 ; 8 - 7f8: e0 ec ldi r30, 0xC0 ; 192 - 7fa: f1 e0 ldi r31, 0x01 ; 1 - 7fc: 84 87 std Z+12, r24 ; 0x0c -} - 7fe: 08 95 ret + 800: 80 91 cc 01 lds r24, 0x01CC + 804: 88 60 ori r24, 0x08 ; 8 + 806: 80 93 cc 01 sts 0x01CC, r24 + 80a: 08 95 ret -00000800 : +0000080c : +} void SystemReset(void) { CCP = CCP_IOREG_gc; - 800: 88 ed ldi r24, 0xD8 ; 216 - 802: 84 bf out 0x34, r24 ; 52 + 80c: 88 ed ldi r24, 0xD8 ; 216 + 80e: 84 bf out 0x34, r24 ; 52 RST.CTRL = RST_SWRST_bm; - 804: 81 e0 ldi r24, 0x01 ; 1 - 806: e8 e7 ldi r30, 0x78 ; 120 - 808: f0 e0 ldi r31, 0x00 ; 0 - 80a: 81 83 std Z+1, r24 ; 0x01 + 810: 81 e0 ldi r24, 0x01 ; 1 + 812: e8 e7 ldi r30, 0x78 ; 120 + 814: f0 e0 ldi r31, 0x00 ; 0 + 816: 81 83 std Z+1, r24 ; 0x01 + 818: 08 95 ret +0000081a : } - 80c: 08 95 ret - -0000080e : void SystemEnterBootloader(void) { /* Use Watchdog timer to reset into bootloader. */ CCP = CCP_IOREG_gc; - 80e: 88 ed ldi r24, 0xD8 ; 216 - 810: 84 bf out 0x34, r24 ; 52 + 81a: 88 ed ldi r24, 0xD8 ; 216 + 81c: 84 bf out 0x34, r24 ; 52 WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; - 812: 8b e1 ldi r24, 0x1B ; 27 - 814: 80 93 80 00 sts 0x0080, r24 -} - 818: 08 95 ret + 81e: 8b e1 ldi r24, 0x1B ; 27 + 820: 80 93 80 00 sts 0x0080, r24 + 824: 08 95 ret -0000081a : +00000826 : void SystemStartUSBClock(void) { /* 48MHz USB Clock using 12MHz XTAL */ OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; - 81a: 8b ec ldi r24, 0xCB ; 203 - 81c: e0 e5 ldi r30, 0x50 ; 80 - 81e: f0 e0 ldi r31, 0x00 ; 0 - 820: 82 83 std Z+2, r24 ; 0x02 + 826: 8b ec ldi r24, 0xCB ; 203 + 828: 80 93 52 00 sts 0x0052, r24 OSC.CTRL |= OSC_XOSCEN_bm; - 822: 80 91 50 00 lds r24, 0x0050 - 826: 88 60 ori r24, 0x08 ; 8 - 828: 80 93 50 00 sts 0x0050, r24 + 82c: 80 91 50 00 lds r24, 0x0050 + 830: 88 60 ori r24, 0x08 ; 8 + 832: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_XOSCRDY_bm)) - 82c: 80 91 51 00 lds r24, 0x0051 - 830: 83 ff sbrs r24, 3 - 832: fc cf rjmp .-8 ; 0x82c + 836: 80 91 51 00 lds r24, 0x0051 + 83a: 83 ff sbrs r24, 3 + 83c: fc cf rjmp .-8 ; 0x836 ; OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (4 << OSC_PLLFAC_gp); - 834: 84 ec ldi r24, 0xC4 ; 196 - 836: e0 e5 ldi r30, 0x50 ; 80 - 838: f0 e0 ldi r31, 0x00 ; 0 - 83a: 85 83 std Z+5, r24 ; 0x05 + 83e: 84 ec ldi r24, 0xC4 ; 196 + 840: 80 93 55 00 sts 0x0055, r24 OSC.CTRL |= OSC_PLLEN_bm; - 83c: 80 91 50 00 lds r24, 0x0050 - 840: 80 61 ori r24, 0x10 ; 16 - 842: 80 93 50 00 sts 0x0050, r24 + 844: 80 91 50 00 lds r24, 0x0050 + 848: 80 61 ori r24, 0x10 ; 16 + 84a: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_PLLRDY_bm)) - 846: 80 91 51 00 lds r24, 0x0051 - 84a: 84 ff sbrs r24, 4 - 84c: fc cf rjmp .-8 ; 0x846 + 84e: 80 91 51 00 lds r24, 0x0051 + 852: 84 ff sbrs r24, 4 + 854: fc cf rjmp .-8 ; 0x84e ; } - 84e: 08 95 ret + 856: 08 95 ret -00000850 : +00000858 : void SystemStopUSBClock(void) { /* Disable USB Clock to minimize power consumption */ CLK.USBCTRL &= ~CLK_USBSEN_bm; - 850: e0 e4 ldi r30, 0x40 ; 64 - 852: f0 e0 ldi r31, 0x00 ; 0 - 854: 84 81 ldd r24, Z+4 ; 0x04 - 856: 8e 7f andi r24, 0xFE ; 254 - 858: 84 83 std Z+4, r24 ; 0x04 + 858: e0 e4 ldi r30, 0x40 ; 64 + 85a: f0 e0 ldi r31, 0x00 ; 0 + 85c: 84 81 ldd r24, Z+4 ; 0x04 + 85e: 8e 7f andi r24, 0xFE ; 254 + 860: 84 83 std Z+4, r24 ; 0x04 OSC.CTRL &= ~OSC_PLLEN_bm; - 85a: e0 e5 ldi r30, 0x50 ; 80 - 85c: f0 e0 ldi r31, 0x00 ; 0 - 85e: 80 81 ld r24, Z - 860: 8f 7e andi r24, 0xEF ; 239 - 862: 80 83 st Z, r24 + 862: e0 e5 ldi r30, 0x50 ; 80 + 864: f0 e0 ldi r31, 0x00 ; 0 + 866: 80 81 ld r24, Z + 868: 8f 7e andi r24, 0xEF ; 239 + 86a: 80 83 st Z, r24 OSC.CTRL &= ~OSC_XOSCEN_bm; - 864: 80 81 ld r24, Z - 866: 87 7f andi r24, 0xF7 ; 247 - 868: 80 83 st Z, r24 -} - 86a: 08 95 ret + 86c: 80 81 ld r24, Z + 86e: 87 7f andi r24, 0xF7 ; 247 + 870: 80 83 st Z, r24 + 872: 08 95 ret -0000086c : +00000874 : +} void SystemInterruptInit(void) { /* Enable all interrupt levels */ PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; - 86c: 87 e0 ldi r24, 0x07 ; 7 - 86e: e0 ea ldi r30, 0xA0 ; 160 - 870: f0 e0 ldi r31, 0x00 ; 0 - 872: 82 83 std Z+2, r24 ; 0x02 + 874: 87 e0 ldi r24, 0x07 ; 7 + 876: e0 ea ldi r30, 0xA0 ; 160 + 878: f0 e0 ldi r31, 0x00 ; 0 + 87a: 82 83 std Z+2, r24 ; 0x02 sei(); - 874: 78 94 sei -} - 876: 08 95 ret + 87c: 78 94 sei + 87e: 08 95 ret -00000878 : +00000880 : /* Include all Codecs and Applications */ #include "Codec/Codec.h" #include "Application/Application.h" static void CodecInitDummy(void) { } - 878: 08 95 ret - -0000087a : -static void CodecTaskDummy(void) { } - 87a: 08 95 ret - -0000087c : -static void ApplicationInitDummy(void) {} - 87c: 08 95 ret - -0000087e : -static void ApplicationResetDummy(void) {} - 87e: 08 95 ret - -00000880 : -static void ApplicationTaskDummy(void) {} 880: 08 95 ret -00000882 : -static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } - 882: 80 e0 ldi r24, 0x00 ; 0 - 884: 90 e0 ldi r25, 0x00 ; 0 +00000882 : +static void CodecTaskDummy(void) { } + 882: 08 95 ret + +00000884 : +static void ApplicationInitDummy(void) {} + 884: 08 95 ret + +00000886 : +static void ApplicationResetDummy(void) {} 886: 08 95 ret -00000888 : -static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } +00000888 : +static void ApplicationTaskDummy(void) {} 888: 08 95 ret -0000088a : -static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } - 88a: 08 95 ret +0000088a : +static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } + 88a: 80 e0 ldi r24, 0x00 ; 0 + 88c: 90 e0 ldi r25, 0x00 ; 0 + 88e: 08 95 ret -0000088c : +00000890 : +static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } + 890: 08 95 ret + +00000892 : +static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } + 892: 08 95 ret + +00000894 : ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); } void ConfigurationSetById( ConfigurationEnum Configuration ) { GlobalSettings.ActiveSettingPtr->Configuration = Configuration; - 88c: e0 91 0e 21 lds r30, 0x210E - 890: f0 91 0f 21 lds r31, 0x210F - 894: 81 83 std Z+1, r24 ; 0x01 + 894: e0 91 fe 20 lds r30, 0x20FE + 898: f0 91 ff 20 lds r31, 0x20FF + 89c: 81 83 std Z+1, r24 ; 0x01 /* Copy struct from PROGMEM to RAM */ memcpy_P(&ActiveConfiguration, - 896: 90 e0 ldi r25, 0x00 ; 0 - 898: 9c 01 movw r18, r24 - 89a: 22 0f add r18, r18 - 89c: 33 1f adc r19, r19 - 89e: 22 0f add r18, r18 - 8a0: 33 1f adc r19, r19 - 8a2: b9 01 movw r22, r18 - 8a4: 66 0f add r22, r22 - 8a6: 77 1f adc r23, r23 - 8a8: 66 0f add r22, r22 - 8aa: 77 1f adc r23, r23 - 8ac: 66 0f add r22, r22 - 8ae: 77 1f adc r23, r23 - 8b0: 62 0f add r22, r18 - 8b2: 73 1f adc r23, r19 - 8b4: 68 0f add r22, r24 - 8b6: 79 1f adc r23, r25 - 8b8: 68 57 subi r22, 0x78 ; 120 - 8ba: 7d 4f sbci r23, 0xFD ; 253 - 8bc: 88 ee ldi r24, 0xE8 ; 232 - 8be: 90 e2 ldi r25, 0x20 ; 32 - 8c0: 45 e2 ldi r20, 0x25 ; 37 - 8c2: 50 e0 ldi r21, 0x00 ; 0 - 8c4: 0e 94 f2 25 call 0x4be4 ; 0x4be4 + &ConfigurationTable[Configuration], sizeof(ConfigurationType)); + 89e: 95 e2 ldi r25, 0x25 ; 37 + 8a0: 89 9f mul r24, r25 + 8a2: b0 01 movw r22, r0 + 8a4: 11 24 eor r1, r1 + 8a6: 68 57 subi r22, 0x78 ; 120 + 8a8: 7d 4f sbci r23, 0xFD ; 253 +void ConfigurationSetById( ConfigurationEnum Configuration ) +{ + GlobalSettings.ActiveSettingPtr->Configuration = Configuration; + + /* Copy struct from PROGMEM to RAM */ + memcpy_P(&ActiveConfiguration, + 8aa: 45 e2 ldi r20, 0x25 ; 37 + 8ac: 50 e0 ldi r21, 0x00 ; 0 + 8ae: 88 ed ldi r24, 0xD8 ; 216 + 8b0: 90 e2 ldi r25, 0x20 ; 32 + 8b2: 0e 94 0d 24 call 0x481a ; 0x481a /* Applications */ #include "MifareClassic.h" /* Function wrappers */ INLINE void ApplicationInit(void) { ActiveConfiguration.ApplicationInitFunc(); - 8c8: e0 91 fd 20 lds r30, 0x20FD - 8cc: f0 91 fe 20 lds r31, 0x20FE - 8d0: 09 95 icall + 8b6: e0 91 ed 20 lds r30, 0x20ED + 8ba: f0 91 ee 20 lds r31, 0x20EE + 8be: 09 95 icall #define CODEC_CARRIER_FREQ 13560000 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); - 8d2: e0 91 f9 20 lds r30, 0x20F9 - 8d6: f0 91 fa 20 lds r31, 0x20FA - 8da: 09 95 icall - &ConfigurationTable[Configuration], sizeof(ConfigurationType)); + 8c0: e0 91 e9 20 lds r30, 0x20E9 + 8c4: f0 91 ea 20 lds r31, 0x20EA + 8c8: 09 94 ijmp - - ApplicationInit(); - CodecInit(); -} - 8dc: 08 95 ret - -000008de : +000008ca : ConfigurationType ActiveConfiguration; void ConfigurationInit(void) { ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); - 8de: e0 91 0e 21 lds r30, 0x210E - 8e2: f0 91 0f 21 lds r31, 0x210F - 8e6: 81 81 ldd r24, Z+1 ; 0x01 - 8e8: d1 cf rjmp .-94 ; 0x88c + 8ca: e0 91 fe 20 lds r30, 0x20FE + 8ce: f0 91 ff 20 lds r31, 0x20FF + 8d2: 81 81 ldd r24, Z+1 ; 0x01 + 8d4: df cf rjmp .-66 ; 0x894 -000008ea : - 8ea: 0f 93 push r16 -} - 8ec: 1f 93 push r17 +000008d6 : ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) { - 8ee: cf 93 push r28 - 8f0: df 93 push r29 - 8f2: ac 01 movw r20, r24 - 8f4: 20 e0 ldi r18, 0x00 ; 0 - 8f6: 30 e0 ldi r19, 0x00 ; 0 + 8d6: 0f 93 push r16 + 8d8: 1f 93 push r17 + 8da: cf 93 push r28 + 8dc: df 93 push r29 + 8de: 20 e0 ldi r18, 0x00 ; 0 + 8e0: 30 e0 ldi r19, 0x00 ; 0 + uint8_t i; + + /* Loop through table trying to find the configuration */ + for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { + const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; + 8e2: 15 e2 ldi r17, 0x25 ; 37 ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) - 8f8: 8c 01 movw r16, r24 - 8fa: 0f 5f subi r16, 0xFF ; 255 - 8fc: 1f 4f sbci r17, 0xFF ; 255 - ConfigurationSetById(i); - return true; - } - } - - return false; - 8fe: 62 2f mov r22, r18 + 8e4: ac 01 movw r20, r24 + 8e6: 4f 5f subi r20, 0xFF ; 255 + 8e8: 5f 4f sbci r21, 0xFF ; 255 + 8ea: 02 2f mov r16, r18 { uint8_t i; /* Loop through table trying to find the configuration */ for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; - 900: c9 01 movw r24, r18 - 902: 88 0f add r24, r24 - 904: 99 1f adc r25, r25 - 906: 88 0f add r24, r24 - 908: 99 1f adc r25, r25 - 90a: fc 01 movw r30, r24 - 90c: ee 0f add r30, r30 - 90e: ff 1f adc r31, r31 - 910: ee 0f add r30, r30 - 912: ff 1f adc r31, r31 - 914: ee 0f add r30, r30 - 916: ff 1f adc r31, r31 - 918: e8 0f add r30, r24 - 91a: f9 1f adc r31, r25 - 91c: e2 0f add r30, r18 - 91e: f3 1f adc r31, r19 - 920: e7 57 subi r30, 0x77 ; 119 - 922: fd 4f sbci r31, 0xFD ; 253 + 8ec: 12 9f mul r17, r18 + 8ee: f0 01 movw r30, r0 + 8f0: 13 9f mul r17, r19 + 8f2: f0 0d add r31, r0 + 8f4: 11 24 eor r1, r1 + 8f6: e7 57 subi r30, 0x77 ; 119 + 8f8: fd 4f sbci r31, 0xFD ; 253 const char* pRequestedConfigName = ConfigurationName; bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); - 924: 84 91 lpm r24, Z + 8fa: 64 91 lpm r22, Z /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - 926: da 01 movw r26, r20 + 8fc: 61 11 cpse r22, r1 + 8fe: 0f c0 rjmp .+30 ; 0x91e + uint8_t i; + + /* Loop through table trying to find the configuration */ + for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { + const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; const char* pRequestedConfigName = ConfigurationName; + 900: ec 01 movw r28, r24 + bool StringMismatch = false; + char c = pgm_read_byte(pTableConfigName); + + /* Try to keep running until both strings end at the same point */ + while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { + 902: 68 81 ld r22, Y + 904: 66 23 and r22, r22 + 906: 01 f1 breq .+64 ; 0x948 + 908: 2f 5f subi r18, 0xFF ; 255 + 90a: 3f 4f sbci r19, 0xFF ; 255 +bool ConfigurationSetByName(const char* ConfigurationName) +{ + uint8_t i; + + /* Loop through table trying to find the configuration */ + for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { + 90c: 23 30 cpi r18, 0x03 ; 3 + 90e: 31 05 cpc r19, r1 + 910: 61 f7 brne .-40 ; 0x8ea + ConfigurationSetById(i); + return true; + } + } + + return false; + 912: 80 e0 ldi r24, 0x00 ; 0 +} + 914: df 91 pop r29 + 916: cf 91 pop r28 + 918: 1f 91 pop r17 + 91a: 0f 91 pop r16 + 91c: 08 95 ret bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - 928: 88 23 and r24, r24 - 92a: 59 f0 breq .+22 ; 0x942 if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - 92c: 9c 91 ld r25, X - 92e: 99 23 and r25, r25 - 930: 59 f0 breq .+22 ; 0x948 + 91e: dc 01 movw r26, r24 + 920: 7c 91 ld r23, X + 922: 77 23 and r23, r23 + 924: 89 f3 breq .-30 ; 0x908 /* One String ended before the other did -> unequal length */ StringMismatch = true; break; } if (c != *pRequestedConfigName) { - 932: 98 17 cp r25, r24 - 934: 49 f4 brne .+18 ; 0x948 + 926: 67 13 cpse r22, r23 + 928: ef cf rjmp .-34 ; 0x908 ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) - 936: e8 01 movw r28, r16 + 92a: da 01 movw r26, r20 + 92c: 05 c0 rjmp .+10 ; 0x938 + bool StringMismatch = false; + char c = pgm_read_byte(pTableConfigName); + + /* Try to keep running until both strings end at the same point */ + while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { + if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { + 92e: 7d 91 ld r23, X+ + 930: 77 23 and r23, r23 + 932: 51 f3 breq .-44 ; 0x908 + /* One String ended before the other did -> unequal length */ + StringMismatch = true; + break; + } + + if (c != *pRequestedConfigName) { + 934: 76 13 cpse r23, r22 + 936: e8 cf rjmp .-48 ; 0x908 StringMismatch = true; break; } @@ -1145,4707 +1183,4632 @@ bool ConfigurationSetByName(const char* ConfigurationName) pTableConfigName++; 938: 31 96 adiw r30, 0x01 ; 1 pRequestedConfigName++; - 93a: 11 96 adiw r26, 0x01 ; 1 + 93a: ed 01 movw r28, r26 c = pgm_read_byte(pTableConfigName); - 93c: 84 91 lpm r24, Z + 93c: 64 91 lpm r22, Z const char* pRequestedConfigName = ConfigurationName; bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - 93e: 88 23 and r24, r24 - 940: 71 f4 brne .+28 ; 0x95e - 942: 8c 91 ld r24, X - 944: 88 23 and r24, r24 - 946: 89 f0 breq .+34 ; 0x96a - 948: 2f 5f subi r18, 0xFF ; 255 - 94a: 3f 4f sbci r19, 0xFF ; 255 -bool ConfigurationSetByName(const char* ConfigurationName) -{ - uint8_t i; - - /* Loop through table trying to find the configuration */ - for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { - 94c: 23 30 cpi r18, 0x03 ; 3 - 94e: 31 05 cpc r19, r1 - 950: b1 f6 brne .-84 ; 0x8fe - ConfigurationSetById(i); - return true; - } - } - - return false; - 952: 80 e0 ldi r24, 0x00 ; 0 -} - 954: df 91 pop r29 - 956: cf 91 pop r28 - 958: 1f 91 pop r17 - 95a: 0f 91 pop r16 - 95c: 08 95 ret - bool StringMismatch = false; - char c = pgm_read_byte(pTableConfigName); - - /* Try to keep running until both strings end at the same point */ - while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - 95e: 99 91 ld r25, Y+ - 960: 99 23 and r25, r25 - 962: 91 f3 breq .-28 ; 0x948 - /* One String ended before the other did -> unequal length */ - StringMismatch = true; - break; - } - - if (c != *pRequestedConfigName) { - 964: 98 17 cp r25, r24 - 966: 41 f3 breq .-48 ; 0x938 - 968: ef cf rjmp .-34 ; 0x948 + 93e: 61 11 cpse r22, r1 + 940: f6 cf rjmp .-20 ; 0x92e + 942: 68 81 ld r22, Y + 944: 61 11 cpse r22, r1 + 946: e0 cf rjmp .-64 ; 0x908 c = pgm_read_byte(pTableConfigName); } if (!StringMismatch) { /* Configuration found */ ConfigurationSetById(i); - 96a: 86 2f mov r24, r22 - 96c: 8f df rcall .-226 ; 0x88c - 96e: 81 e0 ldi r24, 0x01 ; 1 + 948: 80 2f mov r24, r16 + 94a: a4 df rcall .-184 ; 0x894 return true; - 970: df 91 pop r29 + 94c: 81 e0 ldi r24, 0x01 ; 1 } } return false; } - 972: cf 91 pop r28 - 974: 1f 91 pop r17 - 976: 0f 91 pop r16 - 978: 08 95 ret + 94e: df 91 pop r29 + 950: cf 91 pop r28 + 952: 1f 91 pop r17 + 954: 0f 91 pop r16 + 956: 08 95 ret -0000097a : - 97a: cf 93 push r28 +00000958 : void ConfigurationGetList(char* ConfigListOut, uint16_t ByteCount) { - 97c: df 93 push r29 - 97e: ec 01 movw r28, r24 + 958: cf 93 push r28 + 95a: df 93 push r29 + 95c: ec 01 movw r28, r24 uint8_t i; /* Account for '\0' */ ByteCount--; - 980: 61 50 subi r22, 0x01 ; 1 - 982: 70 40 sbci r23, 0x00 ; 0 - 984: 20 e0 ldi r18, 0x00 ; 0 - 986: 30 e0 ldi r19, 0x00 ; 0 + 95e: 61 50 subi r22, 0x01 ; 1 + 960: 71 09 sbc r23, r1 + 962: 80 e0 ldi r24, 0x00 ; 0 + 964: 90 e0 ldi r25, 0x00 ; 0 + + for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - 9ae: 84 91 lpm r24, Z - 9b0: 88 23 and r24, r24 - 9b2: 81 f0 breq .+32 ; 0x9d4 - 9b4: 61 31 cpi r22, 0x11 ; 17 - 9b6: 71 05 cpc r23, r1 - 9b8: 68 f0 brcs .+26 ; 0x9d4 - 9ba: de 01 movw r26, r28 - 9bc: 03 c0 rjmp .+6 ; 0x9c4 - 9be: 60 31 cpi r22, 0x10 ; 16 - 9c0: 71 05 cpc r23, r1 - 9c2: 41 f0 breq .+16 ; 0x9d4 + 978: 24 91 lpm r18, Z + 97a: 22 23 and r18, r18 + 97c: 81 f0 breq .+32 ; 0x99e + 97e: 61 31 cpi r22, 0x11 ; 17 + 980: 71 05 cpc r23, r1 + 982: 68 f0 brcs .+26 ; 0x99e + 984: de 01 movw r26, r28 + 986: 03 c0 rjmp .+6 ; 0x98e + 988: 60 31 cpi r22, 0x10 ; 16 + 98a: 71 05 cpc r23, r1 + 98c: 41 f0 breq .+16 ; 0x99e /* While not end-of-string and enough buffer to * put a complete configuration name */ *ConfigListOut++ = c; - 9c4: 8d 93 st X+, r24 - 9c6: ed 01 movw r28, r26 + 98e: 2d 93 st X+, r18 + 990: ed 01 movw r28, r26 ConfigName++; - 9c8: 31 96 adiw r30, 0x01 ; 1 + 992: 31 96 adiw r30, 0x01 ; 1 ByteCount--; - 9ca: 61 50 subi r22, 0x01 ; 1 - 9cc: 70 40 sbci r23, 0x00 ; 0 + 994: 61 50 subi r22, 0x01 ; 1 + 996: 71 09 sbc r23, r1 for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - 9ce: 84 91 lpm r24, Z - 9d0: 88 23 and r24, r24 - 9d2: a9 f7 brne .-22 ; 0x9be + 998: 24 91 lpm r18, Z + 99a: 21 11 cpse r18, r1 + 99c: f5 cf rjmp .-22 ; 0x988 *ConfigListOut++ = c; ConfigName++; ByteCount--; } if ( i < (CONFIG_COUNT - 1) ) { - 9d4: 22 30 cpi r18, 0x02 ; 2 - 9d6: 31 05 cpc r19, r1 - 9d8: 21 f4 brne .+8 ; 0x9e2 + 99e: 82 30 cpi r24, 0x02 ; 2 + 9a0: 91 05 cpc r25, r1 + 9a2: 21 f4 brne .+8 ; 0x9ac *ConfigListOut++ = ','; ByteCount--; } } *ConfigListOut = '\0'; - 9da: 18 82 st Y, r1 + 9a4: 18 82 st Y, r1 } - 9dc: df 91 pop r29 - 9de: cf 91 pop r28 - 9e0: 08 95 ret + 9a6: df 91 pop r29 + 9a8: cf 91 pop r28 + 9aa: 08 95 ret ByteCount--; } if ( i < (CONFIG_COUNT - 1) ) { /* No comma on last configuration */ *ConfigListOut++ = ','; - 9e2: 49 93 st Y+, r20 + 9ac: 49 93 st Y+, r20 ByteCount--; - 9e4: 61 50 subi r22, 0x01 ; 1 - 9e6: 70 40 sbci r23, 0x00 ; 0 - 9e8: 2f 5f subi r18, 0xFF ; 255 - 9ea: 3f 4f sbci r19, 0xFF ; 255 - 9ec: ce cf rjmp .-100 ; 0x98a + 9ae: 61 50 subi r22, 0x01 ; 1 + 9b0: 71 09 sbc r23, r1 + 9b2: 01 96 adiw r24, 0x01 ; 1 + 9b4: da cf rjmp .-76 ; 0x96a + +000009b6 : +#include "Random.h" -000009ee : #include void RandomInit(void) { + 9b6: 08 95 ret + +000009b8 : } - 9ee: 08 95 ret - -000009f0 : uint8_t RandomGetByte(void) { return rand() & 0xFF; - 9f0: 0c 94 e4 25 jmp 0x4bc8 ; 0x4bc8 + 9b8: 0c 94 ff 23 jmp 0x47fe ; 0x47fe } - 9f4: 08 95 ret + 9bc: 08 95 ret -000009f6 : +000009be : void RandomGetBuffer(void* Buffer, uint8_t ByteCount) { - 9f6: 0f 93 push r16 - 9f8: 1f 93 push r17 - 9fa: cf 93 push r28 - 9fc: df 93 push r29 + 9be: 1f 93 push r17 + 9c0: cf 93 push r28 + 9c2: df 93 push r29 + 9c4: 16 2f mov r17, r22 uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - 9fe: 66 23 and r22, r22 - a00: 61 f0 breq .+24 ; 0xa1a -uint8_t RandomGetByte(void) -{ - return rand() & 0xFF; -} - -void RandomGetBuffer(void* Buffer, uint8_t ByteCount) - a02: 8c 01 movw r16, r24 - a04: 0f 5f subi r16, 0xFF ; 255 - a06: 1f 4f sbci r17, 0xFF ; 255 -{ - uint8_t* BufferPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - a08: 61 50 subi r22, 0x01 ; 1 -uint8_t RandomGetByte(void) -{ - return rand() & 0xFF; -} - -void RandomGetBuffer(void* Buffer, uint8_t ByteCount) - a0a: 06 0f add r16, r22 - a0c: 11 1d adc r17, r1 -{ - uint8_t* BufferPtr = (uint8_t*) Buffer; - a0e: ec 01 movw r28, r24 - - while(ByteCount--) { + 9c6: 66 23 and r22, r22 + 9c8: 29 f0 breq .+10 ; 0x9d4 + 9ca: ec 01 movw r28, r24 *BufferPtr++ = RandomGetByte(); - a10: ef df rcall .-34 ; 0x9f0 - a12: 89 93 st Y+, r24 - a14: c0 17 cp r28, r16 + 9cc: f5 df rcall .-22 ; 0x9b8 + 9ce: 89 93 st Y+, r24 + 9d0: 11 50 subi r17, 0x01 ; 1 void RandomGetBuffer(void* Buffer, uint8_t ByteCount) { uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - a16: d1 07 cpc r29, r17 - a18: d9 f7 brne .-10 ; 0xa10 - a1a: df 91 pop r29 + 9d2: e1 f7 brne .-8 ; 0x9cc *BufferPtr++ = RandomGetByte(); } } - a1c: cf 91 pop r28 - a1e: 1f 91 pop r17 - a20: 0f 91 pop r16 - a22: 08 95 ret + 9d4: df 91 pop r29 + 9d6: cf 91 pop r28 + 9d8: 1f 91 pop r17 + 9da: 08 95 ret -00000a24 : - a24: 0e 94 e4 25 call 0x4bc8 ; 0x4bc8 +000009dc : void RandomTick(void) { rand(); + 9dc: 0e 94 ff 23 call 0x47fe ; 0x47fe rand(); - a28: 0e 94 e4 25 call 0x4bc8 ; 0x4bc8 + 9e0: 0e 94 ff 23 call 0x47fe ; 0x47fe rand(); - a2c: 0e 94 e4 25 call 0x4bc8 ; 0x4bc8 + 9e4: 0e 94 ff 23 call 0x47fe ; 0x47fe rand(); - a30: 0c 94 e4 25 jmp 0x4bc8 ; 0x4bc8 + 9e8: 0c 94 ff 23 jmp 0x47fe ; 0x47fe -00000a34 : +000009ec : */ #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) { - a34: cf 93 push r28 - a36: df 93 push r29 - a38: fc 01 movw r30, r24 - uint16_t CharCount = 0; - - /* Account for '\0' at the end */ - MaxChars--; - - while( (ByteCount > 0) && (MaxChars >= 2) ) { - a3a: 21 15 cp r18, r1 - a3c: 31 05 cpc r19, r1 - a3e: 81 f1 breq .+96 ; 0xaa0 -{ + 9ec: cf 93 push r28 + 9ee: df 93 push r29 + 9f0: dc 01 movw r26, r24 uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; - a40: 61 50 subi r22, 0x01 ; 1 - a42: 70 40 sbci r23, 0x00 ; 0 + 9f2: 61 50 subi r22, 0x01 ; 1 + 9f4: 71 09 sbc r23, r1 while( (ByteCount > 0) && (MaxChars >= 2) ) { - a44: 62 30 cpi r22, 0x02 ; 2 - a46: 71 05 cpc r23, r1 - a48: 58 f1 brcs .+86 ; 0xaa0 - a4a: da 01 movw r26, r20 + 9f6: 21 15 cp r18, r1 + 9f8: 31 05 cpc r19, r1 + 9fa: 99 f1 breq .+102 ; 0xa62 + 9fc: 62 30 cpi r22, 0x02 ; 2 + 9fe: 71 05 cpc r23, r1 + a00: 80 f1 brcs .+96 ; 0xa62 + a02: fa 01 movw r30, r20 + * policies, either expressed or implied, of the ORIGINAL AUTHORS. + */ + #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) + a04: 24 0f add r18, r20 + a06: 35 1f adc r19, r21 + a08: 21 50 subi r18, 0x01 ; 1 + a0a: 31 09 sbc r19, r1 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; - a4c: 40 e0 ldi r20, 0x00 ; 0 - a4e: 50 e0 ldi r21, 0x00 ; 0 - a50: 18 c0 rjmp .+48 ; 0xa82 + a0c: 40 e0 ldi r20, 0x00 ; 0 + a0e: 50 e0 ldi r21, 0x00 ; 0 + a10: 17 c0 rjmp .+46 ; 0xa40 MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { uint8_t Byte = *ByteBuffer; HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - a52: d0 5d subi r29, 0xD0 ; 208 - a54: d0 83 st Z, r29 + a12: d0 5d subi r29, 0xD0 ; 208 + a14: dc 93 st X, r29 HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); + a16: cf 70 andi r28, 0x0F ; 15 + a18: 8c 2f mov r24, r28 + a1a: 90 e0 ldi r25, 0x00 ; 0 + a1c: 0a 97 sbiw r24, 0x0a ; 10 + a1e: fc f4 brge .+62 ; 0xa5e + a20: c0 5d subi r28, 0xD0 ; 208 + a22: 11 96 adiw r26, 0x01 ; 1 + a24: cc 93 st X, r28 + a26: 11 97 sbiw r26, 0x01 ; 1 + + HexOut += 2; + a28: 12 96 adiw r26, 0x02 ; 2 + MaxChars -= 2; + a2a: 62 50 subi r22, 0x02 ; 2 + a2c: 71 09 sbc r23, r1 + CharCount += 2; + a2e: 4e 5f subi r20, 0xFE ; 254 + a30: 5f 4f sbci r21, 0xFF ; 255 + uint16_t CharCount = 0; + + /* Account for '\0' at the end */ + MaxChars--; + + while( (ByteCount > 0) && (MaxChars >= 2) ) { + a32: e2 17 cp r30, r18 + a34: f3 07 cpc r31, r19 + a36: b9 f0 breq .+46 ; 0xa66 + a38: 31 96 adiw r30, 0x01 ; 1 + a3a: 62 30 cpi r22, 0x02 ; 2 + a3c: 71 05 cpc r23, r1 + a3e: 98 f0 brcs .+38 ; 0xa66 + uint8_t Byte = *ByteBuffer; + a40: c0 81 ld r28, Z + + HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); + a42: dc 2f mov r29, r28 + a44: d2 95 swap r29 + a46: df 70 andi r29, 0x0F ; 15 + a48: 8d 2f mov r24, r29 + a4a: 90 e0 ldi r25, 0x00 ; 0 + a4c: 0a 97 sbiw r24, 0x0a ; 10 + a4e: 0c f3 brlt .-62 ; 0xa12 + a50: d9 5c subi r29, 0xC9 ; 201 + a52: dc 93 st X, r29 + HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); + a54: cf 70 andi r28, 0x0F ; 15 a56: 8c 2f mov r24, r28 a58: 90 e0 ldi r25, 0x00 ; 0 - a5a: 8f 70 andi r24, 0x0F ; 15 - a5c: 90 70 andi r25, 0x00 ; 0 - a5e: 8a 30 cpi r24, 0x0A ; 10 - a60: 91 05 cpc r25, r1 - a62: d4 f4 brge .+52 ; 0xa98 - a64: 8c 2f mov r24, r28 - a66: 8f 70 andi r24, 0x0F ; 15 - a68: 80 5d subi r24, 0xD0 ; 208 - a6a: 81 83 std Z+1, r24 ; 0x01 - - HexOut += 2; - a6c: 32 96 adiw r30, 0x02 ; 2 - MaxChars -= 2; - CharCount += 2; - a6e: 4e 5f subi r20, 0xFE ; 254 - a70: 5f 4f sbci r21, 0xFF ; 255 - ByteBuffer++; - ByteCount -= 1; - a72: 21 50 subi r18, 0x01 ; 1 - a74: 30 40 sbci r19, 0x00 ; 0 - uint16_t CharCount = 0; - - /* Account for '\0' at the end */ - MaxChars--; - - while( (ByteCount > 0) && (MaxChars >= 2) ) { - a76: b1 f0 breq .+44 ; 0xaa4 - - HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - - HexOut += 2; - MaxChars -= 2; - a78: 62 50 subi r22, 0x02 ; 2 - a7a: 70 40 sbci r23, 0x00 ; 0 - uint16_t CharCount = 0; - - /* Account for '\0' at the end */ - MaxChars--; - - while( (ByteCount > 0) && (MaxChars >= 2) ) { - a7c: 62 30 cpi r22, 0x02 ; 2 - a7e: 71 05 cpc r23, r1 - a80: 88 f0 brcs .+34 ; 0xaa4 - uint8_t Byte = *ByteBuffer; - a82: cd 91 ld r28, X+ - - HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - a84: dc 2f mov r29, r28 - a86: d2 95 swap r29 - a88: df 70 andi r29, 0x0F ; 15 - a8a: 8d 2f mov r24, r29 - a8c: 90 e0 ldi r25, 0x00 ; 0 - a8e: 8a 30 cpi r24, 0x0A ; 10 - a90: 91 05 cpc r25, r1 - a92: fc f2 brlt .-66 ; 0xa52 - a94: d9 5c subi r29, 0xC9 ; 201 - a96: de cf rjmp .-68 ; 0xa54 - HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - a98: 8c 2f mov r24, r28 - a9a: 8f 70 andi r24, 0x0F ; 15 - a9c: 89 5c subi r24, 0xC9 ; 201 - a9e: e5 cf rjmp .-54 ; 0xa6a + a5a: 0a 97 sbiw r24, 0x0a ; 10 + a5c: 0c f3 brlt .-62 ; 0xa20 + a5e: c9 5c subi r28, 0xC9 ; 201 + a60: e0 cf rjmp .-64 ; 0xa22 #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; - aa0: 40 e0 ldi r20, 0x00 ; 0 - aa2: 50 e0 ldi r21, 0x00 ; 0 + a62: 40 e0 ldi r20, 0x00 ; 0 + a64: 50 e0 ldi r21, 0x00 ; 0 CharCount += 2; ByteBuffer++; ByteCount -= 1; } *HexOut = '\0'; - aa4: 10 82 st Z, r1 + a66: 1c 92 st X, r1 return CharCount; } - aa6: ca 01 movw r24, r20 - aa8: df 91 pop r29 - aaa: cf 91 pop r28 - aac: 08 95 ret + a68: ca 01 movw r24, r20 + a6a: df 91 pop r29 + a6c: cf 91 pop r28 + a6e: 08 95 ret -00000aae : +00000a70 : uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) { - aae: cf 93 push r28 - ab0: df 93 push r29 - ab2: da 01 movw r26, r20 + a70: fa 01 movw r30, r20 uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - ab4: 2c 91 ld r18, X - ab6: 22 23 and r18, r18 - ab8: 09 f4 brne .+2 ; 0xabc - aba: 43 c0 rjmp .+134 ; 0xb42 - abc: 11 96 adiw r26, 0x01 ; 1 - abe: 3c 91 ld r19, X - ac0: 11 97 sbiw r26, 0x01 ; 1 - ac2: 33 23 and r19, r19 - ac4: f1 f1 breq .+124 ; 0xb42 - ac6: 61 15 cp r22, r1 - ac8: 71 05 cpc r23, r1 - aca: d9 f1 breq .+118 ; 0xb42 - *HexOut = '\0'; - - return CharCount; -} - -uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) - acc: 13 96 adiw r26, 0x03 ; 3 -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - ace: ec 01 movw r28, r24 - uint16_t ByteCount = 0; - ad0: 80 e0 ldi r24, 0x00 ; 0 - ad2: 90 e0 ldi r25, 0x00 ; 0 - ad4: 14 c0 rjmp .+40 ; 0xafe - - while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { + a72: 40 81 ld r20, Z + a74: 44 23 and r20, r20 + a76: f1 f1 breq .+124 ; 0xaf4 + a78: 51 81 ldd r21, Z+1 ; 0x01 + a7a: 55 23 and r21, r21 + a7c: d9 f1 breq .+118 ; 0xaf4 + a7e: 61 15 cp r22, r1 + a80: 71 05 cpc r23, r1 + a82: c1 f1 breq .+112 ; 0xaf4 + a84: dc 01 movw r26, r24 + a86: 20 e0 ldi r18, 0x00 ; 0 + a88: 30 e0 ldi r19, 0x00 ; 0 + a8a: 13 c0 rjmp .+38 ; 0xab2 if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { uint8_t Byte = 0; Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - ad6: 22 95 swap r18 - ad8: 20 7f andi r18, 0xF0 ; 240 + a8c: 42 95 swap r20 + a8e: 40 7f andi r20, 0xF0 ; 240 Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - ada: 31 34 cpi r19, 0x41 ; 65 - adc: 30 f5 brcc .+76 ; 0xb2a - ade: 34 2f mov r19, r20 - ae0: 23 2b or r18, r19 + a90: 51 34 cpi r21, 0x41 ; 65 + a92: 28 f5 brcc .+74 ; 0xade + a94: 58 2f mov r21, r24 + a96: 45 2b or r20, r21 *ByteBuffer = Byte; - ae2: 29 93 st Y+, r18 + a98: 4d 93 st X+, r20 ByteBuffer++; MaxBytes--; ByteCount++; - ae4: 01 96 adiw r24, 0x01 ; 1 - *HexOut = '\0'; - - return CharCount; -} - + a9a: 2f 5f subi r18, 0xFF ; 255 + a9c: 3f 4f sbci r19, 0xFF ; 255 + HexIn += 2; + a9e: 32 96 adiw r30, 0x02 ; 2 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) - ae6: fd 01 movw r30, r26 - ae8: 31 97 sbiw r30, 0x01 ; 1 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - aea: 20 81 ld r18, Z - aec: 22 23 and r18, r18 - aee: 31 f1 breq .+76 ; 0xb3c - af0: 3c 91 ld r19, X - af2: 33 23 and r19, r19 - af4: 31 f1 breq .+76 ; 0xb42 - af6: 12 96 adiw r26, 0x02 ; 2 - af8: 68 17 cp r22, r24 - afa: 79 07 cpc r23, r25 - afc: f9 f0 breq .+62 ; 0xb3c + aa0: 40 81 ld r20, Z + aa2: 44 23 and r20, r20 + aa4: 29 f1 breq .+74 ; 0xaf0 + aa6: 51 81 ldd r21, Z+1 ; 0x01 + aa8: 55 23 and r21, r21 + aaa: 21 f1 breq .+72 ; 0xaf4 + aac: 62 17 cp r22, r18 + aae: 73 07 cpc r23, r19 + ab0: f9 f0 breq .+62 ; 0xaf0 if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { - afe: 42 2f mov r20, r18 - b00: 40 53 subi r20, 0x30 ; 48 - b02: 4a 30 cpi r20, 0x0A ; 10 - b04: 18 f0 brcs .+6 ; 0xb0c - b06: 41 51 subi r20, 0x11 ; 17 - b08: 46 30 cpi r20, 0x06 ; 6 - b0a: d8 f4 brcc .+54 ; 0xb42 - b0c: 43 2f mov r20, r19 - b0e: 40 53 subi r20, 0x30 ; 48 - b10: 4a 30 cpi r20, 0x0A ; 10 - b12: 20 f0 brcs .+8 ; 0xb1c - b14: 53 2f mov r21, r19 - b16: 51 54 subi r21, 0x41 ; 65 - b18: 56 30 cpi r21, 0x06 ; 6 - b1a: 98 f4 brcc .+38 ; 0xb42 + ab2: 84 2f mov r24, r20 + ab4: 80 53 subi r24, 0x30 ; 48 + ab6: 8a 30 cpi r24, 0x0A ; 10 + ab8: 18 f0 brcs .+6 ; 0xac0 + aba: 81 51 subi r24, 0x11 ; 17 + abc: 86 30 cpi r24, 0x06 ; 6 + abe: d0 f4 brcc .+52 ; 0xaf4 + ac0: 85 2f mov r24, r21 + ac2: 80 53 subi r24, 0x30 ; 48 + ac4: 8a 30 cpi r24, 0x0A ; 10 + ac6: 20 f0 brcs .+8 ; 0xad0 + ac8: 95 2f mov r25, r21 + aca: 91 54 subi r25, 0x41 ; 65 + acc: 96 30 cpi r25, 0x06 ; 6 + ace: 90 f4 brcc .+36 ; 0xaf4 uint8_t Byte = 0; Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - b1c: 21 34 cpi r18, 0x41 ; 65 - b1e: d8 f2 brcs .-74 ; 0xad6 - b20: 22 95 swap r18 - b22: 20 7f andi r18, 0xF0 ; 240 - b24: 20 57 subi r18, 0x70 ; 112 + ad0: 41 34 cpi r20, 0x41 ; 65 + ad2: e0 f2 brcs .-72 ; 0xa8c + ad4: 42 95 swap r20 + ad6: 40 7f andi r20, 0xF0 ; 240 + ad8: 40 57 subi r20, 0x70 ; 112 Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - b26: 31 34 cpi r19, 0x41 ; 65 - b28: d0 f2 brcs .-76 ; 0xade - b2a: 37 53 subi r19, 0x37 ; 55 - b2c: 23 2b or r18, r19 + ada: 51 34 cpi r21, 0x41 ; 65 + adc: d8 f2 brcs .-74 ; 0xa94 + ade: 57 53 subi r21, 0x37 ; 55 + ae0: 45 2b or r20, r21 *ByteBuffer = Byte; - b2e: 29 93 st Y+, r18 + ae2: 4d 93 st X+, r20 ByteBuffer++; MaxBytes--; ByteCount++; - b30: 01 96 adiw r24, 0x01 ; 1 - *HexOut = '\0'; - - return CharCount; -} - + ae4: 2f 5f subi r18, 0xFF ; 255 + ae6: 3f 4f sbci r19, 0xFF ; 255 + HexIn += 2; + ae8: 32 96 adiw r30, 0x02 ; 2 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) - b32: fd 01 movw r30, r26 - b34: 31 97 sbiw r30, 0x01 ; 1 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - b36: 20 81 ld r18, Z - b38: 22 23 and r18, r18 - b3a: d1 f6 brne .-76 ; 0xaf0 + aea: 40 81 ld r20, Z + aec: 41 11 cpse r20, r1 + aee: db cf rjmp .-74 ; 0xaa6 /* Odd number of characters */ return 0; } return ByteCount; } - b3c: df 91 pop r29 - b3e: cf 91 pop r28 - b40: 08 95 ret + af0: c9 01 movw r24, r18 + af2: 08 95 ret } } if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { /* Odd number of characters */ return 0; - b42: 80 e0 ldi r24, 0x00 ; 0 - b44: 90 e0 ldi r25, 0x00 ; 0 + af4: 20 e0 ldi r18, 0x00 ; 0 + af6: 30 e0 ldi r19, 0x00 ; 0 } return ByteCount; } - b46: df 91 pop r29 - b48: cf 91 pop r28 - b4a: 08 95 ret + af8: c9 01 movw r24, r18 + afa: 08 95 ret -00000b4c : +00000afc : SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } void MemoryInit(void) { - b4c: cf 93 push r28 - b4e: df 93 push r29 - b50: 00 d0 rcall .+0 ; 0xb52 - b52: 00 d0 rcall .+0 ; 0xb54 - b54: cd b7 in r28, 0x3d ; 61 - b56: de b7 in r29, 0x3e ; 62 + afc: cf 93 push r28 + afe: df 93 push r29 + b00: 00 d0 rcall .+0 ; 0xb02 + b02: 00 d0 rcall .+0 ; 0xb04 + b04: cd b7 in r28, 0x3d ; 61 + b06: de b7 in r29, 0x3e ; 62 /* Configure MEMORY_FLASH_USART for SPI master mode 0 with maximum clock frequency */ MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - b58: a0 e6 ldi r26, 0x60 ; 96 - b5a: b6 e0 ldi r27, 0x06 ; 6 - b5c: 80 e1 ldi r24, 0x10 ; 16 - b5e: 15 96 adiw r26, 0x05 ; 5 - b60: 8c 93 st X, r24 - b62: 15 97 sbiw r26, 0x05 ; 5 + b08: 80 e1 ldi r24, 0x10 ; 16 + b0a: 80 93 65 06 sts 0x0665, r24 + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_SCK; + b0e: 92 e0 ldi r25, 0x02 ; 2 + b10: 90 93 66 06 sts 0x0666, r25 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_MOSI; + b14: 98 e0 ldi r25, 0x08 ; 8 + b16: 90 93 65 06 sts 0x0665, r25 + MEMORY_FLASH_PORT.DIRSET = MEMORY_FLASH_SCK | MEMORY_FLASH_MOSI | MEMORY_FLASH_CS; - b64: 9a e1 ldi r25, 0x1A ; 26 - b66: 11 96 adiw r26, 0x01 ; 1 - b68: 9c 93 st X, r25 - b6a: 11 97 sbiw r26, 0x01 ; 1 + b1a: 9a e1 ldi r25, 0x1A ; 26 + b1c: 90 93 61 06 sts 0x0661, r25 MEMORY_FLASH_USART.BAUDCTRLA = 0; - b6c: e0 ea ldi r30, 0xA0 ; 160 - b6e: f9 e0 ldi r31, 0x09 ; 9 - b70: 16 82 std Z+6, r1 ; 0x06 + b20: 10 92 a6 09 sts 0x09A6, r1 MEMORY_FLASH_USART.BAUDCTRLB = 0; - b72: 17 82 std Z+7, r1 ; 0x07 - MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc | USART_CHSIZE_8BIT_gc; - b74: 93 ec ldi r25, 0xC3 ; 195 - b76: 95 83 std Z+5, r25 ; 0x05 + b24: 10 92 a7 09 sts 0x09A7, r1 + MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; + b28: 90 ec ldi r25, 0xC0 ; 192 + b2a: 90 93 a5 09 sts 0x09A5, r25 MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; - b78: 98 e1 ldi r25, 0x18 ; 24 - b7a: 94 83 std Z+4, r25 ; 0x04 + b2e: 98 e1 ldi r25, 0x18 ; 24 + b30: 90 93 a4 09 sts 0x09A4, r25 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - b7c: 16 96 adiw r26, 0x06 ; 6 - b7e: 8c 93 st X, r24 - b80: 16 97 sbiw r26, 0x06 ; 6 + b34: 80 93 66 06 sts 0x0666, r24 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - b82: 87 ed ldi r24, 0xD7 ; 215 - b84: 80 93 a0 09 sts 0x09A0, r24 + b38: 87 ed ldi r24, 0xD7 ; 215 + b3a: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - b88: 80 91 a1 09 lds r24, 0x09A1 - b8c: 86 ff sbrs r24, 6 - b8e: fc cf rjmp .-8 ; 0xb88 + b3e: 80 91 a1 09 lds r24, 0x09A1 + b42: 86 ff sbrs r24, 6 + b44: fc cf rjmp .-8 ; 0xb3e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - b90: 80 e4 ldi r24, 0x40 ; 64 - b92: e0 ea ldi r30, 0xA0 ; 160 - b94: f9 e0 ldi r31, 0x09 ; 9 - b96: 81 83 std Z+1, r24 ; 0x01 + b46: 80 e4 ldi r24, 0x40 ; 64 + b48: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - b98: 80 91 a0 09 lds r24, 0x09A0 + b4c: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - b9c: 10 92 a0 09 sts 0x09A0, r1 + b50: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ba0: 80 91 a1 09 lds r24, 0x09A1 - ba4: 86 ff sbrs r24, 6 - ba6: fc cf rjmp .-8 ; 0xba0 + b54: 80 91 a1 09 lds r24, 0x09A1 + b58: 86 ff sbrs r24, 6 + b5a: fc cf rjmp .-8 ; 0xb54 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ba8: 80 e4 ldi r24, 0x40 ; 64 - baa: e0 ea ldi r30, 0xA0 ; 160 - bac: f9 e0 ldi r31, 0x09 ; 9 - bae: 81 83 std Z+1, r24 ; 0x01 + b5c: 80 e4 ldi r24, 0x40 ; 64 + b5e: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - bb0: 80 91 a0 09 lds r24, 0x09A0 + b62: 80 91 a0 09 lds r24, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - bb4: 90 e1 ldi r25, 0x10 ; 16 - bb6: e0 e6 ldi r30, 0x60 ; 96 - bb8: f6 e0 ldi r31, 0x06 ; 6 - bba: 95 83 std Z+5, r25 ; 0x05 + b66: 90 e1 ldi r25, 0x10 ; 16 + b68: 90 93 65 06 sts 0x0665, r25 MEMORY_FLASH_USART.BAUDCTRLB = 0; - MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc | USART_CHSIZE_8BIT_gc; + MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { - bbc: 80 fd sbrc r24, 0 - bbe: 47 c0 rjmp .+142 ; 0xc4e + b6c: 80 fd sbrc r24, 0 + b6e: 3e c0 rjmp .+124 ; 0xbec return !(FlashReadStatusRegister() & FLASH_STATUS_REG_READY_BIT); } INLINE void FlashConfigurePageSize(void) { uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; - bc0: 8d e3 ldi r24, 0x3D ; 61 - bc2: 89 83 std Y+1, r24 ; 0x01 - bc4: 8a e2 ldi r24, 0x2A ; 42 - bc6: 8a 83 std Y+2, r24 ; 0x02 - bc8: 80 e8 ldi r24, 0x80 ; 128 - bca: 8b 83 std Y+3, r24 ; 0x03 - bcc: 86 ea ldi r24, 0xA6 ; 166 - bce: 8c 83 std Y+4, r24 ; 0x04 + b70: 8d e3 ldi r24, 0x3D ; 61 + b72: 89 83 std Y+1, r24 ; 0x01 + b74: 8a e2 ldi r24, 0x2A ; 42 + b76: 8a 83 std Y+2, r24 ; 0x02 + b78: 80 e8 ldi r24, 0x80 ; 128 + b7a: 8b 83 std Y+3, r24 ; 0x03 + b7c: 86 ea ldi r24, 0xA6 ; 166 + b7e: 8c 83 std Y+4, r24 ; 0x04 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bd0: a0 e6 ldi r26, 0x60 ; 96 - bd2: b6 e0 ldi r27, 0x06 ; 6 - bd4: 20 e1 ldi r18, 0x10 ; 16 + b80: 20 e1 ldi r18, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - bd6: 37 ed ldi r19, 0xD7 ; 215 + b82: 37 ed ldi r19, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bd8: e0 ea ldi r30, 0xA0 ; 160 - bda: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - bdc: 90 e4 ldi r25, 0x40 ; 64 + b84: 90 e4 ldi r25, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bde: 16 96 adiw r26, 0x06 ; 6 - be0: 2c 93 st X, r18 - be2: 16 97 sbiw r26, 0x06 ; 6 + b86: 20 93 66 06 sts 0x0666, r18 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - be4: 30 93 a0 09 sts 0x09A0, r19 + b8a: 30 93 a0 09 sts 0x09A0, r19 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - be8: 80 91 a1 09 lds r24, 0x09A1 - bec: 86 ff sbrs r24, 6 - bee: fc cf rjmp .-8 ; 0xbe8 + b8e: 80 91 a1 09 lds r24, 0x09A1 + b92: 86 ff sbrs r24, 6 + b94: fc cf rjmp .-8 ; 0xb8e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - bf0: 91 83 std Z+1, r25 ; 0x01 + b96: 90 93 a1 09 sts 0x09A1, r25 return MEMORY_FLASH_USART.DATA; - bf2: 80 91 a0 09 lds r24, 0x09A0 + b9a: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - bf6: 10 92 a0 09 sts 0x09A0, r1 + b9e: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bfa: 80 91 a1 09 lds r24, 0x09A1 - bfe: 86 ff sbrs r24, 6 - c00: fc cf rjmp .-8 ; 0xbfa + ba2: 80 91 a1 09 lds r24, 0x09A1 + ba6: 86 ff sbrs r24, 6 + ba8: fc cf rjmp .-8 ; 0xba2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c02: 91 83 std Z+1, r25 ; 0x01 + baa: 90 93 a1 09 sts 0x09A1, r25 return MEMORY_FLASH_USART.DATA; - c04: 80 91 a0 09 lds r24, 0x09A0 + bae: 80 91 a0 09 lds r24, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - c08: 15 96 adiw r26, 0x05 ; 5 - c0a: 2c 93 st X, r18 - c0c: 15 97 sbiw r26, 0x05 ; 5 + bb2: 20 93 65 06 sts 0x0665, r18 INLINE void FlashConfigurePageSize(void) { uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; while(FlashIsBusy()); - c0e: 87 ff sbrs r24, 7 - c10: e6 cf rjmp .-52 ; 0xbde + bb6: 87 ff sbrs r24, 7 + bb8: e6 cf rjmp .-52 ; 0xb86 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - c12: 80 e1 ldi r24, 0x10 ; 16 - c14: e0 e6 ldi r30, 0x60 ; 96 - c16: f6 e0 ldi r31, 0x06 ; 6 - c18: 86 83 std Z+6, r24 ; 0x06 - SPITransferByte( (PageAddress >> 0) & 0xFF ); - SPITransferByte( 0 ); - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -void MemoryInit(void) - c1a: ce 01 movw r24, r28 - c1c: 05 96 adiw r24, 0x05 ; 5 + bba: 80 e1 ldi r24, 0x10 ; 16 + bbc: 80 93 66 06 sts 0x0666, r24 } } INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; - c1e: fe 01 movw r30, r28 - c20: 31 96 adiw r30, 0x01 ; 1 + bc0: fe 01 movw r30, r28 + bc2: 31 96 adiw r30, 0x01 ; 1 + bc4: ce 01 movw r24, r28 + bc6: 05 96 adiw r24, 0x05 ; 5 while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c22: a0 ea ldi r26, 0xA0 ; 160 - c24: b9 e0 ldi r27, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c26: 30 e4 ldi r19, 0x40 ; 64 + bc8: 30 e4 ldi r19, 0x40 ; 64 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; - c28: 21 91 ld r18, Z+ - c2a: 20 93 a0 09 sts 0x09A0, r18 + bca: 21 91 ld r18, Z+ + bcc: 20 93 a0 09 sts 0x09A0, r18 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c2e: 20 91 a1 09 lds r18, 0x09A1 - c32: 26 ff sbrs r18, 6 - c34: fc cf rjmp .-8 ; 0xc2e + bd0: 20 91 a1 09 lds r18, 0x09A1 + bd4: 26 ff sbrs r18, 6 + bd6: fc cf rjmp .-8 ; 0xbd0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c36: 11 96 adiw r26, 0x01 ; 1 - c38: 3c 93 st X, r19 - c3a: 11 97 sbiw r26, 0x01 ; 1 + bd8: 30 93 a1 09 sts 0x09A1, r19 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - c3c: 20 91 a0 09 lds r18, 0x09A0 + bdc: 20 91 a0 09 lds r18, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - c40: e8 17 cp r30, r24 - c42: f9 07 cpc r31, r25 - c44: 89 f7 brne .-30 ; 0xc28 + be0: e8 17 cp r30, r24 + be2: f9 07 cpc r31, r25 + be4: 91 f7 brne .-28 ; 0xbca while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPIWriteBlock(Sequence, sizeof(Sequence)); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - c46: 80 e1 ldi r24, 0x10 ; 16 - c48: e0 e6 ldi r30, 0x60 ; 96 - c4a: f6 e0 ldi r31, 0x06 ; 6 - c4c: 85 83 std Z+5, r24 ; 0x05 + be6: 80 e1 ldi r24, 0x10 ; 16 + be8: 80 93 65 06 sts 0x0665, r24 if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { /* Configure for 256 byte Dataflash if not already done. */ FlashConfigurePageSize(); } } - c4e: 24 96 adiw r28, 0x04 ; 4 - c50: cd bf out 0x3d, r28 ; 61 - c52: de bf out 0x3e, r29 ; 62 - c54: df 91 pop r29 - c56: cf 91 pop r28 - c58: 08 95 ret + bec: 24 96 adiw r28, 0x04 ; 4 + bee: cd bf out 0x3d, r28 ; 61 + bf0: de bf out 0x3e, r29 ; 62 + bf2: df 91 pop r29 + bf4: cf 91 pop r28 + bf6: 08 95 ret -00000c5a : +00000bf8 : void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) { - c5a: 0f 93 push r16 - c5c: 1f 93 push r17 - c5e: cf 93 push r28 - c60: df 93 push r29 - c62: ec 01 movw r28, r24 + bf8: cf 92 push r12 + bfa: df 92 push r13 + bfc: ef 92 push r14 + bfe: ff 92 push r15 + c00: 0f 93 push r16 + c02: 1f 93 push r17 + c04: fc 01 movw r30, r24 uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - c64: 8b 01 movw r16, r22 - c66: 20 e0 ldi r18, 0x00 ; 0 - c68: 30 e0 ldi r19, 0x00 ; 0 - c6a: 80 91 0d 21 lds r24, 0x210D - c6e: 90 e0 ldi r25, 0x00 ; 0 - c70: a0 e0 ldi r26, 0x00 ; 0 - c72: b0 e0 ldi r27, 0x00 ; 0 - c74: dc 01 movw r26, r24 - c76: 99 27 eor r25, r25 - c78: 88 27 eor r24, r24 - c7a: 08 0f add r16, r24 - c7c: 19 1f adc r17, r25 - c7e: 2a 1f adc r18, r26 - c80: 3b 1f adc r19, r27 + c06: 00 91 fd 20 lds r16, 0x20FD + c0a: 10 e0 ldi r17, 0x00 ; 0 + c0c: 20 e0 ldi r18, 0x00 ; 0 + c0e: 30 e0 ldi r19, 0x00 ; 0 + c10: 98 01 movw r18, r16 + c12: 11 27 eor r17, r17 + c14: 00 27 eor r16, r16 + c16: 06 0f add r16, r22 + c18: 17 1f adc r17, r23 + c1a: 21 1d adc r18, r1 + c1c: 31 1d adc r19, r1 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - c82: a0 e6 ldi r26, 0x60 ; 96 - c84: b6 e0 ldi r27, 0x06 ; 6 - c86: 60 e1 ldi r22, 0x10 ; 16 + c1e: 60 e1 ldi r22, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - c88: 77 ed ldi r23, 0xD7 ; 215 + c20: 77 ed ldi r23, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c8a: e0 ea ldi r30, 0xA0 ; 160 - c8c: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c8e: 90 e4 ldi r25, 0x40 ; 64 + c22: 90 e4 ldi r25, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - c90: 16 96 adiw r26, 0x06 ; 6 - c92: 6c 93 st X, r22 - c94: 16 97 sbiw r26, 0x06 ; 6 + c24: 60 93 66 06 sts 0x0666, r22 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - c96: 70 93 a0 09 sts 0x09A0, r23 + c28: 70 93 a0 09 sts 0x09A0, r23 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c9a: 80 91 a1 09 lds r24, 0x09A1 - c9e: 86 ff sbrs r24, 6 - ca0: fc cf rjmp .-8 ; 0xc9a + c2c: 80 91 a1 09 lds r24, 0x09A1 + c30: 86 ff sbrs r24, 6 + c32: fc cf rjmp .-8 ; 0xc2c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ca2: 91 83 std Z+1, r25 ; 0x01 + c34: 90 93 a1 09 sts 0x09A1, r25 return MEMORY_FLASH_USART.DATA; - ca4: 80 91 a0 09 lds r24, 0x09A0 + c38: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ca8: 10 92 a0 09 sts 0x09A0, r1 + c3c: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - cac: 80 91 a1 09 lds r24, 0x09A1 - cb0: 86 ff sbrs r24, 6 - cb2: fc cf rjmp .-8 ; 0xcac + c40: 80 91 a1 09 lds r24, 0x09A1 + c44: 86 ff sbrs r24, 6 + c46: fc cf rjmp .-8 ; 0xc40 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - cb4: 91 83 std Z+1, r25 ; 0x01 + c48: 90 93 a1 09 sts 0x09A1, r25 return MEMORY_FLASH_USART.DATA; - cb6: 80 91 a0 09 lds r24, 0x09A0 + c4c: 80 91 a0 09 lds r24, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - cba: 15 96 adiw r26, 0x05 ; 5 - cbc: 6c 93 st X, r22 - cbe: 15 97 sbiw r26, 0x05 ; 5 + c50: 60 93 65 06 sts 0x0665, r22 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashRead(void* Buffer, uint32_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - cc0: 87 ff sbrs r24, 7 - cc2: e6 cf rjmp .-52 ; 0xc90 + c54: 87 ff sbrs r24, 7 + c56: e6 cf rjmp .-52 ; 0xc24 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - cc4: 80 e1 ldi r24, 0x10 ; 16 - cc6: e0 e6 ldi r30, 0x60 ; 96 - cc8: f6 e0 ldi r31, 0x06 ; 6 - cca: 86 83 std Z+6, r24 ; 0x06 + c58: 80 e1 ldi r24, 0x10 ; 16 + c5a: 80 93 66 06 sts 0x0666, r24 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ccc: 83 e0 ldi r24, 0x03 ; 3 - cce: 80 93 a0 09 sts 0x09A0, r24 + c5e: 83 e0 ldi r24, 0x03 ; 3 + c60: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - cd2: 80 91 a1 09 lds r24, 0x09A1 - cd6: 86 ff sbrs r24, 6 - cd8: fc cf rjmp .-8 ; 0xcd2 + c64: 80 91 a1 09 lds r24, 0x09A1 + c68: 86 ff sbrs r24, 6 + c6a: fc cf rjmp .-8 ; 0xc64 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - cda: 80 e4 ldi r24, 0x40 ; 64 - cdc: e0 ea ldi r30, 0xA0 ; 160 - cde: f9 e0 ldi r31, 0x09 ; 9 - ce0: 81 83 std Z+1, r24 ; 0x01 + c6c: 80 e4 ldi r24, 0x40 ; 64 + c6e: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - ce2: 80 91 a0 09 lds r24, 0x09A0 + c72: 80 91 a0 09 lds r24, 0x09A0 { while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); - ce6: c9 01 movw r24, r18 - ce8: aa 27 eor r26, r26 - cea: bb 27 eor r27, r27 + c76: 69 01 movw r12, r18 + c78: ee 24 eor r14, r14 + c7a: ff 24 eor r15, r15 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - cec: 80 93 a0 09 sts 0x09A0, r24 + c7c: c0 92 a0 09 sts 0x09A0, r12 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - cf0: 80 91 a1 09 lds r24, 0x09A1 - cf4: 86 ff sbrs r24, 6 - cf6: fc cf rjmp .-8 ; 0xcf0 + c80: 80 91 a1 09 lds r24, 0x09A1 + c84: 86 ff sbrs r24, 6 + c86: fc cf rjmp .-8 ; 0xc80 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - cf8: 80 e4 ldi r24, 0x40 ; 64 - cfa: e0 ea ldi r30, 0xA0 ; 160 - cfc: f9 e0 ldi r31, 0x09 ; 9 - cfe: 81 83 std Z+1, r24 ; 0x01 + c88: 80 e4 ldi r24, 0x40 ; 64 + c8a: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - d00: 80 91 a0 09 lds r24, 0x09A0 + c8e: 80 91 a0 09 lds r24, 0x09A0 while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); SPITransferByte( (Address >> 8) & 0xFF ); - d04: bb 27 eor r27, r27 - d06: a3 2f mov r26, r19 - d08: 92 2f mov r25, r18 - d0a: 81 2f mov r24, r17 + c92: c1 2e mov r12, r17 + c94: d2 2e mov r13, r18 + c96: e3 2e mov r14, r19 + c98: ff 24 eor r15, r15 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - d0c: 80 93 a0 09 sts 0x09A0, r24 + c9a: c0 92 a0 09 sts 0x09A0, r12 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d10: 80 91 a1 09 lds r24, 0x09A1 - d14: 86 ff sbrs r24, 6 - d16: fc cf rjmp .-8 ; 0xd10 + c9e: 80 91 a1 09 lds r24, 0x09A1 + ca2: 86 ff sbrs r24, 6 + ca4: fc cf rjmp .-8 ; 0xc9e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d18: 80 e4 ldi r24, 0x40 ; 64 - d1a: e0 ea ldi r30, 0xA0 ; 160 - d1c: f9 e0 ldi r31, 0x09 ; 9 - d1e: 81 83 std Z+1, r24 ; 0x01 + ca6: 80 e4 ldi r24, 0x40 ; 64 + ca8: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - d20: 80 91 a0 09 lds r24, 0x09A0 + cac: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - d24: 00 93 a0 09 sts 0x09A0, r16 + cb0: 00 93 a0 09 sts 0x09A0, r16 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d28: 80 91 a1 09 lds r24, 0x09A1 - d2c: 86 ff sbrs r24, 6 - d2e: fc cf rjmp .-8 ; 0xd28 + cb4: 80 91 a1 09 lds r24, 0x09A1 + cb8: 86 ff sbrs r24, 6 + cba: fc cf rjmp .-8 ; 0xcb4 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d30: 80 e4 ldi r24, 0x40 ; 64 - d32: e0 ea ldi r30, 0xA0 ; 160 - d34: f9 e0 ldi r31, 0x09 ; 9 - d36: 81 83 std Z+1, r24 ; 0x01 + cbc: 80 e4 ldi r24, 0x40 ; 64 + cbe: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - d38: 80 91 a0 09 lds r24, 0x09A0 + cc2: 80 91 a0 09 lds r24, 0x09A0 INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - d3c: 41 15 cp r20, r1 - d3e: 51 05 cpc r21, r1 - d40: 71 f0 breq .+28 ; 0xd5e + cc6: 41 15 cp r20, r1 + cc8: 51 05 cpc r21, r1 + cca: 89 f0 breq .+34 ; 0xcee + /* Configure for 256 byte Dataflash if not already done. */ + FlashConfigurePageSize(); + } +} + +void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) + ccc: 4e 0f add r20, r30 + cce: 5f 1f adc r21, r31 + uint8_t* ByteBuffer = (uint8_t*) Buffer; + + while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = 0; while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d42: 90 e4 ldi r25, 0x40 ; 64 + cd0: 90 e4 ldi r25, 0x40 ; 64 INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = 0; - d44: 10 92 a0 09 sts 0x09A0, r1 + cd2: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d48: 80 91 a1 09 lds r24, 0x09A1 - d4c: 86 ff sbrs r24, 6 - d4e: fc cf rjmp .-8 ; 0xd48 + cd6: 80 91 a1 09 lds r24, 0x09A1 + cda: 86 ff sbrs r24, 6 + cdc: fc cf rjmp .-8 ; 0xcd6 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d50: 91 83 std Z+1, r25 ; 0x01 + cde: 90 93 a1 09 sts 0x09A1, r25 *ByteBuffer++ = MEMORY_FLASH_USART.DATA; - d52: 80 91 a0 09 lds r24, 0x09A0 - d56: 89 93 st Y+, r24 - d58: 41 50 subi r20, 0x01 ; 1 - d5a: 50 40 sbci r21, 0x00 ; 0 + ce2: 80 91 a0 09 lds r24, 0x09A0 + ce6: 81 93 st Z+, r24 INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - d5c: 99 f7 brne .-26 ; 0xd44 + ce8: e4 17 cp r30, r20 + cea: f5 07 cpc r31, r21 + cec: 91 f7 brne .-28 ; 0xcd2 SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); SPITransferByte( (Address >> 8) & 0xFF ); SPITransferByte( (Address >> 0) & 0xFF ); SPIReadBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - d5e: 80 e1 ldi r24, 0x10 ; 16 - d60: e0 e6 ldi r30, 0x60 ; 96 - d62: f6 e0 ldi r31, 0x06 ; 6 - d64: 85 83 std Z+5, r24 ; 0x05 + cee: 80 e1 ldi r24, 0x10 ; 16 + cf0: 80 93 65 06 sts 0x0665, r24 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; FlashRead(Buffer, FlashAddress, ByteCount); } - d66: df 91 pop r29 - d68: cf 91 pop r28 - d6a: 1f 91 pop r17 - d6c: 0f 91 pop r16 - d6e: 08 95 ret + cf4: 1f 91 pop r17 + cf6: 0f 91 pop r16 + cf8: ff 90 pop r15 + cfa: ef 90 pop r14 + cfc: df 90 pop r13 + cfe: cf 90 pop r12 + d00: 08 95 ret -00000d70 : +00000d02 : void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { - d70: 2f 92 push r2 - d72: 3f 92 push r3 - d74: 4f 92 push r4 - d76: 5f 92 push r5 - d78: 6f 92 push r6 - d7a: 7f 92 push r7 - d7c: 8f 92 push r8 - d7e: 9f 92 push r9 - d80: af 92 push r10 - d82: bf 92 push r11 - d84: cf 92 push r12 - d86: df 92 push r13 - d88: ef 92 push r14 - d8a: ff 92 push r15 - d8c: 0f 93 push r16 - d8e: 1f 93 push r17 - d90: cf 93 push r28 - d92: df 93 push r29 - d94: cd b7 in r28, 0x3d ; 61 - d96: de b7 in r29, 0x3e ; 62 - d98: 26 97 sbiw r28, 0x06 ; 6 - d9a: cd bf out 0x3d, r28 ; 61 - d9c: de bf out 0x3e, r29 ; 62 - d9e: 8b 83 std Y+3, r24 ; 0x03 - da0: 9c 83 std Y+4, r25 ; 0x04 - da2: 4a 01 movw r8, r20 + d02: 4f 92 push r4 + d04: 5f 92 push r5 + d06: 6f 92 push r6 + d08: 7f 92 push r7 + d0a: 8f 92 push r8 + d0c: 9f 92 push r9 + d0e: af 92 push r10 + d10: bf 92 push r11 + d12: cf 92 push r12 + d14: df 92 push r13 + d16: ef 92 push r14 + d18: ff 92 push r15 + d1a: 0f 93 push r16 + d1c: 1f 93 push r17 + d1e: cf 93 push r28 + d20: df 93 push r29 + d22: 9c 01 movw r18, r24 + d24: fa 01 movw r30, r20 uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - da4: 80 91 0d 21 lds r24, 0x210D + d26: 80 91 fd 20 lds r24, 0x20FD + d2a: 90 e0 ldi r25, 0x00 ; 0 + d2c: a0 e0 ldi r26, 0x00 ; 0 + d2e: b0 e0 ldi r27, 0x00 ; 0 + d30: dc 01 movw r26, r24 + d32: 99 27 eor r25, r25 + d34: 88 27 eor r24, r24 + d36: 86 0f add r24, r22 + d38: 97 1f adc r25, r23 + d3a: a1 1d adc r26, r1 + d3c: b1 1d adc r27, r1 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - da8: 41 15 cp r20, r1 - daa: 51 05 cpc r21, r1 - dac: 09 f4 brne .+2 ; 0xdb0 - dae: 1e c1 rjmp .+572 ; 0xfec - FlashRead(Buffer, FlashAddress, ByteCount); -} - -void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) -{ - uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - db0: 6b 01 movw r12, r22 - db2: ee 24 eor r14, r14 - db4: ff 24 eor r15, r15 - db6: 90 e0 ldi r25, 0x00 ; 0 - db8: a0 e0 ldi r26, 0x00 ; 0 - dba: b0 e0 ldi r27, 0x00 ; 0 - dbc: dc 01 movw r26, r24 - dbe: 99 27 eor r25, r25 - dc0: 88 27 eor r24, r24 - dc2: c8 0e add r12, r24 - dc4: d9 1e adc r13, r25 - dc6: ea 1e adc r14, r26 - dc8: fb 1e adc r15, r27 -INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) -{ - while(ByteCount > 0) { + d3e: 30 97 sbiw r30, 0x00 ; 0 + d40: 09 f4 brne .+2 ; 0xd44 + d42: 11 c1 rjmp .+546 ; 0xf66 uint16_t PageAddress = Address / MEMORY_PAGE_SIZE; uint8_t ByteAddress = Address % MEMORY_PAGE_SIZE; uint16_t PageBytes = MIN(MEMORY_PAGE_SIZE - ByteAddress, ByteCount); - dca: 21 2c mov r2, r1 - dcc: 01 e0 ldi r16, 0x01 ; 1 - dce: 30 2e mov r3, r16 + d44: e1 2c mov r14, r1 + d46: ff 24 eor r15, r15 + d48: f3 94 inc r15 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - dd0: 00 e1 ldi r16, 0x10 ; 16 - dd2: 30 e1 ldi r19, 0x10 ; 16 + d4a: 10 e1 ldi r17, 0x10 ; 16 + d4c: c1 2e mov r12, r17 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - dd4: 47 ed ldi r20, 0xD7 ; 215 + d4e: 07 ed ldi r16, 0xD7 ; 215 + d50: b0 2e mov r11, r16 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - dd6: e0 ea ldi r30, 0xA0 ; 160 - dd8: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - dda: 50 e4 ldi r21, 0x40 ; 64 - ddc: 20 e4 ldi r18, 0x40 ; 64 + d52: 40 e4 ldi r20, 0x40 ; 64 + d54: d4 2e mov r13, r20 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - dde: 10 e6 ldi r17, 0x60 ; 96 - de0: 61 2e mov r6, r17 - de2: 16 e0 ldi r17, 0x06 ; 6 - de4: 71 2e mov r7, r17 - de6: 60 e1 ldi r22, 0x10 ; 16 + d56: 50 e1 ldi r21, 0x10 ; 16 + d58: a5 2e mov r10, r21 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - de8: 17 ed ldi r17, 0xD7 ; 215 - dea: 24 01 movw r4, r8 - dec: 46 01 movw r8, r12 - dee: 57 01 movw r10, r14 + d5a: 67 ed ldi r22, 0xD7 ; 215 + d5c: 96 2e mov r9, r22 + d5e: 73 e5 ldi r23, 0x53 ; 83 + d60: 47 2e mov r4, r23 + d62: c4 e8 ldi r28, 0x84 ; 132 + d64: 5c 2e mov r5, r28 + d66: d3 e8 ldi r29, 0x83 ; 131 + d68: 6d 2e mov r6, r29 } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { uint16_t PageAddress = Address / MEMORY_PAGE_SIZE; - df0: bb 27 eor r27, r27 - df2: ab 2d mov r26, r11 - df4: 9a 2d mov r25, r10 - df6: 89 2d mov r24, r9 - df8: 7c 01 movw r14, r24 + d6a: 49 2f mov r20, r25 + d6c: 5a 2f mov r21, r26 + d6e: 6b 2f mov r22, r27 + d70: 77 27 eor r23, r23 + d72: 85 2e mov r8, r21 uint8_t ByteAddress = Address % MEMORY_PAGE_SIZE; - dfa: 98 2d mov r25, r8 + d74: d8 2f mov r29, r24 uint16_t PageBytes = MIN(MEMORY_PAGE_SIZE - ByteAddress, ByteCount); - dfc: 61 01 movw r12, r2 - dfe: c8 18 sub r12, r8 - e00: d1 08 sbc r13, r1 - e02: 4c 14 cp r4, r12 - e04: 5d 04 cpc r5, r13 - e06: 08 f4 brcc .+2 ; 0xe0a - e08: 62 01 movw r12, r4 + d76: 87 01 movw r16, r14 + d78: 08 1b sub r16, r24 + d7a: 11 09 sbc r17, r1 + d7c: e0 17 cp r30, r16 + d7e: f1 07 cpc r31, r17 + d80: 08 f4 brcc .+2 ; 0xd84 + d82: 8f 01 movw r16, r30 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e0a: 60 93 66 06 sts 0x0666, r22 + d84: a0 92 66 06 sts 0x0666, r10 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e0e: 10 93 a0 09 sts 0x09A0, r17 + d88: 90 92 a0 09 sts 0x09A0, r9 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e12: 80 91 a1 09 lds r24, 0x09A1 - e16: 86 ff sbrs r24, 6 - e18: fc cf rjmp .-8 ; 0xe12 + d8c: c0 91 a1 09 lds r28, 0x09A1 + d90: c6 ff sbrs r28, 6 + d92: fc cf rjmp .-8 ; 0xd8c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e1a: 21 83 std Z+1, r18 ; 0x01 + d94: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - e1c: 80 91 a0 09 lds r24, 0x09A0 + d98: c0 91 a0 09 lds r28, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e20: 10 92 a0 09 sts 0x09A0, r1 + d9c: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e24: 80 91 a1 09 lds r24, 0x09A1 - e28: 86 ff sbrs r24, 6 - e2a: fc cf rjmp .-8 ; 0xe24 + da0: c0 91 a1 09 lds r28, 0x09A1 + da4: c6 ff sbrs r28, 6 + da6: fc cf rjmp .-8 ; 0xda0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e2c: 21 83 std Z+1, r18 ; 0x01 + da8: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - e2e: 80 91 a0 09 lds r24, 0x09A0 + dac: c0 91 a0 09 lds r28, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - e32: 30 93 65 06 sts 0x0665, r19 + db0: c0 92 65 06 sts 0x0665, r12 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashMemoryToBuffer(uint16_t PageAddress) { while(FlashIsBusy()); - e36: 87 ff sbrs r24, 7 - e38: e8 cf rjmp .-48 ; 0xe0a + db4: c7 ff sbrs r28, 7 + db6: e6 cf rjmp .-52 ; 0xd84 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e3a: d3 01 movw r26, r6 - e3c: 16 96 adiw r26, 0x06 ; 6 - e3e: 3c 93 st X, r19 + db8: a0 92 66 06 sts 0x0666, r10 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e40: b3 e5 ldi r27, 0x53 ; 83 - e42: b0 93 a0 09 sts 0x09A0, r27 + dbc: 40 92 a0 09 sts 0x09A0, r4 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e46: 80 91 a1 09 lds r24, 0x09A1 - e4a: 86 ff sbrs r24, 6 - e4c: fc cf rjmp .-8 ; 0xe46 + dc0: c0 91 a1 09 lds r28, 0x09A1 + dc4: c6 ff sbrs r28, 6 + dc6: fc cf rjmp .-8 ; 0xdc0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e4e: 51 83 std Z+1, r21 ; 0x01 + dc8: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - e50: 80 91 a0 09 lds r24, 0x09A0 + dcc: c0 91 a0 09 lds r28, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e54: f0 92 a0 09 sts 0x09A0, r15 + dd0: 80 92 a0 09 sts 0x09A0, r8 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e58: 80 91 a1 09 lds r24, 0x09A1 - e5c: 86 ff sbrs r24, 6 - e5e: fc cf rjmp .-8 ; 0xe58 + dd4: c0 91 a1 09 lds r28, 0x09A1 + dd8: c6 ff sbrs r28, 6 + dda: fc cf rjmp .-8 ; 0xdd4 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e60: 51 83 std Z+1, r21 ; 0x01 + ddc: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - e62: 80 91 a0 09 lds r24, 0x09A0 + de0: c0 91 a0 09 lds r28, 0x09A0 + while(FlashIsBusy()); + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + SPITransferByte(FLASH_CMD_MEM_TO_BUF1); + SPITransferByte( (PageAddress >> 8) & 0xFF ); + SPITransferByte( (PageAddress >> 0) & 0xFF ); + de4: 74 2e mov r7, r20 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e66: e0 92 a0 09 sts 0x09A0, r14 + de6: 40 93 a0 09 sts 0x09A0, r20 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e6a: 80 91 a1 09 lds r24, 0x09A1 - e6e: 86 ff sbrs r24, 6 - e70: fc cf rjmp .-8 ; 0xe6a + dea: 40 91 a1 09 lds r20, 0x09A1 + dee: 46 ff sbrs r20, 6 + df0: fc cf rjmp .-8 ; 0xdea MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e72: 51 83 std Z+1, r21 ; 0x01 + df2: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - e74: 80 91 a0 09 lds r24, 0x09A0 + df6: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e78: 10 92 a0 09 sts 0x09A0, r1 + dfa: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e7c: 80 91 a1 09 lds r24, 0x09A1 - e80: 86 ff sbrs r24, 6 - e82: fc cf rjmp .-8 ; 0xe7c + dfe: 40 91 a1 09 lds r20, 0x09A1 + e02: 46 ff sbrs r20, 6 + e04: fc cf rjmp .-8 ; 0xdfe MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e84: 51 83 std Z+1, r21 ; 0x01 + e06: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - e86: 80 91 a0 09 lds r24, 0x09A0 + e0a: 40 91 a0 09 lds r20, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_MEM_TO_BUF1); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - e8a: 00 93 65 06 sts 0x0665, r16 + e0e: c0 92 65 06 sts 0x0665, r12 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e8e: 30 93 66 06 sts 0x0666, r19 + e12: c0 92 66 06 sts 0x0666, r12 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e92: 40 93 a0 09 sts 0x09A0, r20 + e16: b0 92 a0 09 sts 0x09A0, r11 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e96: 80 91 a1 09 lds r24, 0x09A1 - e9a: 86 ff sbrs r24, 6 - e9c: fc cf rjmp .-8 ; 0xe96 + e1a: 40 91 a1 09 lds r20, 0x09A1 + e1e: 46 ff sbrs r20, 6 + e20: fc cf rjmp .-8 ; 0xe1a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e9e: 21 83 std Z+1, r18 ; 0x01 + e22: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - ea0: 80 91 a0 09 lds r24, 0x09A0 + e26: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ea4: 10 92 a0 09 sts 0x09A0, r1 + e2a: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ea8: 80 91 a1 09 lds r24, 0x09A1 - eac: 86 ff sbrs r24, 6 - eae: fc cf rjmp .-8 ; 0xea8 + e2e: 40 91 a1 09 lds r20, 0x09A1 + e32: 46 ff sbrs r20, 6 + e34: fc cf rjmp .-8 ; 0xe2e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - eb0: 21 83 std Z+1, r18 ; 0x01 + e36: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - eb2: 80 91 a0 09 lds r24, 0x09A0 + e3a: 40 91 a0 09 lds r20, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - eb6: 30 93 65 06 sts 0x0665, r19 + e3e: c0 92 65 06 sts 0x0665, r12 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWriteBuffer(const void* Buffer, uint8_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - eba: 87 ff sbrs r24, 7 - ebc: e8 cf rjmp .-48 ; 0xe8e + e42: 47 ff sbrs r20, 7 + e44: e6 cf rjmp .-52 ; 0xe12 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - ebe: d3 01 movw r26, r6 - ec0: 16 96 adiw r26, 0x06 ; 6 - ec2: 3c 93 st X, r19 + e46: a0 92 66 06 sts 0x0666, r10 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ec4: b4 e8 ldi r27, 0x84 ; 132 - ec6: b0 93 a0 09 sts 0x09A0, r27 + e4a: 50 92 a0 09 sts 0x09A0, r5 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - eca: 80 91 a1 09 lds r24, 0x09A1 - ece: 86 ff sbrs r24, 6 - ed0: fc cf rjmp .-8 ; 0xeca + e4e: 40 91 a1 09 lds r20, 0x09A1 + e52: 46 ff sbrs r20, 6 + e54: fc cf rjmp .-8 ; 0xe4e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ed2: 51 83 std Z+1, r21 ; 0x01 + e56: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - ed4: 80 91 a0 09 lds r24, 0x09A0 + e5a: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ed8: 10 92 a0 09 sts 0x09A0, r1 + e5e: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - edc: 80 91 a1 09 lds r24, 0x09A1 - ee0: 86 ff sbrs r24, 6 - ee2: fc cf rjmp .-8 ; 0xedc + e62: 40 91 a1 09 lds r20, 0x09A1 + e66: 46 ff sbrs r20, 6 + e68: fc cf rjmp .-8 ; 0xe62 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ee4: 51 83 std Z+1, r21 ; 0x01 + e6a: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - ee6: 80 91 a0 09 lds r24, 0x09A0 + e6e: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - eea: 10 92 a0 09 sts 0x09A0, r1 + e72: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - eee: 80 91 a1 09 lds r24, 0x09A1 - ef2: 86 ff sbrs r24, 6 - ef4: fc cf rjmp .-8 ; 0xeee + e76: 40 91 a1 09 lds r20, 0x09A1 + e7a: 46 ff sbrs r20, 6 + e7c: fc cf rjmp .-8 ; 0xe76 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ef6: 51 83 std Z+1, r21 ; 0x01 + e7e: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - ef8: 80 91 a0 09 lds r24, 0x09A0 + e82: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - efc: 90 93 a0 09 sts 0x09A0, r25 + e86: d0 93 a0 09 sts 0x09A0, r29 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f00: 80 91 a1 09 lds r24, 0x09A1 - f04: 86 ff sbrs r24, 6 - f06: fc cf rjmp .-8 ; 0xf00 + e8a: 40 91 a1 09 lds r20, 0x09A1 + e8e: 46 ff sbrs r20, 6 + e90: fc cf rjmp .-8 ; 0xe8a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f08: 51 83 std Z+1, r21 ; 0x01 + e92: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - f0a: 80 91 a0 09 lds r24, 0x09A0 + e96: 40 91 a0 09 lds r20, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - f0e: c1 14 cp r12, r1 - f10: d1 04 cpc r13, r1 - f12: d9 f0 breq .+54 ; 0xf4a - f14: c6 01 movw r24, r12 + e9a: 01 15 cp r16, r1 + e9c: 11 05 cpc r17, r1 + e9e: 91 f0 breq .+36 ; 0xec4 +{ + uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; + FlashRead(Buffer, FlashAddress, ByteCount); +} + +void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) + ea0: a9 01 movw r20, r18 + ea2: 40 0f add r20, r16 + ea4: 51 1f adc r21, r17 } } INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; - f16: ab 81 ldd r26, Y+3 ; 0x03 - f18: ad 83 std Y+5, r26 ; 0x05 - f1a: bc 81 ldd r27, Y+4 ; 0x04 - f1c: be 83 std Y+6, r27 ; 0x06 - f1e: c9 82 std Y+1, r12 ; 0x01 - f20: da 82 std Y+2, r13 ; 0x02 - f22: ad 81 ldd r26, Y+5 ; 0x05 - f24: be 81 ldd r27, Y+6 ; 0x06 + ea6: e9 01 movw r28, r18 while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; - f26: 7d 91 ld r23, X+ - f28: 70 93 a0 09 sts 0x09A0, r23 - f2c: 6d 01 movw r12, r26 - f2e: dc 01 movw r26, r24 + ea8: 69 91 ld r22, Y+ + eaa: 60 93 a0 09 sts 0x09A0, r22 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f30: 80 91 a1 09 lds r24, 0x09A1 - f34: 86 ff sbrs r24, 6 - f36: fc cf rjmp .-8 ; 0xf30 - f38: cd 01 movw r24, r26 - f3a: d6 01 movw r26, r12 + eae: 60 91 a1 09 lds r22, 0x09A1 + eb2: 66 ff sbrs r22, 6 + eb4: fc cf rjmp .-8 ; 0xeae MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f3c: 21 83 std Z+1, r18 ; 0x01 + eb6: d0 92 a1 09 sts 0x09A1, r13 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - f3e: 70 91 a0 09 lds r23, 0x09A0 - f42: 01 97 sbiw r24, 0x01 ; 1 + eba: 60 91 a0 09 lds r22, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - f44: 81 f7 brne .-32 ; 0xf26 - f46: c9 80 ldd r12, Y+1 ; 0x01 - f48: da 80 ldd r13, Y+2 ; 0x02 + ebe: c4 17 cp r28, r20 + ec0: d5 07 cpc r29, r21 + ec2: 91 f7 brne .-28 ; 0xea8 SPITransferByte(FLASH_CMD_BUF1_WRITE); SPITransferByte( 0 ); SPITransferByte( 0 ); SPITransferByte( Address ); SPIWriteBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f4a: 00 93 65 06 sts 0x0665, r16 + ec4: c0 92 65 06 sts 0x0665, r12 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f4e: 30 93 66 06 sts 0x0666, r19 + ec8: c0 92 66 06 sts 0x0666, r12 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f52: 40 93 a0 09 sts 0x09A0, r20 + ecc: b0 92 a0 09 sts 0x09A0, r11 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f56: 80 91 a1 09 lds r24, 0x09A1 - f5a: 86 ff sbrs r24, 6 - f5c: fc cf rjmp .-8 ; 0xf56 + ed0: 40 91 a1 09 lds r20, 0x09A1 + ed4: 46 ff sbrs r20, 6 + ed6: fc cf rjmp .-8 ; 0xed0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f5e: 21 83 std Z+1, r18 ; 0x01 + ed8: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - f60: 80 91 a0 09 lds r24, 0x09A0 + edc: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f64: 10 92 a0 09 sts 0x09A0, r1 + ee0: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f68: 80 91 a1 09 lds r24, 0x09A1 - f6c: 86 ff sbrs r24, 6 - f6e: fc cf rjmp .-8 ; 0xf68 + ee4: 40 91 a1 09 lds r20, 0x09A1 + ee8: 46 ff sbrs r20, 6 + eea: fc cf rjmp .-8 ; 0xee4 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f70: 21 83 std Z+1, r18 ; 0x01 + eec: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - f72: 80 91 a0 09 lds r24, 0x09A0 + ef0: 40 91 a0 09 lds r20, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f76: 30 93 65 06 sts 0x0665, r19 + ef4: c0 92 65 06 sts 0x0665, r12 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashBufferToMemory(uint16_t PageAddress) { while(FlashIsBusy()); - f7a: 87 ff sbrs r24, 7 - f7c: e8 cf rjmp .-48 ; 0xf4e + ef8: 47 ff sbrs r20, 7 + efa: e6 cf rjmp .-52 ; 0xec8 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f7e: d3 01 movw r26, r6 - f80: 16 96 adiw r26, 0x06 ; 6 - f82: 3c 93 st X, r19 + efc: a0 92 66 06 sts 0x0666, r10 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f84: b3 e8 ldi r27, 0x83 ; 131 - f86: b0 93 a0 09 sts 0x09A0, r27 + f00: 60 92 a0 09 sts 0x09A0, r6 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f8a: 80 91 a1 09 lds r24, 0x09A1 - f8e: 86 ff sbrs r24, 6 - f90: fc cf rjmp .-8 ; 0xf8a + f04: 40 91 a1 09 lds r20, 0x09A1 + f08: 46 ff sbrs r20, 6 + f0a: fc cf rjmp .-8 ; 0xf04 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f92: 51 83 std Z+1, r21 ; 0x01 + f0c: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - f94: 80 91 a0 09 lds r24, 0x09A0 + f10: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f98: f0 92 a0 09 sts 0x09A0, r15 + f14: 80 92 a0 09 sts 0x09A0, r8 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f9c: 80 91 a1 09 lds r24, 0x09A1 - fa0: 86 ff sbrs r24, 6 - fa2: fc cf rjmp .-8 ; 0xf9c + f18: 40 91 a1 09 lds r20, 0x09A1 + f1c: 46 ff sbrs r20, 6 + f1e: fc cf rjmp .-8 ; 0xf18 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fa4: 51 83 std Z+1, r21 ; 0x01 + f20: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - fa6: 80 91 a0 09 lds r24, 0x09A0 + f24: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - faa: e0 92 a0 09 sts 0x09A0, r14 + f28: 70 92 a0 09 sts 0x09A0, r7 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fae: 80 91 a1 09 lds r24, 0x09A1 - fb2: 86 ff sbrs r24, 6 - fb4: fc cf rjmp .-8 ; 0xfae + f2c: 40 91 a1 09 lds r20, 0x09A1 + f30: 46 ff sbrs r20, 6 + f32: fc cf rjmp .-8 ; 0xf2c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fb6: 51 83 std Z+1, r21 ; 0x01 + f34: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - fb8: 80 91 a0 09 lds r24, 0x09A0 + f38: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - fbc: 10 92 a0 09 sts 0x09A0, r1 + f3c: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fc0: 80 91 a1 09 lds r24, 0x09A1 - fc4: 86 ff sbrs r24, 6 - fc6: fc cf rjmp .-8 ; 0xfc0 + f40: 40 91 a1 09 lds r20, 0x09A1 + f44: 46 ff sbrs r20, 6 + f46: fc cf rjmp .-8 ; 0xf40 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fc8: 51 83 std Z+1, r21 ; 0x01 + f48: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - fca: 80 91 a0 09 lds r24, 0x09A0 + f4c: 40 91 a0 09 lds r20, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_BUF1_TO_MEM_ERASE); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - fce: 00 93 65 06 sts 0x0665, r16 + f50: c0 92 65 06 sts 0x0665, r12 FlashMemoryToBuffer(PageAddress); FlashWriteBuffer(Buffer, ByteAddress, PageBytes); FlashBufferToMemory(PageAddress); ByteCount -= PageBytes; - fd2: 4c 18 sub r4, r12 - fd4: 5d 08 sbc r5, r13 + f54: e0 1b sub r30, r16 + f56: f1 0b sbc r31, r17 Address += PageBytes; - fd6: c6 01 movw r24, r12 - fd8: a0 e0 ldi r26, 0x00 ; 0 - fda: b0 e0 ldi r27, 0x00 ; 0 - fdc: 88 0e add r8, r24 - fde: 99 1e adc r9, r25 - fe0: aa 1e adc r10, r26 - fe2: bb 1e adc r11, r27 + f58: 80 0f add r24, r16 + f5a: 91 1f adc r25, r17 + f5c: a1 1d adc r26, r1 + f5e: b1 1d adc r27, r1 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - fe4: 41 14 cp r4, r1 - fe6: 51 04 cpc r5, r1 - fe8: 09 f0 breq .+2 ; 0xfec - fea: 02 cf rjmp .-508 ; 0xdf0 + f60: 30 97 sbiw r30, 0x00 ; 0 + f62: 09 f0 breq .+2 ; 0xf66 + f64: 02 cf rjmp .-508 ; 0xd6a void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; FlashWrite(Buffer, FlashAddress, ByteCount); } - fec: 26 96 adiw r28, 0x06 ; 6 - fee: cd bf out 0x3d, r28 ; 61 - ff0: de bf out 0x3e, r29 ; 62 - ff2: df 91 pop r29 - ff4: cf 91 pop r28 - ff6: 1f 91 pop r17 - ff8: 0f 91 pop r16 - ffa: ff 90 pop r15 - ffc: ef 90 pop r14 - ffe: df 90 pop r13 - 1000: cf 90 pop r12 - 1002: bf 90 pop r11 - 1004: af 90 pop r10 - 1006: 9f 90 pop r9 - 1008: 8f 90 pop r8 - 100a: 7f 90 pop r7 - 100c: 6f 90 pop r6 - 100e: 5f 90 pop r5 - 1010: 4f 90 pop r4 - 1012: 3f 90 pop r3 - 1014: 2f 90 pop r2 - 1016: 08 95 ret + f66: df 91 pop r29 + f68: cf 91 pop r28 + f6a: 1f 91 pop r17 + f6c: 0f 91 pop r16 + f6e: ff 90 pop r15 + f70: ef 90 pop r14 + f72: df 90 pop r13 + f74: cf 90 pop r12 + f76: bf 90 pop r11 + f78: af 90 pop r10 + f7a: 9f 90 pop r9 + f7c: 8f 90 pop r8 + f7e: 7f 90 pop r7 + f80: 6f 90 pop r6 + f82: 5f 90 pop r5 + f84: 4f 90 pop r4 + f86: 08 95 ret -00001018 : +00000f88 : void MemoryClear(void) { - 1018: 1f 93 push r17 - 101a: cf 93 push r28 - 101c: df 93 push r29 uint32_t PageAddress = ((uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING) / MEMORY_PAGE_SIZE; - 101e: 80 91 0d 21 lds r24, 0x210D - 1022: 90 e0 ldi r25, 0x00 ; 0 - 1024: a0 e0 ldi r26, 0x00 ; 0 - 1026: b0 e0 ldi r27, 0x00 ; 0 - 1028: ba 2f mov r27, r26 - 102a: a9 2f mov r26, r25 - 102c: 98 2f mov r25, r24 - 102e: 88 27 eor r24, r24 + f88: 80 91 fd 20 lds r24, 0x20FD + f8c: 90 e0 ldi r25, 0x00 ; 0 + f8e: a0 e0 ldi r26, 0x00 ; 0 + f90: b0 e0 ldi r27, 0x00 ; 0 + f92: ba 2f mov r27, r26 + f94: a9 2f mov r26, r25 + f96: 98 2f mov r25, r24 + f98: 88 27 eor r24, r24 { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; FlashWrite(Buffer, FlashAddress, ByteCount); } void MemoryClear(void) - 1030: 9c 01 movw r18, r24 - 1032: 20 50 subi r18, 0x00 ; 0 - 1034: 3f 4f sbci r19, 0xFF ; 255 + f9a: 9c 01 movw r18, r24 + f9c: 33 95 inc r19 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1036: a0 e6 ldi r26, 0x60 ; 96 - 1038: b6 e0 ldi r27, 0x06 ; 6 - 103a: d0 e1 ldi r29, 0x10 ; 16 - 103c: 60 e1 ldi r22, 0x10 ; 16 + f9e: 60 e1 ldi r22, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 103e: 77 ed ldi r23, 0xD7 ; 215 + fa0: 77 ed ldi r23, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1040: e0 ea ldi r30, 0xA0 ; 160 - 1042: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1044: c0 e4 ldi r28, 0x40 ; 64 - 1046: 50 e4 ldi r21, 0x40 ; 64 + fa2: 50 e4 ldi r21, 0x40 ; 64 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1048: 11 e8 ldi r17, 0x81 ; 129 + fa4: e1 e8 ldi r30, 0x81 ; 129 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 104a: 16 96 adiw r26, 0x06 ; 6 - 104c: 6c 93 st X, r22 - 104e: 16 97 sbiw r26, 0x06 ; 6 + fa6: 60 93 66 06 sts 0x0666, r22 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1050: 70 93 a0 09 sts 0x09A0, r23 + faa: 70 93 a0 09 sts 0x09A0, r23 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1054: 40 91 a1 09 lds r20, 0x09A1 - 1058: 46 ff sbrs r20, 6 - 105a: fc cf rjmp .-8 ; 0x1054 + fae: 40 91 a1 09 lds r20, 0x09A1 + fb2: 46 ff sbrs r20, 6 + fb4: fc cf rjmp .-8 ; 0xfae MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 105c: 51 83 std Z+1, r21 ; 0x01 + fb6: 50 93 a1 09 sts 0x09A1, r21 return MEMORY_FLASH_USART.DATA; - 105e: 40 91 a0 09 lds r20, 0x09A0 + fba: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1062: 10 92 a0 09 sts 0x09A0, r1 + fbe: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1066: 40 91 a1 09 lds r20, 0x09A1 - 106a: 46 ff sbrs r20, 6 - 106c: fc cf rjmp .-8 ; 0x1066 + fc2: 40 91 a1 09 lds r20, 0x09A1 + fc6: 46 ff sbrs r20, 6 + fc8: fc cf rjmp .-8 ; 0xfc2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 106e: 51 83 std Z+1, r21 ; 0x01 + fca: 50 93 a1 09 sts 0x09A1, r21 return MEMORY_FLASH_USART.DATA; - 1070: 40 91 a0 09 lds r20, 0x09A0 + fce: 40 91 a0 09 lds r20, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1074: 15 96 adiw r26, 0x05 ; 5 - 1076: 6c 93 st X, r22 - 1078: 15 97 sbiw r26, 0x05 ; 5 + fd2: 60 93 65 06 sts 0x0665, r22 } } INLINE void FlashClearPage(uint16_t PageAddress) { while(FlashIsBusy()); - 107a: 47 ff sbrs r20, 7 - 107c: e6 cf rjmp .-52 ; 0x104a + fd6: 47 ff sbrs r20, 7 + fd8: e6 cf rjmp .-52 ; 0xfa6 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 107e: 16 96 adiw r26, 0x06 ; 6 - 1080: dc 93 st X, r29 - 1082: 16 97 sbiw r26, 0x06 ; 6 + fda: 60 93 66 06 sts 0x0666, r22 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1084: 10 93 a0 09 sts 0x09A0, r17 + fde: e0 93 a0 09 sts 0x09A0, r30 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1088: 40 91 a1 09 lds r20, 0x09A1 - 108c: 46 ff sbrs r20, 6 - 108e: fc cf rjmp .-8 ; 0x1088 + fe2: 40 91 a1 09 lds r20, 0x09A1 + fe6: 46 ff sbrs r20, 6 + fe8: fc cf rjmp .-8 ; 0xfe2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1090: c1 83 std Z+1, r28 ; 0x01 + fea: 50 93 a1 09 sts 0x09A1, r21 return MEMORY_FLASH_USART.DATA; - 1092: 40 91 a0 09 lds r20, 0x09A0 + fee: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1096: 90 93 a0 09 sts 0x09A0, r25 + ff2: 90 93 a0 09 sts 0x09A0, r25 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 109a: 40 91 a1 09 lds r20, 0x09A1 - 109e: 46 ff sbrs r20, 6 - 10a0: fc cf rjmp .-8 ; 0x109a + ff6: 40 91 a1 09 lds r20, 0x09A1 + ffa: 46 ff sbrs r20, 6 + ffc: fc cf rjmp .-8 ; 0xff6 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10a2: c1 83 std Z+1, r28 ; 0x01 + ffe: 50 93 a1 09 sts 0x09A1, r21 return MEMORY_FLASH_USART.DATA; - 10a4: 40 91 a0 09 lds r20, 0x09A0 + 1002: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 10a8: 80 93 a0 09 sts 0x09A0, r24 + 1006: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 10ac: 40 91 a1 09 lds r20, 0x09A1 - 10b0: 46 ff sbrs r20, 6 - 10b2: fc cf rjmp .-8 ; 0x10ac + 100a: 40 91 a1 09 lds r20, 0x09A1 + 100e: 46 ff sbrs r20, 6 + 1010: fc cf rjmp .-8 ; 0x100a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10b4: c1 83 std Z+1, r28 ; 0x01 + 1012: 50 93 a1 09 sts 0x09A1, r21 return MEMORY_FLASH_USART.DATA; - 10b6: 40 91 a0 09 lds r20, 0x09A0 + 1016: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 10ba: 10 92 a0 09 sts 0x09A0, r1 + 101a: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 10be: 40 91 a1 09 lds r20, 0x09A1 - 10c2: 46 ff sbrs r20, 6 - 10c4: fc cf rjmp .-8 ; 0x10be + 101e: 40 91 a1 09 lds r20, 0x09A1 + 1022: 46 ff sbrs r20, 6 + 1024: fc cf rjmp .-8 ; 0x101e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10c6: c1 83 std Z+1, r28 ; 0x01 + 1026: 50 93 a1 09 sts 0x09A1, r21 return MEMORY_FLASH_USART.DATA; - 10c8: 40 91 a0 09 lds r20, 0x09A0 + 102a: 40 91 a0 09 lds r20, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_PAGE_ERASE); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 10cc: 15 96 adiw r26, 0x05 ; 5 - 10ce: dc 93 st X, r29 - 10d0: 15 97 sbiw r26, 0x05 ; 5 - 10d2: 01 96 adiw r24, 0x01 ; 1 + 102e: 60 93 65 06 sts 0x0665, r22 + 1032: 01 96 adiw r24, 0x01 ; 1 void MemoryClear(void) { uint32_t PageAddress = ((uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING) / MEMORY_PAGE_SIZE; uint16_t PageCount = MEMORY_SIZE_PER_SETTING / MEMORY_PAGE_SIZE; while(PageCount > 0) { - 10d4: 82 17 cp r24, r18 - 10d6: 93 07 cpc r25, r19 - 10d8: 09 f0 breq .+2 ; 0x10dc - 10da: b7 cf rjmp .-146 ; 0x104a + 1034: 82 17 cp r24, r18 + 1036: 93 07 cpc r25, r19 + 1038: 09 f0 breq .+2 ; 0x103c + 103a: b5 cf rjmp .-150 ; 0xfa6 FlashClearPage(PageAddress); PageCount--; PageAddress++; } } - 10dc: df 91 pop r29 - 10de: cf 91 pop r28 - 10e0: 1f 91 pop r17 - 10e2: 08 95 ret + 103c: 08 95 ret -000010e4 : +0000103e : bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - 10e4: 0f 93 push r16 - 10e6: 1f 93 push r17 - 10e8: fc 01 movw r30, r24 + 103e: cf 92 push r12 + 1040: df 92 push r13 + 1042: ef 92 push r14 + 1044: ff 92 push r15 + 1046: 0f 93 push r16 + 1048: 1f 93 push r17 + 104a: fc 01 movw r30, r24 + 104c: cb 01 movw r24, r22 + 104e: ba 01 movw r22, r20 + 1050: 69 01 movw r12, r18 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 10ea: 40 30 cpi r20, 0x00 ; 0 - 10ec: 80 e0 ldi r24, 0x00 ; 0 - 10ee: 58 07 cpc r21, r24 - 10f0: 81 e0 ldi r24, 0x01 ; 1 - 10f2: 68 07 cpc r22, r24 - 10f4: 80 e0 ldi r24, 0x00 ; 0 - 10f6: 78 07 cpc r23, r24 - 10f8: 20 f0 brcs .+8 ; 0x1102 + 1052: 61 15 cp r22, r1 + 1054: 71 05 cpc r23, r1 + 1056: 21 e0 ldi r18, 0x01 ; 1 + 1058: 82 07 cpc r24, r18 + 105a: 91 05 cpc r25, r1 + 105c: 40 f0 brcs .+16 ; 0x106e uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); MemoryWriteBlock(Buffer, BlockAddress, ByteCount); return true; } } - 10fa: 81 e0 ldi r24, 0x01 ; 1 - 10fc: 1f 91 pop r17 - 10fe: 0f 91 pop r16 - 1100: 08 95 ret + 105e: 81 e0 ldi r24, 0x01 ; 1 + 1060: 1f 91 pop r17 + 1062: 0f 91 pop r16 + 1064: ff 90 pop r15 + 1066: ef 90 pop r14 + 1068: df 90 pop r13 + 106a: cf 90 pop r12 + 106c: 08 95 ret if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { /* Prevent writing out of bounds by silently ignoring it */ return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - 1102: 80 e0 ldi r24, 0x00 ; 0 - 1104: 90 e0 ldi r25, 0x00 ; 0 - 1106: a1 e0 ldi r26, 0x01 ; 1 - 1108: b0 e0 ldi r27, 0x00 ; 0 - 110a: 84 1b sub r24, r20 - 110c: 95 0b sbc r25, r21 - 110e: a6 0b sbc r26, r22 - 1110: b7 0b sbc r27, r23 + 106e: 00 e0 ldi r16, 0x00 ; 0 + 1070: 10 e0 ldi r17, 0x00 ; 0 + 1072: 21 e0 ldi r18, 0x01 ; 1 + 1074: 30 e0 ldi r19, 0x00 ; 0 + 1076: 06 1b sub r16, r22 + 1078: 17 0b sbc r17, r23 + 107a: 28 0b sbc r18, r24 + 107c: 39 0b sbc r19, r25 ByteCount = MIN(ByteCount, BytesLeft); - 1112: 89 01 movw r16, r18 - 1114: 20 e0 ldi r18, 0x00 ; 0 - 1116: 30 e0 ldi r19, 0x00 ; 0 - 1118: 80 17 cp r24, r16 - 111a: 91 07 cpc r25, r17 - 111c: a2 07 cpc r26, r18 - 111e: b3 07 cpc r27, r19 - 1120: 40 f0 brcs .+16 ; 0x1132 + 107e: e1 2c mov r14, r1 + 1080: f1 2c mov r15, r1 + 1082: 0c 15 cp r16, r12 + 1084: 1d 05 cpc r17, r13 + 1086: 2e 05 cpc r18, r14 + 1088: 3f 05 cpc r19, r15 + 108a: 58 f0 brcs .+22 ; 0x10a2 MemoryWriteBlock(Buffer, BlockAddress, ByteCount); - 1122: cf 01 movw r24, r30 - 1124: ba 01 movw r22, r20 - 1126: a8 01 movw r20, r16 - 1128: 23 de rcall .-954 ; 0xd70 - 112a: 81 e0 ldi r24, 0x01 ; 1 + 108c: a6 01 movw r20, r12 + 108e: cf 01 movw r24, r30 + 1090: 38 de rcall .-912 ; 0xd02 return true; } } - 112c: 1f 91 pop r17 - 112e: 0f 91 pop r16 - 1130: 08 95 ret - 1132: 8c 01 movw r16, r24 + 1092: 81 e0 ldi r24, 0x01 ; 1 + 1094: 1f 91 pop r17 + 1096: 0f 91 pop r16 + 1098: ff 90 pop r15 + 109a: ef 90 pop r14 + 109c: df 90 pop r13 + 109e: cf 90 pop r12 + 10a0: 08 95 ret /* Prevent writing out of bounds by silently ignoring it */ return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); - 1134: 9d 01 movw r18, r26 - 1136: cf 01 movw r24, r30 + 10a2: 68 01 movw r12, r16 + 10a4: 79 01 movw r14, r18 MemoryWriteBlock(Buffer, BlockAddress, ByteCount); - 1138: ba 01 movw r22, r20 - 113a: a8 01 movw r20, r16 - 113c: 19 de rcall .-974 ; 0xd70 - 113e: f5 cf rjmp .-22 ; 0x112a + 10a6: a6 01 movw r20, r12 + 10a8: cf 01 movw r24, r30 + 10aa: 2b de rcall .-938 ; 0xd02 + 10ac: f2 cf rjmp .-28 ; 0x1092 -00001140 : - 1140: 0f 93 push r16 - 1142: 1f 93 push r17 +000010ae : return true; } } bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - 1144: fc 01 movw r30, r24 + 10ae: cf 92 push r12 + 10b0: df 92 push r13 + 10b2: ef 92 push r14 + 10b4: ff 92 push r15 + 10b6: 0f 93 push r16 + 10b8: 1f 93 push r17 + 10ba: fc 01 movw r30, r24 + 10bc: cb 01 movw r24, r22 + 10be: ba 01 movw r22, r20 + 10c0: 69 01 movw r12, r18 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 1146: 40 30 cpi r20, 0x00 ; 0 - 1148: 80 e0 ldi r24, 0x00 ; 0 - 114a: 58 07 cpc r21, r24 - 114c: 81 e0 ldi r24, 0x01 ; 1 - 114e: 68 07 cpc r22, r24 - 1150: 80 e0 ldi r24, 0x00 ; 0 - 1152: 78 07 cpc r23, r24 - 1154: 20 f0 brcs .+8 ; 0x115e + 10c2: 61 15 cp r22, r1 + 10c4: 71 05 cpc r23, r1 + 10c6: 21 e0 ldi r18, 0x01 ; 1 + 10c8: 82 07 cpc r24, r18 + 10ca: 91 05 cpc r25, r1 + 10cc: 40 f0 brcs .+16 ; 0x10de /* There are bytes out of bounds to be read. Notify that we are done. */ return false; - 1156: 80 e0 ldi r24, 0x00 ; 0 + 10ce: 80 e0 ldi r24, 0x00 ; 0 uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); MemoryReadBlock(Buffer, BlockAddress, ByteCount); return true; } } - 1158: 1f 91 pop r17 - 115a: 0f 91 pop r16 - 115c: 08 95 ret + 10d0: 1f 91 pop r17 + 10d2: 0f 91 pop r16 + 10d4: ff 90 pop r15 + 10d6: ef 90 pop r14 + 10d8: df 90 pop r13 + 10da: cf 90 pop r12 + 10dc: 08 95 ret if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { /* There are bytes out of bounds to be read. Notify that we are done. */ return false; } else { /* Calculate bytes left in memory and issue reading */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - 115e: 80 e0 ldi r24, 0x00 ; 0 - 1160: 90 e0 ldi r25, 0x00 ; 0 - 1162: a1 e0 ldi r26, 0x01 ; 1 - 1164: b0 e0 ldi r27, 0x00 ; 0 - 1166: 84 1b sub r24, r20 - 1168: 95 0b sbc r25, r21 - 116a: a6 0b sbc r26, r22 - 116c: b7 0b sbc r27, r23 + 10de: 00 e0 ldi r16, 0x00 ; 0 + 10e0: 10 e0 ldi r17, 0x00 ; 0 + 10e2: 21 e0 ldi r18, 0x01 ; 1 + 10e4: 30 e0 ldi r19, 0x00 ; 0 + 10e6: 06 1b sub r16, r22 + 10e8: 17 0b sbc r17, r23 + 10ea: 28 0b sbc r18, r24 + 10ec: 39 0b sbc r19, r25 ByteCount = MIN(ByteCount, BytesLeft); - 116e: 89 01 movw r16, r18 - 1170: 20 e0 ldi r18, 0x00 ; 0 - 1172: 30 e0 ldi r19, 0x00 ; 0 - 1174: 80 17 cp r24, r16 - 1176: 91 07 cpc r25, r17 - 1178: a2 07 cpc r26, r18 - 117a: b3 07 cpc r27, r19 - 117c: 40 f0 brcs .+16 ; 0x118e + 10ee: e1 2c mov r14, r1 + 10f0: f1 2c mov r15, r1 + 10f2: 0c 15 cp r16, r12 + 10f4: 1d 05 cpc r17, r13 + 10f6: 2e 05 cpc r18, r14 + 10f8: 3f 05 cpc r19, r15 + 10fa: 58 f0 brcs .+22 ; 0x1112 MemoryReadBlock(Buffer, BlockAddress, ByteCount); - 117e: cf 01 movw r24, r30 - 1180: ba 01 movw r22, r20 - 1182: a8 01 movw r20, r16 - 1184: 6a dd rcall .-1324 ; 0xc5a - 1186: 81 e0 ldi r24, 0x01 ; 1 + 10fc: a6 01 movw r20, r12 + 10fe: cf 01 movw r24, r30 + 1100: 7b dd rcall .-1290 ; 0xbf8 return true; - 1188: 1f 91 pop r17 + 1102: 81 e0 ldi r24, 0x01 ; 1 } } - 118a: 0f 91 pop r16 - 118c: 08 95 ret - 118e: 8c 01 movw r16, r24 + 1104: 1f 91 pop r17 + 1106: 0f 91 pop r16 + 1108: ff 90 pop r15 + 110a: ef 90 pop r14 + 110c: df 90 pop r13 + 110e: cf 90 pop r12 + 1110: 08 95 ret /* There are bytes out of bounds to be read. Notify that we are done. */ return false; } else { /* Calculate bytes left in memory and issue reading */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); - 1190: 9d 01 movw r18, r26 - 1192: cf 01 movw r24, r30 + 1112: 68 01 movw r12, r16 + 1114: 79 01 movw r14, r18 MemoryReadBlock(Buffer, BlockAddress, ByteCount); - 1194: ba 01 movw r22, r20 - 1196: a8 01 movw r20, r16 - 1198: 60 dd rcall .-1344 ; 0xc5a - 119a: 81 e0 ldi r24, 0x01 ; 1 - 119c: f5 cf rjmp .-22 ; 0x1188 + 1116: a6 01 movw r20, r12 + 1118: cf 01 movw r24, r30 + 111a: 6e dd rcall .-1316 ; 0xbf8 + return true; + 111c: 81 e0 ldi r24, 0x01 ; 1 + 111e: f2 cf rjmp .-28 ; 0x1104 -0000119e : +00001120 : [BUTTON_ACTION_CYCLE_SETTINGS] = "CYCLE_SETTINGS" }; void ButtonInit(void) { BUTTON_PORT.DIRCLR = BUTTON_MASK; - 119e: e0 e0 ldi r30, 0x00 ; 0 - 11a0: f6 e0 ldi r31, 0x06 ; 6 - 11a2: 80 e4 ldi r24, 0x40 ; 64 - 11a4: 82 83 std Z+2, r24 ; 0x02 + 1120: e0 e0 ldi r30, 0x00 ; 0 + 1122: f6 e0 ldi r31, 0x06 ; 6 + 1124: 80 e4 ldi r24, 0x40 ; 64 + 1126: 82 83 std Z+2, r24 ; 0x02 BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; - 11a6: 88 e1 ldi r24, 0x18 ; 24 - 11a8: 86 8b std Z+22, r24 ; 0x16 -} - 11aa: 08 95 ret + 1128: 88 e1 ldi r24, 0x18 ; 24 + 112a: 86 8b std Z+22, r24 ; 0x16 + 112c: 08 95 ret -000011ac : +0000112e : +} void ButtonTick(void) { - 11ac: ff 92 push r15 - 11ae: 0f 93 push r16 - 11b0: 1f 93 push r17 - 11b2: cf 93 push r28 - 11b4: df 93 push r29 - 11b6: cd b7 in r28, 0x3d ; 61 - 11b8: de b7 in r29, 0x3e ; 62 - 11ba: a0 97 sbiw r28, 0x20 ; 32 - 11bc: cd bf out 0x3d, r28 ; 61 - 11be: de bf out 0x3e, r29 ; 62 + 112e: ff 92 push r15 + 1130: 0f 93 push r16 + 1132: 1f 93 push r17 + 1134: cf 93 push r28 + 1136: df 93 push r29 + 1138: cd b7 in r28, 0x3d ; 61 + 113a: de b7 in r29, 0x3e ; 62 + 113c: a0 97 sbiw r28, 0x20 ; 32 + 113e: cd bf out 0x3d, r28 ; 61 + 1140: de bf out 0x3e, r29 ; 62 static uint8_t LastButtonState = 0; uint8_t ThisButtonState = ~BUTTON_PORT.IN; - 11c0: 90 91 08 06 lds r25, 0x0608 - 11c4: 90 95 com r25 + 1142: 80 91 08 06 lds r24, 0x0608 + 1146: 80 95 com r24 uint8_t ThisButtonChange = ThisButtonState ^ LastButtonState; - 11c6: 80 91 a2 20 lds r24, 0x20A2 - 11ca: 89 27 eor r24, r25 + 1148: 90 91 92 20 lds r25, 0x2092 + 114c: 98 27 eor r25, r24 uint8_t ThisButtonPress = ThisButtonChange & ThisButtonState; - 11cc: 89 23 and r24, r25 LastButtonState = ThisButtonState; - 11ce: 90 93 a2 20 sts 0x20A2, r25 + 114e: 80 93 92 20 sts 0x2092, r24 +void ButtonTick(void) +{ + static uint8_t LastButtonState = 0; + uint8_t ThisButtonState = ~BUTTON_PORT.IN; + uint8_t ThisButtonChange = ThisButtonState ^ LastButtonState; + uint8_t ThisButtonPress = ThisButtonChange & ThisButtonState; + 1152: 80 74 andi r24, 0x40 ; 64 + LastButtonState = ThisButtonState; if ( ThisButtonPress & BUTTON_MASK ) { - 11d2: 86 ff sbrs r24, 6 - 11d4: 15 c0 rjmp .+42 ; 0x1200 + 1154: 89 23 and r24, r25 + 1156: a9 f0 breq .+42 ; 0x1182 uint8_t UidBuffer[32]; ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; - 11d6: e0 91 0e 21 lds r30, 0x210E - 11da: f0 91 0f 21 lds r31, 0x210F - 11de: 80 81 ld r24, Z + 1158: e0 91 fe 20 lds r30, 0x20FE + 115c: f0 91 ff 20 lds r31, 0x20FF + 1160: 80 81 ld r24, Z if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { - 11e0: 81 30 cpi r24, 0x01 ; 1 - 11e2: b9 f0 breq .+46 ; 0x1212 + 1162: 81 30 cpi r24, 0x01 ; 1 + 1164: b9 f0 breq .+46 ; 0x1194 for (uint8_t i=0; i + 1166: 82 30 cpi r24, 0x02 ; 2 + 1168: 79 f1 breq .+94 ; 0x11c8 UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { - 11e8: 83 30 cpi r24, 0x03 ; 3 - 11ea: 09 f4 brne .+2 ; 0x11ee - 11ec: 4e c0 rjmp .+156 ; 0x128a + 116a: 83 30 cpi r24, 0x03 ; 3 + 116c: 09 f4 brne .+2 ; 0x1170 + 116e: 4e c0 rjmp .+156 ; 0x120c UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - 11ee: 84 30 cpi r24, 0x04 ; 4 - 11f0: 09 f4 brne .+2 ; 0x11f4 - 11f2: 70 c0 rjmp .+224 ; 0x12d4 + 1170: 84 30 cpi r24, 0x04 ; 4 + 1172: 09 f4 brne .+2 ; 0x1176 + 1174: 6f c0 rjmp .+222 ; 0x1254 UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - 11f4: 85 30 cpi r24, 0x05 ; 5 - 11f6: 09 f4 brne .+2 ; 0x11fa - 11f8: 8f c0 rjmp .+286 ; 0x1318 + 1176: 85 30 cpi r24, 0x05 ; 5 + 1178: 09 f4 brne .+2 ; 0x117c + 117a: 8e c0 rjmp .+284 ; 0x1298 UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { - 11fa: 86 30 cpi r24, 0x06 ; 6 - 11fc: 09 f4 brne .+2 ; 0x1200 - 11fe: 68 c0 rjmp .+208 ; 0x12d0 + 117c: 86 30 cpi r24, 0x06 ; 6 + 117e: 09 f4 brne .+2 ; 0x1182 + 1180: 67 c0 rjmp .+206 ; 0x1250 SettingsCycle(); } } } - 1200: a0 96 adiw r28, 0x20 ; 32 - 1202: cd bf out 0x3d, r28 ; 61 - 1204: de bf out 0x3e, r29 ; 62 - 1206: df 91 pop r29 - 1208: cf 91 pop r28 - 120a: 1f 91 pop r17 - 120c: 0f 91 pop r16 - 120e: ff 90 pop r15 - 1210: 08 95 ret + 1182: a0 96 adiw r28, 0x20 ; 32 + 1184: cd bf out 0x3d, r28 ; 61 + 1186: de bf out 0x3e, r29 ; 62 + 1188: df 91 pop r29 + 118a: cf 91 pop r28 + 118c: 1f 91 pop r17 + 118e: 0f 91 pop r16 + 1190: ff 90 pop r15 + 1192: 08 95 ret if ( ThisButtonPress & BUTTON_MASK ) { uint8_t UidBuffer[32]; ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { for (uint8_t i=0; i - 121a: a1 c0 rjmp .+322 ; 0x135e - 121c: ff 24 eor r15, r15 - 121e: 8e 01 movw r16, r28 - 1220: 0f 5f subi r16, 0xFF ; 255 - 1222: 1f 4f sbci r17, 0xFF ; 255 + 1194: 80 91 fb 20 lds r24, 0x20FB + 1198: 88 23 and r24, r24 + 119a: 09 f4 brne .+2 ; 0x119e + 119c: 9f c0 rjmp .+318 ; 0x12dc + 119e: f1 2c mov r15, r1 + 11a0: 8e 01 movw r16, r28 + 11a2: 0f 5f subi r16, 0xFF ; 255 + 11a4: 1f 4f sbci r17, 0xFF ; 255 UidBuffer[i] = RandomGetByte(); - 1224: e5 db rcall .-2102 ; 0x9f0 - 1226: f8 01 movw r30, r16 - 1228: ef 0d add r30, r15 - 122a: f1 1d adc r31, r1 - 122c: 80 83 st Z, r24 - 122e: f3 94 inc r15 + 11a6: 08 dc rcall .-2032 ; 0x9b8 + 11a8: f8 01 movw r30, r16 + 11aa: ef 0d add r30, r15 + 11ac: f1 1d adc r31, r1 + 11ae: 80 83 st Z, r24 if ( ThisButtonPress & BUTTON_MASK ) { uint8_t UidBuffer[32]; ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { for (uint8_t i=0; i - 1238: e0 91 07 21 lds r30, 0x2107 + 11b0: f3 94 inc r15 + 11b2: 80 91 fb 20 lds r24, 0x20FB + 11b6: f8 16 cp r15, r24 + 11b8: b0 f3 brcs .-20 ; 0x11a6 INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); } INLINE void ApplicationSetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationSetUidFunc(Uid); - 123c: f0 91 08 21 lds r31, 0x2108 - 1240: c8 01 movw r24, r16 - 1242: 09 95 icall - 1244: dd cf rjmp .-70 ; 0x1200 - 1246: e0 91 05 21 lds r30, 0x2105 + 11ba: e0 91 f7 20 lds r30, 0x20F7 + 11be: f0 91 f8 20 lds r31, 0x20F8 + 11c2: c8 01 movw r24, r16 + 11c4: 09 95 icall + 11c6: dd cf rjmp .-70 ; 0x1182 INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); } INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); - 124a: f0 91 06 21 lds r31, 0x2106 - 124e: 8e 01 movw r16, r28 - 1250: 0f 5f subi r16, 0xFF ; 255 - 1252: 1f 4f sbci r17, 0xFF ; 255 - 1254: c8 01 movw r24, r16 - 1256: 09 95 icall - 1258: 20 91 0b 21 lds r18, 0x210B + 11c8: e0 91 f5 20 lds r30, 0x20F5 + 11cc: f0 91 f6 20 lds r31, 0x20F6 + 11d0: 8e 01 movw r16, r28 + 11d2: 0f 5f subi r16, 0xFF ; 255 + 11d4: 1f 4f sbci r17, 0xFF ; 255 + 11d6: c8 01 movw r24, r16 + 11d8: 09 95 icall } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1260: f8 01 movw r30, r16 - 1262: ce 01 movw r24, r28 + 11da: 20 91 fb 20 lds r18, 0x20FB + 11de: 22 23 and r18, r18 + 11e0: 61 f3 breq .-40 ; 0x11ba + 11e2: f8 01 movw r30, r16 { BUTTON_PORT.DIRCLR = BUTTON_MASK; BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) - 1264: 02 96 adiw r24, 0x02 ; 2 - 1266: 21 50 subi r18, 0x01 ; 1 - 1268: 82 0f add r24, r18 - 126a: 91 1d adc r25, r1 - 126c: 21 e0 ldi r18, 0x01 ; 1 + 11e4: ce 01 movw r24, r28 + 11e6: 02 96 adiw r24, 0x02 ; 2 + 11e8: 21 50 subi r18, 0x01 ; 1 + 11ea: 82 0f add r24, r18 + 11ec: 91 1d adc r25, r1 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 126e: 22 23 and r18, r18 + 11ee: 21 e0 ldi r18, 0x01 ; 1 uint8_t i; for (i=0; i - 1272: 30 81 ld r19, Z + 11f0: 22 23 and r18, r18 + 11f2: 39 f0 breq .+14 ; 0x1202 if (UidBuffer[i] == 0xFF) { - 1274: 21 e0 ldi r18, 0x01 ; 1 -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; -} - -void ButtonTick(void) - 1276: 3f 3f cpi r19, 0xFF ; 255 - 1278: 09 f0 breq .+2 ; 0x127c - 127a: 20 e0 ldi r18, 0x00 ; 0 - 127c: 3f 5f subi r19, 0xFF ; 255 + 11f4: 30 81 ld r19, Z + 11f6: 21 e0 ldi r18, 0x01 ; 1 + 11f8: 3f 3f cpi r19, 0xFF ; 255 + 11fa: 09 f0 breq .+2 ; 0x11fe + 11fc: 20 e0 ldi r18, 0x00 ; 0 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 127e: 30 83 st Z, r19 - 1280: 31 96 adiw r30, 0x01 ; 1 - 1282: e8 17 cp r30, r24 + 11fe: 3f 5f subi r19, 0xFF ; 255 + 1200: 30 83 st Z, r19 + 1202: 31 96 adiw r30, 0x01 ; 1 } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1288: d7 cf rjmp .-82 ; 0x1238 - 128a: e0 91 05 21 lds r30, 0x2105 - 128e: f0 91 06 21 lds r31, 0x2106 - 1292: 8e 01 movw r16, r28 - 1294: 0f 5f subi r16, 0xFF ; 255 - 1296: 1f 4f sbci r17, 0xFF ; 255 - 1298: c8 01 movw r24, r16 - 129a: 09 95 icall - 129c: 20 91 0b 21 lds r18, 0x210B + 1204: e8 17 cp r30, r24 + 1206: f9 07 cpc r31, r25 + 1208: 99 f7 brne .-26 ; 0x11f0 + 120a: d7 cf rjmp .-82 ; 0x11ba + 120c: e0 91 f5 20 lds r30, 0x20F5 + 1210: f0 91 f6 20 lds r31, 0x20F6 + 1214: 8e 01 movw r16, r28 + 1216: 0f 5f subi r16, 0xFF ; 255 + 1218: 1f 4f sbci r17, 0xFF ; 255 + 121a: c8 01 movw r24, r16 + 121c: 09 95 icall ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; - 12a0: 31 e0 ldi r19, 0x01 ; 1 + 121e: 20 91 fb 20 lds r18, 0x20FB } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 12a2: 22 23 and r18, r18 + 1222: 31 e0 ldi r19, 0x01 ; 1 uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 12a4: 49 f2 breq .-110 ; 0x1238 - 12a6: 21 50 subi r18, 0x01 ; 1 - 12a8: 33 23 and r19, r19 + 1224: 21 50 subi r18, 0x01 ; 1 + 1226: 48 f2 brcs .-110 ; 0x11ba if (Carry) { - 12aa: d9 f3 breq .-10 ; 0x12a2 - 12ac: 82 2f mov r24, r18 + 1228: 33 23 and r19, r19 + 122a: e1 f3 breq .-8 ; 0x1224 if (UidBuffer[i] == 0xFF) { - 12ae: 90 e0 ldi r25, 0x00 ; 0 - 12b0: f8 01 movw r30, r16 - 12b2: e8 0f add r30, r24 - 12b4: f9 1f adc r31, r25 - 12b6: 40 81 ld r20, Z - 12b8: 31 e0 ldi r19, 0x01 ; 1 -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; -} - -void ButtonTick(void) - 12ba: 4f 3f cpi r20, 0xFF ; 255 - 12bc: 09 f0 breq .+2 ; 0x12c0 - 12be: 30 e0 ldi r19, 0x00 ; 0 - 12c0: 80 0f add r24, r16 + 122c: 82 2f mov r24, r18 + 122e: 90 e0 ldi r25, 0x00 ; 0 + 1230: f8 01 movw r30, r16 + 1232: e8 0f add r30, r24 + 1234: f9 1f adc r31, r25 + 1236: 40 81 ld r20, Z + 1238: 31 e0 ldi r19, 0x01 ; 1 + 123a: 4f 3f cpi r20, 0xFF ; 255 + 123c: 09 f0 breq .+2 ; 0x1240 + 123e: 30 e0 ldi r19, 0x00 ; 0 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 12c2: 91 1f adc r25, r17 - 12c4: 4f 5f subi r20, 0xFF ; 255 - 12c6: fc 01 movw r30, r24 - 12c8: 40 83 st Z, r20 - 12ca: 22 23 and r18, r18 + 1240: f8 01 movw r30, r16 + 1242: e8 0f add r30, r24 + 1244: f9 1f adc r31, r25 + 1246: 4f 5f subi r20, 0xFF ; 255 + 1248: 40 83 st Z, r20 } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 12cc: 61 f7 brne .-40 ; 0x12a6 - 12ce: b4 cf rjmp .-152 ; 0x1238 - 12d0: fb d0 rcall .+502 ; 0x14c8 + 124a: 21 50 subi r18, 0x01 ; 1 + 124c: 68 f7 brcc .-38 ; 0x1228 + 124e: b5 cf rjmp .-150 ; 0x11ba } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { SettingsCycle(); - 12d2: 96 cf rjmp .-212 ; 0x1200 - 12d4: e0 91 05 21 lds r30, 0x2105 - 12d8: f0 91 06 21 lds r31, 0x2106 + 1250: f7 d0 rcall .+494 ; 0x1440 + 1252: 97 cf rjmp .-210 ; 0x1182 + 1254: e0 91 f5 20 lds r30, 0x20F5 + 1258: f0 91 f6 20 lds r31, 0x20F6 + 125c: 8e 01 movw r16, r28 + 125e: 0f 5f subi r16, 0xFF ; 255 + 1260: 1f 4f sbci r17, 0xFF ; 255 + 1262: c8 01 movw r24, r16 + 1264: 09 95 icall + } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + uint8_t i; + + for (i=0; i + 126e: a5 cf rjmp .-182 ; 0x11ba + 1270: f8 01 movw r30, r16 +{ + BUTTON_PORT.DIRCLR = BUTTON_MASK; + BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; +} + +void ButtonTick(void) + 1272: ce 01 movw r24, r28 + 1274: 02 96 adiw r24, 0x02 ; 2 + 1276: 21 50 subi r18, 0x01 ; 1 + 1278: 82 0f add r24, r18 + 127a: 91 1d adc r25, r1 + } + + ApplicationSetUid(UidBuffer); + } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + 127c: 21 e0 ldi r18, 0x01 ; 1 + uint8_t i; + + for (i=0; i + if (UidBuffer[i] == 0x00) { + 1282: 30 81 ld r19, Z + 1284: 21 e0 ldi r18, 0x01 ; 1 + 1286: 31 11 cpse r19, r1 + 1288: 20 e0 ldi r18, 0x00 ; 0 + Carry = 1; + } else { + Carry = 0; + } + + UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; + 128a: 31 50 subi r19, 0x01 ; 1 + 128c: 30 83 st Z, r19 + 128e: 31 96 adiw r30, 0x01 ; 1 + } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + uint8_t i; + + for (i=0; i + 1296: 91 cf rjmp .-222 ; 0x11ba + 1298: e0 91 f5 20 lds r30, 0x20F5 + 129c: f0 91 f6 20 lds r31, 0x20F6 + 12a0: 8e 01 movw r16, r28 + 12a2: 0f 5f subi r16, 0xFF ; 255 + 12a4: 1f 4f sbci r17, 0xFF ; 255 + 12a6: c8 01 movw r24, r16 + 12a8: 09 95 icall + + ApplicationSetUid(UidBuffer); + } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + uint8_t i = ActiveConfiguration.UidSize; + 12aa: 20 91 fb 20 lds r18, 0x20FB + } + + ApplicationSetUid(UidBuffer); + } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + 12ae: 31 e0 ldi r19, 0x01 ; 1 + uint8_t i = ActiveConfiguration.UidSize; + + while(i-- > 0) { + 12b0: 21 50 subi r18, 0x01 ; 1 + 12b2: 08 f4 brcc .+2 ; 0x12b6 + 12b4: 82 cf rjmp .-252 ; 0x11ba + if (Carry) { + 12b6: 33 23 and r19, r19 + 12b8: d9 f3 breq .-10 ; 0x12b0 + if (UidBuffer[i] == 0x00) { + 12ba: 82 2f mov r24, r18 + 12bc: 90 e0 ldi r25, 0x00 ; 0 + 12be: f8 01 movw r30, r16 + 12c0: e8 0f add r30, r24 + 12c2: f9 1f adc r31, r25 + 12c4: 40 81 ld r20, Z + 12c6: 31 e0 ldi r19, 0x01 ; 1 + 12c8: 41 11 cpse r20, r1 + 12ca: 30 e0 ldi r19, 0x00 ; 0 + Carry = 1; + } else { + Carry = 0; + } + + UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; + 12cc: f8 01 movw r30, r16 + 12ce: e8 0f add r30, r24 + 12d0: f9 1f adc r31, r25 + 12d2: 41 50 subi r20, 0x01 ; 1 + 12d4: 40 83 st Z, r20 + } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + uint8_t i = ActiveConfiguration.UidSize; + + while(i-- > 0) { + 12d6: 21 50 subi r18, 0x01 ; 1 + 12d8: 70 f7 brcc .-36 ; 0x12b6 + 12da: 6f cf rjmp .-290 ; 0x11ba 12dc: 8e 01 movw r16, r28 12de: 0f 5f subi r16, 0xFF ; 255 12e0: 1f 4f sbci r17, 0xFF ; 255 - 12e2: c8 01 movw r24, r16 - 12e4: 09 95 icall - 12e6: 20 91 0b 21 lds r18, 0x210B - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i; + 12e2: 6b cf rjmp .-298 ; 0x11ba - for (i=0; i - 12ee: a4 cf rjmp .-184 ; 0x1238 - 12f0: f8 01 movw r30, r16 - 12f2: ce 01 movw r24, r28 - 12f4: 02 96 adiw r24, 0x02 ; 2 -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; -} - -void ButtonTick(void) - 12f6: 21 50 subi r18, 0x01 ; 1 - 12f8: 82 0f add r24, r18 - 12fa: 91 1d adc r25, r1 - 12fc: 21 e0 ldi r18, 0x01 ; 1 - 12fe: 22 23 and r18, r18 - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - 1300: 31 f0 breq .+12 ; 0x130e - uint8_t i; - - for (i=0; i - 1316: 90 cf rjmp .-224 ; 0x1238 - 1318: e0 91 05 21 lds r30, 0x2105 - 131c: f0 91 06 21 lds r31, 0x2106 - 1320: 8e 01 movw r16, r28 - 1322: 0f 5f subi r16, 0xFF ; 255 - 1324: 1f 4f sbci r17, 0xFF ; 255 - 1326: c8 01 movw r24, r16 - 1328: 09 95 icall - 132a: 20 91 0b 21 lds r18, 0x210B - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i = ActiveConfiguration.UidSize; - 132e: 31 e0 ldi r19, 0x01 ; 1 - 1330: 22 23 and r18, r18 - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - 1332: 09 f4 brne .+2 ; 0x1336 - uint8_t i = ActiveConfiguration.UidSize; - - while(i-- > 0) { - 1334: 81 cf rjmp .-254 ; 0x1238 - 1336: 21 50 subi r18, 0x01 ; 1 - 1338: 33 23 and r19, r19 - 133a: d1 f3 breq .-12 ; 0x1330 - if (Carry) { - 133c: 82 2f mov r24, r18 - 133e: 90 e0 ldi r25, 0x00 ; 0 - if (UidBuffer[i] == 0x00) { - 1340: f8 01 movw r30, r16 - 1342: e8 0f add r30, r24 - 1344: f9 1f adc r31, r25 - 1346: 40 81 ld r20, Z - 1348: 31 e0 ldi r19, 0x01 ; 1 - 134a: 41 11 cpse r20, r1 -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; -} - -void ButtonTick(void) - 134c: 30 e0 ldi r19, 0x00 ; 0 - 134e: 80 0f add r24, r16 - 1350: 91 1f adc r25, r17 - Carry = 1; - } else { - Carry = 0; - } - - UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - 1352: 41 50 subi r20, 0x01 ; 1 - 1354: fc 01 movw r30, r24 - 1356: 40 83 st Z, r20 - 1358: 22 23 and r18, r18 - 135a: 69 f7 brne .-38 ; 0x1336 - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i = ActiveConfiguration.UidSize; - - while(i-- > 0) { - 135c: 6d cf rjmp .-294 ; 0x1238 - 135e: 8e 01 movw r16, r28 - 1360: 0f 5f subi r16, 0xFF ; 255 - 1362: 1f 4f sbci r17, 0xFF ; 255 - 1364: 69 cf rjmp .-302 ; 0x1238 - -00001366 : - 1366: cf 93 push r28 - 1368: df 93 push r29 +000012e4 : } } } void ButtonGetActionList(char* ListOut, uint16_t BufferSize) { - 136a: ec 01 movw r28, r24 + 12e4: cf 93 push r28 + 12e6: df 93 push r29 + 12e8: ec 01 movw r28, r24 uint8_t i; /* Account for '\0' */ BufferSize--; - 136c: 61 50 subi r22, 0x01 ; 1 - 136e: 70 40 sbci r23, 0x00 ; 0 - 1370: 27 ef ldi r18, 0xF7 ; 247 - 1372: 32 e0 ldi r19, 0x02 ; 2 + 12ea: 61 50 subi r22, 0x01 ; 1 + 12ec: 71 09 sbc r23, r1 + 12ee: 80 e0 ldi r24, 0x00 ; 0 + 12f0: 90 e0 ldi r25, 0x00 ; 0 BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { /* No comma on last configuration */ *ListOut++ = ','; - 1374: 4c e2 ldi r20, 0x2C ; 44 + 12f2: 3c e2 ldi r19, 0x2C ; 44 /* Account for '\0' */ BufferSize--; for (i=0; i sizeof(ButtonActionTable[i]) ) { - 1378: f9 01 movw r30, r18 - 137a: 54 91 lpm r21, Z - 137c: 55 23 and r21, r21 - 137e: 89 f0 breq .+34 ; 0x13a2 - 1380: 61 32 cpi r22, 0x21 ; 33 - 1382: 71 05 cpc r23, r1 - 1384: 70 f0 brcs .+28 ; 0x13a2 - 1386: de 01 movw r26, r28 - 1388: 03 c0 rjmp .+6 ; 0x1390 - 138a: 60 32 cpi r22, 0x20 ; 32 - 138c: 71 05 cpc r23, r1 - 138e: 49 f0 breq .+18 ; 0x13a2 + 130a: 24 91 lpm r18, Z + 130c: 22 23 and r18, r18 + 130e: 81 f0 breq .+32 ; 0x1330 + 1310: 61 32 cpi r22, 0x21 ; 33 + 1312: 71 05 cpc r23, r1 + 1314: 68 f0 brcs .+26 ; 0x1330 + 1316: de 01 movw r26, r28 + 1318: 03 c0 rjmp .+6 ; 0x1320 + 131a: 60 32 cpi r22, 0x20 ; 32 + 131c: 71 05 cpc r23, r1 + 131e: 41 f0 breq .+16 ; 0x1330 /* While not end-of-string and enough buffer to * put a complete configuration name */ *ListOut++ = c; - 1390: 5d 93 st X+, r21 - 1392: ed 01 movw r28, r26 + 1320: 2d 93 st X+, r18 + 1322: ed 01 movw r28, r26 ActionName++; - 1394: 01 96 adiw r24, 0x01 ; 1 + 1324: 31 96 adiw r30, 0x01 ; 1 BufferSize--; - 1396: 61 50 subi r22, 0x01 ; 1 - 1398: 70 40 sbci r23, 0x00 ; 0 + 1326: 61 50 subi r22, 0x01 ; 1 + 1328: 71 09 sbc r23, r1 for (i=0; i sizeof(ButtonActionTable[i]) ) { - 139a: fc 01 movw r30, r24 - 139c: 54 91 lpm r21, Z - 139e: 55 23 and r21, r21 - 13a0: a1 f7 brne .-24 ; 0x138a + 132a: 24 91 lpm r18, Z + 132c: 21 11 cpse r18, r1 + 132e: f5 cf rjmp .-22 ; 0x131a *ListOut++ = c; ActionName++; BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { - 13a2: f3 e0 ldi r31, 0x03 ; 3 - 13a4: 27 3b cpi r18, 0xB7 ; 183 - 13a6: 3f 07 cpc r19, r31 - 13a8: 21 f4 brne .+8 ; 0x13b2 + 1330: 86 30 cpi r24, 0x06 ; 6 + 1332: 91 05 cpc r25, r1 + 1334: 21 f4 brne .+8 ; 0x133e *ListOut++ = ','; BufferSize--; } } *ListOut = '\0'; - 13aa: 18 82 st Y, r1 + 1336: 18 82 st Y, r1 } - 13ac: df 91 pop r29 - 13ae: cf 91 pop r28 - 13b0: 08 95 ret + 1338: df 91 pop r29 + 133a: cf 91 pop r28 + 133c: 08 95 ret BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { /* No comma on last configuration */ *ListOut++ = ','; - 13b2: 49 93 st Y+, r20 + 133e: 39 93 st Y+, r19 BufferSize--; - 13b4: 61 50 subi r22, 0x01 ; 1 - 13b6: 70 40 sbci r23, 0x00 ; 0 - 13b8: 20 5e subi r18, 0xE0 ; 224 - 13ba: 3f 4f sbci r19, 0xFF ; 255 - uint8_t i; + 1340: 61 50 subi r22, 0x01 ; 1 + 1342: 71 09 sbc r23, r1 + 1344: 01 96 adiw r24, 0x01 ; 1 + 1346: d6 cf rjmp .-84 ; 0x12f4 - /* Account for '\0' */ - BufferSize--; - - for (i=0; i - 13c4: f2 cf rjmp .-28 ; 0x13aa - -000013c6 : +00001348 : *ListOut = '\0'; } void ButtonSetActionById(ButtonActionEnum Action) { GlobalSettings.ActiveSettingPtr->ButtonAction = Action; - 13c6: e0 91 0e 21 lds r30, 0x210E - 13ca: f0 91 0f 21 lds r31, 0x210F - 13ce: 80 83 st Z, r24 -} - 13d0: 08 95 ret + 1348: e0 91 fe 20 lds r30, 0x20FE + 134c: f0 91 ff 20 lds r31, 0x20FF + 1350: 80 83 st Z, r24 + 1352: 08 95 ret -000013d2 : +00001354 : +} void ButtonGetActionByName(char* ActionOut, uint16_t BufferSize) { - 13d2: ab 01 movw r20, r22 + 1354: ab 01 movw r20, r22 strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonAction], BufferSize); - 13d4: e0 91 0e 21 lds r30, 0x210E - 13d8: f0 91 0f 21 lds r31, 0x210F - 13dc: 60 81 ld r22, Z - 13de: 70 e0 ldi r23, 0x00 ; 0 - 13e0: 66 0f add r22, r22 - 13e2: 77 1f adc r23, r23 - 13e4: 62 95 swap r22 - 13e6: 72 95 swap r23 - 13e8: 70 7f andi r23, 0xF0 ; 240 - 13ea: 76 27 eor r23, r22 - 13ec: 60 7f andi r22, 0xF0 ; 240 - 13ee: 76 27 eor r23, r22 - 13f0: 69 50 subi r22, 0x09 ; 9 - 13f2: 7d 4f sbci r23, 0xFD ; 253 - 13f4: 0c 94 04 26 jmp 0x4c08 ; 0x4c08 + 1356: e0 91 fe 20 lds r30, 0x20FE + 135a: f0 91 ff 20 lds r31, 0x20FF + 135e: 60 81 ld r22, Z + 1360: 20 e2 ldi r18, 0x20 ; 32 + 1362: 62 9f mul r22, r18 + 1364: b0 01 movw r22, r0 + 1366: 11 24 eor r1, r1 + 1368: 69 50 subi r22, 0x09 ; 9 + 136a: 7d 4f sbci r23, 0xFD ; 253 + 136c: 0c 94 1f 24 jmp 0x483e ; 0x483e -000013f8 : +00001370 : } - 13f8: cf 93 push r28 bool ButtonSetActionByName(const char* Action) { - 13fa: df 93 push r29 - 13fc: ec 01 movw r28, r24 + 1370: cf 93 push r28 + 1372: df 93 push r29 + 1374: ec 01 movw r28, r24 uint8_t i; for (i=0; i - 1406: 00 97 sbiw r24, 0x00 ; 0 - 1408: 71 f1 breq .+92 ; 0x1466 - 140a: ce 01 movw r24, r28 - 140c: 67 e1 ldi r22, 0x17 ; 23 - 140e: 73 e0 ldi r23, 0x03 ; 3 - 1410: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1414: 00 97 sbiw r24, 0x00 ; 0 - 1416: 69 f1 breq .+90 ; 0x1472 - 1418: ce 01 movw r24, r28 - 141a: 67 e3 ldi r22, 0x37 ; 55 - 141c: 73 e0 ldi r23, 0x03 ; 3 - 141e: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1422: 00 97 sbiw r24, 0x00 ; 0 - 1424: 41 f1 breq .+80 ; 0x1476 - 1426: ce 01 movw r24, r28 - 1428: 67 e5 ldi r22, 0x57 ; 87 - 142a: 73 e0 ldi r23, 0x03 ; 3 - 142c: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1430: 00 97 sbiw r24, 0x00 ; 0 - 1432: 19 f1 breq .+70 ; 0x147a - 1434: ce 01 movw r24, r28 - 1436: 67 e7 ldi r22, 0x77 ; 119 - 1438: 73 e0 ldi r23, 0x03 ; 3 - 143a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 143e: 00 97 sbiw r24, 0x00 ; 0 - 1440: f1 f0 breq .+60 ; 0x147e - 1442: ce 01 movw r24, r28 - 1444: 67 e9 ldi r22, 0x97 ; 151 - 1446: 73 e0 ldi r23, 0x03 ; 3 - 1448: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 144c: 00 97 sbiw r24, 0x00 ; 0 - 144e: c9 f0 breq .+50 ; 0x1482 - 1450: ce 01 movw r24, r28 - 1452: 67 eb ldi r22, 0xB7 ; 183 - 1454: 73 e0 ldi r23, 0x03 ; 3 - 1456: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 145a: 00 97 sbiw r24, 0x00 ; 0 - 145c: a1 f0 breq .+40 ; 0x1486 + 1376: 67 ef ldi r22, 0xF7 ; 247 + 1378: 72 e0 ldi r23, 0x02 ; 2 + 137a: 0e 94 16 24 call 0x482c ; 0x482c + 137e: 89 2b or r24, r25 + 1380: 71 f1 breq .+92 ; 0x13de + 1382: 67 e1 ldi r22, 0x17 ; 23 + 1384: 73 e0 ldi r23, 0x03 ; 3 + 1386: ce 01 movw r24, r28 + 1388: 0e 94 16 24 call 0x482c ; 0x482c + 138c: 89 2b or r24, r25 + 138e: 69 f1 breq .+90 ; 0x13ea + 1390: 67 e3 ldi r22, 0x37 ; 55 + 1392: 73 e0 ldi r23, 0x03 ; 3 + 1394: ce 01 movw r24, r28 + 1396: 0e 94 16 24 call 0x482c ; 0x482c + 139a: 89 2b or r24, r25 + 139c: 41 f1 breq .+80 ; 0x13ee + 139e: 67 e5 ldi r22, 0x57 ; 87 + 13a0: 73 e0 ldi r23, 0x03 ; 3 + 13a2: ce 01 movw r24, r28 + 13a4: 0e 94 16 24 call 0x482c ; 0x482c + 13a8: 89 2b or r24, r25 + 13aa: 19 f1 breq .+70 ; 0x13f2 + 13ac: 67 e7 ldi r22, 0x77 ; 119 + 13ae: 73 e0 ldi r23, 0x03 ; 3 + 13b0: ce 01 movw r24, r28 + 13b2: 0e 94 16 24 call 0x482c ; 0x482c + 13b6: 89 2b or r24, r25 + 13b8: f1 f0 breq .+60 ; 0x13f6 + 13ba: 67 e9 ldi r22, 0x97 ; 151 + 13bc: 73 e0 ldi r23, 0x03 ; 3 + 13be: ce 01 movw r24, r28 + 13c0: 0e 94 16 24 call 0x482c ; 0x482c + 13c4: 89 2b or r24, r25 + 13c6: c9 f0 breq .+50 ; 0x13fa + 13c8: 67 eb ldi r22, 0xB7 ; 183 + 13ca: 73 e0 ldi r23, 0x03 ; 3 + 13cc: ce 01 movw r24, r28 + 13ce: 0e 94 16 24 call 0x482c ; 0x482c + 13d2: 89 2b or r24, r25 + 13d4: a1 f0 breq .+40 ; 0x13fe return true; } } /* Button action not found */ return false; - 145e: 80 e0 ldi r24, 0x00 ; 0 + 13d6: 80 e0 ldi r24, 0x00 ; 0 } - 1460: df 91 pop r29 - 1462: cf 91 pop r28 - 1464: 08 95 ret + 13d8: df 91 pop r29 + 13da: cf 91 pop r28 + 13dc: 08 95 ret bool ButtonSetActionByName(const char* Action) { uint8_t i; for (i=0; i - 146a: 81 e0 ldi r24, 0x01 ; 1 + 13e0: b3 df rcall .-154 ; 0x1348 return true; - 146c: df 91 pop r29 + 13e2: 81 e0 ldi r24, 0x01 ; 1 } } /* Button action not found */ return false; } - 146e: cf 91 pop r28 - 1470: 08 95 ret - 1472: 81 e0 ldi r24, 0x01 ; 1 + 13e4: df 91 pop r29 + 13e6: cf 91 pop r28 + 13e8: 08 95 ret bool ButtonSetActionByName(const char* Action) { uint8_t i; for (i=0; i - 1476: 82 e0 ldi r24, 0x02 ; 2 - 1478: f7 cf rjmp .-18 ; 0x1468 - 147a: 83 e0 ldi r24, 0x03 ; 3 - 147c: f5 cf rjmp .-22 ; 0x1468 - 147e: 84 e0 ldi r24, 0x04 ; 4 - 1480: f3 cf rjmp .-26 ; 0x1468 - 1482: 85 e0 ldi r24, 0x05 ; 5 - 1484: f1 cf rjmp .-30 ; 0x1468 - 1486: 86 e0 ldi r24, 0x06 ; 6 + 13ea: 81 e0 ldi r24, 0x01 ; 1 + 13ec: f9 cf rjmp .-14 ; 0x13e0 + 13ee: 82 e0 ldi r24, 0x02 ; 2 + 13f0: f7 cf rjmp .-18 ; 0x13e0 + 13f2: 83 e0 ldi r24, 0x03 ; 3 + 13f4: f5 cf rjmp .-22 ; 0x13e0 + 13f6: 84 e0 ldi r24, 0x04 ; 4 + 13f8: f3 cf rjmp .-26 ; 0x13e0 + 13fa: 85 e0 ldi r24, 0x05 ; 5 + 13fc: f1 cf rjmp .-30 ; 0x13e0 if (strcmp_P(Action, ButtonActionTable[i]) == 0) { - 1488: ef cf rjmp .-34 ; 0x1468 + 13fe: 86 e0 ldi r24, 0x06 ; 6 + 1400: ef cf rjmp .-34 ; 0x13e0 -0000148a : +00001402 : .ButtonAction = DEFAULT_BUTTON_ACTION, } } }; void SettingsLoad(void) { eeprom_read_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 148a: 8d e0 ldi r24, 0x0D ; 13 - 148c: 91 e2 ldi r25, 0x21 ; 33 - 148e: 60 e0 ldi r22, 0x00 ; 0 - 1490: 70 e0 ldi r23, 0x00 ; 0 - 1492: 43 e1 ldi r20, 0x13 ; 19 - 1494: 50 e0 ldi r21, 0x00 ; 0 - 1496: 0c 94 18 28 jmp 0x5030 ; 0x5030 <__eerd_block_x32a4u> + 1402: 43 e1 ldi r20, 0x13 ; 19 + 1404: 50 e0 ldi r21, 0x00 ; 0 + 1406: 60 e0 ldi r22, 0x00 ; 0 + 1408: 70 e0 ldi r23, 0x00 ; 0 + 140a: 8d ef ldi r24, 0xFD ; 253 + 140c: 90 e2 ldi r25, 0x20 ; 32 + 140e: 0c 94 31 26 jmp 0x4c62 ; 0x4c62 <__eerd_block_x32a4u> -0000149a : +00001412 : } - 149a: 8d e0 ldi r24, 0x0D ; 13 void SettingsSave(void) { #if ENABLE_EEPROM_SETTINGS eeprom_write_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 149c: 91 e2 ldi r25, 0x21 ; 33 - 149e: 60 e0 ldi r22, 0x00 ; 0 - 14a0: 70 e0 ldi r23, 0x00 ; 0 - 14a2: 43 e1 ldi r20, 0x13 ; 19 - 14a4: 50 e0 ldi r21, 0x00 ; 0 - 14a6: 0c 94 23 28 jmp 0x5046 ; 0x5046 <__eewr_block_x32a4u> + 1412: 43 e1 ldi r20, 0x13 ; 19 + 1414: 50 e0 ldi r21, 0x00 ; 0 + 1416: 60 e0 ldi r22, 0x00 ; 0 + 1418: 70 e0 ldi r23, 0x00 ; 0 + 141a: 8d ef ldi r24, 0xFD ; 253 + 141c: 90 e2 ldi r25, 0x20 ; 32 + 141e: 0c 94 3c 26 jmp 0x4c78 ; 0x4c78 <__eewr_block_x32a4u> -000014aa : -#endif -} - 14aa: 88 30 cpi r24, 0x08 ; 8 +00001422 : } } } void SettingsSetActiveById(uint8_t Setting) { if (Setting < SETTINGS_COUNT) { - 14ac: 08 f0 brcs .+2 ; 0x14b0 - 14ae: 08 95 ret + 1422: 88 30 cpi r24, 0x08 ; 8 + 1424: 08 f0 brcs .+2 ; 0x1428 + 1426: 08 95 ret GlobalSettings.ActiveSetting = Setting; - 14b0: 80 93 0d 21 sts 0x210D, r24 + 1428: 80 93 fd 20 sts 0x20FD, r24 GlobalSettings.ActiveSettingPtr = &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; - 14b4: 90 e0 ldi r25, 0x00 ; 0 - 14b6: 88 0f add r24, r24 - 14b8: 99 1f adc r25, r25 - 14ba: 80 5f subi r24, 0xF0 ; 240 - 14bc: 9e 4d sbci r25, 0xDE ; 222 + 142c: 90 e0 ldi r25, 0x00 ; 0 + 142e: 88 0f add r24, r24 + 1430: 99 1f adc r25, r25 + 1432: 80 50 subi r24, 0x00 ; 0 + 1434: 9f 4d sbci r25, 0xDF ; 223 } void SettingsSetActiveById(uint8_t Setting) { if (Setting < SETTINGS_COUNT) { GlobalSettings.ActiveSetting = Setting; GlobalSettings.ActiveSettingPtr = - 14be: 80 93 0e 21 sts 0x210E, r24 - 14c2: 90 93 0f 21 sts 0x210F, r25 + 1436: 80 93 fe 20 sts 0x20FE, r24 + 143a: 90 93 ff 20 sts 0x20FF, r25 &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; /* Settings have changed. Progress changes through system */ ConfigurationInit(); - 14c6: 0b ca rjmp .-3050 ; 0x8de + 143e: 45 ca rjmp .-2934 ; 0x8ca -000014c8 : - 14c8: 80 91 0d 21 lds r24, 0x210D +00001440 : void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 14cc: 8f 5f subi r24, 0xFF ; 255 - 14ce: 87 70 andi r24, 0x07 ; 7 + 1440: 20 91 fd 20 lds r18, 0x20FD + 1444: 30 e0 ldi r19, 0x00 ; 0 + 1446: 2f 5f subi r18, 0xFF ; 255 + 1448: 3f 4f sbci r19, 0xFF ; 255 + 144a: 27 70 andi r18, 0x07 ; 7 + 144c: 33 27 eor r19, r19 + 144e: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 14d0: 28 2f mov r18, r24 - 14d2: 30 e0 ldi r19, 0x00 ; 0 - 14d4: f9 01 movw r30, r18 - 14d6: ee 0f add r30, r30 - 14d8: ff 1f adc r31, r31 - 14da: ef 5e subi r30, 0xEF ; 239 - 14dc: fe 4d sbci r31, 0xDE ; 222 - 14de: 90 81 ld r25, Z - 14e0: 99 23 and r25, r25 - 14e2: 09 f0 breq .+2 ; 0x14e6 - 14e4: 5d c0 rjmp .+186 ; 0x15a0 + 1450: f9 01 movw r30, r18 + 1452: ee 0f add r30, r30 + 1454: ff 1f adc r31, r31 + 1456: ef 5f subi r30, 0xFF ; 255 + 1458: fe 4d sbci r31, 0xDE ; 222 + 145a: 90 81 ld r25, Z + 145c: 91 11 cpse r25, r1 + 145e: 5c c0 rjmp .+184 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 14e6: c9 01 movw r24, r18 - 14e8: 01 96 adiw r24, 0x01 ; 1 - 14ea: 87 70 andi r24, 0x07 ; 7 + 1460: 2f 5f subi r18, 0xFF ; 255 + 1462: 3f 4f sbci r19, 0xFF ; 255 + 1464: 27 70 andi r18, 0x07 ; 7 + 1466: 33 27 eor r19, r19 + 1468: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 14ec: 28 2f mov r18, r24 - 14ee: 30 e0 ldi r19, 0x00 ; 0 - 14f0: f9 01 movw r30, r18 - 14f2: ee 0f add r30, r30 - 14f4: ff 1f adc r31, r31 - 14f6: ef 5e subi r30, 0xEF ; 239 - 14f8: fe 4d sbci r31, 0xDE ; 222 - 14fa: 90 81 ld r25, Z - 14fc: 99 23 and r25, r25 - 14fe: 09 f0 breq .+2 ; 0x1502 - 1500: 4f c0 rjmp .+158 ; 0x15a0 + 146a: f9 01 movw r30, r18 + 146c: ee 0f add r30, r30 + 146e: ff 1f adc r31, r31 + 1470: ef 5f subi r30, 0xFF ; 255 + 1472: fe 4d sbci r31, 0xDE ; 222 + 1474: 90 81 ld r25, Z + 1476: 91 11 cpse r25, r1 + 1478: 4f c0 rjmp .+158 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1502: c9 01 movw r24, r18 - 1504: 01 96 adiw r24, 0x01 ; 1 - 1506: 87 70 andi r24, 0x07 ; 7 + 147a: 2f 5f subi r18, 0xFF ; 255 + 147c: 3f 4f sbci r19, 0xFF ; 255 + 147e: 27 70 andi r18, 0x07 ; 7 + 1480: 33 27 eor r19, r19 + 1482: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1508: 28 2f mov r18, r24 - 150a: 30 e0 ldi r19, 0x00 ; 0 - 150c: f9 01 movw r30, r18 - 150e: ee 0f add r30, r30 - 1510: ff 1f adc r31, r31 - 1512: ef 5e subi r30, 0xEF ; 239 - 1514: fe 4d sbci r31, 0xDE ; 222 - 1516: 90 81 ld r25, Z - 1518: 99 23 and r25, r25 - 151a: 09 f0 breq .+2 ; 0x151e - 151c: 41 c0 rjmp .+130 ; 0x15a0 + 1484: f9 01 movw r30, r18 + 1486: ee 0f add r30, r30 + 1488: ff 1f adc r31, r31 + 148a: ef 5f subi r30, 0xFF ; 255 + 148c: fe 4d sbci r31, 0xDE ; 222 + 148e: 90 81 ld r25, Z + 1490: 91 11 cpse r25, r1 + 1492: 42 c0 rjmp .+132 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 151e: c9 01 movw r24, r18 - 1520: 01 96 adiw r24, 0x01 ; 1 - 1522: 87 70 andi r24, 0x07 ; 7 + 1494: 2f 5f subi r18, 0xFF ; 255 + 1496: 3f 4f sbci r19, 0xFF ; 255 + 1498: 27 70 andi r18, 0x07 ; 7 + 149a: 33 27 eor r19, r19 + 149c: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1524: 28 2f mov r18, r24 - 1526: 30 e0 ldi r19, 0x00 ; 0 - 1528: f9 01 movw r30, r18 - 152a: ee 0f add r30, r30 - 152c: ff 1f adc r31, r31 - 152e: ef 5e subi r30, 0xEF ; 239 - 1530: fe 4d sbci r31, 0xDE ; 222 - 1532: 90 81 ld r25, Z - 1534: 99 23 and r25, r25 - 1536: a1 f5 brne .+104 ; 0x15a0 + 149e: f9 01 movw r30, r18 + 14a0: ee 0f add r30, r30 + 14a2: ff 1f adc r31, r31 + 14a4: ef 5f subi r30, 0xFF ; 255 + 14a6: fe 4d sbci r31, 0xDE ; 222 + 14a8: 90 81 ld r25, Z + 14aa: 91 11 cpse r25, r1 + 14ac: 35 c0 rjmp .+106 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1538: c9 01 movw r24, r18 - 153a: 01 96 adiw r24, 0x01 ; 1 - 153c: 87 70 andi r24, 0x07 ; 7 + 14ae: 2f 5f subi r18, 0xFF ; 255 + 14b0: 3f 4f sbci r19, 0xFF ; 255 + 14b2: 27 70 andi r18, 0x07 ; 7 + 14b4: 33 27 eor r19, r19 + 14b6: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 153e: 28 2f mov r18, r24 - 1540: 30 e0 ldi r19, 0x00 ; 0 - 1542: f9 01 movw r30, r18 - 1544: ee 0f add r30, r30 - 1546: ff 1f adc r31, r31 - 1548: ef 5e subi r30, 0xEF ; 239 - 154a: fe 4d sbci r31, 0xDE ; 222 - 154c: 90 81 ld r25, Z - 154e: 99 23 and r25, r25 - 1550: 39 f5 brne .+78 ; 0x15a0 + 14b8: f9 01 movw r30, r18 + 14ba: ee 0f add r30, r30 + 14bc: ff 1f adc r31, r31 + 14be: ef 5f subi r30, 0xFF ; 255 + 14c0: fe 4d sbci r31, 0xDE ; 222 + 14c2: 90 81 ld r25, Z + 14c4: 91 11 cpse r25, r1 + 14c6: 28 c0 rjmp .+80 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1552: c9 01 movw r24, r18 - 1554: 01 96 adiw r24, 0x01 ; 1 - 1556: 87 70 andi r24, 0x07 ; 7 + 14c8: 2f 5f subi r18, 0xFF ; 255 + 14ca: 3f 4f sbci r19, 0xFF ; 255 + 14cc: 27 70 andi r18, 0x07 ; 7 + 14ce: 33 27 eor r19, r19 + 14d0: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1558: 28 2f mov r18, r24 - 155a: 30 e0 ldi r19, 0x00 ; 0 - 155c: f9 01 movw r30, r18 - 155e: ee 0f add r30, r30 - 1560: ff 1f adc r31, r31 - 1562: ef 5e subi r30, 0xEF ; 239 - 1564: fe 4d sbci r31, 0xDE ; 222 - 1566: 90 81 ld r25, Z - 1568: 99 23 and r25, r25 - 156a: d1 f4 brne .+52 ; 0x15a0 + 14d2: f9 01 movw r30, r18 + 14d4: ee 0f add r30, r30 + 14d6: ff 1f adc r31, r31 + 14d8: ef 5f subi r30, 0xFF ; 255 + 14da: fe 4d sbci r31, 0xDE ; 222 + 14dc: 90 81 ld r25, Z + 14de: 91 11 cpse r25, r1 + 14e0: 1b c0 rjmp .+54 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 156c: c9 01 movw r24, r18 - 156e: 01 96 adiw r24, 0x01 ; 1 - 1570: 87 70 andi r24, 0x07 ; 7 + 14e2: 2f 5f subi r18, 0xFF ; 255 + 14e4: 3f 4f sbci r19, 0xFF ; 255 + 14e6: 27 70 andi r18, 0x07 ; 7 + 14e8: 33 27 eor r19, r19 + 14ea: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1572: 28 2f mov r18, r24 - 1574: 30 e0 ldi r19, 0x00 ; 0 - 1576: f9 01 movw r30, r18 - 1578: ee 0f add r30, r30 - 157a: ff 1f adc r31, r31 - 157c: ef 5e subi r30, 0xEF ; 239 - 157e: fe 4d sbci r31, 0xDE ; 222 - 1580: 90 81 ld r25, Z - 1582: 99 23 and r25, r25 - 1584: 69 f4 brne .+26 ; 0x15a0 + 14ec: f9 01 movw r30, r18 + 14ee: ee 0f add r30, r30 + 14f0: ff 1f adc r31, r31 + 14f2: ef 5f subi r30, 0xFF ; 255 + 14f4: fe 4d sbci r31, 0xDE ; 222 + 14f6: 90 81 ld r25, Z + 14f8: 91 11 cpse r25, r1 + 14fa: 0e c0 rjmp .+28 ; 0x1518 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1586: c9 01 movw r24, r18 - 1588: 01 96 adiw r24, 0x01 ; 1 - 158a: 87 70 andi r24, 0x07 ; 7 + 14fc: 2f 5f subi r18, 0xFF ; 255 + 14fe: 3f 4f sbci r19, 0xFF ; 255 + 1500: 27 70 andi r18, 0x07 ; 7 + 1502: 33 27 eor r19, r19 + 1504: 82 2f mov r24, r18 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 158c: e8 2f mov r30, r24 - 158e: f0 e0 ldi r31, 0x00 ; 0 - 1590: ee 0f add r30, r30 - 1592: ff 1f adc r31, r31 - 1594: ef 5e subi r30, 0xEF ; 239 - 1596: fe 4d sbci r31, 0xDE ; 222 - 1598: 90 81 ld r25, Z - 159a: 99 23 and r25, r25 - 159c: 09 f4 brne .+2 ; 0x15a0 - 159e: 08 95 ret + 1506: f9 01 movw r30, r18 + 1508: ee 0f add r30, r30 + 150a: ff 1f adc r31, r31 + 150c: ef 5f subi r30, 0xFF ; 255 + 150e: fe 4d sbci r31, 0xDE ; 222 + 1510: 90 81 ld r25, Z + 1512: 91 11 cpse r25, r1 + 1514: 01 c0 rjmp .+2 ; 0x1518 + 1516: 08 95 ret SettingsSetActiveById(Setting); - 15a0: 84 cf rjmp .-248 ; 0x14aa + 1518: 84 cf rjmp .-248 ; 0x1422 -000015a2 : - 15a2: 80 91 0d 21 lds r24, 0x210D +0000151a : } } uint8_t SettingsGetActiveById(void) { return GlobalSettings.ActiveSetting; } - 15a6: 08 95 ret + 151a: 80 91 fd 20 lds r24, 0x20FD + 151e: 08 95 ret -000015a8 : +00001520 : void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { - 15a8: cf 93 push r28 - 15aa: df 93 push r29 - 15ac: ec 01 movw r28, r24 + 1520: cf 93 push r28 + 1522: df 93 push r29 + 1524: ec 01 movw r28, r24 SettingOut[0] = SettingsGetActiveById() + '0'; - 15ae: f9 df rcall .-14 ; 0x15a2 - 15b0: 80 5d subi r24, 0xD0 ; 208 - 15b2: 88 83 st Y, r24 - 15b4: 19 82 std Y+1, r1 ; 0x01 + 1526: f9 df rcall .-14 ; 0x151a + 1528: 80 5d subi r24, 0xD0 ; 208 + 152a: 88 83 st Y, r24 SettingOut[1] = '\0'; - 15b6: df 91 pop r29 + 152c: 19 82 std Y+1, r1 ; 0x01 } - 15b8: cf 91 pop r28 - 15ba: 08 95 ret + 152e: df 91 pop r29 + 1530: cf 91 pop r28 + 1532: 08 95 ret -000015bc : - 15bc: fc 01 movw r30, r24 +00001534 : bool SettingsSetActiveByName(const char* Setting) { + 1534: fc 01 movw r30, r24 uint8_t SettingNr = Setting[0] - '0'; - 15be: 80 81 ld r24, Z + 1536: 80 81 ld r24, Z if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - 15c0: 91 81 ldd r25, Z+1 ; 0x01 - 15c2: 99 23 and r25, r25 - 15c4: 41 f4 brne .+16 ; 0x15d6 + 1538: 91 81 ldd r25, Z+1 ; 0x01 + 153a: 91 11 cpse r25, r1 + 153c: 03 c0 rjmp .+6 ; 0x1544 SettingOut[0] = SettingsGetActiveById() + '0'; SettingOut[1] = '\0'; } bool SettingsSetActiveByName(const char* Setting) { uint8_t SettingNr = Setting[0] - '0'; - 15c6: 80 53 subi r24, 0x30 ; 48 + 153e: 80 53 subi r24, 0x30 ; 48 if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - 15c8: 88 30 cpi r24, 0x08 ; 8 - 15ca: 10 f0 brcs .+4 ; 0x15d0 + 1540: 88 30 cpi r24, 0x08 ; 8 + 1542: 10 f0 brcs .+4 ; 0x1548 SettingsSetActiveById(SettingNr); return true; } else { return false; - 15cc: 80 e0 ldi r24, 0x00 ; 0 + 1544: 80 e0 ldi r24, 0x00 ; 0 } } - 15ce: 08 95 ret + 1546: 08 95 ret bool SettingsSetActiveByName(const char* Setting) { uint8_t SettingNr = Setting[0] - '0'; if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { SettingsSetActiveById(SettingNr); - 15d0: 6c df rcall .-296 ; 0x14aa - 15d2: 81 e0 ldi r24, 0x01 ; 1 + 1548: 6c df rcall .-296 ; 0x1422 return true; - 15d4: 08 95 ret - 15d6: 80 e0 ldi r24, 0x00 ; 0 - } else { - return false; - 15d8: 08 95 ret - -000015da : + 154a: 81 e0 ldi r24, 0x01 ; 1 + 154c: 08 95 ret +0000154e : uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE]; TerminalStateEnum TerminalState = TERMINAL_UNINITIALIZED; static uint8_t TerminalInitDelay = INIT_DELAY; void TerminalSendString(const char* s) { - 15da: bc 01 movw r22, r24 CDC_Device_SendString(&TerminalHandle, s); - 15dc: 80 e0 ldi r24, 0x00 ; 0 - 15de: 90 e2 ldi r25, 0x20 ; 32 - 15e0: 0c 94 3b 24 jmp 0x4876 ; 0x4876 + 154e: bc 01 movw r22, r24 + 1550: 80 e0 ldi r24, 0x00 ; 0 + 1552: 90 e2 ldi r25, 0x20 ; 32 + 1554: 0c 94 ad 21 jmp 0x435a ; 0x435a -000015e4 : +00001558 : } - 15e4: cf 93 push r28 void TerminalSendStringP(const char* s) { - 15e6: df 93 push r29 + 1558: cf 93 push r28 + 155a: df 93 push r29 char c; while( (c = pgm_read_byte(s++)) != '\0' ) { - 15e8: fc 01 movw r30, r24 - 15ea: 64 91 lpm r22, Z - 15ec: 66 23 and r22, r22 - 15ee: 59 f0 breq .+22 ; 0x1606 - 15f0: ec 01 movw r28, r24 - 15f2: 21 96 adiw r28, 0x01 ; 1 + 155c: ec 01 movw r28, r24 + 155e: 21 96 adiw r28, 0x01 ; 1 + 1560: fc 01 movw r30, r24 + 1562: 64 91 lpm r22, Z + 1564: 66 23 and r22, r22 + 1566: 49 f0 breq .+18 ; 0x157a void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } - 15f4: 80 e0 ldi r24, 0x00 ; 0 - 15f6: 90 e2 ldi r25, 0x20 ; 32 - 15f8: 0e 94 81 24 call 0x4902 ; 0x4902 - 15fc: fe 01 movw r30, r28 - 15fe: 21 96 adiw r28, 0x01 ; 1 - 1600: 64 91 lpm r22, Z - 1602: 66 23 and r22, r22 - 1604: b9 f7 brne .-18 ; 0x15f4 + 1568: 80 e0 ldi r24, 0x00 ; 0 + 156a: 90 e2 ldi r25, 0x20 ; 32 + 156c: 0e 94 00 22 call 0x4400 ; 0x4400 + 1570: fe 01 movw r30, r28 + 1572: 21 96 adiw r28, 0x01 ; 1 + 1574: 64 91 lpm r22, Z + 1576: 61 11 cpse r22, r1 + 1578: f7 cf rjmp .-18 ; 0x1568 TerminalSendChar(c); } } - 1606: df 91 pop r29 - 1608: cf 91 pop r28 - 160a: 08 95 ret + 157a: df 91 pop r29 + 157c: cf 91 pop r28 + 157e: 08 95 ret -0000160c : +00001580 : #endif void TerminalSendBlock(void* Buffer, uint16_t ByteCount) { - 160c: 9c 01 movw r18, r24 - 160e: ab 01 movw r20, r22 + 1580: ab 01 movw r20, r22 CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); - 1610: 80 e0 ldi r24, 0x00 ; 0 - 1612: 90 e2 ldi r25, 0x20 ; 32 - 1614: b9 01 movw r22, r18 - 1616: 0c 94 5f 24 jmp 0x48be ; 0x48be + 1582: bc 01 movw r22, r24 + 1584: 80 e0 ldi r24, 0x00 ; 0 + 1586: 90 e2 ldi r25, 0x20 ; 32 + 1588: 0c 94 d6 21 jmp 0x43ac ; 0x43ac -0000161a : -} - 161a: 80 e2 ldi r24, 0x20 ; 32 +0000158c : } } void TerminalInit(void) { TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK; - 161c: e0 e6 ldi r30, 0x60 ; 96 - 161e: f6 e0 ldi r31, 0x06 ; 6 - 1620: 82 83 std Z+2, r24 ; 0x02 -} - 1622: 08 95 ret + 158c: 80 e2 ldi r24, 0x20 ; 32 + 158e: e0 e6 ldi r30, 0x60 ; 96 + 1590: f6 e0 ldi r31, 0x06 ; 6 + 1592: 82 83 std Z+2, r24 ; 0x02 + 1594: 08 95 ret -00001624 : +00001596 : +} void TerminalTask(void) { - 1624: cf 93 push r28 - 1626: df 93 push r29 + 1596: cf 93 push r28 + 1598: df 93 push r29 CDC_Device_USBTask(&TerminalHandle); - 1628: 80 e0 ldi r24, 0x00 ; 0 - 162a: 90 e2 ldi r25, 0x20 ; 32 - 162c: 0e 94 f5 24 call 0x49ea ; 0x49ea + 159a: 80 e0 ldi r24, 0x00 ; 0 + 159c: 90 e2 ldi r25, 0x20 ; 32 + 159e: 0e 94 7f 22 call 0x44fe ; 0x44fe USB_USBTask(); - 1630: 0e 94 54 1e call 0x3ca8 ; 0x3ca8 + 15a2: 0e 94 80 1c call 0x3900 ; 0x3900 CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); } static void ProcessByte(void) { int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle); - 1634: 80 e0 ldi r24, 0x00 ; 0 - 1636: 90 e2 ldi r25, 0x20 ; 32 - 1638: 0e 94 0f 25 call 0x4a1e ; 0x4a1e - 163c: ec 01 movw r28, r24 + 15a6: 80 e0 ldi r24, 0x00 ; 0 + 15a8: 90 e2 ldi r25, 0x20 ; 32 + 15aa: 0e 94 9a 22 call 0x4534 ; 0x4534 + 15ae: ec 01 movw r28, r24 if (Byte >= 0) { - 163e: 97 fd sbrc r25, 7 - 1640: 0a c0 rjmp .+20 ; 0x1656 + 15b0: 97 fd sbrc r25, 7 + 15b2: 09 c0 rjmp .+18 ; 0x15c6 LED_PORT.OUTTGL = Mask; } static inline void LEDPulse(uint8_t Mask) { LEDPulseMask = Mask; - 1642: 80 e1 ldi r24, 0x10 ; 16 - 1644: 80 93 a3 20 sts 0x20A3, r24 + 15b4: 80 e1 ldi r24, 0x10 ; 16 + 15b6: 80 93 93 20 sts 0x2093, r24 LED_PORT.OUTSET = Mask; - 1648: e0 e0 ldi r30, 0x00 ; 0 - 164a: f6 e0 ldi r31, 0x06 ; 6 - 164c: 85 83 std Z+5, r24 ; 0x05 + 15ba: 80 93 05 06 sts 0x0605, r24 /* Byte received */ LEDPulse(LED_RED); if (XModemProcessByte(Byte)) { - 164e: 8c 2f mov r24, r28 - 1650: b3 d2 rcall .+1382 ; 0x1bb8 - 1652: 88 23 and r24, r24 - 1654: 19 f0 breq .+6 ; 0x165c - 1656: df 91 pop r29 + 15be: 8c 2f mov r24, r28 + 15c0: 62 d2 rcall .+1220 ; 0x1a86 + 15c2: 88 23 and r24, r24 + 15c4: 19 f0 breq .+6 ; 0x15cc { CDC_Device_USBTask(&TerminalHandle); USB_USBTask(); ProcessByte(); } - 1658: cf 91 pop r28 - 165a: 08 95 ret - 165c: 8c 2f mov r24, r28 + 15c6: df 91 pop r29 + 15c8: cf 91 pop r28 + 15ca: 08 95 ret /* Byte received */ LEDPulse(LED_RED); if (XModemProcessByte(Byte)) { /* XModem handled the byte */ } else if (CommandLineProcessByte(Byte)) { - 165e: 33 d4 rcall .+2150 ; 0x1ec6 - 1660: df 91 pop r29 - 1662: cf 91 pop r28 + 15cc: 8c 2f mov r24, r28 { CDC_Device_USBTask(&TerminalHandle); USB_USBTask(); ProcessByte(); } - 1664: 08 95 ret + 15ce: df 91 pop r29 + 15d0: cf 91 pop r28 + /* Byte received */ + LEDPulse(LED_RED); -00001666 : - 1666: 80 91 a4 20 lds r24, 0x20A4 + if (XModemProcessByte(Byte)) { + /* XModem handled the byte */ + } else if (CommandLineProcessByte(Byte)) { + 15d2: c9 c3 rjmp .+1938 ; 0x1d66 + +000015d4 : } } static void SenseVBus(void) { switch(TerminalState) { - 166a: 81 30 cpi r24, 0x01 ; 1 - 166c: 09 f1 breq .+66 ; 0x16b0 - 166e: 81 30 cpi r24, 0x01 ; 1 - 1670: 30 f0 brcs .+12 ; 0x167e - 1672: 82 30 cpi r24, 0x02 ; 2 - 1674: 59 f1 breq .+86 ; 0x16cc - 1676: 83 30 cpi r24, 0x03 ; 3 - 1678: 71 f0 breq .+28 ; 0x1696 + 15d4: 80 91 94 20 lds r24, 0x2094 + 15d8: 81 30 cpi r24, 0x01 ; 1 + 15da: 01 f1 breq .+64 ; 0x161c + 15dc: 30 f0 brcs .+12 ; 0x15ea + 15de: 82 30 cpi r24, 0x02 ; 2 + 15e0: 59 f1 breq .+86 ; 0x1638 + 15e2: 83 30 cpi r24, 0x03 ; 3 + 15e4: 71 f0 breq .+28 ; 0x1602 void TerminalTick(void) { SenseVBus(); XModemTick(); - 167a: f7 d3 rcall .+2030 ; 0x1e6a - 167c: c7 c5 rjmp .+2958 ; 0x220c + 15e6: 91 d3 rcall .+1826 ; 0x1d0a CommandLineTick(); - 167e: 80 91 68 06 lds r24, 0x0668 -} - 1682: 85 ff sbrs r24, 5 + 15e8: 5f c5 rjmp .+2750 ; 0x20a8 static void SenseVBus(void) { switch(TerminalState) { case TERMINAL_UNINITIALIZED: if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { - 1684: fa cf rjmp .-12 ; 0x167a - 1686: 84 e1 ldi r24, 0x14 ; 20 - 1688: 80 93 1b 20 sts 0x201B, r24 + 15ea: 80 91 68 06 lds r24, 0x0668 + 15ee: 85 ff sbrs r24, 5 + 15f0: fa cf rjmp .-12 ; 0x15e6 /* Not initialized and VBUS sense high */ TerminalInitDelay = INIT_DELAY; - 168c: 81 e0 ldi r24, 0x01 ; 1 - 168e: 80 93 a4 20 sts 0x20A4, r24 + 15f2: 84 e1 ldi r24, 0x14 ; 20 + 15f4: 80 93 1b 20 sts 0x201B, r24 TerminalState = TERMINAL_INITIALIZING; - 1692: eb d3 rcall .+2006 ; 0x1e6a - 1694: bb c5 rjmp .+2934 ; 0x220c - 1696: 80 91 1b 20 lds r24, 0x201B + 15f8: 81 e0 ldi r24, 0x01 ; 1 + 15fa: 80 93 94 20 sts 0x2094, r24 void TerminalTick(void) { SenseVBus(); XModemTick(); - 169a: 81 50 subi r24, 0x01 ; 1 + 15fe: 85 d3 rcall .+1802 ; 0x1d0a CommandLineTick(); - 169c: 80 93 1b 20 sts 0x201B, r24 -} - 16a0: 88 23 and r24, r24 + 1600: 53 c5 rjmp .+2726 ; 0x20a8 TerminalState = TERMINAL_UNITIALIZING; } break; case TERMINAL_UNITIALIZING: if (--TerminalInitDelay == 0) { - 16a2: 59 f7 brne .-42 ; 0x167a - 16a4: 0e 94 88 22 call 0x4510 ; 0x4510 - 16a8: d3 d8 rcall .-3674 ; 0x850 - 16aa: 10 92 a4 20 sts 0x20A4, r1 - 16ae: e5 cf rjmp .-54 ; 0x167a + 1602: 80 91 1b 20 lds r24, 0x201B + 1606: 81 50 subi r24, 0x01 ; 1 + 1608: 80 93 1b 20 sts 0x201B, r24 + 160c: 81 11 cpse r24, r1 + 160e: eb cf rjmp .-42 ; 0x15e6 USB_Disable(); - 16b0: 80 91 1b 20 lds r24, 0x201B + 1610: 0e 94 aa 20 call 0x4154 ; 0x4154 SystemStopUSBClock(); - 16b4: 81 50 subi r24, 0x01 ; 1 - 16b6: 80 93 1b 20 sts 0x201B, r24 + 1614: 21 d9 rcall .-3518 ; 0x858 TerminalState = TERMINAL_UNINITIALIZED; - 16ba: 88 23 and r24, r24 - 16bc: f1 f6 brne .-68 ; 0x167a + 1616: 10 92 94 20 sts 0x2094, r1 + 161a: e5 cf rjmp .-54 ; 0x15e6 TerminalState = TERMINAL_INITIALIZING; } break; case TERMINAL_INITIALIZING: if (--TerminalInitDelay == 0) { - 16be: ad d8 rcall .-3750 ; 0x81a - 16c0: 0e 94 c3 22 call 0x4586 ; 0x4586 - 16c4: 82 e0 ldi r24, 0x02 ; 2 - 16c6: 80 93 a4 20 sts 0x20A4, r24 - 16ca: d7 cf rjmp .-82 ; 0x167a + 161c: 80 91 1b 20 lds r24, 0x201B + 1620: 81 50 subi r24, 0x01 ; 1 + 1622: 80 93 1b 20 sts 0x201B, r24 + 1626: 81 11 cpse r24, r1 + 1628: de cf rjmp .-68 ; 0x15e6 SystemStartUSBClock(); - 16cc: 80 91 68 06 lds r24, 0x0668 + 162a: fd d8 rcall .-3590 ; 0x826 USB_Init(); - 16d0: 85 fd sbrc r24, 5 - 16d2: d3 cf rjmp .-90 ; 0x167a + 162c: 0e 94 e5 20 call 0x41ca ; 0x41ca TerminalState = TERMINAL_INITIALIZED; - 16d4: 84 e1 ldi r24, 0x14 ; 20 - 16d6: 80 93 1b 20 sts 0x201B, r24 - 16da: 83 e0 ldi r24, 0x03 ; 3 + 1630: 82 e0 ldi r24, 0x02 ; 2 + 1632: 80 93 94 20 sts 0x2094, r24 + 1636: d7 cf rjmp .-82 ; 0x15e6 } break; case TERMINAL_INITIALIZED: if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { - 16dc: 80 93 a4 20 sts 0x20A4, r24 - 16e0: c4 d3 rcall .+1928 ; 0x1e6a - 16e2: 94 c5 rjmp .+2856 ; 0x220c - -000016e4 : + 1638: 80 91 68 06 lds r24, 0x0668 + 163c: 85 fd sbrc r24, 5 + 163e: d3 cf rjmp .-90 ; 0x15e6 /* Initialized and VBUS sense low */ TerminalInitDelay = INIT_DELAY; - 16e4: 80 e2 ldi r24, 0x20 ; 32 - 16e6: e0 e0 ldi r30, 0x00 ; 0 - 16e8: f6 e0 ldi r31, 0x06 ; 6 + 1640: 84 e1 ldi r24, 0x14 ; 20 + 1642: 80 93 1b 20 sts 0x201B, r24 TerminalState = TERMINAL_UNITIALIZING; - 16ea: 85 83 std Z+5, r24 ; 0x05 - 16ec: 08 95 ret - -000016ee : - 16ee: 80 e2 ldi r24, 0x20 ; 32 + 1646: 83 e0 ldi r24, 0x03 ; 3 + 1648: 80 93 94 20 sts 0x2094, r24 void TerminalTick(void) { SenseVBus(); XModemTick(); - 16f0: e0 e0 ldi r30, 0x00 ; 0 - 16f2: f6 e0 ldi r31, 0x06 ; 6 + 164c: 5e d3 rcall .+1724 ; 0x1d0a CommandLineTick(); - 16f4: 86 83 std Z+6, r24 ; 0x06 - 16f6: 08 95 ret + 164e: 2c c5 rjmp .+2648 ; 0x20a8 -000016f8 : +00001650 : + LED_PORT.DIRSET = LED_MASK; } - 16f8: 80 e0 ldi r24, 0x00 ; 0 + +static inline +void LEDSetOn(uint8_t Mask) { + LED_PORT.OUTSET = Mask; + 1650: 80 e2 ldi r24, 0x20 ; 32 + 1652: e0 e0 ldi r30, 0x00 ; 0 + 1654: f6 e0 ldi r31, 0x06 ; 6 + 1656: 85 83 std Z+5, r24 ; 0x05 + 1658: 08 95 ret + +0000165a : +} + +static inline +void LEDSetOff(uint8_t Mask) { + LED_PORT.OUTCLR = Mask; + 165a: 80 e2 ldi r24, 0x20 ; 32 + 165c: e0 e0 ldi r30, 0x00 ; 0 + 165e: f6 e0 ldi r31, 0x06 ; 6 + 1660: 86 83 std Z+6, r24 ; 0x06 + 1662: 08 95 ret + +00001664 : /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { CDC_Device_ConfigureEndpoints(&TerminalHandle); - 16fa: 90 e2 ldi r25, 0x20 ; 32 - 16fc: 0c 94 15 24 jmp 0x482a ; 0x482a + 1664: 80 e0 ldi r24, 0x00 ; 0 + 1666: 90 e2 ldi r25, 0x20 ; 32 + 1668: 0c 94 88 21 jmp 0x4310 ; 0x4310 -00001700 : +0000166c : } - 1700: 80 e0 ldi r24, 0x00 ; 0 /** Event handler for the library USB Control Request reception event. */ void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&TerminalHandle); - 1702: 90 e2 ldi r25, 0x20 ; 32 - 1704: 0c 94 6a 23 jmp 0x46d4 ; 0x46d4 + 166c: 80 e0 ldi r24, 0x00 ; 0 + 166e: 90 e2 ldi r25, 0x20 ; 32 + 1670: 0c 94 fa 22 jmp 0x45f4 ; 0x45f4 -00001708 : +00001674 : extern const PROGMEM CommandEntryType CommandTable[]; CommandStatusIdType CommandGetVersion(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR( - 1708: 2d b7 in r18, 0x3d ; 61 - 170a: 3e b7 in r19, 0x3e ; 62 - 170c: 2c 50 subi r18, 0x0C ; 12 - 170e: 30 40 sbci r19, 0x00 ; 0 - 1710: 2d bf out 0x3d, r18 ; 61 - 1712: 3e bf out 0x3e, r19 ; 62 - 1714: ed b7 in r30, 0x3d ; 61 - 1716: fe b7 in r31, 0x3e ; 62 - 1718: 31 96 adiw r30, 0x01 ; 1 - 171a: ad b7 in r26, 0x3d ; 61 - 171c: be b7 in r27, 0x3e ; 62 - 171e: 11 96 adiw r26, 0x01 ; 1 - 1720: 8d 93 st X+, r24 - 1722: 9c 93 st X, r25 - 1724: 12 97 sbiw r26, 0x02 ; 2 - 1726: 80 e0 ldi r24, 0x00 ; 0 - 1728: 91 e0 ldi r25, 0x01 ; 1 - 172a: 82 83 std Z+2, r24 ; 0x02 - 172c: 93 83 std Z+3, r25 ; 0x03 - 172e: 87 ed ldi r24, 0xD7 ; 215 - 1730: 93 e0 ldi r25, 0x03 ; 3 - 1732: 84 83 std Z+4, r24 ; 0x04 - 1734: 95 83 std Z+5, r25 ; 0x05 - 1736: 80 e1 ldi r24, 0x10 ; 16 - 1738: 94 e0 ldi r25, 0x04 ; 4 - 173a: 86 83 std Z+6, r24 ; 0x06 - 173c: 97 83 std Z+7, r25 ; 0x07 - 173e: 87 e1 ldi r24, 0x17 ; 23 - 1740: 94 e0 ldi r25, 0x04 ; 4 - 1742: 80 87 std Z+8, r24 ; 0x08 - 1744: 91 87 std Z+9, r25 ; 0x09 - 1746: 8e e1 ldi r24, 0x1E ; 30 - 1748: 94 e0 ldi r25, 0x04 ; 4 - 174a: 82 87 std Z+10, r24 ; 0x0a - 174c: 93 87 std Z+11, r25 ; 0x0b - 174e: 0e 94 1c 26 call 0x4c38 ; 0x4c38 + 1674: 2e e1 ldi r18, 0x1E ; 30 + 1676: 34 e0 ldi r19, 0x04 ; 4 + 1678: 3f 93 push r19 + 167a: 2f 93 push r18 + 167c: 27 e1 ldi r18, 0x17 ; 23 + 167e: 34 e0 ldi r19, 0x04 ; 4 + 1680: 3f 93 push r19 + 1682: 2f 93 push r18 + 1684: 20 e1 ldi r18, 0x10 ; 16 + 1686: 34 e0 ldi r19, 0x04 ; 4 + 1688: 3f 93 push r19 + 168a: 2f 93 push r18 + 168c: 27 ed ldi r18, 0xD7 ; 215 + 168e: 33 e0 ldi r19, 0x03 ; 3 + 1690: 3f 93 push r19 + 1692: 2f 93 push r18 + 1694: 21 e0 ldi r18, 0x01 ; 1 + 1696: 2f 93 push r18 + 1698: 1f 92 push r1 + 169a: 9f 93 push r25 + 169c: 8f 93 push r24 + 169e: 0e 94 37 24 call 0x486e ; 0x486e "Chameleon-Mini %S using LUFA %S compiled with AVR-GCC %S" ), PSTR(CHAMELEON_MINI_VERSION_STRING), PSTR(LUFA_VERSION_STRING), PSTR(__VERSION__) ); return COMMAND_INFO_OK_WITH_TEXT_ID; - 1752: 2d b7 in r18, 0x3d ; 61 - 1754: 3e b7 in r19, 0x3e ; 62 - 1756: 24 5f subi r18, 0xF4 ; 244 - 1758: 3f 4f sbci r19, 0xFF ; 255 - 175a: 2d bf out 0x3d, r18 ; 61 - 175c: 3e bf out 0x3e, r19 ; 62 + 16a2: 8d b7 in r24, 0x3d ; 61 + 16a4: 9e b7 in r25, 0x3e ; 62 + 16a6: 0c 96 adiw r24, 0x0c ; 12 + 16a8: 8d bf out 0x3d, r24 ; 61 + 16aa: 9e bf out 0x3e, r25 ; 62 } - 175e: 85 e6 ldi r24, 0x65 ; 101 - 1760: 08 95 ret + 16ac: 85 e6 ldi r24, 0x65 ; 101 + 16ae: 08 95 ret -00001762 : +000016b0 : CommandStatusIdType CommandGetConfig(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 1762: 2d b7 in r18, 0x3d ; 61 - 1764: 3e b7 in r19, 0x3e ; 62 - 1766: 28 50 subi r18, 0x08 ; 8 - 1768: 30 40 sbci r19, 0x00 ; 0 - 176a: 2d bf out 0x3d, r18 ; 61 - 176c: 3e bf out 0x3e, r19 ; 62 - 176e: ed b7 in r30, 0x3d ; 61 - 1770: fe b7 in r31, 0x3e ; 62 - 1772: 31 96 adiw r30, 0x01 ; 1 - 1774: ad b7 in r26, 0x3d ; 61 - 1776: be b7 in r27, 0x3e ; 62 - 1778: 11 96 adiw r26, 0x01 ; 1 - 177a: 8d 93 st X+, r24 - 177c: 9c 93 st X, r25 - 177e: 12 97 sbiw r26, 0x02 ; 2 - 1780: 80 e0 ldi r24, 0x00 ; 0 - 1782: 91 e0 ldi r25, 0x01 ; 1 - 1784: 82 83 std Z+2, r24 ; 0x02 - 1786: 93 83 std Z+3, r25 ; 0x03 - 1788: 84 e2 ldi r24, 0x24 ; 36 - 178a: 94 e0 ldi r25, 0x04 ; 4 - 178c: 84 83 std Z+4, r24 ; 0x04 - 178e: 95 83 std Z+5, r25 ; 0x05 - 1790: 89 ee ldi r24, 0xE9 ; 233 - 1792: 90 e2 ldi r25, 0x20 ; 32 - 1794: 86 83 std Z+6, r24 ; 0x06 - 1796: 97 83 std Z+7, r25 ; 0x07 - 1798: 0e 94 1c 26 call 0x4c38 ; 0x4c38 + 16b0: 29 ed ldi r18, 0xD9 ; 217 + 16b2: 30 e2 ldi r19, 0x20 ; 32 + 16b4: 3f 93 push r19 + 16b6: 2f 93 push r18 + 16b8: 24 e2 ldi r18, 0x24 ; 36 + 16ba: 34 e0 ldi r19, 0x04 ; 4 + 16bc: 3f 93 push r19 + 16be: 2f 93 push r18 + 16c0: 21 e0 ldi r18, 0x01 ; 1 + 16c2: 2f 93 push r18 + 16c4: 1f 92 push r1 + 16c6: 9f 93 push r25 + 16c8: 8f 93 push r24 + 16ca: 0e 94 37 24 call 0x486e ; 0x486e PSTR("%s"), ActiveConfiguration.ConfigurationName); return COMMAND_INFO_OK_WITH_TEXT_ID; - 179c: 2d b7 in r18, 0x3d ; 61 - 179e: 3e b7 in r19, 0x3e ; 62 - 17a0: 28 5f subi r18, 0xF8 ; 248 - 17a2: 3f 4f sbci r19, 0xFF ; 255 - 17a4: 2d bf out 0x3d, r18 ; 61 - 17a6: 3e bf out 0x3e, r19 ; 62 + 16ce: 8d b7 in r24, 0x3d ; 61 + 16d0: 9e b7 in r25, 0x3e ; 62 + 16d2: 08 96 adiw r24, 0x08 ; 8 + 16d4: 8d bf out 0x3d, r24 ; 61 + 16d6: 9e bf out 0x3e, r25 ; 62 } - 17a8: 85 e6 ldi r24, 0x65 ; 101 - 17aa: 08 95 ret + 16d8: 85 e6 ldi r24, 0x65 ; 101 + 16da: 08 95 ret -000017ac : +000016dc : CommandStatusIdType CommandSetConfig(const char* InParam) { if (ConfigurationSetByName(InParam)) { - 17ac: 9e d8 rcall .-3780 ; 0x8ea - 17ae: 88 23 and r24, r24 - 17b0: 11 f4 brne .+4 ; 0x17b6 - 17b2: 8a ec ldi r24, 0xCA ; 202 + 16dc: fc d8 rcall .-3592 ; 0x8d6 + 16de: 81 11 cpse r24, r1 + 16e0: 02 c0 rjmp .+4 ; 0x16e6 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 17b4: 08 95 ret + 16e2: 8a ec ldi r24, 0xCA ; 202 } } - 17b6: 71 de rcall .-798 ; 0x149a + 16e4: 08 95 ret } CommandStatusIdType CommandSetConfig(const char* InParam) { if (ConfigurationSetByName(InParam)) { SettingsSave(); - 17b8: 84 e6 ldi r24, 0x64 ; 100 - 17ba: 08 95 ret - -000017bc : + 16e6: 95 de rcall .-726 ; 0x1412 return COMMAND_INFO_OK_ID; - 17bc: 60 e0 ldi r22, 0x00 ; 0 - 17be: 71 e0 ldi r23, 0x01 ; 1 + 16e8: 84 e6 ldi r24, 0x64 ; 100 + 16ea: 08 95 ret + +000016ec : } } CommandStatusIdType CommandExecConfig(char* OutMessage) { ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); - 17c0: dc d8 rcall .-3656 ; 0x97a - 17c2: 85 e6 ldi r24, 0x65 ; 101 + 16ec: 60 e0 ldi r22, 0x00 ; 0 + 16ee: 71 e0 ldi r23, 0x01 ; 1 + 16f0: 33 d9 rcall .-3482 ; 0x958 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 17c4: 08 95 ret + 16f2: 85 e6 ldi r24, 0x65 ; 101 + 16f4: 08 95 ret -000017c6 : - 17c6: 0f 93 push r16 +000016f6 : CommandStatusIdType CommandGetUid(char* OutParam) { - 17c8: 1f 93 push r17 - 17ca: cf 93 push r28 - 17cc: df 93 push r29 - 17ce: cd b7 in r28, 0x3d ; 61 - 17d0: de b7 in r29, 0x3e ; 62 - 17d2: a1 97 sbiw r28, 0x21 ; 33 - 17d4: cd bf out 0x3d, r28 ; 61 - 17d6: de bf out 0x3e, r29 ; 62 - 17d8: 8c 01 movw r16, r24 + 16f6: 0f 93 push r16 + 16f8: 1f 93 push r17 + 16fa: cf 93 push r28 + 16fc: df 93 push r29 + 16fe: cd b7 in r28, 0x3d ; 61 + 1700: de b7 in r29, 0x3e ; 62 + 1702: a1 97 sbiw r28, 0x21 ; 33 + 1704: cd bf out 0x3d, r28 ; 61 + 1706: de bf out 0x3e, r29 ; 62 + 1708: 8c 01 movw r16, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; - 17da: 20 91 0b 21 lds r18, 0x210B + 170a: 20 91 fb 20 lds r18, 0x20FB INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); } INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); - 17de: e0 91 05 21 lds r30, 0x2105 - 17e2: f0 91 06 21 lds r31, 0x2106 - 17e6: ce 01 movw r24, r28 - 17e8: 01 96 adiw r24, 0x01 ; 1 - 17ea: 29 a3 lds r18, 0x59 - 17ec: 09 95 icall + 170e: e0 91 f5 20 lds r30, 0x20F5 + 1712: f0 91 f6 20 lds r31, 0x20F6 + 1716: ce 01 movw r24, r28 + 1718: 01 96 adiw r24, 0x01 ; 1 + 171a: 29 a3 std Y+33, r18 ; 0x21 + 171c: 09 95 icall ApplicationGetUid(UidBuffer); BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE, - 17ee: c8 01 movw r24, r16 - 17f0: 60 e0 ldi r22, 0x00 ; 0 - 17f2: 71 e0 ldi r23, 0x01 ; 1 - 17f4: ae 01 movw r20, r28 - 17f6: 4f 5f subi r20, 0xFF ; 255 - 17f8: 5f 4f sbci r21, 0xFF ; 255 - 17fa: 29 a1 lds r18, 0x49 - 17fc: 30 e0 ldi r19, 0x00 ; 0 - 17fe: 1a d9 rcall .-3532 ; 0xa34 - 1800: 85 e6 ldi r24, 0x65 ; 101 + 171e: 29 a1 ldd r18, Y+33 ; 0x21 + 1720: 30 e0 ldi r19, 0x00 ; 0 + 1722: ae 01 movw r20, r28 + 1724: 4f 5f subi r20, 0xFF ; 255 + 1726: 5f 4f sbci r21, 0xFF ; 255 + 1728: 60 e0 ldi r22, 0x00 ; 0 + 172a: 71 e0 ldi r23, 0x01 ; 1 + 172c: c8 01 movw r24, r16 + 172e: 5e d9 rcall .-3396 ; 0x9ec UidBuffer, UidSize); return COMMAND_INFO_OK_WITH_TEXT_ID; } - 1802: a1 96 adiw r28, 0x21 ; 33 - 1804: cd bf out 0x3d, r28 ; 61 - 1806: de bf out 0x3e, r29 ; 62 - 1808: df 91 pop r29 - 180a: cf 91 pop r28 - 180c: 1f 91 pop r17 - 180e: 0f 91 pop r16 - 1810: 08 95 ret + 1730: 85 e6 ldi r24, 0x65 ; 101 + 1732: a1 96 adiw r28, 0x21 ; 33 + 1734: cd bf out 0x3d, r28 ; 61 + 1736: de bf out 0x3e, r29 ; 62 + 1738: df 91 pop r29 + 173a: cf 91 pop r28 + 173c: 1f 91 pop r17 + 173e: 0f 91 pop r16 + 1740: 08 95 ret -00001812 : - 1812: bf 92 push r11 +00001742 : CommandStatusIdType CommandSetUid(const char* InParam) { - 1814: cf 92 push r12 - 1816: df 92 push r13 - 1818: ef 92 push r14 - 181a: ff 92 push r15 - 181c: 0f 93 push r16 - 181e: 1f 93 push r17 - 1820: cf 93 push r28 - 1822: df 93 push r29 - 1824: cd b7 in r28, 0x3d ; 61 - 1826: de b7 in r29, 0x3e ; 62 - 1828: a0 97 sbiw r28, 0x20 ; 32 - 182a: cd bf out 0x3d, r28 ; 61 - 182c: de bf out 0x3e, r29 ; 62 - 182e: 8c 01 movw r16, r24 + 1742: bf 92 push r11 + 1744: cf 92 push r12 + 1746: df 92 push r13 + 1748: ef 92 push r14 + 174a: ff 92 push r15 + 174c: 0f 93 push r16 + 174e: 1f 93 push r17 + 1750: cf 93 push r28 + 1752: df 93 push r29 + 1754: cd b7 in r28, 0x3d ; 61 + 1756: de b7 in r29, 0x3e ; 62 + 1758: a0 97 sbiw r28, 0x20 ; 32 + 175a: cd bf out 0x3d, r28 ; 61 + 175c: de bf out 0x3e, r29 ; 62 + 175e: 8c 01 movw r16, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; - 1830: e0 90 0b 21 lds r14, 0x210B - 1834: ff 24 eor r15, r15 + 1760: c0 90 fb 20 lds r12, 0x20FB + 1764: d1 2c mov r13, r1 if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { - 1836: 67 e2 ldi r22, 0x27 ; 39 - 1838: 74 e0 ldi r23, 0x04 ; 4 - 183a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 183e: 00 97 sbiw r24, 0x00 ; 0 - 1840: 49 f5 brne .+82 ; 0x1894 + 1766: 67 e2 ldi r22, 0x27 ; 39 + 1768: 74 e0 ldi r23, 0x04 ; 4 + 176a: 0e 94 16 24 call 0x482c ; 0x482c + 176e: 89 2b or r24, r25 + 1770: 51 f5 brne .+84 ; 0x17c6 /* Load with random bytes */ for (uint8_t i=0; i - 1848: bb 24 eor r11, r11 - 184a: 00 e0 ldi r16, 0x00 ; 0 - 184c: 10 e0 ldi r17, 0x00 ; 0 - 184e: 6e 01 movw r12, r28 - 1850: 08 94 sec - 1852: c1 1c adc r12, r1 - 1854: d1 1c adc r13, r1 + 1772: c1 14 cp r12, r1 + 1774: d1 04 cpc r13, r1 + 1776: b1 f1 breq .+108 ; 0x17e4 + 1778: b1 2c mov r11, r1 + 177a: ee 24 eor r14, r14 + 177c: e3 94 inc r14 + 177e: f1 2c mov r15, r1 + 1780: ec 0e add r14, r28 + 1782: fd 1e adc r15, r29 + 1784: 00 e0 ldi r16, 0x00 ; 0 + 1786: 10 e0 ldi r17, 0x00 ; 0 UidBuffer[i] = RandomGetByte(); - 1856: cc d8 rcall .-3688 ; 0x9f0 - 1858: f6 01 movw r30, r12 - 185a: e0 0f add r30, r16 - 185c: f1 1f adc r31, r17 - 185e: 80 83 st Z, r24 - 1860: b3 94 inc r11 + 1788: 17 d9 rcall .-3538 ; 0x9b8 + 178a: f7 01 movw r30, r14 + 178c: e0 0f add r30, r16 + 178e: f1 1f adc r31, r17 + 1790: 80 83 st Z, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { /* Load with random bytes */ for (uint8_t i=0; i - 186c: e0 91 07 21 lds r30, 0x2107 + 1792: b3 94 inc r11 + 1794: 0b 2d mov r16, r11 + 1796: 10 e0 ldi r17, 0x00 ; 0 + 1798: 0c 15 cp r16, r12 + 179a: 1d 05 cpc r17, r13 + 179c: a8 f3 brcs .-22 ; 0x1788 } INLINE void ApplicationSetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationSetUidFunc(Uid); - 1870: f0 91 08 21 lds r31, 0x2108 - 1874: c6 01 movw r24, r12 - 1876: 09 95 icall - 1878: 84 e6 ldi r24, 0x64 ; 100 + 179e: e0 91 f7 20 lds r30, 0x20F7 + 17a2: f0 91 f8 20 lds r31, 0x20F8 + 17a6: c7 01 movw r24, r14 + 17a8: 09 95 icall } } ApplicationSetUid(UidBuffer); return COMMAND_INFO_OK_ID; - 187a: a0 96 adiw r28, 0x20 ; 32 + 17aa: 84 e6 ldi r24, 0x64 ; 100 } - 187c: cd bf out 0x3d, r28 ; 61 - 187e: de bf out 0x3e, r29 ; 62 - 1880: df 91 pop r29 - 1882: cf 91 pop r28 - 1884: 1f 91 pop r17 - 1886: 0f 91 pop r16 - 1888: ff 90 pop r15 - 188a: ef 90 pop r14 - 188c: df 90 pop r13 - 188e: cf 90 pop r12 - 1890: bf 90 pop r11 - 1892: 08 95 ret - 1894: 6e 01 movw r12, r28 + 17ac: a0 96 adiw r28, 0x20 ; 32 + 17ae: cd bf out 0x3d, r28 ; 61 + 17b0: de bf out 0x3e, r29 ; 62 + 17b2: df 91 pop r29 + 17b4: cf 91 pop r28 + 17b6: 1f 91 pop r17 + 17b8: 0f 91 pop r16 + 17ba: ff 90 pop r15 + 17bc: ef 90 pop r14 + 17be: df 90 pop r13 + 17c0: cf 90 pop r12 + 17c2: bf 90 pop r11 + 17c4: 08 95 ret for (uint8_t i=0; i - 18a6: 8e 15 cp r24, r14 - 18a8: 9f 05 cpc r25, r15 - 18aa: 01 f3 breq .-64 ; 0x186c - 18ac: 8a ec ldi r24, 0xCA ; 202 - 18ae: e5 cf rjmp .-54 ; 0x187a + 17c6: a8 01 movw r20, r16 + 17c8: 60 e2 ldi r22, 0x20 ; 32 + 17ca: 70 e0 ldi r23, 0x00 ; 0 + 17cc: ee 24 eor r14, r14 + 17ce: e3 94 inc r14 + 17d0: f1 2c mov r15, r1 + 17d2: ec 0e add r14, r28 + 17d4: fd 1e adc r15, r29 + 17d6: c7 01 movw r24, r14 + 17d8: 4b d9 rcall .-3434 ; 0xa70 + 17da: 8c 15 cp r24, r12 + 17dc: 9d 05 cpc r25, r13 + 17de: f9 f2 breq .-66 ; 0x179e /* Malformed input. Abort */ return COMMAND_ERR_INVALID_PARAM_ID; - 18b0: 6e 01 movw r12, r28 - 18b2: 08 94 sec - 18b4: c1 1c adc r12, r1 - 18b6: d1 1c adc r13, r1 - 18b8: d9 cf rjmp .-78 ; 0x186c + 17e0: 8a ec ldi r24, 0xCA ; 202 + 17e2: e4 cf rjmp .-56 ; 0x17ac + 17e4: ee 24 eor r14, r14 + 17e6: e3 94 inc r14 + 17e8: f1 2c mov r15, r1 + 17ea: ec 0e add r14, r28 + 17ec: fd 1e adc r15, r29 + 17ee: d7 cf rjmp .-82 ; 0x179e -000018ba : - 18ba: fc 01 movw r30, r24 - 18bc: 80 91 0c 21 lds r24, 0x210C +000017f0 : return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetReadOnly(char* OutParam) { if (ActiveConfiguration.ReadOnly) { - 18c0: 88 23 and r24, r24 - 18c2: 29 f4 brne .+10 ; 0x18ce + 17f0: 20 91 fc 20 lds r18, 0x20FC + 17f4: 21 11 cpse r18, r1 + 17f6: 07 c0 rjmp .+14 ; 0x1806 OutParam[0] = COMMAND_CHAR_TRUE; } else { OutParam[0] = COMMAND_CHAR_FALSE; - 18c4: 80 e3 ldi r24, 0x30 ; 48 - 18c6: 80 83 st Z, r24 + 17f8: 20 e3 ldi r18, 0x30 ; 48 + 17fa: fc 01 movw r30, r24 + 17fc: 20 83 st Z, r18 } OutParam[1] = '\0'; - 18c8: 11 82 std Z+1, r1 ; 0x01 + 17fe: fc 01 movw r30, r24 + 1800: 11 82 std Z+1, r1 ; 0x01 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 18ca: 85 e6 ldi r24, 0x65 ; 101 - 18cc: 08 95 ret + 1802: 85 e6 ldi r24, 0x65 ; 101 + 1804: 08 95 ret } CommandStatusIdType CommandGetReadOnly(char* OutParam) { if (ActiveConfiguration.ReadOnly) { OutParam[0] = COMMAND_CHAR_TRUE; - 18ce: 81 e3 ldi r24, 0x31 ; 49 - 18d0: 80 83 st Z, r24 + 1806: 21 e3 ldi r18, 0x31 ; 49 + 1808: fc 01 movw r30, r24 + 180a: 20 83 st Z, r18 } else { OutParam[0] = COMMAND_CHAR_FALSE; } OutParam[1] = '\0'; - 18d2: 11 82 std Z+1, r1 ; 0x01 + 180c: fc 01 movw r30, r24 + 180e: 11 82 std Z+1, r1 ; 0x01 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 18d4: 85 e6 ldi r24, 0x65 ; 101 - 18d6: 08 95 ret + 1810: 85 e6 ldi r24, 0x65 ; 101 + 1812: 08 95 ret -000018d8 : +00001814 : CommandStatusIdType CommandSetReadOnly(const char* InParam) { - 18d8: fc 01 movw r30, r24 if (InParam[1] == '\0') { - 18da: 81 81 ldd r24, Z+1 ; 0x01 - 18dc: 88 23 and r24, r24 - 18de: 39 f4 brne .+14 ; 0x18ee + 1814: fc 01 movw r30, r24 + 1816: 21 81 ldd r18, Z+1 ; 0x01 + 1818: 21 11 cpse r18, r1 + 181a: 05 c0 rjmp .+10 ; 0x1826 if (InParam[0] == COMMAND_CHAR_TRUE) { - 18e0: 80 81 ld r24, Z - 18e2: 81 33 cpi r24, 0x31 ; 49 - 18e4: 31 f0 breq .+12 ; 0x18f2 + 181c: 80 81 ld r24, Z + 181e: 81 33 cpi r24, 0x31 ; 49 + 1820: 41 f0 breq .+16 ; 0x1832 ActiveConfiguration.ReadOnly = true; return COMMAND_INFO_OK_ID; } else if (InParam[0] == COMMAND_CHAR_FALSE) { - 18e6: 80 33 cpi r24, 0x30 ; 48 - 18e8: 49 f0 breq .+18 ; 0x18fc + 1822: 80 33 cpi r24, 0x30 ; 48 + 1824: 11 f0 breq .+4 ; 0x182a ActiveConfiguration.ReadOnly = false; return COMMAND_INFO_OK_ID; } } return COMMAND_ERR_INVALID_PARAM_ID; - 18ea: 8a ec ldi r24, 0xCA ; 202 + 1826: 8a ec ldi r24, 0xCA ; 202 } - 18ec: 08 95 ret - ActiveConfiguration.ReadOnly = false; + 1828: 08 95 ret + if (InParam[1] == '\0') { + if (InParam[0] == COMMAND_CHAR_TRUE) { + ActiveConfiguration.ReadOnly = true; return COMMAND_INFO_OK_ID; - } - } - - return COMMAND_ERR_INVALID_PARAM_ID; - 18ee: 8a ec ldi r24, 0xCA ; 202 - 18f0: 08 95 ret + } else if (InParam[0] == COMMAND_CHAR_FALSE) { + ActiveConfiguration.ReadOnly = false; + 182a: 10 92 fc 20 sts 0x20FC, r1 + return COMMAND_INFO_OK_ID; + 182e: 84 e6 ldi r24, 0x64 ; 100 + 1830: 08 95 ret CommandStatusIdType CommandSetReadOnly(const char* InParam) { if (InParam[1] == '\0') { if (InParam[0] == COMMAND_CHAR_TRUE) { ActiveConfiguration.ReadOnly = true; - 18f2: 81 e0 ldi r24, 0x01 ; 1 - 18f4: 80 93 0c 21 sts 0x210C, r24 + 1832: 81 e0 ldi r24, 0x01 ; 1 + 1834: 80 93 fc 20 sts 0x20FC, r24 return COMMAND_INFO_OK_ID; - 18f8: 84 e6 ldi r24, 0x64 ; 100 - 18fa: 08 95 ret - } else if (InParam[0] == COMMAND_CHAR_FALSE) { - ActiveConfiguration.ReadOnly = false; - 18fc: 10 92 0c 21 sts 0x210C, r1 - return COMMAND_INFO_OK_ID; - 1900: 84 e6 ldi r24, 0x64 ; 100 - 1902: 08 95 ret + 1838: 84 e6 ldi r24, 0x64 ; 100 + 183a: 08 95 ret -00001904 : +0000183c : return COMMAND_ERR_INVALID_PARAM_ID; } CommandStatusIdType CommandExecUpload(char* OutMessage) { XModemReceive(MemoryUploadBlock); - 1904: 82 e7 ldi r24, 0x72 ; 114 - 1906: 98 e0 ldi r25, 0x08 ; 8 - 1908: 2c d1 rcall .+600 ; 0x1b62 - 190a: 8e e6 ldi r24, 0x6E ; 110 + 183c: 8f e1 ldi r24, 0x1F ; 31 + 183e: 98 e0 ldi r25, 0x08 ; 8 + 1840: f7 d0 rcall .+494 ; 0x1a30 return COMMAND_INFO_XMODEM_WAIT_ID; } - 190c: 08 95 ret + 1842: 8e e6 ldi r24, 0x6E ; 110 + 1844: 08 95 ret -0000190e : - 190e: 80 ea ldi r24, 0xA0 ; 160 +00001846 : CommandStatusIdType CommandExecDownload(char* OutMessage) { XModemSend(MemoryDownloadBlock); - 1910: 98 e0 ldi r25, 0x08 ; 8 - 1912: 3f d1 rcall .+638 ; 0x1b92 - 1914: 8e e6 ldi r24, 0x6E ; 110 + 1846: 87 e5 ldi r24, 0x57 ; 87 + 1848: 98 e0 ldi r25, 0x08 ; 8 + 184a: 0a d1 rcall .+532 ; 0x1a60 return COMMAND_INFO_XMODEM_WAIT_ID; } - 1916: 08 95 ret + 184c: 8e e6 ldi r24, 0x6E ; 110 + 184e: 08 95 ret -00001918 : - 1918: e0 ec ldi r30, 0xC0 ; 192 +00001850 : * enumerating the device once attached until \ref USB_Attach() is called. */ static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; static inline void USB_Detach(void) { USB.CTRLB &= ~USB_ATTACH_bm; - 191a: f4 e0 ldi r31, 0x04 ; 4 - 191c: 81 81 ldd r24, Z+1 ; 0x01 - 191e: 8e 7f andi r24, 0xFE ; 254 - 1920: 81 83 std Z+1, r24 ; 0x01 + 1850: e0 ec ldi r30, 0xC0 ; 192 + 1852: f4 e0 ldi r31, 0x04 ; 4 + 1854: 81 81 ldd r24, Z+1 ; 0x01 + 1856: 8e 7f andi r24, 0xFE ; 254 + 1858: 81 83 std Z+1, r24 ; 0x01 CommandStatusIdType CommandExecReset(char* OutMessage) { USB_Detach(); USB_Disable(); - 1922: 0e 94 88 22 call 0x4510 ; 0x4510 + 185a: 0e 94 aa 20 call 0x4154 ; 0x4154 SystemReset(); - 1926: 0e 94 00 04 call 0x800 ; 0x800 + 185e: 0e 94 06 04 call 0x80c ; 0x80c return COMMAND_INFO_OK_ID; } - 192a: 84 e6 ldi r24, 0x64 ; 100 - 192c: 08 95 ret + 1862: 84 e6 ldi r24, 0x64 ; 100 + 1864: 08 95 ret -0000192e : - 192e: e0 ec ldi r30, 0xC0 ; 192 - 1930: f4 e0 ldi r31, 0x04 ; 4 - 1932: 81 81 ldd r24, Z+1 ; 0x01 - 1934: 8e 7f andi r24, 0xFE ; 254 - 1936: 81 83 std Z+1, r24 ; 0x01 +00001866 : + 1866: e0 ec ldi r30, 0xC0 ; 192 + 1868: f4 e0 ldi r31, 0x04 ; 4 + 186a: 81 81 ldd r24, Z+1 ; 0x01 + 186c: 8e 7f andi r24, 0xFE ; 254 + 186e: 81 83 std Z+1, r24 ; 0x01 #ifdef SUPPORT_FIRMWARE_UPGRADE CommandStatusIdType CommandExecUpgrade(char* OutMessage) { USB_Detach(); USB_Disable(); - 1938: 0e 94 88 22 call 0x4510 ; 0x4510 + 1870: 0e 94 aa 20 call 0x4154 ; 0x4154 SystemEnterBootloader(); - 193c: 0e 94 07 04 call 0x80e ; 0x80e + 1874: 0e 94 0d 04 call 0x81a ; 0x81a return COMMAND_INFO_OK_ID; } - 1940: 84 e6 ldi r24, 0x64 ; 100 - 1942: 08 95 ret + 1878: 84 e6 ldi r24, 0x64 ; 100 + 187a: 08 95 ret -00001944 : +0000187c : #endif CommandStatusIdType CommandGetMemSize(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.MemorySize); - 1944: 2d b7 in r18, 0x3d ; 61 - 1946: 3e b7 in r19, 0x3e ; 62 - 1948: 28 50 subi r18, 0x08 ; 8 - 194a: 30 40 sbci r19, 0x00 ; 0 - 194c: 2d bf out 0x3d, r18 ; 61 - 194e: 3e bf out 0x3e, r19 ; 62 - 1950: ed b7 in r30, 0x3d ; 61 - 1952: fe b7 in r31, 0x3e ; 62 - 1954: 31 96 adiw r30, 0x01 ; 1 - 1956: ad b7 in r26, 0x3d ; 61 - 1958: be b7 in r27, 0x3e ; 62 - 195a: 11 96 adiw r26, 0x01 ; 1 - 195c: 8d 93 st X+, r24 - 195e: 9c 93 st X, r25 - 1960: 12 97 sbiw r26, 0x02 ; 2 - 1962: 80 e0 ldi r24, 0x00 ; 0 - 1964: 91 e0 ldi r25, 0x01 ; 1 - 1966: 82 83 std Z+2, r24 ; 0x02 - 1968: 93 83 std Z+3, r25 ; 0x03 - 196a: 8e e2 ldi r24, 0x2E ; 46 - 196c: 94 e0 ldi r25, 0x04 ; 4 - 196e: 84 83 std Z+4, r24 ; 0x04 - 1970: 95 83 std Z+5, r25 ; 0x05 - 1972: 80 91 09 21 lds r24, 0x2109 - 1976: 90 91 0a 21 lds r25, 0x210A - 197a: 86 83 std Z+6, r24 ; 0x06 - 197c: 97 83 std Z+7, r25 ; 0x07 - 197e: 0e 94 1c 26 call 0x4c38 ; 0x4c38 + 187c: e9 ef ldi r30, 0xF9 ; 249 + 187e: f0 e2 ldi r31, 0x20 ; 32 + 1880: 21 81 ldd r18, Z+1 ; 0x01 + 1882: 2f 93 push r18 + 1884: 20 81 ld r18, Z + 1886: 2f 93 push r18 + 1888: 2e e2 ldi r18, 0x2E ; 46 + 188a: 34 e0 ldi r19, 0x04 ; 4 + 188c: 3f 93 push r19 + 188e: 2f 93 push r18 + 1890: 21 e0 ldi r18, 0x01 ; 1 + 1892: 2f 93 push r18 + 1894: 1f 92 push r1 + 1896: 9f 93 push r25 + 1898: 8f 93 push r24 + 189a: 0e 94 37 24 call 0x486e ; 0x486e return COMMAND_INFO_OK_WITH_TEXT_ID; - 1982: 2d b7 in r18, 0x3d ; 61 - 1984: 3e b7 in r19, 0x3e ; 62 - 1986: 28 5f subi r18, 0xF8 ; 248 - 1988: 3f 4f sbci r19, 0xFF ; 255 - 198a: 2d bf out 0x3d, r18 ; 61 - 198c: 3e bf out 0x3e, r19 ; 62 + 189e: 8d b7 in r24, 0x3d ; 61 + 18a0: 9e b7 in r25, 0x3e ; 62 + 18a2: 08 96 adiw r24, 0x08 ; 8 + 18a4: 8d bf out 0x3d, r24 ; 61 + 18a6: 9e bf out 0x3e, r25 ; 62 } - 198e: 85 e6 ldi r24, 0x65 ; 101 - 1990: 08 95 ret + 18a8: 85 e6 ldi r24, 0x65 ; 101 + 18aa: 08 95 ret -00001992 : +000018ac : CommandStatusIdType CommandGetUidSize(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.UidSize); - 1992: 2d b7 in r18, 0x3d ; 61 - 1994: 3e b7 in r19, 0x3e ; 62 - 1996: 28 50 subi r18, 0x08 ; 8 - 1998: 30 40 sbci r19, 0x00 ; 0 - 199a: 2d bf out 0x3d, r18 ; 61 - 199c: 3e bf out 0x3e, r19 ; 62 - 199e: ed b7 in r30, 0x3d ; 61 - 19a0: fe b7 in r31, 0x3e ; 62 - 19a2: 31 96 adiw r30, 0x01 ; 1 - 19a4: ad b7 in r26, 0x3d ; 61 - 19a6: be b7 in r27, 0x3e ; 62 - 19a8: 11 96 adiw r26, 0x01 ; 1 - 19aa: 8d 93 st X+, r24 - 19ac: 9c 93 st X, r25 - 19ae: 12 97 sbiw r26, 0x02 ; 2 - 19b0: 80 e0 ldi r24, 0x00 ; 0 - 19b2: 91 e0 ldi r25, 0x01 ; 1 - 19b4: 82 83 std Z+2, r24 ; 0x02 - 19b6: 93 83 std Z+3, r25 ; 0x03 - 19b8: 81 e3 ldi r24, 0x31 ; 49 - 19ba: 94 e0 ldi r25, 0x04 ; 4 - 19bc: 84 83 std Z+4, r24 ; 0x04 - 19be: 95 83 std Z+5, r25 ; 0x05 - 19c0: 80 91 0b 21 lds r24, 0x210B - 19c4: 86 83 std Z+6, r24 ; 0x06 - 19c6: 17 82 std Z+7, r1 ; 0x07 - 19c8: 0e 94 1c 26 call 0x4c38 ; 0x4c38 + 18ac: 20 91 fb 20 lds r18, 0x20FB + 18b0: 1f 92 push r1 + 18b2: 2f 93 push r18 + 18b4: 21 e3 ldi r18, 0x31 ; 49 + 18b6: 34 e0 ldi r19, 0x04 ; 4 + 18b8: 3f 93 push r19 + 18ba: 2f 93 push r18 + 18bc: 21 e0 ldi r18, 0x01 ; 1 + 18be: 2f 93 push r18 + 18c0: 1f 92 push r1 + 18c2: 9f 93 push r25 + 18c4: 8f 93 push r24 + 18c6: 0e 94 37 24 call 0x486e ; 0x486e return COMMAND_INFO_OK_WITH_TEXT_ID; - 19cc: 2d b7 in r18, 0x3d ; 61 - 19ce: 3e b7 in r19, 0x3e ; 62 - 19d0: 28 5f subi r18, 0xF8 ; 248 - 19d2: 3f 4f sbci r19, 0xFF ; 255 - 19d4: 2d bf out 0x3d, r18 ; 61 - 19d6: 3e bf out 0x3e, r19 ; 62 + 18ca: 8d b7 in r24, 0x3d ; 61 + 18cc: 9e b7 in r25, 0x3e ; 62 + 18ce: 08 96 adiw r24, 0x08 ; 8 + 18d0: 8d bf out 0x3d, r24 ; 61 + 18d2: 9e bf out 0x3e, r25 ; 62 } - 19d8: 85 e6 ldi r24, 0x65 ; 101 - 19da: 08 95 ret + 18d4: 85 e6 ldi r24, 0x65 ; 101 + 18d6: 08 95 ret -000019dc : +000018d8 : CommandStatusIdType CommandExecButton(char* OutMessage) { ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - 19dc: 60 e0 ldi r22, 0x00 ; 0 - 19de: 71 e0 ldi r23, 0x01 ; 1 - 19e0: c2 dc rcall .-1660 ; 0x1366 - 19e2: 85 e6 ldi r24, 0x65 ; 101 + 18d8: 60 e0 ldi r22, 0x00 ; 0 + 18da: 71 e0 ldi r23, 0x01 ; 1 + 18dc: 03 dd rcall .-1530 ; 0x12e4 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 19e4: 08 95 ret + 18de: 85 e6 ldi r24, 0x65 ; 101 + 18e0: 08 95 ret -000019e6 : - 19e6: 60 e0 ldi r22, 0x00 ; 0 +000018e2 : CommandStatusIdType CommandGetButton(char* OutParam) { ButtonGetActionByName(OutParam, TERMINAL_BUFFER_SIZE); - 19e8: 71 e0 ldi r23, 0x01 ; 1 - 19ea: f3 dc rcall .-1562 ; 0x13d2 - 19ec: 85 e6 ldi r24, 0x65 ; 101 + 18e2: 60 e0 ldi r22, 0x00 ; 0 + 18e4: 71 e0 ldi r23, 0x01 ; 1 + 18e6: 36 dd rcall .-1428 ; 0x1354 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 19ee: 08 95 ret + 18e8: 85 e6 ldi r24, 0x65 ; 101 + 18ea: 08 95 ret -000019f0 : - 19f0: 03 dd rcall .-1530 ; 0x13f8 +000018ec : CommandStatusIdType CommandSetButton(const char* InParam) { if (ButtonSetActionByName(InParam)) { - 19f2: 88 23 and r24, r24 - 19f4: 11 f4 brne .+4 ; 0x19fa - 19f6: 8a ec ldi r24, 0xCA ; 202 + 18ec: 41 dd rcall .-1406 ; 0x1370 + 18ee: 81 11 cpse r24, r1 + 18f0: 02 c0 rjmp .+4 ; 0x18f6 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 19f8: 08 95 ret + 18f2: 8a ec ldi r24, 0xCA ; 202 } } - 19fa: 4f dd rcall .-1378 ; 0x149a + 18f4: 08 95 ret } CommandStatusIdType CommandSetButton(const char* InParam) { if (ButtonSetActionByName(InParam)) { SettingsSave(); - 19fc: 84 e6 ldi r24, 0x64 ; 100 - 19fe: 08 95 ret - -00001a00 : + 18f6: 8d dd rcall .-1254 ; 0x1412 return COMMAND_INFO_OK_ID; - 1a00: 60 e0 ldi r22, 0x00 ; 0 - 1a02: 71 e0 ldi r23, 0x01 ; 1 + 18f8: 84 e6 ldi r24, 0x64 ; 100 + 18fa: 08 95 ret + +000018fc : } } CommandStatusIdType CommandGetSetting(char* OutParam) { SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); - 1a04: d1 dd rcall .-1118 ; 0x15a8 - 1a06: 85 e6 ldi r24, 0x65 ; 101 + 18fc: 60 e0 ldi r22, 0x00 ; 0 + 18fe: 71 e0 ldi r23, 0x01 ; 1 + 1900: 0f de rcall .-994 ; 0x1520 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 1a08: 08 95 ret + 1902: 85 e6 ldi r24, 0x65 ; 101 + 1904: 08 95 ret -00001a0a : - 1a0a: d8 dd rcall .-1104 ; 0x15bc +00001906 : CommandStatusIdType CommandSetSetting(const char* InParam) { if (SettingsSetActiveByName(InParam)) { - 1a0c: 88 23 and r24, r24 - 1a0e: 11 f4 brne .+4 ; 0x1a14 - 1a10: 8a ec ldi r24, 0xCA ; 202 + 1906: 16 de rcall .-980 ; 0x1534 + 1908: 81 11 cpse r24, r1 + 190a: 02 c0 rjmp .+4 ; 0x1910 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 1a12: 08 95 ret + 190c: 8a ec ldi r24, 0xCA ; 202 } } - 1a14: 42 dd rcall .-1404 ; 0x149a + 190e: 08 95 ret } CommandStatusIdType CommandSetSetting(const char* InParam) { if (SettingsSetActiveByName(InParam)) { SettingsSave(); - 1a16: 84 e6 ldi r24, 0x64 ; 100 - 1a18: 08 95 ret - -00001a1a : + 1910: 80 dd rcall .-1280 ; 0x1412 return COMMAND_INFO_OK_ID; - 1a1a: fe da rcall .-2564 ; 0x1018 - 1a1c: 84 e6 ldi r24, 0x64 ; 100 + 1912: 84 e6 ldi r24, 0x64 ; 100 + 1914: 08 95 ret + +00001916 : + } +} CommandStatusIdType CommandExecClear(char* OutParam) { MemoryClear(); + 1916: 38 db rcall .-2448 ; 0xf88 return COMMAND_INFO_OK_ID; } - 1a1e: 08 95 ret + 1918: 84 e6 ldi r24, 0x64 ; 100 + 191a: 08 95 ret -00001a20 : - 1a20: bf 92 push r11 +0000191c : CommandStatusIdType CommandExecHelp(char* OutMessage) { - 1a22: cf 92 push r12 - 1a24: df 92 push r13 - 1a26: ef 92 push r14 - 1a28: ff 92 push r15 - 1a2a: 0f 93 push r16 - 1a2c: 1f 93 push r17 - 1a2e: cf 93 push r28 - 1a30: df 93 push r29 - 1a32: 7c 01 movw r14, r24 + 191c: bf 92 push r11 + 191e: cf 92 push r12 + 1920: df 92 push r13 + 1922: ef 92 push r14 + 1924: ff 92 push r15 + 1926: 0f 93 push r16 + 1928: 1f 93 push r17 + 192a: cf 93 push r28 + 192c: df 93 push r29 + 192e: 7c 01 movw r14, r24 const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ - 1a34: cf ef ldi r28, 0xFF ; 255 - 1a36: d0 e0 ldi r29, 0x00 ; 0 + 1930: cf ef ldi r28, 0xFF ; 255 + 1932: d0 e0 ldi r29, 0x00 ; 0 return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; - 1a38: 2b e3 ldi r18, 0x3B ; 59 - 1a3a: c2 2e mov r12, r18 - 1a3c: 24 e0 ldi r18, 0x04 ; 4 - 1a3e: d2 2e mov r13, r18 + 1934: 3b e3 ldi r19, 0x3B ; 59 + 1936: c3 2e mov r12, r19 + 1938: 34 e0 ldi r19, 0x04 ; 4 + 193a: d3 2e mov r13, r19 *OutMessage++ = c; CommandName++; ByteCount--; } *OutMessage++ = ','; - 1a40: 3c e2 ldi r19, 0x2C ; 44 - 1a42: b3 2e mov r11, r19 + 193c: 4c e2 ldi r20, 0x2C ; 44 + 193e: b4 2e mov r11, r20 CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { - 1a44: 86 01 movw r16, r12 - 1a46: 8c e1 ldi r24, 0x1C ; 28 - 1a48: 90 e2 ldi r25, 0x20 ; 32 - 1a4a: b6 01 movw r22, r12 - 1a4c: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1a50: 00 97 sbiw r24, 0x00 ; 0 - 1a52: 29 f1 breq .+74 ; 0x1a9e + 1940: 86 01 movw r16, r12 + 1942: b6 01 movw r22, r12 + 1944: 80 e9 ldi r24, 0x90 ; 144 + 1946: 90 e2 ldi r25, 0x20 ; 32 + 1948: 0e 94 16 24 call 0x482c ; 0x482c + 194c: 89 2b or r24, r25 + 194e: 21 f1 breq .+72 ; 0x1998 const char* CommandName = EntryPtr->Command; char c; while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { - 1a54: f6 01 movw r30, r12 - 1a56: 84 91 lpm r24, Z - 1a58: 88 23 and r24, r24 - 1a5a: 89 f0 breq .+34 ; 0x1a7e - 1a5c: c1 32 cpi r28, 0x21 ; 33 - 1a5e: d1 05 cpc r29, r1 - 1a60: 70 f0 brcs .+28 ; 0x1a7e - 1a62: d7 01 movw r26, r14 - 1a64: 03 c0 rjmp .+6 ; 0x1a6c - 1a66: c0 32 cpi r28, 0x20 ; 32 - 1a68: d1 05 cpc r29, r1 - 1a6a: 49 f0 breq .+18 ; 0x1a7e + 1950: f6 01 movw r30, r12 + 1952: 84 91 lpm r24, Z + 1954: 88 23 and r24, r24 + 1956: 89 f0 breq .+34 ; 0x197a + 1958: c1 32 cpi r28, 0x21 ; 33 + 195a: d1 05 cpc r29, r1 + 195c: 70 f0 brcs .+28 ; 0x197a + 195e: d7 01 movw r26, r14 + 1960: 03 c0 rjmp .+6 ; 0x1968 + 1962: c0 32 cpi r28, 0x20 ; 32 + 1964: d1 05 cpc r29, r1 + 1966: 49 f0 breq .+18 ; 0x197a *OutMessage++ = c; - 1a6c: 8d 93 st X+, r24 - 1a6e: 7d 01 movw r14, r26 + 1968: 8d 93 st X+, r24 + 196a: 7d 01 movw r14, r26 CommandName++; - 1a70: 0f 5f subi r16, 0xFF ; 255 - 1a72: 1f 4f sbci r17, 0xFF ; 255 + 196c: 0f 5f subi r16, 0xFF ; 255 + 196e: 1f 4f sbci r17, 0xFF ; 255 ByteCount--; - 1a74: 21 97 sbiw r28, 0x01 ; 1 + 1970: 21 97 sbiw r28, 0x01 ; 1 while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { const char* CommandName = EntryPtr->Command; char c; while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { - 1a76: f8 01 movw r30, r16 - 1a78: 84 91 lpm r24, Z - 1a7a: 88 23 and r24, r24 - 1a7c: a1 f7 brne .-24 ; 0x1a66 + 1972: f8 01 movw r30, r16 + 1974: 84 91 lpm r24, Z + 1976: 81 11 cpse r24, r1 + 1978: f4 cf rjmp .-24 ; 0x1962 *OutMessage++ = c; CommandName++; ByteCount--; } *OutMessage++ = ','; - 1a7e: f7 01 movw r30, r14 - 1a80: b1 92 st Z+, r11 - 1a82: 7f 01 movw r14, r30 + 197a: f7 01 movw r30, r14 + 197c: b1 92 st Z+, r11 + 197e: 7f 01 movw r14, r30 ByteCount--; - 1a84: 21 97 sbiw r28, 0x01 ; 1 + 1980: 21 97 sbiw r28, 0x01 ; 1 EntryPtr++; - 1a86: 86 e1 ldi r24, 0x16 ; 22 - 1a88: 90 e0 ldi r25, 0x00 ; 0 - 1a8a: c8 0e add r12, r24 - 1a8c: d9 1e adc r13, r25 + 1982: f6 e1 ldi r31, 0x16 ; 22 + 1984: cf 0e add r12, r31 + 1986: d1 1c adc r13, r1 CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { - 1a8e: 86 01 movw r16, r12 - 1a90: 8c e1 ldi r24, 0x1C ; 28 - 1a92: 90 e2 ldi r25, 0x20 ; 32 - 1a94: b6 01 movw r22, r12 - 1a96: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1a9a: 00 97 sbiw r24, 0x00 ; 0 - 1a9c: d9 f6 brne .-74 ; 0x1a54 + 1988: 86 01 movw r16, r12 + 198a: b6 01 movw r22, r12 + 198c: 80 e9 ldi r24, 0x90 ; 144 + 198e: 90 e2 ldi r25, 0x20 ; 32 + 1990: 0e 94 16 24 call 0x482c ; 0x482c + 1994: 89 2b or r24, r25 + 1996: e1 f6 brne .-72 ; 0x1950 ByteCount--; EntryPtr++; } *--OutMessage = '\0'; - 1a9e: f7 01 movw r30, r14 - 1aa0: 31 97 sbiw r30, 0x01 ; 1 - 1aa2: 10 82 st Z, r1 + 1998: f7 01 movw r30, r14 + 199a: 31 97 sbiw r30, 0x01 ; 1 + 199c: 10 82 st Z, r1 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 1aa4: 85 e6 ldi r24, 0x65 ; 101 - 1aa6: df 91 pop r29 - 1aa8: cf 91 pop r28 - 1aaa: 1f 91 pop r17 - 1aac: 0f 91 pop r16 - 1aae: ff 90 pop r15 - 1ab0: ef 90 pop r14 - 1ab2: df 90 pop r13 - 1ab4: cf 90 pop r12 - 1ab6: bf 90 pop r11 - 1ab8: 08 95 ret + 199e: 85 e6 ldi r24, 0x65 ; 101 + 19a0: df 91 pop r29 + 19a2: cf 91 pop r28 + 19a4: 1f 91 pop r17 + 19a6: 0f 91 pop r16 + 19a8: ff 90 pop r15 + 19aa: ef 90 pop r14 + 19ac: df 90 pop r13 + 19ae: cf 90 pop r12 + 19b0: bf 90 pop r11 + 19b2: 08 95 ret -00001aba : +000019b4 : CommandStatusIdType CommandGetRssi(char* OutParam) { - 1aba: cf 93 push r28 - 1abc: df 93 push r29 + 19b4: fc 01 movw r30, r24 } static inline uint16_t AntennaLevelGet(void) { ADCA.CH0.CTRL |= ADC_CH_START_bm; - 1abe: 20 91 20 02 lds r18, 0x0220 - 1ac2: 20 68 ori r18, 0x80 ; 128 - 1ac4: e0 e0 ldi r30, 0x00 ; 0 - 1ac6: f2 e0 ldi r31, 0x02 ; 2 - 1ac8: 20 a3 lds r18, 0x50 + 19b6: 20 91 20 02 lds r18, 0x0220 + 19ba: 20 68 ori r18, 0x80 ; 128 + 19bc: 20 93 20 02 sts 0x0220, r18 while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); - 1aca: 20 91 23 02 lds r18, 0x0223 - 1ace: 20 ff sbrs r18, 0 - 1ad0: fc cf rjmp .-8 ; 0x1aca + 19c0: 20 91 23 02 lds r18, 0x0223 + 19c4: 20 ff sbrs r18, 0 + 19c6: fc cf rjmp .-8 ; 0x19c0 ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; - 1ad2: 21 e0 ldi r18, 0x01 ; 1 - 1ad4: e0 e0 ldi r30, 0x00 ; 0 - 1ad6: f2 e0 ldi r31, 0x02 ; 2 - 1ad8: 23 a3 lds r18, 0x53 + 19c8: 81 e0 ldi r24, 0x01 ; 1 + 19ca: 80 93 23 02 sts 0x0223, r24 int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; - 1ada: 60 91 10 02 lds r22, 0x0210 - 1ade: 70 91 11 02 lds r23, 0x0211 - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 1ae2: 2d b7 in r18, 0x3d ; 61 - 1ae4: 3e b7 in r19, 0x3e ; 62 - 1ae6: 28 50 subi r18, 0x08 ; 8 - 1ae8: 30 40 sbci r19, 0x00 ; 0 - 1aea: 2d bf out 0x3d, r18 ; 61 - 1aec: 3e bf out 0x3e, r19 ; 62 - 1aee: cd b7 in r28, 0x3d ; 61 - 1af0: de b7 in r29, 0x3e ; 62 - 1af2: 21 96 adiw r28, 0x01 ; 1 - 1af4: ed b7 in r30, 0x3d ; 61 - 1af6: fe b7 in r31, 0x3e ; 62 - 1af8: 81 83 std Z+1, r24 ; 0x01 - 1afa: 92 83 std Z+2, r25 ; 0x02 - 1afc: 80 e0 ldi r24, 0x00 ; 0 - 1afe: 91 e0 ldi r25, 0x01 ; 1 - 1b00: 8a 83 std Y+2, r24 ; 0x02 - 1b02: 9b 83 std Y+3, r25 ; 0x03 - 1b04: 84 e3 ldi r24, 0x34 ; 52 - 1b06: 94 e0 ldi r25, 0x04 ; 4 - 1b08: 8c 83 std Y+4, r24 ; 0x04 - 1b0a: 9d 83 std Y+5, r25 ; 0x05 + 19ce: a0 91 10 02 lds r26, 0x0210 + 19d2: b0 91 11 02 lds r27, 0x0211 if (Result < 0) Result = 0; return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); - 1b0c: 6e 5b subi r22, 0xBE ; 190 - 1b0e: 70 40 sbci r23, 0x00 ; 0 - 1b10: 77 fd sbrc r23, 7 - 1b12: 1a c0 rjmp .+52 ; 0x1b48 - 1b14: 88 27 eor r24, r24 - 1b16: 77 fd sbrc r23, 7 - 1b18: 80 95 com r24 - 1b1a: 98 2f mov r25, r24 - 1b1c: 29 e6 ldi r18, 0x69 ; 105 - 1b1e: 37 e5 ldi r19, 0x57 ; 87 - 1b20: 4b e0 ldi r20, 0x0B ; 11 - 1b22: 50 e0 ldi r21, 0x00 ; 0 - 1b24: 0e 94 75 25 call 0x4aea ; 0x4aea <__mulsi3> - 1b28: dc 01 movw r26, r24 - 1b2a: cb 01 movw r24, r22 - 1b2c: ae 83 std Y+6, r26 ; 0x06 - 1b2e: bf 83 std Y+7, r27 ; 0x07 - 1b30: 0e 94 1c 26 call 0x4c38 ; 0x4c38 + 19d6: ae 5b subi r26, 0xBE ; 190 + 19d8: b1 09 sbc r27, r1 + 19da: b7 fd sbrc r27, 7 + 19dc: 1c c0 rjmp .+56 ; 0x1a16 + 19de: 29 e6 ldi r18, 0x69 ; 105 + 19e0: 37 e5 ldi r19, 0x57 ; 87 + 19e2: 4b e0 ldi r20, 0x0B ; 11 + 19e4: 50 e0 ldi r21, 0x00 ; 0 + 19e6: 0e 94 97 23 call 0x472e ; 0x472e <__mulshisi3> + 19ea: aa 27 eor r26, r26 + 19ec: bb 27 eor r27, r27 + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, + 19ee: 9f 93 push r25 + 19f0: 8f 93 push r24 + 19f2: 24 e3 ldi r18, 0x34 ; 52 + 19f4: 34 e0 ldi r19, 0x04 ; 4 + 19f6: 3f 93 push r19 + 19f8: 2f 93 push r18 + 19fa: 81 e0 ldi r24, 0x01 ; 1 + 19fc: 8f 93 push r24 + 19fe: 1f 92 push r1 + 1a00: ff 93 push r31 + 1a02: ef 93 push r30 + 1a04: 0e 94 37 24 call 0x486e ; 0x486e PSTR("%5u mV"), AntennaLevelGet()); return COMMAND_INFO_OK_WITH_TEXT_ID; - 1b34: 2d b7 in r18, 0x3d ; 61 - 1b36: 3e b7 in r19, 0x3e ; 62 - 1b38: 28 5f subi r18, 0xF8 ; 248 - 1b3a: 3f 4f sbci r19, 0xFF ; 255 - 1b3c: 2d bf out 0x3d, r18 ; 61 - 1b3e: 3e bf out 0x3e, r19 ; 62 + 1a08: 8d b7 in r24, 0x3d ; 61 + 1a0a: 9e b7 in r25, 0x3e ; 62 + 1a0c: 08 96 adiw r24, 0x08 ; 8 + 1a0e: 8d bf out 0x3d, r24 ; 61 + 1a10: 9e bf out 0x3e, r25 ; 62 } - 1b40: 85 e6 ldi r24, 0x65 ; 101 - 1b42: df 91 pop r29 - 1b44: cf 91 pop r28 - 1b46: 08 95 ret - 1b48: 60 e0 ldi r22, 0x00 ; 0 - 1b4a: 70 e0 ldi r23, 0x00 ; 0 - 1b4c: e3 cf rjmp .-58 ; 0x1b14 + 1a12: 85 e6 ldi r24, 0x65 ; 101 + 1a14: 08 95 ret + 1a16: a0 e0 ldi r26, 0x00 ; 0 + 1a18: b0 e0 ldi r27, 0x00 ; 0 + 1a1a: e1 cf rjmp .-62 ; 0x19de -00001b4e : +00001a1c : static uint32_t BlockAddress; static XModemCallbackType CallbackFunc; static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { uint8_t Checksum = CHECKSUM_INIT_VALUE; - 1b4e: 80 e0 ldi r24, 0x00 ; 0 + 1a1c: 80 e0 ldi r24, 0x00 ; 0 uint8_t* DataPtr = (uint8_t*) Buffer; - 1b50: e0 e2 ldi r30, 0x20 ; 32 - 1b52: f1 e2 ldi r31, 0x21 ; 33 + 1a1e: e0 e1 ldi r30, 0x10 ; 16 + 1a20: f1 e2 ldi r31, 0x21 ; 33 while(ByteCount--) { Checksum += *DataPtr++; - 1b54: 91 91 ld r25, Z+ - 1b56: 89 0f add r24, r25 + 1a22: 91 91 ld r25, Z+ + 1a24: 89 0f add r24, r25 static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { uint8_t Checksum = CHECKSUM_INIT_VALUE; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 1b58: 91 e2 ldi r25, 0x21 ; 33 - 1b5a: e0 3a cpi r30, 0xA0 ; 160 - 1b5c: f9 07 cpc r31, r25 - 1b5e: d1 f7 brne .-12 ; 0x1b54 + 1a26: 91 e2 ldi r25, 0x21 ; 33 + 1a28: e0 39 cpi r30, 0x90 ; 144 + 1a2a: f9 07 cpc r31, r25 + 1a2c: d1 f7 brne .-12 ; 0x1a22 Checksum += *DataPtr++; } return Checksum; } - 1b60: 08 95 ret + 1a2e: 08 95 ret -00001b62 : +00001a30 : void XModemReceive(XModemCallbackType TheCallbackFunc) { State = STATE_RECEIVE_INIT; - 1b62: 21 e0 ldi r18, 0x01 ; 1 - 1b64: 20 93 a5 20 sts 0x20A5, r18 + 1a30: 21 e0 ldi r18, 0x01 ; 1 + 1a32: 20 93 95 20 sts 0x2095, r18 CurrentFrameNumber = FIRST_FRAME_NUMBER; - 1b68: 20 93 a6 20 sts 0x20A6, r18 + 1a36: 20 93 96 20 sts 0x2096, r18 RetryCount = RECV_INIT_COUNT; - 1b6c: 24 e1 ldi r18, 0x14 ; 20 - 1b6e: 20 93 a7 20 sts 0x20A7, r18 + 1a3a: 24 e1 ldi r18, 0x14 ; 20 + 1a3c: 20 93 97 20 sts 0x2097, r18 RetryTimeout = RECV_INIT_TIMEOUT; - 1b72: 25 e0 ldi r18, 0x05 ; 5 - 1b74: 20 93 a8 20 sts 0x20A8, r18 + 1a40: 25 e0 ldi r18, 0x05 ; 5 + 1a42: 20 93 98 20 sts 0x2098, r18 BlockAddress = 0; - 1b78: 10 92 a9 20 sts 0x20A9, r1 - 1b7c: 10 92 aa 20 sts 0x20AA, r1 - 1b80: 10 92 ab 20 sts 0x20AB, r1 - 1b84: 10 92 ac 20 sts 0x20AC, r1 + 1a46: 10 92 99 20 sts 0x2099, r1 + 1a4a: 10 92 9a 20 sts 0x209A, r1 + 1a4e: 10 92 9b 20 sts 0x209B, r1 + 1a52: 10 92 9c 20 sts 0x209C, r1 CallbackFunc = TheCallbackFunc; - 1b88: 80 93 ad 20 sts 0x20AD, r24 - 1b8c: 90 93 ae 20 sts 0x20AE, r25 -} - 1b90: 08 95 ret + 1a56: 80 93 9d 20 sts 0x209D, r24 + 1a5a: 90 93 9e 20 sts 0x209E, r25 + 1a5e: 08 95 ret -00001b92 : +00001a60 : +} void XModemSend(XModemCallbackType TheCallbackFunc) { State = STATE_SEND_INIT; - 1b92: 27 e0 ldi r18, 0x07 ; 7 - 1b94: 20 93 a5 20 sts 0x20A5, r18 + 1a60: 27 e0 ldi r18, 0x07 ; 7 + 1a62: 20 93 95 20 sts 0x2095, r18 RetryTimeout = SEND_INIT_TIMEOUT; - 1b98: 24 e6 ldi r18, 0x64 ; 100 - 1b9a: 20 93 a8 20 sts 0x20A8, r18 + 1a66: 24 e6 ldi r18, 0x64 ; 100 + 1a68: 20 93 98 20 sts 0x2098, r18 BlockAddress = 0; - 1b9e: 10 92 a9 20 sts 0x20A9, r1 - 1ba2: 10 92 aa 20 sts 0x20AA, r1 - 1ba6: 10 92 ab 20 sts 0x20AB, r1 - 1baa: 10 92 ac 20 sts 0x20AC, r1 + 1a6c: 10 92 99 20 sts 0x2099, r1 + 1a70: 10 92 9a 20 sts 0x209A, r1 + 1a74: 10 92 9b 20 sts 0x209B, r1 + 1a78: 10 92 9c 20 sts 0x209C, r1 CallbackFunc = TheCallbackFunc; - 1bae: 80 93 ad 20 sts 0x20AD, r24 - 1bb2: 90 93 ae 20 sts 0x20AE, r25 -} - 1bb6: 08 95 ret + 1a7c: 80 93 9d 20 sts 0x209D, r24 + 1a80: 90 93 9e 20 sts 0x209E, r25 + 1a84: 08 95 ret -00001bb8 : +00001a86 : +} bool XModemProcessByte(uint8_t Byte) { - 1bb8: cf 93 push r28 - 1bba: c8 2f mov r28, r24 + 1a86: cf 93 push r28 + 1a88: c8 2f mov r28, r24 switch(State) { - 1bbc: 80 91 a5 20 lds r24, 0x20A5 - 1bc0: 85 30 cpi r24, 0x05 ; 5 - 1bc2: 09 f4 brne .+2 ; 0x1bc6 - 1bc4: 84 c0 rjmp .+264 ; 0x1cce - 1bc6: 86 30 cpi r24, 0x06 ; 6 - 1bc8: e8 f0 brcs .+58 ; 0x1c04 - 1bca: 87 30 cpi r24, 0x07 ; 7 - 1bcc: 09 f4 brne .+2 ; 0x1bd0 - 1bce: 4e c0 rjmp .+156 ; 0x1c6c - 1bd0: 87 30 cpi r24, 0x07 ; 7 - 1bd2: 70 f5 brcc .+92 ; 0x1c30 + 1a8a: 90 91 95 20 lds r25, 0x2095 + 1a8e: 95 30 cpi r25, 0x05 ; 5 + 1a90: 09 f4 brne .+2 ; 0x1a94 + 1a92: 7f c0 rjmp .+254 ; 0x1b92 + 1a94: e0 f0 brcs .+56 ; 0x1ace + 1a96: 97 30 cpi r25, 0x07 ; 7 + 1a98: 09 f4 brne .+2 ; 0x1a9c + 1a9a: 4a c0 rjmp .+148 ; 0x1b30 + 1a9c: 60 f5 brcc .+88 ; 0x1af6 } break; case STATE_RECEIVE_PROCESS: if (ReceivedFrameNumber == CurrentFrameNumber) { - 1bd4: 20 91 b2 20 lds r18, 0x20B2 - 1bd8: 80 91 a6 20 lds r24, 0x20A6 - 1bdc: 28 17 cp r18, r24 - 1bde: 09 f4 brne .+2 ; 0x1be2 - 1be0: e1 c0 rjmp .+450 ; 0x1da4 + 1a9e: 20 91 a2 20 lds r18, 0x20A2 + 1aa2: 80 91 96 20 lds r24, 0x2096 + 1aa6: 28 17 cp r18, r24 + 1aa8: 09 f4 brne .+2 ; 0x1aac + 1aaa: df c0 rjmp .+446 ; 0x1c6a } else { /* Data seems to be damaged */ TerminalSendByte(BYTE_NAK); State = STATE_RECEIVE_WAIT; } } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { - 1be2: 30 e0 ldi r19, 0x00 ; 0 - 1be4: 90 e0 ldi r25, 0x00 ; 0 - 1be6: 01 97 sbiw r24, 0x01 ; 1 - 1be8: 28 17 cp r18, r24 - 1bea: 39 07 cpc r19, r25 - 1bec: 09 f4 brne .+2 ; 0x1bf0 - 1bee: 0b c1 rjmp .+534 ; 0x1e06 + 1aac: 30 e0 ldi r19, 0x00 ; 0 + 1aae: 90 e0 ldi r25, 0x00 ; 0 + 1ab0: 01 97 sbiw r24, 0x01 ; 1 + 1ab2: 28 17 cp r18, r24 + 1ab4: 39 07 cpc r19, r25 + 1ab6: 09 f4 brne .+2 ; 0x1aba + 1ab8: 07 c1 rjmp .+526 ; 0x1cc8 INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } - 1bf0: 80 e0 ldi r24, 0x00 ; 0 - 1bf2: 90 e2 ldi r25, 0x20 ; 32 - 1bf4: 68 e1 ldi r22, 0x18 ; 24 - 1bf6: 0e 94 81 24 call 0x4902 ; 0x4902 + 1aba: 68 e1 ldi r22, 0x18 ; 24 + 1abc: 80 e0 ldi r24, 0x00 ; 0 + 1abe: 90 e2 ldi r25, 0x20 ; 32 + 1ac0: 0e 94 00 22 call 0x4400 ; 0x4400 TerminalSendByte(BYTE_ACK); State = STATE_RECEIVE_WAIT; } else { /* This frame is completely out of order. Just cancel */ TerminalSendByte(BYTE_CAN); State = STATE_OFF; - 1bfa: 10 92 a5 20 sts 0x20A5, r1 + 1ac4: 10 92 95 20 sts 0x2095, r1 default: return false; break; } return true; - 1bfe: 81 e0 ldi r24, 0x01 ; 1 + 1ac8: 81 e0 ldi r24, 0x01 ; 1 } - 1c00: cf 91 pop r28 - 1c02: 08 95 ret + 1aca: cf 91 pop r28 + 1acc: 08 95 ret CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 1c04: 83 30 cpi r24, 0x03 ; 3 - 1c06: 09 f4 brne .+2 ; 0x1c0a - 1c08: 5a c0 rjmp .+180 ; 0x1cbe - 1c0a: 84 30 cpi r24, 0x04 ; 4 - 1c0c: c0 f0 brcs .+48 ; 0x1c3e + 1ace: 93 30 cpi r25, 0x03 ; 3 + 1ad0: 09 f4 brne .+2 ; 0x1ad4 + 1ad2: 57 c0 rjmp .+174 ; 0x1b82 + 1ad4: b8 f0 brcs .+46 ; 0x1b04 ReceivedFrameNumber = Byte; State = STATE_RECEIVE_FRAMENUM2; break; case STATE_RECEIVE_FRAMENUM2: if (Byte == (255 - ReceivedFrameNumber)) { - 1c0e: 8c 2f mov r24, r28 - 1c10: 90 e0 ldi r25, 0x00 ; 0 - 1c12: 40 91 b2 20 lds r20, 0x20B2 - 1c16: 2f ef ldi r18, 0xFF ; 255 - 1c18: 30 e0 ldi r19, 0x00 ; 0 - 1c1a: 24 1b sub r18, r20 - 1c1c: 31 09 sbc r19, r1 - 1c1e: 82 17 cp r24, r18 - 1c20: 93 07 cpc r25, r19 - 1c22: 09 f0 breq .+2 ; 0x1c26 - 1c24: 6b c0 rjmp .+214 ; 0x1cfc + 1ad6: 90 e0 ldi r25, 0x00 ; 0 + 1ad8: 40 91 a2 20 lds r20, 0x20A2 + 1adc: 2f ef ldi r18, 0xFF ; 255 + 1ade: 30 e0 ldi r19, 0x00 ; 0 + 1ae0: 24 1b sub r18, r20 + 1ae2: 31 09 sbc r19, r1 + 1ae4: 82 17 cp r24, r18 + 1ae6: 93 07 cpc r25, r19 + 1ae8: 09 f0 breq .+2 ; 0x1aec + 1aea: 6a c0 rjmp .+212 ; 0x1bc0 /* frame-number check passed. */ State = STATE_RECEIVE_DATA; - 1c26: 85 e0 ldi r24, 0x05 ; 5 - 1c28: 80 93 a5 20 sts 0x20A5, r24 + 1aec: 85 e0 ldi r24, 0x05 ; 5 + 1aee: 80 93 95 20 sts 0x2095, r24 default: return false; break; } return true; - 1c2c: 81 e0 ldi r24, 0x01 ; 1 - 1c2e: e8 cf rjmp .-48 ; 0x1c00 + 1af2: 81 e0 ldi r24, 0x01 ; 1 + 1af4: ea cf rjmp .-44 ; 0x1aca CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 1c30: 88 30 cpi r24, 0x08 ; 8 - 1c32: f9 f0 breq .+62 ; 0x1c72 - 1c34: 89 30 cpi r24, 0x09 ; 9 - 1c36: a9 f0 breq .+42 ; 0x1c62 + 1af6: 98 30 cpi r25, 0x08 ; 8 + 1af8: f1 f0 breq .+60 ; 0x1b36 + 1afa: 99 30 cpi r25, 0x09 ; 9 + 1afc: a1 f0 breq .+40 ; 0x1b26 /* Receive Ack */ State = STATE_OFF; break; default: return false; - 1c38: 80 e0 ldi r24, 0x00 ; 0 + 1afe: 80 e0 ldi r24, 0x00 ; 0 break; } return true; } - 1c3a: cf 91 pop r28 - 1c3c: 08 95 ret + 1b00: cf 91 pop r28 + 1b02: 08 95 ret CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 1c3e: 81 30 cpi r24, 0x01 ; 1 - 1c40: d8 f3 brcs .-10 ; 0x1c38 + 1b04: 91 30 cpi r25, 0x01 ; 1 + 1b06: d8 f3 brcs .-10 ; 0x1afe case STATE_RECEIVE_INIT: case STATE_RECEIVE_WAIT: if (Byte == BYTE_SOH) { - 1c42: c1 30 cpi r28, 0x01 ; 1 - 1c44: 09 f4 brne .+2 ; 0x1c48 - 1c46: e9 c0 rjmp .+466 ; 0x1e1a + 1b08: 81 30 cpi r24, 0x01 ; 1 + 1b0a: 09 f4 brne .+2 ; 0x1b0e + 1b0c: df c0 rjmp .+446 ; 0x1ccc /* Next frame incoming */ BufferIdx = 0; Checksum = CHECKSUM_INIT_VALUE; State = STATE_RECEIVE_FRAMENUM1; } else if (Byte == BYTE_EOT) { - 1c48: c4 30 cpi r28, 0x04 ; 4 - 1c4a: 09 f4 brne .+2 ; 0x1c4e - 1c4c: fb c0 rjmp .+502 ; 0x1e44 + 1b0e: 84 30 cpi r24, 0x04 ; 4 + 1b10: 29 f0 breq .+10 ; 0x1b1c /* Transmission finished */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_CAN) { - 1c4e: c8 31 cpi r28, 0x18 ; 24 - 1c50: 41 f0 breq .+16 ; 0x1c62 + 1b12: 88 31 cpi r24, 0x18 ; 24 + 1b14: 41 f0 breq .+16 ; 0x1b26 default: return false; break; } return true; - 1c52: 81 e0 ldi r24, 0x01 ; 1 + 1b16: 81 e0 ldi r24, 0x01 ; 1 } - 1c54: cf 91 pop r28 - 1c56: 08 95 ret - 1c58: 80 e0 ldi r24, 0x00 ; 0 - 1c5a: 90 e2 ldi r25, 0x20 ; 32 - 1c5c: 66 e0 ldi r22, 0x06 ; 6 - 1c5e: 0e 94 81 24 call 0x4902 ; 0x4902 + 1b18: cf 91 pop r28 + 1b1a: 08 95 ret + 1b1c: 66 e0 ldi r22, 0x06 ; 6 + 1b1e: 80 e0 ldi r24, 0x00 ; 0 + 1b20: 90 e2 ldi r25, 0x20 ; 32 + 1b22: 0e 94 00 22 call 0x4400 ; 0x4400 case STATE_SEND_WAIT: if (Byte == BYTE_CAN) { /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; - 1c62: 10 92 a5 20 sts 0x20A5, r1 + 1b26: 10 92 95 20 sts 0x2095, r1 + default: + return false; + break; + } + + return true; + 1b2a: 81 e0 ldi r24, 0x01 ; 1 +} + 1b2c: cf 91 pop r28 + 1b2e: 08 95 ret + + break; + + case STATE_SEND_INIT: + /* Start sending on NAK */ + if (Byte == BYTE_NAK) { + 1b30: 85 31 cpi r24, 0x15 ; 21 + 1b32: 09 f4 brne .+2 ; 0x1b36 + 1b34: 50 c0 rjmp .+160 ; 0x1bd6 + } + + /* Fallthrough */ + + case STATE_SEND_WAIT: + if (Byte == BYTE_CAN) { + 1b36: c8 31 cpi r28, 0x18 ; 24 + 1b38: 89 f3 breq .-30 ; 0x1b1c + /* Cancel */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if (Byte == BYTE_ACK) { + 1b3a: c6 30 cpi r28, 0x06 ; 6 + 1b3c: 09 f4 brne .+2 ; 0x1b40 + 1b3e: e1 c0 rjmp .+450 ; 0x1d02 + BlockAddress += XMODEM_BLOCK_SIZE; + } else { + TerminalSendByte(BYTE_EOT); + State = STATE_SEND_EOT; + } + } else if (Byte == BYTE_NAK){ + 1b40: c5 31 cpi r28, 0x15 ; 21 + 1b42: 49 f7 brne .-46 ; 0x1b16 + 1b44: 61 e0 ldi r22, 0x01 ; 1 + 1b46: 80 e0 ldi r24, 0x00 ; 0 + 1b48: 90 e2 ldi r25, 0x20 ; 32 + 1b4a: 0e 94 00 22 call 0x4400 ; 0x4400 + 1b4e: 60 91 96 20 lds r22, 0x2096 + 1b52: 80 e0 ldi r24, 0x00 ; 0 + 1b54: 90 e2 ldi r25, 0x20 ; 32 + 1b56: 0e 94 00 22 call 0x4400 ; 0x4400 + /* Resend frame */ + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + 1b5a: 60 91 96 20 lds r22, 0x2096 + 1b5e: 60 95 com r22 + 1b60: 80 e0 ldi r24, 0x00 ; 0 + 1b62: 90 e2 ldi r25, 0x20 ; 32 + 1b64: 0e 94 00 22 call 0x4400 ; 0x4400 + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + 1b68: 60 e8 ldi r22, 0x80 ; 128 + 1b6a: 70 e0 ldi r23, 0x00 ; 0 + 1b6c: 80 e1 ldi r24, 0x10 ; 16 + 1b6e: 91 e2 ldi r25, 0x21 ; 33 + 1b70: 07 dd rcall .-1522 ; 0x1580 + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + 1b72: 54 df rcall .-344 ; 0x1a1c + 1b74: 68 2f mov r22, r24 + 1b76: 80 e0 ldi r24, 0x00 ; 0 + 1b78: 90 e2 ldi r25, 0x20 ; 32 + 1b7a: 0e 94 00 22 call 0x4400 ; 0x4400 + default: + return false; + break; + } + + return true; + 1b7e: 81 e0 ldi r24, 0x01 ; 1 + 1b80: a4 cf rjmp .-184 ; 0x1aca + + break; + + case STATE_RECEIVE_FRAMENUM1: + /* Store frame number */ + ReceivedFrameNumber = Byte; + 1b82: 80 93 a2 20 sts 0x20A2, r24 + State = STATE_RECEIVE_FRAMENUM2; + 1b86: 84 e0 ldi r24, 0x04 ; 4 + 1b88: 80 93 95 20 sts 0x2095, r24 + default: + return false; + break; + } + + return true; + 1b8c: 81 e0 ldi r24, 0x01 ; 1 +} + 1b8e: cf 91 pop r28 + 1b90: 08 95 ret + + break; + + case STATE_RECEIVE_DATA: + /* Process byte and update checksum */ + TerminalBuffer[BufferIdx++] = Byte; + 1b92: 20 91 9f 20 lds r18, 0x209F + 1b96: 30 91 a0 20 lds r19, 0x20A0 + 1b9a: f9 01 movw r30, r18 + 1b9c: e0 5f subi r30, 0xF0 ; 240 + 1b9e: fe 4d sbci r31, 0xDE ; 222 + 1ba0: 80 83 st Z, r24 + 1ba2: c9 01 movw r24, r18 + 1ba4: 01 96 adiw r24, 0x01 ; 1 + 1ba6: 80 93 9f 20 sts 0x209F, r24 + 1baa: 90 93 a0 20 sts 0x20A0, r25 + + if (BufferIdx == XMODEM_BLOCK_SIZE) { + 1bae: 80 38 cpi r24, 0x80 ; 128 + 1bb0: 91 05 cpc r25, r1 + 1bb2: 09 f0 breq .+2 ; 0x1bb6 + 1bb4: b0 cf rjmp .-160 ; 0x1b16 + /* Block full */ + State = STATE_RECEIVE_PROCESS; + 1bb6: 86 e0 ldi r24, 0x06 ; 6 + 1bb8: 80 93 95 20 sts 0x2095, r24 + default: + return false; + break; + } + + return true; + 1bbc: 81 e0 ldi r24, 0x01 ; 1 + 1bbe: 85 cf rjmp .-246 ; 0x1aca + 1bc0: 65 e1 ldi r22, 0x15 ; 21 + 1bc2: 80 e0 ldi r24, 0x00 ; 0 + 1bc4: 90 e2 ldi r25, 0x20 ; 32 + 1bc6: 0e 94 00 22 call 0x4400 ; 0x4400 + State = STATE_RECEIVE_WAIT; + } + } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { + /* This is a retransmission */ + TerminalSendByte(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + 1bca: 82 e0 ldi r24, 0x02 ; 2 + 1bcc: 80 93 95 20 sts 0x2095, r24 + default: + return false; + break; + } + + return true; + 1bd0: 81 e0 ldi r24, 0x01 ; 1 +} + 1bd2: cf 91 pop r28 + 1bd4: 08 95 ret + + break; + + case STATE_SEND_INIT: + /* Start sending on NAK */ + if (Byte == BYTE_NAK) { + 1bd6: 81 e0 ldi r24, 0x01 ; 1 + /* Cancel */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if (Byte == BYTE_ACK) { + /* Acknowledge. Proceed to next frame, get data and calc checksum */ + CurrentFrameNumber++; + 1bd8: 80 93 96 20 sts 0x2096, r24 + + if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { + 1bdc: 40 91 99 20 lds r20, 0x2099 + 1be0: 50 91 9a 20 lds r21, 0x209A + 1be4: 60 91 9b 20 lds r22, 0x209B + 1be8: 70 91 9c 20 lds r23, 0x209C + 1bec: e0 91 9d 20 lds r30, 0x209D + 1bf0: f0 91 9e 20 lds r31, 0x209E + 1bf4: 20 e8 ldi r18, 0x80 ; 128 + 1bf6: 30 e0 ldi r19, 0x00 ; 0 + 1bf8: 80 e1 ldi r24, 0x10 ; 16 + 1bfa: 91 e2 ldi r25, 0x21 ; 33 + 1bfc: 09 95 icall + 1bfe: 88 23 and r24, r24 + 1c00: 09 f4 brne .+2 ; 0x1c04 + 1c02: 6f c0 rjmp .+222 ; 0x1ce2 + 1c04: 61 e0 ldi r22, 0x01 ; 1 + 1c06: 80 e0 ldi r24, 0x00 ; 0 + 1c08: 90 e2 ldi r25, 0x20 ; 32 + 1c0a: 0e 94 00 22 call 0x4400 ; 0x4400 + 1c0e: 60 91 96 20 lds r22, 0x2096 + 1c12: 80 e0 ldi r24, 0x00 ; 0 + 1c14: 90 e2 ldi r25, 0x20 ; 32 + 1c16: 0e 94 00 22 call 0x4400 ; 0x4400 + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + 1c1a: 60 91 96 20 lds r22, 0x2096 + 1c1e: 60 95 com r22 + 1c20: 80 e0 ldi r24, 0x00 ; 0 + 1c22: 90 e2 ldi r25, 0x20 ; 32 + 1c24: 0e 94 00 22 call 0x4400 ; 0x4400 + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + 1c28: 60 e8 ldi r22, 0x80 ; 128 + 1c2a: 70 e0 ldi r23, 0x00 ; 0 + 1c2c: 80 e1 ldi r24, 0x10 ; 16 + 1c2e: 91 e2 ldi r25, 0x21 ; 33 + 1c30: a7 dc rcall .-1714 ; 0x1580 + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + 1c32: f4 de rcall .-536 ; 0x1a1c + 1c34: 68 2f mov r22, r24 + 1c36: 80 e0 ldi r24, 0x00 ; 0 + 1c38: 90 e2 ldi r25, 0x20 ; 32 + 1c3a: 0e 94 00 22 call 0x4400 ; 0x4400 + + BlockAddress += XMODEM_BLOCK_SIZE; + 1c3e: 80 91 99 20 lds r24, 0x2099 + 1c42: 90 91 9a 20 lds r25, 0x209A + 1c46: a0 91 9b 20 lds r26, 0x209B + 1c4a: b0 91 9c 20 lds r27, 0x209C + 1c4e: 80 58 subi r24, 0x80 ; 128 + 1c50: 9f 4f sbci r25, 0xFF ; 255 + 1c52: af 4f sbci r26, 0xFF ; 255 + 1c54: bf 4f sbci r27, 0xFF ; 255 + 1c56: 80 93 99 20 sts 0x2099, r24 + 1c5a: 90 93 9a 20 sts 0x209A, r25 + 1c5e: a0 93 9b 20 sts 0x209B, r26 + 1c62: b0 93 9c 20 sts 0x209C, r27 default: return false; break; @@ -5853,11162 +5816,10236 @@ bool XModemProcessByte(uint8_t Byte) return true; 1c66: 81 e0 ldi r24, 0x01 ; 1 -} - 1c68: cf 91 pop r28 - 1c6a: 08 95 ret - - break; - - case STATE_SEND_INIT: - /* Start sending on NAK */ - if (Byte == BYTE_NAK) { - 1c6c: c5 31 cpi r28, 0x15 ; 21 - 1c6e: 09 f4 brne .+2 ; 0x1c72 - 1c70: 4f c0 rjmp .+158 ; 0x1d10 - } - - /* Fallthrough */ - - case STATE_SEND_WAIT: - if (Byte == BYTE_CAN) { - 1c72: c8 31 cpi r28, 0x18 ; 24 - 1c74: 89 f3 breq .-30 ; 0x1c58 - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - } else if (Byte == BYTE_ACK) { - 1c76: c6 30 cpi r28, 0x06 ; 6 - 1c78: 09 f4 brne .+2 ; 0x1c7c - 1c7a: f3 c0 rjmp .+486 ; 0x1e62 - BlockAddress += XMODEM_BLOCK_SIZE; - } else { - TerminalSendByte(BYTE_EOT); - State = STATE_SEND_EOT; - } - } else if (Byte == BYTE_NAK){ - 1c7c: c5 31 cpi r28, 0x15 ; 21 - 1c7e: 49 f7 brne .-46 ; 0x1c52 - 1c80: 80 e0 ldi r24, 0x00 ; 0 - 1c82: 90 e2 ldi r25, 0x20 ; 32 - 1c84: 61 e0 ldi r22, 0x01 ; 1 - 1c86: 0e 94 81 24 call 0x4902 ; 0x4902 - 1c8a: 80 e0 ldi r24, 0x00 ; 0 - 1c8c: 90 e2 ldi r25, 0x20 ; 32 - 1c8e: 60 91 a6 20 lds r22, 0x20A6 - 1c92: 0e 94 81 24 call 0x4902 ; 0x4902 - /* Resend frame */ - TerminalSendByte(BYTE_SOH); - TerminalSendByte(CurrentFrameNumber); - TerminalSendByte(255 - CurrentFrameNumber); - 1c96: 60 91 a6 20 lds r22, 0x20A6 - 1c9a: 60 95 com r22 - 1c9c: 80 e0 ldi r24, 0x00 ; 0 - 1c9e: 90 e2 ldi r25, 0x20 ; 32 - 1ca0: 0e 94 81 24 call 0x4902 ; 0x4902 - TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 1ca4: 80 e2 ldi r24, 0x20 ; 32 - 1ca6: 91 e2 ldi r25, 0x21 ; 33 - 1ca8: 60 e8 ldi r22, 0x80 ; 128 - 1caa: 70 e0 ldi r23, 0x00 ; 0 - 1cac: af dc rcall .-1698 ; 0x160c - 1cae: 4f df rcall .-354 ; 0x1b4e - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 1cb0: 68 2f mov r22, r24 - 1cb2: 80 e0 ldi r24, 0x00 ; 0 - 1cb4: 90 e2 ldi r25, 0x20 ; 32 - 1cb6: 0e 94 81 24 call 0x4902 ; 0x4902 - 1cba: 81 e0 ldi r24, 0x01 ; 1 - 1cbc: a1 cf rjmp .-190 ; 0x1c00 - default: - return false; - break; - } - - return true; - 1cbe: c0 93 b2 20 sts 0x20B2, r28 - - break; - - case STATE_RECEIVE_FRAMENUM1: - /* Store frame number */ - ReceivedFrameNumber = Byte; - 1cc2: 84 e0 ldi r24, 0x04 ; 4 - 1cc4: 80 93 a5 20 sts 0x20A5, r24 - State = STATE_RECEIVE_FRAMENUM2; - 1cc8: 81 e0 ldi r24, 0x01 ; 1 - 1cca: cf 91 pop r28 - default: - return false; - break; - } - - return true; - 1ccc: 08 95 ret -} - 1cce: 20 91 af 20 lds r18, 0x20AF - - break; - - case STATE_RECEIVE_DATA: - /* Process byte and update checksum */ - TerminalBuffer[BufferIdx++] = Byte; - 1cd2: 30 91 b0 20 lds r19, 0x20B0 - 1cd6: f9 01 movw r30, r18 - 1cd8: e0 5e subi r30, 0xE0 ; 224 - 1cda: fe 4d sbci r31, 0xDE ; 222 - 1cdc: c0 83 st Z, r28 - 1cde: c9 01 movw r24, r18 - 1ce0: 01 96 adiw r24, 0x01 ; 1 - 1ce2: 80 93 af 20 sts 0x20AF, r24 - 1ce6: 90 93 b0 20 sts 0x20B0, r25 - 1cea: 80 38 cpi r24, 0x80 ; 128 - 1cec: 91 05 cpc r25, r1 - - if (BufferIdx == XMODEM_BLOCK_SIZE) { - 1cee: 09 f0 breq .+2 ; 0x1cf2 - 1cf0: b0 cf rjmp .-160 ; 0x1c52 - 1cf2: 86 e0 ldi r24, 0x06 ; 6 - 1cf4: 80 93 a5 20 sts 0x20A5, r24 - /* Block full */ - State = STATE_RECEIVE_PROCESS; - 1cf8: 81 e0 ldi r24, 0x01 ; 1 - 1cfa: 82 cf rjmp .-252 ; 0x1c00 - default: - return false; - break; - } - - return true; - 1cfc: 80 e0 ldi r24, 0x00 ; 0 - 1cfe: 90 e2 ldi r25, 0x20 ; 32 - 1d00: 65 e1 ldi r22, 0x15 ; 21 - 1d02: 0e 94 81 24 call 0x4902 ; 0x4902 - 1d06: 82 e0 ldi r24, 0x02 ; 2 - 1d08: 80 93 a5 20 sts 0x20A5, r24 - State = STATE_OFF; - } - } else { - /* Data seems to be damaged */ - TerminalSendByte(BYTE_NAK); - State = STATE_RECEIVE_WAIT; - 1d0c: 81 e0 ldi r24, 0x01 ; 1 - 1d0e: 78 cf rjmp .-272 ; 0x1c00 - default: - return false; - break; - } - - return true; - 1d10: 81 e0 ldi r24, 0x01 ; 1 - 1d12: 80 93 a6 20 sts 0x20A6, r24 - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - } else if (Byte == BYTE_ACK) { - /* Acknowledge. Proceed to next frame, get data and calc checksum */ - CurrentFrameNumber++; - 1d16: 40 91 a9 20 lds r20, 0x20A9 - - if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 1d1a: 50 91 aa 20 lds r21, 0x20AA - 1d1e: 60 91 ab 20 lds r22, 0x20AB - 1d22: 70 91 ac 20 lds r23, 0x20AC - 1d26: e0 91 ad 20 lds r30, 0x20AD - 1d2a: f0 91 ae 20 lds r31, 0x20AE - 1d2e: 80 e2 ldi r24, 0x20 ; 32 - 1d30: 91 e2 ldi r25, 0x21 ; 33 - 1d32: 20 e8 ldi r18, 0x80 ; 128 - 1d34: 30 e0 ldi r19, 0x00 ; 0 - 1d36: 09 95 icall - 1d38: 88 23 and r24, r24 - 1d3a: 09 f4 brne .+2 ; 0x1d3e - 1d3c: 79 c0 rjmp .+242 ; 0x1e30 - 1d3e: 80 e0 ldi r24, 0x00 ; 0 - 1d40: 90 e2 ldi r25, 0x20 ; 32 - 1d42: 61 e0 ldi r22, 0x01 ; 1 - 1d44: 0e 94 81 24 call 0x4902 ; 0x4902 - 1d48: 80 e0 ldi r24, 0x00 ; 0 - 1d4a: 90 e2 ldi r25, 0x20 ; 32 - 1d4c: 60 91 a6 20 lds r22, 0x20A6 - 1d50: 0e 94 81 24 call 0x4902 ; 0x4902 - 1d54: 60 91 a6 20 lds r22, 0x20A6 - TerminalSendByte(BYTE_SOH); - TerminalSendByte(CurrentFrameNumber); - TerminalSendByte(255 - CurrentFrameNumber); - 1d58: 60 95 com r22 - 1d5a: 80 e0 ldi r24, 0x00 ; 0 - 1d5c: 90 e2 ldi r25, 0x20 ; 32 - 1d5e: 0e 94 81 24 call 0x4902 ; 0x4902 - 1d62: 80 e2 ldi r24, 0x20 ; 32 - 1d64: 91 e2 ldi r25, 0x21 ; 33 - TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 1d66: 60 e8 ldi r22, 0x80 ; 128 - 1d68: 70 e0 ldi r23, 0x00 ; 0 - 1d6a: 50 dc rcall .-1888 ; 0x160c - 1d6c: f0 de rcall .-544 ; 0x1b4e - 1d6e: 68 2f mov r22, r24 - 1d70: 80 e0 ldi r24, 0x00 ; 0 - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 1d72: 90 e2 ldi r25, 0x20 ; 32 - 1d74: 0e 94 81 24 call 0x4902 ; 0x4902 - 1d78: 80 91 a9 20 lds r24, 0x20A9 - 1d7c: 90 91 aa 20 lds r25, 0x20AA - - BlockAddress += XMODEM_BLOCK_SIZE; - 1d80: a0 91 ab 20 lds r26, 0x20AB - 1d84: b0 91 ac 20 lds r27, 0x20AC - 1d88: 80 58 subi r24, 0x80 ; 128 - 1d8a: 9f 4f sbci r25, 0xFF ; 255 - 1d8c: af 4f sbci r26, 0xFF ; 255 - 1d8e: bf 4f sbci r27, 0xFF ; 255 - 1d90: 80 93 a9 20 sts 0x20A9, r24 - 1d94: 90 93 aa 20 sts 0x20AA, r25 - 1d98: a0 93 ab 20 sts 0x20AB, r26 - 1d9c: b0 93 ac 20 sts 0x20AC, r27 - 1da0: 81 e0 ldi r24, 0x01 ; 1 - 1da2: 2e cf rjmp .-420 ; 0x1c00 - 1da4: d4 de rcall .-600 ; 0x1b4e - 1da6: 8c 17 cp r24, r28 - default: - return false; - break; - } - - return true; - 1da8: 09 f0 breq .+2 ; 0x1dac - 1daa: a8 cf rjmp .-176 ; 0x1cfc + 1c68: 57 cf rjmp .-338 ; 0x1b18 case STATE_RECEIVE_PROCESS: if (ReceivedFrameNumber == CurrentFrameNumber) { /* This is the expected frame. Calculate and verify checksum */ if (CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE) == Byte) { - 1dac: 40 91 a9 20 lds r20, 0x20A9 - 1db0: 50 91 aa 20 lds r21, 0x20AA - 1db4: 60 91 ab 20 lds r22, 0x20AB + 1c6a: d8 de rcall .-592 ; 0x1a1c + 1c6c: 8c 13 cpse r24, r28 + 1c6e: a8 cf rjmp .-176 ; 0x1bc0 /* Checksum is valid. Pass received data to callback function */ if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 1db8: 70 91 ac 20 lds r23, 0x20AC - 1dbc: e0 91 ad 20 lds r30, 0x20AD - 1dc0: f0 91 ae 20 lds r31, 0x20AE - 1dc4: 80 e2 ldi r24, 0x20 ; 32 - 1dc6: 91 e2 ldi r25, 0x21 ; 33 - 1dc8: 20 e8 ldi r18, 0x80 ; 128 - 1dca: 30 e0 ldi r19, 0x00 ; 0 - 1dcc: 09 95 icall - 1dce: 88 23 and r24, r24 - 1dd0: 09 f4 brne .+2 ; 0x1dd4 - 1dd2: 41 c0 rjmp .+130 ; 0x1e56 - 1dd4: 80 91 a6 20 lds r24, 0x20A6 - 1dd8: 8f 5f subi r24, 0xFF ; 255 - 1dda: 80 93 a6 20 sts 0x20A6, r24 + 1c70: 40 91 99 20 lds r20, 0x2099 + 1c74: 50 91 9a 20 lds r21, 0x209A + 1c78: 60 91 9b 20 lds r22, 0x209B + 1c7c: 70 91 9c 20 lds r23, 0x209C + 1c80: e0 91 9d 20 lds r30, 0x209D + 1c84: f0 91 9e 20 lds r31, 0x209E + 1c88: 20 e8 ldi r18, 0x80 ; 128 + 1c8a: 30 e0 ldi r19, 0x00 ; 0 + 1c8c: 80 e1 ldi r24, 0x10 ; 16 + 1c8e: 91 e2 ldi r25, 0x21 ; 33 + 1c90: 09 95 icall + 1c92: 88 23 and r24, r24 + 1c94: 81 f1 breq .+96 ; 0x1cf6 /* Proceed to next frame and send ACK */ CurrentFrameNumber++; - 1dde: 80 91 a9 20 lds r24, 0x20A9 - 1de2: 90 91 aa 20 lds r25, 0x20AA - 1de6: a0 91 ab 20 lds r26, 0x20AB + 1c96: 80 91 96 20 lds r24, 0x2096 + 1c9a: 8f 5f subi r24, 0xFF ; 255 + 1c9c: 80 93 96 20 sts 0x2096, r24 BlockAddress += XMODEM_BLOCK_SIZE; - 1dea: b0 91 ac 20 lds r27, 0x20AC - 1dee: 80 58 subi r24, 0x80 ; 128 - 1df0: 9f 4f sbci r25, 0xFF ; 255 - 1df2: af 4f sbci r26, 0xFF ; 255 - 1df4: bf 4f sbci r27, 0xFF ; 255 - 1df6: 80 93 a9 20 sts 0x20A9, r24 - 1dfa: 90 93 aa 20 sts 0x20AA, r25 - 1dfe: a0 93 ab 20 sts 0x20AB, r26 - 1e02: b0 93 ac 20 sts 0x20AC, r27 - 1e06: 80 e0 ldi r24, 0x00 ; 0 - 1e08: 90 e2 ldi r25, 0x20 ; 32 - 1e0a: 66 e0 ldi r22, 0x06 ; 6 - 1e0c: 0e 94 81 24 call 0x4902 ; 0x4902 - 1e10: 82 e0 ldi r24, 0x02 ; 2 - 1e12: 80 93 a5 20 sts 0x20A5, r24 - 1e16: 81 e0 ldi r24, 0x01 ; 1 - 1e18: f3 ce rjmp .-538 ; 0x1c00 - State = STATE_RECEIVE_WAIT; - } - } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { - /* This is a retransmission */ - TerminalSendByte(BYTE_ACK); - State = STATE_RECEIVE_WAIT; - 1e1a: 10 92 af 20 sts 0x20AF, r1 - 1e1e: 10 92 b0 20 sts 0x20B0, r1 - default: - return false; - break; - } - - return true; - 1e22: 10 92 b1 20 sts 0x20B1, r1 + 1ca0: 80 91 99 20 lds r24, 0x2099 + 1ca4: 90 91 9a 20 lds r25, 0x209A + 1ca8: a0 91 9b 20 lds r26, 0x209B + 1cac: b0 91 9c 20 lds r27, 0x209C + 1cb0: 80 58 subi r24, 0x80 ; 128 + 1cb2: 9f 4f sbci r25, 0xFF ; 255 + 1cb4: af 4f sbci r26, 0xFF ; 255 + 1cb6: bf 4f sbci r27, 0xFF ; 255 + 1cb8: 80 93 99 20 sts 0x2099, r24 + 1cbc: 90 93 9a 20 sts 0x209A, r25 + 1cc0: a0 93 9b 20 sts 0x209B, r26 + 1cc4: b0 93 9c 20 sts 0x209C, r27 + 1cc8: 66 e0 ldi r22, 0x06 ; 6 + 1cca: 7b cf rjmp .-266 ; 0x1bc2 switch(State) { case STATE_RECEIVE_INIT: case STATE_RECEIVE_WAIT: if (Byte == BYTE_SOH) { /* Next frame incoming */ BufferIdx = 0; - 1e26: 83 e0 ldi r24, 0x03 ; 3 - 1e28: 80 93 a5 20 sts 0x20A5, r24 + 1ccc: 10 92 9f 20 sts 0x209F, r1 + 1cd0: 10 92 a0 20 sts 0x20A0, r1 Checksum = CHECKSUM_INIT_VALUE; - 1e2c: 81 e0 ldi r24, 0x01 ; 1 - 1e2e: e8 ce rjmp .-560 ; 0x1c00 + 1cd4: 10 92 a1 20 sts 0x20A1, r1 State = STATE_RECEIVE_FRAMENUM1; - 1e30: 80 e0 ldi r24, 0x00 ; 0 - 1e32: 90 e2 ldi r25, 0x20 ; 32 - 1e34: 64 e0 ldi r22, 0x04 ; 4 + 1cd8: 83 e0 ldi r24, 0x03 ; 3 + 1cda: 80 93 95 20 sts 0x2095, r24 default: return false; break; } return true; - 1e36: 0e 94 81 24 call 0x4902 ; 0x4902 - 1e3a: 89 e0 ldi r24, 0x09 ; 9 - 1e3c: 80 93 a5 20 sts 0x20A5, r24 - 1e40: 81 e0 ldi r24, 0x01 ; 1 - 1e42: de ce rjmp .-580 ; 0x1c00 + 1cde: 81 e0 ldi r24, 0x01 ; 1 + 1ce0: f4 ce rjmp .-536 ; 0x1aca + 1ce2: 64 e0 ldi r22, 0x04 ; 4 + 1ce4: 80 e0 ldi r24, 0x00 ; 0 + 1ce6: 90 e2 ldi r25, 0x20 ; 32 + 1ce8: 0e 94 00 22 call 0x4400 ; 0x4400 TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); BlockAddress += XMODEM_BLOCK_SIZE; } else { TerminalSendByte(BYTE_EOT); State = STATE_SEND_EOT; - 1e44: 80 e0 ldi r24, 0x00 ; 0 - 1e46: 90 e2 ldi r25, 0x20 ; 32 - 1e48: 66 e0 ldi r22, 0x06 ; 6 + 1cec: 89 e0 ldi r24, 0x09 ; 9 + 1cee: 80 93 95 20 sts 0x2095, r24 default: return false; break; } return true; - 1e4a: 0e 94 81 24 call 0x4902 ; 0x4902 - 1e4e: 10 92 a5 20 sts 0x20A5, r1 - 1e52: 81 e0 ldi r24, 0x01 ; 1 - 1e54: d5 ce rjmp .-598 ; 0x1c00 - 1e56: 80 e0 ldi r24, 0x00 ; 0 - Checksum = CHECKSUM_INIT_VALUE; - State = STATE_RECEIVE_FRAMENUM1; - } else if (Byte == BYTE_EOT) { - /* Transmission finished */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - 1e58: 90 e2 ldi r25, 0x20 ; 32 - 1e5a: 68 e1 ldi r22, 0x18 ; 24 - default: - return false; - break; - } + 1cf2: 81 e0 ldi r24, 0x01 ; 1 + 1cf4: ea ce rjmp .-556 ; 0x1aca + 1cf6: 68 e1 ldi r22, 0x18 ; 24 + 1cf8: 80 e0 ldi r24, 0x00 ; 0 + 1cfa: 90 e2 ldi r25, 0x20 ; 32 + 1cfc: 0e 94 00 22 call 0x4400 ; 0x4400 + 1d00: dc ce rjmp .-584 ; 0x1aba + 1d02: 80 91 96 20 lds r24, 0x2096 + 1d06: 8f 5f subi r24, 0xFF ; 255 + 1d08: 67 cf rjmp .-306 ; 0x1bd8 - return true; - 1e5c: 0e 94 81 24 call 0x4902 ; 0x4902 - 1e60: c7 ce rjmp .-626 ; 0x1bf0 - 1e62: 80 91 a6 20 lds r24, 0x20A6 - 1e66: 8f 5f subi r24, 0xFF ; 255 - 1e68: 54 cf rjmp .-344 ; 0x1d12 - -00001e6a : - 1e6a: 80 91 a5 20 lds r24, 0x20A5 - case STATE_SEND_WAIT: - if (Byte == BYTE_CAN) { - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - } else if (Byte == BYTE_ACK) { - 1e6e: 81 30 cpi r24, 0x01 ; 1 - 1e70: 71 f0 breq .+28 ; 0x1e8e - 1e72: 87 30 cpi r24, 0x07 ; 7 +00001d0a : } void XModemTick(void) { /* Timeouts go here */ switch(State) { - 1e74: 09 f0 breq .+2 ; 0x1e78 - 1e76: 08 95 ret + 1d0a: 80 91 95 20 lds r24, 0x2095 + 1d0e: 81 30 cpi r24, 0x01 ; 1 + 1d10: 71 f0 breq .+28 ; 0x1d2e + 1d12: 87 30 cpi r24, 0x07 ; 7 + 1d14: 09 f0 breq .+2 ; 0x1d18 + 1d16: 08 95 ret RetryTimeout = RECV_INIT_TIMEOUT; } break; case STATE_SEND_INIT: if (RetryTimeout-- == 0) { - 1e78: 80 91 a8 20 lds r24, 0x20A8 - 1e7c: 98 2f mov r25, r24 - 1e7e: 91 50 subi r25, 0x01 ; 1 - 1e80: 90 93 a8 20 sts 0x20A8, r25 - 1e84: 88 23 and r24, r24 - 1e86: b9 f7 brne .-18 ; 0x1e76 + 1d18: 80 91 98 20 lds r24, 0x2098 + 1d1c: 98 2f mov r25, r24 + 1d1e: 91 50 subi r25, 0x01 ; 1 + 1d20: 90 93 98 20 sts 0x2098, r25 + 1d24: 81 11 cpse r24, r1 + 1d26: f7 cf rjmp .-18 ; 0x1d16 /* Abort */ State = STATE_OFF; - 1e88: 10 92 a5 20 sts 0x20A5, r1 - 1e8c: 08 95 ret + 1d28: 10 92 95 20 sts 0x2095, r1 + 1d2c: 08 95 ret void XModemTick(void) { /* Timeouts go here */ switch(State) { case STATE_RECEIVE_INIT: if (RetryTimeout-- == 0) { - 1e8e: 80 91 a8 20 lds r24, 0x20A8 - 1e92: 98 2f mov r25, r24 - 1e94: 91 50 subi r25, 0x01 ; 1 - 1e96: 90 93 a8 20 sts 0x20A8, r25 - 1e9a: 88 23 and r24, r24 - 1e9c: 61 f7 brne .-40 ; 0x1e76 + 1d2e: 80 91 98 20 lds r24, 0x2098 + 1d32: 98 2f mov r25, r24 + 1d34: 91 50 subi r25, 0x01 ; 1 + 1d36: 90 93 98 20 sts 0x2098, r25 + 1d3a: 81 11 cpse r24, r1 + 1d3c: ec cf rjmp .-40 ; 0x1d16 if (RetryCount-- > 0) { - 1e9e: 80 91 a7 20 lds r24, 0x20A7 - 1ea2: 98 2f mov r25, r24 - 1ea4: 91 50 subi r25, 0x01 ; 1 - 1ea6: 90 93 a7 20 sts 0x20A7, r25 - 1eaa: 88 23 and r24, r24 - 1eac: 31 f4 brne .+12 ; 0x1eba + 1d3e: 80 91 97 20 lds r24, 0x2097 + 1d42: 98 2f mov r25, r24 + 1d44: 91 50 subi r25, 0x01 ; 1 + 1d46: 90 93 97 20 sts 0x2097, r25 + 1d4a: 81 11 cpse r24, r1 + 1d4c: 06 c0 rjmp .+12 ; 0x1d5a /* Put out communication request */ TerminalSendChar(BYTE_NAK); } else { /* Just shut off after some time. */ State = STATE_OFF; - 1eae: 10 92 a5 20 sts 0x20A5, r1 + 1d4e: 10 92 95 20 sts 0x2095, r1 } RetryTimeout = RECV_INIT_TIMEOUT; - 1eb2: 85 e0 ldi r24, 0x05 ; 5 - 1eb4: 80 93 a8 20 sts 0x20A8, r24 - 1eb8: 08 95 ret + 1d52: 85 e0 ldi r24, 0x05 ; 5 + 1d54: 80 93 98 20 sts 0x2098, r24 + 1d58: 08 95 ret void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } - 1eba: 80 e0 ldi r24, 0x00 ; 0 - 1ebc: 90 e2 ldi r25, 0x20 ; 32 - 1ebe: 65 e1 ldi r22, 0x15 ; 21 - 1ec0: 0e 94 81 24 call 0x4902 ; 0x4902 - 1ec4: f6 cf rjmp .-20 ; 0x1eb2 + 1d5a: 65 e1 ldi r22, 0x15 ; 21 + 1d5c: 80 e0 ldi r24, 0x00 ; 0 + 1d5e: 90 e2 ldi r25, 0x20 ; 32 + 1d60: 0e 94 00 22 call 0x4400 ; 0x4400 + 1d64: f6 cf rjmp .-20 ; 0x1d52 -00001ec6 : +00001d66 : void CommandLineInit(void) { BufferIdx = 0; } bool CommandLineProcessByte(uint8_t Byte) { - 1ec6: 1f 93 push r17 - 1ec8: cf 93 push r28 - 1eca: df 93 push r29 + 1d66: 1f 93 push r17 + 1d68: cf 93 push r28 + 1d6a: df 93 push r29 if (IS_CHARACTER(Byte)){ - 1ecc: 98 2f mov r25, r24 - 1ece: 91 54 subi r25, 0x41 ; 65 - 1ed0: 9a 31 cpi r25, 0x1A ; 26 - 1ed2: 20 f0 brcs .+8 ; 0x1edc - 1ed4: 90 52 subi r25, 0x20 ; 32 - 1ed6: 9a 31 cpi r25, 0x1A ; 26 - 1ed8: b8 f4 brcc .+46 ; 0x1f08 + 1d6c: 98 2f mov r25, r24 + 1d6e: 91 54 subi r25, 0x41 ; 65 + 1d70: 9a 31 cpi r25, 0x1A ; 26 + 1d72: 20 f0 brcs .+8 ; 0x1d7c + 1d74: 90 52 subi r25, 0x20 ; 32 + 1d76: 9a 31 cpi r25, 0x1A ; 26 + 1d78: b8 f4 brcc .+46 ; 0x1da8 /* Store uppercase character */ if (IS_LOWERCASE(Byte)) { Byte = TO_UPPERCASE(Byte); - 1eda: 80 52 subi r24, 0x20 ; 32 + 1d7a: 80 52 subi r24, 0x20 ; 32 } /* Prevent buffer overflow and account for '\0' */ if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { - 1edc: 20 91 b3 20 lds r18, 0x20B3 - 1ee0: 30 91 b4 20 lds r19, 0x20B4 - 1ee4: 2f 3f cpi r18, 0xFF ; 255 - 1ee6: 31 05 cpc r19, r1 - 1ee8: 50 f4 brcc .+20 ; 0x1efe + 1d7c: 20 91 a3 20 lds r18, 0x20A3 + 1d80: 30 91 a4 20 lds r19, 0x20A4 + 1d84: 2f 3f cpi r18, 0xFF ; 255 + 1d86: 31 05 cpc r19, r1 + 1d88: 50 f4 brcc .+20 ; 0x1d9e TerminalBuffer[BufferIdx++] = Byte; - 1eea: f9 01 movw r30, r18 - 1eec: e0 5e subi r30, 0xE0 ; 224 - 1eee: fe 4d sbci r31, 0xDE ; 222 - 1ef0: 80 83 st Z, r24 - 1ef2: 2f 5f subi r18, 0xFF ; 255 - 1ef4: 3f 4f sbci r19, 0xFF ; 255 - 1ef6: 20 93 b3 20 sts 0x20B3, r18 - 1efa: 30 93 b4 20 sts 0x20B4, r19 + 1d8a: f9 01 movw r30, r18 + 1d8c: e0 5f subi r30, 0xF0 ; 240 + 1d8e: fe 4d sbci r31, 0xDE ; 222 + 1d90: 80 83 st Z, r24 + 1d92: 2f 5f subi r18, 0xFF ; 255 + 1d94: 3f 4f sbci r19, 0xFF ; 255 + 1d96: 20 93 a3 20 sts 0x20A3, r18 + 1d9a: 30 93 a4 20 sts 0x20A4, r19 } else { /* Ignore other chars */ } return true; } - 1efe: 81 e0 ldi r24, 0x01 ; 1 - 1f00: df 91 pop r29 - 1f02: cf 91 pop r28 - 1f04: 1f 91 pop r17 - 1f06: 08 95 ret + 1d9e: 81 e0 ldi r24, 0x01 ; 1 + 1da0: df 91 pop r29 + 1da2: cf 91 pop r28 + 1da4: 1f 91 pop r17 + 1da6: 08 95 ret { BufferIdx = 0; } bool CommandLineProcessByte(uint8_t Byte) { if (IS_CHARACTER(Byte)){ - 1f08: 9f 5c subi r25, 0xCF ; 207 - 1f0a: 9a 30 cpi r25, 0x0A ; 10 - 1f0c: 38 f3 brcs .-50 ; 0x1edc - 1f0e: 8f 35 cpi r24, 0x5F ; 95 - 1f10: 29 f3 breq .-54 ; 0x1edc - 1f12: 8f 33 cpi r24, 0x3F ; 63 - 1f14: 19 f3 breq .-58 ; 0x1edc - 1f16: 8d 33 cpi r24, 0x3D ; 61 - 1f18: 09 f3 breq .-62 ; 0x1edc + 1da8: 9f 5c subi r25, 0xCF ; 207 + 1daa: 9a 30 cpi r25, 0x0A ; 10 + 1dac: 38 f3 brcs .-50 ; 0x1d7c + 1dae: 8f 35 cpi r24, 0x5F ; 95 + 1db0: 29 f3 breq .-54 ; 0x1d7c + 1db2: 8f 33 cpi r24, 0x3F ; 63 + 1db4: 19 f3 breq .-58 ; 0x1d7c + 1db6: 8d 33 cpi r24, 0x3D ; 61 + 1db8: 09 f3 breq .-62 ; 0x1d7c /* Prevent buffer overflow and account for '\0' */ if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { TerminalBuffer[BufferIdx++] = Byte; } }else if (Byte == '\r') { - 1f1a: 8d 30 cpi r24, 0x0D ; 13 - 1f1c: a9 f0 breq .+42 ; 0x1f48 + 1dba: 8d 30 cpi r24, 0x0D ; 13 + 1dbc: a9 f0 breq .+42 ; 0x1de8 /* Process on \r. Terminate string and decode. */ TerminalBuffer[BufferIdx] = '\0'; BufferIdx = 0; DecodeCommand(); }else if (Byte == '\b') { - 1f1e: 88 30 cpi r24, 0x08 ; 8 - 1f20: 39 f0 breq .+14 ; 0x1f30 + 1dbe: 88 30 cpi r24, 0x08 ; 8 + 1dc0: 39 f0 breq .+14 ; 0x1dd0 /* Backspace. Delete last character in buffer. */ if (BufferIdx > 0) { BufferIdx--; } } else if (Byte == 0x1B){ - 1f22: 8b 31 cpi r24, 0x1B ; 27 - 1f24: 61 f7 brne .-40 ; 0x1efe + 1dc2: 8b 31 cpi r24, 0x1B ; 27 + 1dc4: 61 f7 brne .-40 ; 0x1d9e /* Drop buffer on escape */ BufferIdx = 0; - 1f26: 10 92 b3 20 sts 0x20B3, r1 - 1f2a: 10 92 b4 20 sts 0x20B4, r1 - 1f2e: e7 cf rjmp .-50 ; 0x1efe + 1dc6: 10 92 a3 20 sts 0x20A3, r1 + 1dca: 10 92 a4 20 sts 0x20A4, r1 + 1dce: e7 cf rjmp .-50 ; 0x1d9e BufferIdx = 0; DecodeCommand(); }else if (Byte == '\b') { /* Backspace. Delete last character in buffer. */ if (BufferIdx > 0) { - 1f30: 80 91 b3 20 lds r24, 0x20B3 - 1f34: 90 91 b4 20 lds r25, 0x20B4 - 1f38: 00 97 sbiw r24, 0x00 ; 0 - 1f3a: 09 f3 breq .-62 ; 0x1efe + 1dd0: 80 91 a3 20 lds r24, 0x20A3 + 1dd4: 90 91 a4 20 lds r25, 0x20A4 + 1dd8: 00 97 sbiw r24, 0x00 ; 0 + 1dda: 09 f3 breq .-62 ; 0x1d9e BufferIdx--; - 1f3c: 01 97 sbiw r24, 0x01 ; 1 - 1f3e: 80 93 b3 20 sts 0x20B3, r24 - 1f42: 90 93 b4 20 sts 0x20B4, r25 - 1f46: db cf rjmp .-74 ; 0x1efe + 1ddc: 01 97 sbiw r24, 0x01 ; 1 + 1dde: 80 93 a3 20 sts 0x20A3, r24 + 1de2: 90 93 a4 20 sts 0x20A4, r25 + 1de6: db cf rjmp .-74 ; 0x1d9e if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { TerminalBuffer[BufferIdx++] = Byte; } }else if (Byte == '\r') { /* Process on \r. Terminate string and decode. */ TerminalBuffer[BufferIdx] = '\0'; - 1f48: e0 91 b3 20 lds r30, 0x20B3 - 1f4c: f0 91 b4 20 lds r31, 0x20B4 - 1f50: e0 5e subi r30, 0xE0 ; 224 - 1f52: fe 4d sbci r31, 0xDE ; 222 - 1f54: 10 82 st Z, r1 + 1de8: e0 91 a3 20 lds r30, 0x20A3 + 1dec: f0 91 a4 20 lds r31, 0x20A4 + 1df0: e0 5f subi r30, 0xF0 ; 240 + 1df2: fe 4d sbci r31, 0xDE ; 222 + 1df4: 10 82 st Z, r1 BufferIdx = 0; - 1f56: 10 92 b3 20 sts 0x20B3, r1 - 1f5a: 10 92 b4 20 sts 0x20B4, r1 + 1df6: 10 92 a3 20 sts 0x20A3, r1 + 1dfa: 10 92 a4 20 sts 0x20A4, r1 bool CommandFound = false; CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; char* pTerminalBuffer = (char*) TerminalBuffer; /* Do some sanity check first */ if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { - 1f5e: 80 91 20 21 lds r24, 0x2120 - 1f62: 88 23 and r24, r24 - 1f64: 09 f4 brne .+2 ; 0x1f68 - 1f66: a7 c0 rjmp .+334 ; 0x20b6 - 1f68: 8f 33 cpi r24, 0x3F ; 63 - 1f6a: 09 f4 brne .+2 ; 0x1f6e - 1f6c: a4 c0 rjmp .+328 ; 0x20b6 - 1f6e: 8d 33 cpi r24, 0x3D ; 61 - 1f70: 09 f4 brne .+2 ; 0x1f74 - 1f72: a1 c0 rjmp .+322 ; 0x20b6 - 1f74: e1 e2 ldi r30, 0x21 ; 33 - 1f76: f1 e2 ldi r31, 0x21 ; 33 - 1f78: ef 01 movw r28, r30 - 1f7a: 21 97 sbiw r28, 0x01 ; 1 - 1f7c: 06 c0 rjmp .+12 ; 0x1f8a + 1dfe: 80 91 10 21 lds r24, 0x2110 + 1e02: 88 23 and r24, r24 + 1e04: 09 f4 brne .+2 ; 0x1e08 + 1e06: a2 c0 rjmp .+324 ; 0x1f4c + 1e08: 8f 33 cpi r24, 0x3F ; 63 + 1e0a: 09 f4 brne .+2 ; 0x1e0e + 1e0c: 9f c0 rjmp .+318 ; 0x1f4c + 1e0e: 8d 33 cpi r24, 0x3D ; 61 + 1e10: 09 f4 brne .+2 ; 0x1e14 + 1e12: 9c c0 rjmp .+312 ; 0x1f4c + 1e14: e1 e1 ldi r30, 0x11 ; 17 + 1e16: f1 e2 ldi r31, 0x21 ; 33 + 1e18: 04 c0 rjmp .+8 ; 0x1e22 char* pCommandDelimiter = pTerminalBuffer; char CommandDelimiter = '\0'; /* Search for command delimiter, store it and replace with '\0' */ while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 1f7e: 8f 33 cpi r24, 0x3F ; 63 - 1f80: 09 f4 brne .+2 ; 0x1f84 - 1f82: d3 c0 rjmp .+422 ; 0x212a - 1f84: 8d 33 cpi r24, 0x3D ; 61 - 1f86: 09 f4 brne .+2 ; 0x1f8a - 1f88: ce c0 rjmp .+412 ; 0x2126 + 1e1a: 1f 33 cpi r17, 0x3F ; 63 + 1e1c: 31 f0 breq .+12 ; 0x1e2a + 1e1e: 1d 33 cpi r17, 0x3D ; 61 + 1e20: 21 f0 breq .+8 ; 0x1e2a pCommandDelimiter++; - 1f8a: 21 96 adiw r28, 0x01 ; 1 + 1e22: ef 01 movw r28, r30 if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { char* pCommandDelimiter = pTerminalBuffer; char CommandDelimiter = '\0'; /* Search for command delimiter, store it and replace with '\0' */ while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 1f8c: 81 91 ld r24, Z+ - 1f8e: 88 23 and r24, r24 - 1f90: b1 f7 brne .-20 ; 0x1f7e - 1f92: 10 e0 ldi r17, 0x00 ; 0 + 1e24: 11 91 ld r17, Z+ + 1e26: 11 11 cpse r17, r1 + 1e28: f8 cf rjmp .-16 ; 0x1e1a pCommandDelimiter++; CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; - 1f94: 18 82 st Y, r1 + 1e2a: 18 82 st Y, r1 /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 1f96: 80 e2 ldi r24, 0x20 ; 32 - 1f98: 91 e2 ldi r25, 0x21 ; 33 - 1f9a: 6b e3 ldi r22, 0x3B ; 59 - 1f9c: 74 e0 ldi r23, 0x04 ; 4 - 1f9e: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1fa2: 00 97 sbiw r24, 0x00 ; 0 - 1fa4: 09 f4 brne .+2 ; 0x1fa8 - 1fa6: 20 c1 rjmp .+576 ; 0x21e8 - 1fa8: 80 e2 ldi r24, 0x20 ; 32 - 1faa: 91 e2 ldi r25, 0x21 ; 33 - 1fac: 61 e5 ldi r22, 0x51 ; 81 - 1fae: 74 e0 ldi r23, 0x04 ; 4 - 1fb0: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1fb4: 00 97 sbiw r24, 0x00 ; 0 - 1fb6: 09 f4 brne .+2 ; 0x1fba - 1fb8: 15 c1 rjmp .+554 ; 0x21e4 - 1fba: 80 e2 ldi r24, 0x20 ; 32 - 1fbc: 91 e2 ldi r25, 0x21 ; 33 - 1fbe: 67 e6 ldi r22, 0x67 ; 103 - 1fc0: 74 e0 ldi r23, 0x04 ; 4 - 1fc2: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1fc6: 00 97 sbiw r24, 0x00 ; 0 - 1fc8: 09 f4 brne .+2 ; 0x1fcc - 1fca: 06 c1 rjmp .+524 ; 0x21d8 - 1fcc: 80 e2 ldi r24, 0x20 ; 32 - 1fce: 91 e2 ldi r25, 0x21 ; 33 - 1fd0: 6d e7 ldi r22, 0x7D ; 125 - 1fd2: 74 e0 ldi r23, 0x04 ; 4 - 1fd4: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1fd8: 00 97 sbiw r24, 0x00 ; 0 - 1fda: 09 f4 brne .+2 ; 0x1fde - 1fdc: fb c0 rjmp .+502 ; 0x21d4 - 1fde: 80 e2 ldi r24, 0x20 ; 32 - 1fe0: 91 e2 ldi r25, 0x21 ; 33 - 1fe2: 63 e9 ldi r22, 0x93 ; 147 - 1fe4: 74 e0 ldi r23, 0x04 ; 4 - 1fe6: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1fea: 00 97 sbiw r24, 0x00 ; 0 - 1fec: 09 f4 brne .+2 ; 0x1ff0 - 1fee: f0 c0 rjmp .+480 ; 0x21d0 - 1ff0: 80 e2 ldi r24, 0x20 ; 32 - 1ff2: 91 e2 ldi r25, 0x21 ; 33 - 1ff4: 69 ea ldi r22, 0xA9 ; 169 - 1ff6: 74 e0 ldi r23, 0x04 ; 4 - 1ff8: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 1ffc: 00 97 sbiw r24, 0x00 ; 0 - 1ffe: 09 f4 brne .+2 ; 0x2002 - 2000: b5 c0 rjmp .+362 ; 0x216c - 2002: 80 e2 ldi r24, 0x20 ; 32 - 2004: 91 e2 ldi r25, 0x21 ; 33 - 2006: 6f eb ldi r22, 0xBF ; 191 - 2008: 74 e0 ldi r23, 0x04 ; 4 - 200a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 200e: 00 97 sbiw r24, 0x00 ; 0 - 2010: 09 f4 brne .+2 ; 0x2014 - 2012: fa c0 rjmp .+500 ; 0x2208 - 2014: 80 e2 ldi r24, 0x20 ; 32 - 2016: 91 e2 ldi r25, 0x21 ; 33 - 2018: 65 ed ldi r22, 0xD5 ; 213 - 201a: 74 e0 ldi r23, 0x04 ; 4 - 201c: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 2020: 00 97 sbiw r24, 0x00 ; 0 - 2022: 09 f4 brne .+2 ; 0x2026 - 2024: ef c0 rjmp .+478 ; 0x2204 - 2026: 80 e2 ldi r24, 0x20 ; 32 - 2028: 91 e2 ldi r25, 0x21 ; 33 - 202a: 6b ee ldi r22, 0xEB ; 235 - 202c: 74 e0 ldi r23, 0x04 ; 4 - 202e: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 2032: 00 97 sbiw r24, 0x00 ; 0 - 2034: 09 f4 brne .+2 ; 0x2038 - 2036: e4 c0 rjmp .+456 ; 0x2200 - 2038: 80 e2 ldi r24, 0x20 ; 32 - 203a: 91 e2 ldi r25, 0x21 ; 33 - 203c: 61 e0 ldi r22, 0x01 ; 1 - 203e: 75 e0 ldi r23, 0x05 ; 5 - 2040: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 2044: 00 97 sbiw r24, 0x00 ; 0 - 2046: 09 f4 brne .+2 ; 0x204a - 2048: d9 c0 rjmp .+434 ; 0x21fc - 204a: 80 e2 ldi r24, 0x20 ; 32 - 204c: 91 e2 ldi r25, 0x21 ; 33 - 204e: 67 e1 ldi r22, 0x17 ; 23 - 2050: 75 e0 ldi r23, 0x05 ; 5 - 2052: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 2056: 00 97 sbiw r24, 0x00 ; 0 - 2058: 09 f4 brne .+2 ; 0x205c - 205a: ce c0 rjmp .+412 ; 0x21f8 - 205c: 80 e2 ldi r24, 0x20 ; 32 - 205e: 91 e2 ldi r25, 0x21 ; 33 - 2060: 6d e2 ldi r22, 0x2D ; 45 - 2062: 75 e0 ldi r23, 0x05 ; 5 - 2064: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 2068: 00 97 sbiw r24, 0x00 ; 0 - 206a: 09 f4 brne .+2 ; 0x206e - 206c: c3 c0 rjmp .+390 ; 0x21f4 - 206e: 80 e2 ldi r24, 0x20 ; 32 - 2070: 91 e2 ldi r25, 0x21 ; 33 - 2072: 63 e4 ldi r22, 0x43 ; 67 - 2074: 75 e0 ldi r23, 0x05 ; 5 - 2076: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 207a: 00 97 sbiw r24, 0x00 ; 0 - 207c: 09 f4 brne .+2 ; 0x2080 - 207e: b8 c0 rjmp .+368 ; 0x21f0 - 2080: 80 e2 ldi r24, 0x20 ; 32 - 2082: 91 e2 ldi r25, 0x21 ; 33 - 2084: 69 e5 ldi r22, 0x59 ; 89 - 2086: 75 e0 ldi r23, 0x05 ; 5 - 2088: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 208c: 00 97 sbiw r24, 0x00 ; 0 - 208e: 09 f4 brne .+2 ; 0x2092 - 2090: ad c0 rjmp .+346 ; 0x21ec - 2092: 80 e2 ldi r24, 0x20 ; 32 - 2094: 91 e2 ldi r25, 0x21 ; 33 - 2096: 6f e6 ldi r22, 0x6F ; 111 - 2098: 75 e0 ldi r23, 0x05 ; 5 - 209a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 209e: 00 97 sbiw r24, 0x00 ; 0 - 20a0: 09 f4 brne .+2 ; 0x20a4 - 20a2: 9e c0 rjmp .+316 ; 0x21e0 - 20a4: 80 e2 ldi r24, 0x20 ; 32 - 20a6: 91 e2 ldi r25, 0x21 ; 33 - 20a8: 65 e8 ldi r22, 0x85 ; 133 - 20aa: 75 e0 ldi r23, 0x05 ; 5 - 20ac: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 - 20b0: 00 97 sbiw r24, 0x00 ; 0 - 20b2: 09 f4 brne .+2 ; 0x20b6 - 20b4: 93 c0 rjmp .+294 ; 0x21dc + 1e2c: 6b e3 ldi r22, 0x3B ; 59 + 1e2e: 74 e0 ldi r23, 0x04 ; 4 + 1e30: 80 e1 ldi r24, 0x10 ; 16 + 1e32: 91 e2 ldi r25, 0x21 ; 33 + 1e34: 0e 94 16 24 call 0x482c ; 0x482c + 1e38: 89 2b or r24, r25 + 1e3a: 09 f4 brne .+2 ; 0x1e3e + 1e3c: 32 c1 rjmp .+612 ; 0x20a2 + 1e3e: 61 e5 ldi r22, 0x51 ; 81 + 1e40: 74 e0 ldi r23, 0x04 ; 4 + 1e42: 80 e1 ldi r24, 0x10 ; 16 + 1e44: 91 e2 ldi r25, 0x21 ; 33 + 1e46: 0e 94 16 24 call 0x482c ; 0x482c + 1e4a: 89 2b or r24, r25 + 1e4c: 09 f4 brne .+2 ; 0x1e50 + 1e4e: 26 c1 rjmp .+588 ; 0x209c + 1e50: 67 e6 ldi r22, 0x67 ; 103 + 1e52: 74 e0 ldi r23, 0x04 ; 4 + 1e54: 80 e1 ldi r24, 0x10 ; 16 + 1e56: 91 e2 ldi r25, 0x21 ; 33 + 1e58: 0e 94 16 24 call 0x482c ; 0x482c + 1e5c: 89 2b or r24, r25 + 1e5e: 09 f4 brne .+2 ; 0x1e62 + 1e60: 1a c1 rjmp .+564 ; 0x2096 + 1e62: 6d e7 ldi r22, 0x7D ; 125 + 1e64: 74 e0 ldi r23, 0x04 ; 4 + 1e66: 80 e1 ldi r24, 0x10 ; 16 + 1e68: 91 e2 ldi r25, 0x21 ; 33 + 1e6a: 0e 94 16 24 call 0x482c ; 0x482c + 1e6e: 89 2b or r24, r25 + 1e70: 09 f4 brne .+2 ; 0x1e74 + 1e72: 0e c1 rjmp .+540 ; 0x2090 + 1e74: 63 e9 ldi r22, 0x93 ; 147 + 1e76: 74 e0 ldi r23, 0x04 ; 4 + 1e78: 80 e1 ldi r24, 0x10 ; 16 + 1e7a: 91 e2 ldi r25, 0x21 ; 33 + 1e7c: 0e 94 16 24 call 0x482c ; 0x482c + 1e80: 89 2b or r24, r25 + 1e82: 09 f4 brne .+2 ; 0x1e86 + 1e84: 02 c1 rjmp .+516 ; 0x208a + 1e86: 69 ea ldi r22, 0xA9 ; 169 + 1e88: 74 e0 ldi r23, 0x04 ; 4 + 1e8a: 80 e1 ldi r24, 0x10 ; 16 + 1e8c: 91 e2 ldi r25, 0x21 ; 33 + 1e8e: 0e 94 16 24 call 0x482c ; 0x482c + 1e92: 89 2b or r24, r25 + 1e94: 09 f4 brne .+2 ; 0x1e98 + 1e96: f6 c0 rjmp .+492 ; 0x2084 + 1e98: 6f eb ldi r22, 0xBF ; 191 + 1e9a: 74 e0 ldi r23, 0x04 ; 4 + 1e9c: 80 e1 ldi r24, 0x10 ; 16 + 1e9e: 91 e2 ldi r25, 0x21 ; 33 + 1ea0: 0e 94 16 24 call 0x482c ; 0x482c + 1ea4: 89 2b or r24, r25 + 1ea6: 09 f4 brne .+2 ; 0x1eaa + 1ea8: ea c0 rjmp .+468 ; 0x207e + 1eaa: 65 ed ldi r22, 0xD5 ; 213 + 1eac: 74 e0 ldi r23, 0x04 ; 4 + 1eae: 80 e1 ldi r24, 0x10 ; 16 + 1eb0: 91 e2 ldi r25, 0x21 ; 33 + 1eb2: 0e 94 16 24 call 0x482c ; 0x482c + 1eb6: 89 2b or r24, r25 + 1eb8: 09 f4 brne .+2 ; 0x1ebc + 1eba: de c0 rjmp .+444 ; 0x2078 + 1ebc: 6b ee ldi r22, 0xEB ; 235 + 1ebe: 74 e0 ldi r23, 0x04 ; 4 + 1ec0: 80 e1 ldi r24, 0x10 ; 16 + 1ec2: 91 e2 ldi r25, 0x21 ; 33 + 1ec4: 0e 94 16 24 call 0x482c ; 0x482c + 1ec8: 89 2b or r24, r25 + 1eca: 09 f4 brne .+2 ; 0x1ece + 1ecc: d2 c0 rjmp .+420 ; 0x2072 + 1ece: 61 e0 ldi r22, 0x01 ; 1 + 1ed0: 75 e0 ldi r23, 0x05 ; 5 + 1ed2: 80 e1 ldi r24, 0x10 ; 16 + 1ed4: 91 e2 ldi r25, 0x21 ; 33 + 1ed6: 0e 94 16 24 call 0x482c ; 0x482c + 1eda: 89 2b or r24, r25 + 1edc: 09 f4 brne .+2 ; 0x1ee0 + 1ede: c6 c0 rjmp .+396 ; 0x206c + 1ee0: 67 e1 ldi r22, 0x17 ; 23 + 1ee2: 75 e0 ldi r23, 0x05 ; 5 + 1ee4: 80 e1 ldi r24, 0x10 ; 16 + 1ee6: 91 e2 ldi r25, 0x21 ; 33 + 1ee8: 0e 94 16 24 call 0x482c ; 0x482c + 1eec: 89 2b or r24, r25 + 1eee: 09 f4 brne .+2 ; 0x1ef2 + 1ef0: ba c0 rjmp .+372 ; 0x2066 + 1ef2: 6d e2 ldi r22, 0x2D ; 45 + 1ef4: 75 e0 ldi r23, 0x05 ; 5 + 1ef6: 80 e1 ldi r24, 0x10 ; 16 + 1ef8: 91 e2 ldi r25, 0x21 ; 33 + 1efa: 0e 94 16 24 call 0x482c ; 0x482c + 1efe: 89 2b or r24, r25 + 1f00: 09 f4 brne .+2 ; 0x1f04 + 1f02: ae c0 rjmp .+348 ; 0x2060 + 1f04: 63 e4 ldi r22, 0x43 ; 67 + 1f06: 75 e0 ldi r23, 0x05 ; 5 + 1f08: 80 e1 ldi r24, 0x10 ; 16 + 1f0a: 91 e2 ldi r25, 0x21 ; 33 + 1f0c: 0e 94 16 24 call 0x482c ; 0x482c + 1f10: 89 2b or r24, r25 + 1f12: 09 f4 brne .+2 ; 0x1f16 + 1f14: a2 c0 rjmp .+324 ; 0x205a + 1f16: 69 e5 ldi r22, 0x59 ; 89 + 1f18: 75 e0 ldi r23, 0x05 ; 5 + 1f1a: 80 e1 ldi r24, 0x10 ; 16 + 1f1c: 91 e2 ldi r25, 0x21 ; 33 + 1f1e: 0e 94 16 24 call 0x482c ; 0x482c + 1f22: 89 2b or r24, r25 + 1f24: 09 f4 brne .+2 ; 0x1f28 + 1f26: 96 c0 rjmp .+300 ; 0x2054 + 1f28: 6f e6 ldi r22, 0x6F ; 111 + 1f2a: 75 e0 ldi r23, 0x05 ; 5 + 1f2c: 80 e1 ldi r24, 0x10 ; 16 + 1f2e: 91 e2 ldi r25, 0x21 ; 33 + 1f30: 0e 94 16 24 call 0x482c ; 0x482c + 1f34: 89 2b or r24, r25 + 1f36: 09 f4 brne .+2 ; 0x1f3a + 1f38: 8a c0 rjmp .+276 ; 0x204e + 1f3a: 65 e8 ldi r22, 0x85 ; 133 + 1f3c: 75 e0 ldi r23, 0x05 ; 5 + 1f3e: 80 e1 ldi r24, 0x10 ; 16 + 1f40: 91 e2 ldi r25, 0x21 ; 33 + 1f42: 0e 94 16 24 call 0x482c ; 0x482c + 1f46: 89 2b or r24, r25 + 1f48: 09 f4 brne .+2 ; 0x1f4c + 1f4a: 52 c0 rjmp .+164 ; 0x1ff0 static void DecodeCommand(void) { uint8_t i; bool CommandFound = false; CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; - 20b6: 88 ec ldi r24, 0xC8 ; 200 + 1f4c: 88 ec ldi r24, 0xC8 ; 200 } static void DecodeCommand(void) { uint8_t i; bool CommandFound = false; - 20b8: c0 e0 ldi r28, 0x00 ; 0 + 1f4e: c0 e0 ldi r28, 0x00 ; 0 static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 20ba: e1 ea ldi r30, 0xA1 ; 161 - 20bc: f5 e0 ldi r31, 0x05 ; 5 - 20be: 94 91 lpm r25, Z - 20c0: 89 17 cp r24, r25 - 20c2: 09 f4 brne .+2 ; 0x20c6 - 20c4: 50 c0 rjmp .+160 ; 0x2166 - 20c6: b1 96 adiw r30, 0x21 ; 33 - 20c8: e4 91 lpm r30, Z - 20ca: 8e 17 cp r24, r30 - 20cc: 09 f4 brne .+2 ; 0x20d0 - 20ce: 48 c0 rjmp .+144 ; 0x2160 - 20d0: e3 ee ldi r30, 0xE3 ; 227 - 20d2: f5 e0 ldi r31, 0x05 ; 5 - 20d4: e4 91 lpm r30, Z - 20d6: 8e 17 cp r24, r30 - 20d8: 09 f4 brne .+2 ; 0x20dc - 20da: 3f c0 rjmp .+126 ; 0x215a - 20dc: e4 e0 ldi r30, 0x04 ; 4 - 20de: f6 e0 ldi r31, 0x06 ; 6 - 20e0: e4 91 lpm r30, Z - 20e2: 8e 17 cp r24, r30 - 20e4: 09 f4 brne .+2 ; 0x20e8 - 20e6: 36 c0 rjmp .+108 ; 0x2154 - 20e8: e5 e2 ldi r30, 0x25 ; 37 - 20ea: f6 e0 ldi r31, 0x06 ; 6 - 20ec: e4 91 lpm r30, Z - 20ee: 8e 17 cp r24, r30 - 20f0: 71 f1 breq .+92 ; 0x214e - 20f2: e6 e4 ldi r30, 0x46 ; 70 - 20f4: f6 e0 ldi r31, 0x06 ; 6 - 20f6: e4 91 lpm r30, Z - 20f8: 8e 17 cp r24, r30 - 20fa: c9 f0 breq .+50 ; 0x212e + 1f50: e1 ea ldi r30, 0xA1 ; 161 + 1f52: f5 e0 ldi r31, 0x05 ; 5 + 1f54: e4 91 lpm r30, Z + 1f56: 8e 17 cp r24, r30 + 1f58: 09 f4 brne .+2 ; 0x1f5c + 1f5a: 30 c0 rjmp .+96 ; 0x1fbc + 1f5c: e2 ec ldi r30, 0xC2 ; 194 + 1f5e: f5 e0 ldi r31, 0x05 ; 5 + 1f60: e4 91 lpm r30, Z + 1f62: 8e 17 cp r24, r30 + 1f64: 09 f4 brne .+2 ; 0x1f68 + 1f66: 41 c0 rjmp .+130 ; 0x1fea + 1f68: e3 ee ldi r30, 0xE3 ; 227 + 1f6a: f5 e0 ldi r31, 0x05 ; 5 + 1f6c: e4 91 lpm r30, Z + 1f6e: 8e 17 cp r24, r30 + 1f70: 09 f4 brne .+2 ; 0x1f74 + 1f72: 38 c0 rjmp .+112 ; 0x1fe4 + 1f74: e4 e0 ldi r30, 0x04 ; 4 + 1f76: f6 e0 ldi r31, 0x06 ; 6 + 1f78: e4 91 lpm r30, Z + 1f7a: 8e 17 cp r24, r30 + 1f7c: 81 f1 breq .+96 ; 0x1fde + 1f7e: e5 e2 ldi r30, 0x25 ; 37 + 1f80: f6 e0 ldi r31, 0x06 ; 6 + 1f82: e4 91 lpm r30, Z + 1f84: 8e 17 cp r24, r30 + 1f86: 41 f1 breq .+80 ; 0x1fd8 + 1f88: e6 e4 ldi r30, 0x46 ; 70 + 1f8a: f6 e0 ldi r31, 0x06 ; 6 + 1f8c: e4 91 lpm r30, Z + 1f8e: 8e 17 cp r24, r30 + 1f90: 01 f1 breq .+64 ; 0x1fd2 return StatusTable[i].Message; } return (void*) 0; - 20fc: 80 e0 ldi r24, 0x00 ; 0 - 20fe: 90 e0 ldi r25, 0x00 ; 0 + 1f92: 80 e0 ldi r24, 0x00 ; 0 + 1f94: 90 e0 ldi r25, 0x00 ; 0 } } } /* Send command status message */ TerminalSendStringP(GetStatusMessageP(StatusId)); - 2100: 71 da rcall .-2846 ; 0x15e4 - 2102: 8b e9 ldi r24, 0x9B ; 155 + 1f96: e0 da rcall .-2624 ; 0x1558 TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); - 2104: 95 e0 ldi r25, 0x05 ; 5 - 2106: 6e da rcall .-2852 ; 0x15e4 - 2108: cc 23 and r28, r28 - 210a: 09 f4 brne .+2 ; 0x210e + 1f98: 8b e9 ldi r24, 0x9B ; 155 + 1f9a: 95 e0 ldi r25, 0x05 ; 5 + 1f9c: dd da rcall .-2630 ; 0x1558 if (CommandFound && (pTerminalBuffer[0] != '\0') ) { - 210c: f8 ce rjmp .-528 ; 0x1efe - 210e: 80 91 20 21 lds r24, 0x2120 - 2112: 88 23 and r24, r24 - 2114: 09 f4 brne .+2 ; 0x2118 - 2116: f3 ce rjmp .-538 ; 0x1efe - 2118: 80 e2 ldi r24, 0x20 ; 32 - 211a: 91 e2 ldi r25, 0x21 ; 33 + 1f9e: cc 23 and r28, r28 + 1fa0: 09 f4 brne .+2 ; 0x1fa4 + 1fa2: fd ce rjmp .-518 ; 0x1d9e + 1fa4: 80 91 10 21 lds r24, 0x2110 + 1fa8: 88 23 and r24, r24 + 1faa: 09 f4 brne .+2 ; 0x1fae + 1fac: f8 ce rjmp .-528 ; 0x1d9e /* Send optional answer */ TerminalSendString(pTerminalBuffer); - 211c: 5e da rcall .-2884 ; 0x15da - 211e: 8e e9 ldi r24, 0x9E ; 158 - 2120: 95 e0 ldi r25, 0x05 ; 5 - 2122: 60 da rcall .-2880 ; 0x15e4 + 1fae: 80 e1 ldi r24, 0x10 ; 16 + 1fb0: 91 e2 ldi r25, 0x21 ; 33 + 1fb2: cd da rcall .-2662 ; 0x154e TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); - 2124: ec ce rjmp .-552 ; 0x1efe - 2126: 1d e3 ldi r17, 0x3D ; 61 - 2128: 35 cf rjmp .-406 ; 0x1f94 - 212a: 1f e3 ldi r17, 0x3F ; 63 - 212c: 33 cf rjmp .-410 ; 0x1f94 - if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { - char* pCommandDelimiter = pTerminalBuffer; - char CommandDelimiter = '\0'; - - /* Search for command delimiter, store it and replace with '\0' */ - while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 212e: 25 e0 ldi r18, 0x05 ; 5 - 2130: 30 e0 ldi r19, 0x00 ; 0 - 2132: c9 01 movw r24, r18 - 2134: 88 0f add r24, r24 + 1fb4: 8e e9 ldi r24, 0x9E ; 158 + 1fb6: 95 e0 ldi r25, 0x05 ; 5 + 1fb8: cf da rcall .-2658 ; 0x1558 + 1fba: f1 ce rjmp .-542 ; 0x1d9e static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 2136: 99 1f adc r25, r25 - 2138: 82 95 swap r24 + 1fbc: 20 e0 ldi r18, 0x00 ; 0 + 1fbe: 30 e0 ldi r19, 0x00 ; 0 return StatusTable[i].Message; - 213a: 92 95 swap r25 - 213c: 90 7f andi r25, 0xF0 ; 240 - 213e: 98 27 eor r25, r24 - 2140: 80 7f andi r24, 0xF0 ; 240 - 2142: 98 27 eor r25, r24 - 2144: 82 0f add r24, r18 - 2146: 93 1f adc r25, r19 - 2148: 8e 55 subi r24, 0x5E ; 94 - 214a: 9a 4f sbci r25, 0xFA ; 250 - 214c: d9 cf rjmp .-78 ; 0x2100 - 214e: 24 e0 ldi r18, 0x04 ; 4 - 2150: 30 e0 ldi r19, 0x00 ; 0 - 2152: ef cf rjmp .-34 ; 0x2132 - 2154: 23 e0 ldi r18, 0x03 ; 3 + 1fc0: 41 e2 ldi r20, 0x21 ; 33 + 1fc2: 42 9f mul r20, r18 + 1fc4: c0 01 movw r24, r0 + 1fc6: 43 9f mul r20, r19 + 1fc8: 90 0d add r25, r0 + 1fca: 11 24 eor r1, r1 + 1fcc: 8e 55 subi r24, 0x5E ; 94 + 1fce: 9a 4f sbci r25, 0xFA ; 250 + 1fd0: e2 cf rjmp .-60 ; 0x1f96 static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 2156: 30 e0 ldi r19, 0x00 ; 0 - 2158: ec cf rjmp .-40 ; 0x2132 - 215a: 22 e0 ldi r18, 0x02 ; 2 - 215c: 30 e0 ldi r19, 0x00 ; 0 - 215e: e9 cf rjmp .-46 ; 0x2132 - 2160: 21 e0 ldi r18, 0x01 ; 1 - 2162: 30 e0 ldi r19, 0x00 ; 0 - 2164: e6 cf rjmp .-52 ; 0x2132 - 2166: 20 e0 ldi r18, 0x00 ; 0 - 2168: 30 e0 ldi r19, 0x00 ; 0 - 216a: e3 cf rjmp .-58 ; 0x2132 - 216c: 25 e0 ldi r18, 0x05 ; 5 - 216e: 10 92 20 21 sts 0x2120, r1 - 2172: 30 e0 ldi r19, 0x00 ; 0 - + 1fd2: 25 e0 ldi r18, 0x05 ; 5 + 1fd4: 30 e0 ldi r19, 0x00 ; 0 + 1fd6: f4 cf rjmp .-24 ; 0x1fc0 + 1fd8: 24 e0 ldi r18, 0x04 ; 4 + 1fda: 30 e0 ldi r19, 0x00 ; 0 + 1fdc: f1 cf rjmp .-30 ; 0x1fc0 + 1fde: 23 e0 ldi r18, 0x03 ; 3 + 1fe0: 30 e0 ldi r19, 0x00 ; 0 + 1fe2: ee cf rjmp .-36 ; 0x1fc0 + 1fe4: 22 e0 ldi r18, 0x02 ; 2 + 1fe6: 30 e0 ldi r19, 0x00 ; 0 + 1fe8: eb cf rjmp .-42 ; 0x1fc0 + 1fea: 21 e0 ldi r18, 0x01 ; 1 + 1fec: 30 e0 ldi r19, 0x00 ; 0 + 1fee: e8 cf rjmp .-48 ; 0x1fc0 CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 2174: 46 e1 ldi r20, 0x16 ; 22 if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { + 1ff0: 2f e0 ldi r18, 0x0F ; 15 + 1ff2: 30 e0 ldi r19, 0x00 ; 0 /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; - 2176: 50 e0 ldi r21, 0x00 ; 0 - 2178: 24 9f mul r18, r20 + 1ff4: 10 92 10 21 sts 0x2110, r1 CommandFound = true; StatusId = CallCommandFunc(&CommandTable[i], CommandDelimiter, pParam); - 217a: c0 01 movw r24, r0 - 217c: 25 9f mul r18, r21 - 217e: 90 0d add r25, r0 - 2180: 34 9f mul r19, r20 - 2182: 90 0d add r25, r0 - 2184: 11 24 eor r1, r1 - 2186: 85 5c subi r24, 0xC5 ; 197 - 2188: 9b 4f sbci r25, 0xFB ; 251 - 218a: 1f 33 cpi r17, 0x3F ; 63 - 218c: f9 f0 breq .+62 ; 0x21cc - 218e: 1d 33 cpi r17, 0x3D ; 61 - 2190: 89 f0 breq .+34 ; 0x21b4 + 1ff8: 46 e1 ldi r20, 0x16 ; 22 + 1ffa: 42 9f mul r20, r18 + 1ffc: c0 01 movw r24, r0 + 1ffe: 43 9f mul r20, r19 + 2000: 90 0d add r25, r0 + 2002: 11 24 eor r1, r1 + 2004: 85 5c subi r24, 0xC5 ; 197 + 2006: 9b 4f sbci r25, 0xFB ; 251 static CommandStatusIdType CallCommandFunc( const CommandEntryType* CommandEntry, char CommandDelimiter, char* pParam) { char* pTerminalBuffer = (char*) TerminalBuffer; /* Call appropriate function depending on CommandDelimiter */ if (CommandDelimiter == CHAR_GET_MODE) { - 2192: 11 23 and r17, r17 - 2194: 19 f0 breq .+6 ; 0x219c + 2008: 1f 33 cpi r17, 0x3F ; 63 + 200a: f9 f0 breq .+62 ; 0x204a CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); if (GetFunc != NO_FUNCTION) { return GetFunc(pTerminalBuffer); } } else if (CommandDelimiter == CHAR_SET_MODE) { - 2196: 89 ec ldi r24, 0xC9 ; 201 - 2198: c1 e0 ldi r28, 0x01 ; 1 + 200c: 1d 33 cpi r17, 0x3D ; 61 + 200e: 89 f0 breq .+34 ; 0x2032 CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); if (SetFunc != NO_FUNCTION) { return SetFunc(pParam); } } else if (CommandDelimiter == CHAR_EXEC_MODE){ - 219a: 8f cf rjmp .-226 ; 0x20ba - 219c: 40 96 adiw r24, 0x10 ; 16 + 2010: 11 23 and r17, r17 + 2012: 19 f0 breq .+6 ; 0x201a } else { /* This should not happen (TM) */ } /* This delimiter has not been registered with this command */ return COMMAND_ERR_INVALID_USAGE_ID; - 219e: fc 01 movw r30, r24 + 2014: 89 ec ldi r24, 0xC9 ; 201 if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 21a0: 85 91 lpm r24, Z+ - 21a2: 94 91 lpm r25, Z + 2016: c1 e0 ldi r28, 0x01 ; 1 + 2018: 9b cf rjmp .-202 ; 0x1f50 CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); if (SetFunc != NO_FUNCTION) { return SetFunc(pParam); } } else if (CommandDelimiter == CHAR_EXEC_MODE){ CommandExecFuncType ExecFunc = pgm_read_ptr(&CommandEntry->ExecFunc); - 21a4: fc 01 movw r30, r24 - 21a6: 00 97 sbiw r24, 0x00 ; 0 - 21a8: b1 f3 breq .-20 ; 0x2196 - 21aa: 80 e2 ldi r24, 0x20 ; 32 - 21ac: 91 e2 ldi r25, 0x21 ; 33 + 201a: 40 96 adiw r24, 0x10 ; 16 + 201c: fc 01 movw r30, r24 + 201e: 85 91 lpm r24, Z+ + 2020: 94 91 lpm r25, Z + 2022: fc 01 movw r30, r24 if (ExecFunc != NO_FUNCTION) { - 21ae: 09 95 icall - 21b0: c1 e0 ldi r28, 0x01 ; 1 + 2024: 00 97 sbiw r24, 0x00 ; 0 + 2026: b1 f3 breq .-20 ; 0x2014 return ExecFunc(pTerminalBuffer); - 21b2: 83 cf rjmp .-250 ; 0x20ba - 21b4: 42 96 adiw r24, 0x12 ; 18 - 21b6: fc 01 movw r30, r24 + 2028: 80 e1 ldi r24, 0x10 ; 16 + 202a: 91 e2 ldi r25, 0x21 ; 33 + 202c: 09 95 icall if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 21b8: 85 91 lpm r24, Z+ - 21ba: 94 91 lpm r25, Z + 202e: c1 e0 ldi r28, 0x01 ; 1 + 2030: 8f cf rjmp .-226 ; 0x1f50 CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); if (GetFunc != NO_FUNCTION) { return GetFunc(pTerminalBuffer); } } else if (CommandDelimiter == CHAR_SET_MODE) { CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); - 21bc: fc 01 movw r30, r24 - 21be: 00 97 sbiw r24, 0x00 ; 0 - 21c0: 51 f3 breq .-44 ; 0x2196 - 21c2: ce 01 movw r24, r28 - 21c4: 01 96 adiw r24, 0x01 ; 1 + 2032: 42 96 adiw r24, 0x12 ; 18 + 2034: fc 01 movw r30, r24 + 2036: 85 91 lpm r24, Z+ + 2038: 94 91 lpm r25, Z + 203a: fc 01 movw r30, r24 if (SetFunc != NO_FUNCTION) { - 21c6: 09 95 icall - 21c8: c1 e0 ldi r28, 0x01 ; 1 + 203c: 00 97 sbiw r24, 0x00 ; 0 + 203e: 51 f3 breq .-44 ; 0x2014 return SetFunc(pParam); - 21ca: 77 cf rjmp .-274 ; 0x20ba - 21cc: 44 96 adiw r24, 0x14 ; 20 - 21ce: e7 cf rjmp .-50 ; 0x219e + 2040: ce 01 movw r24, r28 + 2042: 01 96 adiw r24, 0x01 ; 1 + 2044: 09 95 icall if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 21d0: 24 e0 ldi r18, 0x04 ; 4 - 21d2: cd cf rjmp .-102 ; 0x216e + 2046: c1 e0 ldi r28, 0x01 ; 1 + 2048: 83 cf rjmp .-250 ; 0x1f50 const CommandEntryType* CommandEntry, char CommandDelimiter, char* pParam) { char* pTerminalBuffer = (char*) TerminalBuffer; /* Call appropriate function depending on CommandDelimiter */ if (CommandDelimiter == CHAR_GET_MODE) { CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); - 21d4: 23 e0 ldi r18, 0x03 ; 3 - 21d6: cb cf rjmp .-106 ; 0x216e - + 204a: 44 96 adiw r24, 0x14 ; 20 + 204c: e7 cf rjmp .-50 ; 0x201c CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 21d8: 22 e0 ldi r18, 0x02 ; 2 - 21da: c9 cf rjmp .-110 ; 0x216e - 21dc: 2f e0 ldi r18, 0x0F ; 15 - 21de: c7 cf rjmp .-114 ; 0x216e - 21e0: 2e e0 ldi r18, 0x0E ; 14 - 21e2: c5 cf rjmp .-118 ; 0x216e if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 21e4: 21 e0 ldi r18, 0x01 ; 1 - 21e6: c3 cf rjmp .-122 ; 0x216e + 204e: 2e e0 ldi r18, 0x0E ; 14 + 2050: 30 e0 ldi r19, 0x00 ; 0 + 2052: d0 cf rjmp .-96 ; 0x1ff4 + 2054: 2d e0 ldi r18, 0x0D ; 13 + 2056: 30 e0 ldi r19, 0x00 ; 0 + 2058: cd cf rjmp .-102 ; 0x1ff4 + 205a: 2c e0 ldi r18, 0x0C ; 12 + 205c: 30 e0 ldi r19, 0x00 ; 0 + 205e: ca cf rjmp .-108 ; 0x1ff4 + 2060: 2b e0 ldi r18, 0x0B ; 11 + 2062: 30 e0 ldi r19, 0x00 ; 0 + 2064: c7 cf rjmp .-114 ; 0x1ff4 + 2066: 2a e0 ldi r18, 0x0A ; 10 + 2068: 30 e0 ldi r19, 0x00 ; 0 + 206a: c4 cf rjmp .-120 ; 0x1ff4 + 206c: 29 e0 ldi r18, 0x09 ; 9 + 206e: 30 e0 ldi r19, 0x00 ; 0 + 2070: c1 cf rjmp .-126 ; 0x1ff4 + 2072: 28 e0 ldi r18, 0x08 ; 8 + 2074: 30 e0 ldi r19, 0x00 ; 0 + 2076: be cf rjmp .-132 ; 0x1ff4 + 2078: 27 e0 ldi r18, 0x07 ; 7 + 207a: 30 e0 ldi r19, 0x00 ; 0 + 207c: bb cf rjmp .-138 ; 0x1ff4 + 207e: 26 e0 ldi r18, 0x06 ; 6 + 2080: 30 e0 ldi r19, 0x00 ; 0 + 2082: b8 cf rjmp .-144 ; 0x1ff4 + 2084: 25 e0 ldi r18, 0x05 ; 5 + 2086: 30 e0 ldi r19, 0x00 ; 0 + 2088: b5 cf rjmp .-150 ; 0x1ff4 + 208a: 24 e0 ldi r18, 0x04 ; 4 + 208c: 30 e0 ldi r19, 0x00 ; 0 + 208e: b2 cf rjmp .-156 ; 0x1ff4 + 2090: 23 e0 ldi r18, 0x03 ; 3 + 2092: 30 e0 ldi r19, 0x00 ; 0 + 2094: af cf rjmp .-162 ; 0x1ff4 + 2096: 22 e0 ldi r18, 0x02 ; 2 + 2098: 30 e0 ldi r19, 0x00 ; 0 + 209a: ac cf rjmp .-168 ; 0x1ff4 + 209c: 21 e0 ldi r18, 0x01 ; 1 + 209e: 30 e0 ldi r19, 0x00 ; 0 + 20a0: a9 cf rjmp .-174 ; 0x1ff4 + 20a2: 20 e0 ldi r18, 0x00 ; 0 + 20a4: 30 e0 ldi r19, 0x00 ; 0 + 20a6: a6 cf rjmp .-180 ; 0x1ff4 - CommandDelimiter = *pCommandDelimiter; - *pCommandDelimiter = '\0'; +000020a8 : - /* Search in command table */ - for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 21e8: 20 e0 ldi r18, 0x00 ; 0 - 21ea: c1 cf rjmp .-126 ; 0x216e - 21ec: 2d e0 ldi r18, 0x0D ; 13 - 21ee: bf cf rjmp .-130 ; 0x216e - 21f0: 2c e0 ldi r18, 0x0C ; 12 - 21f2: bd cf rjmp .-134 ; 0x216e - 21f4: 2b e0 ldi r18, 0x0B ; 11 - 21f6: bb cf rjmp .-138 ; 0x216e - 21f8: 2a e0 ldi r18, 0x0A ; 10 - 21fa: b9 cf rjmp .-142 ; 0x216e - 21fc: 29 e0 ldi r18, 0x09 ; 9 - 21fe: b7 cf rjmp .-146 ; 0x216e - 2200: 28 e0 ldi r18, 0x08 ; 8 - 2202: b5 cf rjmp .-150 ; 0x216e - 2204: 27 e0 ldi r18, 0x07 ; 7 - 2206: b3 cf rjmp .-154 ; 0x216e - 2208: 26 e0 ldi r18, 0x06 ; 6 - 220a: b1 cf rjmp .-158 ; 0x216e + return true; +} -0000220c : - 220c: 08 95 ret +void CommandLineTick(void) +{ + 20a8: 08 95 ret -0000220e : +000020aa : INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); } INLINE void CodecSetDemodPower(bool bOnOff) { CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 220e: a0 e2 ldi r26, 0x20 ; 32 - 2210: b6 e0 ldi r27, 0x06 ; 6 - 2212: 82 e0 ldi r24, 0x02 ; 2 - 2214: 11 96 adiw r26, 0x01 ; 1 - 2216: 8c 93 st X, r24 - 2218: 11 97 sbiw r26, 0x01 ; 1 + 20aa: a0 e2 ldi r26, 0x20 ; 32 + 20ac: b6 e0 ldi r27, 0x06 ; 6 + 20ae: 82 e0 ldi r24, 0x02 ; 2 + 20b0: 11 96 adiw r26, 0x01 ; 1 + 20b2: 8c 93 st X, r24 + 20b4: 11 97 sbiw r26, 0x01 ; 1 if (bOnOff) { CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; - 221a: 15 96 adiw r26, 0x05 ; 5 - 221c: 8c 93 st X, r24 - 221e: 15 97 sbiw r26, 0x05 ; 5 + 20b6: 15 96 adiw r26, 0x05 ; 5 + 20b8: 8c 93 st X, r24 + 20ba: 15 97 sbiw r26, 0x05 ; 5 static void StartDemod(void) { /* Activate Power for demodulator */ CodecSetDemodPower(true); /* Configure sampling-timer free running and sync to first modulation-pause. */ CODEC_TIMER_SAMPLING.CNT = 0; - 2220: e0 e4 ldi r30, 0x40 ; 64 - 2222: f8 e0 ldi r31, 0x08 ; 8 - 2224: 10 a2 lds r17, 0x90 - 2226: 11 a2 lds r17, 0x91 + 20bc: e0 e4 ldi r30, 0x40 ; 64 + 20be: f8 e0 ldi r31, 0x08 ; 8 + 20c0: 10 a2 std Z+32, r1 ; 0x20 + 20c2: 11 a2 std Z+33, r1 ; 0x21 CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; - 2228: 8d e2 ldi r24, 0x2D ; 45 - 222a: 91 e0 ldi r25, 0x01 ; 1 - 222c: 86 a3 lds r24, 0x56 - 222e: 97 a3 lds r25, 0x57 + 20c4: 8d e2 ldi r24, 0x2D ; 45 + 20c6: 91 e0 ldi r25, 0x01 ; 1 + 20c8: 86 a3 std Z+38, r24 ; 0x26 + 20ca: 97 a3 std Z+39, r25 ; 0x27 CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ - 2230: 8f ef ldi r24, 0xFF ; 255 - 2232: 9f ef ldi r25, 0xFF ; 255 - 2234: 80 a7 lds r24, 0x70 - 2236: 91 a7 lds r25, 0x71 + 20cc: 8f ef ldi r24, 0xFF ; 255 + 20ce: 9f ef ldi r25, 0xFF ; 255 + 20d0: 80 a7 std Z+40, r24 ; 0x28 + 20d2: 91 a7 std Z+41, r25 ; 0x29 CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; - 2238: 81 e0 ldi r24, 0x01 ; 1 - 223a: 80 83 st Z, r24 + 20d4: 81 e0 ldi r24, 0x01 ; 1 + 20d6: 80 83 st Z, r24 CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - 223c: 98 e8 ldi r25, 0x88 ; 136 - 223e: 93 83 std Z+3, r25 ; 0x03 + 20d8: 98 e8 ldi r25, 0x88 ; 136 + 20da: 93 83 std Z+3, r25 ; 0x03 CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; - 2240: 93 e0 ldi r25, 0x03 ; 3 - 2242: 97 83 std Z+7, r25 ; 0x07 + 20dc: 93 e0 ldi r25, 0x03 ; 3 + 20de: 97 83 std Z+7, r25 ; 0x07 /* Start looking out for modulation pause via interrupt. */ CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; - 2244: 1a 96 adiw r26, 0x0a ; 10 - 2246: 8c 93 st X, r24 - 2248: 1a 97 sbiw r26, 0x0a ; 10 -} - 224a: 08 95 ret + 20e0: 1a 96 adiw r26, 0x0a ; 10 + 20e2: 8c 93 st X, r24 + 20e4: 08 95 ret -0000224c <__vector_34>: +000020e6 <__vector_34>: +} ISR(CODEC_DEMOD_IN_INT0_VECT) { - 224c: 1f 92 push r1 - 224e: 0f 92 push r0 - 2250: 0f b6 in r0, 0x3f ; 63 - 2252: 0f 92 push r0 - 2254: 11 24 eor r1, r1 - 2256: 8f 93 push r24 - 2258: 9f 93 push r25 - 225a: ef 93 push r30 - 225c: ff 93 push r31 + 20e6: 1f 92 push r1 + 20e8: 0f 92 push r0 + 20ea: 0f b6 in r0, 0x3f ; 63 + 20ec: 0f 92 push r0 + 20ee: 11 24 eor r1, r1 + 20f0: 8f 93 push r24 + 20f2: 9f 93 push r25 + 20f4: ef 93 push r30 + 20f6: ff 93 push r31 /* This is the first edge of the first modulation-pause after StartDemod. * Now we have time to prepare our timers and variables to start * demodulating beginning from one bit-width after this edge. */ CodecBufferPtr = CodecBuffer; - 225e: 80 e2 ldi r24, 0x20 ; 32 - 2260: 92 e2 ldi r25, 0x22 ; 34 - 2262: 80 93 c1 20 sts 0x20C1, r24 - 2266: 90 93 c2 20 sts 0x20C2, r25 + 20f8: 80 e1 ldi r24, 0x10 ; 16 + 20fa: 92 e2 ldi r25, 0x22 ; 34 + 20fc: 80 93 b1 20 sts 0x20B1, r24 + 2100: 90 93 b2 20 sts 0x20B2, r25 ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 226a: 80 ea ldi r24, 0xA0 ; 160 - 226c: 92 e2 ldi r25, 0x22 ; 34 - 226e: 80 93 c3 20 sts 0x20C3, r24 - 2272: 90 93 c4 20 sts 0x20C4, r25 + 2104: 80 e9 ldi r24, 0x90 ; 144 + 2106: 92 e2 ldi r25, 0x22 ; 34 + 2108: 80 93 b3 20 sts 0x20B3, r24 + 210c: 90 93 b4 20 sts 0x20B4, r25 DataRegister = 0; - 2276: 10 92 ba 20 sts 0x20BA, r1 + 2110: 10 92 aa 20 sts 0x20AA, r1 SampleRegister = 0; - 227a: 10 92 b9 20 sts 0x20B9, r1 + 2114: 10 92 a9 20 sts 0x20A9, r1 SamplePosition = 0; - 227e: 10 92 b5 20 sts 0x20B5, r1 + 2118: 10 92 a5 20 sts 0x20A5, r1 BitCount = 0; - 2282: 10 92 bd 20 sts 0x20BD, r1 - 2286: 10 92 be 20 sts 0x20BE, r1 + 211c: 10 92 ad 20 sts 0x20AD, r1 + 2120: 10 92 ae 20 sts 0x20AE, r1 IsParityBit = false; - 228a: 10 92 b8 20 sts 0x20B8, r1 + 2124: 10 92 a8 20 sts 0x20A8, r1 * XYZBUF mechanism of the xmega to automatically double the sampling rate on the * next overflow. For this we have to temporarily deactivate the automatical alignment * in order to catch next overflow event for updating the BUF registers. * We want to sample the demodulated data stream in the first quarter of the half-bit * where the pulsed miller encoded is located. */ CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; - 228e: e0 e4 ldi r30, 0x40 ; 64 - 2290: f8 e0 ldi r31, 0x08 ; 8 - 2292: 13 82 std Z+3, r1 ; 0x03 + 2128: e0 e4 ldi r30, 0x40 ; 64 + 212a: f8 e0 ldi r31, 0x08 ; 8 + 212c: 13 82 std Z+3, r1 ; 0x03 CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ - 2294: 86 e9 ldi r24, 0x96 ; 150 - 2296: 90 e0 ldi r25, 0x00 ; 0 - 2298: 86 ab sts 0x56, r24 - 229a: 97 ab sts 0x57, r25 + 212e: 86 e9 ldi r24, 0x96 ; 150 + 2130: 90 e0 ldi r25, 0x00 ; 0 + 2132: 86 ab std Z+54, r24 ; 0x36 + 2134: 97 ab std Z+55, r25 ; 0x37 CODEC_TIMER_SAMPLING.CCABUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 10 - 1; /* Compensate for DIGFILT and ISR prolog */ - 229c: 8a e1 ldi r24, 0x1A ; 26 - 229e: 90 e0 ldi r25, 0x00 ; 0 - 22a0: 80 af sts 0x70, r24 - 22a2: 91 af sts 0x71, r25 + 2136: 8a e1 ldi r24, 0x1A ; 26 + 2138: 90 e0 ldi r25, 0x00 ; 0 + 213a: 80 af std Z+56, r24 ; 0x38 + 213c: 91 af std Z+57, r25 ; 0x39 /* Setup Frame Delay Timer and wire to EVSYS. Frame delay time is * measured from last change in RF field, therefore we use * the event channel 1 (end of modulation pause) as the restart event. * The preliminary frame delay time chosen here is irrelevant, because * the correct FDT gets set automatically after demodulation. */ CODEC_TIMER_LOADMOD.CNT = 0; - 22a4: e0 e4 ldi r30, 0x40 ; 64 - 22a6: f9 e0 ldi r31, 0x09 ; 9 - 22a8: 10 a2 lds r17, 0x90 - 22aa: 11 a2 lds r17, 0x91 + 213e: e0 e4 ldi r30, 0x40 ; 64 + 2140: f9 e0 ldi r31, 0x09 ; 9 + 2142: 10 a2 std Z+32, r1 ; 0x20 + 2144: 11 a2 std Z+33, r1 ; 0x21 CODEC_TIMER_LOADMOD.PER = 0xFFFF; - 22ac: 8f ef ldi r24, 0xFF ; 255 - 22ae: 9f ef ldi r25, 0xFF ; 255 - 22b0: 86 a3 lds r24, 0x56 - 22b2: 97 a3 lds r25, 0x57 + 2146: 8f ef ldi r24, 0xFF ; 255 + 2148: 9f ef ldi r25, 0xFF ; 255 + 214a: 86 a3 std Z+38, r24 ; 0x26 + 214c: 97 a3 std Z+39, r25 ; 0x27 CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; - 22b4: 89 e8 ldi r24, 0x89 ; 137 - 22b6: 83 83 std Z+3, r24 ; 0x03 + 214e: 89 e8 ldi r24, 0x89 ; 137 + 2150: 83 83 std Z+3, r24 ; 0x03 CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_EVCH6_gc; - 22b8: 8e e0 ldi r24, 0x0E ; 14 - 22ba: 80 83 st Z, r24 + 2152: 8e e0 ldi r24, 0x0E ; 14 + 2154: 80 83 st Z, r24 /* Disable this interrupt */ CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 22bc: e0 e2 ldi r30, 0x20 ; 32 - 22be: f6 e0 ldi r31, 0x06 ; 6 - 22c0: 12 86 std Z+10, r1 ; 0x0a + 2156: e0 e2 ldi r30, 0x20 ; 32 + 2158: f6 e0 ldi r31, 0x06 ; 6 + 215a: 12 86 std Z+10, r1 ; 0x0a } - 22c2: ff 91 pop r31 - 22c4: ef 91 pop r30 - 22c6: 9f 91 pop r25 - 22c8: 8f 91 pop r24 - 22ca: 0f 90 pop r0 - 22cc: 0f be out 0x3f, r0 ; 63 - 22ce: 0f 90 pop r0 - 22d0: 1f 90 pop r1 - 22d2: 18 95 reti + 215c: ff 91 pop r31 + 215e: ef 91 pop r30 + 2160: 9f 91 pop r25 + 2162: 8f 91 pop r24 + 2164: 0f 90 pop r0 + 2166: 0f be out 0x3f, r0 ; 63 + 2168: 0f 90 pop r0 + 216a: 1f 90 pop r1 + 216c: 18 95 reti -000022d4 <__vector_22>: +0000216e <__vector_22>: ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { - 22d4: 1f 92 push r1 - 22d6: 0f 92 push r0 - 22d8: 0f b6 in r0, 0x3f ; 63 - 22da: 0f 92 push r0 - 22dc: 11 24 eor r1, r1 - 22de: 2f 93 push r18 - 22e0: 8f 93 push r24 - 22e2: 9f 93 push r25 - 22e4: ef 93 push r30 - 22e6: ff 93 push r31 + 216e: 1f 92 push r1 + 2170: 0f 92 push r0 + 2172: 0f b6 in r0, 0x3f ; 63 + 2174: 0f 92 push r0 + 2176: 11 24 eor r1, r1 + 2178: 2f 93 push r18 + 217a: 8f 93 push r24 + 217c: 9f 93 push r25 + 217e: ef 93 push r30 + 2180: ff 93 push r31 /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; - 22e8: 90 91 28 06 lds r25, 0x0628 + 2182: 90 91 28 06 lds r25, 0x0628 uint8_t NewSampleRegister; /* Shift sampled bit into sampling register and hold a local copy for fast access. */ NewSampleRegister = SampleRegister << 1; - 22ec: 80 91 b9 20 lds r24, 0x20B9 - 22f0: 88 0f add r24, r24 + 2186: 80 91 a9 20 lds r24, 0x20A9 CODEC_DEMOD_IN_PORT.INT0MASK = 0; } ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; - 22f2: 95 70 andi r25, 0x05 ; 5 + 218a: 95 70 andi r25, 0x05 ; 5 uint8_t NewSampleRegister; /* Shift sampled bit into sampling register and hold a local copy for fast access. */ NewSampleRegister = SampleRegister << 1; NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); - 22f4: 21 e0 ldi r18, 0x01 ; 1 - 22f6: 09 f0 breq .+2 ; 0x22fa <__vector_22+0x26> - 22f8: 20 e0 ldi r18, 0x00 ; 0 - 22fa: 82 2b or r24, r18 + 218c: 21 e0 ldi r18, 0x01 ; 1 + 218e: 09 f0 breq .+2 ; 0x2192 <__vector_22+0x24> + 2190: 20 e0 ldi r18, 0x00 ; 0 + /* This interrupt gets called twice for every bit to sample it. */ + uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; + uint8_t NewSampleRegister; + + /* Shift sampled bit into sampling register and hold a local copy for fast access. */ + NewSampleRegister = SampleRegister << 1; + 2192: 88 0f add r24, r24 + NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); + 2194: 82 2b or r24, r18 SampleRegister = NewSampleRegister; - 22fc: 80 93 b9 20 sts 0x20B9, r24 + 2196: 80 93 a9 20 sts 0x20A9, r24 if (SamplePosition) { - 2300: 90 91 b5 20 lds r25, 0x20B5 - 2304: 99 23 and r25, r25 - 2306: a1 f1 breq .+104 ; 0x2370 <__vector_22+0x9c> + 219a: 90 91 a5 20 lds r25, 0x20A5 + 219e: 99 23 and r25, r25 + 21a0: a1 f1 breq .+104 ; 0x220a <__vector_22+0x9c> /* Analyze the sampling register after 2 samples. */ if ((NewSampleRegister & 0x07) == 0x07) { - 2308: 98 2f mov r25, r24 - 230a: 97 70 andi r25, 0x07 ; 7 - 230c: 97 30 cpi r25, 0x07 ; 7 - 230e: 09 f4 brne .+2 ; 0x2312 <__vector_22+0x3e> - 2310: 44 c0 rjmp .+136 ; 0x239a <__vector_22+0xc6> + 21a2: 98 2f mov r25, r24 + 21a4: 97 70 andi r25, 0x07 ; 7 + 21a6: 97 30 cpi r25, 0x07 ; 7 + 21a8: 09 f4 brne .+2 ; 0x21ac <__vector_22+0x3e> + 21aa: 42 c0 rjmp .+132 ; 0x2230 <__vector_22+0xc2> /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; } else { /* Otherwise, we check the two sample bits from the bit before. */ uint8_t BitSample = NewSampleRegister & 0xC; - 2312: 8c 70 andi r24, 0x0C ; 12 + 21ac: 98 2f mov r25, r24 + 21ae: 9c 70 andi r25, 0x0C ; 12 uint8_t Bit = 0; if (BitSample != (0x0 << 2)) { - 2314: 69 f1 breq .+90 ; 0x2370 <__vector_22+0x9c> + 21b0: 61 f1 breq .+88 ; 0x220a <__vector_22+0x9c> /* We have a valid bit. decode and process it. */ if (BitSample & (0x1 << 2)) { - /* 01 sequence or 11 sequence -> This is a zero bit */ - Bit = 0; - 2316: 91 e0 ldi r25, 0x01 ; 1 - 2318: 82 fd sbrc r24, 2 - 231a: 6e c0 rjmp .+220 ; 0x23f8 <__vector_22+0x124> + 21b2: 91 e0 ldi r25, 0x01 ; 1 + 21b4: 82 fd sbrc r24, 2 + 21b6: 6b c0 rjmp .+214 ; 0x228e <__vector_22+0x120> } else { /* 10 sequence -> This is a one bit */ Bit = 1; } LastBit = Bit; - 231c: 90 93 b7 20 sts 0x20B7, r25 + 21b8: 90 93 a7 20 sts 0x20A7, r25 if (!IsParityBit) { - 2320: 80 91 b8 20 lds r24, 0x20B8 - 2324: 88 23 and r24, r24 - 2326: 09 f0 breq .+2 ; 0x232a <__vector_22+0x56> - 2328: 6f c0 rjmp .+222 ; 0x2408 <__vector_22+0x134> + 21bc: 80 91 a8 20 lds r24, 0x20A8 + 21c0: 81 11 cpse r24, r1 + 21c2: 6d c0 rjmp .+218 ; 0x229e <__vector_22+0x130> /* This is a data bit, so shift it into the data register and * hold a local copy of it. */ uint8_t NewDataRegister = DataRegister >> 1; - 232a: 80 91 ba 20 lds r24, 0x20BA - 232e: 86 95 lsr r24 + 21c4: 80 91 aa 20 lds r24, 0x20AA + 21c8: 86 95 lsr r24 NewDataRegister |= (Bit ? 0x80 : 0x00); - 2330: 99 23 and r25, r25 - 2332: 09 f4 brne .+2 ; 0x2336 <__vector_22+0x62> - 2334: 71 c0 rjmp .+226 ; 0x2418 <__vector_22+0x144> - 2336: 20 e8 ldi r18, 0x80 ; 128 - 2338: 28 2b or r18, r24 + 21ca: 99 23 and r25, r25 + 21cc: 09 f4 brne .+2 ; 0x21d0 <__vector_22+0x62> + 21ce: 71 c0 rjmp .+226 ; 0x22b2 <__vector_22+0x144> + 21d0: 20 e8 ldi r18, 0x80 ; 128 + 21d2: 28 2b or r18, r24 DataRegister = NewDataRegister; - 233a: 20 93 ba 20 sts 0x20BA, r18 + 21d4: 20 93 aa 20 sts 0x20AA, r18 /* Update bitcount */ uint16_t NewBitCount = ++BitCount; - 233e: 80 91 bd 20 lds r24, 0x20BD - 2342: 90 91 be 20 lds r25, 0x20BE - 2346: 01 96 adiw r24, 0x01 ; 1 - 2348: 80 93 bd 20 sts 0x20BD, r24 - 234c: 90 93 be 20 sts 0x20BE, r25 + 21d8: 80 91 ad 20 lds r24, 0x20AD + 21dc: 90 91 ae 20 lds r25, 0x20AE + 21e0: 01 96 adiw r24, 0x01 ; 1 + 21e2: 80 93 ad 20 sts 0x20AD, r24 + 21e6: 90 93 ae 20 sts 0x20AE, r25 if ((NewBitCount & 0x07) == 0) { - 2350: 87 70 andi r24, 0x07 ; 7 - 2352: 90 70 andi r25, 0x00 ; 0 - 2354: 00 97 sbiw r24, 0x00 ; 0 - 2356: 61 f4 brne .+24 ; 0x2370 <__vector_22+0x9c> + 21ea: 87 70 andi r24, 0x07 ; 7 + 21ec: 99 27 eor r25, r25 + 21ee: 89 2b or r24, r25 + 21f0: 61 f4 brne .+24 ; 0x220a <__vector_22+0x9c> /* We have reached a byte boundary! Store the data register. */ /* TODO: Prevent buffer overflow */ *CodecBufferPtr++ = NewDataRegister; - 2358: e0 91 c1 20 lds r30, 0x20C1 - 235c: f0 91 c2 20 lds r31, 0x20C2 - 2360: 21 93 st Z+, r18 - 2362: e0 93 c1 20 sts 0x20C1, r30 - 2366: f0 93 c2 20 sts 0x20C2, r31 + 21f2: e0 91 b1 20 lds r30, 0x20B1 + 21f6: f0 91 b2 20 lds r31, 0x20B2 + 21fa: 21 93 st Z+, r18 + 21fc: e0 93 b1 20 sts 0x20B1, r30 + 2200: f0 93 b2 20 sts 0x20B2, r31 /* Store bit for determining FDT at EOC and enable parity * handling on next bit. */ IsParityBit = true; - 236a: 81 e0 ldi r24, 0x01 ; 1 - 236c: 80 93 b8 20 sts 0x20B8, r24 + 2204: 81 e0 ldi r24, 0x01 ; 1 + 2206: 80 93 a8 20 sts 0x20A8, r24 } } else { /* On odd sample position just sample. */ } SamplePosition = !SamplePosition; - 2370: 90 91 b5 20 lds r25, 0x20B5 - 2374: 81 e0 ldi r24, 0x01 ; 1 - 2376: 91 11 cpse r25, r1 - 2378: 80 e0 ldi r24, 0x00 ; 0 - 237a: 80 93 b5 20 sts 0x20B5, r24 + 220a: 80 91 a5 20 lds r24, 0x20A5 + 220e: 91 e0 ldi r25, 0x01 ; 1 + 2210: 89 27 eor r24, r25 + 2212: 80 93 a5 20 sts 0x20A5, r24 /* Make sure the sampling timer gets automatically aligned to the * modulation pauses by using the RESTART event. * This can be understood as a "poor mans PLL" and makes sure that we are * never too far out the bit-grid while sampling. */ CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - 237e: 88 e8 ldi r24, 0x88 ; 136 - 2380: e0 e4 ldi r30, 0x40 ; 64 - 2382: f8 e0 ldi r31, 0x08 ; 8 - 2384: 83 83 std Z+3, r24 ; 0x03 + 2216: 88 e8 ldi r24, 0x88 ; 136 + 2218: 80 93 43 08 sts 0x0843, r24 } - 2386: ff 91 pop r31 - 2388: ef 91 pop r30 - 238a: 9f 91 pop r25 - 238c: 8f 91 pop r24 - 238e: 2f 91 pop r18 - 2390: 0f 90 pop r0 - 2392: 0f be out 0x3f, r0 ; 63 - 2394: 0f 90 pop r0 - 2396: 1f 90 pop r1 - 2398: 18 95 reti + 221c: ff 91 pop r31 + 221e: ef 91 pop r30 + 2220: 9f 91 pop r25 + 2222: 8f 91 pop r24 + 2224: 2f 91 pop r18 + 2226: 0f 90 pop r0 + 2228: 0f be out 0x3f, r0 ; 63 + 222a: 0f 90 pop r0 + 222c: 1f 90 pop r1 + 222e: 18 95 reti if (SamplePosition) { /* Analyze the sampling register after 2 samples. */ if ((NewSampleRegister & 0x07) == 0x07) { /* No carrier modulation for 3 sample points. EOC! */ CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - 239a: 10 92 40 08 sts 0x0840, r1 + 2230: 10 92 40 08 sts 0x0840, r1 CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; - 239e: 80 e1 ldi r24, 0x10 ; 16 - 23a0: e0 e4 ldi r30, 0x40 ; 64 - 23a2: f8 e0 ldi r31, 0x08 ; 8 - 23a4: 84 87 std Z+12, r24 ; 0x0c + 2234: 80 e1 ldi r24, 0x10 ; 16 + 2236: 80 93 4c 08 sts 0x084C, r24 /* By this time, the FDT timer is aligned to the last modulation * edge of the reader. So we disable the auto-synchronization and * let it count the frame delay time in the background, and generate * an interrupt once it has reached the FDT. */ CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; - 23a6: e0 e4 ldi r30, 0x40 ; 64 - 23a8: f9 e0 ldi r31, 0x09 ; 9 - 23aa: 13 82 std Z+3, r1 ; 0x03 + 223a: 10 92 43 09 sts 0x0943, r1 if (LastBit) { - 23ac: 80 91 b7 20 lds r24, 0x20B7 - 23b0: 88 23 and r24, r24 - 23b2: 69 f1 breq .+90 ; 0x240e <__vector_22+0x13a> + 223e: 80 91 a7 20 lds r24, 0x20A7 + 2242: 88 23 and r24, r24 + 2244: 79 f1 breq .+94 ; 0x22a4 <__vector_22+0x136> CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; - 23b4: 8c eb ldi r24, 0xBC ; 188 - 23b6: 94 e0 ldi r25, 0x04 ; 4 - 23b8: 86 a3 lds r24, 0x56 - 23ba: 97 a3 lds r25, 0x57 + 2246: 8c eb ldi r24, 0xBC ; 188 + 2248: 94 e0 ldi r25, 0x04 ; 4 + 224a: 80 93 66 09 sts 0x0966, r24 + 224e: 90 93 67 09 sts 0x0967, r25 } else { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; } LoadModState = LOADMOD_FDT; - 23bc: 10 92 b6 20 sts 0x20B6, r1 + 2252: 10 92 a6 20 sts 0x20A6, r1 CODEC_TIMER_LOADMOD.INTFLAGS = TC1_OVFIF_bm; - 23c0: e0 e4 ldi r30, 0x40 ; 64 - 23c2: f9 e0 ldi r31, 0x09 ; 9 - 23c4: 81 e0 ldi r24, 0x01 ; 1 - 23c6: 84 87 std Z+12, r24 ; 0x0c + 2256: 81 e0 ldi r24, 0x01 ; 1 + 2258: 80 93 4c 09 sts 0x094C, r24 CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; - 23c8: 83 e0 ldi r24, 0x03 ; 3 - 23ca: 86 83 std Z+6, r24 ; 0x06 + 225c: 83 e0 ldi r24, 0x03 ; 3 + 225e: 80 93 46 09 sts 0x0946, r24 /* Determine if we did not receive a multiple of 8 bits. * If this is the case, right-align the remaining data and * store it into the buffer. */ uint8_t RemainingBits = BitCount % 8; - 23cc: 80 91 bd 20 lds r24, 0x20BD - 23d0: 90 91 be 20 lds r25, 0x20BE - 23d4: 87 70 andi r24, 0x07 ; 7 + 2262: 80 91 ad 20 lds r24, 0x20AD + 2266: 90 91 ae 20 lds r25, 0x20AE + 226a: 87 70 andi r24, 0x07 ; 7 if (RemainingBits != 0) { - 23d6: 61 f0 breq .+24 ; 0x23f0 <__vector_22+0x11c> + 226c: 61 f0 breq .+24 ; 0x2286 <__vector_22+0x118> uint8_t NewDataRegister = DataRegister; - 23d8: 90 91 ba 20 lds r25, 0x20BA + 226e: 90 91 aa 20 lds r25, 0x20AA while (RemainingBits++ < 8) { - 23dc: 8f 5f subi r24, 0xFF ; 255 + 2272: 8f 5f subi r24, 0xFF ; 255 /* Pad with zeroes to right-align. */ NewDataRegister >>= 1; - 23de: 96 95 lsr r25 + 2274: 96 95 lsr r25 * store it into the buffer. */ uint8_t RemainingBits = BitCount % 8; if (RemainingBits != 0) { uint8_t NewDataRegister = DataRegister; while (RemainingBits++ < 8) { - 23e0: 8f 5f subi r24, 0xFF ; 255 - 23e2: 89 30 cpi r24, 0x09 ; 9 - 23e4: e1 f7 brne .-8 ; 0x23de <__vector_22+0x10a> + 2276: 8f 5f subi r24, 0xFF ; 255 + 2278: 89 30 cpi r24, 0x09 ; 9 + 227a: e1 f7 brne .-8 ; 0x2274 <__vector_22+0x106> /* Pad with zeroes to right-align. */ NewDataRegister >>= 1; } /* TODO: Prevent buffer overflow */ *CodecBufferPtr = NewDataRegister; - 23e6: e0 91 c1 20 lds r30, 0x20C1 - 23ea: f0 91 c2 20 lds r31, 0x20C2 - 23ee: 90 83 st Z, r25 + 227c: e0 91 b1 20 lds r30, 0x20B1 + 2280: f0 91 b2 20 lds r31, 0x20B2 + 2284: 90 83 st Z, r25 } /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; - 23f0: 81 e0 ldi r24, 0x01 ; 1 - 23f2: 80 93 bf 20 sts 0x20BF, r24 - 23f6: bc cf rjmp .-136 ; 0x2370 <__vector_22+0x9c> + 2286: 81 e0 ldi r24, 0x01 ; 1 + 2288: 80 93 af 20 sts 0x20AF, r24 + 228c: be cf rjmp .-132 ; 0x220a <__vector_22+0x9c> + uint8_t BitSample = NewSampleRegister & 0xC; + uint8_t Bit = 0; if (BitSample != (0x0 << 2)) { /* We have a valid bit. decode and process it. */ if (BitSample & (0x1 << 2)) { - /* 01 sequence or 11 sequence -> This is a zero bit */ - Bit = 0; - 23f8: 90 e0 ldi r25, 0x00 ; 0 + 228e: 90 e0 ldi r25, 0x00 ; 0 } else { /* 10 sequence -> This is a one bit */ Bit = 1; } LastBit = Bit; - 23fa: 90 93 b7 20 sts 0x20B7, r25 + 2290: 90 93 a7 20 sts 0x20A7, r25 if (!IsParityBit) { - 23fe: 80 91 b8 20 lds r24, 0x20B8 - 2402: 88 23 and r24, r24 - 2404: 09 f4 brne .+2 ; 0x2408 <__vector_22+0x134> - 2406: 91 cf rjmp .-222 ; 0x232a <__vector_22+0x56> + 2294: 80 91 a8 20 lds r24, 0x20A8 + 2298: 88 23 and r24, r24 + 229a: 09 f4 brne .+2 ; 0x229e <__vector_22+0x130> + 229c: 93 cf rjmp .-218 ; 0x21c4 <__vector_22+0x56> } else { /* This is a parity bit. Store it */ /* TODO: Store parity and prevent overflow */ //*ParityBufferPtr++ = Bit; IsParityBit = false; - 2408: 10 92 b8 20 sts 0x20B8, r1 - 240c: b1 cf rjmp .-158 ; 0x2370 <__vector_22+0x9c> + 229e: 10 92 a8 20 sts 0x20A8, r1 + 22a2: b3 cf rjmp .-154 ; 0x220a <__vector_22+0x9c> CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; if (LastBit) { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; } else { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; - 240e: 8c e7 ldi r24, 0x7C ; 124 - 2410: 94 e0 ldi r25, 0x04 ; 4 - 2412: 86 a3 lds r24, 0x56 - 2414: 97 a3 lds r25, 0x57 - 2416: d2 cf rjmp .-92 ; 0x23bc <__vector_22+0xe8> + 22a4: 8c e7 ldi r24, 0x7C ; 124 + 22a6: 94 e0 ldi r25, 0x04 ; 4 + 22a8: 80 93 66 09 sts 0x0966, r24 + 22ac: 90 93 67 09 sts 0x0967, r25 + 22b0: d0 cf rjmp .-96 ; 0x2252 <__vector_22+0xe4> if (!IsParityBit) { /* This is a data bit, so shift it into the data register and * hold a local copy of it. */ uint8_t NewDataRegister = DataRegister >> 1; NewDataRegister |= (Bit ? 0x80 : 0x00); - 2418: 20 e0 ldi r18, 0x00 ; 0 - 241a: 8e cf rjmp .-228 ; 0x2338 <__vector_22+0x64> + 22b2: 20 e0 ldi r18, 0x00 ; 0 + 22b4: 8e cf rjmp .-228 ; 0x21d2 <__vector_22+0x64> -0000241c <__vector_83>: +000022b6 <__vector_83>: * This can be understood as a "poor mans PLL" and makes sure that we are * never too far out the bit-grid while sampling. */ CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; } ISR(CODEC_TIMER_OVF_VECT) { - 241c: 1f 92 push r1 - 241e: 0f 92 push r0 - 2420: 0f b6 in r0, 0x3f ; 63 - 2422: 0f 92 push r0 - 2424: 11 24 eor r1, r1 - 2426: 2f 93 push r18 - 2428: 3f 93 push r19 - 242a: 8f 93 push r24 - 242c: 9f 93 push r25 - 242e: af 93 push r26 - 2430: bf 93 push r27 - 2432: ef 93 push r30 - 2434: ff 93 push r31 + 22b6: 1f 92 push r1 + 22b8: 0f 92 push r0 + 22ba: 0f b6 in r0, 0x3f ; 63 + 22bc: 0f 92 push r0 + 22be: 11 24 eor r1, r1 + 22c0: 2f 93 push r18 + 22c2: 3f 93 push r19 + 22c4: 8f 93 push r24 + 22c6: 9f 93 push r25 + 22c8: ef 93 push r30 + 22ca: ff 93 push r31 /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 2436: 80 91 b6 20 lds r24, 0x20B6 - 243a: 85 30 cpi r24, 0x05 ; 5 - 243c: 09 f4 brne .+2 ; 0x2440 <__vector_83+0x24> - 243e: 55 c0 rjmp .+170 ; 0x24ea <__vector_83+0xce> - 2440: 86 30 cpi r24, 0x06 ; 6 - 2442: c0 f0 brcs .+48 ; 0x2474 <__vector_83+0x58> - 2444: 88 30 cpi r24, 0x08 ; 8 - 2446: 09 f4 brne .+2 ; 0x244a <__vector_83+0x2e> - 2448: 86 c0 rjmp .+268 ; 0x2556 <__vector_83+0x13a> - 244a: 89 30 cpi r24, 0x09 ; 9 - 244c: 40 f5 brcc .+80 ; 0x249e <__vector_83+0x82> - 244e: 86 30 cpi r24, 0x06 ; 6 - 2450: 09 f4 brne .+2 ; 0x2454 <__vector_83+0x38> - 2452: c7 c0 rjmp .+398 ; 0x25e2 <__vector_83+0x1c6> - 2454: 87 30 cpi r24, 0x07 ; 7 - 2456: 09 f4 brne .+2 ; 0x245a <__vector_83+0x3e> - 2458: 95 c0 rjmp .+298 ; 0x2584 <__vector_83+0x168> + 22cc: 80 91 a6 20 lds r24, 0x20A6 + 22d0: 85 30 cpi r24, 0x05 ; 5 + 22d2: 09 f4 brne .+2 ; 0x22d6 <__vector_83+0x20> + 22d4: 4d c0 rjmp .+154 ; 0x2370 <__vector_83+0xba> + 22d6: a8 f0 brcs .+42 ; 0x2302 <__vector_83+0x4c> + 22d8: 88 30 cpi r24, 0x08 ; 8 + 22da: 09 f4 brne .+2 ; 0x22de <__vector_83+0x28> + 22dc: 7c c0 rjmp .+248 ; 0x23d6 <__vector_83+0x120> + 22de: 20 f5 brcc .+72 ; 0x2328 <__vector_83+0x72> + 22e0: 86 30 cpi r24, 0x06 ; 6 + 22e2: 09 f4 brne .+2 ; 0x22e6 <__vector_83+0x30> + 22e4: b8 c0 rjmp .+368 ; 0x2456 <__vector_83+0x1a0> + 22e6: 87 30 cpi r24, 0x07 ; 7 + 22e8: 09 f4 brne .+2 ; 0x22ec <__vector_83+0x36> + 22ea: 8a c0 rjmp .+276 ; 0x2400 <__vector_83+0x14a> break; default: break; } } - 245a: ff 91 pop r31 - 245c: ef 91 pop r30 - 245e: bf 91 pop r27 - 2460: af 91 pop r26 - 2462: 9f 91 pop r25 - 2464: 8f 91 pop r24 - 2466: 3f 91 pop r19 - 2468: 2f 91 pop r18 - 246a: 0f 90 pop r0 - 246c: 0f be out 0x3f, r0 ; 63 - 246e: 0f 90 pop r0 - 2470: 1f 90 pop r1 - 2472: 18 95 reti + 22ec: ff 91 pop r31 + 22ee: ef 91 pop r30 + 22f0: 9f 91 pop r25 + 22f2: 8f 91 pop r24 + 22f4: 3f 91 pop r19 + 22f6: 2f 91 pop r18 + 22f8: 0f 90 pop r0 + 22fa: 0f be out 0x3f, r0 ; 63 + 22fc: 0f 90 pop r0 + 22fe: 1f 90 pop r1 + 2300: 18 95 reti ISR(CODEC_TIMER_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 2474: 82 30 cpi r24, 0x02 ; 2 - 2476: 89 f1 breq .+98 ; 0x24da <__vector_83+0xbe> - 2478: 83 30 cpi r24, 0x03 ; 3 - 247a: 08 f1 brcs .+66 ; 0x24be <__vector_83+0xa2> - 247c: 83 30 cpi r24, 0x03 ; 3 - 247e: 09 f4 brne .+2 ; 0x2482 <__vector_83+0x66> - 2480: 5b c0 rjmp .+182 ; 0x2538 <__vector_83+0x11c> - 2482: 84 30 cpi r24, 0x04 ; 4 - 2484: 51 f7 brne .-44 ; 0x245a <__vector_83+0x3e> + 2302: 82 30 cpi r24, 0x02 ; 2 + 2304: 71 f1 breq .+92 ; 0x2362 <__vector_83+0xac> + 2306: f8 f0 brcs .+62 ; 0x2346 <__vector_83+0x90> + 2308: 83 30 cpi r24, 0x03 ; 3 + 230a: 09 f4 brne .+2 ; 0x230e <__vector_83+0x58> + 230c: 56 c0 rjmp .+172 ; 0x23ba <__vector_83+0x104> + 230e: 84 30 cpi r24, 0x04 ; 4 + 2310: 69 f7 brne .-38 ; 0x22ec <__vector_83+0x36> /* Fetch first byte */ DataRegister = *CodecBufferPtr; break; case LOADMOD_DATA0: if (DataRegister & 1) { - 2486: 80 91 ba 20 lds r24, 0x20BA - 248a: 80 fd sbrc r24, 0 - 248c: c7 c0 rjmp .+398 ; 0x261c <__vector_83+0x200> + 2312: 80 91 aa 20 lds r24, 0x20AA + 2316: 80 fd sbrc r24, 0 + 2318: b7 c0 rjmp .+366 ; 0x2488 <__vector_83+0x1d2> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 248e: 80 e4 ldi r24, 0x40 ; 64 - 2490: e0 e4 ldi r30, 0x40 ; 64 - 2492: f6 e0 ldi r31, 0x06 ; 6 - 2494: 86 83 std Z+6, r24 ; 0x06 + 231a: 80 e4 ldi r24, 0x40 ; 64 + 231c: 80 93 46 06 sts 0x0646, r24 } LoadModState = LOADMOD_DATA1; - 2496: 85 e0 ldi r24, 0x05 ; 5 - 2498: 80 93 b6 20 sts 0x20B6, r24 + 2320: 85 e0 ldi r24, 0x05 ; 5 + 2322: 80 93 a6 20 sts 0x20A6, r24 break; - 249c: de cf rjmp .-68 ; 0x245a <__vector_83+0x3e> + 2326: e2 cf rjmp .-60 ; 0x22ec <__vector_83+0x36> ISR(CODEC_TIMER_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 249e: 89 30 cpi r24, 0x09 ; 9 - 24a0: 09 f4 brne .+2 ; 0x24a4 <__vector_83+0x88> - 24a2: 61 c0 rjmp .+194 ; 0x2566 <__vector_83+0x14a> - 24a4: 8a 30 cpi r24, 0x0A ; 10 - 24a6: c9 f6 brne .-78 ; 0x245a <__vector_83+0x3e> + 2328: 89 30 cpi r24, 0x09 ; 9 + 232a: 09 f4 brne .+2 ; 0x232e <__vector_83+0x78> + 232c: 5b c0 rjmp .+182 ; 0x23e4 <__vector_83+0x12e> + 232e: 8a 30 cpi r24, 0x0A ; 10 + 2330: e9 f6 brne .-70 ; 0x22ec <__vector_83+0x36> case LOADMOD_FINISHED: /* We have written all of our bits. Deactivate the loadmod * timer. Also disable the bit-rate interrupt again. And * stop the subcarrier divider. */ CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; - 24a8: 10 92 40 09 sts 0x0940, r1 + 2332: 10 92 40 09 sts 0x0940, r1 CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 24ac: e0 e4 ldi r30, 0x40 ; 64 - 24ae: f9 e0 ldi r31, 0x09 ; 9 - 24b0: 16 82 std Z+6, r1 ; 0x06 + 2336: 10 92 46 09 sts 0x0946, r1 CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; - 24b2: 10 92 00 08 sts 0x0800, r1 + 233a: 10 92 00 08 sts 0x0800, r1 /* Signal application that we have finished loadmod */ Flags.LoadmodFinished = 1; - 24b6: 81 e0 ldi r24, 0x01 ; 1 - 24b8: 80 93 c0 20 sts 0x20C0, r24 + 233e: 81 e0 ldi r24, 0x01 ; 1 + 2340: 80 93 b0 20 sts 0x20B0, r24 break; - 24bc: ce cf rjmp .-100 ; 0x245a <__vector_83+0x3e> + 2344: d3 cf rjmp .-90 ; 0x22ec <__vector_83+0x36> ISR(CODEC_TIMER_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 24be: 88 23 and r24, r24 - 24c0: 09 f4 brne .+2 ; 0x24c4 <__vector_83+0xa8> - 24c2: 59 c0 rjmp .+178 ; 0x2576 <__vector_83+0x15a> - 24c4: 81 30 cpi r24, 0x01 ; 1 - 24c6: 49 f6 brne .-110 ; 0x245a <__vector_83+0x3e> + 2346: 88 23 and r24, r24 + 2348: 09 f4 brne .+2 ; 0x234c <__vector_83+0x96> + 234a: 53 c0 rjmp .+166 ; 0x23f2 <__vector_83+0x13c> + 234c: 81 30 cpi r24, 0x01 ; 1 + 234e: 71 f6 brne .-100 ; 0x22ec <__vector_83+0x36> break; case LOADMOD_START: /* Application produced data. With this interrupt we are aligned to the bit-grid. * Start subcarrier generation and align to bitrate. */ CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_RATE_CYCLES / 2 - 1; - 24c8: 8f e3 ldi r24, 0x3F ; 63 - 24ca: 90 e0 ldi r25, 0x00 ; 0 - 24cc: e0 e4 ldi r30, 0x40 ; 64 - 24ce: f9 e0 ldi r31, 0x09 ; 9 - 24d0: 86 a3 lds r24, 0x56 - 24d2: 97 a3 lds r25, 0x57 + 2350: 8f e3 ldi r24, 0x3F ; 63 + 2352: 90 e0 ldi r25, 0x00 ; 0 + 2354: 80 93 66 09 sts 0x0966, r24 + 2358: 90 93 67 09 sts 0x0967, r25 CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_EVCH6_gc; - 24d4: 8e e0 ldi r24, 0x0E ; 14 - 24d6: 80 93 00 08 sts 0x0800, r24 + 235c: 8e e0 ldi r24, 0x0E ; 14 + 235e: 80 93 00 08 sts 0x0800, r24 /* Fallthrough to first bit */ case LOADMOD_START_BIT0: CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 24da: 80 e4 ldi r24, 0x40 ; 64 - 24dc: e0 e4 ldi r30, 0x40 ; 64 - 24de: f6 e0 ldi r31, 0x06 ; 6 - 24e0: 85 83 std Z+5, r24 ; 0x05 + 2362: 80 e4 ldi r24, 0x40 ; 64 + 2364: 80 93 45 06 sts 0x0645, r24 LoadModState = LOADMOD_START_BIT1; - 24e2: 83 e0 ldi r24, 0x03 ; 3 - 24e4: 80 93 b6 20 sts 0x20B6, r24 + 2368: 83 e0 ldi r24, 0x03 ; 3 + 236a: 80 93 a6 20 sts 0x20A6, r24 break; - 24e8: b8 cf rjmp .-144 ; 0x245a <__vector_83+0x3e> + 236e: be cf rjmp .-132 ; 0x22ec <__vector_83+0x36> LoadModState = LOADMOD_DATA1; break; case LOADMOD_DATA1: Temp8 = DataRegister; - 24ea: 80 91 ba 20 lds r24, 0x20BA + 2370: 80 91 aa 20 lds r24, 0x20AA if (Temp8 & 1) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 24ee: 90 e4 ldi r25, 0x40 ; 64 - 24f0: e0 e4 ldi r30, 0x40 ; 64 - 24f2: f6 e0 ldi r31, 0x06 ; 6 + 2374: 90 e4 ldi r25, 0x40 ; 64 break; case LOADMOD_DATA1: Temp8 = DataRegister; if (Temp8 & 1) { - 24f4: 80 fd sbrc r24, 0 - 24f6: 90 c0 rjmp .+288 ; 0x2618 <__vector_83+0x1fc> + 2376: 80 fd sbrc r24, 0 + 2378: 84 c0 rjmp .+264 ; 0x2482 <__vector_83+0x1cc> CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 24f8: 95 83 std Z+5, r25 ; 0x05 + 237a: 90 93 45 06 sts 0x0645, r25 } DataRegister = Temp8 >> 1; - 24fa: 86 95 lsr r24 - 24fc: 80 93 ba 20 sts 0x20BA, r24 + 237e: 86 95 lsr r24 + 2380: 80 93 aa 20 sts 0x20AA, r24 Temp16 = BitSent; - 2500: 80 91 bb 20 lds r24, 0x20BB - 2504: 90 91 bc 20 lds r25, 0x20BC + 2384: 80 91 ab 20 lds r24, 0x20AB + 2388: 90 91 ac 20 lds r25, 0x20AC BitSent = ++Temp16; - 2508: 01 96 adiw r24, 0x01 ; 1 - 250a: 80 93 bb 20 sts 0x20BB, r24 - 250e: 90 93 bc 20 sts 0x20BC, r25 + 238c: 01 96 adiw r24, 0x01 ; 1 + 238e: 80 93 ab 20 sts 0x20AB, r24 + 2392: 90 93 ac 20 sts 0x20AC, r25 if ((Temp16 & 0x07) == 0) { - 2512: 9c 01 movw r18, r24 - 2514: 27 70 andi r18, 0x07 ; 7 - 2516: 30 70 andi r19, 0x00 ; 0 - 2518: 21 15 cp r18, r1 - 251a: 31 05 cpc r19, r1 - 251c: 09 f4 brne .+2 ; 0x2520 <__vector_83+0x104> - 251e: 83 c0 rjmp .+262 ; 0x2626 <__vector_83+0x20a> + 2396: 9c 01 movw r18, r24 + 2398: 27 70 andi r18, 0x07 ; 7 + 239a: 33 27 eor r19, r19 + 239c: 23 2b or r18, r19 + 239e: 09 f4 brne .+2 ; 0x23a2 <__vector_83+0xec> + 23a0: 77 c0 rjmp .+238 ; 0x2490 <__vector_83+0x1da> /* Byte boundary. Load parity bit and output it later. */ LoadModState = LOADMOD_PARITY0; break; } if (Temp16 == BitCount) { - 2520: 20 91 bd 20 lds r18, 0x20BD - 2524: 30 91 be 20 lds r19, 0x20BE - 2528: 82 17 cp r24, r18 - 252a: 93 07 cpc r25, r19 - 252c: 09 f0 breq .+2 ; 0x2530 <__vector_83+0x114> - 252e: 55 c0 rjmp .+170 ; 0x25da <__vector_83+0x1be> + 23a2: 20 91 ad 20 lds r18, 0x20AD + 23a6: 30 91 ae 20 lds r19, 0x20AE + 23aa: 82 17 cp r24, r18 + 23ac: 93 07 cpc r25, r19 + 23ae: 09 f0 breq .+2 ; 0x23b2 <__vector_83+0xfc> + 23b0: 4e c0 rjmp .+156 ; 0x244e <__vector_83+0x198> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } if (BitSent == BitCount) { /* No data left */ LoadModState = LOADMOD_STOP_BIT0; - 2530: 88 e0 ldi r24, 0x08 ; 8 - 2532: 80 93 b6 20 sts 0x20B6, r24 - 2536: 91 cf rjmp .-222 ; 0x245a <__vector_83+0x3e> + 23b2: 88 e0 ldi r24, 0x08 ; 8 + 23b4: 80 93 a6 20 sts 0x20A6, r24 + 23b8: 99 cf rjmp .-206 ; 0x22ec <__vector_83+0x36> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; LoadModState = LOADMOD_START_BIT1; break; case LOADMOD_START_BIT1: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2538: 80 e4 ldi r24, 0x40 ; 64 - 253a: e0 e4 ldi r30, 0x40 ; 64 - 253c: f6 e0 ldi r31, 0x06 ; 6 - 253e: 86 83 std Z+6, r24 ; 0x06 + 23ba: 80 e4 ldi r24, 0x40 ; 64 + 23bc: 80 93 46 06 sts 0x0646, r24 LoadModState = LOADMOD_DATA0; - 2540: 84 e0 ldi r24, 0x04 ; 4 - 2542: 80 93 b6 20 sts 0x20B6, r24 + 23c0: 84 e0 ldi r24, 0x04 ; 4 + 23c2: 80 93 a6 20 sts 0x20A6, r24 /* Fetch first byte */ DataRegister = *CodecBufferPtr; - 2546: e0 91 c1 20 lds r30, 0x20C1 - 254a: f0 91 c2 20 lds r31, 0x20C2 - 254e: 80 81 ld r24, Z - 2550: 80 93 ba 20 sts 0x20BA, r24 + 23c6: e0 91 b1 20 lds r30, 0x20B1 + 23ca: f0 91 b2 20 lds r31, 0x20B2 + 23ce: 80 81 ld r24, Z + 23d0: 80 93 aa 20 sts 0x20AA, r24 break; - 2554: 82 cf rjmp .-252 ; 0x245a <__vector_83+0x3e> + 23d4: 8b cf rjmp .-234 ; 0x22ec <__vector_83+0x36> } break; case LOADMOD_STOP_BIT0: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2556: 80 e4 ldi r24, 0x40 ; 64 - 2558: e0 e4 ldi r30, 0x40 ; 64 - 255a: f6 e0 ldi r31, 0x06 ; 6 - 255c: 86 83 std Z+6, r24 ; 0x06 + 23d6: 80 e4 ldi r24, 0x40 ; 64 + 23d8: 80 93 46 06 sts 0x0646, r24 LoadModState = LOADMOD_STOP_BIT1; - 255e: 89 e0 ldi r24, 0x09 ; 9 - 2560: 80 93 b6 20 sts 0x20B6, r24 + 23dc: 89 e0 ldi r24, 0x09 ; 9 + 23de: 80 93 a6 20 sts 0x20A6, r24 break; - 2564: 7a cf rjmp .-268 ; 0x245a <__vector_83+0x3e> + 23e2: 84 cf rjmp .-248 ; 0x22ec <__vector_83+0x36> case LOADMOD_STOP_BIT1: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2566: 80 e4 ldi r24, 0x40 ; 64 - 2568: e0 e4 ldi r30, 0x40 ; 64 - 256a: f6 e0 ldi r31, 0x06 ; 6 - 256c: 86 83 std Z+6, r24 ; 0x06 + 23e4: 80 e4 ldi r24, 0x40 ; 64 + 23e6: 80 93 46 06 sts 0x0646, r24 LoadModState = LOADMOD_FINISHED; - 256e: 8a e0 ldi r24, 0x0A ; 10 - 2570: 80 93 b6 20 sts 0x20B6, r24 + 23ea: 8a e0 ldi r24, 0x0A ; 10 + 23ec: 80 93 a6 20 sts 0x20A6, r24 break; - 2574: 72 cf rjmp .-284 ; 0x245a <__vector_83+0x3e> + 23f0: 7d cf rjmp .-262 ; 0x22ec <__vector_83+0x36> uint16_t Temp16; switch (LoadModState) { case LOADMOD_FDT: /* No data has been produced, but FDT has ended. Switch over to bit-grid aligning. */ CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_GRID_CYCLES - 1; - 2576: 8f e7 ldi r24, 0x7F ; 127 - 2578: 90 e0 ldi r25, 0x00 ; 0 - 257a: e0 e4 ldi r30, 0x40 ; 64 - 257c: f9 e0 ldi r31, 0x09 ; 9 - 257e: 86 a3 lds r24, 0x56 - 2580: 97 a3 lds r25, 0x57 + 23f2: 8f e7 ldi r24, 0x7F ; 127 + 23f4: 90 e0 ldi r25, 0x00 ; 0 + 23f6: 80 93 66 09 sts 0x0966, r24 + 23fa: 90 93 67 09 sts 0x0967, r25 break; - 2582: 6b cf rjmp .-298 ; 0x245a <__vector_83+0x3e> + 23fe: 76 cf rjmp .-276 ; 0x22ec <__vector_83+0x36> LoadModState = LOADMOD_PARITY1; break; case LOADMOD_PARITY1: if (*ParityBufferPtr) { - 2584: e0 91 c3 20 lds r30, 0x20C3 - 2588: f0 91 c4 20 lds r31, 0x20C4 - 258c: 80 81 ld r24, Z - 258e: 88 23 and r24, r24 - 2590: e1 f5 brne .+120 ; 0x260a <__vector_83+0x1ee> + 2400: e0 91 b3 20 lds r30, 0x20B3 + 2404: f0 91 b4 20 lds r31, 0x20B4 + 2408: 80 81 ld r24, Z + 240a: 81 11 cpse r24, r1 + 240c: 36 c0 rjmp .+108 ; 0x247a <__vector_83+0x1c4> CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 2592: 80 e4 ldi r24, 0x40 ; 64 - 2594: a0 e4 ldi r26, 0x40 ; 64 - 2596: b6 e0 ldi r27, 0x06 ; 6 - 2598: 15 96 adiw r26, 0x05 ; 5 - 259a: 8c 93 st X, r24 - 259c: 15 97 sbiw r26, 0x05 ; 5 + 240e: 80 e4 ldi r24, 0x40 ; 64 + 2410: 80 93 45 06 sts 0x0645, r24 } if (BitSent == BitCount) { - 259e: 20 91 bb 20 lds r18, 0x20BB - 25a2: 30 91 bc 20 lds r19, 0x20BC - 25a6: 80 91 bd 20 lds r24, 0x20BD - 25aa: 90 91 be 20 lds r25, 0x20BE - 25ae: 28 17 cp r18, r24 - 25b0: 39 07 cpc r19, r25 - 25b2: 09 f4 brne .+2 ; 0x25b6 <__vector_83+0x19a> - 25b4: bd cf rjmp .-134 ; 0x2530 <__vector_83+0x114> + 2414: 20 91 ab 20 lds r18, 0x20AB + 2418: 30 91 ac 20 lds r19, 0x20AC + 241c: 80 91 ad 20 lds r24, 0x20AD + 2420: 90 91 ae 20 lds r25, 0x20AE + 2424: 28 17 cp r18, r24 + 2426: 39 07 cpc r19, r25 + 2428: 21 f2 breq .-120 ; 0x23b2 <__vector_83+0xfc> /* No data left */ LoadModState = LOADMOD_STOP_BIT0; } else { /* Fetch next data and continue sending bits. */ ParityBufferPtr++; - 25b6: 31 96 adiw r30, 0x01 ; 1 - 25b8: e0 93 c3 20 sts 0x20C3, r30 - 25bc: f0 93 c4 20 sts 0x20C4, r31 + 242a: 31 96 adiw r30, 0x01 ; 1 + 242c: e0 93 b3 20 sts 0x20B3, r30 + 2430: f0 93 b4 20 sts 0x20B4, r31 DataRegister = *++CodecBufferPtr; - 25c0: e0 91 c1 20 lds r30, 0x20C1 - 25c4: f0 91 c2 20 lds r31, 0x20C2 - 25c8: cf 01 movw r24, r30 - 25ca: 01 96 adiw r24, 0x01 ; 1 - 25cc: 80 93 c1 20 sts 0x20C1, r24 - 25d0: 90 93 c2 20 sts 0x20C2, r25 - 25d4: 81 81 ldd r24, Z+1 ; 0x01 - 25d6: 80 93 ba 20 sts 0x20BA, r24 + 2434: e0 91 b1 20 lds r30, 0x20B1 + 2438: f0 91 b2 20 lds r31, 0x20B2 + 243c: cf 01 movw r24, r30 + 243e: 01 96 adiw r24, 0x01 ; 1 + 2440: 80 93 b1 20 sts 0x20B1, r24 + 2444: 90 93 b2 20 sts 0x20B2, r25 + 2448: 81 81 ldd r24, Z+1 ; 0x01 + 244a: 80 93 aa 20 sts 0x20AA, r24 LoadModState = LOADMOD_DATA0; - 25da: 84 e0 ldi r24, 0x04 ; 4 - 25dc: 80 93 b6 20 sts 0x20B6, r24 - 25e0: 3c cf rjmp .-392 ; 0x245a <__vector_83+0x3e> + 244e: 84 e0 ldi r24, 0x04 ; 4 + 2450: 80 93 a6 20 sts 0x20A6, r24 + 2454: 4b cf rjmp .-362 ; 0x22ec <__vector_83+0x36> LoadModState = LOADMOD_DATA0; break; case LOADMOD_PARITY0: if (*ParityBufferPtr) { - 25e2: e0 91 c3 20 lds r30, 0x20C3 - 25e6: f0 91 c4 20 lds r31, 0x20C4 - 25ea: 80 81 ld r24, Z - 25ec: 88 23 and r24, r24 - 25ee: 41 f4 brne .+16 ; 0x2600 <__vector_83+0x1e4> + 2456: e0 91 b3 20 lds r30, 0x20B3 + 245a: f0 91 b4 20 lds r31, 0x20B4 + 245e: 80 81 ld r24, Z + 2460: 81 11 cpse r24, r1 + 2462: 07 c0 rjmp .+14 ; 0x2472 <__vector_83+0x1bc> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 25f0: 80 e4 ldi r24, 0x40 ; 64 - 25f2: e0 e4 ldi r30, 0x40 ; 64 - 25f4: f6 e0 ldi r31, 0x06 ; 6 - 25f6: 86 83 std Z+6, r24 ; 0x06 + 2464: 80 e4 ldi r24, 0x40 ; 64 + 2466: 80 93 46 06 sts 0x0646, r24 } LoadModState = LOADMOD_PARITY1; - 25f8: 87 e0 ldi r24, 0x07 ; 7 - 25fa: 80 93 b6 20 sts 0x20B6, r24 + 246a: 87 e0 ldi r24, 0x07 ; 7 + 246c: 80 93 a6 20 sts 0x20A6, r24 break; - 25fe: 2d cf rjmp .-422 ; 0x245a <__vector_83+0x3e> + 2470: 3d cf rjmp .-390 ; 0x22ec <__vector_83+0x36> break; case LOADMOD_PARITY0: if (*ParityBufferPtr) { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 2600: 80 e4 ldi r24, 0x40 ; 64 - 2602: e0 e4 ldi r30, 0x40 ; 64 - 2604: f6 e0 ldi r31, 0x06 ; 6 - 2606: 85 83 std Z+5, r24 ; 0x05 - 2608: f7 cf rjmp .-18 ; 0x25f8 <__vector_83+0x1dc> + 2472: 80 e4 ldi r24, 0x40 ; 64 + 2474: 80 93 45 06 sts 0x0645, r24 + 2478: f8 cf rjmp .-16 ; 0x246a <__vector_83+0x1b4> LoadModState = LOADMOD_PARITY1; break; case LOADMOD_PARITY1: if (*ParityBufferPtr) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 260a: 80 e4 ldi r24, 0x40 ; 64 - 260c: a0 e4 ldi r26, 0x40 ; 64 - 260e: b6 e0 ldi r27, 0x06 ; 6 - 2610: 16 96 adiw r26, 0x06 ; 6 - 2612: 8c 93 st X, r24 - 2614: 16 97 sbiw r26, 0x06 ; 6 - 2616: c3 cf rjmp .-122 ; 0x259e <__vector_83+0x182> + 247a: 80 e4 ldi r24, 0x40 ; 64 + 247c: 80 93 46 06 sts 0x0646, r24 + 2480: c9 cf rjmp .-110 ; 0x2414 <__vector_83+0x15e> case LOADMOD_DATA1: Temp8 = DataRegister; if (Temp8 & 1) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2618: 96 83 std Z+6, r25 ; 0x06 - 261a: 6f cf rjmp .-290 ; 0x24fa <__vector_83+0xde> + 2482: 90 93 46 06 sts 0x0646, r25 + 2486: 7b cf rjmp .-266 ; 0x237e <__vector_83+0xc8> DataRegister = *CodecBufferPtr; break; case LOADMOD_DATA0: if (DataRegister & 1) { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 261c: 80 e4 ldi r24, 0x40 ; 64 - 261e: e0 e4 ldi r30, 0x40 ; 64 - 2620: f6 e0 ldi r31, 0x06 ; 6 - 2622: 85 83 std Z+5, r24 ; 0x05 - 2624: 38 cf rjmp .-400 ; 0x2496 <__vector_83+0x7a> + 2488: 80 e4 ldi r24, 0x40 ; 64 + 248a: 80 93 45 06 sts 0x0645, r24 + 248e: 48 cf rjmp .-368 ; 0x2320 <__vector_83+0x6a> Temp16 = BitSent; BitSent = ++Temp16; if ((Temp16 & 0x07) == 0) { /* Byte boundary. Load parity bit and output it later. */ LoadModState = LOADMOD_PARITY0; - 2626: 86 e0 ldi r24, 0x06 ; 6 - 2628: 80 93 b6 20 sts 0x20B6, r24 + 2490: 86 e0 ldi r24, 0x06 ; 6 + 2492: 80 93 a6 20 sts 0x20A6, r24 break; - 262c: 16 cf rjmp .-468 ; 0x245a <__vector_83+0x3e> + 2496: 2a cf rjmp .-428 ; 0x22ec <__vector_83+0x36> -0000262e : +00002498 : default: break; } } void ISO14443ACodecInit(void) { - 262e: cf 93 push r28 - 2630: df 93 push r29 + 2498: cf 93 push r28 + 249a: df 93 push r29 static volatile LoadModStateType LoadModState; static volatile bool SamplePosition; static void Initialize(void) { /* Configure CARRIER input pin and route it to EVSYS */ CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK; - 2632: e0 e4 ldi r30, 0x40 ; 64 - 2634: f6 e0 ldi r31, 0x06 ; 6 - 2636: 84 e0 ldi r24, 0x04 ; 4 - 2638: 82 83 std Z+2, r24 ; 0x02 + 249c: e0 e4 ldi r30, 0x40 ; 64 + 249e: f6 e0 ldi r31, 0x06 ; 6 + 24a0: 84 e0 ldi r24, 0x04 ; 4 + 24a2: 82 83 std Z+2, r24 ; 0x02 CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc; - 263a: 12 8a std Z+18, r1 ; 0x12 + 24a4: 12 8a std Z+18, r1 ; 0x12 EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; - 263c: c0 e8 ldi r28, 0x80 ; 128 - 263e: d1 e0 ldi r29, 0x01 ; 1 - 2640: 82 e6 ldi r24, 0x62 ; 98 - 2642: 8e 83 std Y+6, r24 ; 0x06 + 24a6: c0 e8 ldi r28, 0x80 ; 128 + 24a8: d1 e0 ldi r29, 0x01 ; 1 + 24aa: 82 e6 ldi r24, 0x62 ; 98 + 24ac: 8e 83 std Y+6, r24 ; 0x06 /* Configure two DEMOD pins for input. * Configure event channel 0 for rising edge (begin of modulation pause) * Configure event channel 1 for falling edge (end of modulation pause) */ CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK; - 2644: a0 e2 ldi r26, 0x20 ; 32 - 2646: b6 e0 ldi r27, 0x06 ; 6 - 2648: 85 e0 ldi r24, 0x05 ; 5 - 264a: 12 96 adiw r26, 0x02 ; 2 - 264c: 8c 93 st X, r24 - 264e: 12 97 sbiw r26, 0x02 ; 2 + 24ae: a0 e2 ldi r26, 0x20 ; 32 + 24b0: b6 e0 ldi r27, 0x06 ; 6 + 24b2: 85 e0 ldi r24, 0x05 ; 5 + 24b4: 12 96 adiw r26, 0x02 ; 2 + 24b6: 8c 93 st X, r24 + 24b8: 12 97 sbiw r26, 0x02 ; 2 CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; - 2650: 81 e0 ldi r24, 0x01 ; 1 - 2652: 50 96 adiw r26, 0x10 ; 16 - 2654: 8c 93 st X, r24 - 2656: 50 97 sbiw r26, 0x10 ; 16 + 24ba: 81 e0 ldi r24, 0x01 ; 1 + 24bc: 50 96 adiw r26, 0x10 ; 16 + 24be: 8c 93 st X, r24 + 24c0: 50 97 sbiw r26, 0x10 ; 16 CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; - 2658: 82 e0 ldi r24, 0x02 ; 2 - 265a: 52 96 adiw r26, 0x12 ; 18 - 265c: 8c 93 st X, r24 - 265e: 52 97 sbiw r26, 0x12 ; 18 + 24c2: 82 e0 ldi r24, 0x02 ; 2 + 24c4: 52 96 adiw r26, 0x12 ; 18 + 24c6: 8c 93 st X, r24 + 24c8: 52 97 sbiw r26, 0x12 ; 18 CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 2660: 1a 96 adiw r26, 0x0a ; 10 - 2662: 1c 92 st X, r1 - 2664: 1a 97 sbiw r26, 0x0a ; 10 + 24ca: 1a 96 adiw r26, 0x0a ; 10 + 24cc: 1c 92 st X, r1 + 24ce: 1a 97 sbiw r26, 0x0a ; 10 CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; - 2666: 83 e0 ldi r24, 0x03 ; 3 - 2668: 19 96 adiw r26, 0x09 ; 9 - 266a: 8c 93 st X, r24 + 24d0: 83 e0 ldi r24, 0x03 ; 3 + 24d2: 19 96 adiw r26, 0x09 ; 9 + 24d4: 8c 93 st X, r24 EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; - 266c: 98 e5 ldi r25, 0x58 ; 88 - 266e: 98 83 st Y, r25 + 24d6: 98 e5 ldi r25, 0x58 ; 88 + 24d8: 98 83 st Y, r25 EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; - 2670: 9a e5 ldi r25, 0x5A ; 90 - 2672: 99 83 std Y+1, r25 ; 0x01 + 24da: 9a e5 ldi r25, 0x5A ; 90 + 24dc: 99 83 std Y+1, r25 ; 0x01 /* Configure LOADMOD and SUBCARRIER output pins. * Disable PSK modulation by setting pin to low. */ CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK; - 2674: 90 e4 ldi r25, 0x40 ; 64 - 2676: 91 83 std Z+1, r25 ; 0x01 + 24de: 90 e4 ldi r25, 0x40 ; 64 + 24e0: 91 83 std Z+1, r25 ; 0x01 CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2678: 96 83 std Z+6, r25 ; 0x06 + 24e2: 96 83 std Z+6, r25 ; 0x06 CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK; - 267a: 81 83 std Z+1, r24 ; 0x01 + 24e4: 81 83 std Z+1, r24 ; 0x01 CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK; - 267c: 86 83 std Z+6, r24 ; 0x06 + 24e6: 86 83 std Z+6, r24 ; 0x06 /* Configure subcarrier generation with 50% DC output using OOK */ CODEC_SUBCARRIER_TIMER.PER = ISO14443A_SUBCARRIER_DIVIDER - 1; - 267e: e0 e0 ldi r30, 0x00 ; 0 - 2680: f8 e0 ldi r31, 0x08 ; 8 - 2682: 8f e0 ldi r24, 0x0F ; 15 - 2684: 90 e0 ldi r25, 0x00 ; 0 - 2686: 86 a3 lds r24, 0x56 - 2688: 97 a3 lds r25, 0x57 + 24e8: e0 e0 ldi r30, 0x00 ; 0 + 24ea: f8 e0 ldi r31, 0x08 ; 8 + 24ec: 8f e0 ldi r24, 0x0F ; 15 + 24ee: 90 e0 ldi r25, 0x00 ; 0 + 24f0: 86 a3 std Z+38, r24 ; 0x26 + 24f2: 97 a3 std Z+39, r25 ; 0x27 CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = ISO14443A_SUBCARRIER_DIVIDER/2; - 268a: 88 e0 ldi r24, 0x08 ; 8 - 268c: 90 e0 ldi r25, 0x00 ; 0 - 268e: 82 a7 lds r24, 0x72 - 2690: 93 a7 lds r25, 0x73 + 24f4: 88 e0 ldi r24, 0x08 ; 8 + 24f6: 90 e0 ldi r25, 0x00 ; 0 + 24f8: 82 a7 std Z+42, r24 ; 0x2a + 24fa: 93 a7 std Z+43, r25 ; 0x2b CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; - 2692: 83 e2 ldi r24, 0x23 ; 35 - 2694: 81 83 std Z+1, r24 ; 0x01 + 24fc: 83 e2 ldi r24, 0x23 ; 35 + 24fe: 81 83 std Z+1, r24 ; 0x01 +void ISO14443ACodecInit(void) { + /* Initialize common peripherals and start listening + * for incoming data. */ + Initialize(); + StartDemod(); +} + 2500: df 91 pop r29 + 2502: cf 91 pop r28 void ISO14443ACodecInit(void) { /* Initialize common peripherals and start listening * for incoming data. */ Initialize(); StartDemod(); - 2696: bb dd rcall .-1162 ; 0x220e - 2698: df 91 pop r29 -} - 269a: cf 91 pop r28 - 269c: 08 95 ret + 2504: d2 cd rjmp .-1116 ; 0x20aa -0000269e : - 269e: 80 91 bf 20 lds r24, 0x20BF +00002506 : +} void ISO14443ACodecTask(void) { + 2506: cf 93 push r28 + 2508: df 93 push r29 if (Flags.DemodFinished) { - 26a2: 88 23 and r24, r24 - 26a4: c9 f0 breq .+50 ; 0x26d8 + 250a: 80 91 af 20 lds r24, 0x20AF + 250e: 88 23 and r24, r24 + 2510: c1 f0 breq .+48 ; 0x2542 Flags.DemodFinished = 0; - 26a6: 10 92 bf 20 sts 0x20BF, r1 + 2512: 10 92 af 20 sts 0x20AF, r1 INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); } INLINE void CodecSetDemodPower(bool bOnOff) { CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 26aa: e0 e2 ldi r30, 0x20 ; 32 - 26ac: f6 e0 ldi r31, 0x06 ; 6 - 26ae: 82 e0 ldi r24, 0x02 ; 2 - 26b0: 81 83 std Z+1, r24 ; 0x01 + 2516: 82 e0 ldi r24, 0x02 ; 2 + 2518: 80 93 21 06 sts 0x0621, r24 if (bOnOff) { CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; } else { CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK; - 26b2: 86 83 std Z+6, r24 ; 0x06 + 251c: 80 93 26 06 sts 0x0626, r24 /* Reception finished. Process the received bytes */ CodecSetDemodPower(false); uint16_t DemodBitCount = BitCount; - 26b4: 60 91 bd 20 lds r22, 0x20BD - 26b8: 70 91 be 20 lds r23, 0x20BE + 2520: 60 91 ad 20 lds r22, 0x20AD + 2524: 70 91 ae 20 lds r23, 0x20AE uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; if (DemodBitCount > 0) { - 26bc: 61 15 cp r22, r1 - 26be: 71 05 cpc r23, r1 - 26c0: 99 f4 brne .+38 ; 0x26e8 + 2528: 61 15 cp r22, r1 + 252a: 71 05 cpc r23, r1 + 252c: 89 f4 brne .+34 ; 0x2550 INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); } INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); - 26c2: e0 91 ff 20 lds r30, 0x20FF - 26c6: f0 91 00 21 lds r31, 0x2100 - 26ca: 09 95 icall + 252e: e0 91 ef 20 lds r30, 0x20EF + 2532: f0 91 f0 20 lds r31, 0x20F0 + 2536: 09 95 icall CodecBufferPtr = CodecBuffer; ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; LoadModState = LOADMOD_START; } else { /* No data to be processed. Disable loadmodding and start listening again */ CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; - 26cc: 10 92 40 09 sts 0x0940, r1 + 2538: 10 92 40 09 sts 0x0940, r1 CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 26d0: e0 e4 ldi r30, 0x40 ; 64 - 26d2: f9 e0 ldi r31, 0x09 ; 9 - 26d4: 16 82 std Z+6, r1 ; 0x06 + 253c: 10 92 46 09 sts 0x0946, r1 StartDemod(); - 26d6: 9b dd rcall .-1226 ; 0x220e - 26d8: 80 91 c0 20 lds r24, 0x20C0 + 2540: b4 dd rcall .-1176 ; 0x20aa } } if (Flags.LoadmodFinished) { - 26dc: 88 23 and r24, r24 - 26de: 09 f4 brne .+2 ; 0x26e2 - 26e0: 08 95 ret - 26e2: 10 92 c0 20 sts 0x20C0, r1 + 2542: 80 91 b0 20 lds r24, 0x20B0 + 2546: 81 11 cpse r24, r1 + 2548: 2a c0 rjmp .+84 ; 0x259e Flags.LoadmodFinished = 0; - 26e6: 93 cd rjmp .-1242 ; 0x220e /* Load modulation has been finished. Stop it and start to listen * for incoming data again. */ StartDemod(); - 26e8: e0 91 03 21 lds r30, 0x2103 - 26ec: f0 91 04 21 lds r31, 0x2104 + } +} + 254a: df 91 pop r29 + 254c: cf 91 pop r28 + 254e: 08 95 ret INLINE void ApplicationTask(void) { ActiveConfiguration.ApplicationTaskFunc(); } INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); - 26f0: 80 e2 ldi r24, 0x20 ; 32 - 26f2: 92 e2 ldi r25, 0x22 ; 34 - 26f4: 09 95 icall - 26f6: 9c 01 movw r18, r24 - 26f8: 94 fd sbrc r25, 4 - 26fa: 28 c0 rjmp .+80 ; 0x274c - 26fc: ac 01 movw r20, r24 + 2550: e0 91 f3 20 lds r30, 0x20F3 + 2554: f0 91 f4 20 lds r31, 0x20F4 + 2558: 80 e1 ldi r24, 0x10 ; 16 + 255a: 92 e2 ldi r25, 0x22 ; 34 + 255c: 09 95 icall if (DemodBitCount > 0) { /* Call application if we received data */ AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { - 26fe: 56 95 lsr r21 - 2700: 47 95 ror r20 + 255e: 94 ff sbrs r25, 4 + 2560: 23 c0 rjmp .+70 ; 0x25a8 /* Application has generated it's own parity bits. * Clear this option bit. */ AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - } else { - /* We have to generate the parity bits ourself */ - for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - 2702: 56 95 lsr r21 - 2704: 47 95 ror r20 - 2706: 56 95 lsr r21 - 2708: 47 95 ror r20 - 270a: 41 15 cp r20, r1 - 270c: 51 05 cpc r21, r1 - 270e: f9 f0 breq .+62 ; 0x274e - 2710: 60 e0 ldi r22, 0x00 ; 0 - 2712: e0 e0 ldi r30, 0x00 ; 0 - 2714: f0 e0 ldi r31, 0x00 ; 0 - 2716: e0 5e subi r30, 0xE0 ; 224 - 2718: fd 4d sbci r31, 0xDD ; 221 - 271a: 80 81 ld r24, Z - /* For each whole byte, generate a parity bit. */ - CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - ODD_PARITY(CodecBuffer[i]); - 271c: 08 2e mov r0, r24 - 271e: 82 95 swap r24 - 2720: 80 25 eor r24, r0 - 2722: 08 2e mov r0, r24 - 2724: 86 95 lsr r24 - 2726: 86 95 lsr r24 - 2728: 80 25 eor r24, r0 - 272a: e0 58 subi r30, 0x80 ; 128 - 272c: ff 4f sbci r31, 0xFF ; 255 - 272e: 90 e0 ldi r25, 0x00 ; 0 - AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - } else { - /* We have to generate the parity bits ourself */ - for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - /* For each whole byte, generate a parity bit. */ - CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - 2730: 01 96 adiw r24, 0x01 ; 1 - 2732: 95 95 asr r25 - ODD_PARITY(CodecBuffer[i]); - 2734: 87 95 ror r24 - 2736: 91 e0 ldi r25, 0x01 ; 1 - 2738: 80 fd sbrc r24, 0 - 273a: 90 e0 ldi r25, 0x00 ; 0 - 273c: 90 83 st Z, r25 - 273e: 6f 5f subi r22, 0xFF ; 255 - 2740: e6 2f mov r30, r22 - AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - } else { - /* We have to generate the parity bits ourself */ - for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - /* For each whole byte, generate a parity bit. */ - CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - 2742: f0 e0 ldi r31, 0x00 ; 0 - /* Application has generated it's own parity bits. - * Clear this option bit. */ - AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - } else { - /* We have to generate the parity bits ourself */ - for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - 2744: e4 17 cp r30, r20 - 2746: f5 07 cpc r31, r21 - 2748: 30 f3 brcs .-52 ; 0x2716 - 274a: 01 c0 rjmp .+2 ; 0x274e - 274c: 3f 7e andi r19, 0xEF ; 239 - 274e: 21 15 cp r18, r1 - 2750: 31 05 cpc r19, r1 - AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); - - if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { - /* Application has generated it's own parity bits. - * Clear this option bit. */ - AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - 2752: 09 f4 brne .+2 ; 0x2756 + 2562: 9f 7e andi r25, 0xEF ; 239 } } else { ApplicationReset(); } if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { - 2754: bb cf rjmp .-138 ; 0x26cc - 2756: 20 93 bd 20 sts 0x20BD, r18 - 275a: 30 93 be 20 sts 0x20BE, r19 + 2564: 00 97 sbiw r24, 0x00 ; 0 + 2566: 41 f3 breq .-48 ; 0x2538 BitCount = AnswerBitCount; - 275e: 10 92 bb 20 sts 0x20BB, r1 - 2762: 10 92 bc 20 sts 0x20BC, r1 + 2568: 80 93 ad 20 sts 0x20AD, r24 + 256c: 90 93 ae 20 sts 0x20AE, r25 BitSent = 0; - 2766: 80 e2 ldi r24, 0x20 ; 32 - 2768: 92 e2 ldi r25, 0x22 ; 34 - 276a: 80 93 c1 20 sts 0x20C1, r24 + 2570: 10 92 ab 20 sts 0x20AB, r1 + 2574: 10 92 ac 20 sts 0x20AC, r1 CodecBufferPtr = CodecBuffer; - 276e: 90 93 c2 20 sts 0x20C2, r25 - 2772: 80 ea ldi r24, 0xA0 ; 160 - 2774: 92 e2 ldi r25, 0x22 ; 34 - 2776: 80 93 c3 20 sts 0x20C3, r24 + 2578: 80 e1 ldi r24, 0x10 ; 16 + 257a: 92 e2 ldi r25, 0x22 ; 34 + 257c: 80 93 b1 20 sts 0x20B1, r24 + 2580: 90 93 b2 20 sts 0x20B2, r25 ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 277a: 90 93 c4 20 sts 0x20C4, r25 - 277e: 81 e0 ldi r24, 0x01 ; 1 - 2780: 80 93 b6 20 sts 0x20B6, r24 + 2584: 80 e9 ldi r24, 0x90 ; 144 + 2586: 92 e2 ldi r25, 0x22 ; 34 + 2588: 80 93 b3 20 sts 0x20B3, r24 + 258c: 90 93 b4 20 sts 0x20B4, r25 LoadModState = LOADMOD_START; - 2784: 80 91 c0 20 lds r24, 0x20C0 - 2788: 88 23 and r24, r24 + 2590: 81 e0 ldi r24, 0x01 ; 1 + 2592: 80 93 a6 20 sts 0x20A6, r24 StartDemod(); } } if (Flags.LoadmodFinished) { - 278a: 09 f4 brne .+2 ; 0x278e - 278c: a9 cf rjmp .-174 ; 0x26e0 - 278e: a9 cf rjmp .-174 ; 0x26e2 + 2596: 80 91 b0 20 lds r24, 0x20B0 + 259a: 88 23 and r24, r24 + 259c: b1 f2 breq .-84 ; 0x254a + Flags.LoadmodFinished = 0; + 259e: 10 92 b0 20 sts 0x20B0, r1 + /* Load modulation has been finished. Stop it and start to listen + * for incoming data again. */ + StartDemod(); + } +} + 25a2: df 91 pop r29 + 25a4: cf 91 pop r28 -00002790 : + if (Flags.LoadmodFinished) { + Flags.LoadmodFinished = 0; + /* Load modulation has been finished. Stop it and start to listen + * for incoming data again. */ + StartDemod(); + 25a6: 81 cd rjmp .-1278 ; 0x20aa + /* Application has generated it's own parity bits. + * Clear this option bit. */ + AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; + } else { + /* We have to generate the parity bits ourself */ + for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { + 25a8: ac 01 movw r20, r24 + 25aa: 56 95 lsr r21 + 25ac: 47 95 ror r20 + 25ae: 56 95 lsr r21 + 25b0: 47 95 ror r20 + 25b2: 56 95 lsr r21 + 25b4: 47 95 ror r20 + 25b6: 41 15 cp r20, r1 + 25b8: 51 05 cpc r21, r1 + 25ba: a1 f2 breq .-88 ; 0x2564 + 25bc: 60 e0 ldi r22, 0x00 ; 0 + 25be: 20 e0 ldi r18, 0x00 ; 0 + 25c0: 30 e0 ldi r19, 0x00 ; 0 + /* For each whole byte, generate a parity bit. */ + CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = + ODD_PARITY(CodecBuffer[i]); + 25c2: f9 01 movw r30, r18 + 25c4: e0 5f subi r30, 0xF0 ; 240 + 25c6: fd 4d sbci r31, 0xDD ; 221 + 25c8: 20 81 ld r18, Z + 25ca: 02 2e mov r0, r18 + 25cc: 22 95 swap r18 + 25ce: 20 25 eor r18, r0 + 25d0: 02 2e mov r0, r18 + 25d2: 26 95 lsr r18 + 25d4: 26 95 lsr r18 + 25d6: 20 25 eor r18, r0 + AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; + } else { + /* We have to generate the parity bits ourself */ + for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { + /* For each whole byte, generate a parity bit. */ + CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = + 25d8: e0 58 subi r30, 0x80 ; 128 + 25da: ff 4f sbci r31, 0xFF ; 255 + ODD_PARITY(CodecBuffer[i]); + 25dc: 30 e0 ldi r19, 0x00 ; 0 + 25de: 2f 5f subi r18, 0xFF ; 255 + 25e0: 3f 4f sbci r19, 0xFF ; 255 + 25e2: 21 fb bst r18, 1 + 25e4: 77 27 eor r23, r23 + 25e6: 70 f9 bld r23, 0 + 25e8: c7 2f mov r28, r23 + 25ea: 20 e0 ldi r18, 0x00 ; 0 + 25ec: d2 2f mov r29, r18 + 25ee: 71 e0 ldi r23, 0x01 ; 1 + 25f0: c7 27 eor r28, r23 + 25f2: c0 83 st Z, r28 + /* Application has generated it's own parity bits. + * Clear this option bit. */ + AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; + } else { + /* We have to generate the parity bits ourself */ + for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { + 25f4: 6f 5f subi r22, 0xFF ; 255 + 25f6: 26 2f mov r18, r22 + 25f8: 30 e0 ldi r19, 0x00 ; 0 + 25fa: 24 17 cp r18, r20 + 25fc: 35 07 cpc r19, r21 + 25fe: 08 f3 brcs .-62 ; 0x25c2 + 2600: b1 cf rjmp .-158 ; 0x2564 + +00002602 : Block[11] = Block[3]; } void MifareClassicAppInit1K(void) { State = STATE_IDLE; - 2790: 81 e0 ldi r24, 0x01 ; 1 - 2792: 80 93 c5 20 sts 0x20C5, r24 + 2602: 81 e0 ldi r24, 0x01 ; 1 + 2604: 80 93 b5 20 sts 0x20B5, r24 CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; - 2796: 84 e0 ldi r24, 0x04 ; 4 - 2798: 90 e0 ldi r25, 0x00 ; 0 - 279a: 80 93 c6 20 sts 0x20C6, r24 - 279e: 90 93 c7 20 sts 0x20C7, r25 + 2608: 84 e0 ldi r24, 0x04 ; 4 + 260a: 90 e0 ldi r25, 0x00 ; 0 + 260c: 80 93 b6 20 sts 0x20B6, r24 + 2610: 90 93 b7 20 sts 0x20B7, r25 CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; - 27a2: 88 e0 ldi r24, 0x08 ; 8 - 27a4: 80 93 c8 20 sts 0x20C8, r24 -} - 27a8: 08 95 ret + 2614: 88 e0 ldi r24, 0x08 ; 8 + 2616: 80 93 b8 20 sts 0x20B8, r24 + 261a: 08 95 ret -000027aa : +0000261c : +} void MifareClassicAppInit4K(void) { State = STATE_IDLE; - 27aa: 81 e0 ldi r24, 0x01 ; 1 - 27ac: 80 93 c5 20 sts 0x20C5, r24 + 261c: 81 e0 ldi r24, 0x01 ; 1 + 261e: 80 93 b5 20 sts 0x20B5, r24 CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; - 27b0: 82 e0 ldi r24, 0x02 ; 2 - 27b2: 90 e0 ldi r25, 0x00 ; 0 - 27b4: 80 93 c6 20 sts 0x20C6, r24 - 27b8: 90 93 c7 20 sts 0x20C7, r25 + 2622: 82 e0 ldi r24, 0x02 ; 2 + 2624: 90 e0 ldi r25, 0x00 ; 0 + 2626: 80 93 b6 20 sts 0x20B6, r24 + 262a: 90 93 b7 20 sts 0x20B7, r25 CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; - 27bc: 88 e1 ldi r24, 0x18 ; 24 - 27be: 80 93 c8 20 sts 0x20C8, r24 -} - 27c2: 08 95 ret + 262e: 88 e1 ldi r24, 0x18 ; 24 + 2630: 80 93 b8 20 sts 0x20B8, r24 + 2634: 08 95 ret -000027c4 : +00002636 : +} void MifareClassicAppReset(void) { State = STATE_IDLE; - 27c4: 81 e0 ldi r24, 0x01 ; 1 - 27c6: 80 93 c5 20 sts 0x20C5, r24 -} - 27ca: 08 95 ret + 2636: 81 e0 ldi r24, 0x01 ; 1 + 2638: 80 93 b5 20 sts 0x20B5, r24 + 263c: 08 95 ret -000027cc : +0000263e : +} void MifareClassicAppTask(void) { + 263e: 08 95 ret + +00002640 : } - 27cc: 08 95 ret - -000027ce : uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { - 27ce: 8f 92 push r8 - 27d0: 9f 92 push r9 - 27d2: af 92 push r10 - 27d4: bf 92 push r11 - 27d6: cf 92 push r12 - 27d8: df 92 push r13 - 27da: ef 92 push r14 - 27dc: ff 92 push r15 - 27de: 0f 93 push r16 - 27e0: 1f 93 push r17 - 27e2: cf 93 push r28 - 27e4: df 93 push r29 - 27e6: cd b7 in r28, 0x3d ; 61 - 27e8: de b7 in r29, 0x3e ; 62 - 27ea: 2e 97 sbiw r28, 0x0e ; 14 - 27ec: cd bf out 0x3d, r28 ; 61 - 27ee: de bf out 0x3e, r29 ; 62 - 27f0: 7c 01 movw r14, r24 + 2640: 6f 92 push r6 + 2642: 7f 92 push r7 + 2644: 8f 92 push r8 + 2646: 9f 92 push r9 + 2648: af 92 push r10 + 264a: bf 92 push r11 + 264c: cf 92 push r12 + 264e: df 92 push r13 + 2650: ef 92 push r14 + 2652: ff 92 push r15 + 2654: 0f 93 push r16 + 2656: 1f 93 push r17 + 2658: cf 93 push r28 + 265a: df 93 push r29 + 265c: cd b7 in r28, 0x3d ; 61 + 265e: de b7 in r29, 0x3e ; 62 + 2660: 2e 97 sbiw r28, 0x0e ; 14 + 2662: cd bf out 0x3d, r28 ; 61 + 2664: de bf out 0x3e, r29 ; 62 + 2666: 8c 01 movw r16, r24 switch(State) { - 27f2: 80 91 c5 20 lds r24, 0x20C5 - 27f6: 84 30 cpi r24, 0x04 ; 4 - 27f8: 09 f4 brne .+2 ; 0x27fc - 27fa: f9 c0 rjmp .+498 ; 0x29ee - 27fc: 85 30 cpi r24, 0x05 ; 5 - 27fe: 08 f4 brcc .+2 ; 0x2802 - 2800: 3f c0 rjmp .+126 ; 0x2880 - 2802: 86 30 cpi r24, 0x06 ; 6 - 2804: 09 f4 brne .+2 ; 0x2808 - 2806: c0 c0 rjmp .+384 ; 0x2988 - 2808: 86 30 cpi r24, 0x06 ; 6 - 280a: 08 f0 brcs .+2 ; 0x280e - 280c: 64 c0 rjmp .+200 ; 0x28d6 + 2668: 80 91 b5 20 lds r24, 0x20B5 + 266c: 84 30 cpi r24, 0x04 ; 4 + 266e: 09 f4 brne .+2 ; 0x2672 + 2670: f4 c0 rjmp .+488 ; 0x285a + 2672: 08 f4 brcc .+2 ; 0x2676 + 2674: 3b c0 rjmp .+118 ; 0x26ec + 2676: 86 30 cpi r24, 0x06 ; 6 + 2678: 09 f4 brne .+2 ; 0x267c + 267a: bd c0 rjmp .+378 ; 0x27f6 + 267c: 08 f0 brcs .+2 ; 0x2680 + 267e: 60 c0 rjmp .+192 ; 0x2740 case STATE_AUTHED_IDLE: /* In this state, all communication is encrypted. Thus we first have to encrypt * the incoming data. */ for (uint8_t i=0; i<4; i++) Buffer[i] ^= Crypto1Byte(); - 280e: f7 01 movw r30, r14 - 2810: 00 81 ld r16, Z - 2812: 0e 94 18 1c call 0x3830 ; 0x3830 - 2816: 80 27 eor r24, r16 - 2818: d7 01 movw r26, r14 - 281a: 8c 93 st X, r24 - 281c: 11 96 adiw r26, 0x01 ; 1 - 281e: 0c 91 ld r16, X - 2820: 0e 94 18 1c call 0x3830 ; 0x3830 - 2824: 80 27 eor r24, r16 - 2826: f7 01 movw r30, r14 - 2828: 81 83 std Z+1, r24 ; 0x01 - 282a: 02 81 ldd r16, Z+2 ; 0x02 - 282c: 0e 94 18 1c call 0x3830 ; 0x3830 - 2830: 80 27 eor r24, r16 - 2832: d7 01 movw r26, r14 - 2834: 12 96 adiw r26, 0x02 ; 2 - 2836: 8c 93 st X, r24 - 2838: 12 97 sbiw r26, 0x02 ; 2 - 283a: 13 96 adiw r26, 0x03 ; 3 - 283c: 0c 91 ld r16, X - 283e: f8 d7 rcall .+4080 ; 0x3830 - 2840: 80 27 eor r24, r16 - 2842: f7 01 movw r30, r14 - 2844: 83 83 std Z+3, r24 ; 0x03 - 2846: 80 81 ld r24, Z + 2680: f8 01 movw r30, r16 + 2682: d0 80 ld r13, Z + 2684: 31 d7 rcall .+3682 ; 0x34e8 + 2686: 8d 25 eor r24, r13 + 2688: d8 01 movw r26, r16 + 268a: 8c 93 st X, r24 + 268c: 11 96 adiw r26, 0x01 ; 1 + 268e: dc 90 ld r13, X + 2690: 2b d7 rcall .+3670 ; 0x34e8 + 2692: 8d 25 eor r24, r13 + 2694: f8 01 movw r30, r16 + 2696: 81 83 std Z+1, r24 ; 0x01 + 2698: d2 80 ldd r13, Z+2 ; 0x02 + 269a: 26 d7 rcall .+3660 ; 0x34e8 + 269c: 8d 25 eor r24, r13 + 269e: d8 01 movw r26, r16 + 26a0: 12 96 adiw r26, 0x02 ; 2 + 26a2: 8c 93 st X, r24 + 26a4: 12 97 sbiw r26, 0x02 ; 2 + 26a6: 13 96 adiw r26, 0x03 ; 3 + 26a8: dc 90 ld r13, X + 26aa: 1e d7 rcall .+3644 ; 0x34e8 + 26ac: 8d 25 eor r24, r13 + 26ae: f8 01 movw r30, r16 + 26b0: 83 83 std Z+3, r24 ; 0x03 if (Buffer[0] == CMD_READ) { - 2848: 80 33 cpi r24, 0x30 ; 48 - 284a: 09 f4 brne .+2 ; 0x284e - 284c: bd c2 rjmp .+1402 ; 0x2dc8 - 284e: 80 3a cpi r24, 0xA0 ; 160 + 26b2: 80 81 ld r24, Z + 26b4: 80 33 cpi r24, 0x30 ; 48 + 26b6: 09 f4 brne .+2 ; 0x26ba + 26b8: ac c2 rjmp .+1368 ; 0x2c12 * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); return ACK_NAK_FRAME_SIZE; } } else if (Buffer[0] == CMD_WRITE) { - 2850: 09 f4 brne .+2 ; 0x2854 - 2852: 39 c3 rjmp .+1650 ; 0x2ec6 - 2854: 80 3c cpi r24, 0xC0 ; 192 + 26ba: 80 3a cpi r24, 0xA0 ; 160 + 26bc: 09 f4 brne .+2 ; 0x26c0 + 26be: 1f c3 rjmp .+1598 ; 0x2cfe Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_DECREMENT) { - 2856: 09 f4 brne .+2 ; 0x285a - 2858: 53 c3 rjmp .+1702 ; 0x2f00 - 285a: 81 3c cpi r24, 0xC1 ; 193 + 26c0: 80 3c cpi r24, 0xC0 ; 192 + 26c2: 09 f4 brne .+2 ; 0x26c6 + 26c4: 3a c3 rjmp .+1652 ; 0x2d3a Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_INCREMENT) { - 285c: 09 f4 brne .+2 ; 0x2860 - 285e: 35 c4 rjmp .+2154 ; 0x30ca <__stack+0xcb> - 2860: 82 3c cpi r24, 0xC2 ; 194 + 26c6: 81 3c cpi r24, 0xC1 ; 193 + 26c8: 09 f4 brne .+2 ; 0x26cc + 26ca: da c3 rjmp .+1972 ; 0x2e80 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_RESTORE) { - 2862: 09 f4 brne .+2 ; 0x2866 - 2864: 3f c4 rjmp .+2174 ; 0x30e4 <__stack+0xe5> - 2866: 80 3b cpi r24, 0xB0 ; 176 + 26cc: 82 3c cpi r24, 0xC2 ; 194 + 26ce: 09 f4 brne .+2 ; 0x26d2 + 26d0: e7 c3 rjmp .+1998 ; 0x2ea0 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; }else if (Buffer[0] == CMD_TRANSFER) { - 2868: 09 f4 brne .+2 ; 0x286c - 286a: 4b c4 rjmp .+2198 ; 0x3102 <__stack+0x103> - 286c: 80 56 subi r24, 0x60 ; 96 + 26d2: 80 3b cpi r24, 0xB0 ; 176 + 26d4: 09 f4 brne .+2 ; 0x26d8 + 26d6: f1 c3 rjmp .+2018 ; 0x2eba } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { - 286e: 82 30 cpi r24, 0x02 ; 2 - 2870: 08 f4 brcc .+2 ; 0x2874 - 2872: 96 c1 rjmp .+812 ; 0x2ba0 - 2874: 81 e0 ldi r24, 0x01 ; 1 + 26d8: 80 56 subi r24, 0x60 ; 96 + 26da: 82 30 cpi r24, 0x02 ; 2 + 26dc: 08 f4 brcc .+2 ; 0x26e0 + 26de: 94 c1 rjmp .+808 ; 0x2a08 Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); return ACK_NAK_FRAME_SIZE; } } else { /* Unknown command. Enter HALT state */ State = STATE_IDLE; - 2876: 80 93 c5 20 sts 0x20C5, r24 - 287a: 80 e0 ldi r24, 0x00 ; 0 + 26e0: 81 e0 ldi r24, 0x01 ; 1 + 26e2: 80 93 b5 20 sts 0x20B5, r24 /* Unknown state? Should never happen. */ break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; - 287c: 90 e0 ldi r25, 0x00 ; 0 - 287e: 65 c0 rjmp .+202 ; 0x294a + 26e6: 20 e0 ldi r18, 0x00 ; 0 + 26e8: 30 e0 ldi r19, 0x00 ; 0 } else { /* Unknown command. Enter HALT state */ State = STATE_IDLE; } break; - 2880: 82 30 cpi r24, 0x02 ; 2 + 26ea: 63 c0 rjmp .+198 ; 0x27b2 } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { - 2882: 09 f4 brne .+2 ; 0x2886 - 2884: a0 c0 rjmp .+320 ; 0x29c6 - 2886: 83 30 cpi r24, 0x03 ; 3 - 2888: 08 f4 brcc .+2 ; 0x288c - 288a: 6f c0 rjmp .+222 ; 0x296a - 288c: f7 01 movw r30, r14 + 26ec: 82 30 cpi r24, 0x02 ; 2 + 26ee: 09 f4 brne .+2 ; 0x26f2 + 26f0: a0 c0 rjmp .+320 ; 0x2832 + 26f2: 08 f4 brcc .+2 ; 0x26f6 + 26f4: 71 c0 rjmp .+226 ; 0x27d8 INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) { uint8_t* DataPtr = (uint8_t*) Buffer; if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 288e: 80 81 ld r24, Z - 2890: 86 32 cpi r24, 0x26 ; 38 - 2892: 09 f4 brne .+2 ; 0x2896 - 2894: 6f c1 rjmp .+734 ; 0x2b74 - 2896: 82 35 cpi r24, 0x52 ; 82 - 2898: 09 f4 brne .+2 ; 0x289c - 289a: 6c c1 rjmp .+728 ; 0x2b74 - 289c: 80 35 cpi r24, 0x50 ; 80 + 26f6: f8 01 movw r30, r16 + 26f8: 80 81 ld r24, Z + 26fa: 86 32 cpi r24, 0x26 ; 38 + 26fc: 09 f4 brne .+2 ; 0x2700 + 26fe: 6f c1 rjmp .+734 ; 0x29de + 2700: 82 35 cpi r24, 0x52 ; 82 + 2702: 09 f4 brne .+2 ; 0x2706 + 2704: 6c c1 rjmp .+728 ; 0x29de case STATE_ACTIVE: if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { State = STATE_READY; return BitCount; } else if (Buffer[0] == CMD_HALT) { - 289e: 09 f4 brne .+2 ; 0x28a2 - 28a0: 75 c1 rjmp .+746 ; 0x2b8c - 28a2: 98 2f mov r25, r24 + 2706: 80 35 cpi r24, 0x50 ; 80 + 2708: 09 f4 brne .+2 ; 0x270c + 270a: 74 c1 rjmp .+744 ; 0x29f4 } } else { Buffer[0] = NAK_INVALID_ARG; return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - 28a4: 90 56 subi r25, 0x60 ; 96 - 28a6: 92 30 cpi r25, 0x02 ; 2 - 28a8: 08 f4 brcc .+2 ; 0x28ac - 28aa: e7 c1 rjmp .+974 ; 0x2c7a - 28ac: 80 33 cpi r24, 0x30 ; 48 + 270c: 98 2f mov r25, r24 + 270e: 90 56 subi r25, 0x60 ; 96 + 2710: 92 30 cpi r25, 0x02 ; 2 + 2712: 08 f4 brcc .+2 ; 0x2716 + 2714: e6 c1 rjmp .+972 ; 0x2ae2 return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; } else { Buffer[0] = NAK_CRC_ERROR; return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_READ) || (Buffer[0] == CMD_WRITE) || (Buffer[0] == CMD_DECREMENT) - 28ae: 51 f0 breq .+20 ; 0x28c4 - 28b0: 80 3a cpi r24, 0xA0 ; 160 - 28b2: 41 f0 breq .+16 ; 0x28c4 - 28b4: 80 3c cpi r24, 0xC0 ; 192 - 28b6: 31 f0 breq .+12 ; 0x28c4 - 28b8: 81 3c cpi r24, 0xC1 ; 193 + 2716: 80 33 cpi r24, 0x30 ; 48 + 2718: 51 f0 breq .+20 ; 0x272e + 271a: 80 3a cpi r24, 0xA0 ; 160 + 271c: 41 f0 breq .+16 ; 0x272e + 271e: 80 3c cpi r24, 0xC0 ; 192 + 2720: 31 f0 breq .+12 ; 0x272e || (Buffer[0] == CMD_INCREMENT) || (Buffer[0] == CMD_RESTORE) || (Buffer[0] == CMD_TRANSFER) ) { - 28ba: 21 f0 breq .+8 ; 0x28c4 - 28bc: 82 3c cpi r24, 0xC2 ; 194 - 28be: 11 f0 breq .+4 ; 0x28c4 - 28c0: 80 3b cpi r24, 0xB0 ; 176 - 28c2: c1 f6 brne .-80 ; 0x2874 - 28c4: 81 e0 ldi r24, 0x01 ; 1 + 2722: 81 3c cpi r24, 0xC1 ; 193 + 2724: 21 f0 breq .+8 ; 0x272e + 2726: 82 3c cpi r24, 0xC2 ; 194 + 2728: 11 f0 breq .+4 ; 0x272e + 272a: 80 3b cpi r24, 0xB0 ; 176 + 272c: c9 f6 brne .-78 ; 0x26e0 State = STATE_IDLE; - 28c6: 80 93 c5 20 sts 0x20C5, r24 - 28ca: 84 e0 ldi r24, 0x04 ; 4 + 272e: 81 e0 ldi r24, 0x01 ; 1 + 2730: 80 93 b5 20 sts 0x20B5, r24 Buffer[0] = NAK_NOT_AUTHED; - 28cc: f7 01 movw r30, r14 - 28ce: 80 83 st Z, r24 - 28d0: 84 e0 ldi r24, 0x04 ; 4 + 2734: 84 e0 ldi r24, 0x04 ; 4 + 2736: f8 01 movw r30, r16 + 2738: 80 83 st Z, r24 return ACK_NAK_FRAME_SIZE; - 28d2: 90 e0 ldi r25, 0x00 ; 0 - 28d4: 3a c0 rjmp .+116 ; 0x294a - 28d6: 8a 30 cpi r24, 0x0A ; 10 + 273a: 24 e0 ldi r18, 0x04 ; 4 + 273c: 30 e0 ldi r19, 0x00 ; 0 + 273e: 39 c0 rjmp .+114 ; 0x27b2 } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { - 28d8: 08 f0 brcs .+2 ; 0x28dc - 28da: 53 c0 rjmp .+166 ; 0x2982 - 28dc: f7 01 movw r30, r14 + 2740: 8a 30 cpi r24, 0x0A ; 10 + 2742: 08 f0 brcs .+2 ; 0x2746 + 2744: 55 c0 rjmp .+170 ; 0x27f0 * decrypt the data and check CRC. Read data from the requested block * address into the global block buffer and check for integrity. Then * add or subtract according to issued command if necessary and store * the block back into the global block buffer. */ for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) Buffer[i] ^= Crypto1Byte(); - 28de: 00 81 ld r16, Z - 28e0: a7 d7 rcall .+3918 ; 0x3830 - 28e2: 80 27 eor r24, r16 - 28e4: d7 01 movw r26, r14 - 28e6: 8c 93 st X, r24 - 28e8: 11 96 adiw r26, 0x01 ; 1 - 28ea: 0c 91 ld r16, X - 28ec: a1 d7 rcall .+3906 ; 0x3830 - 28ee: 80 27 eor r24, r16 - 28f0: f7 01 movw r30, r14 - 28f2: 81 83 std Z+1, r24 ; 0x01 - 28f4: 02 81 ldd r16, Z+2 ; 0x02 - 28f6: 9c d7 rcall .+3896 ; 0x3830 - 28f8: 80 27 eor r24, r16 - 28fa: d7 01 movw r26, r14 - 28fc: 12 96 adiw r26, 0x02 ; 2 - 28fe: 8c 93 st X, r24 - 2900: 12 97 sbiw r26, 0x02 ; 2 - 2902: 13 96 adiw r26, 0x03 ; 3 - 2904: 0c 91 ld r16, X - 2906: 94 d7 rcall .+3880 ; 0x3830 - 2908: 80 27 eor r24, r16 - 290a: f7 01 movw r30, r14 - 290c: 83 83 std Z+3, r24 ; 0x03 - 290e: 04 81 ldd r16, Z+4 ; 0x04 - 2910: 8f d7 rcall .+3870 ; 0x3830 - 2912: 80 27 eor r24, r16 - 2914: d7 01 movw r26, r14 - 2916: 14 96 adiw r26, 0x04 ; 4 - 2918: 8c 93 st X, r24 - 291a: 14 97 sbiw r26, 0x04 ; 4 - 291c: 15 96 adiw r26, 0x05 ; 5 - 291e: 0c 91 ld r16, X - 2920: 87 d7 rcall .+3854 ; 0x3830 - 2922: 80 27 eor r24, r16 - 2924: f7 01 movw r30, r14 - 2926: 85 83 std Z+5, r24 ; 0x05 - 2928: c7 01 movw r24, r14 - 292a: 64 e0 ldi r22, 0x04 ; 4 - 292c: 70 e0 ldi r23, 0x00 ; 0 - 292e: 92 d4 rcall .+2340 ; 0x3254 - 2930: 88 23 and r24, r24 - 2932: 09 f0 breq .+2 ; 0x2936 - 2934: 0f c2 rjmp .+1054 ; 0x2d54 + 2746: d8 01 movw r26, r16 + 2748: fc 90 ld r15, X + 274a: ce d6 rcall .+3484 ; 0x34e8 + 274c: 8f 25 eor r24, r15 + 274e: f8 01 movw r30, r16 + 2750: 80 83 st Z, r24 + 2752: f1 80 ldd r15, Z+1 ; 0x01 + 2754: c9 d6 rcall .+3474 ; 0x34e8 + 2756: 8f 25 eor r24, r15 + 2758: d8 01 movw r26, r16 + 275a: 11 96 adiw r26, 0x01 ; 1 + 275c: 8c 93 st X, r24 + 275e: 11 97 sbiw r26, 0x01 ; 1 + 2760: 12 96 adiw r26, 0x02 ; 2 + 2762: fc 90 ld r15, X + 2764: c1 d6 rcall .+3458 ; 0x34e8 + 2766: 8f 25 eor r24, r15 + 2768: f8 01 movw r30, r16 + 276a: 82 83 std Z+2, r24 ; 0x02 + 276c: f3 80 ldd r15, Z+3 ; 0x03 + 276e: bc d6 rcall .+3448 ; 0x34e8 + 2770: 8f 25 eor r24, r15 + 2772: d8 01 movw r26, r16 + 2774: 13 96 adiw r26, 0x03 ; 3 + 2776: 8c 93 st X, r24 + 2778: 13 97 sbiw r26, 0x03 ; 3 + 277a: 14 96 adiw r26, 0x04 ; 4 + 277c: fc 90 ld r15, X + 277e: b4 d6 rcall .+3432 ; 0x34e8 + 2780: 8f 25 eor r24, r15 + 2782: f8 01 movw r30, r16 + 2784: 84 83 std Z+4, r24 ; 0x04 + 2786: f5 80 ldd r15, Z+5 ; 0x05 + 2788: af d6 rcall .+3422 ; 0x34e8 + 278a: 8f 25 eor r24, r15 + 278c: d8 01 movw r26, r16 + 278e: 15 96 adiw r26, 0x05 ; 5 + 2790: 8c 93 st X, r24 if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { - 2936: bd d7 rcall .+3962 ; 0x38b2 - 2938: 91 e0 ldi r25, 0x01 ; 1 - 293a: 98 27 eor r25, r24 - 293c: f7 01 movw r30, r14 - 293e: 90 83 st Z, r25 - 2940: 85 e0 ldi r24, 0x05 ; 5 - 2942: 80 93 c5 20 sts 0x20C5, r24 + 2792: 64 e0 ldi r22, 0x04 ; 4 + 2794: 70 e0 ldi r23, 0x00 ; 0 + 2796: c8 01 movw r24, r16 + 2798: 25 d4 rcall .+2122 ; 0x2fe4 + 279a: 81 11 cpse r24, r1 + 279c: 0c c2 rjmp .+1048 ; 0x2bb6 /* Not sure if this is the correct error code.. */ Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); } } else { /* CRC Error. */ Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2946: 84 e0 ldi r24, 0x04 ; 4 - 2948: 90 e0 ldi r25, 0x00 ; 0 - 294a: 2e 96 adiw r28, 0x0e ; 14 - 294c: cd bf out 0x3d, r28 ; 61 - 294e: de bf out 0x3e, r29 ; 62 - 2950: df 91 pop r29 + 279e: e5 d6 rcall .+3530 ; 0x356a + 27a0: 91 e0 ldi r25, 0x01 ; 1 + 27a2: 98 27 eor r25, r24 + 27a4: f8 01 movw r30, r16 + 27a6: 90 83 st Z, r25 } State = STATE_AUTHED_IDLE; - 2952: cf 91 pop r28 - 2954: 1f 91 pop r17 - 2956: 0f 91 pop r16 + 27a8: 85 e0 ldi r24, 0x05 ; 5 + 27aa: 80 93 b5 20 sts 0x20B5, r24 return ACK_NAK_FRAME_SIZE; - 2958: ff 90 pop r15 - 295a: ef 90 pop r14 + 27ae: 24 e0 ldi r18, 0x04 ; 4 + 27b0: 30 e0 ldi r19, 0x00 ; 0 break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; } - 295c: df 90 pop r13 - 295e: cf 90 pop r12 - 2960: bf 90 pop r11 - 2962: af 90 pop r10 - 2964: 9f 90 pop r9 - 2966: 8f 90 pop r8 - 2968: 08 95 ret - 296a: 20 91 c6 20 lds r18, 0x20C6 - 296e: 90 91 c7 20 lds r25, 0x20C7 - 2972: d7 01 movw r26, r14 - 2974: 8c 91 ld r24, X - 2976: 86 32 cpi r24, 0x26 ; 38 - 2978: 09 f4 brne .+2 ; 0x297c - 297a: f3 c0 rjmp .+486 ; 0x2b62 + 27b2: c9 01 movw r24, r18 + 27b4: 2e 96 adiw r28, 0x0e ; 14 + 27b6: cd bf out 0x3d, r28 ; 61 + 27b8: de bf out 0x3e, r29 ; 62 + 27ba: df 91 pop r29 + 27bc: cf 91 pop r28 + 27be: 1f 91 pop r17 + 27c0: 0f 91 pop r16 + 27c2: ff 90 pop r15 + 27c4: ef 90 pop r14 + 27c6: df 90 pop r13 + 27c8: cf 90 pop r12 + 27ca: bf 90 pop r11 + 27cc: af 90 pop r10 + 27ce: 9f 90 pop r9 + 27d0: 8f 90 pop r8 + 27d2: 7f 90 pop r7 + 27d4: 6f 90 pop r6 + 27d6: 08 95 ret uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { case STATE_IDLE: case STATE_HALT: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 297c: 82 35 cpi r24, 0x52 ; 82 - 297e: 09 f4 brne .+2 ; 0x2982 - 2980: f0 c0 rjmp .+480 ; 0x2b62 - 2982: 80 e0 ldi r24, 0x00 ; 0 - 2984: 90 e0 ldi r25, 0x00 ; 0 - 2986: e1 cf rjmp .-62 ; 0x294a - 2988: 87 01 movw r16, r14 - 298a: cc 24 eor r12, r12 - 298c: f8 01 movw r30, r16 - 298e: 80 80 ld r8, Z - 2990: 4f d7 rcall .+3742 ; 0x3830 - 2992: 88 25 eor r24, r8 - /* Unknown state? Should never happen. */ - break; - } + 27d8: 20 91 b6 20 lds r18, 0x20B6 + 27dc: 90 91 b7 20 lds r25, 0x20B7 + 27e0: d8 01 movw r26, r16 + 27e2: 8c 91 ld r24, X + 27e4: 86 32 cpi r24, 0x26 ; 38 + 27e6: 09 f4 brne .+2 ; 0x27ea + 27e8: f1 c0 rjmp .+482 ; 0x29cc + 27ea: 82 35 cpi r24, 0x52 ; 82 + 27ec: 09 f4 brne .+2 ; 0x27f0 + 27ee: ee c0 rjmp .+476 ; 0x29cc - /* No response has been sent, when we reach here */ - return ISO14443A_APP_NO_RESPONSE; - 2994: d8 01 movw r26, r16 - 2996: 8d 93 st X+, r24 - 2998: 8d 01 movw r16, r26 + *BitCount = ISO14443A_SAK_FRAME_SIZE; + return true; } else { - /* Unknown command. Enter HALT state */ - State = STATE_IDLE; - } - - break; - 299a: c3 94 inc r12 + /* We have not been selected. Don't send anything. */ + *BitCount = 0; + 27f0: 20 e0 ldi r18, 0x00 ; 0 + 27f2: 30 e0 ldi r19, 0x00 ; 0 + 27f4: de cf rjmp .-68 ; 0x27b2 + 27f6: 78 01 movw r14, r16 } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { - 299c: b2 e1 ldi r27, 0x12 ; 18 + 27f8: 52 e1 ldi r21, 0x12 ; 18 + 27fa: d5 2e mov r13, r21 * check for CRC. Then write the data when ReadOnly mode is not * activated. */ /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) Buffer[i] ^= Crypto1Byte(); - 299e: cb 16 cp r12, r27 - 29a0: a9 f7 brne .-22 ; 0x298c - 29a2: c7 01 movw r24, r14 - 29a4: 60 e1 ldi r22, 0x10 ; 16 - 29a6: 70 e0 ldi r23, 0x00 ; 0 - 29a8: 55 d4 rcall .+2218 ; 0x3254 - 29aa: 88 23 and r24, r24 - 29ac: 09 f4 brne .+2 ; 0x29b0 + 27fc: d7 01 movw r26, r14 + 27fe: cc 90 ld r12, X + 2800: 73 d6 rcall .+3302 ; 0x34e8 + 2802: 8c 25 eor r24, r12 + 2804: f7 01 movw r30, r14 + 2806: 81 93 st Z+, r24 + 2808: 7f 01 movw r14, r30 + 280a: da 94 dec r13 * sending the data to be written. Decrypt the data first and * check for CRC. Then write the data when ReadOnly mode is not * activated. */ /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) - 29ae: ef c1 rjmp .+990 ; 0x2d8e - 29b0: 80 91 0c 21 lds r24, 0x210C - 29b4: 88 23 and r24, r24 + 280c: b9 f7 brne .-18 ; 0x27fc Buffer[i] ^= Crypto1Byte(); if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - 29b6: 09 f4 brne .+2 ; 0x29ba - 29b8: f0 c1 rjmp .+992 ; 0x2d9a - 29ba: 7b d7 rcall .+3830 ; 0x38b2 - 29bc: 9a e0 ldi r25, 0x0A ; 10 - 29be: 98 27 eor r25, r24 - 29c0: f7 01 movw r30, r14 - 29c2: 90 83 st Z, r25 - 29c4: bd cf rjmp .-134 ; 0x2940 + 280e: 60 e1 ldi r22, 0x10 ; 16 + 2810: 70 e0 ldi r23, 0x00 ; 0 + 2812: c8 01 movw r24, r16 + 2814: e7 d3 rcall .+1998 ; 0x2fe4 + 2816: 88 23 and r24, r24 + 2818: 09 f4 brne .+2 ; 0x281c + 281a: c1 cf rjmp .-126 ; 0x279e if (!ActiveConfiguration.ReadOnly) { - 29c6: 20 91 c6 20 lds r18, 0x20C6 - 29ca: 90 91 c7 20 lds r25, 0x20C7 - 29ce: d7 01 movw r26, r14 + 281c: 80 91 fc 20 lds r24, 0x20FC + 2820: 88 23 and r24, r24 + 2822: 09 f4 brne .+2 ; 0x2826 + 2824: e2 c1 rjmp .+964 ; 0x2bea MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); } else { /* Silently ignore in ReadOnly mode */ } Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 29d0: 8c 91 ld r24, X - 29d2: 86 32 cpi r24, 0x26 ; 38 - 29d4: 09 f4 brne .+2 ; 0x29d8 - 29d6: c5 c0 rjmp .+394 ; 0x2b62 - 29d8: 82 35 cpi r24, 0x52 ; 82 - 29da: 09 f4 brne .+2 ; 0x29de - 29dc: c2 c0 rjmp .+388 ; 0x2b62 + 2826: a1 d6 rcall .+3394 ; 0x356a + 2828: 9a e0 ldi r25, 0x0A ; 10 + 282a: 98 27 eor r25, r24 + 282c: d8 01 movw r26, r16 + 282e: 9c 93 st X, r25 + 2830: bb cf rjmp .-138 ; 0x27a8 return BitCount; } break; case STATE_READY: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 29de: 83 39 cpi r24, 0x93 ; 147 - 29e0: 09 f4 brne .+2 ; 0x29e4 - 29e2: 35 c2 rjmp .+1130 ; 0x2e4e - 29e4: 10 92 c5 20 sts 0x20C5, r1 - 29e8: 80 e0 ldi r24, 0x00 ; 0 - 29ea: 90 e0 ldi r25, 0x00 ; 0 - 29ec: ae cf rjmp .-164 ; 0x294a - 29ee: c7 01 movw r24, r14 - 29f0: e0 d6 rcall .+3520 ; 0x37b2 - 29f2: d7 01 movw r26, r14 - 29f4: 14 96 adiw r26, 0x04 ; 4 + 2832: 20 91 b6 20 lds r18, 0x20B6 + 2836: 90 91 b7 20 lds r25, 0x20B7 +INLINE +bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + + if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ + 283a: d8 01 movw r26, r16 + 283c: 8c 91 ld r24, X + 283e: 86 32 cpi r24, 0x26 ; 38 + 2840: 09 f4 brne .+2 ; 0x2844 + 2842: c4 c0 rjmp .+392 ; 0x29cc + 2844: 82 35 cpi r24, 0x52 ; 82 + 2846: 09 f4 brne .+2 ; 0x284a + 2848: c1 c0 rjmp .+386 ; 0x29cc State = STATE_READY; return BitCount; } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { - 29f6: 0c 91 ld r16, X - 29f8: 1b d7 rcall .+3638 ; 0x3830 - 29fa: 80 27 eor r24, r16 + 284a: 83 39 cpi r24, 0x93 ; 147 + 284c: 09 f4 brne .+2 ; 0x2850 + 284e: 20 c2 rjmp .+1088 ; 0x2c90 * byte is supposed to be 0. */ if (Buffer[1] == 0) { if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { /* According to ISO14443, we must not send anything * in order to acknowledge the HALT command. */ State = STATE_HALT; - 29fc: f7 01 movw r30, r14 - 29fe: 84 83 std Z+4, r24 ; 0x04 + 2850: 10 92 b5 20 sts 0x20B5, r1 return ISO14443A_APP_NO_RESPONSE; - 2a00: 05 81 ldd r16, Z+5 ; 0x05 - 2a02: 16 d7 rcall .+3628 ; 0x3830 - 2a04: 80 27 eor r24, r16 + 2854: 20 e0 ldi r18, 0x00 ; 0 + 2856: 30 e0 ldi r19, 0x00 ; 0 + 2858: ac cf rjmp .-168 ; 0x27b2 case STATE_AUTHING: /* Reader delivers an encrypted nonce. We use it * to setup the crypto1 LFSR in nonlinear feedback mode. * Furthermore it delivers an encrypted answer. Decrypt and check it */ Crypto1Auth(&Buffer[0]); - 2a06: d7 01 movw r26, r14 - 2a08: 15 96 adiw r26, 0x05 ; 5 - 2a0a: 8c 93 st X, r24 + 285a: c8 01 movw r24, r16 + 285c: 1c d6 rcall .+3128 ; 0x3496 for (uint8_t i=0; i<4; i++) Buffer[i+4] ^= Crypto1Byte(); - 2a0c: 15 97 sbiw r26, 0x05 ; 5 - 2a0e: 16 96 adiw r26, 0x06 ; 6 - 2a10: 0c 91 ld r16, X - 2a12: 0e d7 rcall .+3612 ; 0x3830 - 2a14: 80 27 eor r24, r16 - 2a16: f7 01 movw r30, r14 - 2a18: 86 83 std Z+6, r24 ; 0x06 - 2a1a: 07 81 ldd r16, Z+7 ; 0x07 - 2a1c: 09 d7 rcall .+3602 ; 0x3830 - 2a1e: 80 27 eor r24, r16 - 2a20: d7 01 movw r26, r14 - 2a22: 17 96 adiw r26, 0x07 ; 7 - 2a24: 8c 93 st X, r24 - 2a26: 17 97 sbiw r26, 0x07 ; 7 - 2a28: 14 96 adiw r26, 0x04 ; 4 - 2a2a: 2c 91 ld r18, X - 2a2c: 14 97 sbiw r26, 0x04 ; 4 - 2a2e: 90 91 c9 20 lds r25, 0x20C9 - 2a32: 29 17 cp r18, r25 - 2a34: 09 f0 breq .+2 ; 0x2a38 - 2a36: 1e cf rjmp .-452 ; 0x2874 - 2a38: 15 96 adiw r26, 0x05 ; 5 - 2a3a: 2c 91 ld r18, X - 2a3c: 15 97 sbiw r26, 0x05 ; 5 - 2a3e: 90 91 ca 20 lds r25, 0x20CA - 2a42: 29 17 cp r18, r25 - 2a44: 09 f0 breq .+2 ; 0x2a48 - 2a46: 16 cf rjmp .-468 ; 0x2874 - 2a48: 16 96 adiw r26, 0x06 ; 6 + 285e: d8 01 movw r26, r16 + 2860: 14 96 adiw r26, 0x04 ; 4 + 2862: fc 90 ld r15, X + 2864: 41 d6 rcall .+3202 ; 0x34e8 + 2866: 8f 25 eor r24, r15 + 2868: f8 01 movw r30, r16 + 286a: 84 83 std Z+4, r24 ; 0x04 + 286c: f5 80 ldd r15, Z+5 ; 0x05 + 286e: 3c d6 rcall .+3192 ; 0x34e8 + 2870: 8f 25 eor r24, r15 + 2872: d8 01 movw r26, r16 + 2874: 15 96 adiw r26, 0x05 ; 5 + 2876: 8c 93 st X, r24 + 2878: 15 97 sbiw r26, 0x05 ; 5 + 287a: 16 96 adiw r26, 0x06 ; 6 + 287c: fc 90 ld r15, X + 287e: 34 d6 rcall .+3176 ; 0x34e8 + 2880: 8f 25 eor r24, r15 + 2882: f8 01 movw r30, r16 + 2884: 86 83 std Z+6, r24 ; 0x06 + 2886: f7 80 ldd r15, Z+7 ; 0x07 + 2888: 2f d6 rcall .+3166 ; 0x34e8 + 288a: 8f 25 eor r24, r15 + 288c: d8 01 movw r26, r16 + 288e: 17 96 adiw r26, 0x07 ; 7 + 2890: 8c 93 st X, r24 + 2892: 17 97 sbiw r26, 0x07 ; 7 if ((Buffer[4] == ReaderResponse[0]) && - 2a4a: 2c 91 ld r18, X - 2a4c: 16 97 sbiw r26, 0x06 ; 6 - 2a4e: 90 91 cb 20 lds r25, 0x20CB - 2a52: 29 17 cp r18, r25 - 2a54: 09 f0 breq .+2 ; 0x2a58 - 2a56: 0e cf rjmp .-484 ; 0x2874 - 2a58: 90 91 cc 20 lds r25, 0x20CC - 2a5c: 89 17 cp r24, r25 - 2a5e: 09 f0 breq .+2 ; 0x2a62 - 2a60: 09 cf rjmp .-494 ; 0x2874 - 2a62: 00 91 cd 20 lds r16, 0x20CD - 2a66: e4 d6 rcall .+3528 ; 0x3830 - 2a68: 80 27 eor r24, r16 + 2894: 14 96 adiw r26, 0x04 ; 4 + 2896: 2c 91 ld r18, X + 2898: 14 97 sbiw r26, 0x04 ; 4 + 289a: 90 91 b9 20 lds r25, 0x20B9 + 289e: 29 13 cpse r18, r25 + 28a0: 1f cf rjmp .-450 ; 0x26e0 + 28a2: 15 96 adiw r26, 0x05 ; 5 + 28a4: 2c 91 ld r18, X + 28a6: 15 97 sbiw r26, 0x05 ; 5 + 28a8: 90 91 ba 20 lds r25, 0x20BA + 28ac: 29 13 cpse r18, r25 + 28ae: 18 cf rjmp .-464 ; 0x26e0 (Buffer[5] == ReaderResponse[1]) && - 2a6a: f7 01 movw r30, r14 - 2a6c: 80 83 st Z, r24 - 2a6e: 00 91 cd 20 lds r16, 0x20CD - 2a72: 00 2e mov r0, r16 - 2a74: 02 95 swap r16 - 2a76: 00 25 eor r16, r0 - 2a78: 00 2e mov r0, r16 + 28b0: 16 96 adiw r26, 0x06 ; 6 + 28b2: 2c 91 ld r18, X + 28b4: 90 91 bb 20 lds r25, 0x20BB + 28b8: 29 13 cpse r18, r25 + 28ba: 12 cf rjmp .-476 ; 0x26e0 (Buffer[6] == ReaderResponse[2]) && - 2a7a: 06 95 lsr r16 - 2a7c: 06 95 lsr r16 - 2a7e: 00 25 eor r16, r0 - 2a80: 9e d4 rcall .+2364 ; 0x33be - 2a82: f7 01 movw r30, r14 + 28bc: 90 91 bc 20 lds r25, 0x20BC + 28c0: 89 13 cpse r24, r25 + 28c2: 0e cf rjmp .-484 ; 0x26e0 (Buffer[7] == ReaderResponse[3])) { /* Reader is authenticated. Encrypt the precalculated card response * and generate the parity bits. */ for (uint8_t i=0; i + 28ca: 8f 25 eor r24, r15 + 28cc: f8 01 movw r30, r16 + 28ce: 80 83 st Z, r24 Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2a92: 27 95 ror r18 - 2a94: 91 e0 ldi r25, 0x01 ; 1 - 2a96: 20 fd sbrc r18, 0 - 2a98: 90 e0 ldi r25, 0x00 ; 0 - 2a9a: 98 27 eor r25, r24 - 2a9c: 90 83 st Z, r25 - 2a9e: 00 91 ce 20 lds r16, 0x20CE - 2aa2: c6 d6 rcall .+3468 ; 0x3830 - 2aa4: 80 27 eor r24, r16 - 2aa6: d7 01 movw r26, r14 - 2aa8: 11 96 adiw r26, 0x01 ; 1 - 2aaa: 8c 93 st X, r24 - 2aac: 00 91 ce 20 lds r16, 0x20CE - 2ab0: 00 2e mov r0, r16 - 2ab2: 02 95 swap r16 - 2ab4: 00 25 eor r16, r0 - 2ab6: 00 2e mov r0, r16 - 2ab8: 06 95 lsr r16 - 2aba: 06 95 lsr r16 - 2abc: 00 25 eor r16, r0 - 2abe: 7f d4 rcall .+2302 ; 0x33be - 2ac0: f7 01 movw r30, r14 - 2ac2: ef 57 subi r30, 0x7F ; 127 + 28d0: f0 90 bd 20 lds r15, 0x20BD + 28d4: 0f 2c mov r0, r15 + 28d6: f2 94 swap r15 + 28d8: f0 24 eor r15, r0 + 28da: 0f 2c mov r0, r15 + 28dc: f6 94 lsr r15 + 28de: f6 94 lsr r15 + 28e0: f0 24 eor r15, r0 + 28e2: 05 d4 rcall .+2058 ; 0x30ee + 28e4: f8 01 movw r30, r16 + 28e6: e0 58 subi r30, 0x80 ; 128 + 28e8: ff 4f sbci r31, 0xFF ; 255 + 28ea: 2f 2d mov r18, r15 + 28ec: 30 e0 ldi r19, 0x00 ; 0 + 28ee: 2f 5f subi r18, 0xFF ; 255 + 28f0: 3f 4f sbci r19, 0xFF ; 255 + 28f2: 21 fb bst r18, 1 + 28f4: 88 24 eor r8, r8 + 28f6: 80 f8 bld r8, 0 + 28f8: 91 2c mov r9, r1 + 28fa: 31 e0 ldi r19, 0x01 ; 1 + 28fc: 83 26 eor r8, r19 + 28fe: 88 25 eor r24, r8 + 2900: 80 83 st Z, r24 (Buffer[6] == ReaderResponse[2]) && (Buffer[7] == ReaderResponse[3])) { /* Reader is authenticated. Encrypt the precalculated card response * and generate the parity bits. */ for (uint8_t i=0; i + 2908: 8f 25 eor r24, r15 + 290a: d8 01 movw r26, r16 + 290c: 11 96 adiw r26, 0x01 ; 1 + 290e: 8c 93 st X, r24 Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2ad4: 20 fd sbrc r18, 0 - 2ad6: 90 e0 ldi r25, 0x00 ; 0 - 2ad8: 98 27 eor r25, r24 - 2ada: 90 83 st Z, r25 - 2adc: 00 91 cf 20 lds r16, 0x20CF - 2ae0: a7 d6 rcall .+3406 ; 0x3830 - 2ae2: 80 27 eor r24, r16 - 2ae4: f7 01 movw r30, r14 - 2ae6: 82 83 std Z+2, r24 ; 0x02 - 2ae8: 00 91 cf 20 lds r16, 0x20CF - 2aec: 00 2e mov r0, r16 - 2aee: 02 95 swap r16 - 2af0: 00 25 eor r16, r0 - 2af2: 00 2e mov r0, r16 - 2af4: 06 95 lsr r16 - 2af6: 06 95 lsr r16 - 2af8: 00 25 eor r16, r0 - 2afa: 61 d4 rcall .+2242 ; 0x33be - 2afc: f7 01 movw r30, r14 - 2afe: ee 57 subi r30, 0x7E ; 126 - 2b00: ff 4f sbci r31, 0xFF ; 255 - 2b02: 20 2f mov r18, r16 - 2b04: 30 e0 ldi r19, 0x00 ; 0 + 2910: f0 90 be 20 lds r15, 0x20BE + 2914: 0f 2c mov r0, r15 + 2916: f2 94 swap r15 + 2918: f0 24 eor r15, r0 + 291a: 0f 2c mov r0, r15 + 291c: f6 94 lsr r15 + 291e: f6 94 lsr r15 + 2920: f0 24 eor r15, r0 + 2922: e5 d3 rcall .+1994 ; 0x30ee + 2924: f8 01 movw r30, r16 + 2926: ef 57 subi r30, 0x7F ; 127 + 2928: ff 4f sbci r31, 0xFF ; 255 + 292a: 2f 2d mov r18, r15 + 292c: 30 e0 ldi r19, 0x00 ; 0 + 292e: 2f 5f subi r18, 0xFF ; 255 + 2930: 3f 4f sbci r19, 0xFF ; 255 + 2932: 21 fb bst r18, 1 + 2934: aa 24 eor r10, r10 + 2936: a0 f8 bld r10, 0 + 2938: b1 2c mov r11, r1 + 293a: b1 e0 ldi r27, 0x01 ; 1 + 293c: ab 26 eor r10, r27 + 293e: 8a 25 eor r24, r10 + 2940: 80 83 st Z, r24 (Buffer[6] == ReaderResponse[2]) && (Buffer[7] == ReaderResponse[3])) { /* Reader is authenticated. Encrypt the precalculated card response * and generate the parity bits. */ for (uint8_t i=0; i + 2948: 8f 25 eor r24, r15 + 294a: f8 01 movw r30, r16 + 294c: 82 83 std Z+2, r24 ; 0x02 Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2b14: 98 27 eor r25, r24 - 2b16: 90 83 st Z, r25 - 2b18: 00 91 d0 20 lds r16, 0x20D0 - 2b1c: 89 d6 rcall .+3346 ; 0x3830 - 2b1e: 80 27 eor r24, r16 - 2b20: d7 01 movw r26, r14 - 2b22: 13 96 adiw r26, 0x03 ; 3 - 2b24: 8c 93 st X, r24 - 2b26: 00 91 d0 20 lds r16, 0x20D0 - 2b2a: 00 2e mov r0, r16 - 2b2c: 02 95 swap r16 - 2b2e: 00 25 eor r16, r0 - 2b30: 00 2e mov r0, r16 - 2b32: 06 95 lsr r16 - 2b34: 06 95 lsr r16 - 2b36: 00 25 eor r16, r0 - 2b38: 42 d4 rcall .+2180 ; 0x33be - 2b3a: f7 01 movw r30, r14 - 2b3c: ed 57 subi r30, 0x7D ; 125 - 2b3e: ff 4f sbci r31, 0xFF ; 255 - 2b40: 20 2f mov r18, r16 - 2b42: 30 e0 ldi r19, 0x00 ; 0 - 2b44: 2f 5f subi r18, 0xFF ; 255 + 294e: f0 90 bf 20 lds r15, 0x20BF + 2952: 0f 2c mov r0, r15 + 2954: f2 94 swap r15 + 2956: f0 24 eor r15, r0 + 2958: 0f 2c mov r0, r15 + 295a: f6 94 lsr r15 + 295c: f6 94 lsr r15 + 295e: f0 24 eor r15, r0 + 2960: c6 d3 rcall .+1932 ; 0x30ee + 2962: f8 01 movw r30, r16 + 2964: ee 57 subi r30, 0x7E ; 126 + 2966: ff 4f sbci r31, 0xFF ; 255 + 2968: 2f 2d mov r18, r15 + 296a: 30 e0 ldi r19, 0x00 ; 0 + 296c: 2f 5f subi r18, 0xFF ; 255 + 296e: 3f 4f sbci r19, 0xFF ; 255 + 2970: 21 fb bst r18, 1 + 2972: cc 24 eor r12, r12 + 2974: c0 f8 bld r12, 0 + 2976: d1 2c mov r13, r1 + 2978: 31 e0 ldi r19, 0x01 ; 1 + 297a: c3 26 eor r12, r19 + 297c: 8c 25 eor r24, r12 + 297e: 80 83 st Z, r24 (Buffer[6] == ReaderResponse[2]) && (Buffer[7] == ReaderResponse[3])) { /* Reader is authenticated. Encrypt the precalculated card response * and generate the parity bits. */ for (uint8_t i=0; i + 2986: 8f 25 eor r24, r15 + 2988: d8 01 movw r26, r16 + 298a: 13 96 adiw r26, 0x03 ; 3 + 298c: 8c 93 st X, r24 Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2b56: 85 e0 ldi r24, 0x05 ; 5 - 2b58: 80 93 c5 20 sts 0x20C5, r24 - 2b5c: 80 e2 ldi r24, 0x20 ; 32 - 2b5e: 90 e1 ldi r25, 0x10 ; 16 - 2b60: f4 ce rjmp .-536 ; 0x294a - 2b62: f7 01 movw r30, r14 - 2b64: 20 83 st Z, r18 - 2b66: 91 83 std Z+1, r25 ; 0x01 - 2b68: 82 e0 ldi r24, 0x02 ; 2 - 2b6a: 80 93 c5 20 sts 0x20C5, r24 - 2b6e: 80 e1 ldi r24, 0x10 ; 16 - 2b70: 90 e0 ldi r25, 0x00 ; 0 - 2b72: eb ce rjmp .-554 ; 0x294a - 2b74: 84 e0 ldi r24, 0x04 ; 4 - 2b76: d7 01 movw r26, r14 - 2b78: 8c 93 st X, r24 - 2b7a: 11 96 adiw r26, 0x01 ; 1 - 2b7c: 1c 92 st X, r1 - 2b7e: 11 97 sbiw r26, 0x01 ; 1 - 2b80: 82 e0 ldi r24, 0x02 ; 2 - 2b82: 80 93 c5 20 sts 0x20C5, r24 - 2b86: 80 e1 ldi r24, 0x10 ; 16 + 298e: f0 90 c0 20 lds r15, 0x20C0 + 2992: 0f 2c mov r0, r15 + 2994: f2 94 swap r15 + 2996: f0 24 eor r15, r0 + 2998: 0f 2c mov r0, r15 + 299a: f6 94 lsr r15 + 299c: f6 94 lsr r15 + 299e: f0 24 eor r15, r0 + 29a0: a6 d3 rcall .+1868 ; 0x30ee + 29a2: f8 01 movw r30, r16 + 29a4: ed 57 subi r30, 0x7D ; 125 + 29a6: ff 4f sbci r31, 0xFF ; 255 + 29a8: 2f 2d mov r18, r15 + 29aa: 30 e0 ldi r19, 0x00 ; 0 + 29ac: 2f 5f subi r18, 0xFF ; 255 + 29ae: 3f 4f sbci r19, 0xFF ; 255 + 29b0: 21 fb bst r18, 1 + 29b2: 66 24 eor r6, r6 + 29b4: 60 f8 bld r6, 0 + 29b6: 71 2c mov r7, r1 + 29b8: b1 e0 ldi r27, 0x01 ; 1 + 29ba: 6b 26 eor r6, r27 + 29bc: 86 25 eor r24, r6 + 29be: 80 83 st Z, r24 } State = STATE_AUTHED_IDLE; - 2b88: 90 e0 ldi r25, 0x00 ; 0 - 2b8a: df ce rjmp .-578 ; 0x294a - 2b8c: f7 01 movw r30, r14 + 29c0: 85 e0 ldi r24, 0x05 ; 5 + 29c2: 80 93 b5 20 sts 0x20B5, r24 return (CMD_AUTH_BA_FRAME_SIZE * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; - 2b8e: 81 81 ldd r24, Z+1 ; 0x01 - 2b90: 88 23 and r24, r24 - 2b92: 09 f4 brne .+2 ; 0x2b96 + 29c6: 20 e2 ldi r18, 0x20 ; 32 + 29c8: 30 e1 ldi r19, 0x10 ; 16 + 29ca: f3 ce rjmp .-538 ; 0x27b2 DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 2b94: d7 c2 rjmp .+1454 ; 0x3144 <__stack+0x145> - 2b96: f7 01 movw r30, r14 + 29cc: f8 01 movw r30, r16 + 29ce: 20 83 st Z, r18 DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 2b98: 10 82 st Z, r1 + 29d0: 91 83 std Z+1, r25 ; 0x01 } break; case STATE_READY: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { State = STATE_READY; - 2b9a: 84 e0 ldi r24, 0x04 ; 4 - 2b9c: 90 e0 ldi r25, 0x00 ; 0 - 2b9e: d5 ce rjmp .-598 ; 0x294a + 29d2: 82 e0 ldi r24, 0x02 ; 2 + 29d4: 80 93 b5 20 sts 0x20B5, r24 *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 2ba0: c7 01 movw r24, r14 - 2ba2: 62 e0 ldi r22, 0x02 ; 2 + 29d8: 20 e1 ldi r18, 0x10 ; 16 + 29da: 30 e0 ldi r19, 0x00 ; 0 return BitCount; - 2ba4: 70 e0 ldi r23, 0x00 ; 0 + 29dc: ea ce rjmp .-556 ; 0x27b2 bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) { uint8_t* DataPtr = (uint8_t*) Buffer; if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 2ba6: 56 d3 rcall .+1708 ; 0x3254 - 2ba8: 88 23 and r24, r24 - 2baa: 09 f4 brne .+2 ; 0x2bae + 29de: 84 e0 ldi r24, 0x04 ; 4 + 29e0: d8 01 movw r26, r16 + 29e2: 8c 93 st X, r24 DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 2bac: 05 c1 rjmp .+522 ; 0x2db8 - 2bae: d7 01 movw r26, r14 - 2bb0: 11 96 adiw r26, 0x01 ; 1 + 29e4: 11 96 adiw r26, 0x01 ; 1 + 29e6: 1c 92 st X, r1 } break; case STATE_ACTIVE: if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { State = STATE_READY; - 2bb2: 0c 91 ld r16, X - 2bb4: 11 97 sbiw r26, 0x01 ; 1 - 2bb6: 0c 73 andi r16, 0x3C ; 60 + 29e8: 82 e0 ldi r24, 0x02 ; 2 + 29ea: 80 93 b5 20 sts 0x20B5, r24 *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 2bb8: 8c 91 ld r24, X - 2bba: 80 36 cpi r24, 0x60 ; 96 + 29ee: 20 e1 ldi r18, 0x10 ; 16 + 29f0: 30 e0 ldi r19, 0x00 ; 0 return BitCount; - 2bbc: 09 f4 brne .+2 ; 0x2bc0 + 29f2: df ce rjmp .-578 ; 0x27b2 } else if (Buffer[0] == CMD_HALT) { /* Halts the tag. According to the ISO14443, the second * byte is supposed to be 0. */ if (Buffer[1] == 0) { - 2bbe: df c2 rjmp .+1470 ; 0x317e <__stack+0x17f> - 2bc0: 8a e3 ldi r24, 0x3A ; 58 - 2bc2: 90 e0 ldi r25, 0x00 ; 0 - 2bc4: 10 e0 ldi r17, 0x00 ; 0 - 2bc6: 02 95 swap r16 + 29f4: f8 01 movw r30, r16 + 29f6: 81 81 ldd r24, Z+1 ; 0x01 + 29f8: 88 23 and r24, r24 + 29fa: 09 f4 brne .+2 ; 0x29fe + 29fc: 7c c2 rjmp .+1272 ; 0x2ef6 } else { Buffer[0] = NAK_CRC_ERROR; return ACK_NAK_FRAME_SIZE; } } else { Buffer[0] = NAK_INVALID_ARG; - 2bc8: 12 95 swap r17 - 2bca: 10 7f andi r17, 0xF0 ; 240 + 29fe: f8 01 movw r30, r16 + 2a00: 10 82 st Z, r1 return ACK_NAK_FRAME_SIZE; - 2bcc: 10 27 eor r17, r16 - 2bce: 00 7f andi r16, 0xF0 ; 240 - 2bd0: 10 27 eor r17, r16 + 2a02: 24 e0 ldi r18, 0x04 ; 4 + 2a04: 30 e0 ldi r19, 0x00 ; 0 + 2a06: d5 ce rjmp .-598 ; 0x27b2 Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - 2bd2: 08 0f add r16, r24 - 2bd4: 19 1f adc r17, r25 - 2bd6: ce 01 movw r24, r28 - 2bd8: 05 96 adiw r24, 0x05 ; 5 - 2bda: 64 e0 ldi r22, 0x04 ; 4 - 2bdc: 0e 94 fb 04 call 0x9f6 ; 0x9f6 - 2be0: ce 01 movw r24, r28 + 2a08: 62 e0 ldi r22, 0x02 ; 2 + 2a0a: 70 e0 ldi r23, 0x00 ; 0 + 2a0c: c8 01 movw r24, r16 + 2a0e: ea d2 rcall .+1492 ; 0x2fe4 + 2a10: 88 23 and r24, r24 + 2a12: 09 f4 brne .+2 ; 0x2a16 + 2a14: f6 c0 rjmp .+492 ; 0x2c02 /* Nested authentication. */ uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 2be2: 01 96 adiw r24, 0x01 ; 1 - 2be4: 60 e0 ldi r22, 0x00 ; 0 - 2be6: 70 e0 ldi r23, 0x00 ; 0 - 2be8: 44 e0 ldi r20, 0x04 ; 4 - 2bea: 50 e0 ldi r21, 0x00 ; 0 + 2a16: f8 01 movw r30, r16 + 2a18: 81 81 ldd r24, Z+1 ; 0x01 + 2a1a: 8c 73 andi r24, 0x3C ; 60 uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 2bec: 0e 94 2d 06 call 0xc5a ; 0xc5a - 2bf0: ce 01 movw r24, r28 - 2bf2: 09 96 adiw r24, 0x09 ; 9 - 2bf4: b8 01 movw r22, r16 - 2bf6: 46 e0 ldi r20, 0x06 ; 6 + 2a1c: 90 81 ld r25, Z + 2a1e: 90 36 cpi r25, 0x60 ; 96 + 2a20: 09 f4 brne .+2 ; 0x2a24 + 2a22: 85 c2 rjmp .+1290 ; 0x2f2e + 2a24: 6a e3 ldi r22, 0x3A ; 58 + 2a26: 70 e0 ldi r23, 0x00 ; 0 uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 2bf8: 50 e0 ldi r21, 0x00 ; 0 - 2bfa: 0e 94 2d 06 call 0xc5a ; 0xc5a - 2bfe: 8d 81 ldd r24, Y+5 ; 0x05 - 2c00: 80 93 c9 20 sts 0x20C9, r24 - 2c04: 8e 81 ldd r24, Y+6 ; 0x06 - 2c06: 80 93 ca 20 sts 0x20CA, r24 + 2a28: 7b 01 movw r14, r22 + 2a2a: f0 e1 ldi r31, 0x10 ; 16 + 2a2c: 8f 9f mul r24, r31 + 2a2e: e0 0c add r14, r0 + 2a30: f1 1c adc r15, r1 + 2a32: 11 24 eor r1, r1 uint8_t Key[6]; uint8_t Uid[4]; uint8_t CardNonce[4]; /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); - 2c0a: 8f 81 ldd r24, Y+7 ; 0x07 - 2c0c: 80 93 cb 20 sts 0x20CB, r24 - 2c10: 88 85 ldd r24, Y+8 ; 0x08 - 2c12: 80 93 cc 20 sts 0x20CC, r24 + 2a34: 64 e0 ldi r22, 0x04 ; 4 + 2a36: ce 01 movw r24, r28 + 2a38: 07 96 adiw r24, 0x07 ; 7 + 2a3a: 0e 94 df 04 call 0x9be ; 0x9be MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2c16: 89 ec ldi r24, 0xC9 ; 201 - 2c18: 90 e2 ldi r25, 0x20 ; 32 - 2c1a: 60 e4 ldi r22, 0x40 ; 64 - 2c1c: 70 e0 ldi r23, 0x00 ; 0 - 2c1e: 6d d6 rcall .+3290 ; 0x38fa - 2c20: 80 91 c9 20 lds r24, 0x20C9 + 2a3e: 44 e0 ldi r20, 0x04 ; 4 + 2a40: 50 e0 ldi r21, 0x00 ; 0 + 2a42: 60 e0 ldi r22, 0x00 ; 0 + 2a44: 70 e0 ldi r23, 0x00 ; 0 + 2a46: ce 01 movw r24, r28 + 2a48: 0b 96 adiw r24, 0x0b ; 11 + 2a4a: 0e 94 fc 05 call 0xbf8 ; 0xbf8 MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 2c24: 80 93 cd 20 sts 0x20CD, r24 - 2c28: 80 91 ca 20 lds r24, 0x20CA - 2c2c: 80 93 ce 20 sts 0x20CE, r24 - 2c30: 80 91 cb 20 lds r24, 0x20CB + 2a4e: 46 e0 ldi r20, 0x06 ; 6 + 2a50: 50 e0 ldi r21, 0x00 ; 0 + 2a52: b7 01 movw r22, r14 + 2a54: ce 01 movw r24, r28 + 2a56: 01 96 adiw r24, 0x01 ; 1 + 2a58: 0e 94 fc 05 call 0xbf8 ; 0xbf8 /* Precalculate the reader response from card-nonce */ for (uint8_t i=0; i + 2a5c: 8f 81 ldd r24, Y+7 ; 0x07 + 2a5e: 80 93 b9 20 sts 0x20B9, r24 + 2a62: 88 85 ldd r24, Y+8 ; 0x08 + 2a64: 80 93 ba 20 sts 0x20BA, r24 + 2a68: 89 85 ldd r24, Y+9 ; 0x09 + 2a6a: 80 93 bb 20 sts 0x20BB, r24 + 2a6e: 8a 85 ldd r24, Y+10 ; 0x0a + 2a70: 80 93 bc 20 sts 0x20BC, r24 Crypto1PRNG(ReaderResponse, 64); - 2c4a: ce 01 movw r24, r28 - 2c4c: 09 96 adiw r24, 0x09 ; 9 - 2c4e: be 01 movw r22, r28 - 2c50: 6f 5f subi r22, 0xFF ; 255 - 2c52: 7f 4f sbci r23, 0xFF ; 255 - 2c54: ae 01 movw r20, r28 + 2a74: 60 e4 ldi r22, 0x40 ; 64 + 2a76: 70 e0 ldi r23, 0x00 ; 0 + 2a78: 89 eb ldi r24, 0xB9 ; 185 + 2a7a: 90 e2 ldi r25, 0x20 ; 32 + 2a7c: 9a d5 rcall .+2868 ; 0x35b2 /* Precalculate our response from the reader response */ for (uint8_t i=0; i - 2c5c: 8d 81 ldd r24, Y+5 ; 0x05 - 2c5e: f7 01 movw r30, r14 - 2c60: 80 83 st Z, r24 - 2c62: 8e 81 ldd r24, Y+6 ; 0x06 - 2c64: 81 83 std Z+1, r24 ; 0x01 - 2c66: 8f 81 ldd r24, Y+7 ; 0x07 - 2c68: 82 83 std Z+2, r24 ; 0x02 - 2c6a: 88 85 ldd r24, Y+8 ; 0x08 - 2c6c: 83 83 std Z+3, r24 ; 0x03 - 2c6e: 84 e0 ldi r24, 0x04 ; 4 - 2c70: 80 93 c5 20 sts 0x20C5, r24 - 2c74: 80 e2 ldi r24, 0x20 ; 32 + 2a7e: 80 91 b9 20 lds r24, 0x20B9 + 2a82: 80 93 bd 20 sts 0x20BD, r24 + 2a86: 80 91 ba 20 lds r24, 0x20BA + 2a8a: 80 93 be 20 sts 0x20BE, r24 + 2a8e: 80 91 bb 20 lds r24, 0x20BB + 2a92: 80 93 bf 20 sts 0x20BF, r24 + 2a96: 80 91 bc 20 lds r24, 0x20BC + 2a9a: 80 93 c0 20 sts 0x20C0, r24 Crypto1PRNG(CardResponse, 32); - 2c76: 90 e0 ldi r25, 0x00 ; 0 - 2c78: 68 ce rjmp .-816 ; 0x294a - 2c7a: c7 01 movw r24, r14 - 2c7c: 62 e0 ldi r22, 0x02 ; 2 - 2c7e: 70 e0 ldi r23, 0x00 ; 0 - 2c80: e9 d2 rcall .+1490 ; 0x3254 + 2a9e: 60 e2 ldi r22, 0x20 ; 32 + 2aa0: 70 e0 ldi r23, 0x00 ; 0 + 2aa2: 8d eb ldi r24, 0xBD ; 189 + 2aa4: 90 e2 ldi r25, 0x20 ; 32 + 2aa6: 85 d5 rcall .+2826 ; 0x35b2 /* Setup crypto1 cipher. */ Crypto1Setup(Key, Uid, CardNonce); - 2c82: 88 23 and r24, r24 - 2c84: 09 f4 brne .+2 ; 0x2c88 - 2c86: 65 c2 rjmp .+1226 ; 0x3152 <__stack+0x153> - 2c88: d7 01 movw r26, r14 - 2c8a: 11 96 adiw r26, 0x01 ; 1 - 2c8c: 0c 91 ld r16, X - 2c8e: 11 97 sbiw r26, 0x01 ; 1 - 2c90: 0c 73 andi r16, 0x3C ; 60 - 2c92: 8c 91 ld r24, X - 2c94: 80 36 cpi r24, 0x60 ; 96 + 2aa8: ae 01 movw r20, r28 + 2aaa: 49 5f subi r20, 0xF9 ; 249 + 2aac: 5f 4f sbci r21, 0xFF ; 255 + 2aae: be 01 movw r22, r28 + 2ab0: 65 5f subi r22, 0xF5 ; 245 + 2ab2: 7f 4f sbci r23, 0xFF ; 255 + 2ab4: ce 01 movw r24, r28 + 2ab6: 01 96 adiw r24, 0x01 ; 1 + 2ab8: 4e d3 rcall .+1692 ; 0x3156 for (uint8_t i=0; i - 2c98: 75 c2 rjmp .+1258 ; 0x3184 <__stack+0x185> - 2c9a: 8a e3 ldi r24, 0x3A ; 58 - 2c9c: 90 e0 ldi r25, 0x00 ; 0 - 2c9e: 10 e0 ldi r17, 0x00 ; 0 - 2ca0: 02 95 swap r16 - 2ca2: 12 95 swap r17 - 2ca4: 10 7f andi r17, 0xF0 ; 240 - 2ca6: 10 27 eor r17, r16 + 2aba: 8f 81 ldd r24, Y+7 ; 0x07 + 2abc: d8 01 movw r26, r16 + 2abe: 8c 93 st X, r24 + 2ac0: 88 85 ldd r24, Y+8 ; 0x08 + 2ac2: 11 96 adiw r26, 0x01 ; 1 + 2ac4: 8c 93 st X, r24 + 2ac6: 11 97 sbiw r26, 0x01 ; 1 + 2ac8: 89 85 ldd r24, Y+9 ; 0x09 + 2aca: 12 96 adiw r26, 0x02 ; 2 + 2acc: 8c 93 st X, r24 + 2ace: 12 97 sbiw r26, 0x02 ; 2 + 2ad0: 8a 85 ldd r24, Y+10 ; 0x0a + 2ad2: 13 96 adiw r26, 0x03 ; 3 + 2ad4: 8c 93 st X, r24 /* Respond with the encrypted random card nonce and expect further authentication * form the reader in the next frame. */ State = STATE_AUTHING; - 2ca8: 00 7f andi r16, 0xF0 ; 240 - 2caa: 10 27 eor r17, r16 - 2cac: 08 0f add r16, r24 + 2ad6: 84 e0 ldi r24, 0x04 ; 4 + 2ad8: 80 93 b5 20 sts 0x20B5, r24 return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - 2cae: 19 1f adc r17, r25 - 2cb0: ce 01 movw r24, r28 - 2cb2: 01 96 adiw r24, 0x01 ; 1 + 2adc: 20 e2 ldi r18, 0x20 ; 32 + 2ade: 30 e0 ldi r19, 0x00 ; 0 + 2ae0: 68 ce rjmp .-816 ; 0x27b2 } else { Buffer[0] = NAK_INVALID_ARG; return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - 2cb4: 64 e0 ldi r22, 0x04 ; 4 - 2cb6: 0e 94 fb 04 call 0x9f6 ; 0x9f6 - 2cba: ce 01 movw r24, r28 - 2cbc: 05 96 adiw r24, 0x05 ; 5 - 2cbe: 60 e0 ldi r22, 0x00 ; 0 - 2cc0: 70 e0 ldi r23, 0x00 ; 0 - 2cc2: 44 e0 ldi r20, 0x04 ; 4 + 2ae2: 62 e0 ldi r22, 0x02 ; 2 + 2ae4: 70 e0 ldi r23, 0x00 ; 0 + 2ae6: c8 01 movw r24, r16 + 2ae8: 7d d2 rcall .+1274 ; 0x2fe4 + 2aea: 88 23 and r24, r24 + 2aec: 09 f4 brne .+2 ; 0x2af0 + 2aee: 09 c2 rjmp .+1042 ; 0x2f02 uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 2cc4: 50 e0 ldi r21, 0x00 ; 0 - 2cc6: 0e 94 2d 06 call 0xc5a ; 0xc5a - 2cca: ce 01 movw r24, r28 - 2ccc: 09 96 adiw r24, 0x09 ; 9 + 2af0: d8 01 movw r26, r16 + 2af2: 11 96 adiw r26, 0x01 ; 1 + 2af4: 2c 91 ld r18, X + 2af6: 11 97 sbiw r26, 0x01 ; 1 + 2af8: 2c 73 andi r18, 0x3C ; 60 uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 2cce: b8 01 movw r22, r16 - 2cd0: 46 e0 ldi r20, 0x06 ; 6 - 2cd2: 50 e0 ldi r21, 0x00 ; 0 - 2cd4: 0e 94 2d 06 call 0xc5a ; 0xc5a - 2cd8: 89 81 ldd r24, Y+1 ; 0x01 + 2afa: 8c 91 ld r24, X + 2afc: 80 36 cpi r24, 0x60 ; 96 + 2afe: 09 f4 brne .+2 ; 0x2b02 + 2b00: 19 c2 rjmp .+1074 ; 0x2f34 + 2b02: 8a e3 ldi r24, 0x3A ; 58 + 2b04: 90 e0 ldi r25, 0x00 ; 0 uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 2cda: 80 93 c9 20 sts 0x20C9, r24 - 2cde: 8a 81 ldd r24, Y+2 ; 0x02 - 2ce0: 80 93 ca 20 sts 0x20CA, r24 - 2ce4: 8b 81 ldd r24, Y+3 ; 0x03 - 2ce6: 80 93 cb 20 sts 0x20CB, r24 - 2cea: 8c 81 ldd r24, Y+4 ; 0x04 + 2b06: 7c 01 movw r14, r24 + 2b08: b0 e1 ldi r27, 0x10 ; 16 + 2b0a: 2b 9f mul r18, r27 + 2b0c: e0 0c add r14, r0 + 2b0e: f1 1c adc r15, r1 + 2b10: 11 24 eor r1, r1 uint8_t Key[6]; uint8_t Uid[4]; uint8_t CardNonce[4]; /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); - 2cec: 80 93 cc 20 sts 0x20CC, r24 - 2cf0: 89 ec ldi r24, 0xC9 ; 201 - 2cf2: 90 e2 ldi r25, 0x20 ; 32 - 2cf4: 60 e4 ldi r22, 0x40 ; 64 + 2b12: 64 e0 ldi r22, 0x04 ; 4 + 2b14: ce 01 movw r24, r28 + 2b16: 07 96 adiw r24, 0x07 ; 7 + 2b18: 0e 94 df 04 call 0x9be ; 0x9be MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2cf6: 70 e0 ldi r23, 0x00 ; 0 - 2cf8: 00 d6 rcall .+3072 ; 0x38fa - 2cfa: 80 91 c9 20 lds r24, 0x20C9 - 2cfe: 80 93 cd 20 sts 0x20CD, r24 - 2d02: 80 91 ca 20 lds r24, 0x20CA + 2b1c: 44 e0 ldi r20, 0x04 ; 4 + 2b1e: 50 e0 ldi r21, 0x00 ; 0 + 2b20: 60 e0 ldi r22, 0x00 ; 0 + 2b22: 70 e0 ldi r23, 0x00 ; 0 + 2b24: ce 01 movw r24, r28 + 2b26: 0b 96 adiw r24, 0x0b ; 11 + 2b28: 0e 94 fc 05 call 0xbf8 ; 0xbf8 MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 2d06: 80 93 ce 20 sts 0x20CE, r24 - 2d0a: 80 91 cb 20 lds r24, 0x20CB - 2d0e: 80 93 cf 20 sts 0x20CF, r24 - 2d12: 80 91 cc 20 lds r24, 0x20CC + 2b2c: 46 e0 ldi r20, 0x06 ; 6 + 2b2e: 50 e0 ldi r21, 0x00 ; 0 + 2b30: b7 01 movw r22, r14 + 2b32: ce 01 movw r24, r28 + 2b34: 01 96 adiw r24, 0x01 ; 1 + 2b36: 0e 94 fc 05 call 0xbf8 ; 0xbf8 /* Precalculate the reader response from card-nonce */ for (uint8_t i=0; i - 2d24: 84 e0 ldi r24, 0x04 ; 4 - 2d26: 80 93 c5 20 sts 0x20C5, r24 - 2d2a: 89 81 ldd r24, Y+1 ; 0x01 + 2b3a: 8f 81 ldd r24, Y+7 ; 0x07 + 2b3c: 80 93 b9 20 sts 0x20B9, r24 + 2b40: 88 85 ldd r24, Y+8 ; 0x08 + 2b42: 80 93 ba 20 sts 0x20BA, r24 + 2b46: 89 85 ldd r24, Y+9 ; 0x09 + 2b48: 80 93 bb 20 sts 0x20BB, r24 + 2b4c: 8a 85 ldd r24, Y+10 ; 0x0a + 2b4e: 80 93 bc 20 sts 0x20BC, r24 Crypto1PRNG(ReaderResponse, 64); - 2d2c: f7 01 movw r30, r14 - 2d2e: 80 83 st Z, r24 - 2d30: 8a 81 ldd r24, Y+2 ; 0x02 - 2d32: 81 83 std Z+1, r24 ; 0x01 - 2d34: 8b 81 ldd r24, Y+3 ; 0x03 - 2d36: 82 83 std Z+2, r24 ; 0x02 + 2b52: 60 e4 ldi r22, 0x40 ; 64 + 2b54: 70 e0 ldi r23, 0x00 ; 0 + 2b56: 89 eb ldi r24, 0xB9 ; 185 + 2b58: 90 e2 ldi r25, 0x20 ; 32 + 2b5a: 2b d5 rcall .+2646 ; 0x35b2 /* Precalculate our response from the reader response */ for (uint8_t i=0; i - 2d4e: 80 e2 ldi r24, 0x20 ; 32 - 2d50: 90 e0 ldi r25, 0x00 ; 0 - 2d52: fb cd rjmp .-1034 ; 0x294a - 2d54: 60 91 d1 20 lds r22, 0x20D1 + 2b5c: 80 91 b9 20 lds r24, 0x20B9 + 2b60: 80 93 bd 20 sts 0x20BD, r24 + 2b64: 80 91 ba 20 lds r24, 0x20BA + 2b68: 80 93 be 20 sts 0x20BE, r24 + 2b6c: 80 91 bb 20 lds r24, 0x20BB + 2b70: 80 93 bf 20 sts 0x20BF, r24 + 2b74: 80 91 bc 20 lds r24, 0x20BC + 2b78: 80 93 c0 20 sts 0x20C0, r24 Crypto1PRNG(CardResponse, 32); - 2d58: 70 e0 ldi r23, 0x00 ; 0 - 2d5a: 62 95 swap r22 - 2d5c: 72 95 swap r23 - 2d5e: 70 7f andi r23, 0xF0 ; 240 - 2d60: 76 27 eor r23, r22 - 2d62: 60 7f andi r22, 0xF0 ; 240 + 2b7c: 60 e2 ldi r22, 0x20 ; 32 + 2b7e: 70 e0 ldi r23, 0x00 ; 0 + 2b80: 8d eb ldi r24, 0xBD ; 189 + 2b82: 90 e2 ldi r25, 0x20 ; 32 + 2b84: 16 d5 rcall .+2604 ; 0x35b2 /* Respond with the random card nonce and expect further authentication * form the reader in the next frame. */ State = STATE_AUTHING; - 2d64: 76 27 eor r23, r22 - 2d66: 82 ed ldi r24, 0xD2 ; 210 - 2d68: 90 e2 ldi r25, 0x20 ; 32 + 2b86: 84 e0 ldi r24, 0x04 ; 4 + 2b88: 80 93 b5 20 sts 0x20B5, r24 for (uint8_t i=0; i - 2d72: 20 91 d2 20 lds r18, 0x20D2 - 2d76: 80 91 d6 20 lds r24, 0x20D6 - 2d7a: 80 95 com r24 + 2b8c: 8f 81 ldd r24, Y+7 ; 0x07 + 2b8e: f8 01 movw r30, r16 + 2b90: 80 83 st Z, r24 + 2b92: 88 85 ldd r24, Y+8 ; 0x08 + 2b94: 81 83 std Z+1, r24 ; 0x01 + 2b96: 89 85 ldd r24, Y+9 ; 0x09 + 2b98: 82 83 std Z+2, r24 ; 0x02 + 2b9a: 8a 85 ldd r24, Y+10 ; 0x0a + 2b9c: 83 83 std Z+3, r24 ; 0x03 /* Setup crypto1 cipher. Discard in-place encrypted CardNonce. */ Crypto1Setup(Key, Uid, CardNonce); - 2d7c: 28 17 cp r18, r24 - 2d7e: 09 f4 brne .+2 ; 0x2d82 - 2d80: d6 c0 rjmp .+428 ; 0x2f2e - 2d82: 97 d5 rcall .+2862 ; 0x38b2 - 2d84: 96 e0 ldi r25, 0x06 ; 6 - 2d86: 98 27 eor r25, r24 - 2d88: d7 01 movw r26, r14 - 2d8a: 9c 93 st X, r25 - 2d8c: d9 cd rjmp .-1102 ; 0x2940 - 2d8e: 91 d5 rcall .+2850 ; 0x38b2 + 2b9e: ae 01 movw r20, r28 + 2ba0: 49 5f subi r20, 0xF9 ; 249 + 2ba2: 5f 4f sbci r21, 0xFF ; 255 + 2ba4: be 01 movw r22, r28 + 2ba6: 65 5f subi r22, 0xF5 ; 245 + 2ba8: 7f 4f sbci r23, 0xFF ; 255 + 2baa: ce 01 movw r24, r28 + 2bac: 01 96 adiw r24, 0x01 ; 1 + 2bae: d3 d2 rcall .+1446 ; 0x3156 return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - 2d90: 91 e0 ldi r25, 0x01 ; 1 - 2d92: 98 27 eor r25, r24 - 2d94: d7 01 movw r26, r14 + 2bb0: 20 e2 ldi r18, 0x20 ; 32 + 2bb2: 30 e0 ldi r19, 0x00 ; 0 + 2bb4: fe cd rjmp .-1028 ; 0x27b2 * the block back into the global block buffer. */ for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) Buffer[i] ^= Crypto1Byte(); if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { MemoryReadBlock(BlockBuffer, (uint16_t) CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 2d96: 9c 93 st X, r25 - 2d98: d3 cd rjmp .-1114 ; 0x2940 - 2d9a: 60 91 d1 20 lds r22, 0x20D1 - 2d9e: 70 e0 ldi r23, 0x00 ; 0 - 2da0: 62 95 swap r22 - 2da2: 72 95 swap r23 - 2da4: 70 7f andi r23, 0xF0 ; 240 - 2da6: 76 27 eor r23, r22 - 2da8: 60 7f andi r22, 0xF0 ; 240 - 2daa: 76 27 eor r23, r22 - 2dac: c7 01 movw r24, r14 - 2dae: 40 e1 ldi r20, 0x10 ; 16 - 2db0: 50 e0 ldi r21, 0x00 ; 0 - 2db2: 0e 94 b8 06 call 0xd70 ; 0xd70 + 2bb6: 60 91 c1 20 lds r22, 0x20C1 + 2bba: b0 e1 ldi r27, 0x10 ; 16 + 2bbc: 6b 9f mul r22, r27 + 2bbe: b0 01 movw r22, r0 + 2bc0: 11 24 eor r1, r1 + 2bc2: 40 e1 ldi r20, 0x10 ; 16 + 2bc4: 50 e0 ldi r21, 0x00 ; 0 + 2bc6: 82 ec ldi r24, 0xC2 ; 194 + 2bc8: 90 e2 ldi r25, 0x20 ; 32 + 2bca: 0e 94 fc 05 call 0xbf8 ; 0xbf8 INLINE bool CheckValueIntegrity(uint8_t* Block) { /* Value Blocks contain a value stored three times, with * the middle portion inverted. */ if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) - 2db6: 01 ce rjmp .-1022 ; 0x29ba - 2db8: 7c d5 rcall .+2808 ; 0x38b2 - 2dba: 91 e0 ldi r25, 0x01 ; 1 - 2dbc: 98 27 eor r25, r24 - 2dbe: d7 01 movw r26, r14 - 2dc0: 9c 93 st X, r25 - 2dc2: 84 e0 ldi r24, 0x04 ; 4 + 2bce: 20 91 c2 20 lds r18, 0x20C2 + 2bd2: 80 91 c6 20 lds r24, 0x20C6 + 2bd6: 80 95 com r24 + 2bd8: 28 17 cp r18, r24 + 2bda: 09 f4 brne .+2 ; 0x2bde + 2bdc: c4 c0 rjmp .+392 ; 0x2d66 State = STATE_AUTHED_IDLE; /* No ACK response on value commands part 2 */ return ISO14443A_APP_NO_RESPONSE; } else { /* Not sure if this is the correct error code.. */ Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); - 2dc4: 90 e0 ldi r25, 0x00 ; 0 - 2dc6: c1 cd rjmp .-1150 ; 0x294a - 2dc8: c7 01 movw r24, r14 - 2dca: 62 e0 ldi r22, 0x02 ; 2 - 2dcc: 70 e0 ldi r23, 0x00 ; 0 - 2dce: 42 d2 rcall .+1156 ; 0x3254 - 2dd0: 88 23 and r24, r24 - /* Silently ignore in ReadOnly mode */ - } - - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2dd2: 91 f3 breq .-28 ; 0x2db8 - 2dd4: d7 01 movw r26, r14 - 2dd6: 11 96 adiw r26, 0x01 ; 1 - 2dd8: 6c 91 ld r22, X - 2dda: 70 e0 ldi r23, 0x00 ; 0 - 2ddc: 62 95 swap r22 - 2dde: 72 95 swap r23 + 2bde: c5 d4 rcall .+2442 ; 0x356a + 2be0: 96 e0 ldi r25, 0x06 ; 6 + 2be2: 98 27 eor r25, r24 + 2be4: d8 01 movw r26, r16 + 2be6: 9c 93 st X, r25 + 2be8: df cd rjmp .-1090 ; 0x27a8 for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) Buffer[i] ^= Crypto1Byte(); if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { if (!ActiveConfiguration.ReadOnly) { MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 2de0: 70 7f andi r23, 0xF0 ; 240 - 2de2: 76 27 eor r23, r22 - 2de4: 60 7f andi r22, 0xF0 ; 240 - 2de6: 76 27 eor r23, r22 - 2de8: c7 01 movw r24, r14 - 2dea: 40 e1 ldi r20, 0x10 ; 16 - 2dec: 50 e0 ldi r21, 0x00 ; 0 - 2dee: 0e 94 2d 06 call 0xc5a ; 0xc5a - 2df2: c7 01 movw r24, r14 - 2df4: 60 e1 ldi r22, 0x10 ; 16 - 2df6: 70 e0 ldi r23, 0x00 ; 0 - 2df8: ef d1 rcall .+990 ; 0x31d8 - 2dfa: 87 01 movw r16, r14 - 2dfc: 30 e8 ldi r19, 0x80 ; 128 + 2bea: 60 91 c1 20 lds r22, 0x20C1 + 2bee: f0 e1 ldi r31, 0x10 ; 16 + 2bf0: 6f 9f mul r22, r31 + 2bf2: b0 01 movw r22, r0 + 2bf4: 11 24 eor r1, r1 + 2bf6: 40 e1 ldi r20, 0x10 ; 16 + 2bf8: 50 e0 ldi r21, 0x00 ; 0 + 2bfa: c8 01 movw r24, r16 + 2bfc: 0e 94 81 06 call 0xd02 ; 0xd02 + 2c00: 12 ce rjmp .-988 ; 0x2826 * form the reader in the next frame. */ State = STATE_AUTHING; return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2dfe: e3 2e mov r14, r19 - 2e00: f1 2c mov r15, r1 - 2e02: e0 0e add r14, r16 - 2e04: f1 1e adc r15, r17 - 2e06: 88 24 eor r8, r8 - 2e08: f8 01 movw r30, r16 + 2c02: b3 d4 rcall .+2406 ; 0x356a + 2c04: 91 e0 ldi r25, 0x01 ; 1 + 2c06: 98 27 eor r25, r24 + 2c08: f8 01 movw r30, r16 + 2c0a: 90 83 st Z, r25 return ACK_NAK_FRAME_SIZE; - 2e0a: c0 80 ld r12, Z - 2e0c: 11 d5 rcall .+2594 ; 0x3830 - 2e0e: 8c 25 eor r24, r12 + 2c0c: 24 e0 ldi r18, 0x04 ; 4 + 2c0e: 30 e0 ldi r19, 0x00 ; 0 + 2c10: d0 cd rjmp .-1120 ; 0x27b2 * the incoming data. */ for (uint8_t i=0; i<4; i++) Buffer[i] ^= Crypto1Byte(); if (Buffer[0] == CMD_READ) { if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { - 2e10: d8 01 movw r26, r16 - 2e12: 8d 93 st X+, r24 - 2e14: 8d 01 movw r16, r26 - 2e16: 0c 2c mov r0, r12 - 2e18: c2 94 swap r12 - 2e1a: c0 24 eor r12, r0 - 2e1c: 0c 2c mov r0, r12 + 2c12: 62 e0 ldi r22, 0x02 ; 2 + 2c14: 70 e0 ldi r23, 0x00 ; 0 + 2c16: c8 01 movw r24, r16 + 2c18: e5 d1 rcall .+970 ; 0x2fe4 + 2c1a: 88 23 and r24, r24 + 2c1c: 91 f3 breq .-28 ; 0x2c02 /* Read command. Read data from memory and append CRCA. */ MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 2e1e: c6 94 lsr r12 - 2e20: c6 94 lsr r12 - 2e22: c0 24 eor r12, r0 - 2e24: cc d2 rcall .+1432 ; 0x33be - 2e26: 2c 2d mov r18, r12 - 2e28: 30 e0 ldi r19, 0x00 ; 0 - 2e2a: 2f 5f subi r18, 0xFF ; 255 - 2e2c: 3f 4f sbci r19, 0xFF ; 255 - 2e2e: 35 95 asr r19 - 2e30: 27 95 ror r18 - 2e32: 91 e0 ldi r25, 0x01 ; 1 - 2e34: 20 fd sbrc r18, 0 - 2e36: 90 e0 ldi r25, 0x00 ; 0 - 2e38: 98 27 eor r25, r24 - 2e3a: f7 01 movw r30, r14 + 2c1e: d8 01 movw r26, r16 + 2c20: 11 96 adiw r26, 0x01 ; 1 + 2c22: 6c 91 ld r22, X + 2c24: b0 e1 ldi r27, 0x10 ; 16 + 2c26: 6b 9f mul r22, r27 + 2c28: b0 01 movw r22, r0 + 2c2a: 11 24 eor r1, r1 + 2c2c: 40 e1 ldi r20, 0x10 ; 16 + 2c2e: 50 e0 ldi r21, 0x00 ; 0 + 2c30: c8 01 movw r24, r16 + 2c32: 0e 94 fc 05 call 0xbf8 ; 0xbf8 ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - 2e3c: 91 93 st Z+, r25 - 2e3e: 7f 01 movw r14, r30 - 2e40: 83 94 inc r8 - 2e42: f2 e1 ldi r31, 0x12 ; 18 - 2e44: 8f 16 cp r8, r31 - 2e46: 01 f7 brne .-64 ; 0x2e08 + 2c36: 60 e1 ldi r22, 0x10 ; 16 + 2c38: 70 e0 ldi r23, 0x00 ; 0 + 2c3a: c8 01 movw r24, r16 + 2c3c: a4 d1 rcall .+840 ; 0x2f86 void MifareClassicAppTask(void) { } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) - 2e48: 80 e9 ldi r24, 0x90 ; 144 - 2e4a: 90 e1 ldi r25, 0x10 ; 16 - 2e4c: 7e cd rjmp .-1284 ; 0x294a - 2e4e: ce 01 movw r24, r28 - 2e50: 05 96 adiw r24, 0x05 ; 5 + 2c3e: 68 01 movw r12, r16 + 2c40: e0 e8 ldi r30, 0x80 ; 128 + 2c42: ce 0e add r12, r30 + 2c44: d1 1c adc r13, r1 /* Read command. Read data from memory and append CRCA. */ MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); /* Encrypt and calculate parity bits. */ for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { - 2e52: 60 e0 ldi r22, 0x00 ; 0 + 2c46: a1 2c mov r10, r1 uint8_t Plain = Buffer[i]; - 2e54: 70 e0 ldi r23, 0x00 ; 0 - 2e56: 44 e0 ldi r20, 0x04 ; 4 + 2c48: d8 01 movw r26, r16 + 2c4a: bc 90 ld r11, X Buffer[i] = Plain ^ Crypto1Byte(); - 2e58: 50 e0 ldi r21, 0x00 ; 0 - 2e5a: 0e 94 2d 06 call 0xc5a ; 0xc5a - 2e5e: 90 91 c8 20 lds r25, 0x20C8 - 2e62: d7 01 movw r26, r14 + 2c4c: 4d d4 rcall .+2202 ; 0x34e8 + 2c4e: 8b 25 eor r24, r11 + 2c50: f8 01 movw r30, r16 + 2c52: 81 93 st Z+, r24 + 2c54: 8f 01 movw r16, r30 Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); - 2e64: 11 96 adiw r26, 0x01 ; 1 - 2e66: 8c 91 ld r24, X - 2e68: 11 97 sbiw r26, 0x01 ; 1 - 2e6a: 80 32 cpi r24, 0x20 ; 32 - 2e6c: 09 f4 brne .+2 ; 0x2e70 - 2e6e: 77 c1 rjmp .+750 ; 0x315e <__stack+0x15f> - 2e70: 80 37 cpi r24, 0x70 ; 112 - 2e72: 09 f0 breq .+2 ; 0x2e76 - 2e74: 86 cd rjmp .-1268 ; 0x2982 - 2e76: d7 01 movw r26, r14 - 2e78: 12 96 adiw r26, 0x02 ; 2 - 2e7a: 2c 91 ld r18, X - 2e7c: 12 97 sbiw r26, 0x02 ; 2 - 2e7e: 8d 81 ldd r24, Y+5 ; 0x05 - 2e80: 28 17 cp r18, r24 - 2e82: 09 f0 breq .+2 ; 0x2e86 - 2e84: 7e cd rjmp .-1284 ; 0x2982 - 2e86: 13 96 adiw r26, 0x03 ; 3 - 2e88: 2c 91 ld r18, X - 2e8a: 13 97 sbiw r26, 0x03 ; 3 - 2e8c: 8e 81 ldd r24, Y+6 ; 0x06 - 2e8e: 28 17 cp r18, r24 + 2c56: 0b 2c mov r0, r11 + 2c58: b2 94 swap r11 + 2c5a: b0 24 eor r11, r0 + 2c5c: 0b 2c mov r0, r11 + 2c5e: b6 94 lsr r11 + 2c60: b6 94 lsr r11 + 2c62: b0 24 eor r11, r0 + 2c64: 44 d2 rcall .+1160 ; 0x30ee + 2c66: 2b 2d mov r18, r11 + 2c68: 30 e0 ldi r19, 0x00 ; 0 + 2c6a: 2f 5f subi r18, 0xFF ; 255 + 2c6c: 3f 4f sbci r19, 0xFF ; 255 + 2c6e: 21 fb bst r18, 1 + 2c70: ee 24 eor r14, r14 + 2c72: e0 f8 bld r14, 0 + 2c74: f1 2c mov r15, r1 + 2c76: f1 e0 ldi r31, 0x01 ; 1 + 2c78: ef 26 eor r14, r31 + 2c7a: 8e 25 eor r24, r14 + 2c7c: d6 01 movw r26, r12 + 2c7e: 8d 93 st X+, r24 + 2c80: 6d 01 movw r12, r26 /* Read command. Read data from memory and append CRCA. */ MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); /* Encrypt and calculate parity bits. */ for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { - 2e90: 09 f0 breq .+2 ; 0x2e94 - 2e92: 77 cd rjmp .-1298 ; 0x2982 - 2e94: 14 96 adiw r26, 0x04 ; 4 - 2e96: 2c 91 ld r18, X + 2c82: a3 94 inc r10 + 2c84: b2 e1 ldi r27, 0x12 ; 18 + 2c86: ab 12 cpse r10, r27 + 2c88: df cf rjmp .-66 ; 0x2c48 uint8_t Plain = Buffer[i]; Buffer[i] = Plain ^ Crypto1Byte(); Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); } return ( (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) - 2e98: 14 97 sbiw r26, 0x04 ; 4 - 2e9a: 8f 81 ldd r24, Y+7 ; 0x07 - 2e9c: 28 17 cp r18, r24 + 2c8a: 20 e9 ldi r18, 0x90 ; 144 + 2c8c: 30 e1 ldi r19, 0x10 ; 16 + 2c8e: 91 cd rjmp .-1246 ; 0x27b2 State = STATE_READY; return BitCount; } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { /* Load UID CL1 and perform anticollision */ uint8_t UidCL1[4]; MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2e9e: 09 f0 breq .+2 ; 0x2ea2 - 2ea0: 70 cd rjmp .-1312 ; 0x2982 - 2ea2: 15 96 adiw r26, 0x05 ; 5 - 2ea4: 2c 91 ld r18, X - 2ea6: 15 97 sbiw r26, 0x05 ; 5 - 2ea8: 88 85 ldd r24, Y+8 ; 0x08 - 2eaa: 28 17 cp r18, r24 - 2eac: 09 f0 breq .+2 ; 0x2eb0 + 2c90: 44 e0 ldi r20, 0x04 ; 4 + 2c92: 50 e0 ldi r21, 0x00 ; 0 + 2c94: 60 e0 ldi r22, 0x00 ; 0 + 2c96: 70 e0 ldi r23, 0x00 ; 0 + 2c98: ce 01 movw r24, r28 + 2c9a: 01 96 adiw r24, 0x01 ; 1 + 2c9c: 0e 94 fc 05 call 0xbf8 ; 0xbf8 if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { - 2eae: 69 cd rjmp .-1326 ; 0x2982 - 2eb0: 9c 93 st X, r25 + 2ca0: 90 91 b8 20 lds r25, 0x20B8 uint8_t* DataPtr = (uint8_t*) Buffer; uint8_t NVB = DataPtr[1]; //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; switch (NVB) { - 2eb2: c7 01 movw r24, r14 - 2eb4: 61 e0 ldi r22, 0x01 ; 1 - 2eb6: 70 e0 ldi r23, 0x00 ; 0 - 2eb8: 8f d1 rcall .+798 ; 0x31d8 - 2eba: 83 e0 ldi r24, 0x03 ; 3 - 2ebc: 80 93 c5 20 sts 0x20C5, r24 - 2ec0: 88 e1 ldi r24, 0x18 ; 24 - 2ec2: 90 e0 ldi r25, 0x00 ; 0 - 2ec4: 42 cd rjmp .-1404 ; 0x294a + 2ca4: d8 01 movw r26, r16 + 2ca6: 11 96 adiw r26, 0x01 ; 1 + 2ca8: 8c 91 ld r24, X + 2caa: 80 32 cpi r24, 0x20 ; 32 + 2cac: 09 f4 brne .+2 ; 0x2cb0 + 2cae: 2f c1 rjmp .+606 ; 0x2f0e + 2cb0: 80 37 cpi r24, 0x70 ; 112 + 2cb2: 09 f0 breq .+2 ; 0x2cb6 + 2cb4: 9d cd rjmp .-1222 ; 0x27f0 return false; case ISO14443A_NVB_AC_END: /* End of anticollision procedure. * Send SAK CLn if we are selected. */ if ( (DataPtr[2] == UidCL[0]) && - 2ec6: c7 01 movw r24, r14 - 2ec8: 62 e0 ldi r22, 0x02 ; 2 - 2eca: 70 e0 ldi r23, 0x00 ; 0 - 2ecc: c3 d1 rcall .+902 ; 0x3254 - 2ece: 88 23 and r24, r24 - 2ed0: 79 f0 breq .+30 ; 0x2ef0 - 2ed2: f7 01 movw r30, r14 - 2ed4: 81 81 ldd r24, Z+1 ; 0x01 - 2ed6: 80 93 d1 20 sts 0x20D1, r24 - 2eda: 86 e0 ldi r24, 0x06 ; 6 - 2edc: 80 93 c5 20 sts 0x20C5, r24 - 2ee0: e8 d4 rcall .+2512 ; 0x38b2 - 2ee2: 9a e0 ldi r25, 0x0A ; 10 + 2cb6: d8 01 movw r26, r16 + 2cb8: 12 96 adiw r26, 0x02 ; 2 + 2cba: 2c 91 ld r18, X + 2cbc: 12 97 sbiw r26, 0x02 ; 2 + 2cbe: 89 81 ldd r24, Y+1 ; 0x01 + 2cc0: 28 13 cpse r18, r24 + 2cc2: 96 cd rjmp .-1236 ; 0x27f0 + 2cc4: 13 96 adiw r26, 0x03 ; 3 + 2cc6: 2c 91 ld r18, X + 2cc8: 13 97 sbiw r26, 0x03 ; 3 + 2cca: 8a 81 ldd r24, Y+2 ; 0x02 + 2ccc: 28 13 cpse r18, r24 + 2cce: 90 cd rjmp .-1248 ; 0x27f0 (DataPtr[3] == UidCL[1]) && - 2ee4: 98 27 eor r25, r24 - 2ee6: d7 01 movw r26, r14 - 2ee8: 9c 93 st X, r25 - 2eea: 84 e0 ldi r24, 0x04 ; 4 - 2eec: 90 e0 ldi r25, 0x00 ; 0 - 2eee: 2d cd rjmp .-1446 ; 0x294a - 2ef0: e0 d4 rcall .+2496 ; 0x38b2 + 2cd0: 14 96 adiw r26, 0x04 ; 4 + 2cd2: 2c 91 ld r18, X + 2cd4: 14 97 sbiw r26, 0x04 ; 4 + 2cd6: 8b 81 ldd r24, Y+3 ; 0x03 + 2cd8: 28 13 cpse r18, r24 + 2cda: 8a cd rjmp .-1260 ; 0x27f0 (DataPtr[4] == UidCL[2]) && - 2ef2: 91 e0 ldi r25, 0x01 ; 1 - 2ef4: 98 27 eor r25, r24 - 2ef6: f7 01 movw r30, r14 - 2ef8: 90 83 st Z, r25 - 2efa: 84 e0 ldi r24, 0x04 ; 4 - 2efc: 90 e0 ldi r25, 0x00 ; 0 - 2efe: 25 cd rjmp .-1462 ; 0x294a + 2cdc: 15 96 adiw r26, 0x05 ; 5 + 2cde: 2c 91 ld r18, X + 2ce0: 15 97 sbiw r26, 0x05 ; 5 + 2ce2: 8c 81 ldd r24, Y+4 ; 0x04 + 2ce4: 28 13 cpse r18, r24 + 2ce6: 84 cd rjmp .-1272 ; 0x27f0 (DataPtr[5] == UidCL[3]) ) { DataPtr[0] = SAKValue; - 2f00: c7 01 movw r24, r14 + 2ce8: 9c 93 st X, r25 ISO14443AAppendCRCA(Buffer, 1); - 2f02: 62 e0 ldi r22, 0x02 ; 2 - 2f04: 70 e0 ldi r23, 0x00 ; 0 - 2f06: a6 d1 rcall .+844 ; 0x3254 - 2f08: 88 23 and r24, r24 - 2f0a: 09 f4 brne .+2 ; 0x2f0e + 2cea: 61 e0 ldi r22, 0x01 ; 1 + 2cec: 70 e0 ldi r23, 0x00 ; 0 + 2cee: c8 01 movw r24, r16 + 2cf0: 4a d1 rcall .+660 ; 0x2f86 State = STATE_ACTIVE; - 2f0c: 55 cf rjmp .-342 ; 0x2db8 - 2f0e: d7 01 movw r26, r14 - 2f10: 11 96 adiw r26, 0x01 ; 1 + 2cf2: 83 e0 ldi r24, 0x03 ; 3 + 2cf4: 80 93 b5 20 sts 0x20B5, r24 *BitCount = ISO14443A_SAK_FRAME_SIZE; - 2f12: 8c 91 ld r24, X - 2f14: 80 93 d1 20 sts 0x20D1, r24 + 2cf8: 28 e1 ldi r18, 0x18 ; 24 + 2cfa: 30 e0 ldi r19, 0x00 ; 0 + 2cfc: 5a cd rjmp .-1356 ; 0x27b2 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); return ACK_NAK_FRAME_SIZE; } } else if (Buffer[0] == CMD_WRITE) { if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { - 2f18: 88 e0 ldi r24, 0x08 ; 8 - 2f1a: 80 93 c5 20 sts 0x20C5, r24 - 2f1e: c9 d4 rcall .+2450 ; 0x38b2 - 2f20: 9a e0 ldi r25, 0x0A ; 10 - 2f22: 98 27 eor r25, r24 - 2f24: f7 01 movw r30, r14 + 2cfe: 62 e0 ldi r22, 0x02 ; 2 + 2d00: 70 e0 ldi r23, 0x00 ; 0 + 2d02: c8 01 movw r24, r16 + 2d04: 6f d1 rcall .+734 ; 0x2fe4 + 2d06: 88 23 and r24, r24 + 2d08: 81 f0 breq .+32 ; 0x2d2a /* Write command. Store the address and prepare for the upcoming data. * Respond with ACK. */ CurrentAddress = Buffer[1]; - 2f26: 90 83 st Z, r25 - 2f28: 84 e0 ldi r24, 0x04 ; 4 - 2f2a: 90 e0 ldi r25, 0x00 ; 0 - 2f2c: 0e cd rjmp .-1508 ; 0x294a + 2d0a: d8 01 movw r26, r16 + 2d0c: 11 96 adiw r26, 0x01 ; 1 + 2d0e: 8c 91 ld r24, X + 2d10: 80 93 c1 20 sts 0x20C1, r24 State = STATE_WRITE; - 2f2e: 80 91 da 20 lds r24, 0x20DA - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_INCREMENT) { - if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - CurrentAddress = Buffer[1]; - State = STATE_INCREMENT; - 2f32: 28 17 cp r18, r24 + 2d14: 86 e0 ldi r24, 0x06 ; 6 + 2d16: 80 93 b5 20 sts 0x20B5, r24 + MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); + } else { + /* In read only mode, silently ignore the write */ + } + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 2f34: 09 f0 breq .+2 ; 0x2f38 - 2f36: 25 cf rjmp .-438 ; 0x2d82 - 2f38: 30 91 d3 20 lds r19, 0x20D3 - 2f3c: 80 91 d7 20 lds r24, 0x20D7 + 2d1a: 27 d4 rcall .+2126 ; 0x356a + 2d1c: 9a e0 ldi r25, 0x0A ; 10 + 2d1e: 98 27 eor r25, r24 + 2d20: f8 01 movw r30, r16 + 2d22: 90 83 st Z, r25 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } + return ACK_NAK_FRAME_SIZE; - 2f40: 80 95 com r24 - 2f42: 38 17 cp r19, r24 - 2f44: 09 f0 breq .+2 ; 0x2f48 + 2d24: 24 e0 ldi r18, 0x04 ; 4 + 2d26: 30 e0 ldi r19, 0x00 ; 0 + 2d28: 44 cd rjmp .-1400 ; 0x27b2 /* In read only mode, silently ignore the write */ } Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2f46: 1d cf rjmp .-454 ; 0x2d82 - 2f48: 80 91 db 20 lds r24, 0x20DB - 2f4c: 38 17 cp r19, r24 - 2f4e: 09 f0 breq .+2 ; 0x2f52 - 2f50: 18 cf rjmp .-464 ; 0x2d82 + 2d2a: 1f d4 rcall .+2110 ; 0x356a + 2d2c: 91 e0 ldi r25, 0x01 ; 1 + 2d2e: 98 27 eor r25, r24 + 2d30: d8 01 movw r26, r16 + 2d32: 9c 93 st X, r25 } return ACK_NAK_FRAME_SIZE; - 2f52: 40 91 d4 20 lds r20, 0x20D4 - 2f56: 80 91 d8 20 lds r24, 0x20D8 + 2d34: 24 e0 ldi r18, 0x04 ; 4 + 2d36: 30 e0 ldi r19, 0x00 ; 0 + 2d38: 3c cd rjmp .-1416 ; 0x27b2 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_DECREMENT) { if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - 2f5a: 80 95 com r24 - 2f5c: 48 17 cp r20, r24 - 2f5e: 09 f0 breq .+2 ; 0x2f62 - 2f60: 10 cf rjmp .-480 ; 0x2d82 - 2f62: 80 91 dc 20 lds r24, 0x20DC - 2f66: 48 17 cp r20, r24 + 2d3a: 62 e0 ldi r22, 0x02 ; 2 + 2d3c: 70 e0 ldi r23, 0x00 ; 0 + 2d3e: c8 01 movw r24, r16 + 2d40: 51 d1 rcall .+674 ; 0x2fe4 + 2d42: 88 23 and r24, r24 + 2d44: 09 f4 brne .+2 ; 0x2d48 + 2d46: 5d cf rjmp .-326 ; 0x2c02 CurrentAddress = Buffer[1]; - 2f68: 09 f0 breq .+2 ; 0x2f6c - 2f6a: 0b cf rjmp .-490 ; 0x2d82 - 2f6c: e0 91 d5 20 lds r30, 0x20D5 - 2f70: 80 91 d9 20 lds r24, 0x20D9 + 2d48: f8 01 movw r30, r16 + 2d4a: 81 81 ldd r24, Z+1 ; 0x01 + 2d4c: 80 93 c1 20 sts 0x20C1, r24 + State = STATE_DECREMENT; + 2d50: 88 e0 ldi r24, 0x08 ; 8 } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_RESTORE) { if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { CurrentAddress = Buffer[1]; State = STATE_RESTORE; - 2f74: 80 95 com r24 - 2f76: e8 17 cp r30, r24 + 2d52: 80 93 b5 20 sts 0x20B5, r24 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 2f78: 09 f0 breq .+2 ; 0x2f7c - 2f7a: 03 cf rjmp .-506 ; 0x2d82 - 2f7c: 80 91 dd 20 lds r24, 0x20DD - 2f80: e8 17 cp r30, r24 - 2f82: 09 f0 breq .+2 ; 0x2f86 + 2d56: 09 d4 rcall .+2066 ; 0x356a + 2d58: 9a e0 ldi r25, 0x0A ; 10 + 2d5a: 98 27 eor r25, r24 + 2d5c: d8 01 movw r26, r16 + 2d5e: 9c 93 st X, r25 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; - 2f84: fe ce rjmp .-516 ; 0x2d82 - 2f86: 90 91 de 20 lds r25, 0x20DE + 2d60: 24 e0 ldi r18, 0x04 ; 4 + 2d62: 30 e0 ldi r19, 0x00 ; 0 + 2d64: 26 cd rjmp .-1460 ; 0x27b2 INLINE bool CheckValueIntegrity(uint8_t* Block) { /* Value Blocks contain a value stored three times, with * the middle portion inverted. */ if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) - 2f8a: 80 91 df 20 lds r24, 0x20DF - 2f8e: 80 95 com r24 - 2f90: 98 17 cp r25, r24 - 2f92: 09 f0 breq .+2 ; 0x2f96 + 2d66: 80 91 ca 20 lds r24, 0x20CA + 2d6a: 28 13 cpse r18, r24 + 2d6c: 38 cf rjmp .-400 ; 0x2bde && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) - 2f94: f6 ce rjmp .-532 ; 0x2d82 - 2f96: 80 91 e0 20 lds r24, 0x20E0 - 2f9a: 98 17 cp r25, r24 - 2f9c: 09 f0 breq .+2 ; 0x2fa0 - 2f9e: f1 ce rjmp .-542 ; 0x2d82 - 2fa0: 80 91 e1 20 lds r24, 0x20E1 - 2fa4: 80 95 com r24 - 2fa6: 98 17 cp r25, r24 - 2fa8: 09 f0 breq .+2 ; 0x2fac - 2faa: eb ce rjmp .-554 ; 0x2d82 - 2fac: d7 01 movw r26, r14 + 2d6e: e0 91 c3 20 lds r30, 0x20C3 + 2d72: 80 91 c7 20 lds r24, 0x20C7 + 2d76: 80 95 com r24 + 2d78: e8 13 cpse r30, r24 + 2d7a: 31 cf rjmp .-414 ; 0x2bde + 2d7c: 80 91 cb 20 lds r24, 0x20CB + 2d80: e8 13 cpse r30, r24 + 2d82: 2d cf rjmp .-422 ; 0x2bde && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) - 2fae: 11 96 adiw r26, 0x01 ; 1 - 2fb0: 8c 90 ld r8, X - 2fb2: 11 97 sbiw r26, 0x01 ; 1 - 2fb4: 99 24 eor r9, r9 - 2fb6: aa 24 eor r10, r10 - 2fb8: bb 24 eor r11, r11 - 2fba: ba 2c mov r11, r10 - 2fbc: a9 2c mov r10, r9 - 2fbe: 98 2c mov r9, r8 - 2fc0: 88 24 eor r8, r8 - 2fc2: 12 96 adiw r26, 0x02 ; 2 - 2fc4: 8c 91 ld r24, X - 2fc6: 90 e0 ldi r25, 0x00 ; 0 + 2d84: 80 91 c4 20 lds r24, 0x20C4 + 2d88: 90 91 c8 20 lds r25, 0x20C8 + 2d8c: 90 95 com r25 + 2d8e: 89 13 cpse r24, r25 + 2d90: 26 cf rjmp .-436 ; 0x2bde + 2d92: 90 91 cc 20 lds r25, 0x20CC + 2d96: 89 13 cpse r24, r25 + 2d98: 22 cf rjmp .-444 ; 0x2bde && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) - 2fc8: a0 e0 ldi r26, 0x00 ; 0 - 2fca: b0 e0 ldi r27, 0x00 ; 0 - 2fcc: dc 01 movw r26, r24 - 2fce: 99 27 eor r25, r25 - 2fd0: 88 27 eor r24, r24 - 2fd2: 88 2a or r8, r24 - 2fd4: 99 2a or r9, r25 - 2fd6: aa 2a or r10, r26 - 2fd8: bb 2a or r11, r27 - 2fda: d7 01 movw r26, r14 - 2fdc: 8c 91 ld r24, X - 2fde: 90 e0 ldi r25, 0x00 ; 0 - 2fe0: a0 e0 ldi r26, 0x00 ; 0 + 2d9a: 30 91 c5 20 lds r19, 0x20C5 + 2d9e: 90 91 c9 20 lds r25, 0x20C9 + 2da2: 90 95 com r25 + 2da4: 39 13 cpse r19, r25 + 2da6: 1b cf rjmp .-458 ; 0x2bde + 2da8: 90 91 cd 20 lds r25, 0x20CD + 2dac: 39 13 cpse r19, r25 + 2dae: 17 cf rjmp .-466 ; 0x2bde && (Block[12] == (uint8_t) ~Block[13]) - 2fe2: b0 e0 ldi r27, 0x00 ; 0 - 2fe4: 88 2a or r8, r24 - 2fe6: 99 2a or r9, r25 - 2fe8: aa 2a or r10, r26 - 2fea: bb 2a or r11, r27 - 2fec: d7 01 movw r26, r14 - 2fee: 13 96 adiw r26, 0x03 ; 3 - 2ff0: cc 90 ld r12, X + 2db0: 40 91 ce 20 lds r20, 0x20CE + 2db4: 90 91 cf 20 lds r25, 0x20CF + 2db8: 90 95 com r25 + 2dba: 49 13 cpse r20, r25 + 2dbc: 10 cf rjmp .-480 ; 0x2bde && (Block[12] == Block[14]) - 2ff2: dd 24 eor r13, r13 - 2ff4: ee 24 eor r14, r14 - 2ff6: ff 24 eor r15, r15 - 2ff8: fc 2c mov r15, r12 - 2ffa: ee 24 eor r14, r14 + 2dbe: 90 91 d0 20 lds r25, 0x20D0 + 2dc2: 49 13 cpse r20, r25 + 2dc4: 0c cf rjmp .-488 ; 0x2bde && (Block[14] == (uint8_t) ~Block[15])) { - 2ffc: dd 24 eor r13, r13 - 2ffe: cc 24 eor r12, r12 - 3000: 8c 28 or r8, r12 - 3002: 9d 28 or r9, r13 - 3004: ae 28 or r10, r14 - 3006: bf 28 or r11, r15 - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - *Value |= ((uint32_t) Block[1] << 8); - 3008: 83 2f mov r24, r19 - 300a: 90 e0 ldi r25, 0x00 ; 0 - 300c: a0 e0 ldi r26, 0x00 ; 0 - 300e: b0 e0 ldi r27, 0x00 ; 0 - 3010: ba 2f mov r27, r26 - 3012: a9 2f mov r26, r25 - 3014: 98 2f mov r25, r24 - 3016: 88 27 eor r24, r24 - 3018: 50 e0 ldi r21, 0x00 ; 0 - 301a: 60 e0 ldi r22, 0x00 ; 0 - 301c: 70 e0 ldi r23, 0x00 ; 0 - *Value |= ((uint32_t) Block[2] << 16); - 301e: ba 01 movw r22, r20 - 3020: 55 27 eor r21, r21 - 3022: 44 27 eor r20, r20 - 3024: 84 2b or r24, r20 - 3026: 95 2b or r25, r21 - 3028: a6 2b or r26, r22 - 302a: b7 2b or r27, r23 - 302c: 30 e0 ldi r19, 0x00 ; 0 - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - *Value |= ((uint32_t) Block[1] << 8); - 302e: 40 e0 ldi r20, 0x00 ; 0 - 3030: 50 e0 ldi r21, 0x00 ; 0 - 3032: 82 2b or r24, r18 - 3034: 93 2b or r25, r19 + 2dc6: 90 91 d1 20 lds r25, 0x20D1 + 2dca: 90 95 com r25 + 2dcc: 49 13 cpse r20, r25 + 2dce: 07 cf rjmp .-498 ; 0x2bde } INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); - 3036: a4 2b or r26, r20 - 3038: b5 2b or r27, r21 - 303a: 4e 2f mov r20, r30 - 303c: 50 e0 ldi r21, 0x00 ; 0 - 303e: 60 e0 ldi r22, 0x00 ; 0 + 2dd0: d8 01 movw r26, r16 + 2dd2: 9c 91 ld r25, X *Value |= ((uint32_t) Block[1] << 8); + 2dd4: 11 96 adiw r26, 0x01 ; 1 + 2dd6: fc 91 ld r31, X + 2dd8: 11 97 sbiw r26, 0x01 ; 1 *Value |= ((uint32_t) Block[2] << 16); - 3040: 70 e0 ldi r23, 0x00 ; 0 - 3042: 74 2f mov r23, r20 - 3044: 66 27 eor r22, r22 - 3046: 55 27 eor r21, r21 + 2dda: 12 96 adiw r26, 0x02 ; 2 + 2ddc: 4c 91 ld r20, X + 2dde: 12 97 sbiw r26, 0x02 ; 2 + 2de0: 50 e0 ldi r21, 0x00 ; 0 + 2de2: 60 e0 ldi r22, 0x00 ; 0 + 2de4: 70 e0 ldi r23, 0x00 ; 0 + 2de6: ba 01 movw r22, r20 + 2de8: 55 27 eor r21, r21 + 2dea: 44 27 eor r20, r20 + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + *Value |= ((uint32_t) Block[1] << 8); + 2dec: 5f 2b or r21, r31 + *Value |= ((uint32_t) Block[2] << 16); + 2dee: 49 2b or r20, r25 *Value |= ((uint32_t) Block[3] << 24); - 3048: 44 27 eor r20, r20 - 304a: 84 2b or r24, r20 - 304c: 95 2b or r25, r21 - 304e: a6 2b or r26, r22 - 3050: b7 2b or r27, r23 - 3052: 20 91 c5 20 lds r18, 0x20C5 - 3056: 28 30 cpi r18, 0x08 ; 8 - 3058: 09 f4 brne .+2 ; 0x305c <__stack+0x5d> - 305a: 6f c0 rjmp .+222 ; 0x313a <__stack+0x13b> - 305c: 27 30 cpi r18, 0x07 ; 7 - 305e: 21 f4 brne .+8 ; 0x3068 <__stack+0x69> - 3060: 88 0d add r24, r8 - 3062: 99 1d adc r25, r9 - + 2df0: 13 96 adiw r26, 0x03 ; 3 + 2df2: 9c 91 ld r25, X + 2df4: 79 2b or r23, r25 INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); *Value |= ((uint32_t) Block[1] << 8); - 3064: aa 1d adc r26, r10 - 3066: bb 1d adc r27, r11 - 3068: 80 93 d2 20 sts 0x20D2, r24 - 306c: 09 2f mov r16, r25 - 306e: 1a 2f mov r17, r26 - 3070: 2b 2f mov r18, r27 - 3072: 33 27 eor r19, r19 - *Value |= ((uint32_t) Block[2] << 16); - 3074: 00 93 d3 20 sts 0x20D3, r16 - 3078: ad 01 movw r20, r26 - 307a: 66 27 eor r22, r22 - 307c: 77 27 eor r23, r23 - 307e: 40 93 d4 20 sts 0x20D4, r20 - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - *Value |= ((uint32_t) Block[1] << 8); - 3082: cb 2e mov r12, r27 - 3084: dd 24 eor r13, r13 - 3086: ee 24 eor r14, r14 -} - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - 3088: ff 24 eor r15, r15 - 308a: c0 92 d5 20 sts 0x20D5, r12 - *Value |= ((uint32_t) Block[1] << 8); *Value |= ((uint32_t) Block[2] << 16); - 308e: e8 2f mov r30, r24 - 3090: e0 95 com r30 - 3092: e0 93 d6 20 sts 0x20D6, r30 + 2df6: 90 e0 ldi r25, 0x00 ; 0 + 2df8: a0 e0 ldi r26, 0x00 ; 0 + 2dfa: b0 e0 ldi r27, 0x00 ; 0 + 2dfc: dc 01 movw r26, r24 + 2dfe: 99 27 eor r25, r25 + 2e00: 88 27 eor r24, r24 + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + *Value |= ((uint32_t) Block[1] << 8); + 2e02: 9e 2b or r25, r30 + *Value |= ((uint32_t) Block[2] << 16); + 2e04: 82 2b or r24, r18 *Value |= ((uint32_t) Block[3] << 24); - 3096: e0 2f mov r30, r16 - 3098: e0 95 com r30 - 309a: e0 93 d7 20 sts 0x20D7, r30 - 309e: e4 2f mov r30, r20 - 30a0: e0 95 com r30 - 30a2: e0 93 d8 20 sts 0x20D8, r30 - 30a6: ec 2d mov r30, r12 - 30a8: e0 95 com r30 - 30aa: e0 93 d9 20 sts 0x20D9, r30 + 2e06: b3 2b or r27, r19 uint32_t BlockValue; ValueFromBlock(&ParamValue, Buffer); ValueFromBlock(&BlockValue, BlockBuffer); if (State == STATE_DECREMENT) { - 30ae: 80 93 da 20 sts 0x20DA, r24 - 30b2: 00 93 db 20 sts 0x20DB, r16 - 30b6: 40 93 dc 20 sts 0x20DC, r20 + 2e08: 20 91 b5 20 lds r18, 0x20B5 + 2e0c: 28 30 cpi r18, 0x08 ; 8 + 2e0e: 09 f4 brne .+2 ; 0x2e12 + 2e10: 6d c0 rjmp .+218 ; 0x2eec BlockValue -= ParamValue; } else if (State == STATE_INCREMENT) { - 30ba: c0 92 dd 20 sts 0x20DD, r12 + 2e12: 27 30 cpi r18, 0x07 ; 7 + 2e14: 21 f4 brne .+8 ; 0x2e1e BlockValue += ParamValue; - 30be: 85 e0 ldi r24, 0x05 ; 5 - 30c0: 80 93 c5 20 sts 0x20C5, r24 + 2e16: 84 0f add r24, r20 + 2e18: 95 1f adc r25, r21 + 2e1a: a6 1f adc r26, r22 + 2e1c: b7 1f adc r27, r23 *Value |= ((uint32_t) Block[3] << 24); } INLINE void ValueToBlock(uint8_t* Block, uint32_t Value) { Block[0] = (uint8_t) (Value >> 0); - 30c4: 80 e0 ldi r24, 0x00 ; 0 - 30c6: 90 e0 ldi r25, 0x00 ; 0 + 2e1e: 80 93 c2 20 sts 0x20C2, r24 Block[1] = (uint8_t) (Value >> 8); - 30c8: 40 cc rjmp .-1920 ; 0x294a - 30ca: c7 01 movw r24, r14 - 30cc: 62 e0 ldi r22, 0x02 ; 2 - 30ce: 70 e0 ldi r23, 0x00 ; 0 - 30d0: c1 d0 rcall .+386 ; 0x3254 - 30d2: 88 23 and r24, r24 + 2e22: c9 2e mov r12, r25 + 2e24: da 2e mov r13, r26 + 2e26: eb 2e mov r14, r27 + 2e28: ff 24 eor r15, r15 + 2e2a: c0 92 c3 20 sts 0x20C3, r12 Block[2] = (uint8_t) (Value >> 16); - 30d4: 09 f4 brne .+2 ; 0x30d8 <__stack+0xd9> - 30d6: 0c cf rjmp .-488 ; 0x2ef0 - 30d8: f7 01 movw r30, r14 - 30da: 81 81 ldd r24, Z+1 ; 0x01 - 30dc: 80 93 d1 20 sts 0x20D1, r24 + 2e2e: 8d 01 movw r16, r26 + 2e30: 22 27 eor r18, r18 + 2e32: 33 27 eor r19, r19 + 2e34: 00 93 c4 20 sts 0x20C4, r16 Block[3] = (uint8_t) (Value >> 24); - 30e0: 87 e0 ldi r24, 0x07 ; 7 - 30e2: fc ce rjmp .-520 ; 0x2edc - 30e4: c7 01 movw r24, r14 - 30e6: 62 e0 ldi r22, 0x02 ; 2 - 30e8: 70 e0 ldi r23, 0x00 ; 0 + 2e38: 4b 2f mov r20, r27 + 2e3a: 55 27 eor r21, r21 + 2e3c: 66 27 eor r22, r22 + 2e3e: 77 27 eor r23, r23 + 2e40: 40 93 c5 20 sts 0x20C5, r20 Block[4] = ~Block[0]; - 30ea: b4 d0 rcall .+360 ; 0x3254 - 30ec: 88 23 and r24, r24 - 30ee: 09 f4 brne .+2 ; 0x30f2 <__stack+0xf3> - 30f0: 63 ce rjmp .-826 ; 0x2db8 + 2e44: e8 2f mov r30, r24 + 2e46: e0 95 com r30 + 2e48: e0 93 c6 20 sts 0x20C6, r30 Block[5] = ~Block[1]; - 30f2: d7 01 movw r26, r14 - 30f4: 11 96 adiw r26, 0x01 ; 1 - 30f6: 8c 91 ld r24, X - 30f8: 11 97 sbiw r26, 0x01 ; 1 + 2e4c: ec 2d mov r30, r12 + 2e4e: e0 95 com r30 + 2e50: e0 93 c7 20 sts 0x20C7, r30 Block[6] = ~Block[2]; - 30fa: 80 93 d1 20 sts 0x20D1, r24 - 30fe: 89 e0 ldi r24, 0x09 ; 9 - 3100: 0c cf rjmp .-488 ; 0x2f1a + 2e54: e0 2f mov r30, r16 + 2e56: e0 95 com r30 + 2e58: e0 93 c8 20 sts 0x20C8, r30 Block[7] = ~Block[3]; - 3102: c7 01 movw r24, r14 - 3104: 62 e0 ldi r22, 0x02 ; 2 - 3106: 70 e0 ldi r23, 0x00 ; 0 - 3108: a5 d0 rcall .+330 ; 0x3254 + 2e5c: e4 2f mov r30, r20 + 2e5e: e0 95 com r30 + 2e60: e0 93 c9 20 sts 0x20C9, r30 Block[8] = Block[0]; - 310a: 88 23 and r24, r24 - 310c: 09 f4 brne .+2 ; 0x3110 <__stack+0x111> + 2e64: 80 93 ca 20 sts 0x20CA, r24 Block[9] = Block[1]; - 310e: f0 ce rjmp .-544 ; 0x2ef0 - 3110: 80 91 0c 21 lds r24, 0x210C + 2e68: c0 92 cb 20 sts 0x20CB, r12 Block[10] = Block[2]; - 3114: 88 23 and r24, r24 + 2e6c: 00 93 cc 20 sts 0x20CC, r16 Block[11] = Block[3]; - 3116: 09 f0 breq .+2 ; 0x311a <__stack+0x11b> - 3118: e3 ce rjmp .-570 ; 0x2ee0 + 2e70: 40 93 cd 20 sts 0x20CD, r20 /* Do nothing */ } ValueToBlock(BlockBuffer, BlockValue); State = STATE_AUTHED_IDLE; - 311a: f7 01 movw r30, r14 - 311c: 61 81 ldd r22, Z+1 ; 0x01 - 311e: 70 e0 ldi r23, 0x00 ; 0 + 2e74: 85 e0 ldi r24, 0x05 ; 5 + 2e76: 80 93 b5 20 sts 0x20B5, r24 /* No ACK response on value commands part 2 */ return ISO14443A_APP_NO_RESPONSE; - 3120: 62 95 swap r22 - 3122: 72 95 swap r23 - 3124: 70 7f andi r23, 0xF0 ; 240 + 2e7a: 20 e0 ldi r18, 0x00 ; 0 + 2e7c: 30 e0 ldi r19, 0x00 ; 0 + 2e7e: 99 cc rjmp .-1742 ; 0x27b2 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_INCREMENT) { if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - 3126: 76 27 eor r23, r22 - 3128: 60 7f andi r22, 0xF0 ; 240 - 312a: 76 27 eor r23, r22 - 312c: 82 ed ldi r24, 0xD2 ; 210 - 312e: 90 e2 ldi r25, 0x20 ; 32 - 3130: 40 e1 ldi r20, 0x10 ; 16 - 3132: 50 e0 ldi r21, 0x00 ; 0 - 3134: 0e 94 b8 06 call 0xd70 ; 0xd70 + 2e80: 62 e0 ldi r22, 0x02 ; 2 + 2e82: 70 e0 ldi r23, 0x00 ; 0 + 2e84: c8 01 movw r24, r16 + 2e86: ae d0 rcall .+348 ; 0x2fe4 + 2e88: 88 23 and r24, r24 + 2e8a: 09 f4 brne .+2 ; 0x2e8e + 2e8c: 4e cf rjmp .-356 ; 0x2d2a CurrentAddress = Buffer[1]; - 3138: d3 ce rjmp .-602 ; 0x2ee0 - 313a: 88 19 sub r24, r8 - 313c: 99 09 sbc r25, r9 + 2e8e: d8 01 movw r26, r16 + 2e90: 11 96 adiw r26, 0x01 ; 1 + 2e92: 8c 91 ld r24, X + 2e94: 80 93 c1 20 sts 0x20C1, r24 State = STATE_INCREMENT; - 313e: aa 09 sbc r26, r10 - 3140: bb 09 sbc r27, r11 + 2e98: 87 e0 ldi r24, 0x07 ; 7 + 2e9a: 80 93 b5 20 sts 0x20B5, r24 + 2e9e: 3d cf rjmp .-390 ; 0x2d1a } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_RESTORE) { if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - 3142: 92 cf rjmp .-220 ; 0x3068 <__stack+0x69> - 3144: c7 01 movw r24, r14 - 3146: 62 e0 ldi r22, 0x02 ; 2 - 3148: 70 e0 ldi r23, 0x00 ; 0 - 314a: 84 d0 rcall .+264 ; 0x3254 - 314c: 88 23 and r24, r24 - 314e: 09 f0 breq .+2 ; 0x3152 <__stack+0x153> - 3150: 49 cc rjmp .-1902 ; 0x29e4 + 2ea0: 62 e0 ldi r22, 0x02 ; 2 + 2ea2: 70 e0 ldi r23, 0x00 ; 0 + 2ea4: c8 01 movw r24, r16 + 2ea6: 9e d0 rcall .+316 ; 0x2fe4 + 2ea8: 88 23 and r24, r24 + 2eaa: 09 f4 brne .+2 ; 0x2eae + 2eac: aa ce rjmp .-684 ; 0x2c02 CurrentAddress = Buffer[1]; - 3152: 81 e0 ldi r24, 0x01 ; 1 - 3154: d7 01 movw r26, r14 - 3156: 8c 93 st X, r24 - 3158: 84 e0 ldi r24, 0x04 ; 4 - 315a: 90 e0 ldi r25, 0x00 ; 0 - 315c: f6 cb rjmp .-2068 ; 0x294a + 2eae: f8 01 movw r30, r16 + 2eb0: 81 81 ldd r24, Z+1 ; 0x01 + 2eb2: 80 93 c1 20 sts 0x20C1, r24 State = STATE_RESTORE; - 315e: 8d 81 ldd r24, Y+5 ; 0x05 - 3160: f7 01 movw r30, r14 + 2eb6: 89 e0 ldi r24, 0x09 ; 9 + 2eb8: 4c cf rjmp .-360 ; 0x2d52 Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; }else if (Buffer[0] == CMD_TRANSFER) { /* Write back the global block buffer to the desired block address */ if (ISO14443ACheckCRCA(Buffer, CMD_TRANSFER_FRAME_SIZE)) { - 3162: 80 83 st Z, r24 - 3164: 3e 81 ldd r19, Y+6 ; 0x06 - 3166: 31 83 std Z+1, r19 ; 0x01 - 3168: 2f 81 ldd r18, Y+7 ; 0x07 - 316a: 22 83 std Z+2, r18 ; 0x02 - 316c: 98 85 ldd r25, Y+8 ; 0x08 - 316e: 93 83 std Z+3, r25 ; 0x03 - 3170: 83 27 eor r24, r19 + 2eba: 62 e0 ldi r22, 0x02 ; 2 + 2ebc: 70 e0 ldi r23, 0x00 ; 0 + 2ebe: c8 01 movw r24, r16 + 2ec0: 91 d0 rcall .+290 ; 0x2fe4 + 2ec2: 88 23 and r24, r24 + 2ec4: 09 f4 brne .+2 ; 0x2ec8 + 2ec6: 31 cf rjmp .-414 ; 0x2d2a if (!ActiveConfiguration.ReadOnly) { - 3172: 82 27 eor r24, r18 - 3174: 89 27 eor r24, r25 - 3176: 84 83 std Z+4, r24 ; 0x04 - 3178: 88 e2 ldi r24, 0x28 ; 40 - 317a: 90 e0 ldi r25, 0x00 ; 0 + 2ec8: 80 91 fc 20 lds r24, 0x20FC + 2ecc: 81 11 cpse r24, r1 + 2ece: 25 cf rjmp .-438 ; 0x2d1a MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); - 317c: e6 cb rjmp .-2100 ; 0x294a - 317e: 80 e3 ldi r24, 0x30 ; 48 - 3180: 90 e0 ldi r25, 0x00 ; 0 - 3182: 20 cd rjmp .-1472 ; 0x2bc4 - 3184: 80 e3 ldi r24, 0x30 ; 48 - 3186: 90 e0 ldi r25, 0x00 ; 0 - 3188: 8a cd rjmp .-1260 ; 0x2c9e - -0000318a : - 318a: 60 e0 ldi r22, 0x00 ; 0 - 318c: 70 e0 ldi r23, 0x00 ; 0 - 318e: 44 e0 ldi r20, 0x04 ; 4 - 3190: 50 e0 ldi r21, 0x00 ; 0 - 3192: 0c 94 2d 06 jmp 0xc5a ; 0xc5a - -00003196 : - 3196: cf 93 push r28 - 3198: df 93 push r29 - 319a: 0f 92 push r0 + 2ed0: d8 01 movw r26, r16 + 2ed2: 11 96 adiw r26, 0x01 ; 1 + 2ed4: 6c 91 ld r22, X + 2ed6: b0 e1 ldi r27, 0x10 ; 16 + 2ed8: 6b 9f mul r22, r27 + 2eda: b0 01 movw r22, r0 + 2edc: 11 24 eor r1, r1 + 2ede: 40 e1 ldi r20, 0x10 ; 16 + 2ee0: 50 e0 ldi r21, 0x00 ; 0 + 2ee2: 82 ec ldi r24, 0xC2 ; 194 + 2ee4: 90 e2 ldi r25, 0x20 ; 32 + 2ee6: 0e 94 81 06 call 0xd02 ; 0xd02 + 2eea: 17 cf rjmp .-466 ; 0x2d1a ValueFromBlock(&ParamValue, Buffer); ValueFromBlock(&BlockValue, BlockBuffer); if (State == STATE_DECREMENT) { BlockValue -= ParamValue; - 319c: cd b7 in r28, 0x3d ; 61 - 319e: de b7 in r29, 0x3e ; 62 - 31a0: fc 01 movw r30, r24 - 31a2: 81 81 ldd r24, Z+1 ; 0x01 - 31a4: 90 81 ld r25, Z + 2eec: 84 1b sub r24, r20 + 2eee: 95 0b sbc r25, r21 + 2ef0: a6 0b sbc r26, r22 + 2ef2: b7 0b sbc r27, r23 + 2ef4: 94 cf rjmp .-216 ; 0x2e1e return BitCount; } else if (Buffer[0] == CMD_HALT) { /* Halts the tag. According to the ISO14443, the second * byte is supposed to be 0. */ if (Buffer[1] == 0) { if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { - 31a6: 89 27 eor r24, r25 - 31a8: 92 81 ldd r25, Z+2 ; 0x02 - 31aa: 89 27 eor r24, r25 - 31ac: 93 81 ldd r25, Z+3 ; 0x03 - 31ae: 89 27 eor r24, r25 - 31b0: 89 83 std Y+1, r24 ; 0x01 - 31b2: cf 01 movw r24, r30 - 31b4: 60 e0 ldi r22, 0x00 ; 0 + 2ef6: 62 e0 ldi r22, 0x02 ; 2 + 2ef8: 70 e0 ldi r23, 0x00 ; 0 + 2efa: c8 01 movw r24, r16 + 2efc: 73 d0 rcall .+230 ; 0x2fe4 + 2efe: 81 11 cpse r24, r1 + 2f00: a7 cc rjmp .-1714 ; 0x2850 /* Setup crypto1 cipher. Discard in-place encrypted CardNonce. */ Crypto1Setup(Key, Uid, CardNonce); return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; } else { Buffer[0] = NAK_CRC_ERROR; - 31b6: 70 e0 ldi r23, 0x00 ; 0 - 31b8: 44 e0 ldi r20, 0x04 ; 4 - 31ba: 50 e0 ldi r21, 0x00 ; 0 + 2f02: 81 e0 ldi r24, 0x01 ; 1 + 2f04: d8 01 movw r26, r16 + 2f06: 8c 93 st X, r24 return ACK_NAK_FRAME_SIZE; - 31bc: 0e 94 b8 06 call 0xd70 ; 0xd70 - 31c0: ce 01 movw r24, r28 + 2f08: 24 e0 ldi r18, 0x04 ; 4 + 2f0a: 30 e0 ldi r19, 0x00 ; 0 + 2f0c: 52 cc rjmp .-1884 ; 0x27b2 switch (NVB) { case ISO14443A_NVB_AC_START: /* Start of anticollision procedure. * Send whole UID CLn + BCC */ DataPtr[0] = UidCL[0]; - 31c2: 01 96 adiw r24, 0x01 ; 1 - 31c4: 64 e0 ldi r22, 0x04 ; 4 - 31c6: 70 e0 ldi r23, 0x00 ; 0 + 2f0e: 89 81 ldd r24, Y+1 ; 0x01 + 2f10: f8 01 movw r30, r16 + 2f12: 80 83 st Z, r24 DataPtr[1] = UidCL[1]; - 31c8: 41 e0 ldi r20, 0x01 ; 1 - 31ca: 50 e0 ldi r21, 0x00 ; 0 + 2f14: 3a 81 ldd r19, Y+2 ; 0x02 + 2f16: 31 83 std Z+1, r19 ; 0x01 DataPtr[2] = UidCL[2]; - 31cc: 0e 94 b8 06 call 0xd70 ; 0xd70 + 2f18: 2b 81 ldd r18, Y+3 ; 0x03 + 2f1a: 22 83 std Z+2, r18 ; 0x02 DataPtr[3] = UidCL[3]; - 31d0: 0f 90 pop r0 - 31d2: df 91 pop r29 + 2f1c: 9c 81 ldd r25, Y+4 ; 0x04 + 2f1e: 93 83 std Z+3, r25 ; 0x03 DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 31d4: cf 91 pop r28 - 31d6: 08 95 ret + 2f20: 83 27 eor r24, r19 + 2f22: 82 27 eor r24, r18 + 2f24: 89 27 eor r24, r25 + 2f26: 84 83 std Z+4, r24 ; 0x04 -000031d8 : + *BitCount = ISO14443A_CL_FRAME_SIZE; + 2f28: 28 e2 ldi r18, 0x28 ; 40 + 2f2a: 30 e0 ldi r19, 0x00 ; 0 + 2f2c: 42 cc rjmp .-1916 ; 0x27b2 + return ACK_NAK_FRAME_SIZE; + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + /* Nested authentication. */ + uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + 2f2e: 60 e3 ldi r22, 0x30 ; 48 + 2f30: 70 e0 ldi r23, 0x00 ; 0 + 2f32: 7a cd rjmp .-1292 ; 0x2a28 + return ACK_NAK_FRAME_SIZE; + } + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + 2f34: 80 e3 ldi r24, 0x30 ; 48 + 2f36: 90 e0 ldi r25, 0x00 ; 0 + 2f38: e6 cd rjmp .-1076 ; 0x2b06 + +00002f3a : + return ISO14443A_APP_NO_RESPONSE; +} + +void MifareClassicGetUid(ConfigurationUidType Uid) +{ + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 2f3a: 44 e0 ldi r20, 0x04 ; 4 + 2f3c: 50 e0 ldi r21, 0x00 ; 0 + 2f3e: 60 e0 ldi r22, 0x00 ; 0 + 2f40: 70 e0 ldi r23, 0x00 ; 0 + 2f42: 0c 94 fc 05 jmp 0xbf8 ; 0xbf8 + +00002f46 : +} + +void MifareClassicSetUid(ConfigurationUidType Uid) +{ + 2f46: cf 93 push r28 + 2f48: df 93 push r29 + 2f4a: 1f 92 push r1 + 2f4c: cd b7 in r28, 0x3d ; 61 + 2f4e: de b7 in r29, 0x3e ; 62 + uint8_t BCC = Uid[0] ^ Uid[1] ^ Uid[2] ^ Uid[3]; + 2f50: fc 01 movw r30, r24 + 2f52: 21 81 ldd r18, Z+1 ; 0x01 + 2f54: 30 81 ld r19, Z + 2f56: 23 27 eor r18, r19 + 2f58: 32 81 ldd r19, Z+2 ; 0x02 + 2f5a: 23 27 eor r18, r19 + 2f5c: 33 81 ldd r19, Z+3 ; 0x03 + 2f5e: 23 27 eor r18, r19 + 2f60: 29 83 std Y+1, r18 ; 0x01 + + MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 2f62: 44 e0 ldi r20, 0x04 ; 4 + 2f64: 50 e0 ldi r21, 0x00 ; 0 + 2f66: 60 e0 ldi r22, 0x00 ; 0 + 2f68: 70 e0 ldi r23, 0x00 ; 0 + 2f6a: 0e 94 81 06 call 0xd02 ; 0xd02 + MemoryWriteBlock(&BCC, MEM_UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); + 2f6e: 41 e0 ldi r20, 0x01 ; 1 + 2f70: 50 e0 ldi r21, 0x00 ; 0 + 2f72: 64 e0 ldi r22, 0x04 ; 4 + 2f74: 70 e0 ldi r23, 0x00 ; 0 + 2f76: ce 01 movw r24, r28 + 2f78: 01 96 adiw r24, 0x01 ; 1 + 2f7a: 0e 94 81 06 call 0xd02 ; 0xd02 +} + 2f7e: 0f 90 pop r0 + 2f80: df 91 pop r29 + 2f82: cf 91 pop r28 + 2f84: 08 95 ret + +00002f86 : + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 2f86: 61 15 cp r22, r1 + 2f88: 71 05 cpc r23, r1 + 2f8a: 41 f1 breq .+80 ; 0x2fdc * policies, either expressed or implied, of the ORIGINAL AUTHORS. */ #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - 31d8: ef 92 push r14 - 31da: ff 92 push r15 - 31dc: 0f 93 push r16 - 31de: 1f 93 push r17 - 31e0: cf 93 push r28 - 31e2: 7c 01 movw r14, r24 - 31e4: 8b 01 movw r16, r22 + 2f8c: 68 0f add r22, r24 + 2f8e: 79 1f adc r23, r25 uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 31e6: 61 15 cp r22, r1 - 31e8: 71 05 cpc r23, r1 - 31ea: 81 f1 breq .+96 ; 0x324c - 31ec: fb 01 movw r30, r22 - -#include "ISO14443-3A.h" - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - 31ee: dc 01 movw r26, r24 + 2f90: fc 01 movw r30, r24 */ #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 31f0: 43 e6 ldi r20, 0x63 ; 99 - 31f2: 53 e6 ldi r21, 0x63 ; 99 + 2f92: 23 e6 ldi r18, 0x63 ; 99 + 2f94: 33 e6 ldi r19, 0x63 ; 99 uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { uint8_t Byte = *DataPtr++; - 31f4: 8d 91 ld r24, X+ + 2f96: 41 91 ld r20, Z+ Byte ^= (uint8_t) (Checksum & 0x00FF); - 31f6: 84 27 eor r24, r20 + 2f98: 42 27 eor r20, r18 Byte ^= Byte << 4; - 31f8: c8 2f mov r28, r24 - 31fa: c2 95 swap r28 - 31fc: c0 7f andi r28, 0xF0 ; 240 - 31fe: c8 27 eor r28, r24 + 2f9a: 50 e1 ldi r21, 0x10 ; 16 + 2f9c: 45 9f mul r20, r21 + 2f9e: c0 01 movw r24, r0 + 2fa0: 11 24 eor r1, r1 + 2fa2: a4 2f mov r26, r20 + 2fa4: a8 27 eor r26, r24 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3200: 8c 2f mov r24, r28 - 3202: 90 e0 ldi r25, 0x00 ; 0 - 3204: 78 2f mov r23, r24 - 3206: 66 27 eor r22, r22 + 2fa6: 8a 2f mov r24, r26 + 2fa8: 90 e0 ldi r25, 0x00 ; 0 + 2faa: 58 2f mov r21, r24 + 2fac: 44 27 eor r20, r20 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3208: 9c 01 movw r18, r24 - 320a: 22 0f add r18, r18 - 320c: 33 1f adc r19, r19 - 320e: 22 0f add r18, r18 - 3210: 33 1f adc r19, r19 - 3212: 22 0f add r18, r18 - 3214: 33 1f adc r19, r19 + 2fae: 88 0f add r24, r24 + 2fb0: 99 1f adc r25, r25 + 2fb2: 88 0f add r24, r24 + 2fb4: 99 1f adc r25, r25 + 2fb6: 88 0f add r24, r24 + 2fb8: 99 1f adc r25, r25 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3216: 62 27 eor r22, r18 - 3218: 73 27 eor r23, r19 - 321a: 45 2f mov r20, r21 - 321c: 55 27 eor r21, r21 - 321e: 46 27 eor r20, r22 - 3220: 57 27 eor r21, r23 + 2fba: 48 27 eor r20, r24 + 2fbc: 59 27 eor r21, r25 + 2fbe: 23 2f mov r18, r19 + 2fc0: 33 27 eor r19, r19 + 2fc2: 24 27 eor r18, r20 + 2fc4: 35 27 eor r19, r21 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3222: c2 95 swap r28 - 3224: cf 70 andi r28, 0x0F ; 15 - 3226: 8c 2f mov r24, r28 - 3228: 90 e0 ldi r25, 0x00 ; 0 + 2fc6: a2 95 swap r26 + 2fc8: af 70 andi r26, 0x0F ; 15 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 322a: 48 27 eor r20, r24 - 322c: 59 27 eor r21, r25 - 322e: 31 97 sbiw r30, 0x01 ; 1 + 2fca: 2a 27 eor r18, r26 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 3230: 09 f7 brne .-62 ; 0x31f4 - 3232: f7 01 movw r30, r14 - 3234: e0 0f add r30, r16 - 3236: f1 1f adc r31, r17 - 3238: 94 2f mov r25, r20 - 323a: 85 2f mov r24, r21 + 2fcc: e6 17 cp r30, r22 + 2fce: f7 07 cpc r31, r23 + 2fd0: 11 f7 brne .-60 ; 0x2f96 + 2fd2: 92 2f mov r25, r18 + 2fd4: 83 2f mov r24, r19 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } *DataPtr++ = (Checksum >> 0) & 0x00FF; - 323c: 90 83 st Z, r25 + 2fd6: 90 83 st Z, r25 *DataPtr = (Checksum >> 8) & 0x00FF; - 323e: 81 83 std Z+1, r24 ; 0x01 -} - 3240: cf 91 pop r28 - 3242: 1f 91 pop r17 - 3244: 0f 91 pop r16 - 3246: ff 90 pop r15 - 3248: ef 90 pop r14 - 324a: 08 95 ret + 2fd8: 81 83 std Z+1, r24 ; 0x01 + 2fda: 08 95 ret #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 324c: fc 01 movw r30, r24 + 2fdc: fc 01 movw r30, r24 while(ByteCount--) { - 324e: 83 e6 ldi r24, 0x63 ; 99 - 3250: 93 e6 ldi r25, 0x63 ; 99 - 3252: f4 cf rjmp .-24 ; 0x323c + 2fde: 83 e6 ldi r24, 0x63 ; 99 + 2fe0: 93 e6 ldi r25, 0x63 ; 99 + 2fe2: f9 cf rjmp .-14 ; 0x2fd6 -00003254 : - *DataPtr++ = (Checksum >> 0) & 0x00FF; - *DataPtr = (Checksum >> 8) & 0x00FF; -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - 3254: ef 92 push r14 - 3256: ff 92 push r15 - 3258: 0f 93 push r16 - 325a: 1f 93 push r17 - 325c: cf 93 push r28 - 325e: 7c 01 movw r14, r24 - 3260: 8b 01 movw r16, r22 - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 3262: 61 15 cp r22, r1 - 3264: 71 05 cpc r23, r1 - 3266: 09 f4 brne .+2 ; 0x326a - 3268: 3d c0 rjmp .+122 ; 0x32e4 - 326a: fb 01 movw r30, r22 -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - 326c: dc 01 movw r26, r24 - *DataPtr = (Checksum >> 8) & 0x00FF; -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - 326e: 43 e6 ldi r20, 0x63 ; 99 - 3270: 53 e6 ldi r21, 0x63 ; 99 - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - uint8_t Byte = *DataPtr++; - 3272: 8d 91 ld r24, X+ - - Byte ^= (uint8_t) (Checksum & 0x00FF); - 3274: 84 27 eor r24, r20 - Byte ^= Byte << 4; - 3276: c8 2f mov r28, r24 - 3278: c2 95 swap r28 - 327a: c0 7f andi r28, 0xF0 ; 240 - 327c: c8 27 eor r28, r24 - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 327e: 8c 2f mov r24, r28 - 3280: 90 e0 ldi r25, 0x00 ; 0 - 3282: 78 2f mov r23, r24 - 3284: 66 27 eor r22, r22 - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3286: 9c 01 movw r18, r24 - 3288: 22 0f add r18, r18 - 328a: 33 1f adc r19, r19 - 328c: 22 0f add r18, r18 - 328e: 33 1f adc r19, r19 - 3290: 22 0f add r18, r18 - 3292: 33 1f adc r19, r19 - uint8_t Byte = *DataPtr++; - - Byte ^= (uint8_t) (Checksum & 0x00FF); - Byte ^= Byte << 4; - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3294: 62 27 eor r22, r18 - 3296: 73 27 eor r23, r19 - 3298: 45 2f mov r20, r21 - 329a: 55 27 eor r21, r21 - 329c: 46 27 eor r20, r22 - 329e: 57 27 eor r21, r23 - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 32a0: c2 95 swap r28 - 32a2: cf 70 andi r28, 0x0F ; 15 - 32a4: 8c 2f mov r24, r28 - 32a6: 90 e0 ldi r25, 0x00 ; 0 - uint8_t Byte = *DataPtr++; - - Byte ^= (uint8_t) (Checksum & 0x00FF); - Byte ^= Byte << 4; - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 32a8: 48 27 eor r20, r24 - 32aa: 59 27 eor r21, r25 - 32ac: 31 97 sbiw r30, 0x01 ; 1 +00002fe4 : bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 32ae: 09 f7 brne .-62 ; 0x3272 - 32b0: f7 01 movw r30, r14 - 32b2: e0 0f add r30, r16 - 32b4: f1 1f adc r31, r17 - 32b6: 9a 01 movw r18, r20 - 32b8: 30 70 andi r19, 0x00 ; 0 - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - } - - return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); - 32ba: 80 81 ld r24, Z - 32bc: 90 e0 ldi r25, 0x00 ; 0 - 32be: 82 17 cp r24, r18 - 32c0: 93 07 cpc r25, r19 - 32c2: 39 f0 breq .+14 ; 0x32d2 - 32c4: 80 e0 ldi r24, 0x00 ; 0 -} - 32c6: cf 91 pop r28 - 32c8: 1f 91 pop r17 - 32ca: 0f 91 pop r16 - 32cc: ff 90 pop r15 - 32ce: ef 90 pop r14 - 32d0: 08 95 ret - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - } - - return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); - 32d2: 21 81 ldd r18, Z+1 ; 0x01 - 32d4: 30 e0 ldi r19, 0x00 ; 0 - 32d6: 45 2f mov r20, r21 - 32d8: 55 27 eor r21, r21 + 2fe4: 61 15 cp r22, r1 + 2fe6: 71 05 cpc r23, r1 + 2fe8: b1 f1 breq .+108 ; 0x3056 <__stack+0x57> *DataPtr++ = (Checksum >> 0) & 0x00FF; *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) - 32da: 81 e0 ldi r24, 0x01 ; 1 - 32dc: 24 17 cp r18, r20 - 32de: 35 07 cpc r19, r21 - 32e0: 89 f7 brne .-30 ; 0x32c4 - 32e2: f1 cf rjmp .-30 ; 0x32c6 + 2fea: 68 0f add r22, r24 + 2fec: 79 1f adc r23, r25 { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 32e4: fc 01 movw r30, r24 - - while(ByteCount--) { - 32e6: 23 e6 ldi r18, 0x63 ; 99 - 32e8: 30 e0 ldi r19, 0x00 ; 0 + 2fee: fc 01 movw r30, r24 *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 32ea: 43 e6 ldi r20, 0x63 ; 99 - 32ec: 53 e6 ldi r21, 0x63 ; 99 - 32ee: e5 cf rjmp .-54 ; 0x32ba + 2ff0: 23 e6 ldi r18, 0x63 ; 99 + 2ff2: 33 e6 ldi r19, 0x63 ; 99 + uint8_t* DataPtr = (uint8_t*) Buffer; -000032f0 : + while(ByteCount--) { + uint8_t Byte = *DataPtr++; + 2ff4: 41 91 ld r20, Z+ + + Byte ^= (uint8_t) (Checksum & 0x00FF); + 2ff6: 42 27 eor r20, r18 + Byte ^= Byte << 4; + 2ff8: 50 e1 ldi r21, 0x10 ; 16 + 2ffa: 45 9f mul r20, r21 + 2ffc: c0 01 movw r24, r0 + 2ffe: 11 24 eor r1, r1 + 3000: a4 2f mov r26, r20 + 3002: a8 27 eor r26, r24 + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 3004: 8a 2f mov r24, r26 + 3006: 90 e0 ldi r25, 0x00 ; 0 + 3008: 58 2f mov r21, r24 + 300a: 44 27 eor r20, r20 + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + 300c: 88 0f add r24, r24 + 300e: 99 1f adc r25, r25 + 3010: 88 0f add r24, r24 + 3012: 99 1f adc r25, r25 + 3014: 88 0f add r24, r24 + 3016: 99 1f adc r25, r25 + uint8_t Byte = *DataPtr++; + + Byte ^= (uint8_t) (Checksum & 0x00FF); + Byte ^= Byte << 4; + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 3018: 48 27 eor r20, r24 + 301a: 59 27 eor r21, r25 + 301c: 23 2f mov r18, r19 + 301e: 33 27 eor r19, r19 + 3020: 24 27 eor r18, r20 + 3022: 35 27 eor r19, r21 + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + 3024: a2 95 swap r26 + 3026: af 70 andi r26, 0x0F ; 15 + uint8_t Byte = *DataPtr++; + + Byte ^= (uint8_t) (Checksum & 0x00FF); + Byte ^= Byte << 4; + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 3028: 2a 27 eor r18, r26 +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 302a: e6 17 cp r30, r22 + 302c: f7 07 cpc r31, r23 + 302e: 11 f7 brne .-60 ; 0x2ff4 + 3030: a9 01 movw r20, r18 + 3032: 55 27 eor r21, r21 + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + } + + return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); + 3034: 80 81 ld r24, Z + 3036: 90 e0 ldi r25, 0x00 ; 0 + 3038: 84 17 cp r24, r20 + 303a: 95 07 cpc r25, r21 + 303c: 11 f0 breq .+4 ; 0x3042 <__stack+0x43> + 303e: 80 e0 ldi r24, 0x00 ; 0 +} + 3040: 08 95 ret + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + } + + return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); + 3042: 41 81 ldd r20, Z+1 ; 0x01 + 3044: 50 e0 ldi r21, 0x00 ; 0 + 3046: 23 2f mov r18, r19 + 3048: 33 27 eor r19, r19 + 304a: 81 e0 ldi r24, 0x01 ; 1 + 304c: 42 17 cp r20, r18 + 304e: 53 07 cpc r21, r19 + 3050: b9 f3 breq .-18 ; 0x3040 <__stack+0x41> + 3052: 80 e0 ldi r24, 0x00 ; 0 + 3054: f5 cf rjmp .-22 ; 0x3040 <__stack+0x41> +} + +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + 3056: fc 01 movw r30, r24 + + while(ByteCount--) { + 3058: 43 e6 ldi r20, 0x63 ; 99 + 305a: 50 e0 ldi r21, 0x00 ; 0 + *DataPtr = (Checksum >> 8) & 0x00FF; +} + +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + 305c: 23 e6 ldi r18, 0x63 ; 99 + 305e: 33 e6 ldi r19, 0x63 ; 99 + 3060: e9 cf rjmp .-46 ; 0x3034 <__stack+0x35> + +00003062 : /* Split Crypto1 state into even and odd bits to speed up the output filter network */ static uint8_t StateEven[LFSR_SIZE/2] = {0}; static uint8_t StateOdd[LFSR_SIZE/2] = {0}; /* Proceed LFSR by one clock cycle */ static void Crypto1LFSR(uint8_t In) { - 32f0: cf 92 push r12 - 32f2: df 92 push r13 - 32f4: ef 92 push r14 - 32f6: ff 92 push r15 - 32f8: 0f 93 push r16 - 32fa: 1f 93 push r17 + 3062: cf 93 push r28 uint8_t Feedback = 0; /* Calculate feedback according to LFSR taps. XOR all 6 state bytes * into a single bit. */ Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); - 32fc: 00 91 e5 20 lds r16, 0x20E5 + 3064: b0 91 d5 20 lds r27, 0x20D5 Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 3300: 40 91 e6 20 lds r20, 0x20E6 + 3068: c0 91 d6 20 lds r28, 0x20D6 Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 3304: 30 91 e7 20 lds r19, 0x20E7 + 306c: 40 91 d7 20 lds r20, 0x20D7 Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 3308: a0 91 e2 20 lds r26, 0x20E2 + 3070: a0 91 d2 20 lds r26, 0x20D2 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 330c: f0 91 e3 20 lds r31, 0x20E3 + 3074: f0 91 d3 20 lds r31, 0x20D3 Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 3310: e0 91 e4 20 lds r30, 0x20E4 + 3078: e0 91 d4 20 lds r30, 0x20D4 uint8_t Feedback = 0; /* Calculate feedback according to LFSR taps. XOR all 6 state bytes * into a single bit. */ Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 3314: 94 2f mov r25, r20 - 3316: 90 71 andi r25, 0x10 ; 16 + 307c: 9c 2f mov r25, r28 + 307e: 90 71 andi r25, 0x10 ; 16 static void Crypto1LFSR(uint8_t In) { uint8_t Feedback = 0; /* Calculate feedback according to LFSR taps. XOR all 6 state bytes * into a single bit. */ Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); - 3318: 20 2f mov r18, r16 - 331a: 21 7e andi r18, 0xE1 ; 225 + 3080: 2b 2f mov r18, r27 + 3082: 21 7e andi r18, 0xE1 ; 225 Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 331c: 92 27 eor r25, r18 + 3084: 92 27 eor r25, r18 Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 331e: 23 2f mov r18, r19 - 3320: 20 72 andi r18, 0x20 ; 32 - 3322: 92 27 eor r25, r18 + 3086: 24 2f mov r18, r20 + 3088: 20 72 andi r18, 0x20 ; 32 + 308a: 92 27 eor r25, r18 Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 3324: 2a 2f mov r18, r26 - 3326: 24 79 andi r18, 0x94 ; 148 - 3328: 92 27 eor r25, r18 + 308c: 2a 2f mov r18, r26 + 308e: 24 79 andi r18, 0x94 ; 148 + 3090: 92 27 eor r25, r18 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 332a: 2f 2f mov r18, r31 - 332c: 23 77 andi r18, 0x73 ; 115 - 332e: 92 27 eor r25, r18 + 3092: 2f 2f mov r18, r31 + 3094: 23 77 andi r18, 0x73 ; 115 + 3096: 92 27 eor r25, r18 Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 3330: 2e 2f mov r18, r30 - 3332: 2a 73 andi r18, 0x3A ; 58 - 3334: 92 27 eor r25, r18 + 3098: 2e 2f mov r18, r30 + 309a: 2a 73 andi r18, 0x3A ; 58 + 309c: 92 27 eor r25, r18 Feedback ^= Feedback >> 4; - 3336: 29 2f mov r18, r25 - 3338: 22 95 swap r18 - 333a: 2f 70 andi r18, 0x0F ; 15 - 333c: 29 27 eor r18, r25 + 309e: 39 2f mov r19, r25 + 30a0: 32 95 swap r19 + 30a2: 3f 70 andi r19, 0x0F ; 15 + 30a4: 39 27 eor r19, r25 Feedback ^= Feedback >> 2; - 333e: 92 2f mov r25, r18 - 3340: 96 95 lsr r25 - 3342: 96 95 lsr r25 - 3344: 92 27 eor r25, r18 + 30a6: 23 2f mov r18, r19 + 30a8: 26 95 lsr r18 + 30aa: 26 95 lsr r18 + 30ac: 23 27 eor r18, r19 Feedback ^= Feedback >> 1; - 3346: b9 2f mov r27, r25 - 3348: b6 95 lsr r27 - * - the new even state becomes the old odd state + 30ae: 92 2f mov r25, r18 + 30b0: 96 95 lsr r25 * - the new odd state becomes the old even state right-shifted by 1. * For shifting the even state, we convert it into a 32 bit int first */ uint32_t Temp = 0; Temp |= ((uint32_t) StateEven[0] << 0); Temp |= ((uint32_t) StateEven[1] << 8); - 334a: 50 e0 ldi r21, 0x00 ; 0 - 334c: 60 e0 ldi r22, 0x00 ; 0 - 334e: 70 e0 ldi r23, 0x00 ; 0 - 3350: 76 2f mov r23, r22 - 3352: 65 2f mov r22, r21 - 3354: 54 2f mov r21, r20 - 3356: 44 27 eor r20, r20 - Temp |= ((uint32_t) StateEven[2] << 16); - 3358: c3 2e mov r12, r19 - 335a: dd 24 eor r13, r13 - 335c: ee 24 eor r14, r14 - 335e: ff 24 eor r15, r15 - 3360: 76 01 movw r14, r12 - 3362: dd 24 eor r13, r13 - 3364: cc 24 eor r12, r12 - * - the new even state becomes the old odd state - * - the new odd state becomes the old even state right-shifted by 1. - * For shifting the even state, we convert it into a 32 bit int first */ - uint32_t Temp = 0; - Temp |= ((uint32_t) StateEven[0] << 0); - Temp |= ((uint32_t) StateEven[1] << 8); - 3366: 4c 29 or r20, r12 - 3368: 5d 29 or r21, r13 - 336a: 6e 29 or r22, r14 - 336c: 7f 29 or r23, r15 - * see that after one LFSR clock cycle - * - the new even state becomes the old odd state - * - the new odd state becomes the old even state right-shifted by 1. - * For shifting the even state, we convert it into a 32 bit int first */ - uint32_t Temp = 0; - Temp |= ((uint32_t) StateEven[0] << 0); - 336e: 10 e0 ldi r17, 0x00 ; 0 - 3370: 20 e0 ldi r18, 0x00 ; 0 - 3372: 30 e0 ldi r19, 0x00 ; 0 - Temp |= ((uint32_t) StateEven[1] << 8); Temp |= ((uint32_t) StateEven[2] << 16); - 3374: 40 2b or r20, r16 - 3376: 51 2b or r21, r17 - 3378: 62 2b or r22, r18 - 337a: 73 2b or r23, r19 + 30b2: 50 e0 ldi r21, 0x00 ; 0 + 30b4: 60 e0 ldi r22, 0x00 ; 0 + 30b6: 70 e0 ldi r23, 0x00 ; 0 + 30b8: ba 01 movw r22, r20 + 30ba: 55 27 eor r21, r21 + 30bc: 44 27 eor r20, r20 + * - the new even state becomes the old odd state + * - the new odd state becomes the old even state right-shifted by 1. + * For shifting the even state, we convert it into a 32 bit int first */ + uint32_t Temp = 0; + Temp |= ((uint32_t) StateEven[0] << 0); + Temp |= ((uint32_t) StateEven[1] << 8); + 30be: 5c 2b or r21, r28 + Temp |= ((uint32_t) StateEven[2] << 16); + 30c0: 4b 2b or r20, r27 /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ Temp = (Temp >> 1) & 0x00FFFFFF; - 337c: 76 95 lsr r23 - 337e: 67 95 ror r22 - 3380: 57 95 ror r21 - 3382: 47 95 ror r20 + 30c2: 76 95 lsr r23 + 30c4: 67 95 ror r22 + 30c6: 57 95 ror r21 + 30c8: 47 95 ror r20 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); Feedback ^= Feedback >> 4; Feedback ^= Feedback >> 2; Feedback ^= Feedback >> 1; - 3384: b9 27 eor r27, r25 + 30ca: 92 27 eor r25, r18 /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ Temp = (Temp >> 1) & 0x00FFFFFF; /* Calculate MSBit of even state as input bit to LFSR */ if ( (Feedback & 0x01) ^ In ) { - 3386: 2b 2f mov r18, r27 - 3388: 30 e0 ldi r19, 0x00 ; 0 - 338a: 21 70 andi r18, 0x01 ; 1 - 338c: 30 70 andi r19, 0x00 ; 0 - 338e: 90 e0 ldi r25, 0x00 ; 0 - 3390: 28 17 cp r18, r24 - 3392: 39 07 cpc r19, r25 - 3394: 09 f0 breq .+2 ; 0x3398 + 30cc: 91 70 andi r25, 0x01 ; 1 + 30ce: 98 13 cpse r25, r24 Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); - 3396: 60 68 ori r22, 0x80 ; 128 + 30d0: 60 68 ori r22, 0x80 ; 128 } /* Convert even state back into byte array and swap odd/even state * as explained above. */ StateEven[0] = StateOdd[0]; - 3398: a0 93 e5 20 sts 0x20E5, r26 + 30d2: a0 93 d5 20 sts 0x20D5, r26 StateEven[1] = StateOdd[1]; - 339c: f0 93 e6 20 sts 0x20E6, r31 + 30d6: f0 93 d6 20 sts 0x20D6, r31 StateEven[2] = StateOdd[2]; - 33a0: e0 93 e7 20 sts 0x20E7, r30 + 30da: e0 93 d7 20 sts 0x20D7, r30 StateOdd[0] = (uint8_t) (Temp >> 0); - 33a4: 40 93 e2 20 sts 0x20E2, r20 + 30de: 40 93 d2 20 sts 0x20D2, r20 StateOdd[1] = (uint8_t) (Temp >> 8); - 33a8: 50 93 e3 20 sts 0x20E3, r21 + 30e2: 50 93 d3 20 sts 0x20D3, r21 StateOdd[2] = (uint8_t) (Temp >> 16); - 33ac: 60 93 e4 20 sts 0x20E4, r22 + 30e6: 60 93 d4 20 sts 0x20D4, r22 } - 33b0: 1f 91 pop r17 - 33b2: 0f 91 pop r16 - 33b4: ff 90 pop r15 - 33b6: ef 90 pop r14 - 33b8: df 90 pop r13 - 33ba: cf 90 pop r12 - 33bc: 08 95 ret + 30ea: cf 91 pop r28 + 30ec: 08 95 ret -000033be : +000030ee : + +uint8_t Crypto1FilterOutput(void) { + 30ee: cf 93 push r28 + 30f0: df 93 push r29 * 5 bits that are used to lookup the output bit. */ uint8_t Sum = 0; Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; - 33be: 50 91 e3 20 lds r21, 0x20E3 + 30f2: c0 91 d3 20 lds r28, 0x20D3 Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 33c2: 40 91 e4 20 lds r20, 0x20E4 - 33c6: 24 2f mov r18, r20 - 33c8: 2f 70 andi r18, 0x0F ; 15 - 33ca: 8d e1 ldi r24, 0x1D ; 29 - 33cc: 90 e2 ldi r25, 0x20 ; 32 - 33ce: dc 01 movw r26, r24 - 33d0: a2 0f add r26, r18 - 33d2: b1 1d adc r27, r1 + 30f6: 90 91 d4 20 lds r25, 0x20D4 + 30fa: a9 2f mov r26, r25 + 30fc: af 70 andi r26, 0x0F ; 15 + 30fe: b0 e0 ldi r27, 0x00 ; 0 + 3100: a0 5e subi r26, 0xE0 ; 224 + 3102: bf 4d sbci r27, 0xDF ; 223 * 5 bits that are used to lookup the output bit. */ uint8_t Sum = 0; Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; - 33d4: 25 2f mov r18, r21 - 33d6: 2f 70 andi r18, 0x0F ; 15 - 33d8: fc 01 movw r30, r24 - 33da: e2 0f add r30, r18 - 33dc: f1 1d adc r31, r1 - 33de: d0 96 adiw r26, 0x30 ; 48 - 33e0: 2c 91 ld r18, X - 33e2: d0 97 sbiw r26, 0x30 ; 48 - 33e4: 30 89 ldd r19, Z+16 ; 0x10 - 33e6: 23 2b or r18, r19 + 3104: ec 2f mov r30, r28 + 3106: ef 70 andi r30, 0x0F ; 15 + 3108: f0 e0 ldi r31, 0x00 ; 0 + 310a: e0 5e subi r30, 0xE0 ; 224 + 310c: ff 4d sbci r31, 0xDF ; 223 + 310e: d0 96 adiw r26, 0x30 ; 48 + 3110: 8c 91 ld r24, X + 3112: 20 89 ldd r18, Z+16 ; 0x10 + 3114: 82 2b or r24, r18 * can simply be ORed together to produce the resulting * 5 bits that are used to lookup the output bit. */ uint8_t Sum = 0; Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; - 33e8: 30 91 e2 20 lds r19, 0x20E2 - 33ec: 32 95 swap r19 - 33ee: 3f 70 andi r19, 0x0F ; 15 - 33f0: fc 01 movw r30, r24 - 33f2: e3 0f add r30, r19 - 33f4: f1 1d adc r31, r1 + 3116: e0 91 d2 20 lds r30, 0x20D2 + 311a: e2 95 swap r30 + 311c: ef 70 andi r30, 0x0F ; 15 + 311e: f0 e0 ldi r31, 0x00 ; 0 + 3120: e0 5e subi r30, 0xE0 ; 224 + 3122: ff 4d sbci r31, 0xDF ; 223 Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - 33f6: 30 81 ld r19, Z - 33f8: 23 2b or r18, r19 - 33fa: 52 95 swap r21 - 33fc: 5f 70 andi r21, 0x0F ; 15 - 33fe: fc 01 movw r30, r24 - 3400: e5 0f add r30, r21 - 3402: f1 1d adc r31, r1 + 3124: 20 81 ld r18, Z + 3126: 82 2b or r24, r18 + 3128: c2 95 swap r28 + 312a: cf 70 andi r28, 0x0F ; 15 + 312c: d0 e0 ldi r29, 0x00 ; 0 + 312e: c0 5e subi r28, 0xE0 ; 224 + 3130: df 4d sbci r29, 0xDF ; 223 Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 3404: 30 a1 lds r19, 0x40 - 3406: 23 2b or r18, r19 + 3132: 28 a1 ldd r18, Y+32 ; 0x20 + 3134: 82 2b or r24, r18 Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; - 3408: 42 95 swap r20 - 340a: 4f 70 andi r20, 0x0F ; 15 - 340c: 84 0f add r24, r20 - 340e: 91 1d adc r25, r1 - 3410: 80 5c subi r24, 0xC0 ; 192 - 3412: 9f 4f sbci r25, 0xFF ; 255 - 3414: fc 01 movw r30, r24 - 3416: 80 81 ld r24, Z - 3418: 28 2b or r18, r24 + 3136: 92 95 swap r25 + 3138: 9f 70 andi r25, 0x0F ; 15 + 313a: a9 2f mov r26, r25 + 313c: b0 e0 ldi r27, 0x00 ; 0 + 313e: a0 5a subi r26, 0xA0 ; 160 + 3140: bf 4d sbci r27, 0xDF ; 223 + 3142: 9c 91 ld r25, X + 3144: 89 2b or r24, r25 return TableC[Sum]; - 341a: ed e6 ldi r30, 0x6D ; 109 - 341c: f0 e2 ldi r31, 0x20 ; 32 - 341e: e2 0f add r30, r18 - 3420: f1 1d adc r31, r1 + 3146: e8 2f mov r30, r24 + 3148: f0 e0 ldi r31, 0x00 ; 0 + 314a: e0 59 subi r30, 0x90 ; 144 + 314c: ff 4d sbci r31, 0xDF ; 223 } - 3422: 80 81 ld r24, Z - 3424: 08 95 ret + 314e: 80 81 ld r24, Z + 3150: df 91 pop r29 + 3152: cf 91 pop r28 + 3154: 08 95 ret -00003426 : +00003156 : void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) { - 3426: cf 92 push r12 - 3428: df 92 push r13 - 342a: ef 92 push r14 - 342c: ff 92 push r15 - 342e: 0f 93 push r16 - 3430: 1f 93 push r17 - 3432: cf 93 push r28 - 3434: df 93 push r29 - 3436: fc 01 movw r30, r24 - 3438: ea 01 movw r28, r20 + 3156: cf 92 push r12 + 3158: df 92 push r13 + 315a: ef 92 push r14 + 315c: ff 92 push r15 + 315e: 0f 93 push r16 + 3160: 1f 93 push r17 + 3162: cf 93 push r28 + 3164: df 93 push r29 + 3166: fc 01 movw r30, r24 + 3168: db 01 movw r26, r22 + 316a: ea 01 movw r28, r20 * The inner loop generates 8 even and 8 odd bits from 16 key bits and * the outer loop stores them. */ for (i=0; i<(LFSR_SIZE/2); i++) { uint8_t EvenByte = 0; uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 343a: 31 81 ldd r19, Z+1 ; 0x01 - 343c: 20 e0 ldi r18, 0x00 ; 0 - 343e: 80 81 ld r24, Z - 3440: 90 e0 ldi r25, 0x00 ; 0 - 3442: 82 2b or r24, r18 - 3444: 93 2b or r25, r19 - 3446: 80 fd sbrc r24, 0 - 3448: b2 c1 rjmp .+868 ; 0x37ae - 344a: 30 e0 ldi r19, 0x00 ; 0 - 344c: 81 fd sbrc r24, 1 - 344e: ad c1 rjmp .+858 ; 0x37aa - 3450: 20 e0 ldi r18, 0x00 ; 0 + 316c: 91 81 ldd r25, Z+1 ; 0x01 + 316e: 80 e0 ldi r24, 0x00 ; 0 + 3170: 20 81 ld r18, Z + 3172: 82 2b or r24, r18 + 3174: 80 fd sbrc r24, 0 + 3176: 8d c1 rjmp .+794 ; 0x3492 + 3178: 30 e0 ldi r19, 0x00 ; 0 + 317a: 81 fd sbrc r24, 1 + 317c: 88 c1 rjmp .+784 ; 0x348e + 317e: 20 e0 ldi r18, 0x00 ; 0 if (KeyWord & (1<<1)) { OddByte |= 0x80; } KeyWord >>= 2; - 3452: 96 95 lsr r25 - 3454: 87 95 ror r24 - 3456: 96 95 lsr r25 - 3458: 87 95 ror r24 + 3180: 96 95 lsr r25 + 3182: 87 95 ror r24 + 3184: 96 95 lsr r25 + 3186: 87 95 ror r24 for (j=0; j<8; j++) { EvenByte >>= 1; OddByte >>= 1; if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 345a: 43 2f mov r20, r19 - 345c: 40 68 ori r20, 0x80 ; 128 - 345e: 80 fd sbrc r24, 0 - 3460: 34 2f mov r19, r20 + 3188: 43 2f mov r20, r19 + 318a: 40 68 ori r20, 0x80 ; 128 + 318c: 80 fd sbrc r24, 0 + 318e: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3462: 42 2f mov r20, r18 - 3464: 40 68 ori r20, 0x80 ; 128 - 3466: 81 fd sbrc r24, 1 - 3468: 24 2f mov r18, r20 + 3190: 42 2f mov r20, r18 + 3192: 40 68 ori r20, 0x80 ; 128 + 3194: 81 fd sbrc r24, 1 + 3196: 24 2f mov r18, r20 } KeyWord >>= 2; - 346a: 96 95 lsr r25 - 346c: 87 95 ror r24 - 346e: 96 95 lsr r25 - 3470: 87 95 ror r24 + 3198: 96 95 lsr r25 + 319a: 87 95 ror r24 + 319c: 96 95 lsr r25 + 319e: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 3472: 36 95 lsr r19 + 31a0: 36 95 lsr r19 OddByte >>= 1; - 3474: 26 95 lsr r18 + 31a2: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3476: 43 2f mov r20, r19 - 3478: 40 68 ori r20, 0x80 ; 128 - 347a: 80 fd sbrc r24, 0 - 347c: 34 2f mov r19, r20 + 31a4: 43 2f mov r20, r19 + 31a6: 40 68 ori r20, 0x80 ; 128 + 31a8: 80 fd sbrc r24, 0 + 31aa: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 347e: 42 2f mov r20, r18 - 3480: 40 68 ori r20, 0x80 ; 128 - 3482: 81 fd sbrc r24, 1 - 3484: 24 2f mov r18, r20 + 31ac: 42 2f mov r20, r18 + 31ae: 40 68 ori r20, 0x80 ; 128 + 31b0: 81 fd sbrc r24, 1 + 31b2: 24 2f mov r18, r20 } KeyWord >>= 2; - 3486: 96 95 lsr r25 - 3488: 87 95 ror r24 - 348a: 96 95 lsr r25 - 348c: 87 95 ror r24 + 31b4: 96 95 lsr r25 + 31b6: 87 95 ror r24 + 31b8: 96 95 lsr r25 + 31ba: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 348e: 36 95 lsr r19 + 31bc: 36 95 lsr r19 OddByte >>= 1; - 3490: 26 95 lsr r18 + 31be: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3492: 43 2f mov r20, r19 - 3494: 40 68 ori r20, 0x80 ; 128 - 3496: 80 fd sbrc r24, 0 - 3498: 34 2f mov r19, r20 + 31c0: 43 2f mov r20, r19 + 31c2: 40 68 ori r20, 0x80 ; 128 + 31c4: 80 fd sbrc r24, 0 + 31c6: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 349a: 42 2f mov r20, r18 - 349c: 40 68 ori r20, 0x80 ; 128 - 349e: 81 fd sbrc r24, 1 - 34a0: 24 2f mov r18, r20 + 31c8: 42 2f mov r20, r18 + 31ca: 40 68 ori r20, 0x80 ; 128 + 31cc: 81 fd sbrc r24, 1 + 31ce: 24 2f mov r18, r20 } KeyWord >>= 2; - 34a2: 96 95 lsr r25 - 34a4: 87 95 ror r24 - 34a6: 96 95 lsr r25 - 34a8: 87 95 ror r24 + 31d0: 96 95 lsr r25 + 31d2: 87 95 ror r24 + 31d4: 96 95 lsr r25 + 31d6: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 34aa: 36 95 lsr r19 + 31d8: 36 95 lsr r19 OddByte >>= 1; - 34ac: 26 95 lsr r18 + 31da: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 34ae: 43 2f mov r20, r19 - 34b0: 40 68 ori r20, 0x80 ; 128 - 34b2: 80 fd sbrc r24, 0 - 34b4: 34 2f mov r19, r20 + 31dc: 43 2f mov r20, r19 + 31de: 40 68 ori r20, 0x80 ; 128 + 31e0: 80 fd sbrc r24, 0 + 31e2: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 34b6: 42 2f mov r20, r18 - 34b8: 40 68 ori r20, 0x80 ; 128 - 34ba: 81 fd sbrc r24, 1 - 34bc: 24 2f mov r18, r20 + 31e4: 42 2f mov r20, r18 + 31e6: 40 68 ori r20, 0x80 ; 128 + 31e8: 81 fd sbrc r24, 1 + 31ea: 24 2f mov r18, r20 } KeyWord >>= 2; - 34be: 96 95 lsr r25 - 34c0: 87 95 ror r24 - 34c2: 96 95 lsr r25 - 34c4: 87 95 ror r24 + 31ec: 96 95 lsr r25 + 31ee: 87 95 ror r24 + 31f0: 96 95 lsr r25 + 31f2: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 34c6: 36 95 lsr r19 + 31f4: 36 95 lsr r19 OddByte >>= 1; - 34c8: 26 95 lsr r18 + 31f6: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 34ca: 43 2f mov r20, r19 - 34cc: 40 68 ori r20, 0x80 ; 128 - 34ce: 80 fd sbrc r24, 0 - 34d0: 34 2f mov r19, r20 + 31f8: 43 2f mov r20, r19 + 31fa: 40 68 ori r20, 0x80 ; 128 + 31fc: 80 fd sbrc r24, 0 + 31fe: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 34d2: 42 2f mov r20, r18 - 34d4: 40 68 ori r20, 0x80 ; 128 - 34d6: 81 fd sbrc r24, 1 - 34d8: 24 2f mov r18, r20 + 3200: 42 2f mov r20, r18 + 3202: 40 68 ori r20, 0x80 ; 128 + 3204: 81 fd sbrc r24, 1 + 3206: 24 2f mov r18, r20 } KeyWord >>= 2; - 34da: 96 95 lsr r25 - 34dc: 87 95 ror r24 - 34de: 96 95 lsr r25 - 34e0: 87 95 ror r24 + 3208: 96 95 lsr r25 + 320a: 87 95 ror r24 + 320c: 96 95 lsr r25 + 320e: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 34e2: 36 95 lsr r19 + 3210: 36 95 lsr r19 OddByte >>= 1; - 34e4: 26 95 lsr r18 + 3212: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 34e6: 43 2f mov r20, r19 - 34e8: 40 68 ori r20, 0x80 ; 128 - 34ea: 80 fd sbrc r24, 0 - 34ec: 34 2f mov r19, r20 + 3214: 43 2f mov r20, r19 + 3216: 40 68 ori r20, 0x80 ; 128 + 3218: 80 fd sbrc r24, 0 + 321a: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 34ee: 42 2f mov r20, r18 - 34f0: 40 68 ori r20, 0x80 ; 128 - 34f2: 81 fd sbrc r24, 1 - 34f4: 24 2f mov r18, r20 + 321c: 42 2f mov r20, r18 + 321e: 40 68 ori r20, 0x80 ; 128 + 3220: 81 fd sbrc r24, 1 + 3222: 24 2f mov r18, r20 } KeyWord >>= 2; - 34f6: 96 95 lsr r25 - 34f8: 87 95 ror r24 - 34fa: 96 95 lsr r25 - 34fc: 87 95 ror r24 + 3224: 96 95 lsr r25 + 3226: 87 95 ror r24 + 3228: 96 95 lsr r25 + 322a: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 34fe: 36 95 lsr r19 + 322c: 36 95 lsr r19 OddByte >>= 1; - 3500: 26 95 lsr r18 + 322e: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3502: 53 2f mov r21, r19 - 3504: 50 68 ori r21, 0x80 ; 128 + 3230: 53 2f mov r21, r19 + 3232: 50 68 ori r21, 0x80 ; 128 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3506: 42 2f mov r20, r18 - 3508: 40 68 ori r20, 0x80 ; 128 + 3234: 42 2f mov r20, r18 + 3236: 40 68 ori r20, 0x80 ; 128 } KeyWord >>= 2; } StateEven[i] = EvenByte; - 350a: 80 fd sbrc r24, 0 - 350c: 35 2f mov r19, r21 - 350e: 30 93 e5 20 sts 0x20E5, r19 + 3238: 80 fd sbrc r24, 0 + 323a: 35 2f mov r19, r21 + 323c: 30 93 d5 20 sts 0x20D5, r19 StateOdd[i] = OddByte; - 3512: 81 fd sbrc r24, 1 - 3514: 24 2f mov r18, r20 - 3516: 20 93 e2 20 sts 0x20E2, r18 + 3240: 81 fd sbrc r24, 1 + 3242: 24 2f mov r18, r20 + 3244: 20 93 d2 20 sts 0x20D2, r18 * The inner loop generates 8 even and 8 odd bits from 16 key bits and * the outer loop stores them. */ for (i=0; i<(LFSR_SIZE/2); i++) { uint8_t EvenByte = 0; uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 351a: 33 81 ldd r19, Z+3 ; 0x03 - 351c: 20 e0 ldi r18, 0x00 ; 0 - 351e: 82 81 ldd r24, Z+2 ; 0x02 - 3520: 90 e0 ldi r25, 0x00 ; 0 - 3522: 82 2b or r24, r18 - 3524: 93 2b or r25, r19 - 3526: 80 fd sbrc r24, 0 - 3528: 3e c1 rjmp .+636 ; 0x37a6 - 352a: 30 e0 ldi r19, 0x00 ; 0 - 352c: 81 fd sbrc r24, 1 - 352e: 39 c1 rjmp .+626 ; 0x37a2 - 3530: 20 e0 ldi r18, 0x00 ; 0 + 3248: 93 81 ldd r25, Z+3 ; 0x03 + 324a: 80 e0 ldi r24, 0x00 ; 0 + 324c: 22 81 ldd r18, Z+2 ; 0x02 + 324e: 82 2b or r24, r18 + 3250: 80 fd sbrc r24, 0 + 3252: 1b c1 rjmp .+566 ; 0x348a + 3254: 30 e0 ldi r19, 0x00 ; 0 + 3256: 81 fd sbrc r24, 1 + 3258: 16 c1 rjmp .+556 ; 0x3486 + 325a: 20 e0 ldi r18, 0x00 ; 0 if (KeyWord & (1<<1)) { OddByte |= 0x80; } KeyWord >>= 2; - 3532: 96 95 lsr r25 - 3534: 87 95 ror r24 - 3536: 96 95 lsr r25 - 3538: 87 95 ror r24 + 325c: 96 95 lsr r25 + 325e: 87 95 ror r24 + 3260: 96 95 lsr r25 + 3262: 87 95 ror r24 for (j=0; j<8; j++) { EvenByte >>= 1; OddByte >>= 1; if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 353a: 43 2f mov r20, r19 - 353c: 40 68 ori r20, 0x80 ; 128 - 353e: 80 fd sbrc r24, 0 - 3540: 34 2f mov r19, r20 + 3264: 43 2f mov r20, r19 + 3266: 40 68 ori r20, 0x80 ; 128 + 3268: 80 fd sbrc r24, 0 + 326a: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3542: 42 2f mov r20, r18 - 3544: 40 68 ori r20, 0x80 ; 128 - 3546: 81 fd sbrc r24, 1 - 3548: 24 2f mov r18, r20 + 326c: 42 2f mov r20, r18 + 326e: 40 68 ori r20, 0x80 ; 128 + 3270: 81 fd sbrc r24, 1 + 3272: 24 2f mov r18, r20 } KeyWord >>= 2; - 354a: 96 95 lsr r25 - 354c: 87 95 ror r24 - 354e: 96 95 lsr r25 - 3550: 87 95 ror r24 + 3274: 96 95 lsr r25 + 3276: 87 95 ror r24 + 3278: 96 95 lsr r25 + 327a: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 3552: 36 95 lsr r19 + 327c: 36 95 lsr r19 OddByte >>= 1; - 3554: 26 95 lsr r18 + 327e: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3556: 43 2f mov r20, r19 - 3558: 40 68 ori r20, 0x80 ; 128 - 355a: 80 fd sbrc r24, 0 - 355c: 34 2f mov r19, r20 + 3280: 43 2f mov r20, r19 + 3282: 40 68 ori r20, 0x80 ; 128 + 3284: 80 fd sbrc r24, 0 + 3286: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 355e: 42 2f mov r20, r18 - 3560: 40 68 ori r20, 0x80 ; 128 - 3562: 81 fd sbrc r24, 1 - 3564: 24 2f mov r18, r20 + 3288: 42 2f mov r20, r18 + 328a: 40 68 ori r20, 0x80 ; 128 + 328c: 81 fd sbrc r24, 1 + 328e: 24 2f mov r18, r20 } KeyWord >>= 2; - 3566: 96 95 lsr r25 - 3568: 87 95 ror r24 - 356a: 96 95 lsr r25 - 356c: 87 95 ror r24 + 3290: 96 95 lsr r25 + 3292: 87 95 ror r24 + 3294: 96 95 lsr r25 + 3296: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 356e: 36 95 lsr r19 + 3298: 36 95 lsr r19 OddByte >>= 1; - 3570: 26 95 lsr r18 + 329a: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3572: 43 2f mov r20, r19 - 3574: 40 68 ori r20, 0x80 ; 128 - 3576: 80 fd sbrc r24, 0 - 3578: 34 2f mov r19, r20 + 329c: 43 2f mov r20, r19 + 329e: 40 68 ori r20, 0x80 ; 128 + 32a0: 80 fd sbrc r24, 0 + 32a2: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 357a: 42 2f mov r20, r18 - 357c: 40 68 ori r20, 0x80 ; 128 - 357e: 81 fd sbrc r24, 1 - 3580: 24 2f mov r18, r20 + 32a4: 42 2f mov r20, r18 + 32a6: 40 68 ori r20, 0x80 ; 128 + 32a8: 81 fd sbrc r24, 1 + 32aa: 24 2f mov r18, r20 } KeyWord >>= 2; - 3582: 96 95 lsr r25 - 3584: 87 95 ror r24 - 3586: 96 95 lsr r25 - 3588: 87 95 ror r24 + 32ac: 96 95 lsr r25 + 32ae: 87 95 ror r24 + 32b0: 96 95 lsr r25 + 32b2: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 358a: 36 95 lsr r19 + 32b4: 36 95 lsr r19 OddByte >>= 1; - 358c: 26 95 lsr r18 + 32b6: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 358e: 43 2f mov r20, r19 - 3590: 40 68 ori r20, 0x80 ; 128 - 3592: 80 fd sbrc r24, 0 - 3594: 34 2f mov r19, r20 + 32b8: 43 2f mov r20, r19 + 32ba: 40 68 ori r20, 0x80 ; 128 + 32bc: 80 fd sbrc r24, 0 + 32be: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3596: 42 2f mov r20, r18 - 3598: 40 68 ori r20, 0x80 ; 128 - 359a: 81 fd sbrc r24, 1 - 359c: 24 2f mov r18, r20 + 32c0: 42 2f mov r20, r18 + 32c2: 40 68 ori r20, 0x80 ; 128 + 32c4: 81 fd sbrc r24, 1 + 32c6: 24 2f mov r18, r20 } KeyWord >>= 2; - 359e: 96 95 lsr r25 - 35a0: 87 95 ror r24 - 35a2: 96 95 lsr r25 - 35a4: 87 95 ror r24 + 32c8: 96 95 lsr r25 + 32ca: 87 95 ror r24 + 32cc: 96 95 lsr r25 + 32ce: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 35a6: 36 95 lsr r19 + 32d0: 36 95 lsr r19 OddByte >>= 1; - 35a8: 26 95 lsr r18 + 32d2: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 35aa: 43 2f mov r20, r19 - 35ac: 40 68 ori r20, 0x80 ; 128 - 35ae: 80 fd sbrc r24, 0 - 35b0: 34 2f mov r19, r20 + 32d4: 43 2f mov r20, r19 + 32d6: 40 68 ori r20, 0x80 ; 128 + 32d8: 80 fd sbrc r24, 0 + 32da: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 35b2: 42 2f mov r20, r18 - 35b4: 40 68 ori r20, 0x80 ; 128 - 35b6: 81 fd sbrc r24, 1 - 35b8: 24 2f mov r18, r20 + 32dc: 42 2f mov r20, r18 + 32de: 40 68 ori r20, 0x80 ; 128 + 32e0: 81 fd sbrc r24, 1 + 32e2: 24 2f mov r18, r20 } KeyWord >>= 2; - 35ba: 96 95 lsr r25 - 35bc: 87 95 ror r24 - 35be: 96 95 lsr r25 - 35c0: 87 95 ror r24 + 32e4: 96 95 lsr r25 + 32e6: 87 95 ror r24 + 32e8: 96 95 lsr r25 + 32ea: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 35c2: 36 95 lsr r19 + 32ec: 36 95 lsr r19 OddByte >>= 1; - 35c4: 26 95 lsr r18 + 32ee: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 35c6: 43 2f mov r20, r19 - 35c8: 40 68 ori r20, 0x80 ; 128 - 35ca: 80 fd sbrc r24, 0 - 35cc: 34 2f mov r19, r20 + 32f0: 43 2f mov r20, r19 + 32f2: 40 68 ori r20, 0x80 ; 128 + 32f4: 80 fd sbrc r24, 0 + 32f6: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 35ce: 42 2f mov r20, r18 - 35d0: 40 68 ori r20, 0x80 ; 128 - 35d2: 81 fd sbrc r24, 1 - 35d4: 24 2f mov r18, r20 + 32f8: 42 2f mov r20, r18 + 32fa: 40 68 ori r20, 0x80 ; 128 + 32fc: 81 fd sbrc r24, 1 + 32fe: 24 2f mov r18, r20 } KeyWord >>= 2; - 35d6: 96 95 lsr r25 - 35d8: 87 95 ror r24 - 35da: 96 95 lsr r25 - 35dc: 87 95 ror r24 + 3300: 96 95 lsr r25 + 3302: 87 95 ror r24 + 3304: 96 95 lsr r25 + 3306: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 35de: 36 95 lsr r19 + 3308: 36 95 lsr r19 OddByte >>= 1; - 35e0: 26 95 lsr r18 + 330a: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 35e2: 53 2f mov r21, r19 - 35e4: 50 68 ori r21, 0x80 ; 128 + 330c: 53 2f mov r21, r19 + 330e: 50 68 ori r21, 0x80 ; 128 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 35e6: 42 2f mov r20, r18 - 35e8: 40 68 ori r20, 0x80 ; 128 + 3310: 42 2f mov r20, r18 + 3312: 40 68 ori r20, 0x80 ; 128 } KeyWord >>= 2; } StateEven[i] = EvenByte; - 35ea: 80 fd sbrc r24, 0 - 35ec: 35 2f mov r19, r21 - 35ee: 30 93 e6 20 sts 0x20E6, r19 + 3314: 80 fd sbrc r24, 0 + 3316: 35 2f mov r19, r21 + 3318: 30 93 d6 20 sts 0x20D6, r19 StateOdd[i] = OddByte; - 35f2: 81 fd sbrc r24, 1 - 35f4: 24 2f mov r18, r20 - 35f6: 20 93 e3 20 sts 0x20E3, r18 + 331c: 81 fd sbrc r24, 1 + 331e: 24 2f mov r18, r20 + 3320: 20 93 d3 20 sts 0x20D3, r18 * The inner loop generates 8 even and 8 odd bits from 16 key bits and * the outer loop stores them. */ for (i=0; i<(LFSR_SIZE/2); i++) { uint8_t EvenByte = 0; uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 35fa: 95 81 ldd r25, Z+5 ; 0x05 - 35fc: 80 e0 ldi r24, 0x00 ; 0 - 35fe: 24 81 ldd r18, Z+4 ; 0x04 - 3600: 30 e0 ldi r19, 0x00 ; 0 - 3602: 28 2b or r18, r24 - 3604: 39 2b or r19, r25 - 3606: 20 fd sbrc r18, 0 - 3608: ca c0 rjmp .+404 ; 0x379e - 360a: 50 e0 ldi r21, 0x00 ; 0 - 360c: 21 fd sbrc r18, 1 - 360e: c5 c0 rjmp .+394 ; 0x379a - 3610: 40 e0 ldi r20, 0x00 ; 0 + 3324: 95 81 ldd r25, Z+5 ; 0x05 + 3326: 80 e0 ldi r24, 0x00 ; 0 + 3328: 24 81 ldd r18, Z+4 ; 0x04 + 332a: 82 2b or r24, r18 + 332c: 80 fd sbrc r24, 0 + 332e: a9 c0 rjmp .+338 ; 0x3482 + 3330: 30 e0 ldi r19, 0x00 ; 0 + 3332: 81 fd sbrc r24, 1 + 3334: a4 c0 rjmp .+328 ; 0x347e + 3336: 20 e0 ldi r18, 0x00 ; 0 if (KeyWord & (1<<1)) { OddByte |= 0x80; } KeyWord >>= 2; - 3612: c9 01 movw r24, r18 - 3614: 96 95 lsr r25 - 3616: 87 95 ror r24 - 3618: 96 95 lsr r25 - 361a: 87 95 ror r24 + 3338: 96 95 lsr r25 + 333a: 87 95 ror r24 + 333c: 96 95 lsr r25 + 333e: 87 95 ror r24 for (j=0; j<8; j++) { EvenByte >>= 1; OddByte >>= 1; if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 361c: 35 2f mov r19, r21 - 361e: 30 68 ori r19, 0x80 ; 128 - 3620: 80 ff sbrs r24, 0 - 3622: 35 2f mov r19, r21 + 3340: 43 2f mov r20, r19 + 3342: 40 68 ori r20, 0x80 ; 128 + 3344: 80 fd sbrc r24, 0 + 3346: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3624: 24 2f mov r18, r20 - 3626: 20 68 ori r18, 0x80 ; 128 - 3628: 81 ff sbrs r24, 1 - 362a: 24 2f mov r18, r20 + 3348: 42 2f mov r20, r18 + 334a: 40 68 ori r20, 0x80 ; 128 + 334c: 81 fd sbrc r24, 1 + 334e: 24 2f mov r18, r20 } KeyWord >>= 2; - 362c: 96 95 lsr r25 - 362e: 87 95 ror r24 - 3630: 96 95 lsr r25 - 3632: 87 95 ror r24 + 3350: 96 95 lsr r25 + 3352: 87 95 ror r24 + 3354: 96 95 lsr r25 + 3356: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 3634: 36 95 lsr r19 + 3358: 36 95 lsr r19 OddByte >>= 1; - 3636: 26 95 lsr r18 + 335a: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3638: 43 2f mov r20, r19 - 363a: 40 68 ori r20, 0x80 ; 128 - 363c: 80 fd sbrc r24, 0 - 363e: 34 2f mov r19, r20 + 335c: 43 2f mov r20, r19 + 335e: 40 68 ori r20, 0x80 ; 128 + 3360: 80 fd sbrc r24, 0 + 3362: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3640: 42 2f mov r20, r18 - 3642: 40 68 ori r20, 0x80 ; 128 - 3644: 81 fd sbrc r24, 1 - 3646: 24 2f mov r18, r20 + 3364: 42 2f mov r20, r18 + 3366: 40 68 ori r20, 0x80 ; 128 + 3368: 81 fd sbrc r24, 1 + 336a: 24 2f mov r18, r20 } KeyWord >>= 2; - 3648: 96 95 lsr r25 - 364a: 87 95 ror r24 - 364c: 96 95 lsr r25 - 364e: 87 95 ror r24 + 336c: 96 95 lsr r25 + 336e: 87 95 ror r24 + 3370: 96 95 lsr r25 + 3372: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 3650: 36 95 lsr r19 + 3374: 36 95 lsr r19 OddByte >>= 1; - 3652: 26 95 lsr r18 + 3376: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3654: 43 2f mov r20, r19 - 3656: 40 68 ori r20, 0x80 ; 128 - 3658: 80 fd sbrc r24, 0 - 365a: 34 2f mov r19, r20 + 3378: 43 2f mov r20, r19 + 337a: 40 68 ori r20, 0x80 ; 128 + 337c: 80 fd sbrc r24, 0 + 337e: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 365c: 42 2f mov r20, r18 - 365e: 40 68 ori r20, 0x80 ; 128 - 3660: 81 fd sbrc r24, 1 - 3662: 24 2f mov r18, r20 + 3380: 42 2f mov r20, r18 + 3382: 40 68 ori r20, 0x80 ; 128 + 3384: 81 fd sbrc r24, 1 + 3386: 24 2f mov r18, r20 } KeyWord >>= 2; - 3664: 96 95 lsr r25 - 3666: 87 95 ror r24 - 3668: 96 95 lsr r25 - 366a: 87 95 ror r24 + 3388: 96 95 lsr r25 + 338a: 87 95 ror r24 + 338c: 96 95 lsr r25 + 338e: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 366c: 36 95 lsr r19 + 3390: 36 95 lsr r19 OddByte >>= 1; - 366e: 26 95 lsr r18 + 3392: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3670: 43 2f mov r20, r19 - 3672: 40 68 ori r20, 0x80 ; 128 - 3674: 80 fd sbrc r24, 0 - 3676: 34 2f mov r19, r20 + 3394: 43 2f mov r20, r19 + 3396: 40 68 ori r20, 0x80 ; 128 + 3398: 80 fd sbrc r24, 0 + 339a: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3678: 42 2f mov r20, r18 - 367a: 40 68 ori r20, 0x80 ; 128 - 367c: 81 fd sbrc r24, 1 - 367e: 24 2f mov r18, r20 + 339c: 42 2f mov r20, r18 + 339e: 40 68 ori r20, 0x80 ; 128 + 33a0: 81 fd sbrc r24, 1 + 33a2: 24 2f mov r18, r20 } KeyWord >>= 2; - 3680: 96 95 lsr r25 - 3682: 87 95 ror r24 - 3684: 96 95 lsr r25 - 3686: 87 95 ror r24 + 33a4: 96 95 lsr r25 + 33a6: 87 95 ror r24 + 33a8: 96 95 lsr r25 + 33aa: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 3688: 36 95 lsr r19 + 33ac: 36 95 lsr r19 OddByte >>= 1; - 368a: 26 95 lsr r18 + 33ae: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 368c: 43 2f mov r20, r19 - 368e: 40 68 ori r20, 0x80 ; 128 - 3690: 80 fd sbrc r24, 0 - 3692: 34 2f mov r19, r20 + 33b0: 43 2f mov r20, r19 + 33b2: 40 68 ori r20, 0x80 ; 128 + 33b4: 80 fd sbrc r24, 0 + 33b6: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3694: 42 2f mov r20, r18 - 3696: 40 68 ori r20, 0x80 ; 128 - 3698: 81 fd sbrc r24, 1 - 369a: 24 2f mov r18, r20 + 33b8: 42 2f mov r20, r18 + 33ba: 40 68 ori r20, 0x80 ; 128 + 33bc: 81 fd sbrc r24, 1 + 33be: 24 2f mov r18, r20 } KeyWord >>= 2; - 369c: 96 95 lsr r25 - 369e: 87 95 ror r24 - 36a0: 96 95 lsr r25 - 36a2: 87 95 ror r24 + 33c0: 96 95 lsr r25 + 33c2: 87 95 ror r24 + 33c4: 96 95 lsr r25 + 33c6: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 36a4: 36 95 lsr r19 + 33c8: 36 95 lsr r19 OddByte >>= 1; - 36a6: 26 95 lsr r18 + 33ca: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 36a8: 43 2f mov r20, r19 - 36aa: 40 68 ori r20, 0x80 ; 128 - 36ac: 80 fd sbrc r24, 0 - 36ae: 34 2f mov r19, r20 + 33cc: 43 2f mov r20, r19 + 33ce: 40 68 ori r20, 0x80 ; 128 + 33d0: 80 fd sbrc r24, 0 + 33d2: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 36b0: 42 2f mov r20, r18 - 36b2: 40 68 ori r20, 0x80 ; 128 - 36b4: 81 fd sbrc r24, 1 - 36b6: 24 2f mov r18, r20 + 33d4: 42 2f mov r20, r18 + 33d6: 40 68 ori r20, 0x80 ; 128 + 33d8: 81 fd sbrc r24, 1 + 33da: 24 2f mov r18, r20 } KeyWord >>= 2; - 36b8: 96 95 lsr r25 - 36ba: 87 95 ror r24 - 36bc: 96 95 lsr r25 - 36be: 87 95 ror r24 + 33dc: 96 95 lsr r25 + 33de: 87 95 ror r24 + 33e0: 96 95 lsr r25 + 33e2: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 36c0: 36 95 lsr r19 + 33e4: 36 95 lsr r19 OddByte >>= 1; - 36c2: 26 95 lsr r18 + 33e6: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 36c4: 53 2f mov r21, r19 - 36c6: 50 68 ori r21, 0x80 ; 128 + 33e8: 53 2f mov r21, r19 + 33ea: 50 68 ori r21, 0x80 ; 128 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 36c8: 42 2f mov r20, r18 - 36ca: 40 68 ori r20, 0x80 ; 128 + 33ec: 42 2f mov r20, r18 + 33ee: 40 68 ori r20, 0x80 ; 128 } KeyWord >>= 2; } StateEven[i] = EvenByte; - 36cc: 80 fd sbrc r24, 0 - 36ce: 35 2f mov r19, r21 - 36d0: 30 93 e7 20 sts 0x20E7, r19 + 33f0: 80 fd sbrc r24, 0 + 33f2: 35 2f mov r19, r21 + 33f4: 30 93 d7 20 sts 0x20D7, r19 StateOdd[i] = OddByte; - 36d4: 81 fd sbrc r24, 1 - 36d6: 24 2f mov r18, r20 - 36d8: 20 93 e4 20 sts 0x20E4, r18 + 33f8: 81 fd sbrc r24, 1 + 33fa: 24 2f mov r18, r20 + 33fc: 20 93 d4 20 sts 0x20D4, r18 /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the * Crypto1 LFSR.*/ uint32_t Temp = 0; Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - 36dc: c9 80 ldd r12, Y+1 ; 0x01 - 36de: db 01 movw r26, r22 - 36e0: 11 96 adiw r26, 0x01 ; 1 - 36e2: 8c 91 ld r24, X - 36e4: 11 97 sbiw r26, 0x01 ; 1 - 36e6: c8 26 eor r12, r24 - 36e8: dd 24 eor r13, r13 - 36ea: ee 24 eor r14, r14 - 36ec: ff 24 eor r15, r15 - 36ee: fe 2c mov r15, r14 - 36f0: ed 2c mov r14, r13 - 36f2: dc 2c mov r13, r12 - 36f4: cc 24 eor r12, r12 + 3400: 89 81 ldd r24, Y+1 ; 0x01 + 3402: 11 96 adiw r26, 0x01 ; 1 + 3404: 9c 91 ld r25, X + 3406: 11 97 sbiw r26, 0x01 ; 1 + 3408: 89 27 eor r24, r25 Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 36f6: 8a 81 ldd r24, Y+2 ; 0x02 - 36f8: 12 96 adiw r26, 0x02 ; 2 - 36fa: 9c 91 ld r25, X - 36fc: 89 27 eor r24, r25 - 36fe: 90 e0 ldi r25, 0x00 ; 0 - 3700: a0 e0 ldi r26, 0x00 ; 0 - 3702: b0 e0 ldi r27, 0x00 ; 0 - 3704: dc 01 movw r26, r24 - 3706: 99 27 eor r25, r25 - 3708: 88 27 eor r24, r24 + 340a: ca 80 ldd r12, Y+2 ; 0x02 + 340c: 12 96 adiw r26, 0x02 ; 2 + 340e: 9c 91 ld r25, X + 3410: 12 97 sbiw r26, 0x02 ; 2 + 3412: c9 26 eor r12, r25 + 3414: d1 2c mov r13, r1 + 3416: e1 2c mov r14, r1 + 3418: f1 2c mov r15, r1 + 341a: 76 01 movw r14, r12 + 341c: dd 24 eor r13, r13 + 341e: cc 24 eor r12, r12 /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the * Crypto1 LFSR.*/ uint32_t Temp = 0; Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - 370a: c8 2a or r12, r24 - 370c: d9 2a or r13, r25 - 370e: ea 2a or r14, r26 - 3710: fb 2a or r15, r27 + 3420: d8 2a or r13, r24 /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the * Crypto1 LFSR.*/ uint32_t Temp = 0; Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; - 3712: 88 81 ld r24, Y - 3714: fb 01 movw r30, r22 - 3716: 90 81 ld r25, Z - 3718: 89 27 eor r24, r25 - 371a: 90 e0 ldi r25, 0x00 ; 0 - 371c: a0 e0 ldi r26, 0x00 ; 0 - 371e: b0 e0 ldi r27, 0x00 ; 0 + 3422: 88 81 ld r24, Y + 3424: 9c 91 ld r25, X + 3426: 89 27 eor r24, r25 Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 3720: c8 2a or r12, r24 - 3722: d9 2a or r13, r25 - 3724: ea 2a or r14, r26 - 3726: fb 2a or r15, r27 + 3428: c8 2a or r12, r24 Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; - 3728: 8b 81 ldd r24, Y+3 ; 0x03 - 372a: 93 81 ldd r25, Z+3 ; 0x03 - 372c: 89 27 eor r24, r25 - 372e: 90 e0 ldi r25, 0x00 ; 0 - 3730: a0 e0 ldi r26, 0x00 ; 0 - 3732: b0 e0 ldi r27, 0x00 ; 0 - 3734: b8 2f mov r27, r24 - 3736: aa 27 eor r26, r26 - 3738: 99 27 eor r25, r25 - 373a: 88 27 eor r24, r24 - 373c: c8 2a or r12, r24 - 373e: d9 2a or r13, r25 - 3740: ea 2a or r14, r26 - 3742: fb 2a or r15, r27 - 3744: 10 e2 ldi r17, 0x20 ; 32 + 342a: 8b 81 ldd r24, Y+3 ; 0x03 + 342c: 13 96 adiw r26, 0x03 ; 3 + 342e: 9c 91 ld r25, X + 3430: 89 27 eor r24, r25 + 3432: f8 2a or r15, r24 + 3434: 10 e2 ldi r17, 0x20 ; 32 for (i=0; i<32; i++) { uint8_t Out = Crypto1FilterOutput(); - 3746: 3b de rcall .-906 ; 0x33be - 3748: 08 2f mov r16, r24 - 374a: 8c 2d mov r24, r12 + 3436: 5b de rcall .-842 ; 0x30ee + 3438: 08 2f mov r16, r24 Crypto1LFSR(Temp & 0x01); - 374c: 81 70 andi r24, 0x01 ; 1 - 374e: d0 dd rcall .-1120 ; 0x32f0 - 3750: f6 94 lsr r15 - 3752: e7 94 ror r14 + 343a: 8c 2d mov r24, r12 + 343c: 81 70 andi r24, 0x01 ; 1 + 343e: 11 de rcall .-990 ; 0x3062 Temp >>= 1; - 3754: d7 94 ror r13 - 3756: c7 94 ror r12 - 3758: 00 23 and r16, r16 - 375a: 41 f0 breq .+16 ; 0x376c + 3440: f6 94 lsr r15 + 3442: e7 94 ror r14 + 3444: d7 94 ror r13 + 3446: c7 94 ror r12 /* Store the keystream for later use */ if (Out) { - 375c: 80 e0 ldi r24, 0x00 ; 0 - 375e: 90 e0 ldi r25, 0x00 ; 0 + 3448: 00 23 and r16, r16 + 344a: 11 f0 breq .+4 ; 0x3450 Temp |= (uint32_t) 1 << 31; - 3760: a0 e0 ldi r26, 0x00 ; 0 - 3762: b0 e8 ldi r27, 0x80 ; 128 - 3764: c8 2a or r12, r24 - 3766: d9 2a or r13, r25 - 3768: ea 2a or r14, r26 - 376a: fb 2a or r15, r27 - 376c: 11 50 subi r17, 0x01 ; 1 - 376e: 59 f7 brne .-42 ; 0x3746 - 3770: 88 81 ld r24, Y + 344c: 68 94 set + 344e: f7 f8 bld r15, 7 + 3450: 11 50 subi r17, 0x01 ; 1 Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; for (i=0; i<32; i++) { - 3772: 8c 25 eor r24, r12 + 3452: 89 f7 brne .-30 ; 0x3436 } /* Crypto1 state register is now set up to be used for authentication. * In case of nested authentication, we need to use the produced keystream * to encrypt the CardNonce. For this case we do the encryption in-place. */ CardNonce[0] ^= (uint8_t) (Temp >> 0); - 3774: 88 83 st Y, r24 - 3776: 89 81 ldd r24, Y+1 ; 0x01 - 3778: 8d 25 eor r24, r13 + 3454: 88 81 ld r24, Y + 3456: 8c 25 eor r24, r12 + 3458: 88 83 st Y, r24 CardNonce[1] ^= (uint8_t) (Temp >> 8); - 377a: 89 83 std Y+1, r24 ; 0x01 - 377c: 8a 81 ldd r24, Y+2 ; 0x02 - 377e: 8e 25 eor r24, r14 + 345a: 89 81 ldd r24, Y+1 ; 0x01 + 345c: 8d 25 eor r24, r13 + 345e: 89 83 std Y+1, r24 ; 0x01 CardNonce[2] ^= (uint8_t) (Temp >> 16); - 3780: 8a 83 std Y+2, r24 ; 0x02 - 3782: 8b 81 ldd r24, Y+3 ; 0x03 - 3784: 8f 25 eor r24, r15 + 3460: 8a 81 ldd r24, Y+2 ; 0x02 + 3462: 8e 25 eor r24, r14 + 3464: 8a 83 std Y+2, r24 ; 0x02 CardNonce[3] ^= (uint8_t) (Temp >> 24); - 3786: 8b 83 std Y+3, r24 ; 0x03 - 3788: df 91 pop r29 - 378a: cf 91 pop r28 + 3466: 8b 81 ldd r24, Y+3 ; 0x03 + 3468: 8f 25 eor r24, r15 + 346a: 8b 83 std Y+3, r24 ; 0x03 } - 378c: 1f 91 pop r17 - 378e: 0f 91 pop r16 - 3790: ff 90 pop r15 - 3792: ef 90 pop r14 - 3794: df 90 pop r13 - 3796: cf 90 pop r12 - 3798: 08 95 ret - 379a: 40 e4 ldi r20, 0x40 ; 64 - 379c: 3a cf rjmp .-396 ; 0x3612 - * The inner loop generates 8 even and 8 odd bits from 16 key bits and - * the outer loop stores them. */ - for (i=0; i<(LFSR_SIZE/2); i++) { - uint8_t EvenByte = 0; - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 379e: 50 e4 ldi r21, 0x40 ; 64 - 37a0: 35 cf rjmp .-406 ; 0x360c - 37a2: 20 e4 ldi r18, 0x40 ; 64 - 37a4: c6 ce rjmp .-628 ; 0x3532 - 37a6: 30 e4 ldi r19, 0x40 ; 64 - 37a8: c1 ce rjmp .-638 ; 0x352c - 37aa: 20 e4 ldi r18, 0x40 ; 64 - 37ac: 52 ce rjmp .-860 ; 0x3452 - 37ae: 30 e4 ldi r19, 0x40 ; 64 - 37b0: 4d ce rjmp .-870 ; 0x344c + 346c: df 91 pop r29 + 346e: cf 91 pop r28 + 3470: 1f 91 pop r17 + 3472: 0f 91 pop r16 + 3474: ff 90 pop r15 + 3476: ef 90 pop r14 + 3478: df 90 pop r13 + 347a: cf 90 pop r12 + 347c: 08 95 ret + 347e: 20 e4 ldi r18, 0x40 ; 64 + 3480: 5b cf rjmp .-330 ; 0x3338 + 3482: 30 e4 ldi r19, 0x40 ; 64 + 3484: 56 cf rjmp .-340 ; 0x3332 + 3486: 20 e4 ldi r18, 0x40 ; 64 + 3488: e9 ce rjmp .-558 ; 0x325c + 348a: 30 e4 ldi r19, 0x40 ; 64 + 348c: e4 ce rjmp .-568 ; 0x3256 + 348e: 20 e4 ldi r18, 0x40 ; 64 + 3490: 77 ce rjmp .-786 ; 0x3180 + 3492: 30 e4 ldi r19, 0x40 ; 64 + 3494: 72 ce rjmp .-796 ; 0x317a -000037b2 : - 37b2: cf 92 push r12 - 37b4: df 92 push r13 - CardNonce[2] ^= (uint8_t) (Temp >> 16); - CardNonce[3] ^= (uint8_t) (Temp >> 24); -} +00003496 : void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) { - 37b6: ef 92 push r14 - 37b8: ff 92 push r15 - 37ba: cf 93 push r28 - 37bc: fc 01 movw r30, r24 + 3496: cf 92 push r12 + 3498: df 92 push r13 + 349a: ef 92 push r14 + 349c: ff 92 push r15 + 349e: cf 93 push r28 + 34a0: fc 01 movw r30, r24 uint32_t Temp = 0; /* For ease of processing, we convert the encrypted reader nonce * into a 32 bit integer */ Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; - 37be: c1 80 ldd r12, Z+1 ; 0x01 - 37c0: dd 24 eor r13, r13 - 37c2: ee 24 eor r14, r14 - 37c4: ff 24 eor r15, r15 - 37c6: fe 2c mov r15, r14 - 37c8: ed 2c mov r14, r13 - 37ca: dc 2c mov r13, r12 - 37cc: cc 24 eor r12, r12 + 34a2: 81 81 ldd r24, Z+1 ; 0x01 Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 37ce: 82 81 ldd r24, Z+2 ; 0x02 - 37d0: 90 e0 ldi r25, 0x00 ; 0 - 37d2: a0 e0 ldi r26, 0x00 ; 0 - 37d4: b0 e0 ldi r27, 0x00 ; 0 - 37d6: dc 01 movw r26, r24 - 37d8: 99 27 eor r25, r25 - 37da: 88 27 eor r24, r24 + 34a4: c2 80 ldd r12, Z+2 ; 0x02 + 34a6: d1 2c mov r13, r1 + 34a8: e1 2c mov r14, r1 + 34aa: f1 2c mov r15, r1 + 34ac: 76 01 movw r14, r12 + 34ae: dd 24 eor r13, r13 + 34b0: cc 24 eor r12, r12 uint32_t Temp = 0; /* For ease of processing, we convert the encrypted reader nonce * into a 32 bit integer */ Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; - 37dc: c8 2a or r12, r24 - 37de: d9 2a or r13, r25 - 37e0: ea 2a or r14, r26 - 37e2: fb 2a or r15, r27 + 34b2: d8 2a or r13, r24 { uint32_t Temp = 0; /* For ease of processing, we convert the encrypted reader nonce * into a 32 bit integer */ Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; - 37e4: 80 81 ld r24, Z - 37e6: 90 e0 ldi r25, 0x00 ; 0 - 37e8: a0 e0 ldi r26, 0x00 ; 0 - 37ea: b0 e0 ldi r27, 0x00 ; 0 + 34b4: 80 81 ld r24, Z Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 37ec: c8 2a or r12, r24 - 37ee: d9 2a or r13, r25 - 37f0: ea 2a or r14, r26 - 37f2: fb 2a or r15, r27 + 34b6: c8 2a or r12, r24 Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; - 37f4: 83 81 ldd r24, Z+3 ; 0x03 - 37f6: 90 e0 ldi r25, 0x00 ; 0 - 37f8: a0 e0 ldi r26, 0x00 ; 0 - 37fa: b0 e0 ldi r27, 0x00 ; 0 - 37fc: b8 2f mov r27, r24 - 37fe: aa 27 eor r26, r26 - 3800: 99 27 eor r25, r25 - 3802: 88 27 eor r24, r24 - 3804: c8 2a or r12, r24 - 3806: d9 2a or r13, r25 - 3808: ea 2a or r14, r26 - 380a: fb 2a or r15, r27 - 380c: c0 e2 ldi r28, 0x20 ; 32 + 34b8: 83 81 ldd r24, Z+3 ; 0x03 + 34ba: f8 2a or r15, r24 + 34bc: c0 e2 ldi r28, 0x20 ; 32 uint8_t i; for (i=0; i<32; i++) { /* Decrypt one output bit of the given encrypted nonce using the * filter output as keystream. */ uint8_t Out = Crypto1FilterOutput(); - 380e: d7 dd rcall .-1106 ; 0x33be - 3810: 9c 2d mov r25, r12 + 34be: 17 de rcall .-978 ; 0x30ee uint8_t Bit = Out ^ (Temp & 0x01); - 3812: 91 70 andi r25, 0x01 ; 1 - 3814: 89 27 eor r24, r25 + 34c0: b7 01 movw r22, r14 + 34c2: a6 01 movw r20, r12 + 34c4: 41 70 andi r20, 0x01 ; 1 + 34c6: 55 27 eor r21, r21 + 34c8: 66 27 eor r22, r22 + 34ca: 77 27 eor r23, r23 /* Feed back the bit to load the LFSR with the (decrypted) nonce */ Crypto1LFSR(Bit); - 3816: 6c dd rcall .-1320 ; 0x32f0 - 3818: f6 94 lsr r15 - 381a: e7 94 ror r14 + 34cc: 84 27 eor r24, r20 + 34ce: c9 dd rcall .-1134 ; 0x3062 Temp >>= 1; - 381c: d7 94 ror r13 - 381e: c7 94 ror r12 - 3820: c1 50 subi r28, 0x01 ; 1 - 3822: a9 f7 brne .-22 ; 0x380e - 3824: cf 91 pop r28 + 34d0: f6 94 lsr r15 + 34d2: e7 94 ror r14 + 34d4: d7 94 ror r13 + 34d6: c7 94 ror r12 + 34d8: c1 50 subi r28, 0x01 ; 1 Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; uint8_t i; for (i=0; i<32; i++) { - 3826: ff 90 pop r15 + 34da: 89 f7 brne .-30 ; 0x34be /* Feed back the bit to load the LFSR with the (decrypted) nonce */ Crypto1LFSR(Bit); Temp >>= 1; } } - 3828: ef 90 pop r14 - 382a: df 90 pop r13 - 382c: cf 90 pop r12 - 382e: 08 95 ret + 34dc: cf 91 pop r28 + 34de: ff 90 pop r15 + 34e0: ef 90 pop r14 + 34e2: df 90 pop r13 + 34e4: cf 90 pop r12 + 34e6: 08 95 ret -00003830 : - 3830: cf 93 push r28 - 3832: df 93 push r29 +000034e8 : + +uint8_t Crypto1Byte(void) +{ + 34e8: cf 93 push r28 + 34ea: df 93 push r29 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 3834: c4 dd rcall .-1144 ; 0x33be - 3836: c8 2f mov r28, r24 - 3838: 80 e0 ldi r24, 0x00 ; 0 + 34ec: 00 de rcall .-1024 ; 0x30ee + 34ee: c8 2f mov r28, r24 Crypto1LFSR(0); - 383a: 5a dd rcall .-1356 ; 0x32f0 - 383c: cc 23 and r28, r28 - 383e: 09 f4 brne .+2 ; 0x3842 + 34f0: 80 e0 ldi r24, 0x00 ; 0 + 34f2: b7 dd rcall .-1170 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; if (Out) { - 3840: 36 c0 rjmp .+108 ; 0x38ae - 3842: c0 e8 ldi r28, 0x80 ; 128 - 3844: bc dd rcall .-1160 ; 0x33be + 34f4: cc 23 and r28, r28 + 34f6: 09 f4 brne .+2 ; 0x34fa + 34f8: 36 c0 rjmp .+108 ; 0x3566 KeyStream |= (1<<7); - 3846: d8 2f mov r29, r24 + 34fa: c0 e8 ldi r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 3848: 80 e0 ldi r24, 0x00 ; 0 - 384a: 52 dd rcall .-1372 ; 0x32f0 - 384c: c6 95 lsr r28 + 34fc: f8 dd rcall .-1040 ; 0x30ee + 34fe: d8 2f mov r29, r24 Crypto1LFSR(0); - 384e: d1 11 cpse r29, r1 - 3850: c0 68 ori r28, 0x80 ; 128 - 3852: b5 dd rcall .-1174 ; 0x33be + 3500: 80 e0 ldi r24, 0x00 ; 0 + 3502: af dd rcall .-1186 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 3854: d8 2f mov r29, r24 + 3504: c6 95 lsr r28 if (Out) { - 3856: 80 e0 ldi r24, 0x00 ; 0 + 3506: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 3858: 4b dd rcall .-1386 ; 0x32f0 + 3508: c0 68 ori r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 385a: c6 95 lsr r28 - 385c: d1 11 cpse r29, r1 - 385e: c0 68 ori r28, 0x80 ; 128 + 350a: f1 dd rcall .-1054 ; 0x30ee + 350c: d8 2f mov r29, r24 Crypto1LFSR(0); - 3860: ae dd rcall .-1188 ; 0x33be - 3862: d8 2f mov r29, r24 - 3864: 80 e0 ldi r24, 0x00 ; 0 + 350e: 80 e0 ldi r24, 0x00 ; 0 + 3510: a8 dd rcall .-1200 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 3866: 44 dd rcall .-1400 ; 0x32f0 + 3512: c6 95 lsr r28 if (Out) { - 3868: c6 95 lsr r28 + 3514: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 386a: d1 11 cpse r29, r1 + 3516: c0 68 ori r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 386c: c0 68 ori r28, 0x80 ; 128 - 386e: a7 dd rcall .-1202 ; 0x33be - 3870: d8 2f mov r29, r24 + 3518: ea dd rcall .-1068 ; 0x30ee + 351a: d8 2f mov r29, r24 Crypto1LFSR(0); - 3872: 80 e0 ldi r24, 0x00 ; 0 - 3874: 3d dd rcall .-1414 ; 0x32f0 - 3876: c6 95 lsr r28 + 351c: 80 e0 ldi r24, 0x00 ; 0 + 351e: a1 dd rcall .-1214 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 3878: d1 11 cpse r29, r1 + 3520: c6 95 lsr r28 if (Out) { - 387a: c0 68 ori r28, 0x80 ; 128 + 3522: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 387c: a0 dd rcall .-1216 ; 0x33be + 3524: c0 68 ori r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 387e: d8 2f mov r29, r24 - 3880: 80 e0 ldi r24, 0x00 ; 0 - 3882: 36 dd rcall .-1428 ; 0x32f0 + 3526: e3 dd rcall .-1082 ; 0x30ee + 3528: d8 2f mov r29, r24 Crypto1LFSR(0); - 3884: c6 95 lsr r28 - 3886: d1 11 cpse r29, r1 - 3888: c0 68 ori r28, 0x80 ; 128 + 352a: 80 e0 ldi r24, 0x00 ; 0 + 352c: 9a dd rcall .-1228 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 388a: 99 dd rcall .-1230 ; 0x33be + 352e: c6 95 lsr r28 if (Out) { - 388c: d8 2f mov r29, r24 + 3530: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 388e: 80 e0 ldi r24, 0x00 ; 0 + 3532: c0 68 ori r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 3890: 2f dd rcall .-1442 ; 0x32f0 - 3892: c6 95 lsr r28 - 3894: d1 11 cpse r29, r1 + 3534: dc dd rcall .-1096 ; 0x30ee + 3536: d8 2f mov r29, r24 Crypto1LFSR(0); - 3896: c0 68 ori r28, 0x80 ; 128 - 3898: 92 dd rcall .-1244 ; 0x33be - 389a: d8 2f mov r29, r24 + 3538: 80 e0 ldi r24, 0x00 ; 0 + 353a: 93 dd rcall .-1242 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 389c: 80 e0 ldi r24, 0x00 ; 0 + 353c: c6 95 lsr r28 if (Out) { - 389e: 28 dd rcall .-1456 ; 0x32f0 + 353e: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 38a0: 8c 2f mov r24, r28 + 3540: c0 68 ori r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 38a2: 86 95 lsr r24 - 38a4: d1 11 cpse r29, r1 - 38a6: 80 68 ori r24, 0x80 ; 128 + 3542: d5 dd rcall .-1110 ; 0x30ee + 3544: d8 2f mov r29, r24 Crypto1LFSR(0); - 38a8: df 91 pop r29 - 38aa: cf 91 pop r28 - 38ac: 08 95 ret + 3546: 80 e0 ldi r24, 0x00 ; 0 + 3548: 8c dd rcall .-1256 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 38ae: c0 e0 ldi r28, 0x00 ; 0 + 354a: c6 95 lsr r28 if (Out) { - 38b0: c9 cf rjmp .-110 ; 0x3844 - -000038b2 : + 354c: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 38b2: cf 93 push r28 + 354e: c0 68 ori r28, 0x80 ; 128 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 38b4: df 93 push r29 - 38b6: 83 dd rcall .-1274 ; 0x33be - 38b8: c8 2f mov r28, r24 + 3550: ce dd rcall .-1124 ; 0x30ee + 3552: d8 2f mov r29, r24 Crypto1LFSR(0); - 38ba: 80 e0 ldi r24, 0x00 ; 0 - 38bc: 19 dd rcall .-1486 ; 0x32f0 - 38be: cc 23 and r28, r28 + 3554: 80 e0 ldi r24, 0x00 ; 0 + 3556: 85 dd rcall .-1270 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 38c0: d1 f0 breq .+52 ; 0x38f6 - 38c2: c8 e0 ldi r28, 0x08 ; 8 + 3558: 8c 2f mov r24, r28 + 355a: 86 95 lsr r24 if (Out) { - 38c4: 7c dd rcall .-1288 ; 0x33be + 355c: d1 11 cpse r29, r1 KeyStream |= (1<<7); - 38c6: d8 2f mov r29, r24 + 355e: 80 68 ori r24, 0x80 ; 128 } } return KeyStream; } - 38c8: 80 e0 ldi r24, 0x00 ; 0 - 38ca: 12 dd rcall .-1500 ; 0x32f0 - 38cc: c6 95 lsr r28 + 3560: df 91 pop r29 + 3562: cf 91 pop r28 + 3564: 08 95 ret * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); Crypto1LFSR(0); /* Store keystream bit */ KeyStream >>= 1; - 38ce: d1 11 cpse r29, r1 - 38d0: c8 60 ori r28, 0x08 ; 8 - for (i=0; i<4; i++) { + 3566: c0 e0 ldi r28, 0x00 ; 0 + 3568: c9 cf rjmp .-110 ; 0x34fc - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); - 38d2: 75 dd rcall .-1302 ; 0x33be +0000356a : - /* Store keystream bit */ - KeyStream >>= 1; - 38d4: d8 2f mov r29, r24 + return KeyStream; +} - if (Out) { - 38d6: 80 e0 ldi r24, 0x00 ; 0 - KeyStream |= (1<<3); - 38d8: 0b dd rcall .-1514 ; 0x32f0 +uint8_t Crypto1Nibble(void) +{ + 356a: cf 93 push r28 + 356c: df 93 push r29 /* Generate 4 keystream-bits */ for (i=0; i<4; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 38da: c6 95 lsr r28 - 38dc: d1 11 cpse r29, r1 - 38de: c8 60 ori r28, 0x08 ; 8 + 356e: bf dd rcall .-1154 ; 0x30ee + 3570: c8 2f mov r28, r24 Crypto1LFSR(0); - 38e0: 6e dd rcall .-1316 ; 0x33be - 38e2: d8 2f mov r29, r24 - 38e4: 80 e0 ldi r24, 0x00 ; 0 + 3572: 80 e0 ldi r24, 0x00 ; 0 + 3574: 76 dd rcall .-1300 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 38e6: 04 dd rcall .-1528 ; 0x32f0 if (Out) { - 38e8: 8c 2f mov r24, r28 + 3576: cc 23 and r28, r28 + 3578: d1 f0 breq .+52 ; 0x35ae KeyStream |= (1<<3); - 38ea: 86 95 lsr r24 + 357a: c8 e0 ldi r28, 0x08 ; 8 /* Generate 4 keystream-bits */ for (i=0; i<4; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 38ec: d1 11 cpse r29, r1 - 38ee: 88 60 ori r24, 0x08 ; 8 - 38f0: df 91 pop r29 + 357c: b8 dd rcall .-1168 ; 0x30ee + 357e: d8 2f mov r29, r24 Crypto1LFSR(0); - 38f2: cf 91 pop r28 - 38f4: 08 95 ret - 38f6: c0 e0 ldi r28, 0x00 ; 0 + 3580: 80 e0 ldi r24, 0x00 ; 0 + 3582: 6f dd rcall .-1314 ; 0x3062 /* Store keystream bit */ KeyStream >>= 1; - 38f8: e5 cf rjmp .-54 ; 0x38c4 - -000038fa : - 38fa: 8f 92 push r8 + 3584: c6 95 lsr r28 if (Out) { - 38fc: 9f 92 push r9 + 3586: d1 11 cpse r29, r1 KeyStream |= (1<<3); - 38fe: af 92 push r10 + 3588: c8 60 ori r28, 0x08 ; 8 + /* Generate 4 keystream-bits */ + for (i=0; i<4; i++) { + + /* Calculate output of function-network and cycle LFSR with no + * additional input, thus linearly! */ + uint8_t Out = Crypto1FilterOutput(); + 358a: b1 dd rcall .-1182 ; 0x30ee + 358c: d8 2f mov r29, r24 + Crypto1LFSR(0); + 358e: 80 e0 ldi r24, 0x00 ; 0 + 3590: 68 dd rcall .-1328 ; 0x3062 + + /* Store keystream bit */ + KeyStream >>= 1; + 3592: c6 95 lsr r28 + + if (Out) { + 3594: d1 11 cpse r29, r1 + KeyStream |= (1<<3); + 3596: c8 60 ori r28, 0x08 ; 8 + /* Generate 4 keystream-bits */ + for (i=0; i<4; i++) { + + /* Calculate output of function-network and cycle LFSR with no + * additional input, thus linearly! */ + uint8_t Out = Crypto1FilterOutput(); + 3598: aa dd rcall .-1196 ; 0x30ee + 359a: d8 2f mov r29, r24 + Crypto1LFSR(0); + 359c: 80 e0 ldi r24, 0x00 ; 0 + 359e: 61 dd rcall .-1342 ; 0x3062 + + /* Store keystream bit */ + KeyStream >>= 1; + 35a0: 8c 2f mov r24, r28 + 35a2: 86 95 lsr r24 + + if (Out) { + 35a4: d1 11 cpse r29, r1 + KeyStream |= (1<<3); + 35a6: 88 60 ori r24, 0x08 ; 8 } } return KeyStream; } - 3900: bf 92 push r11 - 3902: cf 92 push r12 - 3904: df 92 push r13 + 35a8: df 91 pop r29 + 35aa: cf 91 pop r28 + 35ac: 08 95 ret * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); Crypto1LFSR(0); /* Store keystream bit */ KeyStream >>= 1; - 3906: ef 92 push r14 - 3908: ff 92 push r15 + 35ae: c0 e0 ldi r28, 0x00 ; 0 + 35b0: e5 cf rjmp .-54 ; 0x357c + +000035b2 : return KeyStream; } void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) { - 390a: 0f 93 push r16 - 390c: 1f 93 push r17 - 390e: cf 93 push r28 - 3910: df 93 push r29 - 3912: 4c 01 movw r8, r24 - 3914: 5b 01 movw r10, r22 + 35b2: 6f 92 push r6 + 35b4: 7f 92 push r7 + 35b6: 8f 92 push r8 + 35b8: 9f 92 push r9 + 35ba: af 92 push r10 + 35bc: bf 92 push r11 + 35be: cf 92 push r12 + 35c0: df 92 push r13 + 35c2: ef 92 push r14 + 35c4: ff 92 push r15 + 35c6: 0f 93 push r16 + 35c8: 1f 93 push r17 + 35ca: cf 93 push r28 + 35cc: df 93 push r29 + 35ce: 3c 01 movw r6, r24 while(ClockCount--) { - 3916: 61 15 cp r22, r1 - 3918: 71 05 cpc r23, r1 - 391a: 09 f4 brne .+2 ; 0x391e - 391c: 5f c0 rjmp .+190 ; 0x39dc - 391e: dc 01 movw r26, r24 - 3920: 12 96 adiw r26, 0x02 ; 2 - 3922: cc 91 ld r28, X - 3924: 12 97 sbiw r26, 0x02 ; 2 - 3926: ec 91 ld r30, X - 3928: 11 96 adiw r26, 0x01 ; 1 - 392a: dc 91 ld r29, X - 392c: 11 97 sbiw r26, 0x01 ; 1 - 392e: 13 96 adiw r26, 0x03 ; 3 - 3930: fc 91 ld r31, X + 35d0: cb 01 movw r24, r22 + 35d2: 01 97 sbiw r24, 0x01 ; 1 + 35d4: 67 2b or r22, r23 + 35d6: c9 f1 breq .+114 ; 0x364a + 35d8: f3 01 movw r30, r6 + 35da: a2 81 ldd r26, Z+2 ; 0x02 + 35dc: c0 81 ld r28, Z + 35de: b1 81 ldd r27, Z+1 ; 0x01 + 35e0: d3 81 ldd r29, Z+3 ; 0x03 * XOR all tapped bits to a single feedback bit. */ uint8_t Feedback = 0; Feedback ^= State[0] & (uint8_t) (PRNG_MASK >> 0); Feedback ^= State[1] & (uint8_t) (PRNG_MASK >> 8); Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); - 3932: 9c 2f mov r25, r28 - 3934: 9d 72 andi r25, 0x2D ; 45 + 35e2: 2a 2f mov r18, r26 + 35e4: 2d 72 andi r18, 0x2D ; 45 Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); Feedback ^= Feedback >> 4; - 3936: 89 2f mov r24, r25 - 3938: 82 95 swap r24 - 393a: 8f 70 andi r24, 0x0F ; 15 - 393c: 89 27 eor r24, r25 + 35e6: 32 2f mov r19, r18 + 35e8: 32 95 swap r19 + 35ea: 3f 70 andi r19, 0x0F ; 15 + 35ec: 32 27 eor r19, r18 Feedback ^= Feedback >> 2; - 393e: 28 2f mov r18, r24 - 3940: 26 95 lsr r18 - 3942: 26 95 lsr r18 - 3944: 28 27 eor r18, r24 + 35ee: 23 2f mov r18, r19 + 35f0: 26 95 lsr r18 + 35f2: 26 95 lsr r18 + 35f4: 23 27 eor r18, r19 Feedback ^= Feedback >> 1; - 3946: 32 2f mov r19, r18 - 3948: 36 95 lsr r19 - - /* For ease of processing convert the state into a 32 bit integer first */ + 35f6: 32 2f mov r19, r18 + 35f8: 36 95 lsr r19 uint32_t Temp = 0; Temp |= (uint32_t) State[0] << 0; Temp |= (uint32_t) State[1] << 8; - 394a: 8d 2f mov r24, r29 - 394c: 90 e0 ldi r25, 0x00 ; 0 - 394e: a0 e0 ldi r26, 0x00 ; 0 - 3950: b0 e0 ldi r27, 0x00 ; 0 - 3952: ba 2f mov r27, r26 - 3954: a9 2f mov r26, r25 - 3956: 98 2f mov r25, r24 - 3958: 88 27 eor r24, r24 - Temp |= (uint32_t) State[2] << 16; - 395a: 4c 2f mov r20, r28 - 395c: 50 e0 ldi r21, 0x00 ; 0 - 395e: 60 e0 ldi r22, 0x00 ; 0 - 3960: 70 e0 ldi r23, 0x00 ; 0 - 3962: ba 01 movw r22, r20 - 3964: 55 27 eor r21, r21 - 3966: 44 27 eor r20, r20 - - /* For ease of processing convert the state into a 32 bit integer first */ - uint32_t Temp = 0; - - Temp |= (uint32_t) State[0] << 0; - Temp |= (uint32_t) State[1] << 8; - 3968: 84 2b or r24, r20 - 396a: 95 2b or r25, r21 - 396c: a6 2b or r26, r22 - 396e: b7 2b or r27, r23 - Feedback ^= Feedback >> 1; - - /* For ease of processing convert the state into a 32 bit integer first */ - uint32_t Temp = 0; - - Temp |= (uint32_t) State[0] << 0; - 3970: 4e 2f mov r20, r30 - 3972: 50 e0 ldi r21, 0x00 ; 0 - 3974: 60 e0 ldi r22, 0x00 ; 0 - 3976: 70 e0 ldi r23, 0x00 ; 0 - Temp |= (uint32_t) State[1] << 8; Temp |= (uint32_t) State[2] << 16; - 3978: 84 2b or r24, r20 - 397a: 95 2b or r25, r21 - 397c: a6 2b or r26, r22 - 397e: b7 2b or r27, r23 Temp |= (uint32_t) State[3] << 24; - 3980: 4f 2f mov r20, r31 - 3982: 50 e0 ldi r21, 0x00 ; 0 - 3984: 60 e0 ldi r22, 0x00 ; 0 - 3986: 70 e0 ldi r23, 0x00 ; 0 - 3988: 74 2f mov r23, r20 - 398a: 66 27 eor r22, r22 - 398c: 55 27 eor r21, r21 - 398e: 44 27 eor r20, r20 - 3990: 84 2b or r24, r20 - 3992: 95 2b or r25, r21 - 3994: a6 2b or r26, r22 - 3996: b7 2b or r27, r23 + 35fa: 4d 2f mov r20, r29 + 35fc: 50 e0 ldi r21, 0x00 ; 0 + 35fe: 60 e0 ldi r22, 0x00 ; 0 + 3600: 70 e0 ldi r23, 0x00 ; 0 + 3602: 74 2f mov r23, r20 + 3604: 66 27 eor r22, r22 + 3606: 55 27 eor r21, r21 + 3608: 44 27 eor r20, r20 + + /* For ease of processing convert the state into a 32 bit integer first */ + uint32_t Temp = 0; + + Temp |= (uint32_t) State[0] << 0; + Temp |= (uint32_t) State[1] << 8; + 360a: 5b 2b or r21, r27 + Temp |= (uint32_t) State[2] << 16; + 360c: 4c 2b or r20, r28 + Temp |= (uint32_t) State[3] << 24; + 360e: 6a 2b or r22, r26 /* Cycle LFSR and feed back. */ Temp >>= 1; - 3998: b6 95 lsr r27 - 399a: a7 95 ror r26 - 399c: 97 95 ror r25 - 399e: 87 95 ror r24 + 3610: 76 95 lsr r23 + 3612: 67 95 ror r22 + 3614: 57 95 ror r21 + 3616: 47 95 ror r20 Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); Feedback ^= Feedback >> 4; Feedback ^= Feedback >> 2; Feedback ^= Feedback >> 1; - 39a0: 32 27 eor r19, r18 + 3618: 32 27 eor r19, r18 Temp |= (uint32_t) State[3] << 24; /* Cycle LFSR and feed back. */ Temp >>= 1; if (Feedback & 0x01) { - 39a2: 30 fd sbrc r19, 0 + 361a: 30 fd sbrc r19, 0 Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); - 39a4: b0 68 ori r27, 0x80 ; 128 + 361c: 70 68 ori r23, 0x80 ; 128 } /* Store back state */ State[0] = (uint8_t) (Temp >> 0); - 39a6: e8 2f mov r30, r24 + 361e: c4 2f mov r28, r20 State[1] = (uint8_t) (Temp >> 8); - 39a8: 49 2f mov r20, r25 - 39aa: 5a 2f mov r21, r26 - 39ac: 6b 2f mov r22, r27 - 39ae: 77 27 eor r23, r23 - 39b0: d4 2f mov r29, r20 + 3620: 85 2e mov r8, r21 + 3622: 96 2e mov r9, r22 + 3624: a7 2e mov r10, r23 + 3626: bb 24 eor r11, r11 + 3628: b8 2d mov r27, r8 State[2] = (uint8_t) (Temp >> 16); - 39b2: 8d 01 movw r16, r26 - 39b4: 22 27 eor r18, r18 - 39b6: 33 27 eor r19, r19 - 39b8: c0 2f mov r28, r16 + 362a: 6b 01 movw r12, r22 + 362c: ee 24 eor r14, r14 + 362e: ff 24 eor r15, r15 + 3630: ac 2d mov r26, r12 State[3] = (uint8_t) (Temp >> 24); - 39ba: cb 2e mov r12, r27 - 39bc: dd 24 eor r13, r13 - 39be: ee 24 eor r14, r14 - 39c0: ff 24 eor r15, r15 - 39c2: fc 2d mov r31, r12 - 39c4: 08 94 sec - 39c6: a1 08 sbc r10, r1 - 39c8: b1 08 sbc r11, r1 + 3632: 07 2f mov r16, r23 + 3634: 11 27 eor r17, r17 + 3636: 22 27 eor r18, r18 + 3638: 33 27 eor r19, r19 + 363a: d0 2f mov r29, r16 return KeyStream; } void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) { while(ClockCount--) { - 39ca: a1 14 cp r10, r1 - 39cc: b1 04 cpc r11, r1 - 39ce: 09 f0 breq .+2 ; 0x39d2 - 39d0: b0 cf rjmp .-160 ; 0x3932 - 39d2: f4 01 movw r30, r8 - 39d4: 80 83 st Z, r24 - 39d6: 41 83 std Z+1, r20 ; 0x01 - 39d8: 02 83 std Z+2, r16 ; 0x02 - 39da: c3 82 std Z+3, r12 ; 0x03 + 363c: 01 97 sbiw r24, 0x01 ; 1 + 363e: 88 f6 brcc .-94 ; 0x35e2 + 3640: f3 01 movw r30, r6 + 3642: 40 83 st Z, r20 + 3644: 81 82 std Z+1, r8 ; 0x01 + 3646: c2 82 std Z+2, r12 ; 0x02 + 3648: 03 83 std Z+3, r16 ; 0x03 State[2] = (uint8_t) (Temp >> 16); State[3] = (uint8_t) (Temp >> 24); } } - 39dc: df 91 pop r29 - 39de: cf 91 pop r28 - 39e0: 1f 91 pop r17 - 39e2: 0f 91 pop r16 - 39e4: ff 90 pop r15 - 39e6: ef 90 pop r14 - 39e8: df 90 pop r13 - 39ea: cf 90 pop r12 - 39ec: bf 90 pop r11 - 39ee: af 90 pop r10 - 39f0: 9f 90 pop r9 - 39f2: 8f 90 pop r8 - 39f4: 08 95 ret + 364a: df 91 pop r29 + 364c: cf 91 pop r28 + 364e: 1f 91 pop r17 + 3650: 0f 91 pop r16 + 3652: ff 90 pop r15 + 3654: ef 90 pop r14 + 3656: df 90 pop r13 + 3658: cf 90 pop r12 + 365a: bf 90 pop r11 + 365c: af 90 pop r10 + 365e: 9f 90 pop r9 + 3660: 8f 90 pop r8 + 3662: 7f 90 pop r7 + 3664: 6f 90 pop r6 + 3666: 08 95 ret -000039f6 : +00003668 : #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) { - 39f6: 1f 93 push r17 - 39f8: cf 93 push r28 - 39fa: df 93 push r29 - 39fc: cd b7 in r28, 0x3d ; 61 - 39fe: de b7 in r29, 0x3e ; 62 - 3a00: ee 97 sbiw r28, 0x3e ; 62 - 3a02: cd bf out 0x3d, r28 ; 61 - 3a04: de bf out 0x3e, r29 ; 62 + 3668: 0f 93 push r16 + 366a: 1f 93 push r17 + 366c: cf 93 push r28 + 366e: df 93 push r29 + 3670: cd b7 in r28, 0x3d ; 61 + 3672: de b7 in r29, 0x3e ; 62 + 3674: ec 97 sbiw r28, 0x3c ; 60 + 3676: cd bf out 0x3d, r28 ; 61 + 3678: de bf out 0x3e, r29 ; 62 USB_ControlRequest.wLength = Endpoint_Read_16_LE(); #else uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) *(RequestHeader++) = Endpoint_Read_8(); - 3a06: 4d d3 rcall .+1690 ; 0x40a2 - 3a08: 80 93 25 23 sts 0x2325, r24 - 3a0c: 4a d3 rcall .+1684 ; 0x40a2 - 3a0e: 80 93 26 23 sts 0x2326, r24 - 3a12: 47 d3 rcall .+1678 ; 0x40a2 - 3a14: 80 93 27 23 sts 0x2327, r24 - 3a18: 44 d3 rcall .+1672 ; 0x40a2 - 3a1a: 80 93 28 23 sts 0x2328, r24 - 3a1e: 41 d3 rcall .+1666 ; 0x40a2 - 3a20: 80 93 29 23 sts 0x2329, r24 - 3a24: 3e d3 rcall .+1660 ; 0x40a2 - 3a26: 80 93 2a 23 sts 0x232A, r24 - 3a2a: 3b d3 rcall .+1654 ; 0x40a2 - 3a2c: 80 93 2b 23 sts 0x232B, r24 - 3a30: 38 d3 rcall .+1648 ; 0x40a2 - 3a32: 80 93 2c 23 sts 0x232C, r24 - 3a36: 0e 94 80 0b call 0x1700 ; 0x1700 - 3a3a: d5 d3 rcall .+1962 ; 0x41e6 - 3a3c: 88 23 and r24, r24 - 3a3e: 91 f0 breq .+36 ; 0x3a64 - 3a40: 90 91 25 23 lds r25, 0x2325 - 3a44: 80 91 26 23 lds r24, 0x2326 + 367a: 2b d3 rcall .+1622 ; 0x3cd2 + 367c: 80 93 15 23 sts 0x2315, r24 + 3680: 28 d3 rcall .+1616 ; 0x3cd2 + 3682: 80 93 16 23 sts 0x2316, r24 + 3686: 25 d3 rcall .+1610 ; 0x3cd2 + 3688: 80 93 17 23 sts 0x2317, r24 + 368c: 22 d3 rcall .+1604 ; 0x3cd2 + 368e: 80 93 18 23 sts 0x2318, r24 + 3692: 1f d3 rcall .+1598 ; 0x3cd2 + 3694: 80 93 19 23 sts 0x2319, r24 + 3698: 1c d3 rcall .+1592 ; 0x3cd2 + 369a: 80 93 1a 23 sts 0x231A, r24 + 369e: 19 d3 rcall .+1586 ; 0x3cd2 + 36a0: 80 93 1b 23 sts 0x231B, r24 + 36a4: 16 d3 rcall .+1580 ; 0x3cd2 + 36a6: 80 93 1c 23 sts 0x231C, r24 #endif EVENT_USB_Device_ControlRequest(); - 3a48: 85 30 cpi r24, 0x05 ; 5 + 36aa: 0e 94 36 0b call 0x166c ; 0x166c if (Endpoint_IsSETUPReceived()) - 3a4a: 09 f4 brne .+2 ; 0x3a4e - 3a4c: 53 c0 rjmp .+166 ; 0x3af4 - 3a4e: 86 30 cpi r24, 0x06 ; 6 - 3a50: a8 f0 brcs .+42 ; 0x3a7c + 36ae: b0 d3 rcall .+1888 ; 0x3e10 + 36b0: 88 23 and r24, r24 + 36b2: 89 f0 breq .+34 ; 0x36d6 { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 3a52: 88 30 cpi r24, 0x08 ; 8 - 3a54: 09 f4 brne .+2 ; 0x3a58 + 36b4: 90 91 15 23 lds r25, 0x2315 switch (USB_ControlRequest.bRequest) - 3a56: ba c0 rjmp .+372 ; 0x3bcc - 3a58: 89 30 cpi r24, 0x09 ; 9 - 3a5a: 09 f4 brne .+2 ; 0x3a5e - 3a5c: 9e c0 rjmp .+316 ; 0x3b9a - 3a5e: 86 30 cpi r24, 0x06 ; 6 - 3a60: 09 f4 brne .+2 ; 0x3a64 - 3a62: 5d c0 rjmp .+186 ; 0x3b1e - 3a64: c0 d3 rcall .+1920 ; 0x41e6 - 3a66: 88 23 and r24, r24 - 3a68: 11 f0 breq .+4 ; 0x3a6e - 3a6a: 91 d3 rcall .+1826 ; 0x418e - 3a6c: 74 d3 rcall .+1768 ; 0x4156 - 3a6e: ee 96 adiw r28, 0x3e ; 62 - 3a70: cd bf out 0x3d, r28 ; 61 - 3a72: de bf out 0x3e, r29 ; 62 - 3a74: df 91 pop r29 + 36b8: 80 91 16 23 lds r24, 0x2316 + 36bc: 85 30 cpi r24, 0x05 ; 5 + 36be: 09 f4 brne .+2 ; 0x36c2 + 36c0: 52 c0 rjmp .+164 ; 0x3766 + 36c2: b0 f0 brcs .+44 ; 0x36f0 + 36c4: 88 30 cpi r24, 0x08 ; 8 + 36c6: 09 f4 brne .+2 ; 0x36ca + 36c8: b3 c0 rjmp .+358 ; 0x3830 + 36ca: 89 30 cpi r24, 0x09 ; 9 + 36cc: 09 f4 brne .+2 ; 0x36d0 + 36ce: 98 c0 rjmp .+304 ; 0x3800 + 36d0: 86 30 cpi r24, 0x06 ; 6 + 36d2: 09 f4 brne .+2 ; 0x36d6 + 36d4: 5a c0 rjmp .+180 ; 0x378a default: break; } } if (Endpoint_IsSETUPReceived()) - 3a76: cf 91 pop r28 - 3a78: 1f 91 pop r17 - 3a7a: 08 95 ret - 3a7c: 81 30 cpi r24, 0x01 ; 1 + 36d6: 9c d3 rcall .+1848 ; 0x3e10 + 36d8: 88 23 and r24, r24 + 36da: 11 f0 breq .+4 ; 0x36e0 { Endpoint_ClearSETUP(); - 3a7e: 29 f0 breq .+10 ; 0x3a8a - 3a80: 81 30 cpi r24, 0x01 ; 1 + 36dc: 6d d3 rcall .+1754 ; 0x3db8 Endpoint_StallTransaction(); - 3a82: 08 f4 brcc .+2 ; 0x3a86 - 3a84: 6e c0 rjmp .+220 ; 0x3b62 + 36de: 50 d3 rcall .+1696 ; 0x3d80 } } - 3a86: 83 30 cpi r24, 0x03 ; 3 - 3a88: 69 f7 brne .-38 ; 0x3a64 - 3a8a: 99 23 and r25, r25 - 3a8c: 09 f4 brne .+2 ; 0x3a90 - 3a8e: a8 c0 rjmp .+336 ; 0x3be0 - 3a90: 92 30 cpi r25, 0x02 ; 2 - 3a92: 41 f7 brne .-48 ; 0x3a64 + 36e0: ec 96 adiw r28, 0x3c ; 60 + 36e2: cd bf out 0x3d, r28 ; 61 + 36e4: de bf out 0x3e, r29 ; 62 + 36e6: df 91 pop r29 + 36e8: cf 91 pop r28 + 36ea: 1f 91 pop r17 + 36ec: 0f 91 pop r16 + 36ee: 08 95 ret if (Endpoint_IsSETUPReceived()) { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; switch (USB_ControlRequest.bRequest) - 3a94: 80 91 27 23 lds r24, 0x2327 - 3a98: 88 23 and r24, r24 - 3a9a: 39 f5 brne .+78 ; 0x3aea - 3a9c: 10 91 29 23 lds r17, 0x2329 - 3aa0: 1f 70 andi r17, 0x0F ; 15 + 36f0: 81 30 cpi r24, 0x01 ; 1 + 36f2: 21 f0 breq .+8 ; 0x36fc + 36f4: 08 f4 brcc .+2 ; 0x36f8 + 36f6: 68 c0 rjmp .+208 ; 0x37c8 + 36f8: 83 30 cpi r24, 0x03 ; 3 + 36fa: 69 f7 brne .-38 ; 0x36d6 } break; case REQ_ClearFeature: case REQ_SetFeature: if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3aa2: 01 f3 breq .-64 ; 0x3a64 - 3aa4: 81 2f mov r24, r17 - 3aa6: 1b d3 rcall .+1590 ; 0x40de - 3aa8: 80 91 26 23 lds r24, 0x2326 + 36fc: 99 23 and r25, r25 + 36fe: 09 f4 brne .+2 ; 0x3702 + 3700: a1 c0 rjmp .+322 ; 0x3844 + 3702: 92 30 cpi r25, 0x02 ; 2 + 3704: 41 f7 brne .-48 ; 0x36d6 break; #endif #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 3aac: 83 30 cpi r24, 0x03 ; 3 - 3aae: 09 f4 brne .+2 ; 0x3ab2 - 3ab0: f8 c0 rjmp .+496 ; 0x3ca2 - 3ab2: e0 91 2f 23 lds r30, 0x232F + 3706: 80 91 17 23 lds r24, 0x2317 + 370a: 81 11 cpse r24, r1 + 370c: 27 c0 rjmp .+78 ; 0x375c { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 3ab6: f0 91 30 23 lds r31, 0x2330 + 370e: 00 91 19 23 lds r16, 0x2319 + 3712: 10 91 1a 23 lds r17, 0x231A + 3716: 0f 70 andi r16, 0x0F ; 15 + 3718: 11 27 eor r17, r17 if (EndpointIndex == ENDPOINT_CONTROLEP) - 3aba: 81 81 ldd r24, Z+1 ; 0x01 + 371a: 01 15 cp r16, r1 + 371c: 11 05 cpc r17, r1 + 371e: d9 f2 breq .-74 ; 0x36d6 return; Endpoint_SelectEndpoint(EndpointIndex); - 3abc: 8b 7f andi r24, 0xFB ; 251 - 3abe: 81 83 std Z+1, r24 ; 0x01 - 3ac0: 21 2f mov r18, r17 + 3720: 80 2f mov r24, r16 + 3722: f5 d2 rcall .+1514 ; 0x3d0e if (Endpoint_IsEnabled()) { if (USB_ControlRequest.bRequest == REQ_SetFeature) - 3ac2: 30 e0 ldi r19, 0x00 ; 0 - 3ac4: 84 e8 ldi r24, 0x84 ; 132 - 3ac6: 90 e0 ldi r25, 0x00 ; 0 - 3ac8: 28 9f mul r18, r24 - 3aca: f0 01 movw r30, r0 + 3724: 80 91 16 23 lds r24, 0x2316 + 3728: 83 30 cpi r24, 0x03 ; 3 + 372a: 09 f4 brne .+2 ; 0x372e + 372c: e6 c0 rjmp .+460 ; 0x38fa * \ingroup Group_EndpointPacketManagement_XMEGA */ static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearStall(void) { USB_Endpoint_SelectedHandle->CTRL &= ~USB_EP_STALL_bm; - 3acc: 29 9f mul r18, r25 - 3ace: f0 0d add r31, r0 - 3ad0: 38 9f mul r19, r24 - 3ad2: f0 0d add r31, r0 - 3ad4: 11 24 eor r1, r1 - 3ad6: ed 58 subi r30, 0x8D ; 141 - 3ad8: fc 4d sbci r31, 0xDC ; 220 + 372e: e0 91 1f 23 lds r30, 0x231F + 3732: f0 91 20 23 lds r31, 0x2320 + 3736: 81 81 ldd r24, Z+1 ; 0x01 + 3738: 8b 7f andi r24, 0xFB ; 251 + 373a: 81 83 std Z+1, r24 ; 0x01 static inline void Endpoint_ResetEndpoint(const uint8_t Address) { if (Address & ENDPOINT_DIR_IN) USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].IN.Position = 0; else USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].OUT.Position = 0; - 3ada: 10 82 st Z, r1 - 3adc: e0 91 2f 23 lds r30, 0x232F - 3ae0: f0 91 30 23 lds r31, 0x2330 - 3ae4: 80 81 ld r24, Z - 3ae6: 8e 7f andi r24, 0xFE ; 254 - 3ae8: 80 83 st Z, r24 - 3aea: 80 e0 ldi r24, 0x00 ; 0 - 3aec: f8 d2 rcall .+1520 ; 0x40de - 3aee: 4f d3 rcall .+1694 ; 0x418e - 3af0: a8 d4 rcall .+2384 ; 0x4442 - 3af2: b8 cf rjmp .-144 ; 0x3a64 - 3af4: 99 23 and r25, r25 + 373c: 84 e8 ldi r24, 0x84 ; 132 + 373e: 80 9f mul r24, r16 + 3740: f0 01 movw r30, r0 + 3742: 81 9f mul r24, r17 + 3744: f0 0d add r31, r0 + 3746: 11 24 eor r1, r1 + 3748: ed 59 subi r30, 0x9D ; 157 + 374a: fc 4d sbci r31, 0xDC ; 220 + 374c: 10 82 st Z, r1 /** Resets the data toggle of the currently selected endpoint. */ static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ResetDataToggle(void) { USB_Endpoint_SelectedHandle->STATUS &= ~USB_EP_TOGGLE_bm; - 3af6: 09 f0 breq .+2 ; 0x3afa - 3af8: b5 cf rjmp .-150 ; 0x3a64 - 3afa: 10 91 27 23 lds r17, 0x2327 - 3afe: 1f 77 andi r17, 0x7F ; 127 - 3b00: 46 d3 rcall .+1676 ; 0x418e - 3b02: 9f d4 rcall .+2366 ; 0x4442 + 374e: e0 91 1f 23 lds r30, 0x231F + 3752: f0 91 20 23 lds r31, 0x2320 + 3756: 80 81 ld r24, Z + 3758: 8e 7f andi r24, 0xFE ; 254 + 375a: 80 83 st Z, r24 #endif default: return; } Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3b04: a0 d3 rcall .+1856 ; 0x4246 - 3b06: 88 23 and r24, r24 - 3b08: e9 f3 breq .-6 ; 0x3b04 + 375c: 80 e0 ldi r24, 0x00 ; 0 + 375e: d7 d2 rcall .+1454 ; 0x3d0e Endpoint_ClearSETUP(); - 3b0a: e0 ec ldi r30, 0xC0 ; 192 - 3b0c: f4 e0 ldi r31, 0x04 ; 4 + 3760: 2b d3 rcall .+1622 ; 0x3db8 Endpoint_ClearStatusStage(); - 3b0e: 13 83 std Z+3, r17 ; 0x03 - 3b10: 11 23 and r17, r17 - 3b12: 09 f0 breq .+2 ; 0x3b16 + 3762: 8f d4 rcall .+2334 ; 0x4082 + 3764: b8 cf rjmp .-144 ; 0x36d6 USB_Device_ClearSetFeature(); } break; case REQ_SetAddress: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 3b14: 7a c0 rjmp .+244 ; 0x3c0a - 3b16: 82 e0 ldi r24, 0x02 ; 2 - 3b18: 80 93 24 23 sts 0x2324, r24 + 3766: 91 11 cpse r25, r1 + 3768: b6 cf rjmp .-148 ; 0x36d6 } } static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 3b1c: a3 cf rjmp .-186 ; 0x3a64 - 3b1e: 90 58 subi r25, 0x80 ; 128 + 376a: 10 91 17 23 lds r17, 0x2317 + 376e: 1f 77 andi r17, 0x7F ; 127 USB_Device_SetDeviceAddress(DeviceAddress); Endpoint_ClearSETUP(); - 3b20: 92 30 cpi r25, 0x02 ; 2 - 3b22: 08 f0 brcs .+2 ; 0x3b26 + 3770: 23 d3 rcall .+1606 ; 0x3db8 Endpoint_ClearStatusStage(); - 3b24: 9f cf rjmp .-194 ; 0x3a64 - 3b26: 80 91 27 23 lds r24, 0x2327 + 3772: 87 d4 rcall .+2318 ; 0x4082 while (!(Endpoint_IsINReady())); - 3b2a: 90 91 28 23 lds r25, 0x2328 - 3b2e: 23 e0 ldi r18, 0x03 ; 3 + 3774: 7f d3 rcall .+1790 ; 0x3e74 + 3776: 88 23 and r24, r24 + 3778: e9 f3 breq .-6 ; 0x3774 } static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) { USB.ADDR = Address; - 3b30: 8c 3d cpi r24, 0xDC ; 220 - 3b32: 92 07 cpc r25, r18 - 3b34: 09 f4 brne .+2 ; 0x3b38 + 377a: 10 93 c3 04 sts 0x04C3, r17 USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 3b36: 6b c0 rjmp .+214 ; 0x3c0e - 3b38: 60 91 29 23 lds r22, 0x2329 - 3b3c: ae 01 movw r20, r28 - 3b3e: 4f 5f subi r20, 0xFF ; 255 - 3b40: 5f 4f sbci r21, 0xFF ; 255 - 3b42: 0e 94 8a 03 call 0x714 ; 0x714 + 377e: 11 11 cpse r17, r1 + 3780: 76 c0 rjmp .+236 ; 0x386e + 3782: 82 e0 ldi r24, 0x02 ; 2 + 3784: 80 93 14 23 sts 0x2314, r24 + 3788: a6 cf rjmp .-180 ; 0x36d6 if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_SetAddress(); break; case REQ_GetDescriptor: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3b46: bc 01 movw r22, r24 - 3b48: 00 97 sbiw r24, 0x00 ; 0 - 3b4a: 09 f4 brne .+2 ; 0x3b4e + 378a: 90 58 subi r25, 0x80 ; 128 + 378c: 92 30 cpi r25, 0x02 ; 2 + 378e: 08 f0 brcs .+2 ; 0x3792 + 3790: a2 cf rjmp .-188 ; 0x36d6 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) uint8_t DescriptorAddressSpace; #endif #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL)) - 3b4c: 8b cf rjmp .-234 ; 0x3a64 - 3b4e: 8d af sts 0x7d, r24 - 3b50: 7e af sts 0x7e, r23 - 3b52: 1d d3 rcall .+1594 ; 0x418e - 3b54: 89 81 ldd r24, Y+1 ; 0x01 - 3b56: 9a 81 ldd r25, Y+2 ; 0x02 - 3b58: 6d ad sts 0x6d, r22 - 3b5a: 7e ad sts 0x6e, r23 - 3b5c: ca d1 rcall .+916 ; 0x3ef2 + 3792: 80 91 17 23 lds r24, 0x2317 + 3796: 90 91 18 23 lds r25, 0x2318 + 379a: 8c 3d cpi r24, 0xDC ; 220 + 379c: 23 e0 ldi r18, 0x03 ; 3 + 379e: 92 07 cpc r25, r18 + 37a0: 09 f4 brne .+2 ; 0x37a4 + 37a2: 67 c0 rjmp .+206 ; 0x3872 USB_Device_GetInternalSerialDescriptor(); return; } #endif if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 3b5e: 92 d2 rcall .+1316 ; 0x4084 - 3b60: 81 cf rjmp .-254 ; 0x3a64 - 3b62: 90 38 cpi r25, 0x80 ; 128 - 3b64: 09 f4 brne .+2 ; 0x3b68 - 3b66: 48 c0 rjmp .+144 ; 0x3bf8 - 3b68: 92 38 cpi r25, 0x82 ; 130 - 3b6a: 09 f0 breq .+2 ; 0x3b6e - 3b6c: 7b cf rjmp .-266 ; 0x3a64 - 3b6e: 80 91 29 23 lds r24, 0x2329 - 3b72: 8f 70 andi r24, 0x0F ; 15 + 37a4: ae 01 movw r20, r28 + 37a6: 45 5c subi r20, 0xC5 ; 197 + 37a8: 5f 4f sbci r21, 0xFF ; 255 + 37aa: 60 91 19 23 lds r22, 0x2319 + 37ae: 0e 94 88 03 call 0x710 ; 0x710 + 37b2: 8c 01 movw r16, r24 + 37b4: 00 97 sbiw r24, 0x00 ; 0 + 37b6: 09 f4 brne .+2 ; 0x37ba + 37b8: 8e cf rjmp .-228 ; 0x36d6 )) == NO_DESCRIPTOR) { return; } Endpoint_ClearSETUP(); - 3b74: b4 d2 rcall .+1384 ; 0x40de - 3b76: e0 91 2f 23 lds r30, 0x232F - 3b7a: f0 91 30 23 lds r31, 0x2330 + 37ba: fe d2 rcall .+1532 ; 0x3db8 #if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE) Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); #elif defined(USE_EEPROM_DESCRIPTORS) Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); #elif defined(USE_FLASH_DESCRIPTORS) Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); - 3b7e: 81 81 ldd r24, Z+1 ; 0x01 - 3b80: 11 e0 ldi r17, 0x01 ; 1 - 3b82: 82 ff sbrs r24, 2 - 3b84: 10 e0 ldi r17, 0x00 ; 0 - 3b86: 80 e0 ldi r24, 0x00 ; 0 + 37bc: b8 01 movw r22, r16 + 37be: 8b ad ldd r24, Y+59 ; 0x3b + 37c0: 9c ad ldd r25, Y+60 ; 0x3c + 37c2: c0 d1 rcall .+896 ; 0x3b44 Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); else Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); #endif Endpoint_ClearOUT(); - 3b88: aa d2 rcall .+1364 ; 0x40de - 3b8a: 01 d3 rcall .+1538 ; 0x418e - 3b8c: 81 2f mov r24, r17 + 37c4: 77 d2 rcall .+1262 ; 0x3cb4 + 37c6: 87 cf rjmp .-242 ; 0x36d6 uint8_t bmRequestType = USB_ControlRequest.bmRequestType; switch (USB_ControlRequest.bRequest) { case REQ_GetStatus: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3b8e: 98 d2 rcall .+1328 ; 0x40c0 - 3b90: 80 e0 ldi r24, 0x00 ; 0 - 3b92: 96 d2 rcall .+1324 ; 0x40c0 - 3b94: 5e d2 rcall .+1212 ; 0x4052 - 3b96: 55 d4 rcall .+2218 ; 0x4442 - 3b98: 65 cf rjmp .-310 ; 0x3a64 + 37c8: 90 38 cpi r25, 0x80 ; 128 + 37ca: 09 f4 brne .+2 ; 0x37ce + 37cc: 47 c0 rjmp .+142 ; 0x385c + 37ce: 92 38 cpi r25, 0x82 ; 130 + 37d0: 09 f0 breq .+2 ; 0x37d4 + 37d2: 81 cf rjmp .-254 ; 0x36d6 CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; #endif break; case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): #if !defined(CONTROL_ONLY_DEVICE) Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 3b9a: 99 23 and r25, r25 - 3b9c: 09 f0 breq .+2 ; 0x3ba0 - 3b9e: 62 cf rjmp .-316 ; 0x3a64 - 3ba0: 80 91 27 23 lds r24, 0x2327 + 37d4: 80 91 19 23 lds r24, 0x2319 + 37d8: 8f 70 andi r24, 0x0F ; 15 + 37da: 99 d2 rcall .+1330 ; 0x3d0e * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. */ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) { return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); - 3ba4: 82 30 cpi r24, 0x02 ; 2 - 3ba6: 08 f0 brcs .+2 ; 0x3baa - 3ba8: 5d cf rjmp .-326 ; 0x3a64 - 3baa: f1 d2 rcall .+1506 ; 0x418e - 3bac: 80 91 27 23 lds r24, 0x2327 + 37dc: e0 91 1f 23 lds r30, 0x231F + 37e0: f0 91 20 23 lds r31, 0x2320 + 37e4: 11 81 ldd r17, Z+1 ; 0x01 + 37e6: 12 fb bst r17, 2 + 37e8: 11 27 eor r17, r17 + 37ea: 10 f9 bld r17, 0 CurrentStatus = Endpoint_IsStalled(); - 3bb0: 80 93 20 23 sts 0x2320, r24 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3bb4: 46 d4 rcall .+2188 ; 0x4442 - 3bb6: 80 91 20 23 lds r24, 0x2320 + 37ec: 80 e0 ldi r24, 0x00 ; 0 + 37ee: 8f d2 rcall .+1310 ; 0x3d0e break; default: return; } Endpoint_ClearSETUP(); - 3bba: 88 23 and r24, r24 - 3bbc: 09 f4 brne .+2 ; 0x3bc0 + 37f0: e3 d2 rcall .+1478 ; 0x3db8 * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_16_LE(const uint16_t Data) { Endpoint_Write_8(Data & 0xFF); - 3bbe: 67 c0 rjmp .+206 ; 0x3c8e - 3bc0: 84 e0 ldi r24, 0x04 ; 4 - 3bc2: 80 93 24 23 sts 0x2324, r24 + 37f2: 81 2f mov r24, r17 + 37f4: 7d d2 rcall .+1274 ; 0x3cf0 Endpoint_Write_8(Data >> 8); - 3bc6: 0e 94 7c 0b call 0x16f8 ; 0x16f8 + 37f6: 80 e0 ldi r24, 0x00 ; 0 + 37f8: 7b d2 rcall .+1270 ; 0x3cf0 Endpoint_Write_16_LE(CurrentStatus); Endpoint_ClearIN(); - 3bca: 4c cf rjmp .-360 ; 0x3a64 - 3bcc: 90 38 cpi r25, 0x80 ; 128 + 37fa: 43 d2 rcall .+1158 ; 0x3c82 Endpoint_ClearStatusStage(); - 3bce: 09 f0 breq .+2 ; 0x3bd2 - 3bd0: 49 cf rjmp .-366 ; 0x3a64 - 3bd2: dd d2 rcall .+1466 ; 0x418e + 37fc: 42 d4 rcall .+2180 ; 0x4082 + 37fe: 6b cf rjmp .-298 ; 0x36d6 if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_GetConfiguration(); break; case REQ_SetConfiguration: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 3bd4: 80 91 20 23 lds r24, 0x2320 - 3bd8: 73 d2 rcall .+1254 ; 0x40c0 + 3800: 91 11 cpse r25, r1 + 3802: 69 cf rjmp .-302 ; 0x36d6 } static void USB_Device_SetConfiguration(void) { #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 3bda: 3b d2 rcall .+1142 ; 0x4052 - 3bdc: 32 d4 rcall .+2148 ; 0x4442 - 3bde: 42 cf rjmp .-380 ; 0x3a64 - 3be0: 90 91 27 23 lds r25, 0x2327 + 3804: 80 91 17 23 lds r24, 0x2317 + 3808: 82 30 cpi r24, 0x02 ; 2 + 380a: 08 f0 brcs .+2 ; 0x380e + 380c: 64 cf rjmp .-312 ; 0x36d6 if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) return; #endif #endif Endpoint_ClearSETUP(); - 3be4: 91 30 cpi r25, 0x01 ; 1 - 3be6: 09 f0 breq .+2 ; 0x3bea + 380e: d4 d2 rcall .+1448 ; 0x3db8 USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 3be8: 3d cf rjmp .-390 ; 0x3a64 - 3bea: 91 e0 ldi r25, 0x01 ; 1 - 3bec: 83 30 cpi r24, 0x03 ; 3 - 3bee: 09 f0 breq .+2 ; 0x3bf2 + 3810: 80 91 17 23 lds r24, 0x2317 + 3814: 80 93 10 23 sts 0x2310, r24 Endpoint_ClearStatusStage(); - 3bf0: 90 e0 ldi r25, 0x00 ; 0 - 3bf2: 90 93 22 23 sts 0x2322, r25 + 3818: 34 d4 rcall .+2152 ; 0x4082 if (USB_Device_ConfigurationNumber) - 3bf6: 79 cf rjmp .-270 ; 0x3aea - 3bf8: 10 91 21 23 lds r17, 0x2321 - 3bfc: 80 91 22 23 lds r24, 0x2322 + 381a: 80 91 10 23 lds r24, 0x2310 + 381e: 88 23 and r24, r24 + 3820: 09 f4 brne .+2 ; 0x3824 + 3822: 61 c0 rjmp .+194 ; 0x38e6 USB_DeviceState = DEVICE_STATE_Configured; - 3c00: 88 23 and r24, r24 - 3c02: 09 f4 brne .+2 ; 0x3c06 + 3824: 84 e0 ldi r24, 0x04 ; 4 + 3826: 80 93 14 23 sts 0x2314, r24 else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; EVENT_USB_Device_ConfigurationChanged(); - 3c04: c2 cf rjmp .-124 ; 0x3b8a - 3c06: 12 60 ori r17, 0x02 ; 2 - 3c08: c0 cf rjmp .-128 ; 0x3b8a + 382a: 0e 94 32 0b call 0x1664 ; 0x1664 + 382e: 53 cf rjmp .-346 ; 0x36d6 USB_Device_GetDescriptor(); } break; case REQ_GetConfiguration: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 3c0a: 83 e0 ldi r24, 0x03 ; 3 - 3c0c: 85 cf rjmp .-246 ; 0x3b18 - 3c0e: 83 e0 ldi r24, 0x03 ; 3 + 3830: 90 38 cpi r25, 0x80 ; 128 + 3832: 09 f0 breq .+2 ; 0x3836 + 3834: 50 cf rjmp .-352 ; 0x36d6 EVENT_USB_Device_ConfigurationChanged(); } static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); - 3c10: 8c 83 std Y+4, r24 ; 0x04 - 3c12: 8a e3 ldi r24, 0x3A ; 58 + 3836: c0 d2 rcall .+1408 ; 0x3db8 Endpoint_Write_8(USB_Device_ConfigurationNumber); - 3c14: 8b 83 std Y+3, r24 ; 0x03 - 3c16: 6f b7 in r22, 0x3f ; 63 - 3c18: f8 94 cli - 3c1a: a0 ec ldi r26, 0xC0 ; 192 + 3838: 80 91 10 23 lds r24, 0x2310 + 383c: 59 d2 rcall .+1202 ; 0x3cf0 Endpoint_ClearIN(); - 3c1c: b1 e0 ldi r27, 0x01 ; 1 - 3c1e: 82 e0 ldi r24, 0x02 ; 2 + 383e: 21 d2 rcall .+1090 ; 0x3c82 Endpoint_ClearStatusStage(); - 3c20: 1a 96 adiw r26, 0x0a ; 10 - 3c22: 8c 93 st X, r24 - 3c24: 1a 97 sbiw r26, 0x0a ; 10 + 3840: 20 d4 rcall .+2112 ; 0x4082 + 3842: 49 cf rjmp .-366 ; 0x36d6 { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) { #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) - 3c26: e8 e0 ldi r30, 0x08 ; 8 - 3c28: f0 e0 ldi r31, 0x00 ; 0 - 3c2a: 24 91 lpm r18, Z - 3c2c: 1a 96 adiw r26, 0x0a ; 10 - 3c2e: 1c 92 st X, r1 + 3844: 90 91 17 23 lds r25, 0x2317 + 3848: 91 30 cpi r25, 0x01 ; 1 + 384a: 09 f0 breq .+2 ; 0x384e + 384c: 44 cf rjmp .-376 ; 0x36d6 USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 3c30: de 01 movw r26, r28 - 3c32: 15 96 adiw r26, 0x05 ; 5 - 3c34: 81 e0 ldi r24, 0x01 ; 1 - 3c36: 90 e0 ldi r25, 0x00 ; 0 - 3c38: 78 e0 ldi r23, 0x08 ; 8 - 3c3a: 40 ec ldi r20, 0xC0 ; 192 - 3c3c: 51 e0 ldi r21, 0x01 ; 1 + 384e: 91 e0 ldi r25, 0x01 ; 1 + 3850: 83 30 cpi r24, 0x03 ; 3 + 3852: 09 f0 breq .+2 ; 0x3856 + 3854: 90 e0 ldi r25, 0x00 ; 0 + 3856: 90 93 12 23 sts 0x2312, r25 + 385a: 80 cf rjmp .-256 ; 0x375c Endpoint_ClearOUT(); } static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; - 3c3e: 12 e0 ldi r17, 0x02 ; 2 - 3c40: e2 2f mov r30, r18 + 385c: 10 91 11 23 lds r17, 0x2311 if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; #endif #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_Device_RemoteWakeupEnabled) - 3c42: ef 70 andi r30, 0x0F ; 15 - 3c44: 2e 2f mov r18, r30 - 3c46: 30 e0 ldi r19, 0x00 ; 0 - 3c48: ea 30 cpi r30, 0x0A ; 10 - 3c4a: a8 f0 brcs .+42 ; 0x3c76 + 3860: 80 91 12 23 lds r24, 0x2312 + 3864: 88 23 and r24, r24 + 3866: 09 f4 brne .+2 ; 0x386a + 3868: c3 cf rjmp .-122 ; 0x37f0 CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 3c4c: 29 5c subi r18, 0xC9 ; 201 - 3c4e: 3f 4f sbci r19, 0xFF ; 255 + 386a: 12 60 ori r17, 0x02 ; 2 + 386c: c1 cf rjmp .-126 ; 0x37f0 while (!(Endpoint_IsINReady())); USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 3c50: 2d 93 st X+, r18 - 3c52: 3d 93 st X+, r19 + 386e: 83 e0 ldi r24, 0x03 ; 3 + 3870: 89 cf rjmp .-238 ; 0x3784 { USB_Descriptor_Header_t Header; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; - 3c54: 8c 31 cpi r24, 0x1C ; 28 - 3c56: 91 05 cpc r25, r1 + 3872: 83 e0 ldi r24, 0x03 ; 3 + 3874: 8a 83 std Y+2, r24 ; 0x02 SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 3c58: 89 f0 breq .+34 ; 0x3c7c - 3c5a: fa 01 movw r30, r20 + 3876: 8a e3 ldi r24, 0x3A ; 58 + 3878: 89 83 std Y+1, r24 ; 0x01 #if (ARCH == ARCH_AVR8) return SREG; #elif (ARCH == ARCH_UC3) return __builtin_mfsr(AVR32_SR); #elif (ARCH == ARCH_XMEGA) return SREG; - 3c5c: 12 87 std Z+10, r17 ; 0x0a + 387a: 5f b7 in r21, 0x3f ; 63 #if (ARCH == ARCH_AVR8) cli(); #elif (ARCH == ARCH_UC3) __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); - 3c5e: e7 2f mov r30, r23 + 387c: f8 94 cli for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c60: f0 e0 ldi r31, 0x00 ; 0 - 3c62: 24 91 lpm r18, Z - 3c64: fa 01 movw r30, r20 - 3c66: 12 86 std Z+10, r1 ; 0x0a - 3c68: 80 ff sbrs r24, 0 - 3c6a: 03 c0 rjmp .+6 ; 0x3c72 + 387e: 82 e0 ldi r24, 0x02 ; 2 + 3880: 80 93 ca 01 sts 0x01CA, r24 SerialByte = pgm_read_byte(SigReadAddress); - 3c6c: 22 95 swap r18 - 3c6e: 2f 70 andi r18, 0x0F ; 15 - 3c70: 7f 5f subi r23, 0xFF ; 255 + 3884: e8 e0 ldi r30, 0x08 ; 8 + 3886: f0 e0 ldi r31, 0x00 ; 0 + 3888: e4 91 lpm r30, Z NVM.CMD = 0; - 3c72: 01 96 adiw r24, 0x01 ; 1 - 3c74: e5 cf rjmp .-54 ; 0x3c40 + 388a: 10 92 ca 01 sts 0x01CA, r1 -#if !defined(NO_DEVICE_REMOTE_WAKEUP) -bool USB_Device_RemoteWakeupEnabled; -#endif + USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); + 388e: de 01 movw r26, r28 + 3890: 13 96 adiw r26, 0x03 ; 3 + uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); + GlobalInterruptDisable(); -void USB_Device_ProcessControlRequest(void) - 3c76: 20 5d subi r18, 0xD0 ; 208 - 3c78: 3f 4f sbci r19, 0xFF ; 255 - 3c7a: ea cf rjmp .-44 ; 0x3c50 - 3c7c: 6f bf out 0x3f, r22 ; 63 + uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; + + for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) + 3892: 20 e0 ldi r18, 0x00 ; 0 static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) { uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; - 3c7e: 87 d2 rcall .+1294 ; 0x418e + 3894: 38 e0 ldi r19, 0x08 ; 8 for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c80: ce 01 movw r24, r28 - 3c82: 03 96 adiw r24, 0x03 ; 3 - 3c84: 6a e3 ldi r22, 0x3A ; 58 + 3896: 42 e0 ldi r20, 0x02 ; 2 { SerialByte >>= 4; SigReadAddress++; } SerialByte &= 0x0F; - 3c86: 70 e0 ldi r23, 0x00 ; 0 - 3c88: 8f d0 rcall .+286 ; 0x3da8 + 3898: ef 70 andi r30, 0x0F ; 15 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 3c8a: fc d1 rcall .+1016 ; 0x4084 - 3c8c: eb ce rjmp .-554 ; 0x3a64 - 3c8e: 80 91 c3 04 lds r24, 0x04C3 - 3c92: 88 23 and r24, r24 - 3c94: 21 f0 breq .+8 ; 0x3c9e - 3c96: 84 e0 ldi r24, 0x04 ; 4 - 3c98: 80 93 24 23 sts 0x2324, r24 + 389a: 8e 2f mov r24, r30 + 389c: 90 e0 ldi r25, 0x00 ; 0 + 389e: ea 30 cpi r30, 0x0A ; 10 + 38a0: b8 f0 brcs .+46 ; 0x38d0 + 38a2: c7 96 adiw r24, 0x37 ; 55 + 38a4: 8d 93 st X+, r24 + 38a6: 9d 93 st X+, r25 uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) - 3c9c: 94 cf rjmp .-216 ; 0x3bc6 - 3c9e: 81 e0 ldi r24, 0x01 ; 1 + 38a8: 2f 5f subi r18, 0xFF ; 255 + 38aa: 2c 31 cpi r18, 0x1C ; 28 + 38ac: 99 f0 breq .+38 ; 0x38d4 { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3ca0: fb cf rjmp .-10 ; 0x3c98 - 3ca2: 59 d2 rcall .+1202 ; 0x4156 + 38ae: 40 93 ca 01 sts 0x01CA, r20 SerialByte = pgm_read_byte(SigReadAddress); - 3ca4: 22 cf rjmp .-444 ; 0x3aea - -00003ca6 : -#include "Events.h" - -void USB_Event_Stub(void) -{ - -} - 3ca6: 08 95 ret - -00003ca8 : -#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) -volatile uint8_t USB_DeviceState; -#endif - -void USB_USBTask(void) -{ - 3ca8: cf 93 push r28 -} - -#if defined(USB_CAN_BE_DEVICE) -static void USB_DeviceTask(void) -{ - if (USB_DeviceState == DEVICE_STATE_Unattached) - 3caa: 80 91 24 23 lds r24, 0x2324 - 3cae: 88 23 and r24, r24 - 3cb0: 11 f4 brne .+4 ; 0x3cb6 - #elif defined(USB_CAN_BE_HOST) - USB_HostTask(); - #elif defined(USB_CAN_BE_DEVICE) - USB_DeviceTask(); - #endif -} - 3cb2: cf 91 pop r28 - 3cb4: 08 95 ret - * \return Index of the currently selected endpoint. - */ - static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint8_t Endpoint_GetCurrentEndpoint(void) - { - return USB_Endpoint_SelectedEndpoint; - 3cb6: c0 91 31 23 lds r28, 0x2331 - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - - uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3cba: 80 e0 ldi r24, 0x00 ; 0 - 3cbc: 10 d2 rcall .+1056 ; 0x40de - 3cbe: 93 d2 rcall .+1318 ; 0x41e6 - - if (Endpoint_IsSETUPReceived()) - 3cc0: 88 23 and r24, r24 - 3cc2: 21 f4 brne .+8 ; 0x3ccc - 3cc4: 8c 2f mov r24, r28 - 3cc6: 0b d2 rcall .+1046 ; 0x40de - USB_Device_ProcessControlRequest(); - - Endpoint_SelectEndpoint(PrevEndpoint); - 3cc8: cf 91 pop r28 - 3cca: 08 95 ret - 3ccc: 94 de rcall .-728 ; 0x39f6 - #elif defined(USB_CAN_BE_HOST) - USB_HostTask(); - #elif defined(USB_CAN_BE_DEVICE) - USB_DeviceTask(); - #endif -} - 3cce: fa cf rjmp .-12 ; 0x3cc4 - -00003cd0 : -#if defined(TEMPLATE_FUNC_NAME) - -uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, - uint16_t Length, - uint16_t* const BytesProcessed) -{ - 3cd0: af 92 push r10 - 3cd2: bf 92 push r11 - 3cd4: cf 92 push r12 - 3cd6: df 92 push r13 - 3cd8: ff 92 push r15 - 3cda: 0f 93 push r16 - 3cdc: 1f 93 push r17 - 3cde: cf 93 push r28 - 3ce0: df 93 push r29 - 3ce2: ec 01 movw r28, r24 - 3ce4: 8b 01 movw r16, r22 - 3ce6: 6a 01 movw r12, r20 - uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - uint16_t BytesInTransfer = 0; - uint8_t ErrorCode; - - if ((ErrorCode = Endpoint_WaitUntilReady())) - 3ce8: c2 d3 rcall .+1924 ; 0x446e - 3cea: f8 2e mov r15, r24 - 3cec: 88 23 and r24, r24 - 3cee: 61 f5 brne .+88 ; 0x3d48 - 3cf0: c1 14 cp r12, r1 - return ErrorCode; - - if (BytesProcessed != NULL) - 3cf2: d1 04 cpc r13, r1 - 3cf4: 39 f0 breq .+14 ; 0x3d04 - 3cf6: f6 01 movw r30, r12 - { - Length -= *BytesProcessed; - 3cf8: 80 81 ld r24, Z - 3cfa: 91 81 ldd r25, Z+1 ; 0x01 - 3cfc: 08 1b sub r16, r24 - 3cfe: 19 0b sbc r17, r25 - 3d00: c8 0f add r28, r24 - TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); - 3d02: d9 1f adc r29, r25 - 3d04: 01 15 cp r16, r1 - } - - while (Length) - 3d06: 11 05 cpc r17, r1 - 3d08: f9 f0 breq .+62 ; 0x3d48 - 3d0a: c1 14 cp r12, r1 - 3d0c: d1 04 cpc r13, r1 - 3d0e: 41 f0 breq .+16 ; 0x3d20 - 3d10: 26 c0 rjmp .+76 ; 0x3d5e - 3d12: 89 91 ld r24, Y+ - if ((ErrorCode = Endpoint_WaitUntilReady())) - return ErrorCode; - } - else - { - TEMPLATE_TRANSFER_BYTE(DataStream); - 3d14: d5 d1 rcall .+938 ; 0x40c0 - 3d16: 01 50 subi r16, 0x01 ; 1 - 3d18: 10 40 sbci r17, 0x00 ; 0 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - Length--; - 3d1a: 01 15 cp r16, r1 - 3d1c: 11 05 cpc r17, r1 - { - Length -= *BytesProcessed; - TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); - } - - while (Length) - 3d1e: a1 f0 breq .+40 ; 0x3d48 - 3d20: 80 91 2d 23 lds r24, 0x232D - * on its direction. - */ - static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline bool Endpoint_IsReadWriteAllowed(void) - { - return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); - 3d24: 90 91 2e 23 lds r25, 0x232E - 3d28: fc 01 movw r30, r24 - 3d2a: ef 5b subi r30, 0xBF ; 191 - 3d2c: ff 4f sbci r31, 0xFF ; 255 - 3d2e: 20 81 ld r18, Z - 3d30: 80 5c subi r24, 0xC0 ; 192 - 3d32: 9f 4f sbci r25, 0xFF ; 255 - 3d34: fc 01 movw r30, r24 - 3d36: 80 81 ld r24, Z - 3d38: 28 17 cp r18, r24 - 3d3a: 58 f3 brcs .-42 ; 0x3d12 - { - if (!(Endpoint_IsReadWriteAllowed())) - 3d3c: 8a d1 rcall .+788 ; 0x4052 - 3d3e: b4 df rcall .-152 ; 0x3ca8 - { - TEMPLATE_CLEAR_ENDPOINT(); - 3d40: 96 d3 rcall .+1836 ; 0x446e - 3d42: 88 23 and r24, r24 - - #if !defined(INTERRUPT_CONTROL_ENDPOINT) - USB_USBTask(); - 3d44: 51 f3 breq .-44 ; 0x3d1a - 3d46: f8 2e mov r15, r24 - { - *BytesProcessed += BytesInTransfer; - return ENDPOINT_RWSTREAM_IncompleteTransfer; - } - - if ((ErrorCode = Endpoint_WaitUntilReady())) - 3d48: 8f 2d mov r24, r15 - 3d4a: df 91 pop r29 - 3d4c: cf 91 pop r28 - 3d4e: 1f 91 pop r17 - 3d50: 0f 91 pop r16 - BytesInTransfer++; - } - } - - return ENDPOINT_RWSTREAM_NoError; -} - 3d52: ff 90 pop r15 - 3d54: df 90 pop r13 - 3d56: cf 90 pop r12 - 3d58: bf 90 pop r11 - 3d5a: af 90 pop r10 - 3d5c: 08 95 ret - 3d5e: aa 24 eor r10, r10 - 3d60: bb 24 eor r11, r11 - 3d62: 80 91 2d 23 lds r24, 0x232D - 3d66: 90 91 2e 23 lds r25, 0x232E - { - Length -= *BytesProcessed; - TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); - } - - while (Length) - 3d6a: fc 01 movw r30, r24 - 3d6c: ef 5b subi r30, 0xBF ; 191 - 3d6e: ff 4f sbci r31, 0xFF ; 255 - 3d70: 20 81 ld r18, Z - 3d72: fc 01 movw r30, r24 - 3d74: e0 5c subi r30, 0xC0 ; 192 - 3d76: ff 4f sbci r31, 0xFF ; 255 - 3d78: 80 81 ld r24, Z - 3d7a: 28 17 cp r18, r24 - 3d7c: 60 f0 brcs .+24 ; 0x3d96 - 3d7e: 69 d1 rcall .+722 ; 0x4052 - 3d80: 93 df rcall .-218 ; 0x3ca8 - 3d82: f6 01 movw r30, r12 - { - if (!(Endpoint_IsReadWriteAllowed())) - 3d84: 80 81 ld r24, Z - 3d86: 91 81 ldd r25, Z+1 ; 0x01 - { - TEMPLATE_CLEAR_ENDPOINT(); - 3d88: 8a 0d add r24, r10 - 3d8a: 9b 1d adc r25, r11 - - #if !defined(INTERRUPT_CONTROL_ENDPOINT) - USB_USBTask(); - 3d8c: 80 83 st Z, r24 - 3d8e: 91 83 std Z+1, r25 ; 0x01 - #endif - - if (BytesProcessed != NULL) - { - *BytesProcessed += BytesInTransfer; - 3d90: 25 e0 ldi r18, 0x05 ; 5 - 3d92: f2 2e mov r15, r18 - 3d94: d9 cf rjmp .-78 ; 0x3d48 - 3d96: 89 91 ld r24, Y+ - 3d98: 93 d1 rcall .+806 ; 0x40c0 - 3d9a: 08 94 sec - 3d9c: a1 1c adc r10, r1 - return ENDPOINT_RWSTREAM_IncompleteTransfer; - 3d9e: b1 1c adc r11, r1 - 3da0: 0a 15 cp r16, r10 - 3da2: 1b 05 cpc r17, r11 - if ((ErrorCode = Endpoint_WaitUntilReady())) - return ErrorCode; - } - else - { - TEMPLATE_TRANSFER_BYTE(DataStream); - 3da4: f1 f6 brne .-68 ; 0x3d62 - 3da6: d0 cf rjmp .-96 ; 0x3d48 - -00003da8 : - 3da8: cf 92 push r12 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - Length--; - BytesInTransfer++; - 3daa: df 92 push r13 - 3dac: ef 92 push r14 - 3dae: ff 92 push r15 - { - Length -= *BytesProcessed; - TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); - } - - while (Length) - 3db0: 0f 93 push r16 - 3db2: 1f 93 push r17 - 3db4: cf 93 push r28 - 3db6: df 93 push r29 - -#if defined(TEMPLATE_FUNC_NAME) - -uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, - uint16_t Length) -{ - 3db8: d8 2e mov r13, r24 - 3dba: c9 2e mov r12, r25 - 3dbc: eb 01 movw r28, r22 - uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - bool LastPacketFull = false; - - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 3dbe: 80 91 31 23 lds r24, 0x2331 - 3dc2: 80 68 ori r24, 0x80 ; 128 - 3dc4: 8c d1 rcall .+792 ; 0x40de - 3dc6: e0 90 2b 23 lds r14, 0x232B - - if (Length > USB_ControlRequest.wLength) - 3dca: f0 90 2c 23 lds r15, 0x232C - 3dce: ec 16 cp r14, r28 - 3dd0: fd 06 cpc r15, r29 - 3dd2: 20 f0 brcs .+8 ; 0x3ddc - 3dd4: 20 97 sbiw r28, 0x00 ; 0 - Length = USB_ControlRequest.wLength; - else if (!(Length)) - 3dd6: 09 f4 brne .+2 ; 0x3dda - 3dd8: 86 c0 rjmp .+268 ; 0x3ee6 - 3dda: 7e 01 movw r14, r28 - 3ddc: 00 e0 ldi r16, 0x00 ; 0 - 3dde: e1 14 cp r14, r1 - Length--; - BytesInEndpoint++; - } - - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - Endpoint_ClearIN(); - 3de0: f1 04 cpc r15, r1 - 3de2: 09 f0 breq .+2 ; 0x3de6 - 3de4: 4c c0 rjmp .+152 ; 0x3e7e - 3de6: 00 23 and r16, r16 - 3de8: 09 f4 brne .+2 ; 0x3dec - 3dea: 5f c0 rjmp .+190 ; 0x3eaa - 3dec: 80 91 24 23 lds r24, 0x2324 - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3df0: 88 23 and r24, r24 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3df2: 09 f4 brne .+2 ; 0x3df6 - 3df4: 58 c0 rjmp .+176 ; 0x3ea6 - 3df6: 85 30 cpi r24, 0x05 ; 5 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3df8: 09 f4 brne .+2 ; 0x3dfc - 3dfa: 60 c0 rjmp .+192 ; 0x3ebc - 3dfc: f4 d1 rcall .+1000 ; 0x41e6 - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3dfe: 88 23 and r24, r24 - 3e00: 09 f0 breq .+2 ; 0x3e04 - 3e02: 6f c0 rjmp .+222 ; 0x3ee2 - 3e04: 08 d2 rcall .+1040 ; 0x4216 - 3e06: 88 23 and r24, r24 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 3e08: 09 f0 breq .+2 ; 0x3e0c - 3e0a: 4f c0 rjmp .+158 ; 0x3eaa - 3e0c: 1c d2 rcall .+1080 ; 0x4246 - 3e0e: 88 23 and r24, r24 - 3e10: 69 f3 breq .-38 ; 0x3dec - break; - - if (Endpoint_IsINReady()) - 3e12: 80 91 31 23 lds r24, 0x2331 - 3e16: 87 fd sbrc r24, 7 - 3e18: 5b c0 rjmp .+182 ; 0x3ed0 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 3e1a: 80 91 2d 23 lds r24, 0x232D - 3e1e: 90 91 2e 23 lds r25, 0x232E - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 3e22: fc 01 movw r30, r24 - 3e24: e0 5c subi r30, 0xC0 ; 192 - 3e26: ff 4f sbci r31, 0xFF ; 255 - 3e28: c0 81 ld r28, Z - 3e2a: 8f 5b subi r24, 0xBF ; 191 - 3e2c: 9f 4f sbci r25, 0xFF ; 255 - 3e2e: fc 01 movw r30, r24 - 3e30: 80 81 ld r24, Z - 3e32: d0 e0 ldi r29, 0x00 ; 0 - 3e34: c8 1b sub r28, r24 - 3e36: d1 09 sbc r29, r1 - 3e38: e1 14 cp r14, r1 - 3e3a: f1 04 cpc r15, r1 - 3e3c: b1 f0 breq .+44 ; 0x3e6a - 3e3e: c8 30 cpi r28, 0x08 ; 8 - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3e40: d1 05 cpc r29, r1 - 3e42: 98 f4 brcc .+38 ; 0x3e6a - 3e44: 0d 2d mov r16, r13 - 3e46: 1c 2d mov r17, r12 - 3e48: 03 c0 rjmp .+6 ; 0x3e50 - 3e4a: c8 30 cpi r28, 0x08 ; 8 - 3e4c: d1 05 cpc r29, r1 - 3e4e: 69 f0 breq .+26 ; 0x3e6a - 3e50: f8 01 movw r30, r16 - 3e52: 81 91 ld r24, Z+ - 3e54: 8f 01 movw r16, r30 - 3e56: 34 d1 rcall .+616 ; 0x40c0 - { - TEMPLATE_TRANSFER_BYTE(DataStream); - 3e58: d0 2e mov r13, r16 - 3e5a: c1 2e mov r12, r17 - 3e5c: 08 94 sec - 3e5e: e1 08 sbc r14, r1 - 3e60: f1 08 sbc r15, r1 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - 3e62: 21 96 adiw r28, 0x01 ; 1 - 3e64: e1 14 cp r14, r1 - Length--; - 3e66: f1 04 cpc r15, r1 - 3e68: 81 f7 brne .-32 ; 0x3e4a - 3e6a: 01 e0 ldi r16, 0x01 ; 1 - BytesInEndpoint++; - 3e6c: c8 30 cpi r28, 0x08 ; 8 - - if (Endpoint_IsINReady()) - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3e6e: d1 05 cpc r29, r1 - 3e70: 09 f0 breq .+2 ; 0x3e74 - 3e72: 00 e0 ldi r16, 0x00 ; 0 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - Length--; - BytesInEndpoint++; - } - - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 3e74: ee d0 rcall .+476 ; 0x4052 - 3e76: e1 14 cp r14, r1 - 3e78: f1 04 cpc r15, r1 - 3e7a: 09 f4 brne .+2 ; 0x3e7e - 3e7c: b4 cf rjmp .-152 ; 0x3de6 - Endpoint_ClearIN(); - 3e7e: 80 91 24 23 lds r24, 0x2324 - 3e82: 88 23 and r24, r24 - 3e84: 81 f0 breq .+32 ; 0x3ea6 - 3e86: 85 30 cpi r24, 0x05 ; 5 - 3e88: c9 f0 breq .+50 ; 0x3ebc - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3e8a: ad d1 rcall .+858 ; 0x41e6 - 3e8c: 88 23 and r24, r24 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3e8e: 49 f5 brne .+82 ; 0x3ee2 - 3e90: c2 d1 rcall .+900 ; 0x4216 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3e92: 88 23 and r24, r24 - 3e94: 51 f4 brne .+20 ; 0x3eaa - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3e96: d7 d1 rcall .+942 ; 0x4246 - 3e98: 88 23 and r24, r24 - 3e9a: 09 f0 breq .+2 ; 0x3e9e - 3e9c: ba cf rjmp .-140 ; 0x3e12 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 3e9e: 80 91 24 23 lds r24, 0x2324 - 3ea2: 88 23 and r24, r24 - 3ea4: 81 f7 brne .-32 ; 0x3e86 - break; - - if (Endpoint_IsINReady()) - 3ea6: 82 e0 ldi r24, 0x02 ; 2 - 3ea8: 0a c0 rjmp .+20 ; 0x3ebe - 3eaa: b5 d1 rcall .+874 ; 0x4216 - 3eac: 88 23 and r24, r24 - 3eae: f9 f4 brne .+62 ; 0x3eee - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3eb0: 80 91 24 23 lds r24, 0x2324 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3eb4: 88 23 and r24, r24 - 3eb6: b9 f3 breq .-18 ; 0x3ea6 - while (!(Endpoint_IsOUTReceived())) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 3eb8: 85 30 cpi r24, 0x05 ; 5 - 3eba: b9 f7 brne .-18 ; 0x3eaa - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - Endpoint_ClearIN(); - } - } - - while (!(Endpoint_IsOUTReceived())) - 3ebc: 83 e0 ldi r24, 0x03 ; 3 - 3ebe: df 91 pop r29 - 3ec0: cf 91 pop r28 - 3ec2: 1f 91 pop r17 - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3ec4: 0f 91 pop r16 - 3ec6: ff 90 pop r15 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3ec8: ef 90 pop r14 - 3eca: df 90 pop r13 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3ecc: cf 90 pop r12 - 3ece: 08 95 ret - return ENDPOINT_RWCSTREAM_BusSuspended; - 3ed0: e0 91 2d 23 lds r30, 0x232D - } - - return ENDPOINT_RWCSTREAM_NoError; -} - 3ed4: f0 91 2e 23 lds r31, 0x232E - 3ed8: ef 5b subi r30, 0xBF ; 191 - 3eda: ff 4f sbci r31, 0xFF ; 255 - 3edc: c0 81 ld r28, Z - 3ede: d0 e0 ldi r29, 0x00 ; 0 - 3ee0: ab cf rjmp .-170 ; 0x3e38 - 3ee2: 81 e0 ldi r24, 0x01 ; 1 - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - return USB_Endpoint_SelectedFIFO->Position; - 3ee4: ec cf rjmp .-40 ; 0x3ebe - 3ee6: b5 d0 rcall .+362 ; 0x4052 - 3ee8: ee 24 eor r14, r14 - 3eea: ff 24 eor r15, r15 - 3eec: 77 cf rjmp .-274 ; 0x3ddc - 3eee: 80 e0 ldi r24, 0x00 ; 0 - 3ef0: e6 cf rjmp .-52 ; 0x3ebe - -00003ef2 : - 3ef2: cf 92 push r12 - 3ef4: df 92 push r13 - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - return ENDPOINT_RWCSTREAM_HostAborted; - 3ef6: ef 92 push r14 - 3ef8: ff 92 push r15 - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - - if (Length > USB_ControlRequest.wLength) - Length = USB_ControlRequest.wLength; - else if (!(Length)) - Endpoint_ClearIN(); - 3efa: 0f 93 push r16 - 3efc: 1f 93 push r17 - 3efe: cf 93 push r28 - 3f00: df 93 push r29 - 3f02: 0f 92 push r0 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - } - - return ENDPOINT_RWCSTREAM_NoError; - 3f04: cd b7 in r28, 0x3d ; 61 - 3f06: de b7 in r29, 0x3e ; 62 - -#if defined(TEMPLATE_FUNC_NAME) - -uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, - uint16_t Length) -{ - 3f08: d8 2e mov r13, r24 - 3f0a: c9 2e mov r12, r25 - 3f0c: 7b 01 movw r14, r22 - uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - bool LastPacketFull = false; - - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 3f0e: 80 91 31 23 lds r24, 0x2331 - 3f12: 80 68 ori r24, 0x80 ; 128 - 3f14: e4 d0 rcall .+456 ; 0x40de - 3f16: 00 91 2b 23 lds r16, 0x232B - - if (Length > USB_ControlRequest.wLength) - 3f1a: 10 91 2c 23 lds r17, 0x232C - 3f1e: 0e 15 cp r16, r14 - 3f20: 1f 05 cpc r17, r15 - 3f22: 28 f0 brcs .+10 ; 0x3f2e - 3f24: e1 14 cp r14, r1 - Length = USB_ControlRequest.wLength; - else if (!(Length)) - 3f26: f1 04 cpc r15, r1 - 3f28: 09 f4 brne .+2 ; 0x3f2c - 3f2a: 8d c0 rjmp .+282 ; 0x4046 - 3f2c: 87 01 movw r16, r14 - 3f2e: ed 2c mov r14, r13 - 3f30: fc 2c mov r15, r12 - 3f32: 80 e0 ldi r24, 0x00 ; 0 - 3f34: 01 15 cp r16, r1 - Length--; - BytesInEndpoint++; - } - - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - Endpoint_ClearIN(); - 3f36: 11 05 cpc r17, r1 - 3f38: 09 f0 breq .+2 ; 0x3f3c - 3f3a: 50 c0 rjmp .+160 ; 0x3fdc - 3f3c: 88 23 and r24, r24 - 3f3e: 09 f4 brne .+2 ; 0x3f42 - 3f40: 63 c0 rjmp .+198 ; 0x4008 - 3f42: 80 91 24 23 lds r24, 0x2324 - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3f46: 88 23 and r24, r24 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3f48: 09 f4 brne .+2 ; 0x3f4c - 3f4a: 5c c0 rjmp .+184 ; 0x4004 - 3f4c: 85 30 cpi r24, 0x05 ; 5 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3f4e: 09 f4 brne .+2 ; 0x3f52 - 3f50: 64 c0 rjmp .+200 ; 0x401a - 3f52: 49 d1 rcall .+658 ; 0x41e6 - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3f54: 88 23 and r24, r24 - 3f56: 09 f0 breq .+2 ; 0x3f5a - 3f58: 74 c0 rjmp .+232 ; 0x4042 - 3f5a: 5d d1 rcall .+698 ; 0x4216 - 3f5c: 88 23 and r24, r24 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 3f5e: 09 f0 breq .+2 ; 0x3f62 - 3f60: 53 c0 rjmp .+166 ; 0x4008 - 3f62: 71 d1 rcall .+738 ; 0x4246 - 3f64: 88 23 and r24, r24 - 3f66: 69 f3 breq .-38 ; 0x3f42 - break; - - if (Endpoint_IsINReady()) - 3f68: 80 91 31 23 lds r24, 0x2331 - 3f6c: 87 fd sbrc r24, 7 - 3f6e: 60 c0 rjmp .+192 ; 0x4030 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 3f70: 80 91 2d 23 lds r24, 0x232D - 3f74: 90 91 2e 23 lds r25, 0x232E - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 3f78: fc 01 movw r30, r24 - 3f7a: e0 5c subi r30, 0xC0 ; 192 - 3f7c: ff 4f sbci r31, 0xFF ; 255 - 3f7e: c0 80 ld r12, Z - 3f80: 8f 5b subi r24, 0xBF ; 191 - 3f82: 9f 4f sbci r25, 0xFF ; 255 - 3f84: fc 01 movw r30, r24 - 3f86: 80 81 ld r24, Z - 3f88: dd 24 eor r13, r13 - 3f8a: c8 1a sub r12, r24 - 3f8c: d1 08 sbc r13, r1 - 3f8e: 01 15 cp r16, r1 - 3f90: 11 05 cpc r17, r1 - 3f92: b9 f0 breq .+46 ; 0x3fc2 - 3f94: 88 e0 ldi r24, 0x08 ; 8 - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3f96: c8 16 cp r12, r24 - 3f98: d1 04 cpc r13, r1 - 3f9a: 28 f0 brcs .+10 ; 0x3fa6 - 3f9c: 12 c0 rjmp .+36 ; 0x3fc2 - 3f9e: f8 e0 ldi r31, 0x08 ; 8 - 3fa0: cf 16 cp r12, r31 - 3fa2: d1 04 cpc r13, r1 - 3fa4: 71 f0 breq .+28 ; 0x3fc2 - 3fa6: f7 01 movw r30, r14 - 3fa8: 84 91 lpm r24, Z - 3faa: 8a d0 rcall .+276 ; 0x40c0 - 3fac: 08 94 sec - { - TEMPLATE_TRANSFER_BYTE(DataStream); - 3fae: e1 1c adc r14, r1 - 3fb0: f1 1c adc r15, r1 - 3fb2: 01 50 subi r16, 0x01 ; 1 - 3fb4: 10 40 sbci r17, 0x00 ; 0 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - 3fb6: 08 94 sec - 3fb8: c1 1c adc r12, r1 - 3fba: d1 1c adc r13, r1 - Length--; - 3fbc: 01 15 cp r16, r1 - 3fbe: 11 05 cpc r17, r1 - BytesInEndpoint++; - 3fc0: 71 f7 brne .-36 ; 0x3f9e - 3fc2: 81 e0 ldi r24, 0x01 ; 1 - 3fc4: 98 e0 ldi r25, 0x08 ; 8 - - if (Endpoint_IsINReady()) - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3fc6: c9 16 cp r12, r25 - 3fc8: d1 04 cpc r13, r1 - 3fca: 09 f0 breq .+2 ; 0x3fce - TEMPLATE_BUFFER_MOVE(DataStream, 1); - Length--; - BytesInEndpoint++; - } - - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 3fcc: 80 e0 ldi r24, 0x00 ; 0 - 3fce: 89 83 std Y+1, r24 ; 0x01 - 3fd0: 40 d0 rcall .+128 ; 0x4052 - 3fd2: 89 81 ldd r24, Y+1 ; 0x01 - 3fd4: 01 15 cp r16, r1 - 3fd6: 11 05 cpc r17, r1 - Endpoint_ClearIN(); - 3fd8: 09 f4 brne .+2 ; 0x3fdc - 3fda: b0 cf rjmp .-160 ; 0x3f3c - 3fdc: 80 91 24 23 lds r24, 0x2324 - 3fe0: 88 23 and r24, r24 - 3fe2: 81 f0 breq .+32 ; 0x4004 - 3fe4: 85 30 cpi r24, 0x05 ; 5 - 3fe6: c9 f0 breq .+50 ; 0x401a - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3fe8: fe d0 rcall .+508 ; 0x41e6 - 3fea: 88 23 and r24, r24 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3fec: 51 f5 brne .+84 ; 0x4042 - 3fee: 13 d1 rcall .+550 ; 0x4216 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3ff0: 88 23 and r24, r24 - 3ff2: 51 f4 brne .+20 ; 0x4008 - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3ff4: 28 d1 rcall .+592 ; 0x4246 - 3ff6: 88 23 and r24, r24 - 3ff8: 09 f0 breq .+2 ; 0x3ffc - 3ffa: b6 cf rjmp .-148 ; 0x3f68 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 3ffc: 80 91 24 23 lds r24, 0x2324 - 4000: 88 23 and r24, r24 - 4002: 81 f7 brne .-32 ; 0x3fe4 - break; - - if (Endpoint_IsINReady()) - 4004: 82 e0 ldi r24, 0x02 ; 2 - 4006: 0a c0 rjmp .+20 ; 0x401c - 4008: 06 d1 rcall .+524 ; 0x4216 - 400a: 88 23 and r24, r24 - 400c: 01 f5 brne .+64 ; 0x404e - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 400e: 80 91 24 23 lds r24, 0x2324 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4012: 88 23 and r24, r24 - 4014: b9 f3 breq .-18 ; 0x4004 - while (!(Endpoint_IsOUTReceived())) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 4016: 85 30 cpi r24, 0x05 ; 5 - 4018: b9 f7 brne .-18 ; 0x4008 - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - Endpoint_ClearIN(); - } - } - - while (!(Endpoint_IsOUTReceived())) - 401a: 83 e0 ldi r24, 0x03 ; 3 - 401c: 0f 90 pop r0 - 401e: df 91 pop r29 - 4020: cf 91 pop r28 - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4022: 1f 91 pop r17 - 4024: 0f 91 pop r16 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4026: ff 90 pop r15 - 4028: ef 90 pop r14 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 402a: df 90 pop r13 - 402c: cf 90 pop r12 - return ENDPOINT_RWCSTREAM_BusSuspended; - 402e: 08 95 ret - } - - return ENDPOINT_RWCSTREAM_NoError; -} - 4030: e0 91 2d 23 lds r30, 0x232D - 4034: f0 91 2e 23 lds r31, 0x232E - 4038: ef 5b subi r30, 0xBF ; 191 - 403a: ff 4f sbci r31, 0xFF ; 255 - 403c: c0 80 ld r12, Z - 403e: dd 24 eor r13, r13 - 4040: a6 cf rjmp .-180 ; 0x3f8e - 4042: 81 e0 ldi r24, 0x01 ; 1 - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - return USB_Endpoint_SelectedFIFO->Position; - 4044: eb cf rjmp .-42 ; 0x401c - 4046: 05 d0 rcall .+10 ; 0x4052 - 4048: 00 e0 ldi r16, 0x00 ; 0 - 404a: 10 e0 ldi r17, 0x00 ; 0 - 404c: 70 cf rjmp .-288 ; 0x3f2e - 404e: 80 e0 ldi r24, 0x00 ; 0 - 4050: e5 cf rjmp .-54 ; 0x401c - -00004052 : - USB_Endpoint_SelectedFIFO->Position = 0; -} - -void Endpoint_ClearIN(void) -{ - USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; - 4052: e0 91 2f 23 lds r30, 0x232F - 4056: f0 91 30 23 lds r31, 0x2330 - 405a: a0 91 2d 23 lds r26, 0x232D - 405e: b0 91 2e 23 lds r27, 0x232E - 4062: af 5b subi r26, 0xBF ; 191 - 4064: bf 4f sbci r27, 0xFF ; 255 - 4066: 8c 91 ld r24, X - 4068: 90 e0 ldi r25, 0x00 ; 0 - 406a: 82 83 std Z+2, r24 ; 0x02 - 406c: 93 83 std Z+3, r25 ; 0x03 - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 406e: 80 81 ld r24, Z - 4070: 8d 79 andi r24, 0x9D ; 157 - 4072: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 4074: e0 91 2d 23 lds r30, 0x232D - 4078: f0 91 2e 23 lds r31, 0x232E - 407c: ef 5b subi r30, 0xBF ; 191 - 407e: ff 4f sbci r31, 0xFF ; 255 - 4080: 10 82 st Z, r1 -} - 4082: 08 95 ret - -00004084 : - -void Endpoint_ClearOUT(void) -{ - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 4084: e0 91 2f 23 lds r30, 0x232F - 4088: f0 91 30 23 lds r31, 0x2330 - 408c: 80 81 ld r24, Z - 408e: 8d 79 andi r24, 0x9D ; 157 - 4090: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 4092: e0 91 2d 23 lds r30, 0x232D - 4096: f0 91 2e 23 lds r31, 0x232E - 409a: ef 5b subi r30, 0xBF ; 191 - 409c: ff 4f sbci r31, 0xFF ; 255 - 409e: 10 82 st Z, r1 -} - 40a0: 08 95 ret - -000040a2 : - } -} - -uint8_t Endpoint_Read_8(void) -{ - return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; - 40a2: 80 91 2d 23 lds r24, 0x232D - 40a6: 90 91 2e 23 lds r25, 0x232E - 40aa: fc 01 movw r30, r24 - 40ac: ef 5b subi r30, 0xBF ; 191 - 40ae: ff 4f sbci r31, 0xFF ; 255 - 40b0: 20 81 ld r18, Z - 40b2: 82 0f add r24, r18 - 40b4: 91 1d adc r25, r1 - 40b6: dc 01 movw r26, r24 - 40b8: 8c 91 ld r24, X - 40ba: 2f 5f subi r18, 0xFF ; 255 - 40bc: 20 83 st Z, r18 -} - 40be: 08 95 ret - -000040c0 : - -void Endpoint_Write_8(const uint8_t Data) -{ - USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; - 40c0: 20 91 2d 23 lds r18, 0x232D - 40c4: 30 91 2e 23 lds r19, 0x232E - 40c8: f9 01 movw r30, r18 - 40ca: ef 5b subi r30, 0xBF ; 191 - 40cc: ff 4f sbci r31, 0xFF ; 255 - 40ce: 90 81 ld r25, Z - 40d0: 29 0f add r18, r25 - 40d2: 31 1d adc r19, r1 - 40d4: d9 01 movw r26, r18 - 40d6: 8c 93 st X, r24 - 40d8: 9f 5f subi r25, 0xFF ; 255 - 40da: 90 83 st Z, r25 -} - 40dc: 08 95 ret - -000040de : - -void Endpoint_SelectEndpoint(const uint8_t Address) -{ - uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); - 40de: 28 2f mov r18, r24 - 40e0: 2f 70 andi r18, 0x0F ; 15 - - USB_Endpoint_SelectedEndpoint = Address; - 40e2: 80 93 31 23 sts 0x2331, r24 - - Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; - 40e6: 30 e0 ldi r19, 0x00 ; 0 - 40e8: 64 e8 ldi r22, 0x84 ; 132 - 40ea: 70 e0 ldi r23, 0x00 ; 0 - 40ec: 26 9f mul r18, r22 - 40ee: a0 01 movw r20, r0 - 40f0: 27 9f mul r18, r23 - 40f2: 50 0d add r21, r0 - 40f4: 36 9f mul r19, r22 - 40f6: 50 0d add r21, r0 - 40f8: 11 24 eor r1, r1 - 40fa: 4e 5c subi r20, 0xCE ; 206 - 40fc: 5c 4d sbci r21, 0xDC ; 220 - USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; - 40fe: 60 91 c6 04 lds r22, 0x04C6 - 4102: 70 91 c7 04 lds r23, 0x04C7 - - if (Address & ENDPOINT_DIR_IN) - 4106: 87 fd sbrc r24, 7 - 4108: 11 c0 rjmp .+34 ; 0x412c - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - } - else - { - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; - 410a: 40 93 2d 23 sts 0x232D, r20 - 410e: 50 93 2e 23 sts 0x232E, r21 - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; - 4112: 22 95 swap r18 - 4114: 32 95 swap r19 - 4116: 30 7f andi r19, 0xF0 ; 240 - 4118: 32 27 eor r19, r18 - 411a: 20 7f andi r18, 0xF0 ; 240 - 411c: 32 27 eor r19, r18 - 411e: 26 0f add r18, r22 - 4120: 37 1f adc r19, r23 - 4122: 20 93 2f 23 sts 0x232F, r18 - 4126: 30 93 30 23 sts 0x2330, r19 - 412a: 08 95 ret - Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; - USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; - - if (Address & ENDPOINT_DIR_IN) - { - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; - 412c: 4e 5b subi r20, 0xBE ; 190 - 412e: 5f 4f sbci r21, 0xFF ; 255 - 4130: 40 93 2d 23 sts 0x232D, r20 - 4134: 50 93 2e 23 sts 0x232E, r21 - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - 4138: 22 95 swap r18 - 413a: 32 95 swap r19 - 413c: 30 7f andi r19, 0xF0 ; 240 - 413e: 32 27 eor r19, r18 - 4140: 20 7f andi r18, 0xF0 ; 240 - 4142: 32 27 eor r19, r18 - 4144: 28 5f subi r18, 0xF8 ; 248 - 4146: 3f 4f sbci r19, 0xFF ; 255 - 4148: 26 0f add r18, r22 - 414a: 37 1f adc r19, r23 - 414c: 20 93 2f 23 sts 0x232F, r18 - 4150: 30 93 30 23 sts 0x2330, r19 - 4154: 08 95 ret - -00004156 : - USB_Endpoint_SelectedFIFO->Position = 0; -} - -void Endpoint_StallTransaction(void) -{ - USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 4156: e0 91 2f 23 lds r30, 0x232F - 415a: f0 91 30 23 lds r31, 0x2330 - 415e: 81 81 ldd r24, Z+1 ; 0x01 - 4160: 84 60 ori r24, 0x04 ; 4 - 4162: 81 83 std Z+1, r24 ; 0x01 - - if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) - 4164: e0 91 2f 23 lds r30, 0x232F - 4168: f0 91 30 23 lds r31, 0x2330 - 416c: 81 81 ldd r24, Z+1 ; 0x01 - 416e: 80 7c andi r24, 0xC0 ; 192 - 4170: 80 34 cpi r24, 0x40 ; 64 - 4172: 09 f0 breq .+2 ; 0x4176 - 4174: 08 95 ret - { - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); - 4176: 80 91 31 23 lds r24, 0x2331 - 417a: 80 58 subi r24, 0x80 ; 128 - 417c: b0 df rcall .-160 ; 0x40de - 417e: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 4182: f0 91 30 23 lds r31, 0x2330 - 4186: 81 81 ldd r24, Z+1 ; 0x01 - 4188: 84 60 ori r24, 0x04 ; 4 - 418a: 81 83 std Z+1, r24 ; 0x01 - 418c: 08 95 ret - -0000418e : - 418e: 80 91 31 23 lds r24, 0x2331 - return false; -} - -void Endpoint_ClearSETUP(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 4192: 8f 77 andi r24, 0x7F ; 127 - 4194: a4 df rcall .-184 ; 0x40de - 4196: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 419a: f0 91 30 23 lds r31, 0x2330 - 419e: 80 81 ld r24, Z - 41a0: 8d 78 andi r24, 0x8D ; 141 - 41a2: 80 83 st Z, r24 - 41a4: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 41a8: f0 91 30 23 lds r31, 0x2330 - 41ac: 80 81 ld r24, Z - 41ae: 81 60 ori r24, 0x01 ; 1 - 41b0: 80 83 st Z, r24 - 41b2: e0 91 2d 23 lds r30, 0x232D - USB_Endpoint_SelectedFIFO->Position = 0; - 41b6: f0 91 2e 23 lds r31, 0x232E - 41ba: ef 5b subi r30, 0xBF ; 191 - 41bc: ff 4f sbci r31, 0xFF ; 255 - 41be: 10 82 st Z, r1 - 41c0: 80 91 31 23 lds r24, 0x2331 - - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 41c4: 80 68 ori r24, 0x80 ; 128 - 41c6: 8b df rcall .-234 ; 0x40de - 41c8: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 41cc: f0 91 30 23 lds r31, 0x2330 - 41d0: 80 81 ld r24, Z - 41d2: 81 60 ori r24, 0x01 ; 1 - 41d4: 80 83 st Z, r24 - 41d6: e0 91 2d 23 lds r30, 0x232D - USB_Endpoint_SelectedFIFO->Position = 0; - 41da: f0 91 2e 23 lds r31, 0x232E - 41de: ef 5b subi r30, 0xBF ; 191 - 41e0: ff 4f sbci r31, 0xFF ; 255 - 41e2: 10 82 st Z, r1 - 41e4: 08 95 ret - -000041e6 : - 41e6: 80 91 31 23 lds r24, 0x2331 - return false; -} - -bool Endpoint_IsSETUPReceived(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 41ea: 8f 77 andi r24, 0x7F ; 127 - 41ec: 78 df rcall .-272 ; 0x40de - 41ee: e0 91 2f 23 lds r30, 0x232F - - if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) - 41f2: f0 91 30 23 lds r31, 0x2330 - 41f6: 80 81 ld r24, Z - 41f8: 84 ff sbrs r24, 4 - 41fa: 0b c0 rjmp .+22 ; 0x4212 - 41fc: a0 91 2d 23 lds r26, 0x232D - { - USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 4200: b0 91 2e 23 lds r27, 0x232E - 4204: 82 81 ldd r24, Z+2 ; 0x02 - 4206: 93 81 ldd r25, Z+3 ; 0x03 - 4208: a0 5c subi r26, 0xC0 ; 192 - 420a: bf 4f sbci r27, 0xFF ; 255 - 420c: 8c 93 st X, r24 - 420e: 81 e0 ldi r24, 0x01 ; 1 - return true; - 4210: 08 95 ret - 4212: 80 e0 ldi r24, 0x00 ; 0 - } - - return false; - 4214: 08 95 ret - -00004216 : -} - 4216: 80 91 31 23 lds r24, 0x2331 - return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); -} - -bool Endpoint_IsOUTReceived(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 421a: 8f 77 andi r24, 0x7F ; 127 - 421c: 60 df rcall .-320 ; 0x40de - 421e: e0 91 2f 23 lds r30, 0x232F - - if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) - 4222: f0 91 30 23 lds r31, 0x2330 - 4226: 80 81 ld r24, Z - 4228: 85 ff sbrs r24, 5 - 422a: 0b c0 rjmp .+22 ; 0x4242 - 422c: a0 91 2d 23 lds r26, 0x232D - { - USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 4230: b0 91 2e 23 lds r27, 0x232E - 4234: 82 81 ldd r24, Z+2 ; 0x02 - 4236: 93 81 ldd r25, Z+3 ; 0x03 - 4238: a0 5c subi r26, 0xC0 ; 192 - 423a: bf 4f sbci r27, 0xFF ; 255 - 423c: 8c 93 st X, r24 - 423e: 81 e0 ldi r24, 0x01 ; 1 - return true; - 4240: 08 95 ret - 4242: 80 e0 ldi r24, 0x00 ; 0 - } - - return false; - 4244: 08 95 ret - -00004246 : -} - 4246: 80 91 31 23 lds r24, 0x2331 -volatile USB_EP_t* USB_Endpoint_SelectedHandle; -volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; - -bool Endpoint_IsINReady(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 424a: 80 68 ori r24, 0x80 ; 128 - 424c: 48 df rcall .-368 ; 0x40de - 424e: e0 91 2f 23 lds r30, 0x232F - - return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); - 4252: f0 91 30 23 lds r31, 0x2330 - 4256: 90 81 ld r25, Z - 4258: 81 e0 ldi r24, 0x01 ; 1 - 425a: 91 ff sbrs r25, 1 - 425c: 80 e0 ldi r24, 0x00 ; 0 - 425e: 08 95 ret - -00004260 : -} - 4260: 1f 93 push r17 -} - -bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, - const uint8_t Config, - const uint8_t Size) -{ - 4262: cf 93 push r28 - 4264: df 93 push r29 - 4266: 00 d0 rcall .+0 ; 0x4268 - 4268: cd b7 in r28, 0x3d ; 61 - 426a: de b7 in r29, 0x3e ; 62 - 426c: 18 2f mov r17, r24 - Endpoint_SelectEndpoint(Address); - 426e: 4a 83 std Y+2, r20 ; 0x02 - 4270: 69 83 std Y+1, r22 ; 0x01 - 4272: 35 df rcall .-406 ; 0x40de - 4274: e0 91 2f 23 lds r30, 0x232F - - USB_Endpoint_SelectedHandle->CTRL = 0; - 4278: f0 91 30 23 lds r31, 0x2330 - 427c: 11 82 std Z+1, r1 ; 0x01 - 427e: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 4282: f0 91 30 23 lds r31, 0x2330 - 4286: 4a 81 ldd r20, Y+2 ; 0x02 - 4288: 69 81 ldd r22, Y+1 ; 0x01 - 428a: 17 fd sbrc r17, 7 - 428c: 22 c0 rjmp .+68 ; 0x42d2 - 428e: 10 82 st Z, r1 - 4290: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->CTRL = Config; - 4294: f0 91 30 23 lds r31, 0x2330 - 4298: 61 83 std Z+1, r22 ; 0x01 - 429a: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->CNT = 0; - 429e: f0 91 30 23 lds r31, 0x2330 - 42a2: 12 82 std Z+2, r1 ; 0x02 - 42a4: 13 82 std Z+3, r1 ; 0x03 - 42a6: 80 91 2d 23 lds r24, 0x232D - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 42aa: 90 91 2e 23 lds r25, 0x232E - 42ae: 84 83 std Z+4, r24 ; 0x04 - 42b0: 95 83 std Z+5, r25 ; 0x05 - 42b2: 40 e0 ldi r20, 0x00 ; 0 - - USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; - 42b4: fc 01 movw r30, r24 - 42b6: e0 5c subi r30, 0xC0 ; 192 - 42b8: ff 4f sbci r31, 0xFF ; 255 - 42ba: 40 83 st Z, r20 - 42bc: 8f 5b subi r24, 0xBF ; 191 - USB_Endpoint_SelectedFIFO->Position = 0; - 42be: 9f 4f sbci r25, 0xFF ; 255 - 42c0: dc 01 movw r26, r24 - 42c2: 1c 92 st X, r1 - 42c4: 81 e0 ldi r24, 0x01 ; 1 - - return true; -} - 42c6: 0f 90 pop r0 - 42c8: 0f 90 pop r0 - 42ca: df 91 pop r29 - 42cc: cf 91 pop r28 - 42ce: 1f 91 pop r17 - 42d0: 08 95 ret - 42d2: 82 e0 ldi r24, 0x02 ; 2 - const uint8_t Size) -{ - Endpoint_SelectEndpoint(Address); - - USB_Endpoint_SelectedHandle->CTRL = 0; - USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 42d4: 80 83 st Z, r24 - 42d6: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->CTRL = Config; - 42da: f0 91 30 23 lds r31, 0x2330 - 42de: 61 83 std Z+1, r22 ; 0x01 - 42e0: e0 91 2f 23 lds r30, 0x232F - USB_Endpoint_SelectedHandle->CNT = 0; - 42e4: f0 91 30 23 lds r31, 0x2330 - 42e8: 12 82 std Z+2, r1 ; 0x02 - 42ea: 13 82 std Z+3, r1 ; 0x03 - 42ec: 80 91 2d 23 lds r24, 0x232D - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 42f0: 90 91 2e 23 lds r25, 0x232E - 42f4: 84 83 std Z+4, r24 ; 0x04 - 42f6: 95 83 std Z+5, r25 ; 0x05 - 42f8: dd cf rjmp .-70 ; 0x42b4 - -000042fa : - 42fa: cf 92 push r12 - } -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - const uint8_t Entries) -{ - 42fc: df 92 push r13 - 42fe: ef 92 push r14 - 4300: ff 92 push r15 - 4302: 0f 93 push r16 - 4304: 1f 93 push r17 - 4306: cf 93 push r28 - 4308: df 93 push r29 - 430a: 0f 92 push r0 - 430c: cd b7 in r28, 0x3d ; 61 - 430e: de b7 in r29, 0x3e ; 62 - 4310: f6 2e mov r15, r22 - for (uint8_t i = 0; i < Entries; i++) - 4312: 66 23 and r22, r22 - 4314: 09 f4 brne .+2 ; 0x4318 - 4316: 41 c0 rjmp .+130 ; 0x439a - 4318: 6c 01 movw r12, r24 - 431a: 10 e0 ldi r17, 0x00 ; 0 - { - if (!(Table[i].Address)) - 431c: f6 01 movw r30, r12 - 431e: 00 81 ld r16, Z - 4320: 00 23 and r16, r16 - 4322: 99 f1 breq .+102 ; 0x438a - continue; - - if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 4324: 63 81 ldd r22, Z+3 ; 0x03 - 4326: 21 81 ldd r18, Z+1 ; 0x01 - 4328: 32 81 ldd r19, Z+2 ; 0x02 - static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, - const uint8_t Type, - const uint16_t Size, - const uint8_t Banks) - { - uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - 432a: 84 81 ldd r24, Z+4 ; 0x04 - 432c: 82 30 cpi r24, 0x02 ; 2 - 432e: 08 f4 brcc .+2 ; 0x4332 - 4330: 41 c0 rjmp .+130 ; 0x43b4 - 4332: 48 e1 ldi r20, 0x18 ; 24 - 4334: 58 e1 ldi r21, 0x18 ; 24 - static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) - { - uint8_t MaskVal = 0; - uint16_t CheckBytes = 8; - - while (CheckBytes < Bytes) - 4336: 29 30 cpi r18, 0x09 ; 9 - 4338: 31 05 cpc r19, r1 - 433a: 50 f0 brcs .+20 ; 0x4350 - 433c: 88 e0 ldi r24, 0x08 ; 8 - 433e: 90 e0 ldi r25, 0x00 ; 0 - 4340: 40 e0 ldi r20, 0x00 ; 0 - { - MaskVal++; - 4342: 4f 5f subi r20, 0xFF ; 255 - CheckBytes <<= 1; - 4344: 88 0f add r24, r24 - 4346: 99 1f adc r25, r25 - static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) - { - uint8_t MaskVal = 0; - uint16_t CheckBytes = 8; - - while (CheckBytes < Bytes) - 4348: 82 17 cp r24, r18 - 434a: 93 07 cpc r25, r19 - 434c: d0 f3 brcs .-12 ; 0x4342 - 434e: 45 2b or r20, r21 - const uint16_t Size, - const uint8_t Banks) - { - uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - - if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) - 4350: 80 2f mov r24, r16 - 4352: 90 e0 ldi r25, 0x00 ; 0 - 4354: 8f 70 andi r24, 0x0F ; 15 - 4356: 90 70 andi r25, 0x00 ; 0 - 4358: 86 30 cpi r24, 0x06 ; 6 - 435a: 91 05 cpc r25, r1 - 435c: 4c f5 brge .+82 ; 0x43b0 - return false; - - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - if (Size > 64) - 435e: 21 34 cpi r18, 0x41 ; 65 - 4360: 31 05 cpc r19, r1 - 4362: 30 f5 brcc .+76 ; 0x43b0 - - if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) - return false; - - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - 4364: 4f 7e andi r20, 0xEF ; 239 - if (Size > 64) - return false; - - switch (Type) - 4366: 66 23 and r22, r22 - 4368: 41 f5 brne .+80 ; 0x43ba - { - case EP_TYPE_CONTROL: - EPConfigMask |= USB_EP_TYPE_CONTROL_gc; - 436a: 94 2f mov r25, r20 - 436c: 90 64 ori r25, 0x40 ; 64 - EPConfigMask |= USB_EP_TYPE_BULK_gc; - break; - } - - if (Type == EP_TYPE_CONTROL) - Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 436e: e2 2e mov r14, r18 - 4370: 80 2f mov r24, r16 - 4372: 80 58 subi r24, 0x80 ; 128 - 4374: 69 2f mov r22, r25 - 4376: 42 2f mov r20, r18 - 4378: 99 83 std Y+1, r25 ; 0x01 - 437a: 72 df rcall .-284 ; 0x4260 - 437c: 99 81 ldd r25, Y+1 ; 0x01 - 437e: 80 2f mov r24, r16 - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4380: 69 2f mov r22, r25 - 4382: 4e 2d mov r20, r14 - 4384: 6d df rcall .-294 ; 0x4260 - 4386: 88 23 and r24, r24 - 4388: 99 f0 breq .+38 ; 0x43b0 - 438a: 1f 5f subi r17, 0xFF ; 255 - 438c: 85 e0 ldi r24, 0x05 ; 5 -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - const uint8_t Entries) -{ - for (uint8_t i = 0; i < Entries; i++) - 438e: 90 e0 ldi r25, 0x00 ; 0 - 4390: c8 0e add r12, r24 - 4392: d9 1e adc r13, r25 - 4394: 1f 15 cp r17, r15 - 4396: 09 f0 breq .+2 ; 0x439a - 4398: c1 cf rjmp .-126 ; 0x431c - 439a: 81 e0 ldi r24, 0x01 ; 1 - 439c: 0f 90 pop r0 - { - return false; - } - } - - return true; - 439e: df 91 pop r29 -} - 43a0: cf 91 pop r28 - 43a2: 1f 91 pop r17 - 43a4: 0f 91 pop r16 - 43a6: ff 90 pop r15 - 43a8: ef 90 pop r14 - 43aa: df 90 pop r13 - 43ac: cf 90 pop r12 - 43ae: 08 95 ret - 43b0: 80 e0 ldi r24, 0x00 ; 0 - 43b2: f4 cf rjmp .-24 ; 0x439c - if (!(Table[i].Address)) - continue; - - if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - { - return false; - 43b4: 48 e0 ldi r20, 0x08 ; 8 - 43b6: 58 e0 ldi r21, 0x08 ; 8 - static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, - const uint8_t Type, - const uint16_t Size, - const uint8_t Banks) - { - uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - 43b8: be cf rjmp .-132 ; 0x4336 - 43ba: 61 30 cpi r22, 0x01 ; 1 - 43bc: 31 f0 breq .+12 ; 0x43ca - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - if (Size > 64) - return false; - - switch (Type) - 43be: 94 2f mov r25, r20 - 43c0: 90 68 ori r25, 0x80 ; 128 - break; - case EP_TYPE_ISOCHRONOUS: - EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; - break; - default: - EPConfigMask |= USB_EP_TYPE_BULK_gc; - 43c2: 66 23 and r22, r22 - 43c4: a1 f2 breq .-88 ; 0x436e - break; - } - - if (Type == EP_TYPE_CONTROL) - 43c6: e2 2e mov r14, r18 - 43c8: da cf rjmp .-76 ; 0x437e - 43ca: 94 2f mov r25, r20 - 43cc: 90 6c ori r25, 0xC0 ; 192 - { - case EP_TYPE_CONTROL: - EPConfigMask |= USB_EP_TYPE_CONTROL_gc; - break; - case EP_TYPE_ISOCHRONOUS: - EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; - 43ce: e2 2e mov r14, r18 - 43d0: d6 cf rjmp .-84 ; 0x437e - -000043d2 : - 43d2: e0 ec ldi r30, 0xC0 ; 192 - 43d4: f4 e0 ldi r31, 0x04 ; 4 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 43d6: a6 81 ldd r26, Z+6 ; 0x06 - 43d8: b7 81 ldd r27, Z+7 ; 0x07 - 43da: 19 96 adiw r26, 0x09 ; 9 - 43dc: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43de: a6 81 ldd r26, Z+6 ; 0x06 - 43e0: b7 81 ldd r27, Z+7 ; 0x07 - 43e2: 11 96 adiw r26, 0x01 ; 1 - 43e4: 1c 92 st X, r1 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 43e6: a6 81 ldd r26, Z+6 ; 0x06 - 43e8: b7 81 ldd r27, Z+7 ; 0x07 - 43ea: 59 96 adiw r26, 0x19 ; 25 - 43ec: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43ee: a6 81 ldd r26, Z+6 ; 0x06 - 43f0: b7 81 ldd r27, Z+7 ; 0x07 - 43f2: 51 96 adiw r26, 0x11 ; 17 - 43f4: 1c 92 st X, r1 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 43f6: a6 81 ldd r26, Z+6 ; 0x06 - 43f8: b7 81 ldd r27, Z+7 ; 0x07 - 43fa: 99 96 adiw r26, 0x29 ; 41 - 43fc: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43fe: a6 81 ldd r26, Z+6 ; 0x06 - 4400: b7 81 ldd r27, Z+7 ; 0x07 - 4402: 91 96 adiw r26, 0x21 ; 33 - 4404: 1c 92 st X, r1 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 4406: a6 81 ldd r26, Z+6 ; 0x06 - 4408: b7 81 ldd r27, Z+7 ; 0x07 - 440a: d9 96 adiw r26, 0x39 ; 57 - 440c: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 440e: a6 81 ldd r26, Z+6 ; 0x06 - 4410: b7 81 ldd r27, Z+7 ; 0x07 - 4412: d1 96 adiw r26, 0x31 ; 49 - 4414: 1c 92 st X, r1 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 4416: a6 81 ldd r26, Z+6 ; 0x06 - 4418: b7 81 ldd r27, Z+7 ; 0x07 - 441a: a7 5b subi r26, 0xB7 ; 183 - 441c: bf 4f sbci r27, 0xFF ; 255 - 441e: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 4420: a6 81 ldd r26, Z+6 ; 0x06 - 4422: b7 81 ldd r27, Z+7 ; 0x07 - 4424: af 5b subi r26, 0xBF ; 191 - 4426: bf 4f sbci r27, 0xFF ; 255 - 4428: 1c 92 st X, r1 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 442a: a6 81 ldd r26, Z+6 ; 0x06 - 442c: b7 81 ldd r27, Z+7 ; 0x07 - 442e: a7 5a subi r26, 0xA7 ; 167 - 4430: bf 4f sbci r27, 0xFF ; 255 - 4432: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 4434: 06 80 ldd r0, Z+6 ; 0x06 - 4436: f7 81 ldd r31, Z+7 ; 0x07 - 4438: e0 2d mov r30, r0 - 443a: ef 5a subi r30, 0xAF ; 175 - 443c: ff 4f sbci r31, 0xFF ; 255 - 443e: 10 82 st Z, r1 - } -} - 4440: 08 95 ret - -00004442 : - -void Endpoint_ClearStatusStage(void) -{ - if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - 4442: 80 91 25 23 lds r24, 0x2325 - 4446: 87 fd sbrc r24, 7 - 4448: 08 c0 rjmp .+16 ; 0x445a - - Endpoint_ClearOUT(); - } - else - { - while (!(Endpoint_IsINReady())) - 444a: fd de rcall .-518 ; 0x4246 - 444c: 88 23 and r24, r24 - 444e: 69 f4 brne .+26 ; 0x446a - 4450: 80 91 24 23 lds r24, 0x2324 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 4454: 88 23 and r24, r24 - 4456: c9 f7 brne .-14 ; 0x444a - 4458: 08 95 ret - 445a: dd de rcall .-582 ; 0x4216 - -void Endpoint_ClearStatusStage(void) -{ - if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - { - while (!(Endpoint_IsOUTReceived())) - 445c: 88 23 and r24, r24 - 445e: 31 f4 brne .+12 ; 0x446c - 4460: 80 91 24 23 lds r24, 0x2324 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 4464: 88 23 and r24, r24 - 4466: c9 f7 brne .-14 ; 0x445a - 4468: 08 95 ret - 446a: f3 cd rjmp .-1050 ; 0x4052 - 446c: 0b ce rjmp .-1002 ; 0x4084 - -0000446e : - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - 446e: 1f 93 push r17 - 4470: cf 93 push r28 - 4472: df 93 push r29 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearOUT(); - 4474: e0 91 c6 04 lds r30, 0x04C6 - 4478: f0 91 c7 04 lds r31, 0x04C7 - * \return Current USB frame number from the USB controller. - */ - static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; - static inline uint16_t USB_Device_GetFrameNumber(void) - { - return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum; - 447c: e0 5a subi r30, 0xA0 ; 160 - 447e: ff 4f sbci r31, 0xFF ; 255 - 4480: c0 81 ld r28, Z - 4482: d1 81 ldd r29, Z+1 ; 0x01 - -#if !defined(CONTROL_ONLY_DEVICE) -uint8_t Endpoint_WaitUntilReady(void) -{ - #if (USB_STREAM_TIMEOUT_MS < 0xFF) - uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; - 4484: 14 e6 ldi r17, 0x64 ; 100 - * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. - */ - static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint8_t Endpoint_GetEndpointDirection(void) - { - return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); - 4486: 80 91 31 23 lds r24, 0x2331 - 448a: 80 78 andi r24, 0x80 ; 128 - - uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); - - for (;;) - { - if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 448c: 80 38 cpi r24, 0x80 ; 128 - 448e: 21 f1 breq .+72 ; 0x44d8 - if (Endpoint_IsINReady()) - return ENDPOINT_READYWAIT_NoError; - } - else - { - if (Endpoint_IsOUTReceived()) - 4490: c2 de rcall .-636 ; 0x4216 - 4492: 88 23 and r24, r24 - 4494: 21 f5 brne .+72 ; 0x44de - 4496: 80 91 24 23 lds r24, 0x2324 - return ENDPOINT_READYWAIT_NoError; - } - - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 449a: 88 23 and r24, r24 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 449c: 29 f1 breq .+74 ; 0x44e8 - 449e: 85 30 cpi r24, 0x05 ; 5 - return ENDPOINT_READYWAIT_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 44a0: 41 f1 breq .+80 ; 0x44f2 - 44a2: e0 91 2f 23 lds r30, 0x232F - * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. - */ - static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline bool Endpoint_IsStalled(void) - { - return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); - 44a6: f0 91 30 23 lds r31, 0x2330 - 44aa: 81 81 ldd r24, Z+1 ; 0x01 - 44ac: 82 fd sbrc r24, 2 - return ENDPOINT_READYWAIT_BusSuspended; - else if (Endpoint_IsStalled()) - 44ae: 26 c0 rjmp .+76 ; 0x44fc - 44b0: e0 91 c6 04 lds r30, 0x04C6 - 44b4: f0 91 c7 04 lds r31, 0x04C7 - 44b8: e0 5a subi r30, 0xA0 ; 160 - 44ba: ff 4f sbci r31, 0xFF ; 255 - 44bc: 80 81 ld r24, Z - 44be: 91 81 ldd r25, Z+1 ; 0x01 - 44c0: c8 17 cp r28, r24 - return ENDPOINT_READYWAIT_EndpointStalled; - - uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); - - if (CurrentFrameNumber != PreviousFrameNumber) - 44c2: d9 07 cpc r29, r25 - 44c4: 01 f3 breq .-64 ; 0x4486 - 44c6: 11 23 and r17, r17 - { - PreviousFrameNumber = CurrentFrameNumber; - - if (!(TimeoutMSRem--)) - 44c8: f1 f0 breq .+60 ; 0x4506 - 44ca: 11 50 subi r17, 0x01 ; 1 - 44cc: ec 01 movw r28, r24 - 44ce: 80 91 31 23 lds r24, 0x2331 - * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. - */ - static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint8_t Endpoint_GetEndpointDirection(void) - { - return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); - 44d2: 80 78 andi r24, 0x80 ; 128 - 44d4: 80 38 cpi r24, 0x80 ; 128 - - uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); - - for (;;) - { - if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 44d6: e1 f6 brne .-72 ; 0x4490 - 44d8: b6 de rcall .-660 ; 0x4246 - { - if (Endpoint_IsINReady()) - 44da: 88 23 and r24, r24 - 44dc: e1 f2 breq .-72 ; 0x4496 - 44de: 80 e0 ldi r24, 0x00 ; 0 - 44e0: df 91 pop r29 - return ENDPOINT_READYWAIT_NoError; - } - else - { - if (Endpoint_IsOUTReceived()) - return ENDPOINT_READYWAIT_NoError; - 44e2: cf 91 pop r28 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44e4: 1f 91 pop r17 - 44e6: 08 95 ret - 44e8: 82 e0 ldi r24, 0x02 ; 2 - 44ea: df 91 pop r29 - } - - uint8_t USB_DeviceState_LCL = USB_DeviceState; - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_READYWAIT_DeviceDisconnected; - 44ec: cf 91 pop r28 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44ee: 1f 91 pop r17 - 44f0: 08 95 ret - 44f2: 83 e0 ldi r24, 0x03 ; 3 - 44f4: df 91 pop r29 - uint8_t USB_DeviceState_LCL = USB_DeviceState; - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_READYWAIT_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_READYWAIT_BusSuspended; - 44f6: cf 91 pop r28 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44f8: 1f 91 pop r17 - 44fa: 08 95 ret - 44fc: 81 e0 ldi r24, 0x01 ; 1 - 44fe: df 91 pop r29 - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_READYWAIT_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_READYWAIT_BusSuspended; - else if (Endpoint_IsStalled()) - return ENDPOINT_READYWAIT_EndpointStalled; - 4500: cf 91 pop r28 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 4502: 1f 91 pop r17 - 4504: 08 95 ret - 4506: 84 e0 ldi r24, 0x04 ; 4 - 4508: df 91 pop r29 - if (CurrentFrameNumber != PreviousFrameNumber) - { - PreviousFrameNumber = CurrentFrameNumber; - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - 450a: cf 91 pop r28 - } - } -} - 450c: 1f 91 pop r17 - 450e: 08 95 ret - -00004510 : - USB_ResetInterface(); -} - -void USB_Disable(void) -{ - USB_INT_DisableAllInterrupts(); - 4510: 64 d0 rcall .+200 ; 0x45da - 4512: 6a d0 rcall .+212 ; 0x45e8 - USB_INT_ClearAllInterrupts(); - 4514: e0 ec ldi r30, 0xC0 ; 192 - 4516: f4 e0 ldi r31, 0x04 ; 4 - * enumerating the device once attached until \ref USB_Attach() is called. - */ - static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; - static inline void USB_Detach(void) - { - USB.CTRLB &= ~USB_ATTACH_bm; - 4518: 81 81 ldd r24, Z+1 ; 0x01 - 451a: 8e 7f andi r24, 0xFE ; 254 - 451c: 81 83 std Z+1, r24 ; 0x01 - 451e: 80 81 ld r24, Z - 4520: 8f 77 andi r24, 0x7F ; 127 - } - - static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; - static inline void USB_Controller_Disable(void) - { - USB.CTRLA &= ~USB_ENABLE_bm; - 4522: 80 83 st Z, r24 - 4524: 10 92 23 23 sts 0x2323, r1 - - USB_Detach(); - USB_Controller_Disable(); - - USB_IsInitialized = false; - 4528: 08 95 ret - -0000452a : - 452a: cf 93 push r28 -} - 452c: df 93 push r29 -{ - #if defined(USB_DEVICE_OPT_FULLSPEED) - if (USB_Options & USB_DEVICE_OPT_LOWSPEED) - CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); - else - CLK.USBCTRL = (((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp); - 452e: e0 e4 ldi r30, 0x40 ; 64 - 4530: f0 e0 ldi r31, 0x00 ; 0 - 4532: 14 82 std Z+4, r1 ; 0x04 - #else - CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); - #endif - - if (USB_Options & USB_OPT_PLLCLKSRC) - CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm); - 4534: 84 81 ldd r24, Z+4 ; 0x04 - 4536: 81 60 ori r24, 0x01 ; 1 - 4538: 84 83 std Z+4, r24 ; 0x04 - else - CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); - - USB_Device_SetDeviceAddress(0); - - USB_INT_DisableAllInterrupts(); - 453a: 4f d0 rcall .+158 ; 0x45da - 453c: 55 d0 rcall .+170 ; 0x45e8 - USB_INT_ClearAllInterrupts(); - 453e: c0 ec ldi r28, 0xC0 ; 192 - 4540: d4 e0 ldi r29, 0x04 ; 4 - } - - static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; - static inline void USB_Controller_Reset(void) - { - USB.CTRLA &= ~USB_ENABLE_bm; - 4542: 88 81 ld r24, Y - 4544: 8f 77 andi r24, 0x7F ; 127 - 4546: 88 83 st Y, r24 - 4548: 88 81 ld r24, Y - 454a: 80 68 ori r24, 0x80 ; 128 - USB.CTRLA |= USB_ENABLE_bm; - 454c: 88 83 st Y, r24 - 454e: 10 92 24 23 sts 0x2324, r1 -} - -#if defined(USB_CAN_BE_DEVICE) -static void USB_Init_Device(void) -{ - USB_DeviceState = DEVICE_STATE_Unattached; - 4552: 10 92 20 23 sts 0x2320, r1 - USB_Device_ConfigurationNumber = 0; - 4556: 10 92 22 23 sts 0x2322, r1 - - #if !defined(NO_DEVICE_REMOTE_WAKEUP) - USB_Device_RemoteWakeupEnabled = false; - 455a: 10 92 21 23 sts 0x2321, r1 - #endif - - #if !defined(NO_DEVICE_SELF_POWER) - USB_Device_CurrentlySelfPowered = false; - 455e: 88 81 ld r24, Y - 4560: 80 64 ori r24, 0x40 ; 64 - } - - static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; - static inline void USB_Device_SetFullSpeed(void) - { - USB.CTRLA |= USB_SPEED_bm; - 4562: 88 83 st Y, r24 - 4564: 80 e8 ldi r24, 0x80 ; 128 - 4566: 68 e4 ldi r22, 0x48 ; 72 - EPConfigMask |= USB_EP_TYPE_BULK_gc; - break; - } - - if (Type == EP_TYPE_CONTROL) - Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 4568: 48 e0 ldi r20, 0x08 ; 8 - 456a: 7a de rcall .-780 ; 0x4260 - 456c: 80 e0 ldi r24, 0x00 ; 0 - 456e: 68 e4 ldi r22, 0x48 ; 72 - 4570: 48 e0 ldi r20, 0x08 ; 8 - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4572: 76 de rcall .-788 ; 0x4260 - 4574: 88 85 ldd r24, Y+8 ; 0x08 - 4576: 80 64 ori r24, 0x40 ; 64 - 4578: 88 87 std Y+8, r24 ; 0x08 - 457a: 89 81 ldd r24, Y+1 ; 0x01 - static inline void USB_INT_Enable(const uint8_t Interrupt) - { - switch (Interrupt) - { - case USB_INT_BUSEVENTI: - USB.INTCTRLA |= USB_BUSEVIE_bm; - 457c: 81 60 ori r24, 0x01 ; 1 - 457e: 89 83 std Y+1, r24 ; 0x01 - 4580: df 91 pop r29 - * register and despite the datasheet making no mention of its requirement in host mode. - */ - static inline void USB_Attach(void) ATTR_ALWAYS_INLINE; - static inline void USB_Attach(void) - { - USB.CTRLB |= USB_ATTACH_bm; - 4582: cf 91 pop r28 - 4584: 08 95 ret - -00004586 : - 4586: cf 93 push r28 - USB_INT_DisableAllInterrupts(); - USB_INT_ClearAllInterrupts(); - - USB_Controller_Reset(); - USB_Init_Device(); -} - 4588: df 93 push r29 - 458a: 3f b7 in r19, 0x3f ; 63 - 458c: f8 94 cli - #endif - - uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); - GlobalInterruptDisable(); - - NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 458e: c0 ec ldi r28, 0xC0 ; 192 - 4590: d1 e0 ldi r29, 0x01 ; 1 - 4592: 22 e0 ldi r18, 0x02 ; 2 - 4594: 2a 87 std Y+10, r18 ; 0x0a - USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); - 4596: ea e1 ldi r30, 0x1A ; 26 - 4598: f0 e0 ldi r31, 0x00 ; 0 - 459a: e4 91 lpm r30, Z - 459c: a0 ec ldi r26, 0xC0 ; 192 - 459e: b4 e0 ldi r27, 0x04 ; 4 - 45a0: da 96 adiw r26, 0x3a ; 58 - 45a2: ec 93 st X, r30 - 45a4: da 97 sbiw r26, 0x3a ; 58 - USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); - 45a6: eb e1 ldi r30, 0x1B ; 27 - 45a8: f0 e0 ldi r31, 0x00 ; 0 - 45aa: e4 91 lpm r30, Z - 45ac: db 96 adiw r26, 0x3b ; 59 - 45ae: ec 93 st X, r30 - 45b0: db 97 sbiw r26, 0x3b ; 59 - NVM.CMD = NVM_CMD_NO_OPERATION_gc; - 45b2: 1a 86 std Y+10, r1 ; 0x0a - - /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ - USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0)); - 45b4: 8b e4 ldi r24, 0x4B ; 75 - 45b6: 96 e2 ldi r25, 0x26 ; 38 - 45b8: 8e 7f andi r24, 0xFE ; 254 - 45ba: 16 96 adiw r26, 0x06 ; 6 - 45bc: 8d 93 st X+, r24 - 45be: 9c 93 st X, r25 - 45c0: 17 97 sbiw r26, 0x07 ; 7 - USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); - 45c2: 85 e1 ldi r24, 0x15 ; 21 - 45c4: 8c 93 st X, r24 - - if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH) - USB.INTCTRLA = (3 << USB_INTLVL_gp); - else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED) - USB.INTCTRLA = (2 << USB_INTLVL_gp); - 45c6: 18 96 adiw r26, 0x08 ; 8 - 45c8: 2c 93 st X, r18 + 38b2: e3 2f mov r30, r19 + 38b4: f0 e0 ldi r31, 0x00 ; 0 + 38b6: e4 91 lpm r30, Z + NVM.CMD = 0; + 38b8: 10 92 ca 01 sts 0x01CA, r1 + + if (SerialCharNum & 0x01) + 38bc: 20 ff sbrs r18, 0 + 38be: ec cf rjmp .-40 ; 0x3898 + { + SerialByte >>= 4; + 38c0: e2 95 swap r30 + 38c2: ef 70 andi r30, 0x0F ; 15 + SigReadAddress++; + 38c4: 3f 5f subi r19, 0xFF ; 255 + } + + SerialByte &= 0x0F; + 38c6: ef 70 andi r30, 0x0F ; 15 + + UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? + 38c8: 8e 2f mov r24, r30 + 38ca: 90 e0 ldi r25, 0x00 ; 0 + 38cc: ea 30 cpi r30, 0x0A ; 10 + 38ce: 48 f7 brcc .-46 ; 0x38a2 + 38d0: c0 96 adiw r24, 0x30 ; 48 + 38d2: e8 cf rjmp .-48 ; 0x38a4 if (GlobalIntState & AVR32_SR_GM) __builtin_ssrf(AVR32_SR_GM_OFFSET); else __builtin_csrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) SREG = GlobalIntState; - 45ca: 3f bf out 0x3f, r19 ; 63 + 38d4: 5f bf out 0x3f, r21 ; 63 - #if defined(USB_CAN_BE_BOTH) - USB_CurrentMode = Mode; - #endif + Endpoint_ClearSETUP(); + 38d6: 70 d2 rcall .+1248 ; 0x3db8 - USB_IsInitialized = true; - 45cc: 81 e0 ldi r24, 0x01 ; 1 - 45ce: 80 93 23 23 sts 0x2323, r24 - - USB_ResetInterface(); - 45d2: ab df rcall .-170 ; 0x452a - 45d4: df 91 pop r29 -} - 45d6: cf 91 pop r28 - 45d8: 08 95 ret - -000045da : -#define __INCLUDE_FROM_USB_DRIVER -#include "../USBInterrupt.h" - -void USB_INT_DisableAllInterrupts(void) -{ - USB.INTCTRLA &= USB_INTLVL_gm; - 45da: e0 ec ldi r30, 0xC0 ; 192 - 45dc: f4 e0 ldi r31, 0x04 ; 4 - 45de: 80 85 ldd r24, Z+8 ; 0x08 - 45e0: 83 70 andi r24, 0x03 ; 3 - 45e2: 80 87 std Z+8, r24 ; 0x08 - USB.INTCTRLB = 0; - 45e4: 11 86 std Z+9, r1 ; 0x09 -} - 45e6: 08 95 ret - -000045e8 : - -void USB_INT_ClearAllInterrupts(void) -{ - USB.INTFLAGSACLR = 0xFF; - 45e8: e0 ec ldi r30, 0xC0 ; 192 - 45ea: f4 e0 ldi r31, 0x04 ; 4 - 45ec: 8f ef ldi r24, 0xFF ; 255 - 45ee: 82 87 std Z+10, r24 ; 0x0a - USB.INTFLAGSBCLR = 0xFF; - 45f0: 84 87 std Z+12, r24 ; 0x0c -} - 45f2: 08 95 ret - -000045f4 <__vector_125>: - -ISR(USB_BUSEVENT_vect) -{ - 45f4: 1f 92 push r1 - 45f6: 0f 92 push r0 - 45f8: 0f b6 in r0, 0x3f ; 63 - 45fa: 0f 92 push r0 - 45fc: 11 24 eor r1, r1 - 45fe: 2f 93 push r18 - 4600: 3f 93 push r19 - 4602: 4f 93 push r20 - 4604: 5f 93 push r21 - 4606: 6f 93 push r22 - 4608: 7f 93 push r23 - 460a: 8f 93 push r24 - 460c: 9f 93 push r25 - 460e: af 93 push r26 - 4610: bf 93 push r27 - 4612: ef 93 push r30 - 4614: ff 93 push r31 - case USB_INT_BUSEVENTI_Resume: - return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); - case USB_INT_BUSEVENTI_Reset: - return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); - case USB_INT_SOFI: - return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false); - 4616: 80 91 ca 04 lds r24, 0x04CA - #if !defined(NO_SOF_EVENTS) - if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 461a: 87 fd sbrc r24, 7 - 461c: 4f c0 rjmp .+158 ; 0x46bc <__vector_125+0xc8> - static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) - { - switch (Interrupt) - { - case USB_INT_BUSEVENTI_Suspend: - return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); - 461e: 80 91 ca 04 lds r24, 0x04CA - - EVENT_USB_Device_StartOfFrame(); - } - #endif - - if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) - 4622: 86 fd sbrc r24, 6 - 4624: 42 c0 rjmp .+132 ; 0x46aa <__vector_125+0xb6> - case USB_INT_BUSEVENTI_Resume: - return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); - 4626: 80 91 ca 04 lds r24, 0x04CA - USB_DeviceState = DEVICE_STATE_Suspended; - EVENT_USB_Device_Suspend(); - #endif - } - - if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Resume)) - 462a: 85 ff sbrs r24, 5 - 462c: 0d c0 rjmp .+26 ; 0x4648 <__vector_125+0x54> - { - case USB_INT_BUSEVENTI_Suspend: - USB.INTFLAGSACLR = USB_SUSPENDIF_bm; - break; - case USB_INT_BUSEVENTI_Resume: - USB.INTFLAGSACLR = USB_RESUMEIF_bm; - 462e: 80 e2 ldi r24, 0x20 ; 32 - 4630: e0 ec ldi r30, 0xC0 ; 192 - 4632: f4 e0 ldi r31, 0x04 ; 4 - 4634: 82 87 std Z+10, r24 ; 0x0a - { - USB_INT_Clear(USB_INT_BUSEVENTI_Resume); - - if (USB_Device_ConfigurationNumber) - 4636: 80 91 20 23 lds r24, 0x2320 - 463a: 88 23 and r24, r24 - 463c: 71 f1 breq .+92 ; 0x469a <__vector_125+0xa6> - USB_DeviceState = DEVICE_STATE_Configured; - 463e: 84 e0 ldi r24, 0x04 ; 4 - 4640: 80 93 24 23 sts 0x2324, r24 - else - USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; - - #if !defined(NO_LIMITED_CONTROLLER_CONNECT) - EVENT_USB_Device_Connect(); - 4644: 0e 94 72 0b call 0x16e4 ; 0x16e4 - case USB_INT_BUSEVENTI_Suspend: - return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); - case USB_INT_BUSEVENTI_Resume: - return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); - case USB_INT_BUSEVENTI_Reset: - return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); - 4648: e0 ec ldi r30, 0xC0 ; 192 - 464a: f4 e0 ldi r31, 0x04 ; 4 - 464c: 80 91 ca 04 lds r24, 0x04CA - #else - EVENT_USB_Device_WakeUp(); - #endif - } - - if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) - 4650: 84 ff sbrs r24, 4 - 4652: 12 c0 rjmp .+36 ; 0x4678 <__vector_125+0x84> - break; - case USB_INT_BUSEVENTI_Resume: - USB.INTFLAGSACLR = USB_RESUMEIF_bm; - break; - case USB_INT_BUSEVENTI_Reset: - USB.INTFLAGSACLR = USB_RSTIF_bm; - 4654: 80 e1 ldi r24, 0x10 ; 16 - 4656: 82 87 std Z+10, r24 ; 0x0a - { - USB_INT_Clear(USB_INT_BUSEVENTI_Reset); - - USB_DeviceState = DEVICE_STATE_Default; - 4658: 82 e0 ldi r24, 0x02 ; 2 - 465a: 80 93 24 23 sts 0x2324, r24 - USB_Device_ConfigurationNumber = 0; - 465e: 10 92 20 23 sts 0x2320, r1 - } - - static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; - static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) - { - USB.ADDR = Address; - 4662: 13 82 std Z+3, r1 ; 0x03 - - USB_Device_EnableDeviceAddress(0); - - Endpoint_ClearEndpoints(); - 4664: b6 de rcall .-660 ; 0x43d2 - 4666: 80 e8 ldi r24, 0x80 ; 128 - EPConfigMask |= USB_EP_TYPE_BULK_gc; - break; - } - - if (Type == EP_TYPE_CONTROL) - Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 4668: 68 e4 ldi r22, 0x48 ; 72 - 466a: 48 e0 ldi r20, 0x08 ; 8 - 466c: f9 dd rcall .-1038 ; 0x4260 - 466e: 80 e0 ldi r24, 0x00 ; 0 - 4670: 68 e4 ldi r22, 0x48 ; 72 - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4672: 48 e0 ldi r20, 0x08 ; 8 - 4674: f5 dd rcall .-1046 ; 0x4260 - 4676: 17 db rcall .-2514 ; 0x3ca6 - 4678: ff 91 pop r31 - 467a: ef 91 pop r30 - Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, - USB_Device_ControlEndpointSize, 1); - - EVENT_USB_Device_Reset(); - 467c: bf 91 pop r27 - 467e: af 91 pop r26 - } -} - 4680: 9f 91 pop r25 - 4682: 8f 91 pop r24 - 4684: 7f 91 pop r23 - 4686: 6f 91 pop r22 - 4688: 5f 91 pop r21 - 468a: 4f 91 pop r20 - 468c: 3f 91 pop r19 - 468e: 2f 91 pop r18 - 4690: 0f 90 pop r0 - 4692: 0f be out 0x3f, r0 ; 63 - 4694: 0f 90 pop r0 - 4696: 1f 90 pop r1 - 4698: 18 95 reti - 469a: 80 91 c3 04 lds r24, 0x04C3 - 469e: 88 23 and r24, r24 - 46a0: b9 f4 brne .+46 ; 0x46d0 <__vector_125+0xdc> + Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); + 38d8: 6a e3 ldi r22, 0x3A ; 58 + 38da: 70 e0 ldi r23, 0x00 ; 0 + 38dc: ce 01 movw r24, r28 + 38de: 01 96 adiw r24, 0x01 ; 1 + 38e0: 90 d0 rcall .+288 ; 0x3a02 + Endpoint_ClearOUT(); + 38e2: e8 d1 rcall .+976 ; 0x3cb4 + 38e4: f8 ce rjmp .-528 ; 0x36d6 } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return ((USB.ADDR != 0) ? true : false); - 46a2: 81 e0 ldi r24, 0x01 ; 1 - 46a4: 80 93 24 23 sts 0x2324, r24 + 38e6: 80 91 c3 04 lds r24, 0x04C3 + Endpoint_ClearStatusStage(); + + if (USB_Device_ConfigurationNumber) + USB_DeviceState = DEVICE_STATE_Configured; + else + USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; + 38ea: 88 23 and r24, r24 + 38ec: 21 f0 breq .+8 ; 0x38f6 + 38ee: 84 e0 ldi r24, 0x04 ; 4 + 38f0: 80 93 14 23 sts 0x2314, r24 + 38f4: 9a cf rjmp .-204 ; 0x382a + 38f6: 81 e0 ldi r24, 0x01 ; 1 + 38f8: fb cf rjmp .-10 ; 0x38f0 + + if (Endpoint_IsEnabled()) + { + if (USB_ControlRequest.bRequest == REQ_SetFeature) + { + Endpoint_StallTransaction(); + 38fa: 42 d2 rcall .+1156 ; 0x3d80 + 38fc: 2f cf rjmp .-418 ; 0x375c + +000038fe : +#define __INCLUDE_FROM_EVENTS_C +#define __INCLUDE_FROM_USB_DRIVER +#include "Events.h" + +void USB_Event_Stub(void) +{ + 38fe: 08 95 ret + +00003900 : +#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) +volatile uint8_t USB_DeviceState; +#endif + +void USB_USBTask(void) +{ + 3900: cf 93 push r28 +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_DeviceTask(void) +{ + if (USB_DeviceState == DEVICE_STATE_Unattached) + 3902: 80 91 14 23 lds r24, 0x2314 + 3906: 81 11 cpse r24, r1 + 3908: 02 c0 rjmp .+4 ; 0x390e + #elif defined(USB_CAN_BE_HOST) + USB_HostTask(); + #elif defined(USB_CAN_BE_DEVICE) + USB_DeviceTask(); + #endif +} + 390a: cf 91 pop r28 + 390c: 08 95 ret + * \return Index of the currently selected endpoint. + */ + static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Endpoint_GetCurrentEndpoint(void) + { + return USB_Endpoint_SelectedEndpoint; + 390e: c0 91 21 23 lds r28, 0x2321 + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + + uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + 3912: 80 e0 ldi r24, 0x00 ; 0 + 3914: fc d1 rcall .+1016 ; 0x3d0e + + if (Endpoint_IsSETUPReceived()) + 3916: 7c d2 rcall .+1272 ; 0x3e10 + 3918: 81 11 cpse r24, r1 + 391a: 03 c0 rjmp .+6 ; 0x3922 + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(PrevEndpoint); + 391c: 8c 2f mov r24, r28 + #elif defined(USB_CAN_BE_HOST) + USB_HostTask(); + #elif defined(USB_CAN_BE_DEVICE) + USB_DeviceTask(); + #endif +} + 391e: cf 91 pop r28 + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + if (Endpoint_IsSETUPReceived()) + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(PrevEndpoint); + 3920: f6 c1 rjmp .+1004 ; 0x3d0e + uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + if (Endpoint_IsSETUPReceived()) + USB_Device_ProcessControlRequest(); + 3922: a2 de rcall .-700 ; 0x3668 + + Endpoint_SelectEndpoint(PrevEndpoint); + 3924: 8c 2f mov r24, r28 + #elif defined(USB_CAN_BE_HOST) + USB_HostTask(); + #elif defined(USB_CAN_BE_DEVICE) + USB_DeviceTask(); + #endif +} + 3926: cf 91 pop r28 + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + if (Endpoint_IsSETUPReceived()) + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(PrevEndpoint); + 3928: f2 c1 rjmp .+996 ; 0x3d0e + +0000392a : + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; + 392a: af 92 push r10 + 392c: bf 92 push r11 + 392e: df 92 push r13 + 3930: ef 92 push r14 + 3932: ff 92 push r15 + 3934: 0f 93 push r16 + 3936: 1f 93 push r17 + 3938: cf 93 push r28 + 393a: df 93 push r29 + 393c: 8c 01 movw r16, r24 + 393e: eb 01 movw r28, r22 + 3940: 7a 01 movw r14, r20 + 3942: b5 d3 rcall .+1898 ; 0x40ae + 3944: d8 2e mov r13, r24 + 3946: 81 11 cpse r24, r1 + 3948: 27 c0 rjmp .+78 ; 0x3998 + 394a: e1 14 cp r14, r1 + 394c: f1 04 cpc r15, r1 + 394e: a1 f1 breq .+104 ; 0x39b8 + 3950: f7 01 movw r30, r14 + 3952: 20 81 ld r18, Z + 3954: 31 81 ldd r19, Z+1 ; 0x01 + 3956: c2 1b sub r28, r18 + 3958: d3 0b sbc r29, r19 + 395a: 02 0f add r16, r18 + 395c: 13 1f adc r17, r19 + 395e: 20 97 sbiw r28, 0x00 ; 0 + 3960: d9 f0 breq .+54 ; 0x3998 + 3962: a1 2c mov r10, r1 + 3964: b1 2c mov r11, r1 + 3966: 80 91 1d 23 lds r24, 0x231D + 396a: 90 91 1e 23 lds r25, 0x231E + 396e: fc 01 movw r30, r24 + 3970: ef 5b subi r30, 0xBF ; 191 + 3972: ff 4f sbci r31, 0xFF ; 255 + 3974: 20 81 ld r18, Z + 3976: fc 01 movw r30, r24 + 3978: e0 5c subi r30, 0xC0 ; 192 + 397a: ff 4f sbci r31, 0xFF ; 255 + 397c: 80 81 ld r24, Z + 397e: 28 17 cp r18, r24 + 3980: 90 f1 brcs .+100 ; 0x39e6 + 3982: 7f d1 rcall .+766 ; 0x3c82 + 3984: bd df rcall .-134 ; 0x3900 + 3986: f7 01 movw r30, r14 + 3988: 80 81 ld r24, Z + 398a: 91 81 ldd r25, Z+1 ; 0x01 + 398c: 8a 0d add r24, r10 + 398e: 9b 1d adc r25, r11 + 3990: 80 83 st Z, r24 + 3992: 91 83 std Z+1, r25 ; 0x01 + 3994: 25 e0 ldi r18, 0x05 ; 5 + 3996: d2 2e mov r13, r18 + 3998: 8d 2d mov r24, r13 + 399a: df 91 pop r29 + 399c: cf 91 pop r28 + 399e: 1f 91 pop r17 + 39a0: 0f 91 pop r16 + 39a2: ff 90 pop r15 + 39a4: ef 90 pop r14 + 39a6: df 90 pop r13 + 39a8: bf 90 pop r11 + 39aa: af 90 pop r10 + 39ac: 08 95 ret + 39ae: 69 d1 rcall .+722 ; 0x3c82 + 39b0: a7 df rcall .-178 ; 0x3900 + 39b2: 7d d3 rcall .+1786 ; 0x40ae + 39b4: 81 11 cpse r24, r1 + 39b6: 23 c0 rjmp .+70 ; 0x39fe + 39b8: 20 97 sbiw r28, 0x00 ; 0 + 39ba: 71 f3 breq .-36 ; 0x3998 + 39bc: 20 91 1d 23 lds r18, 0x231D + 39c0: 30 91 1e 23 lds r19, 0x231E + 39c4: f9 01 movw r30, r18 + 39c6: ef 5b subi r30, 0xBF ; 191 + 39c8: ff 4f sbci r31, 0xFF ; 255 + 39ca: 90 81 ld r25, Z + 39cc: f9 01 movw r30, r18 + 39ce: e0 5c subi r30, 0xC0 ; 192 + 39d0: ff 4f sbci r31, 0xFF ; 255 + 39d2: 80 81 ld r24, Z + 39d4: 98 17 cp r25, r24 + 39d6: 58 f7 brcc .-42 ; 0x39ae + 39d8: f8 01 movw r30, r16 + 39da: 81 91 ld r24, Z+ + 39dc: 8f 01 movw r16, r30 + 39de: 88 d1 rcall .+784 ; 0x3cf0 + 39e0: 21 97 sbiw r28, 0x01 ; 1 + 39e2: 61 f7 brne .-40 ; 0x39bc + 39e4: d9 cf rjmp .-78 ; 0x3998 + 39e6: f8 01 movw r30, r16 + 39e8: 81 91 ld r24, Z+ + 39ea: 8f 01 movw r16, r30 + 39ec: 81 d1 rcall .+770 ; 0x3cf0 + 39ee: ff ef ldi r31, 0xFF ; 255 + 39f0: af 1a sub r10, r31 + 39f2: bf 0a sbc r11, r31 + 39f4: ca 15 cp r28, r10 + 39f6: db 05 cpc r29, r11 + 39f8: 09 f0 breq .+2 ; 0x39fc + 39fa: b5 cf rjmp .-150 ; 0x3966 + 39fc: cd cf rjmp .-102 ; 0x3998 + 39fe: d8 2e mov r13, r24 + 3a00: cb cf rjmp .-106 ; 0x3998 + +00003a02 : + 3a02: cf 92 push r12 + 3a04: df 92 push r13 + 3a06: ef 92 push r14 + 3a08: ff 92 push r15 + 3a0a: 0f 93 push r16 + 3a0c: 1f 93 push r17 + 3a0e: cf 93 push r28 + 3a10: df 93 push r29 + 3a12: 6c 01 movw r12, r24 + 3a14: eb 01 movw r28, r22 + 3a16: 80 91 21 23 lds r24, 0x2321 + 3a1a: 80 68 ori r24, 0x80 ; 128 + 3a1c: 78 d1 rcall .+752 ; 0x3d0e + 3a1e: 00 91 1b 23 lds r16, 0x231B + 3a22: 10 91 1c 23 lds r17, 0x231C + 3a26: 0c 17 cp r16, r28 + 3a28: 1d 07 cpc r17, r29 + 3a2a: 20 f0 brcs .+8 ; 0x3a34 + 3a2c: 20 97 sbiw r28, 0x00 ; 0 + 3a2e: 09 f4 brne .+2 ; 0x3a32 + 3a30: 83 c0 rjmp .+262 ; 0x3b38 + 3a32: 8e 01 movw r16, r28 + 3a34: c0 e0 ldi r28, 0x00 ; 0 + 3a36: 01 15 cp r16, r1 + 3a38: 11 05 cpc r17, r1 + 3a3a: 09 f0 breq .+2 ; 0x3a3e + 3a3c: 4a c0 rjmp .+148 ; 0x3ad2 + 3a3e: cc 23 and r28, r28 + 3a40: 09 f4 brne .+2 ; 0x3a44 + 3a42: 5c c0 rjmp .+184 ; 0x3afc + 3a44: 80 91 14 23 lds r24, 0x2314 + 3a48: 88 23 and r24, r24 + 3a4a: 09 f4 brne .+2 ; 0x3a4e + 3a4c: 55 c0 rjmp .+170 ; 0x3af8 + 3a4e: 85 30 cpi r24, 0x05 ; 5 + 3a50: 09 f4 brne .+2 ; 0x3a54 + 3a52: 5d c0 rjmp .+186 ; 0x3b0e + 3a54: dd d1 rcall .+954 ; 0x3e10 + 3a56: 81 11 cpse r24, r1 + 3a58: 6d c0 rjmp .+218 ; 0x3b34 + 3a5a: f3 d1 rcall .+998 ; 0x3e42 + 3a5c: 81 11 cpse r24, r1 + 3a5e: 4e c0 rjmp .+156 ; 0x3afc + 3a60: 09 d2 rcall .+1042 ; 0x3e74 + 3a62: 88 23 and r24, r24 + 3a64: 79 f3 breq .-34 ; 0x3a44 + 3a66: 80 91 21 23 lds r24, 0x2321 + 3a6a: 87 fd sbrc r24, 7 + 3a6c: 5a c0 rjmp .+180 ; 0x3b22 + 3a6e: 20 91 1d 23 lds r18, 0x231D + 3a72: 30 91 1e 23 lds r19, 0x231E + 3a76: f9 01 movw r30, r18 + 3a78: e0 5c subi r30, 0xC0 ; 192 + 3a7a: ff 4f sbci r31, 0xFF ; 255 + 3a7c: e0 80 ld r14, Z + 3a7e: f9 01 movw r30, r18 + 3a80: ef 5b subi r30, 0xBF ; 191 + 3a82: ff 4f sbci r31, 0xFF ; 255 + 3a84: 80 81 ld r24, Z + 3a86: f1 2c mov r15, r1 + 3a88: e8 1a sub r14, r24 + 3a8a: f1 08 sbc r15, r1 + 3a8c: 01 15 cp r16, r1 + 3a8e: 11 05 cpc r17, r1 + 3a90: a9 f0 breq .+42 ; 0x3abc + 3a92: 88 e0 ldi r24, 0x08 ; 8 + 3a94: e8 16 cp r14, r24 + 3a96: f1 04 cpc r15, r1 + 3a98: 88 f4 brcc .+34 ; 0x3abc + 3a9a: e6 01 movw r28, r12 + 3a9c: 04 c0 rjmp .+8 ; 0x3aa6 + 3a9e: 88 e0 ldi r24, 0x08 ; 8 + 3aa0: e8 16 cp r14, r24 + 3aa2: f1 04 cpc r15, r1 + 3aa4: 59 f0 breq .+22 ; 0x3abc + 3aa6: 89 91 ld r24, Y+ + 3aa8: 23 d1 rcall .+582 ; 0x3cf0 + 3aaa: 6e 01 movw r12, r28 + 3aac: 01 50 subi r16, 0x01 ; 1 + 3aae: 11 09 sbc r17, r1 + 3ab0: 8f ef ldi r24, 0xFF ; 255 + 3ab2: e8 1a sub r14, r24 + 3ab4: f8 0a sbc r15, r24 + 3ab6: 01 15 cp r16, r1 + 3ab8: 11 05 cpc r17, r1 + 3aba: 89 f7 brne .-30 ; 0x3a9e + 3abc: c1 e0 ldi r28, 0x01 ; 1 + 3abe: 88 e0 ldi r24, 0x08 ; 8 + 3ac0: e8 16 cp r14, r24 + 3ac2: f1 04 cpc r15, r1 + 3ac4: 09 f0 breq .+2 ; 0x3ac8 + 3ac6: c0 e0 ldi r28, 0x00 ; 0 + 3ac8: dc d0 rcall .+440 ; 0x3c82 + 3aca: 01 15 cp r16, r1 + 3acc: 11 05 cpc r17, r1 + 3ace: 09 f4 brne .+2 ; 0x3ad2 + 3ad0: b6 cf rjmp .-148 ; 0x3a3e + 3ad2: 80 91 14 23 lds r24, 0x2314 + 3ad6: 88 23 and r24, r24 + 3ad8: 79 f0 breq .+30 ; 0x3af8 + 3ada: 85 30 cpi r24, 0x05 ; 5 + 3adc: c1 f0 breq .+48 ; 0x3b0e + 3ade: 98 d1 rcall .+816 ; 0x3e10 + 3ae0: 81 11 cpse r24, r1 + 3ae2: 28 c0 rjmp .+80 ; 0x3b34 + 3ae4: ae d1 rcall .+860 ; 0x3e42 + 3ae6: 81 11 cpse r24, r1 + 3ae8: 09 c0 rjmp .+18 ; 0x3afc + 3aea: c4 d1 rcall .+904 ; 0x3e74 + 3aec: 81 11 cpse r24, r1 + 3aee: bb cf rjmp .-138 ; 0x3a66 + 3af0: 80 91 14 23 lds r24, 0x2314 + 3af4: 81 11 cpse r24, r1 + 3af6: f1 cf rjmp .-30 ; 0x3ada + 3af8: 82 e0 ldi r24, 0x02 ; 2 + 3afa: 0a c0 rjmp .+20 ; 0x3b10 + 3afc: a2 d1 rcall .+836 ; 0x3e42 + 3afe: 81 11 cpse r24, r1 + 3b00: 1f c0 rjmp .+62 ; 0x3b40 + 3b02: 80 91 14 23 lds r24, 0x2314 + 3b06: 88 23 and r24, r24 + 3b08: b9 f3 breq .-18 ; 0x3af8 + 3b0a: 85 30 cpi r24, 0x05 ; 5 + 3b0c: b9 f7 brne .-18 ; 0x3afc + 3b0e: 83 e0 ldi r24, 0x03 ; 3 + 3b10: df 91 pop r29 + 3b12: cf 91 pop r28 + 3b14: 1f 91 pop r17 + 3b16: 0f 91 pop r16 + 3b18: ff 90 pop r15 + 3b1a: ef 90 pop r14 + 3b1c: df 90 pop r13 + 3b1e: cf 90 pop r12 + 3b20: 08 95 ret + 3b22: e0 91 1d 23 lds r30, 0x231D + 3b26: f0 91 1e 23 lds r31, 0x231E + 3b2a: ef 5b subi r30, 0xBF ; 191 + 3b2c: ff 4f sbci r31, 0xFF ; 255 + 3b2e: e0 80 ld r14, Z + 3b30: f1 2c mov r15, r1 + 3b32: ac cf rjmp .-168 ; 0x3a8c + 3b34: 81 e0 ldi r24, 0x01 ; 1 + 3b36: ec cf rjmp .-40 ; 0x3b10 + 3b38: a4 d0 rcall .+328 ; 0x3c82 + 3b3a: 00 e0 ldi r16, 0x00 ; 0 + 3b3c: 10 e0 ldi r17, 0x00 ; 0 + 3b3e: 7a cf rjmp .-268 ; 0x3a34 + 3b40: 80 e0 ldi r24, 0x00 ; 0 + 3b42: e6 cf rjmp .-52 ; 0x3b10 + +00003b44 : + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, + uint16_t Length) +{ + 3b44: cf 92 push r12 + 3b46: df 92 push r13 + 3b48: ef 92 push r14 + 3b4a: ff 92 push r15 + 3b4c: 0f 93 push r16 + 3b4e: 1f 93 push r17 + 3b50: cf 93 push r28 + 3b52: df 93 push r29 + 3b54: d8 2e mov r13, r24 + 3b56: c9 2e mov r12, r25 + 3b58: 8b 01 movw r16, r22 + uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + bool LastPacketFull = false; + + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 3b5a: 80 91 21 23 lds r24, 0x2321 + 3b5e: 80 68 ori r24, 0x80 ; 128 + 3b60: d6 d0 rcall .+428 ; 0x3d0e + + if (Length > USB_ControlRequest.wLength) + 3b62: c0 91 1b 23 lds r28, 0x231B + 3b66: d0 91 1c 23 lds r29, 0x231C + 3b6a: c0 17 cp r28, r16 + 3b6c: d1 07 cpc r29, r17 + 3b6e: 28 f0 brcs .+10 ; 0x3b7a + Length = USB_ControlRequest.wLength; + else if (!(Length)) + 3b70: 01 15 cp r16, r1 + 3b72: 11 05 cpc r17, r1 + 3b74: 09 f4 brne .+2 ; 0x3b78 + 3b76: 7f c0 rjmp .+254 ; 0x3c76 + 3b78: e8 01 movw r28, r16 + 3b7a: ed 2c mov r14, r13 + 3b7c: fc 2c mov r15, r12 + 3b7e: d1 2c mov r13, r1 + 3b80: 20 97 sbiw r28, 0x00 ; 0 + 3b82: 09 f0 breq .+2 ; 0x3b86 + 3b84: 45 c0 rjmp .+138 ; 0x3c10 + 3b86: dd 20 and r13, r13 + 3b88: 09 f4 brne .+2 ; 0x3b8c + 3b8a: 57 c0 rjmp .+174 ; 0x3c3a + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3b8c: 80 91 14 23 lds r24, 0x2314 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3b90: 88 23 and r24, r24 + 3b92: 09 f4 brne .+2 ; 0x3b96 + 3b94: 50 c0 rjmp .+160 ; 0x3c36 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 3b96: 85 30 cpi r24, 0x05 ; 5 + 3b98: 09 f4 brne .+2 ; 0x3b9c + 3b9a: 58 c0 rjmp .+176 ; 0x3c4c + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 3b9c: 39 d1 rcall .+626 ; 0x3e10 + 3b9e: 81 11 cpse r24, r1 + 3ba0: 68 c0 rjmp .+208 ; 0x3c72 + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 3ba2: 4f d1 rcall .+670 ; 0x3e42 + 3ba4: 81 11 cpse r24, r1 + 3ba6: 49 c0 rjmp .+146 ; 0x3c3a + break; + + if (Endpoint_IsINReady()) + 3ba8: 65 d1 rcall .+714 ; 0x3e74 + 3baa: 88 23 and r24, r24 + 3bac: 79 f3 breq .-34 ; 0x3b8c + * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. + */ + static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Endpoint_BytesInEndpoint(void) + { + if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) + 3bae: 80 91 21 23 lds r24, 0x2321 + 3bb2: 87 fd sbrc r24, 7 + 3bb4: 55 c0 rjmp .+170 ; 0x3c60 + return USB_Endpoint_SelectedFIFO->Position; + else + return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); + 3bb6: 80 91 1d 23 lds r24, 0x231D + 3bba: 90 91 1e 23 lds r25, 0x231E + 3bbe: fc 01 movw r30, r24 + 3bc0: e0 5c subi r30, 0xC0 ; 192 + 3bc2: ff 4f sbci r31, 0xFF ; 255 + 3bc4: 00 81 ld r16, Z + 3bc6: fc 01 movw r30, r24 + 3bc8: ef 5b subi r30, 0xBF ; 191 + 3bca: ff 4f sbci r31, 0xFF ; 255 + 3bcc: 80 81 ld r24, Z + 3bce: 10 e0 ldi r17, 0x00 ; 0 + 3bd0: 08 1b sub r16, r24 + 3bd2: 11 09 sbc r17, r1 + { + uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + + while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) + 3bd4: 20 97 sbiw r28, 0x00 ; 0 + 3bd6: 91 f0 breq .+36 ; 0x3bfc + 3bd8: 08 30 cpi r16, 0x08 ; 8 + 3bda: 11 05 cpc r17, r1 + 3bdc: 20 f0 brcs .+8 ; 0x3be6 + 3bde: 0e c0 rjmp .+28 ; 0x3bfc + 3be0: 08 30 cpi r16, 0x08 ; 8 + 3be2: 11 05 cpc r17, r1 + 3be4: 59 f0 breq .+22 ; 0x3bfc + { + TEMPLATE_TRANSFER_BYTE(DataStream); + 3be6: f7 01 movw r30, r14 + 3be8: 84 91 lpm r24, Z + 3bea: 82 d0 rcall .+260 ; 0x3cf0 + TEMPLATE_BUFFER_MOVE(DataStream, 1); + 3bec: ff ef ldi r31, 0xFF ; 255 + 3bee: ef 1a sub r14, r31 + 3bf0: ff 0a sbc r15, r31 + Length--; + 3bf2: 21 97 sbiw r28, 0x01 ; 1 + BytesInEndpoint++; + 3bf4: 0f 5f subi r16, 0xFF ; 255 + 3bf6: 1f 4f sbci r17, 0xFF ; 255 + + if (Endpoint_IsINReady()) + { + uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + + while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) + 3bf8: 20 97 sbiw r28, 0x00 ; 0 + 3bfa: 91 f7 brne .-28 ; 0x3be0 + TEMPLATE_BUFFER_MOVE(DataStream, 1); + Length--; + BytesInEndpoint++; + } + + LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); + 3bfc: dd 24 eor r13, r13 + 3bfe: d3 94 inc r13 + 3c00: 08 30 cpi r16, 0x08 ; 8 + 3c02: 11 05 cpc r17, r1 + 3c04: 09 f0 breq .+2 ; 0x3c08 + 3c06: d1 2c mov r13, r1 + Endpoint_ClearIN(); + 3c08: 3c d0 rcall .+120 ; 0x3c82 + 3c0a: 20 97 sbiw r28, 0x00 ; 0 + 3c0c: 09 f4 brne .+2 ; 0x3c10 + 3c0e: bb cf rjmp .-138 ; 0x3b86 + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3c10: 80 91 14 23 lds r24, 0x2314 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3c14: 88 23 and r24, r24 + 3c16: 79 f0 breq .+30 ; 0x3c36 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 3c18: 85 30 cpi r24, 0x05 ; 5 + 3c1a: c1 f0 breq .+48 ; 0x3c4c + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 3c1c: f9 d0 rcall .+498 ; 0x3e10 + 3c1e: 81 11 cpse r24, r1 + 3c20: 28 c0 rjmp .+80 ; 0x3c72 + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 3c22: 0f d1 rcall .+542 ; 0x3e42 + 3c24: 81 11 cpse r24, r1 + 3c26: 09 c0 rjmp .+18 ; 0x3c3a + break; + + if (Endpoint_IsINReady()) + 3c28: 25 d1 rcall .+586 ; 0x3e74 + 3c2a: 81 11 cpse r24, r1 + 3c2c: c0 cf rjmp .-128 ; 0x3bae + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3c2e: 80 91 14 23 lds r24, 0x2314 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3c32: 81 11 cpse r24, r1 + 3c34: f1 cf rjmp .-30 ; 0x3c18 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + 3c36: 82 e0 ldi r24, 0x02 ; 2 + 3c38: 0a c0 rjmp .+20 ; 0x3c4e + LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); + Endpoint_ClearIN(); + } + } + + while (!(Endpoint_IsOUTReceived())) + 3c3a: 03 d1 rcall .+518 ; 0x3e42 + 3c3c: 81 11 cpse r24, r1 + 3c3e: 1f c0 rjmp .+62 ; 0x3c7e + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3c40: 80 91 14 23 lds r24, 0x2314 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3c44: 88 23 and r24, r24 + 3c46: b9 f3 breq .-18 ; 0x3c36 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 3c48: 85 30 cpi r24, 0x05 ; 5 + 3c4a: b9 f7 brne .-18 ; 0x3c3a + uint8_t USB_DeviceState_LCL = USB_DeviceState; + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + 3c4c: 83 e0 ldi r24, 0x03 ; 3 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 3c4e: df 91 pop r29 + 3c50: cf 91 pop r28 + 3c52: 1f 91 pop r17 + 3c54: 0f 91 pop r16 + 3c56: ff 90 pop r15 + 3c58: ef 90 pop r14 + 3c5a: df 90 pop r13 + 3c5c: cf 90 pop r12 + 3c5e: 08 95 ret + */ + static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Endpoint_BytesInEndpoint(void) + { + if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) + return USB_Endpoint_SelectedFIFO->Position; + 3c60: e0 91 1d 23 lds r30, 0x231D + 3c64: f0 91 1e 23 lds r31, 0x231E + 3c68: ef 5b subi r30, 0xBF ; 191 + 3c6a: ff 4f sbci r31, 0xFF ; 255 + 3c6c: 00 81 ld r16, Z + 3c6e: 10 e0 ldi r17, 0x00 ; 0 + 3c70: b1 cf rjmp .-158 ; 0x3bd4 + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + return ENDPOINT_RWCSTREAM_HostAborted; + 3c72: 81 e0 ldi r24, 0x01 ; 1 + 3c74: ec cf rjmp .-40 ; 0x3c4e + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + + if (Length > USB_ControlRequest.wLength) + Length = USB_ControlRequest.wLength; + else if (!(Length)) + Endpoint_ClearIN(); + 3c76: 05 d0 rcall .+10 ; 0x3c82 + 3c78: c0 e0 ldi r28, 0x00 ; 0 + 3c7a: d0 e0 ldi r29, 0x00 ; 0 + 3c7c: 7e cf rjmp .-260 ; 0x3b7a + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; + 3c7e: 80 e0 ldi r24, 0x00 ; 0 + 3c80: e6 cf rjmp .-52 ; 0x3c4e + +00003c82 : + USB_Endpoint_SelectedFIFO->Position = 0; +} + +void Endpoint_ClearIN(void) +{ + USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; + 3c82: e0 91 1f 23 lds r30, 0x231F + 3c86: f0 91 20 23 lds r31, 0x2320 + 3c8a: a0 91 1d 23 lds r26, 0x231D + 3c8e: b0 91 1e 23 lds r27, 0x231E + 3c92: af 5b subi r26, 0xBF ; 191 + 3c94: bf 4f sbci r27, 0xFF ; 255 + 3c96: 8c 91 ld r24, X + 3c98: 90 e0 ldi r25, 0x00 ; 0 + 3c9a: 82 83 std Z+2, r24 ; 0x02 + 3c9c: 93 83 std Z+3, r25 ; 0x03 + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 3c9e: 80 81 ld r24, Z + 3ca0: 8d 79 andi r24, 0x9D ; 157 + 3ca2: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3ca4: e0 91 1d 23 lds r30, 0x231D + 3ca8: f0 91 1e 23 lds r31, 0x231E + 3cac: ef 5b subi r30, 0xBF ; 191 + 3cae: ff 4f sbci r31, 0xFF ; 255 + 3cb0: 10 82 st Z, r1 + 3cb2: 08 95 ret + +00003cb4 : +} + +void Endpoint_ClearOUT(void) +{ + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 3cb4: e0 91 1f 23 lds r30, 0x231F + 3cb8: f0 91 20 23 lds r31, 0x2320 + 3cbc: 80 81 ld r24, Z + 3cbe: 8d 79 andi r24, 0x9D ; 157 + 3cc0: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3cc2: e0 91 1d 23 lds r30, 0x231D + 3cc6: f0 91 1e 23 lds r31, 0x231E + 3cca: ef 5b subi r30, 0xBF ; 191 + 3ccc: ff 4f sbci r31, 0xFF ; 255 + 3cce: 10 82 st Z, r1 + 3cd0: 08 95 ret + +00003cd2 : + } +} + +uint8_t Endpoint_Read_8(void) +{ + return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; + 3cd2: 80 91 1d 23 lds r24, 0x231D + 3cd6: 90 91 1e 23 lds r25, 0x231E + 3cda: fc 01 movw r30, r24 + 3cdc: ef 5b subi r30, 0xBF ; 191 + 3cde: ff 4f sbci r31, 0xFF ; 255 + 3ce0: 20 81 ld r18, Z + 3ce2: dc 01 movw r26, r24 + 3ce4: a2 0f add r26, r18 + 3ce6: b1 1d adc r27, r1 + 3ce8: 8c 91 ld r24, X + 3cea: 2f 5f subi r18, 0xFF ; 255 + 3cec: 20 83 st Z, r18 +} + 3cee: 08 95 ret + +00003cf0 : + +void Endpoint_Write_8(const uint8_t Data) +{ + USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; + 3cf0: 20 91 1d 23 lds r18, 0x231D + 3cf4: 30 91 1e 23 lds r19, 0x231E + 3cf8: f9 01 movw r30, r18 + 3cfa: ef 5b subi r30, 0xBF ; 191 + 3cfc: ff 4f sbci r31, 0xFF ; 255 + 3cfe: 90 81 ld r25, Z + 3d00: d9 01 movw r26, r18 + 3d02: a9 0f add r26, r25 + 3d04: b1 1d adc r27, r1 + 3d06: 8c 93 st X, r24 + 3d08: 9f 5f subi r25, 0xFF ; 255 + 3d0a: 90 83 st Z, r25 + 3d0c: 08 95 ret + +00003d0e : + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ + uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + + USB_Endpoint_SelectedEndpoint = Address; + 3d0e: 80 93 21 23 sts 0x2321, r24 + USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; +} + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ + uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + 3d12: 28 2f mov r18, r24 + 3d14: 2f 70 andi r18, 0x0F ; 15 + + USB_Endpoint_SelectedEndpoint = Address; + + Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; + 3d16: 62 2f mov r22, r18 + 3d18: 70 e0 ldi r23, 0x00 ; 0 + 3d1a: 94 e8 ldi r25, 0x84 ; 132 + 3d1c: 29 9f mul r18, r25 + 3d1e: 90 01 movw r18, r0 + 3d20: 11 24 eor r1, r1 + 3d22: 2e 5d subi r18, 0xDE ; 222 + 3d24: 3c 4d sbci r19, 0xDC ; 220 + USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; + 3d26: 40 91 c6 04 lds r20, 0x04C6 + 3d2a: 50 91 c7 04 lds r21, 0x04C7 + + if (Address & ENDPOINT_DIR_IN) + 3d2e: 87 fd sbrc r24, 7 + 3d30: 12 c0 rjmp .+36 ; 0x3d56 + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; + } + else + { + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; + 3d32: 20 93 1d 23 sts 0x231D, r18 + 3d36: 30 93 1e 23 sts 0x231E, r19 + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; + 3d3a: cb 01 movw r24, r22 + 3d3c: 82 95 swap r24 + 3d3e: 92 95 swap r25 + 3d40: 90 7f andi r25, 0xF0 ; 240 + 3d42: 98 27 eor r25, r24 + 3d44: 80 7f andi r24, 0xF0 ; 240 + 3d46: 98 27 eor r25, r24 + 3d48: 84 0f add r24, r20 + 3d4a: 95 1f adc r25, r21 + 3d4c: 80 93 1f 23 sts 0x231F, r24 + 3d50: 90 93 20 23 sts 0x2320, r25 + 3d54: 08 95 ret + Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; + USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; + + if (Address & ENDPOINT_DIR_IN) + { + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; + 3d56: 2e 5b subi r18, 0xBE ; 190 + 3d58: 3f 4f sbci r19, 0xFF ; 255 + 3d5a: 20 93 1d 23 sts 0x231D, r18 + 3d5e: 30 93 1e 23 sts 0x231E, r19 + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; + 3d62: 62 95 swap r22 + 3d64: 72 95 swap r23 + 3d66: 70 7f andi r23, 0xF0 ; 240 + 3d68: 76 27 eor r23, r22 + 3d6a: 60 7f andi r22, 0xF0 ; 240 + 3d6c: 76 27 eor r23, r22 + 3d6e: 68 5f subi r22, 0xF8 ; 248 + 3d70: 7f 4f sbci r23, 0xFF ; 255 + 3d72: 64 0f add r22, r20 + 3d74: 75 1f adc r23, r21 + 3d76: 60 93 1f 23 sts 0x231F, r22 + 3d7a: 70 93 20 23 sts 0x2320, r23 + 3d7e: 08 95 ret + +00003d80 : + USB_Endpoint_SelectedFIFO->Position = 0; +} + +void Endpoint_StallTransaction(void) +{ + USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + 3d80: e0 91 1f 23 lds r30, 0x231F + 3d84: f0 91 20 23 lds r31, 0x2320 + 3d88: 81 81 ldd r24, Z+1 ; 0x01 + 3d8a: 84 60 ori r24, 0x04 ; 4 + 3d8c: 81 83 std Z+1, r24 ; 0x01 + + if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) + 3d8e: e0 91 1f 23 lds r30, 0x231F + 3d92: f0 91 20 23 lds r31, 0x2320 + 3d96: 81 81 ldd r24, Z+1 ; 0x01 + 3d98: 80 7c andi r24, 0xC0 ; 192 + 3d9a: 80 34 cpi r24, 0x40 ; 64 + 3d9c: 09 f0 breq .+2 ; 0x3da0 + 3d9e: 08 95 ret + { + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); + 3da0: 80 91 21 23 lds r24, 0x2321 + 3da4: 80 58 subi r24, 0x80 ; 128 + 3da6: b3 df rcall .-154 ; 0x3d0e + USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + 3da8: e0 91 1f 23 lds r30, 0x231F + 3dac: f0 91 20 23 lds r31, 0x2320 + 3db0: 81 81 ldd r24, Z+1 ; 0x01 + 3db2: 84 60 ori r24, 0x04 ; 4 + 3db4: 81 83 std Z+1, r24 ; 0x01 + 3db6: 08 95 ret + +00003db8 : + return false; +} + +void Endpoint_ClearSETUP(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 3db8: 80 91 21 23 lds r24, 0x2321 + 3dbc: 8f 77 andi r24, 0x7F ; 127 + 3dbe: a7 df rcall .-178 ; 0x3d0e + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 3dc0: e0 91 1f 23 lds r30, 0x231F + 3dc4: f0 91 20 23 lds r31, 0x2320 + 3dc8: 80 81 ld r24, Z + 3dca: 8d 78 andi r24, 0x8D ; 141 + 3dcc: 80 83 st Z, r24 + USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; + 3dce: e0 91 1f 23 lds r30, 0x231F + 3dd2: f0 91 20 23 lds r31, 0x2320 + 3dd6: 80 81 ld r24, Z + 3dd8: 81 60 ori r24, 0x01 ; 1 + 3dda: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3ddc: e0 91 1d 23 lds r30, 0x231D + 3de0: f0 91 1e 23 lds r31, 0x231E + 3de4: ef 5b subi r30, 0xBF ; 191 + 3de6: ff 4f sbci r31, 0xFF ; 255 + 3de8: 10 82 st Z, r1 + + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 3dea: 80 91 21 23 lds r24, 0x2321 + 3dee: 80 68 ori r24, 0x80 ; 128 + 3df0: 8e df rcall .-228 ; 0x3d0e + USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; + 3df2: e0 91 1f 23 lds r30, 0x231F + 3df6: f0 91 20 23 lds r31, 0x2320 + 3dfa: 80 81 ld r24, Z + 3dfc: 81 60 ori r24, 0x01 ; 1 + 3dfe: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3e00: e0 91 1d 23 lds r30, 0x231D + 3e04: f0 91 1e 23 lds r31, 0x231E + 3e08: ef 5b subi r30, 0xBF ; 191 + 3e0a: ff 4f sbci r31, 0xFF ; 255 + 3e0c: 10 82 st Z, r1 + 3e0e: 08 95 ret + +00003e10 : + return false; +} + +bool Endpoint_IsSETUPReceived(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 3e10: 80 91 21 23 lds r24, 0x2321 + 3e14: 8f 77 andi r24, 0x7F ; 127 + 3e16: 7b df rcall .-266 ; 0x3d0e + + if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) + 3e18: e0 91 1f 23 lds r30, 0x231F + 3e1c: f0 91 20 23 lds r31, 0x2320 + 3e20: 80 81 ld r24, Z + 3e22: 84 ff sbrs r24, 4 + 3e24: 0c c0 rjmp .+24 ; 0x3e3e + { + USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; + 3e26: 20 91 1d 23 lds r18, 0x231D + 3e2a: 30 91 1e 23 lds r19, 0x231E + 3e2e: 82 81 ldd r24, Z+2 ; 0x02 + 3e30: 93 81 ldd r25, Z+3 ; 0x03 + 3e32: f9 01 movw r30, r18 + 3e34: e0 5c subi r30, 0xC0 ; 192 + 3e36: ff 4f sbci r31, 0xFF ; 255 + 3e38: 80 83 st Z, r24 + return true; + 3e3a: 81 e0 ldi r24, 0x01 ; 1 + 3e3c: 08 95 ret + } + + return false; + 3e3e: 80 e0 ldi r24, 0x00 ; 0 +} + 3e40: 08 95 ret + +00003e42 : + return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); +} + +bool Endpoint_IsOUTReceived(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 3e42: 80 91 21 23 lds r24, 0x2321 + 3e46: 8f 77 andi r24, 0x7F ; 127 + 3e48: 62 df rcall .-316 ; 0x3d0e + + if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) + 3e4a: e0 91 1f 23 lds r30, 0x231F + 3e4e: f0 91 20 23 lds r31, 0x2320 + 3e52: 80 81 ld r24, Z + 3e54: 85 ff sbrs r24, 5 + 3e56: 0c c0 rjmp .+24 ; 0x3e70 + { + USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; + 3e58: 20 91 1d 23 lds r18, 0x231D + 3e5c: 30 91 1e 23 lds r19, 0x231E + 3e60: 82 81 ldd r24, Z+2 ; 0x02 + 3e62: 93 81 ldd r25, Z+3 ; 0x03 + 3e64: f9 01 movw r30, r18 + 3e66: e0 5c subi r30, 0xC0 ; 192 + 3e68: ff 4f sbci r31, 0xFF ; 255 + 3e6a: 80 83 st Z, r24 + return true; + 3e6c: 81 e0 ldi r24, 0x01 ; 1 + 3e6e: 08 95 ret + } + + return false; + 3e70: 80 e0 ldi r24, 0x00 ; 0 +} + 3e72: 08 95 ret + +00003e74 : +volatile USB_EP_t* USB_Endpoint_SelectedHandle; +volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; + +bool Endpoint_IsINReady(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 3e74: 80 91 21 23 lds r24, 0x2321 + 3e78: 80 68 ori r24, 0x80 ; 128 + 3e7a: 49 df rcall .-366 ; 0x3d0e + + return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); + 3e7c: e0 91 1f 23 lds r30, 0x231F + 3e80: f0 91 20 23 lds r31, 0x2320 + 3e84: 80 81 ld r24, Z +} + 3e86: 86 95 lsr r24 + 3e88: 81 70 andi r24, 0x01 ; 1 + 3e8a: 08 95 ret + +00003e8c : +} + +bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, + const uint8_t Config, + const uint8_t Size) +{ + 3e8c: 1f 93 push r17 + 3e8e: cf 93 push r28 + 3e90: df 93 push r29 + 3e92: 00 d0 rcall .+0 ; 0x3e94 + 3e94: cd b7 in r28, 0x3d ; 61 + 3e96: de b7 in r29, 0x3e ; 62 + 3e98: 18 2f mov r17, r24 + Endpoint_SelectEndpoint(Address); + 3e9a: 4a 83 std Y+2, r20 ; 0x02 + 3e9c: 69 83 std Y+1, r22 ; 0x01 + 3e9e: 37 df rcall .-402 ; 0x3d0e + + USB_Endpoint_SelectedHandle->CTRL = 0; + 3ea0: e0 91 1f 23 lds r30, 0x231F + 3ea4: f0 91 20 23 lds r31, 0x2320 + 3ea8: 11 82 std Z+1, r1 ; 0x01 + USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; + 3eaa: e0 91 1f 23 lds r30, 0x231F + 3eae: f0 91 20 23 lds r31, 0x2320 + 3eb2: 4a 81 ldd r20, Y+2 ; 0x02 + 3eb4: 69 81 ldd r22, Y+1 ; 0x01 + 3eb6: 17 fd sbrc r17, 7 + 3eb8: 22 c0 rjmp .+68 ; 0x3efe + 3eba: 10 82 st Z, r1 + USB_Endpoint_SelectedHandle->CTRL = Config; + 3ebc: e0 91 1f 23 lds r30, 0x231F + 3ec0: f0 91 20 23 lds r31, 0x2320 + 3ec4: 61 83 std Z+1, r22 ; 0x01 + USB_Endpoint_SelectedHandle->CNT = 0; + 3ec6: e0 91 1f 23 lds r30, 0x231F + 3eca: f0 91 20 23 lds r31, 0x2320 + 3ece: 12 82 std Z+2, r1 ; 0x02 + 3ed0: 13 82 std Z+3, r1 ; 0x03 + USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + 3ed2: 80 91 1d 23 lds r24, 0x231D + 3ed6: 90 91 1e 23 lds r25, 0x231E + 3eda: 84 83 std Z+4, r24 ; 0x04 + 3edc: 95 83 std Z+5, r25 ; 0x05 + + USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; + 3ede: 40 e0 ldi r20, 0x00 ; 0 + 3ee0: fc 01 movw r30, r24 + 3ee2: e0 5c subi r30, 0xC0 ; 192 + 3ee4: ff 4f sbci r31, 0xFF ; 255 + 3ee6: 40 83 st Z, r20 + USB_Endpoint_SelectedFIFO->Position = 0; + 3ee8: fc 01 movw r30, r24 + 3eea: ef 5b subi r30, 0xBF ; 191 + 3eec: ff 4f sbci r31, 0xFF ; 255 + 3eee: 10 82 st Z, r1 + + return true; +} + 3ef0: 81 e0 ldi r24, 0x01 ; 1 + 3ef2: 0f 90 pop r0 + 3ef4: 0f 90 pop r0 + 3ef6: df 91 pop r29 + 3ef8: cf 91 pop r28 + 3efa: 1f 91 pop r17 + 3efc: 08 95 ret + const uint8_t Size) +{ + Endpoint_SelectEndpoint(Address); + + USB_Endpoint_SelectedHandle->CTRL = 0; + USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; + 3efe: 82 e0 ldi r24, 0x02 ; 2 + 3f00: 80 83 st Z, r24 + USB_Endpoint_SelectedHandle->CTRL = Config; + 3f02: e0 91 1f 23 lds r30, 0x231F + 3f06: f0 91 20 23 lds r31, 0x2320 + 3f0a: 61 83 std Z+1, r22 ; 0x01 + USB_Endpoint_SelectedHandle->CNT = 0; + 3f0c: e0 91 1f 23 lds r30, 0x231F + 3f10: f0 91 20 23 lds r31, 0x2320 + 3f14: 12 82 std Z+2, r1 ; 0x02 + 3f16: 13 82 std Z+3, r1 ; 0x03 + USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + 3f18: 80 91 1d 23 lds r24, 0x231D + 3f1c: 90 91 1e 23 lds r25, 0x231E + 3f20: 84 83 std Z+4, r24 ; 0x04 + 3f22: 95 83 std Z+5, r25 ; 0x05 + 3f24: dd cf rjmp .-70 ; 0x3ee0 + +00003f26 : + } +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + const uint8_t Entries) +{ + 3f26: af 92 push r10 + 3f28: bf 92 push r11 + 3f2a: df 92 push r13 + 3f2c: ef 92 push r14 + 3f2e: ff 92 push r15 + 3f30: 0f 93 push r16 + 3f32: 1f 93 push r17 + 3f34: cf 93 push r28 + 3f36: df 93 push r29 + 3f38: 00 d0 rcall .+0 ; 0x3f3a + 3f3a: cd b7 in r28, 0x3d ; 61 + 3f3c: de b7 in r29, 0x3e ; 62 + 3f3e: e6 2e mov r14, r22 + for (uint8_t i = 0; i < Entries; i++) + 3f40: 66 23 and r22, r22 + 3f42: 09 f4 brne .+2 ; 0x3f46 + 3f44: 4a c0 rjmp .+148 ; 0x3fda + 3f46: 5c 01 movw r10, r24 + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; + } +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + 3f48: 8c 01 movw r16, r24 + 3f4a: 0c 5f subi r16, 0xFC ; 252 + 3f4c: 1f 4f sbci r17, 0xFF ; 255 + const uint8_t Entries) +{ + for (uint8_t i = 0; i < Entries; i++) + 3f4e: f1 2c mov r15, r1 + { + if (!(Table[i].Address)) + 3f50: d5 01 movw r26, r10 + 3f52: 5c 91 ld r21, X + 3f54: 55 23 and r21, r21 + 3f56: c9 f1 breq .+114 ; 0x3fca + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + 3f58: d5 01 movw r26, r10 + 3f5a: 11 96 adiw r26, 0x01 ; 1 + 3f5c: ed 91 ld r30, X+ + 3f5e: fc 91 ld r31, X + 3f60: 12 97 sbiw r26, 0x02 ; 2 + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; + } +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + 3f62: d8 01 movw r26, r16 + 3f64: 11 97 sbiw r26, 0x01 ; 1 + for (uint8_t i = 0; i < Entries; i++) + { + if (!(Table[i].Address)) + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + 3f66: 4c 91 ld r20, X + static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, + const uint8_t Type, + const uint16_t Size, + const uint8_t Banks) + { + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + 3f68: d8 01 movw r26, r16 + 3f6a: 8c 91 ld r24, X + 3f6c: 82 30 cpi r24, 0x02 ; 2 + 3f6e: 08 f4 brcc .+2 ; 0x3f72 + 3f70: 43 c0 rjmp .+134 ; 0x3ff8 + 3f72: 98 e1 ldi r25, 0x18 ; 24 + 3f74: 88 e1 ldi r24, 0x18 ; 24 + static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) + { + uint8_t MaskVal = 0; + uint16_t CheckBytes = 8; + + while (CheckBytes < Bytes) + 3f76: e9 30 cpi r30, 0x09 ; 9 + 3f78: f1 05 cpc r31, r1 + 3f7a: 50 f0 brcs .+20 ; 0x3f90 + 3f7c: 28 e0 ldi r18, 0x08 ; 8 + 3f7e: 30 e0 ldi r19, 0x00 ; 0 + 3f80: 90 e0 ldi r25, 0x00 ; 0 + { + MaskVal++; + 3f82: 9f 5f subi r25, 0xFF ; 255 + CheckBytes <<= 1; + 3f84: 22 0f add r18, r18 + 3f86: 33 1f adc r19, r19 + static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) + { + uint8_t MaskVal = 0; + uint16_t CheckBytes = 8; + + while (CheckBytes < Bytes) + 3f88: 2e 17 cp r18, r30 + 3f8a: 3f 07 cpc r19, r31 + 3f8c: d0 f3 brcs .-12 ; 0x3f82 + 3f8e: 98 2b or r25, r24 + const uint16_t Size, + const uint8_t Banks) + { + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + + if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) + 3f90: 25 2f mov r18, r21 + 3f92: 2f 70 andi r18, 0x0F ; 15 + 3f94: 30 e0 ldi r19, 0x00 ; 0 + 3f96: 26 30 cpi r18, 0x06 ; 6 + 3f98: 31 05 cpc r19, r1 + 3f9a: 64 f5 brge .+88 ; 0x3ff4 + return false; + + // TODO - Fix once limitations are lifted + EPConfigMask &= ~USB_EP_PINGPONG_bm; + if (Size > 64) + 3f9c: e1 34 cpi r30, 0x41 ; 65 + 3f9e: f1 05 cpc r31, r1 + 3fa0: 48 f5 brcc .+82 ; 0x3ff4 + + if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) + return false; + + // TODO - Fix once limitations are lifted + EPConfigMask &= ~USB_EP_PINGPONG_bm; + 3fa2: 9f 7e andi r25, 0xEF ; 239 + if (Size > 64) + return false; + + switch (Type) + 3fa4: 41 11 cpse r20, r1 + 3fa6: 2b c0 rjmp .+86 ; 0x3ffe + { + case EP_TYPE_CONTROL: + EPConfigMask |= USB_EP_TYPE_CONTROL_gc; + 3fa8: 90 64 ori r25, 0x40 ; 64 + EPConfigMask |= USB_EP_TYPE_BULK_gc; + break; + } + + if (Type == EP_TYPE_CONTROL) + Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + 3faa: de 2e mov r13, r30 + 3fac: 4e 2f mov r20, r30 + 3fae: 69 2f mov r22, r25 + 3fb0: 85 2f mov r24, r21 + 3fb2: 80 58 subi r24, 0x80 ; 128 + 3fb4: 59 83 std Y+1, r21 ; 0x01 + 3fb6: 9a 83 std Y+2, r25 ; 0x02 + 3fb8: 69 df rcall .-302 ; 0x3e8c + 3fba: 9a 81 ldd r25, Y+2 ; 0x02 + 3fbc: 59 81 ldd r21, Y+1 ; 0x01 + + return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); + 3fbe: 4d 2d mov r20, r13 + 3fc0: 69 2f mov r22, r25 + 3fc2: 85 2f mov r24, r21 + 3fc4: 63 df rcall .-314 ; 0x3e8c + 3fc6: 88 23 and r24, r24 + 3fc8: a9 f0 breq .+42 ; 0x3ff4 +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + const uint8_t Entries) +{ + for (uint8_t i = 0; i < Entries; i++) + 3fca: f3 94 inc r15 + 3fcc: b5 e0 ldi r27, 0x05 ; 5 + 3fce: ab 0e add r10, r27 + 3fd0: b1 1c adc r11, r1 + 3fd2: 0b 5f subi r16, 0xFB ; 251 + 3fd4: 1f 4f sbci r17, 0xFF ; 255 + 3fd6: fe 10 cpse r15, r14 + 3fd8: bb cf rjmp .-138 ; 0x3f50 + { + return false; + } + } + + return true; + 3fda: 81 e0 ldi r24, 0x01 ; 1 +} + 3fdc: 0f 90 pop r0 + 3fde: 0f 90 pop r0 + 3fe0: df 91 pop r29 + 3fe2: cf 91 pop r28 + 3fe4: 1f 91 pop r17 + 3fe6: 0f 91 pop r16 + 3fe8: ff 90 pop r15 + 3fea: ef 90 pop r14 + 3fec: df 90 pop r13 + 3fee: bf 90 pop r11 + 3ff0: af 90 pop r10 + 3ff2: 08 95 ret + if (!(Table[i].Address)) + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + { + return false; + 3ff4: 80 e0 ldi r24, 0x00 ; 0 + 3ff6: f2 cf rjmp .-28 ; 0x3fdc + static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, + const uint8_t Type, + const uint16_t Size, + const uint8_t Banks) + { + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + 3ff8: 98 e0 ldi r25, 0x08 ; 8 + 3ffa: 88 e0 ldi r24, 0x08 ; 8 + 3ffc: bc cf rjmp .-136 ; 0x3f76 + // TODO - Fix once limitations are lifted + EPConfigMask &= ~USB_EP_PINGPONG_bm; + if (Size > 64) + return false; + + switch (Type) + 3ffe: 41 30 cpi r20, 0x01 ; 1 + 4000: 29 f0 breq .+10 ; 0x400c + break; + case EP_TYPE_ISOCHRONOUS: + EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; + break; + default: + EPConfigMask |= USB_EP_TYPE_BULK_gc; + 4002: 90 68 ori r25, 0x80 ; 128 + break; + } + + if (Type == EP_TYPE_CONTROL) + 4004: 44 23 and r20, r20 + 4006: 89 f2 breq .-94 ; 0x3faa + 4008: de 2e mov r13, r30 + 400a: d9 cf rjmp .-78 ; 0x3fbe + { + case EP_TYPE_CONTROL: + EPConfigMask |= USB_EP_TYPE_CONTROL_gc; + break; + case EP_TYPE_ISOCHRONOUS: + EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; + 400c: 90 6c ori r25, 0xC0 ; 192 + 400e: de 2e mov r13, r30 + 4010: d6 cf rjmp .-84 ; 0x3fbe + +00004012 : + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 4012: e0 ec ldi r30, 0xC0 ; 192 + 4014: f4 e0 ldi r31, 0x04 ; 4 + 4016: a6 81 ldd r26, Z+6 ; 0x06 + 4018: b7 81 ldd r27, Z+7 ; 0x07 + 401a: 19 96 adiw r26, 0x09 ; 9 + 401c: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 401e: a6 81 ldd r26, Z+6 ; 0x06 + 4020: b7 81 ldd r27, Z+7 ; 0x07 + 4022: 11 96 adiw r26, 0x01 ; 1 + 4024: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 4026: a6 81 ldd r26, Z+6 ; 0x06 + 4028: b7 81 ldd r27, Z+7 ; 0x07 + 402a: 59 96 adiw r26, 0x19 ; 25 + 402c: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 402e: a6 81 ldd r26, Z+6 ; 0x06 + 4030: b7 81 ldd r27, Z+7 ; 0x07 + 4032: 51 96 adiw r26, 0x11 ; 17 + 4034: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 4036: a6 81 ldd r26, Z+6 ; 0x06 + 4038: b7 81 ldd r27, Z+7 ; 0x07 + 403a: 99 96 adiw r26, 0x29 ; 41 + 403c: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 403e: a6 81 ldd r26, Z+6 ; 0x06 + 4040: b7 81 ldd r27, Z+7 ; 0x07 + 4042: 91 96 adiw r26, 0x21 ; 33 + 4044: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 4046: a6 81 ldd r26, Z+6 ; 0x06 + 4048: b7 81 ldd r27, Z+7 ; 0x07 + 404a: d9 96 adiw r26, 0x39 ; 57 + 404c: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 404e: a6 81 ldd r26, Z+6 ; 0x06 + 4050: b7 81 ldd r27, Z+7 ; 0x07 + 4052: d1 96 adiw r26, 0x31 ; 49 + 4054: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 4056: a6 81 ldd r26, Z+6 ; 0x06 + 4058: b7 81 ldd r27, Z+7 ; 0x07 + 405a: a7 5b subi r26, 0xB7 ; 183 + 405c: bf 4f sbci r27, 0xFF ; 255 + 405e: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4060: a6 81 ldd r26, Z+6 ; 0x06 + 4062: b7 81 ldd r27, Z+7 ; 0x07 + 4064: af 5b subi r26, 0xBF ; 191 + 4066: bf 4f sbci r27, 0xFF ; 255 + 4068: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 406a: a6 81 ldd r26, Z+6 ; 0x06 + 406c: b7 81 ldd r27, Z+7 ; 0x07 + 406e: a7 5a subi r26, 0xA7 ; 167 + 4070: bf 4f sbci r27, 0xFF ; 255 + 4072: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4074: 06 80 ldd r0, Z+6 ; 0x06 + 4076: f7 81 ldd r31, Z+7 ; 0x07 + 4078: e0 2d mov r30, r0 + 407a: ef 5a subi r30, 0xAF ; 175 + 407c: ff 4f sbci r31, 0xFF ; 255 + 407e: 10 82 st Z, r1 + 4080: 08 95 ret + +00004082 : + } +} + +void Endpoint_ClearStatusStage(void) +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + 4082: 80 91 15 23 lds r24, 0x2315 + 4086: 87 fd sbrc r24, 7 + 4088: 08 c0 rjmp .+16 ; 0x409a + + Endpoint_ClearOUT(); + } + else + { + while (!(Endpoint_IsINReady())) + 408a: f4 de rcall .-536 ; 0x3e74 + 408c: 81 11 cpse r24, r1 + 408e: 0d c0 rjmp .+26 ; 0x40aa + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 4090: 80 91 14 23 lds r24, 0x2314 + 4094: 81 11 cpse r24, r1 + 4096: f9 cf rjmp .-14 ; 0x408a + 4098: 08 95 ret + +void Endpoint_ClearStatusStage(void) +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + { + while (!(Endpoint_IsOUTReceived())) + 409a: d3 de rcall .-602 ; 0x3e42 + 409c: 81 11 cpse r24, r1 + 409e: 06 c0 rjmp .+12 ; 0x40ac + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 40a0: 80 91 14 23 lds r24, 0x2314 + 40a4: 81 11 cpse r24, r1 + 40a6: f9 cf rjmp .-14 ; 0x409a + 40a8: 08 95 ret + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + 40aa: eb cd rjmp .-1066 ; 0x3c82 + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearOUT(); + 40ac: 03 ce rjmp .-1018 ; 0x3cb4 + +000040ae : + } +} + +#if !defined(CONTROL_ONLY_DEVICE) +uint8_t Endpoint_WaitUntilReady(void) +{ + 40ae: 1f 93 push r17 + 40b0: cf 93 push r28 + 40b2: df 93 push r29 + * \return Current USB frame number from the USB controller. + */ + static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + static inline uint16_t USB_Device_GetFrameNumber(void) + { + return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum; + 40b4: e0 91 c6 04 lds r30, 0x04C6 + 40b8: f0 91 c7 04 lds r31, 0x04C7 + 40bc: e0 5a subi r30, 0xA0 ; 160 + 40be: ff 4f sbci r31, 0xFF ; 255 + 40c0: c0 81 ld r28, Z + 40c2: d1 81 ldd r29, Z+1 ; 0x01 + #if (USB_STREAM_TIMEOUT_MS < 0xFF) + uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; + 40c4: 14 e6 ldi r17, 0x64 ; 100 + * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. + */ + static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Endpoint_GetEndpointDirection(void) + { + return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); + 40c6: 80 91 21 23 lds r24, 0x2321 + 40ca: 80 78 andi r24, 0x80 ; 128 + + uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); + + for (;;) + { + if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) + 40cc: 80 38 cpi r24, 0x80 ; 128 + 40ce: 31 f1 breq .+76 ; 0x411c + if (Endpoint_IsINReady()) + return ENDPOINT_READYWAIT_NoError; + } + else + { + if (Endpoint_IsOUTReceived()) + 40d0: b8 de rcall .-656 ; 0x3e42 + 40d2: 81 11 cpse r24, r1 + 40d4: 26 c0 rjmp .+76 ; 0x4122 + return ENDPOINT_READYWAIT_NoError; + } + + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 40d6: 80 91 14 23 lds r24, 0x2314 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 40da: 88 23 and r24, r24 + 40dc: 39 f1 breq .+78 ; 0x412c + return ENDPOINT_READYWAIT_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 40de: 85 30 cpi r24, 0x05 ; 5 + 40e0: 51 f1 breq .+84 ; 0x4136 + * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. + */ + static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Endpoint_IsStalled(void) + { + return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); + 40e2: e0 91 1f 23 lds r30, 0x231F + 40e6: f0 91 20 23 lds r31, 0x2320 + 40ea: 81 81 ldd r24, Z+1 ; 0x01 + return ENDPOINT_READYWAIT_BusSuspended; + else if (Endpoint_IsStalled()) + 40ec: 82 fd sbrc r24, 2 + 40ee: 28 c0 rjmp .+80 ; 0x4140 + 40f0: e0 91 c6 04 lds r30, 0x04C6 + 40f4: f0 91 c7 04 lds r31, 0x04C7 + 40f8: e0 5a subi r30, 0xA0 ; 160 + 40fa: ff 4f sbci r31, 0xFF ; 255 + 40fc: 80 81 ld r24, Z + 40fe: 91 81 ldd r25, Z+1 ; 0x01 + return ENDPOINT_READYWAIT_EndpointStalled; + + uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); + + if (CurrentFrameNumber != PreviousFrameNumber) + 4100: c8 17 cp r28, r24 + 4102: d9 07 cpc r29, r25 + 4104: 01 f3 breq .-64 ; 0x40c6 + { + PreviousFrameNumber = CurrentFrameNumber; + + if (!(TimeoutMSRem--)) + 4106: 21 2f mov r18, r17 + 4108: 21 50 subi r18, 0x01 ; 1 + 410a: 11 23 and r17, r17 + 410c: f1 f0 breq .+60 ; 0x414a + 410e: ec 01 movw r28, r24 + 4110: 12 2f mov r17, r18 + * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. + */ + static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Endpoint_GetEndpointDirection(void) + { + return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); + 4112: 80 91 21 23 lds r24, 0x2321 + 4116: 80 78 andi r24, 0x80 ; 128 + + uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); + + for (;;) + { + if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) + 4118: 80 38 cpi r24, 0x80 ; 128 + 411a: d1 f6 brne .-76 ; 0x40d0 + { + if (Endpoint_IsINReady()) + 411c: ab de rcall .-682 ; 0x3e74 + 411e: 88 23 and r24, r24 + 4120: d1 f2 breq .-76 ; 0x40d6 + return ENDPOINT_READYWAIT_NoError; + 4122: 80 e0 ldi r24, 0x00 ; 0 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 4124: df 91 pop r29 + 4126: cf 91 pop r28 + 4128: 1f 91 pop r17 + 412a: 08 95 ret + } + + uint8_t USB_DeviceState_LCL = USB_DeviceState; + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_READYWAIT_DeviceDisconnected; + 412c: 82 e0 ldi r24, 0x02 ; 2 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 412e: df 91 pop r29 + 4130: cf 91 pop r28 + 4132: 1f 91 pop r17 + 4134: 08 95 ret + uint8_t USB_DeviceState_LCL = USB_DeviceState; + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_READYWAIT_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_READYWAIT_BusSuspended; + 4136: 83 e0 ldi r24, 0x03 ; 3 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 4138: df 91 pop r29 + 413a: cf 91 pop r28 + 413c: 1f 91 pop r17 + 413e: 08 95 ret + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_READYWAIT_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_READYWAIT_BusSuspended; + else if (Endpoint_IsStalled()) + return ENDPOINT_READYWAIT_EndpointStalled; + 4140: 81 e0 ldi r24, 0x01 ; 1 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 4142: df 91 pop r29 + 4144: cf 91 pop r28 + 4146: 1f 91 pop r17 + 4148: 08 95 ret + if (CurrentFrameNumber != PreviousFrameNumber) + { + PreviousFrameNumber = CurrentFrameNumber; + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + 414a: 84 e0 ldi r24, 0x04 ; 4 + } + } +} + 414c: df 91 pop r29 + 414e: cf 91 pop r28 + 4150: 1f 91 pop r17 + 4152: 08 95 ret + +00004154 : + USB_ResetInterface(); +} + +void USB_Disable(void) +{ + USB_INT_DisableAllInterrupts(); + 4154: 63 d0 rcall .+198 ; 0x421c + USB_INT_ClearAllInterrupts(); + 4156: 69 d0 rcall .+210 ; 0x422a + * enumerating the device once attached until \ref USB_Attach() is called. + */ + static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; + static inline void USB_Detach(void) + { + USB.CTRLB &= ~USB_ATTACH_bm; + 4158: e0 ec ldi r30, 0xC0 ; 192 + 415a: f4 e0 ldi r31, 0x04 ; 4 + 415c: 81 81 ldd r24, Z+1 ; 0x01 + 415e: 8e 7f andi r24, 0xFE ; 254 + 4160: 81 83 std Z+1, r24 ; 0x01 + } + + static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; + static inline void USB_Controller_Disable(void) + { + USB.CTRLA &= ~USB_ENABLE_bm; + 4162: 80 81 ld r24, Z + 4164: 8f 77 andi r24, 0x7F ; 127 + 4166: 80 83 st Z, r24 + + USB_Detach(); + USB_Controller_Disable(); + + USB_IsInitialized = false; + 4168: 10 92 13 23 sts 0x2313, r1 + 416c: 08 95 ret + +0000416e : +} + +void USB_ResetInterface(void) +{ + 416e: cf 93 push r28 + 4170: df 93 push r29 + #if defined(USB_DEVICE_OPT_FULLSPEED) + if (USB_Options & USB_DEVICE_OPT_LOWSPEED) + CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); + else + CLK.USBCTRL = (((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp); + 4172: e0 e4 ldi r30, 0x40 ; 64 + 4174: f0 e0 ldi r31, 0x00 ; 0 + 4176: 14 82 std Z+4, r1 ; 0x04 + #else + CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); + #endif + + if (USB_Options & USB_OPT_PLLCLKSRC) + CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm); + 4178: 84 81 ldd r24, Z+4 ; 0x04 + 417a: 81 60 ori r24, 0x01 ; 1 + 417c: 84 83 std Z+4, r24 ; 0x04 + else + CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); + + USB_Device_SetDeviceAddress(0); + + USB_INT_DisableAllInterrupts(); + 417e: 4e d0 rcall .+156 ; 0x421c + USB_INT_ClearAllInterrupts(); + 4180: 54 d0 rcall .+168 ; 0x422a + } + + static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; + static inline void USB_Controller_Reset(void) + { + USB.CTRLA &= ~USB_ENABLE_bm; + 4182: c0 ec ldi r28, 0xC0 ; 192 + 4184: d4 e0 ldi r29, 0x04 ; 4 + 4186: 88 81 ld r24, Y + 4188: 8f 77 andi r24, 0x7F ; 127 + 418a: 88 83 st Y, r24 + USB.CTRLA |= USB_ENABLE_bm; + 418c: 88 81 ld r24, Y + 418e: 80 68 ori r24, 0x80 ; 128 + 4190: 88 83 st Y, r24 +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_Init_Device(void) +{ + USB_DeviceState = DEVICE_STATE_Unattached; + 4192: 10 92 14 23 sts 0x2314, r1 + USB_Device_ConfigurationNumber = 0; + 4196: 10 92 10 23 sts 0x2310, r1 + + #if !defined(NO_DEVICE_REMOTE_WAKEUP) + USB_Device_RemoteWakeupEnabled = false; + 419a: 10 92 12 23 sts 0x2312, r1 + #endif + + #if !defined(NO_DEVICE_SELF_POWER) + USB_Device_CurrentlySelfPowered = false; + 419e: 10 92 11 23 sts 0x2311, r1 + } + + static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; + static inline void USB_Device_SetFullSpeed(void) + { + USB.CTRLA |= USB_SPEED_bm; + 41a2: 88 81 ld r24, Y + 41a4: 80 64 ori r24, 0x40 ; 64 + 41a6: 88 83 st Y, r24 + EPConfigMask |= USB_EP_TYPE_BULK_gc; + break; + } + + if (Type == EP_TYPE_CONTROL) + Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + 41a8: 48 e0 ldi r20, 0x08 ; 8 + 41aa: 68 e4 ldi r22, 0x48 ; 72 + 41ac: 80 e8 ldi r24, 0x80 ; 128 + 41ae: 6e de rcall .-804 ; 0x3e8c + + return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); + 41b0: 48 e0 ldi r20, 0x08 ; 8 + 41b2: 68 e4 ldi r22, 0x48 ; 72 + 41b4: 80 e0 ldi r24, 0x00 ; 0 + 41b6: 6a de rcall .-812 ; 0x3e8c + static inline void USB_INT_Enable(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_BUSEVENTI: + USB.INTCTRLA |= USB_BUSEVIE_bm; + 41b8: 88 85 ldd r24, Y+8 ; 0x08 + 41ba: 80 64 ori r24, 0x40 ; 64 + 41bc: 88 87 std Y+8, r24 ; 0x08 + * register and despite the datasheet making no mention of its requirement in host mode. + */ + static inline void USB_Attach(void) ATTR_ALWAYS_INLINE; + static inline void USB_Attach(void) + { + USB.CTRLB |= USB_ATTACH_bm; + 41be: 89 81 ldd r24, Y+1 ; 0x01 + 41c0: 81 60 ori r24, 0x01 ; 1 + 41c2: 89 83 std Y+1, r24 ; 0x01 + USB_INT_DisableAllInterrupts(); + USB_INT_ClearAllInterrupts(); + + USB_Controller_Reset(); + USB_Init_Device(); +} + 41c4: df 91 pop r29 + 41c6: cf 91 pop r28 + 41c8: 08 95 ret + +000041ca : + + #if !defined(USE_STATIC_OPTIONS) + const uint8_t Options + #endif + ) +{ + 41ca: cf 93 push r28 + 41cc: df 93 push r29 + #if (ARCH == ARCH_AVR8) + return SREG; + #elif (ARCH == ARCH_UC3) + return __builtin_mfsr(AVR32_SR); + #elif (ARCH == ARCH_XMEGA) + return SREG; + 41ce: 3f b7 in r19, 0x3f ; 63 + #if (ARCH == ARCH_AVR8) + cli(); + #elif (ARCH == ARCH_UC3) + __builtin_ssrf(AVR32_SR_GM_OFFSET); + #elif (ARCH == ARCH_XMEGA) + cli(); + 41d0: f8 94 cli + #endif + + uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); + GlobalInterruptDisable(); + + NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; + 41d2: c0 ec ldi r28, 0xC0 ; 192 + 41d4: d1 e0 ldi r29, 0x01 ; 1 + 41d6: 22 e0 ldi r18, 0x02 ; 2 + 41d8: 2a 87 std Y+10, r18 ; 0x0a + USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); + 41da: ea e1 ldi r30, 0x1A ; 26 + 41dc: f0 e0 ldi r31, 0x00 ; 0 + 41de: e4 91 lpm r30, Z + 41e0: a0 ec ldi r26, 0xC0 ; 192 + 41e2: b4 e0 ldi r27, 0x04 ; 4 + 41e4: da 96 adiw r26, 0x3a ; 58 + 41e6: ec 93 st X, r30 + 41e8: da 97 sbiw r26, 0x3a ; 58 + USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); + 41ea: eb e1 ldi r30, 0x1B ; 27 + 41ec: f0 e0 ldi r31, 0x00 ; 0 + 41ee: e4 91 lpm r30, Z + 41f0: db 96 adiw r26, 0x3b ; 59 + 41f2: ec 93 st X, r30 + 41f4: db 97 sbiw r26, 0x3b ; 59 + NVM.CMD = NVM_CMD_NO_OPERATION_gc; + 41f6: 1a 86 std Y+10, r1 ; 0x0a + + /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ + USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0)); + 41f8: 8b e3 ldi r24, 0x3B ; 59 + 41fa: 96 e2 ldi r25, 0x26 ; 38 + 41fc: 8e 7f andi r24, 0xFE ; 254 + 41fe: 16 96 adiw r26, 0x06 ; 6 + 4200: 8d 93 st X+, r24 + 4202: 9c 93 st X, r25 + 4204: 17 97 sbiw r26, 0x07 ; 7 + USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); + 4206: 85 e1 ldi r24, 0x15 ; 21 + 4208: 8c 93 st X, r24 + + if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH) + USB.INTCTRLA = (3 << USB_INTLVL_gp); + else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED) + USB.INTCTRLA = (2 << USB_INTLVL_gp); + 420a: 18 96 adiw r26, 0x08 ; 8 + 420c: 2c 93 st X, r18 + if (GlobalIntState & AVR32_SR_GM) + __builtin_ssrf(AVR32_SR_GM_OFFSET); + else + __builtin_csrf(AVR32_SR_GM_OFFSET); + #elif (ARCH == ARCH_XMEGA) + SREG = GlobalIntState; + 420e: 3f bf out 0x3f, r19 ; 63 + + #if defined(USB_CAN_BE_BOTH) + USB_CurrentMode = Mode; + #endif + + USB_IsInitialized = true; + 4210: 81 e0 ldi r24, 0x01 ; 1 + 4212: 80 93 13 23 sts 0x2313, r24 + + USB_ResetInterface(); +} + 4216: df 91 pop r29 + 4218: cf 91 pop r28 + USB_CurrentMode = Mode; + #endif + + USB_IsInitialized = true; + + USB_ResetInterface(); + 421a: a9 cf rjmp .-174 ; 0x416e + +0000421c : +#define __INCLUDE_FROM_USB_DRIVER +#include "../USBInterrupt.h" + +void USB_INT_DisableAllInterrupts(void) +{ + USB.INTCTRLA &= USB_INTLVL_gm; + 421c: e0 ec ldi r30, 0xC0 ; 192 + 421e: f4 e0 ldi r31, 0x04 ; 4 + 4220: 80 85 ldd r24, Z+8 ; 0x08 + 4222: 83 70 andi r24, 0x03 ; 3 + 4224: 80 87 std Z+8, r24 ; 0x08 + USB.INTCTRLB = 0; + 4226: 11 86 std Z+9, r1 ; 0x09 + 4228: 08 95 ret + +0000422a : +} + +void USB_INT_ClearAllInterrupts(void) +{ + USB.INTFLAGSACLR = 0xFF; + 422a: e0 ec ldi r30, 0xC0 ; 192 + 422c: f4 e0 ldi r31, 0x04 ; 4 + 422e: 8f ef ldi r24, 0xFF ; 255 + 4230: 82 87 std Z+10, r24 ; 0x0a + USB.INTFLAGSBCLR = 0xFF; + 4232: 84 87 std Z+12, r24 ; 0x0c + 4234: 08 95 ret + +00004236 <__vector_125>: +} + +ISR(USB_BUSEVENT_vect) +{ + 4236: 1f 92 push r1 + 4238: 0f 92 push r0 + 423a: 0f b6 in r0, 0x3f ; 63 + 423c: 0f 92 push r0 + 423e: 11 24 eor r1, r1 + 4240: 2f 93 push r18 + 4242: 3f 93 push r19 + 4244: 4f 93 push r20 + 4246: 5f 93 push r21 + 4248: 6f 93 push r22 + 424a: 7f 93 push r23 + 424c: 8f 93 push r24 + 424e: 9f 93 push r25 + 4250: af 93 push r26 + 4252: bf 93 push r27 + 4254: ef 93 push r30 + 4256: ff 93 push r31 + case USB_INT_BUSEVENTI_Resume: + return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); + case USB_INT_BUSEVENTI_Reset: + return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); + case USB_INT_SOFI: + return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false); + 4258: 80 91 ca 04 lds r24, 0x04CA + #if !defined(NO_SOF_EVENTS) + if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) + 425c: 87 fd sbrc r24, 7 + 425e: 4d c0 rjmp .+154 ; 0x42fa <__vector_125+0xc4> + static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_BUSEVENTI_Suspend: + return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); + 4260: 80 91 ca 04 lds r24, 0x04CA + + EVENT_USB_Device_StartOfFrame(); + } + #endif + + if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) + 4264: 86 fd sbrc r24, 6 + 4266: 41 c0 rjmp .+130 ; 0x42ea <__vector_125+0xb4> + case USB_INT_BUSEVENTI_Resume: + return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); + 4268: 80 91 ca 04 lds r24, 0x04CA + USB_DeviceState = DEVICE_STATE_Suspended; + EVENT_USB_Device_Suspend(); + #endif + } + + if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Resume)) + 426c: 85 ff sbrs r24, 5 + 426e: 0c c0 rjmp .+24 ; 0x4288 <__vector_125+0x52> + { + case USB_INT_BUSEVENTI_Suspend: + USB.INTFLAGSACLR = USB_SUSPENDIF_bm; + break; + case USB_INT_BUSEVENTI_Resume: + USB.INTFLAGSACLR = USB_RESUMEIF_bm; + 4270: 80 e2 ldi r24, 0x20 ; 32 + 4272: 80 93 ca 04 sts 0x04CA, r24 + { + USB_INT_Clear(USB_INT_BUSEVENTI_Resume); + + if (USB_Device_ConfigurationNumber) + 4276: 80 91 10 23 lds r24, 0x2310 + 427a: 88 23 and r24, r24 + 427c: 71 f1 breq .+92 ; 0x42da <__vector_125+0xa4> + USB_DeviceState = DEVICE_STATE_Configured; + 427e: 84 e0 ldi r24, 0x04 ; 4 + 4280: 80 93 14 23 sts 0x2314, r24 + else + USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; + + #if !defined(NO_LIMITED_CONTROLLER_CONNECT) + EVENT_USB_Device_Connect(); + 4284: 0e 94 28 0b call 0x1650 ; 0x1650 + case USB_INT_BUSEVENTI_Suspend: + return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); + case USB_INT_BUSEVENTI_Resume: + return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); + case USB_INT_BUSEVENTI_Reset: + return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); + 4288: 80 91 ca 04 lds r24, 0x04CA + #else + EVENT_USB_Device_WakeUp(); + #endif + } + + if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) + 428c: 84 ff sbrs r24, 4 + 428e: 14 c0 rjmp .+40 ; 0x42b8 <__vector_125+0x82> + break; + case USB_INT_BUSEVENTI_Resume: + USB.INTFLAGSACLR = USB_RESUMEIF_bm; + break; + case USB_INT_BUSEVENTI_Reset: + USB.INTFLAGSACLR = USB_RSTIF_bm; + 4290: 80 e1 ldi r24, 0x10 ; 16 + 4292: 80 93 ca 04 sts 0x04CA, r24 + { + USB_INT_Clear(USB_INT_BUSEVENTI_Reset); + + USB_DeviceState = DEVICE_STATE_Default; + 4296: 82 e0 ldi r24, 0x02 ; 2 + 4298: 80 93 14 23 sts 0x2314, r24 + USB_Device_ConfigurationNumber = 0; + 429c: 10 92 10 23 sts 0x2310, r1 + } + + static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; + static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) + { + USB.ADDR = Address; + 42a0: 10 92 c3 04 sts 0x04C3, r1 + + USB_Device_EnableDeviceAddress(0); + + Endpoint_ClearEndpoints(); + 42a4: b6 de rcall .-660 ; 0x4012 + EPConfigMask |= USB_EP_TYPE_BULK_gc; + break; + } + + if (Type == EP_TYPE_CONTROL) + Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + 42a6: 48 e0 ldi r20, 0x08 ; 8 + 42a8: 68 e4 ldi r22, 0x48 ; 72 + 42aa: 80 e8 ldi r24, 0x80 ; 128 + 42ac: ef dd rcall .-1058 ; 0x3e8c + + return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); + 42ae: 48 e0 ldi r20, 0x08 ; 8 + 42b0: 68 e4 ldi r22, 0x48 ; 72 + 42b2: 80 e0 ldi r24, 0x00 ; 0 + 42b4: eb dd rcall .-1066 ; 0x3e8c + Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, + USB_Device_ControlEndpointSize, 1); + + EVENT_USB_Device_Reset(); + 42b6: 23 db rcall .-2490 ; 0x38fe + } +} + 42b8: ff 91 pop r31 + 42ba: ef 91 pop r30 + 42bc: bf 91 pop r27 + 42be: af 91 pop r26 + 42c0: 9f 91 pop r25 + 42c2: 8f 91 pop r24 + 42c4: 7f 91 pop r23 + 42c6: 6f 91 pop r22 + 42c8: 5f 91 pop r21 + 42ca: 4f 91 pop r20 + 42cc: 3f 91 pop r19 + 42ce: 2f 91 pop r18 + 42d0: 0f 90 pop r0 + 42d2: 0f be out 0x3f, r0 ; 63 + 42d4: 0f 90 pop r0 + 42d6: 1f 90 pop r1 + 42d8: 18 95 reti + } + + static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + static inline bool USB_Device_IsAddressSet(void) + { + return ((USB.ADDR != 0) ? true : false); + 42da: 80 91 c3 04 lds r24, 0x04C3 USB_INT_Clear(USB_INT_BUSEVENTI_Resume); if (USB_Device_ConfigurationNumber) USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; - 46a8: cd cf rjmp .-102 ; 0x4644 <__vector_125+0x50> - 46aa: 80 e4 ldi r24, 0x40 ; 64 - 46ac: e0 ec ldi r30, 0xC0 ; 192 - 46ae: f4 e0 ldi r31, 0x04 ; 4 - 46b0: 82 87 std Z+10, r24 ; 0x0a + 42de: 81 11 cpse r24, r1 + 42e0: 15 c0 rjmp .+42 ; 0x430c <__vector_125+0xd6> + 42e2: 81 e0 ldi r24, 0x01 ; 1 + 42e4: 80 93 14 23 sts 0x2314, r24 + 42e8: cd cf rjmp .-102 ; 0x4284 <__vector_125+0x4e> static inline void USB_INT_Clear(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI_Suspend: USB.INTFLAGSACLR = USB_SUSPENDIF_bm; - 46b2: 10 92 24 23 sts 0x2324, r1 - 46b6: 0e 94 77 0b call 0x16ee ; 0x16ee + 42ea: 80 e4 ldi r24, 0x40 ; 64 + 42ec: 80 93 ca 04 sts 0x04CA, r24 if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) { USB_INT_Clear(USB_INT_BUSEVENTI_Suspend); #if !defined(NO_LIMITED_CONTROLLER_CONNECT) USB_DeviceState = DEVICE_STATE_Unattached; - 46ba: b5 cf rjmp .-150 ; 0x4626 <__vector_125+0x32> - 46bc: 80 91 c8 04 lds r24, 0x04C8 + 42f0: 10 92 14 23 sts 0x2314, r1 EVENT_USB_Device_Disconnect(); - 46c0: 87 ff sbrs r24, 7 - 46c2: ad cf rjmp .-166 ; 0x461e <__vector_125+0x2a> + 42f4: 0e 94 2d 0b call 0x165a ; 0x165a + 42f8: b7 cf rjmp .-146 ; 0x4268 <__vector_125+0x32> switch (Interrupt) { case USB_INT_BUSEVENTI: return ((USB.INTCTRLA & USB_BUSEVIE_bm) ? true : false); case USB_INT_SOFI: return ((USB.INTCTRLA & USB_SOFIE_bm) ? true : false); - 46c4: 80 e8 ldi r24, 0x80 ; 128 - 46c6: e0 ec ldi r30, 0xC0 ; 192 + 42fa: 80 91 c8 04 lds r24, 0x04C8 } ISR(USB_BUSEVENT_vect) { #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 46c8: f4 e0 ldi r31, 0x04 ; 4 - 46ca: 82 87 std Z+10, r24 ; 0x0a + 42fe: 87 ff sbrs r24, 7 + 4300: af cf rjmp .-162 ; 0x4260 <__vector_125+0x2a> break; case USB_INT_BUSEVENTI_Reset: USB.INTFLAGSACLR = USB_RSTIF_bm; break; case USB_INT_SOFI: USB.INTFLAGSACLR = USB_SOFIF_bm; - 46cc: ec da rcall .-2600 ; 0x3ca6 - 46ce: a7 cf rjmp .-178 ; 0x461e <__vector_125+0x2a> - 46d0: 83 e0 ldi r24, 0x03 ; 3 - 46d2: e8 cf rjmp .-48 ; 0x46a4 <__vector_125+0xb0> + 4302: 80 e8 ldi r24, 0x80 ; 128 + 4304: 80 93 ca 04 sts 0x04CA, r24 + { + USB_INT_Clear(USB_INT_SOFI); -000046d4 : + EVENT_USB_Device_StartOfFrame(); + 4308: fa da rcall .-2572 ; 0x38fe + 430a: aa cf rjmp .-172 ; 0x4260 <__vector_125+0x2a> + USB_INT_Clear(USB_INT_BUSEVENTI_Resume); + + if (USB_Device_ConfigurationNumber) + USB_DeviceState = DEVICE_STATE_Configured; + else + USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; + 430c: 83 e0 ldi r24, 0x03 ; 3 + 430e: ea cf rjmp .-44 ; 0x42e4 <__vector_125+0xae> + +00004310 : + +void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + FILE* const Stream) +{ + *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW); + fdev_set_udata(Stream, CDCInterfaceInfo); + 4310: cf 93 push r28 + 4312: df 93 push r29 + 4314: ec 01 movw r28, r24 + 4316: 40 96 adiw r24, 0x10 ; 16 + 4318: fc 01 movw r30, r24 + 431a: 8b e0 ldi r24, 0x0B ; 11 + 431c: df 01 movw r26, r30 + 431e: 1d 92 st X+, r1 + 4320: 8a 95 dec r24 + 4322: e9 f7 brne .-6 ; 0x431e + 4324: 82 e0 ldi r24, 0x02 ; 2 + 4326: 8c 83 std Y+4, r24 ; 0x04 + 4328: 89 87 std Y+9, r24 ; 0x09 + 432a: 83 e0 ldi r24, 0x03 ; 3 + 432c: 8e 87 std Y+14, r24 ; 0x0e + 432e: 61 e0 ldi r22, 0x01 ; 1 + 4330: ce 01 movw r24, r28 + 4332: 01 96 adiw r24, 0x01 ; 1 + 4334: f8 dd rcall .-1040 ; 0x3f26 + 4336: 81 11 cpse r24, r1 + 4338: 04 c0 rjmp .+8 ; 0x4342 + 433a: 80 e0 ldi r24, 0x00 ; 0 + 433c: df 91 pop r29 + 433e: cf 91 pop r28 + 4340: 08 95 ret + 4342: 61 e0 ldi r22, 0x01 ; 1 + 4344: ce 01 movw r24, r28 + 4346: 06 96 adiw r24, 0x06 ; 6 + 4348: ee dd rcall .-1060 ; 0x3f26 + 434a: 88 23 and r24, r24 + 434c: b1 f3 breq .-20 ; 0x433a + 434e: 61 e0 ldi r22, 0x01 ; 1 + 4350: ce 01 movw r24, r28 + 4352: 0b 96 adiw r24, 0x0b ; 11 + 4354: df 91 pop r29 + 4356: cf 91 pop r28 + 4358: e6 cd rjmp .-1076 ; 0x3f26 + +0000435a : + 435a: cf 93 push r28 + 435c: df 93 push r29 + 435e: d6 2f mov r29, r22 + 4360: c7 2f mov r28, r23 + 4362: 20 91 14 23 lds r18, 0x2314 + 4366: 24 30 cpi r18, 0x04 ; 4 + 4368: 21 f0 breq .+8 ; 0x4372 + 436a: 82 e0 ldi r24, 0x02 ; 2 + 436c: df 91 pop r29 + 436e: cf 91 pop r28 + 4370: 08 95 ret + 4372: fc 01 movw r30, r24 + 4374: 44 89 ldd r20, Z+20 ; 0x14 + 4376: 55 89 ldd r21, Z+21 ; 0x15 + 4378: 66 89 ldd r22, Z+22 ; 0x16 + 437a: 77 89 ldd r23, Z+23 ; 0x17 + 437c: 45 2b or r20, r21 + 437e: 46 2b or r20, r22 + 4380: 47 2b or r20, r23 + 4382: 99 f3 breq .-26 ; 0x436a + 4384: 81 81 ldd r24, Z+1 ; 0x01 + 4386: c3 dc rcall .-1658 ; 0x3d0e + 4388: ad 2f mov r26, r29 + 438a: bc 2f mov r27, r28 + 438c: fd 01 movw r30, r26 + 438e: 01 90 ld r0, Z+ + 4390: 00 20 and r0, r0 + 4392: e9 f7 brne .-6 ; 0x438e + 4394: bf 01 movw r22, r30 + 4396: 61 50 subi r22, 0x01 ; 1 + 4398: 71 09 sbc r23, r1 + 439a: 6a 1b sub r22, r26 + 439c: 7b 0b sbc r23, r27 + 439e: 40 e0 ldi r20, 0x00 ; 0 + 43a0: 50 e0 ldi r21, 0x00 ; 0 + 43a2: 8d 2f mov r24, r29 + 43a4: 9c 2f mov r25, r28 + 43a6: df 91 pop r29 + 43a8: cf 91 pop r28 + 43aa: bf ca rjmp .-2690 ; 0x392a + +000043ac : + 43ac: ef 92 push r14 + 43ae: ff 92 push r15 + 43b0: 0f 93 push r16 + 43b2: 1f 93 push r17 + 43b4: cf 93 push r28 + 43b6: df 93 push r29 + 43b8: eb 01 movw r28, r22 + 43ba: 7a 01 movw r14, r20 + 43bc: 20 91 14 23 lds r18, 0x2314 + 43c0: 24 30 cpi r18, 0x04 ; 4 + 43c2: 41 f0 breq .+16 ; 0x43d4 + 43c4: 82 e0 ldi r24, 0x02 ; 2 + 43c6: df 91 pop r29 + 43c8: cf 91 pop r28 + 43ca: 1f 91 pop r17 + 43cc: 0f 91 pop r16 + 43ce: ff 90 pop r15 + 43d0: ef 90 pop r14 + 43d2: 08 95 ret + 43d4: fc 01 movw r30, r24 + 43d6: 04 89 ldd r16, Z+20 ; 0x14 + 43d8: 15 89 ldd r17, Z+21 ; 0x15 + 43da: 26 89 ldd r18, Z+22 ; 0x16 + 43dc: 37 89 ldd r19, Z+23 ; 0x17 + 43de: 01 2b or r16, r17 + 43e0: 02 2b or r16, r18 + 43e2: 03 2b or r16, r19 + 43e4: 79 f3 breq .-34 ; 0x43c4 + 43e6: 81 81 ldd r24, Z+1 ; 0x01 + 43e8: 92 dc rcall .-1756 ; 0x3d0e + 43ea: 40 e0 ldi r20, 0x00 ; 0 + 43ec: 50 e0 ldi r21, 0x00 ; 0 + 43ee: b7 01 movw r22, r14 + 43f0: ce 01 movw r24, r28 + 43f2: df 91 pop r29 + 43f4: cf 91 pop r28 + 43f6: 1f 91 pop r17 + 43f8: 0f 91 pop r16 + 43fa: ff 90 pop r15 + 43fc: ef 90 pop r14 + 43fe: 95 ca rjmp .-2774 ; 0x392a + +00004400 : + 4400: 0f 93 push r16 + 4402: 1f 93 push r17 + 4404: cf 93 push r28 + 4406: df 93 push r29 + 4408: 1f 92 push r1 + 440a: cd b7 in r28, 0x3d ; 61 + 440c: de b7 in r29, 0x3e ; 62 + 440e: 20 91 14 23 lds r18, 0x2314 + 4412: 24 30 cpi r18, 0x04 ; 4 + 4414: 39 f0 breq .+14 ; 0x4424 + 4416: 82 e0 ldi r24, 0x02 ; 2 + 4418: 0f 90 pop r0 + 441a: df 91 pop r29 + 441c: cf 91 pop r28 + 441e: 1f 91 pop r17 + 4420: 0f 91 pop r16 + 4422: 08 95 ret + 4424: fc 01 movw r30, r24 + 4426: 04 89 ldd r16, Z+20 ; 0x14 + 4428: 15 89 ldd r17, Z+21 ; 0x15 + 442a: 26 89 ldd r18, Z+22 ; 0x16 + 442c: 37 89 ldd r19, Z+23 ; 0x17 + 442e: 01 2b or r16, r17 + 4430: 02 2b or r16, r18 + 4432: 03 2b or r16, r19 + 4434: 81 f3 breq .-32 ; 0x4416 + 4436: 81 81 ldd r24, Z+1 ; 0x01 + 4438: 69 83 std Y+1, r22 ; 0x01 + 443a: 69 dc rcall .-1838 ; 0x3d0e + 443c: 20 91 1d 23 lds r18, 0x231D + 4440: 30 91 1e 23 lds r19, 0x231E + 4444: f9 01 movw r30, r18 + 4446: ef 5b subi r30, 0xBF ; 191 + 4448: ff 4f sbci r31, 0xFF ; 255 + 444a: 90 81 ld r25, Z + 444c: f9 01 movw r30, r18 + 444e: e0 5c subi r30, 0xC0 ; 192 + 4450: ff 4f sbci r31, 0xFF ; 255 + 4452: 80 81 ld r24, Z + 4454: 69 81 ldd r22, Y+1 ; 0x01 + 4456: 98 17 cp r25, r24 + 4458: 30 f0 brcs .+12 ; 0x4466 + 445a: 69 83 std Y+1, r22 ; 0x01 + 445c: 12 dc rcall .-2012 ; 0x3c82 + 445e: 27 de rcall .-946 ; 0x40ae + 4460: 69 81 ldd r22, Y+1 ; 0x01 + 4462: 81 11 cpse r24, r1 + 4464: d9 cf rjmp .-78 ; 0x4418 + 4466: 86 2f mov r24, r22 + 4468: 43 dc rcall .-1914 ; 0x3cf0 + 446a: 80 e0 ldi r24, 0x00 ; 0 + 446c: d5 cf rjmp .-86 ; 0x4418 + +0000446e : + 446e: 0f 93 push r16 + 4470: 1f 93 push r17 + 4472: cf 93 push r28 + 4474: df 93 push r29 + 4476: 1f 92 push r1 + 4478: cd b7 in r28, 0x3d ; 61 + 447a: de b7 in r29, 0x3e ; 62 + 447c: 20 91 14 23 lds r18, 0x2314 + 4480: 24 30 cpi r18, 0x04 ; 4 + 4482: 39 f0 breq .+14 ; 0x4492 + 4484: 82 e0 ldi r24, 0x02 ; 2 + 4486: 0f 90 pop r0 + 4488: df 91 pop r29 + 448a: cf 91 pop r28 + 448c: 1f 91 pop r17 + 448e: 0f 91 pop r16 + 4490: 08 95 ret + 4492: fc 01 movw r30, r24 + 4494: 44 89 ldd r20, Z+20 ; 0x14 + 4496: 55 89 ldd r21, Z+21 ; 0x15 + 4498: 66 89 ldd r22, Z+22 ; 0x16 + 449a: 77 89 ldd r23, Z+23 ; 0x17 + 449c: 45 2b or r20, r21 + 449e: 46 2b or r20, r22 + 44a0: 47 2b or r20, r23 + 44a2: 81 f3 breq .-32 ; 0x4484 + 44a4: 81 81 ldd r24, Z+1 ; 0x01 + 44a6: 33 dc rcall .-1946 ; 0x3d0e + 44a8: 80 91 21 23 lds r24, 0x2321 + 44ac: 20 91 1d 23 lds r18, 0x231D + 44b0: 30 91 1e 23 lds r19, 0x231E + 44b4: f9 01 movw r30, r18 + 44b6: 87 fd sbrc r24, 7 + 44b8: 1d c0 rjmp .+58 ; 0x44f4 + 44ba: e0 5c subi r30, 0xC0 ; 192 + 44bc: ff 4f sbci r31, 0xFF ; 255 + 44be: 80 81 ld r24, Z + 44c0: f9 01 movw r30, r18 + 44c2: ef 5b subi r30, 0xBF ; 191 + 44c4: ff 4f sbci r31, 0xFF ; 255 + 44c6: 40 81 ld r20, Z + 44c8: 90 e0 ldi r25, 0x00 ; 0 + 44ca: 84 1b sub r24, r20 + 44cc: 91 09 sbc r25, r1 + 44ce: 89 2b or r24, r25 + 44d0: 11 f4 brne .+4 ; 0x44d6 + 44d2: 80 e0 ldi r24, 0x00 ; 0 + 44d4: d8 cf rjmp .-80 ; 0x4486 + 44d6: 00 81 ld r16, Z + 44d8: f9 01 movw r30, r18 + 44da: e0 5c subi r30, 0xC0 ; 192 + 44dc: ff 4f sbci r31, 0xFF ; 255 + 44de: 10 81 ld r17, Z + 44e0: d0 db rcall .-2144 ; 0x3c82 + 44e2: 01 17 cp r16, r17 + 44e4: b0 f3 brcs .-20 ; 0x44d2 + 44e6: e3 dd rcall .-1082 ; 0x40ae + 44e8: 81 11 cpse r24, r1 + 44ea: cd cf rjmp .-102 ; 0x4486 + 44ec: 89 83 std Y+1, r24 ; 0x01 + 44ee: c9 db rcall .-2158 ; 0x3c82 + 44f0: 89 81 ldd r24, Y+1 ; 0x01 + 44f2: c9 cf rjmp .-110 ; 0x4486 + 44f4: ef 5b subi r30, 0xBF ; 191 + 44f6: ff 4f sbci r31, 0xFF ; 255 + 44f8: 80 81 ld r24, Z + 44fa: 90 e0 ldi r25, 0x00 ; 0 + 44fc: e8 cf rjmp .-48 ; 0x44ce + +000044fe : + 44fe: cf 93 push r28 + 4500: df 93 push r29 + 4502: ec 01 movw r28, r24 + 4504: 80 91 14 23 lds r24, 0x2314 + 4508: 84 30 cpi r24, 0x04 ; 4 + 450a: 19 f0 breq .+6 ; 0x4512 + 450c: df 91 pop r29 + 450e: cf 91 pop r28 + 4510: 08 95 ret + 4512: 4c 89 ldd r20, Y+20 ; 0x14 + 4514: 5d 89 ldd r21, Y+21 ; 0x15 + 4516: 6e 89 ldd r22, Y+22 ; 0x16 + 4518: 7f 89 ldd r23, Y+23 ; 0x17 + 451a: 45 2b or r20, r21 + 451c: 46 2b or r20, r22 + 451e: 47 2b or r20, r23 + 4520: a9 f3 breq .-22 ; 0x450c + 4522: 89 81 ldd r24, Y+1 ; 0x01 + 4524: f4 db rcall .-2072 ; 0x3d0e + 4526: a6 dc rcall .-1716 ; 0x3e74 + 4528: 88 23 and r24, r24 + 452a: 81 f3 breq .-32 ; 0x450c + 452c: ce 01 movw r24, r28 + 452e: df 91 pop r29 + 4530: cf 91 pop r28 + 4532: 9d cf rjmp .-198 ; 0x446e + +00004534 : + 4534: cf 93 push r28 + 4536: df 93 push r29 + 4538: 20 91 14 23 lds r18, 0x2314 + 453c: 24 30 cpi r18, 0x04 ; 4 + 453e: c1 f5 brne .+112 ; 0x45b0 + 4540: fc 01 movw r30, r24 + 4542: 44 89 ldd r20, Z+20 ; 0x14 + 4544: 55 89 ldd r21, Z+21 ; 0x15 + 4546: 66 89 ldd r22, Z+22 ; 0x16 + 4548: 77 89 ldd r23, Z+23 ; 0x17 + 454a: 45 2b or r20, r21 + 454c: 46 2b or r20, r22 + 454e: 47 2b or r20, r23 + 4550: 79 f1 breq .+94 ; 0x45b0 + 4552: 86 81 ldd r24, Z+6 ; 0x06 + 4554: dc db rcall .-2120 ; 0x3d0e + 4556: 75 dc rcall .-1814 ; 0x3e42 + 4558: 88 23 and r24, r24 + 455a: 51 f1 breq .+84 ; 0x45b0 + 455c: 80 91 21 23 lds r24, 0x2321 + 4560: 87 fd sbrc r24, 7 + 4562: 3d c0 rjmp .+122 ; 0x45de + 4564: 80 91 1d 23 lds r24, 0x231D + 4568: 90 91 1e 23 lds r25, 0x231E + 456c: fc 01 movw r30, r24 + 456e: e0 5c subi r30, 0xC0 ; 192 + 4570: ff 4f sbci r31, 0xFF ; 255 + 4572: 20 81 ld r18, Z + 4574: fc 01 movw r30, r24 + 4576: ef 5b subi r30, 0xBF ; 191 + 4578: ff 4f sbci r31, 0xFF ; 255 + 457a: 40 81 ld r20, Z + 457c: 30 e0 ldi r19, 0x00 ; 0 + 457e: 24 1b sub r18, r20 + 4580: 31 09 sbc r19, r1 + 4582: 23 2b or r18, r19 + 4584: d9 f4 brne .+54 ; 0x45bc + 4586: cf ef ldi r28, 0xFF ; 255 + 4588: df ef ldi r29, 0xFF ; 255 + 458a: 20 91 21 23 lds r18, 0x2321 + 458e: 27 fd sbrc r18, 7 + 4590: 23 c0 rjmp .+70 ; 0x45d8 + 4592: dc 01 movw r26, r24 + 4594: a0 5c subi r26, 0xC0 ; 192 + 4596: bf 4f sbci r27, 0xFF ; 255 + 4598: 8c 91 ld r24, X + 459a: 20 81 ld r18, Z + 459c: 90 e0 ldi r25, 0x00 ; 0 + 459e: 82 1b sub r24, r18 + 45a0: 91 09 sbc r25, r1 + 45a2: 89 2b or r24, r25 + 45a4: 39 f4 brne .+14 ; 0x45b4 + 45a6: 86 db rcall .-2292 ; 0x3cb4 + 45a8: ce 01 movw r24, r28 + 45aa: df 91 pop r29 + 45ac: cf 91 pop r28 + 45ae: 08 95 ret + 45b0: cf ef ldi r28, 0xFF ; 255 + 45b2: df ef ldi r29, 0xFF ; 255 + 45b4: ce 01 movw r24, r28 + 45b6: df 91 pop r29 + 45b8: cf 91 pop r28 + 45ba: 08 95 ret + 45bc: 8a db rcall .-2284 ; 0x3cd2 + 45be: c8 2f mov r28, r24 + 45c0: d0 e0 ldi r29, 0x00 ; 0 + 45c2: 80 91 1d 23 lds r24, 0x231D + 45c6: 90 91 1e 23 lds r25, 0x231E + 45ca: fc 01 movw r30, r24 + 45cc: ef 5b subi r30, 0xBF ; 191 + 45ce: ff 4f sbci r31, 0xFF ; 255 + 45d0: 20 91 21 23 lds r18, 0x2321 + 45d4: 27 ff sbrs r18, 7 + 45d6: dd cf rjmp .-70 ; 0x4592 + 45d8: 80 81 ld r24, Z + 45da: 90 e0 ldi r25, 0x00 ; 0 + 45dc: e2 cf rjmp .-60 ; 0x45a2 + 45de: 80 91 1d 23 lds r24, 0x231D + 45e2: 90 91 1e 23 lds r25, 0x231E + 45e6: fc 01 movw r30, r24 + 45e8: ef 5b subi r30, 0xBF ; 191 + 45ea: ff 4f sbci r31, 0xFF ; 255 + 45ec: 20 81 ld r18, Z + 45ee: 30 e0 ldi r19, 0x00 ; 0 + 45f0: c8 cf rjmp .-112 ; 0x4582 + +000045f2 : + return ReceivedByte; +} +#endif + +void CDC_Device_Event_Stub(void) +{ + 45f2: 08 95 ret + +000045f4 : #define __INCLUDE_FROM_CDC_DRIVER #define __INCLUDE_FROM_CDC_DEVICE_C #include "CDCClassDevice.h" void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 46d4: ef 92 push r14 - 46d6: ff 92 push r15 - 46d8: 0f 93 push r16 - 46da: 1f 93 push r17 - 46dc: cf 93 push r28 - 46de: df 93 push r29 - 46e0: ec 01 movw r28, r24 + 45f4: ff 92 push r15 + 45f6: 0f 93 push r16 + 45f8: 1f 93 push r17 + 45fa: cf 93 push r28 + 45fc: df 93 push r29 + 45fe: ec 01 movw r28, r24 if (!(Endpoint_IsSETUPReceived())) - 46e2: 81 dd rcall .-1278 ; 0x41e6 - 46e4: 88 23 and r24, r24 - 46e6: 49 f0 breq .+18 ; 0x46fa - 46e8: 88 81 ld r24, Y + 4600: 07 dc rcall .-2034 ; 0x3e10 + 4602: 88 23 and r24, r24 + 4604: 49 f0 breq .+18 ; 0x4618 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 46ea: 90 e0 ldi r25, 0x00 ; 0 - 46ec: 20 91 29 23 lds r18, 0x2329 - 46f0: 30 91 2a 23 lds r19, 0x232A - 46f4: 28 17 cp r18, r24 - 46f6: 39 07 cpc r19, r25 - 46f8: 39 f0 breq .+14 ; 0x4708 - 46fa: df 91 pop r29 + 4606: 88 81 ld r24, Y + 4608: 90 e0 ldi r25, 0x00 ; 0 + 460a: 20 91 19 23 lds r18, 0x2319 + 460e: 30 91 1a 23 lds r19, 0x231A + 4612: 28 17 cp r18, r24 + 4614: 39 07 cpc r19, r25 + 4616: 31 f0 breq .+12 ; 0x4624 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); } break; } } - 46fc: cf 91 pop r28 - 46fe: 1f 91 pop r17 - 4700: 0f 91 pop r16 - 4702: ff 90 pop r15 - 4704: ef 90 pop r14 - 4706: 08 95 ret - 4708: 80 91 26 23 lds r24, 0x2326 + 4618: df 91 pop r29 + 461a: cf 91 pop r28 + 461c: 1f 91 pop r17 + 461e: 0f 91 pop r16 + 4620: ff 90 pop r15 + 4622: 08 95 ret return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) return; switch (USB_ControlRequest.bRequest) - 470c: 81 32 cpi r24, 0x21 ; 33 - 470e: 09 f4 brne .+2 ; 0x4712 - 4710: 5f c0 rjmp .+190 ; 0x47d0 - 4712: 82 32 cpi r24, 0x22 ; 34 - 4714: 08 f0 brcs .+2 ; 0x4718 - 4716: 4b c0 rjmp .+150 ; 0x47ae - 4718: 80 32 cpi r24, 0x20 ; 32 - 471a: 79 f7 brne .-34 ; 0x46fa - 471c: 80 91 25 23 lds r24, 0x2325 + 4624: 80 91 16 23 lds r24, 0x2316 + 4628: 81 32 cpi r24, 0x21 ; 33 + 462a: 09 f4 brne .+2 ; 0x462e + 462c: 4b c0 rjmp .+150 ; 0x46c4 + 462e: 08 f0 brcs .+2 ; 0x4632 + 4630: 33 c0 rjmp .+102 ; 0x4698 + 4632: 80 32 cpi r24, 0x20 ; 32 + 4634: 89 f7 brne .-30 ; 0x4618 Endpoint_ClearStatusStage(); } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 4720: 81 32 cpi r24, 0x21 ; 33 - 4722: 59 f7 brne .-42 ; 0x46fa - 4724: 34 dd rcall .-1432 ; 0x418e + 4636: 80 91 15 23 lds r24, 0x2315 + 463a: 81 32 cpi r24, 0x21 ; 33 + 463c: 69 f7 brne .-38 ; 0x4618 { Endpoint_ClearSETUP(); - 4726: 04 c0 rjmp .+8 ; 0x4730 - 4728: 80 91 24 23 lds r24, 0x2324 + 463e: bc db rcall .-2184 ; 0x3db8 while (!(Endpoint_IsOUTReceived())) + 4640: 04 c0 rjmp .+8 ; 0x464a { if (USB_DeviceState == DEVICE_STATE_Unattached) - 472c: 88 23 and r24, r24 - 472e: 29 f3 breq .-54 ; 0x46fa - 4730: 72 dd rcall .-1308 ; 0x4216 - 4732: 88 23 and r24, r24 + 4642: 80 91 14 23 lds r24, 0x2314 + 4646: 88 23 and r24, r24 + 4648: 39 f3 breq .-50 ; 0x4618 case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 4734: c9 f3 breq .-14 ; 0x4728 - 4736: b5 dc rcall .-1686 ; 0x40a2 - 4738: e8 2e mov r14, r24 - 473a: b3 dc rcall .-1690 ; 0x40a2 + 464a: fb db rcall .-2058 ; 0x3e42 + 464c: 88 23 and r24, r24 + 464e: c9 f3 breq .-14 ; 0x4642 * \return Next four bytes in the currently selected endpoint's FIFO buffer. */ static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Endpoint_Read_32_LE(void) { uint32_t Byte0 = Endpoint_Read_8(); - 473c: f8 2e mov r15, r24 - 473e: b1 dc rcall .-1694 ; 0x40a2 - 4740: 08 2f mov r16, r24 + 4650: 40 db rcall .-2432 ; 0x3cd2 + 4652: 08 2f mov r16, r24 uint32_t Byte1 = Endpoint_Read_8(); - 4742: af dc rcall .-1698 ; 0x40a2 - 4744: 48 2f mov r20, r24 - 4746: 50 e0 ldi r21, 0x00 ; 0 + 4654: 3e db rcall .-2436 ; 0x3cd2 + 4656: 18 2f mov r17, r24 uint32_t Byte2 = Endpoint_Read_8(); - 4748: 60 e0 ldi r22, 0x00 ; 0 - 474a: 70 e0 ldi r23, 0x00 ; 0 - 474c: 74 2f mov r23, r20 + 4658: 3c db rcall .-2440 ; 0x3cd2 + 465a: f8 2e mov r15, r24 uint32_t Byte3 = Endpoint_Read_8(); - 474e: 66 27 eor r22, r22 - 4750: 55 27 eor r21, r21 - 4752: 44 27 eor r20, r20 - 4754: 10 e0 ldi r17, 0x00 ; 0 - 4756: 20 e0 ldi r18, 0x00 ; 0 - 4758: 30 e0 ldi r19, 0x00 ; 0 - - return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 475a: 98 01 movw r18, r16 - 475c: 11 27 eor r17, r17 - 475e: 00 27 eor r16, r16 - 4760: 40 2b or r20, r16 + 465c: 3a db rcall .-2444 ; 0x3cd2 static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Endpoint_Read_32_LE(void) { uint32_t Byte0 = Endpoint_Read_8(); uint32_t Byte1 = Endpoint_Read_8(); uint32_t Byte2 = Endpoint_Read_8(); - 4762: 51 2b or r21, r17 - 4764: 62 2b or r22, r18 - 4766: 73 2b or r23, r19 + 465e: 4f 2d mov r20, r15 + 4660: 50 e0 ldi r21, 0x00 ; 0 + 4662: 60 e0 ldi r22, 0x00 ; 0 + 4664: 70 e0 ldi r23, 0x00 ; 0 uint32_t Byte3 = Endpoint_Read_8(); return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 4768: 8e 2d mov r24, r14 - 476a: 90 e0 ldi r25, 0x00 ; 0 - 476c: a0 e0 ldi r26, 0x00 ; 0 - 476e: b0 e0 ldi r27, 0x00 ; 0 - 4770: 48 2b or r20, r24 - 4772: 59 2b or r21, r25 - 4774: 6a 2b or r22, r26 - * \return Next four bytes in the currently selected endpoint's FIFO buffer. - */ - static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint32_t Endpoint_Read_32_LE(void) - { - uint32_t Byte0 = Endpoint_Read_8(); - 4776: 7b 2b or r23, r27 - 4778: 8f 2d mov r24, r15 - 477a: 90 e0 ldi r25, 0x00 ; 0 - 477c: a0 e0 ldi r26, 0x00 ; 0 - uint32_t Byte1 = Endpoint_Read_8(); - uint32_t Byte2 = Endpoint_Read_8(); - uint32_t Byte3 = Endpoint_Read_8(); - - return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 477e: b0 e0 ldi r27, 0x00 ; 0 - 4780: ba 2f mov r27, r26 - 4782: a9 2f mov r26, r25 - 4784: 98 2f mov r25, r24 - */ - static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint32_t Endpoint_Read_32_LE(void) - { - uint32_t Byte0 = Endpoint_Read_8(); - uint32_t Byte1 = Endpoint_Read_8(); - 4786: 88 27 eor r24, r24 - 4788: 48 2b or r20, r24 - 478a: 59 2b or r21, r25 - 478c: 6a 2b or r22, r26 - uint32_t Byte2 = Endpoint_Read_8(); - uint32_t Byte3 = Endpoint_Read_8(); - - return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 478e: 7b 2b or r23, r27 - 4790: 4c 8b std Y+20, r20 ; 0x14 - 4792: 5d 8b std Y+21, r21 ; 0x15 - 4794: 6e 8b std Y+22, r22 ; 0x16 - 4796: 7f 8b std Y+23, r23 ; 0x17 - 4798: 84 dc rcall .-1784 ; 0x40a2 - 479a: 88 8f std Y+24, r24 ; 0x18 - 479c: 82 dc rcall .-1788 ; 0x40a2 + 4666: ba 01 movw r22, r20 + 4668: 55 27 eor r21, r21 + 466a: 44 27 eor r20, r20 + 466c: 78 2b or r23, r24 + 466e: 40 2b or r20, r16 + 4670: 51 2b or r21, r17 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 479e: 89 8f std Y+25, r24 ; 0x19 - 47a0: 80 dc rcall .-1792 ; 0x40a2 - 47a2: 8a 8f std Y+26, r24 ; 0x1a - 47a4: 6f dc rcall .-1826 ; 0x4084 + 4672: 4c 8b std Y+20, r20 ; 0x14 + 4674: 5d 8b std Y+21, r21 ; 0x15 + 4676: 6e 8b std Y+22, r22 ; 0x16 + 4678: 7f 8b std Y+23, r23 ; 0x17 CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 47a6: 4d de rcall .-870 ; 0x4442 - 47a8: ce 01 movw r24, r28 - 47aa: 9e d1 rcall .+828 ; 0x4ae8 + 467a: 2b db rcall .-2474 ; 0x3cd2 + 467c: 88 8f std Y+24, r24 ; 0x18 CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 47ac: a6 cf rjmp .-180 ; 0x46fa - 47ae: 82 32 cpi r24, 0x22 ; 34 - 47b0: 61 f1 breq .+88 ; 0x480a + 467e: 29 db rcall .-2478 ; 0x3cd2 + 4680: 89 8f std Y+25, r24 ; 0x19 CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 47b2: 83 32 cpi r24, 0x23 ; 35 - 47b4: 09 f0 breq .+2 ; 0x47b8 - 47b6: a1 cf rjmp .-190 ; 0x46fa + 4682: 27 db rcall .-2482 ; 0x3cd2 + 4684: 8a 8f std Y+26, r24 ; 0x1a Endpoint_ClearOUT(); - 47b8: 80 91 25 23 lds r24, 0x2325 + 4686: 16 db rcall .-2516 ; 0x3cb4 Endpoint_ClearStatusStage(); - 47bc: 81 32 cpi r24, 0x21 ; 33 - 47be: 09 f0 breq .+2 ; 0x47c2 + 4688: fc dc rcall .-1544 ; 0x4082 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 47c0: 9c cf rjmp .-200 ; 0x46fa - 47c2: e5 dc rcall .-1590 ; 0x418e - 47c4: 3e de rcall .-900 ; 0x4442 - 47c6: ce 01 movw r24, r28 + 468a: ce 01 movw r24, r28 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 468c: df 91 pop r29 + 468e: cf 91 pop r28 + 4690: 1f 91 pop r17 + 4692: 0f 91 pop r16 + 4694: ff 90 pop r15 + CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); + + Endpoint_ClearOUT(); + Endpoint_ClearStatusStage(); + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + 4696: ad cf rjmp .-166 ; 0x45f2 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) return; switch (USB_ControlRequest.bRequest) - 47c8: 60 91 27 23 lds r22, 0x2327 - 47cc: 8d d1 rcall .+794 ; 0x4ae8 - 47ce: 95 cf rjmp .-214 ; 0x46fa - 47d0: 80 91 25 23 lds r24, 0x2325 + 4698: 82 32 cpi r24, 0x22 ; 34 + 469a: 09 f4 brne .+2 ; 0x469e + 469c: 34 c0 rjmp .+104 ; 0x4706 + 469e: 83 32 cpi r24, 0x23 ; 35 + 46a0: 09 f0 breq .+2 ; 0x46a4 + 46a2: ba cf rjmp .-140 ; 0x4618 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); } break; case CDC_REQ_SendBreak: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 47d4: 81 3a cpi r24, 0xA1 ; 161 - 47d6: 09 f0 breq .+2 ; 0x47da - 47d8: 90 cf rjmp .-224 ; 0x46fa - 47da: d9 dc rcall .-1614 ; 0x418e + 46a4: 80 91 15 23 lds r24, 0x2315 + 46a8: 81 32 cpi r24, 0x21 ; 33 + 46aa: 09 f0 breq .+2 ; 0x46ae + 46ac: b5 cf rjmp .-150 ; 0x4618 { Endpoint_ClearSETUP(); - 47dc: 34 dd rcall .-1432 ; 0x4246 - 47de: 88 23 and r24, r24 + 46ae: 84 db rcall .-2296 ; 0x3db8 Endpoint_ClearStatusStage(); - 47e0: e9 f3 breq .-6 ; 0x47dc - 47e2: 8c 89 ldd r24, Y+20 ; 0x14 + 46b0: e8 dc rcall .-1584 ; 0x4082 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 47e4: ed 88 ldd r14, Y+21 ; 0x15 - 47e6: fe 88 ldd r15, Y+22 ; 0x16 - 47e8: 0f 89 ldd r16, Y+23 ; 0x17 - 47ea: 6a dc rcall .-1836 ; 0x40c0 - 47ec: 8e 2d mov r24, r14 - 47ee: 68 dc rcall .-1840 ; 0x40c0 + 46b2: 60 91 17 23 lds r22, 0x2317 + 46b6: ce 01 movw r24, r28 + } + + break; + } +} + 46b8: df 91 pop r29 + 46ba: cf 91 pop r28 + 46bc: 1f 91 pop r17 + 46be: 0f 91 pop r16 + 46c0: ff 90 pop r15 + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + 46c2: 97 cf rjmp .-210 ; 0x45f2 return; switch (USB_ControlRequest.bRequest) { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 47f0: 8f 2d mov r24, r15 - 47f2: 66 dc rcall .-1844 ; 0x40c0 - 47f4: 80 2f mov r24, r16 - 47f6: 64 dc rcall .-1848 ; 0x40c0 - 47f8: 88 8d ldd r24, Y+24 ; 0x18 + 46c4: 80 91 15 23 lds r24, 0x2315 + 46c8: 81 3a cpi r24, 0xA1 ; 161 + 46ca: 09 f0 breq .+2 ; 0x46ce + 46cc: a5 cf rjmp .-182 ; 0x4618 { Endpoint_ClearSETUP(); - 47fa: 62 dc rcall .-1852 ; 0x40c0 - 47fc: 89 8d ldd r24, Y+25 ; 0x19 + 46ce: 74 db rcall .-2328 ; 0x3db8 while (!(Endpoint_IsINReady())); - 47fe: 60 dc rcall .-1856 ; 0x40c0 - 4800: 8a 8d ldd r24, Y+26 ; 0x1a - 4802: 5e dc rcall .-1860 ; 0x40c0 - 4804: 26 dc rcall .-1972 ; 0x4052 + 46d0: d1 db rcall .-2142 ; 0x3e74 + 46d2: 88 23 and r24, r24 + 46d4: e9 f3 breq .-6 ; 0x46d0 Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 4806: 1d de rcall .-966 ; 0x4442 - 4808: 78 cf rjmp .-272 ; 0x46fa - 480a: 80 91 25 23 lds r24, 0x2325 + 46d6: 8c 89 ldd r24, Y+20 ; 0x14 + 46d8: fd 88 ldd r15, Y+21 ; 0x15 + 46da: 0e 89 ldd r16, Y+22 ; 0x16 + 46dc: 1f 89 ldd r17, Y+23 ; 0x17 * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_32_LE(const uint32_t Data) { Endpoint_Write_8(Data & 0xFF); - 480e: 81 32 cpi r24, 0x21 ; 33 - 4810: 09 f0 breq .+2 ; 0x4814 + 46de: 08 db rcall .-2544 ; 0x3cf0 Endpoint_Write_8(Data >> 8); - 4812: 73 cf rjmp .-282 ; 0x46fa - 4814: bc dc rcall .-1672 ; 0x418e - 4816: 15 de rcall .-982 ; 0x4442 + 46e0: 8f 2d mov r24, r15 + 46e2: 06 db rcall .-2548 ; 0x3cf0 Endpoint_Write_8(Data >> 16); - 4818: 80 91 27 23 lds r24, 0x2327 - 481c: 90 91 28 23 lds r25, 0x2328 + 46e4: 80 2f mov r24, r16 + 46e6: 04 db rcall .-2552 ; 0x3cf0 Endpoint_Write_8(Data >> 24); - 4820: 88 8b std Y+16, r24 ; 0x10 - 4822: 99 8b std Y+17, r25 ; 0x11 + 46e8: 81 2f mov r24, r17 + 46ea: 02 db rcall .-2556 ; 0x3cf0 + Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); + 46ec: 88 8d ldd r24, Y+24 ; 0x18 + 46ee: 00 db rcall .-2560 ; 0x3cf0 + Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); + 46f0: 89 8d ldd r24, Y+25 ; 0x19 + 46f2: fe da rcall .-2564 ; 0x3cf0 + Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); + 46f4: 8a 8d ldd r24, Y+26 ; 0x1a + 46f6: fc da rcall .-2568 ; 0x3cf0 + + Endpoint_ClearIN(); + 46f8: c4 da rcall .-2680 ; 0x3c82 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 46fa: df 91 pop r29 + 46fc: cf 91 pop r28 + 46fe: 1f 91 pop r17 + 4700: 0f 91 pop r16 + 4702: ff 90 pop r15 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 4824: ce 01 movw r24, r28 - 4826: 60 d1 rcall .+704 ; 0x4ae8 - 4828: 68 cf rjmp .-304 ; 0x46fa - -0000482a : Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 482a: cf 93 push r28 - 482c: df 93 push r29 - 482e: ec 01 movw r28, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 4830: 40 96 adiw r24, 0x10 ; 16 - 4832: fc 01 movw r30, r24 - 4834: 8b e0 ldi r24, 0x0B ; 11 Endpoint_ClearIN(); - 4836: df 01 movw r26, r30 - 4838: 1d 92 st X+, r1 Endpoint_ClearStatusStage(); - 483a: 8a 95 dec r24 - 483c: e9 f7 brne .-6 ; 0x4838 - 483e: 82 e0 ldi r24, 0x02 ; 2 + 4704: be cc rjmp .-1668 ; 0x4082 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); } break; case CDC_REQ_SetControlLineState: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 4840: 8c 83 std Y+4, r24 ; 0x04 - 4842: 89 87 std Y+9, r24 ; 0x09 - 4844: 83 e0 ldi r24, 0x03 ; 3 - 4846: 8e 87 std Y+14, r24 ; 0x0e - 4848: ce 01 movw r24, r28 + 4706: 80 91 15 23 lds r24, 0x2315 + 470a: 81 32 cpi r24, 0x21 ; 33 + 470c: 09 f0 breq .+2 ; 0x4710 + 470e: 84 cf rjmp .-248 ; 0x4618 { Endpoint_ClearSETUP(); - 484a: 01 96 adiw r24, 0x01 ; 1 - 484c: 61 e0 ldi r22, 0x01 ; 1 + 4710: 53 db rcall .-2394 ; 0x3db8 Endpoint_ClearStatusStage(); - 484e: 55 dd rcall .-1366 ; 0x42fa - 4850: 88 23 and r24, r24 + 4712: b7 dc rcall .-1682 ; 0x4082 CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 4852: 21 f4 brne .+8 ; 0x485c - 4854: 80 e0 ldi r24, 0x00 ; 0 - 4856: df 91 pop r29 - 4858: cf 91 pop r28 - 485a: 08 95 ret - 485c: ce 01 movw r24, r28 + 4714: 80 91 17 23 lds r24, 0x2317 + 4718: 90 91 18 23 lds r25, 0x2318 + 471c: 88 8b std Y+16, r24 ; 0x10 + 471e: 99 8b std Y+17, r25 ; 0x11 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 485e: 06 96 adiw r24, 0x06 ; 6 - 4860: 61 e0 ldi r22, 0x01 ; 1 - 4862: 4b dd rcall .-1386 ; 0x42fa - 4864: 88 23 and r24, r24 - CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; + 4720: ce 01 movw r24, r28 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } - if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) - return false; - - if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) - 4866: b1 f3 breq .-20 ; 0x4854 - 4868: ce 01 movw r24, r28 - 486a: 0b 96 adiw r24, 0x0b ; 11 - return false; - - if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) - 486c: 61 e0 ldi r22, 0x01 ; 1 - 486e: 45 dd rcall .-1398 ; 0x42fa - 4870: df 91 pop r29 - 4872: cf 91 pop r28 - 4874: 08 95 ret - -00004876 : - return false; - - return true; -} - 4876: cf 93 push r28 - 4878: df 93 push r29 - 487a: eb 01 movw r28, r22 -} - -uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, - const char* const String) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 487c: 20 91 24 23 lds r18, 0x2324 - 4880: 24 30 cpi r18, 0x04 ; 4 - 4882: 21 f0 breq .+8 ; 0x488c - return ENDPOINT_RWSTREAM_DeviceDisconnected; - 4884: 82 e0 ldi r24, 0x02 ; 2 - - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - return Endpoint_Write_Stream_LE(String, strlen(String), NULL); -} - 4886: df 91 pop r29 - 4888: cf 91 pop r28 - 488a: 08 95 ret -} - -uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, - const char* const String) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 488c: fc 01 movw r30, r24 - 488e: 44 89 ldd r20, Z+20 ; 0x14 - 4890: 55 89 ldd r21, Z+21 ; 0x15 - 4892: 66 89 ldd r22, Z+22 ; 0x16 - 4894: 77 89 ldd r23, Z+23 ; 0x17 - 4896: 41 15 cp r20, r1 - 4898: 51 05 cpc r21, r1 - 489a: 61 05 cpc r22, r1 - 489c: 71 05 cpc r23, r1 - 489e: 91 f3 breq .-28 ; 0x4884 - return ENDPOINT_RWSTREAM_DeviceDisconnected; - - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 48a0: 81 81 ldd r24, Z+1 ; 0x01 - 48a2: 1d dc rcall .-1990 ; 0x40de - 48a4: fe 01 movw r30, r28 - return Endpoint_Write_Stream_LE(String, strlen(String), NULL); - 48a6: 01 90 ld r0, Z+ - 48a8: 00 20 and r0, r0 - 48aa: e9 f7 brne .-6 ; 0x48a6 - 48ac: 31 97 sbiw r30, 0x01 ; 1 - 48ae: ec 1b sub r30, r28 - 48b0: fd 0b sbc r31, r29 - 48b2: ce 01 movw r24, r28 - 48b4: bf 01 movw r22, r30 - 48b6: 40 e0 ldi r20, 0x00 ; 0 - 48b8: 50 e0 ldi r21, 0x00 ; 0 - 48ba: 0a da rcall .-3052 ; 0x3cd0 - 48bc: e4 cf rjmp .-56 ; 0x4886 - -000048be : - 48be: 0f 93 push r16 - 48c0: 1f 93 push r17 -} - -uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, - const void* const Buffer, - const uint16_t Length) -{ - 48c2: cf 93 push r28 - 48c4: df 93 push r29 - 48c6: 8b 01 movw r16, r22 - 48c8: ea 01 movw r28, r20 - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 48ca: 20 91 24 23 lds r18, 0x2324 - 48ce: 24 30 cpi r18, 0x04 ; 4 - 48d0: 31 f0 breq .+12 ; 0x48de - return ENDPOINT_RWSTREAM_DeviceDisconnected; - 48d2: 82 e0 ldi r24, 0x02 ; 2 - - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - return Endpoint_Write_Stream_LE(Buffer, Length, NULL); -} - 48d4: df 91 pop r29 - 48d6: cf 91 pop r28 - 48d8: 1f 91 pop r17 - 48da: 0f 91 pop r16 - 48dc: 08 95 ret - -uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, - const void* const Buffer, - const uint16_t Length) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 48de: fc 01 movw r30, r24 - 48e0: 44 89 ldd r20, Z+20 ; 0x14 - 48e2: 55 89 ldd r21, Z+21 ; 0x15 - 48e4: 66 89 ldd r22, Z+22 ; 0x16 - 48e6: 77 89 ldd r23, Z+23 ; 0x17 - 48e8: 41 15 cp r20, r1 - 48ea: 51 05 cpc r21, r1 - 48ec: 61 05 cpc r22, r1 - 48ee: 71 05 cpc r23, r1 - 48f0: 81 f3 breq .-32 ; 0x48d2 - return ENDPOINT_RWSTREAM_DeviceDisconnected; - - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 48f2: 81 81 ldd r24, Z+1 ; 0x01 - 48f4: f4 db rcall .-2072 ; 0x40de - 48f6: c8 01 movw r24, r16 - return Endpoint_Write_Stream_LE(Buffer, Length, NULL); - 48f8: be 01 movw r22, r28 - 48fa: 40 e0 ldi r20, 0x00 ; 0 - 48fc: 50 e0 ldi r21, 0x00 ; 0 - 48fe: e8 d9 rcall .-3120 ; 0x3cd0 - 4900: e9 cf rjmp .-46 ; 0x48d4 - -00004902 : - 4902: cf 93 push r28 - 4904: c6 2f mov r28, r22 -} - -uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, - const uint8_t Data) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 4906: 20 91 24 23 lds r18, 0x2324 - 490a: 24 30 cpi r18, 0x04 ; 4 - 490c: 19 f0 breq .+6 ; 0x4914 - return ENDPOINT_RWSTREAM_DeviceDisconnected; - 490e: 82 e0 ldi r24, 0x02 ; 2 - return ErrorCode; - } - - Endpoint_Write_8(Data); - return ENDPOINT_READYWAIT_NoError; -} - 4910: cf 91 pop r28 - 4912: 08 95 ret -} - -uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, - const uint8_t Data) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 4914: fc 01 movw r30, r24 - 4916: 44 89 ldd r20, Z+20 ; 0x14 - 4918: 55 89 ldd r21, Z+21 ; 0x15 - 491a: 66 89 ldd r22, Z+22 ; 0x16 - 491c: 77 89 ldd r23, Z+23 ; 0x17 - 491e: 41 15 cp r20, r1 - 4920: 51 05 cpc r21, r1 - 4922: 61 05 cpc r22, r1 - 4924: 71 05 cpc r23, r1 - 4926: 99 f3 breq .-26 ; 0x490e - return ENDPOINT_RWSTREAM_DeviceDisconnected; - - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 4928: 81 81 ldd r24, Z+1 ; 0x01 - 492a: d9 db rcall .-2126 ; 0x40de - 492c: 20 91 2d 23 lds r18, 0x232D - * on its direction. - */ - static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline bool Endpoint_IsReadWriteAllowed(void) - { - return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); - 4930: 30 91 2e 23 lds r19, 0x232E - 4934: f9 01 movw r30, r18 - 4936: ef 5b subi r30, 0xBF ; 191 - 4938: ff 4f sbci r31, 0xFF ; 255 - 493a: 90 81 ld r25, Z - 493c: 20 5c subi r18, 0xC0 ; 192 - 493e: 3f 4f sbci r19, 0xFF ; 255 - 4940: f9 01 movw r30, r18 - 4942: 80 81 ld r24, Z - 4944: 98 17 cp r25, r24 - - if (!(Endpoint_IsReadWriteAllowed())) - 4946: 20 f0 brcs .+8 ; 0x4950 - 4948: 84 db rcall .-2296 ; 0x4052 - { - Endpoint_ClearIN(); - 494a: 91 dd rcall .-1246 ; 0x446e - 494c: 88 23 and r24, r24 - - uint8_t ErrorCode; - - if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 494e: 01 f7 brne .-64 ; 0x4910 - 4950: 8c 2f mov r24, r28 - 4952: b6 db rcall .-2196 ; 0x40c0 - 4954: 80 e0 ldi r24, 0x00 ; 0 - return ErrorCode; - } - - Endpoint_Write_8(Data); - 4956: dc cf rjmp .-72 ; 0x4910 - -00004958 : - 4958: 0f 93 push r16 - 495a: 1f 93 push r17 - return ENDPOINT_READYWAIT_NoError; - 495c: cf 93 push r28 - 495e: df 93 push r29 -} - -uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - 4960: 0f 92 push r0 - 4962: cd b7 in r28, 0x3d ; 61 - 4964: de b7 in r29, 0x3e ; 62 - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 4966: 20 91 24 23 lds r18, 0x2324 - 496a: 24 30 cpi r18, 0x04 ; 4 - 496c: 39 f0 breq .+14 ; 0x497c - return ENDPOINT_RWSTREAM_DeviceDisconnected; - 496e: 82 e0 ldi r24, 0x02 ; 2 - - Endpoint_ClearIN(); - } - - return ENDPOINT_READYWAIT_NoError; -} - 4970: 0f 90 pop r0 - 4972: df 91 pop r29 - 4974: cf 91 pop r28 - 4976: 1f 91 pop r17 - 4978: 0f 91 pop r16 - 497a: 08 95 ret - return ENDPOINT_READYWAIT_NoError; -} - -uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 497c: fc 01 movw r30, r24 - 497e: 44 89 ldd r20, Z+20 ; 0x14 - 4980: 55 89 ldd r21, Z+21 ; 0x15 - 4982: 66 89 ldd r22, Z+22 ; 0x16 - 4984: 77 89 ldd r23, Z+23 ; 0x17 - 4986: 41 15 cp r20, r1 - 4988: 51 05 cpc r21, r1 - 498a: 61 05 cpc r22, r1 - 498c: 71 05 cpc r23, r1 - 498e: 79 f3 breq .-34 ; 0x496e - return ENDPOINT_RWSTREAM_DeviceDisconnected; - - uint8_t ErrorCode; - - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 4990: 81 81 ldd r24, Z+1 ; 0x01 - 4992: a5 db rcall .-2230 ; 0x40de - 4994: 80 91 31 23 lds r24, 0x2331 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4998: 20 91 2d 23 lds r18, 0x232D - return USB_Endpoint_SelectedFIFO->Position; - 499c: 30 91 2e 23 lds r19, 0x232E - 49a0: f9 01 movw r30, r18 - 49a2: 87 fd sbrc r24, 7 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 49a4: 1d c0 rjmp .+58 ; 0x49e0 - 49a6: e0 5c subi r30, 0xC0 ; 192 - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 49a8: ff 4f sbci r31, 0xFF ; 255 - 49aa: 80 81 ld r24, Z - 49ac: f9 01 movw r30, r18 - 49ae: ef 5b subi r30, 0xBF ; 191 - 49b0: ff 4f sbci r31, 0xFF ; 255 - 49b2: 40 81 ld r20, Z - 49b4: 90 e0 ldi r25, 0x00 ; 0 - 49b6: 84 1b sub r24, r20 - 49b8: 91 09 sbc r25, r1 - 49ba: 00 97 sbiw r24, 0x00 ; 0 - - if (!(Endpoint_BytesInEndpoint())) - 49bc: 11 f4 brne .+4 ; 0x49c2 - 49be: 80 e0 ldi r24, 0x00 ; 0 - return ErrorCode; - - Endpoint_ClearIN(); - } - - return ENDPOINT_READYWAIT_NoError; - 49c0: d7 cf rjmp .-82 ; 0x4970 - 49c2: 00 81 ld r16, Z - * on its direction. - */ - static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline bool Endpoint_IsReadWriteAllowed(void) - { - return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); - 49c4: 20 5c subi r18, 0xC0 ; 192 - 49c6: 3f 4f sbci r19, 0xFF ; 255 - 49c8: f9 01 movw r30, r18 - 49ca: 10 81 ld r17, Z - 49cc: 42 db rcall .-2428 ; 0x4052 - if (!(Endpoint_BytesInEndpoint())) - return ENDPOINT_READYWAIT_NoError; - - bool BankFull = !(Endpoint_IsReadWriteAllowed()); - - Endpoint_ClearIN(); - 49ce: 01 17 cp r16, r17 - 49d0: b0 f3 brcs .-20 ; 0x49be - - if (BankFull) - 49d2: 4d dd rcall .-1382 ; 0x446e - 49d4: 88 23 and r24, r24 - { - if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 49d6: 61 f6 brne .-104 ; 0x4970 - 49d8: 89 83 std Y+1, r24 ; 0x01 - 49da: 3b db rcall .-2442 ; 0x4052 - 49dc: 89 81 ldd r24, Y+1 ; 0x01 - return ErrorCode; - - Endpoint_ClearIN(); - 49de: c8 cf rjmp .-112 ; 0x4970 - 49e0: ef 5b subi r30, 0xBF ; 191 - 49e2: ff 4f sbci r31, 0xFF ; 255 - 49e4: 80 81 ld r24, Z - 49e6: 90 e0 ldi r25, 0x00 ; 0 - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - return USB_Endpoint_SelectedFIFO->Position; - 49e8: e8 cf rjmp .-48 ; 0x49ba - -000049ea : - 49ea: cf 93 push r28 - 49ec: df 93 push r29 - 49ee: ec 01 movw r28, r24 - 49f0: 80 91 24 23 lds r24, 0x2324 - return true; -} - -void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 49f4: 84 30 cpi r24, 0x04 ; 4 - 49f6: 19 f0 breq .+6 ; 0x49fe - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - - if (Endpoint_IsINReady()) - CDC_Device_Flush(CDCInterfaceInfo); - #endif -} - 49f8: df 91 pop r29 - 49fa: cf 91 pop r28 - 49fc: 08 95 ret - return true; -} - -void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 49fe: 8c 89 ldd r24, Y+20 ; 0x14 - 4a00: 9d 89 ldd r25, Y+21 ; 0x15 - 4a02: ae 89 ldd r26, Y+22 ; 0x16 - 4a04: bf 89 ldd r27, Y+23 ; 0x17 - 4a06: 00 97 sbiw r24, 0x00 ; 0 - 4a08: a1 05 cpc r26, r1 - 4a0a: b1 05 cpc r27, r1 - 4a0c: a9 f3 breq .-22 ; 0x49f8 - return; - - #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 4a0e: 89 81 ldd r24, Y+1 ; 0x01 - 4a10: 66 db rcall .-2356 ; 0x40de - 4a12: 19 dc rcall .-1998 ; 0x4246 - - if (Endpoint_IsINReady()) - 4a14: 88 23 and r24, r24 - 4a16: 81 f3 breq .-32 ; 0x49f8 - 4a18: ce 01 movw r24, r28 - 4a1a: 9e df rcall .-196 ; 0x4958 - CDC_Device_Flush(CDCInterfaceInfo); - 4a1c: ed cf rjmp .-38 ; 0x49f8 - -00004a1e : - 4a1e: cf 93 push r28 - 4a20: df 93 push r29 - 4a22: 00 d0 rcall .+0 ; 0x4a24 - return 0; + break; } } + 4722: df 91 pop r29 + 4724: cf 91 pop r28 + 4726: 1f 91 pop r17 + 4728: 0f 91 pop r16 + 472a: ff 90 pop r15 + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); -int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - 4a24: cd b7 in r28, 0x3d ; 61 - 4a26: de b7 in r29, 0x3e ; 62 - 4a28: fc 01 movw r30, r24 - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 4a2a: 80 91 24 23 lds r24, 0x2324 - 4a2e: 84 30 cpi r24, 0x04 ; 4 - 4a30: 09 f0 breq .+2 ; 0x4a34 - 4a32: 3e c0 rjmp .+124 ; 0x4ab0 - 4a34: 44 89 ldd r20, Z+20 ; 0x14 - 4a36: 55 89 ldd r21, Z+21 ; 0x15 - 4a38: 66 89 ldd r22, Z+22 ; 0x16 - 4a3a: 77 89 ldd r23, Z+23 ; 0x17 - 4a3c: 41 15 cp r20, r1 - 4a3e: 51 05 cpc r21, r1 - 4a40: 61 05 cpc r22, r1 - 4a42: 71 05 cpc r23, r1 - 4a44: a9 f1 breq .+106 ; 0x4ab0 - return -1; + CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - int16_t ReceivedByte = -1; + EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); + 472c: 62 cf rjmp .-316 ; 0x45f2 - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); - 4a46: 86 81 ldd r24, Z+6 ; 0x06 - 4a48: 4a db rcall .-2412 ; 0x40de - 4a4a: e5 db rcall .-2102 ; 0x4216 +0000472e <__mulshisi3>: + 472e: b7 ff sbrs r27, 7 + 4730: 04 c0 rjmp .+8 ; 0x473a <__muluhisi3> - if (Endpoint_IsOUTReceived()) - 4a4c: 88 23 and r24, r24 - 4a4e: 81 f1 breq .+96 ; 0x4ab0 - 4a50: 80 91 31 23 lds r24, 0x2331 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4a54: 20 91 2d 23 lds r18, 0x232D - return USB_Endpoint_SelectedFIFO->Position; - 4a58: 30 91 2e 23 lds r19, 0x232E - 4a5c: f9 01 movw r30, r18 - 4a5e: 87 fd sbrc r24, 7 - 4a60: 3e c0 rjmp .+124 ; 0x4ade - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4a62: e0 5c subi r30, 0xC0 ; 192 - 4a64: ff 4f sbci r31, 0xFF ; 255 - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 4a66: 80 81 ld r24, Z - 4a68: f9 01 movw r30, r18 - 4a6a: ef 5b subi r30, 0xBF ; 191 - 4a6c: ff 4f sbci r31, 0xFF ; 255 - 4a6e: 40 81 ld r20, Z - 4a70: 90 e0 ldi r25, 0x00 ; 0 - 4a72: 84 1b sub r24, r20 - 4a74: 91 09 sbc r25, r1 - 4a76: 00 97 sbiw r24, 0x00 ; 0 - 4a78: 11 f5 brne .+68 ; 0x4abe - { - if (Endpoint_BytesInEndpoint()) - 4a7a: 8f ef ldi r24, 0xFF ; 255 - 4a7c: 9f ef ldi r25, 0xFF ; 255 -int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - return -1; +00004732 <__mulohisi3>: + 4732: 03 d0 rcall .+6 ; 0x473a <__muluhisi3> + 4734: 82 1b sub r24, r18 + 4736: 93 0b sbc r25, r19 + 4738: 08 95 ret - int16_t ReceivedByte = -1; - 4a7e: 40 91 31 23 lds r20, 0x2331 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4a82: 47 fd sbrc r20, 7 - 4a84: 29 c0 rjmp .+82 ; 0x4ad8 - 4a86: 20 5c subi r18, 0xC0 ; 192 - 4a88: 3f 4f sbci r19, 0xFF ; 255 - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 4a8a: d9 01 movw r26, r18 - 4a8c: 2c 91 ld r18, X - 4a8e: 40 81 ld r20, Z - 4a90: 30 e0 ldi r19, 0x00 ; 0 - 4a92: 24 1b sub r18, r20 - 4a94: 31 09 sbc r19, r1 - 4a96: 21 15 cp r18, r1 - 4a98: 31 05 cpc r19, r1 - if (Endpoint_IsOUTReceived()) - { - if (Endpoint_BytesInEndpoint()) - ReceivedByte = Endpoint_Read_8(); +0000473a <__muluhisi3>: + 473a: 09 d0 rcall .+18 ; 0x474e <__umulhisi3> + 473c: a5 9f mul r26, r21 + 473e: 90 0d add r25, r0 + 4740: b4 9f mul r27, r20 + 4742: 90 0d add r25, r0 + 4744: a4 9f mul r26, r20 + 4746: 80 0d add r24, r0 + 4748: 91 1d adc r25, r1 + 474a: 11 24 eor r1, r1 + 474c: 08 95 ret - if (!(Endpoint_BytesInEndpoint())) - 4a9a: 61 f4 brne .+24 ; 0x4ab4 - 4a9c: 89 83 std Y+1, r24 ; 0x01 - 4a9e: 9a 83 std Y+2, r25 ; 0x02 - Endpoint_ClearOUT(); - 4aa0: f1 da rcall .-2590 ; 0x4084 - 4aa2: 89 81 ldd r24, Y+1 ; 0x01 - 4aa4: 9a 81 ldd r25, Y+2 ; 0x02 - 4aa6: 0f 90 pop r0 - 4aa8: 0f 90 pop r0 - 4aaa: df 91 pop r29 - } +0000474e <__umulhisi3>: + 474e: a2 9f mul r26, r18 + 4750: b0 01 movw r22, r0 + 4752: b3 9f mul r27, r19 + 4754: c0 01 movw r24, r0 + 4756: a3 9f mul r26, r19 + 4758: 01 d0 rcall .+2 ; 0x475c <__umulhisi3+0xe> + 475a: b2 9f mul r27, r18 + 475c: 70 0d add r23, r0 + 475e: 81 1d adc r24, r1 + 4760: 11 24 eor r1, r1 + 4762: 91 1d adc r25, r1 + 4764: 08 95 ret - return ReceivedByte; -} - 4aac: cf 91 pop r28 - 4aae: 08 95 ret - 4ab0: 8f ef ldi r24, 0xFF ; 255 - 4ab2: 9f ef ldi r25, 0xFF ; 255 - 4ab4: 0f 90 pop r0 -int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - return -1; +00004766 : + 4766: 8f 92 push r8 + 4768: 9f 92 push r9 + 476a: af 92 push r10 + 476c: bf 92 push r11 + 476e: cf 92 push r12 + 4770: df 92 push r13 + 4772: ef 92 push r14 + 4774: ff 92 push r15 + 4776: cf 93 push r28 + 4778: df 93 push r29 + 477a: ec 01 movw r28, r24 + 477c: 68 81 ld r22, Y + 477e: 79 81 ldd r23, Y+1 ; 0x01 + 4780: 8a 81 ldd r24, Y+2 ; 0x02 + 4782: 9b 81 ldd r25, Y+3 ; 0x03 + 4784: 61 15 cp r22, r1 + 4786: 71 05 cpc r23, r1 + 4788: 81 05 cpc r24, r1 + 478a: 91 05 cpc r25, r1 + 478c: 21 f4 brne .+8 ; 0x4796 + 478e: 64 e2 ldi r22, 0x24 ; 36 + 4790: 79 ed ldi r23, 0xD9 ; 217 + 4792: 8b e5 ldi r24, 0x5B ; 91 + 4794: 97 e0 ldi r25, 0x07 ; 7 + 4796: 2d e1 ldi r18, 0x1D ; 29 + 4798: 33 ef ldi r19, 0xF3 ; 243 + 479a: 41 e0 ldi r20, 0x01 ; 1 + 479c: 50 e0 ldi r21, 0x00 ; 0 + 479e: 38 d3 rcall .+1648 ; 0x4e10 <__divmodsi4> + 47a0: 49 01 movw r8, r18 + 47a2: 5a 01 movw r10, r20 + 47a4: 9b 01 movw r18, r22 + 47a6: ac 01 movw r20, r24 + 47a8: a7 ea ldi r26, 0xA7 ; 167 + 47aa: b1 e4 ldi r27, 0x41 ; 65 + 47ac: c6 df rcall .-116 ; 0x473a <__muluhisi3> + 47ae: 6b 01 movw r12, r22 + 47b0: 7c 01 movw r14, r24 + 47b2: ac ee ldi r26, 0xEC ; 236 + 47b4: b4 ef ldi r27, 0xF4 ; 244 + 47b6: a5 01 movw r20, r10 + 47b8: 94 01 movw r18, r8 + 47ba: bb df rcall .-138 ; 0x4732 <__mulohisi3> + 47bc: c6 0e add r12, r22 + 47be: d7 1e adc r13, r23 + 47c0: e8 1e adc r14, r24 + 47c2: f9 1e adc r15, r25 + 47c4: f7 fe sbrs r15, 7 + 47c6: 06 c0 rjmp .+12 ; 0x47d4 + 47c8: 81 e0 ldi r24, 0x01 ; 1 + 47ca: c8 1a sub r12, r24 + 47cc: d1 08 sbc r13, r1 + 47ce: e1 08 sbc r14, r1 + 47d0: 80 e8 ldi r24, 0x80 ; 128 + 47d2: f8 0a sbc r15, r24 + 47d4: c8 82 st Y, r12 + 47d6: d9 82 std Y+1, r13 ; 0x01 + 47d8: ea 82 std Y+2, r14 ; 0x02 + 47da: fb 82 std Y+3, r15 ; 0x03 + 47dc: e8 94 clt + 47de: d7 f8 bld r13, 7 + 47e0: ee 24 eor r14, r14 + 47e2: ff 24 eor r15, r15 + 47e4: c6 01 movw r24, r12 + 47e6: df 91 pop r29 + 47e8: cf 91 pop r28 + 47ea: ff 90 pop r15 + 47ec: ef 90 pop r14 + 47ee: df 90 pop r13 + 47f0: cf 90 pop r12 + 47f2: bf 90 pop r11 + 47f4: af 90 pop r10 + 47f6: 9f 90 pop r9 + 47f8: 8f 90 pop r8 + 47fa: 08 95 ret - int16_t ReceivedByte = -1; - 4ab6: 0f 90 pop r0 - 4ab8: df 91 pop r29 - if (!(Endpoint_BytesInEndpoint())) - Endpoint_ClearOUT(); - } +000047fc : + 47fc: b4 cf rjmp .-152 ; 0x4766 - return ReceivedByte; -} - 4aba: cf 91 pop r28 - 4abc: 08 95 ret - 4abe: f1 da rcall .-2590 ; 0x40a2 - 4ac0: 90 e0 ldi r25, 0x00 ; 0 - 4ac2: 20 91 2d 23 lds r18, 0x232D - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); +000047fe : + 47fe: 8c e1 ldi r24, 0x1C ; 28 + 4800: 90 e2 ldi r25, 0x20 ; 32 + 4802: b1 cf rjmp .-158 ; 0x4766 - if (Endpoint_IsOUTReceived()) - { - if (Endpoint_BytesInEndpoint()) - ReceivedByte = Endpoint_Read_8(); - 4ac6: 30 91 2e 23 lds r19, 0x232E - 4aca: f9 01 movw r30, r18 - 4acc: ef 5b subi r30, 0xBF ; 191 - 4ace: ff 4f sbci r31, 0xFF ; 255 - 4ad0: 40 91 31 23 lds r20, 0x2331 - 4ad4: 47 ff sbrs r20, 7 - 4ad6: d7 cf rjmp .-82 ; 0x4a86 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4ad8: 20 81 ld r18, Z - 4ada: 30 e0 ldi r19, 0x00 ; 0 - 4adc: dc cf rjmp .-72 ; 0x4a96 - 4ade: ef 5b subi r30, 0xBF ; 191 - return USB_Endpoint_SelectedFIFO->Position; - 4ae0: ff 4f sbci r31, 0xFF ; 255 - 4ae2: 80 81 ld r24, Z - 4ae4: 90 e0 ldi r25, 0x00 ; 0 - 4ae6: c7 cf rjmp .-114 ; 0x4a76 +00004804 : + 4804: a0 e0 ldi r26, 0x00 ; 0 + 4806: b0 e0 ldi r27, 0x00 ; 0 + 4808: 80 93 1c 20 sts 0x201C, r24 + 480c: 90 93 1d 20 sts 0x201D, r25 + 4810: a0 93 1e 20 sts 0x201E, r26 + 4814: b0 93 1f 20 sts 0x201F, r27 + 4818: 08 95 ret -00004ae8 : - 4ae8: 08 95 ret +0000481a : + 481a: fb 01 movw r30, r22 + 481c: dc 01 movw r26, r24 + 481e: 02 c0 rjmp .+4 ; 0x4824 + 4820: 05 90 lpm r0, Z+ + 4822: 0d 92 st X+, r0 + 4824: 41 50 subi r20, 0x01 ; 1 + 4826: 50 40 sbci r21, 0x00 ; 0 + 4828: d8 f7 brcc .-10 ; 0x4820 + 482a: 08 95 ret -00004aea <__mulsi3>: - 4aea: 62 9f mul r22, r18 - 4aec: d0 01 movw r26, r0 - 4aee: 73 9f mul r23, r19 - 4af0: f0 01 movw r30, r0 - 4af2: 82 9f mul r24, r18 - 4af4: e0 0d add r30, r0 - 4af6: f1 1d adc r31, r1 - 4af8: 64 9f mul r22, r20 - 4afa: e0 0d add r30, r0 - 4afc: f1 1d adc r31, r1 - 4afe: 92 9f mul r25, r18 - 4b00: f0 0d add r31, r0 - 4b02: 83 9f mul r24, r19 - 4b04: f0 0d add r31, r0 - 4b06: 74 9f mul r23, r20 - 4b08: f0 0d add r31, r0 - 4b0a: 65 9f mul r22, r21 - 4b0c: f0 0d add r31, r0 - 4b0e: 99 27 eor r25, r25 - 4b10: 72 9f mul r23, r18 - 4b12: b0 0d add r27, r0 - 4b14: e1 1d adc r30, r1 - 4b16: f9 1f adc r31, r25 - 4b18: 63 9f mul r22, r19 - 4b1a: b0 0d add r27, r0 - 4b1c: e1 1d adc r30, r1 - 4b1e: f9 1f adc r31, r25 - 4b20: bd 01 movw r22, r26 - 4b22: cf 01 movw r24, r30 - 4b24: 11 24 eor r1, r1 - 4b26: 08 95 ret +0000482c : + 482c: fb 01 movw r30, r22 + 482e: dc 01 movw r26, r24 + 4830: 8d 91 ld r24, X+ + 4832: 05 90 lpm r0, Z+ + 4834: 80 19 sub r24, r0 + 4836: 01 10 cpse r0, r1 + 4838: d9 f3 breq .-10 ; 0x4830 + 483a: 99 0b sbc r25, r25 + 483c: 08 95 ret -00004b28 : - 4b28: 8f 92 push r8 - 4b2a: 9f 92 push r9 - 4b2c: af 92 push r10 - 4b2e: bf 92 push r11 - 4b30: cf 92 push r12 - 4b32: df 92 push r13 - 4b34: ef 92 push r14 - 4b36: ff 92 push r15 - 4b38: cf 93 push r28 - 4b3a: df 93 push r29 - 4b3c: ec 01 movw r28, r24 - 4b3e: 88 81 ld r24, Y - 4b40: 99 81 ldd r25, Y+1 ; 0x01 - 4b42: aa 81 ldd r26, Y+2 ; 0x02 - 4b44: bb 81 ldd r27, Y+3 ; 0x03 - 4b46: 00 97 sbiw r24, 0x00 ; 0 - 4b48: a1 05 cpc r26, r1 - 4b4a: b1 05 cpc r27, r1 - 4b4c: 21 f4 brne .+8 ; 0x4b56 - 4b4e: 84 e2 ldi r24, 0x24 ; 36 - 4b50: 99 ed ldi r25, 0xD9 ; 217 - 4b52: ab e5 ldi r26, 0x5B ; 91 - 4b54: b7 e0 ldi r27, 0x07 ; 7 - 4b56: bc 01 movw r22, r24 - 4b58: cd 01 movw r24, r26 - 4b5a: 2d e1 ldi r18, 0x1D ; 29 - 4b5c: 33 ef ldi r19, 0xF3 ; 243 - 4b5e: 41 e0 ldi r20, 0x01 ; 1 - 4b60: 50 e0 ldi r21, 0x00 ; 0 - 4b62: 3d d3 rcall .+1658 ; 0x51de <__divmodsi4> - 4b64: 49 01 movw r8, r18 - 4b66: 5a 01 movw r10, r20 - 4b68: 27 ea ldi r18, 0xA7 ; 167 - 4b6a: 31 e4 ldi r19, 0x41 ; 65 - 4b6c: 40 e0 ldi r20, 0x00 ; 0 - 4b6e: 50 e0 ldi r21, 0x00 ; 0 - 4b70: bc df rcall .-136 ; 0x4aea <__mulsi3> - 4b72: 6b 01 movw r12, r22 - 4b74: 7c 01 movw r14, r24 - 4b76: c5 01 movw r24, r10 - 4b78: b4 01 movw r22, r8 - 4b7a: 2c ee ldi r18, 0xEC ; 236 - 4b7c: 34 ef ldi r19, 0xF4 ; 244 - 4b7e: 4f ef ldi r20, 0xFF ; 255 - 4b80: 5f ef ldi r21, 0xFF ; 255 - 4b82: b3 df rcall .-154 ; 0x4aea <__mulsi3> - 4b84: dc 01 movw r26, r24 - 4b86: cb 01 movw r24, r22 - 4b88: c8 0e add r12, r24 - 4b8a: d9 1e adc r13, r25 - 4b8c: ea 1e adc r14, r26 - 4b8e: fb 1e adc r15, r27 - 4b90: f7 fe sbrs r15, 7 - 4b92: 08 c0 rjmp .+16 ; 0x4ba4 - 4b94: 8f ef ldi r24, 0xFF ; 255 - 4b96: 9f ef ldi r25, 0xFF ; 255 - 4b98: af ef ldi r26, 0xFF ; 255 - 4b9a: bf e7 ldi r27, 0x7F ; 127 - 4b9c: c8 0e add r12, r24 - 4b9e: d9 1e adc r13, r25 - 4ba0: ea 1e adc r14, r26 - 4ba2: fb 1e adc r15, r27 - 4ba4: c8 82 st Y, r12 - 4ba6: d9 82 std Y+1, r13 ; 0x01 - 4ba8: ea 82 std Y+2, r14 ; 0x02 - 4baa: fb 82 std Y+3, r15 ; 0x03 - 4bac: c6 01 movw r24, r12 - 4bae: 9f 77 andi r25, 0x7F ; 127 - 4bb0: df 91 pop r29 - 4bb2: cf 91 pop r28 - 4bb4: ff 90 pop r15 - 4bb6: ef 90 pop r14 - 4bb8: df 90 pop r13 - 4bba: cf 90 pop r12 - 4bbc: bf 90 pop r11 - 4bbe: af 90 pop r10 - 4bc0: 9f 90 pop r9 - 4bc2: 8f 90 pop r8 - 4bc4: 08 95 ret +0000483e : + 483e: fb 01 movw r30, r22 + 4840: dc 01 movw r26, r24 + 4842: 41 50 subi r20, 0x01 ; 1 + 4844: 50 40 sbci r21, 0x00 ; 0 + 4846: 48 f0 brcs .+18 ; 0x485a + 4848: 05 90 lpm r0, Z+ + 484a: 0d 92 st X+, r0 + 484c: 00 20 and r0, r0 + 484e: c9 f7 brne .-14 ; 0x4842 + 4850: 01 c0 rjmp .+2 ; 0x4854 + 4852: 1d 92 st X+, r1 + 4854: 41 50 subi r20, 0x01 ; 1 + 4856: 50 40 sbci r21, 0x00 ; 0 + 4858: e0 f7 brcc .-8 ; 0x4852 + 485a: 08 95 ret -00004bc6 : - 4bc6: b0 cf rjmp .-160 ; 0x4b28 +0000485c : + 485c: fb 01 movw r30, r22 + 485e: dc 01 movw r26, r24 + 4860: 02 c0 rjmp .+4 ; 0x4866 + 4862: 01 90 ld r0, Z+ + 4864: 0d 92 st X+, r0 + 4866: 41 50 subi r20, 0x01 ; 1 + 4868: 50 40 sbci r21, 0x00 ; 0 + 486a: d8 f7 brcc .-10 ; 0x4862 + 486c: 08 95 ret -00004bc8 : - 4bc8: 8d e9 ldi r24, 0x9D ; 157 - 4bca: 90 e2 ldi r25, 0x20 ; 32 - 4bcc: ad cf rjmp .-166 ; 0x4b28 +0000486e : + 486e: ae e0 ldi r26, 0x0E ; 14 + 4870: b0 e0 ldi r27, 0x00 ; 0 + 4872: ec e3 ldi r30, 0x3C ; 60 + 4874: f4 e2 ldi r31, 0x24 ; 36 + 4876: f5 c2 rjmp .+1514 ; 0x4e62 <__prologue_saves__+0x1c> + 4878: 0d 89 ldd r16, Y+21 ; 0x15 + 487a: 1e 89 ldd r17, Y+22 ; 0x16 + 487c: 8f 89 ldd r24, Y+23 ; 0x17 + 487e: 98 8d ldd r25, Y+24 ; 0x18 + 4880: 2e e0 ldi r18, 0x0E ; 14 + 4882: 2c 83 std Y+4, r18 ; 0x04 + 4884: 09 83 std Y+1, r16 ; 0x01 + 4886: 1a 83 std Y+2, r17 ; 0x02 + 4888: 97 ff sbrs r25, 7 + 488a: 02 c0 rjmp .+4 ; 0x4890 + 488c: 80 e0 ldi r24, 0x00 ; 0 + 488e: 90 e8 ldi r25, 0x80 ; 128 + 4890: 01 97 sbiw r24, 0x01 ; 1 + 4892: 8d 83 std Y+5, r24 ; 0x05 + 4894: 9e 83 std Y+6, r25 ; 0x06 + 4896: ce 01 movw r24, r28 + 4898: 4b 96 adiw r24, 0x1b ; 27 + 489a: ac 01 movw r20, r24 + 489c: 69 8d ldd r22, Y+25 ; 0x19 + 489e: 7a 8d ldd r23, Y+26 ; 0x1a + 48a0: ce 01 movw r24, r28 + 48a2: 01 96 adiw r24, 0x01 ; 1 + 48a4: 11 d0 rcall .+34 ; 0x48c8 + 48a6: 4d 81 ldd r20, Y+5 ; 0x05 + 48a8: 5e 81 ldd r21, Y+6 ; 0x06 + 48aa: 57 fd sbrc r21, 7 + 48ac: 0a c0 rjmp .+20 ; 0x48c2 + 48ae: 2f 81 ldd r18, Y+7 ; 0x07 + 48b0: 38 85 ldd r19, Y+8 ; 0x08 + 48b2: 42 17 cp r20, r18 + 48b4: 53 07 cpc r21, r19 + 48b6: 0c f4 brge .+2 ; 0x48ba + 48b8: 9a 01 movw r18, r20 + 48ba: f8 01 movw r30, r16 + 48bc: e2 0f add r30, r18 + 48be: f3 1f adc r31, r19 + 48c0: 10 82 st Z, r1 + 48c2: 2e 96 adiw r28, 0x0e ; 14 + 48c4: e4 e0 ldi r30, 0x04 ; 4 + 48c6: e6 c2 rjmp .+1484 ; 0x4e94 <__epilogue_restores__+0x1c> -00004bce : - 4bce: a0 e0 ldi r26, 0x00 ; 0 - 4bd0: b0 e0 ldi r27, 0x00 ; 0 - 4bd2: 80 93 9d 20 sts 0x209D, r24 - 4bd6: 90 93 9e 20 sts 0x209E, r25 - 4bda: a0 93 9f 20 sts 0x209F, r26 - 4bde: b0 93 a0 20 sts 0x20A0, r27 - 4be2: 08 95 ret +000048c8 : + 48c8: ac e0 ldi r26, 0x0C ; 12 + 48ca: b0 e0 ldi r27, 0x00 ; 0 + 48cc: e9 e6 ldi r30, 0x69 ; 105 + 48ce: f4 e2 ldi r31, 0x24 ; 36 + 48d0: ba c2 rjmp .+1396 ; 0x4e46 <__prologue_saves__> + 48d2: 7c 01 movw r14, r24 + 48d4: 6b 01 movw r12, r22 + 48d6: 8a 01 movw r16, r20 + 48d8: fc 01 movw r30, r24 + 48da: 16 82 std Z+6, r1 ; 0x06 + 48dc: 17 82 std Z+7, r1 ; 0x07 + 48de: 83 81 ldd r24, Z+3 ; 0x03 + 48e0: 81 ff sbrs r24, 1 + 48e2: b9 c1 rjmp .+882 ; 0x4c56 + 48e4: 88 24 eor r8, r8 + 48e6: 83 94 inc r8 + 48e8: 91 2c mov r9, r1 + 48ea: 8c 0e add r8, r28 + 48ec: 9d 1e adc r9, r29 + 48ee: f7 01 movw r30, r14 + 48f0: 93 81 ldd r25, Z+3 ; 0x03 + 48f2: f6 01 movw r30, r12 + 48f4: 93 fd sbrc r25, 3 + 48f6: 85 91 lpm r24, Z+ + 48f8: 93 ff sbrs r25, 3 + 48fa: 81 91 ld r24, Z+ + 48fc: 6f 01 movw r12, r30 + 48fe: 88 23 and r24, r24 + 4900: 09 f4 brne .+2 ; 0x4904 + 4902: a5 c1 rjmp .+842 ; 0x4c4e + 4904: 85 32 cpi r24, 0x25 ; 37 + 4906: 39 f4 brne .+14 ; 0x4916 + 4908: 93 fd sbrc r25, 3 + 490a: 85 91 lpm r24, Z+ + 490c: 93 ff sbrs r25, 3 + 490e: 81 91 ld r24, Z+ + 4910: 6f 01 movw r12, r30 + 4912: 85 32 cpi r24, 0x25 ; 37 + 4914: 21 f4 brne .+8 ; 0x491e + 4916: b7 01 movw r22, r14 + 4918: 90 e0 ldi r25, 0x00 ; 0 + 491a: f0 d1 rcall .+992 ; 0x4cfc + 491c: e8 cf rjmp .-48 ; 0x48ee + 491e: 51 2c mov r5, r1 + 4920: 31 2c mov r3, r1 + 4922: 20 e0 ldi r18, 0x00 ; 0 + 4924: 20 32 cpi r18, 0x20 ; 32 + 4926: a8 f4 brcc .+42 ; 0x4952 + 4928: 8b 32 cpi r24, 0x2B ; 43 + 492a: 61 f0 breq .+24 ; 0x4944 + 492c: 28 f4 brcc .+10 ; 0x4938 + 492e: 80 32 cpi r24, 0x20 ; 32 + 4930: 51 f0 breq .+20 ; 0x4946 + 4932: 83 32 cpi r24, 0x23 ; 35 + 4934: 71 f4 brne .+28 ; 0x4952 + 4936: 0b c0 rjmp .+22 ; 0x494e + 4938: 8d 32 cpi r24, 0x2D ; 45 + 493a: 39 f0 breq .+14 ; 0x494a + 493c: 80 33 cpi r24, 0x30 ; 48 + 493e: 49 f4 brne .+18 ; 0x4952 + 4940: 21 60 ori r18, 0x01 ; 1 + 4942: 28 c0 rjmp .+80 ; 0x4994 + 4944: 22 60 ori r18, 0x02 ; 2 + 4946: 24 60 ori r18, 0x04 ; 4 + 4948: 25 c0 rjmp .+74 ; 0x4994 + 494a: 28 60 ori r18, 0x08 ; 8 + 494c: 23 c0 rjmp .+70 ; 0x4994 + 494e: 20 61 ori r18, 0x10 ; 16 + 4950: 21 c0 rjmp .+66 ; 0x4994 + 4952: 27 fd sbrc r18, 7 + 4954: 27 c0 rjmp .+78 ; 0x49a4 + 4956: 38 2f mov r19, r24 + 4958: 30 53 subi r19, 0x30 ; 48 + 495a: 3a 30 cpi r19, 0x0A ; 10 + 495c: 78 f4 brcc .+30 ; 0x497c + 495e: 26 ff sbrs r18, 6 + 4960: 06 c0 rjmp .+12 ; 0x496e + 4962: fa e0 ldi r31, 0x0A ; 10 + 4964: 5f 9e mul r5, r31 + 4966: 30 0d add r19, r0 + 4968: 11 24 eor r1, r1 + 496a: 53 2e mov r5, r19 + 496c: 13 c0 rjmp .+38 ; 0x4994 + 496e: 8a e0 ldi r24, 0x0A ; 10 + 4970: 38 9e mul r3, r24 + 4972: 30 0d add r19, r0 + 4974: 11 24 eor r1, r1 + 4976: 33 2e mov r3, r19 + 4978: 20 62 ori r18, 0x20 ; 32 + 497a: 0c c0 rjmp .+24 ; 0x4994 + 497c: 8e 32 cpi r24, 0x2E ; 46 + 497e: 21 f4 brne .+8 ; 0x4988 + 4980: 26 fd sbrc r18, 6 + 4982: 65 c1 rjmp .+714 ; 0x4c4e + 4984: 20 64 ori r18, 0x40 ; 64 + 4986: 06 c0 rjmp .+12 ; 0x4994 + 4988: 8c 36 cpi r24, 0x6C ; 108 + 498a: 11 f4 brne .+4 ; 0x4990 + 498c: 20 68 ori r18, 0x80 ; 128 + 498e: 02 c0 rjmp .+4 ; 0x4994 + 4990: 88 36 cpi r24, 0x68 ; 104 + 4992: 41 f4 brne .+16 ; 0x49a4 + 4994: f6 01 movw r30, r12 + 4996: 93 fd sbrc r25, 3 + 4998: 85 91 lpm r24, Z+ + 499a: 93 ff sbrs r25, 3 + 499c: 81 91 ld r24, Z+ + 499e: 6f 01 movw r12, r30 + 49a0: 81 11 cpse r24, r1 + 49a2: c0 cf rjmp .-128 ; 0x4924 + 49a4: 98 2f mov r25, r24 + 49a6: 95 54 subi r25, 0x45 ; 69 + 49a8: 93 30 cpi r25, 0x03 ; 3 + 49aa: 18 f0 brcs .+6 ; 0x49b2 + 49ac: 90 52 subi r25, 0x20 ; 32 + 49ae: 93 30 cpi r25, 0x03 ; 3 + 49b0: 28 f4 brcc .+10 ; 0x49bc + 49b2: 0c 5f subi r16, 0xFC ; 252 + 49b4: 1f 4f sbci r17, 0xFF ; 255 + 49b6: ff e3 ldi r31, 0x3F ; 63 + 49b8: f9 83 std Y+1, r31 ; 0x01 + 49ba: 0d c0 rjmp .+26 ; 0x49d6 + 49bc: 83 36 cpi r24, 0x63 ; 99 + 49be: 31 f0 breq .+12 ; 0x49cc + 49c0: 83 37 cpi r24, 0x73 ; 115 + 49c2: 71 f0 breq .+28 ; 0x49e0 + 49c4: 83 35 cpi r24, 0x53 ; 83 + 49c6: 09 f0 breq .+2 ; 0x49ca + 49c8: 5a c0 rjmp .+180 ; 0x4a7e + 49ca: 22 c0 rjmp .+68 ; 0x4a10 + 49cc: f8 01 movw r30, r16 + 49ce: 80 81 ld r24, Z + 49d0: 89 83 std Y+1, r24 ; 0x01 + 49d2: 0e 5f subi r16, 0xFE ; 254 + 49d4: 1f 4f sbci r17, 0xFF ; 255 + 49d6: 44 24 eor r4, r4 + 49d8: 43 94 inc r4 + 49da: 51 2c mov r5, r1 + 49dc: 54 01 movw r10, r8 + 49de: 14 c0 rjmp .+40 ; 0x4a08 + 49e0: 38 01 movw r6, r16 + 49e2: f2 e0 ldi r31, 0x02 ; 2 + 49e4: 6f 0e add r6, r31 + 49e6: 71 1c adc r7, r1 + 49e8: f8 01 movw r30, r16 + 49ea: a0 80 ld r10, Z + 49ec: b1 80 ldd r11, Z+1 ; 0x01 + 49ee: 26 ff sbrs r18, 6 + 49f0: 03 c0 rjmp .+6 ; 0x49f8 + 49f2: 65 2d mov r22, r5 + 49f4: 70 e0 ldi r23, 0x00 ; 0 + 49f6: 02 c0 rjmp .+4 ; 0x49fc + 49f8: 6f ef ldi r22, 0xFF ; 255 + 49fa: 7f ef ldi r23, 0xFF ; 255 + 49fc: c5 01 movw r24, r10 + 49fe: 2c 87 std Y+12, r18 ; 0x0c + 4a00: 72 d1 rcall .+740 ; 0x4ce6 + 4a02: 2c 01 movw r4, r24 + 4a04: 83 01 movw r16, r6 + 4a06: 2c 85 ldd r18, Y+12 ; 0x0c + 4a08: 6f e7 ldi r22, 0x7F ; 127 + 4a0a: 26 2e mov r2, r22 + 4a0c: 22 22 and r2, r18 + 4a0e: 17 c0 rjmp .+46 ; 0x4a3e + 4a10: 38 01 movw r6, r16 + 4a12: f2 e0 ldi r31, 0x02 ; 2 + 4a14: 6f 0e add r6, r31 + 4a16: 71 1c adc r7, r1 + 4a18: f8 01 movw r30, r16 + 4a1a: a0 80 ld r10, Z + 4a1c: b1 80 ldd r11, Z+1 ; 0x01 + 4a1e: 26 ff sbrs r18, 6 + 4a20: 03 c0 rjmp .+6 ; 0x4a28 + 4a22: 65 2d mov r22, r5 + 4a24: 70 e0 ldi r23, 0x00 ; 0 + 4a26: 02 c0 rjmp .+4 ; 0x4a2c + 4a28: 6f ef ldi r22, 0xFF ; 255 + 4a2a: 7f ef ldi r23, 0xFF ; 255 + 4a2c: c5 01 movw r24, r10 + 4a2e: 2c 87 std Y+12, r18 ; 0x0c + 4a30: 4f d1 rcall .+670 ; 0x4cd0 + 4a32: 2c 01 movw r4, r24 + 4a34: 2c 85 ldd r18, Y+12 ; 0x0c + 4a36: 50 e8 ldi r21, 0x80 ; 128 + 4a38: 25 2e mov r2, r21 + 4a3a: 22 2a or r2, r18 + 4a3c: 83 01 movw r16, r6 + 4a3e: 23 fc sbrc r2, 3 + 4a40: 1a c0 rjmp .+52 ; 0x4a76 + 4a42: 05 c0 rjmp .+10 ; 0x4a4e + 4a44: b7 01 movw r22, r14 + 4a46: 80 e2 ldi r24, 0x20 ; 32 + 4a48: 90 e0 ldi r25, 0x00 ; 0 + 4a4a: 58 d1 rcall .+688 ; 0x4cfc + 4a4c: 3a 94 dec r3 + 4a4e: 83 2d mov r24, r3 + 4a50: 90 e0 ldi r25, 0x00 ; 0 + 4a52: 48 16 cp r4, r24 + 4a54: 59 06 cpc r5, r25 + 4a56: b0 f3 brcs .-20 ; 0x4a44 + 4a58: 0e c0 rjmp .+28 ; 0x4a76 + 4a5a: f5 01 movw r30, r10 + 4a5c: 27 fc sbrc r2, 7 + 4a5e: 85 91 lpm r24, Z+ + 4a60: 27 fe sbrs r2, 7 + 4a62: 81 91 ld r24, Z+ + 4a64: 5f 01 movw r10, r30 + 4a66: b7 01 movw r22, r14 + 4a68: 90 e0 ldi r25, 0x00 ; 0 + 4a6a: 48 d1 rcall .+656 ; 0x4cfc + 4a6c: 31 10 cpse r3, r1 + 4a6e: 3a 94 dec r3 + 4a70: f1 e0 ldi r31, 0x01 ; 1 + 4a72: 4f 1a sub r4, r31 + 4a74: 51 08 sbc r5, r1 + 4a76: 41 14 cp r4, r1 + 4a78: 51 04 cpc r5, r1 + 4a7a: 79 f7 brne .-34 ; 0x4a5a + 4a7c: e5 c0 rjmp .+458 ; 0x4c48 + 4a7e: 84 36 cpi r24, 0x64 ; 100 + 4a80: 11 f0 breq .+4 ; 0x4a86 + 4a82: 89 36 cpi r24, 0x69 ; 105 + 4a84: 39 f5 brne .+78 ; 0x4ad4 + 4a86: f8 01 movw r30, r16 + 4a88: 27 ff sbrs r18, 7 + 4a8a: 07 c0 rjmp .+14 ; 0x4a9a + 4a8c: 60 81 ld r22, Z + 4a8e: 71 81 ldd r23, Z+1 ; 0x01 + 4a90: 82 81 ldd r24, Z+2 ; 0x02 + 4a92: 93 81 ldd r25, Z+3 ; 0x03 + 4a94: 0c 5f subi r16, 0xFC ; 252 + 4a96: 1f 4f sbci r17, 0xFF ; 255 + 4a98: 08 c0 rjmp .+16 ; 0x4aaa + 4a9a: 60 81 ld r22, Z + 4a9c: 71 81 ldd r23, Z+1 ; 0x01 + 4a9e: 88 27 eor r24, r24 + 4aa0: 77 fd sbrc r23, 7 + 4aa2: 80 95 com r24 + 4aa4: 98 2f mov r25, r24 + 4aa6: 0e 5f subi r16, 0xFE ; 254 + 4aa8: 1f 4f sbci r17, 0xFF ; 255 + 4aaa: 4f e6 ldi r20, 0x6F ; 111 + 4aac: b4 2e mov r11, r20 + 4aae: b2 22 and r11, r18 + 4ab0: 97 ff sbrs r25, 7 + 4ab2: 09 c0 rjmp .+18 ; 0x4ac6 + 4ab4: 90 95 com r25 + 4ab6: 80 95 com r24 + 4ab8: 70 95 com r23 + 4aba: 61 95 neg r22 + 4abc: 7f 4f sbci r23, 0xFF ; 255 + 4abe: 8f 4f sbci r24, 0xFF ; 255 + 4ac0: 9f 4f sbci r25, 0xFF ; 255 + 4ac2: f0 e8 ldi r31, 0x80 ; 128 + 4ac4: bf 2a or r11, r31 + 4ac6: 2a e0 ldi r18, 0x0A ; 10 + 4ac8: 30 e0 ldi r19, 0x00 ; 0 + 4aca: a4 01 movw r20, r8 + 4acc: 43 d1 rcall .+646 ; 0x4d54 <__ultoa_invert> + 4ace: a8 2e mov r10, r24 + 4ad0: a8 18 sub r10, r8 + 4ad2: 42 c0 rjmp .+132 ; 0x4b58 + 4ad4: 85 37 cpi r24, 0x75 ; 117 + 4ad6: 31 f4 brne .+12 ; 0x4ae4 + 4ad8: 3f ee ldi r19, 0xEF ; 239 + 4ada: b3 2e mov r11, r19 + 4adc: b2 22 and r11, r18 + 4ade: 2a e0 ldi r18, 0x0A ; 10 + 4ae0: 30 e0 ldi r19, 0x00 ; 0 + 4ae2: 24 c0 rjmp .+72 ; 0x4b2c + 4ae4: 99 ef ldi r25, 0xF9 ; 249 + 4ae6: b9 2e mov r11, r25 + 4ae8: b2 22 and r11, r18 + 4aea: 8f 36 cpi r24, 0x6F ; 111 + 4aec: b9 f0 breq .+46 ; 0x4b1c + 4aee: 20 f4 brcc .+8 ; 0x4af8 + 4af0: 88 35 cpi r24, 0x58 ; 88 + 4af2: 09 f0 breq .+2 ; 0x4af6 + 4af4: ac c0 rjmp .+344 ; 0x4c4e + 4af6: 0d c0 rjmp .+26 ; 0x4b12 + 4af8: 80 37 cpi r24, 0x70 ; 112 + 4afa: 21 f0 breq .+8 ; 0x4b04 + 4afc: 88 37 cpi r24, 0x78 ; 120 + 4afe: 09 f0 breq .+2 ; 0x4b02 + 4b00: a6 c0 rjmp .+332 ; 0x4c4e + 4b02: 02 c0 rjmp .+4 ; 0x4b08 + 4b04: 20 e1 ldi r18, 0x10 ; 16 + 4b06: b2 2a or r11, r18 + 4b08: b4 fe sbrs r11, 4 + 4b0a: 0b c0 rjmp .+22 ; 0x4b22 + 4b0c: 84 e0 ldi r24, 0x04 ; 4 + 4b0e: b8 2a or r11, r24 + 4b10: 08 c0 rjmp .+16 ; 0x4b22 + 4b12: 24 ff sbrs r18, 4 + 4b14: 09 c0 rjmp .+18 ; 0x4b28 + 4b16: e6 e0 ldi r30, 0x06 ; 6 + 4b18: be 2a or r11, r30 + 4b1a: 06 c0 rjmp .+12 ; 0x4b28 + 4b1c: 28 e0 ldi r18, 0x08 ; 8 + 4b1e: 30 e0 ldi r19, 0x00 ; 0 + 4b20: 05 c0 rjmp .+10 ; 0x4b2c + 4b22: 20 e1 ldi r18, 0x10 ; 16 + 4b24: 30 e0 ldi r19, 0x00 ; 0 + 4b26: 02 c0 rjmp .+4 ; 0x4b2c + 4b28: 20 e1 ldi r18, 0x10 ; 16 + 4b2a: 32 e0 ldi r19, 0x02 ; 2 + 4b2c: f8 01 movw r30, r16 + 4b2e: b7 fe sbrs r11, 7 + 4b30: 07 c0 rjmp .+14 ; 0x4b40 + 4b32: 60 81 ld r22, Z + 4b34: 71 81 ldd r23, Z+1 ; 0x01 + 4b36: 82 81 ldd r24, Z+2 ; 0x02 + 4b38: 93 81 ldd r25, Z+3 ; 0x03 + 4b3a: 0c 5f subi r16, 0xFC ; 252 + 4b3c: 1f 4f sbci r17, 0xFF ; 255 + 4b3e: 06 c0 rjmp .+12 ; 0x4b4c + 4b40: 60 81 ld r22, Z + 4b42: 71 81 ldd r23, Z+1 ; 0x01 + 4b44: 80 e0 ldi r24, 0x00 ; 0 + 4b46: 90 e0 ldi r25, 0x00 ; 0 + 4b48: 0e 5f subi r16, 0xFE ; 254 + 4b4a: 1f 4f sbci r17, 0xFF ; 255 + 4b4c: a4 01 movw r20, r8 + 4b4e: 02 d1 rcall .+516 ; 0x4d54 <__ultoa_invert> + 4b50: a8 2e mov r10, r24 + 4b52: a8 18 sub r10, r8 + 4b54: ff e7 ldi r31, 0x7F ; 127 + 4b56: bf 22 and r11, r31 + 4b58: b6 fe sbrs r11, 6 + 4b5a: 0b c0 rjmp .+22 ; 0x4b72 + 4b5c: 2b 2d mov r18, r11 + 4b5e: 2e 7f andi r18, 0xFE ; 254 + 4b60: a5 14 cp r10, r5 + 4b62: 50 f4 brcc .+20 ; 0x4b78 + 4b64: b4 fe sbrs r11, 4 + 4b66: 0a c0 rjmp .+20 ; 0x4b7c + 4b68: b2 fc sbrc r11, 2 + 4b6a: 08 c0 rjmp .+16 ; 0x4b7c + 4b6c: 2b 2d mov r18, r11 + 4b6e: 2e 7e andi r18, 0xEE ; 238 + 4b70: 05 c0 rjmp .+10 ; 0x4b7c + 4b72: 7a 2c mov r7, r10 + 4b74: 2b 2d mov r18, r11 + 4b76: 03 c0 rjmp .+6 ; 0x4b7e + 4b78: 7a 2c mov r7, r10 + 4b7a: 01 c0 rjmp .+2 ; 0x4b7e + 4b7c: 75 2c mov r7, r5 + 4b7e: 24 ff sbrs r18, 4 + 4b80: 0d c0 rjmp .+26 ; 0x4b9c + 4b82: fe 01 movw r30, r28 + 4b84: ea 0d add r30, r10 + 4b86: f1 1d adc r31, r1 + 4b88: 80 81 ld r24, Z + 4b8a: 80 33 cpi r24, 0x30 ; 48 + 4b8c: 11 f4 brne .+4 ; 0x4b92 + 4b8e: 29 7e andi r18, 0xE9 ; 233 + 4b90: 09 c0 rjmp .+18 ; 0x4ba4 + 4b92: 22 ff sbrs r18, 2 + 4b94: 06 c0 rjmp .+12 ; 0x4ba2 + 4b96: 73 94 inc r7 + 4b98: 73 94 inc r7 + 4b9a: 04 c0 rjmp .+8 ; 0x4ba4 + 4b9c: 82 2f mov r24, r18 + 4b9e: 86 78 andi r24, 0x86 ; 134 + 4ba0: 09 f0 breq .+2 ; 0x4ba4 + 4ba2: 73 94 inc r7 + 4ba4: 23 fd sbrc r18, 3 + 4ba6: 13 c0 rjmp .+38 ; 0x4bce + 4ba8: 20 ff sbrs r18, 0 + 4baa: 0e c0 rjmp .+28 ; 0x4bc8 + 4bac: 5a 2c mov r5, r10 + 4bae: 73 14 cp r7, r3 + 4bb0: 58 f4 brcc .+22 ; 0x4bc8 + 4bb2: 53 0c add r5, r3 + 4bb4: 57 18 sub r5, r7 + 4bb6: 73 2c mov r7, r3 + 4bb8: 07 c0 rjmp .+14 ; 0x4bc8 + 4bba: b7 01 movw r22, r14 + 4bbc: 80 e2 ldi r24, 0x20 ; 32 + 4bbe: 90 e0 ldi r25, 0x00 ; 0 + 4bc0: 2c 87 std Y+12, r18 ; 0x0c + 4bc2: 9c d0 rcall .+312 ; 0x4cfc + 4bc4: 73 94 inc r7 + 4bc6: 2c 85 ldd r18, Y+12 ; 0x0c + 4bc8: 73 14 cp r7, r3 + 4bca: b8 f3 brcs .-18 ; 0x4bba + 4bcc: 04 c0 rjmp .+8 ; 0x4bd6 + 4bce: 73 14 cp r7, r3 + 4bd0: 10 f4 brcc .+4 ; 0x4bd6 + 4bd2: 37 18 sub r3, r7 + 4bd4: 01 c0 rjmp .+2 ; 0x4bd8 + 4bd6: 31 2c mov r3, r1 + 4bd8: 24 ff sbrs r18, 4 + 4bda: 11 c0 rjmp .+34 ; 0x4bfe + 4bdc: b7 01 movw r22, r14 + 4bde: 80 e3 ldi r24, 0x30 ; 48 + 4be0: 90 e0 ldi r25, 0x00 ; 0 + 4be2: 2c 87 std Y+12, r18 ; 0x0c + 4be4: 8b d0 rcall .+278 ; 0x4cfc + 4be6: 2c 85 ldd r18, Y+12 ; 0x0c + 4be8: 22 ff sbrs r18, 2 + 4bea: 1c c0 rjmp .+56 ; 0x4c24 + 4bec: 21 ff sbrs r18, 1 + 4bee: 03 c0 rjmp .+6 ; 0x4bf6 + 4bf0: 88 e5 ldi r24, 0x58 ; 88 + 4bf2: 90 e0 ldi r25, 0x00 ; 0 + 4bf4: 02 c0 rjmp .+4 ; 0x4bfa + 4bf6: 88 e7 ldi r24, 0x78 ; 120 + 4bf8: 90 e0 ldi r25, 0x00 ; 0 + 4bfa: b7 01 movw r22, r14 + 4bfc: 0c c0 rjmp .+24 ; 0x4c16 + 4bfe: 82 2f mov r24, r18 + 4c00: 86 78 andi r24, 0x86 ; 134 + 4c02: 81 f0 breq .+32 ; 0x4c24 + 4c04: 21 fd sbrc r18, 1 + 4c06: 02 c0 rjmp .+4 ; 0x4c0c + 4c08: 80 e2 ldi r24, 0x20 ; 32 + 4c0a: 01 c0 rjmp .+2 ; 0x4c0e + 4c0c: 8b e2 ldi r24, 0x2B ; 43 + 4c0e: 27 fd sbrc r18, 7 + 4c10: 8d e2 ldi r24, 0x2D ; 45 + 4c12: b7 01 movw r22, r14 + 4c14: 90 e0 ldi r25, 0x00 ; 0 + 4c16: 72 d0 rcall .+228 ; 0x4cfc + 4c18: 05 c0 rjmp .+10 ; 0x4c24 + 4c1a: b7 01 movw r22, r14 + 4c1c: 80 e3 ldi r24, 0x30 ; 48 + 4c1e: 90 e0 ldi r25, 0x00 ; 0 + 4c20: 6d d0 rcall .+218 ; 0x4cfc + 4c22: 5a 94 dec r5 + 4c24: a5 14 cp r10, r5 + 4c26: c8 f3 brcs .-14 ; 0x4c1a + 4c28: aa 94 dec r10 + 4c2a: f4 01 movw r30, r8 + 4c2c: ea 0d add r30, r10 + 4c2e: f1 1d adc r31, r1 + 4c30: b7 01 movw r22, r14 + 4c32: 80 81 ld r24, Z + 4c34: 90 e0 ldi r25, 0x00 ; 0 + 4c36: 62 d0 rcall .+196 ; 0x4cfc + 4c38: a1 10 cpse r10, r1 + 4c3a: f6 cf rjmp .-20 ; 0x4c28 + 4c3c: 05 c0 rjmp .+10 ; 0x4c48 + 4c3e: b7 01 movw r22, r14 + 4c40: 80 e2 ldi r24, 0x20 ; 32 + 4c42: 90 e0 ldi r25, 0x00 ; 0 + 4c44: 5b d0 rcall .+182 ; 0x4cfc + 4c46: 3a 94 dec r3 + 4c48: 31 10 cpse r3, r1 + 4c4a: f9 cf rjmp .-14 ; 0x4c3e + 4c4c: 50 ce rjmp .-864 ; 0x48ee + 4c4e: f7 01 movw r30, r14 + 4c50: 26 81 ldd r18, Z+6 ; 0x06 + 4c52: 37 81 ldd r19, Z+7 ; 0x07 + 4c54: 02 c0 rjmp .+4 ; 0x4c5a + 4c56: 2f ef ldi r18, 0xFF ; 255 + 4c58: 3f ef ldi r19, 0xFF ; 255 + 4c5a: c9 01 movw r24, r18 + 4c5c: 2c 96 adiw r28, 0x0c ; 12 + 4c5e: e2 e1 ldi r30, 0x12 ; 18 + 4c60: 0b c1 rjmp .+534 ; 0x4e78 <__epilogue_restores__> -00004be4 : - 4be4: fb 01 movw r30, r22 - 4be6: dc 01 movw r26, r24 - 4be8: 02 c0 rjmp .+4 ; 0x4bee - 4bea: 05 90 lpm r0, Z+ - 4bec: 0d 92 st X+, r0 - 4bee: 41 50 subi r20, 0x01 ; 1 - 4bf0: 50 40 sbci r21, 0x00 ; 0 - 4bf2: d8 f7 brcc .-10 ; 0x4bea - 4bf4: 08 95 ret +00004c62 <__eerd_block_x32a4u>: + 4c62: e0 ec ldi r30, 0xC0 ; 192 + 4c64: f1 e0 ldi r31, 0x01 ; 1 + 4c66: a7 85 ldd r26, Z+15 ; 0x0f + 4c68: a7 fd sbrc r26, 7 + 4c6a: fd cf rjmp .-6 ; 0x4c66 <__eerd_block_x32a4u+0x4> + 4c6c: a4 85 ldd r26, Z+12 ; 0x0c + 4c6e: a8 60 ori r26, 0x08 ; 8 + 4c70: a4 87 std Z+12, r26 ; 0x0c + 4c72: 60 50 subi r22, 0x00 ; 0 + 4c74: 70 4f sbci r23, 0xF0 ; 240 + 4c76: f2 cd rjmp .-1052 ; 0x485c -00004bf6 : - 4bf6: fb 01 movw r30, r22 - 4bf8: dc 01 movw r26, r24 - 4bfa: 8d 91 ld r24, X+ - 4bfc: 05 90 lpm r0, Z+ - 4bfe: 80 19 sub r24, r0 - 4c00: 01 10 cpse r0, r1 - 4c02: d9 f3 breq .-10 ; 0x4bfa - 4c04: 99 0b sbc r25, r25 - 4c06: 08 95 ret +00004c78 <__eewr_block_x32a4u>: + 4c78: dc 01 movw r26, r24 + 4c7a: cb 01 movw r24, r22 + 4c7c: 02 c0 rjmp .+4 ; 0x4c82 <__eewr_block_x32a4u+0xa> + 4c7e: 2d 91 ld r18, X+ + 4c80: 05 d0 rcall .+10 ; 0x4c8c <__eewr_r18_x32a4u> + 4c82: 41 50 subi r20, 0x01 ; 1 + 4c84: 50 40 sbci r21, 0x00 ; 0 + 4c86: d8 f7 brcc .-10 ; 0x4c7e <__eewr_block_x32a4u+0x6> + 4c88: 08 95 ret -00004c08 : - 4c08: fb 01 movw r30, r22 - 4c0a: dc 01 movw r26, r24 - 4c0c: 41 50 subi r20, 0x01 ; 1 - 4c0e: 50 40 sbci r21, 0x00 ; 0 - 4c10: 48 f0 brcs .+18 ; 0x4c24 - 4c12: 05 90 lpm r0, Z+ - 4c14: 0d 92 st X+, r0 - 4c16: 00 20 and r0, r0 - 4c18: c9 f7 brne .-14 ; 0x4c0c - 4c1a: 01 c0 rjmp .+2 ; 0x4c1e - 4c1c: 1d 92 st X+, r1 - 4c1e: 41 50 subi r20, 0x01 ; 1 - 4c20: 50 40 sbci r21, 0x00 ; 0 - 4c22: e0 f7 brcc .-8 ; 0x4c1c - 4c24: 08 95 ret +00004c8a <__eewr_byte_x32a4u>: + 4c8a: 26 2f mov r18, r22 -00004c26 : - 4c26: fb 01 movw r30, r22 - 4c28: dc 01 movw r26, r24 - 4c2a: 02 c0 rjmp .+4 ; 0x4c30 - 4c2c: 01 90 ld r0, Z+ - 4c2e: 0d 92 st X+, r0 - 4c30: 41 50 subi r20, 0x01 ; 1 - 4c32: 50 40 sbci r21, 0x00 ; 0 - 4c34: d8 f7 brcc .-10 ; 0x4c2c - 4c36: 08 95 ret +00004c8c <__eewr_r18_x32a4u>: + 4c8c: e0 ec ldi r30, 0xC0 ; 192 + 4c8e: f1 e0 ldi r31, 0x01 ; 1 + 4c90: 37 85 ldd r19, Z+15 ; 0x0f + 4c92: 37 fd sbrc r19, 7 + 4c94: fd cf rjmp .-6 ; 0x4c90 <__eewr_r18_x32a4u+0x4> + 4c96: 34 85 ldd r19, Z+12 ; 0x0c + 4c98: 37 7f andi r19, 0xF7 ; 247 + 4c9a: 34 87 std Z+12, r19 ; 0x0c + 4c9c: 37 85 ldd r19, Z+15 ; 0x0f + 4c9e: 31 ff sbrs r19, 1 + 4ca0: 09 c0 rjmp .+18 ; 0x4cb4 <__eewr_r18_x32a4u+0x28> + 4ca2: 36 e3 ldi r19, 0x36 ; 54 + 4ca4: 32 87 std Z+10, r19 ; 0x0a + 4ca6: 38 ed ldi r19, 0xD8 ; 216 + 4ca8: 34 bf out 0x34, r19 ; 52 + 4caa: 31 e0 ldi r19, 0x01 ; 1 + 4cac: 33 87 std Z+11, r19 ; 0x0b + 4cae: 37 85 ldd r19, Z+15 ; 0x0f + 4cb0: 37 fd sbrc r19, 7 + 4cb2: fd cf rjmp .-6 ; 0x4cae <__eewr_r18_x32a4u+0x22> + 4cb4: 33 e3 ldi r19, 0x33 ; 51 + 4cb6: 32 87 std Z+10, r19 ; 0x0a + 4cb8: 80 83 st Z, r24 + 4cba: 91 83 std Z+1, r25 ; 0x01 + 4cbc: 12 82 std Z+2, r1 ; 0x02 + 4cbe: 24 83 std Z+4, r18 ; 0x04 + 4cc0: 25 e3 ldi r18, 0x35 ; 53 + 4cc2: 22 87 std Z+10, r18 ; 0x0a + 4cc4: 28 ed ldi r18, 0xD8 ; 216 + 4cc6: 31 e0 ldi r19, 0x01 ; 1 + 4cc8: 24 bf out 0x34, r18 ; 52 + 4cca: 33 87 std Z+11, r19 ; 0x0b + 4ccc: 01 96 adiw r24, 0x01 ; 1 + 4cce: 08 95 ret -00004c38 : - 4c38: ae e0 ldi r26, 0x0E ; 14 - 4c3a: b0 e0 ldi r27, 0x00 ; 0 - 4c3c: e1 e2 ldi r30, 0x21 ; 33 - 4c3e: f6 e2 ldi r31, 0x26 ; 38 - 4c40: f7 c2 rjmp .+1518 ; 0x5230 <__prologue_saves__+0x1c> - 4c42: 0d 89 ldd r16, Y+21 ; 0x15 - 4c44: 1e 89 ldd r17, Y+22 ; 0x16 - 4c46: 8f 89 ldd r24, Y+23 ; 0x17 - 4c48: 98 8d ldd r25, Y+24 ; 0x18 - 4c4a: 2e e0 ldi r18, 0x0E ; 14 - 4c4c: 2c 83 std Y+4, r18 ; 0x04 - 4c4e: 09 83 std Y+1, r16 ; 0x01 - 4c50: 1a 83 std Y+2, r17 ; 0x02 - 4c52: 97 ff sbrs r25, 7 - 4c54: 02 c0 rjmp .+4 ; 0x4c5a - 4c56: 80 e0 ldi r24, 0x00 ; 0 - 4c58: 90 e8 ldi r25, 0x80 ; 128 - 4c5a: 01 97 sbiw r24, 0x01 ; 1 - 4c5c: 8d 83 std Y+5, r24 ; 0x05 - 4c5e: 9e 83 std Y+6, r25 ; 0x06 - 4c60: ae 01 movw r20, r28 - 4c62: 45 5e subi r20, 0xE5 ; 229 - 4c64: 5f 4f sbci r21, 0xFF ; 255 - 4c66: ce 01 movw r24, r28 - 4c68: 01 96 adiw r24, 0x01 ; 1 - 4c6a: 69 8d ldd r22, Y+25 ; 0x19 - 4c6c: 7a 8d ldd r23, Y+26 ; 0x1a - 4c6e: 11 d0 rcall .+34 ; 0x4c92 - 4c70: 4d 81 ldd r20, Y+5 ; 0x05 - 4c72: 5e 81 ldd r21, Y+6 ; 0x06 - 4c74: 57 fd sbrc r21, 7 - 4c76: 0a c0 rjmp .+20 ; 0x4c8c - 4c78: 2f 81 ldd r18, Y+7 ; 0x07 - 4c7a: 38 85 ldd r19, Y+8 ; 0x08 - 4c7c: 42 17 cp r20, r18 - 4c7e: 53 07 cpc r21, r19 - 4c80: 0c f4 brge .+2 ; 0x4c84 - 4c82: 9a 01 movw r18, r20 - 4c84: 02 0f add r16, r18 - 4c86: 13 1f adc r17, r19 - 4c88: f8 01 movw r30, r16 - 4c8a: 10 82 st Z, r1 - 4c8c: 2e 96 adiw r28, 0x0e ; 14 - 4c8e: e4 e0 ldi r30, 0x04 ; 4 - 4c90: e8 c2 rjmp .+1488 ; 0x5262 <__epilogue_restores__+0x1c> +00004cd0 : + 4cd0: fc 01 movw r30, r24 + 4cd2: 05 90 lpm r0, Z+ + 4cd4: 61 50 subi r22, 0x01 ; 1 + 4cd6: 70 40 sbci r23, 0x00 ; 0 + 4cd8: 01 10 cpse r0, r1 + 4cda: d8 f7 brcc .-10 ; 0x4cd2 + 4cdc: 80 95 com r24 + 4cde: 90 95 com r25 + 4ce0: 8e 0f add r24, r30 + 4ce2: 9f 1f adc r25, r31 + 4ce4: 08 95 ret -00004c92 : - 4c92: ad e0 ldi r26, 0x0D ; 13 - 4c94: b0 e0 ldi r27, 0x00 ; 0 - 4c96: ee e4 ldi r30, 0x4E ; 78 - 4c98: f6 e2 ldi r31, 0x26 ; 38 - 4c9a: bc c2 rjmp .+1400 ; 0x5214 <__prologue_saves__> - 4c9c: 3c 01 movw r6, r24 - 4c9e: 6c 87 std Y+12, r22 ; 0x0c - 4ca0: 7d 87 std Y+13, r23 ; 0x0d - 4ca2: 5a 01 movw r10, r20 - 4ca4: fc 01 movw r30, r24 - 4ca6: 16 82 std Z+6, r1 ; 0x06 - 4ca8: 17 82 std Z+7, r1 ; 0x07 - 4caa: 83 81 ldd r24, Z+3 ; 0x03 - 4cac: 81 ff sbrs r24, 1 - 4cae: bb c1 rjmp .+886 ; 0x5026 - 4cb0: 2e 01 movw r4, r28 - 4cb2: 08 94 sec - 4cb4: 41 1c adc r4, r1 - 4cb6: 51 1c adc r5, r1 - 4cb8: f3 01 movw r30, r6 - 4cba: 93 81 ldd r25, Z+3 ; 0x03 - 4cbc: ec 85 ldd r30, Y+12 ; 0x0c - 4cbe: fd 85 ldd r31, Y+13 ; 0x0d - 4cc0: 93 fd sbrc r25, 3 - 4cc2: 85 91 lpm r24, Z+ - 4cc4: 93 ff sbrs r25, 3 - 4cc6: 81 91 ld r24, Z+ - 4cc8: ec 87 std Y+12, r30 ; 0x0c - 4cca: fd 87 std Y+13, r31 ; 0x0d - 4ccc: 88 23 and r24, r24 - 4cce: 09 f4 brne .+2 ; 0x4cd2 - 4cd0: a6 c1 rjmp .+844 ; 0x501e - 4cd2: 85 32 cpi r24, 0x25 ; 37 - 4cd4: 41 f4 brne .+16 ; 0x4ce6 - 4cd6: 93 fd sbrc r25, 3 - 4cd8: 85 91 lpm r24, Z+ - 4cda: 93 ff sbrs r25, 3 - 4cdc: 81 91 ld r24, Z+ - 4cde: ec 87 std Y+12, r30 ; 0x0c - 4ce0: fd 87 std Y+13, r31 ; 0x0d - 4ce2: 85 32 cpi r24, 0x25 ; 37 - 4ce4: 21 f4 brne .+8 ; 0x4cee - 4ce6: 90 e0 ldi r25, 0x00 ; 0 - 4ce8: b3 01 movw r22, r6 - 4cea: ef d1 rcall .+990 ; 0x50ca - 4cec: e5 cf rjmp .-54 ; 0x4cb8 - 4cee: ff 24 eor r15, r15 - 4cf0: ee 24 eor r14, r14 - 4cf2: 10 e0 ldi r17, 0x00 ; 0 - 4cf4: 10 32 cpi r17, 0x20 ; 32 - 4cf6: b0 f4 brcc .+44 ; 0x4d24 - 4cf8: 8b 32 cpi r24, 0x2B ; 43 - 4cfa: 69 f0 breq .+26 ; 0x4d16 - 4cfc: 8c 32 cpi r24, 0x2C ; 44 - 4cfe: 28 f4 brcc .+10 ; 0x4d0a - 4d00: 80 32 cpi r24, 0x20 ; 32 - 4d02: 51 f0 breq .+20 ; 0x4d18 - 4d04: 83 32 cpi r24, 0x23 ; 35 - 4d06: 71 f4 brne .+28 ; 0x4d24 - 4d08: 0b c0 rjmp .+22 ; 0x4d20 - 4d0a: 8d 32 cpi r24, 0x2D ; 45 - 4d0c: 39 f0 breq .+14 ; 0x4d1c - 4d0e: 80 33 cpi r24, 0x30 ; 48 - 4d10: 49 f4 brne .+18 ; 0x4d24 - 4d12: 11 60 ori r17, 0x01 ; 1 - 4d14: 2c c0 rjmp .+88 ; 0x4d6e - 4d16: 12 60 ori r17, 0x02 ; 2 - 4d18: 14 60 ori r17, 0x04 ; 4 - 4d1a: 29 c0 rjmp .+82 ; 0x4d6e - 4d1c: 18 60 ori r17, 0x08 ; 8 - 4d1e: 27 c0 rjmp .+78 ; 0x4d6e - 4d20: 10 61 ori r17, 0x10 ; 16 - 4d22: 25 c0 rjmp .+74 ; 0x4d6e - 4d24: 17 fd sbrc r17, 7 - 4d26: 2e c0 rjmp .+92 ; 0x4d84 - 4d28: 28 2f mov r18, r24 - 4d2a: 20 53 subi r18, 0x30 ; 48 - 4d2c: 2a 30 cpi r18, 0x0A ; 10 - 4d2e: 98 f4 brcc .+38 ; 0x4d56 - 4d30: 16 ff sbrs r17, 6 - 4d32: 08 c0 rjmp .+16 ; 0x4d44 - 4d34: 8f 2d mov r24, r15 - 4d36: 88 0f add r24, r24 - 4d38: f8 2e mov r15, r24 - 4d3a: ff 0c add r15, r15 - 4d3c: ff 0c add r15, r15 - 4d3e: f8 0e add r15, r24 - 4d40: f2 0e add r15, r18 - 4d42: 15 c0 rjmp .+42 ; 0x4d6e - 4d44: 8e 2d mov r24, r14 - 4d46: 88 0f add r24, r24 - 4d48: e8 2e mov r14, r24 - 4d4a: ee 0c add r14, r14 - 4d4c: ee 0c add r14, r14 - 4d4e: e8 0e add r14, r24 - 4d50: e2 0e add r14, r18 - 4d52: 10 62 ori r17, 0x20 ; 32 - 4d54: 0c c0 rjmp .+24 ; 0x4d6e - 4d56: 8e 32 cpi r24, 0x2E ; 46 - 4d58: 21 f4 brne .+8 ; 0x4d62 - 4d5a: 16 fd sbrc r17, 6 - 4d5c: 60 c1 rjmp .+704 ; 0x501e - 4d5e: 10 64 ori r17, 0x40 ; 64 - 4d60: 06 c0 rjmp .+12 ; 0x4d6e - 4d62: 8c 36 cpi r24, 0x6C ; 108 - 4d64: 11 f4 brne .+4 ; 0x4d6a - 4d66: 10 68 ori r17, 0x80 ; 128 - 4d68: 02 c0 rjmp .+4 ; 0x4d6e - 4d6a: 88 36 cpi r24, 0x68 ; 104 - 4d6c: 59 f4 brne .+22 ; 0x4d84 - 4d6e: ec 85 ldd r30, Y+12 ; 0x0c - 4d70: fd 85 ldd r31, Y+13 ; 0x0d - 4d72: 93 fd sbrc r25, 3 - 4d74: 85 91 lpm r24, Z+ - 4d76: 93 ff sbrs r25, 3 - 4d78: 81 91 ld r24, Z+ - 4d7a: ec 87 std Y+12, r30 ; 0x0c - 4d7c: fd 87 std Y+13, r31 ; 0x0d - 4d7e: 88 23 and r24, r24 - 4d80: 09 f0 breq .+2 ; 0x4d84 - 4d82: b8 cf rjmp .-144 ; 0x4cf4 - 4d84: 98 2f mov r25, r24 - 4d86: 95 54 subi r25, 0x45 ; 69 - 4d88: 93 30 cpi r25, 0x03 ; 3 - 4d8a: 18 f0 brcs .+6 ; 0x4d92 - 4d8c: 90 52 subi r25, 0x20 ; 32 - 4d8e: 93 30 cpi r25, 0x03 ; 3 - 4d90: 38 f4 brcc .+14 ; 0x4da0 - 4d92: 24 e0 ldi r18, 0x04 ; 4 - 4d94: 30 e0 ldi r19, 0x00 ; 0 - 4d96: a2 0e add r10, r18 - 4d98: b3 1e adc r11, r19 - 4d9a: 3f e3 ldi r19, 0x3F ; 63 - 4d9c: 39 83 std Y+1, r19 ; 0x01 - 4d9e: 0f c0 rjmp .+30 ; 0x4dbe - 4da0: 83 36 cpi r24, 0x63 ; 99 - 4da2: 31 f0 breq .+12 ; 0x4db0 - 4da4: 83 37 cpi r24, 0x73 ; 115 - 4da6: 81 f0 breq .+32 ; 0x4dc8 - 4da8: 83 35 cpi r24, 0x53 ; 83 - 4daa: 09 f0 breq .+2 ; 0x4dae - 4dac: 56 c0 rjmp .+172 ; 0x4e5a - 4dae: 21 c0 rjmp .+66 ; 0x4df2 - 4db0: f5 01 movw r30, r10 - 4db2: 80 81 ld r24, Z - 4db4: 89 83 std Y+1, r24 ; 0x01 - 4db6: 22 e0 ldi r18, 0x02 ; 2 - 4db8: 30 e0 ldi r19, 0x00 ; 0 - 4dba: a2 0e add r10, r18 - 4dbc: b3 1e adc r11, r19 - 4dbe: 21 e0 ldi r18, 0x01 ; 1 - 4dc0: c2 2e mov r12, r18 - 4dc2: d1 2c mov r13, r1 - 4dc4: 42 01 movw r8, r4 - 4dc6: 13 c0 rjmp .+38 ; 0x4dee - 4dc8: 92 e0 ldi r25, 0x02 ; 2 - 4dca: 29 2e mov r2, r25 - 4dcc: 31 2c mov r3, r1 - 4dce: 2a 0c add r2, r10 - 4dd0: 3b 1c adc r3, r11 - 4dd2: f5 01 movw r30, r10 - 4dd4: 80 80 ld r8, Z - 4dd6: 91 80 ldd r9, Z+1 ; 0x01 - 4dd8: 16 ff sbrs r17, 6 - 4dda: 03 c0 rjmp .+6 ; 0x4de2 - 4ddc: 6f 2d mov r22, r15 - 4dde: 70 e0 ldi r23, 0x00 ; 0 - 4de0: 02 c0 rjmp .+4 ; 0x4de6 - 4de2: 6f ef ldi r22, 0xFF ; 255 - 4de4: 7f ef ldi r23, 0xFF ; 255 - 4de6: c4 01 movw r24, r8 - 4de8: 65 d1 rcall .+714 ; 0x50b4 - 4dea: 6c 01 movw r12, r24 - 4dec: 51 01 movw r10, r2 - 4dee: 1f 77 andi r17, 0x7F ; 127 - 4df0: 14 c0 rjmp .+40 ; 0x4e1a - 4df2: 82 e0 ldi r24, 0x02 ; 2 - 4df4: 28 2e mov r2, r24 - 4df6: 31 2c mov r3, r1 - 4df8: 2a 0c add r2, r10 - 4dfa: 3b 1c adc r3, r11 - 4dfc: f5 01 movw r30, r10 - 4dfe: 80 80 ld r8, Z - 4e00: 91 80 ldd r9, Z+1 ; 0x01 - 4e02: 16 ff sbrs r17, 6 - 4e04: 03 c0 rjmp .+6 ; 0x4e0c - 4e06: 6f 2d mov r22, r15 - 4e08: 70 e0 ldi r23, 0x00 ; 0 - 4e0a: 02 c0 rjmp .+4 ; 0x4e10 - 4e0c: 6f ef ldi r22, 0xFF ; 255 - 4e0e: 7f ef ldi r23, 0xFF ; 255 - 4e10: c4 01 movw r24, r8 - 4e12: 45 d1 rcall .+650 ; 0x509e - 4e14: 6c 01 movw r12, r24 - 4e16: 10 68 ori r17, 0x80 ; 128 - 4e18: 51 01 movw r10, r2 - 4e1a: 13 fd sbrc r17, 3 - 4e1c: 1a c0 rjmp .+52 ; 0x4e52 - 4e1e: 05 c0 rjmp .+10 ; 0x4e2a - 4e20: 80 e2 ldi r24, 0x20 ; 32 - 4e22: 90 e0 ldi r25, 0x00 ; 0 - 4e24: b3 01 movw r22, r6 - 4e26: 51 d1 rcall .+674 ; 0x50ca - 4e28: ea 94 dec r14 - 4e2a: 8e 2d mov r24, r14 - 4e2c: 90 e0 ldi r25, 0x00 ; 0 - 4e2e: c8 16 cp r12, r24 - 4e30: d9 06 cpc r13, r25 - 4e32: b0 f3 brcs .-20 ; 0x4e20 - 4e34: 0e c0 rjmp .+28 ; 0x4e52 - 4e36: f4 01 movw r30, r8 - 4e38: 17 fd sbrc r17, 7 - 4e3a: 85 91 lpm r24, Z+ - 4e3c: 17 ff sbrs r17, 7 - 4e3e: 81 91 ld r24, Z+ - 4e40: 4f 01 movw r8, r30 - 4e42: 90 e0 ldi r25, 0x00 ; 0 - 4e44: b3 01 movw r22, r6 - 4e46: 41 d1 rcall .+642 ; 0x50ca - 4e48: e1 10 cpse r14, r1 - 4e4a: ea 94 dec r14 - 4e4c: 08 94 sec - 4e4e: c1 08 sbc r12, r1 - 4e50: d1 08 sbc r13, r1 - 4e52: c1 14 cp r12, r1 - 4e54: d1 04 cpc r13, r1 - 4e56: 79 f7 brne .-34 ; 0x4e36 - 4e58: df c0 rjmp .+446 ; 0x5018 - 4e5a: 84 36 cpi r24, 0x64 ; 100 - 4e5c: 11 f0 breq .+4 ; 0x4e62 - 4e5e: 89 36 cpi r24, 0x69 ; 105 - 4e60: 49 f5 brne .+82 ; 0x4eb4 - 4e62: f5 01 movw r30, r10 - 4e64: 17 ff sbrs r17, 7 - 4e66: 07 c0 rjmp .+14 ; 0x4e76 - 4e68: 80 81 ld r24, Z - 4e6a: 91 81 ldd r25, Z+1 ; 0x01 - 4e6c: a2 81 ldd r26, Z+2 ; 0x02 - 4e6e: b3 81 ldd r27, Z+3 ; 0x03 - 4e70: 24 e0 ldi r18, 0x04 ; 4 - 4e72: 30 e0 ldi r19, 0x00 ; 0 - 4e74: 08 c0 rjmp .+16 ; 0x4e86 - 4e76: 80 81 ld r24, Z - 4e78: 91 81 ldd r25, Z+1 ; 0x01 - 4e7a: aa 27 eor r26, r26 - 4e7c: 97 fd sbrc r25, 7 - 4e7e: a0 95 com r26 - 4e80: ba 2f mov r27, r26 - 4e82: 22 e0 ldi r18, 0x02 ; 2 - 4e84: 30 e0 ldi r19, 0x00 ; 0 - 4e86: a2 0e add r10, r18 - 4e88: b3 1e adc r11, r19 - 4e8a: 01 2f mov r16, r17 - 4e8c: 0f 76 andi r16, 0x6F ; 111 - 4e8e: b7 ff sbrs r27, 7 - 4e90: 08 c0 rjmp .+16 ; 0x4ea2 - 4e92: b0 95 com r27 - 4e94: a0 95 com r26 - 4e96: 90 95 com r25 - 4e98: 81 95 neg r24 - 4e9a: 9f 4f sbci r25, 0xFF ; 255 - 4e9c: af 4f sbci r26, 0xFF ; 255 - 4e9e: bf 4f sbci r27, 0xFF ; 255 - 4ea0: 00 68 ori r16, 0x80 ; 128 - 4ea2: bc 01 movw r22, r24 - 4ea4: cd 01 movw r24, r26 - 4ea6: a2 01 movw r20, r4 - 4ea8: 2a e0 ldi r18, 0x0A ; 10 - 4eaa: 30 e0 ldi r19, 0x00 ; 0 - 4eac: 3a d1 rcall .+628 ; 0x5122 <__ultoa_invert> - 4eae: d8 2e mov r13, r24 - 4eb0: d4 18 sub r13, r4 - 4eb2: 3e c0 rjmp .+124 ; 0x4f30 - 4eb4: 85 37 cpi r24, 0x75 ; 117 - 4eb6: 21 f4 brne .+8 ; 0x4ec0 - 4eb8: 1f 7e andi r17, 0xEF ; 239 - 4eba: 2a e0 ldi r18, 0x0A ; 10 - 4ebc: 30 e0 ldi r19, 0x00 ; 0 - 4ebe: 20 c0 rjmp .+64 ; 0x4f00 - 4ec0: 19 7f andi r17, 0xF9 ; 249 - 4ec2: 8f 36 cpi r24, 0x6F ; 111 - 4ec4: a9 f0 breq .+42 ; 0x4ef0 - 4ec6: 80 37 cpi r24, 0x70 ; 112 - 4ec8: 20 f4 brcc .+8 ; 0x4ed2 - 4eca: 88 35 cpi r24, 0x58 ; 88 - 4ecc: 09 f0 breq .+2 ; 0x4ed0 - 4ece: a7 c0 rjmp .+334 ; 0x501e - 4ed0: 0b c0 rjmp .+22 ; 0x4ee8 - 4ed2: 80 37 cpi r24, 0x70 ; 112 - 4ed4: 21 f0 breq .+8 ; 0x4ede - 4ed6: 88 37 cpi r24, 0x78 ; 120 - 4ed8: 09 f0 breq .+2 ; 0x4edc - 4eda: a1 c0 rjmp .+322 ; 0x501e - 4edc: 01 c0 rjmp .+2 ; 0x4ee0 - 4ede: 10 61 ori r17, 0x10 ; 16 - 4ee0: 14 ff sbrs r17, 4 - 4ee2: 09 c0 rjmp .+18 ; 0x4ef6 - 4ee4: 14 60 ori r17, 0x04 ; 4 - 4ee6: 07 c0 rjmp .+14 ; 0x4ef6 - 4ee8: 14 ff sbrs r17, 4 - 4eea: 08 c0 rjmp .+16 ; 0x4efc - 4eec: 16 60 ori r17, 0x06 ; 6 - 4eee: 06 c0 rjmp .+12 ; 0x4efc - 4ef0: 28 e0 ldi r18, 0x08 ; 8 - 4ef2: 30 e0 ldi r19, 0x00 ; 0 - 4ef4: 05 c0 rjmp .+10 ; 0x4f00 - 4ef6: 20 e1 ldi r18, 0x10 ; 16 - 4ef8: 30 e0 ldi r19, 0x00 ; 0 - 4efa: 02 c0 rjmp .+4 ; 0x4f00 - 4efc: 20 e1 ldi r18, 0x10 ; 16 - 4efe: 32 e0 ldi r19, 0x02 ; 2 - 4f00: f5 01 movw r30, r10 - 4f02: 17 ff sbrs r17, 7 - 4f04: 07 c0 rjmp .+14 ; 0x4f14 - 4f06: 60 81 ld r22, Z - 4f08: 71 81 ldd r23, Z+1 ; 0x01 - 4f0a: 82 81 ldd r24, Z+2 ; 0x02 - 4f0c: 93 81 ldd r25, Z+3 ; 0x03 - 4f0e: 44 e0 ldi r20, 0x04 ; 4 - 4f10: 50 e0 ldi r21, 0x00 ; 0 - 4f12: 06 c0 rjmp .+12 ; 0x4f20 - 4f14: 60 81 ld r22, Z - 4f16: 71 81 ldd r23, Z+1 ; 0x01 - 4f18: 80 e0 ldi r24, 0x00 ; 0 - 4f1a: 90 e0 ldi r25, 0x00 ; 0 - 4f1c: 42 e0 ldi r20, 0x02 ; 2 - 4f1e: 50 e0 ldi r21, 0x00 ; 0 - 4f20: a4 0e add r10, r20 - 4f22: b5 1e adc r11, r21 - 4f24: a2 01 movw r20, r4 - 4f26: fd d0 rcall .+506 ; 0x5122 <__ultoa_invert> - 4f28: d8 2e mov r13, r24 - 4f2a: d4 18 sub r13, r4 - 4f2c: 01 2f mov r16, r17 - 4f2e: 0f 77 andi r16, 0x7F ; 127 - 4f30: 06 ff sbrs r16, 6 - 4f32: 09 c0 rjmp .+18 ; 0x4f46 - 4f34: 0e 7f andi r16, 0xFE ; 254 - 4f36: df 14 cp r13, r15 - 4f38: 30 f4 brcc .+12 ; 0x4f46 - 4f3a: 04 ff sbrs r16, 4 - 4f3c: 06 c0 rjmp .+12 ; 0x4f4a - 4f3e: 02 fd sbrc r16, 2 - 4f40: 04 c0 rjmp .+8 ; 0x4f4a - 4f42: 0f 7e andi r16, 0xEF ; 239 - 4f44: 02 c0 rjmp .+4 ; 0x4f4a - 4f46: 1d 2d mov r17, r13 - 4f48: 01 c0 rjmp .+2 ; 0x4f4c - 4f4a: 1f 2d mov r17, r15 - 4f4c: 80 2f mov r24, r16 - 4f4e: 90 e0 ldi r25, 0x00 ; 0 - 4f50: 04 ff sbrs r16, 4 - 4f52: 0c c0 rjmp .+24 ; 0x4f6c - 4f54: fe 01 movw r30, r28 - 4f56: ed 0d add r30, r13 - 4f58: f1 1d adc r31, r1 - 4f5a: 20 81 ld r18, Z - 4f5c: 20 33 cpi r18, 0x30 ; 48 - 4f5e: 11 f4 brne .+4 ; 0x4f64 - 4f60: 09 7e andi r16, 0xE9 ; 233 - 4f62: 09 c0 rjmp .+18 ; 0x4f76 - 4f64: 02 ff sbrs r16, 2 - 4f66: 06 c0 rjmp .+12 ; 0x4f74 - 4f68: 1e 5f subi r17, 0xFE ; 254 - 4f6a: 05 c0 rjmp .+10 ; 0x4f76 - 4f6c: 86 78 andi r24, 0x86 ; 134 - 4f6e: 90 70 andi r25, 0x00 ; 0 - 4f70: 00 97 sbiw r24, 0x00 ; 0 - 4f72: 09 f0 breq .+2 ; 0x4f76 - 4f74: 1f 5f subi r17, 0xFF ; 255 - 4f76: 80 2e mov r8, r16 - 4f78: 99 24 eor r9, r9 - 4f7a: 03 fd sbrc r16, 3 - 4f7c: 11 c0 rjmp .+34 ; 0x4fa0 - 4f7e: 00 ff sbrs r16, 0 - 4f80: 0c c0 rjmp .+24 ; 0x4f9a - 4f82: fd 2c mov r15, r13 - 4f84: 1e 15 cp r17, r14 - 4f86: 48 f4 brcc .+18 ; 0x4f9a - 4f88: fe 0c add r15, r14 - 4f8a: f1 1a sub r15, r17 - 4f8c: 1e 2d mov r17, r14 - 4f8e: 05 c0 rjmp .+10 ; 0x4f9a - 4f90: 80 e2 ldi r24, 0x20 ; 32 - 4f92: 90 e0 ldi r25, 0x00 ; 0 - 4f94: b3 01 movw r22, r6 - 4f96: 99 d0 rcall .+306 ; 0x50ca - 4f98: 1f 5f subi r17, 0xFF ; 255 - 4f9a: 1e 15 cp r17, r14 - 4f9c: c8 f3 brcs .-14 ; 0x4f90 - 4f9e: 04 c0 rjmp .+8 ; 0x4fa8 - 4fa0: 1e 15 cp r17, r14 - 4fa2: 10 f4 brcc .+4 ; 0x4fa8 - 4fa4: e1 1a sub r14, r17 - 4fa6: 01 c0 rjmp .+2 ; 0x4faa - 4fa8: ee 24 eor r14, r14 - 4faa: 84 fe sbrs r8, 4 - 4fac: 0e c0 rjmp .+28 ; 0x4fca - 4fae: 80 e3 ldi r24, 0x30 ; 48 - 4fb0: 90 e0 ldi r25, 0x00 ; 0 - 4fb2: b3 01 movw r22, r6 - 4fb4: 8a d0 rcall .+276 ; 0x50ca - 4fb6: 82 fe sbrs r8, 2 - 4fb8: 1d c0 rjmp .+58 ; 0x4ff4 - 4fba: 81 fe sbrs r8, 1 - 4fbc: 03 c0 rjmp .+6 ; 0x4fc4 - 4fbe: 88 e5 ldi r24, 0x58 ; 88 - 4fc0: 90 e0 ldi r25, 0x00 ; 0 - 4fc2: 10 c0 rjmp .+32 ; 0x4fe4 - 4fc4: 88 e7 ldi r24, 0x78 ; 120 - 4fc6: 90 e0 ldi r25, 0x00 ; 0 - 4fc8: 0d c0 rjmp .+26 ; 0x4fe4 - 4fca: c4 01 movw r24, r8 - 4fcc: 86 78 andi r24, 0x86 ; 134 - 4fce: 90 70 andi r25, 0x00 ; 0 - 4fd0: 00 97 sbiw r24, 0x00 ; 0 - 4fd2: 81 f0 breq .+32 ; 0x4ff4 - 4fd4: 81 fc sbrc r8, 1 - 4fd6: 02 c0 rjmp .+4 ; 0x4fdc - 4fd8: 80 e2 ldi r24, 0x20 ; 32 - 4fda: 01 c0 rjmp .+2 ; 0x4fde - 4fdc: 8b e2 ldi r24, 0x2B ; 43 - 4fde: 07 fd sbrc r16, 7 - 4fe0: 8d e2 ldi r24, 0x2D ; 45 - 4fe2: 90 e0 ldi r25, 0x00 ; 0 - 4fe4: b3 01 movw r22, r6 - 4fe6: 71 d0 rcall .+226 ; 0x50ca - 4fe8: 05 c0 rjmp .+10 ; 0x4ff4 - 4fea: 80 e3 ldi r24, 0x30 ; 48 - 4fec: 90 e0 ldi r25, 0x00 ; 0 - 4fee: b3 01 movw r22, r6 - 4ff0: 6c d0 rcall .+216 ; 0x50ca - 4ff2: fa 94 dec r15 - 4ff4: df 14 cp r13, r15 - 4ff6: c8 f3 brcs .-14 ; 0x4fea - 4ff8: da 94 dec r13 - 4ffa: f2 01 movw r30, r4 - 4ffc: ed 0d add r30, r13 - 4ffe: f1 1d adc r31, r1 - 5000: 80 81 ld r24, Z - 5002: 90 e0 ldi r25, 0x00 ; 0 - 5004: b3 01 movw r22, r6 - 5006: 61 d0 rcall .+194 ; 0x50ca - 5008: dd 20 and r13, r13 - 500a: b1 f7 brne .-20 ; 0x4ff8 - 500c: 05 c0 rjmp .+10 ; 0x5018 - 500e: 80 e2 ldi r24, 0x20 ; 32 - 5010: 90 e0 ldi r25, 0x00 ; 0 - 5012: b3 01 movw r22, r6 - 5014: 5a d0 rcall .+180 ; 0x50ca - 5016: ea 94 dec r14 - 5018: ee 20 and r14, r14 - 501a: c9 f7 brne .-14 ; 0x500e - 501c: 4d ce rjmp .-870 ; 0x4cb8 - 501e: f3 01 movw r30, r6 - 5020: 86 81 ldd r24, Z+6 ; 0x06 - 5022: 97 81 ldd r25, Z+7 ; 0x07 - 5024: 02 c0 rjmp .+4 ; 0x502a - 5026: 8f ef ldi r24, 0xFF ; 255 - 5028: 9f ef ldi r25, 0xFF ; 255 - 502a: 2d 96 adiw r28, 0x0d ; 13 - 502c: e2 e1 ldi r30, 0x12 ; 18 - 502e: 0b c1 rjmp .+534 ; 0x5246 <__epilogue_restores__> +00004ce6 : + 4ce6: fc 01 movw r30, r24 + 4ce8: 61 50 subi r22, 0x01 ; 1 + 4cea: 70 40 sbci r23, 0x00 ; 0 + 4cec: 01 90 ld r0, Z+ + 4cee: 01 10 cpse r0, r1 + 4cf0: d8 f7 brcc .-10 ; 0x4ce8 + 4cf2: 80 95 com r24 + 4cf4: 90 95 com r25 + 4cf6: 8e 0f add r24, r30 + 4cf8: 9f 1f adc r25, r31 + 4cfa: 08 95 ret -00005030 <__eerd_block_x32a4u>: - 5030: e0 ec ldi r30, 0xC0 ; 192 - 5032: f1 e0 ldi r31, 0x01 ; 1 - 5034: a7 85 ldd r26, Z+15 ; 0x0f - 5036: a7 fd sbrc r26, 7 - 5038: fd cf rjmp .-6 ; 0x5034 <__eerd_block_x32a4u+0x4> - 503a: a4 85 ldd r26, Z+12 ; 0x0c - 503c: a8 60 ori r26, 0x08 ; 8 - 503e: a4 87 std Z+12, r26 ; 0x0c - 5040: 60 50 subi r22, 0x00 ; 0 - 5042: 70 4f sbci r23, 0xF0 ; 240 - 5044: f0 cd rjmp .-1056 ; 0x4c26 +00004cfc : + 4cfc: 0f 93 push r16 + 4cfe: 1f 93 push r17 + 4d00: cf 93 push r28 + 4d02: df 93 push r29 + 4d04: 8c 01 movw r16, r24 + 4d06: eb 01 movw r28, r22 + 4d08: 8b 81 ldd r24, Y+3 ; 0x03 + 4d0a: 81 fd sbrc r24, 1 + 4d0c: 03 c0 rjmp .+6 ; 0x4d14 + 4d0e: 0f ef ldi r16, 0xFF ; 255 + 4d10: 1f ef ldi r17, 0xFF ; 255 + 4d12: 1a c0 rjmp .+52 ; 0x4d48 + 4d14: 82 ff sbrs r24, 2 + 4d16: 0d c0 rjmp .+26 ; 0x4d32 + 4d18: 2e 81 ldd r18, Y+6 ; 0x06 + 4d1a: 3f 81 ldd r19, Y+7 ; 0x07 + 4d1c: 8c 81 ldd r24, Y+4 ; 0x04 + 4d1e: 9d 81 ldd r25, Y+5 ; 0x05 + 4d20: 28 17 cp r18, r24 + 4d22: 39 07 cpc r19, r25 + 4d24: 64 f4 brge .+24 ; 0x4d3e + 4d26: e8 81 ld r30, Y + 4d28: f9 81 ldd r31, Y+1 ; 0x01 + 4d2a: 01 93 st Z+, r16 + 4d2c: e8 83 st Y, r30 + 4d2e: f9 83 std Y+1, r31 ; 0x01 + 4d30: 06 c0 rjmp .+12 ; 0x4d3e + 4d32: e8 85 ldd r30, Y+8 ; 0x08 + 4d34: f9 85 ldd r31, Y+9 ; 0x09 + 4d36: 80 2f mov r24, r16 + 4d38: 09 95 icall + 4d3a: 89 2b or r24, r25 + 4d3c: 41 f7 brne .-48 ; 0x4d0e + 4d3e: 8e 81 ldd r24, Y+6 ; 0x06 + 4d40: 9f 81 ldd r25, Y+7 ; 0x07 + 4d42: 01 96 adiw r24, 0x01 ; 1 + 4d44: 8e 83 std Y+6, r24 ; 0x06 + 4d46: 9f 83 std Y+7, r25 ; 0x07 + 4d48: c8 01 movw r24, r16 + 4d4a: df 91 pop r29 + 4d4c: cf 91 pop r28 + 4d4e: 1f 91 pop r17 + 4d50: 0f 91 pop r16 + 4d52: 08 95 ret -00005046 <__eewr_block_x32a4u>: - 5046: dc 01 movw r26, r24 - 5048: cb 01 movw r24, r22 - 504a: 02 c0 rjmp .+4 ; 0x5050 <__eewr_block_x32a4u+0xa> - 504c: 2d 91 ld r18, X+ - 504e: 05 d0 rcall .+10 ; 0x505a <__eewr_r18_x32a4u> - 5050: 41 50 subi r20, 0x01 ; 1 - 5052: 50 40 sbci r21, 0x00 ; 0 - 5054: d8 f7 brcc .-10 ; 0x504c <__eewr_block_x32a4u+0x6> - 5056: 08 95 ret +00004d54 <__ultoa_invert>: + 4d54: fa 01 movw r30, r20 + 4d56: aa 27 eor r26, r26 + 4d58: 28 30 cpi r18, 0x08 ; 8 + 4d5a: 51 f1 breq .+84 ; 0x4db0 <__ultoa_invert+0x5c> + 4d5c: 20 31 cpi r18, 0x10 ; 16 + 4d5e: 81 f1 breq .+96 ; 0x4dc0 <__ultoa_invert+0x6c> + 4d60: e8 94 clt + 4d62: 6f 93 push r22 + 4d64: 6e 7f andi r22, 0xFE ; 254 + 4d66: 6e 5f subi r22, 0xFE ; 254 + 4d68: 7f 4f sbci r23, 0xFF ; 255 + 4d6a: 8f 4f sbci r24, 0xFF ; 255 + 4d6c: 9f 4f sbci r25, 0xFF ; 255 + 4d6e: af 4f sbci r26, 0xFF ; 255 + 4d70: b1 e0 ldi r27, 0x01 ; 1 + 4d72: 3e d0 rcall .+124 ; 0x4df0 <__ultoa_invert+0x9c> + 4d74: b4 e0 ldi r27, 0x04 ; 4 + 4d76: 3c d0 rcall .+120 ; 0x4df0 <__ultoa_invert+0x9c> + 4d78: 67 0f add r22, r23 + 4d7a: 78 1f adc r23, r24 + 4d7c: 89 1f adc r24, r25 + 4d7e: 9a 1f adc r25, r26 + 4d80: a1 1d adc r26, r1 + 4d82: 68 0f add r22, r24 + 4d84: 79 1f adc r23, r25 + 4d86: 8a 1f adc r24, r26 + 4d88: 91 1d adc r25, r1 + 4d8a: a1 1d adc r26, r1 + 4d8c: 6a 0f add r22, r26 + 4d8e: 71 1d adc r23, r1 + 4d90: 81 1d adc r24, r1 + 4d92: 91 1d adc r25, r1 + 4d94: a1 1d adc r26, r1 + 4d96: 20 d0 rcall .+64 ; 0x4dd8 <__ultoa_invert+0x84> + 4d98: 09 f4 brne .+2 ; 0x4d9c <__ultoa_invert+0x48> + 4d9a: 68 94 set + 4d9c: 3f 91 pop r19 + 4d9e: 2a e0 ldi r18, 0x0A ; 10 + 4da0: 26 9f mul r18, r22 + 4da2: 11 24 eor r1, r1 + 4da4: 30 19 sub r19, r0 + 4da6: 30 5d subi r19, 0xD0 ; 208 + 4da8: 31 93 st Z+, r19 + 4daa: de f6 brtc .-74 ; 0x4d62 <__ultoa_invert+0xe> + 4dac: cf 01 movw r24, r30 + 4dae: 08 95 ret + 4db0: 46 2f mov r20, r22 + 4db2: 47 70 andi r20, 0x07 ; 7 + 4db4: 40 5d subi r20, 0xD0 ; 208 + 4db6: 41 93 st Z+, r20 + 4db8: b3 e0 ldi r27, 0x03 ; 3 + 4dba: 0f d0 rcall .+30 ; 0x4dda <__ultoa_invert+0x86> + 4dbc: c9 f7 brne .-14 ; 0x4db0 <__ultoa_invert+0x5c> + 4dbe: f6 cf rjmp .-20 ; 0x4dac <__ultoa_invert+0x58> + 4dc0: 46 2f mov r20, r22 + 4dc2: 4f 70 andi r20, 0x0F ; 15 + 4dc4: 40 5d subi r20, 0xD0 ; 208 + 4dc6: 4a 33 cpi r20, 0x3A ; 58 + 4dc8: 18 f0 brcs .+6 ; 0x4dd0 <__ultoa_invert+0x7c> + 4dca: 49 5d subi r20, 0xD9 ; 217 + 4dcc: 31 fd sbrc r19, 1 + 4dce: 40 52 subi r20, 0x20 ; 32 + 4dd0: 41 93 st Z+, r20 + 4dd2: 02 d0 rcall .+4 ; 0x4dd8 <__ultoa_invert+0x84> + 4dd4: a9 f7 brne .-22 ; 0x4dc0 <__ultoa_invert+0x6c> + 4dd6: ea cf rjmp .-44 ; 0x4dac <__ultoa_invert+0x58> + 4dd8: b4 e0 ldi r27, 0x04 ; 4 + 4dda: a6 95 lsr r26 + 4ddc: 97 95 ror r25 + 4dde: 87 95 ror r24 + 4de0: 77 95 ror r23 + 4de2: 67 95 ror r22 + 4de4: ba 95 dec r27 + 4de6: c9 f7 brne .-14 ; 0x4dda <__ultoa_invert+0x86> + 4de8: 00 97 sbiw r24, 0x00 ; 0 + 4dea: 61 05 cpc r22, r1 + 4dec: 71 05 cpc r23, r1 + 4dee: 08 95 ret + 4df0: 9b 01 movw r18, r22 + 4df2: ac 01 movw r20, r24 + 4df4: 0a 2e mov r0, r26 + 4df6: 06 94 lsr r0 + 4df8: 57 95 ror r21 + 4dfa: 47 95 ror r20 + 4dfc: 37 95 ror r19 + 4dfe: 27 95 ror r18 + 4e00: ba 95 dec r27 + 4e02: c9 f7 brne .-14 ; 0x4df6 <__ultoa_invert+0xa2> + 4e04: 62 0f add r22, r18 + 4e06: 73 1f adc r23, r19 + 4e08: 84 1f adc r24, r20 + 4e0a: 95 1f adc r25, r21 + 4e0c: a0 1d adc r26, r0 + 4e0e: 08 95 ret -00005058 <__eewr_byte_x32a4u>: - 5058: 26 2f mov r18, r22 +00004e10 <__divmodsi4>: + 4e10: 05 2e mov r0, r21 + 4e12: 97 fb bst r25, 7 + 4e14: 16 f4 brtc .+4 ; 0x4e1a <__divmodsi4+0xa> + 4e16: 00 94 com r0 + 4e18: 06 d0 rcall .+12 ; 0x4e26 <__divmodsi4_neg1> + 4e1a: 57 fd sbrc r21, 7 + 4e1c: 0c d0 rcall .+24 ; 0x4e36 <__divmodsi4_neg2> + 4e1e: 44 d0 rcall .+136 ; 0x4ea8 <__udivmodsi4> + 4e20: 07 fc sbrc r0, 7 + 4e22: 09 d0 rcall .+18 ; 0x4e36 <__divmodsi4_neg2> + 4e24: 7e f4 brtc .+30 ; 0x4e44 <__divmodsi4_exit> -0000505a <__eewr_r18_x32a4u>: - 505a: e0 ec ldi r30, 0xC0 ; 192 - 505c: f1 e0 ldi r31, 0x01 ; 1 - 505e: 37 85 ldd r19, Z+15 ; 0x0f - 5060: 37 fd sbrc r19, 7 - 5062: fd cf rjmp .-6 ; 0x505e <__eewr_r18_x32a4u+0x4> - 5064: 34 85 ldd r19, Z+12 ; 0x0c - 5066: 37 7f andi r19, 0xF7 ; 247 - 5068: 34 87 std Z+12, r19 ; 0x0c - 506a: 37 85 ldd r19, Z+15 ; 0x0f - 506c: 31 ff sbrs r19, 1 - 506e: 09 c0 rjmp .+18 ; 0x5082 <__eewr_r18_x32a4u+0x28> - 5070: 36 e3 ldi r19, 0x36 ; 54 - 5072: 32 87 std Z+10, r19 ; 0x0a - 5074: 38 ed ldi r19, 0xD8 ; 216 - 5076: 34 bf out 0x34, r19 ; 52 - 5078: 31 e0 ldi r19, 0x01 ; 1 - 507a: 33 87 std Z+11, r19 ; 0x0b - 507c: 37 85 ldd r19, Z+15 ; 0x0f - 507e: 37 fd sbrc r19, 7 - 5080: fd cf rjmp .-6 ; 0x507c <__eewr_r18_x32a4u+0x22> - 5082: 33 e3 ldi r19, 0x33 ; 51 - 5084: 32 87 std Z+10, r19 ; 0x0a - 5086: 80 83 st Z, r24 - 5088: 91 83 std Z+1, r25 ; 0x01 - 508a: 12 82 std Z+2, r1 ; 0x02 - 508c: 24 83 std Z+4, r18 ; 0x04 - 508e: 25 e3 ldi r18, 0x35 ; 53 - 5090: 22 87 std Z+10, r18 ; 0x0a - 5092: 28 ed ldi r18, 0xD8 ; 216 - 5094: 31 e0 ldi r19, 0x01 ; 1 - 5096: 24 bf out 0x34, r18 ; 52 - 5098: 33 87 std Z+11, r19 ; 0x0b - 509a: 01 96 adiw r24, 0x01 ; 1 - 509c: 08 95 ret +00004e26 <__divmodsi4_neg1>: + 4e26: 90 95 com r25 + 4e28: 80 95 com r24 + 4e2a: 70 95 com r23 + 4e2c: 61 95 neg r22 + 4e2e: 7f 4f sbci r23, 0xFF ; 255 + 4e30: 8f 4f sbci r24, 0xFF ; 255 + 4e32: 9f 4f sbci r25, 0xFF ; 255 + 4e34: 08 95 ret -0000509e : - 509e: fc 01 movw r30, r24 - 50a0: 05 90 lpm r0, Z+ - 50a2: 61 50 subi r22, 0x01 ; 1 - 50a4: 70 40 sbci r23, 0x00 ; 0 - 50a6: 01 10 cpse r0, r1 - 50a8: d8 f7 brcc .-10 ; 0x50a0 - 50aa: 80 95 com r24 - 50ac: 90 95 com r25 - 50ae: 8e 0f add r24, r30 - 50b0: 9f 1f adc r25, r31 - 50b2: 08 95 ret +00004e36 <__divmodsi4_neg2>: + 4e36: 50 95 com r21 + 4e38: 40 95 com r20 + 4e3a: 30 95 com r19 + 4e3c: 21 95 neg r18 + 4e3e: 3f 4f sbci r19, 0xFF ; 255 + 4e40: 4f 4f sbci r20, 0xFF ; 255 + 4e42: 5f 4f sbci r21, 0xFF ; 255 -000050b4 : - 50b4: fc 01 movw r30, r24 - 50b6: 61 50 subi r22, 0x01 ; 1 - 50b8: 70 40 sbci r23, 0x00 ; 0 - 50ba: 01 90 ld r0, Z+ - 50bc: 01 10 cpse r0, r1 - 50be: d8 f7 brcc .-10 ; 0x50b6 - 50c0: 80 95 com r24 - 50c2: 90 95 com r25 - 50c4: 8e 0f add r24, r30 - 50c6: 9f 1f adc r25, r31 - 50c8: 08 95 ret +00004e44 <__divmodsi4_exit>: + 4e44: 08 95 ret -000050ca : - 50ca: 0f 93 push r16 - 50cc: 1f 93 push r17 - 50ce: cf 93 push r28 - 50d0: df 93 push r29 - 50d2: 8c 01 movw r16, r24 - 50d4: eb 01 movw r28, r22 - 50d6: 8b 81 ldd r24, Y+3 ; 0x03 - 50d8: 81 ff sbrs r24, 1 - 50da: 1b c0 rjmp .+54 ; 0x5112 - 50dc: 82 ff sbrs r24, 2 - 50de: 0d c0 rjmp .+26 ; 0x50fa - 50e0: 2e 81 ldd r18, Y+6 ; 0x06 - 50e2: 3f 81 ldd r19, Y+7 ; 0x07 - 50e4: 8c 81 ldd r24, Y+4 ; 0x04 - 50e6: 9d 81 ldd r25, Y+5 ; 0x05 - 50e8: 28 17 cp r18, r24 - 50ea: 39 07 cpc r19, r25 - 50ec: 64 f4 brge .+24 ; 0x5106 - 50ee: e8 81 ld r30, Y - 50f0: f9 81 ldd r31, Y+1 ; 0x01 - 50f2: 01 93 st Z+, r16 - 50f4: e8 83 st Y, r30 - 50f6: f9 83 std Y+1, r31 ; 0x01 - 50f8: 06 c0 rjmp .+12 ; 0x5106 - 50fa: e8 85 ldd r30, Y+8 ; 0x08 - 50fc: f9 85 ldd r31, Y+9 ; 0x09 - 50fe: 80 2f mov r24, r16 - 5100: 09 95 icall - 5102: 00 97 sbiw r24, 0x00 ; 0 - 5104: 31 f4 brne .+12 ; 0x5112 - 5106: 8e 81 ldd r24, Y+6 ; 0x06 - 5108: 9f 81 ldd r25, Y+7 ; 0x07 - 510a: 01 96 adiw r24, 0x01 ; 1 - 510c: 8e 83 std Y+6, r24 ; 0x06 - 510e: 9f 83 std Y+7, r25 ; 0x07 - 5110: 02 c0 rjmp .+4 ; 0x5116 - 5112: 0f ef ldi r16, 0xFF ; 255 - 5114: 1f ef ldi r17, 0xFF ; 255 - 5116: c8 01 movw r24, r16 - 5118: df 91 pop r29 - 511a: cf 91 pop r28 - 511c: 1f 91 pop r17 - 511e: 0f 91 pop r16 - 5120: 08 95 ret +00004e46 <__prologue_saves__>: + 4e46: 2f 92 push r2 + 4e48: 3f 92 push r3 + 4e4a: 4f 92 push r4 + 4e4c: 5f 92 push r5 + 4e4e: 6f 92 push r6 + 4e50: 7f 92 push r7 + 4e52: 8f 92 push r8 + 4e54: 9f 92 push r9 + 4e56: af 92 push r10 + 4e58: bf 92 push r11 + 4e5a: cf 92 push r12 + 4e5c: df 92 push r13 + 4e5e: ef 92 push r14 + 4e60: ff 92 push r15 + 4e62: 0f 93 push r16 + 4e64: 1f 93 push r17 + 4e66: cf 93 push r28 + 4e68: df 93 push r29 + 4e6a: cd b7 in r28, 0x3d ; 61 + 4e6c: de b7 in r29, 0x3e ; 62 + 4e6e: ca 1b sub r28, r26 + 4e70: db 0b sbc r29, r27 + 4e72: cd bf out 0x3d, r28 ; 61 + 4e74: de bf out 0x3e, r29 ; 62 + 4e76: 09 94 ijmp -00005122 <__ultoa_invert>: - 5122: fa 01 movw r30, r20 - 5124: aa 27 eor r26, r26 - 5126: 28 30 cpi r18, 0x08 ; 8 - 5128: 51 f1 breq .+84 ; 0x517e <__ultoa_invert+0x5c> - 512a: 20 31 cpi r18, 0x10 ; 16 - 512c: 81 f1 breq .+96 ; 0x518e <__ultoa_invert+0x6c> - 512e: e8 94 clt - 5130: 6f 93 push r22 - 5132: 6e 7f andi r22, 0xFE ; 254 - 5134: 6e 5f subi r22, 0xFE ; 254 - 5136: 7f 4f sbci r23, 0xFF ; 255 - 5138: 8f 4f sbci r24, 0xFF ; 255 - 513a: 9f 4f sbci r25, 0xFF ; 255 - 513c: af 4f sbci r26, 0xFF ; 255 - 513e: b1 e0 ldi r27, 0x01 ; 1 - 5140: 3e d0 rcall .+124 ; 0x51be <__ultoa_invert+0x9c> - 5142: b4 e0 ldi r27, 0x04 ; 4 - 5144: 3c d0 rcall .+120 ; 0x51be <__ultoa_invert+0x9c> - 5146: 67 0f add r22, r23 - 5148: 78 1f adc r23, r24 - 514a: 89 1f adc r24, r25 - 514c: 9a 1f adc r25, r26 - 514e: a1 1d adc r26, r1 - 5150: 68 0f add r22, r24 - 5152: 79 1f adc r23, r25 - 5154: 8a 1f adc r24, r26 - 5156: 91 1d adc r25, r1 - 5158: a1 1d adc r26, r1 - 515a: 6a 0f add r22, r26 - 515c: 71 1d adc r23, r1 - 515e: 81 1d adc r24, r1 - 5160: 91 1d adc r25, r1 - 5162: a1 1d adc r26, r1 - 5164: 20 d0 rcall .+64 ; 0x51a6 <__ultoa_invert+0x84> - 5166: 09 f4 brne .+2 ; 0x516a <__ultoa_invert+0x48> - 5168: 68 94 set - 516a: 3f 91 pop r19 - 516c: 2a e0 ldi r18, 0x0A ; 10 - 516e: 26 9f mul r18, r22 - 5170: 11 24 eor r1, r1 - 5172: 30 19 sub r19, r0 - 5174: 30 5d subi r19, 0xD0 ; 208 - 5176: 31 93 st Z+, r19 - 5178: de f6 brtc .-74 ; 0x5130 <__ultoa_invert+0xe> - 517a: cf 01 movw r24, r30 - 517c: 08 95 ret - 517e: 46 2f mov r20, r22 - 5180: 47 70 andi r20, 0x07 ; 7 - 5182: 40 5d subi r20, 0xD0 ; 208 - 5184: 41 93 st Z+, r20 - 5186: b3 e0 ldi r27, 0x03 ; 3 - 5188: 0f d0 rcall .+30 ; 0x51a8 <__ultoa_invert+0x86> - 518a: c9 f7 brne .-14 ; 0x517e <__ultoa_invert+0x5c> - 518c: f6 cf rjmp .-20 ; 0x517a <__ultoa_invert+0x58> - 518e: 46 2f mov r20, r22 - 5190: 4f 70 andi r20, 0x0F ; 15 - 5192: 40 5d subi r20, 0xD0 ; 208 - 5194: 4a 33 cpi r20, 0x3A ; 58 - 5196: 18 f0 brcs .+6 ; 0x519e <__ultoa_invert+0x7c> - 5198: 49 5d subi r20, 0xD9 ; 217 - 519a: 31 fd sbrc r19, 1 - 519c: 40 52 subi r20, 0x20 ; 32 - 519e: 41 93 st Z+, r20 - 51a0: 02 d0 rcall .+4 ; 0x51a6 <__ultoa_invert+0x84> - 51a2: a9 f7 brne .-22 ; 0x518e <__ultoa_invert+0x6c> - 51a4: ea cf rjmp .-44 ; 0x517a <__ultoa_invert+0x58> - 51a6: b4 e0 ldi r27, 0x04 ; 4 - 51a8: a6 95 lsr r26 - 51aa: 97 95 ror r25 - 51ac: 87 95 ror r24 - 51ae: 77 95 ror r23 - 51b0: 67 95 ror r22 - 51b2: ba 95 dec r27 - 51b4: c9 f7 brne .-14 ; 0x51a8 <__ultoa_invert+0x86> - 51b6: 00 97 sbiw r24, 0x00 ; 0 - 51b8: 61 05 cpc r22, r1 - 51ba: 71 05 cpc r23, r1 - 51bc: 08 95 ret - 51be: 9b 01 movw r18, r22 - 51c0: ac 01 movw r20, r24 - 51c2: 0a 2e mov r0, r26 - 51c4: 06 94 lsr r0 - 51c6: 57 95 ror r21 - 51c8: 47 95 ror r20 - 51ca: 37 95 ror r19 - 51cc: 27 95 ror r18 - 51ce: ba 95 dec r27 - 51d0: c9 f7 brne .-14 ; 0x51c4 <__ultoa_invert+0xa2> - 51d2: 62 0f add r22, r18 - 51d4: 73 1f adc r23, r19 - 51d6: 84 1f adc r24, r20 - 51d8: 95 1f adc r25, r21 - 51da: a0 1d adc r26, r0 - 51dc: 08 95 ret +00004e78 <__epilogue_restores__>: + 4e78: 2a 88 ldd r2, Y+18 ; 0x12 + 4e7a: 39 88 ldd r3, Y+17 ; 0x11 + 4e7c: 48 88 ldd r4, Y+16 ; 0x10 + 4e7e: 5f 84 ldd r5, Y+15 ; 0x0f + 4e80: 6e 84 ldd r6, Y+14 ; 0x0e + 4e82: 7d 84 ldd r7, Y+13 ; 0x0d + 4e84: 8c 84 ldd r8, Y+12 ; 0x0c + 4e86: 9b 84 ldd r9, Y+11 ; 0x0b + 4e88: aa 84 ldd r10, Y+10 ; 0x0a + 4e8a: b9 84 ldd r11, Y+9 ; 0x09 + 4e8c: c8 84 ldd r12, Y+8 ; 0x08 + 4e8e: df 80 ldd r13, Y+7 ; 0x07 + 4e90: ee 80 ldd r14, Y+6 ; 0x06 + 4e92: fd 80 ldd r15, Y+5 ; 0x05 + 4e94: 0c 81 ldd r16, Y+4 ; 0x04 + 4e96: 1b 81 ldd r17, Y+3 ; 0x03 + 4e98: aa 81 ldd r26, Y+2 ; 0x02 + 4e9a: b9 81 ldd r27, Y+1 ; 0x01 + 4e9c: ce 0f add r28, r30 + 4e9e: d1 1d adc r29, r1 + 4ea0: cd bf out 0x3d, r28 ; 61 + 4ea2: de bf out 0x3e, r29 ; 62 + 4ea4: ed 01 movw r28, r26 + 4ea6: 08 95 ret -000051de <__divmodsi4>: - 51de: 97 fb bst r25, 7 - 51e0: 09 2e mov r0, r25 - 51e2: 05 26 eor r0, r21 - 51e4: 0e d0 rcall .+28 ; 0x5202 <__divmodsi4_neg1> - 51e6: 57 fd sbrc r21, 7 - 51e8: 04 d0 rcall .+8 ; 0x51f2 <__divmodsi4_neg2> - 51ea: 45 d0 rcall .+138 ; 0x5276 <__udivmodsi4> - 51ec: 0a d0 rcall .+20 ; 0x5202 <__divmodsi4_neg1> - 51ee: 00 1c adc r0, r0 - 51f0: 38 f4 brcc .+14 ; 0x5200 <__divmodsi4_exit> +00004ea8 <__udivmodsi4>: + 4ea8: a1 e2 ldi r26, 0x21 ; 33 + 4eaa: 1a 2e mov r1, r26 + 4eac: aa 1b sub r26, r26 + 4eae: bb 1b sub r27, r27 + 4eb0: fd 01 movw r30, r26 + 4eb2: 0d c0 rjmp .+26 ; 0x4ece <__udivmodsi4_ep> -000051f2 <__divmodsi4_neg2>: - 51f2: 50 95 com r21 - 51f4: 40 95 com r20 - 51f6: 30 95 com r19 - 51f8: 21 95 neg r18 - 51fa: 3f 4f sbci r19, 0xFF ; 255 - 51fc: 4f 4f sbci r20, 0xFF ; 255 - 51fe: 5f 4f sbci r21, 0xFF ; 255 +00004eb4 <__udivmodsi4_loop>: + 4eb4: aa 1f adc r26, r26 + 4eb6: bb 1f adc r27, r27 + 4eb8: ee 1f adc r30, r30 + 4eba: ff 1f adc r31, r31 + 4ebc: a2 17 cp r26, r18 + 4ebe: b3 07 cpc r27, r19 + 4ec0: e4 07 cpc r30, r20 + 4ec2: f5 07 cpc r31, r21 + 4ec4: 20 f0 brcs .+8 ; 0x4ece <__udivmodsi4_ep> + 4ec6: a2 1b sub r26, r18 + 4ec8: b3 0b sbc r27, r19 + 4eca: e4 0b sbc r30, r20 + 4ecc: f5 0b sbc r31, r21 -00005200 <__divmodsi4_exit>: - 5200: 08 95 ret +00004ece <__udivmodsi4_ep>: + 4ece: 66 1f adc r22, r22 + 4ed0: 77 1f adc r23, r23 + 4ed2: 88 1f adc r24, r24 + 4ed4: 99 1f adc r25, r25 + 4ed6: 1a 94 dec r1 + 4ed8: 69 f7 brne .-38 ; 0x4eb4 <__udivmodsi4_loop> + 4eda: 60 95 com r22 + 4edc: 70 95 com r23 + 4ede: 80 95 com r24 + 4ee0: 90 95 com r25 + 4ee2: 9b 01 movw r18, r22 + 4ee4: ac 01 movw r20, r24 + 4ee6: bd 01 movw r22, r26 + 4ee8: cf 01 movw r24, r30 + 4eea: 08 95 ret -00005202 <__divmodsi4_neg1>: - 5202: f6 f7 brtc .-4 ; 0x5200 <__divmodsi4_exit> - 5204: 90 95 com r25 - 5206: 80 95 com r24 - 5208: 70 95 com r23 - 520a: 61 95 neg r22 - 520c: 7f 4f sbci r23, 0xFF ; 255 - 520e: 8f 4f sbci r24, 0xFF ; 255 - 5210: 9f 4f sbci r25, 0xFF ; 255 - 5212: 08 95 ret +00004eec <_exit>: + 4eec: f8 94 cli -00005214 <__prologue_saves__>: - 5214: 2f 92 push r2 - 5216: 3f 92 push r3 - 5218: 4f 92 push r4 - 521a: 5f 92 push r5 - 521c: 6f 92 push r6 - 521e: 7f 92 push r7 - 5220: 8f 92 push r8 - 5222: 9f 92 push r9 - 5224: af 92 push r10 - 5226: bf 92 push r11 - 5228: cf 92 push r12 - 522a: df 92 push r13 - 522c: ef 92 push r14 - 522e: ff 92 push r15 - 5230: 0f 93 push r16 - 5232: 1f 93 push r17 - 5234: cf 93 push r28 - 5236: df 93 push r29 - 5238: cd b7 in r28, 0x3d ; 61 - 523a: de b7 in r29, 0x3e ; 62 - 523c: ca 1b sub r28, r26 - 523e: db 0b sbc r29, r27 - 5240: cd bf out 0x3d, r28 ; 61 - 5242: de bf out 0x3e, r29 ; 62 - 5244: 09 94 ijmp - -00005246 <__epilogue_restores__>: - 5246: 2a 88 ldd r2, Y+18 ; 0x12 - 5248: 39 88 ldd r3, Y+17 ; 0x11 - 524a: 48 88 ldd r4, Y+16 ; 0x10 - 524c: 5f 84 ldd r5, Y+15 ; 0x0f - 524e: 6e 84 ldd r6, Y+14 ; 0x0e - 5250: 7d 84 ldd r7, Y+13 ; 0x0d - 5252: 8c 84 ldd r8, Y+12 ; 0x0c - 5254: 9b 84 ldd r9, Y+11 ; 0x0b - 5256: aa 84 ldd r10, Y+10 ; 0x0a - 5258: b9 84 ldd r11, Y+9 ; 0x09 - 525a: c8 84 ldd r12, Y+8 ; 0x08 - 525c: df 80 ldd r13, Y+7 ; 0x07 - 525e: ee 80 ldd r14, Y+6 ; 0x06 - 5260: fd 80 ldd r15, Y+5 ; 0x05 - 5262: 0c 81 ldd r16, Y+4 ; 0x04 - 5264: 1b 81 ldd r17, Y+3 ; 0x03 - 5266: aa 81 ldd r26, Y+2 ; 0x02 - 5268: b9 81 ldd r27, Y+1 ; 0x01 - 526a: ce 0f add r28, r30 - 526c: d1 1d adc r29, r1 - 526e: cd bf out 0x3d, r28 ; 61 - 5270: de bf out 0x3e, r29 ; 62 - 5272: ed 01 movw r28, r26 - 5274: 08 95 ret - -00005276 <__udivmodsi4>: - 5276: a1 e2 ldi r26, 0x21 ; 33 - 5278: 1a 2e mov r1, r26 - 527a: aa 1b sub r26, r26 - 527c: bb 1b sub r27, r27 - 527e: fd 01 movw r30, r26 - 5280: 0d c0 rjmp .+26 ; 0x529c <__udivmodsi4_ep> - -00005282 <__udivmodsi4_loop>: - 5282: aa 1f adc r26, r26 - 5284: bb 1f adc r27, r27 - 5286: ee 1f adc r30, r30 - 5288: ff 1f adc r31, r31 - 528a: a2 17 cp r26, r18 - 528c: b3 07 cpc r27, r19 - 528e: e4 07 cpc r30, r20 - 5290: f5 07 cpc r31, r21 - 5292: 20 f0 brcs .+8 ; 0x529c <__udivmodsi4_ep> - 5294: a2 1b sub r26, r18 - 5296: b3 0b sbc r27, r19 - 5298: e4 0b sbc r30, r20 - 529a: f5 0b sbc r31, r21 - -0000529c <__udivmodsi4_ep>: - 529c: 66 1f adc r22, r22 - 529e: 77 1f adc r23, r23 - 52a0: 88 1f adc r24, r24 - 52a2: 99 1f adc r25, r25 - 52a4: 1a 94 dec r1 - 52a6: 69 f7 brne .-38 ; 0x5282 <__udivmodsi4_loop> - 52a8: 60 95 com r22 - 52aa: 70 95 com r23 - 52ac: 80 95 com r24 - 52ae: 90 95 com r25 - 52b0: 9b 01 movw r18, r22 - 52b2: ac 01 movw r20, r24 - 52b4: bd 01 movw r22, r26 - 52b6: cf 01 movw r24, r30 - 52b8: 08 95 ret - -000052ba <_exit>: - 52ba: f8 94 cli - -000052bc <__stop_program>: - 52bc: ff cf rjmp .-2 ; 0x52bc <__stop_program> +00004eee <__stop_program>: + 4eee: ff cf rjmp .-2 ; 0x4eee <__stop_program> diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.map b/Firmware/Chameleon-Mini/Chameleon-Mini.map index e897517..fd61c01 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.map +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.map @@ -1,57 +1,63 @@ Archive member included because of file (symbol) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - Bin/Commands.o (__mulsi3) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - Bin/Chameleon-Mini.o (__do_copy_data) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - Bin/Chameleon-Mini.o (__do_clear_bss) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + Bin/HIDParser.o (__tablejump2__) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + Bin/Terminal.o (__do_copy_data) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + Bin/Configuration.o (__do_clear_bss) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + Bin/Commands.o (__mulshisi3) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) (__muluhisi3) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) (__umulhisi3) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) Bin/Random.o (rand) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) Bin/Configuration.o (memcpy_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) Bin/Button.o (strcmp_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) Bin/Button.o (strncpy_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) Bin/HIDClassDevice.o (memcmp) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) Bin/HIDClassDevice.o (memcpy) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) Bin/HIDClassDevice.o (memset) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) Bin/Commands.o (snprintf_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (vfprintf) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (vfprintf) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) Bin/Settings.o (__eerd_block_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o (__eerd_byte_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o (__eeupd_byte_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) Bin/Settings.o (__eewr_block_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) (__eewr_r18_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (fputc) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (__ultoa_invert) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) (__divmodsi4) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__prologue_saves__) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__epilogue_restores__) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) (__udivmodsi4) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) (__eewr_r18_x32a4u) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen_P) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (fputc) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (__ultoa_invert) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) (__divmodsi4) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__prologue_saves__) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__epilogue_restores__) +c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) (__udivmodsi4) Allocating common symbols Common symbol size file @@ -81,7 +87,7 @@ USB_Device_RemoteWakeupEnabled Discarded input sections - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o .text 0x00000000 0x0 Bin/Chameleon-Mini.o .bss 0x00000000 0x0 Bin/Chameleon-Mini.o .text 0x00000000 0x0 Bin/LUFADescriptors.o @@ -117,23 +123,23 @@ Discarded input sections .text 0x00000000 0x0 Bin/HIDParser.o .bss 0x00000000 0x0 Bin/HIDParser.o .text.USB_ProcessHIDReport - 0x00000000 0x8b6 Bin/HIDParser.o - .progmem.gcc_sw_table + 0x00000000 0x850 Bin/HIDParser.o + .progmem.gcc_sw_table.USB_ProcessHIDReport 0x00000000 0x17a Bin/HIDParser.o .text.USB_GetHIDReportItemInfo - 0x00000000 0xe8 Bin/HIDParser.o + 0x00000000 0xc6 Bin/HIDParser.o .text.USB_SetHIDReportItemInfo - 0x00000000 0xe4 Bin/HIDParser.o + 0x00000000 0xee Bin/HIDParser.o .text.USB_GetHIDReportSize - 0x00000000 0x14a Bin/HIDParser.o + 0x00000000 0x158 Bin/HIDParser.o .text 0x00000000 0x0 Bin/ConfigDescriptors.o .bss 0x00000000 0x0 Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorOfType 0x00000000 0x50 Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorOfTypeBefore - 0x00000000 0x60 Bin/ConfigDescriptors.o + 0x00000000 0x6c Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorOfTypeAfter - 0x00000000 0x34 Bin/ConfigDescriptors.o + 0x00000000 0x3e Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorComp 0x00000000 0x8e Bin/ConfigDescriptors.o .text 0x00000000 0x0 Bin/DeviceStandardReq.o @@ -151,43 +157,43 @@ Discarded input sections .text 0x00000000 0x0 Bin/EndpointStream_XMEGA.o .bss 0x00000000 0x0 Bin/EndpointStream_XMEGA.o .text.Endpoint_Discard_Stream - 0x00000000 0xd2 Bin/EndpointStream_XMEGA.o + 0x00000000 0xc4 Bin/EndpointStream_XMEGA.o .text.Endpoint_Null_Stream - 0x00000000 0xca Bin/EndpointStream_XMEGA.o + 0x00000000 0xc8 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Stream_BE - 0x00000000 0xfe Bin/EndpointStream_XMEGA.o + 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Stream_LE 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Stream_BE - 0x00000000 0xfe Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_PStream_LE - 0x00000000 0xf2 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_PStream_BE - 0x00000000 0xfe Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_EStream_LE 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_PStream_LE + 0x00000000 0xec Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_PStream_BE + 0x00000000 0xf6 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_EStream_LE + 0x00000000 0xf0 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_EStream_BE - 0x00000000 0x104 Bin/EndpointStream_XMEGA.o + 0x00000000 0xfa Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_EStream_LE - 0x00000000 0x104 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_EStream_BE - 0x00000000 0x110 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_Control_Stream_BE - 0x00000000 0x17a Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Control_Stream_LE 0x00000000 0xfe Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_EStream_BE + 0x00000000 0x108 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_Control_Stream_BE + 0x00000000 0x170 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Control_Stream_LE + 0x00000000 0xf0 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_Stream_BE - 0x00000000 0xe4 Bin/EndpointStream_XMEGA.o + 0x00000000 0xde Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_PStream_BE - 0x00000000 0x17a Bin/EndpointStream_XMEGA.o + 0x00000000 0x170 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_EStream_LE - 0x00000000 0x178 Bin/EndpointStream_XMEGA.o + 0x00000000 0x156 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_EStream_BE - 0x00000000 0x17c Bin/EndpointStream_XMEGA.o + 0x00000000 0x172 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_EStream_LE - 0x00000000 0xfc Bin/EndpointStream_XMEGA.o + 0x00000000 0xf6 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_EStream_BE - 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o + 0x00000000 0xe2 Bin/EndpointStream_XMEGA.o .text 0x00000000 0x0 Bin/Endpoint_XMEGA.o .bss 0x00000000 0x0 Bin/Endpoint_XMEGA.o .text 0x00000000 0x0 Bin/Host_XMEGA.o @@ -202,22 +208,23 @@ Discarded input sections .bss 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o .text 0x00000000 0x0 Bin/AudioClassDevice.o .bss 0x00000000 0x0 Bin/AudioClassDevice.o - .text.Audio_Device_ProcessControlRequest - 0x00000000 0x2ca Bin/AudioClassDevice.o .text.Audio_Device_ConfigureEndpoints - 0x00000000 0x34 Bin/AudioClassDevice.o + 0x00000000 0x32 Bin/AudioClassDevice.o .text.Audio_Device_Event_Stub 0x00000000 0x2 Bin/AudioClassDevice.o + .text.Audio_Device_ProcessControlRequest + 0x00000000 0x29e Bin/AudioClassDevice.o .text 0x00000000 0x0 Bin/CDCClassDevice.o .bss 0x00000000 0x0 Bin/CDCClassDevice.o .text.CDC_Device_putchar 0x00000000 0x1e Bin/CDCClassDevice.o .text.CDC_Device_BytesReceived - 0x00000000 0xa6 Bin/CDCClassDevice.o + 0x00000000 0x8a Bin/CDCClassDevice.o .text.CDC_Device_getchar_Blocking - 0x00000000 0x38 Bin/CDCClassDevice.o + 0x00000000 0x3e Bin/CDCClassDevice.o .text.CDC_Device_getchar - 0x00000000 0x14 Bin/CDCClassDevice.o + 0x00000000 0x1a Bin/CDCClassDevice.o + .rodata 0x00000000 0x8 Bin/CDCClassDevice.o .text.CDC_Device_SendControlLineStateChange 0x00000000 0x7c Bin/CDCClassDevice.o .text.CDC_Device_CreateStream @@ -227,75 +234,76 @@ Discarded input sections .text 0x00000000 0x0 Bin/HIDClassDevice.o .bss 0x00000000 0x0 Bin/HIDClassDevice.o .text.HID_Device_ProcessControlRequest - 0x00000000 0x24e Bin/HIDClassDevice.o + 0x00000000 0x254 Bin/HIDClassDevice.o .text.HID_Device_ConfigureEndpoints - 0x00000000 0x34 Bin/HIDClassDevice.o + 0x00000000 0x2c Bin/HIDClassDevice.o .text.HID_Device_USBTask - 0x00000000 0x1be Bin/HIDClassDevice.o + 0x00000000 0x1b2 Bin/HIDClassDevice.o .text 0x00000000 0x0 Bin/MassStorageClassDevice.o .bss 0x00000000 0x0 Bin/MassStorageClassDevice.o .text.MS_Device_ProcessControlRequest - 0x00000000 0x6e Bin/MassStorageClassDevice.o + 0x00000000 0x70 Bin/MassStorageClassDevice.o .text.MS_Device_ConfigureEndpoints - 0x00000000 0x40 Bin/MassStorageClassDevice.o + 0x00000000 0x3e Bin/MassStorageClassDevice.o .text.MS_Device_USBTask - 0x00000000 0x2e4 Bin/MassStorageClassDevice.o + 0x00000000 0x2ca Bin/MassStorageClassDevice.o .text 0x00000000 0x0 Bin/MIDIClassDevice.o .bss 0x00000000 0x0 Bin/MIDIClassDevice.o .text.MIDI_Device_ConfigureEndpoints - 0x00000000 0x34 Bin/MIDIClassDevice.o + 0x00000000 0x32 Bin/MIDIClassDevice.o .text.MIDI_Device_SendEventPacket 0x00000000 0x66 Bin/MIDIClassDevice.o .text.MIDI_Device_Flush - 0x00000000 0x5e Bin/MIDIClassDevice.o + 0x00000000 0x5c Bin/MIDIClassDevice.o .text.MIDI_Device_USBTask - 0x00000000 0x2a Bin/MIDIClassDevice.o + 0x00000000 0x2c Bin/MIDIClassDevice.o .text.MIDI_Device_ReceiveEventPacket - 0x00000000 0x80 Bin/MIDIClassDevice.o + 0x00000000 0x70 Bin/MIDIClassDevice.o .text 0x00000000 0x0 Bin/PrinterClassDevice.o .bss 0x00000000 0x0 Bin/PrinterClassDevice.o - .text.PRNT_Device_ProcessControlRequest - 0x00000000 0xea Bin/PrinterClassDevice.o .text.PRNT_Device_ConfigureEndpoints - 0x00000000 0x3a Bin/PrinterClassDevice.o + 0x00000000 0x38 Bin/PrinterClassDevice.o .text.PRNT_Device_SendString - 0x00000000 0x4e Bin/PrinterClassDevice.o + 0x00000000 0x46 Bin/PrinterClassDevice.o .text.PRNT_Device_SendData - 0x00000000 0x48 Bin/PrinterClassDevice.o + 0x00000000 0x3c Bin/PrinterClassDevice.o .text.PRNT_Device_SendByte - 0x00000000 0x5c Bin/PrinterClassDevice.o + 0x00000000 0x5e Bin/PrinterClassDevice.o .text.PRNT_Device_putchar 0x00000000 0x1e Bin/PrinterClassDevice.o .text.PRNT_Device_Flush 0x00000000 0x88 Bin/PrinterClassDevice.o .text.PRNT_Device_USBTask - 0x00000000 0x106 Bin/PrinterClassDevice.o + 0x00000000 0xcc Bin/PrinterClassDevice.o .text.PRNT_Device_BytesReceived - 0x00000000 0x90 Bin/PrinterClassDevice.o + 0x00000000 0x7a Bin/PrinterClassDevice.o .text.PRNT_Device_ReceiveByte - 0x00000000 0xc0 Bin/PrinterClassDevice.o + 0x00000000 0xb6 Bin/PrinterClassDevice.o .text.PRNT_Device_getchar_Blocking - 0x00000000 0x38 Bin/PrinterClassDevice.o + 0x00000000 0x3e Bin/PrinterClassDevice.o .text.PRNT_Device_getchar - 0x00000000 0x14 Bin/PrinterClassDevice.o + 0x00000000 0x1a Bin/PrinterClassDevice.o .text.PRNT_Device_CreateStream 0x00000000 0x26 Bin/PrinterClassDevice.o .text.PRNT_Device_CreateBlockingStream 0x00000000 0x26 Bin/PrinterClassDevice.o .text.PRNT_Device_Event_Stub 0x00000000 0x2 Bin/PrinterClassDevice.o + .text.PRNT_Device_ProcessControlRequest + 0x00000000 0xe2 Bin/PrinterClassDevice.o .text 0x00000000 0x0 Bin/RNDISClassDevice.o .bss 0x00000000 0x0 Bin/RNDISClassDevice.o .text.RNDIS_Device_ProcessControlRequest - 0x00000000 0x5cc Bin/RNDISClassDevice.o + 0x00000000 0x53c Bin/RNDISClassDevice.o .text.RNDIS_Device_ConfigureEndpoints - 0x00000000 0x52 Bin/RNDISClassDevice.o + 0x00000000 0x50 Bin/RNDISClassDevice.o + .rodata 0x00000000 0x8 Bin/RNDISClassDevice.o .text.RNDIS_Device_USBTask 0x00000000 0x74 Bin/RNDISClassDevice.o .text.RNDIS_Device_IsPacketReceived - 0x00000000 0x2a Bin/RNDISClassDevice.o + 0x00000000 0x24 Bin/RNDISClassDevice.o .text.RNDIS_Device_ReadPacket - 0x00000000 0xa8 Bin/RNDISClassDevice.o + 0x00000000 0xa2 Bin/RNDISClassDevice.o .text.RNDIS_Device_SendPacket 0x00000000 0xca Bin/RNDISClassDevice.o .progmem.data 0x00000000 0x6c Bin/RNDISClassDevice.o @@ -317,69 +325,179 @@ Discarded input sections .bss 0x00000000 0x0 Bin/RNDISClassHost.o .text 0x00000000 0x0 Bin/StillImageClassHost.o .bss 0x00000000 0x0 Bin/StillImageClassHost.o - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc 0x00000000 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) .text.avr-libc - 0x00000000 0x1a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) + 0x00000000 0x1a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) .text.avr-libc - 0x00000000 0xe c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + 0x00000000 0xe c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) .text.avr-libc - 0x00000000 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + 0x00000000 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) .text.avr-libc - 0x00000000 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00000000 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.div + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.mul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) Memory Configuration @@ -390,11 +508,12 @@ eeprom 0x00810000 0x00010000 rw !x fuse 0x00820000 0x00000400 rw !x lock 0x00830000 0x00000400 rw !x signature 0x00840000 0x00000400 rw !x +user_signatures 0x00850000 0x00000400 rw !x *default* 0x00000000 0xffffffff Linker script and memory map -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o LOAD Bin/Chameleon-Mini.o LOAD Bin/LUFADescriptors.o LOAD Bin/System.o @@ -444,10 +563,10 @@ LOAD Bin/MIDIClassHost.o LOAD Bin/PrinterClassHost.o LOAD Bin/RNDISClassHost.o LOAD Bin/StillImageClassHost.o -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libm.a -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a +LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libm.a +LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a +LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a +LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a .hash *(.hash) @@ -539,9 +658,9 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .rela.plt *(.rela.plt) -.text 0x00000000 0x52be +.text 0x00000000 0x4ef0 *(.vectors) - .vectors 0x00000000 0x1fc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .vectors 0x00000000 0x1fc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o 0x00000000 __vectors *(.vectors) *(.progmem.gcc*) @@ -558,7 +677,7 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .progmem.data 0x0000043b 0x22c Bin/CommandLine.o 0x0000043b CommandTable 0x00000668 . = ALIGN (0x2) - *fill* 0x00000667 0x1 00 + *fill* 0x00000667 0x1 0x00000668 __trampolines_start = . *(.trampolines) .trampolines 0x00000668 0x0 linker stubs @@ -577,20 +696,20 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg SORT(*)(.ctors) SORT(*)(.dtors) *(.init0) - .init0 0x00000668 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init0 0x00000668 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o 0x00000668 __init *(.init0) *(.init1) *(.init1) *(.init2) - .init2 0x00000668 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init2 0x00000668 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o *(.init2) *(.init3) *(.init3) *(.init4) - .init4 0x00000674 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) + .init4 0x00000674 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) 0x00000674 __do_copy_data - .init4 0x0000068a 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) + .init4 0x0000068a 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) 0x0000068a __do_clear_bss *(.init4) *(.init5) @@ -602,10 +721,10 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg *(.init8) *(.init8) *(.init9) - .init9 0x0000069a 0x6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init9 0x0000069a 0x6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o *(.init9) *(.text) - .text 0x000006a0 0x2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .text 0x000006a0 0x2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o 0x000006a0 __vector_38 0x000006a0 __vector_104 0x000006a0 __vector_63 @@ -732,490 +851,502 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg 0x000006a2 . = ALIGN (0x2) *(.text.*) .text.startup.main - 0x000006a2 0x72 Bin/Chameleon-Mini.o + 0x000006a2 0x6e Bin/Chameleon-Mini.o 0x000006a2 main .text.CALLBACK_USB_GetDescriptor - 0x00000714 0x6c Bin/LUFADescriptors.o - 0x00000714 CALLBACK_USB_GetDescriptor + 0x00000710 0x82 Bin/LUFADescriptors.o + 0x00000710 CALLBACK_USB_GetDescriptor .text.__vector_default - 0x00000780 0xc Bin/System.o - 0x00000780 __vector_default + 0x00000792 0xc Bin/System.o + 0x00000792 __vector_default .text.SystemInit - 0x0000078c 0x74 Bin/System.o - 0x0000078c SystemInit + 0x0000079e 0x6e Bin/System.o + 0x0000079e SystemInit .text.SystemReset - 0x00000800 0xe Bin/System.o - 0x00000800 SystemReset + 0x0000080c 0xe Bin/System.o + 0x0000080c SystemReset .text.SystemEnterBootloader - 0x0000080e 0xc Bin/System.o - 0x0000080e SystemEnterBootloader + 0x0000081a 0xc Bin/System.o + 0x0000081a SystemEnterBootloader .text.SystemStartUSBClock - 0x0000081a 0x36 Bin/System.o - 0x0000081a SystemStartUSBClock + 0x00000826 0x32 Bin/System.o + 0x00000826 SystemStartUSBClock .text.SystemStopUSBClock - 0x00000850 0x1c Bin/System.o - 0x00000850 SystemStopUSBClock + 0x00000858 0x1c Bin/System.o + 0x00000858 SystemStopUSBClock .text.SystemInterruptInit - 0x0000086c 0xc Bin/System.o - 0x0000086c SystemInterruptInit + 0x00000874 0xc Bin/System.o + 0x00000874 SystemInterruptInit .text.CodecInitDummy - 0x00000878 0x2 Bin/Configuration.o - .text.CodecTaskDummy - 0x0000087a 0x2 Bin/Configuration.o - .text.ApplicationInitDummy - 0x0000087c 0x2 Bin/Configuration.o - .text.ApplicationResetDummy - 0x0000087e 0x2 Bin/Configuration.o - .text.ApplicationTaskDummy 0x00000880 0x2 Bin/Configuration.o - .text.ApplicationProcessDummy - 0x00000882 0x6 Bin/Configuration.o - .text.ApplicationGetUidDummy + .text.CodecTaskDummy + 0x00000882 0x2 Bin/Configuration.o + .text.ApplicationInitDummy + 0x00000884 0x2 Bin/Configuration.o + .text.ApplicationResetDummy + 0x00000886 0x2 Bin/Configuration.o + .text.ApplicationTaskDummy 0x00000888 0x2 Bin/Configuration.o + .text.ApplicationProcessDummy + 0x0000088a 0x6 Bin/Configuration.o + .text.ApplicationGetUidDummy + 0x00000890 0x2 Bin/Configuration.o .text.ApplicationSetUidDummy - 0x0000088a 0x2 Bin/Configuration.o + 0x00000892 0x2 Bin/Configuration.o .text.ConfigurationSetById - 0x0000088c 0x52 Bin/Configuration.o - 0x0000088c ConfigurationSetById + 0x00000894 0x36 Bin/Configuration.o + 0x00000894 ConfigurationSetById .text.ConfigurationInit - 0x000008de 0xc Bin/Configuration.o - 0x000008de ConfigurationInit + 0x000008ca 0xc Bin/Configuration.o + 0x000008ca ConfigurationInit .text.ConfigurationSetByName - 0x000008ea 0x90 Bin/Configuration.o - 0x000008ea ConfigurationSetByName + 0x000008d6 0x82 Bin/Configuration.o + 0x000008d6 ConfigurationSetByName .text.ConfigurationGetList - 0x0000097a 0x74 Bin/Configuration.o - 0x0000097a ConfigurationGetList + 0x00000958 0x5e Bin/Configuration.o + 0x00000958 ConfigurationGetList .text.RandomInit - 0x000009ee 0x2 Bin/Random.o - 0x000009ee RandomInit + 0x000009b6 0x2 Bin/Random.o + 0x000009b6 RandomInit .text.RandomGetByte - 0x000009f0 0x6 Bin/Random.o - 0x000009f0 RandomGetByte + 0x000009b8 0x6 Bin/Random.o + 0x000009b8 RandomGetByte .text.RandomGetBuffer - 0x000009f6 0x2e Bin/Random.o - 0x000009f6 RandomGetBuffer + 0x000009be 0x1e Bin/Random.o + 0x000009be RandomGetBuffer .text.RandomTick - 0x00000a24 0x10 Bin/Random.o - 0x00000a24 RandomTick + 0x000009dc 0x10 Bin/Random.o + 0x000009dc RandomTick .text.BufferToHexString - 0x00000a34 0x7a Bin/Common.o - 0x00000a34 BufferToHexString + 0x000009ec 0x84 Bin/Common.o + 0x000009ec BufferToHexString .text.HexStringToBuffer - 0x00000aae 0x9e Bin/Common.o - 0x00000aae HexStringToBuffer + 0x00000a70 0x8c Bin/Common.o + 0x00000a70 HexStringToBuffer .text.MemoryInit - 0x00000b4c 0x10e Bin/Memory.o - 0x00000b4c MemoryInit + 0x00000afc 0xfc Bin/Memory.o + 0x00000afc MemoryInit .text.MemoryReadBlock - 0x00000c5a 0x116 Bin/Memory.o - 0x00000c5a MemoryReadBlock + 0x00000bf8 0x10a Bin/Memory.o + 0x00000bf8 MemoryReadBlock .text.MemoryWriteBlock - 0x00000d70 0x2a8 Bin/Memory.o - 0x00000d70 MemoryWriteBlock + 0x00000d02 0x286 Bin/Memory.o + 0x00000d02 MemoryWriteBlock .text.MemoryClear - 0x00001018 0xcc Bin/Memory.o - 0x00001018 MemoryClear + 0x00000f88 0xb6 Bin/Memory.o + 0x00000f88 MemoryClear .text.MemoryUploadBlock - 0x000010e4 0x5c Bin/Memory.o - 0x000010e4 MemoryUploadBlock + 0x0000103e 0x70 Bin/Memory.o + 0x0000103e MemoryUploadBlock .text.MemoryDownloadBlock - 0x00001140 0x5e Bin/Memory.o - 0x00001140 MemoryDownloadBlock + 0x000010ae 0x72 Bin/Memory.o + 0x000010ae MemoryDownloadBlock .text.ButtonInit - 0x0000119e 0xe Bin/Button.o - 0x0000119e ButtonInit + 0x00001120 0xe Bin/Button.o + 0x00001120 ButtonInit .text.ButtonTick - 0x000011ac 0x1ba Bin/Button.o - 0x000011ac ButtonTick + 0x0000112e 0x1b6 Bin/Button.o + 0x0000112e ButtonTick .text.ButtonGetActionList - 0x00001366 0x60 Bin/Button.o - 0x00001366 ButtonGetActionList + 0x000012e4 0x64 Bin/Button.o + 0x000012e4 ButtonGetActionList .text.ButtonSetActionById - 0x000013c6 0xc Bin/Button.o - 0x000013c6 ButtonSetActionById + 0x00001348 0xc Bin/Button.o + 0x00001348 ButtonSetActionById .text.ButtonGetActionByName - 0x000013d2 0x26 Bin/Button.o - 0x000013d2 ButtonGetActionByName + 0x00001354 0x1c Bin/Button.o + 0x00001354 ButtonGetActionByName .text.ButtonSetActionByName - 0x000013f8 0x92 Bin/Button.o - 0x000013f8 ButtonSetActionByName + 0x00001370 0x92 Bin/Button.o + 0x00001370 ButtonSetActionByName .text.SettingsLoad - 0x0000148a 0x10 Bin/Settings.o - 0x0000148a SettingsLoad + 0x00001402 0x10 Bin/Settings.o + 0x00001402 SettingsLoad .text.SettingsSave - 0x0000149a 0x10 Bin/Settings.o - 0x0000149a SettingsSave + 0x00001412 0x10 Bin/Settings.o + 0x00001412 SettingsSave .text.SettingsSetActiveById - 0x000014aa 0x1e Bin/Settings.o - 0x000014aa SettingsSetActiveById + 0x00001422 0x1e Bin/Settings.o + 0x00001422 SettingsSetActiveById .text.SettingsCycle - 0x000014c8 0xda Bin/Settings.o - 0x000014c8 SettingsCycle + 0x00001440 0xda Bin/Settings.o + 0x00001440 SettingsCycle .text.SettingsGetActiveById - 0x000015a2 0x6 Bin/Settings.o - 0x000015a2 SettingsGetActiveById + 0x0000151a 0x6 Bin/Settings.o + 0x0000151a SettingsGetActiveById .text.SettingsGetActiveByName - 0x000015a8 0x14 Bin/Settings.o - 0x000015a8 SettingsGetActiveByName + 0x00001520 0x14 Bin/Settings.o + 0x00001520 SettingsGetActiveByName .text.SettingsSetActiveByName - 0x000015bc 0x1e Bin/Settings.o - 0x000015bc SettingsSetActiveByName + 0x00001534 0x1a Bin/Settings.o + 0x00001534 SettingsSetActiveByName .text.TerminalSendString - 0x000015da 0xa Bin/Terminal.o - 0x000015da TerminalSendString + 0x0000154e 0xa Bin/Terminal.o + 0x0000154e TerminalSendString .text.TerminalSendStringP - 0x000015e4 0x28 Bin/Terminal.o - 0x000015e4 TerminalSendStringP + 0x00001558 0x28 Bin/Terminal.o + 0x00001558 TerminalSendStringP .text.TerminalSendBlock - 0x0000160c 0xe Bin/Terminal.o - 0x0000160c TerminalSendBlock + 0x00001580 0xc Bin/Terminal.o + 0x00001580 TerminalSendBlock .text.TerminalInit - 0x0000161a 0xa Bin/Terminal.o - 0x0000161a TerminalInit + 0x0000158c 0xa Bin/Terminal.o + 0x0000158c TerminalInit .text.TerminalTask - 0x00001624 0x42 Bin/Terminal.o - 0x00001624 TerminalTask + 0x00001596 0x3e Bin/Terminal.o + 0x00001596 TerminalTask .text.TerminalTick - 0x00001666 0x7e Bin/Terminal.o - 0x00001666 TerminalTick + 0x000015d4 0x7c Bin/Terminal.o + 0x000015d4 TerminalTick .text.EVENT_USB_Device_Connect - 0x000016e4 0xa Bin/Terminal.o - 0x000016e4 EVENT_USB_Device_Connect + 0x00001650 0xa Bin/Terminal.o + 0x00001650 EVENT_USB_Device_Connect .text.EVENT_USB_Device_Disconnect - 0x000016ee 0xa Bin/Terminal.o - 0x000016ee EVENT_USB_Device_Disconnect + 0x0000165a 0xa Bin/Terminal.o + 0x0000165a EVENT_USB_Device_Disconnect .text.EVENT_USB_Device_ConfigurationChanged - 0x000016f8 0x8 Bin/Terminal.o - 0x000016f8 EVENT_USB_Device_ConfigurationChanged + 0x00001664 0x8 Bin/Terminal.o + 0x00001664 EVENT_USB_Device_ConfigurationChanged .text.EVENT_USB_Device_ControlRequest - 0x00001700 0x8 Bin/Terminal.o - 0x00001700 EVENT_USB_Device_ControlRequest + 0x0000166c 0x8 Bin/Terminal.o + 0x0000166c EVENT_USB_Device_ControlRequest .text.CommandGetVersion - 0x00001708 0x5a Bin/Commands.o - 0x00001708 CommandGetVersion + 0x00001674 0x3c Bin/Commands.o + 0x00001674 CommandGetVersion .text.CommandGetConfig - 0x00001762 0x4a Bin/Commands.o - 0x00001762 CommandGetConfig + 0x000016b0 0x2c Bin/Commands.o + 0x000016b0 CommandGetConfig .text.CommandSetConfig - 0x000017ac 0x10 Bin/Commands.o - 0x000017ac CommandSetConfig + 0x000016dc 0x10 Bin/Commands.o + 0x000016dc CommandSetConfig .text.CommandExecConfig - 0x000017bc 0xa Bin/Commands.o - 0x000017bc CommandExecConfig + 0x000016ec 0xa Bin/Commands.o + 0x000016ec CommandExecConfig .text.CommandGetUid - 0x000017c6 0x4c Bin/Commands.o - 0x000017c6 CommandGetUid + 0x000016f6 0x4c Bin/Commands.o + 0x000016f6 CommandGetUid .text.CommandSetUid - 0x00001812 0xa8 Bin/Commands.o - 0x00001812 CommandSetUid + 0x00001742 0xae Bin/Commands.o + 0x00001742 CommandSetUid .text.CommandGetReadOnly - 0x000018ba 0x1e Bin/Commands.o - 0x000018ba CommandGetReadOnly + 0x000017f0 0x24 Bin/Commands.o + 0x000017f0 CommandGetReadOnly .text.CommandSetReadOnly - 0x000018d8 0x2c Bin/Commands.o - 0x000018d8 CommandSetReadOnly + 0x00001814 0x28 Bin/Commands.o + 0x00001814 CommandSetReadOnly .text.CommandExecUpload - 0x00001904 0xa Bin/Commands.o - 0x00001904 CommandExecUpload + 0x0000183c 0xa Bin/Commands.o + 0x0000183c CommandExecUpload .text.CommandExecDownload - 0x0000190e 0xa Bin/Commands.o - 0x0000190e CommandExecDownload + 0x00001846 0xa Bin/Commands.o + 0x00001846 CommandExecDownload .text.CommandExecReset - 0x00001918 0x16 Bin/Commands.o - 0x00001918 CommandExecReset + 0x00001850 0x16 Bin/Commands.o + 0x00001850 CommandExecReset .text.CommandExecUpgrade - 0x0000192e 0x16 Bin/Commands.o - 0x0000192e CommandExecUpgrade + 0x00001866 0x16 Bin/Commands.o + 0x00001866 CommandExecUpgrade .text.CommandGetMemSize - 0x00001944 0x4e Bin/Commands.o - 0x00001944 CommandGetMemSize + 0x0000187c 0x30 Bin/Commands.o + 0x0000187c CommandGetMemSize .text.CommandGetUidSize - 0x00001992 0x4a Bin/Commands.o - 0x00001992 CommandGetUidSize + 0x000018ac 0x2c Bin/Commands.o + 0x000018ac CommandGetUidSize .text.CommandExecButton - 0x000019dc 0xa Bin/Commands.o - 0x000019dc CommandExecButton + 0x000018d8 0xa Bin/Commands.o + 0x000018d8 CommandExecButton .text.CommandGetButton - 0x000019e6 0xa Bin/Commands.o - 0x000019e6 CommandGetButton + 0x000018e2 0xa Bin/Commands.o + 0x000018e2 CommandGetButton .text.CommandSetButton - 0x000019f0 0x10 Bin/Commands.o - 0x000019f0 CommandSetButton + 0x000018ec 0x10 Bin/Commands.o + 0x000018ec CommandSetButton .text.CommandGetSetting - 0x00001a00 0xa Bin/Commands.o - 0x00001a00 CommandGetSetting + 0x000018fc 0xa Bin/Commands.o + 0x000018fc CommandGetSetting .text.CommandSetSetting - 0x00001a0a 0x10 Bin/Commands.o - 0x00001a0a CommandSetSetting + 0x00001906 0x10 Bin/Commands.o + 0x00001906 CommandSetSetting .text.CommandExecClear - 0x00001a1a 0x6 Bin/Commands.o - 0x00001a1a CommandExecClear + 0x00001916 0x6 Bin/Commands.o + 0x00001916 CommandExecClear .text.CommandExecHelp - 0x00001a20 0x9a Bin/Commands.o - 0x00001a20 CommandExecHelp + 0x0000191c 0x98 Bin/Commands.o + 0x0000191c CommandExecHelp .text.CommandGetRssi - 0x00001aba 0x94 Bin/Commands.o - 0x00001aba CommandGetRssi + 0x000019b4 0x68 Bin/Commands.o + 0x000019b4 CommandGetRssi .text.CalcChecksum.constprop.0 - 0x00001b4e 0x14 Bin/XModem.o + 0x00001a1c 0x14 Bin/XModem.o .text.XModemReceive - 0x00001b62 0x30 Bin/XModem.o - 0x00001b62 XModemReceive + 0x00001a30 0x30 Bin/XModem.o + 0x00001a30 XModemReceive .text.XModemSend - 0x00001b92 0x26 Bin/XModem.o - 0x00001b92 XModemSend + 0x00001a60 0x26 Bin/XModem.o + 0x00001a60 XModemSend .text.XModemProcessByte - 0x00001bb8 0x2b2 Bin/XModem.o - 0x00001bb8 XModemProcessByte + 0x00001a86 0x284 Bin/XModem.o + 0x00001a86 XModemProcessByte .text.XModemTick - 0x00001e6a 0x5c Bin/XModem.o - 0x00001e6a XModemTick + 0x00001d0a 0x5c Bin/XModem.o + 0x00001d0a XModemTick .text.CommandLineProcessByte - 0x00001ec6 0x346 Bin/CommandLine.o - 0x00001ec6 CommandLineProcessByte + 0x00001d66 0x342 Bin/CommandLine.o + 0x00001d66 CommandLineProcessByte .text.CommandLineTick - 0x0000220c 0x2 Bin/CommandLine.o - 0x0000220c CommandLineTick + 0x000020a8 0x2 Bin/CommandLine.o + 0x000020a8 CommandLineTick .text.StartDemod - 0x0000220e 0x3e Bin/ISO14443-2A.o + 0x000020aa 0x3c Bin/ISO14443-2A.o .text.__vector_34 - 0x0000224c 0x88 Bin/ISO14443-2A.o - 0x0000224c __vector_34 + 0x000020e6 0x88 Bin/ISO14443-2A.o + 0x000020e6 __vector_34 .text.__vector_22 - 0x000022d4 0x148 Bin/ISO14443-2A.o - 0x000022d4 __vector_22 + 0x0000216e 0x148 Bin/ISO14443-2A.o + 0x0000216e __vector_22 .text.__vector_83 - 0x0000241c 0x212 Bin/ISO14443-2A.o - 0x0000241c __vector_83 + 0x000022b6 0x1e2 Bin/ISO14443-2A.o + 0x000022b6 __vector_83 .text.ISO14443ACodecInit - 0x0000262e 0x70 Bin/ISO14443-2A.o - 0x0000262e ISO14443ACodecInit + 0x00002498 0x6e Bin/ISO14443-2A.o + 0x00002498 ISO14443ACodecInit .text.ISO14443ACodecTask - 0x0000269e 0xf2 Bin/ISO14443-2A.o - 0x0000269e ISO14443ACodecTask + 0x00002506 0xfc Bin/ISO14443-2A.o + 0x00002506 ISO14443ACodecTask .text.MifareClassicAppInit1K - 0x00002790 0x1a Bin/MifareClassic.o - 0x00002790 MifareClassicAppInit1K + 0x00002602 0x1a Bin/MifareClassic.o + 0x00002602 MifareClassicAppInit1K .text.MifareClassicAppInit4K - 0x000027aa 0x1a Bin/MifareClassic.o - 0x000027aa MifareClassicAppInit4K + 0x0000261c 0x1a Bin/MifareClassic.o + 0x0000261c MifareClassicAppInit4K .text.MifareClassicAppReset - 0x000027c4 0x8 Bin/MifareClassic.o - 0x000027c4 MifareClassicAppReset + 0x00002636 0x8 Bin/MifareClassic.o + 0x00002636 MifareClassicAppReset .text.MifareClassicAppTask - 0x000027cc 0x2 Bin/MifareClassic.o - 0x000027cc MifareClassicAppTask + 0x0000263e 0x2 Bin/MifareClassic.o + 0x0000263e MifareClassicAppTask .text.MifareClassicAppProcess - 0x000027ce 0x9bc Bin/MifareClassic.o - 0x000027ce MifareClassicAppProcess + 0x00002640 0x8fa Bin/MifareClassic.o + 0x00002640 MifareClassicAppProcess .text.MifareClassicGetUid - 0x0000318a 0xc Bin/MifareClassic.o - 0x0000318a MifareClassicGetUid + 0x00002f3a 0xc Bin/MifareClassic.o + 0x00002f3a MifareClassicGetUid .text.MifareClassicSetUid - 0x00003196 0x42 Bin/MifareClassic.o - 0x00003196 MifareClassicSetUid + 0x00002f46 0x40 Bin/MifareClassic.o + 0x00002f46 MifareClassicSetUid .text.ISO14443AAppendCRCA - 0x000031d8 0x7c Bin/ISO14443-3A.o - 0x000031d8 ISO14443AAppendCRCA + 0x00002f86 0x5e Bin/ISO14443-3A.o + 0x00002f86 ISO14443AAppendCRCA .text.ISO14443ACheckCRCA - 0x00003254 0x9c Bin/ISO14443-3A.o - 0x00003254 ISO14443ACheckCRCA + 0x00002fe4 0x7e Bin/ISO14443-3A.o + 0x00002fe4 ISO14443ACheckCRCA .text.Crypto1LFSR - 0x000032f0 0xce Bin/Crypto1.o + 0x00003062 0x8c Bin/Crypto1.o .text.Crypto1FilterOutput - 0x000033be 0x68 Bin/Crypto1.o - 0x000033be Crypto1FilterOutput + 0x000030ee 0x68 Bin/Crypto1.o + 0x000030ee Crypto1FilterOutput .text.Crypto1Setup - 0x00003426 0x38c Bin/Crypto1.o - 0x00003426 Crypto1Setup + 0x00003156 0x340 Bin/Crypto1.o + 0x00003156 Crypto1Setup .text.Crypto1Auth - 0x000037b2 0x7e Bin/Crypto1.o - 0x000037b2 Crypto1Auth + 0x00003496 0x52 Bin/Crypto1.o + 0x00003496 Crypto1Auth .text.Crypto1Byte - 0x00003830 0x82 Bin/Crypto1.o - 0x00003830 Crypto1Byte + 0x000034e8 0x82 Bin/Crypto1.o + 0x000034e8 Crypto1Byte .text.Crypto1Nibble - 0x000038b2 0x48 Bin/Crypto1.o - 0x000038b2 Crypto1Nibble + 0x0000356a 0x48 Bin/Crypto1.o + 0x0000356a Crypto1Nibble .text.Crypto1PRNG - 0x000038fa 0xfc Bin/Crypto1.o - 0x000038fa Crypto1PRNG + 0x000035b2 0xb6 Bin/Crypto1.o + 0x000035b2 Crypto1PRNG .text.USB_Device_ProcessControlRequest - 0x000039f6 0x2b0 Bin/DeviceStandardReq.o - 0x000039f6 USB_Device_ProcessControlRequest + 0x00003668 0x296 Bin/DeviceStandardReq.o + 0x00003668 USB_Device_ProcessControlRequest .text.USB_Event_Stub - 0x00003ca6 0x2 Bin/Events.o - 0x00003ca6 USB_Event_Stub - 0x00003ca6 EVENT_USB_Device_Suspend - 0x00003ca6 EVENT_USB_Device_StartOfFrame - 0x00003ca6 EVENT_USB_Device_Reset - 0x00003ca6 EVENT_USB_Device_WakeUp + 0x000038fe 0x2 Bin/Events.o + 0x000038fe USB_Event_Stub + 0x000038fe EVENT_USB_Device_Suspend + 0x000038fe EVENT_USB_Device_StartOfFrame + 0x000038fe EVENT_USB_Device_Reset + 0x000038fe EVENT_USB_Device_WakeUp .text.USB_USBTask - 0x00003ca8 0x28 Bin/USBTask.o - 0x00003ca8 USB_USBTask + 0x00003900 0x2a Bin/USBTask.o + 0x00003900 USB_USBTask .text.Endpoint_Write_Stream_LE - 0x00003cd0 0xd8 Bin/EndpointStream_XMEGA.o - 0x00003cd0 Endpoint_Write_Stream_LE + 0x0000392a 0xd8 Bin/EndpointStream_XMEGA.o + 0x0000392a Endpoint_Write_Stream_LE .text.Endpoint_Write_Control_Stream_LE - 0x00003da8 0x14a Bin/EndpointStream_XMEGA.o - 0x00003da8 Endpoint_Write_Control_Stream_LE + 0x00003a02 0x142 Bin/EndpointStream_XMEGA.o + 0x00003a02 Endpoint_Write_Control_Stream_LE .text.Endpoint_Write_Control_PStream_LE - 0x00003ef2 0x160 Bin/EndpointStream_XMEGA.o - 0x00003ef2 Endpoint_Write_Control_PStream_LE + 0x00003b44 0x13e Bin/EndpointStream_XMEGA.o + 0x00003b44 Endpoint_Write_Control_PStream_LE .text.Endpoint_ClearIN - 0x00004052 0x32 Bin/Endpoint_XMEGA.o - 0x00004052 Endpoint_ClearIN + 0x00003c82 0x32 Bin/Endpoint_XMEGA.o + 0x00003c82 Endpoint_ClearIN .text.Endpoint_ClearOUT - 0x00004084 0x1e Bin/Endpoint_XMEGA.o - 0x00004084 Endpoint_ClearOUT + 0x00003cb4 0x1e Bin/Endpoint_XMEGA.o + 0x00003cb4 Endpoint_ClearOUT .text.Endpoint_Read_8 - 0x000040a2 0x1e Bin/Endpoint_XMEGA.o - 0x000040a2 Endpoint_Read_8 + 0x00003cd2 0x1e Bin/Endpoint_XMEGA.o + 0x00003cd2 Endpoint_Read_8 .text.Endpoint_Write_8 - 0x000040c0 0x1e Bin/Endpoint_XMEGA.o - 0x000040c0 Endpoint_Write_8 + 0x00003cf0 0x1e Bin/Endpoint_XMEGA.o + 0x00003cf0 Endpoint_Write_8 .text.Endpoint_SelectEndpoint - 0x000040de 0x78 Bin/Endpoint_XMEGA.o - 0x000040de Endpoint_SelectEndpoint + 0x00003d0e 0x72 Bin/Endpoint_XMEGA.o + 0x00003d0e Endpoint_SelectEndpoint .text.Endpoint_StallTransaction - 0x00004156 0x38 Bin/Endpoint_XMEGA.o - 0x00004156 Endpoint_StallTransaction + 0x00003d80 0x38 Bin/Endpoint_XMEGA.o + 0x00003d80 Endpoint_StallTransaction .text.Endpoint_ClearSETUP - 0x0000418e 0x58 Bin/Endpoint_XMEGA.o - 0x0000418e Endpoint_ClearSETUP + 0x00003db8 0x58 Bin/Endpoint_XMEGA.o + 0x00003db8 Endpoint_ClearSETUP .text.Endpoint_IsSETUPReceived - 0x000041e6 0x30 Bin/Endpoint_XMEGA.o - 0x000041e6 Endpoint_IsSETUPReceived + 0x00003e10 0x32 Bin/Endpoint_XMEGA.o + 0x00003e10 Endpoint_IsSETUPReceived .text.Endpoint_IsOUTReceived - 0x00004216 0x30 Bin/Endpoint_XMEGA.o - 0x00004216 Endpoint_IsOUTReceived + 0x00003e42 0x32 Bin/Endpoint_XMEGA.o + 0x00003e42 Endpoint_IsOUTReceived .text.Endpoint_IsINReady - 0x00004246 0x1a Bin/Endpoint_XMEGA.o - 0x00004246 Endpoint_IsINReady + 0x00003e74 0x18 Bin/Endpoint_XMEGA.o + 0x00003e74 Endpoint_IsINReady .text.Endpoint_ConfigureEndpoint_PRV - 0x00004260 0x9a Bin/Endpoint_XMEGA.o - 0x00004260 Endpoint_ConfigureEndpoint_PRV + 0x00003e8c 0x9a Bin/Endpoint_XMEGA.o + 0x00003e8c Endpoint_ConfigureEndpoint_PRV .text.Endpoint_ConfigureEndpointTable - 0x000042fa 0xd8 Bin/Endpoint_XMEGA.o - 0x000042fa Endpoint_ConfigureEndpointTable + 0x00003f26 0xec Bin/Endpoint_XMEGA.o + 0x00003f26 Endpoint_ConfigureEndpointTable .text.Endpoint_ClearEndpoints - 0x000043d2 0x70 Bin/Endpoint_XMEGA.o - 0x000043d2 Endpoint_ClearEndpoints + 0x00004012 0x70 Bin/Endpoint_XMEGA.o + 0x00004012 Endpoint_ClearEndpoints .text.Endpoint_ClearStatusStage - 0x00004442 0x2c Bin/Endpoint_XMEGA.o - 0x00004442 Endpoint_ClearStatusStage + 0x00004082 0x2c Bin/Endpoint_XMEGA.o + 0x00004082 Endpoint_ClearStatusStage .text.Endpoint_WaitUntilReady - 0x0000446e 0xa2 Bin/Endpoint_XMEGA.o - 0x0000446e Endpoint_WaitUntilReady + 0x000040ae 0xa6 Bin/Endpoint_XMEGA.o + 0x000040ae Endpoint_WaitUntilReady .text.USB_Disable - 0x00004510 0x1a Bin/USBController_XMEGA.o - 0x00004510 USB_Disable + 0x00004154 0x1a Bin/USBController_XMEGA.o + 0x00004154 USB_Disable .text.USB_ResetInterface - 0x0000452a 0x5c Bin/USBController_XMEGA.o - 0x0000452a USB_ResetInterface + 0x0000416e 0x5c Bin/USBController_XMEGA.o + 0x0000416e USB_ResetInterface .text.USB_Init - 0x00004586 0x54 Bin/USBController_XMEGA.o - 0x00004586 USB_Init + 0x000041ca 0x52 Bin/USBController_XMEGA.o + 0x000041ca USB_Init .text.USB_INT_DisableAllInterrupts - 0x000045da 0xe Bin/USBInterrupt_XMEGA.o - 0x000045da USB_INT_DisableAllInterrupts + 0x0000421c 0xe Bin/USBInterrupt_XMEGA.o + 0x0000421c USB_INT_DisableAllInterrupts .text.USB_INT_ClearAllInterrupts - 0x000045e8 0xc Bin/USBInterrupt_XMEGA.o - 0x000045e8 USB_INT_ClearAllInterrupts + 0x0000422a 0xc Bin/USBInterrupt_XMEGA.o + 0x0000422a USB_INT_ClearAllInterrupts .text.__vector_125 - 0x000045f4 0xe0 Bin/USBInterrupt_XMEGA.o - 0x000045f4 __vector_125 - .text.CDC_Device_ProcessControlRequest - 0x000046d4 0x156 Bin/CDCClassDevice.o - 0x000046d4 CDC_Device_ProcessControlRequest + 0x00004236 0xda Bin/USBInterrupt_XMEGA.o + 0x00004236 __vector_125 .text.CDC_Device_ConfigureEndpoints - 0x0000482a 0x4c Bin/CDCClassDevice.o - 0x0000482a CDC_Device_ConfigureEndpoints + 0x00004310 0x4a Bin/CDCClassDevice.o + 0x00004310 CDC_Device_ConfigureEndpoints .text.CDC_Device_SendString - 0x00004876 0x48 Bin/CDCClassDevice.o - 0x00004876 CDC_Device_SendString + 0x0000435a 0x52 Bin/CDCClassDevice.o + 0x0000435a CDC_Device_SendString .text.CDC_Device_SendData - 0x000048be 0x44 Bin/CDCClassDevice.o - 0x000048be CDC_Device_SendData + 0x000043ac 0x54 Bin/CDCClassDevice.o + 0x000043ac CDC_Device_SendData .text.CDC_Device_SendByte - 0x00004902 0x56 Bin/CDCClassDevice.o - 0x00004902 CDC_Device_SendByte + 0x00004400 0x6e Bin/CDCClassDevice.o + 0x00004400 CDC_Device_SendByte .text.CDC_Device_Flush - 0x00004958 0x92 Bin/CDCClassDevice.o - 0x00004958 CDC_Device_Flush + 0x0000446e 0x90 Bin/CDCClassDevice.o + 0x0000446e CDC_Device_Flush .text.CDC_Device_USBTask - 0x000049ea 0x34 Bin/CDCClassDevice.o - 0x000049ea CDC_Device_USBTask + 0x000044fe 0x36 Bin/CDCClassDevice.o + 0x000044fe CDC_Device_USBTask .text.CDC_Device_ReceiveByte - 0x00004a1e 0xca Bin/CDCClassDevice.o - 0x00004a1e CDC_Device_ReceiveByte + 0x00004534 0xbe Bin/CDCClassDevice.o + 0x00004534 CDC_Device_ReceiveByte .text.CDC_Device_Event_Stub - 0x00004ae8 0x2 Bin/CDCClassDevice.o - 0x00004ae8 EVENT_CDC_Device_ControLineStateChanged - 0x00004ae8 EVENT_CDC_Device_BreakSent - 0x00004ae8 CDC_Device_Event_Stub - 0x00004ae8 EVENT_CDC_Device_LineEncodingChanged - .text.libgcc 0x00004aea 0x3e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - 0x00004aea __mulsi3 + 0x000045f2 0x2 Bin/CDCClassDevice.o + 0x000045f2 EVENT_CDC_Device_ControLineStateChanged + 0x000045f2 EVENT_CDC_Device_BreakSent + 0x000045f2 CDC_Device_Event_Stub + 0x000045f2 EVENT_CDC_Device_LineEncodingChanged + .text.CDC_Device_ProcessControlRequest + 0x000045f4 0x13a Bin/CDCClassDevice.o + 0x000045f4 CDC_Device_ProcessControlRequest + .text.libgcc.mul + 0x0000472e 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + 0x0000472e __mulshisi3 + 0x00004732 __mulohisi3 + .text.libgcc.mul + 0x0000473a 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + 0x0000473a __muluhisi3 + .text.libgcc.mul + 0x0000474e 0x18 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + 0x0000474e __umulhisi3 .text.avr-libc - 0x00004b28 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0x00004bc6 rand_r - 0x00004bc8 rand - 0x00004bce srand + 0x00004766 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + 0x000047fc rand_r + 0x000047fe rand + 0x00004804 srand .text.avr-libc - 0x00004be4 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - 0x00004be4 memcpy_P + 0x0000481a 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + 0x0000481a memcpy_P .text.avr-libc - 0x00004bf6 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - 0x00004bf6 strcmp_P + 0x0000482c 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + 0x0000482c strcmp_P .text.avr-libc - 0x00004c08 0x1e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - 0x00004c08 strncpy_P + 0x0000483e 0x1e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + 0x0000483e strncpy_P .text.avr-libc - 0x00004c26 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - 0x00004c26 memcpy + 0x0000485c 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + 0x0000485c memcpy .text.avr-libc - 0x00004c38 0x5a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x00004c38 snprintf_P + 0x0000486e 0x5a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + 0x0000486e snprintf_P .text.avr-libc - 0x00004c92 0x39e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x00004c92 vfprintf + 0x000048c8 0x39a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + 0x000048c8 vfprintf .text.avr-libc - 0x00005030 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - 0x00005030 __eerd_block_x32a4u + 0x00004c62 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + 0x00004c62 __eerd_block_x32a4u .text.avr-libc - 0x00005046 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - 0x00005046 __eewr_block_x32a4u + 0x00004c78 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + 0x00004c78 __eewr_block_x32a4u .text.avr-libc - 0x00005058 0x46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - 0x00005058 __eewr_byte_x32a4u - 0x0000505a __eewr_r18_x32a4u + 0x00004c8a 0x46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + 0x00004c8a __eewr_byte_x32a4u + 0x00004c8c __eewr_r18_x32a4u .text.avr-libc - 0x0000509e 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - 0x0000509e strnlen_P + 0x00004cd0 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + 0x00004cd0 strnlen_P .text.avr-libc - 0x000050b4 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - 0x000050b4 strnlen + 0x00004ce6 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + 0x00004ce6 strnlen .text.avr-libc - 0x000050ca 0x58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0x000050ca fputc + 0x00004cfc 0x58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + 0x00004cfc fputc .text.avr-libc - 0x00005122 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - 0x00005122 __ultoa_invert - .text.libgcc 0x000051de 0x36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - 0x000051de __divmodsi4 - .text.libgcc 0x00005214 0x32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - 0x00005214 __prologue_saves__ - .text.libgcc 0x00005246 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - 0x00005246 __epilogue_restores__ - .text.libgcc 0x00005276 0x44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) - 0x00005276 __udivmodsi4 - 0x000052ba . = ALIGN (0x2) + 0x00004d54 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + 0x00004d54 __ultoa_invert + .text.libgcc.div + 0x00004e10 0x36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00004e10 __divmodsi4 + .text.libgcc.prologue + 0x00004e46 0x32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + 0x00004e46 __prologue_saves__ + .text.libgcc.prologue + 0x00004e78 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + 0x00004e78 __epilogue_restores__ + .text.libgcc.div + 0x00004ea8 0x44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00004ea8 __udivmodsi4 + 0x00004eec . = ALIGN (0x2) *(.fini9) - .fini9 0x000052ba 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - 0x000052ba _exit - 0x000052ba exit + .fini9 0x00004eec 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + 0x00004eec _exit + 0x00004eec exit *(.fini9) *(.fini8) *(.fini8) @@ -1234,14 +1365,14 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg *(.fini1) *(.fini1) *(.fini0) - .fini0 0x000052ba 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) + .fini0 0x00004eec 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) *(.fini0) - 0x000052be _etext = . + 0x00004ef0 _etext = . -.data 0x00802000 0xa2 load address 0x000052be +.data 0x00802000 0x92 load address 0x00004ef0 0x00802000 PROVIDE (__data_start, .) *(.data) - .data 0x00802000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .data 0x00802000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o .data 0x00802000 0x0 Bin/Chameleon-Mini.o .data 0x00802000 0x0 Bin/LUFADescriptors.o .data 0x00802000 0x0 Bin/System.o @@ -1254,127 +1385,133 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .data 0x00802000 0x0 Bin/LED.o .data 0x00802000 0x1c Bin/Terminal.o 0x00802000 TerminalHandle - .data 0x0080201c 0x1 Bin/Commands.o - .data 0x0080201d 0x0 Bin/XModem.o - .data 0x0080201d 0x0 Bin/CommandLine.o - .data 0x0080201d 0x0 Bin/Codec.o - .data 0x0080201d 0x0 Bin/ISO14443-2A.o - .data 0x0080201d 0x0 Bin/MifareClassic.o - .data 0x0080201d 0x0 Bin/ISO14443-3A.o - .data 0x0080201d 0x70 Bin/Crypto1.o - .data 0x0080208d 0x0 Bin/HIDParser.o - .data 0x0080208d 0x0 Bin/ConfigDescriptors.o - .data 0x0080208d 0x0 Bin/DeviceStandardReq.o - .data 0x0080208d 0x0 Bin/Events.o - .data 0x0080208d 0x0 Bin/HostStandardReq.o - .data 0x0080208d 0x0 Bin/USBTask.o - .data 0x0080208d 0x0 Bin/Device_XMEGA.o - .data 0x0080208d 0x0 Bin/EndpointStream_XMEGA.o - .data 0x0080208d 0x0 Bin/Endpoint_XMEGA.o - .data 0x0080208d 0x0 Bin/Host_XMEGA.o - .data 0x0080208d 0x0 Bin/PipeStream_XMEGA.o - .data 0x0080208d 0x0 Bin/Pipe_XMEGA.o - .data 0x0080208d 0x0 Bin/USBController_XMEGA.o - .data 0x0080208d 0x0 Bin/USBInterrupt_XMEGA.o - .data 0x0080208d 0x0 Bin/AudioClassDevice.o - .data 0x0080208d 0x8 Bin/CDCClassDevice.o - .data 0x00802095 0x0 Bin/HIDClassDevice.o - .data 0x00802095 0x0 Bin/MassStorageClassDevice.o - .data 0x00802095 0x0 Bin/MIDIClassDevice.o - .data 0x00802095 0x0 Bin/PrinterClassDevice.o - .data 0x00802095 0x8 Bin/RNDISClassDevice.o - .data 0x0080209d 0x0 Bin/AndroidAccessoryClassHost.o - .data 0x0080209d 0x0 Bin/AudioClassHost.o - .data 0x0080209d 0x0 Bin/CDCClassHost.o - .data 0x0080209d 0x0 Bin/HIDClassHost.o - .data 0x0080209d 0x0 Bin/MassStorageClassHost.o - .data 0x0080209d 0x0 Bin/MIDIClassHost.o - .data 0x0080209d 0x0 Bin/PrinterClassHost.o - .data 0x0080209d 0x0 Bin/RNDISClassHost.o - .data 0x0080209d 0x0 Bin/StillImageClassHost.o - .data 0x0080209d 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - .data 0x0080209d 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .data 0x0080209d 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .data 0x0080209d 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .data 0x0080209d 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - .data 0x008020a1 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .data 0x0080201c 0x0 Bin/Commands.o + .data 0x0080201c 0x0 Bin/XModem.o + .data 0x0080201c 0x0 Bin/CommandLine.o + .data 0x0080201c 0x0 Bin/Codec.o + .data 0x0080201c 0x0 Bin/ISO14443-2A.o + .data 0x0080201c 0x0 Bin/MifareClassic.o + .data 0x0080201c 0x0 Bin/ISO14443-3A.o + .data 0x0080201c 0x0 Bin/Crypto1.o + .data 0x0080201c 0x0 Bin/HIDParser.o + .data 0x0080201c 0x0 Bin/ConfigDescriptors.o + .data 0x0080201c 0x0 Bin/DeviceStandardReq.o + .data 0x0080201c 0x0 Bin/Events.o + .data 0x0080201c 0x0 Bin/HostStandardReq.o + .data 0x0080201c 0x0 Bin/USBTask.o + .data 0x0080201c 0x0 Bin/Device_XMEGA.o + .data 0x0080201c 0x0 Bin/EndpointStream_XMEGA.o + .data 0x0080201c 0x0 Bin/Endpoint_XMEGA.o + .data 0x0080201c 0x0 Bin/Host_XMEGA.o + .data 0x0080201c 0x0 Bin/PipeStream_XMEGA.o + .data 0x0080201c 0x0 Bin/Pipe_XMEGA.o + .data 0x0080201c 0x0 Bin/USBController_XMEGA.o + .data 0x0080201c 0x0 Bin/USBInterrupt_XMEGA.o + .data 0x0080201c 0x0 Bin/AudioClassDevice.o + .data 0x0080201c 0x0 Bin/CDCClassDevice.o + .data 0x0080201c 0x0 Bin/HIDClassDevice.o + .data 0x0080201c 0x0 Bin/MassStorageClassDevice.o + .data 0x0080201c 0x0 Bin/MIDIClassDevice.o + .data 0x0080201c 0x0 Bin/PrinterClassDevice.o + .data 0x0080201c 0x0 Bin/RNDISClassDevice.o + .data 0x0080201c 0x0 Bin/AndroidAccessoryClassHost.o + .data 0x0080201c 0x0 Bin/AudioClassHost.o + .data 0x0080201c 0x0 Bin/CDCClassHost.o + .data 0x0080201c 0x0 Bin/HIDClassHost.o + .data 0x0080201c 0x0 Bin/MassStorageClassHost.o + .data 0x0080201c 0x0 Bin/MIDIClassHost.o + .data 0x0080201c 0x0 Bin/PrinterClassHost.o + .data 0x0080201c 0x0 Bin/RNDISClassHost.o + .data 0x0080201c 0x0 Bin/StillImageClassHost.o + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + .data 0x0080201c 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) *(.data*) *(.rodata) + .rodata 0x00802020 0x70 Bin/Crypto1.o *(.rodata*) + .rodata.str1.1 + 0x00802090 0x1 Bin/Commands.o *(.gnu.linkonce.d*) - 0x008020a2 . = ALIGN (0x2) - *fill* 0x008020a1 0x1 00 - 0x008020a2 _edata = . - 0x008020a2 PROVIDE (__data_end, .) + 0x00802092 . = ALIGN (0x2) + *fill* 0x00802091 0x1 + 0x00802092 _edata = . + 0x00802092 PROVIDE (__data_end, .) -.bss 0x008020a2 0x60b - 0x008020a2 PROVIDE (__bss_start, .) +.bss 0x00802092 0x60b + 0x00802092 PROVIDE (__bss_start, .) *(.bss) - .bss 0x008020a2 0x1 Bin/Button.o - .bss 0x008020a3 0x1 Bin/LED.o - 0x008020a3 LEDPulseMask - .bss 0x008020a4 0x1 Bin/Terminal.o - 0x008020a4 TerminalState - .bss 0x008020a5 0xe Bin/XModem.o - .bss 0x008020b3 0x2 Bin/CommandLine.o - .bss 0x008020b5 0x10 Bin/ISO14443-2A.o - .bss 0x008020c5 0x1d Bin/MifareClassic.o - .bss 0x008020e2 0x6 Bin/Crypto1.o + .bss 0x00802092 0x1 Bin/Button.o + .bss 0x00802093 0x1 Bin/LED.o + 0x00802093 LEDPulseMask + .bss 0x00802094 0x1 Bin/Terminal.o + 0x00802094 TerminalState + .bss 0x00802095 0xe Bin/XModem.o + .bss 0x008020a3 0x2 Bin/CommandLine.o + .bss 0x008020a5 0x10 Bin/ISO14443-2A.o + .bss 0x008020b5 0x1d Bin/MifareClassic.o + .bss 0x008020d2 0x6 Bin/Crypto1.o *(.bss*) *(COMMON) - COMMON 0x008020e8 0x25 Bin/Configuration.o - 0x008020e8 ActiveConfiguration - COMMON 0x0080210d 0x13 Bin/Settings.o - 0x0080210d GlobalSettings - COMMON 0x00802120 0x100 Bin/Terminal.o - 0x00802120 TerminalBuffer - COMMON 0x00802220 0x100 Bin/Codec.o - 0x00802220 CodecBuffer - COMMON 0x00802320 0x3 Bin/DeviceStandardReq.o - 0x00802320 USB_Device_ConfigurationNumber - 0x00802321 USB_Device_CurrentlySelfPowered - 0x00802322 USB_Device_RemoteWakeupEnabled - COMMON 0x00802323 0xa Bin/USBTask.o - 0x00802323 USB_IsInitialized - 0x00802324 USB_DeviceState - 0x00802325 USB_ControlRequest - COMMON 0x0080232d 0x31d Bin/Endpoint_XMEGA.o - 0x0080232d USB_Endpoint_SelectedFIFO - 0x0080232f USB_Endpoint_SelectedHandle - 0x00802331 USB_Endpoint_SelectedEndpoint - 0x00802332 USB_Endpoint_FIFOs - COMMON 0x0080264a 0x63 Bin/USBController_XMEGA.o - 0x0080264a USB_EndpointTable - 0x008026ad PROVIDE (__bss_end, .) - 0x000052be __data_load_start = LOADADDR (.data) - 0x00005360 __data_load_end = (__data_load_start + SIZEOF (.data)) + COMMON 0x008020d8 0x25 Bin/Configuration.o + 0x008020d8 ActiveConfiguration + COMMON 0x008020fd 0x13 Bin/Settings.o + 0x008020fd GlobalSettings + COMMON 0x00802110 0x100 Bin/Terminal.o + 0x00802110 TerminalBuffer + COMMON 0x00802210 0x100 Bin/Codec.o + 0x00802210 CodecBuffer + COMMON 0x00802310 0x3 Bin/DeviceStandardReq.o + 0x00802310 USB_Device_ConfigurationNumber + 0x00802311 USB_Device_CurrentlySelfPowered + 0x00802312 USB_Device_RemoteWakeupEnabled + COMMON 0x00802313 0xa Bin/USBTask.o + 0x00802313 USB_IsInitialized + 0x00802314 USB_DeviceState + 0x00802315 USB_ControlRequest + COMMON 0x0080231d 0x31d Bin/Endpoint_XMEGA.o + 0x0080231d USB_Endpoint_SelectedFIFO + 0x0080231f USB_Endpoint_SelectedHandle + 0x00802321 USB_Endpoint_SelectedEndpoint + 0x00802322 USB_Endpoint_FIFOs + COMMON 0x0080263a 0x63 Bin/USBController_XMEGA.o + 0x0080263a USB_EndpointTable + 0x0080269d PROVIDE (__bss_end, .) + 0x00004ef0 __data_load_start = LOADADDR (.data) + 0x00004f82 __data_load_end = (__data_load_start + SIZEOF (.data)) -.noinit 0x008026ad 0x0 - 0x008026ad PROVIDE (__noinit_start, .) +.noinit 0x0080269d 0x0 + 0x0080269d PROVIDE (__noinit_start, .) *(.noinit*) - 0x008026ad PROVIDE (__noinit_end, .) - 0x008026ad _end = . - 0x008026ad PROVIDE (__heap_start, .) + 0x0080269d PROVIDE (__noinit_end, .) + 0x0080269d _end = . + 0x0080269d PROVIDE (__heap_start, .) .eeprom 0x00810000 0x13 *(.eeprom*) @@ -1394,41 +1531,44 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .signature *(.signature*) +.user_signatures + *(.user_signatures*) + .stab 0x00000000 0x14d0 *(.stab) - .stab 0x00000000 0x6cc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - .stab 0x000006cc 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .stab 0x00000000 0x6cc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .stab 0x000006cc 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) 0x90 (size before relaxing) - .stab 0x00000750 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .stab 0x00000750 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) 0x90 (size before relaxing) - .stab 0x000007d4 0xcc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .stab 0x000007d4 0xcc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) 0xd8 (size before relaxing) - .stab 0x000008a0 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .stab 0x000008a0 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) 0xc0 (size before relaxing) - .stab 0x00000954 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .stab 0x00000954 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) 0x90 (size before relaxing) - .stab 0x000009d8 0x6c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .stab 0x000009d8 0x6c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) 0x78 (size before relaxing) - .stab 0x00000a44 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .stab 0x00000a44 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) 0xc0 (size before relaxing) - .stab 0x00000af8 0xfc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .stab 0x00000af8 0xfc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) 0x108 (size before relaxing) - .stab 0x00000bf4 0xa8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .stab 0x00000bf4 0xa8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) 0xb4 (size before relaxing) - .stab 0x00000c9c 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .stab 0x00000c9c 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) 0xa8 (size before relaxing) - .stab 0x00000d38 0x1e0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .stab 0x00000d38 0x1e0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) 0x1ec (size before relaxing) - .stab 0x00000f18 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .stab 0x00000f18 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) 0xa8 (size before relaxing) - .stab 0x00000fb4 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .stab 0x00000fb4 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) 0xa8 (size before relaxing) - .stab 0x00001050 0x480 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .stab 0x00001050 0x480 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) 0x48c (size before relaxing) -.stabstr 0x00000000 0x601 +.stabstr 0x00000000 0x70f *(.stabstr) - .stabstr 0x00000000 0x601 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .stabstr 0x00000000 0x70f c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o .stab.excl *(.stab.excl) @@ -1442,8 +1582,62 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .stab.indexstr *(.stab.indexstr) -.comment +.comment 0x00000000 0x2f *(.comment) + .comment 0x00000000 0x2f Bin/Chameleon-Mini.o + 0x30 (size before relaxing) + .comment 0x00000000 0x30 Bin/LUFADescriptors.o + .comment 0x00000000 0x30 Bin/System.o + .comment 0x00000000 0x30 Bin/Configuration.o + .comment 0x00000000 0x30 Bin/Random.o + .comment 0x00000000 0x30 Bin/Common.o + .comment 0x00000000 0x30 Bin/Memory.o + .comment 0x00000000 0x30 Bin/Button.o + .comment 0x00000000 0x30 Bin/Settings.o + .comment 0x00000000 0x30 Bin/LED.o + .comment 0x00000000 0x30 Bin/Terminal.o + .comment 0x00000000 0x30 Bin/Commands.o + .comment 0x00000000 0x30 Bin/XModem.o + .comment 0x00000000 0x30 Bin/CommandLine.o + .comment 0x00000000 0x30 Bin/Codec.o + .comment 0x00000000 0x30 Bin/ISO14443-2A.o + .comment 0x00000000 0x30 Bin/MifareClassic.o + .comment 0x00000000 0x30 Bin/ISO14443-3A.o + .comment 0x00000000 0x30 Bin/Crypto1.o + .comment 0x00000000 0x30 Bin/HIDParser.o + .comment 0x00000000 0x30 Bin/ConfigDescriptors.o + .comment 0x00000000 0x30 Bin/DeviceStandardReq.o + .comment 0x00000000 0x30 Bin/Events.o + .comment 0x00000000 0x30 Bin/HostStandardReq.o + .comment 0x00000000 0x30 Bin/USBTask.o + .comment 0x00000000 0x30 Bin/Device_XMEGA.o + .comment 0x00000000 0x30 Bin/EndpointStream_XMEGA.o + .comment 0x00000000 0x30 Bin/Endpoint_XMEGA.o + .comment 0x00000000 0x30 Bin/Host_XMEGA.o + .comment 0x00000000 0x30 Bin/PipeStream_XMEGA.o + .comment 0x00000000 0x30 Bin/Pipe_XMEGA.o + .comment 0x00000000 0x30 Bin/USBController_XMEGA.o + .comment 0x00000000 0x30 Bin/USBInterrupt_XMEGA.o + .comment 0x00000000 0x30 Bin/AudioClassDevice.o + .comment 0x00000000 0x30 Bin/CDCClassDevice.o + .comment 0x00000000 0x30 Bin/HIDClassDevice.o + .comment 0x00000000 0x30 Bin/MassStorageClassDevice.o + .comment 0x00000000 0x30 Bin/MIDIClassDevice.o + .comment 0x00000000 0x30 Bin/PrinterClassDevice.o + .comment 0x00000000 0x30 Bin/RNDISClassDevice.o + .comment 0x00000000 0x30 Bin/AndroidAccessoryClassHost.o + .comment 0x00000000 0x30 Bin/AudioClassHost.o + .comment 0x00000000 0x30 Bin/CDCClassHost.o + .comment 0x00000000 0x30 Bin/HIDClassHost.o + .comment 0x00000000 0x30 Bin/MassStorageClassHost.o + .comment 0x00000000 0x30 Bin/MIDIClassHost.o + .comment 0x00000000 0x30 Bin/PrinterClassHost.o + .comment 0x00000000 0x30 Bin/RNDISClassHost.o + .comment 0x00000000 0x30 Bin/StillImageClassHost.o + .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) .debug *(.debug) @@ -1457,7 +1651,7 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .debug_sfnames *(.debug_sfnames) -.debug_aranges 0x00000000 0xb78 +.debug_aranges 0x00000000 0xbe0 *(.debug_aranges) .debug_aranges 0x00000000 0x20 Bin/Chameleon-Mini.o @@ -1478,509 +1672,506 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .debug_aranges 0x000001f8 0x50 Bin/Settings.o .debug_aranges - 0x00000248 0x68 Bin/Terminal.o + 0x00000248 0x18 Bin/LED.o .debug_aranges - 0x000002b0 0xc8 Bin/Commands.o + 0x00000260 0x68 Bin/Terminal.o .debug_aranges - 0x00000378 0x40 Bin/XModem.o + 0x000002c8 0xc8 Bin/Commands.o .debug_aranges - 0x000003b8 0x30 Bin/CommandLine.o + 0x00000390 0x40 Bin/XModem.o .debug_aranges - 0x000003e8 0x48 Bin/ISO14443-2A.o + 0x000003d0 0x30 Bin/CommandLine.o .debug_aranges - 0x00000430 0x50 Bin/MifareClassic.o + 0x00000400 0x18 Bin/Codec.o .debug_aranges - 0x00000480 0x28 Bin/ISO14443-3A.o + 0x00000418 0x48 Bin/ISO14443-2A.o .debug_aranges - 0x000004a8 0x50 Bin/Crypto1.o + 0x00000460 0x50 Bin/MifareClassic.o .debug_aranges - 0x000004f8 0x38 Bin/HIDParser.o + 0x000004b0 0x28 Bin/ISO14443-3A.o .debug_aranges - 0x00000530 0x38 Bin/ConfigDescriptors.o + 0x000004d8 0x50 Bin/Crypto1.o .debug_aranges - 0x00000568 0x20 Bin/DeviceStandardReq.o + 0x00000528 0x38 Bin/HIDParser.o .debug_aranges - 0x00000588 0x20 Bin/Events.o + 0x00000560 0x38 Bin/ConfigDescriptors.o .debug_aranges - 0x000005a8 0x20 Bin/USBTask.o + 0x00000598 0x20 Bin/DeviceStandardReq.o .debug_aranges - 0x000005c8 0x20 Bin/Device_XMEGA.o + 0x000005b8 0x20 Bin/Events.o .debug_aranges - 0x000005e8 0xc8 Bin/EndpointStream_XMEGA.o + 0x000005d8 0x18 Bin/HostStandardReq.o .debug_aranges - 0x000006b0 0x90 Bin/Endpoint_XMEGA.o + 0x000005f0 0x20 Bin/USBTask.o .debug_aranges - 0x00000740 0x30 Bin/USBController_XMEGA.o + 0x00000610 0x20 Bin/Device_XMEGA.o .debug_aranges - 0x00000770 0x30 Bin/USBInterrupt_XMEGA.o + 0x00000630 0xc8 Bin/EndpointStream_XMEGA.o .debug_aranges - 0x000007a0 0x30 Bin/AudioClassDevice.o + 0x000006f8 0x90 Bin/Endpoint_XMEGA.o .debug_aranges - 0x000007d0 0x98 Bin/CDCClassDevice.o + 0x00000788 0x18 Bin/Host_XMEGA.o .debug_aranges - 0x00000868 0x30 Bin/HIDClassDevice.o + 0x000007a0 0x18 Bin/PipeStream_XMEGA.o .debug_aranges - 0x00000898 0x30 Bin/MassStorageClassDevice.o + 0x000007b8 0x18 Bin/Pipe_XMEGA.o .debug_aranges - 0x000008c8 0x40 Bin/MIDIClassDevice.o + 0x000007d0 0x30 Bin/USBController_XMEGA.o .debug_aranges - 0x00000908 0x90 Bin/PrinterClassDevice.o + 0x00000800 0x30 Bin/USBInterrupt_XMEGA.o .debug_aranges - 0x00000998 0x48 Bin/RNDISClassDevice.o + 0x00000830 0x30 Bin/AudioClassDevice.o .debug_aranges - 0x000009e0 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) + 0x00000860 0x98 Bin/CDCClassDevice.o .debug_aranges - 0x00000a00 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) + 0x000008f8 0x30 Bin/HIDClassDevice.o .debug_aranges - 0x00000a20 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000928 0x30 Bin/MassStorageClassDevice.o .debug_aranges - 0x00000a40 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x00000958 0x40 Bin/MIDIClassDevice.o .debug_aranges - 0x00000a60 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + 0x00000998 0x90 Bin/PrinterClassDevice.o .debug_aranges - 0x00000a98 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + 0x00000a28 0x48 Bin/RNDISClassDevice.o .debug_aranges - 0x00000ab8 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + 0x00000a70 0x18 Bin/AndroidAccessoryClassHost.o .debug_aranges - 0x00000ad8 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + 0x00000a88 0x18 Bin/AudioClassHost.o .debug_aranges - 0x00000af8 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00000aa0 0x18 Bin/CDCClassHost.o .debug_aranges - 0x00000b18 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) + 0x00000ab8 0x18 Bin/HIDClassHost.o .debug_aranges - 0x00000b38 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) + 0x00000ad0 0x18 Bin/MassStorageClassHost.o .debug_aranges - 0x00000b58 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00000ae8 0x18 Bin/MIDIClassHost.o + .debug_aranges + 0x00000b00 0x18 Bin/PrinterClassHost.o + .debug_aranges + 0x00000b18 0x18 Bin/RNDISClassHost.o + .debug_aranges + 0x00000b30 0x18 Bin/StillImageClassHost.o + .debug_aranges + 0x00000b48 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_aranges + 0x00000b80 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_aranges + 0x00000ba0 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_aranges + 0x00000bc0 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) .debug_pubnames *(.debug_pubnames) -.debug_info 0x00000000 0x159d0 +.debug_info 0x00000000 0x19186 *(.debug_info) - .debug_info 0x00000000 0x12ec Bin/Chameleon-Mini.o - .debug_info 0x000012ec 0x9cb Bin/LUFADescriptors.o - .debug_info 0x00001cb7 0xdc3 Bin/System.o - .debug_info 0x00002a7a 0x5c0 Bin/Configuration.o - .debug_info 0x0000303a 0x106 Bin/Random.o - .debug_info 0x00003140 0x1ad Bin/Common.o - .debug_info 0x000032ed 0xf4c Bin/Memory.o - .debug_info 0x00004239 0x7e1 Bin/Button.o - .debug_info 0x00004a1a 0x40e Bin/Settings.o - .debug_info 0x00004e28 0x88 Bin/LED.o - .debug_info 0x00004eb0 0x8f9 Bin/Terminal.o - .debug_info 0x000057a9 0x13fd Bin/Commands.o - .debug_info 0x00006ba6 0x89d Bin/XModem.o - .debug_info 0x00007443 0x953 Bin/CommandLine.o - .debug_info 0x00007d96 0x1ff Bin/Codec.o - .debug_info 0x00007f95 0x185a Bin/ISO14443-2A.o - .debug_info 0x000097ef 0x8eb Bin/MifareClassic.o - .debug_info 0x0000a0da 0x170 Bin/ISO14443-3A.o - .debug_info 0x0000a24a 0x3b3 Bin/Crypto1.o - .debug_info 0x0000a5fd 0x6f4 Bin/HIDParser.o - .debug_info 0x0000acf1 0x5a4 Bin/ConfigDescriptors.o - .debug_info 0x0000b295 0xf1b Bin/DeviceStandardReq.o - .debug_info 0x0000c1b0 0x77 Bin/Events.o - .debug_info 0x0000c227 0x5e Bin/HostStandardReq.o - .debug_info 0x0000c285 0x3f2 Bin/USBTask.o - .debug_info 0x0000c677 0x680 Bin/Device_XMEGA.o - .debug_info 0x0000ccf7 0x1100 Bin/EndpointStream_XMEGA.o - .debug_info 0x0000ddf7 0xc66 Bin/Endpoint_XMEGA.o - .debug_info 0x0000ea5d 0x5e Bin/Host_XMEGA.o - .debug_info 0x0000eabb 0x5e Bin/PipeStream_XMEGA.o - .debug_info 0x0000eb19 0x5e Bin/Pipe_XMEGA.o - .debug_info 0x0000eb77 0xd06 Bin/USBController_XMEGA.o - .debug_info 0x0000f87d 0x9ee Bin/USBInterrupt_XMEGA.o - .debug_info 0x0001026b 0x6f4 Bin/AudioClassDevice.o - .debug_info 0x0001095f 0xb5b Bin/CDCClassDevice.o - .debug_info 0x000114ba 0xb21 Bin/HIDClassDevice.o - .debug_info 0x00011fdb 0x7dd Bin/MassStorageClassDevice.o - .debug_info 0x000127b8 0x60f Bin/MIDIClassDevice.o - .debug_info 0x00012dc7 0xab2 Bin/PrinterClassDevice.o - .debug_info 0x00013879 0xf61 Bin/RNDISClassDevice.o - .debug_info 0x000147da 0x5e Bin/AndroidAccessoryClassHost.o - .debug_info 0x00014838 0x5e Bin/AudioClassHost.o - .debug_info 0x00014896 0x5e Bin/CDCClassHost.o - .debug_info 0x000148f4 0x5e Bin/HIDClassHost.o - .debug_info 0x00014952 0x5e Bin/MassStorageClassHost.o - .debug_info 0x000149b0 0x5e Bin/MIDIClassHost.o - .debug_info 0x00014a0e 0x5e Bin/PrinterClassHost.o - .debug_info 0x00014a6c 0x5e Bin/RNDISClassHost.o - .debug_info 0x00014aca 0x5e Bin/StillImageClassHost.o - .debug_info 0x00014b28 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - .debug_info 0x00014c0a 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .debug_info 0x00014cec 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .debug_info 0x00014dce 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .debug_info 0x00014eb0 0x120 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_info 0x00014fd0 0x1cf c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_info 0x0001519f 0x342 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_info 0x000154e1 0x167 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .debug_info 0x00015648 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - .debug_info 0x0001572a 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - .debug_info 0x0001580c 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - .debug_info 0x000158ee 0xe2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .debug_info 0x00000000 0x1381 Bin/Chameleon-Mini.o + .debug_info 0x00001381 0x962 Bin/LUFADescriptors.o + .debug_info 0x00001ce3 0xde5 Bin/System.o + .debug_info 0x00002ac8 0x64a Bin/Configuration.o + .debug_info 0x00003112 0x161 Bin/Random.o + .debug_info 0x00003273 0x1b3 Bin/Common.o + .debug_info 0x00003426 0xfb2 Bin/Memory.o + .debug_info 0x000043d8 0xa19 Bin/Button.o + .debug_info 0x00004df1 0x4e3 Bin/Settings.o + .debug_info 0x000052d4 0x7a Bin/LED.o + .debug_info 0x0000534e 0xb73 Bin/Terminal.o + .debug_info 0x00005ec1 0x17f3 Bin/Commands.o + .debug_info 0x000076b4 0x9a3 Bin/XModem.o + .debug_info 0x00008057 0xb66 Bin/CommandLine.o + .debug_info 0x00008bbd 0x1f1 Bin/Codec.o + .debug_info 0x00008dae 0x187e Bin/ISO14443-2A.o + .debug_info 0x0000a62c 0x101c Bin/MifareClassic.o + .debug_info 0x0000b648 0x179 Bin/ISO14443-3A.o + .debug_info 0x0000b7c1 0x53a Bin/Crypto1.o + .debug_info 0x0000bcfb 0x72e Bin/HIDParser.o + .debug_info 0x0000c429 0x5ed Bin/ConfigDescriptors.o + .debug_info 0x0000ca16 0x11d6 Bin/DeviceStandardReq.o + .debug_info 0x0000dbec 0x7f Bin/Events.o + .debug_info 0x0000dc6b 0x5d Bin/HostStandardReq.o + .debug_info 0x0000dcc8 0x435 Bin/USBTask.o + .debug_info 0x0000e0fd 0x670 Bin/Device_XMEGA.o + .debug_info 0x0000e76d 0x19be Bin/EndpointStream_XMEGA.o + .debug_info 0x0001012b 0xcff Bin/Endpoint_XMEGA.o + .debug_info 0x00010e2a 0x5d Bin/Host_XMEGA.o + .debug_info 0x00010e87 0x5d Bin/PipeStream_XMEGA.o + .debug_info 0x00010ee4 0x5d Bin/Pipe_XMEGA.o + .debug_info 0x00010f41 0xd40 Bin/USBController_XMEGA.o + .debug_info 0x00011c81 0xa7b Bin/USBInterrupt_XMEGA.o + .debug_info 0x000126fc 0xa9d Bin/AudioClassDevice.o + .debug_info 0x00013199 0xf93 Bin/CDCClassDevice.o + .debug_info 0x0001412c 0xf91 Bin/HIDClassDevice.o + .debug_info 0x000150bd 0xaa0 Bin/MassStorageClassDevice.o + .debug_info 0x00015b5d 0x7c6 Bin/MIDIClassDevice.o + .debug_info 0x00016323 0xddd Bin/PrinterClassDevice.o + .debug_info 0x00017100 0x1311 Bin/RNDISClassDevice.o + .debug_info 0x00018411 0x5d Bin/AndroidAccessoryClassHost.o + .debug_info 0x0001846e 0x5d Bin/AudioClassHost.o + .debug_info 0x000184cb 0x5d Bin/CDCClassHost.o + .debug_info 0x00018528 0x5d Bin/HIDClassHost.o + .debug_info 0x00018585 0x5d Bin/MassStorageClassHost.o + .debug_info 0x000185e2 0x5d Bin/MIDIClassHost.o + .debug_info 0x0001863f 0x5d Bin/PrinterClassHost.o + .debug_info 0x0001869c 0x5d Bin/RNDISClassHost.o + .debug_info 0x000186f9 0x5d Bin/StillImageClassHost.o + .debug_info 0x00018756 0x157 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_info 0x000188ad 0x21c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_info 0x00018ac9 0x549 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_info 0x00019012 0x174 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) *(.gnu.linkonce.wi.*) -.debug_abbrev 0x00000000 0x4a41 +.debug_abbrev 0x00000000 0x597c *(.debug_abbrev) - .debug_abbrev 0x00000000 0x1b3 Bin/Chameleon-Mini.o - .debug_abbrev 0x000001b3 0x1b8 Bin/LUFADescriptors.o - .debug_abbrev 0x0000036b 0x13e Bin/System.o - .debug_abbrev 0x000004a9 0x20e Bin/Configuration.o - .debug_abbrev 0x000006b7 0xaa Bin/Random.o - .debug_abbrev 0x00000761 0xa2 Bin/Common.o - .debug_abbrev 0x00000803 0x260 Bin/Memory.o - .debug_abbrev 0x00000a63 0x224 Bin/Button.o - .debug_abbrev 0x00000c87 0x171 Bin/Settings.o - .debug_abbrev 0x00000df8 0x59 Bin/LED.o - .debug_abbrev 0x00000e51 0x277 Bin/Terminal.o - .debug_abbrev 0x000010c8 0x2c9 Bin/Commands.o - .debug_abbrev 0x00001391 0x259 Bin/XModem.o - .debug_abbrev 0x000015ea 0x253 Bin/CommandLine.o - .debug_abbrev 0x0000183d 0xc8 Bin/Codec.o - .debug_abbrev 0x00001905 0x2a8 Bin/ISO14443-2A.o - .debug_abbrev 0x00001bad 0x29a Bin/MifareClassic.o - .debug_abbrev 0x00001e47 0xa0 Bin/ISO14443-3A.o - .debug_abbrev 0x00001ee7 0x17d Bin/Crypto1.o - .debug_abbrev 0x00002064 0x1d4 Bin/HIDParser.o - .debug_abbrev 0x00002238 0x1ef Bin/ConfigDescriptors.o - .debug_abbrev 0x00002427 0x2bd Bin/DeviceStandardReq.o - .debug_abbrev 0x000026e4 0x41 Bin/Events.o - .debug_abbrev 0x00002725 0x2a Bin/HostStandardReq.o - .debug_abbrev 0x0000274f 0x1a3 Bin/USBTask.o - .debug_abbrev 0x000028f2 0x11b Bin/Device_XMEGA.o - .debug_abbrev 0x00002a0d 0x1b0 Bin/EndpointStream_XMEGA.o - .debug_abbrev 0x00002bbd 0x299 Bin/Endpoint_XMEGA.o - .debug_abbrev 0x00002e56 0x2a Bin/Host_XMEGA.o - .debug_abbrev 0x00002e80 0x2a Bin/PipeStream_XMEGA.o - .debug_abbrev 0x00002eaa 0x2a Bin/Pipe_XMEGA.o - .debug_abbrev 0x00002ed4 0x2a7 Bin/USBController_XMEGA.o - .debug_abbrev 0x0000317b 0x202 Bin/USBInterrupt_XMEGA.o - .debug_abbrev 0x0000337d 0x1c8 Bin/AudioClassDevice.o - .debug_abbrev 0x00003545 0x33b Bin/CDCClassDevice.o - .debug_abbrev 0x00003880 0x1ef Bin/HIDClassDevice.o - .debug_abbrev 0x00003a6f 0x24f Bin/MassStorageClassDevice.o - .debug_abbrev 0x00003cbe 0x1bb Bin/MIDIClassDevice.o - .debug_abbrev 0x00003e79 0x2ec Bin/PrinterClassDevice.o - .debug_abbrev 0x00004165 0x2af Bin/RNDISClassDevice.o - .debug_abbrev 0x00004414 0x2a Bin/AndroidAccessoryClassHost.o - .debug_abbrev 0x0000443e 0x2a Bin/AudioClassHost.o - .debug_abbrev 0x00004468 0x2a Bin/CDCClassHost.o - .debug_abbrev 0x00004492 0x2a Bin/HIDClassHost.o - .debug_abbrev 0x000044bc 0x2a Bin/MassStorageClassHost.o - .debug_abbrev 0x000044e6 0x2a Bin/MIDIClassHost.o - .debug_abbrev 0x00004510 0x2a Bin/PrinterClassHost.o - .debug_abbrev 0x0000453a 0x2a Bin/RNDISClassHost.o - .debug_abbrev 0x00004564 0x2a Bin/StillImageClassHost.o - .debug_abbrev 0x0000458e 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - .debug_abbrev 0x000045a2 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .debug_abbrev 0x000045b6 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .debug_abbrev 0x000045ca 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .debug_abbrev 0x000045de 0xcd c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_abbrev 0x000046ab 0x10c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_abbrev 0x000047b7 0x161 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_abbrev 0x00004918 0xd9 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .debug_abbrev 0x000049f1 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - .debug_abbrev 0x00004a05 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - .debug_abbrev 0x00004a19 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - .debug_abbrev 0x00004a2d 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .debug_abbrev 0x00000000 0x1d2 Bin/Chameleon-Mini.o + .debug_abbrev 0x000001d2 0x1bb Bin/LUFADescriptors.o + .debug_abbrev 0x0000038d 0x144 Bin/System.o + .debug_abbrev 0x000004d1 0x25f Bin/Configuration.o + .debug_abbrev 0x00000730 0xfb Bin/Random.o + .debug_abbrev 0x0000082b 0xb2 Bin/Common.o + .debug_abbrev 0x000008dd 0x2bc Bin/Memory.o + .debug_abbrev 0x00000b99 0x2b7 Bin/Button.o + .debug_abbrev 0x00000e50 0x1cb Bin/Settings.o + .debug_abbrev 0x0000101b 0x44 Bin/LED.o + .debug_abbrev 0x0000105f 0x33a Bin/Terminal.o + .debug_abbrev 0x00001399 0x38e Bin/Commands.o + .debug_abbrev 0x00001727 0x2d7 Bin/XModem.o + .debug_abbrev 0x000019fe 0x2db Bin/CommandLine.o + .debug_abbrev 0x00001cd9 0xc4 Bin/Codec.o + .debug_abbrev 0x00001d9d 0x2db Bin/ISO14443-2A.o + .debug_abbrev 0x00002078 0x321 Bin/MifareClassic.o + .debug_abbrev 0x00002399 0xa6 Bin/ISO14443-3A.o + .debug_abbrev 0x0000243f 0x1bd Bin/Crypto1.o + .debug_abbrev 0x000025fc 0x20a Bin/HIDParser.o + .debug_abbrev 0x00002806 0x248 Bin/ConfigDescriptors.o + .debug_abbrev 0x00002a4e 0x37e Bin/DeviceStandardReq.o + .debug_abbrev 0x00002dcc 0x44 Bin/Events.o + .debug_abbrev 0x00002e10 0x26 Bin/HostStandardReq.o + .debug_abbrev 0x00002e36 0x21d Bin/USBTask.o + .debug_abbrev 0x00003053 0x11e Bin/Device_XMEGA.o + .debug_abbrev 0x00003171 0x252 Bin/EndpointStream_XMEGA.o + .debug_abbrev 0x000033c3 0x300 Bin/Endpoint_XMEGA.o + .debug_abbrev 0x000036c3 0x26 Bin/Host_XMEGA.o + .debug_abbrev 0x000036e9 0x26 Bin/PipeStream_XMEGA.o + .debug_abbrev 0x0000370f 0x26 Bin/Pipe_XMEGA.o + .debug_abbrev 0x00003735 0x306 Bin/USBController_XMEGA.o + .debug_abbrev 0x00003a3b 0x266 Bin/USBInterrupt_XMEGA.o + .debug_abbrev 0x00003ca1 0x28b Bin/AudioClassDevice.o + .debug_abbrev 0x00003f2c 0x439 Bin/CDCClassDevice.o + .debug_abbrev 0x00004365 0x2de Bin/HIDClassDevice.o + .debug_abbrev 0x00004643 0x338 Bin/MassStorageClassDevice.o + .debug_abbrev 0x0000497b 0x287 Bin/MIDIClassDevice.o + .debug_abbrev 0x00004c02 0x3e1 Bin/PrinterClassDevice.o + .debug_abbrev 0x00004fe3 0x36d Bin/RNDISClassDevice.o + .debug_abbrev 0x00005350 0x26 Bin/AndroidAccessoryClassHost.o + .debug_abbrev 0x00005376 0x26 Bin/AudioClassHost.o + .debug_abbrev 0x0000539c 0x26 Bin/CDCClassHost.o + .debug_abbrev 0x000053c2 0x26 Bin/HIDClassHost.o + .debug_abbrev 0x000053e8 0x26 Bin/MassStorageClassHost.o + .debug_abbrev 0x0000540e 0x26 Bin/MIDIClassHost.o + .debug_abbrev 0x00005434 0x26 Bin/PrinterClassHost.o + .debug_abbrev 0x0000545a 0x26 Bin/RNDISClassHost.o + .debug_abbrev 0x00005480 0x26 Bin/StillImageClassHost.o + .debug_abbrev 0x000054a6 0xd6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_abbrev 0x0000557c 0x139 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_abbrev 0x000056b5 0x1d6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_abbrev 0x0000588b 0xf1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) -.debug_line 0x00000000 0x75a6 +.debug_line 0x00000000 0xb338 *(.debug_line) - .debug_line 0x00000000 0x2f5 Bin/Chameleon-Mini.o - .debug_line 0x000002f5 0x2a0 Bin/LUFADescriptors.o - .debug_line 0x00000595 0x1aa Bin/System.o - .debug_line 0x0000073f 0x21c Bin/Configuration.o - .debug_line 0x0000095b 0xdd Bin/Random.o - .debug_line 0x00000a38 0x16a Bin/Common.o - .debug_line 0x00000ba2 0x354 Bin/Memory.o - .debug_line 0x00000ef6 0x28c Bin/Button.o - .debug_line 0x00001182 0x16b Bin/Settings.o - .debug_line 0x000012ed 0x94 Bin/LED.o - .debug_line 0x00001381 0x344 Bin/Terminal.o - .debug_line 0x000016c5 0x532 Bin/Commands.o - .debug_line 0x00001bf7 0x3b7 Bin/XModem.o - .debug_line 0x00001fae 0x2e7 Bin/CommandLine.o - .debug_line 0x00002295 0xaf Bin/Codec.o - .debug_line 0x00002344 0x302 Bin/ISO14443-2A.o - .debug_line 0x00002646 0x394 Bin/MifareClassic.o - .debug_line 0x000029da 0xfa Bin/ISO14443-3A.o - .debug_line 0x00002ad4 0x293 Bin/Crypto1.o - .debug_line 0x00002d67 0x2ce Bin/HIDParser.o - .debug_line 0x00003035 0x23d Bin/ConfigDescriptors.o - .debug_line 0x00003272 0x331 Bin/DeviceStandardReq.o - .debug_line 0x000035a3 0x4f Bin/Events.o - .debug_line 0x000035f2 0x1a Bin/HostStandardReq.o - .debug_line 0x0000360c 0x1c8 Bin/USBTask.o - .debug_line 0x000037d4 0x180 Bin/Device_XMEGA.o - .debug_line 0x00003954 0xae0 Bin/EndpointStream_XMEGA.o - .debug_line 0x00004434 0x4b2 Bin/Endpoint_XMEGA.o - .debug_line 0x000048e6 0x1a Bin/Host_XMEGA.o - .debug_line 0x00004900 0x1a Bin/PipeStream_XMEGA.o - .debug_line 0x0000491a 0x1a Bin/Pipe_XMEGA.o - .debug_line 0x00004934 0x30c Bin/USBController_XMEGA.o - .debug_line 0x00004c40 0x2f6 Bin/USBInterrupt_XMEGA.o - .debug_line 0x00004f36 0x31b Bin/AudioClassDevice.o - .debug_line 0x00005251 0x504 Bin/CDCClassDevice.o - .debug_line 0x00005755 0x3ae Bin/HIDClassDevice.o - .debug_line 0x00005b03 0x390 Bin/MassStorageClassDevice.o - .debug_line 0x00005e93 0x317 Bin/MIDIClassDevice.o - .debug_line 0x000061aa 0x4cd Bin/PrinterClassDevice.o - .debug_line 0x00006677 0x406 Bin/RNDISClassDevice.o - .debug_line 0x00006a7d 0x1a Bin/AndroidAccessoryClassHost.o - .debug_line 0x00006a97 0x1a Bin/AudioClassHost.o - .debug_line 0x00006ab1 0x1a Bin/CDCClassHost.o - .debug_line 0x00006acb 0x1a Bin/HIDClassHost.o - .debug_line 0x00006ae5 0x1a Bin/MassStorageClassHost.o - .debug_line 0x00006aff 0x1a Bin/MIDIClassHost.o - .debug_line 0x00006b19 0x1a Bin/PrinterClassHost.o - .debug_line 0x00006b33 0x1a Bin/RNDISClassHost.o - .debug_line 0x00006b4d 0x1a Bin/StillImageClassHost.o - .debug_line 0x00006b67 0xa5 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - .debug_line 0x00006c0c 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - .debug_line 0x00006c94 0x91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - .debug_line 0x00006d25 0x8e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - .debug_line 0x00006db3 0x91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_line 0x00006e44 0x169 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_line 0x00006fad 0x290 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_line 0x0000723d 0xe1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .debug_line 0x0000731e 0xa1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - .debug_line 0x000073bf 0xa1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - .debug_line 0x00007460 0x9e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - .debug_line 0x000074fe 0xa8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + .debug_line 0x00000000 0x390 Bin/Chameleon-Mini.o + .debug_line 0x00000390 0x30a Bin/LUFADescriptors.o + .debug_line 0x0000069a 0x251 Bin/System.o + .debug_line 0x000008eb 0x39e Bin/Configuration.o + .debug_line 0x00000c89 0x119 Bin/Random.o + .debug_line 0x00000da2 0x219 Bin/Common.o + .debug_line 0x00000fbb 0x7a5 Bin/Memory.o + .debug_line 0x00001760 0x430 Bin/Button.o + .debug_line 0x00001b90 0x2e7 Bin/Settings.o + .debug_line 0x00001e77 0x8b Bin/LED.o + .debug_line 0x00001f02 0x457 Bin/Terminal.o + .debug_line 0x00002359 0x7ea Bin/Commands.o + .debug_line 0x00002b43 0x50b Bin/XModem.o + .debug_line 0x0000304e 0x3db Bin/CommandLine.o + .debug_line 0x00003429 0xaf Bin/Codec.o + .debug_line 0x000034d8 0x636 Bin/ISO14443-2A.o + .debug_line 0x00003b0e 0x734 Bin/MifareClassic.o + .debug_line 0x00004242 0x1a8 Bin/ISO14443-3A.o + .debug_line 0x000043ea 0x72c Bin/Crypto1.o + .debug_line 0x00004b16 0x638 Bin/HIDParser.o + .debug_line 0x0000514e 0x2c5 Bin/ConfigDescriptors.o + .debug_line 0x00005413 0x4d2 Bin/DeviceStandardReq.o + .debug_line 0x000058e5 0x4f Bin/Events.o + .debug_line 0x00005934 0x1a Bin/HostStandardReq.o + .debug_line 0x0000594e 0x209 Bin/USBTask.o + .debug_line 0x00005b57 0x185 Bin/Device_XMEGA.o + .debug_line 0x00005cdc 0x1655 Bin/EndpointStream_XMEGA.o + .debug_line 0x00007331 0x6fd Bin/Endpoint_XMEGA.o + .debug_line 0x00007a2e 0x1a Bin/Host_XMEGA.o + .debug_line 0x00007a48 0x1a Bin/PipeStream_XMEGA.o + .debug_line 0x00007a62 0x1a Bin/Pipe_XMEGA.o + .debug_line 0x00007a7c 0x3b1 Bin/USBController_XMEGA.o + .debug_line 0x00007e2d 0x3b0 Bin/USBInterrupt_XMEGA.o + .debug_line 0x000081dd 0x453 Bin/AudioClassDevice.o + .debug_line 0x00008630 0x832 Bin/CDCClassDevice.o + .debug_line 0x00008e62 0x598 Bin/HIDClassDevice.o + .debug_line 0x000093fa 0x50f Bin/MassStorageClassDevice.o + .debug_line 0x00009909 0x402 Bin/MIDIClassDevice.o + .debug_line 0x00009d0b 0x775 Bin/PrinterClassDevice.o + .debug_line 0x0000a480 0x72a Bin/RNDISClassDevice.o + .debug_line 0x0000abaa 0x1a Bin/AndroidAccessoryClassHost.o + .debug_line 0x0000abc4 0x1a Bin/AudioClassHost.o + .debug_line 0x0000abde 0x1a Bin/CDCClassHost.o + .debug_line 0x0000abf8 0x1a Bin/HIDClassHost.o + .debug_line 0x0000ac12 0x1a Bin/MassStorageClassHost.o + .debug_line 0x0000ac2c 0x1a Bin/MIDIClassHost.o + .debug_line 0x0000ac46 0x1a Bin/PrinterClassHost.o + .debug_line 0x0000ac60 0x1a Bin/RNDISClassHost.o + .debug_line 0x0000ac7a 0x1a Bin/StillImageClassHost.o + .debug_line 0x0000ac94 0xa1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_line 0x0000ad35 0x1a6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_line 0x0000aedb 0x359 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_line 0x0000b234 0x104 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) -.debug_frame 0x00000000 0x1e1c +.debug_frame 0x00000000 0x1e88 *(.debug_frame) .debug_frame 0x00000000 0x24 Bin/Chameleon-Mini.o .debug_frame 0x00000024 0x24 Bin/LUFADescriptors.o .debug_frame 0x00000048 0x90 Bin/System.o .debug_frame 0x000000d8 0xf4 Bin/Configuration.o - .debug_frame 0x000001cc 0x68 Bin/Random.o - .debug_frame 0x00000234 0x4c Bin/Common.o - .debug_frame 0x00000280 0x120 Bin/Memory.o - .debug_frame 0x000003a0 0xac Bin/Button.o - .debug_frame 0x0000044c 0x90 Bin/Settings.o - .debug_frame 0x000004dc 0xcc Bin/Terminal.o - .debug_frame 0x000005a8 0x1fc Bin/Commands.o - .debug_frame 0x000007a4 0x6c Bin/XModem.o - .debug_frame 0x00000810 0x54 Bin/CommandLine.o - .debug_frame 0x00000864 0xf8 Bin/ISO14443-2A.o - .debug_frame 0x0000095c 0xd4 Bin/MifareClassic.o - .debug_frame 0x00000a30 0x6c Bin/ISO14443-3A.o - .debug_frame 0x00000a9c 0x13c Bin/Crypto1.o - .debug_frame 0x00000bd8 0x124 Bin/HIDParser.o - .debug_frame 0x00000cfc 0xbc Bin/ConfigDescriptors.o - .debug_frame 0x00000db8 0x38 Bin/DeviceStandardReq.o - .debug_frame 0x00000df0 0x24 Bin/Events.o - .debug_frame 0x00000e14 0x2c Bin/USBTask.o - .debug_frame 0x00000e40 0x24 Bin/Device_XMEGA.o - .debug_frame 0x00000e64 0x52c Bin/EndpointStream_XMEGA.o - .debug_frame 0x00001390 0x15c Bin/Endpoint_XMEGA.o - .debug_frame 0x000014ec 0x5c Bin/USBController_XMEGA.o - .debug_frame 0x00001548 0x8c Bin/USBInterrupt_XMEGA.o - .debug_frame 0x000015d4 0xa8 Bin/AudioClassDevice.o - .debug_frame 0x0000167c 0x1c4 Bin/CDCClassDevice.o - .debug_frame 0x00001840 0xf4 Bin/HIDClassDevice.o - .debug_frame 0x00001934 0x80 Bin/MassStorageClassDevice.o - .debug_frame 0x000019b4 0x9c Bin/MIDIClassDevice.o - .debug_frame 0x00001a50 0x198 Bin/PrinterClassDevice.o - .debug_frame 0x00001be8 0xf8 Bin/RNDISClassDevice.o - .debug_frame 0x00001ce0 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_frame 0x00001d68 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_frame 0x00001d98 0x4c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_frame 0x00001de4 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_frame 0x000001cc 0x64 Bin/Random.o + .debug_frame 0x00000230 0x40 Bin/Common.o + .debug_frame 0x00000270 0x134 Bin/Memory.o + .debug_frame 0x000003a4 0xac Bin/Button.o + .debug_frame 0x00000450 0x90 Bin/Settings.o + .debug_frame 0x000004e0 0xcc Bin/Terminal.o + .debug_frame 0x000005ac 0x28c Bin/Commands.o + .debug_frame 0x00000838 0x6c Bin/XModem.o + .debug_frame 0x000008a4 0x54 Bin/CommandLine.o + .debug_frame 0x000008f8 0xf8 Bin/ISO14443-2A.o + .debug_frame 0x000009f0 0xe0 Bin/MifareClassic.o + .debug_frame 0x00000ad0 0x34 Bin/ISO14443-3A.o + .debug_frame 0x00000b04 0x13c Bin/Crypto1.o + .debug_frame 0x00000c40 0x11c Bin/HIDParser.o + .debug_frame 0x00000d5c 0xd0 Bin/ConfigDescriptors.o + .debug_frame 0x00000e2c 0x40 Bin/DeviceStandardReq.o + .debug_frame 0x00000e6c 0x24 Bin/Events.o + .debug_frame 0x00000e90 0x2c Bin/USBTask.o + .debug_frame 0x00000ebc 0x24 Bin/Device_XMEGA.o + .debug_frame 0x00000ee0 0x4f8 Bin/EndpointStream_XMEGA.o + .debug_frame 0x000013d8 0x160 Bin/Endpoint_XMEGA.o + .debug_frame 0x00001538 0x5c Bin/USBController_XMEGA.o + .debug_frame 0x00001594 0x8c Bin/USBInterrupt_XMEGA.o + .debug_frame 0x00001620 0xa4 Bin/AudioClassDevice.o + .debug_frame 0x000016c4 0x1e0 Bin/CDCClassDevice.o + .debug_frame 0x000018a4 0xf0 Bin/HIDClassDevice.o + .debug_frame 0x00001994 0x80 Bin/MassStorageClassDevice.o + .debug_frame 0x00001a14 0xa4 Bin/MIDIClassDevice.o + .debug_frame 0x00001ab8 0x194 Bin/PrinterClassDevice.o + .debug_frame 0x00001c4c 0x100 Bin/RNDISClassDevice.o + .debug_frame 0x00001d4c 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_frame 0x00001dd4 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_frame 0x00001e04 0x4c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_frame 0x00001e50 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) -.debug_str 0x00000000 0x76b2 +.debug_str 0x00000000 0x77fe *(.debug_str) - .debug_str 0x00000000 0xc5b Bin/Chameleon-Mini.o - 0xd20 (size before relaxing) - .debug_str 0x00000c5b 0x8cc Bin/LUFADescriptors.o - 0xb47 (size before relaxing) - .debug_str 0x00001527 0x767 Bin/System.o - 0xb73 (size before relaxing) - .debug_str 0x00001c8e 0x2d0 Bin/Configuration.o - 0x56f (size before relaxing) - .debug_str 0x00001f5e 0x3d Bin/Random.o - 0x155 (size before relaxing) - .debug_str 0x00001f9b 0x56 Bin/Common.o - 0x17d (size before relaxing) - .debug_str 0x00001ff1 0x2a5 Bin/Memory.o - 0x78e (size before relaxing) - .debug_str 0x00002296 0x1c7 Bin/Button.o - 0x683 (size before relaxing) - .debug_str 0x0000245d 0xb3 Bin/Settings.o - 0x48c (size before relaxing) - .debug_str 0x00002510 0x6 Bin/LED.o - 0x10b (size before relaxing) - .debug_str 0x00002516 0x1b0 Bin/Terminal.o - 0x623 (size before relaxing) - .debug_str 0x000026c6 0x3b9 Bin/Commands.o - 0xba0 (size before relaxing) - .debug_str 0x00002a7f 0x192 Bin/XModem.o - 0x537 (size before relaxing) - .debug_str 0x00002c11 0xe8 Bin/CommandLine.o - 0x50a (size before relaxing) - .debug_str 0x00002cf9 0x1a Bin/Codec.o - 0x27b (size before relaxing) - .debug_str 0x00002d13 0x12b9 Bin/ISO14443-2A.o - 0x1a4a (size before relaxing) - .debug_str 0x00003fcc 0x236 Bin/MifareClassic.o - 0x4dd (size before relaxing) - .debug_str 0x00004202 0x41 Bin/ISO14443-3A.o - 0x174 (size before relaxing) - .debug_str 0x00004243 0xe8 Bin/Crypto1.o - 0x202 (size before relaxing) - .debug_str 0x0000432b 0x474 Bin/HIDParser.o - 0x60f (size before relaxing) - .debug_str 0x0000479f 0x22e Bin/ConfigDescriptors.o - 0x45b (size before relaxing) - .debug_str 0x000049cd 0x8f1 Bin/DeviceStandardReq.o - 0xfe5 (size before relaxing) - .debug_str 0x000052be 0x31 Bin/Events.o - 0x121 (size before relaxing) - .debug_str 0x000052ef 0x2b Bin/HostStandardReq.o - 0x11b (size before relaxing) - .debug_str 0x0000531a 0x79 Bin/USBTask.o - 0x382 (size before relaxing) - .debug_str 0x00005393 0x4a Bin/Device_XMEGA.o - 0x53f (size before relaxing) - .debug_str 0x000053dd 0x4c6 Bin/EndpointStream_XMEGA.o - 0x802 (size before relaxing) - .debug_str 0x000058a3 0x3a9 Bin/Endpoint_XMEGA.o + .debug_str 0x00000000 0xccd Bin/Chameleon-Mini.o + 0xd92 (size before relaxing) + .debug_str 0x00000ccd 0x8cc Bin/LUFADescriptors.o + 0xb1d (size before relaxing) + .debug_str 0x00001599 0x748 Bin/System.o + 0xb52 (size before relaxing) + .debug_str 0x00001ce1 0x2ce Bin/Configuration.o + 0x53c (size before relaxing) + .debug_str 0x00001faf 0x27 Bin/Random.o + 0x117 (size before relaxing) + .debug_str 0x00001fd6 0x56 Bin/Common.o + 0x13a (size before relaxing) + .debug_str 0x0000202c 0x21f Bin/Memory.o + 0x6dc (size before relaxing) + .debug_str 0x0000224b 0x1d2 Bin/Button.o + 0x682 (size before relaxing) + .debug_str 0x0000241d 0xc0 Bin/Settings.o + 0x48a (size before relaxing) + .debug_str 0x000024dd 0x6 Bin/LED.o + 0xc8 (size before relaxing) + .debug_str 0x000024e3 0x295 Bin/Terminal.o + 0x72c (size before relaxing) + .debug_str 0x00002778 0x3f0 Bin/Commands.o + 0xcd2 (size before relaxing) + .debug_str 0x00002b68 0x149 Bin/XModem.o + 0x533 (size before relaxing) + .debug_str 0x00002cb1 0xc1 Bin/CommandLine.o + 0x510 (size before relaxing) + .debug_str 0x00002d72 0x1a Bin/Codec.o + 0x238 (size before relaxing) + .debug_str 0x00002d8c 0x12b9 Bin/ISO14443-2A.o + 0x1a20 (size before relaxing) + .debug_str 0x00004045 0x2b0 Bin/MifareClassic.o + 0x545 (size before relaxing) + .debug_str 0x000042f5 0x1a Bin/ISO14443-3A.o + 0x131 (size before relaxing) + .debug_str 0x0000430f 0x95 Bin/Crypto1.o + 0x1bf (size before relaxing) + .debug_str 0x000043a4 0x48d Bin/HIDParser.o + 0x5f3 (size before relaxing) + .debug_str 0x00004831 0x22e Bin/ConfigDescriptors.o + 0x431 (size before relaxing) + .debug_str 0x00004a5f 0xa04 Bin/DeviceStandardReq.o + 0x112f (size before relaxing) + .debug_str 0x00005463 0x31 Bin/Events.o + 0xde (size before relaxing) + .debug_str 0x00005494 0x2b Bin/HostStandardReq.o + 0xd8 (size before relaxing) + .debug_str 0x000054bf 0x6d Bin/USBTask.o + 0x3aa (size before relaxing) + .debug_str 0x0000552c 0x4a Bin/Device_XMEGA.o + 0x51e (size before relaxing) + .debug_str 0x00005576 0x4d9 Bin/EndpointStream_XMEGA.o + 0x8c2 (size before relaxing) + .debug_str 0x00005a4f 0x2aa Bin/Endpoint_XMEGA.o + 0xa30 (size before relaxing) + .debug_str 0x00005cf9 0x2c Bin/Host_XMEGA.o + 0xd9 (size before relaxing) + .debug_str 0x00005d25 0x32 Bin/PipeStream_XMEGA.o + 0xdf (size before relaxing) + .debug_str 0x00005d57 0x2c Bin/Pipe_XMEGA.o + 0xd9 (size before relaxing) + .debug_str 0x00005d83 0x1bb Bin/USBController_XMEGA.o + 0xdc0 (size before relaxing) + .debug_str 0x00005f3e 0xaa Bin/USBInterrupt_XMEGA.o + 0x891 (size before relaxing) + .debug_str 0x00005fe8 0x280 Bin/AudioClassDevice.o + 0x705 (size before relaxing) + .debug_str 0x00006268 0x286 Bin/CDCClassDevice.o 0xa5a (size before relaxing) - .debug_str 0x00005c4c 0x2c Bin/Host_XMEGA.o - 0x11c (size before relaxing) - .debug_str 0x00005c78 0x32 Bin/PipeStream_XMEGA.o - 0x122 (size before relaxing) - .debug_str 0x00005caa 0x2c Bin/Pipe_XMEGA.o - 0x11c (size before relaxing) - .debug_str 0x00005cd6 0x198 Bin/USBController_XMEGA.o - 0xd93 (size before relaxing) - .debug_str 0x00005e6e 0xad Bin/USBInterrupt_XMEGA.o - 0x81a (size before relaxing) - .debug_str 0x00005f1b 0x236 Bin/AudioClassDevice.o - 0x609 (size before relaxing) - .debug_str 0x00006151 0x32d Bin/CDCClassDevice.o - 0x95a (size before relaxing) - .debug_str 0x0000647e 0x1ea Bin/HIDClassDevice.o - 0x91a (size before relaxing) - .debug_str 0x00006668 0x23a Bin/MassStorageClassDevice.o - 0x727 (size before relaxing) - .debug_str 0x000068a2 0x115 Bin/MIDIClassDevice.o - 0x622 (size before relaxing) - .debug_str 0x000069b7 0x269 Bin/PrinterClassDevice.o - 0x862 (size before relaxing) - .debug_str 0x00006c20 0x6e5 Bin/RNDISClassDevice.o - 0xc75 (size before relaxing) - .debug_str 0x00007305 0x3b Bin/AndroidAccessoryClassHost.o - 0x12b (size before relaxing) - .debug_str 0x00007340 0x30 Bin/AudioClassHost.o - 0x120 (size before relaxing) - .debug_str 0x00007370 0x2e Bin/CDCClassHost.o - 0x11e (size before relaxing) - .debug_str 0x0000739e 0x2e Bin/HIDClassHost.o - 0x11e (size before relaxing) - .debug_str 0x000073cc 0x36 Bin/MassStorageClassHost.o - 0x126 (size before relaxing) - .debug_str 0x00007402 0x2f Bin/MIDIClassHost.o - 0x11f (size before relaxing) - .debug_str 0x00007431 0x32 Bin/PrinterClassHost.o - 0x122 (size before relaxing) - .debug_str 0x00007463 0x30 Bin/RNDISClassHost.o - 0x120 (size before relaxing) - .debug_str 0x00007493 0x35 Bin/StillImageClassHost.o - 0x125 (size before relaxing) - .debug_str 0x000074c8 0x6f c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0xa8 (size before relaxing) - .debug_str 0x00007537 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x12e (size before relaxing) - .debug_str 0x000075bf 0x9d c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x16b (size before relaxing) - .debug_str 0x0000765c 0x56 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0xfb (size before relaxing) + .debug_str 0x000064ee 0x248 Bin/HIDClassDevice.o + 0xa75 (size before relaxing) + .debug_str 0x00006736 0x261 Bin/MassStorageClassDevice.o + 0x858 (size before relaxing) + .debug_str 0x00006997 0x115 Bin/MIDIClassDevice.o + 0x6af (size before relaxing) + .debug_str 0x00006aac 0x269 Bin/PrinterClassDevice.o + 0x983 (size before relaxing) + .debug_str 0x00006d15 0x6e5 Bin/RNDISClassDevice.o + 0xdb8 (size before relaxing) + .debug_str 0x000073fa 0x3b Bin/AndroidAccessoryClassHost.o + 0xe8 (size before relaxing) + .debug_str 0x00007435 0x30 Bin/AudioClassHost.o + 0xdd (size before relaxing) + .debug_str 0x00007465 0x2e Bin/CDCClassHost.o + 0xdb (size before relaxing) + .debug_str 0x00007493 0x2e Bin/HIDClassHost.o + 0xdb (size before relaxing) + .debug_str 0x000074c1 0x36 Bin/MassStorageClassHost.o + 0xe3 (size before relaxing) + .debug_str 0x000074f7 0x2f Bin/MIDIClassHost.o + 0xdc (size before relaxing) + .debug_str 0x00007526 0x32 Bin/PrinterClassHost.o + 0xdf (size before relaxing) + .debug_str 0x00007558 0x30 Bin/RNDISClassHost.o + 0xdd (size before relaxing) + .debug_str 0x00007588 0x35 Bin/StillImageClassHost.o + 0xe2 (size before relaxing) + .debug_str 0x000075bd 0x81 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + 0xba (size before relaxing) + .debug_str 0x0000763e 0x91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + 0x149 (size before relaxing) + .debug_str 0x000076cf 0xcd c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + 0x1ad (size before relaxing) + .debug_str 0x0000779c 0x62 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + 0x10d (size before relaxing) -.debug_loc 0x00000000 0xb6e8 +.debug_loc 0x00000000 0xce27 *(.debug_loc) - .debug_loc 0x00000000 0x225 Bin/LUFADescriptors.o - .debug_loc 0x00000225 0x2f Bin/System.o - .debug_loc 0x00000254 0x2a8 Bin/Configuration.o - .debug_loc 0x000004fc 0xc4 Bin/Random.o - .debug_loc 0x000005c0 0x2fa Bin/Common.o - .debug_loc 0x000008ba 0x8a1 Bin/Memory.o - .debug_loc 0x0000115b 0x6c6 Bin/Button.o - .debug_loc 0x00001821 0x185 Bin/Settings.o - .debug_loc 0x000019a6 0x1dc Bin/Terminal.o - .debug_loc 0x00001b82 0x5cc Bin/Commands.o - .debug_loc 0x0000214e 0x226 Bin/XModem.o - .debug_loc 0x00002374 0x628 Bin/CommandLine.o - .debug_loc 0x0000299c 0x437 Bin/ISO14443-2A.o - .debug_loc 0x00002dd3 0xa90 Bin/MifareClassic.o - .debug_loc 0x00003863 0x309 Bin/ISO14443-3A.o - .debug_loc 0x00003b6c 0x960 Bin/Crypto1.o - .debug_loc 0x000044cc 0xced Bin/HIDParser.o - .debug_loc 0x000051b9 0x4e4 Bin/ConfigDescriptors.o - .debug_loc 0x0000569d 0x294 Bin/DeviceStandardReq.o - .debug_loc 0x00005931 0x22 Bin/USBTask.o - .debug_loc 0x00005953 0x279d Bin/EndpointStream_XMEGA.o - .debug_loc 0x000080f0 0x50b Bin/Endpoint_XMEGA.o - .debug_loc 0x000085fb 0xa3 Bin/USBController_XMEGA.o - .debug_loc 0x0000869e 0x200 Bin/USBInterrupt_XMEGA.o - .debug_loc 0x0000889e 0x2c6 Bin/AudioClassDevice.o - .debug_loc 0x00008b64 0x7e8 Bin/CDCClassDevice.o - .debug_loc 0x0000934c 0x49d Bin/HIDClassDevice.o - .debug_loc 0x000097e9 0x283 Bin/MassStorageClassDevice.o - .debug_loc 0x00009a6c 0x27c Bin/MIDIClassDevice.o - .debug_loc 0x00009ce8 0x6cd Bin/PrinterClassDevice.o - .debug_loc 0x0000a3b5 0xbd5 Bin/RNDISClassDevice.o - .debug_loc 0x0000af8a 0x167 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_loc 0x0000b0f1 0x63 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_loc 0x0000b154 0x4fb c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_loc 0x0000b64f 0x99 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_loc 0x00000000 0x277 Bin/LUFADescriptors.o + .debug_loc 0x00000277 0x2f Bin/System.o + .debug_loc 0x000002a6 0x3cf Bin/Configuration.o + .debug_loc 0x00000675 0xaa Bin/Random.o + .debug_loc 0x0000071f 0x319 Bin/Common.o + .debug_loc 0x00000a38 0xa25 Bin/Memory.o + .debug_loc 0x0000145d 0x69c Bin/Button.o + .debug_loc 0x00001af9 0x1b1 Bin/Settings.o + .debug_loc 0x00001caa 0x1f9 Bin/Terminal.o + .debug_loc 0x00001ea3 0x9b7 Bin/Commands.o + .debug_loc 0x0000285a 0x313 Bin/XModem.o + .debug_loc 0x00002b6d 0x6be Bin/CommandLine.o + .debug_loc 0x0000322b 0x4a5 Bin/ISO14443-2A.o + .debug_loc 0x000036d0 0xb6a Bin/MifareClassic.o + .debug_loc 0x0000423a 0x231 Bin/ISO14443-3A.o + .debug_loc 0x0000446b 0xa3a Bin/Crypto1.o + .debug_loc 0x00004ea5 0xc34 Bin/HIDParser.o + .debug_loc 0x00005ad9 0x536 Bin/ConfigDescriptors.o + .debug_loc 0x0000600f 0x2d9 Bin/DeviceStandardReq.o + .debug_loc 0x000062e8 0x22 Bin/USBTask.o + .debug_loc 0x0000630a 0x2bf0 Bin/EndpointStream_XMEGA.o + .debug_loc 0x00008efa 0x581 Bin/Endpoint_XMEGA.o + .debug_loc 0x0000947b 0xa3 Bin/USBController_XMEGA.o + .debug_loc 0x0000951e 0x200 Bin/USBInterrupt_XMEGA.o + .debug_loc 0x0000971e 0x3ad Bin/AudioClassDevice.o + .debug_loc 0x00009acb 0x9f6 Bin/CDCClassDevice.o + .debug_loc 0x0000a4c1 0x473 Bin/HIDClassDevice.o + .debug_loc 0x0000a934 0x303 Bin/MassStorageClassDevice.o + .debug_loc 0x0000ac37 0x35f Bin/MIDIClassDevice.o + .debug_loc 0x0000af96 0x8b8 Bin/PrinterClassDevice.o + .debug_loc 0x0000b84e 0xd6d Bin/RNDISClassDevice.o + .debug_loc 0x0000c5bb 0x1e8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_loc 0x0000c7a3 0x74 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_loc 0x0000c817 0x51d c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_loc 0x0000cd34 0xf3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) .debug_macinfo *(.debug_macinfo) + +.debug_pubtypes + *(.debug_pubtypes) + +.debug_ranges 0x00000000 0x1a08 + *(.debug_ranges) + .debug_ranges 0x00000000 0x28 Bin/Chameleon-Mini.o + .debug_ranges 0x00000028 0x10 Bin/LUFADescriptors.o + .debug_ranges 0x00000038 0x40 Bin/System.o + .debug_ranges 0x00000078 0xb0 Bin/Configuration.o + .debug_ranges 0x00000128 0x28 Bin/Random.o + .debug_ranges 0x00000150 0x48 Bin/Common.o + .debug_ranges 0x00000198 0x2b8 Bin/Memory.o + .debug_ranges 0x00000450 0xf8 Bin/Button.o + .debug_ranges 0x00000548 0x40 Bin/Settings.o + .debug_ranges 0x00000588 0xd0 Bin/Terminal.o + .debug_ranges 0x00000658 0x118 Bin/Commands.o + .debug_ranges 0x00000770 0x48 Bin/XModem.o + .debug_ranges 0x000007b8 0x100 Bin/CommandLine.o + .debug_ranges 0x000008b8 0xc0 Bin/ISO14443-2A.o + .debug_ranges 0x00000978 0x1c8 Bin/MifareClassic.o + .debug_ranges 0x00000b40 0x18 Bin/ISO14443-3A.o + .debug_ranges 0x00000b58 0x70 Bin/Crypto1.o + .debug_ranges 0x00000bc8 0x150 Bin/HIDParser.o + .debug_ranges 0x00000d18 0x40 Bin/ConfigDescriptors.o + .debug_ranges 0x00000d58 0x138 Bin/DeviceStandardReq.o + .debug_ranges 0x00000e90 0x10 Bin/Events.o + .debug_ranges 0x00000ea0 0x60 Bin/USBTask.o + .debug_ranges 0x00000f00 0x10 Bin/Device_XMEGA.o + .debug_ranges 0x00000f10 0x4a8 Bin/EndpointStream_XMEGA.o + .debug_ranges 0x000013b8 0x188 Bin/Endpoint_XMEGA.o + .debug_ranges 0x00001540 0x20 Bin/USBController_XMEGA.o + .debug_ranges 0x00001560 0x20 Bin/USBInterrupt_XMEGA.o + .debug_ranges 0x00001580 0x38 Bin/AudioClassDevice.o + .debug_ranges 0x000015b8 0x100 Bin/CDCClassDevice.o + .debug_ranges 0x000016b8 0x20 Bin/HIDClassDevice.o + .debug_ranges 0x000016d8 0xa0 Bin/MassStorageClassDevice.o + .debug_ranges 0x00001778 0x48 Bin/MIDIClassDevice.o + .debug_ranges 0x000017c0 0x128 Bin/PrinterClassDevice.o + .debug_ranges 0x000018e8 0xc8 Bin/RNDISClassDevice.o + .debug_ranges 0x000019b0 0x28 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_ranges 0x000019d8 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_ranges 0x000019e8 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_ranges 0x000019f8 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + +.debug_macro + *(.debug_macro) OUTPUT(Chameleon-Mini.elf elf32-avr) LOAD linker stubs -.debug_ranges 0x00000000 0x1ae0 - .debug_ranges 0x00000000 0x40 Bin/Chameleon-Mini.o - .debug_ranges 0x00000040 0x10 Bin/LUFADescriptors.o - .debug_ranges 0x00000050 0x40 Bin/System.o - .debug_ranges 0x00000090 0xb8 Bin/Configuration.o - .debug_ranges 0x00000148 0x28 Bin/Random.o - .debug_ranges 0x00000170 0x50 Bin/Common.o - .debug_ranges 0x000001c0 0x208 Bin/Memory.o - .debug_ranges 0x000003c8 0xf8 Bin/Button.o - .debug_ranges 0x000004c0 0x40 Bin/Settings.o - .debug_ranges 0x00000500 0xc8 Bin/Terminal.o - .debug_ranges 0x000005c8 0x128 Bin/Commands.o - .debug_ranges 0x000006f0 0x30 Bin/XModem.o - .debug_ranges 0x00000720 0x150 Bin/CommandLine.o - .debug_ranges 0x00000870 0xb8 Bin/ISO14443-2A.o - .debug_ranges 0x00000928 0x1b0 Bin/MifareClassic.o - .debug_ranges 0x00000ad8 0x18 Bin/ISO14443-3A.o - .debug_ranges 0x00000af0 0x88 Bin/Crypto1.o - .debug_ranges 0x00000b78 0x120 Bin/HIDParser.o - .debug_ranges 0x00000c98 0x40 Bin/ConfigDescriptors.o - .debug_ranges 0x00000cd8 0x1d8 Bin/DeviceStandardReq.o - .debug_ranges 0x00000eb0 0x10 Bin/Events.o - .debug_ranges 0x00000ec0 0x50 Bin/USBTask.o - .debug_ranges 0x00000f10 0x10 Bin/Device_XMEGA.o - .debug_ranges 0x00000f20 0x5d8 Bin/EndpointStream_XMEGA.o - .debug_ranges 0x000014f8 0x110 Bin/Endpoint_XMEGA.o - .debug_ranges 0x00001608 0x20 Bin/USBController_XMEGA.o - .debug_ranges 0x00001628 0x20 Bin/USBInterrupt_XMEGA.o - .debug_ranges 0x00001648 0x38 Bin/AudioClassDevice.o - .debug_ranges 0x00001680 0x100 Bin/CDCClassDevice.o - .debug_ranges 0x00001780 0x38 Bin/HIDClassDevice.o - .debug_ranges 0x000017b8 0x98 Bin/MassStorageClassDevice.o - .debug_ranges 0x00001850 0x48 Bin/MIDIClassDevice.o - .debug_ranges 0x00001898 0x128 Bin/PrinterClassDevice.o - .debug_ranges 0x000019c0 0xc8 Bin/RNDISClassDevice.o - .debug_ranges 0x00001a88 0x28 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_ranges 0x00001ab0 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_ranges 0x00001ac0 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_ranges 0x00001ad0 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - Cross Reference Table Symbol File @@ -2489,319 +2680,243 @@ XModemSend Bin/XModem.o Bin/Commands.o XModemTick Bin/XModem.o Bin/Terminal.o -__bad_interrupt c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__bss_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) -__bss_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) -__data_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) -__data_load_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) -__data_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) -__divmodsi4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -__do_clear_bss c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - Bin/StillImageClassHost.o - Bin/RNDISClassHost.o - Bin/PrinterClassHost.o - Bin/MIDIClassHost.o - Bin/MassStorageClassHost.o - Bin/HIDClassHost.o - Bin/CDCClassHost.o - Bin/AudioClassHost.o - Bin/AndroidAccessoryClassHost.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/USBInterrupt_XMEGA.o +__bad_interrupt c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__bss_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) +__bss_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) +__data_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) +__data_load_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) +__data_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) +__divmodsi4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +__do_clear_bss c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) Bin/USBController_XMEGA.o - Bin/Pipe_XMEGA.o - Bin/PipeStream_XMEGA.o - Bin/Host_XMEGA.o Bin/Endpoint_XMEGA.o - Bin/EndpointStream_XMEGA.o - Bin/Device_XMEGA.o Bin/USBTask.o - Bin/HostStandardReq.o - Bin/Events.o Bin/DeviceStandardReq.o - Bin/ConfigDescriptors.o - Bin/HIDParser.o Bin/Crypto1.o - Bin/ISO14443-3A.o Bin/MifareClassic.o Bin/ISO14443-2A.o Bin/Codec.o Bin/CommandLine.o Bin/XModem.o - Bin/Commands.o Bin/Terminal.o Bin/LED.o Bin/Settings.o Bin/Button.o - Bin/Memory.o - Bin/Common.o - Bin/Random.o Bin/Configuration.o - Bin/System.o - Bin/LUFADescriptors.o - Bin/Chameleon-Mini.o -__do_copy_data c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - Bin/StillImageClassHost.o - Bin/RNDISClassHost.o - Bin/PrinterClassHost.o - Bin/MIDIClassHost.o - Bin/MassStorageClassHost.o - Bin/HIDClassHost.o - Bin/CDCClassHost.o - Bin/AudioClassHost.o - Bin/AndroidAccessoryClassHost.o +__do_copy_data c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/USBInterrupt_XMEGA.o - Bin/USBController_XMEGA.o - Bin/Pipe_XMEGA.o - Bin/PipeStream_XMEGA.o - Bin/Host_XMEGA.o - Bin/Endpoint_XMEGA.o - Bin/EndpointStream_XMEGA.o - Bin/Device_XMEGA.o - Bin/USBTask.o - Bin/HostStandardReq.o - Bin/Events.o - Bin/DeviceStandardReq.o - Bin/ConfigDescriptors.o - Bin/HIDParser.o Bin/Crypto1.o - Bin/ISO14443-3A.o - Bin/MifareClassic.o - Bin/ISO14443-2A.o - Bin/Codec.o - Bin/CommandLine.o - Bin/XModem.o Bin/Commands.o Bin/Terminal.o - Bin/LED.o +__eerd_block_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) Bin/Settings.o - Bin/Button.o - Bin/Memory.o - Bin/Common.o - Bin/Random.o - Bin/Configuration.o - Bin/System.o - Bin/LUFADescriptors.o - Bin/Chameleon-Mini.o -__eerd_block_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - Bin/Settings.o -__eerd_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) +__eerd_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o -__eeupd_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +__eeupd_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o -__eeupd_r18_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -__eewr_block_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) +__eeupd_r18_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +__eewr_block_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) Bin/Settings.o -__eewr_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) -__eewr_r18_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -__epilogue_restores__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) -__heap_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__init c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__mulsi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +__eewr_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) +__eewr_r18_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +__epilogue_restores__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +__heap_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__init c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__mulohisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +__mulshisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) Bin/Commands.o -__prologue_saves__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) -__stack c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__udivmodsi4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) -__ultoa_invert c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -__vector_1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_100 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_101 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_102 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_103 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_104 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_105 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_106 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_107 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_108 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_109 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_11 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_110 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_111 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_112 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_113 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_114 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_115 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_116 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_117 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_118 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_119 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_120 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_121 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_122 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_123 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_124 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__muluhisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) +__prologue_saves__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +__stack c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__tablejump2__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + Bin/HIDParser.o +__tablejump__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) +__udivmodsi4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) +__ultoa_invert c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) +__umulhisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) +__vector_1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_100 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_101 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_102 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_103 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_104 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_105 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_106 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_107 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_108 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_109 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_11 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_110 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_111 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_112 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_113 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_114 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_115 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_116 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_117 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_118 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_119 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_120 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_121 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_122 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_123 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_124 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_125 Bin/USBInterrupt_XMEGA.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_126 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_13 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_15 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_17 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_18 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_19 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_21 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_126 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_13 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_15 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_17 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_18 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_19 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_21 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_22 Bin/ISO14443-2A.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_23 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_24 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_25 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_26 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_27 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_28 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_29 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_31 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_33 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_23 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_24 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_25 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_26 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_27 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_28 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_29 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_31 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_33 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_34 Bin/ISO14443-2A.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_35 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_37 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_39 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_40 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_41 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_42 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_43 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_45 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_47 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_48 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_49 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_5 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_50 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_51 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_52 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_53 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_54 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_55 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_56 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_57 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_59 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_60 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_61 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_62 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_63 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_64 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_65 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_66 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_67 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_68 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_69 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_7 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_70 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_71 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_72 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_73 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_74 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_75 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_76 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_77 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_78 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_79 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_80 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_81 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_82 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_35 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_37 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_39 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_40 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_41 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_42 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_43 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_45 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_47 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_48 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_49 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_5 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_50 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_51 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_52 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_53 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_54 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_55 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_56 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_57 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_59 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_60 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_61 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_62 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_63 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_64 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_65 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_66 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_67 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_68 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_69 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_7 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_70 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_71 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_72 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_73 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_74 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_75 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_76 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_77 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_78 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_79 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_80 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_81 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_82 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_83 Bin/ISO14443-2A.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_85 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_86 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_87 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_89 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_9 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_90 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_92 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_93 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_94 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_95 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_96 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_97 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_98 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_99 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_85 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_86 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_87 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_89 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_9 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_90 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_92 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_93 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_94 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_95 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_96 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_97 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_98 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_99 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_default Bin/System.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vectors c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -_exit c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) -eeprom_mapen c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -exit c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -fputc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vectors c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +_exit c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) +eeprom_mapen c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +exit c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +fputc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) main Bin/Chameleon-Mini.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -memcmp c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +memcmp c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) Bin/HIDClassDevice.o -memcpy c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) +memcpy c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) Bin/RNDISClassDevice.o Bin/HIDClassDevice.o -memcpy_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) +memcpy_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) Bin/RNDISClassDevice.o Bin/Configuration.o -memset c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) +memset c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) Bin/HIDClassDevice.o -rand c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +rand c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) Bin/Random.o -rand_r c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -snprintf_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +rand_r c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +snprintf_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) Bin/Commands.o -srand c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -strcmp_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) +srand c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +strcmp_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) Bin/CommandLine.o Bin/Commands.o Bin/Button.o -strncpy_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) +strncpy_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) Bin/Button.o -strnlen c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -strnlen_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -vfprintf c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +strnlen c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) +strnlen_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) +vfprintf c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.sym b/Firmware/Chameleon-Mini/Chameleon-Mini.sym index c75c269..ba804d1 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.sym +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.sym @@ -1,8 +1,8 @@ U CALLBACK_Audio_Device_GetSetEndpointProperty U CALLBACK_Audio_Device_GetSetInterfaceProperty - U CALLBACK_HIDParser_FilterHIDReportItem U CALLBACK_HID_Device_CreateHIDReport U CALLBACK_HID_Device_ProcessHIDReport + U CALLBACK_HIDParser_FilterHIDReportItem U CALLBACK_MS_Device_SCSICommandReceived 00000000 W __heap_end 00000000 a __tmp_reg__ @@ -331,18 +331,18 @@ 00000276 T DeviceDescriptor 00000288 t ConfigurationTable 000002f7 t ButtonActionTable -000003d7 t __c.6198 -00000410 t __c.6200 -00000417 t __c.6202 -0000041e t __c.6204 -00000424 t __c.6209 -00000427 t __c.6227 -0000042e t __c.6254 -00000431 t __c.6259 -00000434 t __c.6298 +000003d7 t __c.6287 +00000410 t __c.6289 +00000417 t __c.6291 +0000041e t __c.6293 +00000424 t __c.6298 +00000427 t __c.6316 +0000042e t __c.6343 +00000431 t __c.6348 +00000434 t __c.6387 0000043b T CommandTable -0000059b t __c.5994 -0000059e t __c.5996 +0000059b t __c.6083 +0000059e t __c.6085 000005a1 t StatusTable 00000668 T __ctors_end 00000668 T __ctors_start @@ -479,248 +479,251 @@ 000006a0 W __vector_98 000006a0 W __vector_99 000006a2 T main -00000714 T CALLBACK_USB_GetDescriptor -00000780 T __vector_default -0000078c T SystemInit -00000800 T SystemReset -0000080e T SystemEnterBootloader -0000081a T SystemStartUSBClock -00000850 T SystemStopUSBClock -0000086c T SystemInterruptInit -00000878 t CodecInitDummy -0000087a t CodecTaskDummy -0000087c t ApplicationInitDummy -0000087e t ApplicationResetDummy -00000880 t ApplicationTaskDummy -00000882 t ApplicationProcessDummy -00000888 t ApplicationGetUidDummy -0000088a t ApplicationSetUidDummy -0000088c T ConfigurationSetById -000008de T ConfigurationInit -000008ea T ConfigurationSetByName -0000097a T ConfigurationGetList -000009ee T RandomInit -000009f0 T RandomGetByte -000009f6 T RandomGetBuffer -00000a24 T RandomTick -00000a34 T BufferToHexString -00000aae T HexStringToBuffer -00000b4c T MemoryInit -00000c5a T MemoryReadBlock -00000d70 T MemoryWriteBlock -00001018 T MemoryClear -000010e4 T MemoryUploadBlock -00001140 T MemoryDownloadBlock -0000119e T ButtonInit -000011ac T ButtonTick -00001366 T ButtonGetActionList -000013c6 T ButtonSetActionById -000013d2 T ButtonGetActionByName -000013f8 T ButtonSetActionByName -0000148a T SettingsLoad -0000149a T SettingsSave -000014aa T SettingsSetActiveById -000014c8 T SettingsCycle -000015a2 T SettingsGetActiveById -000015a8 T SettingsGetActiveByName -000015bc T SettingsSetActiveByName -000015da T TerminalSendString -000015e4 T TerminalSendStringP -0000160c T TerminalSendBlock -0000161a T TerminalInit -00001624 T TerminalTask -00001666 T TerminalTick -000016e4 T EVENT_USB_Device_Connect -000016ee T EVENT_USB_Device_Disconnect -000016f8 T EVENT_USB_Device_ConfigurationChanged -00001700 T EVENT_USB_Device_ControlRequest -00001708 T CommandGetVersion -00001762 T CommandGetConfig -000017ac T CommandSetConfig -000017bc T CommandExecConfig -000017c6 T CommandGetUid -00001812 T CommandSetUid -000018ba T CommandGetReadOnly -000018d8 T CommandSetReadOnly -00001904 T CommandExecUpload -0000190e T CommandExecDownload -00001918 T CommandExecReset -0000192e T CommandExecUpgrade -00001944 T CommandGetMemSize -00001992 T CommandGetUidSize -000019dc T CommandExecButton -000019e6 T CommandGetButton -000019f0 T CommandSetButton -00001a00 T CommandGetSetting -00001a0a T CommandSetSetting -00001a1a T CommandExecClear -00001a20 T CommandExecHelp -00001aba T CommandGetRssi -00001b4e t CalcChecksum.constprop.0 -00001b62 T XModemReceive -00001b92 T XModemSend -00001bb8 T XModemProcessByte -00001e6a T XModemTick -00001ec6 T CommandLineProcessByte -0000220c T CommandLineTick -0000220e t StartDemod -0000224c T __vector_34 -000022d4 T __vector_22 -0000241c T __vector_83 -0000262e T ISO14443ACodecInit -0000269e T ISO14443ACodecTask -00002790 T MifareClassicAppInit1K -000027aa T MifareClassicAppInit4K -000027c4 T MifareClassicAppReset -000027cc T MifareClassicAppTask -000027ce T MifareClassicAppProcess +00000710 T CALLBACK_USB_GetDescriptor +00000792 T __vector_default +0000079e T SystemInit +0000080c T SystemReset +0000081a T SystemEnterBootloader +00000826 T SystemStartUSBClock +00000858 T SystemStopUSBClock +00000874 T SystemInterruptInit +00000880 t CodecInitDummy +00000882 t CodecTaskDummy +00000884 t ApplicationInitDummy +00000886 t ApplicationResetDummy +00000888 t ApplicationTaskDummy +0000088a t ApplicationProcessDummy +00000890 t ApplicationGetUidDummy +00000892 t ApplicationSetUidDummy +00000894 T ConfigurationSetById +000008ca T ConfigurationInit +000008d6 T ConfigurationSetByName +00000958 T ConfigurationGetList +000009b6 T RandomInit +000009b8 T RandomGetByte +000009be T RandomGetBuffer +000009dc T RandomTick +000009ec T BufferToHexString +00000a70 T HexStringToBuffer +00000afc T MemoryInit +00000bf8 T MemoryReadBlock +00000d02 T MemoryWriteBlock +00000f88 T MemoryClear +0000103e T MemoryUploadBlock +000010ae T MemoryDownloadBlock +00001120 T ButtonInit +0000112e T ButtonTick +000012e4 T ButtonGetActionList +00001348 T ButtonSetActionById +00001354 T ButtonGetActionByName +00001370 T ButtonSetActionByName +00001402 T SettingsLoad +00001412 T SettingsSave +00001422 T SettingsSetActiveById +00001440 T SettingsCycle +0000151a T SettingsGetActiveById +00001520 T SettingsGetActiveByName +00001534 T SettingsSetActiveByName +0000154e T TerminalSendString +00001558 T TerminalSendStringP +00001580 T TerminalSendBlock +0000158c T TerminalInit +00001596 T TerminalTask +000015d4 T TerminalTick +00001650 T EVENT_USB_Device_Connect +0000165a T EVENT_USB_Device_Disconnect +00001664 T EVENT_USB_Device_ConfigurationChanged +0000166c T EVENT_USB_Device_ControlRequest +00001674 T CommandGetVersion +000016b0 T CommandGetConfig +000016dc T CommandSetConfig +000016ec T CommandExecConfig +000016f6 T CommandGetUid +00001742 T CommandSetUid +000017f0 T CommandGetReadOnly +00001814 T CommandSetReadOnly +0000183c T CommandExecUpload +00001846 T CommandExecDownload +00001850 T CommandExecReset +00001866 T CommandExecUpgrade +0000187c T CommandGetMemSize +000018ac T CommandGetUidSize +000018d8 T CommandExecButton +000018e2 T CommandGetButton +000018ec T CommandSetButton +000018fc T CommandGetSetting +00001906 T CommandSetSetting +00001916 T CommandExecClear +0000191c T CommandExecHelp +000019b4 T CommandGetRssi +00001a1c t CalcChecksum.constprop.0 +00001a30 T XModemReceive +00001a60 T XModemSend +00001a86 T XModemProcessByte +00001d0a T XModemTick +00001d66 T CommandLineProcessByte +000020a8 T CommandLineTick +000020aa t StartDemod +000020e6 T __vector_34 +0000216e T __vector_22 +000022b6 T __vector_83 +00002498 T ISO14443ACodecInit +00002506 T ISO14443ACodecTask +00002602 T MifareClassicAppInit1K +0000261c T MifareClassicAppInit4K +00002636 T MifareClassicAppReset +0000263e T MifareClassicAppTask +00002640 T MifareClassicAppProcess +00002f3a T MifareClassicGetUid +00002f46 T MifareClassicSetUid +00002f86 T ISO14443AAppendCRCA +00002fe4 T ISO14443ACheckCRCA 00002fff W __stack -0000318a T MifareClassicGetUid -00003196 T MifareClassicSetUid -000031d8 T ISO14443AAppendCRCA -00003254 T ISO14443ACheckCRCA -000032f0 t Crypto1LFSR -000033be T Crypto1FilterOutput -00003426 T Crypto1Setup -000037b2 T Crypto1Auth -00003830 T Crypto1Byte -000038b2 T Crypto1Nibble -000038fa T Crypto1PRNG -000039f6 T USB_Device_ProcessControlRequest -00003ca6 W EVENT_USB_Device_Reset -00003ca6 W EVENT_USB_Device_StartOfFrame -00003ca6 W EVENT_USB_Device_Suspend -00003ca6 W EVENT_USB_Device_WakeUp -00003ca6 T USB_Event_Stub -00003ca8 T USB_USBTask -00003cd0 T Endpoint_Write_Stream_LE -00003da8 T Endpoint_Write_Control_Stream_LE -00003ef2 T Endpoint_Write_Control_PStream_LE -00004052 T Endpoint_ClearIN -00004084 T Endpoint_ClearOUT -000040a2 T Endpoint_Read_8 -000040c0 T Endpoint_Write_8 -000040de T Endpoint_SelectEndpoint -00004156 T Endpoint_StallTransaction -0000418e T Endpoint_ClearSETUP -000041e6 T Endpoint_IsSETUPReceived -00004216 T Endpoint_IsOUTReceived -00004246 T Endpoint_IsINReady -00004260 T Endpoint_ConfigureEndpoint_PRV -000042fa T Endpoint_ConfigureEndpointTable -000043d2 T Endpoint_ClearEndpoints -00004442 T Endpoint_ClearStatusStage -0000446e T Endpoint_WaitUntilReady -00004510 T USB_Disable -0000452a T USB_ResetInterface -00004586 T USB_Init -000045da T USB_INT_DisableAllInterrupts -000045e8 T USB_INT_ClearAllInterrupts -000045f4 T __vector_125 -000046d4 T CDC_Device_ProcessControlRequest -0000482a T CDC_Device_ConfigureEndpoints -00004876 T CDC_Device_SendString -000048be T CDC_Device_SendData -00004902 T CDC_Device_SendByte -00004958 T CDC_Device_Flush -000049ea T CDC_Device_USBTask -00004a1e T CDC_Device_ReceiveByte -00004ae8 T CDC_Device_Event_Stub -00004ae8 W EVENT_CDC_Device_BreakSent -00004ae8 W EVENT_CDC_Device_ControLineStateChanged -00004ae8 W EVENT_CDC_Device_LineEncodingChanged -00004aea T __mulsi3 -00004b28 t do_rand -00004bc6 T rand_r -00004bc8 T rand -00004bce T srand -00004be4 T memcpy_P -00004bf6 T strcmp_P -00004c08 T strncpy_P -00004c26 T memcpy -00004c38 T snprintf_P -00004c92 T vfprintf -00005030 T __eerd_block_x32a4u -00005046 T __eewr_block_x32a4u -00005058 T __eewr_byte_x32a4u -0000505a T __eewr_r18_x32a4u -0000509e T strnlen_P -000050b4 T strnlen -000050ca T fputc -00005122 T __ultoa_invert -000051de T __divmodsi4 -000051f2 t __divmodsi4_neg2 -00005200 t __divmodsi4_exit -00005202 t __divmodsi4_neg1 -00005214 T __prologue_saves__ -00005246 T __epilogue_restores__ -00005276 T __udivmodsi4 -00005282 t __udivmodsi4_loop -0000529c t __udivmodsi4_ep -000052ba T _exit -000052ba W exit -000052bc t __stop_program -000052be A __data_load_start -000052be T _etext -00005360 A __data_load_end -00802000 D TerminalHandle +00003062 t Crypto1LFSR +000030ee T Crypto1FilterOutput +00003156 T Crypto1Setup +00003496 T Crypto1Auth +000034e8 T Crypto1Byte +0000356a T Crypto1Nibble +000035b2 T Crypto1PRNG +00003668 T USB_Device_ProcessControlRequest +000038fe W EVENT_USB_Device_Reset +000038fe W EVENT_USB_Device_StartOfFrame +000038fe W EVENT_USB_Device_Suspend +000038fe W EVENT_USB_Device_WakeUp +000038fe T USB_Event_Stub +00003900 T USB_USBTask +0000392a T Endpoint_Write_Stream_LE +00003a02 T Endpoint_Write_Control_Stream_LE +00003b44 T Endpoint_Write_Control_PStream_LE +00003c82 T Endpoint_ClearIN +00003cb4 T Endpoint_ClearOUT +00003cd2 T Endpoint_Read_8 +00003cf0 T Endpoint_Write_8 +00003d0e T Endpoint_SelectEndpoint +00003d80 T Endpoint_StallTransaction +00003db8 T Endpoint_ClearSETUP +00003e10 T Endpoint_IsSETUPReceived +00003e42 T Endpoint_IsOUTReceived +00003e74 T Endpoint_IsINReady +00003e8c T Endpoint_ConfigureEndpoint_PRV +00003f26 T Endpoint_ConfigureEndpointTable +00004012 T Endpoint_ClearEndpoints +00004082 T Endpoint_ClearStatusStage +000040ae T Endpoint_WaitUntilReady +00004154 T USB_Disable +0000416e T USB_ResetInterface +000041ca T USB_Init +0000421c T USB_INT_DisableAllInterrupts +0000422a T USB_INT_ClearAllInterrupts +00004236 T __vector_125 +00004310 T CDC_Device_ConfigureEndpoints +0000435a T CDC_Device_SendString +000043ac T CDC_Device_SendData +00004400 T CDC_Device_SendByte +0000446e T CDC_Device_Flush +000044fe T CDC_Device_USBTask +00004534 T CDC_Device_ReceiveByte +000045f2 T CDC_Device_Event_Stub +000045f2 W EVENT_CDC_Device_BreakSent +000045f2 W EVENT_CDC_Device_ControLineStateChanged +000045f2 W EVENT_CDC_Device_LineEncodingChanged +000045f4 T CDC_Device_ProcessControlRequest +0000472e T __mulshisi3 +00004732 T __mulohisi3 +0000473a T __muluhisi3 +0000474e T __umulhisi3 +00004766 t do_rand +000047fc T rand_r +000047fe T rand +00004804 T srand +0000481a T memcpy_P +0000482c T strcmp_P +0000483e T strncpy_P +0000485c T memcpy +0000486e T snprintf_P +000048c8 T vfprintf +00004c62 T __eerd_block_x32a4u +00004c78 T __eewr_block_x32a4u +00004c8a T __eewr_byte_x32a4u +00004c8c T __eewr_r18_x32a4u +00004cd0 T strnlen_P +00004ce6 T strnlen +00004cfc T fputc +00004d54 T __ultoa_invert +00004e10 T __divmodsi4 +00004e26 t __divmodsi4_neg1 +00004e36 t __divmodsi4_neg2 +00004e44 t __divmodsi4_exit +00004e46 T __prologue_saves__ +00004e78 T __epilogue_restores__ +00004ea8 T __udivmodsi4 +00004eb4 t __udivmodsi4_loop +00004ece t __udivmodsi4_ep +00004eec T _exit +00004eec W exit +00004eee t __stop_program +00004ef0 A __data_load_start +00004ef0 T _etext +00004f82 A __data_load_end 00802000 D __data_start +00802000 D TerminalHandle 0080201b d TerminalInitDelay -0080201d d TableAB -0080206d d TableC -0080209d d next -008020a2 b LastButtonState.4027 -008020a2 B __bss_start -008020a2 D __data_end -008020a2 D _edata -008020a3 B LEDPulseMask -008020a4 B TerminalState -008020a5 b State -008020a6 b CurrentFrameNumber -008020a7 b RetryCount -008020a8 b RetryTimeout -008020a9 b BlockAddress -008020ad b CallbackFunc -008020af b BufferIdx -008020b1 b Checksum -008020b2 b ReceivedFrameNumber -008020b3 b BufferIdx -008020b5 b SamplePosition -008020b6 b LoadModState -008020b7 b LastBit -008020b8 b IsParityBit -008020b9 b SampleRegister -008020ba b DataRegister -008020bb b BitSent -008020bd b BitCount -008020bf b Flags -008020c1 b CodecBufferPtr -008020c3 b ParityBufferPtr -008020c5 b State -008020c6 b CardATQAValue -008020c8 b CardSAKValue -008020c9 b ReaderResponse -008020cd b CardResponse -008020d1 b CurrentAddress -008020d2 b BlockBuffer -008020e2 b StateOdd -008020e5 b StateEven -008020e8 B ActiveConfiguration -0080210d B GlobalSettings -00802120 B TerminalBuffer -00802220 B CodecBuffer -00802320 B USB_Device_ConfigurationNumber -00802321 B USB_Device_CurrentlySelfPowered -00802322 B USB_Device_RemoteWakeupEnabled -00802323 B USB_IsInitialized -00802324 B USB_DeviceState -00802325 B USB_ControlRequest -0080232d B USB_Endpoint_SelectedFIFO -0080232f B USB_Endpoint_SelectedHandle -00802331 B USB_Endpoint_SelectedEndpoint -00802332 B USB_Endpoint_FIFOs -0080264a B USB_EndpointTable -008026ad B __bss_end -008026ad B _end +0080201c d next +00802020 d TableAB +00802070 d TableC +00802092 B __bss_start +00802092 D __data_end +00802092 D _edata +00802092 b LastButtonState.4112 +00802093 B LEDPulseMask +00802094 B TerminalState +00802095 b State +00802096 b CurrentFrameNumber +00802097 b RetryCount +00802098 b RetryTimeout +00802099 b BlockAddress +0080209d b CallbackFunc +0080209f b BufferIdx +008020a1 b Checksum +008020a2 b ReceivedFrameNumber +008020a3 b BufferIdx +008020a5 b SamplePosition +008020a6 b LoadModState +008020a7 b LastBit +008020a8 b IsParityBit +008020a9 b SampleRegister +008020aa b DataRegister +008020ab b BitSent +008020ad b BitCount +008020af b Flags +008020b1 b CodecBufferPtr +008020b3 b ParityBufferPtr +008020b5 b State +008020b6 b CardATQAValue +008020b8 b CardSAKValue +008020b9 b ReaderResponse +008020bd b CardResponse +008020c1 b CurrentAddress +008020c2 b BlockBuffer +008020d2 b StateOdd +008020d5 b StateEven +008020d8 B ActiveConfiguration +008020fd B GlobalSettings +00802110 B TerminalBuffer +00802210 B CodecBuffer +00802310 B USB_Device_ConfigurationNumber +00802311 B USB_Device_CurrentlySelfPowered +00802312 B USB_Device_RemoteWakeupEnabled +00802313 B USB_IsInitialized +00802314 B USB_DeviceState +00802315 B USB_ControlRequest +0080231d B USB_Endpoint_SelectedFIFO +0080231f B USB_Endpoint_SelectedHandle +00802321 B USB_Endpoint_SelectedEndpoint +00802322 B USB_Endpoint_FIFOs +0080263a B USB_EndpointTable +0080269d B __bss_end +0080269d B _end 00810000 D StoredSettings 00810013 D __eeprom_end diff --git a/Firmware/Chameleon-Mini/Memory.c b/Firmware/Chameleon-Mini/Memory.c index 51e29e9..3fc97ac 100644 --- a/Firmware/Chameleon-Mini/Memory.c +++ b/Firmware/Chameleon-Mini/Memory.c @@ -217,11 +217,15 @@ void MemoryInit(void) { /* Configure MEMORY_FLASH_USART for SPI master mode 0 with maximum clock frequency */ MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_SCK; + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_MOSI; + MEMORY_FLASH_PORT.DIRSET = MEMORY_FLASH_SCK | MEMORY_FLASH_MOSI | MEMORY_FLASH_CS; MEMORY_FLASH_USART.BAUDCTRLA = 0; MEMORY_FLASH_USART.BAUDCTRLB = 0; - MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc | USART_CHSIZE_8BIT_gc; + MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm;

8I-<3SWCP8k^zK~xnu@i#Kg2QgZ} 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 RZh*!VWCR87b3-Eo1^}}8-Pr&D diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Chameleon-Mini.hex index 47960fd..ec9bcdc 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.hex @@ -3,10 +3,10 @@ :100020003FC300003DC300003BC3000039C30000D4 :1000300037C3000035C3000033C3000031C30000E4 :100040002FC300002DC300002BC3000029C30000F4 -:1000500027C3000025C300000C946A1121C30000CF +:1000500027C3000025C300000C94B71021C3000083 :100060001FC300001DC300001BC3000019C3000014 :1000700017C3000015C3000013C3000011C3000024 -:100080000FC300000DC300000C94261109C300002B +:100080000FC300000DC300000C94731009C30000DF :1000900007C3000005C3000003C3000001C3000044 :1000A000FFC20000FDC20000FBC20000F9C2000058 :1000B000F7C20000F5C20000F3C20000F1C2000068 @@ -18,7 +18,7 @@ :10011000C7C20000C5C20000C3C20000C1C20000C7 :10012000BFC20000BDC20000BBC20000B9C20000D7 :10013000B7C20000B5C20000B3C20000B1C20000E7 -:10014000AFC20000ADC20000ABC200000C940E12A2 +:10014000AFC20000ADC20000ABC200000C945B1156 :10015000A7C20000A5C20000A3C20000A1C2000007 :100160009FC200009DC200009BC2000099C2000017 :1001700097C2000095C2000093C2000091C2000027 @@ -29,7 +29,7 @@ :1001C0006FC200006DC200006BC2000069C2000077 :1001D00067C2000065C2000063C2000061C2000087 :1001E0005FC200005DC200005BC2000059C2000097 -:1001F00057C200000C94FA2253C200001C034C00AA +:1001F00057C200000C941B2153C200001C034C008A :100200005500460041002000430044004300200008 :10021000440065006D006F00000018034400650095 :1002200061006E002000430061006D0065007200F7 @@ -39,13 +39,13 @@ :10026000040100020A00000007050402100005074F :100270000583021000051201100102000008EB03C3 :10028000442001000102DC01004E4F4E45000000F9 -:100290000000000000000000003C043D043E043F5C -:1002A00004400441044404450400000001014D469B -:1002B0005F434C41535349435F314B0000001713D8 -:1002C0004F13C813E213E613E713C518CB18000445 +:10029000000000000000000000400441044204434C +:1002A00004440445044804490400000001014D468B +:1002B0005F434C41535349435F314B0000004C12A4 +:1002C000831201131B131F1320139D17A317000480 :1002D0000400024D465F434C41535349435F344B46 -:1002E00000000017134F13D513E213E613E713C5ED -:1002F00018CB18001004004E4F4E450000000000BF +:1002E0000000004C1283120E131B131F1320139DCA +:1002F00017A317001004004E4F4E450000000000E9 :1003000000000000000000000000000000000000ED :10031000000000000000005549445F52414E444F28 :100320004D00000000000000000000000000000080 @@ -63,30 +63,30 @@ :1003E0002D4D696E69202553207573696E67204C09 :1003F00055464120255320636F6D70696C656420FC :1004000077697468204156522D4743432025530095 -:100410003134303130320031333039303100342E24 -:10042000362E320025730052414E444F4D00257543 +:100410003134303531310031333039303100342E20 +:10042000372E320025730052414E444F4D00257542 :1004300000257500253575206D56005645525349E7 -:100440004F4E00000000000000000000000000848B +:100440004F4E000000000000000000000000003AD5 :100450000B434F4E464947000000000000000000DB -:1004600000DE0BD60BB10B55494400000000000024 -:10047000000000000000000000090CE30B524541A1 -:10048000444F4E4C59000000000000000000006C7A -:100490000C5D0C55504C4F41440000000000000022 -:1004A000000000820C00000000444F574E4C4F41AA -:1004B000440000000000000000870C000000005213 -:1004C0004553455400000000000000000000008C6F +:1004600000760B6E0B580B5549440000000000004D +:10047000000000000000000000A10B7B0B52454172 +:10048000444F4E4C59000000000000000000000ADC +:100490000CF80B55504C4F41440000000000000088 +:1004A0000000001E0C00000000444F574E4C4F410E +:1004B000440000000000000000230C000000005277 +:1004C00045534554000000000000000000000028D3 :1004D0000C00000000555047524144450000000008 -:1004E0000000000000970C000000004D454D5349EE -:1004F0005A4500000000000000000000000000A2BB +:1004E0000000000000330C000000004D454D534952 +:1004F0005A45000000000000000000000000003E1F :100500000C55494453495A450000000000000000C2 -:100510000000000000C90C425554544F4E0000002A -:1005200000000000000000EE0CF80CF30C534554E2 -:1005300054494E4700000000000000000000000584 -:100540000D000D434C45415200000000000000002A -:100550000000000D0D0000000048454C5000000058 -:10056000000000000000000000100D00000000521C +:100510000000000000560C425554544F4E0000009D +:10052000000000000000006C0C760C710C53455468 +:1005300054494E4700000000000000000000008306 +:100540000C7E0C434C4541520000000000000000AE +:100550000000008B0C0000000048454C50000000DB +:100560000000000000000000008E0C00000000529F :10057000535349000000000000000000000000008C -:100580000000005D0D000000000000000000000001 +:10058000000000DA0C000000000000000000000085 :1005900000000000000000000000000D0A000D0A2D :1005A00000643130303A4F4B000000000000000082 :1005B000000000000000000000000000000000003B @@ -101,1236 +101,1174 @@ :10064000000000000000CA3230323A494E56414C98 :10065000494420504152414D45544552000000004C :10066000000000000000000011241FBECFEFDFE2F9 -:10067000DEBFCDBF10E2A0E0B0E2EEEBF2E502C0DB -:1006800005900D92A23AB107D9F716E2A2EAB0E2BC -:1006900001C01D92AD3AB107E1F703D00C945D297A -:1006A0006FC074D0F2D680E3E0E0F6E081834ED2F2 -:1006B00016D1B3D79CD173D5E0E0F2E081E080930E -:1006C0000002118292E0928393E0948380A388E3F6 -:1006D00081A3CCD0C0E0DAE0FF24F39400E016E080 -:1006E000A1D7E091FB20F091FC200995E091012138 -:1006F000F0910221099580910C0A80FFF1CFFC86D0 -:1007000091D1B1D753D58091A320F801868310925F -:10071000A320E6CF9230F9F09330A1F0913049F068 -:1007200080E090E0E0E0F0E0DA01ED93FC931197D7 -:10073000089582E190E0E6E7F2E0DA01ED93FC93C0 -:1007400011970895813081F0813098F4E4E3F2E06C -:10075000849190E0E9CF8EE390E0E8E3F2E0DA0103 -:10076000ED93FC9311970895EAE1F2E0849190E013 -:10077000DBCF8230A9F6ECEFF1E0849190E0D4CFAA -:100780001F920F920FB60F921124FFCF8091780025 -:1007900083FF0AC088E08093780088ED84BF81E001 -:1007A00080938000FD95FEC080915000866080930C -:1007B00050008091510081FFFCCF8091510082FF59 -:1007C000FCCFE0E5F0E0168221E02093600088EDA8 -:1007D00084BF2093400083ED90E3E0E0FAE086A33D -:1007E00097A386E08093000AE0E4F0E0238320935F -:1007F00000048091CC018860E0ECF1E084870895EA -:1008000088ED84BF81E0E8E7F0E08183089588ED1A -:1008100084BF8BE18093800008958BECE0E5F0E0ED -:1008200082838091500088608093500080915100B5 -:1008300083FFFCCF84ECE0E5F0E0858380915000FD -:100840008061809350008091510084FFFCCF089517 -:10085000E0E4F0E084818E7F8483E0E5F0E0808155 -:100860008F7E80838081877F8083089587E0E0EAA0 -:10087000F0E0828378940895089508950895089586 -:10088000089580E090E0089508950895E0910E2184 -:10089000F0910F21818390E09C01220F331F220FE2 -:1008A000331FB901660F771F660F771F660F771F1B -:1008B000620F731F680F791F68577D4F88EE90E2B3 -:1008C00045E250E00E94F225E091FD20F091FE20EB -:1008D0000995E091F920F091FA2009950895E091A9 -:1008E0000E21F0910F218181D1CF0F931F93CF93D0 -:1008F000DF93AC0120E030E08C010F5F1F4F622FCF -:10090000C901880F991F880F991FFC01EE0FFF1F67 -:10091000EE0FFF1FEE0FFF1FE80FF91FE20FF31F8F -:10092000E757FD4F8491DA01882359F09C91992370 -:1009300059F0981749F4E80131961196849188236B -:1009400071F48C91882389F02F5F3F4F233031055C -:10095000B1F680E0DF91CF911F910F9108959991A9 -:10096000992391F3981741F3EFCF862F8FDF81E022 -:10097000DF91CF911F910F910895CF93DF93EC01F9 -:100980006150704020E030E04CE2C901880F991FAF -:10099000880F991FFC01EE0FFF1FEE0FFF1FEE0FD8 -:1009A000FF1FE80FF91FE20FF31FE757FD4F849178 -:1009B000882381F06131710568F0DE0103C0603188 -:1009C000710541F08D93ED01319661507040849135 -:1009D0008823A9F72230310521F41882DF91CF91C5 -:1009E00008954993615070402F5F3F4FCECF0895D7 -:1009F0000C94E42508950F931F93CF93DF93662300 -:100A000061F08C010F5F1F4F6150060F111DEC014B -:100A1000EFDF8993C017D107D9F7DF91CF911F91ED -:100A20000F9108950E94E4250E94E4250E94E42588 -:100A30000C94E425CF93DF93FC012115310581F15E -:100A4000615070406230710558F1DA0140E050E0C9 -:100A500018C0D05DD0838C2F90E08F7090708A305A -:100A60009105D4F48C2F8F70805D818332964E5F18 -:100A70005F4F21503040B1F06250704062307105DC -:100A800088F0CD91DC2FD295DF708D2F90E08A30E9 -:100A90009105FCF2D95CDECF8C2F8F70895CE5CF9D -:100AA00040E050E01082CA01DF91CF910895CF93CA -:100AB000DF93DA012C91222309F443C011963C9173 -:100AC00011973323F1F161157105D9F11396EC01FA -:100AD00080E090E014C02295207F313430F5342F2F -:100AE000232B29930196FD0131972081222331F197 -:100AF0003C91332331F1129668177907F9F0422FB0 -:100B000040534A3018F041514630D8F4432F4053F7 -:100B10004A3020F0532F5154563098F42134D8F2F3 -:100B20002295207F20573134D0F23753232B29933D -:100B30000196FD01319720812223D1F6DF91CF91DB -:100B4000089580E090E0DF91CF910895CF93DF93F7 -:100B500000D000D0CDB7DEB7A0E6B6E080E11596B4 -:100B60008C9315979AE111969C931197E0EAF9E01E -:100B70001682178293EC958398E1948316968C9352 -:100B8000169787ED8093A0098091A10986FFFCCF7D -:100B900080E4E0EAF9E081838091A0091092A00945 -:100BA0008091A10986FFFCCF80E4E0EAF9E081832F -:100BB0008091A00990E1E0E6F6E0958380FD47C0D2 -:100BC0008DE389838AE28A8380E88B8386EA8C833B -:100BD000A0E6B6E020E137EDE0EAF9E090E4169611 -:100BE0002C9316973093A0098091A10986FFFCCF22 -:100BF00091838091A0091092A0098091A10986FF9C -:100C0000FCCF91838091A00915962C93159787FFAF -:100C1000E6CF80E1E0E6F6E08683CE010596FE01B0 -:100C20003196A0EAB9E030E421912093A009209107 -:100C3000A10926FFFCCF11963C9311972091A009A2 -:100C4000E817F90789F780E1E0E6F6E08583249666 -:100C5000CDBFDEBFDF91CF9108950F931F93CF9348 -:100C6000DF93EC018B0120E030E080910D2190E0DA -:100C7000A0E0B0E0DC0199278827080F191F2A1F80 -:100C80003B1FA0E6B6E060E177EDE0EAF9E090E432 -:100C900016966C9316977093A0098091A10986FF10 -:100CA000FCCF91838091A0091092A0098091A109A5 -:100CB00086FFFCCF91838091A00915966C931597C0 -:100CC00087FFE6CF80E1E0E6F6E0868383E080936D -:100CD000A0098091A10986FFFCCF80E4E0EAF9E059 -:100CE00081838091A009C901AA27BB278093A0090D -:100CF0008091A10986FFFCCF80E4E0EAF9E08183DE -:100D00008091A009BB27A32F922F812F8093A00948 -:100D10008091A10986FFFCCF80E4E0EAF9E08183BD -:100D20008091A0090093A0098091A10986FFFCCFC2 -:100D300080E4E0EAF9E081838091A0094115510542 -:100D400071F090E41092A0098091A10986FFFCCF78 -:100D500091838091A00989934150504099F780E197 -:100D6000E0E6F6E08583DF91CF911F910F91089522 -:100D70002F923F924F925F926F927F928F929F92AB -:100D8000AF92BF92CF92DF92EF92FF920F931F9399 -:100D9000CF93DF93CDB7DEB72697CDBFDEBF8B8372 -:100DA0009C834A0180910D214115510509F41EC112 -:100DB0006B01EE24FF2490E0A0E0B0E0DC01992775 -:100DC0008827C80ED91EEA1EFB1E212C01E0302EFA -:100DD00000E130E147EDE0EAF9E050E420E410E61C -:100DE000612E16E0712E60E117ED240146015701D6 -:100DF000BB27AB2D9A2D892D7C01982D6101C81838 -:100E0000D1084C145D0408F46201609366061093E7 -:100E1000A0098091A10986FFFCCF21838091A009C0 -:100E20001092A0098091A10986FFFCCF21838091B7 -:100E3000A0093093650687FFE8CFD30116963C934F -:100E4000B3E5B093A0098091A10986FFFCCF51833F -:100E50008091A009F092A0098091A10986FFFCCFA2 -:100E600051838091A009E092A0098091A10986FF99 -:100E7000FCCF51838091A0091092A0098091A10913 -:100E800086FFFCCF51838091A009009365063093C3 -:100E900066064093A0098091A10986FFFCCF2183BB -:100EA0008091A0091092A0098091A10986FFFCCF32 -:100EB00021838091A0093093650687FFE8CFD30195 -:100EC00016963C93B4E8B093A0098091A10986FFDF -:100ED000FCCF51838091A0091092A0098091A109B3 -:100EE00086FFFCCF51838091A0091092A0098091C8 -:100EF000A10986FFFCCF51838091A0099093A0099E -:100F00008091A10986FFFCCF51838091A009C11473 -:100F1000D104D9F0C601AB81AD83BC81BE83C98247 -:100F2000DA82AD81BE817D917093A0096D01DC01F3 -:100F30008091A10986FFFCCFCD01D601218370915C -:100F4000A009019781F7C980DA8000936506309384 -:100F500066064093A0098091A10986FFFCCF2183FA -:100F60008091A0091092A0098091A10986FFFCCF71 -:100F700021838091A0093093650687FFE8CFD301D4 -:100F800016963C93B3E8B093A0098091A10986FF1F -:100F9000FCCF51838091A009F092A0098091A10912 -:100FA00086FFFCCF51838091A009E092A009809137 -:100FB000A10986FFFCCF51838091A0091092A0095E -:100FC0008091A10986FFFCCF51838091A0090093F5 -:100FD00065064C185D08C601A0E0B0E0880E991EB9 -:100FE000AA1EBB1E4114510409F002CF2696CDBFA4 -:100FF000DEBFDF91CF911F910F91FF90EF90DF90B7 -:10100000CF90BF90AF909F908F907F906F905F90A8 -:101010004F903F902F9008951F93CF93DF9380912F -:101020000D2190E0A0E0B0E0BA2FA92F982F8827DB -:101030009C0120503F4FA0E6B6E0D0E160E177EDA3 -:10104000E0EAF9E0C0E450E411E816966C931697D4 -:101050007093A0094091A10946FFFCCF51834091B4 -:10106000A0091092A0094091A10946FFFCCF51832D -:101070004091A00915966C93159747FFE6CF1696F9 -:10108000DC9316971093A0094091A10946FFFCCF6D -:10109000C1834091A0099093A0094091A10946FF06 -:1010A000FCCFC1834091A0098093A0094091A10980 -:1010B00046FFFCCFC1834091A0091092A009409146 -:1010C000A10946FFFCCFC1834091A0091596DC938E -:1010D000159701968217930709F0B7CFDF91CF914B -:1010E0001F9108950F931F93FC01403080E0580733 -:1010F00081E0680780E0780720F081E01F910F9180 -:10110000089580E090E0A1E0B0E0841B950BA60B71 -:10111000B70B890120E030E080179107A207B307E1 -:1011200040F0CF01BA01A80123DE81E01F910F91A9 -:1011300008958C019D01CF01BA01A80119DEF5CFF8 -:101140000F931F93FC01403080E0580781E068074F -:1011500080E0780720F080E01F910F91089580E0F3 -:1011600090E0A1E0B0E0841B950BA60BB70B8901C2 -:1011700020E030E080179107A207B30740F0CF01CD -:10118000BA01A8016ADD81E01F910F9108958C01D9 -:101190009D01CF01BA01A80160DD81E0F5CFE0E05B -:1011A000F6E080E4828388E1868B0895FF920F93B6 -:1011B0001F93CF93DF93CDB7DEB7A097CDBFDEBF30 -:1011C0009091080690958091A22089278923909379 -:1011D000A22086FF15C0E0910E21F0910F218081A1 -:1011E0008130B9F0823079F1833009F44EC0843017 -:1011F00009F470C0853009F48FC0863009F468C0E6 -:10120000A096CDBFDEBFDF91CF911F910F91FF90D0 -:10121000089580910B21882309F4A1C0FF248E0139 -:101220000F5F1F4FE5DBF801EF0DF11D8083F39495 -:1012300080910B21F816B0F3E0910721F09108217D -:10124000C8010995DDCFE0910521F09106218E01BD -:101250000F5F1F4FC801099520910B21222361F3D5 -:10126000F801CE0102962150820F911D21E0222328 -:1012700039F0308121E03F3F09F020E03F5F3083CB -:101280003196E817F90799F7D7CFE0910521F0914A -:1012900006218E010F5F1F4FC801099520910B2178 -:1012A00031E0222349F221503323D9F3822F90E0F9 -:1012B000F801E80FF91F408131E04F3F09F030E0BD -:1012C000800F911F4F5FFC014083222361F7B4CF51 -:1012D000FBD096CFE0910521F09106218E010F5FA2 -:1012E0001F4FC801099520910B21222309F4A4CF97 -:1012F000F801CE0102962150820F911D21E0222398 -:1013000031F0308121E0311120E0315030833196CD -:10131000E817F907A1F790CFE0910521F091062198 -:101320008E010F5F1F4FC801099520910B2131E0FD -:10133000222309F481CF21503323D1F3822F90E06F -:10134000F801E80FF91F408131E0411130E0800FD2 -:10135000911F4150FC014083222369F76DCF8E011C -:101360000F5F1F4F69CFCF93DF93EC016150704047 -:1013700027EF32E04CE2C901F9015491552389F07D -:101380006132710570F0DE0103C06032710549F011 -:101390005D93ED01019661507040FC01549155231D -:1013A000A1F7F3E0273B3F0721F41882DF91CF91AB -:1013B0000895499361507040205E3F4F83E0273D80 -:1013C0003807C9F6F2CFE0910E21F0910F2180830A -:1013D0000895AB01E0910E21F0910F21608170E042 -:1013E000660F771F62957295707F7627607F7627EC -:1013F00069507D4F0C940426CF93DF93EC0167EF87 -:1014000072E00E94FB25009771F1CE0167E173E065 -:101410000E94FB25009769F1CE0167E373E00E940B -:10142000FB25009741F1CE0167E573E00E94FB25A3 -:10143000009719F1CE0167E773E00E94FB25009742 -:10144000F1F0CE0167E973E00E94FB250097C9F037 -:10145000CE0167EB73E00E94FB250097A1F080E0CE -:10146000DF91CF91089580E0AEDF81E0DF91CF91F1 -:10147000089581E0F9CF82E0F7CF83E0F5CF84E0F3 -:10148000F3CF85E0F1CF86E0EFCF8DE091E260E031 -:1014900070E043E150E00C9418288DE091E260E0A8 -:1014A00070E043E150E00C942328883008F0089560 -:1014B00080930D2190E0880F991F805F9E4D80934F -:1014C0000E2190930F210BCA80910D218F5F8770A1 -:1014D000282F30E0F901EE0FFF1FEF5EFE4D9081E7 -:1014E000992309F05DC0C90101968770282F30E06B -:1014F000F901EE0FFF1FEF5EFE4D9081992309F079 -:101500004FC0C90101968770282F30E0F901EE0F16 -:10151000FF1FEF5EFE4D9081992309F041C0C90184 -:1015200001968770282F30E0F901EE0FFF1FEF5E64 -:10153000FE4D90819923A1F5C90101968770282F4E -:1015400030E0F901EE0FFF1FEF5EFE4D9081992311 -:1015500039F5C90101968770282F30E0F901EE0FA7 -:10156000FF1FEF5EFE4D90819923D1F4C9010196D2 -:101570008770282F30E0F901EE0FFF1FEF5EFE4D60 -:101580009081992369F4C90101968770E82FF0E0F2 -:10159000EE0FFF1FEF5EFE4D9081992309F4089531 -:1015A00084CF80910D210895CF93DF93EC01F9DF73 -:1015B000805D88831982DF91CF910895FC0180813D -:1015C0009181992341F48053883010F080E0089590 -:1015D0006CDF81E0089580E00895BC0180E090E236 -:1015E0000C943B24CF93DF93FC016491662359F064 -:1015F000EC01219680E090E20E948124FE01219678 -:1016000064916623B9F7DF91CF9108959C01AB01F6 -:1016100080E090E2B9010C945F2480E2E0E6F6E01D -:1016200082830895CF93DF9380E090E20E94F524B7 -:101630000E94541E80E090E20E940F25EC0197FD6D -:101640000AC080E18093A320E0E0F6E085838C2F40 -:10165000B3D2882319F0DF91CF9108958C2F33D422 -:10166000DF91CF9108958091A420813009F18130DC -:1016700030F0823059F1833071F0F7D3C7C58091D3 -:10168000680685FFFACF84E180931B2081E0809378 -:10169000A420EBD3BBC580911B20815080931B20DD -:1016A000882359F70E948822D3D81092A420E5CF2E -:1016B00080911B20815080931B208823F1F6ADD8A8 -:1016C0000E94C32282E08093A420D7CF8091680635 -:1016D00085FDD3CF84E180931B2083E08093A420F9 -:1016E000C4D394C580E2E0E0F6E08583089580E20B -:1016F000E0E0F6E08683089580E090E20C94152403 -:1017000080E090E20C946A232DB73EB72C50304015 -:101710002DBF3EBFEDB7FEB73196ADB7BEB7119640 -:101720008D939C93129780E091E08283938387ED61 -:1017300093E08483958380E194E08683978387E1B7 -:1017400094E0808791878EE194E0828793870E945E -:101750001C262DB73EB7245F3F4F2DBF3EBF85E609 -:1017600008952DB73EB7285030402DBF3EBFEDB78E -:10177000FEB73196ADB7BEB711968D939C93129775 -:1017800080E091E08283938384E294E08483958374 -:1017900089EE90E2868397830E941C262DB73EB780 -:1017A000285F3F4F2DBF3EBF85E608959ED8882312 -:1017B00011F48AEC089571DE84E6089560E071E02A -:1017C000DCD885E608950F931F93CF93DF93CDB7B1 -:1017D000DEB7A197CDBFDEBF8C0120910B21E09138 -:1017E0000521F0910621CE01019629A30995C80192 -:1017F00060E071E0AE014F5F5F4F29A130E01AD980 -:1018000085E6A196CDBFDEBFDF91CF911F910F91ED -:101810000895BF92CF92DF92EF92FF920F931F93A2 -:10182000CF93DF93CDB7DEB7A097CDBFDEBF8C01DE -:10183000E0900B21FF2467E274E00E94FB250097F3 -:1018400049F5E114F104A1F1BB2400E010E06E01C0 -:101850000894C11CD11CCCD8F601E00FF11F808385 -:10186000B3940B2D10E00E151F05A8F3E09107218E -:10187000F0910821C601099584E6A096CDBFDEBF90 -:10188000DF91CF911F910F91FF90EF90DF90CF905C -:10189000BF9008956E010894C11CD11CC60160E27E -:1018A00070E0A80104D98E159F0501F38AECE5CFFD -:1018B0006E010894C11CD11CD9CFFC0180910C2170 -:1018C000882329F480E38083118285E6089581E3EB -:1018D0008083118285E60895FC018181882339F493 -:1018E0008081813331F0803349F08AEC08958AECAD -:1018F000089581E080930C2184E6089510920C21D4 -:1019000084E6089582E798E02CD18EE6089580EA77 -:1019100098E03FD18EE60895E0ECF4E081818E7F7F -:1019200081830E9488220E94000484E60895E0ECEE -:10193000F4E081818E7F81830E9488220E940704C7 -:1019400084E608952DB73EB7285030402DBF3EBFE6 -:10195000EDB7FEB73196ADB7BEB711968D939C9398 -:10196000129780E091E0828393838EE294E08483F7 -:1019700095838091092190910A21868397830E9403 -:101980001C262DB73EB7285F3F4F2DBF3EBF85E6D3 -:1019900008952DB73EB7285030402DBF3EBFEDB75C -:1019A000FEB73196ADB7BEB711968D939C93129743 -:1019B00080E091E08283938381E394E08483958344 -:1019C00080910B21868317820E941C262DB73EB77B -:1019D000285F3F4F2DBF3EBF85E6089560E071E070 -:1019E000C2DC85E6089560E071E0F3DC85E60895E9 -:1019F00003DD882311F48AEC08954FDD84E6089511 -:101A000060E071E0D1DD85E60895D8DD882311F42A -:101A10008AEC089542DD84E60895FEDA84E60895AE -:101A2000BF92CF92DF92EF92FF920F931F93CF93CB -:101A3000DF937C01CFEFD0E02BE3C22E24E0D22E47 -:101A40003CE2B32E86018CE190E2B6010E94FB25B8 -:101A5000009729F1F6018491882389F0C132D105DC -:101A600070F0D70103C0C032D10549F08D937D01DC -:101A70000F5F1F4F2197F80184918823A1F7F70189 -:101A8000B1927F01219786E190E0C80ED91E8601B0 -:101A90008CE190E2B6010E94FB250097D9F6F70190 -:101AA0003197108285E6DF91CF911F910F91FF90C2 -:101AB000EF90DF90CF90BF900895CF93DF93209168 -:101AC00020022068E0E0F2E020A32091230220FF22 -:101AD000FCCF21E0E0E0F2E023A3609110027091DE -:101AE00011022DB73EB7285030402DBF3EBFCDB7B5 -:101AF000DEB72196EDB7FEB78183928380E091E057 -:101B00008A839B8384E394E08C839D836E5B704027 -:101B100077FD1AC0882777FD8095982F29E637E54D -:101B20004BE050E00E947525DC01CB01AE83BF8302 -:101B30000E941C262DB73EB7285F3F4F2DBF3EBFEA -:101B400085E6DF91CF91089560E070E0E3CF80E01B -:101B5000E0E2F1E29191890F91E2E03AF907D1F7E1 -:101B6000089521E02093A5202093A62024E120932E -:101B7000A72025E02093A8201092A9201092AA2047 -:101B80001092AB201092AC208093AD209093AE20A9 -:101B9000089527E02093A52024E62093A820109202 -:101BA000A9201092AA201092AB201092AC20809312 -:101BB000AD209093AE200895CF93C82F8091A5209B -:101BC000853009F484C08630E8F0873009F44EC0CF -:101BD000873070F52091B2208091A620281709F453 -:101BE000E1C030E090E001972817390709F40BC1F4 -:101BF00080E090E268E10E9481241092A52081E0BB -:101C0000CF910895833009F45AC08430C0F08C2FEE -:101C100090E04091B2202FEF30E0241B3109821771 -:101C2000930709F06BC085E08093A52081E0E8CFA1 -:101C30008830F9F08930A9F080E0CF9108958130A3 -:101C4000D8F3C13009F4E9C0C43009F4FBC0C8318D -:101C500041F081E0CF91089580E090E266E00E943B -:101C600081241092A52081E0CF910895C53109F417 -:101C70004FC0C83189F3C63009F4F3C0C53149F704 -:101C800080E090E261E00E94812480E090E2609137 -:101C9000A6200E9481246091A620609580E090E2B9 -:101CA0000E94812480E291E260E870E0AFDC4FDFC7 -:101CB000682F80E090E20E94812481E0A1CFC09350 -:101CC000B22084E08093A52081E0CF9108952091F7 -:101CD000AF203091B020F901E05EFE4DC083C90114 -:101CE00001968093AF209093B0208038910509F041 -:101CF000B0CF86E08093A52081E082CF80E090E2A3 -:101D000065E10E94812482E08093A52081E078CF64 -:101D100081E08093A6204091A9205091AA20609153 -:101D2000AB207091AC20E091AD20F091AE2080E22C -:101D300091E220E830E00995882309F479C080E039 -:101D400090E261E00E94812480E090E26091A62010 -:101D50000E9481246091A620609580E090E20E941C -:101D6000812480E291E260E870E050DCF0DE682FD0 -:101D700080E090E20E9481248091A9209091AA2085 -:101D8000A091AB20B091AC2080589F4FAF4FBF4F78 -:101D90008093A9209093AA20A093AB20B093AC206D -:101DA00081E02ECFD4DE8C1709F0A8CF4091A92076 -:101DB0005091AA206091AB207091AC20E091AD20B1 -:101DC000F091AE2080E291E220E830E0099588238E -:101DD00009F441C08091A6208F5F8093A620809156 -:101DE000A9209091AA20A091AB20B091AC2080585E -:101DF0009F4FAF4FBF4F8093A9209093AA20A093ED -:101E0000AB20B093AC2080E090E266E00E94812499 -:101E100082E08093A52081E0F3CE1092AF20109253 -:101E2000B0201092B12083E08093A52081E0E8CE1D -:101E300080E090E264E00E94812489E08093A52004 -:101E400081E0DECE80E090E266E00E948124109284 -:101E5000A52081E0D5CE80E090E268E10E94812457 -:101E6000C7CE8091A6208F5F54CF8091A52081306E -:101E700071F0873009F008958091A820982F915033 -:101E80009093A8208823B9F71092A52008958091F7 -:101E9000A820982F91509093A820882361F78091D3 -:101EA000A720982F91509093A720882331F4109267 -:101EB000A52085E08093A820089580E090E265E168 -:101EC0000E948124F6CF1F93CF93DF93982F9154D4 -:101ED0009A3120F090529A31B8F480522091B32078 -:101EE0003091B4202F3F310550F4F901E05EFE4DF2 -:101EF00080832F5F3F4F2093B3203093B42081E045 -:101F0000DF91CF911F9108959F5C9A3038F38F3500 -:101F100029F38F3319F38D3309F38D30A9F088300D -:101F200039F08B3161F71092B3201092B420E7CFD3 -:101F30008091B3209091B420009709F3019780938A -:101F4000B3209093B420DBCFE091B320F091B42084 -:101F5000E05EFE4D10821092B3201092B42080916A -:101F60002021882309F4A7C08F3309F4A4C08D333E -:101F700009F4A1C0E1E2F1E2EF01219706C08F333D -:101F800009F4D3C08D3309F4CEC021968191882302 -:101F9000B1F710E0188280E291E26BE374E00E94F6 -:101FA000FB25009709F420C180E291E261E574E02D -:101FB0000E94FB25009709F415C180E291E267E6D3 -:101FC00074E00E94FB25009709F406C180E291E2CB -:101FD0006DE774E00E94FB25009709F4FBC080E2E6 -:101FE00091E263E974E00E94FB25009709F4F0C0D8 -:101FF00080E291E269EA74E00E94FB25009709F40F -:10200000B5C080E291E26FEB74E00E94FB2500977F -:1020100009F4FAC080E291E265ED74E00E94FB25CC -:10202000009709F4EFC080E291E26BEE74E00E9449 -:10203000FB25009709F4E4C080E291E261E075E0DD -:102040000E94FB25009709F4D9C080E291E267E184 -:1020500075E00E94FB25009709F4CEC080E291E272 -:102060006DE275E00E94FB25009709F4C3C080E291 -:1020700091E263E475E00E94FB25009709F4B8C083 -:1020800080E291E269E575E00E94FB25009709F482 -:10209000ADC080E291E26FE675E00E94FB250097FB -:1020A00009F49EC080E291E265E875E00E94FB259C -:1020B000009709F493C088ECC0E0E1EAF5E0949160 -:1020C000891709F450C0B196E4918E1709F448C0FD -:1020D000E3EEF5E0E4918E1709F43FC0E4E0F6E0AA -:1020E000E4918E1709F436C0E5E2F6E0E4918E172C -:1020F00071F1E6E4F6E0E4918E17C9F080E090E03B -:1021000071DA8BE995E06EDACC2309F4F8CE809190 -:102110002021882309F4F3CE80E291E25EDA8EE991 -:1021200095E060DAECCE1DE335CF1FE333CF25E039 -:1021300030E0C901880F991F82959295907F98276A -:10214000807F9827820F931F8E559A4FD9CF24E016 -:1021500030E0EFCF23E030E0ECCF22E030E0E9CF19 -:1021600021E030E0E6CF20E030E0E3CF25E0109240 -:10217000202130E046E150E0249FC001259F900DD2 -:10218000349F900D1124855C9B4F1F33F9F01D3354 -:1021900089F0112319F089ECC1E08FCF4096FC0142 -:1021A00085919491FC010097B1F380E291E2099549 -:1021B000C1E083CF4296FC0185919491FC01009788 -:1021C00051F3CE0101960995C1E077CF4496E7CF50 -:1021D00024E0CDCF23E0CBCF22E0C9CF2FE0C7CF83 -:1021E0002EE0C5CF21E0C3CF20E0C1CF2DE0BFCF8F -:1021F0002CE0BDCF2BE0BBCF2AE0B9CF29E0B7CF91 -:1022000028E0B5CF27E0B3CF26E0B1CF0895A0E214 -:10221000B6E082E011968C93119715968C931597E2 -:10222000E0E4F8E010A211A28DE291E086A397A36A -:102230008FEF9FEF80A791A781E0808398E8938339 -:1022400093E097831A968C931A9708951F920F9292 -:102250000FB60F9211248F939F93EF93FF9380E219 -:1022600092E28093C1209093C22080EA92E2809310 -:10227000C3209093C4201092BA201092B9201092DB -:10228000B5201092BD201092BE201092B820E0E43C -:10229000F8E0138286E990E086AB97AB8AE190E0A4 -:1022A00080AF91AFE0E4F9E010A211A28FEF9FEFB1 -:1022B00086A397A389E883838EE08083E0E2F6E03B -:1022C0001286FF91EF919F918F910F900FBE0F900B -:1022D0001F9018951F920F920FB60F9211242F93F3 -:1022E0008F939F93EF93FF93909128068091B9204D -:1022F000880F957021E009F020E0822B8093B920AF -:102300009091B5209923A1F1982F9770973009F4F7 -:1023100044C08C7069F191E082FD6EC09093B7204B -:102320008091B820882309F06FC08091BA208695EB -:10233000992309F471C020E8282B2093BA208091BA -:10234000BD209091BE2001968093BD209093BE2029 -:1023500087709070009761F4E091C120F091C220E5 -:102360002193E093C120F093C22081E08093B820B4 -:102370009091B52081E0911180E08093B52088E8AC -:10238000E0E4F8E08383FF91EF919F918F912F918B -:102390000F900FBE0F901F9018951092400880E18B -:1023A000E0E4F8E08487E0E4F9E013828091B7206C -:1023B000882369F18CEB94E086A397A31092B62052 -:1023C000E0E4F9E081E0848783E086838091BD20AA -:1023D0009091BE20877061F09091BA208F5F9695A2 -:1023E0008F5F8930E1F7E091C120F091C2209083A6 -:1023F00081E08093BF20BCCF90E09093B720809184 -:10240000B820882309F491CF1092B820B1CF8CE77F -:1024100094E086A397A3D2CF20E08ECF1F920F9295 -:102420000FB60F9211242F933F938F939F93AF93E7 -:10243000BF93EF93FF938091B620853009F455C088 -:102440008630C0F0883009F486C0893040F5863087 -:1024500009F4C7C0873009F495C0FF91EF91BF918F -:10246000AF919F918F913F912F910F900FBE0F9041 -:102470001F901895823089F1833008F1833009F478 -:102480005BC0843051F78091BA2080FDC7C080E4E2 -:10249000E0E4F6E0868385E08093B620DECF8930E5 -:1024A00009F461C08A30C9F610924009E0E4F9E00D -:1024B00016821092000881E08093C020CECF88233E -:1024C00009F459C0813049F68FE390E0E0E4F9E087 -:1024D00086A397A38EE08093000880E4E0E4F6E012 -:1024E000858383E08093B620B8CF8091BA2090E4B2 -:1024F000E0E4F6E080FD90C0958386958093BA2055 -:102500008091BB209091BC2001968093BB2090933A -:10251000BC209C01277030702115310509F483C05F -:102520002091BD203091BE208217930709F055C03D -:1025300088E08093B62091CF80E4E0E4F6E08683E3 -:1025400084E08093B620E091C120F091C220808188 -:102550008093BA2082CF80E4E0E4F6E0868389E0CD -:102560008093B6207ACF80E4E0E4F6E086838AE0C8 -:102570008093B62072CF8FE790E0E0E4F9E086A385 -:1025800097A36BCFE091C320F091C4208081882372 -:10259000E1F580E4A0E4B6E015968C9315972091C0 -:1025A000BB203091BC208091BD209091BE20281787 -:1025B000390709F4BDCF3196E093C320F093C420CE -:1025C000E091C120F091C220CF0101968093C120FB -:1025D0009093C22081818093BA2084E08093B620BA -:1025E0003CCFE091C320F091C4208081882341F446 -:1025F00080E4E0E4F6E0868387E08093B6202DCF88 -:1026000080E4E0E4F6E08583F7CF80E4A0E4B6E080 -:1026100016968C931697C3CF96836FCF80E4E0E431 -:10262000F6E0858338CF86E08093B62016CFCF932F -:10263000DF93E0E4F6E084E08283128AC0E8D1E030 -:1026400082E68E83A0E2B6E085E012968C93129724 -:1026500081E050968C93509782E052968C935297DB -:102660001A961C921A9783E019968C9398E5988392 -:102670009AE5998390E49183968381838683E0E051 -:10268000F8E08FE090E086A397A388E090E082A72F -:1026900093A783E28183BBDDDF91CF910895809181 -:1026A000BF208823C9F01092BF20E0E2F6E082E06C -:1026B000818386836091BD207091BE206115710574 -:1026C00099F4E091FF20F0910021099510924009C2 -:1026D000E0E4F9E016829BDD8091C020882309F4B4 -:1026E00008951092C02093CDE0910321F091042130 -:1026F00080E292E209959C0194FD28C0AC015695B8 -:102700004795569547955695479541155105F9F0CA -:1027100060E0E0E0F0E0E05EFD4D8081082E829513 -:102720008025082E869586958025E058FF4F90E0FD -:1027300001969595879591E080FD90E090836F5F7D -:10274000E62FF0E0E417F50730F301C03F7E2115D6 -:10275000310509F4BBCF2093BD203093BE201092E9 -:10276000BB201092BC2080E292E28093C120909323 -:10277000C22080EA92E28093C3209093C42081E03B -:102780008093B6208091C020882309F4A9CFA9CFD7 -:1027900081E08093C52084E090E08093C6209093F0 -:1027A000C72088E08093C820089581E08093C520E9 -:1027B00082E090E08093C6209093C72088E18093C8 -:1027C000C820089581E08093C520089508958F92D0 -:1027D0009F92AF92BF92CF92DF92EF92FF920F93B0 -:1027E0001F93CF93DF93CDB7DEB72E97CDBFDEBF5C -:1027F0007C018091C520843009F4F9C0853008F44B -:102800003FC0863009F4C0C0863008F064C0F701CC -:1028100000810E94181C8027D7018C9311960C917F -:102820000E94181C8027F701818302810E94181CD6 -:102830008027D70112968C93129713960C91F8D794 -:102840008027F70183838081803309F4BDC2803AF9 -:1028500009F439C3803C09F453C3813C09F435C4FD -:10286000823C09F43FC4803B09F44BC4805682305B -:1028700008F496C181E08093C52080E090E065C0B7 -:10288000823009F4A0C0833008F46FC0F701808162 -:10289000863209F46FC1823509F46CC1803509F4C0 -:1028A00075C1982F9056923008F4E7C1803351F0EB -:1028B000803A41F0803C31F0813C21F0823C11F0C3 -:1028C000803BC1F681E08093C52084E0F7018083DE -:1028D00084E090E03AC08A3008F053C0F7010081EC -:1028E000A7D78027D7018C9311960C91A1D7802769 -:1028F000F701818302819CD78027D70112968C93A0 -:10290000129713960C9194D78027F7018383048143 -:102910008FD78027D70114968C93149715960C9116 -:1029200087D78027F7018583C70164E070E092D4E0 -:10293000882309F00FC2BDD791E09827F701908353 -:1029400085E08093C52084E090E02E96CDBFDEBF69 -:10295000DF91CF911F910F91FF90EF90DF90CF907B -:10296000BF90AF909F908F9008952091C620909136 -:10297000C720D7018C91863209F4F3C0823509F45F -:10298000F0C080E090E0E1CF8701CC24F8018080A6 -:102990004FD78825D8018D938D01C394B2E1CB1612 -:1029A000A9F7C70160E170E055D4882309F4EFC1AD -:1029B00080910C21882309F4F0C17BD79AE09827F5 -:1029C000F7019083BDCF2091C6209091C720D701F9 -:1029D0008C91863209F4C5C0823509F4C2C08339AE -:1029E00009F435C21092C52080E090E0AECFC70157 -:1029F000E0D6D70114960C911BD78027F70184836A -:102A0000058116D78027D70115968C9315971696B2 -:102A10000C910ED78027F7018683078109D780277D -:102A2000D70117968C93179714962C911497909121 -:102A3000C920291709F01ECF15962C911597909152 -:102A4000CA20291709F016CF16962C911697909147 -:102A5000CB20291709F00ECF9091CC20891709F0CF -:102A600009CF0091CD20E4D68027F7018083009123 -:102A7000CD20002E02950025002E069506950025F6 -:102A80009ED4F701E058FF4F202F30E02F5F3F4FDB -:102A90003595279591E020FD90E09827908300914F -:102AA000CE20C6D68027D70111968C930091CE20D8 -:102AB000002E02950025002E0695069500257FD450 -:102AC000F701EF57FF4F202F30E02F5F3F4F359535 -:102AD000279591E020FD90E0982790830091CF20EA -:102AE000A7D68027F70182830091CF20002E029580 -:102AF0000025002E06950695002561D4F701EE57B6 -:102B0000FF4F202F30E02F5F3F4F3595279591E005 -:102B100020FD90E0982790830091D02089D68027CF -:102B2000D70113968C930091D020002E029500259A -:102B3000002E06950695002542D4F701ED57FF4F6C -:102B4000202F30E02F5F3F4F3595279591E020FDF6 -:102B500090E09827908385E08093C52080E290E103 -:102B6000F4CEF7012083918382E08093C52080E139 -:102B700090E0EBCE84E0D7018C9311961C921197D4 -:102B800082E08093C52080E190E0DFCEF701818173 -:102B9000882309F4D7C2F701108284E090E0D5CEF3 -:102BA000C70162E070E056D3882309F405C1D7015C -:102BB00011960C9111970C738C91803609F4DFC239 -:102BC0008AE390E010E002951295107F1027007FB5 -:102BD0001027080F191FCE01059664E00E94FB0420 -:102BE000CE01019660E070E044E050E00E942D06C6 -:102BF000CE010996B80146E050E00E942D068D8175 -:102C00008093C9208E818093CA208F818093CB20AE -:102C100088858093CC2089EC90E260E470E06DD6EA -:102C20008091C9208093CD208091CA208093CE20AE -:102C30008091CB208093CF208091CC208093D02096 -:102C40008DEC90E260E270E058D6CE010996BE01AC -:102C50006F5F7F4FAE014B5F5F4FE5D38D81F70113 -:102C600080838E8181838F8182838885838384E0C2 -:102C70008093C52080E290E068CEC70162E070E0FA -:102C8000E9D2882309F465C2D70111960C911197F6 -:102C90000C738C91803609F475C28AE390E010E0E1 -:102CA00002951295107F1027007F1027080F191F1B -:102CB000CE01019664E00E94FB04CE01059660E01F -:102CC00070E044E050E00E942D06CE010996B80164 -:102CD00046E050E00E942D0689818093C9208A81B8 -:102CE0008093CA208B818093CB208C818093CC20D1 -:102CF00089EC90E260E470E000D68091C920809376 -:102D0000CD208091CA208093CE208091CB208093CB -:102D1000CF208091CC208093D0208DEC90E260E297 -:102D200070E0EBD584E08093C5208981F701808332 -:102D30008A8181838B8182838C818383CE010996F2 -:102D4000BE016B5F7F4FAE014F5F5F4F6CD380E280 -:102D500090E0FBCD6091D12070E062957295707F1C -:102D60007627607F762782ED90E240E150E00E9476 -:102D70002D062091D2208091D6208095281709F425 -:102D8000D6C097D596E09827D7019C93D9CD91D5F9 -:102D900091E09827D7019C93D3CD6091D12070E02A -:102DA00062957295707F7627607F7627C70140E134 -:102DB00050E00E94B80601CE7CD591E09827D7015B -:102DC0009C9384E090E0C1CDC70162E070E042D204 -:102DD000882391F3D70111966C9170E062957295FA -:102DE000707F7627607F7627C70140E150E00E9420 -:102DF0002D06C70160E170E0EFD1870130E8E32ED6 -:102E0000F12CE00EF11E8824F801C08011D58C252C -:102E1000D8018D938D010C2CC294C0240C2CC69427 -:102E2000C694C024CCD22C2D30E02F5F3F4F359577 -:102E3000279591E020FD90E09827F70191937F017D -:102E40008394F2E18F1601F780E990E17ECDCE0107 -:102E5000059660E070E044E050E00E942D069091FD -:102E6000C820D70111968C911197803209F477C14F -:102E7000803709F086CDD70112962C9112978D815B -:102E8000281709F07ECD13962C9113978E81281761 -:102E900009F077CD14962C9114978F81281709F09B -:102EA00070CD15962C9115978885281709F069CD56 -:102EB0009C93C70161E070E08FD183E08093C520CF -:102EC00088E190E042CDC70162E070E0C3D1882381 -:102ED00079F0F70181818093D12086E08093C5202D -:102EE000E8D49AE09827D7019C9384E090E02DCD18 -:102EF000E0D491E09827F701908384E090E025CD1D -:102F0000C70162E070E0A6D1882309F455CFD7014C -:102F100011968C918093D12088E08093C520C9D4EC -:102F20009AE09827F701908384E090E00ECD80919D -:102F3000DA20281709F025CF3091D3208091D720AF -:102F40008095381709F01DCF8091DB20381709F0E4 -:102F500018CF4091D4208091D8208095481709F04F -:102F600010CF8091DC20481709F00BCFE091D520DD -:102F70008091D9208095E81709F003CF8091DD205A -:102F8000E81709F0FECE9091DE208091DF20809539 -:102F9000981709F0F6CE8091E020981709F0F1CE4D -:102FA0008091E1208095981709F0EBCED70111961A -:102FB0008C9011979924AA24BB24BA2CA92C982C64 -:102FC000882412968C9190E0A0E0B0E0DC01992773 -:102FD0008827882A992AAA2ABB2AD7018C9190E0AF -:102FE000A0E0B0E0882A992AAA2ABB2AD701139622 -:102FF000CC90DD24EE24FF24FC2CEE24DD24CC2414 -:103000008C289D28AE28BF28832F90E0A0E0B0E058 -:10301000BA2FA92F982F882750E060E070E0BA01FE -:1030200055274427842B952BA62BB72B30E040E067 -:1030300050E0822B932BA42BB52B4E2F50E060E059 -:1030400070E0742F662755274427842B952BA62BD9 -:10305000B72B2091C520283009F46FC0273021F408 -:10306000880D991DAA1DBB1D8093D220092F1A2FF0 -:103070002B2F33270093D320AD016627772740936A -:10308000D420CB2EDD24EE24FF24C092D520E82FBF -:10309000E095E093D620E02FE095E093D720E42F51 -:1030A000E095E093D820EC2DE095E093D920809333 -:1030B000DA200093DB204093DC20C092DD2085E005 -:1030C0008093C52080E090E040CCC70162E070E0D2 -:1030D000C1D0882309F40CCFF70181818093D120DE -:1030E00087E0FCCEC70162E070E0B4D0882309F429 -:1030F00063CED70111968C9111978093D12089E0EE -:103100000CCFC70162E070E0A5D0882309F4F0CEAF -:1031100080910C21882309F0E3CEF701618170E0F2 -:1031200062957295707F7627607F762782ED90E2B8 -:1031300040E150E00E94B806D3CE88199909AA0947 -:10314000BB0992CFC70162E070E084D0882309F008 -:1031500049CC81E0D7018C9384E090E0F6CB8D815F -:10316000F70180833E8131832F8122839885938369 -:10317000832782278927848388E290E0E6CB80E357 -:1031800090E020CD80E390E08ACD60E070E044E004 -:1031900050E00C942D06CF93DF930F92CDB7DEB79E -:1031A000FC018181908189279281892793818927D8 -:1031B0008983CF0160E070E044E050E00E94B806EF -:1031C000CE01019664E070E041E050E00E94B80654 -:1031D0000F90DF91CF910895EF92FF920F931F937D -:1031E000CF937C018B016115710581F1FB01DC013D -:1031F00043E653E68D918427C82FC295C07FC82728 -:103200008C2F90E0782F66279C01220F331F220F0E -:10321000331F220F331F62277327452F5527462759 -:103220005727C295CF708C2F90E0482759273197A8 -:1032300009F7F701E00FF11F942F852F9083818309 -:10324000CF911F910F91FF90EF900895FC0183E6BD -:1032500093E6F4CFEF92FF920F931F93CF937C01ED -:103260008B016115710509F43DC0FB01DC0143E6EA -:1032700053E68D918427C82FC295C07FC8278C2F15 -:1032800090E0782F66279C01220F331F220F331FF7 -:10329000220F331F62277327452F552746275727AD -:1032A000C295CF708C2F90E048275927319709F7A6 -:1032B000F701E00FF11F9A013070808190E08217D2 -:1032C000930739F080E0CF911F910F91FF90EF901D -:1032D0000895218130E0452F552781E024173507D7 -:1032E00089F7F1CFFC0123E630E043E653E6E5CF72 -:1032F000CF92DF92EF92FF920F931F930091E52000 -:103300004091E6203091E720A091E220F091E32067 -:10331000E091E420942F9071202F217E9227232F7B -:10332000207292272A2F247992272F2F23779227F2 -:103330002E2F2A739227292F22952F702927922F1B -:10334000969596959227B92FB69550E060E070E07B -:10335000762F652F542F4427C32EDD24EE24FF241F -:103360007601DD24CC244C295D296E297F2910E0CB -:1033700020E030E0402B512B622B732B7695679524 -:1033800057954795B9272B2F30E02170307090E08A -:103390002817390709F06068A093E520F093E6202C -:1033A000E093E7204093E2205093E3206093E420F1 -:1033B0001F910F91FF90EF90DF90CF900895509163 -:1033C000E3204091E420242F2F708DE190E2DC0176 -:1033D000A20FB11D252F2F70FC01E20FF11DD09619 -:1033E0002C91D0973089232B3091E22032953F7079 -:1033F000FC01E30FF11D3081232B52955F70FC011E -:10340000E50FF11D30A1232B42954F70840F911DC4 -:10341000805C9F4FFC018081282BEDE6F0E2E20FFB -:10342000F11D80810895CF92DF92EF92FF920F936A -:103430001F93CF93DF93FC01EA01318120E080816B -:1034400090E0822B932B80FDB2C130E081FDADC1B5 -:1034500020E09695879596958795432F406880FD47 -:10346000342F422F406881FD242F9695879596959D -:10347000879536952695432F406880FD342F422F3F -:10348000406881FD242F969587959695879536956A -:103490002695432F406880FD342F422F406881FDE0 -:1034A000242F969587959695879536952695432F43 -:1034B000406880FD342F422F406881FD242F96956F -:1034C00087959695879536952695432F406880FD7C -:1034D000342F422F406881FD242F9695879596952D -:1034E000879536952695432F406880FD342F422FCF -:1034F000406881FD242F96958795969587953695FA -:103500002695532F5068422F406880FD352F309309 -:10351000E52081FD242F2093E220338120E0828169 -:1035200090E0822B932B80FD3EC130E081FD39C1BC -:1035300020E09695879596958795432F406880FD66 -:10354000342F422F406881FD242F969587959695BC -:10355000879536952695432F406880FD342F422F5E -:10356000406881FD242F9695879596958795369589 -:103570002695432F406880FD342F422F406881FDFF -:10358000242F969587959695879536952695432F62 -:10359000406880FD342F422F406881FD242F96958E -:1035A00087959695879536952695432F406880FD9B -:1035B000342F422F406881FD242F9695879596954C -:1035C000879536952695432F406880FD342F422FEE -:1035D000406881FD242F9695879596958795369519 -:1035E0002695532F5068422F406880FD352F309329 -:1035F000E62081FD242F2093E320958180E0248123 -:1036000030E0282B392B20FDCAC050E021FDC5C079 -:1036100040E0C9019695879596958795352F306836 -:1036200080FF352F242F206881FF242F96958795C2 -:103630009695879536952695432F406880FD342FC3 -:10364000422F406881FD242F969587959695879502 -:1036500036952695432F406880FD342F422F4068D1 -:1036600081FD242F96958795969587953695269575 -:10367000432F406880FD342F422F406881FD242F66 -:10368000969587959695879536952695432F40680C -:1036900080FD342F422F406881FD242F9695879519 -:1036A0009695879536952695432F406880FD342F53 -:1036B000422F406881FD242F969587959695879592 -:1036C00036952695532F5068422F406880FD352F40 -:1036D0003093E72081FD242F2093E420C980DB0173 -:1036E00011968C911197C826DD24EE24FF24FE2C20 -:1036F000ED2CDC2CCC248A8112969C91892790E0B9 -:10370000A0E0B0E0DC0199278827C82AD92AEA2A54 -:10371000FB2A8881FB019081892790E0A0E0B0E03E -:10372000C82AD92AEA2AFB2A8B819381892790E02B -:10373000A0E0B0E0B82FAA2799278827C82AD92A5D -:10374000EA2AFB2A10E23BDE082F8C2D8170D0DDA7 -:10375000F694E794D794C794002341F080E090E07A -:10376000A0E0B0E8C82AD92AEA2AFB2A115059F762 -:1037700088818C25888389818D2589838A818E25FE -:103780008A838B818F258B83DF91CF911F910F913E -:10379000FF90EF90DF90CF90089540E43ACF50E44F -:1037A00035CF20E4C6CE30E4C1CE20E452CE30E4A2 -:1037B0004DCECF92DF92EF92FF92CF93FC01C1806A -:1037C000DD24EE24FF24FE2CED2CDC2CCC24828185 -:1037D00090E0A0E0B0E0DC0199278827C82AD92A28 -:1037E000EA2AFB2A808190E0A0E0B0E0C82AD92A2A -:1037F000EA2AFB2A838190E0A0E0B0E0B82FAA2754 -:1038000099278827C82AD92AEA2AFB2AC0E2D7DDC5 -:103810009C2D917089276CDDF694E794D794C7941A -:10382000C150A9F7CF91FF90EF90DF90CF9008950E -:10383000CF93DF93C4DDC82F80E05ADDCC2309F499 -:1038400036C0C0E8BCDDD82F80E052DDC695D1116E -:10385000C068B5DDD82F80E04BDDC695D111C068BA -:10386000AEDDD82F80E044DDC695D111C068A7DD5C -:10387000D82F80E03DDDC695D111C068A0DDD82FDE -:1038800080E036DDC695D111C06899DDD82F80E083 -:103890002FDDC695D111C06892DDD82F80E028DDDC -:1038A0008C2F8695D1118068DF91CF910895C0E06B -:1038B000C9CFCF93DF9383DDC82F80E019DDCC2300 -:1038C000D1F0C8E07CDDD82F80E012DDC695D111A3 -:1038D000C86075DDD82F80E00BDDC695D111C860BA -:1038E0006EDDD82F80E004DD8C2F8695D1118860A5 -:1038F000DF91CF910895C0E0E5CF8F929F92AF9274 -:10390000BF92CF92DF92EF92FF920F931F93CF93CC -:10391000DF934C015B016115710509F45FC0DC01A7 -:103920001296CC911297EC911196DC911197139607 -:10393000FC919C2F9D72892F82958F708927282F4B -:10394000269526952827322F36958D2F90E0A0E0DA -:10395000B0E0BA2FA92F982F88274C2F50E060E0B5 -:1039600070E0BA0155274427842B952BA62BB72B43 -:103970004E2F50E060E070E0842B952BA62BB72BE8 -:103980004F2F50E060E070E0742F662755274427E2 -:10399000842B952BA62BB72BB695A7959795879536 -:1039A000322730FDB068E82F492F5A2F6B2F772729 -:1039B000D42F8D0122273327C02FCB2EDD24EE24D8 -:1039C000FF24FC2D0894A108B108A114B10409F04A -:1039D000B0CFF401808341830283C382DF91CF9112 -:1039E0001F910F91FF90EF90DF90CF90BF90AF901D -:1039F0009F908F9008951F93CF93DF93CDB7DEB73D -:103A0000EE97CDBFDEBF4DD3809325234AD380935D -:103A1000262347D38093272344D38093282341D35D -:103A2000809329233ED380932A233BD380932B2357 -:103A300038D380932C230E94800BD5D3882391F018 -:103A40009091252380912623853009F453C0863038 -:103A5000A8F0883009F4BAC0893009F49EC08630D5 -:103A600009F45DC0C0D3882311F091D374D3EE96CE -:103A7000CDBFDEBFDF91CF911F910895813029F036 -:103A8000813008F46EC0833069F7992309F4A8C027 -:103A9000923041F780912723882339F5109129230B -:103AA0001F7001F3812F1BD380912623833009F4EB -:103AB000F8C0E0912F23F091302381818B7F8183A7 -:103AC000212F30E084E890E0289FF001299FF00D3D -:103AD000389FF00D1124ED58FC4D1082E0912F23FA -:103AE000F091302380818E7F808380E0F8D24FD3A5 -:103AF000A8D4B8CF992309F0B5CF109127231F7709 -:103B000046D39FD4A0D38823E9F3E0ECF4E01383F9 -:103B1000112309F07AC082E080932423A3CF905828 -:103B2000923008F09FCF809127239091282323E0A3 -:103B30008C3D920709F46BC060912923AE014F5F61 -:103B40005F4F0E948A03BC01009709F48BCF8DAFB1 -:103B50007EAF1DD389819A816DAD7EADCAD192D2DF -:103B600081CF903809F448C0923809F07BCF80911A -:103B700029238F70B4D2E0912F23F09130238181DB -:103B800011E082FF10E080E0AAD201D3812F98D209 -:103B900080E096D25ED255D465CF992309F062CFEA -:103BA00080912723823008F05DCFF1D280912723C6 -:103BB0008093202346D480912023882309F467C072 -:103BC00084E0809324230E947C0B4CCF903809F032 -:103BD00049CFDDD28091202373D23BD232D442CF61 -:103BE00090912723913009F03DCF91E0833009F087 -:103BF00090E09093222379CF10912123809122236A -:103C0000882309F4C2CF1260C0CF83E085CF83E060 -:103C10008C838AE38B836FB7F894A0ECB1E082E0E9 -:103C20001A968C931A97E8E0F0E024911A961C9269 -:103C3000DE01159681E090E078E040EC51E012E082 -:103C4000E22FEF702E2F30E0EA30A8F0295C3F4FD2 -:103C50002D933D938C31910589F0FA011287E72F5E -:103C6000F0E02491FA01128680FF03C022952F70A4 -:103C70007F5F0196E5CF205D3F4FEACF6FBF87D2D0 -:103C8000CE0103966AE370E08FD0FCD1EBCE809139 -:103C9000C304882321F084E08093242394CF81E01F -:103CA000FBCF59D222CF0895CF938091242388232C -:103CB00011F4CF910895C091312380E010D293D2B6 -:103CC000882321F48C2F0BD2CF91089594DEFACF64 -:103CD000AF92BF92CF92DF92FF920F931F93CF9339 -:103CE000DF93EC018B016A01C2D3F82E882361F5C2 -:103CF000C114D10439F0F60180819181081B190BA0 -:103D0000C80FD91F01151105F9F0C114D10441F0F4 -:103D100026C08991D5D10150104001151105A1F09F -:103D200080912D2390912E23FC01EF5BFF4F20818A -:103D3000805C9F4FFC018081281758F38AD1B4DF43 -:103D400096D3882351F3F82E8F2DDF91CF911F91B9 -:103D50000F91FF90DF90CF90BF90AF900895AA246D -:103D6000BB2480912D2390912E23FC01EF5BFF4F0C -:103D70002081FC01E05CFF4F8081281760F069D151 -:103D800093DFF601808191818A0D9B1D8083918351 -:103D900025E0F22ED9CF899193D10894A11CB11CB2 -:103DA0000A151B05F1F6D0CFCF92DF92EF92FF926A -:103DB0000F931F93CF93DF93D82EC92EEB018091E1 -:103DC000312380688CD1E0902B23F0902C23EC16CB -:103DD000FD0620F0209709F486C07E0100E0E11482 -:103DE000F10409F04CC0002309F45FC08091242342 -:103DF000882309F458C0853009F460C0F4D18823C1 -:103E000009F06FC008D2882309F04FC01CD2882364 -:103E100069F38091312387FD5BC080912D239091C0 -:103E20002E23FC01E05CFF4FC0818F5B9F4FFC01A4 -:103E30008081D0E0C81BD109E114F104B1F0C83091 -:103E4000D10598F40D2D1C2D03C0C830D10569F0A3 -:103E5000F80181918F0134D1D02EC12E0894E10850 -:103E6000F1082196E114F10481F701E0C830D10591 -:103E700009F000E0EED0E114F10409F4B4CF809130 -:103E80002423882381F08530C9F0ADD1882349F5FA -:103E9000C2D1882351F4D7D1882309F0BACF8091B9 -:103EA0002423882381F782E00AC0B5D18823F9F45E -:103EB000809124238823B9F38530B9F783E0DF911B -:103EC000CF911F910F91FF90EF90DF90CF900895C9 -:103ED000E0912D23F0912E23EF5BFF4FC081D0E0C6 -:103EE000ABCF81E0ECCFB5D0EE24FF2477CF80E0DC -:103EF000E6CFCF92DF92EF92FF920F931F93CF9373 -:103F0000DF930F92CDB7DEB7D82EC92E7B018091FB -:103F100031238068E4D000912B2310912C230E15BF -:103F20001F0528F0E114F10409F48DC08701ED2C80 -:103F3000FC2C80E00115110509F050C0882309F41C -:103F400063C080912423882309F45CC0853009F480 -:103F500064C049D1882309F074C05DD1882309F079 -:103F600053C071D1882369F38091312387FD60C0EC -:103F700080912D2390912E23FC01E05CFF4FC080A7 -:103F80008F5B9F4FFC018081DD24C81AD108011589 -:103F90001105B9F088E0C816D10428F012C0F8E085 -:103FA000CF16D10471F0F70184918AD00894E11CF6 -:103FB000F11C015010400894C11CD11C01151105C1 -:103FC00071F781E098E0C916D10409F080E0898397 -:103FD00040D089810115110509F4B0CF80912423C7 -:103FE000882381F08530C9F0FED0882351F513D1A4 -:103FF000882351F428D1882309F0B6CF8091242357 -:10400000882381F782E00AC006D1882301F58091D8 -:1040100024238823B9F38530B9F783E00F90DF912B -:10402000CF911F910F91FF90EF90DF90CF90089567 -:10403000E0912D23F0912E23EF5BFF4FC080DD2414 -:10404000A6CF81E0EBCF05D000E010E070CF80E09C -:10405000E5CFE0912F23F0913023A0912D23B09153 -:104060002E23AF5BBF4F8C9190E08283938380813E -:104070008D798083E0912D23F0912E23EF5BFF4F0C -:1040800010820895E0912F23F091302380818D7963 -:104090008083E0912D23F0912E23EF5BFF4F108260 -:1040A000089580912D2390912E23FC01EF5BFF4F0B -:1040B0002081820F911DDC018C912F5F2083089558 -:1040C00020912D2330912E23F901EF5BFF4F90813A -:1040D000290F311DD9018C939F5F90830895282F5C -:1040E0002F708093312330E064E870E0269FA001B8 -:1040F000279F500D369F500D11244E5C5C4D6091F2 -:10410000C6047091C70487FD11C040932D235093BE -:104110002E2322953295307F3227207F3227260F9B -:10412000371F20932F233093302308954E5B5F4F2A -:1041300040932D2350932E2322953295307F3227A2 -:10414000207F3227285F3F4F260F371F20932F23D2 -:10415000309330230895E0912F23F0913023818113 -:1041600084608183E0912F23F09130238181807CD2 -:10417000803409F00895809131238058B0DFE091B8 -:104180002F23F09130238181846081830895809171 -:1041900031238F77A4DFE0912F23F09130238081AA -:1041A0008D788083E0912F23F0913023808181608E -:1041B0008083E0912D23F0912E23EF5BFF4F10823F -:1041C0008091312380688BDFE0912F23F0913023A1 -:1041D000808181608083E0912D23F0912E23EF5B1D -:1041E000FF4F10820895809131238F7778DFE0911F -:1041F0002F23F0913023808184FF0BC0A0912D23C9 -:10420000B0912E2382819381A05CBF4F8C9381E07B -:10421000089580E00895809131238F7760DFE091E9 -:104220002F23F0913023808185FF0BC0A0912D2397 -:10423000B0912E2382819381A05CBF4F8C9381E04B -:10424000089580E0089580913123806848DFE091EF -:104250002F23F0913023908181E091FF80E0089539 -:104260001F93CF93DF9300D0CDB7DEB7182F4A83CB -:10427000698335DFE0912F23F09130231182E091A3 -:104280002F23F09130234A81698117FD22C01082CB -:10429000E0912F23F09130236183E0912F23F0915F -:1042A00030231282138280912D2390912E238483B8 -:1042B000958340E0FC01E05CFF4F40838F5B9F4FA4 -:1042C000DC011C9281E00F900F90DF91CF911F9144 -:1042D000089582E08083E0912F23F0913023618361 -:1042E000E0912F23F09130231282138280912D23AD -:1042F00090912E2384839583DDCFCF92DF92EF922E -:10430000FF920F931F93CF93DF930F92CDB7DEB73A -:10431000F62E662309F441C06C0110E0F60100811D -:10432000002399F16381218132818481823008F4F4 -:1043300041C048E158E12930310550F088E090E073 -:1043400040E04F5F880F991F82179307D0F3452BEA -:10435000802F90E08F709070863091054CF521345D -:10436000310530F54F7E662341F5942F9064E22E9F -:10437000802F8058692F422F998372DF9981802F77 -:10438000692F4E2D6DDF882399F01F5F85E090E047 -:10439000C80ED91E1F1509F0C1CF81E00F90DF9123 -:1043A000CF911F910F91FF90EF90DF90CF900895E4 -:1043B00080E0F4CF48E058E0BECF613031F0942F78 -:1043C00090686623A1F2E22EDACF942F906CE22E51 -:1043D000D6CFE0ECF4E0A681B78119961C92A681B5 -:1043E000B78111961C92A681B78159961C92A6811D -:1043F000B78151961C92A681B78199961C92A6818D -:10440000B78191961C92A681B781D9961C92A681FC -:10441000B781D1961C92A681B781A75BBF4F1C9232 -:10442000A681B781AF5BBF4F1C92A681B781A75A07 -:10443000BF4F1C920680F781E02DEF5AFF4F10828C -:1044400008958091252387FD08C0FDDE882369F447 -:10445000809124238823C9F70895DDDE882331F471 -:10446000809124238823C9F70895F3CD0BCE1F93A1 -:10447000CF93DF93E091C604F091C704E05AFF4F59 -:10448000C081D18114E6809131238078803821F178 -:10449000C2DE882321F580912423882329F18530E9 -:1044A00041F1E0912F23F0913023818182FD26C0DC -:1044B000E091C604F091C704E05AFF4F80819181DA -:1044C000C817D90701F31123F1F01150EC018091C5 -:1044D000312380788038E1F6B6DE8823E1F280E08F -:1044E000DF91CF911F91089582E0DF91CF911F91CD -:1044F000089583E0DF91CF911F91089581E0DF91CE -:10450000CF911F91089584E0DF91CF911F9108957D -:1045100064D06AD0E0ECF4E081818E7F8183808179 -:104520008F778083109223230895CF93DF93E0E465 -:10453000F0E014828481816084834FD055D0C0EC38 -:10454000D4E088818F7788838881806888831092FF -:104550002423109220231092222310922123888159 -:104560008064888380E868E448E07ADE80E068E47C -:1045700048E076DE888580648887898181608983C8 -:10458000DF91CF910895CF93DF933FB7F894C0ECBC -:10459000D1E022E02A87EAE1F0E0E491A0ECB4E087 -:1045A000DA96EC93DA97EBE1F0E0E491DB96EC93AA -:1045B000DB971A868BE496E28E7F16968D939C93FA -:1045C000179785E18C9318962C933FBF81E08093D9 -:1045D0002323ABDFDF91CF910895E0ECF4E08085F9 -:1045E0008370808711860895E0ECF4E08FEF828776 -:1045F000848708951F920F920FB60F9211242F9364 -:104600003F934F935F936F937F938F939F93AF935A -:10461000BF93EF93FF938091CA0487FD4FC08091B1 -:10462000CA0486FD42C08091CA0485FF0DC080E2A5 -:10463000E0ECF4E0828780912023882371F184E00C -:10464000809324230E94720BE0ECF4E08091CA0472 -:1046500084FF12C080E1828782E08093242310923D -:1046600020231382B6DE80E868E448E0F9DD80E0CC -:1046700068E448E0F5DD17DBFF91EF91BF91AF9162 -:104680009F918F917F916F915F914F913F912F916A -:104690000F900FBE0F901F9018958091C304882330 -:1046A000B9F481E080932423CDCF80E4E0ECF4E002 -:1046B0008287109224230E94770BB5CF8091C80483 -:1046C00087FFADCF80E8E0ECF4E08287ECDAA7CF9B -:1046D00083E0E8CFEF92FF920F931F93CF93DF9386 -:1046E000EC0181DD882349F0888190E02091292325 -:1046F00030912A232817390739F0DF91CF911F9184 -:104700000F91FF90EF90089580912623813209F454 -:104710005FC0823208F04BC0803279F78091252348 -:10472000813259F734DD04C080912423882329F392 -:1047300072DD8823C9F3B5DCE82EB3DCF82EB1DCDA -:10474000082FAFDC482F50E060E070E0742F662740 -:104750005527442710E020E030E09801112700277A -:10476000402B512B622B732B8E2D90E0A0E0B0E0FC -:10477000482B592B6A2B7B2B8F2D90E0A0E0B0E0CB -:10478000BA2FA92F982F8827482B592B6A2B7B2BC0 -:104790004C8B5D8B6E8B7F8B84DC888F82DC898F6A -:1047A00080DC8A8F6FDC4DDECE019ED1A6CF8232B7 -:1047B00061F1833209F0A1CF80912523813209F084 -:1047C0009CCFE5DC3EDECE01609127238DD195CFD5 -:1047D00080912523813A09F090CFD9DC34DD8823FC -:1047E000E9F38C89ED88FE880F896ADC8E2D68DC00 -:1047F0008F2D66DC802F64DC888D62DC898D60DC27 -:104800008A8D5EDC26DC1DDE78CF80912523813207 -:1048100009F073CFBCDC15DE80912723909128230B -:10482000888B998BCE0160D168CFCF93DF93EC0159 -:104830004096FC018BE0DF011D928A95E9F782E04A -:104840008C83898783E08E87CE01019661E055DDF8 -:10485000882321F480E0DF91CF910895CE01069660 -:1048600061E04BDD8823B1F3CE010B9661E045DDBD -:10487000DF91CF910895CF93DF93EB012091242313 -:10488000243021F082E0DF91CF910895FC0144892A -:10489000558966897789411551056105710591F33F -:1048A00081811DDCFE0101900020E9F73197EC1BAE -:1048B000FD0BCE01BF0140E050E00ADAE4CF0F93D8 -:1048C0001F93CF93DF938B01EA012091242324309F -:1048D00031F082E0DF91CF911F910F910895FC019B -:1048E00044895589668977894115510561057105A6 -:1048F00081F38181F4DBC801BE0140E050E0E8D9DA -:10490000E9CFCF93C62F20912423243019F082E0E1 -:10491000CF910895FC0144895589668977894115AD -:1049200051056105710599F38181D9DB20912D2312 -:1049300030912E23F901EF5BFF4F9081205C3F4FB8 -:10494000F9018081981720F084DB91DD882301F73D -:104950008C2FB6DB80E0DCCF0F931F93CF93DF93D8 -:104960000F92CDB7DEB720912423243039F082E0B6 -:104970000F90DF91CF911F910F910895FC01448911 -:10498000558966897789411551056105710579F366 -:104990008181A5DB8091312320912D2330912E231D -:1049A000F90187FD1DC0E05CFF4F8081F901EF5BDD -:1049B000FF4F408190E0841B9109009711F480E043 -:1049C000D7CF0081205C3F4FF901108142DB0117F6 -:1049D000B0F34DDD882361F689833BDB8981C8CF45 -:1049E000EF5BFF4F808190E0E8CFCF93DF93EC0146 -:1049F00080912423843019F0DF91CF9108958C8920 -:104A00009D89AE89BF890097A105B105A9F3898168 -:104A100066DB19DC882381F3CE019EDFEDCFCF93D7 -:104A2000DF9300D0CDB7DEB7FC0180912423843022 -:104A300009F03EC044895589668977894115510539 -:104A400061057105A9F186814ADBE5DB882381F1E7 -:104A50008091312320912D2330912E23F90187FD60 -:104A60003EC0E05CFF4F8081F901EF5BFF4F40816A -:104A700090E0841B9109009711F58FEF9FEF409113 -:104A8000312347FD29C0205C3F4FD9012C91408143 -:104A900030E0241B31092115310561F489839A83A3 -:104AA000F1DA89819A810F900F90DF91CF9108956B -:104AB0008FEF9FEF0F900F90DF91CF910895F1DA74 -:104AC00090E020912D2330912E23F901EF5BFF4FD1 -:104AD0004091312347FFD7CF208130E0DCCFEF5B1F -:104AE000FF4F808190E0C7CF0895629FD001739FF0 -:104AF000F001829FE00DF11D649FE00DF11D929F7A -:104B0000F00D839FF00D749FF00D659FF00D9927B8 -:104B1000729FB00DE11DF91F639FB00DE11DF91FDC -:104B2000BD01CF01112408958F929F92AF92BF9241 -:104B3000CF92DF92EF92FF92CF93DF93EC018881C7 -:104B40009981AA81BB810097A105B10521F484E276 -:104B500099EDABE5B7E0BC01CD012DE133EF41E0CC -:104B600050E03DD349015A0127EA31E440E050E0EA -:104B7000BCDF6B017C01C501B4012CEE34EF4FEFBB -:104B80005FEFB3DFDC01CB01C80ED91EEA1EFB1EAE -:104B9000F7FE08C08FEF9FEFAFEFBFE7C80ED91E3B -:104BA000EA1EFB1EC882D982EA82FB82C6019F7779 -:104BB000DF91CF91FF90EF90DF90CF90BF90AF90BB -:104BC0009F908F900895B0CF8DE990E2ADCFA0E097 -:104BD000B0E080939D2090939E20A0939F20B0935F -:104BE000A0200895FB01DC0102C005900D92415008 -:104BF0005040D8F70895FB01DC018D910590801994 -:104C00000110D9F3990B0895FB01DC01415050408C -:104C100048F005900D920020C9F701C01D92415047 -:104C20005040E0F70895FB01DC0102C001900D92B5 -:104C300041505040D8F70895AEE0B0E0E1E2F6E22E -:104C4000F7C20D891E898F89988D2EE02C830983E8 -:104C50001A8397FF02C080E090E801978D839E83BE -:104C6000AE01455E5F4FCE010196698D7A8D11D000 -:104C70004D815E8157FD0AC02F8138854217530749 -:104C80000CF49A01020F131FF80110822E96E4E033 -:104C9000E8C2ADE0B0E0EEE4F6E2BCC23C016C87F5 -:104CA0007D875A01FC0116821782838181FFBBC177 -:104CB0002E010894411C511CF3019381EC85FD8564 -:104CC00093FD859193FF8191EC87FD87882309F4FB -:104CD000A6C1853241F493FD859193FF8191EC87C4 -:104CE000FD87853221F490E0B301EFD1E5CFFF24B9 -:104CF000EE2410E01032B0F48B3269F08C3228F4DC -:104D0000803251F0833271F40BC08D3239F0803330 -:104D100049F411602CC01260146029C0186027C0CB -:104D2000106125C017FD2EC0282F20532A3098F47B -:104D300016FF08C08F2D880FF82EFF0CFF0CF80E01 -:104D4000F20E15C08E2D880FE82EEE0CEE0CE80E3C -:104D5000E20E10620CC08E3221F416FD60C11064A8 -:104D600006C08C3611F4106802C0883659F4EC8500 -:104D7000FD8593FD859193FF8191EC87FD878823C5 -:104D800009F0B8CF982F9554933018F09052933083 -:104D900038F424E030E0A20EB31E3FE339830FC0A5 -:104DA000833631F0833781F0833509F056C021C056 -:104DB000F5018081898322E030E0A20EB31E21E05C -:104DC000C22ED12C420113C092E0292E312C2A0C84 -:104DD0003B1CF5018080918016FF03C06F2D70E0B1 -:104DE00002C06FEF7FEFC40165D16C0151011F77E5 -:104DF00014C082E0282E312C2A0C3B1CF501808047 -:104E0000918016FF03C06F2D70E002C06FEF7FEF3F -:104E1000C40145D16C011068510113FD1AC005C0D1 -:104E200080E290E0B30151D1EA948E2D90E0C81653 -:104E3000D906B0F30EC0F40117FD859117FF8191DB -:104E40004F0190E0B30141D1E110EA940894C10808 -:104E5000D108C114D10479F7DFC0843611F0893646 -:104E600049F5F50117FF07C080819181A281B381C7 -:104E700024E030E008C080819181AA2797FDA095A9 -:104E8000BA2F22E030E0A20EB31E012F0F76B7FF3B -:104E900008C0B095A095909581959F4FAF4FBF4F9B -:104EA0000068BC01CD01A2012AE030E03AD1D82E41 -:104EB000D4183EC0853721F41F7E2AE030E020C0A0 -:104EC000197F8F36A9F0803720F4883509F0A7C004 -:104ED0000BC0803721F0883709F0A1C001C01061F4 -:104EE00014FF09C0146007C014FF08C0166006C094 -:104EF00028E030E005C020E130E002C020E132E0EF -:104F0000F50117FF07C0608171818281938144E0C0 -:104F100050E006C06081718180E090E042E050E0A6 -:104F2000A40EB51EA201FDD0D82ED418012F0F77E4 -:104F300006FF09C00E7FDF1430F404FF06C002FD37 -:104F400004C00F7E02C01D2D01C01F2D802F90E0D8 -:104F500004FF0CC0FE01ED0DF11D2081203311F482 -:104F6000097E09C002FF06C01E5F05C086789070EA -:104F7000009709F01F5F802E992403FD11C000FFE8 -:104F80000CC0FD2C1E1548F4FE0CF11A1E2D05C098 -:104F900080E290E0B30199D01F5F1E15C8F304C0F2 -:104FA0001E1510F4E11A01C0EE2484FE0EC080E349 -:104FB00090E0B3018AD082FE1DC081FE03C088E567 -:104FC00090E010C088E790E00DC0C4018678907032 -:104FD000009781F081FC02C080E201C08BE207FDF6 -:104FE0008DE290E0B30171D005C080E390E0B301A1 -:104FF0006CD0FA94DF14C8F3DA94F201ED0DF11DD0 -:10500000808190E0B30161D0DD20B1F705C080E27E -:1050100090E0B3015AD0EA94EE20C9F74DCEF301E7 -:105020008681978102C08FEF9FEF2D96E2E10BC141 -:10503000E0ECF1E0A785A7FDFDCFA485A860A487DB -:105040006050704FF0CDDC01CB0102C02D9105D036 -:1050500041505040D8F70895262FE0ECF1E0378515 -:1050600037FDFDCF3485377F3487378531FF09C061 -:1050700036E3328738ED34BF31E03387378537FD8B -:10508000FDCF33E33287808391831282248325E32B -:10509000228728ED31E024BF338701960895FC0173 -:1050A0000590615070400110D8F7809590958E0F53 -:1050B0009F1F0895FC016150704001900110D8F7C6 -:1050C000809590958E0F9F1F08950F931F93CF93F8 -:1050D000DF938C01EB018B8181FF1BC082FF0DC030 -:1050E0002E813F818C819D812817390764F4E881E6 -:1050F000F9810193E883F98306C0E885F985802F5B -:105100000995009731F48E819F8101968E839F834C -:1051100002C00FEF1FEFC801DF91CF911F910F91D8 -:105120000895FA01AA27283051F1203181F1E8943D -:105130006F936E7F6E5F7F4F8F4F9F4FAF4FB1E08A -:105140003ED0B4E03CD0670F781F891F9A1FA11D85 -:10515000680F791F8A1F911DA11D6A0F711D811D86 -:10516000911DA11D20D009F468943F912AE0269F4B -:1051700011243019305D3193DEF6CF010895462FAA -:105180004770405D4193B3E00FD0C9F7F6CF462F8B -:105190004F70405D4A3318F0495D31FD40524193F4 -:1051A00002D0A9F7EACFB4E0A695979587957795B1 -:1051B0006795BA95C9F700976105710508959B0138 -:1051C000AC010A2E06945795479537952795BA95C1 -:1051D000C9F7620F731F841F951FA01D089597FBC9 -:1051E000092E05260ED057FD04D045D00AD0001C4C -:1051F00038F450954095309521953F4F4F4F5F4F74 -:105200000895F6F790958095709561957F4F8F4F33 -:105210009F4F08952F923F924F925F926F927F928D -:105220008F929F92AF92BF92CF92DF92EF92FF92B6 -:105230000F931F93CF93DF93CDB7DEB7CA1BDB0B62 -:10524000CDBFDEBF09942A88398848885F846E8480 -:105250007D848C849B84AA84B984C884DF80EE809A -:10526000FD800C811B81AA81B981CE0FD11DCDBFDC -:10527000DEBFED010895A1E21A2EAA1BBB1BFD01A2 -:105280000DC0AA1FBB1FEE1FFF1FA217B307E40725 -:10529000F50720F0A21BB30BE40BF50B661F771F7D -:1052A000881F991F1A9469F760957095809590955D -:0E52B0009B01AC01BD01CF010895F894FFCF22 -:1052BE0000831000000104100000018208000001AC -:1052CE0000000000000000000000001400000101BA -:1052DE0001000000010000010001010001000000BA -:1052EE0002020000020002020202000002000000A0 -:1052FE000404000004000404040400000400080870 -:10530E00080000000800000800080800080000005F -:10531E0010100000100010101010000010000100FE -:10532E000100000000000000010001010101010167 -:10533E0000010001000000010100010101A1200097 -:10534E000000000200A101000000000000010000AA -:02535E0000004D +:10067000DEBFCDBF10E2A0E0B0E2E0EFFEE402C0DA +:1006800005900D92A239B107D9F726E2A2E9B0E2AE +:1006900001C01D92AD39B207E1F703D00C94762763 +:1006A00078C07DD0AED680E38093010627D20DD1ED +:1006B0006DD781D135D581E080930002109201027F +:1006C00092E09093020293E09093040280932002C0 +:1006D00088E380932102CED0C1E05DD7E091EB208A +:1006E000F091EC200995E091F120F091F22009952C +:1006F00080910C0A80FFF1CFC0930C0A6FD16AD7AA +:1007000016D5809193208093060610929320E5CF12 +:10071000292F33272230310539F123303105A9F053 +:100720002130310549F020E030E080E090E0FA012E +:1007300080839183C901089522E130E086E792E049 +:10074000FA0180839183C901089599278130910529 +:10075000A1F082309105B9F0892B29F7E4E3F2E0AA +:10076000249130E0CF01E3CF2EE330E088E392E044 +:10077000FA0180839183C9010895EAE1F2E02491AE +:1007800030E0CF01D4CFECEFF1E0249130E0CF01A5 +:10079000CECF1F920F920FB60F921124FFCF8091F0 +:1007A000780083FF0AC088E08093780088ED84BFDA +:1007B00081E080938000FD95FEC0809150008660AE +:1007C000809350008091510081FFFCCF80915100B7 +:1007D00082FFFCCF1092560021E02093600088ED4C +:1007E00084BF2093400083ED90E38093260A90938A +:1007F000270A86E08093000A209343002093000498 +:100800008091CC0188608093CC01089588ED84BFED +:1008100081E0E8E7F0E08183089588ED84BF8BE113 +:100820008093800008958BEC80935200809150005B +:100830008860809350008091510083FFFCCF84EC4E +:10084000809355008091500080618093500080918A +:10085000510084FFFCCF0895E0E4F0E084818E7FB6 +:100860008483E0E5F0E080818F7E80838081877FD4 +:100870008083089587E0E0EAF0E082837894089529 +:100880000895089508950895089580E090E00895EA +:1008900008950895E091FE20F091FF20818395E274 +:1008A000899FB001112468577D4F45E250E088EDE3 +:1008B00090E20E940D24E091ED20F091EE20099548 +:1008C000E091E920F091EA200994E091FE20F09176 +:1008D000FF208181DFCF0F931F93CF93DF9320E021 +:1008E00030E015E2AC014F5F5F4F022F129FF00125 +:1008F000139FF00D1124E757FD4F649161110FC054 +:10090000EC016881662301F12F5F3F4F23303105F1 +:1009100061F780E0DF91CF911F910F910895DC0185 +:100920007C91772389F36713EFCFDA0105C07D91BE +:10093000772351F37613E8CF3196ED01649161117D +:10094000F6CF68816111E0CF802FA4DF81E0DF91D5 +:10095000CF911F910F910895CF93DF93EC016150D8 +:10096000710980E090E035E24CE2389FF001399F58 +:10097000F00D1124E757FD4F2491222381F06131BE +:10098000710568F0DE0103C06031710541F02D93FF +:10099000ED0131966150710924912111F5CF82301A +:1009A000910521F41882DF91CF9108954993615008 +:1009B00071090196DACF08950C94FF2308951F93CF +:1009C000CF93DF93162F662329F0EC01F5DF89938F +:1009D0001150E1F7DF91CF911F9108950E94FF23FD +:1009E0000E94FF230E94FF230C94FF23CF93DF93E9 +:1009F000DC01615071092115310599F162307105F1 +:100A000080F1FA01240F351F2150310940E050E0F8 +:100A100017C0D05DDC93CF708C2F90E00A97FCF468 +:100A2000C05D1196CC9311971296625071094E5F7A +:100A30005F4FE217F307B9F031966230710598F015 +:100A4000C081DC2FD295DF708D2F90E00A970CF3D8 +:100A5000D95CDC93CF708C2F90E00A970CF3C95CC3 +:100A6000E0CF40E050E01C92CA01DF91CF910895A1 +:100A7000FA0140814423F1F151815523D9F16115E7 +:100A80007105C1F1DC0120E030E013C04295407FE8 +:100A9000513428F5582F452B4D932F5F3F4F3296F9 +:100AA0004081442329F15181552321F162177307B5 +:100AB000F9F0842F80538A3018F081518630D0F4B9 +:100AC000852F80538A3020F0952F9154963090F4E2 +:100AD0004134E0F24295407F40575134D8F25753A9 +:100AE000452B4D932F5F3F4F329640814111DBCF15 +:100AF000C901089520E030E0C9010895CF93DF9344 +:100B000000D000D0CDB7DEB780E18093650692E0DB +:100B10009093660698E0909365069AE1909361063B +:100B20001092A6091092A70990EC9093A50998E15C +:100B30009093A4098093660687ED8093A009809125 +:100B4000A10986FFFCCF80E48093A1098091A009D0 +:100B50001092A0098091A10986FFFCCF80E48093C8 +:100B6000A1098091A00990E19093650680FD3EC0A7 +:100B70008DE389838AE28A8380E88B8386EA8C838B +:100B800020E137ED90E4209366063093A009809130 +:100B9000A10986FFFCCF9093A1098091A009109232 +:100BA000A0098091A10986FFFCCF9093A1098091B3 +:100BB000A0092093650687FFE6CF80E18093660653 +:100BC000FE013196CE01059630E421912093A009D3 +:100BD0002091A10926FFFCCF3093A1092091A00903 +:100BE000E817F90791F780E1809365062496CDBF59 +:100BF000DEBFDF91CF910895CF92DF92EF92FF9207 +:100C00000F931F93FC010091FD2010E020E030E0E5 +:100C1000980111270027060F171F211D311D60E1C4 +:100C200077ED90E4609366067093A0098091A10926 +:100C300086FFFCCF9093A1098091A0091092A00992 +:100C40008091A10986FFFCCF9093A1098091A00912 +:100C50006093650687FFE6CF80E18093660683E0B8 +:100C60008093A0098091A10986FFFCCF80E4809346 +:100C7000A1098091A0096901EE24FF24C092A00976 +:100C80008091A10986FFFCCF80E48093A109809127 +:100C9000A009C12ED22EE32EFF24C092A00980917C +:100CA000A10986FFFCCF80E48093A1098091A0096F +:100CB0000093A0098091A10986FFFCCF80E4809376 +:100CC000A1098091A0094115510589F04E0F5F1FC0 +:100CD00090E41092A0098091A10986FFFCCF909327 +:100CE000A1098091A0098193E417F50791F780E1AC +:100CF000809365061F910F91FF90EF90DF90CF904A +:100D000008954F925F926F927F928F929F92AF92CF +:100D1000BF92CF92DF92EF92FF920F931F93CF93E8 +:100D2000DF939C01FA018091FD2090E0A0E0B0E00B +:100D3000DC0199278827860F971FA11DB11D3097C9 +:100D400009F411C1E12CFF24F39410E1C12E07ED49 +:100D5000B02E40E4D42E50E1A52E67ED962E73E51B +:100D6000472EC4E85C2ED3E86D2E492F5A2F6B2FE7 +:100D70007727852ED82F8701081B1109E017F10767 +:100D800008F48F01A09266069092A009C091A10973 +:100D9000C6FFFCCFD092A109C091A0091092A00972 +:100DA000C091A109C6FFFCCFD092A109C091A009B2 +:100DB000C0926506C7FFE6CFA09266064092A009E2 +:100DC000C091A109C6FFFCCFD092A109C091A00992 +:100DD0008092A009C091A109C6FFFCCFD092A109C1 +:100DE000C091A009742E4093A0094091A10946FF2B +:100DF000FCCFD092A1094091A0091092A009409186 +:100E0000A10946FFFCCFD092A1094091A009C09250 +:100E10006506C0926606B092A0094091A10946FFFE +:100E2000FCCFD092A1094091A0091092A009409155 +:100E3000A10946FFFCCFD092A1094091A009C09220 +:100E4000650647FFE6CFA09266065092A009409142 +:100E5000A10946FFFCCFD092A1094091A0091092B0 +:100E6000A0094091A10946FFFCCFD092A109409171 +:100E7000A0091092A0094091A10946FFFCCFD09291 +:100E8000A1094091A009D093A0094091A10946FF72 +:100E9000FCCFD092A1094091A0090115110591F054 +:100EA000A901400F511FE90169916093A009609168 +:100EB000A10966FFFCCFD092A1096091A009C417D7 +:100EC000D50791F7C0926506C0926606B092A00958 +:100ED0004091A10946FFFCCFD092A1094091A00901 +:100EE0001092A0094091A10946FFFCCFD092A10920 +:100EF0004091A009C092650647FFE6CFA092660622 +:100F00006092A0094091A10946FFFCCFD092A109AF +:100F10004091A0098092A0094091A10946FFFCCF11 +:100F2000D092A1094091A0097092A0094091A10915 +:100F300046FFFCCFD092A1094091A0091092A009D0 +:100F40004091A10946FFFCCFD092A1094091A00990 +:100F5000C0926506E01BF10B800F911FA11DB11D12 +:100F6000309709F002CFDF91CF911F910F91FF9041 +:100F7000EF90DF90CF90BF90AF909F908F907F9039 +:100F80006F905F904F9008958091FD2090E0A0E0D9 +:100F9000B0E0BA2FA92F982F88279C01339560E1E4 +:100FA00077ED50E4E1E8609366067093A009409104 +:100FB000A10946FFFCCF5093A1094091A0091092CE +:100FC000A0094091A10946FFFCCF5093A10940918F +:100FD000A0096093650647FFE6CF60936606E0933D +:100FE000A0094091A10946FFFCCF5093A10940916F +:100FF000A0099093A0094091A10946FFFCCF50930E +:10100000A1094091A0098093A0094091A10946FF40 +:10101000FCCF5093A1094091A0091092A0094091E2 +:10102000A10946FFFCCF5093A1094091A00960930C +:10103000650601968217930709F0B5CF0895CF9200 +:10104000DF92EF92FF920F931F93FC01CB01BA0145 +:1010500069016115710521E08207910540F081E089 +:101060001F910F91FF90EF90DF90CF90089500E0D7 +:1010700010E021E030E0061B170B280B390BE12CA8 +:10108000F12C0C151D052E053F0558F0A601CF01CA +:1010900038DE81E01F910F91FF90EF90DF90CF90AD +:1010A000089568017901A601CF012BDEF2CFCF921E +:1010B000DF92EF92FF920F931F93FC01CB01BA01D5 +:1010C00069016115710521E08207910540F080E01A +:1010D0001F910F91FF90EF90DF90CF90089500E067 +:1010E00010E021E030E0061B170B280B390BE12C38 +:1010F000F12C0C151D052E053F0558F0A601CF015A +:101100007BDD81E01F910F91FF90EF90DF90CF90FA +:10111000089568017901A601CF016EDD81E0F2CF6B +:10112000E0E0F6E080E4828388E1868B0895FF9218 +:101130000F931F93CF93DF93CDB7DEB7A097CDBFAB +:10114000DEBF809108068095909192209827809329 +:10115000922080748923A9F0E091FE20F091FF2075 +:1011600080818130B9F0823079F1833009F44EC04A +:10117000843009F46FC0853009F48EC0863009F4DC +:1011800067C0A096CDBFDEBFDF91CF911F910F91B9 +:10119000FF9008958091FB20882309F49FC0F12CD3 +:1011A0008E010F5F1F4F08DCF801EF0DF11D8083EA +:1011B000F3948091FB20F816B0F3E091F720F091C2 +:1011C000F820C8010995DDCFE091F520F091F620D7 +:1011D0008E010F5F1F4FC80109952091FB2022232C +:1011E00061F3F801CE0102962150820F911D21E09A +:1011F000222339F0308121E03F3F09F020E03F5FBA +:1012000030833196E817F90799F7D7CFE091F520A9 +:10121000F091F6208E010F5F1F4FC80109952091B4 +:10122000FB2031E0215048F23323E1F3822F90E09C +:10123000F801E80FF91F408131E04F3F09F030E03D +:10124000F801E80FF91F4F5F4083215068F7B5CFD1 +:10125000F7D097CFE091F520F091F6208E010F5F47 +:101260001F4FC80109952091FB20222309F4A5CF27 +:10127000F801CE0102962150820F911D21E0222318 +:1012800031F0308121E0311120E03150308331964E +:10129000E817F907A1F791CFE091F520F091F6203A +:1012A0008E010F5F1F4FC80109952091FB2031E08F +:1012B000215008F482CF3323D9F3822F90E0F80134 +:1012C000E80FF91F408131E0411130E0F801E80FEB +:1012D000F91F41504083215070F76FCF8E010F5F8F +:1012E0001F4F6BCFCF93DF93EC016150710980E00A +:1012F00090E03CE2FC01EE0FFF1FE295F295F07FDB +:10130000FE27E07FFE27E950FD4F2491222381F044 +:101310006132710568F0DE0103C06032710541F091 +:101320002D93ED0131966150710924912111F5CF72 +:101330008630910521F41882DF91CF910895399379 +:10134000615071090196D6CFE091FE20F091FF2007 +:1013500080830895AB01E091FE20F091FF20608131 +:1013600020E2629FB001112469507D4F0C941F242C +:10137000CF93DF93EC0167EF72E00E941624892B74 +:1013800071F167E173E0CE010E941624892B69F1A7 +:1013900067E373E0CE010E941624892B41F167E5D3 +:1013A00073E0CE010E941624892B19F167E773E0E0 +:1013B000CE010E941624892BF1F067E973E0CE017B +:1013C0000E941624892BC9F067EB73E0CE010E94BE +:1013D0001624892BA1F080E0DF91CF91089580E061 +:1013E000B3DF81E0DF91CF91089581E0F9CF82E012 +:1013F000F7CF83E0F5CF84E0F3CF85E0F1CF86E04F +:10140000EFCF43E150E060E070E08DEF90E20C94AC +:10141000312643E150E060E070E08DEF90E20C9403 +:101420003C26883008F008958093FD2090E0880FD6 +:10143000991F80509F4D8093FE209093FF2045CAB6 +:101440002091FD2030E02F5F3F4F27703327822F00 +:10145000F901EE0FFF1FEF5FFE4D908191115CC00F +:101460002F5F3F4F27703327822FF901EE0FFF1FA9 +:10147000EF5FFE4D908191114FC02F5F3F4F27705E +:101480003327822FF901EE0FFF1FEF5FFE4D908192 +:10149000911142C02F5F3F4F27703327822FF901F0 +:1014A000EE0FFF1FEF5FFE4D9081911135C02F5F52 +:1014B0003F4F27703327822FF901EE0FFF1FEF5F99 +:1014C000FE4D9081911128C02F5F3F4F2770332729 +:1014D000822FF901EE0FFF1FEF5FFE4D90819111FA +:1014E0001BC02F5F3F4F27703327822FF901EE0F6C +:1014F000FF1FEF5FFE4D908191110EC02F5F3F4F98 +:1015000027703327822FF901EE0FFF1FEF5FFE4D8B +:101510009081911101C0089584CF8091FD2008959C +:10152000CF93DF93EC01F9DF805D88831982DF912F +:10153000CF910895FC0180819181911103C0805366 +:10154000883010F080E008956CDF81E00895BC01E0 +:1015500080E090E20C94AD21CF93DF93EC012196D3 +:10156000FC016491662349F080E090E20E94002231 +:10157000FE01219664916111F7CFDF91CF9108951B +:10158000AB01BC0180E090E20C94D62180E2E0E661 +:10159000F6E082830895CF93DF9380E090E20E948B +:1015A0007F220E94801C80E090E20E949A22EC013F +:1015B00097FD09C080E180939320809305068C2FCE +:1015C00062D2882319F0DF91CF9108958C2FDF919B +:1015D000CF91C9C380919420813001F130F08230E5 +:1015E00059F1833071F091D35FC58091680685FF12 +:1015F000FACF84E180931B2081E08093942085D3EF +:1016000053C580911B20815080931B208111EBCF0B +:101610000E94AA2021D910929420E5CF80911B200E +:10162000815080931B208111DECFFDD80E94E520E0 +:1016300082E080939420D7CF8091680685FDD3CF38 +:1016400084E180931B2083E0809394205ED32CC59B +:1016500080E2E0E0F6E08583089580E2E0E0F6E0F5 +:101660008683089580E090E20C94882180E090E2E7 +:101670000C94FA222EE134E03F932F9327E134E0DB +:101680003F932F9320E134E03F932F9327ED33E0F6 +:101690003F932F9321E02F931F929F938F930E944C +:1016A00037248DB79EB70C968DBF9EBF85E60895F3 +:1016B00029ED30E23F932F9324E234E03F932F93C0 +:1016C00021E02F931F929F938F930E9437248DB711 +:1016D0009EB708968DBF9EBF85E60895FCD8811100 +:1016E00002C08AEC089595DE84E6089560E071E01A +:1016F00033D985E608950F931F93CF93DF93CDB72A +:10170000DEB7A197CDBFDEBF8C012091FB20E09119 +:10171000F520F091F620CE01019629A3099529A183 +:1017200030E0AE014F5F5F4F60E071E0C8015ED90D +:1017300085E6A196CDBFDEBFDF91CF911F910F91BE +:101740000895BF92CF92DF92EF92FF920F931F9373 +:10175000CF93DF93CDB7DEB7A097CDBFDEBF8C01AF +:10176000C090FB20D12C67E274E00E941624892BE4 +:1017700051F5C114D104B1F1B12CEE24E394F12C54 +:10178000EC0EFD1E00E010E017D9F701E00FF11F8D +:101790008083B3940B2D10E00C151D05A8F3E09188 +:1017A000F720F091F820C701099584E6A096CDBFF7 +:1017B000DEBFDF91CF911F910F91FF90EF90DF90EF +:1017C000CF90BF900895A80160E270E0EE24E3940A +:1017D000F12CEC0EFD1EC7014BD98C159D05F9F2BD +:1017E0008AECE4CFEE24E394F12CEC0EFD1ED7CF6F +:1017F0002091FC20211107C020E3FC012083FC0183 +:10180000118285E6089521E3FC012083FC01118209 +:1018100085E60895FC012181211105C08081813375 +:1018200041F0803311F08AEC08951092FC2084E698 +:10183000089581E08093FC2084E608958FE198E08C +:10184000F7D08EE6089587E598E00AD18EE60895F0 +:10185000E0ECF4E081818E7F81830E94AA200E94C7 +:10186000060484E60895E0ECF4E081818E7F8183B4 +:101870000E94AA200E940D0484E60895E9EFF0E298 +:1018800021812F9320812F932EE234E03F932F93D9 +:1018900021E02F931F929F938F930E9437248DB73F +:1018A0009EB708968DBF9EBF85E608952091FB20C8 +:1018B0001F922F9321E334E03F932F9321E02F9346 +:1018C0001F929F938F930E9437248DB79EB70896DF +:1018D0008DBF9EBF85E6089560E071E003DD85E67B +:1018E000089560E071E036DD85E6089541DD8111FF +:1018F00002C08AEC08958DDD84E6089560E071E011 +:101900000FDE85E6089516DE811102C08AEC089587 +:1019100080DD84E6089538DB84E60895BF92CF9297 +:10192000DF92EF92FF920F931F93CF93DF937C018F +:10193000CFEFD0E03BE3C32E34E0D32E4CE2B42E05 +:101940008601B60180E990E20E941624892B21F1DC +:10195000F6018491882389F0C132D10570F0D70156 +:1019600003C0C032D10549F08D937D010F5F1F4F39 +:101970002197F80184918111F4CFF701B1927F0191 +:101980002197F6E1CF0ED11C8601B60180E990E2E5 +:101990000E941624892BE1F6F7013197108285E623 +:1019A000DF91CF911F910F91FF90EF90DF90CF903B +:1019B000BF900895FC01209120022068209320020E +:1019C0002091230220FFFCCF81E080932302A0918D +:1019D0001002B0911102AE5BB109B7FD1CC029E63F +:1019E00037E54BE050E00E949723AA27BB279F933F +:1019F0008F9324E334E03F932F9381E08F931F92E2 +:101A0000FF93EF930E9437248DB79EB708968DBF42 +:101A10009EBF85E60895A0E0B0E0E1CF80E0E0E180 +:101A2000F1E29191890F91E2E039F907D1F7089538 +:101A300021E0209395202093962024E12093972065 +:101A400025E0209398201092992010929A201092CD +:101A50009B2010929C2080939D2090939E2008951F +:101A600027E02093952024E6209398201092992037 +:101A700010929A2010929B2010929C2080939D207F +:101A800090939E200895CF93C82F909195209530E4 +:101A900009F47FC0E0F0973009F44AC060F5209166 +:101AA000A22080919620281709F4DFC030E090E052 +:101AB00001972817390709F407C168E180E090E22F +:101AC0000E9400221092952081E0CF9108959330DA +:101AD00009F457C0B8F090E04091A2202FEF30E019 +:101AE000241B31098217930709F06AC085E08093AF +:101AF000952081E0EACF9830F1F09930A1F080E0B4 +:101B0000CF9108959130D8F3813009F4DFC084304B +:101B100029F0883141F081E0CF91089566E080E0BE +:101B200090E20E9400221092952081E0CF910895CA +:101B3000853109F450C0C83189F3C63009F4E1C0D9 +:101B4000C53149F761E080E090E20E940022609197 +:101B5000962080E090E20E9400226091962060959D +:101B600080E090E20E94002260E870E080E191E273 +:101B700007DD54DF682F80E090E20E94002281E0C0 +:101B8000A4CF8093A22084E08093952081E0CF9120 +:101B9000089520919F203091A020F901E05FFE4D33 +:101BA0008083C901019680939F209093A020803864 +:101BB000910509F0B0CF86E08093952081E085CF34 +:101BC00065E180E090E20E94002282E0809395200F +:101BD00081E0CF91089581E08093962040919920F3 +:101BE00050919A2060919B2070919C20E0919D20C3 +:101BF000F0919E2020E830E080E191E20995882371 +:101C000009F46FC061E080E090E20E9400226091E0 +:101C1000962080E090E20E940022609196206095DC +:101C200080E090E20E94002260E870E080E191E2B2 +:101C3000A7DCF4DE682F80E090E20E940022809111 +:101C4000992090919A20A0919B20B0919C2080583F +:101C50009F4FAF4FBF4F8093992090939A20A093AE +:101C60009B20B0939C2081E057CFD8DE8C13A8CF67 +:101C70004091992050919A2060919B2070919C20D6 +:101C8000E0919D20F0919E2020E830E080E191E2FB +:101C90000995882381F1809196208F5F809396200B +:101CA0008091992090919A20A0919B20B0919C20A6 +:101CB00080589F4FAF4FBF4F8093992090939A20A9 +:101CC000A0939B20B0939C2066E07BCF10929F2036 +:101CD0001092A0201092A12083E08093952081E0B3 +:101CE000F4CE64E080E090E20E94002289E08093DC +:101CF000952081E0EACE68E180E090E20E94002237 +:101D0000DCCE809196208F5F67CF809195208130C7 +:101D100071F0873009F0089580919820982F9150A4 +:101D2000909398208111F7CF10929520089580917B +:101D30009820982F9150909398208111ECCF80910A +:101D40009720982F915090939720811106C0109260 +:101D5000952085E080939820089565E180E090E2E9 +:101D60000E940022F6CF1F93CF93DF93982F9154B8 +:101D70009A3120F090529A31B8F480522091A320E9 +:101D80003091A4202F3F310550F4F901E05FFE4D62 +:101D900080832F5F3F4F2093A3203093A42081E0C6 +:101DA000DF91CF911F9108959F5C9A3038F38F3562 +:101DB00029F38F3319F38D3309F38D30A9F088306F +:101DC00039F08B3161F71092A3201092A420E7CF55 +:101DD0008091A3209091A420009709F3019780930C +:101DE000A3209093A420DBCFE091A320F091A42026 +:101DF000E05FFE4D10821092A3201092A4208091EB +:101E00001021882309F4A2C08F3309F49FC08D33B9 +:101E100009F49CC0E1E1F1E204C01F3331F01D334D +:101E200021F0EF0111911111F8CF18826BE374E0EA +:101E300080E191E20E941624892B09F432C161E508 +:101E400074E080E191E20E941624892B09F426C1F6 +:101E500067E674E080E191E20E941624892B09F480 +:101E60001AC16DE774E080E191E20E941624892B8B +:101E700009F40EC163E974E080E191E20E94162446 +:101E8000892B09F402C169EA74E080E191E20E94C1 +:101E90001624892B09F4F6C06FEB74E080E191E21F +:101EA0000E941624892B09F4EAC065ED74E080E1F4 +:101EB00091E20E941624892B09F4DEC06BEE74E0D7 +:101EC00080E191E20E941624892B09F4D2C061E0DE +:101ED00075E080E191E20E941624892B09F4C6C0C6 +:101EE00067E175E080E191E20E941624892B09F4F4 +:101EF000BAC06DE275E080E191E20E941624892B60 +:101F000009F4AEC063E475E080E191E20E9416241A +:101F1000892B09F4A2C069E575E080E191E20E9495 +:101F20001624892B09F496C06FE675E080E191E2F2 +:101F30000E941624892B09F48AC065E875E080E1C7 +:101F400091E20E941624892B09F452C088ECC0E06B +:101F5000E1EAF5E0E4918E1709F430C0E2ECF5E037 +:101F6000E4918E1709F441C0E3EEF5E0E4918E1799 +:101F700009F438C0E4E0F6E0E4918E1781F1E5E27F +:101F8000F6E0E4918E1741F1E6E4F6E0E4918E1775 +:101F900001F180E090E0E0DA8BE995E0DDDACC2336 +:101FA00009F4FDCE80911021882309F4F8CE80E158 +:101FB00091E2CDDA8EE995E0CFDAF1CE20E030E0A3 +:101FC00041E2429FC001439F900D11248E559A4FCC +:101FD000E2CF25E030E0F4CF24E030E0F1CF23E0A1 +:101FE00030E0EECF22E030E0EBCF21E030E0E8CF90 +:101FF0002FE030E01092102146E1429FC001439F44 +:10200000900D1124855C9B4F1F33F9F01D3389F02F +:10201000112319F089ECC1E09BCF4096FC0185911A +:102020009491FC010097B1F380E191E20995C1E040 +:102030008FCF4296FC0185919491FC01009751F35A +:10204000CE0101960995C1E083CF4496E7CF2EE0FB +:1020500030E0D0CF2DE030E0CDCF2CE030E0CACF63 +:102060002BE030E0C7CF2AE030E0C4CF29E030E0F9 +:10207000C1CF28E030E0BECF27E030E0BBCF26E084 +:1020800030E0B8CF25E030E0B5CF24E030E0B2CF8B +:1020900023E030E0AFCF22E030E0ACCF21E030E011 +:1020A000A9CF20E030E0A6CF0895A0E2B6E082E01C +:1020B00011968C93119715968C931597E0E4F8E0A0 +:1020C00010A211A28DE291E086A397A38FEF9FEF5C +:1020D00080A791A781E0808398E8938393E097831A +:1020E0001A968C9308951F920F920FB60F92112497 +:1020F0008F939F93EF93FF9380E192E28093B120BF +:102100009093B22080E992E28093B3209093B42020 +:102110001092AA201092A9201092A5201092AD2012 +:102120001092AE201092A820E0E4F8E0138286E935 +:1021300090E086AB97AB8AE190E080AF91AFE0E4AE +:10214000F9E010A211A28FEF9FEF86A397A389E871 +:1021500083838EE08083E0E2F6E01286FF91EF91C8 +:102160009F918F910F900FBE0F901F9018951F9207 +:102170000F920FB60F9211242F938F939F93EF938B +:10218000FF93909128068091A920957021E009F095 +:1021900020E0880F822B8093A9209091A52099237D +:1021A000A1F1982F9770973009F442C0982F9C7036 +:1021B00061F191E082FD6BC09093A7208091A820EF +:1021C00081116DC08091AA208695992309F471C070 +:1021D00020E8282B2093AA208091AD209091AE205A +:1021E00001968093AD209093AE2087709927892B1C +:1021F00061F4E091B120F091B2202193E093B120FD +:10220000F093B22081E08093A8208091A52091E0F6 +:1022100089278093A52088E880934308FF91EF9158 +:102220009F918F912F910F900FBE0F901F90189537 +:102230001092400880E180934C08109243098091ED +:10224000A720882379F18CEB94E080936609909322 +:1022500067091092A62081E080934C0983E0809367 +:1022600046098091AD209091AE20877061F09091E9 +:10227000AA208F5F96958F5F8930E1F7E091B120BA +:10228000F091B220908381E08093AF20BECF90E0A8 +:102290009093A7208091A820882309F493CF1092CF +:1022A000A820B3CF8CE794E08093660990936709E8 +:1022B000D0CF20E08ECF1F920F920FB60F92112435 +:1022C0002F933F938F939F93EF93FF938091A6203B +:1022D000853009F44DC0A8F0883009F47CC020F5A1 +:1022E000863009F4B8C0873009F48AC0FF91EF91B5 +:1022F0009F918F913F912F910F900FBE0F901F9044 +:102300001895823071F1F8F0833009F456C08430AA +:1023100069F78091AA2080FDB7C080E480934606CB +:1023200085E08093A620E2CF893009F45BC08A3033 +:10233000E9F610924009109246091092000881E0D7 +:102340008093B020D3CF882309F453C0813071F635 +:102350008FE390E080936609909367098EE0809305 +:10236000000880E48093450683E08093A620BECFDA +:102370008091AA2090E480FD84C0909345068695C4 +:102380008093AA208091AB209091AC2001968093FD +:10239000AB209093AC209C0127703327232B09F4AA +:1023A00077C02091AD203091AE208217930709F0BD +:1023B0004EC088E08093A62099CF80E480934606A3 +:1023C00084E08093A620E091B120F091B22080813A +:1023D0008093AA208BCF80E48093460689E0809387 +:1023E000A62084CF80E4809346068AE08093A620CE +:1023F0007DCF8FE790E0809366099093670976CF51 +:10240000E091B320F091B4208081811136C080E446 +:10241000809345062091AB203091AC208091AD2077 +:102420009091AE202817390721F23196E093B3201E +:10243000F093B420E091B120F091B220CF01019649 +:102440008093B1209093B22081818093AA2084E070 +:102450008093A6204BCFE091B320F091B4208081EF +:10246000811107C080E48093460687E08093A62010 +:102470003DCF80E480934506F8CF80E48093460604 +:10248000C9CF909346067BCF80E48093450648CF22 +:1024900086E08093A6202ACFCF93DF93E0E4F6E096 +:1024A00084E08283128AC0E8D1E082E68E83A0E2D3 +:1024B000B6E085E012968C93129781E050968C934B +:1024C000509782E052968C9352971A961C921A97C4 +:1024D00083E019968C9398E598839AE5998390E424 +:1024E0009183968381838683E0E0F8E08FE090E03B +:1024F00086A397A388E090E082A793A783E28183D5 +:10250000DF91CF91D2CDCF93DF938091AF208823FD +:10251000C1F01092AF2082E08093210680932606BE +:102520006091AD207091AE206115710589F4E09144 +:10253000EF20F091F0200995109240091092460981 +:10254000B4DD8091B02081112AC0DF91CF91089530 +:10255000E091F320F091F42080E192E2099594FF5C +:1025600023C09F7E009741F38093AD209093AE20CF +:102570001092AB201092AC2080E192E28093B120C7 +:102580009093B22080E992E28093B3209093B4209C +:1025900081E08093A6208091B0208823B1F2109230 +:1025A000B020DF91CF9181CDAC01569547955695DE +:1025B00047955695479541155105A1F260E020E0F9 +:1025C00030E0F901E05FFD4D2081022E22952025AB +:1025D000022E269526952025E058FF4F30E02F5FEC +:1025E0003F4F21FB772770F9C72F20E0D22F71E0F2 +:1025F000C727C0836F5F262F30E02417350708F305 +:10260000B1CF81E08093B52084E090E08093B62044 +:102610009093B72088E08093B820089581E080935C +:10262000B52082E090E08093B6209093B72088E1B7 +:102630008093B820089581E08093B520089508958F +:102640006F927F928F929F92AF92BF92CF92DF92C2 +:10265000EF92FF920F931F93CF93DF93CDB7DEB727 +:102660002E97CDBFDEBF8C018091B520843009F458 +:10267000F4C008F43BC0863009F4BDC008F060C067 +:10268000F801D08031D78D25D8018C931196DC903C +:102690002BD78D25F8018183D28026D78D25D801AF +:1026A00012968C9312971396DC901ED78D25F80105 +:1026B00083838081803309F4ACC2803A09F41FC35C +:1026C000803C09F43AC3813C09F4DAC3823C09F442 +:1026D000E7C3803B09F4F1C38056823008F494C10B +:1026E00081E08093B52020E030E063C0823009F4BF +:1026F000A0C008F471C0F8018081863209F46FC16E +:10270000823509F46CC1803509F474C1982F905654 +:10271000923008F4E6C1803351F0803A41F0803CB9 +:1027200031F0813C21F0823C11F0803BC9F681E020 +:102730008093B52084E0F801808324E030E039C044 +:102740008A3008F055C0D801FC90CED68F25F8010C +:102750008083F180C9D68F25D80111968C9311976B +:102760001296FC90C1D68F25F8018283F380BCD6E7 +:102770008F25D80113968C9313971496FC90B4D69A +:102780008F25F8018483F580AFD68F25D801159663 +:102790008C9364E070E0C80125D481110CC2E5D6A9 +:1027A00091E09827F801908385E08093B52024E09C +:1027B00030E0C9012E96CDBFDEBFDF91CF911F91D2 +:1027C0000F91FF90EF90DF90CF90BF90AF909F90D0 +:1027D0008F907F906F9008952091B6209091B720B0 +:1027E000D8018C91863209F4F1C0823509F4EEC02B +:1027F00020E030E0DECF780152E1D52ED701CC9039 +:1028000073D68C25F70181937F01DA94B9F760E1E3 +:1028100070E0C801E7D3882309F4C1CF8091FC2080 +:10282000882309F4E2C1A1D69AE09827D8019C93A5 +:10283000BBCF2091B6209091B720D8018C918632E1 +:1028400009F4C4C0823509F4C1C0833909F420C237 +:102850001092B52020E030E0ACCFC8011CD6D801E2 +:102860001496FC9041D68F25F8018483F5803CD6E0 +:102870008F25D80115968C9315971696FC9034D613 +:102880008F25F8018683F7802FD68F25D8011796DC +:102890008C93179714962C9114979091B920291323 +:1028A0001FCF15962C9115979091BA20291318CF08 +:1028B00016962C919091BB20291312CF9091BC2099 +:1028C00089130ECFF090BD200FD68F25F80180839D +:1028D000F090BD200F2CF294F0240F2CF694F69477 +:1028E000F02405D4F801E058FF4F2F2D30E02F5F82 +:1028F0003F4F21FB882480F8912C31E083268825E6 +:102900008083F090BE20F0D58F25D80111968C934E +:10291000F090BE200F2CF294F0240F2CF694F69435 +:10292000F024E5D3F801EF57FF4F2F2D30E02F5F54 +:102930003F4F21FBAA24A0F8B12CB1E0AB268A2599 +:102940008083F090BF20D0D58F25F8018283F0904E +:10295000BF200F2CF294F0240F2CF694F694F02460 +:10296000C6D3F801EE57FF4F2F2D30E02F5F3F4FBA +:1029700021FBCC24C0F8D12C31E0C3268C258083E8 +:10298000F090C020B1D58F25D80113968C93F0908C +:10299000C0200F2CF294F0240F2CF694F694F0241F +:1029A000A6D3F801ED57FF4F2F2D30E02F5F3F4F9B +:1029B00021FB662460F8712CB1E06B2686258083AC +:1029C00085E08093B52020E230E1F3CEF80120834A +:1029D000918382E08093B52020E130E0EACE84E06C +:1029E000D8018C9311961C9282E08093B52020E14F +:1029F00030E0DFCEF8018181882309F47CC2F80140 +:102A0000108224E030E0D5CE62E070E0C801EAD266 +:102A1000882309F4F6C0F80181818C739081903687 +:102A200009F485C26AE370E07B01F0E18F9FE00C5E +:102A3000F11C112464E0CE0107960E94DF0444E0FB +:102A400050E060E070E0CE010B960E94FC0546E08D +:102A500050E0B701CE0101960E94FC058F81809362 +:102A6000B92088858093BA2089858093BB208A8588 +:102A70008093BC2060E470E089EB90E29AD580916D +:102A8000B9208093BD208091BA208093BE20809190 +:102A9000BB208093BF208091BC208093C02060E247 +:102AA00070E08DEB90E285D5AE01495F5F4FBE01CE +:102AB000655F7F4FCE0101964ED38F81D8018C93F5 +:102AC000888511968C931197898512968C9312970D +:102AD0008A8513968C9384E08093B52020E230E0C1 +:102AE00068CE62E070E0C8017DD2882309F409C293 +:102AF000D80111962C9111972C738C91803609F482 +:102B000019C28AE390E07C01B0E12B9FE00CF11C3C +:102B1000112464E0CE0107960E94DF0444E050E0F7 +:102B200060E070E0CE010B960E94FC0546E050E0AC +:102B3000B701CE0101960E94FC058F818093B920D8 +:102B400088858093BA2089858093BB208A8580936D +:102B5000BC2060E470E089EB90E22BD58091B92035 +:102B60008093BD208091BA208093BE208091BB20AD +:102B70008093BF208091BC208093C02060E270E0F1 +:102B80008DEB90E216D584E08093B5208F81F8011B +:102B9000808388858183898582838A858383AE014A +:102BA000495F5F4FBE01655F7F4FCE010196D3D273 +:102BB00020E230E0FECD6091C120B0E16B9FB0011A +:102BC000112440E150E082EC90E20E94FC0520914B +:102BD000C2208091C6208095281709F4C4C0C5D4AE +:102BE00096E09827D8019C93DFCD6091C120F0E159 +:102BF0006F9FB001112440E150E0C8010E9481069E +:102C000012CEB3D491E09827F801908324E030E00D +:102C1000D0CD62E070E0C801E5D1882391F3D801FE +:102C200011966C91B0E16B9FB001112440E150E02E +:102C3000C8010E94FC0560E170E0C801A4D16801F0 +:102C4000E0E8CE0ED11CA12CD801BC904DD48B2530 +:102C5000F80181938F010B2CB294B0240B2CB69405 +:102C6000B694B02444D22B2D30E02F5F3F4F21FB90 +:102C7000EE24E0F8F12CF1E0EF268E25D6018D93BD +:102C80006D01A394B2E1AB12DFCF20E930E191CD29 +:102C900044E050E060E070E0CE0101960E94FC0547 +:102CA0009091B820D80111968C91803209F42FC1EF +:102CB000803709F09DCDD80112962C911297898109 +:102CC000281396CD13962C9113978A81281390CDB3 +:102CD00014962C9114978B8128138ACD15962C91DC +:102CE00015978C81281384CD9C9361E070E0C80116 +:102CF0004AD183E08093B52028E130E05ACD62E0EC +:102D000070E0C8016FD1882381F0D80111968C91B1 +:102D10008093C12086E08093B52027D49AE098273D +:102D2000F801908324E030E044CD1FD491E098274F +:102D3000D8019C9324E030E03CCD62E070E0C80113 +:102D400051D1882309F45DCFF80181818093C1209E +:102D500088E08093B52009D49AE09827D8019C9305 +:102D600024E030E026CD8091CA20281338CFE091AE +:102D7000C3208091C7208095E81331CF8091CB206C +:102D8000E8132DCF8091C4209091C820909589138D +:102D900026CF9091CC20891322CF3091C5209091DD +:102DA000C920909539131BCF9091CD20391317CF9F +:102DB0004091CE209091CF209095491310CF9091C3 +:102DC000D02049130CCF9091D1209095491307CF73 +:102DD000D8019C911196FC91119712964C911297E3 +:102DE00050E060E070E0BA01552744275F2B492B83 +:102DF00013969C91792B90E0A0E0B0E0DC0199273C +:102E000088279E2B822BB32B2091B520283009F4E4 +:102E10006DC0273021F4840F951FA61FB71F809324 +:102E2000C220C92EDA2EEB2EFF24C092C3208D01C2 +:102E3000222733270093C4204B2F55276627772757 +:102E40004093C520E82FE095E093C620EC2DE09557 +:102E5000E093C720E02FE095E093C820E42FE095B1 +:102E6000E093C9208093CA20C092CB200093CC204D +:102E70004093CD2085E08093B52020E030E099CCD0 +:102E800062E070E0C801AED0882309F44ECFD801CB +:102E900011968C918093C12087E08093B5203DCF1F +:102EA00062E070E0C8019ED0882309F4AACEF80140 +:102EB00081818093C12089E04CCF62E070E0C8013D +:102EC00091D0882309F431CF8091FC20811125CF46 +:102ED000D80111966C91B0E16B9FB001112440E1D3 +:102EE00050E082EC90E20E94810617CF841B950B84 +:102EF000A60BB70B94CF62E070E0C80173D08111CC +:102F0000A7CC81E0D8018C9324E030E052CC8981B9 +:102F1000F80180833A8131832B8122839C819383C2 +:102F2000832782278927848328E230E042CC60E32C +:102F300070E07ACD80E390E0E6CD44E050E060E0E0 +:102F400070E00C94FC05CF93DF931F92CDB7DEB7F2 +:102F5000FC012181308123273281232733812327DC +:102F6000298344E050E060E070E00E94810641E087 +:102F700050E064E070E0CE0101960E9481060F905F +:102F8000DF91CF9108956115710541F1680F791FA7 +:102F9000FC0123E633E64191422750E1459FC00101 +:102FA0001124A42FA8278A2F90E0582F4427880F98 +:102FB000991F880F991F880F991F48275927232F7A +:102FC000332724273527A295AF702A27E617F7075E +:102FD00011F7922F832F908381830895FC0183E65C +:102FE00093E6F9CF61157105B1F1680F791FFC0106 +:102FF00023E633E64191422750E1459FC001112469 +:10300000A42FA8278A2F90E0582F4427880F991FB4 +:10301000880F991F880F991F48275927232F332777 +:1030200024273527A295AF702A27E617F70711F74F +:10303000A9015527808190E08417950711F080E061 +:103040000895418150E0232F332781E04217530731 +:10305000B9F380E0F5CFFC0143E650E023E633E628 +:10306000E9CFCF93B091D520C091D6204091D72001 +:10307000A091D220F091D320E091D4209C2F907188 +:103080002B2F217E9227242F207292272A2F2479FA +:1030900092272F2F237792272E2F2A739227392FAB +:1030A00032953F703927232F269526952327922F77 +:1030B000969550E060E070E0BA01552744275C2BFC +:1030C0004B2B769567955795479592279170981356 +:1030D0006068A093D520F093D620E093D72040934A +:1030E000D2205093D3206093D420CF910895CF93D2 +:1030F000DF93C091D3209091D420A92FAF70B0E07E +:10310000A05EBF4DEC2FEF70F0E0E05EFF4DD0967B +:103110008C912089822BE091D220E295EF70F0E033 +:10312000E05EFF4D2081822BC295CF70D0E0C05E63 +:10313000DF4D28A1822B92959F70A92FB0E0A05A55 +:10314000BF4D9C91892BE82FF0E0E059FF4D808125 +:10315000DF91CF910895CF92DF92EF92FF920F937C +:103160001F93CF93DF93FC01DB01EA01918180E0A3 +:103170002081822B80FD8DC130E081FD88C120E05F +:103180009695879596958795432F406880FD342FB7 +:10319000422F406881FD242F9695879596958795B7 +:1031A00036952695432F406880FD342F422F406886 +:1031B00081FD242F9695879596958795369526952A +:1031C000432F406880FD342F422F406881FD242F1B +:1031D000969587959695879536952695432F4068C1 +:1031E00080FD342F422F406881FD242F96958795CE +:1031F0009695879536952695432F406880FD342F08 +:10320000422F406881FD242F969587959695879546 +:1032100036952695432F406880FD342F422F406815 +:1032200081FD242F969587959695879536952695B9 +:10323000532F5068422F406880FD352F3093D520A2 +:1032400081FD242F2093D220938180E02281822B44 +:1032500080FD1BC130E081FD16C120E09695879569 +:1032600096958795432F406880FD342F422F406804 +:1032700081FD242F96958795969587953695269569 +:10328000432F406880FD342F422F406881FD242F5A +:10329000969587959695879536952695432F406800 +:1032A00080FD342F422F406881FD242F969587950D +:1032B0009695879536952695432F406880FD342F47 +:1032C000422F406881FD242F969587959695879586 +:1032D00036952695432F406880FD342F422F406855 +:1032E00081FD242F969587959695879536952695F9 +:1032F000432F406880FD342F422F406881FD242FEA +:10330000969587959695879536952695532F50686F +:10331000422F406880FD352F3093D62081FD242F29 +:103320002093D320958180E02481822B80FDA9C049 +:1033300030E081FDA4C020E096958795969587950D +:10334000432F406880FD342F422F406881FD242F99 +:10335000969587959695879536952695432F40683F +:1033600080FD342F422F406881FD242F969587954C +:103370009695879536952695432F406880FD342F86 +:10338000422F406881FD242F9695879596958795C5 +:1033900036952695432F406880FD342F422F406894 +:1033A00081FD242F96958795969587953695269538 +:1033B000432F406880FD342F422F406881FD242F29 +:1033C000969587959695879536952695432F4068CF +:1033D00080FD342F422F406881FD242F96958795DC +:1033E0009695879536952695532F5068422F4068BD +:1033F00080FD352F3093D72081FD242F2093D420BA +:10340000898111969C9111978927CA8012969C9167 +:103410001297C926D12CE12CF12C7601DD24CC2485 +:10342000D82A88819C918927C82A8B8113969C91E0 +:103430008927F82A10E25BDE082F8C2D817011DEBF +:10344000F694E794D794C794002311F06894F7F8A2 +:10345000115089F788818C25888389818D258983FE +:103460008A818E258A838B818F258B83DF91CF91F3 +:103470001F910F91FF90EF90DF90CF90089520E47F +:103480005BCF30E456CF20E4E9CE30E4E4CE20E454 +:1034900077CE30E472CECF92DF92EF92FF92CF934D +:1034A000FC018181C280D12CE12CF12C7601DD243C +:1034B000CC24D82A8081C82A8381F82AC0E217DE6A +:1034C000B701A60141705527662777278427C9DDF4 +:1034D000F694E794D794C794C15089F7CF91FF90A1 +:1034E000EF90DF90CF900895CF93DF9300DEC82F49 +:1034F00080E0B7DDCC2309F436C0C0E8F8DDD82F72 +:1035000080E0AFDDC695D111C068F1DDD82F80E035 +:10351000A8DDC695D111C068EADDD82F80E0A1DD15 +:10352000C695D111C068E3DDD82F80E09ADDC6953D +:10353000D111C068DCDDD82F80E093DDC695D111B4 +:10354000C068D5DDD82F80E08CDDC695D111C0686C +:10355000CEDDD82F80E085DD8C2F8695D111806857 +:10356000DF91CF910895C0E0C9CFCF93DF93BFDD46 +:10357000C82F80E076DDCC23D1F0C8E0B8DDD82FAD +:1035800080E06FDDC695D111C860B1DDD82F80E035 +:1035900068DDC695D111C860AADDD82F80E061DD55 +:1035A0008C2F8695D1118860DF91CF910895C0E06E +:1035B000E5CF6F927F928F929F92AF92BF92CF9200 +:1035C000DF92EF92FF920F931F93CF93DF933C0113 +:1035D000CB010197672BC9F1F301A281C081B181B1 +:1035E000D3812A2F2D72322F32953F703227232F0D +:1035F000269526952327322F36954D2F50E060E0F3 +:1036000070E0742F6627552744275B2B4C2B6A2BC1 +:103610007695679557954795322730FD7068C42F8A +:10362000852E962EA72EBB24B82D6B01EE24FF24E9 +:10363000AC2D072F112722273327D02F019788F68B +:10364000F30140838182C2820383DF91CF911F9176 +:103650000F91FF90EF90DF90CF90BF90AF909F9031 +:103660008F907F906F9008950F931F93CF93DF9368 +:10367000CDB7DEB7EC97CDBFDEBF2BD3809315233C +:1036800028D38093162325D38093172322D38093A6 +:1036900018231FD3809319231CD380931A2319D383 +:1036A00080931B2316D380931C230E94360BB0D328 +:1036B000882389F09091152380911623853009F491 +:1036C00052C0B0F0883009F4B3C0893009F498C012 +:1036D000863009F45AC09CD3882311F06DD350D39F +:1036E000EC96CDBFDEBFDF91CF911F910F91089572 +:1036F000813021F008F468C0833069F7992309F418 +:10370000A1C0923041F780911723811127C0009109 +:10371000192310911A230F70112701151105D9F2E1 +:10372000802FF5D280911623833009F4E6C0E09112 +:103730001F23F091202381818B7F818384E8809FE8 +:10374000F001819FF00D1124ED59FC4D1082E091A4 +:103750001F23F091202380818E7F808380E0D7D249 +:103760002BD38FD4B8CF9111B6CF109117231F77D9 +:1037700023D387D47FD38823E9F31093C304111193 +:1037800076C082E080931423A6CF9058923008F040 +:10379000A2CF80911723909118238C3D23E09207AC +:1037A00009F467C0AE01455C5F4F609119230E9428 +:1037B00088038C01009709F48ECFFED2B8018BAD3F +:1037C0009CADC0D177D287CF903809F447C09238EA +:1037D00009F081CF809119238F7099D2E0911F2336 +:1037E000F0912023118112FB112710F980E08FD274 +:1037F000E3D2812F7DD280E07BD243D242D46BCF03 +:10380000911169CF80911723823008F064CFD4D210 +:10381000809117238093102334D480911023882320 +:1038200009F461C084E0809314230E94320B53CFCB +:10383000903809F050CFC0D28091102359D221D2B4 +:1038400020D449CF90911723913009F044CF91E0D3 +:10385000833009F090E09093122380CF10911123D0 +:1038600080911223882309F4C3CF1260C1CF83E073 +:1038700089CF83E08A838AE389835FB7F89482E003 +:103880008093CA01E8E0F0E0E4911092CA01DE0101 +:10389000139620E038E042E0EF708E2F90E0EA309F +:1038A000B8F0C7968D939D932F5F2C3199F040937C +:1038B000CA01E32FF0E0E4911092CA0120FFECCF9F +:1038C000E295EF703F5FEF708E2F90E0EA3048F79F +:1038D000C096E8CF5FBF70D26AE370E0CE01019678 +:1038E00090D0E8D1F8CE8091C304882321F084E001 +:1038F000809314239ACF81E0FBCF42D22FCF08953B +:10390000CF9380911423811102C0CF910895C0916B +:10391000212380E0FCD17CD2811103C08C2FCF9178 +:10392000F6C1A2DE8C2FCF91F2C1AF92BF92DF928F +:10393000EF92FF920F931F93CF93DF938C01EB01D4 +:103940007A01B5D3D82E811127C0E114F104A1F179 +:10395000F70120813181C21BD30B020F131F209767 +:10396000D9F0A12CB12C80911D2390911E23FC0134 +:10397000EF5BFF4F2081FC01E05CFF4F8081281747 +:1039800090F17FD1BDDFF701808191818A0D9B1D70 +:103990008083918325E0D22E8D2DDF91CF911F91D1 +:1039A0000F91FF90EF90DF90BF90AF90089569D195 +:1039B000A7DF7DD3811123C0209771F320911D23B0 +:1039C00030911E23F901EF5BFF4F9081F901E05C1C +:1039D000FF4F8081981758F7F80181918F0188D1A6 +:1039E000219761F7D9CFF80181918F0181D1FFEF44 +:1039F000AF1ABF0ACA15DB0509F0B5CFCDCFD82E57 +:103A0000CBCFCF92DF92EF92FF920F931F93CF9382 +:103A1000DF936C01EB0180912123806878D10091C4 +:103A20001B2310911C230C171D0720F0209709F46D +:103A300083C08E01C0E00115110509F04AC0CC23F6 +:103A400009F45CC080911423882309F455C08530A3 +:103A500009F45DC0DDD181116DC0F3D181114EC07B +:103A600009D2882379F38091212387FD5AC02091C0 +:103A70001D2330911E23F901E05CFF4FE080F90126 +:103A8000EF5BFF4F8081F12CE81AF1080115110559 +:103A9000A9F088E0E816F10488F4E60104C088E0A3 +:103AA000E816F10459F0899123D16E0101501109F2 +:103AB0008FEFE81AF80A0115110589F7C1E088E0CF +:103AC000E816F10409F0C0E0DCD00115110509F495 +:103AD000B6CF80911423882379F08530C1F098D136 +:103AE000811128C0AED1811109C0C4D18111BBCFD1 +:103AF000809114238111F1CF82E00AC0A2D18111FB +:103B00001FC0809114238823B9F38530B9F783E06F +:103B1000DF91CF911F910F91FF90EF90DF90CF90A9 +:103B20000895E0911D23F0911E23EF5BFF4FE0808D +:103B3000F12CACCF81E0ECCFA4D000E010E07ACF44 +:103B400080E0E6CFCF92DF92EF92FF920F931F9328 +:103B5000CF93DF93D82EC92E8B01809121238068CB +:103B6000D6D0C0911B23D0911C23C017D10728F0B9 +:103B70000115110509F47FC0E801ED2CFC2CD12CB6 +:103B8000209709F045C0DD2009F457C08091142327 +:103B9000882309F450C0853009F458C039D1811107 +:103BA00068C04FD1811149C065D1882379F38091D4 +:103BB000212387FD55C080911D2390911E23FC0178 +:103BC000E05CFF4F0081FC01EF5BFF4F808110E064 +:103BD000081B1109209791F00830110520F00EC044 +:103BE0000830110559F0F701849182D0FFEFEF1AE8 +:103BF000FF0A21970F5F1F4F209791F7DD24D39481 +:103C00000830110509F0D12C3CD0209709F4BBCF26 +:103C100080911423882379F08530C1F0F9D0811187 +:103C200028C00FD1811109C025D18111C0CF809149 +:103C300014238111F1CF82E00AC003D181111FC08A +:103C4000809114238823B9F38530B9F783E0DF919D +:103C5000CF911F910F91FF90EF90DF90CF9008953B +:103C6000E0911D23F0911E23EF5BFF4F008110E0D8 +:103C7000B1CF81E0ECCF05D0C0E0D0E07ECF80E0D6 +:103C8000E6CFE0911F23F0912023A0911D23B09156 +:103C90001E23AF5BBF4F8C9190E082839383808122 +:103CA0008D798083E0911D23F0911E23EF5BFF4F00 +:103CB00010820895E0911F23F091202380818D7957 +:103CC0008083E0911D23F0911E23EF5BFF4F108254 +:103CD000089580911D2390911E23FC01EF5BFF4FFF +:103CE0002081DC01A20FB11D8C912F5F20830895EC +:103CF00020911D2330911E23F901EF5BFF4F90812E +:103D0000D901A90FB11D8C939F5F90830895809373 +:103D10002123282F2F70622F70E094E8299F9001B3 +:103D200011242E5D3C4D4091C6045091C70487FD7F +:103D300012C020931D2330931E23CB0182959295B0 +:103D4000907F9827807F9827840F951F80931F234B +:103D50009093202308952E5B3F4F20931D23309393 +:103D60001E2362957295707F7627607F7627685F45 +:103D70007F4F640F751F60931F2370932023089556 +:103D8000E0911F23F0912023818184608183E09161 +:103D90001F23F09120238181807C803409F00895D5 +:103DA000809121238058B3DFE0911F23F0912023DD +:103DB0008181846081830895809121238F77A7DF9B +:103DC000E0911F23F091202380818D788083E09102 +:103DD0001F23F0912023808181608083E0911D2347 +:103DE000F0911E23EF5BFF4F1082809121238068AA +:103DF0008EDFE0911F23F0912023808181608083FA +:103E0000E0911D23F0911E23EF5BFF4F1082089578 +:103E1000809121238F777BDFE0911F23F091202376 +:103E2000808184FF0CC020911D2330911E2382814C +:103E30009381F901E05CFF4F808381E0089580E089 +:103E40000895809121238F7762DFE0911F23F09105 +:103E50002023808185FF0CC020911D2330911E23DB +:103E600082819381F901E05CFF4F808381E00895B6 +:103E700080E0089580912123806849DFE0911F232D +:103E8000F091202380818695817008951F93CF93B0 +:103E9000DF9300D0CDB7DEB7182F4A83698337DFB1 +:103EA000E0911F23F09120231182E0911F23F091D4 +:103EB00020234A81698117FD22C01082E0911F23CF +:103EC000F09120236183E0911F23F091202312823F +:103ED000138280911D2390911E238483958340E05B +:103EE000FC01E05CFF4F4083FC01EF5BFF4F108261 +:103EF00081E00F900F90DF91CF911F91089582E0A4 +:103F00008083E0911F23F09120236183E0911F23A0 +:103F1000F09120231282138280911D2390911E2301 +:103F200084839583DDCFAF92BF92DF92EF92FF92B1 +:103F30000F931F93CF93DF9300D0CDB7DEB7E62E5C +:103F4000662309F44AC05C018C010C5F1F4FF12C01 +:103F5000D5015C915523C9F1D5011196ED91FC91E4 +:103F60001297D80111974C91D8018C91823008F4A6 +:103F700043C098E188E1E930F10550F028E030E0F5 +:103F800090E09F5F220F331F2E173F07D0F3982B2F +:103F9000252F2F7030E02630310564F5E134F1052E +:103FA00048F59F7E41112BC09064DE2E4E2F692F65 +:103FB000852F805859839A8369DF9A8159814D2DC5 +:103FC000692F852F63DF8823A9F0F394B5E0AB0E4A +:103FD000B11C0B5F1F4FFE10BBCF81E00F900F9005 +:103FE000DF91CF911F910F91FF90EF90DF90BF90E5 +:103FF000AF90089580E0F2CF98E088E0BCCF4130E8 +:1040000029F09068442389F2DE2ED9CF906CDE2E01 +:10401000D6CFE0ECF4E0A681B78119961C92A68178 +:10402000B78111961C92A681B78159961C92A681E0 +:10403000B78151961C92A681B78199961C92A68150 +:10404000B78191961C92A681B781D9961C92A681C0 +:10405000B781D1961C92A681B781A75BBF4F1C92F6 +:10406000A681B781AF5BBF4F1C92A681B781A75ACB +:10407000BF4F1C920680F781E02DEF5AFF4F108250 +:1040800008958091152387FD08C0F4DE81110DC0CD +:10409000809114238111F9CF0895D3DE811106C0D8 +:1040A000809114238111F9CF0895EBCD03CE1F9396 +:1040B000CF93DF93E091C604F091C704E05AFF4F1D +:1040C000C081D18114E6809121238078803831F13C +:1040D000B8DE811126C080911423882339F1853000 +:1040E00051F1E0911F23F0912023818182FD28C0AE +:1040F000E091C604F091C704E05AFF4F808191819E +:10410000C817D90701F3212F21501123F1F0EC0139 +:10411000122F8091212380788038D1F6ABDE88235E +:10412000D1F280E0DF91CF911F91089582E0DF917D +:10413000CF911F91089583E0DF91CF911F91089552 +:1041400081E0DF91CF911F91089584E0DF91CF91BD +:104150001F91089563D069D0E0ECF4E081818E7FF7 +:10416000818380818F778083109213230895CF936A +:10417000DF93E0E4F0E014828481816084834ED098 +:1041800054D0C0ECD4E088818F77888388818068A0 +:1041900088831092142310921023109212231092ED +:1041A000112388818064888348E068E480E86EDEBB +:1041B00048E068E480E06ADE8885806488878981D9 +:1041C00081608983DF91CF910895CF93DF933FB7CB +:1041D000F894C0ECD1E022E02A87EAE1F0E0E49133 +:1041E000A0ECB4E0DA96EC93DA97EBE1F0E0E4913E +:1041F000DB96EC93DB971A868BE396E28E7F16961E +:104200008D939C93179785E18C9318962C933FBFC1 +:1042100081E080931323DF91CF91A9CFE0ECF4E00C +:1042200080858370808711860895E0ECF4E08FEF3D +:104230008287848708951F920F920FB60F921124E0 +:104240002F933F934F935F936F937F938F939F939E +:10425000AF93BF93EF93FF938091CA0487FD4DC046 +:104260008091CA0486FD41C08091CA0485FF0CC0BC +:1042700080E28093CA0480911023882371F184E046 +:10428000809314230E94280B8091CA0484FF14C0D9 +:1042900080E18093CA0482E080931423109210235B +:1042A0001092C304B6DE48E068E480E8EFDD48E041 +:1042B00068E480E0EBDD23DBFF91EF91BF91AF91EC +:1042C0009F918F917F916F915F914F913F912F912E +:1042D0000F900FBE0F901F9018958091C30481110D +:1042E00015C081E080931423CDCF80E48093CA046D +:1042F000109214230E942D0BB7CF8091C80487FF22 +:10430000AFCF80E88093CA04FADAAACF83E0EACF7D +:10431000CF93DF93EC014096FC018BE0DF011D920F +:104320008A95E9F782E08C83898783E08E8761E054 +:10433000CE010196F8DD811104C080E0DF91CF91BC +:10434000089561E0CE010696EEDD8823B1F361E0C9 +:10435000CE010B96DF91CF91E6CDCF93DF93D62F91 +:10436000C72F20911423243021F082E0DF91CF91D8 +:104370000895FC014489558966897789452B462B28 +:10438000472B99F38181C3DCAD2FBC2FFD01019038 +:104390000020E9F7BF01615071096A1B7B0B40E007 +:1043A00050E08D2F9C2FDF91CF91BFCAEF92FF92EB +:1043B0000F931F93CF93DF93EB017A012091142386 +:1043C000243041F082E0DF91CF911F910F91FF9057 +:1043D000EF900895FC010489158926893789012BFE +:1043E000022B032B79F3818192DC40E050E0B7018E +:1043F000CE01DF91CF911F910F91FF90EF9095CA61 +:104400000F931F93CF93DF931F92CDB7DEB7209109 +:104410001423243039F082E00F90DF91CF911F9167 +:104420000F910895FC010489158926893789012B8C +:10443000022B032B81F38181698369DC20911D2389 +:1044400030911E23F901EF5BFF4F9081F901E05C91 +:10445000FF4F80816981981730F0698312DC27DE75 +:1044600069818111D9CF862F43DC80E0D5CF0F93AE +:104470001F93CF93DF931F92CDB7DEB72091142304 +:10448000243039F082E00F90DF91CF911F910F918E +:104490000895FC014489558966897789452B462B07 +:1044A000472B81F3818133DC8091212320911D23CF +:1044B00030911E23F90187FD1DC0E05CFF4F808114 +:1044C000F901EF5BFF4F408190E0841B9109892B3C +:1044D00011F480E0D8CF0081F901E05CFF4F10813A +:1044E000D0DB0117B0F3E3DD8111CDCF8983C9DBC8 +:1044F0008981C9CFEF5BFF4F808190E0E8CFCF93F8 +:10450000DF93EC0180911423843019F0DF91CF9177 +:1045100008954C895D896E897F89452B462B472BF1 +:10452000A9F38981F4DBA6DC882381F3CE01DF9136 +:10453000CF919DCFCF93DF93209114232430C1F5E9 +:10454000FC014489558966897789452B462B472B81 +:1045500079F18681DCDB75DC882351F180912123A0 +:1045600087FD3DC080911D2390911E23FC01E05CDE +:10457000FF4F2081FC01EF5BFF4F408130E0241BA7 +:104580003109232BD9F4CFEFDFEF2091212327FD31 +:1045900023C0DC01A05CBF4F8C91208190E0821B86 +:1045A0009109892B39F486DBCE01DF91CF910895F3 +:1045B000CFEFDFEFCE01DF91CF9108958ADBC82FD7 +:1045C000D0E080911D2390911E23FC01EF5BFF4FF3 +:1045D0002091212327FFDDCF808190E0E2CF8091E1 +:1045E0001D2390911E23FC01EF5BFF4F208130E0E3 +:1045F000C8CF0895FF920F931F93CF93DF93EC01E1 +:1046000007DC882349F0888190E0209119233091BC +:104610001A232817390731F0DF91CF911F910F919D +:10462000FF90089580911623813209F44BC008F061 +:1046300033C0803289F780911523813269F7BCDB62 +:1046400004C080911423882339F3FBDB8823C9F34A +:1046500040DB082F3EDB182F3CDBF82E3ADB4F2DDA +:1046600050E060E070E0BA0155274427782B402BDA +:10467000512B4C8B5D8B6E8B7F8B2BDB888F29DBDB +:10468000898F27DB8A8F16DBFCDCCE01DF91CF918F +:104690001F910F91FF90ADCF823209F434C0833265 +:1046A00009F0BACF80911523813209F0B5CF84DBB0 +:1046B000E8DC60911723CE01DF91CF911F910F911C +:1046C000FF9097CF80911523813A09F0A5CF74DB35 +:1046D000D1DB8823E9F38C89FD880E891F8908DBEB +:1046E0008F2D06DB802F04DB812F02DB888D00DB22 +:1046F000898DFEDA8A8DFCDAC4DADF91CF911F91C1 +:104700000F91FF90BECC80911523813209F084CFA8 +:1047100053DBB7DC8091172390911823888B998BFA +:10472000CE01DF91CF911F910F91FF9062CFB7FF24 +:1047300004C003D0821B930B089509D0A59F900D50 +:10474000B49F900DA49F800D911D11240895A29FE8 +:10475000B001B39FC001A39F01D0B29F700D811D16 +:104760001124911D08958F929F92AF92BF92CF9284 +:10477000DF92EF92FF92CF93DF93EC016881798112 +:104780008A819B81611571058105910521F464E29F +:1047900079ED8BE597E02DE133EF41E050E038D340 +:1047A00049015A019B01AC01A7EAB1E4C6DF6B01E4 +:1047B0007C01ACEEB4EFA5019401BBDFC60ED71EA1 +:1047C000E81EF91EF7FE06C081E0C81AD108E1080C +:1047D00080E8F80AC882D982EA82FB82E894D7F896 +:1047E000EE24FF24C601DF91CF91FF90EF90DF9080 +:1047F000CF90BF90AF909F908F900895B4CF8CE1F1 +:1048000090E2B1CFA0E0B0E080931C2090931D20F7 +:10481000A0931E20B0931F200895FB01DC0102C06D +:1048200005900D9241505040D8F70895FB01DC01EE +:104830008D91059080190110D9F3990B0895FB0112 +:10484000DC014150504048F005900D920020C9F71E +:1048500001C01D9241505040E0F70895FB01DC017A +:1048600002C001900D9241505040D8F70895AEE03B +:10487000B0E0ECE3F4E2F5C20D891E898F89988DD2 +:104880002EE02C8309831A8397FF02C080E090E812 +:1048900001978D839E83CE014B96AC01698D7A8DF5 +:1048A000CE01019611D04D815E8157FD0AC02F8146 +:1048B0003885421753070CF49A01F801E20FF31FF1 +:1048C00010822E96E4E0E6C2ACE0B0E0E9E6F4E265 +:1048D000BAC27C016B018A01FC01168217828381B6 +:1048E00081FFB9C188248394912C8C0E9D1EF70101 +:1048F0009381F60193FD859193FF81916F01882348 +:1049000009F4A5C1853239F493FD859193FF819116 +:104910006F01853221F4B70190E0F0D1E8CF512C3E +:10492000312C20E02032A8F48B3261F028F4803260 +:1049300051F0833271F40BC08D3239F0803349F479 +:10494000216028C02260246025C0286023C0206127 +:1049500021C027FD27C0382F30533A3078F426FF86 +:1049600006C0FAE05F9E300D1124532E13C08AE07A +:10497000389E300D1124332E20620CC08E3221F46B +:1049800026FD65C1206406C08C3611F4206802C083 +:10499000883641F4F60193FD859193FF81916F0173 +:1049A0008111C0CF982F9554933018F090529330C6 +:1049B00028F40C5F1F4FFFE3F9830DC0833631F0FD +:1049C000833771F0833509F05AC022C0F801808125 +:1049D00089830E5F1F4F44244394512C540114C00B +:1049E0003801F2E06F0E711CF801A080B18026FF43 +:1049F00003C0652D70E002C06FEF7FEFC5012C870B +:104A000072D12C0183012C856FE7262E222217C03C +:104A10003801F2E06F0E711CF801A080B18026FF12 +:104A200003C0652D70E002C06FEF7FEFC5012C87DA +:104A30004FD12C012C8550E8252E222A830123FCFE +:104A40001AC005C0B70180E290E058D13A94832D96 +:104A500090E048165906B0F30EC0F50127FC859189 +:104A600027FE81915F01B70190E048D131103A945F +:104A7000F1E04F1A51084114510479F7E5C084362A +:104A800011F0893639F5F80127FF07C0608171817F +:104A9000828193810C5F1F4F08C0608171818827DC +:104AA00077FD8095982F0E5F1F4F4FE6B42EB222F0 +:104AB00097FF09C090958095709561957F4F8F4FB6 +:104AC0009F4FF0E8BF2A2AE030E0A40143D1A82E8E +:104AD000A81842C0853731F43FEEB32EB2222AE047 +:104AE00030E024C099EFB92EB2228F36B9F020F40D +:104AF000883509F0ACC00DC0803721F0883709F047 +:104B0000A6C002C020E1B22AB4FE0BC084E0B82ADD +:104B100008C024FF09C0E6E0BE2A06C028E030E055 +:104B200005C020E130E002C020E132E0F801B7FE2C +:104B300007C060817181828193810C5F1F4F06C025 +:104B40006081718180E090E00E5F1F4FA40102D16F +:104B5000A82EA818FFE7BF22B6FE0BC02B2D2E7F74 +:104B6000A51450F4B4FE0AC0B2FC08C02B2D2E7E52 +:104B700005C07A2C2B2D03C07A2C01C0752C24FF84 +:104B80000DC0FE01EA0DF11D8081803311F4297EF4 +:104B900009C022FF06C07394739404C0822F8678E4 +:104BA00009F0739423FD13C020FF0EC05A2C731418 +:104BB00058F4530C5718732C07C0B70180E290E0EB +:104BC0002C879CD073942C857314B8F304C0731491 +:104BD00010F4371801C0312C24FF11C0B70180E355 +:104BE00090E02C878BD02C8522FF1CC021FF03C0B6 +:104BF00088E590E002C088E790E0B7010CC0822F02 +:104C0000867881F021FD02C080E201C08BE227FDA1 +:104C10008DE2B70190E072D005C0B70180E390E06B +:104C20006DD05A94A514C8F3AA94F401EA0DF11DAD +:104C3000B701808190E062D0A110F6CF05C0B70126 +:104C400080E290E05BD03A943110F9CF50CEF7017A +:104C50002681378102C02FEF3FEFC9012C96E2E198 +:104C60000BC1E0ECF1E0A785A7FDFDCFA485A8600E +:104C7000A4876050704FF2CDDC01CB0102C02D91B2 +:104C800005D041505040D8F70895262FE0ECF1E0D0 +:104C9000378537FDFDCF3485377F3487378531FF42 +:104CA00009C036E3328738ED34BF31E033873785CA +:104CB00037FDFDCF33E332878083918312822483D3 +:104CC00025E3228728ED31E024BF3387019608953C +:104CD000FC010590615070400110D8F780959095C7 +:104CE0008E0F9F1F0895FC016150704001900110CC +:104CF000D8F7809590958E0F9F1F08950F931F935F +:104D0000CF93DF938C01EB018B8181FD03C00FEF0B +:104D10001FEF1AC082FF0DC02E813F818C819D81C3 +:104D20002817390764F4E881F9810193E883F9834E +:104D300006C0E885F985802F0995892B41F78E817A +:104D40009F8101968E839F83C801DF91CF911F9130 +:104D50000F910895FA01AA27283051F1203181F1ED +:104D6000E8946F936E7F6E5F7F4F8F4F9F4FAF4F73 +:104D7000B1E03ED0B4E03CD0670F781F891F9A1F86 +:104D8000A11D680F791F8A1F911DA11D6A0F711D3A +:104D9000811D911DA11D20D009F468943F912AE046 +:104DA000269F11243019305D3193DEF6CF0108952E +:104DB000462F4770405D4193B3E00FD0C9F7F6CF5F +:104DC000462F4F70405D4A3318F0495D31FD405227 +:104DD000419302D0A9F7EACFB4E0A69597958795BD +:104DE00077956795BA95C9F700976105710508959C +:104DF0009B01AC010A2E0694579547953795279548 +:104E0000BA95C9F7620F731F841F951FA01D0895DF +:104E1000052E97FB16F4009406D057FD0CD044D015 +:104E200007FC09D07EF490958095709561957F4F31 +:104E30008F4F9F4F089550954095309521953F4F46 +:104E40004F4F5F4F08952F923F924F925F926F9214 +:104E50007F928F929F92AF92BF92CF92DF92EF920A +:104E6000FF920F931F93CF93DF93CDB7DEB7CA1B8B +:104E7000DB0BCDBFDEBF09942A88398848885F8460 +:104E80006E847D848C849B84AA84B984C884DF80EA +:104E9000EE80FD800C811B81AA81B981CE0FD11DCE +:104EA000CDBFDEBFED010895A1E21A2EAA1BBB1BE8 +:104EB000FD010DC0AA1FBB1FEE1FFF1FA217B307E6 +:104EC000E407F50720F0A21BB30BE40BF50B661FFC +:104ED000771F881F991F1A9469F7609570958095C0 +:104EE00090959B01AC01BD01CF010895F894FFCFCF +:104EF000008310000001041000000182080000017E +:104F0000000000000000000000000014010000008C +:104F10000001010100000001000001000101000189 +:104F20000000000202000002000202020200000271 +:104F30000000000404000004000404040400000451 +:104F40000008080800000008000008000808000821 +:104F500000000010100000100010101010000010D1 +:104F6000000100010000000000000001000101013B +:104F70000101010001000100000001010001010127 +:024F800000002F :00000001FF diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.lss b/Firmware/Chameleon-Mini/Chameleon-Mini.lss index 445a85e..0b315ff 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.lss +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.lss @@ -3,33 +3,35 @@ Chameleon-Mini.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000052be 00000000 00000000 000000b4 2**1 + 0 .text 00004ef0 00000000 00000000 000000b4 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 000000a2 00802000 000052be 00005372 2**0 + 1 .data 00000092 00802000 00004ef0 00004fa4 2**0 CONTENTS, ALLOC, LOAD, DATA - 2 .bss 0000060b 008020a2 008020a2 00005414 2**0 + 2 .bss 0000060b 00802092 00802092 00005036 2**0 ALLOC - 3 .eeprom 00000013 00810000 00810000 00005414 2**0 + 3 .eeprom 00000013 00810000 00810000 00005036 2**0 CONTENTS, ALLOC, LOAD, DATA - 4 .stab 000014d0 00000000 00000000 00005428 2**2 + 4 .stab 000014d0 00000000 00000000 0000504c 2**2 CONTENTS, READONLY, DEBUGGING - 5 .stabstr 00000601 00000000 00000000 000068f8 2**0 + 5 .stabstr 0000070f 00000000 00000000 0000651c 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_aranges 00000b78 00000000 00000000 00006f00 2**3 + 6 .comment 0000002f 00000000 00000000 00006c2b 2**0 + CONTENTS, READONLY + 7 .debug_aranges 00000be0 00000000 00000000 00006c5a 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_info 000159d0 00000000 00000000 00007a78 2**0 + 8 .debug_info 00019186 00000000 00000000 0000783a 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_abbrev 00004a41 00000000 00000000 0001d448 2**0 + 9 .debug_abbrev 0000597c 00000000 00000000 000209c0 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_line 000075a6 00000000 00000000 00021e89 2**0 + 10 .debug_line 0000b338 00000000 00000000 0002633c 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_frame 00001e1c 00000000 00000000 00029430 2**2 + 11 .debug_frame 00001e88 00000000 00000000 00031674 2**2 CONTENTS, READONLY, DEBUGGING - 11 .debug_str 000076b2 00000000 00000000 0002b24c 2**0 + 12 .debug_str 000077fe 00000000 00000000 000334fc 2**0 CONTENTS, READONLY, DEBUGGING - 12 .debug_loc 0000b6e8 00000000 00000000 000328fe 2**0 + 13 .debug_loc 0000ce27 00000000 00000000 0003acfa 2**0 CONTENTS, READONLY, DEBUGGING - 13 .debug_ranges 00001ae0 00000000 00000000 0003dfe6 2**0 + 14 .debug_ranges 00001a08 00000000 00000000 00047b21 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -79,7 +81,7 @@ Disassembly of section .text: 52: 00 00 nop 54: 25 c3 rjmp .+1610 ; 0x6a0 <__bad_interrupt> 56: 00 00 nop - 58: 0c 94 6a 11 jmp 0x22d4 ; 0x22d4 <__vector_22> + 58: 0c 94 b7 10 jmp 0x216e ; 0x216e <__vector_22> 5c: 21 c3 rjmp .+1602 ; 0x6a0 <__bad_interrupt> 5e: 00 00 nop 60: 1f c3 rjmp .+1598 ; 0x6a0 <__bad_interrupt> @@ -102,7 +104,7 @@ Disassembly of section .text: 82: 00 00 nop 84: 0d c3 rjmp .+1562 ; 0x6a0 <__bad_interrupt> 86: 00 00 nop - 88: 0c 94 26 11 jmp 0x224c ; 0x224c <__vector_34> + 88: 0c 94 73 10 jmp 0x20e6 ; 0x20e6 <__vector_34> 8c: 09 c3 rjmp .+1554 ; 0x6a0 <__bad_interrupt> 8e: 00 00 nop 90: 07 c3 rjmp .+1550 ; 0x6a0 <__bad_interrupt> @@ -199,7 +201,7 @@ Disassembly of section .text: 146: 00 00 nop 148: ab c2 rjmp .+1366 ; 0x6a0 <__bad_interrupt> 14a: 00 00 nop - 14c: 0c 94 0e 12 jmp 0x241c ; 0x241c <__vector_83> + 14c: 0c 94 5b 11 jmp 0x22b6 ; 0x22b6 <__vector_83> 150: a7 c2 rjmp .+1358 ; 0x6a0 <__bad_interrupt> 152: 00 00 nop 154: a5 c2 rjmp .+1354 ; 0x6a0 <__bad_interrupt> @@ -282,7 +284,7 @@ Disassembly of section .text: 1ee: 00 00 nop 1f0: 57 c2 rjmp .+1198 ; 0x6a0 <__bad_interrupt> 1f2: 00 00 nop - 1f4: 0c 94 fa 22 jmp 0x45f4 ; 0x45f4 <__vector_125> + 1f4: 0c 94 1b 21 jmp 0x4236 ; 0x4236 <__vector_125> 1f8: 53 c2 rjmp .+1190 ; 0x6a0 <__bad_interrupt> 1fa: 00 00 nop @@ -309,12 +311,12 @@ Disassembly of section .text: 00000288 : 288: 00 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 .NONE........... - 298: 00 3c 04 3d 04 3e 04 3f 04 40 04 41 04 44 04 45 .<.=.>.?.@.A.D.E + 298: 00 40 04 41 04 42 04 43 04 44 04 45 04 48 04 49 .@.A.B.C.D.E.H.I 2a8: 04 00 00 00 01 01 4d 46 5f 43 4c 41 53 53 49 43 ......MF_CLASSIC - 2b8: 5f 31 4b 00 00 00 17 13 4f 13 c8 13 e2 13 e6 13 _1K.....O....... - 2c8: e7 13 c5 18 cb 18 00 04 04 00 02 4d 46 5f 43 4c ...........MF_CL - 2d8: 41 53 53 49 43 5f 34 4b 00 00 00 17 13 4f 13 d5 ASSIC_4K.....O.. - 2e8: 13 e2 13 e6 13 e7 13 c5 18 cb 18 00 10 04 00 ............... + 2b8: 5f 31 4b 00 00 00 4c 12 83 12 01 13 1b 13 1f 13 _1K...L......... + 2c8: 20 13 9d 17 a3 17 00 04 04 00 02 4d 46 5f 43 4c ..........MF_CL + 2d8: 41 53 53 49 43 5f 34 4b 00 00 00 4c 12 83 12 0e ASSIC_4K...L.... + 2e8: 13 1b 13 1f 13 20 13 9d 17 a3 17 00 10 04 00 ..... ......... 000002f7 : 2f7: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ @@ -332,64 +334,64 @@ Disassembly of section .text: 3b7: 43 59 43 4c 45 5f 53 45 54 54 49 4e 47 53 00 00 CYCLE_SETTINGS.. 3c7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000003d7 <__c.6198>: +000003d7 <__c.6287>: 3d7: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % 3e7: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S 3f7: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV 407: 52 2d 47 43 43 20 25 53 00 R-GCC %S. -00000410 <__c.6200>: - 410: 31 34 30 31 30 32 00 140102. +00000410 <__c.6289>: + 410: 31 34 30 35 31 31 00 140511. -00000417 <__c.6202>: +00000417 <__c.6291>: 417: 31 33 30 39 30 31 00 130901. -0000041e <__c.6204>: - 41e: 34 2e 36 2e 32 00 4.6.2. +0000041e <__c.6293>: + 41e: 34 2e 37 2e 32 00 4.7.2. -00000424 <__c.6209>: +00000424 <__c.6298>: 424: 25 73 00 %s. -00000427 <__c.6227>: +00000427 <__c.6316>: 427: 52 41 4e 44 4f 4d 00 RANDOM. -0000042e <__c.6254>: +0000042e <__c.6343>: 42e: 25 75 00 %u. -00000431 <__c.6259>: +00000431 <__c.6348>: 431: 25 75 00 %u. -00000434 <__c.6298>: +00000434 <__c.6387>: 434: 25 35 75 20 6d 56 00 %5u mV. 0000043b : 43b: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... - 44b: 00 00 00 00 84 0b 43 4f 4e 46 49 47 00 00 00 00 ......CONFIG.... - 45b: 00 00 00 00 00 00 de 0b d6 0b b1 0b 55 49 44 00 ............UID. - 46b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 0c ................ - 47b: e3 0b 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 ..READONLY...... - 48b: 00 00 00 00 6c 0c 5d 0c 55 50 4c 4f 41 44 00 00 ....l.].UPLOAD.. - 49b: 00 00 00 00 00 00 00 00 82 0c 00 00 00 00 44 4f ..............DO - 4ab: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 87 0c WNLOAD.......... + 44b: 00 00 00 00 3a 0b 43 4f 4e 46 49 47 00 00 00 00 ....:.CONFIG.... + 45b: 00 00 00 00 00 00 76 0b 6e 0b 58 0b 55 49 44 00 ......v.n.X.UID. + 46b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a1 0b ................ + 47b: 7b 0b 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 {.READONLY...... + 48b: 00 00 00 00 0a 0c f8 0b 55 50 4c 4f 41 44 00 00 ........UPLOAD.. + 49b: 00 00 00 00 00 00 00 00 1e 0c 00 00 00 00 44 4f ..............DO + 4ab: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 23 0c WNLOAD........#. 4bb: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... - 4cb: 00 00 00 00 8c 0c 00 00 00 00 55 50 47 52 41 44 ..........UPGRAD - 4db: 45 00 00 00 00 00 00 00 00 00 97 0c 00 00 00 00 E............... + 4cb: 00 00 00 00 28 0c 00 00 00 00 55 50 47 52 41 44 ....(.....UPGRAD + 4db: 45 00 00 00 00 00 00 00 00 00 33 0c 00 00 00 00 E.........3..... 4eb: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... - 4fb: 00 00 00 00 a2 0c 55 49 44 53 49 5a 45 00 00 00 ......UIDSIZE... - 50b: 00 00 00 00 00 00 00 00 00 00 c9 0c 42 55 54 54 ............BUTT - 51b: 4f 4e 00 00 00 00 00 00 00 00 00 00 ee 0c f8 0c ON.............. - 52b: f3 0c 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 ..SETTING....... - 53b: 00 00 00 00 05 0d 00 0d 43 4c 45 41 52 00 00 00 ........CLEAR... - 54b: 00 00 00 00 00 00 00 00 0d 0d 00 00 00 00 48 45 ..............HE - 55b: 4c 50 00 00 00 00 00 00 00 00 00 00 00 00 10 0d LP.............. + 4fb: 00 00 00 00 3e 0c 55 49 44 53 49 5a 45 00 00 00 ....>.UIDSIZE... + 50b: 00 00 00 00 00 00 00 00 00 00 56 0c 42 55 54 54 ..........V.BUTT + 51b: 4f 4e 00 00 00 00 00 00 00 00 00 00 6c 0c 76 0c ON..........l.v. + 52b: 71 0c 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 q.SETTING....... + 53b: 00 00 00 00 83 0c 7e 0c 43 4c 45 41 52 00 00 00 ......~.CLEAR... + 54b: 00 00 00 00 00 00 00 00 8b 0c 00 00 00 00 48 45 ..............HE + 55b: 4c 50 00 00 00 00 00 00 00 00 00 00 00 00 8e 0c LP.............. 56b: 00 00 00 00 52 53 53 49 00 00 00 00 00 00 00 00 ....RSSI........ - 57b: 00 00 00 00 00 00 00 00 5d 0d 00 00 00 00 00 00 ........]....... + 57b: 00 00 00 00 00 00 00 00 da 0c 00 00 00 00 00 00 ................ 58b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -0000059b <__c.5994>: +0000059b <__c.6083>: 59b: 0d 0a 00 ... -0000059e <__c.5996>: +0000059e <__c.6085>: 59e: 0d 0a 00 ... 000005a1 : @@ -419,18 +421,18 @@ Disassembly of section .text: 674: 10 e2 ldi r17, 0x20 ; 32 676: a0 e0 ldi r26, 0x00 ; 0 678: b0 e2 ldi r27, 0x20 ; 32 - 67a: ee eb ldi r30, 0xBE ; 190 - 67c: f2 e5 ldi r31, 0x52 ; 82 + 67a: e0 ef ldi r30, 0xF0 ; 240 + 67c: fe e4 ldi r31, 0x4E ; 78 67e: 02 c0 rjmp .+4 ; 0x684 <__do_copy_data+0x10> 680: 05 90 lpm r0, Z+ 682: 0d 92 st X+, r0 - 684: a2 3a cpi r26, 0xA2 ; 162 + 684: a2 39 cpi r26, 0x92 ; 146 686: b1 07 cpc r27, r17 688: d9 f7 brne .-10 ; 0x680 <__do_copy_data+0xc> 0000068a <__do_clear_bss>: - 68a: 16 e2 ldi r17, 0x26 ; 38 - 68c: a2 ea ldi r26, 0xA2 ; 162 + 68a: 26 e2 ldi r18, 0x26 ; 38 + 68c: a2 e9 ldi r26, 0x92 ; 146 68e: b0 e2 ldi r27, 0x20 ; 32 690: 01 c0 rjmp .+2 ; 0x694 <.do_clear_bss_start> @@ -438,14 +440,14 @@ Disassembly of section .text: 692: 1d 92 st X+, r1 00000694 <.do_clear_bss_start>: - 694: ad 3a cpi r26, 0xAD ; 173 - 696: b1 07 cpc r27, r17 + 694: ad 39 cpi r26, 0x9D ; 157 + 696: b2 07 cpc r27, r18 698: e1 f7 brne .-8 ; 0x692 <.do_clear_bss_loop> 69a: 03 d0 rcall .+6 ; 0x6a2