From e7ba634cba5038f4ee65e4d81744c3ff4cbe18f2 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 27 Oct 2013 18:06:07 +0100 Subject: [PATCH] everything works, yeah, integrated switches and leds --- firmware/USBtoSerial.c | 8 + firmware/USBtoSerial.c~ | 6 +- firmware/USBtoSerial.d | 5 +- firmware/USBtoSerial.elf | Bin 158119 -> 159646 bytes firmware/USBtoSerial.hex | 868 +++--- firmware/USBtoSerial.lss | 6137 +++++++++++++++++++------------------- firmware/USBtoSerial.map | 801 ++--- firmware/USBtoSerial.o | Bin 60800 -> 64748 bytes firmware/USBtoSerial.sym | 234 +- firmware/pins.h | 41 + firmware/pins.h~ | 49 +- 11 files changed, 4177 insertions(+), 3972 deletions(-) diff --git a/firmware/USBtoSerial.c b/firmware/USBtoSerial.c index ef5a460..51d2720 100644 --- a/firmware/USBtoSerial.c +++ b/firmware/USBtoSerial.c @@ -42,6 +42,7 @@ #include "TM1001A.c" // #include "rfm70.c" #include "pins.h" +#include "leds.c" int16_t plate_pos_x = 0,plate_pos_y = 0; char stringbuffer[16]; @@ -624,6 +625,9 @@ int main(void) { init_motors(); + init_leds(); + init_sw(); + char dummy; uint8_t field_val = 0; @@ -656,6 +660,10 @@ int main(void) uint8_t busy = 0, last_busy = 0; while (1) { + + set_led0(sw0_state()); + set_led1(sw1_state()); + set_led2(sw2_state()); Usb2SerialTask(); // loopcounter++; diff --git a/firmware/USBtoSerial.c~ b/firmware/USBtoSerial.c~ index f1820eb..13062d8 100644 --- a/firmware/USBtoSerial.c~ +++ b/firmware/USBtoSerial.c~ @@ -660,9 +660,9 @@ int main(void) while (1) { -// set_led0(sw0_state()); -// set_led1(sw1_state()); -// set_led2(sw2_state()); + set_led0(sw0_state()); + set_led1(sw1_state()); + set_led2(sw2_state()); Usb2SerialTask(); // loopcounter++; diff --git a/firmware/USBtoSerial.d b/firmware/USBtoSerial.d index 9dc1aac..c71da10 100644 --- a/firmware/USBtoSerial.d +++ b/firmware/USBtoSerial.d @@ -98,7 +98,8 @@ USBtoSerial.o: USBtoSerial.c USBtoSerial.h Descriptors.h \ ../../LUFA/../LUFA/Drivers/Peripheral/AVR8/../../../Common/Common.h \ ../../LUFA/../LUFA/Drivers/Peripheral/AVR8/../../Misc/TerminalCodes.h \ ../../LUFA/../LUFA/Drivers/Misc/RingBuffer.h \ - ../../LUFA/../LUFA/Drivers/Misc/../../Common/Common.h TM1001A.c pins.h + ../../LUFA/../LUFA/Drivers/Misc/../../Common/Common.h TM1001A.c pins.h \ + leds.c USBtoSerial.h: @@ -307,3 +308,5 @@ Config/LUFAConfig.h: TM1001A.c: pins.h: + +leds.c: diff --git a/firmware/USBtoSerial.elf b/firmware/USBtoSerial.elf index 8a2b459b43422beb89a1e223e0ee5da57e417fa6..1efaec76d80f86e1b55e69285ae1be5ce8db81fe 100755 GIT binary patch literal 159646 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

uVrs%k=E`zjiW_R?D!jNVyN`z?LD> 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 J`>q~s|34)=yJ!Fa literal 158119 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

u@?_E zmh!WI{Sdge&rg9%{aL;v(6*ZYX5f6?t?l*yYQldva07qk#qntX_z1(V-CYse&YqD7-cfb|;Lz`D^y0GL_fC8l5;9ItyvU>A} zFI>H@ciCx1pg}V+TE+)s$fVKS)jP0s#WK@wR2rq7y#xJAmpT~q{-yn9c&xIq(E_}z zkMPjs$Vjybw12r7o@}ljt8A!_le^TQWR*snEa-2v+8$Y9#wW*0c)6iT-m-q8t+bc*S_UQf^l84l|YQsE)T;BqX@7+`0k~ zzAdot96NCkN~N*M`e{z2RS{o=;Ct}@0U;dcr4OT#7#@88(^9o1o& zs?^V>6nM~-D?_D^VUVc?>Qb|I%i0SrEO8LUs`=|eGfTn;K-CS*pF<|fs^pjmm0j5N8>hJ;3=GB|mL)i;zQy^G6!h?xHwEXgSRvh3dj4q! z-;!byA9h7Gm1-T9+zAOct7v2UNhs7-eIe%k5ES=mnf6if4m)aG;Kl|wXiTL>@~F(hPb$&^s~a&)mVHxwxfGOvOH9;#vK&K9Uq=x7pZDh&Er3|hsWEQ#WV4BNP<_|tYJFs51Je}x68Ykgr4pw!89~>M zS0);qjp7gHl=joZ(1W3j;{~nTnAm0O=lcMQk8#+QAMG*G8a@XkKz6)e1vo4Z$I3OD zyKa4JORd?SEZ5!0SKn7gP$Lbs{=&YmF@`QDgFa_`O8L5fIspkyEF{v7+CtubTq1YUI%9V=muXv|8 z8jU!VN*~tExg2z7!c}1qjAxaNVOq&_^smSpB{2n>PBpza0zEVvlQAZ_^=9eZS{?l& z8>80a^H&rMgXZuRW&;*8lNgG9pD$JE>X?M}bTSyKhaWD;+74XsjB4Jd=fJbBz>M8C zcH}@VSaACVv+b{wKS|m31sbci6Xk1-v}y*UXk~I3>s~t+mV6bYl?U_$ zp~k(e4Y5d~d#m{po7VV$T2zQ&G`VXU>(q`Y*{Z+76 2a: 00 00 nop - 2c: 0c 94 69 09 jmp 0x12d2 ; 0x12d2 <__vector_11> - 30: 0c 94 0d 0a jmp 0x141a ; 0x141a <__vector_12> + 2c: 0c 94 b7 09 jmp 0x136e ; 0x136e <__vector_11> + 30: 0c 94 5b 0a jmp 0x14b6 ; 0x14b6 <__vector_12> 34: 9c c0 rjmp .+312 ; 0x16e <__bad_interrupt> 36: 00 00 nop 38: 9a c0 rjmp .+308 ; 0x16e <__bad_interrupt> @@ -93,7 +93,7 @@ Disassembly of section .text: 56: 00 00 nop 58: 8a c0 rjmp .+276 ; 0x16e <__bad_interrupt> 5a: 00 00 nop - 5c: 23 c3 rjmp .+1606 ; 0x6a4 <__vector_23> + 5c: 69 c3 rjmp .+1746 ; 0x730 <__vector_23> 5e: 00 00 nop 60: 86 c0 rjmp .+268 ; 0x16e <__bad_interrupt> 62: 00 00 nop @@ -158,8 +158,8 @@ Disassembly of section .text: 142: 11 e0 ldi r17, 0x01 ; 1 144: a0 e0 ldi r26, 0x00 ; 0 146: b1 e0 ldi r27, 0x01 ; 1 - 148: e8 ef ldi r30, 0xF8 ; 248 - 14a: fe e1 ldi r31, 0x1E ; 30 + 148: e4 e9 ldi r30, 0x94 ; 148 + 14a: ff e1 ldi r31, 0x1F ; 31 14c: 02 c0 rjmp .+4 ; 0x152 <__do_copy_data+0x10> 14e: 05 90 lpm r0, Z+ 150: 0d 92 st X+, r0 @@ -180,8 +180,8 @@ Disassembly of section .text: 162: a4 3d cpi r26, 0xD4 ; 212 164: b1 07 cpc r27, r17 166: e1 f7 brne .-8 ; 0x160 <.do_clear_bss_loop> - 168: 6d d6 rcall .+3290 ; 0xe44

- 16a: 0c 94 7a 0f jmp 0x1ef4 ; 0x1ef4 <_exit> + 168: b3 d6 rcall .+3430 ; 0xed0
+ 16a: 0c 94 c8 0f jmp 0x1f90 ; 0x1f90 <_exit> 0000016e <__bad_interrupt>: 16e: 48 cf rjmp .-368 ; 0x0 <__vectors> @@ -609,12 +609,12 @@ u08 adb(void) { 340: bc 01 movw r22, r24 342: 80 e0 ldi r24, 0x00 ; 0 344: 90 e0 ldi r25, 0x00 ; 0 - 346: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 346: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 34a: 20 e0 ldi r18, 0x00 ; 0 34c: 30 e8 ldi r19, 0x80 ; 128 34e: 4e e0 ldi r20, 0x0E ; 14 350: 53 e4 ldi r21, 0x43 ; 67 - 352: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 352: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 356: 87 fd sbrc r24, 7 358: f2 cf rjmp .-28 ; 0x33e ; // Warteschleife @@ -641,12 +641,12 @@ u08 adb(void) { 36c: bc 01 movw r22, r24 36e: 80 e0 ldi r24, 0x00 ; 0 370: 90 e0 ldi r25, 0x00 ; 0 - 372: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 372: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 376: 20 e0 ldi r18, 0x00 ; 0 378: 30 e0 ldi r19, 0x00 ; 0 37a: 4c e8 ldi r20, 0x8C ; 140 37c: 52 e4 ldi r21, 0x42 ; 66 - 37e: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 37e: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 382: 87 fd sbrc r24, 7 384: f2 cf rjmp .-28 ; 0x36a ; @@ -659,12 +659,12 @@ u08 adb(void) { 38c: bc 01 movw r22, r24 38e: 80 e0 ldi r24, 0x00 ; 0 390: 90 e0 ldi r25, 0x00 ; 0 - 392: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 392: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 396: 20 e0 ldi r18, 0x00 ; 0 398: 30 e0 ldi r19, 0x00 ; 0 39a: 48 e4 ldi r20, 0x48 ; 72 39c: 53 e4 ldi r21, 0x43 ; 67 - 39e: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 39e: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 3a2: 87 fd sbrc r24, 7 3a4: f2 cf rjmp .-28 ; 0x38a 3a6: 41 c0 rjmp .+130 ; 0x42a @@ -706,12 +706,12 @@ u08 adb(void) { 3ca: bc 01 movw r22, r24 3cc: 80 e0 ldi r24, 0x00 ; 0 3ce: 90 e0 ldi r25, 0x00 ; 0 - 3d0: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 3d0: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 3d4: 20 e0 ldi r18, 0x00 ; 0 3d6: 30 e0 ldi r19, 0x00 ; 0 3d8: 4c e8 ldi r20, 0x8C ; 140 3da: 52 e4 ldi r21, 0x42 ; 66 - 3dc: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 3dc: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 3e0: 87 fd sbrc r24, 7 3e2: f2 cf rjmp .-28 ; 0x3c8 3e4: 0e c0 rjmp .+28 ; 0x402 @@ -722,12 +722,12 @@ u08 adb(void) { 3e8: bc 01 movw r22, r24 3ea: 80 e0 ldi r24, 0x00 ; 0 3ec: 90 e0 ldi r25, 0x00 ; 0 - 3ee: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 3ee: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 3f2: 20 e0 ldi r18, 0x00 ; 0 3f4: 30 e0 ldi r19, 0x00 ; 0 3f6: 42 e0 ldi r20, 0x02 ; 2 3f8: 53 e4 ldi r21, 0x43 ; 67 - 3fa: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 3fa: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 3fe: 87 fd sbrc r24, 7 400: f2 cf rjmp .-28 ; 0x3e6 ; @@ -740,12 +740,12 @@ u08 adb(void) { 408: bc 01 movw r22, r24 40a: 80 e0 ldi r24, 0x00 ; 0 40c: 90 e0 ldi r25, 0x00 ; 0 - 40e: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 40e: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 412: 20 e0 ldi r18, 0x00 ; 0 414: 30 e0 ldi r19, 0x00 ; 0 416: 48 e4 ldi r20, 0x48 ; 72 418: 53 e4 ldi r21, 0x43 ; 67 - 41a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 41a: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 41e: 87 fd sbrc r24, 7 420: f2 cf rjmp .-28 ; 0x406 ADB_POUT |= ADB_BIT; @@ -783,12 +783,12 @@ u08 adb(void) { 438: bc 01 movw r22, r24 43a: 80 e0 ldi r24, 0x00 ; 0 43c: 90 e0 ldi r25, 0x00 ; 0 - 43e: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 43e: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 442: 20 e0 ldi r18, 0x00 ; 0 444: 30 e0 ldi r19, 0x00 ; 0 446: 42 e0 ldi r20, 0x02 ; 2 448: 53 e4 ldi r21, 0x43 ; 67 - 44a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 44a: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 44e: 87 fd sbrc r24, 7 450: f2 cf rjmp .-28 ; 0x436 ; @@ -801,12 +801,12 @@ u08 adb(void) { 458: bc 01 movw r22, r24 45a: 80 e0 ldi r24, 0x00 ; 0 45c: 90 e0 ldi r25, 0x00 ; 0 - 45e: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 45e: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 462: 20 e0 ldi r18, 0x00 ; 0 464: 30 e0 ldi r19, 0x00 ; 0 466: 48 e4 ldi r20, 0x48 ; 72 468: 53 e4 ldi r21, 0x43 ; 67 - 46a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 46a: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 46e: 87 fd sbrc r24, 7 470: f2 cf rjmp .-28 ; 0x456 ; @@ -852,12 +852,12 @@ u08 adb(void) { 492: bc 01 movw r22, r24 494: 80 e0 ldi r24, 0x00 ; 0 496: 90 e0 ldi r25, 0x00 ; 0 - 498: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 498: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 49c: 20 e0 ldi r18, 0x00 ; 0 49e: 30 e0 ldi r19, 0x00 ; 0 4a0: 4a ef ldi r20, 0xFA ; 250 4a2: 53 e4 ldi r21, 0x43 ; 67 - 4a4: 0e 94 e5 0e call 0x1dca ; 0x1dca <__gesf2> + 4a4: 0e 94 33 0f call 0x1e66 ; 0x1e66 <__gesf2> 4a8: 18 16 cp r1, r24 4aa: 0c f4 brge .+2 ; 0x4ae 4ac: 42 c0 rjmp .+132 ; 0x532 <__stack+0x33> @@ -902,12 +902,12 @@ u08 adb(void) { 4ce: bc 01 movw r22, r24 4d0: 80 e0 ldi r24, 0x00 ; 0 4d2: 90 e0 ldi r25, 0x00 ; 0 - 4d4: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 4d4: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 4d8: 20 e0 ldi r18, 0x00 ; 0 4da: 30 e0 ldi r19, 0x00 ; 0 4dc: 48 e4 ldi r20, 0x48 ; 72 4de: 53 e4 ldi r21, 0x43 ; 67 - 4e0: 0e 94 e5 0e call 0x1dca ; 0x1dca <__gesf2> + 4e0: 0e 94 33 0f call 0x1e66 ; 0x1e66 <__gesf2> 4e4: 18 16 cp r1, r24 4e6: 14 f4 brge .+4 ; 0x4ec return (z_byte - 1); @@ -928,12 +928,12 @@ u08 adb(void) { 4f8: bc 01 movw r22, r24 4fa: 80 e0 ldi r24, 0x00 ; 0 4fc: 90 e0 ldi r25, 0x00 ; 0 - 4fe: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> + 4fe: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> 502: 20 e0 ldi r18, 0x00 ; 0 504: 30 e0 ldi r19, 0x00 ; 0 506: 48 ec ldi r20, 0xC8 ; 200 508: 52 e4 ldi r21, 0x42 ; 66 - 50a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> + 50a: 0e 94 e9 0d call 0x1bd2 ; 0x1bd2 <__cmpsf2> 50e: 87 ff sbrs r24, 7 510: 03 c0 rjmp .+6 ; 0x518 <__stack+0x19> adb_werte[z_byte] += bitpos; @@ -1143,5758 +1143,5903 @@ int8_t delta_x(void) { } 5ce: 08 95 ret -000005d0 : +000005d0 : + +void init_leds(void) { + DDRLED0 |= 1<: + + +void set_led0(uint8_t value){ + PORTLED0 &= ~(1<: + +void set_led1(uint8_t value){ + PORTLED1 &= ~(1<: + +void set_led2(uint8_t value){ + PORTLED2 &= ~(1< + 60c: 28 2b or r18, r24 + 60e: 2b b9 out 0x0b, r18 ; 11 +} + 610: 08 95 ret + +00000612 : + + +void init_sw(void) { + DDRSW0 &= ~(1<: + + +uint8_t sw0_state(void){ + return (PINSW0 & (1<>SW0; + 620: 89 b1 in r24, 0x09 ; 9 + 622: 90 e0 ldi r25, 0x00 ; 0 + 624: 80 71 andi r24, 0x10 ; 16 + 626: 90 70 andi r25, 0x00 ; 0 + 628: a4 e0 ldi r26, 0x04 ; 4 + 62a: 95 95 asr r25 + 62c: 87 95 ror r24 + 62e: aa 95 dec r26 + 630: e1 f7 brne .-8 ; 0x62a +} + 632: 08 95 ret + +00000634 : + +uint8_t sw1_state(void){ + return (PINSW1 & (1<>SW1; + 634: 86 b1 in r24, 0x06 ; 6 + 636: 90 e0 ldi r25, 0x00 ; 0 + 638: 80 72 andi r24, 0x20 ; 32 + 63a: 90 70 andi r25, 0x00 ; 0 + 63c: b5 e0 ldi r27, 0x05 ; 5 + 63e: 95 95 asr r25 + 640: 87 95 ror r24 + 642: ba 95 dec r27 + 644: e1 f7 brne .-8 ; 0x63e +} + 646: 08 95 ret + +00000648 : + +uint8_t sw2_state(void){ + return (PINSW2 & (1<>SW2; + 648: 86 b1 in r24, 0x06 ; 6 + 64a: 90 e0 ldi r25, 0x00 ; 0 + 64c: 80 71 andi r24, 0x10 ; 16 + 64e: 90 70 andi r25, 0x00 ; 0 + 650: 24 e0 ldi r18, 0x04 ; 4 + 652: 95 95 asr r25 + 654: 87 95 ror r24 + 656: 2a 95 dec r18 + 658: e1 f7 brne .-8 ; 0x652 + 65a: 08 95 ret + +0000065c : void Usb2SerialTask(void) { - 5d0: 1f 93 push r17 + 65c: 1f 93 push r17 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 5d2: 8f b7 in r24, 0x3f ; 63 + 65e: 8f b7 in r24, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 5d4: f8 94 cli + 660: f8 94 cli uint16_t Count; uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); Count = Buffer->Count; - 5d6: 20 91 5c 01 lds r18, 0x015C - 5da: 30 91 5d 01 lds r19, 0x015D + 662: 20 91 5c 01 lds r18, 0x015C + 666: 30 91 5d 01 lds r19, 0x015D static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 5de: 8f bf out 0x3f, r24 ; 63 + 66a: 8f bf out 0x3f, r24 ; 63 /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) - 5e0: 80 91 5a 01 lds r24, 0x015A - 5e4: 90 91 5b 01 lds r25, 0x015B - 5e8: 28 17 cp r18, r24 - 5ea: 39 07 cpc r19, r25 - 5ec: 51 f0 breq .+20 ; 0x602 + 66c: 80 91 5a 01 lds r24, 0x015A + 670: 90 91 5b 01 lds r25, 0x015B + 674: 28 17 cp r18, r24 + 676: 39 07 cpc r19, r25 + 678: 51 f0 breq .+20 ; 0x68e { int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - 5ee: 88 e2 ldi r24, 0x28 ; 40 - 5f0: 91 e0 ldi r25, 0x01 ; 1 - 5f2: 0e 94 08 0d call 0x1a10 ; 0x1a10 - 5f6: bc 01 movw r22, r24 + 67a: 88 e2 ldi r24, 0x28 ; 40 + 67c: 91 e0 ldi r25, 0x01 ; 1 + 67e: 0e 94 56 0d call 0x1aac ; 0x1aac + 682: bc 01 movw r22, r24 /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ if (!(ReceivedByte < 0)) - 5f8: 97 fd sbrc r25, 7 - 5fa: 03 c0 rjmp .+6 ; 0x602 + 684: 97 fd sbrc r25, 7 + 686: 03 c0 rjmp .+6 ; 0x68e RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); - 5fc: 82 e5 ldi r24, 0x52 ; 82 - 5fe: 91 e0 ldi r25, 0x01 ; 1 - 600: b7 dd rcall .-1170 ; 0x170 + 688: 82 e5 ldi r24, 0x52 ; 82 + 68a: 91 e0 ldi r25, 0x01 ; 1 + 68c: 71 dd rcall .-1310 ; 0x170 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 602: 2f b7 in r18, 0x3f ; 63 + 68e: 2f b7 in r18, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 604: f8 94 cli - 606: 80 91 e8 01 lds r24, 0x01E8 - 60a: 90 91 e9 01 lds r25, 0x01E9 + 690: f8 94 cli + 692: 80 91 e8 01 lds r24, 0x01E8 + 696: 90 91 e9 01 lds r25, 0x01E9 static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 60e: 2f bf out 0x3f, r18 ; 63 + 69a: 2f bf out 0x3f, r18 ; 63 } /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); if (BufferCount) - 610: 00 97 sbiw r24, 0x00 ; 0 - 612: 09 f1 breq .+66 ; 0x656 + 69c: 00 97 sbiw r24, 0x00 ; 0 + 69e: 09 f1 breq .+66 ; 0x6e2 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 614: 20 91 29 01 lds r18, 0x0129 - 618: 2f 70 andi r18, 0x0F ; 15 - 61a: 20 93 e9 00 sts 0x00E9, r18 + 6a0: 20 91 29 01 lds r18, 0x0129 + 6a4: 2f 70 andi r18, 0x0F ; 15 + 6a6: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 61e: 20 91 e8 00 lds r18, 0x00E8 + 6aa: 20 91 e8 00 lds r18, 0x00E8 { Endpoint_SelectEndpoint(VirtualSerial_CDC_Interface.Config.DataINEndpoint.Address); /* Check if a packet is already enqueued to the host - if so, we shouldn't try to send more data * until it completes as there is a chance nothing is listening and a lengthy timeout could occur */ if (Endpoint_IsINReady()) - 622: 20 ff sbrs r18, 0 - 624: 18 c0 rjmp .+48 ; 0x656 + 6ae: 20 ff sbrs r18, 0 + 6b0: 18 c0 rjmp .+48 ; 0x6e2 { /* Never send more than one bank size less one byte to the host at a time, so that we don't block * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */ uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1)); - 626: 80 31 cpi r24, 0x10 ; 16 - 628: 91 05 cpc r25, r1 - 62a: 10 f0 brcs .+4 ; 0x630 - 62c: 8f e0 ldi r24, 0x0F ; 15 - 62e: 90 e0 ldi r25, 0x00 ; 0 - 630: 18 2f mov r17, r24 + 6b2: 80 31 cpi r24, 0x10 ; 16 + 6b4: 91 05 cpc r25, r1 + 6b6: 10 f0 brcs .+4 ; 0x6bc + 6b8: 8f e0 ldi r24, 0x0F ; 15 + 6ba: 90 e0 ldi r25, 0x00 ; 0 + 6bc: 18 2f mov r17, r24 /* Read bytes from the USART receive buffer into the USB IN endpoint */ while (BytesToSend--) - 632: 0f c0 rjmp .+30 ; 0x652 + 6be: 0f c0 rjmp .+30 ; 0x6de * \return Next data element stored in the buffer. */ static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) { return *Buffer->Out; - 634: e0 91 e0 01 lds r30, 0x01E0 - 638: f0 91 e1 01 lds r31, 0x01E1 + 6c0: e0 91 e0 01 lds r30, 0x01E0 + 6c4: f0 91 e1 01 lds r31, 0x01E1 { /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */ if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface, - 63c: 88 e2 ldi r24, 0x28 ; 40 - 63e: 91 e0 ldi r25, 0x01 ; 1 - 640: 60 81 ld r22, Z - 642: 0e 94 97 0c call 0x192e ; 0x192e - 646: 11 50 subi r17, 0x01 ; 1 - 648: 88 23 and r24, r24 - 64a: 29 f4 brne .+10 ; 0x656 + 6c8: 88 e2 ldi r24, 0x28 ; 40 + 6ca: 91 e0 ldi r25, 0x01 ; 1 + 6cc: 60 81 ld r22, Z + 6ce: 0e 94 e5 0c call 0x19ca ; 0x19ca + 6d2: 11 50 subi r17, 0x01 ; 1 + 6d4: 88 23 and r24, r24 + 6d6: 29 f4 brne .+10 ; 0x6e2 { break; } /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ RingBuffer_Remove(&USARTtoUSB_Buffer); - 64c: 8e ed ldi r24, 0xDE ; 222 - 64e: 91 e0 ldi r25, 0x01 ; 1 - 650: aa dd rcall .-1196 ; 0x1a6 + 6d8: 8e ed ldi r24, 0xDE ; 222 + 6da: 91 e0 ldi r25, 0x01 ; 1 + 6dc: 64 dd rcall .-1336 ; 0x1a6 /* Never send more than one bank size less one byte to the host at a time, so that we don't block * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */ uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1)); /* Read bytes from the USART receive buffer into the USB IN endpoint */ while (BytesToSend--) - 652: 11 23 and r17, r17 - 654: 79 f7 brne .-34 ; 0x634 + 6de: 11 23 and r17, r17 + 6e0: 79 f7 brne .-34 ; 0x6c0 // if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { // Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); // dummy = RingBuffer_Remove(&USBtoUSART_Buffer); // sendPayload(&dummy,1,0); // } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); - 656: 88 e2 ldi r24, 0x28 ; 40 - 658: 91 e0 ldi r25, 0x01 ; 1 - 65a: 0e 94 f1 0c call 0x19e2 ; 0x19e2 + 6e2: 88 e2 ldi r24, 0x28 ; 40 + 6e4: 91 e0 ldi r25, 0x01 ; 1 + 6e6: 0e 94 3f 0d call 0x1a7e ; 0x1a7e USB_USBTask(); - 65e: 0e 94 ab 0b call 0x1756 ; 0x1756 + 6ea: 0e 94 f9 0b call 0x17f2 ; 0x17f2 } - 662: 1f 91 pop r17 - 664: 08 95 ret + 6ee: 1f 91 pop r17 + 6f0: 08 95 ret -00000666 : +000006f2 : /** Configures the board hardware and chip peripherals for the demo's functionality. */ void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); - 666: 84 b7 in r24, 0x34 ; 52 - 668: 87 7f andi r24, 0xF7 ; 247 - 66a: 84 bf out 0x34, r24 ; 52 + 6f2: 84 b7 in r24, 0x34 ; 52 + 6f4: 87 7f andi r24, 0xF7 ; 247 + 6f6: 84 bf out 0x34, r24 ; 52 wdt_disable(); - 66c: 88 e1 ldi r24, 0x18 ; 24 - 66e: 0f b6 in r0, 0x3f ; 63 - 670: f8 94 cli - 672: 80 93 60 00 sts 0x0060, r24 - 676: 10 92 60 00 sts 0x0060, r1 - 67a: 0f be out 0x3f, r0 ; 63 + 6f8: 88 e1 ldi r24, 0x18 ; 24 + 6fa: 0f b6 in r0, 0x3f ; 63 + 6fc: f8 94 cli + 6fe: 80 93 60 00 sts 0x0060, r24 + 702: 10 92 60 00 sts 0x0060, r1 + 706: 0f be out 0x3f, r0 ; 63 The type of x is clock_div_t. */ void clock_prescale_set(clock_div_t __x) { uint8_t __tmp = _BV(CLKPCE); __asm__ __volatile__ ( - 67c: 90 e0 ldi r25, 0x00 ; 0 - 67e: 80 e8 ldi r24, 0x80 ; 128 - 680: 0f b6 in r0, 0x3f ; 63 - 682: f8 94 cli - 684: 80 93 61 00 sts 0x0061, r24 - 688: 90 93 61 00 sts 0x0061, r25 - 68c: 0f be out 0x3f, r0 ; 63 + 708: 90 e0 ldi r25, 0x00 ; 0 + 70a: 80 e8 ldi r24, 0x80 ; 128 + 70c: 0f b6 in r0, 0x3f ; 63 + 70e: f8 94 cli + 710: 80 93 61 00 sts 0x0061, r24 + 714: 90 93 61 00 sts 0x0061, r25 + 718: 0f be out 0x3f, r0 ; 63 clock_prescale_set(clock_div_1); /* Hardware Initialization */ // LEDs_Init(); USB_Init(); } - 68e: 12 c6 rjmp .+3108 ; 0x12b4 + 71a: 1a c6 rjmp .+3124 ; 0x1350 -00000690 : +0000071c : /** Event handler for the library USB Connection event. */ void EVENT_USB_Device_Connect(void) { // LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); } - 690: 08 95 ret + 71c: 08 95 ret -00000692 : +0000071e : /** Event handler for the library USB Disconnection event. */ void EVENT_USB_Device_Disconnect(void) { // LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); } - 692: 08 95 ret + 71e: 08 95 ret -00000694 : +00000720 : /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { bool ConfigSuccess = true; ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); - 694: 88 e2 ldi r24, 0x28 ; 40 - 696: 91 e0 ldi r25, 0x01 ; 1 - 698: 0c 94 73 0c jmp 0x18e6 ; 0x18e6 + 720: 88 e2 ldi r24, 0x28 ; 40 + 722: 91 e0 ldi r25, 0x01 ; 1 + 724: 0c 94 c1 0c jmp 0x1982 ; 0x1982 -0000069c : +00000728 : } /** Event handler for the library USB Control Request reception event. */ void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); - 69c: 88 e2 ldi r24, 0x28 ; 40 - 69e: 91 e0 ldi r25, 0x01 ; 1 - 6a0: 0c 94 c6 0b jmp 0x178c ; 0x178c + 728: 88 e2 ldi r24, 0x28 ; 40 + 72a: 91 e0 ldi r25, 0x01 ; 1 + 72c: 0c 94 14 0c jmp 0x1828 ; 0x1828 -000006a4 <__vector_23>: +00000730 <__vector_23>: /** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer * for later transmission to the host. */ ISR(USART1_RX_vect, ISR_BLOCK) { - 6a4: 1f 92 push r1 - 6a6: 0f 92 push r0 - 6a8: 0f b6 in r0, 0x3f ; 63 - 6aa: 0f 92 push r0 - 6ac: 11 24 eor r1, r1 - 6ae: 2f 93 push r18 - 6b0: 3f 93 push r19 - 6b2: 4f 93 push r20 - 6b4: 5f 93 push r21 - 6b6: 6f 93 push r22 - 6b8: 7f 93 push r23 - 6ba: 8f 93 push r24 - 6bc: 9f 93 push r25 - 6be: af 93 push r26 - 6c0: bf 93 push r27 - 6c2: ef 93 push r30 - 6c4: ff 93 push r31 + 730: 1f 92 push r1 + 732: 0f 92 push r0 + 734: 0f b6 in r0, 0x3f ; 63 + 736: 0f 92 push r0 + 738: 11 24 eor r1, r1 + 73a: 2f 93 push r18 + 73c: 3f 93 push r19 + 73e: 4f 93 push r20 + 740: 5f 93 push r21 + 742: 6f 93 push r22 + 744: 7f 93 push r23 + 746: 8f 93 push r24 + 748: 9f 93 push r25 + 74a: af 93 push r26 + 74c: bf 93 push r27 + 74e: ef 93 push r30 + 750: ff 93 push r31 uint8_t ReceivedByte = UDR1; - 6c6: 60 91 ce 00 lds r22, 0x00CE + 752: 60 91 ce 00 lds r22, 0x00CE if (USB_DeviceState == DEVICE_STATE_Configured) - 6ca: 8e b3 in r24, 0x1e ; 30 - 6cc: 84 30 cpi r24, 0x04 ; 4 - 6ce: 19 f4 brne .+6 ; 0x6d6 <__vector_23+0x32> + 756: 8e b3 in r24, 0x1e ; 30 + 758: 84 30 cpi r24, 0x04 ; 4 + 75a: 19 f4 brne .+6 ; 0x762 <__vector_23+0x32> RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); - 6d0: 8e ed ldi r24, 0xDE ; 222 - 6d2: 91 e0 ldi r25, 0x01 ; 1 - 6d4: 4d dd rcall .-1382 ; 0x170 + 75c: 8e ed ldi r24, 0xDE ; 222 + 75e: 91 e0 ldi r25, 0x01 ; 1 + 760: 07 dd rcall .-1522 ; 0x170 } - 6d6: ff 91 pop r31 - 6d8: ef 91 pop r30 - 6da: bf 91 pop r27 - 6dc: af 91 pop r26 - 6de: 9f 91 pop r25 - 6e0: 8f 91 pop r24 - 6e2: 7f 91 pop r23 - 6e4: 6f 91 pop r22 - 6e6: 5f 91 pop r21 - 6e8: 4f 91 pop r20 - 6ea: 3f 91 pop r19 - 6ec: 2f 91 pop r18 - 6ee: 0f 90 pop r0 - 6f0: 0f be out 0x3f, r0 ; 63 - 6f2: 0f 90 pop r0 - 6f4: 1f 90 pop r1 - 6f6: 18 95 reti - -000006f8 : + 762: ff 91 pop r31 + 764: ef 91 pop r30 + 766: bf 91 pop r27 + 768: af 91 pop r26 + 76a: 9f 91 pop r25 + 76c: 8f 91 pop r24 + 76e: 7f 91 pop r23 + 770: 6f 91 pop r22 + 772: 5f 91 pop r21 + 774: 4f 91 pop r20 + 776: 3f 91 pop r19 + 778: 2f 91 pop r18 + 77a: 0f 90 pop r0 + 77c: 0f be out 0x3f, r0 ; 63 + 77e: 0f 90 pop r0 + 780: 1f 90 pop r1 + 782: 18 95 reti + +00000784 : /** Event handler for the CDC Class driver Line Encoding Changed event. * * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced */ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 6f8: 8f 92 push r8 - 6fa: 9f 92 push r9 - 6fc: af 92 push r10 - 6fe: bf 92 push r11 - 700: cf 92 push r12 - 702: df 92 push r13 - 704: ef 92 push r14 - 706: ff 92 push r15 - 708: 1f 93 push r17 - 70a: fc 01 movw r30, r24 + 784: 8f 92 push r8 + 786: 9f 92 push r9 + 788: af 92 push r10 + 78a: bf 92 push r11 + 78c: cf 92 push r12 + 78e: df 92 push r13 + 790: ef 92 push r14 + 792: ff 92 push r15 + 794: 1f 93 push r17 + 796: fc 01 movw r30, r24 uint8_t ConfigMask = 0; switch (CDCInterfaceInfo->State.LineEncoding.ParityType) - 70c: a1 8d ldd r26, Z+25 ; 0x19 - 70e: a1 50 subi r26, 0x01 ; 1 - 710: a2 30 cpi r26, 0x02 ; 2 - 712: 28 f4 brcc .+10 ; 0x71e - 714: b0 e0 ldi r27, 0x00 ; 0 - 716: a9 5b subi r26, 0xB9 ; 185 - 718: be 4f sbci r27, 0xFE ; 254 - 71a: 1c 91 ld r17, X - 71c: 01 c0 rjmp .+2 ; 0x720 - 71e: 10 e0 ldi r17, 0x00 ; 0 + 798: a1 8d ldd r26, Z+25 ; 0x19 + 79a: a1 50 subi r26, 0x01 ; 1 + 79c: a2 30 cpi r26, 0x02 ; 2 + 79e: 28 f4 brcc .+10 ; 0x7aa + 7a0: b0 e0 ldi r27, 0x00 ; 0 + 7a2: a9 5b subi r26, 0xB9 ; 185 + 7a4: be 4f sbci r27, 0xFE ; 254 + 7a6: 1c 91 ld r17, X + 7a8: 01 c0 rjmp .+2 ; 0x7ac + 7aa: 10 e0 ldi r17, 0x00 ; 0 case CDC_PARITY_Even: ConfigMask = (1 << UPM11); break; } if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) - 720: 80 8d ldd r24, Z+24 ; 0x18 - 722: 82 30 cpi r24, 0x02 ; 2 - 724: 09 f4 brne .+2 ; 0x728 + 7ac: 80 8d ldd r24, Z+24 ; 0x18 + 7ae: 82 30 cpi r24, 0x02 ; 2 + 7b0: 09 f4 brne .+2 ; 0x7b4 ConfigMask |= (1 << USBS1); - 726: 18 60 ori r17, 0x08 ; 8 + 7b2: 18 60 ori r17, 0x08 ; 8 switch (CDCInterfaceInfo->State.LineEncoding.DataBits) - 728: 82 8d ldd r24, Z+26 ; 0x1a - 72a: 87 30 cpi r24, 0x07 ; 7 - 72c: 31 f0 breq .+12 ; 0x73a - 72e: 88 30 cpi r24, 0x08 ; 8 - 730: 31 f0 breq .+12 ; 0x73e - 732: 86 30 cpi r24, 0x06 ; 6 - 734: 29 f4 brne .+10 ; 0x740 + 7b4: 82 8d ldd r24, Z+26 ; 0x1a + 7b6: 87 30 cpi r24, 0x07 ; 7 + 7b8: 31 f0 breq .+12 ; 0x7c6 + 7ba: 88 30 cpi r24, 0x08 ; 8 + 7bc: 31 f0 breq .+12 ; 0x7ca + 7be: 86 30 cpi r24, 0x06 ; 6 + 7c0: 29 f4 brne .+10 ; 0x7cc { case 6: ConfigMask |= (1 << UCSZ10); - 736: 12 60 ori r17, 0x02 ; 2 + 7c2: 12 60 ori r17, 0x02 ; 2 break; - 738: 03 c0 rjmp .+6 ; 0x740 + 7c4: 03 c0 rjmp .+6 ; 0x7cc case 7: ConfigMask |= (1 << UCSZ11); - 73a: 14 60 ori r17, 0x04 ; 4 + 7c6: 14 60 ori r17, 0x04 ; 4 break; - 73c: 01 c0 rjmp .+2 ; 0x740 + 7c8: 01 c0 rjmp .+2 ; 0x7cc case 8: ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); - 73e: 16 60 ori r17, 0x06 ; 6 + 7ca: 16 60 ori r17, 0x06 ; 6 break; } /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ UCSR1B = 0; - 740: 10 92 c9 00 sts 0x00C9, r1 + 7cc: 10 92 c9 00 sts 0x00C9, r1 UCSR1A = 0; - 744: 10 92 c8 00 sts 0x00C8, r1 + 7d0: 10 92 c8 00 sts 0x00C8, r1 UCSR1C = 0; - 748: 10 92 ca 00 sts 0x00CA, r1 + 7d4: 10 92 ca 00 sts 0x00CA, r1 /* Set the new baud rate before configuring the USART */ UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 74c: c4 88 ldd r12, Z+20 ; 0x14 - 74e: d5 88 ldd r13, Z+21 ; 0x15 - 750: e6 88 ldd r14, Z+22 ; 0x16 - 752: f7 88 ldd r15, Z+23 ; 0x17 - 754: c7 01 movw r24, r14 - 756: b6 01 movw r22, r12 - 758: 96 95 lsr r25 - 75a: 87 95 ror r24 - 75c: 77 95 ror r23 - 75e: 67 95 ror r22 - 760: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> - 764: 20 e0 ldi r18, 0x00 ; 0 - 766: 34 e2 ldi r19, 0x24 ; 36 - 768: 44 ef ldi r20, 0xF4 ; 244 - 76a: 59 e4 ldi r21, 0x49 ; 73 - 76c: 0e 94 37 0d call 0x1a6e ; 0x1a6e <__addsf3> - 770: 4b 01 movw r8, r22 - 772: 5c 01 movw r10, r24 - 774: c7 01 movw r24, r14 - 776: b6 01 movw r22, r12 - 778: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__floatunsisf> - 77c: 9b 01 movw r18, r22 - 77e: ac 01 movw r20, r24 - 780: c5 01 movw r24, r10 - 782: b4 01 movw r22, r8 - 784: 0e 94 9f 0d call 0x1b3e ; 0x1b3e <__divsf3> - 788: 20 e0 ldi r18, 0x00 ; 0 - 78a: 30 e0 ldi r19, 0x00 ; 0 - 78c: 40 e8 ldi r20, 0x80 ; 128 - 78e: 5f e3 ldi r21, 0x3F ; 63 - 790: 0e 94 36 0d call 0x1a6c ; 0x1a6c <__subsf3> - 794: 0e 94 07 0e call 0x1c0e ; 0x1c0e <__fixunssfsi> - 798: 70 93 cd 00 sts 0x00CD, r23 - 79c: 60 93 cc 00 sts 0x00CC, r22 + 7d8: c4 88 ldd r12, Z+20 ; 0x14 + 7da: d5 88 ldd r13, Z+21 ; 0x15 + 7dc: e6 88 ldd r14, Z+22 ; 0x16 + 7de: f7 88 ldd r15, Z+23 ; 0x17 + 7e0: c7 01 movw r24, r14 + 7e2: b6 01 movw r22, r12 + 7e4: 96 95 lsr r25 + 7e6: 87 95 ror r24 + 7e8: 77 95 ror r23 + 7ea: 67 95 ror r22 + 7ec: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> + 7f0: 20 e0 ldi r18, 0x00 ; 0 + 7f2: 34 e2 ldi r19, 0x24 ; 36 + 7f4: 44 ef ldi r20, 0xF4 ; 244 + 7f6: 59 e4 ldi r21, 0x49 ; 73 + 7f8: 0e 94 85 0d call 0x1b0a ; 0x1b0a <__addsf3> + 7fc: 4b 01 movw r8, r22 + 7fe: 5c 01 movw r10, r24 + 800: c7 01 movw r24, r14 + 802: b6 01 movw r22, r12 + 804: 0e 94 81 0e call 0x1d02 ; 0x1d02 <__floatunsisf> + 808: 9b 01 movw r18, r22 + 80a: ac 01 movw r20, r24 + 80c: c5 01 movw r24, r10 + 80e: b4 01 movw r22, r8 + 810: 0e 94 ed 0d call 0x1bda ; 0x1bda <__divsf3> + 814: 20 e0 ldi r18, 0x00 ; 0 + 816: 30 e0 ldi r19, 0x00 ; 0 + 818: 40 e8 ldi r20, 0x80 ; 128 + 81a: 5f e3 ldi r21, 0x3F ; 63 + 81c: 0e 94 84 0d call 0x1b08 ; 0x1b08 <__subsf3> + 820: 0e 94 55 0e call 0x1caa ; 0x1caa <__fixunssfsi> + 824: 70 93 cd 00 sts 0x00CD, r23 + 828: 60 93 cc 00 sts 0x00CC, r22 /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */ UCSR1C = ConfigMask; - 7a0: 10 93 ca 00 sts 0x00CA, r17 + 82c: 10 93 ca 00 sts 0x00CA, r17 UCSR1A = (1 << U2X1); - 7a4: 82 e0 ldi r24, 0x02 ; 2 - 7a6: 80 93 c8 00 sts 0x00C8, r24 + 830: 82 e0 ldi r24, 0x02 ; 2 + 832: 80 93 c8 00 sts 0x00C8, r24 UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); - 7aa: 88 e9 ldi r24, 0x98 ; 152 - 7ac: 80 93 c9 00 sts 0x00C9, r24 + 836: 88 e9 ldi r24, 0x98 ; 152 + 838: 80 93 c9 00 sts 0x00C9, r24 } - 7b0: 1f 91 pop r17 - 7b2: ff 90 pop r15 - 7b4: ef 90 pop r14 - 7b6: df 90 pop r13 - 7b8: cf 90 pop r12 - 7ba: bf 90 pop r11 - 7bc: af 90 pop r10 - 7be: 9f 90 pop r9 - 7c0: 8f 90 pop r8 - 7c2: 08 95 ret + 83c: 1f 91 pop r17 + 83e: ff 90 pop r15 + 840: ef 90 pop r14 + 842: df 90 pop r13 + 844: cf 90 pop r12 + 846: bf 90 pop r11 + 848: af 90 pop r10 + 84a: 9f 90 pop r9 + 84c: 8f 90 pop r8 + 84e: 08 95 ret -000007c4 : +00000850 : void uart_putc(unsigned char data) { - 7c4: 68 2f mov r22, r24 + 850: 68 2f mov r22, r24 if (USB_DeviceState == DEVICE_STATE_Configured){ - 7c6: 8e b3 in r24, 0x1e ; 30 - 7c8: 84 30 cpi r24, 0x04 ; 4 - 7ca: 19 f4 brne .+6 ; 0x7d2 + 852: 8e b3 in r24, 0x1e ; 30 + 854: 84 30 cpi r24, 0x04 ; 4 + 856: 19 f4 brne .+6 ; 0x85e RingBuffer_Insert(&USARTtoUSB_Buffer, data); - 7cc: 8e ed ldi r24, 0xDE ; 222 - 7ce: 91 e0 ldi r25, 0x01 ; 1 - 7d0: cf cc rjmp .-1634 ; 0x170 - 7d2: 08 95 ret + 858: 8e ed ldi r24, 0xDE ; 222 + 85a: 91 e0 ldi r25, 0x01 ; 1 + 85c: 89 cc rjmp .-1774 ; 0x170 + 85e: 08 95 ret -000007d4 : +00000860 : } } void uart_puts(const char *s ) { - 7d4: ef 92 push r14 - 7d6: ff 92 push r15 - 7d8: cf 93 push r28 - 7da: df 93 push r29 - 7dc: e8 2e mov r14, r24 - 7de: e7 01 movw r28, r14 - 7e0: 7e 01 movw r14, r28 - 7e2: f9 2e mov r15, r25 - 7e4: e7 01 movw r28, r14 + 860: ef 92 push r14 + 862: ff 92 push r15 + 864: cf 93 push r28 + 866: df 93 push r29 + 868: e8 2e mov r14, r24 + 86a: e7 01 movw r28, r14 + 86c: 7e 01 movw r14, r28 + 86e: f9 2e mov r15, r25 + 870: e7 01 movw r28, r14 while (*s) - 7e6: 01 c0 rjmp .+2 ; 0x7ea + 872: 01 c0 rjmp .+2 ; 0x876 uart_putc(*s++); - 7e8: ed df rcall .-38 ; 0x7c4 + 874: ed df rcall .-38 ; 0x850 } void uart_puts(const char *s ) { while (*s) - 7ea: 89 91 ld r24, Y+ - 7ec: 88 23 and r24, r24 - 7ee: e1 f7 brne .-8 ; 0x7e8 + 876: 89 91 ld r24, Y+ + 878: 88 23 and r24, r24 + 87a: e1 f7 brne .-8 ; 0x874 uart_putc(*s++); }/* uart_puts */ - 7f0: df 91 pop r29 - 7f2: cf 91 pop r28 - 7f4: ff 90 pop r15 - 7f6: ef 90 pop r14 - 7f8: 08 95 ret + 87c: df 91 pop r29 + 87e: cf 91 pop r28 + 880: ff 90 pop r15 + 882: ef 90 pop r14 + 884: 08 95 ret -000007fa : +00000886 : // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) { - 7fa: 2f 92 push r2 - 7fc: 3f 92 push r3 - 7fe: 4f 92 push r4 - 800: 5f 92 push r5 - 802: 6f 92 push r6 - 804: 7f 92 push r7 - 806: 8f 92 push r8 - 808: 9f 92 push r9 - 80a: af 92 push r10 - 80c: bf 92 push r11 - 80e: cf 92 push r12 - 810: df 92 push r13 - 812: ef 92 push r14 - 814: ff 92 push r15 - 816: 0f 93 push r16 - 818: 1f 93 push r17 - 81a: cf 93 push r28 - 81c: df 93 push r29 - 81e: 6b 01 movw r12, r22 - 820: 7c 01 movw r14, r24 + 886: 2f 92 push r2 + 888: 3f 92 push r3 + 88a: 4f 92 push r4 + 88c: 5f 92 push r5 + 88e: 6f 92 push r6 + 890: 7f 92 push r7 + 892: 8f 92 push r8 + 894: 9f 92 push r9 + 896: af 92 push r10 + 898: bf 92 push r11 + 89a: cf 92 push r12 + 89c: df 92 push r13 + 89e: ef 92 push r14 + 8a0: ff 92 push r15 + 8a2: 0f 93 push r16 + 8a4: 1f 93 push r17 + 8a6: cf 93 push r28 + 8a8: df 93 push r29 + 8aa: 6b 01 movw r12, r22 + 8ac: 7c 01 movw r14, r24 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator - 822: 82 2f mov r24, r18 - 824: 90 e0 ldi r25, 0x00 ; 0 - 826: fa 01 movw r30, r20 - 828: e8 0f add r30, r24 - 82a: f9 1f adc r31, r25 - 82c: 10 82 st Z, r1 + 8ae: 82 2f mov r24, r18 + 8b0: 90 e0 ldi r25, 0x00 ; 0 + 8b2: fa 01 movw r30, r20 + 8b4: e8 0f add r30, r24 + 8b6: f9 1f adc r31, r25 + 8b8: 10 82 st Z, r1 for (i = (no_digits - 1); i >= 0; i--) { - 82e: 12 2f mov r17, r18 - 830: 11 50 subi r17, 0x01 ; 1 + 8ba: 12 2f mov r17, r18 + 8bc: 11 50 subi r17, 0x01 ; 1 }/* uart_puts */ // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) { - 832: 41 2e mov r4, r17 - 834: 55 24 eor r5, r5 - 836: 47 fc sbrc r4, 7 - 838: 50 94 com r5 - 83a: ea 01 movw r28, r20 - 83c: c4 0d add r28, r4 - 83e: d5 1d adc r29, r5 + 8be: 41 2e mov r4, r17 + 8c0: 55 24 eor r5, r5 + 8c2: 47 fc sbrc r4, 7 + 8c4: 50 94 com r5 + 8c6: ea 01 movw r28, r20 + 8c8: c4 0d add r28, r4 + 8ca: d5 1d adc r29, r5 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { - 840: aa 24 eor r10, r10 - 842: bb 24 eor r11, r11 + 8cc: aa 24 eor r10, r10 + 8ce: bb 24 eor r11, r11 if (zahl == 0 && i < (no_digits - 1)) { string[i] = leading_char; } else { string[i] = (zahl % 10) + '0'; - 844: fa e0 ldi r31, 0x0A ; 10 - 846: 6f 2e mov r6, r31 - 848: 71 2c mov r7, r1 - 84a: 81 2c mov r8, r1 - 84c: 91 2c mov r9, r1 + 8d0: 4a e0 ldi r20, 0x0A ; 10 + 8d2: 64 2e mov r6, r20 + 8d4: 71 2c mov r7, r1 + 8d6: 81 2c mov r8, r1 + 8d8: 91 2c mov r9, r1 void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) { int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { if (zahl == 0 && i < (no_digits - 1)) { - 84e: 1c 01 movw r2, r24 - 850: 08 94 sec - 852: 21 08 sbc r2, r1 - 854: 31 08 sbc r3, r1 + 8da: 1c 01 movw r2, r24 + 8dc: 08 94 sec + 8de: 21 08 sbc r2, r1 + 8e0: 31 08 sbc r3, r1 // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) { int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { - 856: 22 c0 rjmp .+68 ; 0x89c + 8e2: 22 c0 rjmp .+68 ; 0x928 if (zahl == 0 && i < (no_digits - 1)) { - 858: c1 14 cp r12, r1 - 85a: d1 04 cpc r13, r1 - 85c: e1 04 cpc r14, r1 - 85e: f1 04 cpc r15, r1 - 860: 41 f4 brne .+16 ; 0x872 + 8e4: c1 14 cp r12, r1 + 8e6: d1 04 cpc r13, r1 + 8e8: e1 04 cpc r14, r1 + 8ea: f1 04 cpc r15, r1 + 8ec: 41 f4 brne .+16 ; 0x8fe }/* uart_puts */ // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) { - 862: c5 01 movw r24, r10 - 864: 84 0d add r24, r4 - 866: 95 1d adc r25, r5 + 8ee: c5 01 movw r24, r10 + 8f0: 84 0d add r24, r4 + 8f2: 95 1d adc r25, r5 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { if (zahl == 0 && i < (no_digits - 1)) { - 868: 82 15 cp r24, r2 - 86a: 93 05 cpc r25, r3 - 86c: 14 f4 brge .+4 ; 0x872 + 8f4: 82 15 cp r24, r2 + 8f6: 93 05 cpc r25, r3 + 8f8: 14 f4 brge .+4 ; 0x8fe string[i] = leading_char; - 86e: 08 83 st Y, r16 - 870: 08 c0 rjmp .+16 ; 0x882 + 8fa: 08 83 st Y, r16 + 8fc: 08 c0 rjmp .+16 ; 0x90e } else { string[i] = (zahl % 10) + '0'; - 872: c7 01 movw r24, r14 - 874: b6 01 movw r22, r12 - 876: a4 01 movw r20, r8 - 878: 93 01 movw r18, r6 - 87a: 0e 94 22 0f call 0x1e44 ; 0x1e44 <__udivmodsi4> - 87e: 60 5d subi r22, 0xD0 ; 208 - 880: 68 83 st Y, r22 + 8fe: c7 01 movw r24, r14 + 900: b6 01 movw r22, r12 + 902: a4 01 movw r20, r8 + 904: 93 01 movw r18, r6 + 906: 0e 94 70 0f call 0x1ee0 ; 0x1ee0 <__udivmodsi4> + 90a: 60 5d subi r22, 0xD0 ; 208 + 90c: 68 83 st Y, r22 } // Modulo rechnen, dann den ASCII-Code von '0' addieren zahl /= 10; - 882: c7 01 movw r24, r14 - 884: b6 01 movw r22, r12 - 886: a4 01 movw r20, r8 - 888: 93 01 movw r18, r6 - 88a: 0e 94 22 0f call 0x1e44 ; 0x1e44 <__udivmodsi4> - 88e: 69 01 movw r12, r18 - 890: 7a 01 movw r14, r20 + 90e: c7 01 movw r24, r14 + 910: b6 01 movw r22, r12 + 912: a4 01 movw r20, r8 + 914: 93 01 movw r18, r6 + 916: 0e 94 70 0f call 0x1ee0 ; 0x1ee0 <__udivmodsi4> + 91a: 69 01 movw r12, r18 + 91c: 7a 01 movw r14, r20 // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) { int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { - 892: 11 50 subi r17, 0x01 ; 1 - 894: 21 97 sbiw r28, 0x01 ; 1 - 896: 08 94 sec - 898: a1 08 sbc r10, r1 - 89a: b1 08 sbc r11, r1 - 89c: 17 ff sbrs r17, 7 - 89e: dc cf rjmp .-72 ; 0x858 + 91e: 11 50 subi r17, 0x01 ; 1 + 920: 21 97 sbiw r28, 0x01 ; 1 + 922: 08 94 sec + 924: a1 08 sbc r10, r1 + 926: b1 08 sbc r11, r1 + 928: 17 ff sbrs r17, 7 + 92a: dc cf rjmp .-72 ; 0x8e4 string[i] = (zahl % 10) + '0'; } // Modulo rechnen, dann den ASCII-Code von '0' addieren zahl /= 10; } } - 8a0: df 91 pop r29 - 8a2: cf 91 pop r28 - 8a4: 1f 91 pop r17 - 8a6: 0f 91 pop r16 - 8a8: ff 90 pop r15 - 8aa: ef 90 pop r14 - 8ac: df 90 pop r13 - 8ae: cf 90 pop r12 - 8b0: bf 90 pop r11 - 8b2: af 90 pop r10 - 8b4: 9f 90 pop r9 - 8b6: 8f 90 pop r8 - 8b8: 7f 90 pop r7 - 8ba: 6f 90 pop r6 - 8bc: 5f 90 pop r5 - 8be: 4f 90 pop r4 - 8c0: 3f 90 pop r3 - 8c2: 2f 90 pop r2 - 8c4: 08 95 ret - -000008c6 : + 92c: df 91 pop r29 + 92e: cf 91 pop r28 + 930: 1f 91 pop r17 + 932: 0f 91 pop r16 + 934: ff 90 pop r15 + 936: ef 90 pop r14 + 938: df 90 pop r13 + 93a: cf 90 pop r12 + 93c: bf 90 pop r11 + 93e: af 90 pop r10 + 940: 9f 90 pop r9 + 942: 8f 90 pop r8 + 944: 7f 90 pop r7 + 946: 6f 90 pop r6 + 948: 5f 90 pop r5 + 94a: 4f 90 pop r4 + 94c: 3f 90 pop r3 + 94e: 2f 90 pop r2 + 950: 08 95 ret + +00000952 : int8_t sign(int16_t x) { return (x > 0) - (x < 0); - 8c6: 21 e0 ldi r18, 0x01 ; 1 - 8c8: 18 16 cp r1, r24 - 8ca: 19 06 cpc r1, r25 - 8cc: 0c f0 brlt .+2 ; 0x8d0 - 8ce: 20 e0 ldi r18, 0x00 ; 0 - 8d0: 89 2f mov r24, r25 - 8d2: 88 1f adc r24, r24 - 8d4: 88 27 eor r24, r24 - 8d6: 88 1f adc r24, r24 + 952: 21 e0 ldi r18, 0x01 ; 1 + 954: 18 16 cp r1, r24 + 956: 19 06 cpc r1, r25 + 958: 0c f0 brlt .+2 ; 0x95c + 95a: 20 e0 ldi r18, 0x00 ; 0 + 95c: 89 2f mov r24, r25 + 95e: 88 1f adc r24, r24 + 960: 88 27 eor r24, r24 + 962: 88 1f adc r24, r24 } - 8d8: 28 1b sub r18, r24 - 8da: 82 2f mov r24, r18 - 8dc: 08 95 ret + 964: 28 1b sub r18, r24 + 966: 82 2f mov r24, r18 + 968: 08 95 ret -000008de : +0000096a : my_uitoa(abs(zahl),stringbuffer,no_digits,' '); uart_puts(stringbuffer); } void uart_print_number_wlzeros(uint32_t zahl, uint8_t no_digits) { - 8de: 0f 93 push r16 - 8e0: 24 2f mov r18, r20 + 96a: 0f 93 push r16 + 96c: 24 2f mov r18, r20 my_uitoa(abs(zahl),stringbuffer,no_digits,'0'); - 8e2: 77 ff sbrs r23, 7 - 8e4: 03 c0 rjmp .+6 ; 0x8ec - 8e6: 70 95 com r23 - 8e8: 61 95 neg r22 - 8ea: 7f 4f sbci r23, 0xFF ; 255 - 8ec: 88 27 eor r24, r24 - 8ee: 77 fd sbrc r23, 7 - 8f0: 80 95 com r24 - 8f2: 98 2f mov r25, r24 - 8f4: 46 eb ldi r20, 0xB6 ; 182 - 8f6: 52 e0 ldi r21, 0x02 ; 2 - 8f8: 00 e3 ldi r16, 0x30 ; 48 - 8fa: 7f df rcall .-258 ; 0x7fa + 96e: 77 ff sbrs r23, 7 + 970: 03 c0 rjmp .+6 ; 0x978 + 972: 70 95 com r23 + 974: 61 95 neg r22 + 976: 7f 4f sbci r23, 0xFF ; 255 + 978: 88 27 eor r24, r24 + 97a: 77 fd sbrc r23, 7 + 97c: 80 95 com r24 + 97e: 98 2f mov r25, r24 + 980: 46 eb ldi r20, 0xB6 ; 182 + 982: 52 e0 ldi r21, 0x02 ; 2 + 984: 00 e3 ldi r16, 0x30 ; 48 + 986: 7f df rcall .-258 ; 0x886 uart_puts(stringbuffer); - 8fc: 86 eb ldi r24, 0xB6 ; 182 - 8fe: 92 e0 ldi r25, 0x02 ; 2 - 900: 69 df rcall .-302 ; 0x7d4 + 988: 86 eb ldi r24, 0xB6 ; 182 + 98a: 92 e0 ldi r25, 0x02 ; 2 + 98c: 69 df rcall .-302 ; 0x860 } - 902: 0f 91 pop r16 - 904: 08 95 ret + 98e: 0f 91 pop r16 + 990: 08 95 ret -00000906 : +00000992 : void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { - 906: ff 92 push r15 - 908: 0f 93 push r16 - 90a: 1f 93 push r17 - 90c: 24 2f mov r18, r20 + 992: ff 92 push r15 + 994: 0f 93 push r16 + 996: 1f 93 push r17 + 998: 24 2f mov r18, r20 my_uitoa(abs(zahl),stringbuffer,no_digits,' '); - 90e: f6 2e mov r15, r22 - 910: 17 2f mov r17, r23 - 912: 77 ff sbrs r23, 7 - 914: 03 c0 rjmp .+6 ; 0x91c - 916: 70 95 com r23 - 918: 61 95 neg r22 - 91a: 7f 4f sbci r23, 0xFF ; 255 - 91c: 88 27 eor r24, r24 - 91e: 77 fd sbrc r23, 7 - 920: 80 95 com r24 - 922: 98 2f mov r25, r24 - 924: 46 eb ldi r20, 0xB6 ; 182 - 926: 52 e0 ldi r21, 0x02 ; 2 - 928: 00 e2 ldi r16, 0x20 ; 32 - 92a: 67 df rcall .-306 ; 0x7fa + 99a: f6 2e mov r15, r22 + 99c: 17 2f mov r17, r23 + 99e: 77 ff sbrs r23, 7 + 9a0: 03 c0 rjmp .+6 ; 0x9a8 + 9a2: 70 95 com r23 + 9a4: 61 95 neg r22 + 9a6: 7f 4f sbci r23, 0xFF ; 255 + 9a8: 88 27 eor r24, r24 + 9aa: 77 fd sbrc r23, 7 + 9ac: 80 95 com r24 + 9ae: 98 2f mov r25, r24 + 9b0: 46 eb ldi r20, 0xB6 ; 182 + 9b2: 52 e0 ldi r21, 0x02 ; 2 + 9b4: 00 e2 ldi r16, 0x20 ; 32 + 9b6: 67 df rcall .-306 ; 0x886 if (sign(zahl) < 0) { - 92c: 8f 2d mov r24, r15 - 92e: 91 2f mov r25, r17 - 930: ca df rcall .-108 ; 0x8c6 - 932: 87 ff sbrs r24, 7 - 934: 02 c0 rjmp .+4 ; 0x93a + 9b8: 8f 2d mov r24, r15 + 9ba: 91 2f mov r25, r17 + 9bc: ca df rcall .-108 ; 0x952 + 9be: 87 ff sbrs r24, 7 + 9c0: 02 c0 rjmp .+4 ; 0x9c6 uart_putc('-'); - 936: 8d e2 ldi r24, 0x2D ; 45 - 938: 01 c0 rjmp .+2 ; 0x93c + 9c2: 8d e2 ldi r24, 0x2D ; 45 + 9c4: 01 c0 rjmp .+2 ; 0x9c8 } else { uart_putc('+'); - 93a: 8b e2 ldi r24, 0x2B ; 43 - 93c: 43 df rcall .-378 ; 0x7c4 + 9c6: 8b e2 ldi r24, 0x2B ; 43 + 9c8: 43 df rcall .-378 ; 0x850 } uart_puts(stringbuffer); - 93e: 86 eb ldi r24, 0xB6 ; 182 - 940: 92 e0 ldi r25, 0x02 ; 2 - 942: 48 df rcall .-368 ; 0x7d4 + 9ca: 86 eb ldi r24, 0xB6 ; 182 + 9cc: 92 e0 ldi r25, 0x02 ; 2 + 9ce: 48 df rcall .-368 ; 0x860 } - 944: 1f 91 pop r17 - 946: 0f 91 pop r16 - 948: ff 90 pop r15 - 94a: 08 95 ret + 9d0: 1f 91 pop r17 + 9d2: 0f 91 pop r16 + 9d4: ff 90 pop r15 + 9d6: 08 95 ret -0000094c : +000009d8 : PORTY2 |= ((byte & (1<<2))>>2)<>3)< + 9d8: 80 e0 ldi r24, 0x00 ; 0 + 9da: fe db rcall .-2052 ; 0x1d8 set_y(0); - 950: 80 e0 ldi r24, 0x00 ; 0 - 952: 7d dc rcall .-1798 ; 0x24e + 9dc: 80 e0 ldi r24, 0x00 ; 0 + 9de: 37 dc rcall .-1938 ; 0x24e DDRX0 |= (1<: +000009f2 : uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direction +1 or -1, 0 for coil deactivation - 966: 0f 93 push r16 - 968: 1f 93 push r17 - 96a: 16 2f mov r17, r22 - 96c: 82 30 cpi r24, 0x02 ; 2 - 96e: 50 f4 brcc .+20 ; 0x984 - 970: a8 2f mov r26, r24 - 972: b0 e0 ldi r27, 0x00 ; 0 - 974: aa 0f add r26, r26 - 976: bb 1f adc r27, r27 - 978: a7 5b subi r26, 0xB7 ; 183 - 97a: be 4f sbci r27, 0xFE ; 254 - 97c: 2d 91 ld r18, X+ - 97e: 3c 91 ld r19, X - 980: 11 97 sbiw r26, 0x01 ; 1 - 982: 02 c0 rjmp .+4 ; 0x988 - 984: 2c ee ldi r18, 0xEC ; 236 - 986: 30 e0 ldi r19, 0x00 ; 0 + 9f2: 0f 93 push r16 + 9f4: 1f 93 push r17 + 9f6: 16 2f mov r17, r22 + 9f8: 82 30 cpi r24, 0x02 ; 2 + 9fa: 50 f4 brcc .+20 ; 0xa10 + 9fc: a8 2f mov r26, r24 + 9fe: b0 e0 ldi r27, 0x00 ; 0 + a00: aa 0f add r26, r26 + a02: bb 1f adc r27, r27 + a04: a7 5b subi r26, 0xB7 ; 183 + a06: be 4f sbci r27, 0xFE ; 254 + a08: 2d 91 ld r18, X+ + a0a: 3c 91 ld r19, X + a0c: 11 97 sbiw r26, 0x01 ; 1 + a0e: 02 c0 rjmp .+4 ; 0xa14 + a10: 2c ee ldi r18, 0xEC ; 236 + a12: 30 e0 ldi r19, 0x00 ; 0 case Y: setport = &set_y; break; } next_phase = (phase_memory[motor] + 4 + direction) % 4; - 988: e8 2f mov r30, r24 - 98a: f0 e0 ldi r31, 0x00 ; 0 - 98c: 81 2f mov r24, r17 - 98e: 99 27 eor r25, r25 - 990: 87 fd sbrc r24, 7 - 992: 90 95 com r25 - 994: 04 96 adiw r24, 0x04 ; 4 - 996: ea 55 subi r30, 0x5A ; 90 - 998: fd 4f sbci r31, 0xFD ; 253 - 99a: 40 81 ld r20, Z - 99c: 84 0f add r24, r20 - 99e: 91 1d adc r25, r1 - 9a0: 64 e0 ldi r22, 0x04 ; 4 - 9a2: 70 e0 ldi r23, 0x00 ; 0 - 9a4: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> + a14: e8 2f mov r30, r24 + a16: f0 e0 ldi r31, 0x00 ; 0 + a18: 81 2f mov r24, r17 + a1a: 99 27 eor r25, r25 + a1c: 87 fd sbrc r24, 7 + a1e: 90 95 com r25 + a20: 04 96 adiw r24, 0x04 ; 4 + a22: ea 55 subi r30, 0x5A ; 90 + a24: fd 4f sbci r31, 0xFD ; 253 + a26: 40 81 ld r20, Z + a28: 84 0f add r24, r20 + a2a: 91 1d adc r25, r1 + a2c: 64 e0 ldi r22, 0x04 ; 4 + a2e: 70 e0 ldi r23, 0x00 ; 0 + a30: 0e 94 5d 0f call 0x1eba ; 0x1eba <__divmodhi4> phase_memory[motor] = next_phase; - 9a8: 80 83 st Z, r24 + a34: 80 83 st Z, r24 next_pattern = phase_pattern[next_phase]; - 9aa: e8 2f mov r30, r24 - 9ac: f0 e0 ldi r31, 0x00 ; 0 - 9ae: ed 5b subi r30, 0xBD ; 189 - 9b0: fe 4f sbci r31, 0xFE ; 254 - 9b2: 00 81 ld r16, Z + a36: e8 2f mov r30, r24 + a38: f0 e0 ldi r31, 0x00 ; 0 + a3a: ed 5b subi r30, 0xBD ; 189 + a3c: fe 4f sbci r31, 0xFE ; 254 + a3e: 00 81 ld r16, Z if (direction != 0) { - 9b4: 11 23 and r17, r17 - 9b6: 11 f0 breq .+4 ; 0x9bc + a40: 11 23 and r17, r17 + a42: 11 f0 breq .+4 ; 0xa48 (*setport)(next_pattern); - 9b8: 80 2f mov r24, r16 - 9ba: 01 c0 rjmp .+2 ; 0x9be + a44: 80 2f mov r24, r16 + a46: 01 c0 rjmp .+2 ; 0xa4a } else { (*setport)(0); - 9bc: 80 e0 ldi r24, 0x00 ; 0 - 9be: f9 01 movw r30, r18 - 9c0: 09 95 icall + a48: 80 e0 ldi r24, 0x00 ; 0 + a4a: f9 01 movw r30, r18 + a4c: 09 95 icall } return next_pattern; } - 9c2: 80 2f mov r24, r16 - 9c4: 1f 91 pop r17 - 9c6: 0f 91 pop r16 - 9c8: 08 95 ret + a4e: 80 2f mov r24, r16 + a50: 1f 91 pop r17 + a52: 0f 91 pop r16 + a54: 08 95 ret -000009ca : +00000a56 : return val; } #define PHASE_DELAY_MS 10 uint8_t move_plate(int16_t dx, int16_t dy){ - 9ca: 0f 93 push r16 - 9cc: 1f 93 push r17 + a56: 0f 93 push r16 + a58: 1f 93 push r17 static int16_t todo_x,todo_y = 0; int8_t signum; uint8_t returnval = 0; todo_x += dx; - 9ce: 20 91 a4 02 lds r18, 0x02A4 - 9d2: 30 91 a5 02 lds r19, 0x02A5 - 9d6: 28 0f add r18, r24 - 9d8: 39 1f adc r19, r25 - 9da: 30 93 a5 02 sts 0x02A5, r19 - 9de: 20 93 a4 02 sts 0x02A4, r18 + a5a: 20 91 a4 02 lds r18, 0x02A4 + a5e: 30 91 a5 02 lds r19, 0x02A5 + a62: 28 0f add r18, r24 + a64: 39 1f adc r19, r25 + a66: 30 93 a5 02 sts 0x02A5, r19 + a6a: 20 93 a4 02 sts 0x02A4, r18 todo_y += dy; - 9e2: 80 91 a2 02 lds r24, 0x02A2 - 9e6: 90 91 a3 02 lds r25, 0x02A3 - 9ea: 86 0f add r24, r22 - 9ec: 97 1f adc r25, r23 - 9ee: 90 93 a3 02 sts 0x02A3, r25 - 9f2: 80 93 a2 02 sts 0x02A2, r24 + a6e: 80 91 a2 02 lds r24, 0x02A2 + a72: 90 91 a3 02 lds r25, 0x02A3 + a76: 86 0f add r24, r22 + a78: 97 1f adc r25, r23 + a7a: 90 93 a3 02 sts 0x02A3, r25 + a7e: 80 93 a2 02 sts 0x02A2, r24 signum = sign(todo_x); - 9f6: c9 01 movw r24, r18 - 9f8: 66 df rcall .-308 ; 0x8c6 - 9fa: 08 2f mov r16, r24 + a82: c9 01 movw r24, r18 + a84: 66 df rcall .-308 ; 0x952 + a86: 08 2f mov r16, r24 #define PHASE_DELAY_MS 10 uint8_t move_plate(int16_t dx, int16_t dy){ static int16_t todo_x,todo_y = 0; int8_t signum; uint8_t returnval = 0; - 9fc: 11 e0 ldi r17, 0x01 ; 1 - 9fe: 88 23 and r24, r24 - a00: 09 f4 brne .+2 ; 0xa04 - a02: 10 e0 ldi r17, 0x00 ; 0 + a88: 11 e0 ldi r17, 0x01 ; 1 + a8a: 88 23 and r24, r24 + a8c: 09 f4 brne .+2 ; 0xa90 + a8e: 10 e0 ldi r17, 0x00 ; 0 signum = sign(todo_x); if(signum != 0) { returnval++; } motor_step(X,signum); - a04: 80 e0 ldi r24, 0x00 ; 0 - a06: 60 2f mov r22, r16 - a08: ae df rcall .-164 ; 0x966 + a90: 80 e0 ldi r24, 0x00 ; 0 + a92: 60 2f mov r22, r16 + a94: ae df rcall .-164 ; 0x9f2 todo_x -= signum; - a0a: 60 2f mov r22, r16 - a0c: 77 27 eor r23, r23 - a0e: 67 fd sbrc r22, 7 - a10: 70 95 com r23 - a12: 20 91 a4 02 lds r18, 0x02A4 - a16: 30 91 a5 02 lds r19, 0x02A5 - a1a: 26 1b sub r18, r22 - a1c: 37 0b sbc r19, r23 - a1e: 30 93 a5 02 sts 0x02A5, r19 - a22: 20 93 a4 02 sts 0x02A4, r18 + a96: 60 2f mov r22, r16 + a98: 77 27 eor r23, r23 + a9a: 67 fd sbrc r22, 7 + a9c: 70 95 com r23 + a9e: 20 91 a4 02 lds r18, 0x02A4 + aa2: 30 91 a5 02 lds r19, 0x02A5 + aa6: 26 1b sub r18, r22 + aa8: 37 0b sbc r19, r23 + aaa: 30 93 a5 02 sts 0x02A5, r19 + aae: 20 93 a4 02 sts 0x02A4, r18 signum = sign(todo_y); - a26: 80 91 a2 02 lds r24, 0x02A2 - a2a: 90 91 a3 02 lds r25, 0x02A3 - a2e: 4b df rcall .-362 ; 0x8c6 - a30: 08 2f mov r16, r24 + ab2: 80 91 a2 02 lds r24, 0x02A2 + ab6: 90 91 a3 02 lds r25, 0x02A3 + aba: 4b df rcall .-362 ; 0x952 + abc: 08 2f mov r16, r24 if(signum != 0) { - a32: 81 11 cpse r24, r1 + abe: 81 11 cpse r24, r1 returnval++; - a34: 1f 5f subi r17, 0xFF ; 255 + ac0: 1f 5f subi r17, 0xFF ; 255 } motor_step(Y,signum); - a36: 81 e0 ldi r24, 0x01 ; 1 - a38: 60 2f mov r22, r16 - a3a: 95 df rcall .-214 ; 0x966 + ac2: 81 e0 ldi r24, 0x01 ; 1 + ac4: 60 2f mov r22, r16 + ac6: 95 df rcall .-214 ; 0x9f2 todo_y -= signum; - a3c: 60 2f mov r22, r16 - a3e: 77 27 eor r23, r23 - a40: 67 fd sbrc r22, 7 - a42: 70 95 com r23 - a44: 20 91 a2 02 lds r18, 0x02A2 - a48: 30 91 a3 02 lds r19, 0x02A3 - a4c: 26 1b sub r18, r22 - a4e: 37 0b sbc r19, r23 - a50: 30 93 a3 02 sts 0x02A3, r19 - a54: 20 93 a2 02 sts 0x02A2, r18 - a58: 8f e3 ldi r24, 0x3F ; 63 - a5a: 9c e9 ldi r25, 0x9C ; 156 - a5c: 01 97 sbiw r24, 0x01 ; 1 - a5e: f1 f7 brne .-4 ; 0xa5c - a60: 00 c0 rjmp .+0 ; 0xa62 - a62: 00 00 nop + ac8: 60 2f mov r22, r16 + aca: 77 27 eor r23, r23 + acc: 67 fd sbrc r22, 7 + ace: 70 95 com r23 + ad0: 20 91 a2 02 lds r18, 0x02A2 + ad4: 30 91 a3 02 lds r19, 0x02A3 + ad8: 26 1b sub r18, r22 + ada: 37 0b sbc r19, r23 + adc: 30 93 a3 02 sts 0x02A3, r19 + ae0: 20 93 a2 02 sts 0x02A2, r18 + ae4: 8f e3 ldi r24, 0x3F ; 63 + ae6: 9c e9 ldi r25, 0x9C ; 156 + ae8: 01 97 sbiw r24, 0x01 ; 1 + aea: f1 f7 brne .-4 ; 0xae8 + aec: 00 c0 rjmp .+0 ; 0xaee + aee: 00 00 nop _delay_ms(PHASE_DELAY_MS); return returnval; // busy } - a64: 81 2f mov r24, r17 - a66: 1f 91 pop r17 - a68: 0f 91 pop r16 - a6a: 08 95 ret + af0: 81 2f mov r24, r17 + af2: 1f 91 pop r17 + af4: 0f 91 pop r16 + af6: 08 95 ret -00000a6c : +00000af8 : void print_steps_in_mm(int16_t steps) { - a6c: 0f 93 push r16 - a6e: 1f 93 push r17 - a70: 8c 01 movw r16, r24 + af8: 0f 93 push r16 + afa: 1f 93 push r17 + afc: 8c 01 movw r16, r24 int16_t predot,postdot; predot = steps/24; - a72: 68 e1 ldi r22, 0x18 ; 24 - a74: 70 e0 ldi r23, 0x00 ; 0 - a76: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> + afe: 68 e1 ldi r22, 0x18 ; 24 + b00: 70 e0 ldi r23, 0x00 ; 0 + b02: 0e 94 5d 0f call 0x1eba ; 0x1eba <__divmodhi4> postdot = ((abs(steps)%24)*417)/10; uart_print_signed_number(predot,3); - a7a: 88 27 eor r24, r24 - a7c: 77 fd sbrc r23, 7 - a7e: 80 95 com r24 - a80: 98 2f mov r25, r24 - a82: 43 e0 ldi r20, 0x03 ; 3 - a84: 40 df rcall .-384 ; 0x906 + b06: 88 27 eor r24, r24 + b08: 77 fd sbrc r23, 7 + b0a: 80 95 com r24 + b0c: 98 2f mov r25, r24 + b0e: 43 e0 ldi r20, 0x03 ; 3 + b10: 40 df rcall .-384 ; 0x992 uart_putc('.'); - a86: 8e e2 ldi r24, 0x2E ; 46 - a88: 9d de rcall .-710 ; 0x7c4 + b12: 8e e2 ldi r24, 0x2E ; 46 + b14: 9d de rcall .-710 ; 0x850 void print_steps_in_mm(int16_t steps) { int16_t predot,postdot; predot = steps/24; postdot = ((abs(steps)%24)*417)/10; - a8a: c8 01 movw r24, r16 - a8c: 17 ff sbrs r17, 7 - a8e: 03 c0 rjmp .+6 ; 0xa96 - a90: 90 95 com r25 - a92: 81 95 neg r24 - a94: 9f 4f sbci r25, 0xFF ; 255 - a96: 68 e1 ldi r22, 0x18 ; 24 - a98: 70 e0 ldi r23, 0x00 ; 0 - a9a: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> - a9e: 61 ea ldi r22, 0xA1 ; 161 - aa0: 71 e0 ldi r23, 0x01 ; 1 - aa2: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - aa6: 6a e0 ldi r22, 0x0A ; 10 - aa8: 70 e0 ldi r23, 0x00 ; 0 - aaa: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> + b16: c8 01 movw r24, r16 + b18: 17 ff sbrs r17, 7 + b1a: 03 c0 rjmp .+6 ; 0xb22 + b1c: 90 95 com r25 + b1e: 81 95 neg r24 + b20: 9f 4f sbci r25, 0xFF ; 255 + b22: 68 e1 ldi r22, 0x18 ; 24 + b24: 70 e0 ldi r23, 0x00 ; 0 + b26: 0e 94 5d 0f call 0x1eba ; 0x1eba <__divmodhi4> + b2a: 61 ea ldi r22, 0xA1 ; 161 + b2c: 71 e0 ldi r23, 0x01 ; 1 + b2e: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + b32: 6a e0 ldi r22, 0x0A ; 10 + b34: 70 e0 ldi r23, 0x00 ; 0 + b36: 0e 94 5d 0f call 0x1eba ; 0x1eba <__divmodhi4> uart_print_signed_number(predot,3); uart_putc('.'); uart_print_number_wlzeros(postdot,3); - aae: 88 27 eor r24, r24 - ab0: 77 fd sbrc r23, 7 - ab2: 80 95 com r24 - ab4: 98 2f mov r25, r24 - ab6: 43 e0 ldi r20, 0x03 ; 3 - ab8: 12 df rcall .-476 ; 0x8de + b3a: 88 27 eor r24, r24 + b3c: 77 fd sbrc r23, 7 + b3e: 80 95 com r24 + b40: 98 2f mov r25, r24 + b42: 43 e0 ldi r20, 0x03 ; 3 + b44: 12 df rcall .-476 ; 0x96a } - aba: 1f 91 pop r17 - abc: 0f 91 pop r16 - abe: 08 95 ret + b46: 1f 91 pop r17 + b48: 0f 91 pop r16 + b4a: 08 95 ret -00000ac0 : +00000b4c : void pos_report(void){ uart_puts("x_pos: "); - ac0: 80 e0 ldi r24, 0x00 ; 0 - ac2: 91 e0 ldi r25, 0x01 ; 1 - ac4: 87 de rcall .-754 ; 0x7d4 + b4c: 80 e0 ldi r24, 0x00 ; 0 + b4e: 91 e0 ldi r25, 0x01 ; 1 + b50: 87 de rcall .-754 ; 0x860 // uart_print_signed_number(plate_pos_x,6); print_steps_in_mm(plate_pos_x); - ac6: 80 91 4e 01 lds r24, 0x014E - aca: 90 91 4f 01 lds r25, 0x014F - ace: ce df rcall .-100 ; 0xa6c + b52: 80 91 4e 01 lds r24, 0x014E + b56: 90 91 4f 01 lds r25, 0x014F + b5a: ce df rcall .-100 ; 0xaf8 // my_uitoa(plate_pos_x, stringbuffer, 6); // uart_puts(stringbuffer); uart_puts(" y_pos: "); - ad0: 88 e0 ldi r24, 0x08 ; 8 - ad2: 91 e0 ldi r25, 0x01 ; 1 - ad4: 7f de rcall .-770 ; 0x7d4 + b5c: 88 e0 ldi r24, 0x08 ; 8 + b5e: 91 e0 ldi r25, 0x01 ; 1 + b60: 7f de rcall .-770 ; 0x860 // uart_print_signed_number(plate_pos_y,6); print_steps_in_mm(plate_pos_y); - ad6: 80 91 50 01 lds r24, 0x0150 - ada: 90 91 51 01 lds r25, 0x0151 - ade: c6 df rcall .-116 ; 0xa6c + b62: 80 91 50 01 lds r24, 0x0150 + b66: 90 91 51 01 lds r25, 0x0151 + b6a: c6 df rcall .-116 ; 0xaf8 uart_puts("\r"); - ae0: 82 e1 ldi r24, 0x12 ; 18 - ae2: 91 e0 ldi r25, 0x01 ; 1 + b6c: 82 e1 ldi r24, 0x12 ; 18 + b6e: 91 e0 ldi r25, 0x01 ; 1 } - ae4: 77 ce rjmp .-786 ; 0x7d4 + b70: 77 ce rjmp .-786 ; 0x860 -00000ae6 : +00000b72 : #define POSITION 0 #define GOTO 1 #define MOVEREL 2 #define SETZERO 3 void parse_command(void){ - ae6: cf 92 push r12 - ae8: df 92 push r13 - aea: ef 92 push r14 - aec: ff 92 push r15 - aee: 0f 93 push r16 - af0: 1f 93 push r17 - af2: cf 93 push r28 - af4: df 93 push r29 + b72: cf 92 push r12 + b74: df 92 push r13 + b76: ef 92 push r14 + b78: ff 92 push r15 + b7a: 0f 93 push r16 + b7c: 1f 93 push r17 + b7e: cf 93 push r28 + b80: df 93 push r29 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - af6: 2f b7 in r18, 0x3f ; 63 + b82: 2f b7 in r18, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - af8: f8 94 cli + b84: f8 94 cli uint16_t Count; uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); Count = Buffer->Count; - afa: 80 91 5c 01 lds r24, 0x015C - afe: 90 91 5d 01 lds r25, 0x015D + b86: 80 91 5c 01 lds r24, 0x015C + b8a: 90 91 5d 01 lds r25, 0x015D static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - b02: 2f bf out 0x3f, r18 ; 63 + b8e: 2f bf out 0x3f, r18 ; 63 uint8_t action=0,axis=0; int8_t num_sign = 1; char byte; /* Load the next byte from the USART transmit buffer into the USART */ if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { - b04: 00 97 sbiw r24, 0x00 ; 0 - b06: 09 f4 brne .+2 ; 0xb0a - b08: 94 c1 rjmp .+808 ; 0xe32 + b90: 00 97 sbiw r24, 0x00 ; 0 + b92: 09 f4 brne .+2 ; 0xb96 + b94: 94 c1 rjmp .+808 ; 0xebe byte = RingBuffer_Remove(&USBtoUSART_Buffer); - b0a: 82 e5 ldi r24, 0x52 ; 82 - b0c: 91 e0 ldi r25, 0x01 ; 1 - b0e: 4b db rcall .-2410 ; 0x1a6 - b10: 18 2f mov r17, r24 + b96: 82 e5 ldi r24, 0x52 ; 82 + b98: 91 e0 ldi r25, 0x01 ; 1 + b9a: 05 db rcall .-2550 ; 0x1a6 + b9c: 18 2f mov r17, r24 if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand! - b12: 8d 30 cpi r24, 0x0D ; 13 - b14: 19 f0 breq .+6 ; 0xb1c - b16: 8a 30 cpi r24, 0x0A ; 10 - b18: 09 f0 breq .+2 ; 0xb1c - b1a: 74 c1 rjmp .+744 ; 0xe04 + b9e: 8d 30 cpi r24, 0x0D ; 13 + ba0: 19 f0 breq .+6 ; 0xba8 + ba2: 8a 30 cpi r24, 0x0A ; 10 + ba4: 09 f0 breq .+2 ; 0xba8 + ba6: 74 c1 rjmp .+744 ; 0xe90 uart_puts("\r\n"); - b1c: 84 e1 ldi r24, 0x14 ; 20 - b1e: 91 e0 ldi r25, 0x01 ; 1 - b20: 59 de rcall .-846 ; 0x7d4 + ba8: 84 e1 ldi r24, 0x14 ; 20 + baa: 91 e0 ldi r25, 0x01 ; 1 + bac: 59 de rcall .-846 ; 0x860 cmdbuffer[cmdPos] = '\0'; // terminate new command string - b22: 80 91 6d 02 lds r24, 0x026D - b26: e8 2f mov r30, r24 - b28: f0 e0 ldi r31, 0x00 ; 0 - b2a: ee 57 subi r30, 0x7E ; 126 - b2c: fd 4f sbci r31, 0xFD ; 253 - b2e: 10 82 st Z, r1 + bae: 80 91 6d 02 lds r24, 0x026D + bb2: e8 2f mov r30, r24 + bb4: f0 e0 ldi r31, 0x00 ; 0 + bb6: ee 57 subi r30, 0x7E ; 126 + bb8: fd 4f sbci r31, 0xFD ; 253 + bba: 10 82 st Z, r1 curCmdLen = cmdPos; - b30: 80 93 6c 02 sts 0x026C, r24 + bbc: 80 93 6c 02 sts 0x026C, r24 cmdPos = 0; - b34: 10 92 6d 02 sts 0x026D, r1 + bc0: 10 92 6d 02 sts 0x026D, r1 if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command - b38: 80 91 82 02 lds r24, 0x0282 - b3c: 87 36 cpi r24, 0x67 ; 103 - b3e: 59 f0 breq .+22 ; 0xb56 - b40: 87 34 cpi r24, 0x47 ; 71 - b42: 49 f0 breq .+18 ; 0xb56 + bc4: 80 91 82 02 lds r24, 0x0282 + bc8: 87 36 cpi r24, 0x67 ; 103 + bca: 59 f0 breq .+22 ; 0xbe2 + bcc: 87 34 cpi r24, 0x47 ; 71 + bce: 49 f0 breq .+18 ; 0xbe2 action = GOTO; } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { - b44: 8d 36 cpi r24, 0x6D ; 109 - b46: 49 f0 breq .+18 ; 0xb5a - b48: 8d 34 cpi r24, 0x4D ; 77 - b4a: 39 f0 breq .+14 ; 0xb5a + bd0: 8d 36 cpi r24, 0x6D ; 109 + bd2: 49 f0 breq .+18 ; 0xbe6 + bd4: 8d 34 cpi r24, 0x4D ; 77 + bd6: 39 f0 breq .+14 ; 0xbe6 action = MOVEREL; } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { - b4c: 8a 37 cpi r24, 0x7A ; 122 - b4e: 39 f0 breq .+14 ; 0xb5e - b50: 8a 35 cpi r24, 0x5A ; 90 - b52: 39 f4 brne .+14 ; 0xb62 - b54: 04 c0 rjmp .+8 ; 0xb5e + bd8: 8a 37 cpi r24, 0x7A ; 122 + bda: 39 f0 breq .+14 ; 0xbea + bdc: 8a 35 cpi r24, 0x5A ; 90 + bde: 39 f4 brne .+14 ; 0xbee + be0: 04 c0 rjmp .+8 ; 0xbea curCmdLen = cmdPos; cmdPos = 0; if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command action = GOTO; - b56: 01 e0 ldi r16, 0x01 ; 1 - b58: 05 c0 rjmp .+10 ; 0xb64 + be2: 01 e0 ldi r16, 0x01 ; 1 + be4: 05 c0 rjmp .+10 ; 0xbf0 } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { action = MOVEREL; - b5a: 02 e0 ldi r16, 0x02 ; 2 - b5c: 03 c0 rjmp .+6 ; 0xb64 + be6: 02 e0 ldi r16, 0x02 ; 2 + be8: 03 c0 rjmp .+6 ; 0xbf0 } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { action = SETZERO; - b5e: 03 e0 ldi r16, 0x03 ; 3 - b60: 01 c0 rjmp .+2 ; 0xb64 + bea: 03 e0 ldi r16, 0x03 ; 3 + bec: 01 c0 rjmp .+2 ; 0xbf0 } else { action = POSITION; - b62: 00 e0 ldi r16, 0x00 ; 0 + bee: 00 e0 ldi r16, 0x00 ; 0 } if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { - b64: 80 91 83 02 lds r24, 0x0283 - b68: 88 37 cpi r24, 0x78 ; 120 - b6a: 39 f0 breq .+14 ; 0xb7a - b6c: 88 35 cpi r24, 0x58 ; 88 - b6e: 29 f0 breq .+10 ; 0xb7a + bf0: 80 91 83 02 lds r24, 0x0283 + bf4: 88 37 cpi r24, 0x78 ; 120 + bf6: 39 f0 breq .+14 ; 0xc06 + bf8: 88 35 cpi r24, 0x58 ; 88 + bfa: 29 f0 breq .+10 ; 0xc06 axis = X; } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { - b70: 89 37 cpi r24, 0x79 ; 121 - b72: 29 f0 breq .+10 ; 0xb7e + bfc: 89 37 cpi r24, 0x79 ; 121 + bfe: 29 f0 breq .+10 ; 0xc0a #define POSITION 0 #define GOTO 1 #define MOVEREL 2 #define SETZERO 3 void parse_command(void){ - b74: 11 e0 ldi r17, 0x01 ; 1 - b76: 89 35 cpi r24, 0x59 ; 89 - b78: 19 f0 breq .+6 ; 0xb80 + c00: 11 e0 ldi r17, 0x01 ; 1 + c02: 89 35 cpi r24, 0x59 ; 89 + c04: 19 f0 breq .+6 ; 0xc0c } else { action = POSITION; } if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { axis = X; - b7a: 10 e0 ldi r17, 0x00 ; 0 - b7c: 01 c0 rjmp .+2 ; 0xb80 + c06: 10 e0 ldi r17, 0x00 ; 0 + c08: 01 c0 rjmp .+2 ; 0xc0c } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { axis = Y; - b7e: 11 e0 ldi r17, 0x01 ; 1 + c0a: 11 e0 ldi r17, 0x01 ; 1 } // if you expect coordinate, parse number! if (action == GOTO || action == MOVEREL){ - b80: 80 2f mov r24, r16 - b82: 81 50 subi r24, 0x01 ; 1 - b84: 82 30 cpi r24, 0x02 ; 2 - b86: 08 f0 brcs .+2 ; 0xb8a - b88: 6d c0 rjmp .+218 ; 0xc64 + c0c: 80 2f mov r24, r16 + c0e: 81 50 subi r24, 0x01 ; 1 + c10: 82 30 cpi r24, 0x02 ; 2 + c12: 08 f0 brcs .+2 ; 0xc16 + c14: 6d c0 rjmp .+218 ; 0xcf0 predot = 0; - b8a: 10 92 71 02 sts 0x0271, r1 - b8e: 10 92 70 02 sts 0x0270, r1 + c16: 10 92 71 02 sts 0x0271, r1 + c1a: 10 92 70 02 sts 0x0270, r1 postdot = 0; - b92: 10 92 6f 02 sts 0x026F, r1 - b96: 10 92 6e 02 sts 0x026E, r1 + c1e: 10 92 6f 02 sts 0x026F, r1 + c22: 10 92 6e 02 sts 0x026E, r1 num_sign = 1; num_start = 0; - b9a: 10 92 6b 02 sts 0x026B, r1 + c26: 10 92 6b 02 sts 0x026B, r1 nums_found = 0; - b9e: 10 92 6a 02 sts 0x026A, r1 + c2a: 10 92 6a 02 sts 0x026A, r1 for (uint8_t i=2; i<=curCmdLen; i++) { - ba2: 92 e0 ldi r25, 0x02 ; 2 - ba4: f9 2e mov r15, r25 + c2e: 72 e0 ldi r23, 0x02 ; 2 + c30: f7 2e mov r15, r23 // if you expect coordinate, parse number! if (action == GOTO || action == MOVEREL){ predot = 0; postdot = 0; num_sign = 1; - ba6: dd 24 eor r13, r13 - ba8: d3 94 inc r13 + c32: dd 24 eor r13, r13 + c34: d3 94 inc r13 predot = atoi(numbuffer); } else { // its the postdot digits uint8_t postdotlen = i-num_start; if (postdotlen < 3){ // if too small ,fill with zeros for( uint8_t j = postdotlen; j <=2; j++) { numbuffer[j] = '0'; - baa: 80 e3 ldi r24, 0x30 ; 48 - bac: c8 2e mov r12, r24 + c36: 60 e3 ldi r22, 0x30 ; 48 + c38: c6 2e mov r12, r22 postdot = 0; num_sign = 1; num_start = 0; nums_found = 0; for (uint8_t i=2; i<=curCmdLen; i++) { - bae: 54 c0 rjmp .+168 ; 0xc58 + c3a: 54 c0 rjmp .+168 ; 0xce4 if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before - bb0: e0 90 6b 02 lds r14, 0x026B - bb4: ee 20 and r14, r14 - bb6: 49 f4 brne .+18 ; 0xbca - bb8: ef 2d mov r30, r15 - bba: f0 e0 ldi r31, 0x00 ; 0 - bbc: ee 57 subi r30, 0x7E ; 126 - bbe: fd 4f sbci r31, 0xFD ; 253 - bc0: 80 81 ld r24, Z - bc2: 8d 32 cpi r24, 0x2D ; 45 - bc4: 11 f4 brne .+4 ; 0xbca + c3c: e0 90 6b 02 lds r14, 0x026B + c40: ee 20 and r14, r14 + c42: 49 f4 brne .+18 ; 0xc56 + c44: ef 2d mov r30, r15 + c46: f0 e0 ldi r31, 0x00 ; 0 + c48: ee 57 subi r30, 0x7E ; 126 + c4a: fd 4f sbci r31, 0xFD ; 253 + c4c: 80 81 ld r24, Z + c4e: 8d 32 cpi r24, 0x2D ; 45 + c50: 11 f4 brne .+4 ; 0xc56 // you find a digit, it's a negative number num_sign = -1; - bc6: dd 24 eor r13, r13 - bc8: da 94 dec r13 + c52: dd 24 eor r13, r13 + c54: da 94 dec r13 } if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number? - bca: cf 2d mov r28, r15 - bcc: d0 e0 ldi r29, 0x00 ; 0 - bce: fe 01 movw r30, r28 - bd0: ee 57 subi r30, 0x7E ; 126 - bd2: fd 4f sbci r31, 0xFD ; 253 - bd4: 80 81 ld r24, Z - bd6: 80 53 subi r24, 0x30 ; 48 - bd8: 8a 30 cpi r24, 0x0A ; 10 - bda: 28 f4 brcc .+10 ; 0xbe6 + c56: cf 2d mov r28, r15 + c58: d0 e0 ldi r29, 0x00 ; 0 + c5a: fe 01 movw r30, r28 + c5c: ee 57 subi r30, 0x7E ; 126 + c5e: fd 4f sbci r31, 0xFD ; 253 + c60: 80 81 ld r24, Z + c62: 80 53 subi r24, 0x30 ; 48 + c64: 8a 30 cpi r24, 0x0A ; 10 + c66: 28 f4 brcc .+10 ; 0xc72 if ( num_start == 0) { // this is the first digit in the string - bdc: ee 20 and r14, r14 - bde: d9 f5 brne .+118 ; 0xc56 + c68: ee 20 and r14, r14 + c6a: d9 f5 brne .+118 ; 0xce2 num_start = i; - be0: f0 92 6b 02 sts 0x026B, r15 - be4: 38 c0 rjmp .+112 ; 0xc56 + c6c: f0 92 6b 02 sts 0x026B, r15 + c70: 38 c0 rjmp .+112 ; 0xce2 } } else { // no digit! if ( num_start != 0) { // digits have been found before - be6: ee 20 and r14, r14 - be8: b1 f1 breq .+108 ; 0xc56 + c72: ee 20 and r14, r14 + c74: b1 f1 breq .+108 ; 0xce2 strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to - bea: 6e 2d mov r22, r14 - bec: 70 e0 ldi r23, 0x00 ; 0 - bee: c6 1b sub r28, r22 - bf0: d7 0b sbc r29, r23 - bf2: 6e 57 subi r22, 0x7E ; 126 - bf4: 7d 4f sbci r23, 0xFD ; 253 - bf6: 82 e7 ldi r24, 0x72 ; 114 - bf8: 92 e0 ldi r25, 0x02 ; 2 - bfa: ae 01 movw r20, r28 - bfc: 0e 94 61 0f call 0x1ec2 ; 0x1ec2 + c76: 6e 2d mov r22, r14 + c78: 70 e0 ldi r23, 0x00 ; 0 + c7a: c6 1b sub r28, r22 + c7c: d7 0b sbc r29, r23 + c7e: 6e 57 subi r22, 0x7E ; 126 + c80: 7d 4f sbci r23, 0xFD ; 253 + c82: 82 e7 ldi r24, 0x72 ; 114 + c84: 92 e0 ldi r25, 0x02 ; 2 + c86: ae 01 movw r20, r28 + c88: 0e 94 af 0f call 0x1f5e ; 0x1f5e // numbuffer numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string - c00: ce 58 subi r28, 0x8E ; 142 - c02: dd 4f sbci r29, 0xFD ; 253 - c04: 18 82 st Y, r1 + c8c: ce 58 subi r28, 0x8E ; 142 + c8e: dd 4f sbci r29, 0xFD ; 253 + c90: 18 82 st Y, r1 nums_found++; - c06: 80 91 6a 02 lds r24, 0x026A - c0a: 8f 5f subi r24, 0xFF ; 255 - c0c: 80 93 6a 02 sts 0x026A, r24 + c92: 80 91 6a 02 lds r24, 0x026A + c96: 8f 5f subi r24, 0xFF ; 255 + c98: 80 93 6a 02 sts 0x026A, r24 if(nums_found == 1) { // its the predot digits - c10: 81 30 cpi r24, 0x01 ; 1 - c12: 49 f4 brne .+18 ; 0xc26 + c9c: 81 30 cpi r24, 0x01 ; 1 + c9e: 49 f4 brne .+18 ; 0xcb2 predot = atoi(numbuffer); - c14: 82 e7 ldi r24, 0x72 ; 114 - c16: 92 e0 ldi r25, 0x02 ; 2 - c18: 0e 94 44 0f call 0x1e88 ; 0x1e88 - c1c: 90 93 71 02 sts 0x0271, r25 - c20: 80 93 70 02 sts 0x0270, r24 - c24: 16 c0 rjmp .+44 ; 0xc52 + ca0: 82 e7 ldi r24, 0x72 ; 114 + ca2: 92 e0 ldi r25, 0x02 ; 2 + ca4: 0e 94 92 0f call 0x1f24 ; 0x1f24 + ca8: 90 93 71 02 sts 0x0271, r25 + cac: 80 93 70 02 sts 0x0270, r24 + cb0: 16 c0 rjmp .+44 ; 0xcde } else { // its the postdot digits uint8_t postdotlen = i-num_start; - c26: 8f 2d mov r24, r15 - c28: 8e 19 sub r24, r14 + cb2: 8f 2d mov r24, r15 + cb4: 8e 19 sub r24, r14 if (postdotlen < 3){ // if too small ,fill with zeros - c2a: 83 30 cpi r24, 0x03 ; 3 - c2c: 40 f4 brcc .+16 ; 0xc3e + cb6: 83 30 cpi r24, 0x03 ; 3 + cb8: 40 f4 brcc .+16 ; 0xcca for( uint8_t j = postdotlen; j <=2; j++) { numbuffer[j] = '0'; - c2e: e8 2f mov r30, r24 - c30: f0 e0 ldi r31, 0x00 ; 0 - c32: ee 58 subi r30, 0x8E ; 142 - c34: fd 4f sbci r31, 0xFD ; 253 - c36: c0 82 st Z, r12 + cba: e8 2f mov r30, r24 + cbc: f0 e0 ldi r31, 0x00 ; 0 + cbe: ee 58 subi r30, 0x8E ; 142 + cc0: fd 4f sbci r31, 0xFD ; 253 + cc2: c0 82 st Z, r12 if(nums_found == 1) { // its the predot digits predot = atoi(numbuffer); } else { // its the postdot digits uint8_t postdotlen = i-num_start; if (postdotlen < 3){ // if too small ,fill with zeros for( uint8_t j = postdotlen; j <=2; j++) { - c38: 8f 5f subi r24, 0xFF ; 255 - c3a: 83 30 cpi r24, 0x03 ; 3 - c3c: c1 f7 brne .-16 ; 0xc2e + cc4: 8f 5f subi r24, 0xFF ; 255 + cc6: 83 30 cpi r24, 0x03 ; 3 + cc8: c1 f7 brne .-16 ; 0xcba numbuffer[j] = '0'; } } // crop the number to three post dot digits numbuffer[3] = '\0'; - c3e: 10 92 75 02 sts 0x0275, r1 + cca: 10 92 75 02 sts 0x0275, r1 postdot = atoi(numbuffer); - c42: 82 e7 ldi r24, 0x72 ; 114 - c44: 92 e0 ldi r25, 0x02 ; 2 - c46: 0e 94 44 0f call 0x1e88 ; 0x1e88 - c4a: 90 93 6f 02 sts 0x026F, r25 - c4e: 80 93 6e 02 sts 0x026E, r24 + cce: 82 e7 ldi r24, 0x72 ; 114 + cd0: 92 e0 ldi r25, 0x02 ; 2 + cd2: 0e 94 92 0f call 0x1f24 ; 0x1f24 + cd6: 90 93 6f 02 sts 0x026F, r25 + cda: 80 93 6e 02 sts 0x026E, r24 } num_start = 0; - c52: 10 92 6b 02 sts 0x026B, r1 + cde: 10 92 6b 02 sts 0x026B, r1 postdot = 0; num_sign = 1; num_start = 0; nums_found = 0; for (uint8_t i=2; i<=curCmdLen; i++) { - c56: f3 94 inc r15 - c58: 80 91 6c 02 lds r24, 0x026C - c5c: 8f 15 cp r24, r15 - c5e: 08 f0 brcs .+2 ; 0xc62 - c60: a7 cf rjmp .-178 ; 0xbb0 - c62: 02 c0 rjmp .+4 ; 0xc68 + ce2: f3 94 inc r15 + ce4: 80 91 6c 02 lds r24, 0x026C + ce8: 8f 15 cp r24, r15 + cea: 08 f0 brcs .+2 ; 0xcee + cec: a7 cf rjmp .-178 ; 0xc3c + cee: 02 c0 rjmp .+4 ; 0xcf4 static char cmdbuffer[32]; static char numbuffer[16]; static uint16_t predot = 0,postdot = 0; static uint8_t cmdPos, curCmdLen, num_start = 0, nums_found = 0; uint8_t action=0,axis=0; int8_t num_sign = 1; - c64: dd 24 eor r13, r13 - c66: d3 94 inc r13 + cf0: dd 24 eor r13, r13 + cf2: d3 94 inc r13 } int16_t steps = 0,dest=0; switch (action) { - c68: 02 30 cpi r16, 0x02 ; 2 - c6a: 09 f4 brne .+2 ; 0xc6e - c6c: 61 c0 rjmp .+194 ; 0xd30 - c6e: 03 30 cpi r16, 0x03 ; 3 - c70: 09 f4 brne .+2 ; 0xc74 - c72: be c0 rjmp .+380 ; 0xdf0 - c74: 01 30 cpi r16, 0x01 ; 1 - c76: 09 f0 breq .+2 ; 0xc7a - c78: c3 c0 rjmp .+390 ; 0xe00 + cf4: 02 30 cpi r16, 0x02 ; 2 + cf6: 09 f4 brne .+2 ; 0xcfa + cf8: 61 c0 rjmp .+194 ; 0xdbc + cfa: 03 30 cpi r16, 0x03 ; 3 + cfc: 09 f4 brne .+2 ; 0xd00 + cfe: be c0 rjmp .+380 ; 0xe7c + d00: 01 30 cpi r16, 0x01 ; 1 + d02: 09 f0 breq .+2 ; 0xd06 + d04: c3 c0 rjmp .+390 ; 0xe8c case GOTO: uart_puts("GOTO "); - c7a: 87 e1 ldi r24, 0x17 ; 23 - c7c: 91 e0 ldi r25, 0x01 ; 1 - c7e: aa dd rcall .-1196 ; 0x7d4 + d06: 87 e1 ldi r24, 0x17 ; 23 + d08: 91 e0 ldi r25, 0x01 ; 1 + d0a: aa dd rcall .-1196 ; 0x860 uart_putc(88+axis);// x or y - c80: 81 2f mov r24, r17 - c82: 88 5a subi r24, 0xA8 ; 168 - c84: 9f dd rcall .-1218 ; 0x7c4 + d0c: 81 2f mov r24, r17 + d0e: 88 5a subi r24, 0xA8 ; 168 + d10: 9f dd rcall .-1218 ; 0x850 uart_putc(' '); - c86: 80 e2 ldi r24, 0x20 ; 32 - c88: 9d dd rcall .-1222 ; 0x7c4 + d12: 80 e2 ldi r24, 0x20 ; 32 + d14: 9d dd rcall .-1222 ; 0x850 uart_print_signed_number(predot*num_sign,3); - c8a: cd 2d mov r28, r13 - c8c: dd 27 eor r29, r29 - c8e: c7 fd sbrc r28, 7 - c90: d0 95 com r29 - c92: 60 91 70 02 lds r22, 0x0270 - c96: 70 91 71 02 lds r23, 0x0271 - c9a: ce 01 movw r24, r28 - c9c: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - ca0: bc 01 movw r22, r24 - ca2: 80 e0 ldi r24, 0x00 ; 0 - ca4: 90 e0 ldi r25, 0x00 ; 0 - ca6: 43 e0 ldi r20, 0x03 ; 3 - ca8: 2e de rcall .-932 ; 0x906 + d16: cd 2d mov r28, r13 + d18: dd 27 eor r29, r29 + d1a: c7 fd sbrc r28, 7 + d1c: d0 95 com r29 + d1e: 60 91 70 02 lds r22, 0x0270 + d22: 70 91 71 02 lds r23, 0x0271 + d26: ce 01 movw r24, r28 + d28: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + d2c: bc 01 movw r22, r24 + d2e: 80 e0 ldi r24, 0x00 ; 0 + d30: 90 e0 ldi r25, 0x00 ; 0 + d32: 43 e0 ldi r20, 0x03 ; 3 + d34: 2e de rcall .-932 ; 0x992 uart_putc('.'); - caa: 8e e2 ldi r24, 0x2E ; 46 - cac: 8b dd rcall .-1258 ; 0x7c4 + d36: 8e e2 ldi r24, 0x2E ; 46 + d38: 8b dd rcall .-1258 ; 0x850 uart_print_number_wlzeros(postdot,3); - cae: 60 91 6e 02 lds r22, 0x026E - cb2: 70 91 6f 02 lds r23, 0x026F - cb6: 80 e0 ldi r24, 0x00 ; 0 - cb8: 90 e0 ldi r25, 0x00 ; 0 - cba: 43 e0 ldi r20, 0x03 ; 3 - cbc: 10 de rcall .-992 ; 0x8de + d3a: 60 91 6e 02 lds r22, 0x026E + d3e: 70 91 6f 02 lds r23, 0x026F + d42: 80 e0 ldi r24, 0x00 ; 0 + d44: 90 e0 ldi r25, 0x00 ; 0 + d46: 43 e0 ldi r20, 0x03 ; 3 + d48: 10 de rcall .-992 ; 0x96a uart_puts("\r\n"); - cbe: 84 e1 ldi r24, 0x14 ; 20 - cc0: 91 e0 ldi r25, 0x01 ; 1 - cc2: 88 dd rcall .-1264 ; 0x7d4 + d4a: 84 e1 ldi r24, 0x14 ; 20 + d4c: 91 e0 ldi r25, 0x01 ; 1 + d4e: 88 dd rcall .-1264 ; 0x860 dest = num_sign *( predot*24 +(postdot*10)/416); - cc4: 80 91 6e 02 lds r24, 0x026E - cc8: 90 91 6f 02 lds r25, 0x026F - ccc: 6a e0 ldi r22, 0x0A ; 10 - cce: 70 e0 ldi r23, 0x00 ; 0 - cd0: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - cd4: 60 ea ldi r22, 0xA0 ; 160 - cd6: 71 e0 ldi r23, 0x01 ; 1 - cd8: 0e 94 fb 0e call 0x1df6 ; 0x1df6 <__udivmodhi4> - cdc: 9b 01 movw r18, r22 - cde: 80 91 70 02 lds r24, 0x0270 - ce2: 90 91 71 02 lds r25, 0x0271 - ce6: 68 e1 ldi r22, 0x18 ; 24 - ce8: 70 e0 ldi r23, 0x00 ; 0 - cea: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - cee: 28 0f add r18, r24 - cf0: 39 1f adc r19, r25 - cf2: ce 01 movw r24, r28 - cf4: b9 01 movw r22, r18 - cf6: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + d50: 80 91 6e 02 lds r24, 0x026E + d54: 90 91 6f 02 lds r25, 0x026F + d58: 6a e0 ldi r22, 0x0A ; 10 + d5a: 70 e0 ldi r23, 0x00 ; 0 + d5c: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + d60: 60 ea ldi r22, 0xA0 ; 160 + d62: 71 e0 ldi r23, 0x01 ; 1 + d64: 0e 94 49 0f call 0x1e92 ; 0x1e92 <__udivmodhi4> + d68: 9b 01 movw r18, r22 + d6a: 80 91 70 02 lds r24, 0x0270 + d6e: 90 91 71 02 lds r25, 0x0271 + d72: 68 e1 ldi r22, 0x18 ; 24 + d74: 70 e0 ldi r23, 0x00 ; 0 + d76: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + d7a: 28 0f add r18, r24 + d7c: 39 1f adc r19, r25 + d7e: ce 01 movw r24, r28 + d80: b9 01 movw r22, r18 + d82: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> if (axis == X) { - cfa: 11 23 and r17, r17 - cfc: 69 f4 brne .+26 ; 0xd18 + d86: 11 23 and r17, r17 + d88: 69 f4 brne .+26 ; 0xda4 steps = dest - plate_pos_x; // experimental correction! - cfe: 20 91 4e 01 lds r18, 0x014E - d02: 30 91 4f 01 lds r19, 0x014F - d06: e8 2e mov r14, r24 - d08: e7 01 movw r28, r14 - d0a: 7e 01 movw r14, r28 - d0c: f9 2e mov r15, r25 - d0e: e7 01 movw r28, r14 - d10: c2 1b sub r28, r18 - d12: d3 0b sbc r29, r19 + d8a: 20 91 4e 01 lds r18, 0x014E + d8e: 30 91 4f 01 lds r19, 0x014F + d92: e8 2e mov r14, r24 + d94: e7 01 movw r28, r14 + d96: 7e 01 movw r14, r28 + d98: f9 2e mov r15, r25 + d9a: e7 01 movw r28, r14 + d9c: c2 1b sub r28, r18 + d9e: d3 0b sbc r29, r19 move_plate(steps,0); - d14: ce 01 movw r24, r28 - d16: 4f c0 rjmp .+158 ; 0xdb6 + da0: ce 01 movw r24, r28 + da2: 4f c0 rjmp .+158 ; 0xe42 plate_pos_x += steps; } else if (axis == Y) { steps = dest - plate_pos_y; - d18: 20 91 50 01 lds r18, 0x0150 - d1c: 30 91 51 01 lds r19, 0x0151 - d20: e8 2e mov r14, r24 - d22: e7 01 movw r28, r14 - d24: 7e 01 movw r14, r28 - d26: f9 2e mov r15, r25 - d28: e7 01 movw r28, r14 - d2a: c2 1b sub r28, r18 - d2c: d3 0b sbc r29, r19 - d2e: 51 c0 rjmp .+162 ; 0xdd2 + da4: 20 91 50 01 lds r18, 0x0150 + da8: 30 91 51 01 lds r19, 0x0151 + dac: e8 2e mov r14, r24 + dae: e7 01 movw r28, r14 + db0: 7e 01 movw r14, r28 + db2: f9 2e mov r15, r25 + db4: e7 01 movw r28, r14 + db6: c2 1b sub r28, r18 + db8: d3 0b sbc r29, r19 + dba: 51 c0 rjmp .+162 ; 0xe5e } pos_report(); break; case MOVEREL: uart_puts("MOVE "); - d30: 8d e1 ldi r24, 0x1D ; 29 - d32: 91 e0 ldi r25, 0x01 ; 1 - d34: 4f dd rcall .-1378 ; 0x7d4 + dbc: 8d e1 ldi r24, 0x1D ; 29 + dbe: 91 e0 ldi r25, 0x01 ; 1 + dc0: 4f dd rcall .-1378 ; 0x860 uart_putc(88+axis);// x or y - d36: 81 2f mov r24, r17 - d38: 88 5a subi r24, 0xA8 ; 168 - d3a: 44 dd rcall .-1400 ; 0x7c4 + dc2: 81 2f mov r24, r17 + dc4: 88 5a subi r24, 0xA8 ; 168 + dc6: 44 dd rcall .-1400 ; 0x850 uart_putc(' '); - d3c: 80 e2 ldi r24, 0x20 ; 32 - d3e: 42 dd rcall .-1404 ; 0x7c4 + dc8: 80 e2 ldi r24, 0x20 ; 32 + dca: 42 dd rcall .-1404 ; 0x850 uart_print_signed_number(predot*num_sign,3); - d40: cd 2d mov r28, r13 - d42: dd 27 eor r29, r29 - d44: c7 fd sbrc r28, 7 - d46: d0 95 com r29 - d48: 60 91 70 02 lds r22, 0x0270 - d4c: 70 91 71 02 lds r23, 0x0271 - d50: ce 01 movw r24, r28 - d52: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - d56: bc 01 movw r22, r24 - d58: 80 e0 ldi r24, 0x00 ; 0 - d5a: 90 e0 ldi r25, 0x00 ; 0 - d5c: 43 e0 ldi r20, 0x03 ; 3 - d5e: d3 dd rcall .-1114 ; 0x906 + dcc: cd 2d mov r28, r13 + dce: dd 27 eor r29, r29 + dd0: c7 fd sbrc r28, 7 + dd2: d0 95 com r29 + dd4: 60 91 70 02 lds r22, 0x0270 + dd8: 70 91 71 02 lds r23, 0x0271 + ddc: ce 01 movw r24, r28 + dde: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + de2: bc 01 movw r22, r24 + de4: 80 e0 ldi r24, 0x00 ; 0 + de6: 90 e0 ldi r25, 0x00 ; 0 + de8: 43 e0 ldi r20, 0x03 ; 3 + dea: d3 dd rcall .-1114 ; 0x992 uart_putc('.'); - d60: 8e e2 ldi r24, 0x2E ; 46 - d62: 30 dd rcall .-1440 ; 0x7c4 + dec: 8e e2 ldi r24, 0x2E ; 46 + dee: 30 dd rcall .-1440 ; 0x850 uart_print_number_wlzeros(postdot,3); - d64: 60 91 6e 02 lds r22, 0x026E - d68: 70 91 6f 02 lds r23, 0x026F - d6c: 80 e0 ldi r24, 0x00 ; 0 - d6e: 90 e0 ldi r25, 0x00 ; 0 - d70: 43 e0 ldi r20, 0x03 ; 3 - d72: b5 dd rcall .-1174 ; 0x8de + df0: 60 91 6e 02 lds r22, 0x026E + df4: 70 91 6f 02 lds r23, 0x026F + df8: 80 e0 ldi r24, 0x00 ; 0 + dfa: 90 e0 ldi r25, 0x00 ; 0 + dfc: 43 e0 ldi r20, 0x03 ; 3 + dfe: b5 dd rcall .-1174 ; 0x96a uart_puts("\r\n"); - d74: 84 e1 ldi r24, 0x14 ; 20 - d76: 91 e0 ldi r25, 0x01 ; 1 - d78: 2d dd rcall .-1446 ; 0x7d4 + e00: 84 e1 ldi r24, 0x14 ; 20 + e02: 91 e0 ldi r25, 0x01 ; 1 + e04: 2d dd rcall .-1446 ; 0x860 steps = num_sign *( predot*24 +(postdot*10)/416); - d7a: 80 91 6e 02 lds r24, 0x026E - d7e: 90 91 6f 02 lds r25, 0x026F - d82: 6a e0 ldi r22, 0x0A ; 10 - d84: 70 e0 ldi r23, 0x00 ; 0 - d86: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - d8a: 60 ea ldi r22, 0xA0 ; 160 - d8c: 71 e0 ldi r23, 0x01 ; 1 - d8e: 0e 94 fb 0e call 0x1df6 ; 0x1df6 <__udivmodhi4> - d92: 9b 01 movw r18, r22 - d94: 80 91 70 02 lds r24, 0x0270 - d98: 90 91 71 02 lds r25, 0x0271 - d9c: 68 e1 ldi r22, 0x18 ; 24 - d9e: 70 e0 ldi r23, 0x00 ; 0 - da0: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - da4: 28 0f add r18, r24 - da6: 39 1f adc r19, r25 - da8: ce 01 movw r24, r28 - daa: b9 01 movw r22, r18 - dac: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> - db0: ec 01 movw r28, r24 + e06: 80 91 6e 02 lds r24, 0x026E + e0a: 90 91 6f 02 lds r25, 0x026F + e0e: 6a e0 ldi r22, 0x0A ; 10 + e10: 70 e0 ldi r23, 0x00 ; 0 + e12: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + e16: 60 ea ldi r22, 0xA0 ; 160 + e18: 71 e0 ldi r23, 0x01 ; 1 + e1a: 0e 94 49 0f call 0x1e92 ; 0x1e92 <__udivmodhi4> + e1e: 9b 01 movw r18, r22 + e20: 80 91 70 02 lds r24, 0x0270 + e24: 90 91 71 02 lds r25, 0x0271 + e28: 68 e1 ldi r22, 0x18 ; 24 + e2a: 70 e0 ldi r23, 0x00 ; 0 + e2c: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + e30: 28 0f add r18, r24 + e32: 39 1f adc r19, r25 + e34: ce 01 movw r24, r28 + e36: b9 01 movw r22, r18 + e38: 0e 94 37 0f call 0x1e6e ; 0x1e6e <__mulhi3> + e3c: ec 01 movw r28, r24 if (axis == X) { - db2: 11 23 and r17, r17 - db4: 71 f4 brne .+28 ; 0xdd2 + e3e: 11 23 and r17, r17 + e40: 71 f4 brne .+28 ; 0xe5e move_plate(steps,0); - db6: 60 e0 ldi r22, 0x00 ; 0 - db8: 70 e0 ldi r23, 0x00 ; 0 - dba: 07 de rcall .-1010 ; 0x9ca + e42: 60 e0 ldi r22, 0x00 ; 0 + e44: 70 e0 ldi r23, 0x00 ; 0 + e46: 07 de rcall .-1010 ; 0xa56 plate_pos_x += steps; - dbc: 80 91 4e 01 lds r24, 0x014E - dc0: 90 91 4f 01 lds r25, 0x014F - dc4: 8c 0f add r24, r28 - dc6: 9d 1f adc r25, r29 - dc8: 90 93 4f 01 sts 0x014F, r25 - dcc: 80 93 4e 01 sts 0x014E, r24 - dd0: 17 c0 rjmp .+46 ; 0xe00 + e48: 80 91 4e 01 lds r24, 0x014E + e4c: 90 91 4f 01 lds r25, 0x014F + e50: 8c 0f add r24, r28 + e52: 9d 1f adc r25, r29 + e54: 90 93 4f 01 sts 0x014F, r25 + e58: 80 93 4e 01 sts 0x014E, r24 + e5c: 17 c0 rjmp .+46 ; 0xe8c } else if (axis == Y) { move_plate(0,steps); - dd2: 80 e0 ldi r24, 0x00 ; 0 - dd4: 90 e0 ldi r25, 0x00 ; 0 - dd6: be 01 movw r22, r28 - dd8: f8 dd rcall .-1040 ; 0x9ca + e5e: 80 e0 ldi r24, 0x00 ; 0 + e60: 90 e0 ldi r25, 0x00 ; 0 + e62: be 01 movw r22, r28 + e64: f8 dd rcall .-1040 ; 0xa56 plate_pos_y += steps; - dda: 80 91 50 01 lds r24, 0x0150 - dde: 90 91 51 01 lds r25, 0x0151 - de2: 8c 0f add r24, r28 - de4: 9d 1f adc r25, r29 - de6: 90 93 51 01 sts 0x0151, r25 - dea: 80 93 50 01 sts 0x0150, r24 - dee: 08 c0 rjmp .+16 ; 0xe00 + e66: 80 91 50 01 lds r24, 0x0150 + e6a: 90 91 51 01 lds r25, 0x0151 + e6e: 8c 0f add r24, r28 + e70: 9d 1f adc r25, r29 + e72: 90 93 51 01 sts 0x0151, r25 + e76: 80 93 50 01 sts 0x0150, r24 + e7a: 08 c0 rjmp .+16 ; 0xe8c } pos_report(); break; case SETZERO: plate_pos_x = 0; - df0: 10 92 4f 01 sts 0x014F, r1 - df4: 10 92 4e 01 sts 0x014E, r1 + e7c: 10 92 4f 01 sts 0x014F, r1 + e80: 10 92 4e 01 sts 0x014E, r1 plate_pos_y = 0; - df8: 10 92 51 01 sts 0x0151, r1 - dfc: 10 92 50 01 sts 0x0150, r1 + e84: 10 92 51 01 sts 0x0151, r1 + e88: 10 92 50 01 sts 0x0150, r1 pos_report(); break; case POSITION: pos_report(); - e00: 5f de rcall .-834 ; 0xac0 + e8c: 5f de rcall .-834 ; 0xb4c break; - e02: 17 c0 rjmp .+46 ; 0xe32 + e8e: 17 c0 rjmp .+46 ; 0xebe } } else { // queue command if( cmdPos == 0 ){ - e04: 80 91 6d 02 lds r24, 0x026D - e08: 88 23 and r24, r24 - e0a: 19 f4 brne .+6 ; 0xe12 + e90: 80 91 6d 02 lds r24, 0x026D + e94: 88 23 and r24, r24 + e96: 19 f4 brne .+6 ; 0xe9e uart_puts("\r\n$ "); - e0c: 83 e2 ldi r24, 0x23 ; 35 - e0e: 91 e0 ldi r25, 0x01 ; 1 - e10: e1 dc rcall .-1598 ; 0x7d4 - e12: 80 91 6d 02 lds r24, 0x026D + e98: 83 e2 ldi r24, 0x23 ; 35 + e9a: 91 e0 ldi r25, 0x01 ; 1 + e9c: e1 dc rcall .-1598 ; 0x860 + e9e: 80 91 6d 02 lds r24, 0x026D } if( byte == 8 ){ // backspace - e16: 18 30 cpi r17, 0x08 ; 8 - e18: 11 f4 brne .+4 ; 0xe1e + ea2: 18 30 cpi r17, 0x08 ; 8 + ea4: 11 f4 brne .+4 ; 0xeaa cmdPos--; - e1a: 81 50 subi r24, 0x01 ; 1 - e1c: 06 c0 rjmp .+12 ; 0xe2a + ea6: 81 50 subi r24, 0x01 ; 1 + ea8: 06 c0 rjmp .+12 ; 0xeb6 } else { cmdbuffer[cmdPos++] = byte; - e1e: e8 2f mov r30, r24 - e20: f0 e0 ldi r31, 0x00 ; 0 - e22: ee 57 subi r30, 0x7E ; 126 - e24: fd 4f sbci r31, 0xFD ; 253 - e26: 10 83 st Z, r17 - e28: 8f 5f subi r24, 0xFF ; 255 - e2a: 80 93 6d 02 sts 0x026D, r24 + eaa: e8 2f mov r30, r24 + eac: f0 e0 ldi r31, 0x00 ; 0 + eae: ee 57 subi r30, 0x7E ; 126 + eb0: fd 4f sbci r31, 0xFD ; 253 + eb2: 10 83 st Z, r17 + eb4: 8f 5f subi r24, 0xFF ; 255 + eb6: 80 93 6d 02 sts 0x026D, r24 } uart_putc(byte); - e2e: 81 2f mov r24, r17 - e30: c9 dc rcall .-1646 ; 0x7c4 + eba: 81 2f mov r24, r17 + ebc: c9 dc rcall .-1646 ; 0x850 } } } - e32: df 91 pop r29 - e34: cf 91 pop r28 - e36: 1f 91 pop r17 - e38: 0f 91 pop r16 - e3a: ff 90 pop r15 - e3c: ef 90 pop r14 - e3e: df 90 pop r13 - e40: cf 90 pop r12 - e42: 08 95 ret - -00000e44
: + ebe: df 91 pop r29 + ec0: cf 91 pop r28 + ec2: 1f 91 pop r17 + ec4: 0f 91 pop r16 + ec6: ff 90 pop r15 + ec8: ef 90 pop r14 + eca: df 90 pop r13 + ecc: cf 90 pop r12 + ece: 08 95 ret + +00000ed0
: int main(void) { - e44: 0f 93 push r16 - e46: 1f 93 push r17 - e48: df 93 push r29 - e4a: cf 93 push r28 - e4c: 0f 92 push r0 - e4e: cd b7 in r28, 0x3d ; 61 - e50: de b7 in r29, 0x3e ; 62 + ed0: 0f 93 push r16 + ed2: 1f 93 push r17 + ed4: df 93 push r29 + ed6: cf 93 push r28 + ed8: 0f 92 push r0 + eda: cd b7 in r28, 0x3d ; 61 + edc: de b7 in r29, 0x3e ; 62 init_motors(); - e52: 7c dd rcall .-1288 ; 0x94c + ede: 7c dd rcall .-1288 ; 0x9d8 + init_leds(); + ee0: 77 db rcall .-2322 ; 0x5d0 + init_sw(); + ee2: 97 db rcall .-2258 ; 0x612 + char dummy; uint8_t field_val = 0; SetupHardware(); - e54: 08 dc rcall .-2032 ; 0x666 + ee4: 06 dc rcall .-2036 ; 0x6f2 RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data)); - e56: 82 e5 ldi r24, 0x52 ; 82 - e58: 91 e0 ldi r25, 0x01 ; 1 - e5a: 6e e5 ldi r22, 0x5E ; 94 - e5c: 71 e0 ldi r23, 0x01 ; 1 - e5e: 31 da rcall .-2974 ; 0x2c2 + ee6: 82 e5 ldi r24, 0x52 ; 82 + ee8: 91 e0 ldi r25, 0x01 ; 1 + eea: 6e e5 ldi r22, 0x5E ; 94 + eec: 71 e0 ldi r23, 0x01 ; 1 + eee: e9 d9 rcall .-3118 ; 0x2c2 RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data)); - e60: 8e ed ldi r24, 0xDE ; 222 - e62: 91 e0 ldi r25, 0x01 ; 1 - e64: 6a ee ldi r22, 0xEA ; 234 - e66: 71 e0 ldi r23, 0x01 ; 1 - e68: 2c da rcall .-2984 ; 0x2c2 + ef0: 8e ed ldi r24, 0xDE ; 222 + ef2: 91 e0 ldi r25, 0x01 ; 1 + ef4: 6a ee ldi r22, 0xEA ; 234 + ef6: 71 e0 ldi r23, 0x01 ; 1 + ef8: e4 d9 rcall .-3128 ; 0x2c2 static inline void GlobalInterruptEnable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) sei(); - e6a: 78 94 sei + efa: 78 94 sei // LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); GlobalInterruptEnable(); touchpad_init(); // you need to call this to setup the I/O pin! - e6c: 6c db rcall .-2344 ; 0x546 - e6e: 8f ef ldi r24, 0xFF ; 255 - e70: 99 e6 ldi r25, 0x69 ; 105 - e72: a8 e1 ldi r26, 0x18 ; 24 - e74: 81 50 subi r24, 0x01 ; 1 - e76: 90 40 sbci r25, 0x00 ; 0 - e78: a0 40 sbci r26, 0x00 ; 0 - e7a: e1 f7 brne .-8 ; 0xe74 - e7c: 00 c0 rjmp .+0 ; 0xe7e - e7e: 00 00 nop + efc: 24 db rcall .-2488 ; 0x546 + efe: 8f ef ldi r24, 0xFF ; 255 + f00: 99 e6 ldi r25, 0x69 ; 105 + f02: a8 e1 ldi r26, 0x18 ; 24 + f04: 81 50 subi r24, 0x01 ; 1 + f06: 90 40 sbci r25, 0x00 ; 0 + f08: a0 40 sbci r26, 0x00 ; 0 + f0a: e1 f7 brne .-8 ; 0xf04 + f0c: 00 c0 rjmp .+0 ; 0xf0e + f0e: 00 00 nop _delay_ms(500); sei(); - e80: 78 94 sei + f10: 78 94 sei uint16_t loopcounter=0; // uart_puts("you selected the relative position demo modus:\n\r"); touchpad_set_rel_mode_100dpi();// use touchpad in relative mode - e82: 72 db rcall .-2332 ; 0x568 + f12: 2a db rcall .-2476 ; 0x568 // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution int16_t x, y = 0; int8_t dx, dy = 0; uint8_t busy = 0, last_busy = 0; - e84: 10 e0 ldi r17, 0x00 ; 0 - e86: 01 c0 rjmp .+2 ; 0xe8a + f14: 10 e0 ldi r17, 0x00 ; 0 + f16: 01 c0 rjmp .+2 ; 0xf1a } } } int main(void) { - e88: 18 2f mov r17, r24 + f18: 18 2f mov r17, r24 int8_t dx, dy = 0; uint8_t busy = 0, last_busy = 0; while (1) { + + set_led0(sw0_state()); + f1a: 82 db rcall .-2300 ; 0x620 + f1c: 5d db rcall .-2374 ; 0x5d8 + set_led1(sw1_state()); + f1e: 8a db rcall .-2284 ; 0x634 + f20: 65 db rcall .-2358 ; 0x5ec + set_led2(sw2_state()); + f22: 92 db rcall .-2268 ; 0x648 + f24: 69 db rcall .-2350 ; 0x5f8 Usb2SerialTask(); - e8a: a2 db rcall .-2236 ; 0x5d0 + f26: 9a db rcall .-2252 ; 0x65c // loopcounter++; // if(loopcounter<2000) { // continue; // } // loopcounter=0; parse_command(); // read data from virtual comport - e8c: 2c de rcall .-936 ; 0xae6 + f28: 24 de rcall .-952 ; 0xb72 touchpad_read(); // read data from touchpad - e8e: 63 db rcall .-2362 ; 0x556 + f2a: 15 db rcall .-2518 ; 0x556 dx = -delta_x();// returns the amount your finger has moved in x direction since last readout - e90: 8f db rcall .-2274 ; 0x5b0 - e92: 08 2f mov r16, r24 + f2c: 41 db rcall .-2430 ; 0x5b0 + f2e: 08 2f mov r16, r24 dy = -delta_y();// returns the amount your finger has moved in y direction since last readout - e94: 7d db rcall .-2310 ; 0x590 + f30: 2f db rcall .-2466 ; 0x590 // } // loopcounter=0; parse_command(); // read data from virtual comport touchpad_read(); // read data from touchpad dx = -delta_x();// returns the amount your finger has moved in x direction since last readout - e96: 01 95 neg r16 + f32: 01 95 neg r16 dy = -delta_y();// returns the amount your finger has moved in y direction since last readout // increment/decrement some dummy variables with the plate_pos_x += dx; - e98: 40 2f mov r20, r16 - e9a: 55 27 eor r21, r21 - e9c: 47 fd sbrc r20, 7 - e9e: 50 95 com r21 - ea0: 20 91 4e 01 lds r18, 0x014E - ea4: 30 91 4f 01 lds r19, 0x014F - ea8: 24 0f add r18, r20 - eaa: 35 1f adc r19, r21 - eac: 30 93 4f 01 sts 0x014F, r19 - eb0: 20 93 4e 01 sts 0x014E, r18 + f34: 40 2f mov r20, r16 + f36: 55 27 eor r21, r21 + f38: 47 fd sbrc r20, 7 + f3a: 50 95 com r21 + f3c: 20 91 4e 01 lds r18, 0x014E + f40: 30 91 4f 01 lds r19, 0x014F + f44: 24 0f add r18, r20 + f46: 35 1f adc r19, r21 + f48: 30 93 4f 01 sts 0x014F, r19 + f4c: 20 93 4e 01 sts 0x014E, r18 // loopcounter=0; parse_command(); // read data from virtual comport touchpad_read(); // read data from touchpad dx = -delta_x();// returns the amount your finger has moved in x direction since last readout dy = -delta_y();// returns the amount your finger has moved in y direction since last readout - eb4: 81 95 neg r24 + f50: 81 95 neg r24 // increment/decrement some dummy variables with the plate_pos_x += dx; plate_pos_y += dy; - eb6: 68 2f mov r22, r24 - eb8: 77 27 eor r23, r23 - eba: 67 fd sbrc r22, 7 - ebc: 70 95 com r23 - ebe: 80 91 50 01 lds r24, 0x0150 - ec2: 90 91 51 01 lds r25, 0x0151 - ec6: 86 0f add r24, r22 - ec8: 97 1f adc r25, r23 - eca: 90 93 51 01 sts 0x0151, r25 - ece: 80 93 50 01 sts 0x0150, r24 + f52: 68 2f mov r22, r24 + f54: 77 27 eor r23, r23 + f56: 67 fd sbrc r22, 7 + f58: 70 95 com r23 + f5a: 80 91 50 01 lds r24, 0x0150 + f5e: 90 91 51 01 lds r25, 0x0151 + f62: 86 0f add r24, r22 + f64: 97 1f adc r25, r23 + f66: 90 93 51 01 sts 0x0151, r25 + f6a: 80 93 50 01 sts 0x0150, r24 last_busy = busy; busy = move_plate(dx,dy); - ed2: ca 01 movw r24, r20 - ed4: 7a dd rcall .-1292 ; 0x9ca + f6e: ca 01 movw r24, r20 + f70: 72 dd rcall .-1308 ; 0xa56 if (last_busy && !(busy)){ - ed6: 11 23 and r17, r17 - ed8: b9 f2 breq .-82 ; 0xe88 - eda: 88 23 and r24, r24 - edc: a9 f6 brne .-86 ; 0xe88 + f72: 11 23 and r17, r17 + f74: 89 f2 breq .-94 ; 0xf18 + f76: 88 23 and r24, r24 + f78: 79 f6 brne .-98 ; 0xf18 pos_report(); - ede: 89 83 std Y+1, r24 ; 0x01 - ee0: ef dd rcall .-1058 ; 0xac0 - ee2: 89 81 ldd r24, Y+1 ; 0x01 - ee4: d1 cf rjmp .-94 ; 0xe88 + f7a: 89 83 std Y+1, r24 ; 0x01 + f7c: e7 dd rcall .-1074 ; 0xb4c + f7e: 89 81 ldd r24, Y+1 ; 0x01 + f80: cb cf rjmp .-106 ; 0xf18 -00000ee6 : +00000f82 : const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) - ee6: 92 30 cpi r25, 0x02 ; 2 - ee8: 29 f0 breq .+10 ; 0xef4 - eea: 93 30 cpi r25, 0x03 ; 3 - eec: 41 f0 breq .+16 ; 0xefe - eee: 91 30 cpi r25, 0x01 ; 1 - ef0: e9 f4 brne .+58 ; 0xf2c - ef2: 17 c0 rjmp .+46 ; 0xf22 + f82: 92 30 cpi r25, 0x02 ; 2 + f84: 29 f0 breq .+10 ; 0xf90 + f86: 93 30 cpi r25, 0x03 ; 3 + f88: 41 f0 breq .+16 ; 0xf9a + f8a: 91 30 cpi r25, 0x01 ; 1 + f8c: e9 f4 brne .+58 ; 0xfc8 + f8e: 17 c0 rjmp .+46 ; 0xfbe Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); - ef4: 2e e3 ldi r18, 0x3E ; 62 - ef6: 30 e0 ldi r19, 0x00 ; 0 + f90: 2e e3 ldi r18, 0x3E ; 62 + f92: 30 e0 ldi r19, 0x00 ; 0 case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; - ef8: ea ea ldi r30, 0xAA ; 170 - efa: f0 e0 ldi r31, 0x00 ; 0 + f94: ea ea ldi r30, 0xAA ; 170 + f96: f0 e0 ldi r31, 0x00 ; 0 Size = sizeof(USB_Descriptor_Configuration_t); break; - efc: 1b c0 rjmp .+54 ; 0xf34 + f98: 1b c0 rjmp .+54 ; 0xfd0 case DTYPE_String: switch (DescriptorNumber) - efe: 81 30 cpi r24, 0x01 ; 1 - f00: 41 f0 breq .+16 ; 0xf12 - f02: 81 30 cpi r24, 0x01 ; 1 - f04: 18 f0 brcs .+6 ; 0xf0c - f06: 82 30 cpi r24, 0x02 ; 2 - f08: 89 f4 brne .+34 ; 0xf2c - f0a: 06 c0 rjmp .+12 ; 0xf18 + f9a: 81 30 cpi r24, 0x01 ; 1 + f9c: 41 f0 breq .+16 ; 0xfae + f9e: 81 30 cpi r24, 0x01 ; 1 + fa0: 18 f0 brcs .+6 ; 0xfa8 + fa2: 82 30 cpi r24, 0x02 ; 2 + fa4: 89 f4 brne .+34 ; 0xfc8 + fa6: 06 c0 rjmp .+12 ; 0xfb4 { case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); - f0c: e8 ee ldi r30, 0xE8 ; 232 - f0e: f0 e0 ldi r31, 0x00 ; 0 - f10: 05 c0 rjmp .+10 ; 0xf1c + fa8: e8 ee ldi r30, 0xE8 ; 232 + faa: f0 e0 ldi r31, 0x00 ; 0 + fac: 05 c0 rjmp .+10 ; 0xfb8 break; case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); - f12: ec ee ldi r30, 0xEC ; 236 - f14: f0 e0 ldi r31, 0x00 ; 0 - f16: 02 c0 rjmp .+4 ; 0xf1c + fae: ec ee ldi r30, 0xEC ; 236 + fb0: f0 e0 ldi r31, 0x00 ; 0 + fb2: 02 c0 rjmp .+4 ; 0xfb8 break; case 0x02: Address = &ProductString; Size = pgm_read_byte(&ProductString.Header.Size); - f18: e6 e0 ldi r30, 0x06 ; 6 - f1a: f1 e0 ldi r31, 0x01 ; 1 - f1c: 24 91 lpm r18, Z+ - f1e: 30 e0 ldi r19, 0x00 ; 0 + fb4: e6 e0 ldi r30, 0x06 ; 6 + fb6: f1 e0 ldi r31, 0x01 ; 1 + fb8: 24 91 lpm r18, Z+ + fba: 30 e0 ldi r19, 0x00 ; 0 break; - f20: 09 c0 rjmp .+18 ; 0xf34 + fbc: 09 c0 rjmp .+18 ; 0xfd0 switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); - f22: 22 e1 ldi r18, 0x12 ; 18 - f24: 30 e0 ldi r19, 0x00 ; 0 + fbe: 22 e1 ldi r18, 0x12 ; 18 + fc0: 30 e0 ldi r19, 0x00 ; 0 uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; - f26: e8 e9 ldi r30, 0x98 ; 152 - f28: f0 e0 ldi r31, 0x00 ; 0 - f2a: 04 c0 rjmp .+8 ; 0xf34 + fc2: e8 e9 ldi r30, 0x98 ; 152 + fc4: f0 e0 ldi r31, 0x00 ; 0 + fc6: 04 c0 rjmp .+8 ; 0xfd0 { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - f2c: 20 e0 ldi r18, 0x00 ; 0 - f2e: 30 e0 ldi r19, 0x00 ; 0 + fc8: 20 e0 ldi r18, 0x00 ; 0 + fca: 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; - f30: e0 e0 ldi r30, 0x00 ; 0 - f32: f0 e0 ldi r31, 0x00 ; 0 + fcc: e0 e0 ldi r30, 0x00 ; 0 + fce: f0 e0 ldi r31, 0x00 ; 0 } break; } *DescriptorAddress = Address; - f34: da 01 movw r26, r20 - f36: 11 96 adiw r26, 0x01 ; 1 - f38: fc 93 st X, r31 - f3a: ee 93 st -X, r30 + fd0: da 01 movw r26, r20 + fd2: 11 96 adiw r26, 0x01 ; 1 + fd4: fc 93 st X, r31 + fd6: ee 93 st -X, r30 return Size; } - f3c: c9 01 movw r24, r18 - f3e: 08 95 ret + fd8: c9 01 movw r24, r18 + fda: 08 95 ret -00000f40 : +00000fdc : #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, uint16_t Length) { uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - f40: 28 2f mov r18, r24 - f42: 39 2f mov r19, r25 - f44: f9 01 movw r30, r18 + fdc: 28 2f mov r18, r24 + fde: 39 2f mov r19, r25 + fe0: f9 01 movw r30, r18 bool LastPacketFull = false; if (Length > USB_ControlRequest.wLength) - f46: 80 91 d2 02 lds r24, 0x02D2 - f4a: 90 91 d3 02 lds r25, 0x02D3 - f4e: 86 17 cp r24, r22 - f50: 97 07 cpc r25, r23 - f52: 18 f4 brcc .+6 ; 0xf5a - f54: bc 01 movw r22, r24 - f56: 20 e0 ldi r18, 0x00 ; 0 - f58: 34 c0 rjmp .+104 ; 0xfc2 + fe2: 80 91 d2 02 lds r24, 0x02D2 + fe6: 90 91 d3 02 lds r25, 0x02D3 + fea: 86 17 cp r24, r22 + fec: 97 07 cpc r25, r23 + fee: 18 f4 brcc .+6 ; 0xff6 + ff0: bc 01 movw r22, r24 + ff2: 20 e0 ldi r18, 0x00 ; 0 + ff4: 34 c0 rjmp .+104 ; 0x105e Length = USB_ControlRequest.wLength; else if (!(Length)) - f5a: 61 15 cp r22, r1 - f5c: 71 05 cpc r23, r1 - f5e: d9 f7 brne .-10 ; 0xf56 + ff6: 61 15 cp r22, r1 + ff8: 71 05 cpc r23, r1 + ffa: d9 f7 brne .-10 ; 0xff2 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - f60: 80 91 e8 00 lds r24, 0x00E8 - f64: 8e 77 andi r24, 0x7E ; 126 - f66: 80 93 e8 00 sts 0x00E8, r24 - f6a: f5 cf rjmp .-22 ; 0xf56 + ffc: 80 91 e8 00 lds r24, 0x00E8 + 1000: 8e 77 andi r24, 0x7E ; 126 + 1002: 80 93 e8 00 sts 0x00E8, r24 + 1006: f5 cf rjmp .-22 ; 0xff2 Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - f6c: 8e b3 in r24, 0x1e ; 30 + 1008: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - f6e: 88 23 and r24, r24 - f70: e9 f1 breq .+122 ; 0xfec + 100a: 88 23 and r24, r24 + 100c: e9 f1 breq .+122 ; 0x1088 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - f72: 85 30 cpi r24, 0x05 ; 5 - f74: b9 f1 breq .+110 ; 0xfe4 + 100e: 85 30 cpi r24, 0x05 ; 5 + 1010: b9 f1 breq .+110 ; 0x1080 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - f76: 80 91 e8 00 lds r24, 0x00E8 + 1012: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - f7a: 83 fd sbrc r24, 3 - f7c: 35 c0 rjmp .+106 ; 0xfe8 + 1016: 83 fd sbrc r24, 3 + 1018: 35 c0 rjmp .+106 ; 0x1084 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - f7e: 80 91 e8 00 lds r24, 0x00E8 + 101a: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - f82: 82 fd sbrc r24, 2 - f84: 29 c0 rjmp .+82 ; 0xfd8 + 101e: 82 fd sbrc r24, 2 + 1020: 29 c0 rjmp .+82 ; 0x1074 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - f86: 80 91 e8 00 lds r24, 0x00E8 + 1022: 80 91 e8 00 lds r24, 0x00E8 break; if (Endpoint_IsINReady()) - f8a: 80 ff sbrs r24, 0 - f8c: 1a c0 rjmp .+52 ; 0xfc2 + 1026: 80 ff sbrs r24, 0 + 1028: 1a c0 rjmp .+52 ; 0x105e #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - f8e: 80 91 f2 00 lds r24, 0x00F2 - f92: 90 e0 ldi r25, 0x00 ; 0 + 102a: 80 91 f2 00 lds r24, 0x00F2 + 102e: 90 e0 ldi r25, 0x00 ; 0 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - f94: 06 c0 rjmp .+12 ; 0xfa2 + 1030: 06 c0 rjmp .+12 ; 0x103e { TEMPLATE_TRANSFER_BYTE(DataStream); - f96: 21 91 ld r18, Z+ + 1032: 21 91 ld r18, Z+ * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - f98: 20 93 f1 00 sts 0x00F1, r18 + 1034: 20 93 f1 00 sts 0x00F1, r18 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; - f9c: 61 50 subi r22, 0x01 ; 1 - f9e: 70 40 sbci r23, 0x00 ; 0 + 1038: 61 50 subi r22, 0x01 ; 1 + 103a: 70 40 sbci r23, 0x00 ; 0 BytesInEndpoint++; - fa0: 01 96 adiw r24, 0x01 ; 1 + 103c: 01 96 adiw r24, 0x01 ; 1 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - fa2: 61 15 cp r22, r1 - fa4: 71 05 cpc r23, r1 - fa6: 19 f0 breq .+6 ; 0xfae - fa8: 88 30 cpi r24, 0x08 ; 8 - faa: 91 05 cpc r25, r1 - fac: a0 f3 brcs .-24 ; 0xf96 + 103e: 61 15 cp r22, r1 + 1040: 71 05 cpc r23, r1 + 1042: 19 f0 breq .+6 ; 0x104a + 1044: 88 30 cpi r24, 0x08 ; 8 + 1046: 91 05 cpc r25, r1 + 1048: a0 f3 brcs .-24 ; 0x1032 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - fae: 21 e0 ldi r18, 0x01 ; 1 - fb0: 88 30 cpi r24, 0x08 ; 8 - fb2: 91 05 cpc r25, r1 - fb4: 09 f0 breq .+2 ; 0xfb8 - fb6: 20 e0 ldi r18, 0x00 ; 0 + 104a: 21 e0 ldi r18, 0x01 ; 1 + 104c: 88 30 cpi r24, 0x08 ; 8 + 104e: 91 05 cpc r25, r1 + 1050: 09 f0 breq .+2 ; 0x1054 + 1052: 20 e0 ldi r18, 0x00 ; 0 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - fb8: 80 91 e8 00 lds r24, 0x00E8 - fbc: 8e 77 andi r24, 0x7E ; 126 - fbe: 80 93 e8 00 sts 0x00E8, r24 + 1054: 80 91 e8 00 lds r24, 0x00E8 + 1058: 8e 77 andi r24, 0x7E ; 126 + 105a: 80 93 e8 00 sts 0x00E8, r24 if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) - fc2: 61 15 cp r22, r1 - fc4: 71 05 cpc r23, r1 - fc6: 91 f6 brne .-92 ; 0xf6c - fc8: 22 23 and r18, r18 - fca: 81 f6 brne .-96 ; 0xf6c - fcc: 05 c0 rjmp .+10 ; 0xfd8 + 105e: 61 15 cp r22, r1 + 1060: 71 05 cpc r23, r1 + 1062: 91 f6 brne .-92 ; 0x1008 + 1064: 22 23 and r18, r18 + 1066: 81 f6 brne .-96 ; 0x1008 + 1068: 05 c0 rjmp .+10 ; 0x1074 } } while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - fce: 8e b3 in r24, 0x1e ; 30 + 106a: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - fd0: 88 23 and r24, r24 - fd2: 61 f0 breq .+24 ; 0xfec + 106c: 88 23 and r24, r24 + 106e: 61 f0 breq .+24 ; 0x1088 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - fd4: 85 30 cpi r24, 0x05 ; 5 - fd6: 61 f0 breq .+24 ; 0xff0 + 1070: 85 30 cpi r24, 0x05 ; 5 + 1072: 61 f0 breq .+24 ; 0x108c * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - fd8: 80 91 e8 00 lds r24, 0x00E8 + 1074: 80 91 e8 00 lds r24, 0x00E8 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - fdc: 82 ff sbrs r24, 2 - fde: f7 cf rjmp .-18 ; 0xfce + 1078: 82 ff sbrs r24, 2 + 107a: f7 cf rjmp .-18 ; 0x106a return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - fe0: 80 e0 ldi r24, 0x00 ; 0 - fe2: 08 95 ret + 107c: 80 e0 ldi r24, 0x00 ; 0 + 107e: 08 95 ret 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; - fe4: 83 e0 ldi r24, 0x03 ; 3 - fe6: 08 95 ret + 1080: 83 e0 ldi r24, 0x03 ; 3 + 1082: 08 95 ret else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - fe8: 81 e0 ldi r24, 0x01 ; 1 - fea: 08 95 ret + 1084: 81 e0 ldi r24, 0x01 ; 1 + 1086: 08 95 ret while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - fec: 82 e0 ldi r24, 0x02 ; 2 - fee: 08 95 ret + 1088: 82 e0 ldi r24, 0x02 ; 2 + 108a: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - ff0: 83 e0 ldi r24, 0x03 ; 3 + 108c: 83 e0 ldi r24, 0x03 ; 3 } return ENDPOINT_RWCSTREAM_NoError; } - ff2: 08 95 ret + 108e: 08 95 ret -00000ff4 : +00001090 : #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, uint16_t Length) { uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - ff4: e8 2f mov r30, r24 - ff6: f9 2f mov r31, r25 + 1090: e8 2f mov r30, r24 + 1092: f9 2f mov r31, r25 bool LastPacketFull = false; if (Length > USB_ControlRequest.wLength) - ff8: 80 91 d2 02 lds r24, 0x02D2 - ffc: 90 91 d3 02 lds r25, 0x02D3 - 1000: 86 17 cp r24, r22 - 1002: 97 07 cpc r25, r23 - 1004: 18 f4 brcc .+6 ; 0x100c - 1006: bc 01 movw r22, r24 - 1008: 20 e0 ldi r18, 0x00 ; 0 - 100a: 36 c0 rjmp .+108 ; 0x1078 + 1094: 80 91 d2 02 lds r24, 0x02D2 + 1098: 90 91 d3 02 lds r25, 0x02D3 + 109c: 86 17 cp r24, r22 + 109e: 97 07 cpc r25, r23 + 10a0: 18 f4 brcc .+6 ; 0x10a8 + 10a2: bc 01 movw r22, r24 + 10a4: 20 e0 ldi r18, 0x00 ; 0 + 10a6: 36 c0 rjmp .+108 ; 0x1114 Length = USB_ControlRequest.wLength; else if (!(Length)) - 100c: 61 15 cp r22, r1 - 100e: 71 05 cpc r23, r1 - 1010: d9 f7 brne .-10 ; 0x1008 + 10a8: 61 15 cp r22, r1 + 10aa: 71 05 cpc r23, r1 + 10ac: d9 f7 brne .-10 ; 0x10a4 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 1012: 80 91 e8 00 lds r24, 0x00E8 - 1016: 8e 77 andi r24, 0x7E ; 126 - 1018: 80 93 e8 00 sts 0x00E8, r24 - 101c: f5 cf rjmp .-22 ; 0x1008 + 10ae: 80 91 e8 00 lds r24, 0x00E8 + 10b2: 8e 77 andi r24, 0x7E ; 126 + 10b4: 80 93 e8 00 sts 0x00E8, r24 + 10b8: f5 cf rjmp .-22 ; 0x10a4 Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 101e: 8e b3 in r24, 0x1e ; 30 + 10ba: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 1020: 88 23 and r24, r24 - 1022: 09 f4 brne .+2 ; 0x1026 - 1024: 3e c0 rjmp .+124 ; 0x10a2 + 10bc: 88 23 and r24, r24 + 10be: 09 f4 brne .+2 ; 0x10c2 + 10c0: 3e c0 rjmp .+124 ; 0x113e return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 1026: 85 30 cpi r24, 0x05 ; 5 - 1028: c1 f1 breq .+112 ; 0x109a + 10c2: 85 30 cpi r24, 0x05 ; 5 + 10c4: c1 f1 breq .+112 ; 0x1136 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 102a: 80 91 e8 00 lds r24, 0x00E8 + 10c6: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - 102e: 83 fd sbrc r24, 3 - 1030: 36 c0 rjmp .+108 ; 0x109e + 10ca: 83 fd sbrc r24, 3 + 10cc: 36 c0 rjmp .+108 ; 0x113a * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 1032: 80 91 e8 00 lds r24, 0x00E8 + 10ce: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - 1036: 82 fd sbrc r24, 2 - 1038: 2a c0 rjmp .+84 ; 0x108e + 10d2: 82 fd sbrc r24, 2 + 10d4: 2a c0 rjmp .+84 ; 0x112a * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 103a: 80 91 e8 00 lds r24, 0x00E8 + 10d6: 80 91 e8 00 lds r24, 0x00E8 break; if (Endpoint_IsINReady()) - 103e: 80 ff sbrs r24, 0 - 1040: 1b c0 rjmp .+54 ; 0x1078 + 10da: 80 ff sbrs r24, 0 + 10dc: 1b c0 rjmp .+54 ; 0x1114 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 1042: 80 91 f2 00 lds r24, 0x00F2 - 1046: 90 e0 ldi r25, 0x00 ; 0 + 10de: 80 91 f2 00 lds r24, 0x00F2 + 10e2: 90 e0 ldi r25, 0x00 ; 0 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 1048: 07 c0 rjmp .+14 ; 0x1058 + 10e4: 07 c0 rjmp .+14 ; 0x10f4 { TEMPLATE_TRANSFER_BYTE(DataStream); - 104a: 24 91 lpm r18, Z+ + 10e6: 24 91 lpm r18, Z+ * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 104c: 20 93 f1 00 sts 0x00F1, r18 + 10e8: 20 93 f1 00 sts 0x00F1, r18 TEMPLATE_BUFFER_MOVE(DataStream, 1); - 1050: 31 96 adiw r30, 0x01 ; 1 + 10ec: 31 96 adiw r30, 0x01 ; 1 Length--; - 1052: 61 50 subi r22, 0x01 ; 1 - 1054: 70 40 sbci r23, 0x00 ; 0 + 10ee: 61 50 subi r22, 0x01 ; 1 + 10f0: 70 40 sbci r23, 0x00 ; 0 BytesInEndpoint++; - 1056: 01 96 adiw r24, 0x01 ; 1 + 10f2: 01 96 adiw r24, 0x01 ; 1 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 1058: 61 15 cp r22, r1 - 105a: 71 05 cpc r23, r1 - 105c: 19 f0 breq .+6 ; 0x1064 - 105e: 88 30 cpi r24, 0x08 ; 8 - 1060: 91 05 cpc r25, r1 - 1062: 98 f3 brcs .-26 ; 0x104a + 10f4: 61 15 cp r22, r1 + 10f6: 71 05 cpc r23, r1 + 10f8: 19 f0 breq .+6 ; 0x1100 + 10fa: 88 30 cpi r24, 0x08 ; 8 + 10fc: 91 05 cpc r25, r1 + 10fe: 98 f3 brcs .-26 ; 0x10e6 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 1064: 21 e0 ldi r18, 0x01 ; 1 - 1066: 88 30 cpi r24, 0x08 ; 8 - 1068: 91 05 cpc r25, r1 - 106a: 09 f0 breq .+2 ; 0x106e - 106c: 20 e0 ldi r18, 0x00 ; 0 + 1100: 21 e0 ldi r18, 0x01 ; 1 + 1102: 88 30 cpi r24, 0x08 ; 8 + 1104: 91 05 cpc r25, r1 + 1106: 09 f0 breq .+2 ; 0x110a + 1108: 20 e0 ldi r18, 0x00 ; 0 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 106e: 80 91 e8 00 lds r24, 0x00E8 - 1072: 8e 77 andi r24, 0x7E ; 126 - 1074: 80 93 e8 00 sts 0x00E8, r24 + 110a: 80 91 e8 00 lds r24, 0x00E8 + 110e: 8e 77 andi r24, 0x7E ; 126 + 1110: 80 93 e8 00 sts 0x00E8, r24 if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) - 1078: 61 15 cp r22, r1 - 107a: 71 05 cpc r23, r1 - 107c: 81 f6 brne .-96 ; 0x101e - 107e: 22 23 and r18, r18 - 1080: 71 f6 brne .-100 ; 0x101e - 1082: 05 c0 rjmp .+10 ; 0x108e + 1114: 61 15 cp r22, r1 + 1116: 71 05 cpc r23, r1 + 1118: 81 f6 brne .-96 ; 0x10ba + 111a: 22 23 and r18, r18 + 111c: 71 f6 brne .-100 ; 0x10ba + 111e: 05 c0 rjmp .+10 ; 0x112a } } while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 1084: 8e b3 in r24, 0x1e ; 30 + 1120: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 1086: 88 23 and r24, r24 - 1088: 61 f0 breq .+24 ; 0x10a2 + 1122: 88 23 and r24, r24 + 1124: 61 f0 breq .+24 ; 0x113e return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 108a: 85 30 cpi r24, 0x05 ; 5 - 108c: 61 f0 breq .+24 ; 0x10a6 + 1126: 85 30 cpi r24, 0x05 ; 5 + 1128: 61 f0 breq .+24 ; 0x1142 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 108e: 80 91 e8 00 lds r24, 0x00E8 + 112a: 80 91 e8 00 lds r24, 0x00E8 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - 1092: 82 ff sbrs r24, 2 - 1094: f7 cf rjmp .-18 ; 0x1084 + 112e: 82 ff sbrs r24, 2 + 1130: f7 cf rjmp .-18 ; 0x1120 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - 1096: 80 e0 ldi r24, 0x00 ; 0 - 1098: 08 95 ret + 1132: 80 e0 ldi r24, 0x00 ; 0 + 1134: 08 95 ret 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; - 109a: 83 e0 ldi r24, 0x03 ; 3 - 109c: 08 95 ret + 1136: 83 e0 ldi r24, 0x03 ; 3 + 1138: 08 95 ret else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - 109e: 81 e0 ldi r24, 0x01 ; 1 - 10a0: 08 95 ret + 113a: 81 e0 ldi r24, 0x01 ; 1 + 113c: 08 95 ret while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 10a2: 82 e0 ldi r24, 0x02 ; 2 - 10a4: 08 95 ret + 113e: 82 e0 ldi r24, 0x02 ; 2 + 1140: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - 10a6: 83 e0 ldi r24, 0x03 ; 3 + 1142: 83 e0 ldi r24, 0x03 ; 3 } return ENDPOINT_RWCSTREAM_NoError; } - 10a8: 08 95 ret + 1144: 08 95 ret -000010aa : +00001146 : UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - 10aa: 98 2f mov r25, r24 - 10ac: 2c c0 rjmp .+88 ; 0x1106 + 1146: 98 2f mov r25, r24 + 1148: 2c c0 rjmp .+88 ; 0x11a2 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 10ae: 29 2f mov r18, r25 - 10b0: 2f 70 andi r18, 0x0F ; 15 - 10b2: 20 93 e9 00 sts 0x00E9, r18 + 114a: 29 2f mov r18, r25 + 114c: 2f 70 andi r18, 0x0F ; 15 + 114e: 20 93 e9 00 sts 0x00E9, r18 uint8_t UECFG1XTemp; uint8_t UEIENXTemp; Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) - 10b6: 98 17 cp r25, r24 - 10b8: 39 f0 breq .+14 ; 0x10c8 + 1152: 98 17 cp r25, r24 + 1154: 39 f0 breq .+14 ; 0x1164 UECFG1XTemp = UECFG1XData; UEIENXTemp = 0; } else { UECFG0XTemp = UECFG0X; - 10ba: 70 91 ec 00 lds r23, 0x00EC + 1156: 70 91 ec 00 lds r23, 0x00EC UECFG1XTemp = UECFG1X; - 10be: 20 91 ed 00 lds r18, 0x00ED + 115a: 20 91 ed 00 lds r18, 0x00ED UEIENXTemp = UEIENX; - 10c2: 50 91 f0 00 lds r21, 0x00F0 - 10c6: 03 c0 rjmp .+6 ; 0x10ce + 115e: 50 91 f0 00 lds r21, 0x00F0 + 1162: 03 c0 rjmp .+6 ; 0x116a Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0XTemp = UECFG0XData; UECFG1XTemp = UECFG1XData; - 10c8: 24 2f mov r18, r20 + 1164: 24 2f mov r18, r20 Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0XTemp = UECFG0XData; - 10ca: 76 2f mov r23, r22 + 1166: 76 2f mov r23, r22 UECFG1XTemp = UECFG1XData; UEIENXTemp = 0; - 10cc: 50 e0 ldi r21, 0x00 ; 0 + 1168: 50 e0 ldi r21, 0x00 ; 0 UECFG0XTemp = UECFG0X; UECFG1XTemp = UECFG1X; UEIENXTemp = UEIENX; } if (!(UECFG1XTemp & (1 << ALLOC))) - 10ce: 21 ff sbrs r18, 1 - 10d0: 19 c0 rjmp .+50 ; 0x1104 + 116a: 21 ff sbrs r18, 1 + 116c: 19 c0 rjmp .+50 ; 0x11a0 * to and from a host. */ static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_DisableEndpoint(void) { UECONX &= ~(1 << EPEN); - 10d2: 30 91 eb 00 lds r19, 0x00EB - 10d6: 3e 7f andi r19, 0xFE ; 254 - 10d8: 30 93 eb 00 sts 0x00EB, r19 + 116e: 30 91 eb 00 lds r19, 0x00EB + 1172: 3e 7f andi r19, 0xFE ; 254 + 1174: 30 93 eb 00 sts 0x00EB, r19 continue; Endpoint_DisableEndpoint(); UECFG1X &= ~(1 << ALLOC); - 10dc: 30 91 ed 00 lds r19, 0x00ED - 10e0: 3d 7f andi r19, 0xFD ; 253 - 10e2: 30 93 ed 00 sts 0x00ED, r19 + 1178: 30 91 ed 00 lds r19, 0x00ED + 117c: 3d 7f andi r19, 0xFD ; 253 + 117e: 30 93 ed 00 sts 0x00ED, r19 * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint(). */ static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_EnableEndpoint(void) { UECONX |= (1 << EPEN); - 10e6: 30 91 eb 00 lds r19, 0x00EB - 10ea: 31 60 ori r19, 0x01 ; 1 - 10ec: 30 93 eb 00 sts 0x00EB, r19 + 1182: 30 91 eb 00 lds r19, 0x00EB + 1186: 31 60 ori r19, 0x01 ; 1 + 1188: 30 93 eb 00 sts 0x00EB, r19 Endpoint_EnableEndpoint(); UECFG0X = UECFG0XTemp; - 10f0: 70 93 ec 00 sts 0x00EC, r23 + 118c: 70 93 ec 00 sts 0x00EC, r23 UECFG1X = UECFG1XTemp; - 10f4: 20 93 ed 00 sts 0x00ED, r18 + 1190: 20 93 ed 00 sts 0x00ED, r18 UEIENX = UEIENXTemp; - 10f8: 50 93 f0 00 sts 0x00F0, r21 + 1194: 50 93 f0 00 sts 0x00F0, r21 * \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise. */ static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsConfigured(void) { return ((UESTA0X & (1 << CFGOK)) ? true : false); - 10fc: 20 91 ee 00 lds r18, 0x00EE + 1198: 20 91 ee 00 lds r18, 0x00EE if (!(Endpoint_IsConfigured())) - 1100: 27 ff sbrs r18, 7 - 1102: 08 c0 rjmp .+16 ; 0x1114 + 119c: 27 ff sbrs r18, 7 + 119e: 08 c0 rjmp .+16 ; 0x11b0 UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - 1104: 9f 5f subi r25, 0xFF ; 255 - 1106: 95 30 cpi r25, 0x05 ; 5 - 1108: 90 f2 brcs .-92 ; 0x10ae + 11a0: 9f 5f subi r25, 0xFF ; 255 + 11a2: 95 30 cpi r25, 0x05 ; 5 + 11a4: 90 f2 brcs .-92 ; 0x114a */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 110a: 8f 70 andi r24, 0x0F ; 15 - 110c: 80 93 e9 00 sts 0x00E9, r24 + 11a6: 8f 70 andi r24, 0x0F ; 15 + 11a8: 80 93 e9 00 sts 0x00E9, r24 if (!(Endpoint_IsConfigured())) return false; } Endpoint_SelectEndpoint(Number); return true; - 1110: 81 e0 ldi r24, 0x01 ; 1 - 1112: 08 95 ret + 11ac: 81 e0 ldi r24, 0x01 ; 1 + 11ae: 08 95 ret UECFG0X = UECFG0XTemp; UECFG1X = UECFG1XTemp; UEIENX = UEIENXTemp; if (!(Endpoint_IsConfigured())) return false; - 1114: 80 e0 ldi r24, 0x00 ; 0 + 11b0: 80 e0 ldi r24, 0x00 ; 0 } Endpoint_SelectEndpoint(Number); return true; #endif } - 1116: 08 95 ret + 11b2: 08 95 ret -00001118 : +000011b4 : uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE; #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { - 1118: ef 92 push r14 - 111a: ff 92 push r15 - 111c: 0f 93 push r16 - 111e: 1f 93 push r17 - 1120: cf 93 push r28 - 1122: df 93 push r29 - 1124: 16 2f mov r17, r22 + 11b4: ef 92 push r14 + 11b6: ff 92 push r15 + 11b8: 0f 93 push r16 + 11ba: 1f 93 push r17 + 11bc: cf 93 push r28 + 11be: df 93 push r29 + 11c0: 16 2f mov r17, r22 { if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; - 1126: e8 2e mov r14, r24 - 1128: e7 01 movw r28, r14 - 112a: 7e 01 movw r14, r28 - 112c: f9 2e mov r15, r25 - 112e: e7 01 movw r28, r14 + 11c2: e8 2e mov r14, r24 + 11c4: e7 01 movw r28, r14 + 11c6: 7e 01 movw r14, r28 + 11c8: f9 2e mov r15, r25 + 11ca: e7 01 movw r28, r14 #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - 1130: 00 e0 ldi r16, 0x00 ; 0 - 1132: 2a c0 rjmp .+84 ; 0x1188 + 11cc: 00 e0 ldi r16, 0x00 ; 0 + 11ce: 2a c0 rjmp .+84 ; 0x1224 { if (!(Table[i].Address)) - 1134: 98 81 ld r25, Y - 1136: 99 23 and r25, r25 - 1138: 29 f1 breq .+74 ; 0x1184 + 11d0: 98 81 ld r25, Y + 11d2: 99 23 and r25, r25 + 11d4: 29 f1 breq .+74 ; 0x1220 continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 113a: 6b 81 ldd r22, Y+3 ; 0x03 - 113c: e9 81 ldd r30, Y+1 ; 0x01 - 113e: fa 81 ldd r31, Y+2 ; 0x02 - 1140: 2c 81 ldd r18, Y+4 ; 0x04 + 11d6: 6b 81 ldd r22, Y+3 ; 0x03 + 11d8: e9 81 ldd r30, Y+1 ; 0x01 + 11da: fa 81 ldd r31, Y+2 ; 0x02 + 11dc: 2c 81 ldd r18, Y+4 ; 0x04 static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, const uint8_t Type, const uint16_t Size, const uint8_t Banks) { uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); - 1142: 89 2f mov r24, r25 - 1144: 8f 70 andi r24, 0x0F ; 15 + 11de: 89 2f mov r24, r25 + 11e0: 8f 70 andi r24, 0x0F ; 15 if (Number >= ENDPOINT_TOTAL_ENDPOINTS) - 1146: 85 30 cpi r24, 0x05 ; 5 - 1148: 18 f5 brcc .+70 ; 0x1190 + 11e2: 85 30 cpi r24, 0x05 ; 5 + 11e4: 18 f5 brcc .+70 ; 0x122c return false; return Endpoint_ConfigureEndpoint_Prv(Number, ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)), - 114a: 62 95 swap r22 - 114c: 66 0f add r22, r22 - 114e: 66 0f add r22, r22 - 1150: 60 7c andi r22, 0xC0 ; 192 - 1152: 99 1f adc r25, r25 - 1154: 99 27 eor r25, r25 - 1156: 99 1f adc r25, r25 + 11e6: 62 95 swap r22 + 11e8: 66 0f add r22, r22 + 11ea: 66 0f add r22, r22 + 11ec: 60 7c andi r22, 0xC0 ; 192 + 11ee: 99 1f adc r25, r25 + 11f0: 99 27 eor r25, r25 + 11f2: 99 1f adc r25, r25 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - 1158: 69 2b or r22, r25 - 115a: 22 30 cpi r18, 0x02 ; 2 - 115c: 10 f0 brcs .+4 ; 0x1162 - 115e: 96 e0 ldi r25, 0x06 ; 6 - 1160: 01 c0 rjmp .+2 ; 0x1164 - 1162: 92 e0 ldi r25, 0x02 ; 2 + 11f4: 69 2b or r22, r25 + 11f6: 22 30 cpi r18, 0x02 ; 2 + 11f8: 10 f0 brcs .+4 ; 0x11fe + 11fa: 96 e0 ldi r25, 0x06 ; 6 + 11fc: 01 c0 rjmp .+2 ; 0x1200 + 11fe: 92 e0 ldi r25, 0x02 ; 2 static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; uint16_t CheckBytes = 8; - 1164: 28 e0 ldi r18, 0x08 ; 8 - 1166: 30 e0 ldi r19, 0x00 ; 0 + 1200: 28 e0 ldi r18, 0x08 ; 8 + 1202: 30 e0 ldi r19, 0x00 ; 0 /* Inline Functions: */ static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; - 1168: 40 e0 ldi r20, 0x00 ; 0 - 116a: 03 c0 rjmp .+6 ; 0x1172 + 1204: 40 e0 ldi r20, 0x00 ; 0 + 1206: 03 c0 rjmp .+6 ; 0x120e uint16_t CheckBytes = 8; while (CheckBytes < Bytes) { MaskVal++; - 116c: 4f 5f subi r20, 0xFF ; 255 + 1208: 4f 5f subi r20, 0xFF ; 255 CheckBytes <<= 1; - 116e: 22 0f add r18, r18 - 1170: 33 1f adc r19, r19 + 120a: 22 0f add r18, r18 + 120c: 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) - 1172: 2e 17 cp r18, r30 - 1174: 3f 07 cpc r19, r31 - 1176: d0 f3 brcs .-12 ; 0x116c + 120e: 2e 17 cp r18, r30 + 1210: 3f 07 cpc r19, r31 + 1212: d0 f3 brcs .-12 ; 0x1208 { MaskVal++; CheckBytes <<= 1; } return (MaskVal << EPSIZE0); - 1178: 42 95 swap r20 - 117a: 40 7f andi r20, 0xF0 ; 240 + 1214: 42 95 swap r20 + 1216: 40 7f andi r20, 0xF0 ; 240 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - 117c: 49 2b or r20, r25 - 117e: 95 df rcall .-214 ; 0x10aa - 1180: 88 23 and r24, r24 - 1182: 31 f0 breq .+12 ; 0x1190 + 1218: 49 2b or r20, r25 + 121a: 95 df rcall .-214 ; 0x1146 + 121c: 88 23 and r24, r24 + 121e: 31 f0 breq .+12 ; 0x122c #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - 1184: 0f 5f subi r16, 0xFF ; 255 - 1186: 25 96 adiw r28, 0x05 ; 5 - 1188: 01 17 cp r16, r17 - 118a: a0 f2 brcs .-88 ; 0x1134 + 1220: 0f 5f subi r16, 0xFF ; 255 + 1222: 25 96 adiw r28, 0x05 ; 5 + 1224: 01 17 cp r16, r17 + 1226: a0 f2 brcs .-88 ; 0x11d0 if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; } return true; - 118c: 81 e0 ldi r24, 0x01 ; 1 - 118e: 01 c0 rjmp .+2 ; 0x1192 + 1228: 81 e0 ldi r24, 0x01 ; 1 + 122a: 01 c0 rjmp .+2 ; 0x122e { if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; - 1190: 80 e0 ldi r24, 0x00 ; 0 + 122c: 80 e0 ldi r24, 0x00 ; 0 } return true; } - 1192: df 91 pop r29 - 1194: cf 91 pop r28 - 1196: 1f 91 pop r17 - 1198: 0f 91 pop r16 - 119a: ff 90 pop r15 - 119c: ef 90 pop r14 - 119e: 08 95 ret - -000011a0 : + 122e: df 91 pop r29 + 1230: cf 91 pop r28 + 1232: 1f 91 pop r17 + 1234: 0f 91 pop r16 + 1236: ff 90 pop r15 + 1238: ef 90 pop r14 + 123a: 08 95 ret + +0000123c : } } void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - 11a0: 80 91 cc 02 lds r24, 0x02CC - 11a4: 87 ff sbrs r24, 7 - 11a6: 11 c0 rjmp .+34 ; 0x11ca - 11a8: 03 c0 rjmp .+6 ; 0x11b0 + 123c: 80 91 cc 02 lds r24, 0x02CC + 1240: 87 ff sbrs r24, 7 + 1242: 11 c0 rjmp .+34 ; 0x1266 + 1244: 03 c0 rjmp .+6 ; 0x124c { while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 11aa: 8e b3 in r24, 0x1e ; 30 - 11ac: 88 23 and r24, r24 - 11ae: b1 f0 breq .+44 ; 0x11dc + 1246: 8e b3 in r24, 0x1e ; 30 + 1248: 88 23 and r24, r24 + 124a: b1 f0 breq .+44 ; 0x1278 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 11b0: 80 91 e8 00 lds r24, 0x00E8 + 124c: 80 91 e8 00 lds r24, 0x00E8 void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) { while (!(Endpoint_IsOUTReceived())) - 11b4: 82 ff sbrs r24, 2 - 11b6: f9 cf rjmp .-14 ; 0x11aa + 1250: 82 ff sbrs r24, 2 + 1252: f9 cf rjmp .-14 ; 0x1246 */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 11b8: 80 91 e8 00 lds r24, 0x00E8 - 11bc: 8b 77 andi r24, 0x7B ; 123 - 11be: 80 93 e8 00 sts 0x00E8, r24 - 11c2: 08 95 ret + 1254: 80 91 e8 00 lds r24, 0x00E8 + 1258: 8b 77 andi r24, 0x7B ; 123 + 125a: 80 93 e8 00 sts 0x00E8, r24 + 125e: 08 95 ret } else { while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 11c4: 8e b3 in r24, 0x1e ; 30 - 11c6: 88 23 and r24, r24 - 11c8: 49 f0 breq .+18 ; 0x11dc + 1260: 8e b3 in r24, 0x1e ; 30 + 1262: 88 23 and r24, r24 + 1264: 49 f0 breq .+18 ; 0x1278 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 11ca: 80 91 e8 00 lds r24, 0x00E8 + 1266: 80 91 e8 00 lds r24, 0x00E8 Endpoint_ClearOUT(); } else { while (!(Endpoint_IsINReady())) - 11ce: 80 ff sbrs r24, 0 - 11d0: f9 cf rjmp .-14 ; 0x11c4 + 126a: 80 ff sbrs r24, 0 + 126c: f9 cf rjmp .-14 ; 0x1260 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 11d2: 80 91 e8 00 lds r24, 0x00E8 - 11d6: 8e 77 andi r24, 0x7E ; 126 - 11d8: 80 93 e8 00 sts 0x00E8, r24 - 11dc: 08 95 ret + 126e: 80 91 e8 00 lds r24, 0x00E8 + 1272: 8e 77 andi r24, 0x7E ; 126 + 1274: 80 93 e8 00 sts 0x00E8, r24 + 1278: 08 95 ret -000011de : +0000127a : * \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 UDFNUM; - 11de: 80 91 e4 00 lds r24, 0x00E4 - 11e2: 90 91 e5 00 lds r25, 0x00E5 + 127a: 80 91 e4 00 lds r24, 0x00E4 + 127e: 90 91 e5 00 lds r25, 0x00E5 #if !defined(CONTROL_ONLY_DEVICE) uint8_t Endpoint_WaitUntilReady(void) { #if (USB_STREAM_TIMEOUT_MS < 0xFF) uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; - 11e6: 44 e6 ldi r20, 0x64 ; 100 + 1282: 44 e6 ldi r20, 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 (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; - 11e8: 20 91 ec 00 lds r18, 0x00EC - 11ec: 20 ff sbrs r18, 0 - 11ee: 25 c0 rjmp .+74 ; 0x123a + 1284: 20 91 ec 00 lds r18, 0x00EC + 1288: 20 ff sbrs r18, 0 + 128a: 25 c0 rjmp .+74 ; 0x12d6 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 11f0: 20 91 e8 00 lds r18, 0x00E8 + 128c: 20 91 e8 00 lds r18, 0x00E8 for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) { if (Endpoint_IsINReady()) - 11f4: 20 fd sbrc r18, 0 - 11f6: 15 c0 rjmp .+42 ; 0x1222 + 1290: 20 fd sbrc r18, 0 + 1292: 15 c0 rjmp .+42 ; 0x12be { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; } uint8_t USB_DeviceState_LCL = USB_DeviceState; - 11f8: 2e b3 in r18, 0x1e ; 30 + 1294: 2e b3 in r18, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 11fa: 22 23 and r18, r18 - 11fc: a1 f0 breq .+40 ; 0x1226 + 1296: 22 23 and r18, r18 + 1298: a1 f0 breq .+40 ; 0x12c2 return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 11fe: 25 30 cpi r18, 0x05 ; 5 - 1200: a1 f0 breq .+40 ; 0x122a + 129a: 25 30 cpi r18, 0x05 ; 5 + 129c: a1 f0 breq .+40 ; 0x12c6 * \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 ((UECONX & (1 << STALLRQ)) ? true : false); - 1202: 20 91 eb 00 lds r18, 0x00EB + 129e: 20 91 eb 00 lds r18, 0x00EB return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) - 1206: 25 fd sbrc r18, 5 - 1208: 12 c0 rjmp .+36 ; 0x122e - 120a: 20 91 e4 00 lds r18, 0x00E4 - 120e: 30 91 e5 00 lds r19, 0x00E5 + 12a2: 25 fd sbrc r18, 5 + 12a4: 12 c0 rjmp .+36 ; 0x12ca + 12a6: 20 91 e4 00 lds r18, 0x00E4 + 12aa: 30 91 e5 00 lds r19, 0x00E5 return ENDPOINT_READYWAIT_EndpointStalled; uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); if (CurrentFrameNumber != PreviousFrameNumber) - 1212: 28 17 cp r18, r24 - 1214: 39 07 cpc r19, r25 - 1216: 41 f3 breq .-48 ; 0x11e8 + 12ae: 28 17 cp r18, r24 + 12b0: 39 07 cpc r19, r25 + 12b2: 41 f3 breq .-48 ; 0x1284 { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) - 1218: 44 23 and r20, r20 - 121a: 59 f0 breq .+22 ; 0x1232 - 121c: 41 50 subi r20, 0x01 ; 1 - 121e: c9 01 movw r24, r18 - 1220: e3 cf rjmp .-58 ; 0x11e8 + 12b4: 44 23 and r20, r20 + 12b6: 59 f0 breq .+22 ; 0x12ce + 12b8: 41 50 subi r20, 0x01 ; 1 + 12ba: c9 01 movw r24, r18 + 12bc: e3 cf rjmp .-58 ; 0x1284 for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) { if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; - 1222: 80 e0 ldi r24, 0x00 ; 0 - 1224: 08 95 ret + 12be: 80 e0 ldi r24, 0x00 ; 0 + 12c0: 08 95 ret } uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; - 1226: 82 e0 ldi r24, 0x02 ; 2 - 1228: 08 95 ret + 12c2: 82 e0 ldi r24, 0x02 ; 2 + 12c4: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; - 122a: 83 e0 ldi r24, 0x03 ; 3 - 122c: 08 95 ret + 12c6: 83 e0 ldi r24, 0x03 ; 3 + 12c8: 08 95 ret else if (Endpoint_IsStalled()) return ENDPOINT_READYWAIT_EndpointStalled; - 122e: 81 e0 ldi r24, 0x01 ; 1 - 1230: 08 95 ret + 12ca: 81 e0 ldi r24, 0x01 ; 1 + 12cc: 08 95 ret if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; - 1232: 84 e0 ldi r24, 0x04 ; 4 - 1234: 08 95 ret + 12ce: 84 e0 ldi r24, 0x04 ; 4 + 12d0: 08 95 ret return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; - 1236: 80 e0 ldi r24, 0x00 ; 0 + 12d2: 80 e0 ldi r24, 0x00 ; 0 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 1238: 08 95 ret + 12d4: 08 95 ret * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 123a: 20 91 e8 00 lds r18, 0x00E8 + 12d6: 20 91 e8 00 lds r18, 0x00E8 if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) - 123e: 22 ff sbrs r18, 2 - 1240: db cf rjmp .-74 ; 0x11f8 - 1242: f9 cf rjmp .-14 ; 0x1236 + 12da: 22 ff sbrs r18, 2 + 12dc: db cf rjmp .-74 ; 0x1294 + 12de: f9 cf rjmp .-14 ; 0x12d2 -00001244 : +000012e0 : { #if defined(USB_CAN_BE_BOTH) bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); #endif USB_INT_DisableAllInterrupts(); - 1244: 40 d0 rcall .+128 ; 0x12c6 + 12e0: 40 d0 rcall .+128 ; 0x1362 USB_INT_ClearAllInterrupts(); - 1246: 42 d0 rcall .+132 ; 0x12cc + 12e2: 42 d0 rcall .+132 ; 0x1368 } static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Reset(void) { USBCON &= ~(1 << USBE); - 1248: 80 91 d8 00 lds r24, 0x00D8 - 124c: 8f 77 andi r24, 0x7F ; 127 - 124e: 80 93 d8 00 sts 0x00D8, r24 + 12e4: 80 91 d8 00 lds r24, 0x00D8 + 12e8: 8f 77 andi r24, 0x7F ; 127 + 12ea: 80 93 d8 00 sts 0x00D8, r24 USBCON |= (1 << USBE); - 1252: 80 91 d8 00 lds r24, 0x00D8 - 1256: 80 68 ori r24, 0x80 ; 128 - 1258: 80 93 d8 00 sts 0x00D8, r24 + 12ee: 80 91 d8 00 lds r24, 0x00D8 + 12f2: 80 68 ori r24, 0x80 ; 128 + 12f4: 80 93 d8 00 sts 0x00D8, r24 } static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Unfreeze(void) { USBCON &= ~(1 << FRZCLK); - 125c: 80 91 d8 00 lds r24, 0x00D8 - 1260: 8f 7d andi r24, 0xDF ; 223 - 1262: 80 93 d8 00 sts 0x00D8, r24 + 12f8: 80 91 d8 00 lds r24, 0x00D8 + 12fc: 8f 7d andi r24, 0xDF ; 223 + 12fe: 80 93 d8 00 sts 0x00D8, r24 /* Inline Functions: */ static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_On(void) { PLLCSR = USB_PLL_PSC; - 1266: 84 e0 ldi r24, 0x04 ; 4 - 1268: 89 bd out 0x29, r24 ; 41 + 1302: 84 e0 ldi r24, 0x04 ; 4 + 1304: 89 bd out 0x29, r24 ; 41 PLLCSR = (USB_PLL_PSC | (1 << PLLE)); - 126a: 86 e0 ldi r24, 0x06 ; 6 - 126c: 89 bd out 0x29, r24 ; 41 + 1306: 86 e0 ldi r24, 0x06 ; 6 + 1308: 89 bd out 0x29, r24 ; 41 if (!(USB_Options & USB_OPT_MANUAL_PLL)) { #if defined(USB_SERIES_2_AVR) USB_PLL_On(); while (!(USB_PLL_IsReady())); - 126e: 09 b4 in r0, 0x29 ; 41 - 1270: 00 fe sbrs r0, 0 - 1272: fd cf rjmp .-6 ; 0x126e + 130a: 09 b4 in r0, 0x29 ; 41 + 130c: 00 fe sbrs r0, 0 + 130e: fd cf rjmp .-6 ; 0x130a } #if defined(USB_CAN_BE_DEVICE) static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; - 1274: 1e ba out 0x1e, r1 ; 30 + 1310: 1e ba out 0x1e, r1 ; 30 USB_Device_ConfigurationNumber = 0; - 1276: 10 92 c8 02 sts 0x02C8, r1 + 1312: 10 92 c8 02 sts 0x02C8, r1 #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; - 127a: 10 92 ca 02 sts 0x02CA, r1 + 1316: 10 92 ca 02 sts 0x02CA, r1 #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; - 127e: 10 92 c9 02 sts 0x02C9, r1 + 131a: 10 92 c9 02 sts 0x02C9, r1 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - 1282: 80 e0 ldi r24, 0x00 ; 0 - 1284: 60 e0 ldi r22, 0x00 ; 0 - 1286: 42 e0 ldi r20, 0x02 ; 2 - 1288: 10 df rcall .-480 ; 0x10aa + 131e: 80 e0 ldi r24, 0x00 ; 0 + 1320: 60 e0 ldi r22, 0x00 ; 0 + 1322: 42 e0 ldi r20, 0x02 ; 2 + 1324: 10 df rcall .-480 ; 0x1146 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); - 128a: 80 91 e1 00 lds r24, 0x00E1 - 128e: 8e 7f andi r24, 0xFE ; 254 - 1290: 80 93 e1 00 sts 0x00E1, r24 + 1326: 80 91 e1 00 lds r24, 0x00E1 + 132a: 8e 7f andi r24, 0xFE ; 254 + 132c: 80 93 e1 00 sts 0x00E1, r24 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN |= (1 << SUSPE); - 1294: 80 91 e2 00 lds r24, 0x00E2 - 1298: 81 60 ori r24, 0x01 ; 1 - 129a: 80 93 e2 00 sts 0x00E2, r24 + 1330: 80 91 e2 00 lds r24, 0x00E2 + 1334: 81 60 ori r24, 0x01 ; 1 + 1336: 80 93 e2 00 sts 0x00E2, r24 break; case USB_INT_EORSTI: UDIEN |= (1 << EORSTE); - 129e: 80 91 e2 00 lds r24, 0x00E2 - 12a2: 88 60 ori r24, 0x08 ; 8 - 12a4: 80 93 e2 00 sts 0x00E2, r24 + 133a: 80 91 e2 00 lds r24, 0x00E2 + 133e: 88 60 ori r24, 0x08 ; 8 + 1340: 80 93 e2 00 sts 0x00E2, r24 * 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) { UDCON &= ~(1 << DETACH); - 12a8: 80 91 e0 00 lds r24, 0x00E0 - 12ac: 8e 7f andi r24, 0xFE ; 254 - 12ae: 80 93 e0 00 sts 0x00E0, r24 + 1344: 80 91 e0 00 lds r24, 0x00E0 + 1348: 8e 7f andi r24, 0xFE ; 254 + 134a: 80 93 e0 00 sts 0x00E0, r24 } #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) USB_OTGPAD_On(); #endif } - 12b2: 08 95 ret + 134e: 08 95 ret -000012b4 : +00001350 : static inline void USB_REG_On(void) { #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) UHWCON |= (1 << UVREGE); #else REGCR &= ~(1 << REGDIS); - 12b4: e3 e6 ldi r30, 0x63 ; 99 - 12b6: f0 e0 ldi r31, 0x00 ; 0 - 12b8: 80 81 ld r24, Z - 12ba: 8e 7f andi r24, 0xFE ; 254 - 12bc: 80 83 st Z, r24 + 1350: e3 e6 ldi r30, 0x63 ; 99 + 1352: f0 e0 ldi r31, 0x00 ; 0 + 1354: 80 81 ld r24, Z + 1356: 8e 7f andi r24, 0xFE ; 254 + 1358: 80 83 st Z, r24 UHWCON &= ~(1 << UIDE); USB_CurrentMode = Mode; } #endif USB_IsInitialized = true; - 12be: 81 e0 ldi r24, 0x01 ; 1 - 12c0: 80 93 cb 02 sts 0x02CB, r24 + 135a: 81 e0 ldi r24, 0x01 ; 1 + 135c: 80 93 cb 02 sts 0x02CB, r24 USB_ResetInterface(); } - 12c4: bf cf rjmp .-130 ; 0x1244 + 1360: bf cf rjmp .-130 ; 0x12e0 -000012c6 : +00001362 : #if defined(USB_CAN_BE_HOST) UHIEN = 0; #endif #if defined(USB_CAN_BE_DEVICE) UDIEN = 0; - 12c6: 10 92 e2 00 sts 0x00E2, r1 + 1362: 10 92 e2 00 sts 0x00E2, r1 #endif } - 12ca: 08 95 ret + 1366: 08 95 ret -000012cc : +00001368 : #if defined(USB_CAN_BE_HOST) UHINT = 0; #endif #if defined(USB_CAN_BE_DEVICE) UDINT = 0; - 12cc: 10 92 e1 00 sts 0x00E1, r1 + 1368: 10 92 e1 00 sts 0x00E1, r1 #endif } - 12d0: 08 95 ret + 136c: 08 95 ret -000012d2 <__vector_11>: +0000136e <__vector_11>: ISR(USB_GEN_vect, ISR_BLOCK) { - 12d2: 1f 92 push r1 - 12d4: 0f 92 push r0 - 12d6: 0f b6 in r0, 0x3f ; 63 - 12d8: 0f 92 push r0 - 12da: 11 24 eor r1, r1 - 12dc: 2f 93 push r18 - 12de: 3f 93 push r19 - 12e0: 4f 93 push r20 - 12e2: 5f 93 push r21 - 12e4: 6f 93 push r22 - 12e6: 7f 93 push r23 - 12e8: 8f 93 push r24 - 12ea: 9f 93 push r25 - 12ec: af 93 push r26 - 12ee: bf 93 push r27 - 12f0: ef 93 push r30 - 12f2: ff 93 push r31 + 136e: 1f 92 push r1 + 1370: 0f 92 push r0 + 1372: 0f b6 in r0, 0x3f ; 63 + 1374: 0f 92 push r0 + 1376: 11 24 eor r1, r1 + 1378: 2f 93 push r18 + 137a: 3f 93 push r19 + 137c: 4f 93 push r20 + 137e: 5f 93 push r21 + 1380: 6f 93 push r22 + 1382: 7f 93 push r23 + 1384: 8f 93 push r24 + 1386: 9f 93 push r25 + 1388: af 93 push r26 + 138a: bf 93 push r27 + 138c: ef 93 push r30 + 138e: ff 93 push r31 case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); case USB_INT_EORSTI: return (UDINT & (1 << EORSTI)); case USB_INT_SOFI: return (UDINT & (1 << SOFI)); - 12f4: 80 91 e1 00 lds r24, 0x00E1 + 1390: 80 91 e1 00 lds r24, 0x00E1 #if defined(USB_CAN_BE_DEVICE) #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 12f8: 82 ff sbrs r24, 2 - 12fa: 0a c0 rjmp .+20 ; 0x1310 <__vector_11+0x3e> + 1394: 82 ff sbrs r24, 2 + 1396: 0a c0 rjmp .+20 ; 0x13ac <__vector_11+0x3e> case USB_INT_SUSPI: return (UDIEN & (1 << SUSPE)); case USB_INT_EORSTI: return (UDIEN & (1 << EORSTE)); case USB_INT_SOFI: return (UDIEN & (1 << SOFE)); - 12fc: 80 91 e2 00 lds r24, 0x00E2 - 1300: 82 ff sbrs r24, 2 - 1302: 06 c0 rjmp .+12 ; 0x1310 <__vector_11+0x3e> + 1398: 80 91 e2 00 lds r24, 0x00E2 + 139c: 82 ff sbrs r24, 2 + 139e: 06 c0 rjmp .+12 ; 0x13ac <__vector_11+0x3e> break; case USB_INT_EORSTI: UDINT &= ~(1 << EORSTI); break; case USB_INT_SOFI: UDINT &= ~(1 << SOFI); - 1304: 80 91 e1 00 lds r24, 0x00E1 - 1308: 8b 7f andi r24, 0xFB ; 251 - 130a: 80 93 e1 00 sts 0x00E1, r24 + 13a0: 80 91 e1 00 lds r24, 0x00E1 + 13a4: 8b 7f andi r24, 0xFB ; 251 + 13a6: 80 93 e1 00 sts 0x00E1, r24 { USB_INT_Clear(USB_INT_SOFI); EVENT_USB_Device_StartOfFrame(); - 130e: 22 d2 rcall .+1092 ; 0x1754 + 13aa: 22 d2 rcall .+1092 ; 0x17f0 #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); - 1310: 80 91 e1 00 lds r24, 0x00E1 + 13ac: 80 91 e1 00 lds r24, 0x00E1 EVENT_USB_Device_Disconnect(); } } #endif if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI)) - 1314: 80 ff sbrs r24, 0 - 1316: 16 c0 rjmp .+44 ; 0x1344 <__vector_11+0x72> + 13b0: 80 ff sbrs r24, 0 + 13b2: 16 c0 rjmp .+44 ; 0x13e0 <__vector_11+0x72> #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDIEN & (1 << WAKEUPE)); case USB_INT_SUSPI: return (UDIEN & (1 << SUSPE)); - 1318: 80 91 e2 00 lds r24, 0x00E2 - 131c: 80 ff sbrs r24, 0 - 131e: 12 c0 rjmp .+36 ; 0x1344 <__vector_11+0x72> + 13b4: 80 91 e2 00 lds r24, 0x00E2 + 13b8: 80 ff sbrs r24, 0 + 13ba: 12 c0 rjmp .+36 ; 0x13e0 <__vector_11+0x72> #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN &= ~(1 << SUSPE); - 1320: 80 91 e2 00 lds r24, 0x00E2 - 1324: 8e 7f andi r24, 0xFE ; 254 - 1326: 80 93 e2 00 sts 0x00E2, r24 + 13bc: 80 91 e2 00 lds r24, 0x00E2 + 13c0: 8e 7f andi r24, 0xFE ; 254 + 13c2: 80 93 e2 00 sts 0x00E2, r24 USBCON |= (1 << IDTE); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); - 132a: 80 91 e2 00 lds r24, 0x00E2 - 132e: 80 61 ori r24, 0x10 ; 16 - 1330: 80 93 e2 00 sts 0x00E2, r24 + 13c6: 80 91 e2 00 lds r24, 0x00E2 + 13ca: 80 61 ori r24, 0x10 ; 16 + 13cc: 80 93 e2 00 sts 0x00E2, r24 #endif static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Freeze(void) { USBCON |= (1 << FRZCLK); - 1334: 80 91 d8 00 lds r24, 0x00D8 - 1338: 80 62 ori r24, 0x20 ; 32 - 133a: 80 93 d8 00 sts 0x00D8, r24 + 13d0: 80 91 d8 00 lds r24, 0x00D8 + 13d4: 80 62 ori r24, 0x20 ; 32 + 13d6: 80 93 d8 00 sts 0x00D8, r24 } static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_Off(void) { PLLCSR = 0; - 133e: 19 bc out 0x29, r1 ; 41 + 13da: 19 bc out 0x29, r1 ; 41 if (!(USB_Options & USB_OPT_MANUAL_PLL)) USB_PLL_Off(); #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) USB_DeviceState = DEVICE_STATE_Unattached; - 1340: 1e ba out 0x1e, r1 ; 30 + 13dc: 1e ba out 0x1e, r1 ; 30 EVENT_USB_Device_Disconnect(); - 1342: a7 d9 rcall .-3250 ; 0x692 + 13de: 9f d9 rcall .-3266 ; 0x71e case USB_INT_IDTI: return (USBINT & (1 << IDTI)); #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); - 1344: 80 91 e1 00 lds r24, 0x00E1 + 13e0: 80 91 e1 00 lds r24, 0x00E1 USB_DeviceState = DEVICE_STATE_Suspended; EVENT_USB_Device_Suspend(); #endif } if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI)) - 1348: 84 ff sbrs r24, 4 - 134a: 2c c0 rjmp .+88 ; 0x13a4 <__vector_11+0xd2> + 13e4: 84 ff sbrs r24, 4 + 13e6: 2c c0 rjmp .+88 ; 0x1440 <__vector_11+0xd2> case USB_INT_IDTI: return (USBCON & (1 << IDTE)); #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDIEN & (1 << WAKEUPE)); - 134c: 80 91 e2 00 lds r24, 0x00E2 - 1350: 84 ff sbrs r24, 4 - 1352: 28 c0 rjmp .+80 ; 0x13a4 <__vector_11+0xd2> + 13e8: 80 91 e2 00 lds r24, 0x00E2 + 13ec: 84 ff sbrs r24, 4 + 13ee: 28 c0 rjmp .+80 ; 0x1440 <__vector_11+0xd2> /* Inline Functions: */ static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_On(void) { PLLCSR = USB_PLL_PSC; - 1354: 84 e0 ldi r24, 0x04 ; 4 - 1356: 89 bd out 0x29, r24 ; 41 + 13f0: 84 e0 ldi r24, 0x04 ; 4 + 13f2: 89 bd out 0x29, r24 ; 41 PLLCSR = (USB_PLL_PSC | (1 << PLLE)); - 1358: 86 e0 ldi r24, 0x06 ; 6 - 135a: 89 bd out 0x29, r24 ; 41 + 13f4: 86 e0 ldi r24, 0x06 ; 6 + 13f6: 89 bd out 0x29, r24 ; 41 { if (!(USB_Options & USB_OPT_MANUAL_PLL)) { USB_PLL_On(); while (!(USB_PLL_IsReady())); - 135c: 09 b4 in r0, 0x29 ; 41 - 135e: 00 fe sbrs r0, 0 - 1360: fd cf rjmp .-6 ; 0x135c <__vector_11+0x8a> + 13f8: 09 b4 in r0, 0x29 ; 41 + 13fa: 00 fe sbrs r0, 0 + 13fc: fd cf rjmp .-6 ; 0x13f8 <__vector_11+0x8a> } static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Unfreeze(void) { USBCON &= ~(1 << FRZCLK); - 1362: 80 91 d8 00 lds r24, 0x00D8 - 1366: 8f 7d andi r24, 0xDF ; 223 - 1368: 80 93 d8 00 sts 0x00D8, r24 + 13fe: 80 91 d8 00 lds r24, 0x00D8 + 1402: 8f 7d andi r24, 0xDF ; 223 + 1404: 80 93 d8 00 sts 0x00D8, r24 USBINT &= ~(1 << IDTI); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); - 136c: 80 91 e1 00 lds r24, 0x00E1 - 1370: 8f 7e andi r24, 0xEF ; 239 - 1372: 80 93 e1 00 sts 0x00E1, r24 + 1408: 80 91 e1 00 lds r24, 0x00E1 + 140c: 8f 7e andi r24, 0xEF ; 239 + 140e: 80 93 e1 00 sts 0x00E1, r24 USBCON &= ~(1 << IDTE); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); - 1376: 80 91 e2 00 lds r24, 0x00E2 - 137a: 8f 7e andi r24, 0xEF ; 239 - 137c: 80 93 e2 00 sts 0x00E2, r24 + 1412: 80 91 e2 00 lds r24, 0x00E2 + 1416: 8f 7e andi r24, 0xEF ; 239 + 1418: 80 93 e2 00 sts 0x00E2, r24 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN |= (1 << SUSPE); - 1380: 80 91 e2 00 lds r24, 0x00E2 - 1384: 81 60 ori r24, 0x01 ; 1 - 1386: 80 93 e2 00 sts 0x00E2, r24 + 141c: 80 91 e2 00 lds r24, 0x00E2 + 1420: 81 60 ori r24, 0x01 ; 1 + 1422: 80 93 e2 00 sts 0x00E2, r24 USB_INT_Clear(USB_INT_WAKEUPI); USB_INT_Disable(USB_INT_WAKEUPI); USB_INT_Enable(USB_INT_SUSPI); if (USB_Device_ConfigurationNumber) - 138a: 80 91 c8 02 lds r24, 0x02C8 - 138e: 88 23 and r24, r24 - 1390: 21 f4 brne .+8 ; 0x139a <__vector_11+0xc8> + 1426: 80 91 c8 02 lds r24, 0x02C8 + 142a: 88 23 and r24, r24 + 142c: 21 f4 brne .+8 ; 0x1436 <__vector_11+0xc8> } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return (UDADDR & (1 << ADDEN)); - 1392: 80 91 e3 00 lds r24, 0x00E3 + 142e: 80 91 e3 00 lds r24, 0x00E3 USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - 1396: 87 ff sbrs r24, 7 - 1398: 02 c0 rjmp .+4 ; 0x139e <__vector_11+0xcc> - 139a: 84 e0 ldi r24, 0x04 ; 4 - 139c: 01 c0 rjmp .+2 ; 0x13a0 <__vector_11+0xce> - 139e: 81 e0 ldi r24, 0x01 ; 1 - 13a0: 8e bb out 0x1e, r24 ; 30 + 1432: 87 ff sbrs r24, 7 + 1434: 02 c0 rjmp .+4 ; 0x143a <__vector_11+0xcc> + 1436: 84 e0 ldi r24, 0x04 ; 4 + 1438: 01 c0 rjmp .+2 ; 0x143c <__vector_11+0xce> + 143a: 81 e0 ldi r24, 0x01 ; 1 + 143c: 8e bb out 0x1e, r24 ; 30 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) EVENT_USB_Device_Connect(); - 13a2: 76 d9 rcall .-3348 ; 0x690 + 143e: 6e d9 rcall .-3364 ; 0x71c case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); case USB_INT_EORSTI: return (UDINT & (1 << EORSTI)); - 13a4: 80 91 e1 00 lds r24, 0x00E1 + 1440: 80 91 e1 00 lds r24, 0x00E1 #else EVENT_USB_Device_WakeUp(); #endif } if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI)) - 13a8: 83 ff sbrs r24, 3 - 13aa: 26 c0 rjmp .+76 ; 0x13f8 <__vector_11+0x126> + 1444: 83 ff sbrs r24, 3 + 1446: 26 c0 rjmp .+76 ; 0x1494 <__vector_11+0x126> case USB_INT_WAKEUPI: return (UDIEN & (1 << WAKEUPE)); case USB_INT_SUSPI: return (UDIEN & (1 << SUSPE)); case USB_INT_EORSTI: return (UDIEN & (1 << EORSTE)); - 13ac: 80 91 e2 00 lds r24, 0x00E2 - 13b0: 83 ff sbrs r24, 3 - 13b2: 22 c0 rjmp .+68 ; 0x13f8 <__vector_11+0x126> + 1448: 80 91 e2 00 lds r24, 0x00E2 + 144c: 83 ff sbrs r24, 3 + 144e: 22 c0 rjmp .+68 ; 0x1494 <__vector_11+0x126> break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); break; case USB_INT_EORSTI: UDINT &= ~(1 << EORSTI); - 13b4: 80 91 e1 00 lds r24, 0x00E1 - 13b8: 87 7f andi r24, 0xF7 ; 247 - 13ba: 80 93 e1 00 sts 0x00E1, r24 + 1450: 80 91 e1 00 lds r24, 0x00E1 + 1454: 87 7f andi r24, 0xF7 ; 247 + 1456: 80 93 e1 00 sts 0x00E1, r24 { USB_INT_Clear(USB_INT_EORSTI); USB_DeviceState = DEVICE_STATE_Default; - 13be: 82 e0 ldi r24, 0x02 ; 2 - 13c0: 8e bb out 0x1e, r24 ; 30 + 145a: 82 e0 ldi r24, 0x02 ; 2 + 145c: 8e bb out 0x1e, r24 ; 30 USB_Device_ConfigurationNumber = 0; - 13c2: 10 92 c8 02 sts 0x02C8, r1 + 145e: 10 92 c8 02 sts 0x02C8, r1 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); - 13c6: 80 91 e1 00 lds r24, 0x00E1 - 13ca: 8e 7f andi r24, 0xFE ; 254 - 13cc: 80 93 e1 00 sts 0x00E1, r24 + 1462: 80 91 e1 00 lds r24, 0x00E1 + 1466: 8e 7f andi r24, 0xFE ; 254 + 1468: 80 93 e1 00 sts 0x00E1, r24 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN &= ~(1 << SUSPE); - 13d0: 80 91 e2 00 lds r24, 0x00E2 - 13d4: 8e 7f andi r24, 0xFE ; 254 - 13d6: 80 93 e2 00 sts 0x00E2, r24 + 146c: 80 91 e2 00 lds r24, 0x00E2 + 1470: 8e 7f andi r24, 0xFE ; 254 + 1472: 80 93 e2 00 sts 0x00E2, r24 USBCON |= (1 << IDTE); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); - 13da: 80 91 e2 00 lds r24, 0x00E2 - 13de: 80 61 ori r24, 0x10 ; 16 - 13e0: 80 93 e2 00 sts 0x00E2, r24 + 1476: 80 91 e2 00 lds r24, 0x00E2 + 147a: 80 61 ori r24, 0x10 ; 16 + 147c: 80 93 e2 00 sts 0x00E2, r24 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - 13e4: 80 e0 ldi r24, 0x00 ; 0 - 13e6: 60 e0 ldi r22, 0x00 ; 0 - 13e8: 42 e0 ldi r20, 0x02 ; 2 - 13ea: 5f de rcall .-834 ; 0x10aa + 1480: 80 e0 ldi r24, 0x00 ; 0 + 1482: 60 e0 ldi r22, 0x00 ; 0 + 1484: 42 e0 ldi r20, 0x02 ; 2 + 1486: 5f de rcall .-834 ; 0x1146 break; case USB_INT_SOFI: UDIEN |= (1 << SOFE); break; case USB_INT_RXSTPI: UEIENX |= (1 << RXSTPE); - 13ec: 80 91 f0 00 lds r24, 0x00F0 - 13f0: 88 60 ori r24, 0x08 ; 8 - 13f2: 80 93 f0 00 sts 0x00F0, r24 + 1488: 80 91 f0 00 lds r24, 0x00F0 + 148c: 88 60 ori r24, 0x08 ; 8 + 148e: 80 93 f0 00 sts 0x00F0, r24 #if defined(INTERRUPT_CONTROL_ENDPOINT) USB_INT_Enable(USB_INT_RXSTPI); #endif EVENT_USB_Device_Reset(); - 13f6: ae d1 rcall .+860 ; 0x1754 + 1492: ae d1 rcall .+860 ; 0x17f0 USB_ResetInterface(); EVENT_USB_UIDChange(); } #endif } - 13f8: ff 91 pop r31 - 13fa: ef 91 pop r30 - 13fc: bf 91 pop r27 - 13fe: af 91 pop r26 - 1400: 9f 91 pop r25 - 1402: 8f 91 pop r24 - 1404: 7f 91 pop r23 - 1406: 6f 91 pop r22 - 1408: 5f 91 pop r21 - 140a: 4f 91 pop r20 - 140c: 3f 91 pop r19 - 140e: 2f 91 pop r18 - 1410: 0f 90 pop r0 - 1412: 0f be out 0x3f, r0 ; 63 - 1414: 0f 90 pop r0 - 1416: 1f 90 pop r1 - 1418: 18 95 reti - -0000141a <__vector_12>: + 1494: ff 91 pop r31 + 1496: ef 91 pop r30 + 1498: bf 91 pop r27 + 149a: af 91 pop r26 + 149c: 9f 91 pop r25 + 149e: 8f 91 pop r24 + 14a0: 7f 91 pop r23 + 14a2: 6f 91 pop r22 + 14a4: 5f 91 pop r21 + 14a6: 4f 91 pop r20 + 14a8: 3f 91 pop r19 + 14aa: 2f 91 pop r18 + 14ac: 0f 90 pop r0 + 14ae: 0f be out 0x3f, r0 ; 63 + 14b0: 0f 90 pop r0 + 14b2: 1f 90 pop r1 + 14b4: 18 95 reti + +000014b6 <__vector_12>: #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) ISR(USB_COM_vect, ISR_BLOCK) { - 141a: 1f 92 push r1 - 141c: 0f 92 push r0 - 141e: 0f b6 in r0, 0x3f ; 63 - 1420: 0f 92 push r0 - 1422: 11 24 eor r1, r1 - 1424: 1f 93 push r17 - 1426: 2f 93 push r18 - 1428: 3f 93 push r19 - 142a: 4f 93 push r20 - 142c: 5f 93 push r21 - 142e: 6f 93 push r22 - 1430: 7f 93 push r23 - 1432: 8f 93 push r24 - 1434: 9f 93 push r25 - 1436: af 93 push r26 - 1438: bf 93 push r27 - 143a: ef 93 push r30 - 143c: ff 93 push r31 + 14b6: 1f 92 push r1 + 14b8: 0f 92 push r0 + 14ba: 0f b6 in r0, 0x3f ; 63 + 14bc: 0f 92 push r0 + 14be: 11 24 eor r1, r1 + 14c0: 1f 93 push r17 + 14c2: 2f 93 push r18 + 14c4: 3f 93 push r19 + 14c6: 4f 93 push r20 + 14c8: 5f 93 push r21 + 14ca: 6f 93 push r22 + 14cc: 7f 93 push r23 + 14ce: 8f 93 push r24 + 14d0: 9f 93 push r25 + 14d2: af 93 push r26 + 14d4: bf 93 push r27 + 14d6: ef 93 push r30 + 14d8: ff 93 push r31 */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { #if !defined(CONTROL_ONLY_DEVICE) return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); - 143e: 10 91 e9 00 lds r17, 0x00E9 - 1442: 1f 70 andi r17, 0x0F ; 15 + 14da: 10 91 e9 00 lds r17, 0x00E9 + 14de: 1f 70 andi r17, 0x0F ; 15 * \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 (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; - 1444: 80 91 ec 00 lds r24, 0x00EC + 14e0: 80 91 ec 00 lds r24, 0x00EC */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1448: 10 92 e9 00 sts 0x00E9, r1 + 14e4: 10 92 e9 00 sts 0x00E9, r1 break; case USB_INT_SOFI: UDIEN &= ~(1 << SOFE); break; case USB_INT_RXSTPI: UEIENX &= ~(1 << RXSTPE); - 144c: 80 91 f0 00 lds r24, 0x00F0 - 1450: 87 7f andi r24, 0xF7 ; 247 - 1452: 80 93 f0 00 sts 0x00F0, r24 + 14e8: 80 91 f0 00 lds r24, 0x00F0 + 14ec: 87 7f andi r24, 0xF7 ; 247 + 14ee: 80 93 f0 00 sts 0x00F0, r24 static inline void GlobalInterruptEnable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) sei(); - 1456: 78 94 sei + 14f2: 78 94 sei Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Disable(USB_INT_RXSTPI); GlobalInterruptEnable(); USB_Device_ProcessControlRequest(); - 1458: 1b d0 rcall .+54 ; 0x1490 - 145a: 10 92 e9 00 sts 0x00E9, r1 + 14f4: 1b d0 rcall .+54 ; 0x152c + 14f6: 10 92 e9 00 sts 0x00E9, r1 break; case USB_INT_SOFI: UDIEN |= (1 << SOFE); break; case USB_INT_RXSTPI: UEIENX |= (1 << RXSTPE); - 145e: 80 91 f0 00 lds r24, 0x00F0 - 1462: 88 60 ori r24, 0x08 ; 8 - 1464: 80 93 f0 00 sts 0x00F0, r24 - 1468: 10 93 e9 00 sts 0x00E9, r17 + 14fa: 80 91 f0 00 lds r24, 0x00F0 + 14fe: 88 60 ori r24, 0x08 ; 8 + 1500: 80 93 f0 00 sts 0x00F0, r24 + 1504: 10 93 e9 00 sts 0x00E9, r17 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Enable(USB_INT_RXSTPI); Endpoint_SelectEndpoint(PrevSelectedEndpoint); } - 146c: ff 91 pop r31 - 146e: ef 91 pop r30 - 1470: bf 91 pop r27 - 1472: af 91 pop r26 - 1474: 9f 91 pop r25 - 1476: 8f 91 pop r24 - 1478: 7f 91 pop r23 - 147a: 6f 91 pop r22 - 147c: 5f 91 pop r21 - 147e: 4f 91 pop r20 - 1480: 3f 91 pop r19 - 1482: 2f 91 pop r18 - 1484: 1f 91 pop r17 - 1486: 0f 90 pop r0 - 1488: 0f be out 0x3f, r0 ; 63 - 148a: 0f 90 pop r0 - 148c: 1f 90 pop r1 - 148e: 18 95 reti - -00001490 : + 1508: ff 91 pop r31 + 150a: ef 91 pop r30 + 150c: bf 91 pop r27 + 150e: af 91 pop r26 + 1510: 9f 91 pop r25 + 1512: 8f 91 pop r24 + 1514: 7f 91 pop r23 + 1516: 6f 91 pop r22 + 1518: 5f 91 pop r21 + 151a: 4f 91 pop r20 + 151c: 3f 91 pop r19 + 151e: 2f 91 pop r18 + 1520: 1f 91 pop r17 + 1522: 0f 90 pop r0 + 1524: 0f be out 0x3f, r0 ; 63 + 1526: 0f 90 pop r0 + 1528: 1f 90 pop r1 + 152a: 18 95 reti + +0000152c : #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) { - 1490: 1f 93 push r17 - 1492: df 93 push r29 - 1494: cf 93 push r28 - 1496: cd b7 in r28, 0x3d ; 61 - 1498: de b7 in r29, 0x3e ; 62 - 149a: ac 97 sbiw r28, 0x2c ; 44 - 149c: 0f b6 in r0, 0x3f ; 63 - 149e: f8 94 cli - 14a0: de bf out 0x3e, r29 ; 62 - 14a2: 0f be out 0x3f, r0 ; 63 - 14a4: cd bf out 0x3d, r28 ; 61 + 152c: 1f 93 push r17 + 152e: df 93 push r29 + 1530: cf 93 push r28 + 1532: cd b7 in r28, 0x3d ; 61 + 1534: de b7 in r29, 0x3e ; 62 + 1536: ac 97 sbiw r28, 0x2c ; 44 + 1538: 0f b6 in r0, 0x3f ; 63 + 153a: f8 94 cli + 153c: de bf out 0x3e, r29 ; 62 + 153e: 0f be out 0x3f, r0 ; 63 + 1540: cd bf out 0x3d, r28 ; 61 USB_ControlRequest.bRequest = Endpoint_Read_8(); USB_ControlRequest.wValue = Endpoint_Read_16_LE(); USB_ControlRequest.wIndex = Endpoint_Read_16_LE(); USB_ControlRequest.wLength = Endpoint_Read_16_LE(); #else uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; - 14a6: ec ec ldi r30, 0xCC ; 204 - 14a8: f2 e0 ldi r31, 0x02 ; 2 + 1542: ec ec ldi r30, 0xCC ; 204 + 1544: f2 e0 ldi r31, 0x02 ; 2 * \return Next byte in the currently selected endpoint's FIFO buffer. */ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_8(void) { return UEDATX; - 14aa: 80 91 f1 00 lds r24, 0x00F1 + 1546: 80 91 f1 00 lds r24, 0x00F1 for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) *(RequestHeader++) = Endpoint_Read_8(); - 14ae: 81 93 st Z+, r24 + 154a: 81 93 st Z+, r24 USB_ControlRequest.wIndex = Endpoint_Read_16_LE(); 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++) - 14b0: 22 e0 ldi r18, 0x02 ; 2 - 14b2: e4 3d cpi r30, 0xD4 ; 212 - 14b4: f2 07 cpc r31, r18 - 14b6: c9 f7 brne .-14 ; 0x14aa + 154c: 22 e0 ldi r18, 0x02 ; 2 + 154e: e4 3d cpi r30, 0xD4 ; 212 + 1550: f2 07 cpc r31, r18 + 1552: c9 f7 brne .-14 ; 0x1546 *(RequestHeader++) = Endpoint_Read_8(); #endif EVENT_USB_Device_ControlRequest(); - 14b8: f1 d8 rcall .-3614 ; 0x69c + 1554: e9 d8 rcall .-3630 ; 0x728 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 14ba: 80 91 e8 00 lds r24, 0x00E8 + 1556: 80 91 e8 00 lds r24, 0x00E8 if (Endpoint_IsSETUPReceived()) - 14be: 83 ff sbrs r24, 3 - 14c0: 31 c1 rjmp .+610 ; 0x1724 + 155a: 83 ff sbrs r24, 3 + 155c: 31 c1 rjmp .+610 ; 0x17c0 { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 14c2: 80 91 cc 02 lds r24, 0x02CC + 155e: 80 91 cc 02 lds r24, 0x02CC switch (USB_ControlRequest.bRequest) - 14c6: 20 91 cd 02 lds r18, 0x02CD - 14ca: 25 30 cpi r18, 0x05 ; 5 - 14cc: 09 f4 brne .+2 ; 0x14d0 - 14ce: 84 c0 rjmp .+264 ; 0x15d8 - 14d0: 26 30 cpi r18, 0x06 ; 6 - 14d2: 40 f4 brcc .+16 ; 0x14e4 - 14d4: 21 30 cpi r18, 0x01 ; 1 - 14d6: a1 f1 breq .+104 ; 0x1540 - 14d8: 21 30 cpi r18, 0x01 ; 1 - 14da: 70 f0 brcs .+28 ; 0x14f8 - 14dc: 23 30 cpi r18, 0x03 ; 3 - 14de: 09 f0 breq .+2 ; 0x14e2 - 14e0: 21 c1 rjmp .+578 ; 0x1724 - 14e2: 2e c0 rjmp .+92 ; 0x1540 - 14e4: 28 30 cpi r18, 0x08 ; 8 - 14e6: 09 f4 brne .+2 ; 0x14ea - 14e8: ef c0 rjmp .+478 ; 0x16c8 - 14ea: 29 30 cpi r18, 0x09 ; 9 - 14ec: 09 f4 brne .+2 ; 0x14f0 - 14ee: fe c0 rjmp .+508 ; 0x16ec - 14f0: 26 30 cpi r18, 0x06 ; 6 - 14f2: 09 f0 breq .+2 ; 0x14f6 - 14f4: 17 c1 rjmp .+558 ; 0x1724 - 14f6: 92 c0 rjmp .+292 ; 0x161c + 1562: 20 91 cd 02 lds r18, 0x02CD + 1566: 25 30 cpi r18, 0x05 ; 5 + 1568: 09 f4 brne .+2 ; 0x156c + 156a: 84 c0 rjmp .+264 ; 0x1674 + 156c: 26 30 cpi r18, 0x06 ; 6 + 156e: 40 f4 brcc .+16 ; 0x1580 + 1570: 21 30 cpi r18, 0x01 ; 1 + 1572: a1 f1 breq .+104 ; 0x15dc + 1574: 21 30 cpi r18, 0x01 ; 1 + 1576: 70 f0 brcs .+28 ; 0x1594 + 1578: 23 30 cpi r18, 0x03 ; 3 + 157a: 09 f0 breq .+2 ; 0x157e + 157c: 21 c1 rjmp .+578 ; 0x17c0 + 157e: 2e c0 rjmp .+92 ; 0x15dc + 1580: 28 30 cpi r18, 0x08 ; 8 + 1582: 09 f4 brne .+2 ; 0x1586 + 1584: ef c0 rjmp .+478 ; 0x1764 + 1586: 29 30 cpi r18, 0x09 ; 9 + 1588: 09 f4 brne .+2 ; 0x158c + 158a: fe c0 rjmp .+508 ; 0x1788 + 158c: 26 30 cpi r18, 0x06 ; 6 + 158e: 09 f0 breq .+2 ; 0x1592 + 1590: 17 c1 rjmp .+558 ; 0x17c0 + 1592: 92 c0 rjmp .+292 ; 0x16b8 { case REQ_GetStatus: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 14f8: 80 38 cpi r24, 0x80 ; 128 - 14fa: 21 f0 breq .+8 ; 0x1504 - 14fc: 82 38 cpi r24, 0x82 ; 130 - 14fe: 09 f0 breq .+2 ; 0x1502 - 1500: 11 c1 rjmp .+546 ; 0x1724 - 1502: 08 c0 rjmp .+16 ; 0x1514 + 1594: 80 38 cpi r24, 0x80 ; 128 + 1596: 21 f0 breq .+8 ; 0x15a0 + 1598: 82 38 cpi r24, 0x82 ; 130 + 159a: 09 f0 breq .+2 ; 0x159e + 159c: 11 c1 rjmp .+546 ; 0x17c0 + 159e: 08 c0 rjmp .+16 ; 0x15b0 Endpoint_ClearOUT(); } static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; - 1504: 80 91 c9 02 lds r24, 0x02C9 + 15a0: 80 91 c9 02 lds r24, 0x02C9 if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; #endif #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_Device_RemoteWakeupEnabled) - 1508: 90 91 ca 02 lds r25, 0x02CA - 150c: 99 23 and r25, r25 - 150e: 71 f0 breq .+28 ; 0x152c + 15a4: 90 91 ca 02 lds r25, 0x02CA + 15a8: 99 23 and r25, r25 + 15aa: 71 f0 breq .+28 ; 0x15c8 CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 1510: 82 60 ori r24, 0x02 ; 2 - 1512: 0c c0 rjmp .+24 ; 0x152c + 15ac: 82 60 ori r24, 0x02 ; 2 + 15ae: 0c c0 rjmp .+24 ; 0x15c8 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1514: 80 91 d0 02 lds r24, 0x02D0 - 1518: 8f 70 andi r24, 0x0F ; 15 - 151a: 80 93 e9 00 sts 0x00E9, r24 + 15b0: 80 91 d0 02 lds r24, 0x02D0 + 15b4: 8f 70 andi r24, 0x0F ; 15 + 15b6: 80 93 e9 00 sts 0x00E9, r24 * \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 ((UECONX & (1 << STALLRQ)) ? true : false); - 151e: 90 91 eb 00 lds r25, 0x00EB + 15ba: 90 91 eb 00 lds r25, 0x00EB break; case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): #if !defined(CONTROL_ONLY_DEVICE) Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); CurrentStatus = Endpoint_IsStalled(); - 1522: 81 e0 ldi r24, 0x01 ; 1 - 1524: 95 ff sbrs r25, 5 - 1526: 80 e0 ldi r24, 0x00 ; 0 + 15be: 81 e0 ldi r24, 0x01 ; 1 + 15c0: 95 ff sbrs r25, 5 + 15c2: 80 e0 ldi r24, 0x00 ; 0 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1528: 10 92 e9 00 sts 0x00E9, r1 + 15c4: 10 92 e9 00 sts 0x00E9, r1 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 152c: 90 91 e8 00 lds r25, 0x00E8 - 1530: 97 7f andi r25, 0xF7 ; 247 - 1532: 90 93 e8 00 sts 0x00E8, r25 + 15c8: 90 91 e8 00 lds r25, 0x00E8 + 15cc: 97 7f andi r25, 0xF7 ; 247 + 15ce: 90 93 e8 00 sts 0x00E8, r25 * \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) { UEDATX = (Data & 0xFF); - 1536: 80 93 f1 00 sts 0x00F1, r24 + 15d2: 80 93 f1 00 sts 0x00F1, r24 UEDATX = (Data >> 8); - 153a: 10 92 f1 00 sts 0x00F1, r1 - 153e: cf c0 rjmp .+414 ; 0x16de + 15d6: 10 92 f1 00 sts 0x00F1, r1 + 15da: cf c0 rjmp .+414 ; 0x177a } break; case REQ_ClearFeature: case REQ_SetFeature: if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 1540: 88 23 and r24, r24 - 1542: 19 f0 breq .+6 ; 0x154a - 1544: 82 30 cpi r24, 0x02 ; 2 - 1546: 09 f0 breq .+2 ; 0x154a - 1548: ed c0 rjmp .+474 ; 0x1724 + 15dc: 88 23 and r24, r24 + 15de: 19 f0 breq .+6 ; 0x15e6 + 15e0: 82 30 cpi r24, 0x02 ; 2 + 15e2: 09 f0 breq .+2 ; 0x15e6 + 15e4: ed c0 rjmp .+474 ; 0x17c0 Endpoint_ClearStatusStage(); } static void USB_Device_ClearSetFeature(void) { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) - 154a: 90 e0 ldi r25, 0x00 ; 0 - 154c: 8f 71 andi r24, 0x1F ; 31 - 154e: 90 70 andi r25, 0x00 ; 0 - 1550: 00 97 sbiw r24, 0x00 ; 0 - 1552: 29 f0 breq .+10 ; 0x155e - 1554: 82 30 cpi r24, 0x02 ; 2 - 1556: 91 05 cpc r25, r1 - 1558: 09 f0 breq .+2 ; 0x155c - 155a: e4 c0 rjmp .+456 ; 0x1724 - 155c: 0b c0 rjmp .+22 ; 0x1574 + 15e6: 90 e0 ldi r25, 0x00 ; 0 + 15e8: 8f 71 andi r24, 0x1F ; 31 + 15ea: 90 70 andi r25, 0x00 ; 0 + 15ec: 00 97 sbiw r24, 0x00 ; 0 + 15ee: 29 f0 breq .+10 ; 0x15fa + 15f0: 82 30 cpi r24, 0x02 ; 2 + 15f2: 91 05 cpc r25, r1 + 15f4: 09 f0 breq .+2 ; 0x15f8 + 15f6: e4 c0 rjmp .+456 ; 0x17c0 + 15f8: 0b c0 rjmp .+22 ; 0x1610 { #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) - 155e: 80 91 ce 02 lds r24, 0x02CE - 1562: 81 30 cpi r24, 0x01 ; 1 - 1564: 09 f0 breq .+2 ; 0x1568 - 1566: de c0 rjmp .+444 ; 0x1724 + 15fa: 80 91 ce 02 lds r24, 0x02CE + 15fe: 81 30 cpi r24, 0x01 ; 1 + 1600: 09 f0 breq .+2 ; 0x1604 + 1602: de c0 rjmp .+444 ; 0x17c0 USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 1568: 23 30 cpi r18, 0x03 ; 3 - 156a: 09 f0 breq .+2 ; 0x156e - 156c: 80 e0 ldi r24, 0x00 ; 0 - 156e: 80 93 ca 02 sts 0x02CA, r24 - 1572: 2c c0 rjmp .+88 ; 0x15cc + 1604: 23 30 cpi r18, 0x03 ; 3 + 1606: 09 f0 breq .+2 ; 0x160a + 1608: 80 e0 ldi r24, 0x00 ; 0 + 160a: 80 93 ca 02 sts 0x02CA, r24 + 160e: 2c c0 rjmp .+88 ; 0x1668 break; #endif #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 1574: 80 91 ce 02 lds r24, 0x02CE - 1578: 88 23 and r24, r24 - 157a: 41 f5 brne .+80 ; 0x15cc + 1610: 80 91 ce 02 lds r24, 0x02CE + 1614: 88 23 and r24, r24 + 1616: 41 f5 brne .+80 ; 0x1668 { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 157c: 20 91 d0 02 lds r18, 0x02D0 - 1580: 2f 70 andi r18, 0x0F ; 15 + 1618: 20 91 d0 02 lds r18, 0x02D0 + 161c: 2f 70 andi r18, 0x0F ; 15 if (EndpointIndex == ENDPOINT_CONTROLEP) - 1582: 09 f4 brne .+2 ; 0x1586 - 1584: cf c0 rjmp .+414 ; 0x1724 + 161e: 09 f4 brne .+2 ; 0x1622 + 1620: cf c0 rjmp .+414 ; 0x17c0 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1586: 20 93 e9 00 sts 0x00E9, r18 + 1622: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise. */ static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsEnabled(void) { return ((UECONX & (1 << EPEN)) ? true : false); - 158a: 80 91 eb 00 lds r24, 0x00EB + 1626: 80 91 eb 00 lds r24, 0x00EB return; Endpoint_SelectEndpoint(EndpointIndex); if (Endpoint_IsEnabled()) - 158e: 80 ff sbrs r24, 0 - 1590: 1d c0 rjmp .+58 ; 0x15cc + 162a: 80 ff sbrs r24, 0 + 162c: 1d c0 rjmp .+58 ; 0x1668 { if (USB_ControlRequest.bRequest == REQ_SetFeature) - 1592: 80 91 cd 02 lds r24, 0x02CD - 1596: 83 30 cpi r24, 0x03 ; 3 - 1598: 21 f4 brne .+8 ; 0x15a2 + 162e: 80 91 cd 02 lds r24, 0x02CD + 1632: 83 30 cpi r24, 0x03 ; 3 + 1634: 21 f4 brne .+8 ; 0x163e * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_StallTransaction(void) { UECONX |= (1 << STALLRQ); - 159a: 80 91 eb 00 lds r24, 0x00EB - 159e: 80 62 ori r24, 0x20 ; 32 - 15a0: 13 c0 rjmp .+38 ; 0x15c8 + 1636: 80 91 eb 00 lds r24, 0x00EB + 163a: 80 62 ori r24, 0x20 ; 32 + 163c: 13 c0 rjmp .+38 ; 0x1664 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearStall(void) { UECONX |= (1 << STALLRQC); - 15a2: 80 91 eb 00 lds r24, 0x00EB - 15a6: 80 61 ori r24, 0x10 ; 16 - 15a8: 80 93 eb 00 sts 0x00EB, r24 + 163e: 80 91 eb 00 lds r24, 0x00EB + 1642: 80 61 ori r24, 0x10 ; 16 + 1644: 80 93 eb 00 sts 0x00EB, r24 * \param[in] Address Endpoint address whose FIFO buffers are to be reset. */ static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_ResetEndpoint(const uint8_t Address) { UERST = (1 << (Address & ENDPOINT_EPNUM_MASK)); - 15ac: 81 e0 ldi r24, 0x01 ; 1 - 15ae: 90 e0 ldi r25, 0x00 ; 0 - 15b0: 02 c0 rjmp .+4 ; 0x15b6 - 15b2: 88 0f add r24, r24 - 15b4: 99 1f adc r25, r25 - 15b6: 2a 95 dec r18 - 15b8: e2 f7 brpl .-8 ; 0x15b2 - 15ba: 80 93 ea 00 sts 0x00EA, r24 + 1648: 81 e0 ldi r24, 0x01 ; 1 + 164a: 90 e0 ldi r25, 0x00 ; 0 + 164c: 02 c0 rjmp .+4 ; 0x1652 + 164e: 88 0f add r24, r24 + 1650: 99 1f adc r25, r25 + 1652: 2a 95 dec r18 + 1654: e2 f7 brpl .-8 ; 0x164e + 1656: 80 93 ea 00 sts 0x00EA, r24 UERST = 0; - 15be: 10 92 ea 00 sts 0x00EA, r1 + 165a: 10 92 ea 00 sts 0x00EA, 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) { UECONX |= (1 << RSTDT); - 15c2: 80 91 eb 00 lds r24, 0x00EB - 15c6: 88 60 ori r24, 0x08 ; 8 - 15c8: 80 93 eb 00 sts 0x00EB, r24 + 165e: 80 91 eb 00 lds r24, 0x00EB + 1662: 88 60 ori r24, 0x08 ; 8 + 1664: 80 93 eb 00 sts 0x00EB, r24 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 15cc: 10 92 e9 00 sts 0x00E9, r1 + 1668: 10 92 e9 00 sts 0x00E9, r1 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 15d0: 80 91 e8 00 lds r24, 0x00E8 - 15d4: 87 7f andi r24, 0xF7 ; 247 - 15d6: 86 c0 rjmp .+268 ; 0x16e4 + 166c: 80 91 e8 00 lds r24, 0x00E8 + 1670: 87 7f andi r24, 0xF7 ; 247 + 1672: 86 c0 rjmp .+268 ; 0x1780 USB_Device_ClearSetFeature(); } break; case REQ_SetAddress: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 15d8: 88 23 and r24, r24 - 15da: 09 f0 breq .+2 ; 0x15de - 15dc: a3 c0 rjmp .+326 ; 0x1724 + 1674: 88 23 and r24, r24 + 1676: 09 f0 breq .+2 ; 0x167a + 1678: a3 c0 rjmp .+326 ; 0x17c0 } } static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 15de: 10 91 ce 02 lds r17, 0x02CE - 15e2: 1f 77 andi r17, 0x7F ; 127 + 167a: 10 91 ce 02 lds r17, 0x02CE + 167e: 1f 77 andi r17, 0x7F ; 127 #endif static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetDeviceAddress(const uint8_t Address) { UDADDR = (UDADDR & (1 << ADDEN)) | (Address & 0x7F); - 15e4: 80 91 e3 00 lds r24, 0x00E3 - 15e8: 80 78 andi r24, 0x80 ; 128 - 15ea: 81 2b or r24, r17 - 15ec: 80 93 e3 00 sts 0x00E3, r24 - 15f0: 80 91 e8 00 lds r24, 0x00E8 - 15f4: 87 7f andi r24, 0xF7 ; 247 - 15f6: 80 93 e8 00 sts 0x00E8, r24 + 1680: 80 91 e3 00 lds r24, 0x00E3 + 1684: 80 78 andi r24, 0x80 ; 128 + 1686: 81 2b or r24, r17 + 1688: 80 93 e3 00 sts 0x00E3, r24 + 168c: 80 91 e8 00 lds r24, 0x00E8 + 1690: 87 7f andi r24, 0xF7 ; 247 + 1692: 80 93 e8 00 sts 0x00E8, r24 USB_Device_SetDeviceAddress(DeviceAddress); Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 15fa: d2 dd rcall .-1116 ; 0x11a0 + 1696: d2 dd rcall .-1116 ; 0x123c * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 15fc: 80 91 e8 00 lds r24, 0x00E8 + 1698: 80 91 e8 00 lds r24, 0x00E8 while (!(Endpoint_IsINReady())); - 1600: 80 ff sbrs r24, 0 - 1602: fc cf rjmp .-8 ; 0x15fc + 169c: 80 ff sbrs r24, 0 + 169e: fc cf rjmp .-8 ; 0x1698 static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) { (void)Address; UDADDR |= (1 << ADDEN); - 1604: 80 91 e3 00 lds r24, 0x00E3 - 1608: 80 68 ori r24, 0x80 ; 128 - 160a: 80 93 e3 00 sts 0x00E3, r24 + 16a0: 80 91 e3 00 lds r24, 0x00E3 + 16a4: 80 68 ori r24, 0x80 ; 128 + 16a6: 80 93 e3 00 sts 0x00E3, r24 USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 160e: 11 23 and r17, r17 - 1610: 11 f0 breq .+4 ; 0x1616 - 1612: 83 e0 ldi r24, 0x03 ; 3 - 1614: 01 c0 rjmp .+2 ; 0x1618 - 1616: 82 e0 ldi r24, 0x02 ; 2 - 1618: 8e bb out 0x1e, r24 ; 30 - 161a: 84 c0 rjmp .+264 ; 0x1724 + 16aa: 11 23 and r17, r17 + 16ac: 11 f0 breq .+4 ; 0x16b2 + 16ae: 83 e0 ldi r24, 0x03 ; 3 + 16b0: 01 c0 rjmp .+2 ; 0x16b4 + 16b2: 82 e0 ldi r24, 0x02 ; 2 + 16b4: 8e bb out 0x1e, r24 ; 30 + 16b6: 84 c0 rjmp .+264 ; 0x17c0 if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_SetAddress(); break; case REQ_GetDescriptor: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 161c: 80 58 subi r24, 0x80 ; 128 - 161e: 82 30 cpi r24, 0x02 ; 2 - 1620: 08 f0 brcs .+2 ; 0x1624 - 1622: 80 c0 rjmp .+256 ; 0x1724 + 16b8: 80 58 subi r24, 0x80 ; 128 + 16ba: 82 30 cpi r24, 0x02 ; 2 + 16bc: 08 f0 brcs .+2 ; 0x16c0 + 16be: 80 c0 rjmp .+256 ; 0x17c0 !(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)) - 1624: 80 91 ce 02 lds r24, 0x02CE - 1628: 90 91 cf 02 lds r25, 0x02CF - 162c: 23 e0 ldi r18, 0x03 ; 3 - 162e: 8c 3d cpi r24, 0xDC ; 220 - 1630: 92 07 cpc r25, r18 - 1632: 91 f5 brne .+100 ; 0x1698 + 16c0: 80 91 ce 02 lds r24, 0x02CE + 16c4: 90 91 cf 02 lds r25, 0x02CF + 16c8: 23 e0 ldi r18, 0x03 ; 3 + 16ca: 8c 3d cpi r24, 0xDC ; 220 + 16cc: 92 07 cpc r25, r18 + 16ce: 91 f5 brne .+100 ; 0x1734 { USB_Descriptor_Header_t Header; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; - 1634: 83 e0 ldi r24, 0x03 ; 3 - 1636: 8c 83 std Y+4, r24 ; 0x04 + 16d0: 83 e0 ldi r24, 0x03 ; 3 + 16d2: 8c 83 std Y+4, r24 ; 0x04 SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 1638: 8a e2 ldi r24, 0x2A ; 42 - 163a: 8b 83 std Y+3, r24 ; 0x03 + 16d4: 8a e2 ldi r24, 0x2A ; 42 + 16d6: 8b 83 std Y+3, r24 ; 0x03 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 163c: 5f b7 in r21, 0x3f ; 63 + 16d8: 5f b7 in r21, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 163e: f8 94 cli + 16da: f8 94 cli __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); #endif GCC_MEMORY_BARRIER(); - 1640: de 01 movw r26, r28 - 1642: 15 96 adiw r26, 0x05 ; 5 - 1644: 80 e0 ldi r24, 0x00 ; 0 - 1646: 90 e0 ldi r25, 0x00 ; 0 + 16dc: de 01 movw r26, r28 + 16de: 15 96 adiw r26, 0x05 ; 5 + 16e0: 80 e0 ldi r24, 0x00 ; 0 + 16e2: 90 e0 ldi r25, 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; - 1648: 4e e0 ldi r20, 0x0E ; 14 + 16e4: 4e e0 ldi r20, 0x0E ; 14 for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte = boot_signature_byte_get(SigReadAddress); - 164a: 61 e2 ldi r22, 0x21 ; 33 - 164c: e4 2f mov r30, r20 - 164e: f0 e0 ldi r31, 0x00 ; 0 - 1650: 60 93 57 00 sts 0x0057, r22 - 1654: e4 91 lpm r30, Z+ + 16e6: 61 e2 ldi r22, 0x21 ; 33 + 16e8: e4 2f mov r30, r20 + 16ea: f0 e0 ldi r31, 0x00 ; 0 + 16ec: 60 93 57 00 sts 0x0057, r22 + 16f0: e4 91 lpm r30, Z+ if (SerialCharNum & 0x01) - 1656: 80 ff sbrs r24, 0 - 1658: 03 c0 rjmp .+6 ; 0x1660 + 16f2: 80 ff sbrs r24, 0 + 16f4: 03 c0 rjmp .+6 ; 0x16fc { SerialByte >>= 4; - 165a: e2 95 swap r30 - 165c: ef 70 andi r30, 0x0F ; 15 + 16f6: e2 95 swap r30 + 16f8: ef 70 andi r30, 0x0F ; 15 SigReadAddress++; - 165e: 4f 5f subi r20, 0xFF ; 255 + 16fa: 4f 5f subi r20, 0xFF ; 255 } SerialByte &= 0x0F; - 1660: ef 70 andi r30, 0x0F ; 15 - 1662: 2e 2f mov r18, r30 - 1664: 30 e0 ldi r19, 0x00 ; 0 + 16fc: ef 70 andi r30, 0x0F ; 15 + 16fe: 2e 2f mov r18, r30 + 1700: 30 e0 ldi r19, 0x00 ; 0 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 1666: ea 30 cpi r30, 0x0A ; 10 - 1668: 18 f0 brcs .+6 ; 0x1670 - 166a: 29 5c subi r18, 0xC9 ; 201 - 166c: 3f 4f sbci r19, 0xFF ; 255 - 166e: 02 c0 rjmp .+4 ; 0x1674 - 1670: 20 5d subi r18, 0xD0 ; 208 - 1672: 3f 4f sbci r19, 0xFF ; 255 - 1674: 2d 93 st X+, r18 - 1676: 3d 93 st X+, r19 - 1678: 01 96 adiw r24, 0x01 ; 1 + 1702: ea 30 cpi r30, 0x0A ; 10 + 1704: 18 f0 brcs .+6 ; 0x170c + 1706: 29 5c subi r18, 0xC9 ; 201 + 1708: 3f 4f sbci r19, 0xFF ; 255 + 170a: 02 c0 rjmp .+4 ; 0x1710 + 170c: 20 5d subi r18, 0xD0 ; 208 + 170e: 3f 4f sbci r19, 0xFF ; 255 + 1710: 2d 93 st X+, r18 + 1712: 3d 93 st X+, r19 + 1714: 01 96 adiw r24, 0x01 ; 1 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++) - 167a: 84 31 cpi r24, 0x14 ; 20 - 167c: 91 05 cpc r25, r1 - 167e: 31 f7 brne .-52 ; 0x164c + 1716: 84 31 cpi r24, 0x14 ; 20 + 1718: 91 05 cpc r25, r1 + 171a: 31 f7 brne .-52 ; 0x16e8 static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 1680: 5f bf out 0x3f, r21 ; 63 + 171c: 5f bf out 0x3f, r21 ; 63 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 1682: 80 91 e8 00 lds r24, 0x00E8 - 1686: 87 7f andi r24, 0xF7 ; 247 - 1688: 80 93 e8 00 sts 0x00E8, r24 + 171e: 80 91 e8 00 lds r24, 0x00E8 + 1722: 87 7f andi r24, 0xF7 ; 247 + 1724: 80 93 e8 00 sts 0x00E8, r24 USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); Endpoint_ClearSETUP(); Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); - 168c: ce 01 movw r24, r28 - 168e: 03 96 adiw r24, 0x03 ; 3 - 1690: 6a e2 ldi r22, 0x2A ; 42 - 1692: 70 e0 ldi r23, 0x00 ; 0 - 1694: 55 dc rcall .-1878 ; 0xf40 - 1696: 12 c0 rjmp .+36 ; 0x16bc + 1728: ce 01 movw r24, r28 + 172a: 03 96 adiw r24, 0x03 ; 3 + 172c: 6a e2 ldi r22, 0x2A ; 42 + 172e: 70 e0 ldi r23, 0x00 ; 0 + 1730: 55 dc rcall .-1878 ; 0xfdc + 1732: 12 c0 rjmp .+36 ; 0x1758 USB_Device_GetInternalSerialDescriptor(); return; } #endif if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 1698: 60 91 d0 02 lds r22, 0x02D0 - 169c: ae 01 movw r20, r28 - 169e: 4f 5f subi r20, 0xFF ; 255 - 16a0: 5f 4f sbci r21, 0xFF ; 255 - 16a2: 21 dc rcall .-1982 ; 0xee6 - 16a4: bc 01 movw r22, r24 - 16a6: 00 97 sbiw r24, 0x00 ; 0 - 16a8: 09 f4 brne .+2 ; 0x16ac - 16aa: 3c c0 rjmp .+120 ; 0x1724 - 16ac: 80 91 e8 00 lds r24, 0x00E8 - 16b0: 87 7f andi r24, 0xF7 ; 247 - 16b2: 80 93 e8 00 sts 0x00E8, r24 + 1734: 60 91 d0 02 lds r22, 0x02D0 + 1738: ae 01 movw r20, r28 + 173a: 4f 5f subi r20, 0xFF ; 255 + 173c: 5f 4f sbci r21, 0xFF ; 255 + 173e: 21 dc rcall .-1982 ; 0xf82 + 1740: bc 01 movw r22, r24 + 1742: 00 97 sbiw r24, 0x00 ; 0 + 1744: 09 f4 brne .+2 ; 0x1748 + 1746: 3c c0 rjmp .+120 ; 0x17c0 + 1748: 80 91 e8 00 lds r24, 0x00E8 + 174c: 87 7f andi r24, 0xF7 ; 247 + 174e: 80 93 e8 00 sts 0x00E8, r24 #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); - 16b6: 89 81 ldd r24, Y+1 ; 0x01 - 16b8: 9a 81 ldd r25, Y+2 ; 0x02 - 16ba: 9c dc rcall .-1736 ; 0xff4 + 1752: 89 81 ldd r24, Y+1 ; 0x01 + 1754: 9a 81 ldd r25, Y+2 ; 0x02 + 1756: 9c dc rcall .-1736 ; 0x1090 */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 16bc: 80 91 e8 00 lds r24, 0x00E8 - 16c0: 8b 77 andi r24, 0x7B ; 123 - 16c2: 80 93 e8 00 sts 0x00E8, r24 - 16c6: 2e c0 rjmp .+92 ; 0x1724 + 1758: 80 91 e8 00 lds r24, 0x00E8 + 175c: 8b 77 andi r24, 0x7B ; 123 + 175e: 80 93 e8 00 sts 0x00E8, r24 + 1762: 2e c0 rjmp .+92 ; 0x17c0 USB_Device_GetDescriptor(); } break; case REQ_GetConfiguration: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 16c8: 80 38 cpi r24, 0x80 ; 128 - 16ca: 61 f5 brne .+88 ; 0x1724 + 1764: 80 38 cpi r24, 0x80 ; 128 + 1766: 61 f5 brne .+88 ; 0x17c0 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 16cc: 80 91 e8 00 lds r24, 0x00E8 - 16d0: 87 7f andi r24, 0xF7 ; 247 - 16d2: 80 93 e8 00 sts 0x00E8, r24 + 1768: 80 91 e8 00 lds r24, 0x00E8 + 176c: 87 7f andi r24, 0xF7 ; 247 + 176e: 80 93 e8 00 sts 0x00E8, r24 static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); Endpoint_Write_8(USB_Device_ConfigurationNumber); - 16d6: 80 91 c8 02 lds r24, 0x02C8 + 1772: 80 91 c8 02 lds r24, 0x02C8 * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 16da: 80 93 f1 00 sts 0x00F1, r24 + 1776: 80 93 f1 00 sts 0x00F1, r24 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 16de: 80 91 e8 00 lds r24, 0x00E8 - 16e2: 8e 77 andi r24, 0x7E ; 126 - 16e4: 80 93 e8 00 sts 0x00E8, r24 + 177a: 80 91 e8 00 lds r24, 0x00E8 + 177e: 8e 77 andi r24, 0x7E ; 126 + 1780: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 16e8: 5b dd rcall .-1354 ; 0x11a0 - 16ea: 1c c0 rjmp .+56 ; 0x1724 + 1784: 5b dd rcall .-1354 ; 0x123c + 1786: 1c c0 rjmp .+56 ; 0x17c0 if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_GetConfiguration(); break; case REQ_SetConfiguration: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 16ec: 88 23 and r24, r24 - 16ee: d1 f4 brne .+52 ; 0x1724 + 1788: 88 23 and r24, r24 + 178a: d1 f4 brne .+52 ; 0x17c0 } static void USB_Device_SetConfiguration(void) { #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 16f0: 90 91 ce 02 lds r25, 0x02CE - 16f4: 92 30 cpi r25, 0x02 ; 2 - 16f6: b0 f4 brcc .+44 ; 0x1724 + 178c: 90 91 ce 02 lds r25, 0x02CE + 1790: 92 30 cpi r25, 0x02 ; 2 + 1792: b0 f4 brcc .+44 ; 0x17c0 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 16f8: 80 91 e8 00 lds r24, 0x00E8 - 16fc: 87 7f andi r24, 0xF7 ; 247 - 16fe: 80 93 e8 00 sts 0x00E8, r24 + 1794: 80 91 e8 00 lds r24, 0x00E8 + 1798: 87 7f andi r24, 0xF7 ; 247 + 179a: 80 93 e8 00 sts 0x00E8, r24 #endif #endif Endpoint_ClearSETUP(); USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 1702: 90 93 c8 02 sts 0x02C8, r25 + 179e: 90 93 c8 02 sts 0x02C8, r25 Endpoint_ClearStatusStage(); - 1706: 4c dd rcall .-1384 ; 0x11a0 + 17a2: 4c dd rcall .-1384 ; 0x123c if (USB_Device_ConfigurationNumber) - 1708: 80 91 c8 02 lds r24, 0x02C8 - 170c: 88 23 and r24, r24 - 170e: 21 f4 brne .+8 ; 0x1718 + 17a4: 80 91 c8 02 lds r24, 0x02C8 + 17a8: 88 23 and r24, r24 + 17aa: 21 f4 brne .+8 ; 0x17b4 } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return (UDADDR & (1 << ADDEN)); - 1710: 80 91 e3 00 lds r24, 0x00E3 + 17ac: 80 91 e3 00 lds r24, 0x00E3 USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - 1714: 87 ff sbrs r24, 7 - 1716: 02 c0 rjmp .+4 ; 0x171c - 1718: 84 e0 ldi r24, 0x04 ; 4 - 171a: 01 c0 rjmp .+2 ; 0x171e - 171c: 81 e0 ldi r24, 0x01 ; 1 - 171e: 8e bb out 0x1e, r24 ; 30 + 17b0: 87 ff sbrs r24, 7 + 17b2: 02 c0 rjmp .+4 ; 0x17b8 + 17b4: 84 e0 ldi r24, 0x04 ; 4 + 17b6: 01 c0 rjmp .+2 ; 0x17ba + 17b8: 81 e0 ldi r24, 0x01 ; 1 + 17ba: 8e bb out 0x1e, r24 ; 30 EVENT_USB_Device_ConfigurationChanged(); - 1720: 0e 94 4a 03 call 0x694 ; 0x694 + 17bc: 0e 94 90 03 call 0x720 ; 0x720 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 1724: 80 91 e8 00 lds r24, 0x00E8 + 17c0: 80 91 e8 00 lds r24, 0x00E8 default: break; } } if (Endpoint_IsSETUPReceived()) - 1728: 83 ff sbrs r24, 3 - 172a: 0a c0 rjmp .+20 ; 0x1740 + 17c4: 83 ff sbrs r24, 3 + 17c6: 0a c0 rjmp .+20 ; 0x17dc * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 172c: 80 91 e8 00 lds r24, 0x00E8 - 1730: 87 7f andi r24, 0xF7 ; 247 - 1732: 80 93 e8 00 sts 0x00E8, r24 + 17c8: 80 91 e8 00 lds r24, 0x00E8 + 17cc: 87 7f andi r24, 0xF7 ; 247 + 17ce: 80 93 e8 00 sts 0x00E8, r24 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_StallTransaction(void) { UECONX |= (1 << STALLRQ); - 1736: 80 91 eb 00 lds r24, 0x00EB - 173a: 80 62 ori r24, 0x20 ; 32 - 173c: 80 93 eb 00 sts 0x00EB, r24 + 17d2: 80 91 eb 00 lds r24, 0x00EB + 17d6: 80 62 ori r24, 0x20 ; 32 + 17d8: 80 93 eb 00 sts 0x00EB, r24 { Endpoint_ClearSETUP(); Endpoint_StallTransaction(); } } - 1740: ac 96 adiw r28, 0x2c ; 44 - 1742: 0f b6 in r0, 0x3f ; 63 - 1744: f8 94 cli - 1746: de bf out 0x3e, r29 ; 62 - 1748: 0f be out 0x3f, r0 ; 63 - 174a: cd bf out 0x3d, r28 ; 61 - 174c: cf 91 pop r28 - 174e: df 91 pop r29 - 1750: 1f 91 pop r17 - 1752: 08 95 ret - -00001754 : + 17dc: ac 96 adiw r28, 0x2c ; 44 + 17de: 0f b6 in r0, 0x3f ; 63 + 17e0: f8 94 cli + 17e2: de bf out 0x3e, r29 ; 62 + 17e4: 0f be out 0x3f, r0 ; 63 + 17e6: cd bf out 0x3d, r28 ; 61 + 17e8: cf 91 pop r28 + 17ea: df 91 pop r29 + 17ec: 1f 91 pop r17 + 17ee: 08 95 ret + +000017f0 : #include "Events.h" void USB_Event_Stub(void) { } - 1754: 08 95 ret + 17f0: 08 95 ret -00001756 : +000017f2 : #if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) volatile uint8_t USB_DeviceState; #endif void USB_USBTask(void) { - 1756: 1f 93 push r17 + 17f2: 1f 93 push r17 } #if defined(USB_CAN_BE_DEVICE) static void USB_DeviceTask(void) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 1758: 8e b3 in r24, 0x1e ; 30 - 175a: 88 23 and r24, r24 - 175c: a9 f0 breq .+42 ; 0x1788 + 17f4: 8e b3 in r24, 0x1e ; 30 + 17f6: 88 23 and r24, r24 + 17f8: a9 f0 breq .+42 ; 0x1824 */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { #if !defined(CONTROL_ONLY_DEVICE) return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); - 175e: 80 91 e9 00 lds r24, 0x00E9 - 1762: 8f 70 andi r24, 0x0F ; 15 + 17fa: 80 91 e9 00 lds r24, 0x00E9 + 17fe: 8f 70 andi r24, 0x0F ; 15 * \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 (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; - 1764: 90 91 ec 00 lds r25, 0x00EC - 1768: 90 ff sbrs r25, 0 - 176a: 02 c0 rjmp .+4 ; 0x1770 - 176c: 10 e8 ldi r17, 0x80 ; 128 - 176e: 01 c0 rjmp .+2 ; 0x1772 - 1770: 10 e0 ldi r17, 0x00 ; 0 + 1800: 90 91 ec 00 lds r25, 0x00EC + 1804: 90 ff sbrs r25, 0 + 1806: 02 c0 rjmp .+4 ; 0x180c + 1808: 10 e8 ldi r17, 0x80 ; 128 + 180a: 01 c0 rjmp .+2 ; 0x180e + 180c: 10 e0 ldi r17, 0x00 ; 0 */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { #if !defined(CONTROL_ONLY_DEVICE) return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); - 1772: 18 2b or r17, r24 + 180e: 18 2b or r17, r24 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1774: 10 92 e9 00 sts 0x00E9, r1 + 1810: 10 92 e9 00 sts 0x00E9, r1 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 1778: 80 91 e8 00 lds r24, 0x00E8 + 1814: 80 91 e8 00 lds r24, 0x00E8 uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); if (Endpoint_IsSETUPReceived()) - 177c: 83 ff sbrs r24, 3 - 177e: 01 c0 rjmp .+2 ; 0x1782 + 1818: 83 ff sbrs r24, 3 + 181a: 01 c0 rjmp .+2 ; 0x181e USB_Device_ProcessControlRequest(); - 1780: 87 de rcall .-754 ; 0x1490 + 181c: 87 de rcall .-754 ; 0x152c */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1782: 1f 70 andi r17, 0x0F ; 15 - 1784: 10 93 e9 00 sts 0x00E9, r17 + 181e: 1f 70 andi r17, 0x0F ; 15 + 1820: 10 93 e9 00 sts 0x00E9, r17 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 1788: 1f 91 pop r17 - 178a: 08 95 ret + 1824: 1f 91 pop r17 + 1826: 08 95 ret -0000178c : +00001828 : #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) { - 178c: cf 93 push r28 - 178e: df 93 push r29 - 1790: ec 01 movw r28, r24 + 1828: cf 93 push r28 + 182a: df 93 push r29 + 182c: ec 01 movw r28, r24 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 1792: 80 91 e8 00 lds r24, 0x00E8 + 182e: 80 91 e8 00 lds r24, 0x00E8 if (!(Endpoint_IsSETUPReceived())) - 1796: 83 ff sbrs r24, 3 - 1798: a3 c0 rjmp .+326 ; 0x18e0 + 1832: 83 ff sbrs r24, 3 + 1834: a3 c0 rjmp .+326 ; 0x197c return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 179a: 88 81 ld r24, Y - 179c: 90 e0 ldi r25, 0x00 ; 0 - 179e: 20 91 d0 02 lds r18, 0x02D0 - 17a2: 30 91 d1 02 lds r19, 0x02D1 - 17a6: 28 17 cp r18, r24 - 17a8: 39 07 cpc r19, r25 - 17aa: 09 f0 breq .+2 ; 0x17ae - 17ac: 99 c0 rjmp .+306 ; 0x18e0 + 1836: 88 81 ld r24, Y + 1838: 90 e0 ldi r25, 0x00 ; 0 + 183a: 20 91 d0 02 lds r18, 0x02D0 + 183e: 30 91 d1 02 lds r19, 0x02D1 + 1842: 28 17 cp r18, r24 + 1844: 39 07 cpc r19, r25 + 1846: 09 f0 breq .+2 ; 0x184a + 1848: 99 c0 rjmp .+306 ; 0x197c return; switch (USB_ControlRequest.bRequest) - 17ae: 80 91 cd 02 lds r24, 0x02CD - 17b2: 81 32 cpi r24, 0x21 ; 33 - 17b4: 69 f0 breq .+26 ; 0x17d0 - 17b6: 82 32 cpi r24, 0x22 ; 34 - 17b8: 20 f4 brcc .+8 ; 0x17c2 - 17ba: 80 32 cpi r24, 0x20 ; 32 - 17bc: 09 f0 breq .+2 ; 0x17c0 - 17be: 90 c0 rjmp .+288 ; 0x18e0 - 17c0: 3c c0 rjmp .+120 ; 0x183a - 17c2: 82 32 cpi r24, 0x22 ; 34 - 17c4: 09 f4 brne .+2 ; 0x17c8 - 17c6: 6b c0 rjmp .+214 ; 0x189e - 17c8: 83 32 cpi r24, 0x23 ; 35 - 17ca: 09 f0 breq .+2 ; 0x17ce - 17cc: 89 c0 rjmp .+274 ; 0x18e0 - 17ce: 7a c0 rjmp .+244 ; 0x18c4 + 184a: 80 91 cd 02 lds r24, 0x02CD + 184e: 81 32 cpi r24, 0x21 ; 33 + 1850: 69 f0 breq .+26 ; 0x186c + 1852: 82 32 cpi r24, 0x22 ; 34 + 1854: 20 f4 brcc .+8 ; 0x185e + 1856: 80 32 cpi r24, 0x20 ; 32 + 1858: 09 f0 breq .+2 ; 0x185c + 185a: 90 c0 rjmp .+288 ; 0x197c + 185c: 3c c0 rjmp .+120 ; 0x18d6 + 185e: 82 32 cpi r24, 0x22 ; 34 + 1860: 09 f4 brne .+2 ; 0x1864 + 1862: 6b c0 rjmp .+214 ; 0x193a + 1864: 83 32 cpi r24, 0x23 ; 35 + 1866: 09 f0 breq .+2 ; 0x186a + 1868: 89 c0 rjmp .+274 ; 0x197c + 186a: 7a c0 rjmp .+244 ; 0x1960 { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 17d0: 80 91 cc 02 lds r24, 0x02CC - 17d4: 81 3a cpi r24, 0xA1 ; 161 - 17d6: 09 f0 breq .+2 ; 0x17da - 17d8: 83 c0 rjmp .+262 ; 0x18e0 + 186c: 80 91 cc 02 lds r24, 0x02CC + 1870: 81 3a cpi r24, 0xA1 ; 161 + 1872: 09 f0 breq .+2 ; 0x1876 + 1874: 83 c0 rjmp .+262 ; 0x197c * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 17da: 80 91 e8 00 lds r24, 0x00E8 - 17de: 87 7f andi r24, 0xF7 ; 247 - 17e0: 80 93 e8 00 sts 0x00E8, r24 + 1876: 80 91 e8 00 lds r24, 0x00E8 + 187a: 87 7f andi r24, 0xF7 ; 247 + 187c: 80 93 e8 00 sts 0x00E8, r24 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 17e4: 80 91 e8 00 lds r24, 0x00E8 + 1880: 80 91 e8 00 lds r24, 0x00E8 { Endpoint_ClearSETUP(); while (!(Endpoint_IsINReady())); - 17e8: 80 ff sbrs r24, 0 - 17ea: fc cf rjmp .-8 ; 0x17e4 + 1884: 80 ff sbrs r24, 0 + 1886: fc cf rjmp .-8 ; 0x1880 Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 17ec: 8c 89 ldd r24, Y+20 ; 0x14 - 17ee: 9d 89 ldd r25, Y+21 ; 0x15 - 17f0: ae 89 ldd r26, Y+22 ; 0x16 - 17f2: bf 89 ldd r27, Y+23 ; 0x17 + 1888: 8c 89 ldd r24, Y+20 ; 0x14 + 188a: 9d 89 ldd r25, Y+21 ; 0x15 + 188c: ae 89 ldd r26, Y+22 ; 0x16 + 188e: bf 89 ldd r27, 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) { UEDATX = (Data & 0xFF); - 17f4: 80 93 f1 00 sts 0x00F1, r24 + 1890: 80 93 f1 00 sts 0x00F1, r24 UEDATX = (Data >> 8); - 17f8: 29 2f mov r18, r25 - 17fa: 3a 2f mov r19, r26 - 17fc: 4b 2f mov r20, r27 - 17fe: 55 27 eor r21, r21 - 1800: 20 93 f1 00 sts 0x00F1, r18 + 1894: 29 2f mov r18, r25 + 1896: 3a 2f mov r19, r26 + 1898: 4b 2f mov r20, r27 + 189a: 55 27 eor r21, r21 + 189c: 20 93 f1 00 sts 0x00F1, r18 UEDATX = (Data >> 16); - 1804: 9d 01 movw r18, r26 - 1806: 44 27 eor r20, r20 - 1808: 55 27 eor r21, r21 - 180a: 20 93 f1 00 sts 0x00F1, r18 + 18a0: 9d 01 movw r18, r26 + 18a2: 44 27 eor r20, r20 + 18a4: 55 27 eor r21, r21 + 18a6: 20 93 f1 00 sts 0x00F1, r18 UEDATX = (Data >> 24); - 180e: 8b 2f mov r24, r27 - 1810: 99 27 eor r25, r25 - 1812: aa 27 eor r26, r26 - 1814: bb 27 eor r27, r27 - 1816: 80 93 f1 00 sts 0x00F1, r24 + 18aa: 8b 2f mov r24, r27 + 18ac: 99 27 eor r25, r25 + 18ae: aa 27 eor r26, r26 + 18b0: bb 27 eor r27, r27 + 18b2: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 181a: 88 8d ldd r24, Y+24 ; 0x18 + 18b6: 88 8d ldd r24, Y+24 ; 0x18 * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 181c: 80 93 f1 00 sts 0x00F1, r24 + 18b8: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 1820: 89 8d ldd r24, Y+25 ; 0x19 - 1822: 80 93 f1 00 sts 0x00F1, r24 + 18bc: 89 8d ldd r24, Y+25 ; 0x19 + 18be: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 1826: 8a 8d ldd r24, Y+26 ; 0x1a - 1828: 80 93 f1 00 sts 0x00F1, r24 + 18c2: 8a 8d ldd r24, Y+26 ; 0x1a + 18c4: 80 93 f1 00 sts 0x00F1, r24 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 182c: 80 91 e8 00 lds r24, 0x00E8 - 1830: 8e 77 andi r24, 0x7E ; 126 - 1832: 80 93 e8 00 sts 0x00E8, r24 + 18c8: 80 91 e8 00 lds r24, 0x00E8 + 18cc: 8e 77 andi r24, 0x7E ; 126 + 18ce: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 1836: b4 dc rcall .-1688 ; 0x11a0 - 1838: 53 c0 rjmp .+166 ; 0x18e0 + 18d2: b4 dc rcall .-1688 ; 0x123c + 18d4: 53 c0 rjmp .+166 ; 0x197c } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 183a: 80 91 cc 02 lds r24, 0x02CC - 183e: 81 32 cpi r24, 0x21 ; 33 - 1840: 09 f0 breq .+2 ; 0x1844 - 1842: 4e c0 rjmp .+156 ; 0x18e0 + 18d6: 80 91 cc 02 lds r24, 0x02CC + 18da: 81 32 cpi r24, 0x21 ; 33 + 18dc: 09 f0 breq .+2 ; 0x18e0 + 18de: 4e c0 rjmp .+156 ; 0x197c * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 1844: 80 91 e8 00 lds r24, 0x00E8 - 1848: 87 7f andi r24, 0xF7 ; 247 - 184a: 80 93 e8 00 sts 0x00E8, r24 + 18e0: 80 91 e8 00 lds r24, 0x00E8 + 18e4: 87 7f andi r24, 0xF7 ; 247 + 18e6: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 184e: 04 c0 rjmp .+8 ; 0x1858 + 18ea: 04 c0 rjmp .+8 ; 0x18f4 { if (USB_DeviceState == DEVICE_STATE_Unattached) - 1850: 8e b3 in r24, 0x1e ; 30 - 1852: 88 23 and r24, r24 - 1854: 09 f4 brne .+2 ; 0x1858 - 1856: 44 c0 rjmp .+136 ; 0x18e0 + 18ec: 8e b3 in r24, 0x1e ; 30 + 18ee: 88 23 and r24, r24 + 18f0: 09 f4 brne .+2 ; 0x18f4 + 18f2: 44 c0 rjmp .+136 ; 0x197c * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 1858: 80 91 e8 00 lds r24, 0x00E8 + 18f4: 80 91 e8 00 lds r24, 0x00E8 case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 185c: 82 ff sbrs r24, 2 - 185e: f8 cf rjmp .-16 ; 0x1850 + 18f8: 82 ff sbrs r24, 2 + 18fa: f8 cf rjmp .-16 ; 0x18ec { uint32_t Value; uint8_t Bytes[4]; } Data; Data.Bytes[0] = UEDATX; - 1860: 30 91 f1 00 lds r19, 0x00F1 + 18fc: 30 91 f1 00 lds r19, 0x00F1 Data.Bytes[1] = UEDATX; - 1864: 20 91 f1 00 lds r18, 0x00F1 + 1900: 20 91 f1 00 lds r18, 0x00F1 Data.Bytes[2] = UEDATX; - 1868: 90 91 f1 00 lds r25, 0x00F1 + 1904: 90 91 f1 00 lds r25, 0x00F1 Data.Bytes[3] = UEDATX; - 186c: 80 91 f1 00 lds r24, 0x00F1 + 1908: 80 91 f1 00 lds r24, 0x00F1 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 1870: 3c 8b std Y+20, r19 ; 0x14 - 1872: 2d 8b std Y+21, r18 ; 0x15 - 1874: 9e 8b std Y+22, r25 ; 0x16 - 1876: 8f 8b std Y+23, r24 ; 0x17 + 190c: 3c 8b std Y+20, r19 ; 0x14 + 190e: 2d 8b std Y+21, r18 ; 0x15 + 1910: 9e 8b std Y+22, r25 ; 0x16 + 1912: 8f 8b std Y+23, r24 ; 0x17 * \return Next byte in the currently selected endpoint's FIFO buffer. */ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_8(void) { return UEDATX; - 1878: 80 91 f1 00 lds r24, 0x00F1 + 1914: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 187c: 88 8f std Y+24, r24 ; 0x18 - 187e: 80 91 f1 00 lds r24, 0x00F1 + 1918: 88 8f std Y+24, r24 ; 0x18 + 191a: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 1882: 89 8f std Y+25, r24 ; 0x19 - 1884: 80 91 f1 00 lds r24, 0x00F1 + 191e: 89 8f std Y+25, r24 ; 0x19 + 1920: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 1888: 8a 8f std Y+26, r24 ; 0x1a + 1924: 8a 8f std Y+26, r24 ; 0x1a */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 188a: 80 91 e8 00 lds r24, 0x00E8 - 188e: 8b 77 andi r24, 0x7B ; 123 - 1890: 80 93 e8 00 sts 0x00E8, r24 + 1926: 80 91 e8 00 lds r24, 0x00E8 + 192a: 8b 77 andi r24, 0x7B ; 123 + 192c: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); - 1894: 85 dc rcall .-1782 ; 0x11a0 + 1930: 85 dc rcall .-1782 ; 0x123c EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 1896: ce 01 movw r24, r28 - 1898: 0e 94 7c 03 call 0x6f8 ; 0x6f8 - 189c: 21 c0 rjmp .+66 ; 0x18e0 + 1932: ce 01 movw r24, r28 + 1934: 0e 94 c2 03 call 0x784 ; 0x784 + 1938: 21 c0 rjmp .+66 ; 0x197c } break; case CDC_REQ_SetControlLineState: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 189e: 80 91 cc 02 lds r24, 0x02CC - 18a2: 81 32 cpi r24, 0x21 ; 33 - 18a4: e9 f4 brne .+58 ; 0x18e0 + 193a: 80 91 cc 02 lds r24, 0x02CC + 193e: 81 32 cpi r24, 0x21 ; 33 + 1940: e9 f4 brne .+58 ; 0x197c * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 18a6: 80 91 e8 00 lds r24, 0x00E8 - 18aa: 87 7f andi r24, 0xF7 ; 247 - 18ac: 80 93 e8 00 sts 0x00E8, r24 + 1942: 80 91 e8 00 lds r24, 0x00E8 + 1946: 87 7f andi r24, 0xF7 ; 247 + 1948: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 18b0: 77 dc rcall .-1810 ; 0x11a0 + 194c: 77 dc rcall .-1810 ; 0x123c CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 18b2: 80 91 ce 02 lds r24, 0x02CE - 18b6: 90 91 cf 02 lds r25, 0x02CF - 18ba: 99 8b std Y+17, r25 ; 0x11 - 18bc: 88 8b std Y+16, r24 ; 0x10 + 194e: 80 91 ce 02 lds r24, 0x02CE + 1952: 90 91 cf 02 lds r25, 0x02CF + 1956: 99 8b std Y+17, r25 ; 0x11 + 1958: 88 8b std Y+16, r24 ; 0x10 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 18be: ce 01 movw r24, r28 - 18c0: d4 d0 rcall .+424 ; 0x1a6a - 18c2: 0e c0 rjmp .+28 ; 0x18e0 + 195a: ce 01 movw r24, r28 + 195c: d4 d0 rcall .+424 ; 0x1b06 + 195e: 0e c0 rjmp .+28 ; 0x197c } break; case CDC_REQ_SendBreak: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 18c4: 80 91 cc 02 lds r24, 0x02CC - 18c8: 81 32 cpi r24, 0x21 ; 33 - 18ca: 51 f4 brne .+20 ; 0x18e0 - 18cc: 80 91 e8 00 lds r24, 0x00E8 - 18d0: 87 7f andi r24, 0xF7 ; 247 - 18d2: 80 93 e8 00 sts 0x00E8, r24 + 1960: 80 91 cc 02 lds r24, 0x02CC + 1964: 81 32 cpi r24, 0x21 ; 33 + 1966: 51 f4 brne .+20 ; 0x197c + 1968: 80 91 e8 00 lds r24, 0x00E8 + 196c: 87 7f andi r24, 0xF7 ; 247 + 196e: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 18d6: 64 dc rcall .-1848 ; 0x11a0 + 1972: 64 dc rcall .-1848 ; 0x123c EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 18d8: ce 01 movw r24, r28 - 18da: 60 91 ce 02 lds r22, 0x02CE - 18de: c5 d0 rcall .+394 ; 0x1a6a + 1974: ce 01 movw r24, r28 + 1976: 60 91 ce 02 lds r22, 0x02CE + 197a: c5 d0 rcall .+394 ; 0x1b06 } break; } } - 18e0: df 91 pop r29 - 18e2: cf 91 pop r28 - 18e4: 08 95 ret + 197c: df 91 pop r29 + 197e: cf 91 pop r28 + 1980: 08 95 ret -000018e6 : +00001982 : bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 18e6: cf 93 push r28 - 18e8: df 93 push r29 - 18ea: ec 01 movw r28, r24 + 1982: cf 93 push r28 + 1984: df 93 push r29 + 1986: ec 01 movw r28, r24 memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State)); - 18ec: 40 96 adiw r24, 0x10 ; 16 - 18ee: fc 01 movw r30, r24 - 18f0: 8b e0 ldi r24, 0x0B ; 11 - 18f2: df 01 movw r26, r30 - 18f4: 1d 92 st X+, r1 - 18f6: 8a 95 dec r24 - 18f8: e9 f7 brne .-6 ; 0x18f4 + 1988: 40 96 adiw r24, 0x10 ; 16 + 198a: fc 01 movw r30, r24 + 198c: 8b e0 ldi r24, 0x0B ; 11 + 198e: df 01 movw r26, r30 + 1990: 1d 92 st X+, r1 + 1992: 8a 95 dec r24 + 1994: e9 f7 brne .-6 ; 0x1990 CDCInterfaceInfo->Config.DataINEndpoint.Type = EP_TYPE_BULK; - 18fa: 82 e0 ldi r24, 0x02 ; 2 - 18fc: 8c 83 std Y+4, r24 ; 0x04 + 1996: 82 e0 ldi r24, 0x02 ; 2 + 1998: 8c 83 std Y+4, r24 ; 0x04 CDCInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK; - 18fe: 89 87 std Y+9, r24 ; 0x09 + 199a: 89 87 std Y+9, r24 ; 0x09 CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; - 1900: 83 e0 ldi r24, 0x03 ; 3 - 1902: 8e 87 std Y+14, r24 ; 0x0e + 199c: 83 e0 ldi r24, 0x03 ; 3 + 199e: 8e 87 std Y+14, r24 ; 0x0e if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) - 1904: ce 01 movw r24, r28 - 1906: 01 96 adiw r24, 0x01 ; 1 - 1908: 61 e0 ldi r22, 0x01 ; 1 - 190a: 06 dc rcall .-2036 ; 0x1118 - 190c: 88 23 and r24, r24 - 190e: 59 f0 breq .+22 ; 0x1926 + 19a0: ce 01 movw r24, r28 + 19a2: 01 96 adiw r24, 0x01 ; 1 + 19a4: 61 e0 ldi r22, 0x01 ; 1 + 19a6: 06 dc rcall .-2036 ; 0x11b4 + 19a8: 88 23 and r24, r24 + 19aa: 59 f0 breq .+22 ; 0x19c2 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) - 1910: ce 01 movw r24, r28 - 1912: 06 96 adiw r24, 0x06 ; 6 - 1914: 61 e0 ldi r22, 0x01 ; 1 - 1916: 00 dc rcall .-2048 ; 0x1118 - 1918: 88 23 and r24, r24 - 191a: 29 f0 breq .+10 ; 0x1926 + 19ac: ce 01 movw r24, r28 + 19ae: 06 96 adiw r24, 0x06 ; 6 + 19b0: 61 e0 ldi r22, 0x01 ; 1 + 19b2: 00 dc rcall .-2048 ; 0x11b4 + 19b4: 88 23 and r24, r24 + 19b6: 29 f0 breq .+10 ; 0x19c2 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) - 191c: ce 01 movw r24, r28 - 191e: 0b 96 adiw r24, 0x0b ; 11 - 1920: 61 e0 ldi r22, 0x01 ; 1 - 1922: fa db rcall .-2060 ; 0x1118 - 1924: 01 c0 rjmp .+2 ; 0x1928 + 19b8: ce 01 movw r24, r28 + 19ba: 0b 96 adiw r24, 0x0b ; 11 + 19bc: 61 e0 ldi r22, 0x01 ; 1 + 19be: fa db rcall .-2060 ; 0x11b4 + 19c0: 01 c0 rjmp .+2 ; 0x19c4 if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) return false; - 1926: 80 e0 ldi r24, 0x00 ; 0 + 19c2: 80 e0 ldi r24, 0x00 ; 0 if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) return false; return true; } - 1928: df 91 pop r29 - 192a: cf 91 pop r28 - 192c: 08 95 ret + 19c4: df 91 pop r29 + 19c6: cf 91 pop r28 + 19c8: 08 95 ret -0000192e : +000019ca : return Endpoint_Write_Stream_LE(Buffer, Length, NULL); } uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { - 192e: df 93 push r29 - 1930: cf 93 push r28 - 1932: 0f 92 push r0 - 1934: cd b7 in r28, 0x3d ; 61 - 1936: de b7 in r29, 0x3e ; 62 - 1938: fc 01 movw r30, r24 + 19ca: df 93 push r29 + 19cc: cf 93 push r28 + 19ce: 0f 92 push r0 + 19d0: cd b7 in r28, 0x3d ; 61 + 19d2: de b7 in r29, 0x3e ; 62 + 19d4: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 193a: 8e b3 in r24, 0x1e ; 30 - 193c: 84 30 cpi r24, 0x04 ; 4 - 193e: f9 f4 brne .+62 ; 0x197e - 1940: 24 89 ldd r18, Z+20 ; 0x14 - 1942: 35 89 ldd r19, Z+21 ; 0x15 - 1944: 46 89 ldd r20, Z+22 ; 0x16 - 1946: 57 89 ldd r21, Z+23 ; 0x17 - 1948: 21 15 cp r18, r1 - 194a: 31 05 cpc r19, r1 - 194c: 41 05 cpc r20, r1 - 194e: 51 05 cpc r21, r1 - 1950: b1 f0 breq .+44 ; 0x197e + 19d6: 8e b3 in r24, 0x1e ; 30 + 19d8: 84 30 cpi r24, 0x04 ; 4 + 19da: f9 f4 brne .+62 ; 0x1a1a + 19dc: 24 89 ldd r18, Z+20 ; 0x14 + 19de: 35 89 ldd r19, Z+21 ; 0x15 + 19e0: 46 89 ldd r20, Z+22 ; 0x16 + 19e2: 57 89 ldd r21, Z+23 ; 0x17 + 19e4: 21 15 cp r18, r1 + 19e6: 31 05 cpc r19, r1 + 19e8: 41 05 cpc r20, r1 + 19ea: 51 05 cpc r21, r1 + 19ec: b1 f0 breq .+44 ; 0x1a1a */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1952: 81 81 ldd r24, Z+1 ; 0x01 - 1954: 8f 70 andi r24, 0x0F ; 15 - 1956: 80 93 e9 00 sts 0x00E9, r24 + 19ee: 81 81 ldd r24, Z+1 ; 0x01 + 19f0: 8f 70 andi r24, 0x0F ; 15 + 19f2: 80 93 e9 00 sts 0x00E9, r24 * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return ((UEINTX & (1 << RWAL)) ? true : false); - 195a: 80 91 e8 00 lds r24, 0x00E8 + 19f6: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWSTREAM_DeviceDisconnected; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_IsReadWriteAllowed())) - 195e: 85 fd sbrc r24, 5 - 1960: 0a c0 rjmp .+20 ; 0x1976 + 19fa: 85 fd sbrc r24, 5 + 19fc: 0a c0 rjmp .+20 ; 0x1a12 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 1962: 80 91 e8 00 lds r24, 0x00E8 - 1966: 8e 77 andi r24, 0x7E ; 126 - 1968: 80 93 e8 00 sts 0x00E8, r24 + 19fe: 80 91 e8 00 lds r24, 0x00E8 + 1a02: 8e 77 andi r24, 0x7E ; 126 + 1a04: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearIN(); uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 196c: 69 83 std Y+1, r22 ; 0x01 - 196e: 37 dc rcall .-1938 ; 0x11de - 1970: 69 81 ldd r22, Y+1 ; 0x01 - 1972: 88 23 and r24, r24 - 1974: 29 f4 brne .+10 ; 0x1980 + 1a08: 69 83 std Y+1, r22 ; 0x01 + 1a0a: 37 dc rcall .-1938 ; 0x127a + 1a0c: 69 81 ldd r22, Y+1 ; 0x01 + 1a0e: 88 23 and r24, r24 + 1a10: 29 f4 brne .+10 ; 0x1a1c * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 1976: 60 93 f1 00 sts 0x00F1, r22 + 1a12: 60 93 f1 00 sts 0x00F1, r22 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; - 197a: 80 e0 ldi r24, 0x00 ; 0 - 197c: 01 c0 rjmp .+2 ; 0x1980 + 1a16: 80 e0 ldi r24, 0x00 ; 0 + 1a18: 01 c0 rjmp .+2 ; 0x1a1c 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)) return ENDPOINT_RWSTREAM_DeviceDisconnected; - 197e: 82 e0 ldi r24, 0x02 ; 2 + 1a1a: 82 e0 ldi r24, 0x02 ; 2 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; } - 1980: 0f 90 pop r0 - 1982: cf 91 pop r28 - 1984: df 91 pop r29 - 1986: 08 95 ret + 1a1c: 0f 90 pop r0 + 1a1e: cf 91 pop r28 + 1a20: df 91 pop r29 + 1a22: 08 95 ret -00001988 : +00001a24 : uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 1988: fc 01 movw r30, r24 + 1a24: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 198a: 8e b3 in r24, 0x1e ; 30 - 198c: 84 30 cpi r24, 0x04 ; 4 - 198e: 19 f5 brne .+70 ; 0x19d6 - 1990: 24 89 ldd r18, Z+20 ; 0x14 - 1992: 35 89 ldd r19, Z+21 ; 0x15 - 1994: 46 89 ldd r20, Z+22 ; 0x16 - 1996: 57 89 ldd r21, Z+23 ; 0x17 - 1998: 21 15 cp r18, r1 - 199a: 31 05 cpc r19, r1 - 199c: 41 05 cpc r20, r1 - 199e: 51 05 cpc r21, r1 - 19a0: d1 f0 breq .+52 ; 0x19d6 + 1a26: 8e b3 in r24, 0x1e ; 30 + 1a28: 84 30 cpi r24, 0x04 ; 4 + 1a2a: 19 f5 brne .+70 ; 0x1a72 + 1a2c: 24 89 ldd r18, Z+20 ; 0x14 + 1a2e: 35 89 ldd r19, Z+21 ; 0x15 + 1a30: 46 89 ldd r20, Z+22 ; 0x16 + 1a32: 57 89 ldd r21, Z+23 ; 0x17 + 1a34: 21 15 cp r18, r1 + 1a36: 31 05 cpc r19, r1 + 1a38: 41 05 cpc r20, r1 + 1a3a: 51 05 cpc r21, r1 + 1a3c: d1 f0 breq .+52 ; 0x1a72 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 19a2: 81 81 ldd r24, Z+1 ; 0x01 - 19a4: 8f 70 andi r24, 0x0F ; 15 - 19a6: 80 93 e9 00 sts 0x00E9, r24 + 1a3e: 81 81 ldd r24, Z+1 ; 0x01 + 1a40: 8f 70 andi r24, 0x0F ; 15 + 1a42: 80 93 e9 00 sts 0x00E9, r24 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 19aa: 80 91 f2 00 lds r24, 0x00F2 + 1a46: 80 91 f2 00 lds r24, 0x00F2 uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_BytesInEndpoint())) - 19ae: 88 23 and r24, r24 - 19b0: a1 f0 breq .+40 ; 0x19da + 1a4a: 88 23 and r24, r24 + 1a4c: a1 f0 breq .+40 ; 0x1a76 * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return ((UEINTX & (1 << RWAL)) ? true : false); - 19b2: 90 91 e8 00 lds r25, 0x00E8 + 1a4e: 90 91 e8 00 lds r25, 0x00E8 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 19b6: 80 91 e8 00 lds r24, 0x00E8 - 19ba: 8e 77 andi r24, 0x7E ; 126 - 19bc: 80 93 e8 00 sts 0x00E8, r24 + 1a52: 80 91 e8 00 lds r24, 0x00E8 + 1a56: 8e 77 andi r24, 0x7E ; 126 + 1a58: 80 93 e8 00 sts 0x00E8, r24 bool BankFull = !(Endpoint_IsReadWriteAllowed()); Endpoint_ClearIN(); if (BankFull) - 19c0: 95 fd sbrc r25, 5 - 19c2: 0d c0 rjmp .+26 ; 0x19de + 1a5c: 95 fd sbrc r25, 5 + 1a5e: 0d c0 rjmp .+26 ; 0x1a7a { if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 19c4: 0c dc rcall .-2024 ; 0x11de - 19c6: 88 23 and r24, r24 - 19c8: 59 f4 brne .+22 ; 0x19e0 - 19ca: 90 91 e8 00 lds r25, 0x00E8 - 19ce: 9e 77 andi r25, 0x7E ; 126 - 19d0: 90 93 e8 00 sts 0x00E8, r25 - 19d4: 08 95 ret + 1a60: 0c dc rcall .-2024 ; 0x127a + 1a62: 88 23 and r24, r24 + 1a64: 59 f4 brne .+22 ; 0x1a7c + 1a66: 90 91 e8 00 lds r25, 0x00E8 + 1a6a: 9e 77 andi r25, 0x7E ; 126 + 1a6c: 90 93 e8 00 sts 0x00E8, r25 + 1a70: 08 95 ret } uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return ENDPOINT_RWSTREAM_DeviceDisconnected; - 19d6: 82 e0 ldi r24, 0x02 ; 2 - 19d8: 08 95 ret + 1a72: 82 e0 ldi r24, 0x02 ; 2 + 1a74: 08 95 ret uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_BytesInEndpoint())) return ENDPOINT_READYWAIT_NoError; - 19da: 80 e0 ldi r24, 0x00 ; 0 - 19dc: 08 95 ret + 1a76: 80 e0 ldi r24, 0x00 ; 0 + 1a78: 08 95 ret return ErrorCode; Endpoint_ClearIN(); } return ENDPOINT_READYWAIT_NoError; - 19de: 80 e0 ldi r24, 0x00 ; 0 + 1a7a: 80 e0 ldi r24, 0x00 ; 0 } - 19e0: 08 95 ret + 1a7c: 08 95 ret -000019e2 : +00001a7e : return true; } void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 19e2: 2e b3 in r18, 0x1e ; 30 - 19e4: 24 30 cpi r18, 0x04 ; 4 - 19e6: 99 f4 brne .+38 ; 0x1a0e - 19e8: fc 01 movw r30, r24 - 19ea: 24 89 ldd r18, Z+20 ; 0x14 - 19ec: 35 89 ldd r19, Z+21 ; 0x15 - 19ee: 46 89 ldd r20, Z+22 ; 0x16 - 19f0: 57 89 ldd r21, Z+23 ; 0x17 - 19f2: 21 15 cp r18, r1 - 19f4: 31 05 cpc r19, r1 - 19f6: 41 05 cpc r20, r1 - 19f8: 51 05 cpc r21, r1 - 19fa: 49 f0 breq .+18 ; 0x1a0e + 1a7e: 2e b3 in r18, 0x1e ; 30 + 1a80: 24 30 cpi r18, 0x04 ; 4 + 1a82: 99 f4 brne .+38 ; 0x1aaa + 1a84: fc 01 movw r30, r24 + 1a86: 24 89 ldd r18, Z+20 ; 0x14 + 1a88: 35 89 ldd r19, Z+21 ; 0x15 + 1a8a: 46 89 ldd r20, Z+22 ; 0x16 + 1a8c: 57 89 ldd r21, Z+23 ; 0x17 + 1a8e: 21 15 cp r18, r1 + 1a90: 31 05 cpc r19, r1 + 1a92: 41 05 cpc r20, r1 + 1a94: 51 05 cpc r21, r1 + 1a96: 49 f0 breq .+18 ; 0x1aaa */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 19fc: 21 81 ldd r18, Z+1 ; 0x01 - 19fe: 2f 70 andi r18, 0x0F ; 15 - 1a00: 20 93 e9 00 sts 0x00E9, r18 + 1a98: 21 81 ldd r18, Z+1 ; 0x01 + 1a9a: 2f 70 andi r18, 0x0F ; 15 + 1a9c: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 1a04: 20 91 e8 00 lds r18, 0x00E8 + 1aa0: 20 91 e8 00 lds r18, 0x00E8 return; #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (Endpoint_IsINReady()) - 1a08: 20 ff sbrs r18, 0 - 1a0a: 01 c0 rjmp .+2 ; 0x1a0e + 1aa4: 20 ff sbrs r18, 0 + 1aa6: 01 c0 rjmp .+2 ; 0x1aaa CDC_Device_Flush(CDCInterfaceInfo); - 1a0c: bd cf rjmp .-134 ; 0x1988 - 1a0e: 08 95 ret + 1aa8: bd cf rjmp .-134 ; 0x1a24 + 1aaa: 08 95 ret -00001a10 : +00001aac : return 0; } } int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 1a10: fc 01 movw r30, r24 + 1aac: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 1a12: 8e b3 in r24, 0x1e ; 30 - 1a14: 84 30 cpi r24, 0x04 ; 4 - 1a16: 29 f5 brne .+74 ; 0x1a62 - 1a18: 24 89 ldd r18, Z+20 ; 0x14 - 1a1a: 35 89 ldd r19, Z+21 ; 0x15 - 1a1c: 46 89 ldd r20, Z+22 ; 0x16 - 1a1e: 57 89 ldd r21, Z+23 ; 0x17 - 1a20: 21 15 cp r18, r1 - 1a22: 31 05 cpc r19, r1 - 1a24: 41 05 cpc r20, r1 - 1a26: 51 05 cpc r21, r1 - 1a28: e1 f0 breq .+56 ; 0x1a62 + 1aae: 8e b3 in r24, 0x1e ; 30 + 1ab0: 84 30 cpi r24, 0x04 ; 4 + 1ab2: 29 f5 brne .+74 ; 0x1afe + 1ab4: 24 89 ldd r18, Z+20 ; 0x14 + 1ab6: 35 89 ldd r19, Z+21 ; 0x15 + 1ab8: 46 89 ldd r20, Z+22 ; 0x16 + 1aba: 57 89 ldd r21, Z+23 ; 0x17 + 1abc: 21 15 cp r18, r1 + 1abe: 31 05 cpc r19, r1 + 1ac0: 41 05 cpc r20, r1 + 1ac2: 51 05 cpc r21, r1 + 1ac4: e1 f0 breq .+56 ; 0x1afe */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1a2a: 86 81 ldd r24, Z+6 ; 0x06 - 1a2c: 8f 70 andi r24, 0x0F ; 15 - 1a2e: 80 93 e9 00 sts 0x00E9, r24 + 1ac6: 86 81 ldd r24, Z+6 ; 0x06 + 1ac8: 8f 70 andi r24, 0x0F ; 15 + 1aca: 80 93 e9 00 sts 0x00E9, r24 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 1a32: 80 91 e8 00 lds r24, 0x00E8 + 1ace: 80 91 e8 00 lds r24, 0x00E8 int16_t ReceivedByte = -1; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); if (Endpoint_IsOUTReceived()) - 1a36: 82 ff sbrs r24, 2 - 1a38: 14 c0 rjmp .+40 ; 0x1a62 + 1ad2: 82 ff sbrs r24, 2 + 1ad4: 14 c0 rjmp .+40 ; 0x1afe #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 1a3a: 80 91 f2 00 lds r24, 0x00F2 + 1ad6: 80 91 f2 00 lds r24, 0x00F2 { if (Endpoint_BytesInEndpoint()) - 1a3e: 88 23 and r24, r24 - 1a40: 21 f0 breq .+8 ; 0x1a4a + 1ada: 88 23 and r24, r24 + 1adc: 21 f0 breq .+8 ; 0x1ae6 * \return Next byte in the currently selected endpoint's FIFO buffer. */ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_8(void) { return UEDATX; - 1a42: 20 91 f1 00 lds r18, 0x00F1 + 1ade: 20 91 f1 00 lds r18, 0x00F1 ReceivedByte = Endpoint_Read_8(); - 1a46: 30 e0 ldi r19, 0x00 ; 0 - 1a48: 02 c0 rjmp .+4 ; 0x1a4e + 1ae2: 30 e0 ldi r19, 0x00 ; 0 + 1ae4: 02 c0 rjmp .+4 ; 0x1aea int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return -1; int16_t ReceivedByte = -1; - 1a4a: 2f ef ldi r18, 0xFF ; 255 - 1a4c: 3f ef ldi r19, 0xFF ; 255 + 1ae6: 2f ef ldi r18, 0xFF ; 255 + 1ae8: 3f ef ldi r19, 0xFF ; 255 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 1a4e: 80 91 f2 00 lds r24, 0x00F2 + 1aea: 80 91 f2 00 lds r24, 0x00F2 if (Endpoint_IsOUTReceived()) { if (Endpoint_BytesInEndpoint()) ReceivedByte = Endpoint_Read_8(); if (!(Endpoint_BytesInEndpoint())) - 1a52: 88 23 and r24, r24 - 1a54: 41 f4 brne .+16 ; 0x1a66 + 1aee: 88 23 and r24, r24 + 1af0: 41 f4 brne .+16 ; 0x1b02 */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 1a56: 80 91 e8 00 lds r24, 0x00E8 - 1a5a: 8b 77 andi r24, 0x7B ; 123 - 1a5c: 80 93 e8 00 sts 0x00E8, r24 - 1a60: 02 c0 rjmp .+4 ; 0x1a66 + 1af2: 80 91 e8 00 lds r24, 0x00E8 + 1af6: 8b 77 andi r24, 0x7B ; 123 + 1af8: 80 93 e8 00 sts 0x00E8, r24 + 1afc: 02 c0 rjmp .+4 ; 0x1b02 int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return -1; int16_t ReceivedByte = -1; - 1a62: 2f ef ldi r18, 0xFF ; 255 - 1a64: 3f ef ldi r19, 0xFF ; 255 + 1afe: 2f ef ldi r18, 0xFF ; 255 + 1b00: 3f ef ldi r19, 0xFF ; 255 if (!(Endpoint_BytesInEndpoint())) Endpoint_ClearOUT(); } return ReceivedByte; } - 1a66: c9 01 movw r24, r18 - 1a68: 08 95 ret + 1b02: c9 01 movw r24, r18 + 1b04: 08 95 ret -00001a6a : +00001b06 : #endif void CDC_Device_Event_Stub(void) { } - 1a6a: 08 95 ret - -00001a6c <__subsf3>: - 1a6c: 50 58 subi r21, 0x80 ; 128 - -00001a6e <__addsf3>: - 1a6e: bb 27 eor r27, r27 - 1a70: aa 27 eor r26, r26 - 1a72: 0e d0 rcall .+28 ; 0x1a90 <__addsf3x> - 1a74: 70 c1 rjmp .+736 ; 0x1d56 <__fp_round> - 1a76: 61 d1 rcall .+706 ; 0x1d3a <__fp_pscA> - 1a78: 30 f0 brcs .+12 ; 0x1a86 <__addsf3+0x18> - 1a7a: 66 d1 rcall .+716 ; 0x1d48 <__fp_pscB> - 1a7c: 20 f0 brcs .+8 ; 0x1a86 <__addsf3+0x18> - 1a7e: 31 f4 brne .+12 ; 0x1a8c <__addsf3+0x1e> - 1a80: 9f 3f cpi r25, 0xFF ; 255 - 1a82: 11 f4 brne .+4 ; 0x1a88 <__addsf3+0x1a> - 1a84: 1e f4 brtc .+6 ; 0x1a8c <__addsf3+0x1e> - 1a86: 56 c1 rjmp .+684 ; 0x1d34 <__fp_nan> - 1a88: 0e f4 brtc .+2 ; 0x1a8c <__addsf3+0x1e> - 1a8a: e0 95 com r30 - 1a8c: e7 fb bst r30, 7 - 1a8e: 4c c1 rjmp .+664 ; 0x1d28 <__fp_inf> - -00001a90 <__addsf3x>: - 1a90: e9 2f mov r30, r25 - 1a92: 72 d1 rcall .+740 ; 0x1d78 <__fp_split3> - 1a94: 80 f3 brcs .-32 ; 0x1a76 <__addsf3+0x8> - 1a96: ba 17 cp r27, r26 - 1a98: 62 07 cpc r22, r18 - 1a9a: 73 07 cpc r23, r19 - 1a9c: 84 07 cpc r24, r20 - 1a9e: 95 07 cpc r25, r21 - 1aa0: 18 f0 brcs .+6 ; 0x1aa8 <__addsf3x+0x18> - 1aa2: 71 f4 brne .+28 ; 0x1ac0 <__addsf3x+0x30> - 1aa4: 9e f5 brtc .+102 ; 0x1b0c <__addsf3x+0x7c> - 1aa6: 8a c1 rjmp .+788 ; 0x1dbc <__fp_zero> - 1aa8: 0e f4 brtc .+2 ; 0x1aac <__addsf3x+0x1c> - 1aaa: e0 95 com r30 - 1aac: 0b 2e mov r0, r27 - 1aae: ba 2f mov r27, r26 - 1ab0: a0 2d mov r26, r0 - 1ab2: 0b 01 movw r0, r22 - 1ab4: b9 01 movw r22, r18 - 1ab6: 90 01 movw r18, r0 - 1ab8: 0c 01 movw r0, r24 - 1aba: ca 01 movw r24, r20 - 1abc: a0 01 movw r20, r0 - 1abe: 11 24 eor r1, r1 - 1ac0: ff 27 eor r31, r31 - 1ac2: 59 1b sub r21, r25 - 1ac4: 99 f0 breq .+38 ; 0x1aec <__addsf3x+0x5c> - 1ac6: 59 3f cpi r21, 0xF9 ; 249 - 1ac8: 50 f4 brcc .+20 ; 0x1ade <__addsf3x+0x4e> - 1aca: 50 3e cpi r21, 0xE0 ; 224 - 1acc: 68 f1 brcs .+90 ; 0x1b28 <__addsf3x+0x98> - 1ace: 1a 16 cp r1, r26 - 1ad0: f0 40 sbci r31, 0x00 ; 0 - 1ad2: a2 2f mov r26, r18 - 1ad4: 23 2f mov r18, r19 - 1ad6: 34 2f mov r19, r20 - 1ad8: 44 27 eor r20, r20 - 1ada: 58 5f subi r21, 0xF8 ; 248 - 1adc: f3 cf rjmp .-26 ; 0x1ac4 <__addsf3x+0x34> - 1ade: 46 95 lsr r20 - 1ae0: 37 95 ror r19 - 1ae2: 27 95 ror r18 - 1ae4: a7 95 ror r26 - 1ae6: f0 40 sbci r31, 0x00 ; 0 - 1ae8: 53 95 inc r21 - 1aea: c9 f7 brne .-14 ; 0x1ade <__addsf3x+0x4e> - 1aec: 7e f4 brtc .+30 ; 0x1b0c <__addsf3x+0x7c> - 1aee: 1f 16 cp r1, r31 - 1af0: ba 0b sbc r27, r26 - 1af2: 62 0b sbc r22, r18 - 1af4: 73 0b sbc r23, r19 - 1af6: 84 0b sbc r24, r20 - 1af8: ba f0 brmi .+46 ; 0x1b28 <__addsf3x+0x98> - 1afa: 91 50 subi r25, 0x01 ; 1 - 1afc: a1 f0 breq .+40 ; 0x1b26 <__addsf3x+0x96> - 1afe: ff 0f add r31, r31 - 1b00: bb 1f adc r27, r27 - 1b02: 66 1f adc r22, r22 - 1b04: 77 1f adc r23, r23 - 1b06: 88 1f adc r24, r24 - 1b08: c2 f7 brpl .-16 ; 0x1afa <__addsf3x+0x6a> - 1b0a: 0e c0 rjmp .+28 ; 0x1b28 <__addsf3x+0x98> - 1b0c: ba 0f add r27, r26 - 1b0e: 62 1f adc r22, r18 - 1b10: 73 1f adc r23, r19 - 1b12: 84 1f adc r24, r20 - 1b14: 48 f4 brcc .+18 ; 0x1b28 <__addsf3x+0x98> - 1b16: 87 95 ror r24 - 1b18: 77 95 ror r23 - 1b1a: 67 95 ror r22 - 1b1c: b7 95 ror r27 - 1b1e: f7 95 ror r31 - 1b20: 9e 3f cpi r25, 0xFE ; 254 - 1b22: 08 f0 brcs .+2 ; 0x1b26 <__addsf3x+0x96> - 1b24: b3 cf rjmp .-154 ; 0x1a8c <__addsf3+0x1e> - 1b26: 93 95 inc r25 - 1b28: 88 0f add r24, r24 - 1b2a: 08 f0 brcs .+2 ; 0x1b2e <__addsf3x+0x9e> - 1b2c: 99 27 eor r25, r25 - 1b2e: ee 0f add r30, r30 - 1b30: 97 95 ror r25 - 1b32: 87 95 ror r24 - 1b34: 08 95 ret - -00001b36 <__cmpsf2>: - 1b36: d4 d0 rcall .+424 ; 0x1ce0 <__fp_cmp> - 1b38: 08 f4 brcc .+2 ; 0x1b3c <__cmpsf2+0x6> - 1b3a: 81 e0 ldi r24, 0x01 ; 1 - 1b3c: 08 95 ret - -00001b3e <__divsf3>: - 1b3e: 0c d0 rcall .+24 ; 0x1b58 <__divsf3x> - 1b40: 0a c1 rjmp .+532 ; 0x1d56 <__fp_round> - 1b42: 02 d1 rcall .+516 ; 0x1d48 <__fp_pscB> - 1b44: 40 f0 brcs .+16 ; 0x1b56 <__divsf3+0x18> - 1b46: f9 d0 rcall .+498 ; 0x1d3a <__fp_pscA> - 1b48: 30 f0 brcs .+12 ; 0x1b56 <__divsf3+0x18> - 1b4a: 21 f4 brne .+8 ; 0x1b54 <__divsf3+0x16> - 1b4c: 5f 3f cpi r21, 0xFF ; 255 - 1b4e: 19 f0 breq .+6 ; 0x1b56 <__divsf3+0x18> - 1b50: eb c0 rjmp .+470 ; 0x1d28 <__fp_inf> - 1b52: 51 11 cpse r21, r1 - 1b54: 34 c1 rjmp .+616 ; 0x1dbe <__fp_szero> - 1b56: ee c0 rjmp .+476 ; 0x1d34 <__fp_nan> - -00001b58 <__divsf3x>: - 1b58: 0f d1 rcall .+542 ; 0x1d78 <__fp_split3> - 1b5a: 98 f3 brcs .-26 ; 0x1b42 <__divsf3+0x4> - -00001b5c <__divsf3_pse>: - 1b5c: 99 23 and r25, r25 - 1b5e: c9 f3 breq .-14 ; 0x1b52 <__divsf3+0x14> - 1b60: 55 23 and r21, r21 - 1b62: b1 f3 breq .-20 ; 0x1b50 <__divsf3+0x12> - 1b64: 95 1b sub r25, r21 - 1b66: 55 0b sbc r21, r21 - 1b68: bb 27 eor r27, r27 - 1b6a: aa 27 eor r26, r26 - 1b6c: 62 17 cp r22, r18 - 1b6e: 73 07 cpc r23, r19 - 1b70: 84 07 cpc r24, r20 - 1b72: 38 f0 brcs .+14 ; 0x1b82 <__divsf3_pse+0x26> - 1b74: 9f 5f subi r25, 0xFF ; 255 - 1b76: 5f 4f sbci r21, 0xFF ; 255 - 1b78: 22 0f add r18, r18 - 1b7a: 33 1f adc r19, r19 - 1b7c: 44 1f adc r20, r20 - 1b7e: aa 1f adc r26, r26 - 1b80: a9 f3 breq .-22 ; 0x1b6c <__divsf3_pse+0x10> - 1b82: 33 d0 rcall .+102 ; 0x1bea <__divsf3_pse+0x8e> - 1b84: 0e 2e mov r0, r30 - 1b86: 3a f0 brmi .+14 ; 0x1b96 <__divsf3_pse+0x3a> - 1b88: e0 e8 ldi r30, 0x80 ; 128 - 1b8a: 30 d0 rcall .+96 ; 0x1bec <__divsf3_pse+0x90> - 1b8c: 91 50 subi r25, 0x01 ; 1 - 1b8e: 50 40 sbci r21, 0x00 ; 0 - 1b90: e6 95 lsr r30 - 1b92: 00 1c adc r0, r0 - 1b94: ca f7 brpl .-14 ; 0x1b88 <__divsf3_pse+0x2c> - 1b96: 29 d0 rcall .+82 ; 0x1bea <__divsf3_pse+0x8e> - 1b98: fe 2f mov r31, r30 - 1b9a: 27 d0 rcall .+78 ; 0x1bea <__divsf3_pse+0x8e> - 1b9c: 66 0f add r22, r22 - 1b9e: 77 1f adc r23, r23 - 1ba0: 88 1f adc r24, r24 - 1ba2: bb 1f adc r27, r27 - 1ba4: 26 17 cp r18, r22 - 1ba6: 37 07 cpc r19, r23 - 1ba8: 48 07 cpc r20, r24 - 1baa: ab 07 cpc r26, r27 - 1bac: b0 e8 ldi r27, 0x80 ; 128 - 1bae: 09 f0 breq .+2 ; 0x1bb2 <__divsf3_pse+0x56> - 1bb0: bb 0b sbc r27, r27 - 1bb2: 80 2d mov r24, r0 - 1bb4: bf 01 movw r22, r30 - 1bb6: ff 27 eor r31, r31 - 1bb8: 93 58 subi r25, 0x83 ; 131 - 1bba: 5f 4f sbci r21, 0xFF ; 255 - 1bbc: 2a f0 brmi .+10 ; 0x1bc8 <__divsf3_pse+0x6c> - 1bbe: 9e 3f cpi r25, 0xFE ; 254 - 1bc0: 51 05 cpc r21, r1 - 1bc2: 68 f0 brcs .+26 ; 0x1bde <__divsf3_pse+0x82> - 1bc4: b1 c0 rjmp .+354 ; 0x1d28 <__fp_inf> - 1bc6: fb c0 rjmp .+502 ; 0x1dbe <__fp_szero> - 1bc8: 5f 3f cpi r21, 0xFF ; 255 - 1bca: ec f3 brlt .-6 ; 0x1bc6 <__divsf3_pse+0x6a> - 1bcc: 98 3e cpi r25, 0xE8 ; 232 - 1bce: dc f3 brlt .-10 ; 0x1bc6 <__divsf3_pse+0x6a> - 1bd0: 86 95 lsr r24 - 1bd2: 77 95 ror r23 - 1bd4: 67 95 ror r22 - 1bd6: b7 95 ror r27 - 1bd8: f7 95 ror r31 - 1bda: 9f 5f subi r25, 0xFF ; 255 - 1bdc: c9 f7 brne .-14 ; 0x1bd0 <__divsf3_pse+0x74> - 1bde: 88 0f add r24, r24 - 1be0: 91 1d adc r25, r1 - 1be2: 96 95 lsr r25 - 1be4: 87 95 ror r24 - 1be6: 97 f9 bld r25, 7 - 1be8: 08 95 ret - 1bea: e1 e0 ldi r30, 0x01 ; 1 - 1bec: 66 0f add r22, r22 - 1bee: 77 1f adc r23, r23 - 1bf0: 88 1f adc r24, r24 - 1bf2: bb 1f adc r27, r27 - 1bf4: 62 17 cp r22, r18 - 1bf6: 73 07 cpc r23, r19 - 1bf8: 84 07 cpc r24, r20 - 1bfa: ba 07 cpc r27, r26 - 1bfc: 20 f0 brcs .+8 ; 0x1c06 <__divsf3_pse+0xaa> - 1bfe: 62 1b sub r22, r18 - 1c00: 73 0b sbc r23, r19 - 1c02: 84 0b sbc r24, r20 - 1c04: ba 0b sbc r27, r26 - 1c06: ee 1f adc r30, r30 - 1c08: 88 f7 brcc .-30 ; 0x1bec <__divsf3_pse+0x90> - 1c0a: e0 95 com r30 - 1c0c: 08 95 ret - -00001c0e <__fixunssfsi>: - 1c0e: bc d0 rcall .+376 ; 0x1d88 <__fp_splitA> - 1c10: 88 f0 brcs .+34 ; 0x1c34 <__fixunssfsi+0x26> - 1c12: 9f 57 subi r25, 0x7F ; 127 - 1c14: 90 f0 brcs .+36 ; 0x1c3a <__fixunssfsi+0x2c> - 1c16: b9 2f mov r27, r25 - 1c18: 99 27 eor r25, r25 - 1c1a: b7 51 subi r27, 0x17 ; 23 - 1c1c: a0 f0 brcs .+40 ; 0x1c46 <__fixunssfsi+0x38> - 1c1e: d1 f0 breq .+52 ; 0x1c54 <__fixunssfsi+0x46> - 1c20: 66 0f add r22, r22 - 1c22: 77 1f adc r23, r23 - 1c24: 88 1f adc r24, r24 - 1c26: 99 1f adc r25, r25 - 1c28: 1a f0 brmi .+6 ; 0x1c30 <__fixunssfsi+0x22> - 1c2a: ba 95 dec r27 - 1c2c: c9 f7 brne .-14 ; 0x1c20 <__fixunssfsi+0x12> - 1c2e: 12 c0 rjmp .+36 ; 0x1c54 <__fixunssfsi+0x46> - 1c30: b1 30 cpi r27, 0x01 ; 1 - 1c32: 81 f0 breq .+32 ; 0x1c54 <__fixunssfsi+0x46> - 1c34: c3 d0 rcall .+390 ; 0x1dbc <__fp_zero> - 1c36: b1 e0 ldi r27, 0x01 ; 1 - 1c38: 08 95 ret - 1c3a: c0 c0 rjmp .+384 ; 0x1dbc <__fp_zero> - 1c3c: 67 2f mov r22, r23 - 1c3e: 78 2f mov r23, r24 - 1c40: 88 27 eor r24, r24 - 1c42: b8 5f subi r27, 0xF8 ; 248 - 1c44: 39 f0 breq .+14 ; 0x1c54 <__fixunssfsi+0x46> - 1c46: b9 3f cpi r27, 0xF9 ; 249 - 1c48: cc f3 brlt .-14 ; 0x1c3c <__fixunssfsi+0x2e> - 1c4a: 86 95 lsr r24 - 1c4c: 77 95 ror r23 - 1c4e: 67 95 ror r22 - 1c50: b3 95 inc r27 - 1c52: d9 f7 brne .-10 ; 0x1c4a <__fixunssfsi+0x3c> - 1c54: 3e f4 brtc .+14 ; 0x1c64 <__fixunssfsi+0x56> - 1c56: 90 95 com r25 - 1c58: 80 95 com r24 - 1c5a: 70 95 com r23 - 1c5c: 61 95 neg r22 - 1c5e: 7f 4f sbci r23, 0xFF ; 255 - 1c60: 8f 4f sbci r24, 0xFF ; 255 - 1c62: 9f 4f sbci r25, 0xFF ; 255 - 1c64: 08 95 ret - -00001c66 <__floatunsisf>: - 1c66: e8 94 clt - 1c68: 09 c0 rjmp .+18 ; 0x1c7c <__floatsisf+0x12> - -00001c6a <__floatsisf>: - 1c6a: 97 fb bst r25, 7 - 1c6c: 3e f4 brtc .+14 ; 0x1c7c <__floatsisf+0x12> - 1c6e: 90 95 com r25 - 1c70: 80 95 com r24 - 1c72: 70 95 com r23 - 1c74: 61 95 neg r22 - 1c76: 7f 4f sbci r23, 0xFF ; 255 - 1c78: 8f 4f sbci r24, 0xFF ; 255 - 1c7a: 9f 4f sbci r25, 0xFF ; 255 - 1c7c: 99 23 and r25, r25 - 1c7e: a9 f0 breq .+42 ; 0x1caa <__floatsisf+0x40> - 1c80: f9 2f mov r31, r25 - 1c82: 96 e9 ldi r25, 0x96 ; 150 - 1c84: bb 27 eor r27, r27 - 1c86: 93 95 inc r25 - 1c88: f6 95 lsr r31 - 1c8a: 87 95 ror r24 - 1c8c: 77 95 ror r23 - 1c8e: 67 95 ror r22 - 1c90: b7 95 ror r27 - 1c92: f1 11 cpse r31, r1 - 1c94: f8 cf rjmp .-16 ; 0x1c86 <__floatsisf+0x1c> - 1c96: fa f4 brpl .+62 ; 0x1cd6 <__floatsisf+0x6c> - 1c98: bb 0f add r27, r27 - 1c9a: 11 f4 brne .+4 ; 0x1ca0 <__floatsisf+0x36> - 1c9c: 60 ff sbrs r22, 0 - 1c9e: 1b c0 rjmp .+54 ; 0x1cd6 <__floatsisf+0x6c> - 1ca0: 6f 5f subi r22, 0xFF ; 255 - 1ca2: 7f 4f sbci r23, 0xFF ; 255 - 1ca4: 8f 4f sbci r24, 0xFF ; 255 - 1ca6: 9f 4f sbci r25, 0xFF ; 255 - 1ca8: 16 c0 rjmp .+44 ; 0x1cd6 <__floatsisf+0x6c> - 1caa: 88 23 and r24, r24 - 1cac: 11 f0 breq .+4 ; 0x1cb2 <__floatsisf+0x48> - 1cae: 96 e9 ldi r25, 0x96 ; 150 - 1cb0: 11 c0 rjmp .+34 ; 0x1cd4 <__floatsisf+0x6a> - 1cb2: 77 23 and r23, r23 - 1cb4: 21 f0 breq .+8 ; 0x1cbe <__floatsisf+0x54> - 1cb6: 9e e8 ldi r25, 0x8E ; 142 - 1cb8: 87 2f mov r24, r23 - 1cba: 76 2f mov r23, r22 - 1cbc: 05 c0 rjmp .+10 ; 0x1cc8 <__floatsisf+0x5e> - 1cbe: 66 23 and r22, r22 - 1cc0: 71 f0 breq .+28 ; 0x1cde <__floatsisf+0x74> - 1cc2: 96 e8 ldi r25, 0x86 ; 134 - 1cc4: 86 2f mov r24, r22 - 1cc6: 70 e0 ldi r23, 0x00 ; 0 - 1cc8: 60 e0 ldi r22, 0x00 ; 0 - 1cca: 2a f0 brmi .+10 ; 0x1cd6 <__floatsisf+0x6c> - 1ccc: 9a 95 dec r25 - 1cce: 66 0f add r22, r22 - 1cd0: 77 1f adc r23, r23 - 1cd2: 88 1f adc r24, r24 - 1cd4: da f7 brpl .-10 ; 0x1ccc <__floatsisf+0x62> - 1cd6: 88 0f add r24, r24 - 1cd8: 96 95 lsr r25 - 1cda: 87 95 ror r24 - 1cdc: 97 f9 bld r25, 7 - 1cde: 08 95 ret - -00001ce0 <__fp_cmp>: - 1ce0: 99 0f add r25, r25 - 1ce2: 00 08 sbc r0, r0 - 1ce4: 55 0f add r21, r21 - 1ce6: aa 0b sbc r26, r26 - 1ce8: e0 e8 ldi r30, 0x80 ; 128 - 1cea: fe ef ldi r31, 0xFE ; 254 - 1cec: 16 16 cp r1, r22 - 1cee: 17 06 cpc r1, r23 - 1cf0: e8 07 cpc r30, r24 - 1cf2: f9 07 cpc r31, r25 - 1cf4: c0 f0 brcs .+48 ; 0x1d26 <__fp_cmp+0x46> - 1cf6: 12 16 cp r1, r18 - 1cf8: 13 06 cpc r1, r19 - 1cfa: e4 07 cpc r30, r20 - 1cfc: f5 07 cpc r31, r21 - 1cfe: 98 f0 brcs .+38 ; 0x1d26 <__fp_cmp+0x46> - 1d00: 62 1b sub r22, r18 - 1d02: 73 0b sbc r23, r19 - 1d04: 84 0b sbc r24, r20 - 1d06: 95 0b sbc r25, r21 - 1d08: 39 f4 brne .+14 ; 0x1d18 <__fp_cmp+0x38> - 1d0a: 0a 26 eor r0, r26 - 1d0c: 61 f0 breq .+24 ; 0x1d26 <__fp_cmp+0x46> - 1d0e: 23 2b or r18, r19 - 1d10: 24 2b or r18, r20 - 1d12: 25 2b or r18, r21 - 1d14: 21 f4 brne .+8 ; 0x1d1e <__fp_cmp+0x3e> - 1d16: 08 95 ret - 1d18: 0a 26 eor r0, r26 - 1d1a: 09 f4 brne .+2 ; 0x1d1e <__fp_cmp+0x3e> - 1d1c: a1 40 sbci r26, 0x01 ; 1 - 1d1e: a6 95 lsr r26 - 1d20: 8f ef ldi r24, 0xFF ; 255 - 1d22: 81 1d adc r24, r1 - 1d24: 81 1d adc r24, r1 - 1d26: 08 95 ret - -00001d28 <__fp_inf>: - 1d28: 97 f9 bld r25, 7 - 1d2a: 9f 67 ori r25, 0x7F ; 127 - 1d2c: 80 e8 ldi r24, 0x80 ; 128 - 1d2e: 70 e0 ldi r23, 0x00 ; 0 - 1d30: 60 e0 ldi r22, 0x00 ; 0 - 1d32: 08 95 ret - -00001d34 <__fp_nan>: - 1d34: 9f ef ldi r25, 0xFF ; 255 - 1d36: 80 ec ldi r24, 0xC0 ; 192 - 1d38: 08 95 ret - -00001d3a <__fp_pscA>: - 1d3a: 00 24 eor r0, r0 - 1d3c: 0a 94 dec r0 - 1d3e: 16 16 cp r1, r22 - 1d40: 17 06 cpc r1, r23 - 1d42: 18 06 cpc r1, r24 - 1d44: 09 06 cpc r0, r25 - 1d46: 08 95 ret - -00001d48 <__fp_pscB>: - 1d48: 00 24 eor r0, r0 - 1d4a: 0a 94 dec r0 - 1d4c: 12 16 cp r1, r18 - 1d4e: 13 06 cpc r1, r19 - 1d50: 14 06 cpc r1, r20 - 1d52: 05 06 cpc r0, r21 - 1d54: 08 95 ret - -00001d56 <__fp_round>: - 1d56: 09 2e mov r0, r25 - 1d58: 03 94 inc r0 - 1d5a: 00 0c add r0, r0 - 1d5c: 11 f4 brne .+4 ; 0x1d62 <__fp_round+0xc> - 1d5e: 88 23 and r24, r24 - 1d60: 52 f0 brmi .+20 ; 0x1d76 <__fp_round+0x20> - 1d62: bb 0f add r27, r27 - 1d64: 40 f4 brcc .+16 ; 0x1d76 <__fp_round+0x20> - 1d66: bf 2b or r27, r31 - 1d68: 11 f4 brne .+4 ; 0x1d6e <__fp_round+0x18> - 1d6a: 60 ff sbrs r22, 0 - 1d6c: 04 c0 rjmp .+8 ; 0x1d76 <__fp_round+0x20> - 1d6e: 6f 5f subi r22, 0xFF ; 255 - 1d70: 7f 4f sbci r23, 0xFF ; 255 - 1d72: 8f 4f sbci r24, 0xFF ; 255 - 1d74: 9f 4f sbci r25, 0xFF ; 255 - 1d76: 08 95 ret - -00001d78 <__fp_split3>: - 1d78: 57 fd sbrc r21, 7 - 1d7a: 90 58 subi r25, 0x80 ; 128 - 1d7c: 44 0f add r20, r20 - 1d7e: 55 1f adc r21, r21 - 1d80: 59 f0 breq .+22 ; 0x1d98 <__fp_splitA+0x10> - 1d82: 5f 3f cpi r21, 0xFF ; 255 - 1d84: 71 f0 breq .+28 ; 0x1da2 <__fp_splitA+0x1a> - 1d86: 47 95 ror r20 - -00001d88 <__fp_splitA>: - 1d88: 88 0f add r24, r24 - 1d8a: 97 fb bst r25, 7 - 1d8c: 99 1f adc r25, r25 - 1d8e: 61 f0 breq .+24 ; 0x1da8 <__fp_splitA+0x20> - 1d90: 9f 3f cpi r25, 0xFF ; 255 - 1d92: 79 f0 breq .+30 ; 0x1db2 <__fp_splitA+0x2a> - 1d94: 87 95 ror r24 - 1d96: 08 95 ret - 1d98: 12 16 cp r1, r18 - 1d9a: 13 06 cpc r1, r19 - 1d9c: 14 06 cpc r1, r20 - 1d9e: 55 1f adc r21, r21 - 1da0: f2 cf rjmp .-28 ; 0x1d86 <__fp_split3+0xe> - 1da2: 46 95 lsr r20 - 1da4: f1 df rcall .-30 ; 0x1d88 <__fp_splitA> - 1da6: 08 c0 rjmp .+16 ; 0x1db8 <__fp_splitA+0x30> - 1da8: 16 16 cp r1, r22 - 1daa: 17 06 cpc r1, r23 - 1dac: 18 06 cpc r1, r24 - 1dae: 99 1f adc r25, r25 - 1db0: f1 cf rjmp .-30 ; 0x1d94 <__fp_splitA+0xc> - 1db2: 86 95 lsr r24 - 1db4: 71 05 cpc r23, r1 - 1db6: 61 05 cpc r22, r1 - 1db8: 08 94 sec - 1dba: 08 95 ret - -00001dbc <__fp_zero>: - 1dbc: e8 94 clt - -00001dbe <__fp_szero>: - 1dbe: bb 27 eor r27, r27 - 1dc0: 66 27 eor r22, r22 - 1dc2: 77 27 eor r23, r23 - 1dc4: cb 01 movw r24, r22 - 1dc6: 97 f9 bld r25, 7 - 1dc8: 08 95 ret - -00001dca <__gesf2>: - 1dca: 8a df rcall .-236 ; 0x1ce0 <__fp_cmp> - 1dcc: 08 f4 brcc .+2 ; 0x1dd0 <__gesf2+0x6> - 1dce: 8f ef ldi r24, 0xFF ; 255 - 1dd0: 08 95 ret - -00001dd2 <__mulhi3>: - 1dd2: 55 27 eor r21, r21 - 1dd4: 00 24 eor r0, r0 - -00001dd6 <__mulhi3_loop>: - 1dd6: 80 ff sbrs r24, 0 - 1dd8: 02 c0 rjmp .+4 ; 0x1dde <__mulhi3_skip1> - 1dda: 06 0e add r0, r22 - 1ddc: 57 1f adc r21, r23 - -00001dde <__mulhi3_skip1>: - 1dde: 66 0f add r22, r22 - 1de0: 77 1f adc r23, r23 - 1de2: 61 15 cp r22, r1 - 1de4: 71 05 cpc r23, r1 - 1de6: 21 f0 breq .+8 ; 0x1df0 <__mulhi3_exit> - 1de8: 96 95 lsr r25 - 1dea: 87 95 ror r24 - 1dec: 00 97 sbiw r24, 0x00 ; 0 - 1dee: 99 f7 brne .-26 ; 0x1dd6 <__mulhi3_loop> - -00001df0 <__mulhi3_exit>: - 1df0: 95 2f mov r25, r21 - 1df2: 80 2d mov r24, r0 - 1df4: 08 95 ret - -00001df6 <__udivmodhi4>: - 1df6: aa 1b sub r26, r26 - 1df8: bb 1b sub r27, r27 - 1dfa: 51 e1 ldi r21, 0x11 ; 17 - 1dfc: 07 c0 rjmp .+14 ; 0x1e0c <__udivmodhi4_ep> - -00001dfe <__udivmodhi4_loop>: - 1dfe: aa 1f adc r26, r26 - 1e00: bb 1f adc r27, r27 - 1e02: a6 17 cp r26, r22 - 1e04: b7 07 cpc r27, r23 - 1e06: 10 f0 brcs .+4 ; 0x1e0c <__udivmodhi4_ep> - 1e08: a6 1b sub r26, r22 - 1e0a: b7 0b sbc r27, r23 - -00001e0c <__udivmodhi4_ep>: - 1e0c: 88 1f adc r24, r24 - 1e0e: 99 1f adc r25, r25 - 1e10: 5a 95 dec r21 - 1e12: a9 f7 brne .-22 ; 0x1dfe <__udivmodhi4_loop> - 1e14: 80 95 com r24 - 1e16: 90 95 com r25 - 1e18: bc 01 movw r22, r24 - 1e1a: cd 01 movw r24, r26 - 1e1c: 08 95 ret - -00001e1e <__divmodhi4>: - 1e1e: 97 fb bst r25, 7 - 1e20: 09 2e mov r0, r25 - 1e22: 07 26 eor r0, r23 - 1e24: 0a d0 rcall .+20 ; 0x1e3a <__divmodhi4_neg1> - 1e26: 77 fd sbrc r23, 7 - 1e28: 04 d0 rcall .+8 ; 0x1e32 <__divmodhi4_neg2> - 1e2a: e5 df rcall .-54 ; 0x1df6 <__udivmodhi4> - 1e2c: 06 d0 rcall .+12 ; 0x1e3a <__divmodhi4_neg1> - 1e2e: 00 20 and r0, r0 - 1e30: 1a f4 brpl .+6 ; 0x1e38 <__divmodhi4_exit> - -00001e32 <__divmodhi4_neg2>: - 1e32: 70 95 com r23 - 1e34: 61 95 neg r22 - 1e36: 7f 4f sbci r23, 0xFF ; 255 - -00001e38 <__divmodhi4_exit>: - 1e38: 08 95 ret - -00001e3a <__divmodhi4_neg1>: - 1e3a: f6 f7 brtc .-4 ; 0x1e38 <__divmodhi4_exit> - 1e3c: 90 95 com r25 - 1e3e: 81 95 neg r24 - 1e40: 9f 4f sbci r25, 0xFF ; 255 - 1e42: 08 95 ret - -00001e44 <__udivmodsi4>: - 1e44: a1 e2 ldi r26, 0x21 ; 33 - 1e46: 1a 2e mov r1, r26 - 1e48: aa 1b sub r26, r26 - 1e4a: bb 1b sub r27, r27 - 1e4c: fd 01 movw r30, r26 - 1e4e: 0d c0 rjmp .+26 ; 0x1e6a <__udivmodsi4_ep> - -00001e50 <__udivmodsi4_loop>: - 1e50: aa 1f adc r26, r26 - 1e52: bb 1f adc r27, r27 - 1e54: ee 1f adc r30, r30 - 1e56: ff 1f adc r31, r31 - 1e58: a2 17 cp r26, r18 - 1e5a: b3 07 cpc r27, r19 - 1e5c: e4 07 cpc r30, r20 - 1e5e: f5 07 cpc r31, r21 - 1e60: 20 f0 brcs .+8 ; 0x1e6a <__udivmodsi4_ep> - 1e62: a2 1b sub r26, r18 - 1e64: b3 0b sbc r27, r19 - 1e66: e4 0b sbc r30, r20 - 1e68: f5 0b sbc r31, r21 - -00001e6a <__udivmodsi4_ep>: - 1e6a: 66 1f adc r22, r22 - 1e6c: 77 1f adc r23, r23 - 1e6e: 88 1f adc r24, r24 - 1e70: 99 1f adc r25, r25 - 1e72: 1a 94 dec r1 - 1e74: 69 f7 brne .-38 ; 0x1e50 <__udivmodsi4_loop> - 1e76: 60 95 com r22 - 1e78: 70 95 com r23 - 1e7a: 80 95 com r24 - 1e7c: 90 95 com r25 - 1e7e: 9b 01 movw r18, r22 - 1e80: ac 01 movw r20, r24 - 1e82: bd 01 movw r22, r26 - 1e84: cf 01 movw r24, r30 - 1e86: 08 95 ret - -00001e88 : - 1e88: fc 01 movw r30, r24 - 1e8a: 88 27 eor r24, r24 - 1e8c: 99 27 eor r25, r25 - 1e8e: e8 94 clt - 1e90: 21 91 ld r18, Z+ - 1e92: 20 32 cpi r18, 0x20 ; 32 - 1e94: e9 f3 breq .-6 ; 0x1e90 - 1e96: 29 30 cpi r18, 0x09 ; 9 - 1e98: 10 f0 brcs .+4 ; 0x1e9e - 1e9a: 2e 30 cpi r18, 0x0E ; 14 - 1e9c: c8 f3 brcs .-14 ; 0x1e90 - 1e9e: 2b 32 cpi r18, 0x2B ; 43 - 1ea0: 39 f0 breq .+14 ; 0x1eb0 - 1ea2: 2d 32 cpi r18, 0x2D ; 45 - 1ea4: 31 f4 brne .+12 ; 0x1eb2 - 1ea6: 68 94 set - 1ea8: 03 c0 rjmp .+6 ; 0x1eb0 - 1eaa: 1a d0 rcall .+52 ; 0x1ee0 <__mulhi_const_10> - 1eac: 82 0f add r24, r18 - 1eae: 91 1d adc r25, r1 - 1eb0: 21 91 ld r18, Z+ - 1eb2: 20 53 subi r18, 0x30 ; 48 - 1eb4: 2a 30 cpi r18, 0x0A ; 10 - 1eb6: c8 f3 brcs .-14 ; 0x1eaa - 1eb8: 1e f4 brtc .+6 ; 0x1ec0 - 1eba: 90 95 com r25 - 1ebc: 81 95 neg r24 - 1ebe: 9f 4f sbci r25, 0xFF ; 255 - 1ec0: 08 95 ret - -00001ec2 : - 1ec2: fb 01 movw r30, r22 - 1ec4: dc 01 movw r26, r24 - 1ec6: 41 50 subi r20, 0x01 ; 1 - 1ec8: 50 40 sbci r21, 0x00 ; 0 - 1eca: 48 f0 brcs .+18 ; 0x1ede - 1ecc: 01 90 ld r0, Z+ - 1ece: 0d 92 st X+, r0 - 1ed0: 00 20 and r0, r0 - 1ed2: c9 f7 brne .-14 ; 0x1ec6 - 1ed4: 01 c0 rjmp .+2 ; 0x1ed8 - 1ed6: 1d 92 st X+, r1 - 1ed8: 41 50 subi r20, 0x01 ; 1 - 1eda: 50 40 sbci r21, 0x00 ; 0 - 1edc: e0 f7 brcc .-8 ; 0x1ed6 + 1b06: 08 95 ret + +00001b08 <__subsf3>: + 1b08: 50 58 subi r21, 0x80 ; 128 + +00001b0a <__addsf3>: + 1b0a: bb 27 eor r27, r27 + 1b0c: aa 27 eor r26, r26 + 1b0e: 0e d0 rcall .+28 ; 0x1b2c <__addsf3x> + 1b10: 70 c1 rjmp .+736 ; 0x1df2 <__fp_round> + 1b12: 61 d1 rcall .+706 ; 0x1dd6 <__fp_pscA> + 1b14: 30 f0 brcs .+12 ; 0x1b22 <__addsf3+0x18> + 1b16: 66 d1 rcall .+716 ; 0x1de4 <__fp_pscB> + 1b18: 20 f0 brcs .+8 ; 0x1b22 <__addsf3+0x18> + 1b1a: 31 f4 brne .+12 ; 0x1b28 <__addsf3+0x1e> + 1b1c: 9f 3f cpi r25, 0xFF ; 255 + 1b1e: 11 f4 brne .+4 ; 0x1b24 <__addsf3+0x1a> + 1b20: 1e f4 brtc .+6 ; 0x1b28 <__addsf3+0x1e> + 1b22: 56 c1 rjmp .+684 ; 0x1dd0 <__fp_nan> + 1b24: 0e f4 brtc .+2 ; 0x1b28 <__addsf3+0x1e> + 1b26: e0 95 com r30 + 1b28: e7 fb bst r30, 7 + 1b2a: 4c c1 rjmp .+664 ; 0x1dc4 <__fp_inf> + +00001b2c <__addsf3x>: + 1b2c: e9 2f mov r30, r25 + 1b2e: 72 d1 rcall .+740 ; 0x1e14 <__fp_split3> + 1b30: 80 f3 brcs .-32 ; 0x1b12 <__addsf3+0x8> + 1b32: ba 17 cp r27, r26 + 1b34: 62 07 cpc r22, r18 + 1b36: 73 07 cpc r23, r19 + 1b38: 84 07 cpc r24, r20 + 1b3a: 95 07 cpc r25, r21 + 1b3c: 18 f0 brcs .+6 ; 0x1b44 <__addsf3x+0x18> + 1b3e: 71 f4 brne .+28 ; 0x1b5c <__addsf3x+0x30> + 1b40: 9e f5 brtc .+102 ; 0x1ba8 <__addsf3x+0x7c> + 1b42: 8a c1 rjmp .+788 ; 0x1e58 <__fp_zero> + 1b44: 0e f4 brtc .+2 ; 0x1b48 <__addsf3x+0x1c> + 1b46: e0 95 com r30 + 1b48: 0b 2e mov r0, r27 + 1b4a: ba 2f mov r27, r26 + 1b4c: a0 2d mov r26, r0 + 1b4e: 0b 01 movw r0, r22 + 1b50: b9 01 movw r22, r18 + 1b52: 90 01 movw r18, r0 + 1b54: 0c 01 movw r0, r24 + 1b56: ca 01 movw r24, r20 + 1b58: a0 01 movw r20, r0 + 1b5a: 11 24 eor r1, r1 + 1b5c: ff 27 eor r31, r31 + 1b5e: 59 1b sub r21, r25 + 1b60: 99 f0 breq .+38 ; 0x1b88 <__addsf3x+0x5c> + 1b62: 59 3f cpi r21, 0xF9 ; 249 + 1b64: 50 f4 brcc .+20 ; 0x1b7a <__addsf3x+0x4e> + 1b66: 50 3e cpi r21, 0xE0 ; 224 + 1b68: 68 f1 brcs .+90 ; 0x1bc4 <__addsf3x+0x98> + 1b6a: 1a 16 cp r1, r26 + 1b6c: f0 40 sbci r31, 0x00 ; 0 + 1b6e: a2 2f mov r26, r18 + 1b70: 23 2f mov r18, r19 + 1b72: 34 2f mov r19, r20 + 1b74: 44 27 eor r20, r20 + 1b76: 58 5f subi r21, 0xF8 ; 248 + 1b78: f3 cf rjmp .-26 ; 0x1b60 <__addsf3x+0x34> + 1b7a: 46 95 lsr r20 + 1b7c: 37 95 ror r19 + 1b7e: 27 95 ror r18 + 1b80: a7 95 ror r26 + 1b82: f0 40 sbci r31, 0x00 ; 0 + 1b84: 53 95 inc r21 + 1b86: c9 f7 brne .-14 ; 0x1b7a <__addsf3x+0x4e> + 1b88: 7e f4 brtc .+30 ; 0x1ba8 <__addsf3x+0x7c> + 1b8a: 1f 16 cp r1, r31 + 1b8c: ba 0b sbc r27, r26 + 1b8e: 62 0b sbc r22, r18 + 1b90: 73 0b sbc r23, r19 + 1b92: 84 0b sbc r24, r20 + 1b94: ba f0 brmi .+46 ; 0x1bc4 <__addsf3x+0x98> + 1b96: 91 50 subi r25, 0x01 ; 1 + 1b98: a1 f0 breq .+40 ; 0x1bc2 <__addsf3x+0x96> + 1b9a: ff 0f add r31, r31 + 1b9c: bb 1f adc r27, r27 + 1b9e: 66 1f adc r22, r22 + 1ba0: 77 1f adc r23, r23 + 1ba2: 88 1f adc r24, r24 + 1ba4: c2 f7 brpl .-16 ; 0x1b96 <__addsf3x+0x6a> + 1ba6: 0e c0 rjmp .+28 ; 0x1bc4 <__addsf3x+0x98> + 1ba8: ba 0f add r27, r26 + 1baa: 62 1f adc r22, r18 + 1bac: 73 1f adc r23, r19 + 1bae: 84 1f adc r24, r20 + 1bb0: 48 f4 brcc .+18 ; 0x1bc4 <__addsf3x+0x98> + 1bb2: 87 95 ror r24 + 1bb4: 77 95 ror r23 + 1bb6: 67 95 ror r22 + 1bb8: b7 95 ror r27 + 1bba: f7 95 ror r31 + 1bbc: 9e 3f cpi r25, 0xFE ; 254 + 1bbe: 08 f0 brcs .+2 ; 0x1bc2 <__addsf3x+0x96> + 1bc0: b3 cf rjmp .-154 ; 0x1b28 <__addsf3+0x1e> + 1bc2: 93 95 inc r25 + 1bc4: 88 0f add r24, r24 + 1bc6: 08 f0 brcs .+2 ; 0x1bca <__addsf3x+0x9e> + 1bc8: 99 27 eor r25, r25 + 1bca: ee 0f add r30, r30 + 1bcc: 97 95 ror r25 + 1bce: 87 95 ror r24 + 1bd0: 08 95 ret + +00001bd2 <__cmpsf2>: + 1bd2: d4 d0 rcall .+424 ; 0x1d7c <__fp_cmp> + 1bd4: 08 f4 brcc .+2 ; 0x1bd8 <__cmpsf2+0x6> + 1bd6: 81 e0 ldi r24, 0x01 ; 1 + 1bd8: 08 95 ret + +00001bda <__divsf3>: + 1bda: 0c d0 rcall .+24 ; 0x1bf4 <__divsf3x> + 1bdc: 0a c1 rjmp .+532 ; 0x1df2 <__fp_round> + 1bde: 02 d1 rcall .+516 ; 0x1de4 <__fp_pscB> + 1be0: 40 f0 brcs .+16 ; 0x1bf2 <__divsf3+0x18> + 1be2: f9 d0 rcall .+498 ; 0x1dd6 <__fp_pscA> + 1be4: 30 f0 brcs .+12 ; 0x1bf2 <__divsf3+0x18> + 1be6: 21 f4 brne .+8 ; 0x1bf0 <__divsf3+0x16> + 1be8: 5f 3f cpi r21, 0xFF ; 255 + 1bea: 19 f0 breq .+6 ; 0x1bf2 <__divsf3+0x18> + 1bec: eb c0 rjmp .+470 ; 0x1dc4 <__fp_inf> + 1bee: 51 11 cpse r21, r1 + 1bf0: 34 c1 rjmp .+616 ; 0x1e5a <__fp_szero> + 1bf2: ee c0 rjmp .+476 ; 0x1dd0 <__fp_nan> + +00001bf4 <__divsf3x>: + 1bf4: 0f d1 rcall .+542 ; 0x1e14 <__fp_split3> + 1bf6: 98 f3 brcs .-26 ; 0x1bde <__divsf3+0x4> + +00001bf8 <__divsf3_pse>: + 1bf8: 99 23 and r25, r25 + 1bfa: c9 f3 breq .-14 ; 0x1bee <__divsf3+0x14> + 1bfc: 55 23 and r21, r21 + 1bfe: b1 f3 breq .-20 ; 0x1bec <__divsf3+0x12> + 1c00: 95 1b sub r25, r21 + 1c02: 55 0b sbc r21, r21 + 1c04: bb 27 eor r27, r27 + 1c06: aa 27 eor r26, r26 + 1c08: 62 17 cp r22, r18 + 1c0a: 73 07 cpc r23, r19 + 1c0c: 84 07 cpc r24, r20 + 1c0e: 38 f0 brcs .+14 ; 0x1c1e <__divsf3_pse+0x26> + 1c10: 9f 5f subi r25, 0xFF ; 255 + 1c12: 5f 4f sbci r21, 0xFF ; 255 + 1c14: 22 0f add r18, r18 + 1c16: 33 1f adc r19, r19 + 1c18: 44 1f adc r20, r20 + 1c1a: aa 1f adc r26, r26 + 1c1c: a9 f3 breq .-22 ; 0x1c08 <__divsf3_pse+0x10> + 1c1e: 33 d0 rcall .+102 ; 0x1c86 <__divsf3_pse+0x8e> + 1c20: 0e 2e mov r0, r30 + 1c22: 3a f0 brmi .+14 ; 0x1c32 <__divsf3_pse+0x3a> + 1c24: e0 e8 ldi r30, 0x80 ; 128 + 1c26: 30 d0 rcall .+96 ; 0x1c88 <__divsf3_pse+0x90> + 1c28: 91 50 subi r25, 0x01 ; 1 + 1c2a: 50 40 sbci r21, 0x00 ; 0 + 1c2c: e6 95 lsr r30 + 1c2e: 00 1c adc r0, r0 + 1c30: ca f7 brpl .-14 ; 0x1c24 <__divsf3_pse+0x2c> + 1c32: 29 d0 rcall .+82 ; 0x1c86 <__divsf3_pse+0x8e> + 1c34: fe 2f mov r31, r30 + 1c36: 27 d0 rcall .+78 ; 0x1c86 <__divsf3_pse+0x8e> + 1c38: 66 0f add r22, r22 + 1c3a: 77 1f adc r23, r23 + 1c3c: 88 1f adc r24, r24 + 1c3e: bb 1f adc r27, r27 + 1c40: 26 17 cp r18, r22 + 1c42: 37 07 cpc r19, r23 + 1c44: 48 07 cpc r20, r24 + 1c46: ab 07 cpc r26, r27 + 1c48: b0 e8 ldi r27, 0x80 ; 128 + 1c4a: 09 f0 breq .+2 ; 0x1c4e <__divsf3_pse+0x56> + 1c4c: bb 0b sbc r27, r27 + 1c4e: 80 2d mov r24, r0 + 1c50: bf 01 movw r22, r30 + 1c52: ff 27 eor r31, r31 + 1c54: 93 58 subi r25, 0x83 ; 131 + 1c56: 5f 4f sbci r21, 0xFF ; 255 + 1c58: 2a f0 brmi .+10 ; 0x1c64 <__divsf3_pse+0x6c> + 1c5a: 9e 3f cpi r25, 0xFE ; 254 + 1c5c: 51 05 cpc r21, r1 + 1c5e: 68 f0 brcs .+26 ; 0x1c7a <__divsf3_pse+0x82> + 1c60: b1 c0 rjmp .+354 ; 0x1dc4 <__fp_inf> + 1c62: fb c0 rjmp .+502 ; 0x1e5a <__fp_szero> + 1c64: 5f 3f cpi r21, 0xFF ; 255 + 1c66: ec f3 brlt .-6 ; 0x1c62 <__divsf3_pse+0x6a> + 1c68: 98 3e cpi r25, 0xE8 ; 232 + 1c6a: dc f3 brlt .-10 ; 0x1c62 <__divsf3_pse+0x6a> + 1c6c: 86 95 lsr r24 + 1c6e: 77 95 ror r23 + 1c70: 67 95 ror r22 + 1c72: b7 95 ror r27 + 1c74: f7 95 ror r31 + 1c76: 9f 5f subi r25, 0xFF ; 255 + 1c78: c9 f7 brne .-14 ; 0x1c6c <__divsf3_pse+0x74> + 1c7a: 88 0f add r24, r24 + 1c7c: 91 1d adc r25, r1 + 1c7e: 96 95 lsr r25 + 1c80: 87 95 ror r24 + 1c82: 97 f9 bld r25, 7 + 1c84: 08 95 ret + 1c86: e1 e0 ldi r30, 0x01 ; 1 + 1c88: 66 0f add r22, r22 + 1c8a: 77 1f adc r23, r23 + 1c8c: 88 1f adc r24, r24 + 1c8e: bb 1f adc r27, r27 + 1c90: 62 17 cp r22, r18 + 1c92: 73 07 cpc r23, r19 + 1c94: 84 07 cpc r24, r20 + 1c96: ba 07 cpc r27, r26 + 1c98: 20 f0 brcs .+8 ; 0x1ca2 <__divsf3_pse+0xaa> + 1c9a: 62 1b sub r22, r18 + 1c9c: 73 0b sbc r23, r19 + 1c9e: 84 0b sbc r24, r20 + 1ca0: ba 0b sbc r27, r26 + 1ca2: ee 1f adc r30, r30 + 1ca4: 88 f7 brcc .-30 ; 0x1c88 <__divsf3_pse+0x90> + 1ca6: e0 95 com r30 + 1ca8: 08 95 ret + +00001caa <__fixunssfsi>: + 1caa: bc d0 rcall .+376 ; 0x1e24 <__fp_splitA> + 1cac: 88 f0 brcs .+34 ; 0x1cd0 <__fixunssfsi+0x26> + 1cae: 9f 57 subi r25, 0x7F ; 127 + 1cb0: 90 f0 brcs .+36 ; 0x1cd6 <__fixunssfsi+0x2c> + 1cb2: b9 2f mov r27, r25 + 1cb4: 99 27 eor r25, r25 + 1cb6: b7 51 subi r27, 0x17 ; 23 + 1cb8: a0 f0 brcs .+40 ; 0x1ce2 <__fixunssfsi+0x38> + 1cba: d1 f0 breq .+52 ; 0x1cf0 <__fixunssfsi+0x46> + 1cbc: 66 0f add r22, r22 + 1cbe: 77 1f adc r23, r23 + 1cc0: 88 1f adc r24, r24 + 1cc2: 99 1f adc r25, r25 + 1cc4: 1a f0 brmi .+6 ; 0x1ccc <__fixunssfsi+0x22> + 1cc6: ba 95 dec r27 + 1cc8: c9 f7 brne .-14 ; 0x1cbc <__fixunssfsi+0x12> + 1cca: 12 c0 rjmp .+36 ; 0x1cf0 <__fixunssfsi+0x46> + 1ccc: b1 30 cpi r27, 0x01 ; 1 + 1cce: 81 f0 breq .+32 ; 0x1cf0 <__fixunssfsi+0x46> + 1cd0: c3 d0 rcall .+390 ; 0x1e58 <__fp_zero> + 1cd2: b1 e0 ldi r27, 0x01 ; 1 + 1cd4: 08 95 ret + 1cd6: c0 c0 rjmp .+384 ; 0x1e58 <__fp_zero> + 1cd8: 67 2f mov r22, r23 + 1cda: 78 2f mov r23, r24 + 1cdc: 88 27 eor r24, r24 + 1cde: b8 5f subi r27, 0xF8 ; 248 + 1ce0: 39 f0 breq .+14 ; 0x1cf0 <__fixunssfsi+0x46> + 1ce2: b9 3f cpi r27, 0xF9 ; 249 + 1ce4: cc f3 brlt .-14 ; 0x1cd8 <__fixunssfsi+0x2e> + 1ce6: 86 95 lsr r24 + 1ce8: 77 95 ror r23 + 1cea: 67 95 ror r22 + 1cec: b3 95 inc r27 + 1cee: d9 f7 brne .-10 ; 0x1ce6 <__fixunssfsi+0x3c> + 1cf0: 3e f4 brtc .+14 ; 0x1d00 <__fixunssfsi+0x56> + 1cf2: 90 95 com r25 + 1cf4: 80 95 com r24 + 1cf6: 70 95 com r23 + 1cf8: 61 95 neg r22 + 1cfa: 7f 4f sbci r23, 0xFF ; 255 + 1cfc: 8f 4f sbci r24, 0xFF ; 255 + 1cfe: 9f 4f sbci r25, 0xFF ; 255 + 1d00: 08 95 ret + +00001d02 <__floatunsisf>: + 1d02: e8 94 clt + 1d04: 09 c0 rjmp .+18 ; 0x1d18 <__floatsisf+0x12> + +00001d06 <__floatsisf>: + 1d06: 97 fb bst r25, 7 + 1d08: 3e f4 brtc .+14 ; 0x1d18 <__floatsisf+0x12> + 1d0a: 90 95 com r25 + 1d0c: 80 95 com r24 + 1d0e: 70 95 com r23 + 1d10: 61 95 neg r22 + 1d12: 7f 4f sbci r23, 0xFF ; 255 + 1d14: 8f 4f sbci r24, 0xFF ; 255 + 1d16: 9f 4f sbci r25, 0xFF ; 255 + 1d18: 99 23 and r25, r25 + 1d1a: a9 f0 breq .+42 ; 0x1d46 <__floatsisf+0x40> + 1d1c: f9 2f mov r31, r25 + 1d1e: 96 e9 ldi r25, 0x96 ; 150 + 1d20: bb 27 eor r27, r27 + 1d22: 93 95 inc r25 + 1d24: f6 95 lsr r31 + 1d26: 87 95 ror r24 + 1d28: 77 95 ror r23 + 1d2a: 67 95 ror r22 + 1d2c: b7 95 ror r27 + 1d2e: f1 11 cpse r31, r1 + 1d30: f8 cf rjmp .-16 ; 0x1d22 <__floatsisf+0x1c> + 1d32: fa f4 brpl .+62 ; 0x1d72 <__floatsisf+0x6c> + 1d34: bb 0f add r27, r27 + 1d36: 11 f4 brne .+4 ; 0x1d3c <__floatsisf+0x36> + 1d38: 60 ff sbrs r22, 0 + 1d3a: 1b c0 rjmp .+54 ; 0x1d72 <__floatsisf+0x6c> + 1d3c: 6f 5f subi r22, 0xFF ; 255 + 1d3e: 7f 4f sbci r23, 0xFF ; 255 + 1d40: 8f 4f sbci r24, 0xFF ; 255 + 1d42: 9f 4f sbci r25, 0xFF ; 255 + 1d44: 16 c0 rjmp .+44 ; 0x1d72 <__floatsisf+0x6c> + 1d46: 88 23 and r24, r24 + 1d48: 11 f0 breq .+4 ; 0x1d4e <__floatsisf+0x48> + 1d4a: 96 e9 ldi r25, 0x96 ; 150 + 1d4c: 11 c0 rjmp .+34 ; 0x1d70 <__floatsisf+0x6a> + 1d4e: 77 23 and r23, r23 + 1d50: 21 f0 breq .+8 ; 0x1d5a <__floatsisf+0x54> + 1d52: 9e e8 ldi r25, 0x8E ; 142 + 1d54: 87 2f mov r24, r23 + 1d56: 76 2f mov r23, r22 + 1d58: 05 c0 rjmp .+10 ; 0x1d64 <__floatsisf+0x5e> + 1d5a: 66 23 and r22, r22 + 1d5c: 71 f0 breq .+28 ; 0x1d7a <__floatsisf+0x74> + 1d5e: 96 e8 ldi r25, 0x86 ; 134 + 1d60: 86 2f mov r24, r22 + 1d62: 70 e0 ldi r23, 0x00 ; 0 + 1d64: 60 e0 ldi r22, 0x00 ; 0 + 1d66: 2a f0 brmi .+10 ; 0x1d72 <__floatsisf+0x6c> + 1d68: 9a 95 dec r25 + 1d6a: 66 0f add r22, r22 + 1d6c: 77 1f adc r23, r23 + 1d6e: 88 1f adc r24, r24 + 1d70: da f7 brpl .-10 ; 0x1d68 <__floatsisf+0x62> + 1d72: 88 0f add r24, r24 + 1d74: 96 95 lsr r25 + 1d76: 87 95 ror r24 + 1d78: 97 f9 bld r25, 7 + 1d7a: 08 95 ret + +00001d7c <__fp_cmp>: + 1d7c: 99 0f add r25, r25 + 1d7e: 00 08 sbc r0, r0 + 1d80: 55 0f add r21, r21 + 1d82: aa 0b sbc r26, r26 + 1d84: e0 e8 ldi r30, 0x80 ; 128 + 1d86: fe ef ldi r31, 0xFE ; 254 + 1d88: 16 16 cp r1, r22 + 1d8a: 17 06 cpc r1, r23 + 1d8c: e8 07 cpc r30, r24 + 1d8e: f9 07 cpc r31, r25 + 1d90: c0 f0 brcs .+48 ; 0x1dc2 <__fp_cmp+0x46> + 1d92: 12 16 cp r1, r18 + 1d94: 13 06 cpc r1, r19 + 1d96: e4 07 cpc r30, r20 + 1d98: f5 07 cpc r31, r21 + 1d9a: 98 f0 brcs .+38 ; 0x1dc2 <__fp_cmp+0x46> + 1d9c: 62 1b sub r22, r18 + 1d9e: 73 0b sbc r23, r19 + 1da0: 84 0b sbc r24, r20 + 1da2: 95 0b sbc r25, r21 + 1da4: 39 f4 brne .+14 ; 0x1db4 <__fp_cmp+0x38> + 1da6: 0a 26 eor r0, r26 + 1da8: 61 f0 breq .+24 ; 0x1dc2 <__fp_cmp+0x46> + 1daa: 23 2b or r18, r19 + 1dac: 24 2b or r18, r20 + 1dae: 25 2b or r18, r21 + 1db0: 21 f4 brne .+8 ; 0x1dba <__fp_cmp+0x3e> + 1db2: 08 95 ret + 1db4: 0a 26 eor r0, r26 + 1db6: 09 f4 brne .+2 ; 0x1dba <__fp_cmp+0x3e> + 1db8: a1 40 sbci r26, 0x01 ; 1 + 1dba: a6 95 lsr r26 + 1dbc: 8f ef ldi r24, 0xFF ; 255 + 1dbe: 81 1d adc r24, r1 + 1dc0: 81 1d adc r24, r1 + 1dc2: 08 95 ret + +00001dc4 <__fp_inf>: + 1dc4: 97 f9 bld r25, 7 + 1dc6: 9f 67 ori r25, 0x7F ; 127 + 1dc8: 80 e8 ldi r24, 0x80 ; 128 + 1dca: 70 e0 ldi r23, 0x00 ; 0 + 1dcc: 60 e0 ldi r22, 0x00 ; 0 + 1dce: 08 95 ret + +00001dd0 <__fp_nan>: + 1dd0: 9f ef ldi r25, 0xFF ; 255 + 1dd2: 80 ec ldi r24, 0xC0 ; 192 + 1dd4: 08 95 ret + +00001dd6 <__fp_pscA>: + 1dd6: 00 24 eor r0, r0 + 1dd8: 0a 94 dec r0 + 1dda: 16 16 cp r1, r22 + 1ddc: 17 06 cpc r1, r23 + 1dde: 18 06 cpc r1, r24 + 1de0: 09 06 cpc r0, r25 + 1de2: 08 95 ret + +00001de4 <__fp_pscB>: + 1de4: 00 24 eor r0, r0 + 1de6: 0a 94 dec r0 + 1de8: 12 16 cp r1, r18 + 1dea: 13 06 cpc r1, r19 + 1dec: 14 06 cpc r1, r20 + 1dee: 05 06 cpc r0, r21 + 1df0: 08 95 ret + +00001df2 <__fp_round>: + 1df2: 09 2e mov r0, r25 + 1df4: 03 94 inc r0 + 1df6: 00 0c add r0, r0 + 1df8: 11 f4 brne .+4 ; 0x1dfe <__fp_round+0xc> + 1dfa: 88 23 and r24, r24 + 1dfc: 52 f0 brmi .+20 ; 0x1e12 <__fp_round+0x20> + 1dfe: bb 0f add r27, r27 + 1e00: 40 f4 brcc .+16 ; 0x1e12 <__fp_round+0x20> + 1e02: bf 2b or r27, r31 + 1e04: 11 f4 brne .+4 ; 0x1e0a <__fp_round+0x18> + 1e06: 60 ff sbrs r22, 0 + 1e08: 04 c0 rjmp .+8 ; 0x1e12 <__fp_round+0x20> + 1e0a: 6f 5f subi r22, 0xFF ; 255 + 1e0c: 7f 4f sbci r23, 0xFF ; 255 + 1e0e: 8f 4f sbci r24, 0xFF ; 255 + 1e10: 9f 4f sbci r25, 0xFF ; 255 + 1e12: 08 95 ret + +00001e14 <__fp_split3>: + 1e14: 57 fd sbrc r21, 7 + 1e16: 90 58 subi r25, 0x80 ; 128 + 1e18: 44 0f add r20, r20 + 1e1a: 55 1f adc r21, r21 + 1e1c: 59 f0 breq .+22 ; 0x1e34 <__fp_splitA+0x10> + 1e1e: 5f 3f cpi r21, 0xFF ; 255 + 1e20: 71 f0 breq .+28 ; 0x1e3e <__fp_splitA+0x1a> + 1e22: 47 95 ror r20 + +00001e24 <__fp_splitA>: + 1e24: 88 0f add r24, r24 + 1e26: 97 fb bst r25, 7 + 1e28: 99 1f adc r25, r25 + 1e2a: 61 f0 breq .+24 ; 0x1e44 <__fp_splitA+0x20> + 1e2c: 9f 3f cpi r25, 0xFF ; 255 + 1e2e: 79 f0 breq .+30 ; 0x1e4e <__fp_splitA+0x2a> + 1e30: 87 95 ror r24 + 1e32: 08 95 ret + 1e34: 12 16 cp r1, r18 + 1e36: 13 06 cpc r1, r19 + 1e38: 14 06 cpc r1, r20 + 1e3a: 55 1f adc r21, r21 + 1e3c: f2 cf rjmp .-28 ; 0x1e22 <__fp_split3+0xe> + 1e3e: 46 95 lsr r20 + 1e40: f1 df rcall .-30 ; 0x1e24 <__fp_splitA> + 1e42: 08 c0 rjmp .+16 ; 0x1e54 <__fp_splitA+0x30> + 1e44: 16 16 cp r1, r22 + 1e46: 17 06 cpc r1, r23 + 1e48: 18 06 cpc r1, r24 + 1e4a: 99 1f adc r25, r25 + 1e4c: f1 cf rjmp .-30 ; 0x1e30 <__fp_splitA+0xc> + 1e4e: 86 95 lsr r24 + 1e50: 71 05 cpc r23, r1 + 1e52: 61 05 cpc r22, r1 + 1e54: 08 94 sec + 1e56: 08 95 ret + +00001e58 <__fp_zero>: + 1e58: e8 94 clt + +00001e5a <__fp_szero>: + 1e5a: bb 27 eor r27, r27 + 1e5c: 66 27 eor r22, r22 + 1e5e: 77 27 eor r23, r23 + 1e60: cb 01 movw r24, r22 + 1e62: 97 f9 bld r25, 7 + 1e64: 08 95 ret + +00001e66 <__gesf2>: + 1e66: 8a df rcall .-236 ; 0x1d7c <__fp_cmp> + 1e68: 08 f4 brcc .+2 ; 0x1e6c <__gesf2+0x6> + 1e6a: 8f ef ldi r24, 0xFF ; 255 + 1e6c: 08 95 ret + +00001e6e <__mulhi3>: + 1e6e: 55 27 eor r21, r21 + 1e70: 00 24 eor r0, r0 + +00001e72 <__mulhi3_loop>: + 1e72: 80 ff sbrs r24, 0 + 1e74: 02 c0 rjmp .+4 ; 0x1e7a <__mulhi3_skip1> + 1e76: 06 0e add r0, r22 + 1e78: 57 1f adc r21, r23 + +00001e7a <__mulhi3_skip1>: + 1e7a: 66 0f add r22, r22 + 1e7c: 77 1f adc r23, r23 + 1e7e: 61 15 cp r22, r1 + 1e80: 71 05 cpc r23, r1 + 1e82: 21 f0 breq .+8 ; 0x1e8c <__mulhi3_exit> + 1e84: 96 95 lsr r25 + 1e86: 87 95 ror r24 + 1e88: 00 97 sbiw r24, 0x00 ; 0 + 1e8a: 99 f7 brne .-26 ; 0x1e72 <__mulhi3_loop> + +00001e8c <__mulhi3_exit>: + 1e8c: 95 2f mov r25, r21 + 1e8e: 80 2d mov r24, r0 + 1e90: 08 95 ret + +00001e92 <__udivmodhi4>: + 1e92: aa 1b sub r26, r26 + 1e94: bb 1b sub r27, r27 + 1e96: 51 e1 ldi r21, 0x11 ; 17 + 1e98: 07 c0 rjmp .+14 ; 0x1ea8 <__udivmodhi4_ep> + +00001e9a <__udivmodhi4_loop>: + 1e9a: aa 1f adc r26, r26 + 1e9c: bb 1f adc r27, r27 + 1e9e: a6 17 cp r26, r22 + 1ea0: b7 07 cpc r27, r23 + 1ea2: 10 f0 brcs .+4 ; 0x1ea8 <__udivmodhi4_ep> + 1ea4: a6 1b sub r26, r22 + 1ea6: b7 0b sbc r27, r23 + +00001ea8 <__udivmodhi4_ep>: + 1ea8: 88 1f adc r24, r24 + 1eaa: 99 1f adc r25, r25 + 1eac: 5a 95 dec r21 + 1eae: a9 f7 brne .-22 ; 0x1e9a <__udivmodhi4_loop> + 1eb0: 80 95 com r24 + 1eb2: 90 95 com r25 + 1eb4: bc 01 movw r22, r24 + 1eb6: cd 01 movw r24, r26 + 1eb8: 08 95 ret + +00001eba <__divmodhi4>: + 1eba: 97 fb bst r25, 7 + 1ebc: 09 2e mov r0, r25 + 1ebe: 07 26 eor r0, r23 + 1ec0: 0a d0 rcall .+20 ; 0x1ed6 <__divmodhi4_neg1> + 1ec2: 77 fd sbrc r23, 7 + 1ec4: 04 d0 rcall .+8 ; 0x1ece <__divmodhi4_neg2> + 1ec6: e5 df rcall .-54 ; 0x1e92 <__udivmodhi4> + 1ec8: 06 d0 rcall .+12 ; 0x1ed6 <__divmodhi4_neg1> + 1eca: 00 20 and r0, r0 + 1ecc: 1a f4 brpl .+6 ; 0x1ed4 <__divmodhi4_exit> + +00001ece <__divmodhi4_neg2>: + 1ece: 70 95 com r23 + 1ed0: 61 95 neg r22 + 1ed2: 7f 4f sbci r23, 0xFF ; 255 + +00001ed4 <__divmodhi4_exit>: + 1ed4: 08 95 ret + +00001ed6 <__divmodhi4_neg1>: + 1ed6: f6 f7 brtc .-4 ; 0x1ed4 <__divmodhi4_exit> + 1ed8: 90 95 com r25 + 1eda: 81 95 neg r24 + 1edc: 9f 4f sbci r25, 0xFF ; 255 1ede: 08 95 ret -00001ee0 <__mulhi_const_10>: - 1ee0: bc 01 movw r22, r24 - 1ee2: 88 0f add r24, r24 - 1ee4: 99 1f adc r25, r25 - 1ee6: 88 0f add r24, r24 - 1ee8: 99 1f adc r25, r25 - 1eea: 86 0f add r24, r22 - 1eec: 97 1f adc r25, r23 - 1eee: 88 0f add r24, r24 - 1ef0: 99 1f adc r25, r25 - 1ef2: 08 95 ret - -00001ef4 <_exit>: - 1ef4: f8 94 cli - -00001ef6 <__stop_program>: - 1ef6: ff cf rjmp .-2 ; 0x1ef6 <__stop_program> +00001ee0 <__udivmodsi4>: + 1ee0: a1 e2 ldi r26, 0x21 ; 33 + 1ee2: 1a 2e mov r1, r26 + 1ee4: aa 1b sub r26, r26 + 1ee6: bb 1b sub r27, r27 + 1ee8: fd 01 movw r30, r26 + 1eea: 0d c0 rjmp .+26 ; 0x1f06 <__udivmodsi4_ep> + +00001eec <__udivmodsi4_loop>: + 1eec: aa 1f adc r26, r26 + 1eee: bb 1f adc r27, r27 + 1ef0: ee 1f adc r30, r30 + 1ef2: ff 1f adc r31, r31 + 1ef4: a2 17 cp r26, r18 + 1ef6: b3 07 cpc r27, r19 + 1ef8: e4 07 cpc r30, r20 + 1efa: f5 07 cpc r31, r21 + 1efc: 20 f0 brcs .+8 ; 0x1f06 <__udivmodsi4_ep> + 1efe: a2 1b sub r26, r18 + 1f00: b3 0b sbc r27, r19 + 1f02: e4 0b sbc r30, r20 + 1f04: f5 0b sbc r31, r21 + +00001f06 <__udivmodsi4_ep>: + 1f06: 66 1f adc r22, r22 + 1f08: 77 1f adc r23, r23 + 1f0a: 88 1f adc r24, r24 + 1f0c: 99 1f adc r25, r25 + 1f0e: 1a 94 dec r1 + 1f10: 69 f7 brne .-38 ; 0x1eec <__udivmodsi4_loop> + 1f12: 60 95 com r22 + 1f14: 70 95 com r23 + 1f16: 80 95 com r24 + 1f18: 90 95 com r25 + 1f1a: 9b 01 movw r18, r22 + 1f1c: ac 01 movw r20, r24 + 1f1e: bd 01 movw r22, r26 + 1f20: cf 01 movw r24, r30 + 1f22: 08 95 ret + +00001f24 : + 1f24: fc 01 movw r30, r24 + 1f26: 88 27 eor r24, r24 + 1f28: 99 27 eor r25, r25 + 1f2a: e8 94 clt + 1f2c: 21 91 ld r18, Z+ + 1f2e: 20 32 cpi r18, 0x20 ; 32 + 1f30: e9 f3 breq .-6 ; 0x1f2c + 1f32: 29 30 cpi r18, 0x09 ; 9 + 1f34: 10 f0 brcs .+4 ; 0x1f3a + 1f36: 2e 30 cpi r18, 0x0E ; 14 + 1f38: c8 f3 brcs .-14 ; 0x1f2c + 1f3a: 2b 32 cpi r18, 0x2B ; 43 + 1f3c: 39 f0 breq .+14 ; 0x1f4c + 1f3e: 2d 32 cpi r18, 0x2D ; 45 + 1f40: 31 f4 brne .+12 ; 0x1f4e + 1f42: 68 94 set + 1f44: 03 c0 rjmp .+6 ; 0x1f4c + 1f46: 1a d0 rcall .+52 ; 0x1f7c <__mulhi_const_10> + 1f48: 82 0f add r24, r18 + 1f4a: 91 1d adc r25, r1 + 1f4c: 21 91 ld r18, Z+ + 1f4e: 20 53 subi r18, 0x30 ; 48 + 1f50: 2a 30 cpi r18, 0x0A ; 10 + 1f52: c8 f3 brcs .-14 ; 0x1f46 + 1f54: 1e f4 brtc .+6 ; 0x1f5c + 1f56: 90 95 com r25 + 1f58: 81 95 neg r24 + 1f5a: 9f 4f sbci r25, 0xFF ; 255 + 1f5c: 08 95 ret + +00001f5e : + 1f5e: fb 01 movw r30, r22 + 1f60: dc 01 movw r26, r24 + 1f62: 41 50 subi r20, 0x01 ; 1 + 1f64: 50 40 sbci r21, 0x00 ; 0 + 1f66: 48 f0 brcs .+18 ; 0x1f7a + 1f68: 01 90 ld r0, Z+ + 1f6a: 0d 92 st X+, r0 + 1f6c: 00 20 and r0, r0 + 1f6e: c9 f7 brne .-14 ; 0x1f62 + 1f70: 01 c0 rjmp .+2 ; 0x1f74 + 1f72: 1d 92 st X+, r1 + 1f74: 41 50 subi r20, 0x01 ; 1 + 1f76: 50 40 sbci r21, 0x00 ; 0 + 1f78: e0 f7 brcc .-8 ; 0x1f72 + 1f7a: 08 95 ret + +00001f7c <__mulhi_const_10>: + 1f7c: bc 01 movw r22, r24 + 1f7e: 88 0f add r24, r24 + 1f80: 99 1f adc r25, r25 + 1f82: 88 0f add r24, r24 + 1f84: 99 1f adc r25, r25 + 1f86: 86 0f add r24, r22 + 1f88: 97 1f adc r25, r23 + 1f8a: 88 0f add r24, r24 + 1f8c: 99 1f adc r25, r25 + 1f8e: 08 95 ret + +00001f90 <_exit>: + 1f90: f8 94 cli + +00001f92 <__stop_program>: + 1f92: ff cf rjmp .-2 ; 0x1f92 <__stop_program> diff --git a/firmware/USBtoSerial.map b/firmware/USBtoSerial.map index bda817c..6c4019a 100644 --- a/firmware/USBtoSerial.map +++ b/firmware/USBtoSerial.map @@ -570,7 +570,7 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .rela.plt *(.rela.plt) -.text 0x0000000000000000 0x1ef8 +.text 0x0000000000000000 0x1f94 *(.vectors) .vectors 0x0000000000000000 0x98 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o 0x0000000000000000 __vectors @@ -700,223 +700,246 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a 0x0000000000000590 delta_y .text.delta_x 0x00000000000005b0 0x20 USBtoSerial.o 0x00000000000005b0 delta_x + .text.init_leds + 0x00000000000005d0 0x8 USBtoSerial.o + 0x00000000000005d0 init_leds + .text.set_led0 + 0x00000000000005d8 0x14 USBtoSerial.o + 0x00000000000005d8 set_led0 + .text.set_led1 + 0x00000000000005ec 0xc USBtoSerial.o + 0x00000000000005ec set_led1 + .text.set_led2 + 0x00000000000005f8 0x1a USBtoSerial.o + 0x00000000000005f8 set_led2 + .text.init_sw 0x0000000000000612 0xe USBtoSerial.o + 0x0000000000000612 init_sw + .text.sw0_state + 0x0000000000000620 0x14 USBtoSerial.o + 0x0000000000000620 sw0_state + .text.sw1_state + 0x0000000000000634 0x14 USBtoSerial.o + 0x0000000000000634 sw1_state + .text.sw2_state + 0x0000000000000648 0x14 USBtoSerial.o + 0x0000000000000648 sw2_state .text.Usb2SerialTask - 0x00000000000005d0 0x96 USBtoSerial.o - 0x00000000000005d0 Usb2SerialTask + 0x000000000000065c 0x96 USBtoSerial.o + 0x000000000000065c Usb2SerialTask .text.SetupHardware - 0x0000000000000666 0x2a USBtoSerial.o - 0x0000000000000666 SetupHardware + 0x00000000000006f2 0x2a USBtoSerial.o + 0x00000000000006f2 SetupHardware .text.EVENT_USB_Device_Connect - 0x0000000000000690 0x2 USBtoSerial.o - 0x0000000000000690 EVENT_USB_Device_Connect + 0x000000000000071c 0x2 USBtoSerial.o + 0x000000000000071c EVENT_USB_Device_Connect .text.EVENT_USB_Device_Disconnect - 0x0000000000000692 0x2 USBtoSerial.o - 0x0000000000000692 EVENT_USB_Device_Disconnect + 0x000000000000071e 0x2 USBtoSerial.o + 0x000000000000071e EVENT_USB_Device_Disconnect .text.EVENT_USB_Device_ConfigurationChanged - 0x0000000000000694 0x8 USBtoSerial.o - 0x0000000000000694 EVENT_USB_Device_ConfigurationChanged + 0x0000000000000720 0x8 USBtoSerial.o + 0x0000000000000720 EVENT_USB_Device_ConfigurationChanged .text.EVENT_USB_Device_ControlRequest - 0x000000000000069c 0x8 USBtoSerial.o - 0x000000000000069c EVENT_USB_Device_ControlRequest + 0x0000000000000728 0x8 USBtoSerial.o + 0x0000000000000728 EVENT_USB_Device_ControlRequest .text.__vector_23 - 0x00000000000006a4 0x54 USBtoSerial.o - 0x00000000000006a4 __vector_23 + 0x0000000000000730 0x54 USBtoSerial.o + 0x0000000000000730 __vector_23 .text.EVENT_CDC_Device_LineEncodingChanged - 0x00000000000006f8 0xcc USBtoSerial.o - 0x00000000000006f8 EVENT_CDC_Device_LineEncodingChanged + 0x0000000000000784 0xcc USBtoSerial.o + 0x0000000000000784 EVENT_CDC_Device_LineEncodingChanged .text.uart_putc - 0x00000000000007c4 0x10 USBtoSerial.o - 0x00000000000007c4 uart_putc + 0x0000000000000850 0x10 USBtoSerial.o + 0x0000000000000850 uart_putc .text.uart_puts - 0x00000000000007d4 0x26 USBtoSerial.o - 0x00000000000007d4 uart_puts + 0x0000000000000860 0x26 USBtoSerial.o + 0x0000000000000860 uart_puts .text.my_uitoa - 0x00000000000007fa 0xcc USBtoSerial.o - 0x00000000000007fa my_uitoa - .text.sign 0x00000000000008c6 0x18 USBtoSerial.o - 0x00000000000008c6 sign + 0x0000000000000886 0xcc USBtoSerial.o + 0x0000000000000886 my_uitoa + .text.sign 0x0000000000000952 0x18 USBtoSerial.o + 0x0000000000000952 sign .text.uart_print_number_wlzeros - 0x00000000000008de 0x28 USBtoSerial.o - 0x00000000000008de uart_print_number_wlzeros + 0x000000000000096a 0x28 USBtoSerial.o + 0x000000000000096a uart_print_number_wlzeros .text.uart_print_signed_number - 0x0000000000000906 0x46 USBtoSerial.o - 0x0000000000000906 uart_print_signed_number + 0x0000000000000992 0x46 USBtoSerial.o + 0x0000000000000992 uart_print_signed_number .text.init_motors - 0x000000000000094c 0x1a USBtoSerial.o - 0x000000000000094c init_motors + 0x00000000000009d8 0x1a USBtoSerial.o + 0x00000000000009d8 init_motors .text.motor_step - 0x0000000000000966 0x64 USBtoSerial.o - 0x0000000000000966 motor_step + 0x00000000000009f2 0x64 USBtoSerial.o + 0x00000000000009f2 motor_step .text.move_plate - 0x00000000000009ca 0xa2 USBtoSerial.o - 0x00000000000009ca move_plate + 0x0000000000000a56 0xa2 USBtoSerial.o + 0x0000000000000a56 move_plate .text.print_steps_in_mm - 0x0000000000000a6c 0x54 USBtoSerial.o - 0x0000000000000a6c print_steps_in_mm + 0x0000000000000af8 0x54 USBtoSerial.o + 0x0000000000000af8 print_steps_in_mm .text.pos_report - 0x0000000000000ac0 0x26 USBtoSerial.o - 0x0000000000000ac0 pos_report + 0x0000000000000b4c 0x26 USBtoSerial.o + 0x0000000000000b4c pos_report .text.parse_command - 0x0000000000000ae6 0x35e USBtoSerial.o - 0x0000000000000ae6 parse_command - .text.main 0x0000000000000e44 0xa2 USBtoSerial.o - 0x0000000000000e44 main + 0x0000000000000b72 0x35e USBtoSerial.o + 0x0000000000000b72 parse_command + .text.main 0x0000000000000ed0 0xb2 USBtoSerial.o + 0x0000000000000ed0 main .text.CALLBACK_USB_GetDescriptor - 0x0000000000000ee6 0x5a Descriptors.o - 0x0000000000000ee6 CALLBACK_USB_GetDescriptor + 0x0000000000000f82 0x5a Descriptors.o + 0x0000000000000f82 CALLBACK_USB_GetDescriptor .text.Endpoint_Write_Control_Stream_LE - 0x0000000000000f40 0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - 0x0000000000000f40 Endpoint_Write_Control_Stream_LE + 0x0000000000000fdc 0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000fdc Endpoint_Write_Control_Stream_LE .text.Endpoint_Write_Control_PStream_LE - 0x0000000000000ff4 0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - 0x0000000000000ff4 Endpoint_Write_Control_PStream_LE + 0x0000000000001090 0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000001090 Endpoint_Write_Control_PStream_LE .text.Endpoint_ConfigureEndpoint_Prv - 0x00000000000010aa 0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x00000000000010aa Endpoint_ConfigureEndpoint_Prv + 0x0000000000001146 0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x0000000000001146 Endpoint_ConfigureEndpoint_Prv .text.Endpoint_ConfigureEndpointTable - 0x0000000000001118 0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x0000000000001118 Endpoint_ConfigureEndpointTable + 0x00000000000011b4 0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000011b4 Endpoint_ConfigureEndpointTable .text.Endpoint_ClearStatusStage - 0x00000000000011a0 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x00000000000011a0 Endpoint_ClearStatusStage + 0x000000000000123c 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x000000000000123c Endpoint_ClearStatusStage .text.Endpoint_WaitUntilReady - 0x00000000000011de 0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x00000000000011de Endpoint_WaitUntilReady + 0x000000000000127a 0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x000000000000127a Endpoint_WaitUntilReady .text.USB_ResetInterface - 0x0000000000001244 0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - 0x0000000000001244 USB_ResetInterface + 0x00000000000012e0 0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000000000012e0 USB_ResetInterface .text.USB_Init - 0x00000000000012b4 0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - 0x00000000000012b4 USB_Init + 0x0000000000001350 0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x0000000000001350 USB_Init .text.USB_INT_DisableAllInterrupts - 0x00000000000012c6 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x00000000000012c6 USB_INT_DisableAllInterrupts + 0x0000000000001362 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000001362 USB_INT_DisableAllInterrupts .text.USB_INT_ClearAllInterrupts - 0x00000000000012cc 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x00000000000012cc USB_INT_ClearAllInterrupts + 0x0000000000001368 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000001368 USB_INT_ClearAllInterrupts .text.__vector_11 - 0x00000000000012d2 0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x00000000000012d2 __vector_11 + 0x000000000000136e 0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x000000000000136e __vector_11 .text.__vector_12 - 0x000000000000141a 0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x000000000000141a __vector_12 + 0x00000000000014b6 0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000000000014b6 __vector_12 .text.USB_Device_ProcessControlRequest - 0x0000000000001490 0x2c4 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - 0x0000000000001490 USB_Device_ProcessControlRequest + 0x000000000000152c 0x2c4 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x000000000000152c USB_Device_ProcessControlRequest .text.USB_Event_Stub - 0x0000000000001754 0x2 ../../LUFA/Drivers/USB/Core/Events.o - 0x0000000000001754 EVENT_USB_Device_WakeUp - 0x0000000000001754 USB_Event_Stub - 0x0000000000001754 EVENT_USB_Device_Suspend - 0x0000000000001754 EVENT_USB_Device_StartOfFrame - 0x0000000000001754 EVENT_USB_Device_Reset + 0x00000000000017f0 0x2 ../../LUFA/Drivers/USB/Core/Events.o + 0x00000000000017f0 EVENT_USB_Device_WakeUp + 0x00000000000017f0 USB_Event_Stub + 0x00000000000017f0 EVENT_USB_Device_Suspend + 0x00000000000017f0 EVENT_USB_Device_StartOfFrame + 0x00000000000017f0 EVENT_USB_Device_Reset .text.USB_USBTask - 0x0000000000001756 0x36 ../../LUFA/Drivers/USB/Core/USBTask.o - 0x0000000000001756 USB_USBTask + 0x00000000000017f2 0x36 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x00000000000017f2 USB_USBTask .text.CDC_Device_ProcessControlRequest - 0x000000000000178c 0x15a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x000000000000178c CDC_Device_ProcessControlRequest + 0x0000000000001828 0x15a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001828 CDC_Device_ProcessControlRequest .text.CDC_Device_ConfigureEndpoints - 0x00000000000018e6 0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000018e6 CDC_Device_ConfigureEndpoints + 0x0000000000001982 0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001982 CDC_Device_ConfigureEndpoints .text.CDC_Device_SendByte - 0x000000000000192e 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x000000000000192e CDC_Device_SendByte + 0x00000000000019ca 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x00000000000019ca CDC_Device_SendByte .text.CDC_Device_Flush - 0x0000000000001988 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001988 CDC_Device_Flush + 0x0000000000001a24 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001a24 CDC_Device_Flush .text.CDC_Device_USBTask - 0x00000000000019e2 0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000019e2 CDC_Device_USBTask + 0x0000000000001a7e 0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001a7e CDC_Device_USBTask .text.CDC_Device_ReceiveByte - 0x0000000000001a10 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001a10 CDC_Device_ReceiveByte + 0x0000000000001aac 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001aac CDC_Device_ReceiveByte .text.CDC_Device_Event_Stub - 0x0000000000001a6a 0x2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001a6a EVENT_CDC_Device_ControLineStateChanged - 0x0000000000001a6a EVENT_CDC_Device_BreakSent - 0x0000000000001a6a CDC_Device_Event_Stub + 0x0000000000001b06 0x2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001b06 EVENT_CDC_Device_ControLineStateChanged + 0x0000000000001b06 EVENT_CDC_Device_BreakSent + 0x0000000000001b06 CDC_Device_Event_Stub .text.avr-libc.fplib - 0x0000000000001a6c 0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) - 0x0000000000001a6c __subsf3 - 0x0000000000001a6e __addsf3 + 0x0000000000001b08 0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) + 0x0000000000001b08 __subsf3 + 0x0000000000001b0a __addsf3 .text.avr-libc.fplib - 0x0000000000001a76 0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) - 0x0000000000001a90 __addsf3x + 0x0000000000001b12 0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) + 0x0000000000001b2c __addsf3x .text.avr-libc.fplib - 0x0000000000001b36 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) - 0x0000000000001b36 __lesf2 - 0x0000000000001b36 __nesf2 - 0x0000000000001b36 __eqsf2 - 0x0000000000001b36 __cmpsf2 - 0x0000000000001b36 __ltsf2 + 0x0000000000001bd2 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) + 0x0000000000001bd2 __lesf2 + 0x0000000000001bd2 __nesf2 + 0x0000000000001bd2 __eqsf2 + 0x0000000000001bd2 __cmpsf2 + 0x0000000000001bd2 __ltsf2 .text.avr-libc.fplib - 0x0000000000001b3e 0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) - 0x0000000000001b3e __divsf3 + 0x0000000000001bda 0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) + 0x0000000000001bda __divsf3 .text.avr-libc.fplib - 0x0000000000001b42 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o) - 0x0000000000001b58 __divsf3x - 0x0000000000001b5c __divsf3_pse + 0x0000000000001bde 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o) + 0x0000000000001bf4 __divsf3x + 0x0000000000001bf8 __divsf3_pse .text.avr-libc.fplib - 0x0000000000001c0e 0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o) - 0x0000000000001c0e __fixunssfsi + 0x0000000000001caa 0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o) + 0x0000000000001caa __fixunssfsi .text.avr-libc.fplib - 0x0000000000001c66 0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o) - 0x0000000000001c66 __floatunsisf - 0x0000000000001c6a __floatsisf + 0x0000000000001d02 0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o) + 0x0000000000001d02 __floatunsisf + 0x0000000000001d06 __floatsisf .text.avr-libc.fplib - 0x0000000000001ce0 0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o) - 0x0000000000001ce0 __fp_cmp + 0x0000000000001d7c 0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o) + 0x0000000000001d7c __fp_cmp .text.avr-libc.fplib - 0x0000000000001d28 0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o) - 0x0000000000001d28 __fp_inf + 0x0000000000001dc4 0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o) + 0x0000000000001dc4 __fp_inf .text.avr-libc.fplib - 0x0000000000001d34 0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o) - 0x0000000000001d34 __fp_nan + 0x0000000000001dd0 0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o) + 0x0000000000001dd0 __fp_nan .text.avr-libc.fplib - 0x0000000000001d3a 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o) - 0x0000000000001d3a __fp_pscA + 0x0000000000001dd6 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o) + 0x0000000000001dd6 __fp_pscA .text.avr-libc.fplib - 0x0000000000001d48 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o) - 0x0000000000001d48 __fp_pscB + 0x0000000000001de4 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o) + 0x0000000000001de4 __fp_pscB .text.avr-libc.fplib - 0x0000000000001d56 0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o) - 0x0000000000001d56 __fp_round + 0x0000000000001df2 0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o) + 0x0000000000001df2 __fp_round .text.avr-libc.fplib - 0x0000000000001d78 0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o) - 0x0000000000001d78 __fp_split3 - 0x0000000000001d88 __fp_splitA + 0x0000000000001e14 0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o) + 0x0000000000001e14 __fp_split3 + 0x0000000000001e24 __fp_splitA .text.avr-libc.fplib - 0x0000000000001dbc 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o) - 0x0000000000001dbc __fp_zero - 0x0000000000001dbe __fp_szero + 0x0000000000001e58 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o) + 0x0000000000001e58 __fp_zero + 0x0000000000001e5a __fp_szero .text.avr-libc.fplib - 0x0000000000001dca 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) - 0x0000000000001dca __gtsf2 - 0x0000000000001dca __gesf2 - .text.libgcc 0x0000000000001dd2 0x24 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) - 0x0000000000001dd2 __mulhi3 - .text.libgcc 0x0000000000001df6 0x28 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) - 0x0000000000001df6 __udivmodhi4 - .text.libgcc 0x0000000000001e1e 0x26 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_divmodhi4.o) - 0x0000000000001e1e __divmodhi4 - 0x0000000000001e1e _div - .text.libgcc 0x0000000000001e44 0x44 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o) - 0x0000000000001e44 __udivmodsi4 + 0x0000000000001e66 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) + 0x0000000000001e66 __gtsf2 + 0x0000000000001e66 __gesf2 + .text.libgcc 0x0000000000001e6e 0x24 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) + 0x0000000000001e6e __mulhi3 + .text.libgcc 0x0000000000001e92 0x28 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) + 0x0000000000001e92 __udivmodhi4 + .text.libgcc 0x0000000000001eba 0x26 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_divmodhi4.o) + 0x0000000000001eba __divmodhi4 + 0x0000000000001eba _div + .text.libgcc 0x0000000000001ee0 0x44 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o) + 0x0000000000001ee0 __udivmodsi4 .text.avr-libc - 0x0000000000001e88 0x3a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) - 0x0000000000001e88 atoi + 0x0000000000001f24 0x3a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + 0x0000000000001f24 atoi .text.avr-libc - 0x0000000000001ec2 0x1e /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) - 0x0000000000001ec2 strncpy + 0x0000000000001f5e 0x1e /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + 0x0000000000001f5e strncpy .text.avr-libc - 0x0000000000001ee0 0x14 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) - 0x0000000000001ee0 __mulhi_const_10 - 0x0000000000001ef4 . = ALIGN (0x2) + 0x0000000000001f7c 0x14 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + 0x0000000000001f7c __mulhi_const_10 + 0x0000000000001f90 . = ALIGN (0x2) *(.fini9) - .fini9 0x0000000000001ef4 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) - 0x0000000000001ef4 exit - 0x0000000000001ef4 _exit + .fini9 0x0000000000001f90 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) + 0x0000000000001f90 exit + 0x0000000000001f90 _exit *(.fini9) *(.fini8) *(.fini8) @@ -935,11 +958,11 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a *(.fini1) *(.fini1) *(.fini0) - .fini0 0x0000000000001ef4 0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) + .fini0 0x0000000000001f90 0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) *(.fini0) - 0x0000000000001ef8 _etext = . + 0x0000000000001f94 _etext = . -.data 0x0000000000800100 0x4e load address 0x0000000000001ef8 +.data 0x0000000000800100 0x4e load address 0x0000000000001f94 0x0000000000800100 PROVIDE (__data_start, .) *(.data) .data 0x0000000000800100 0x4d USBtoSerial.o @@ -975,8 +998,8 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a 0x00000000008002cb USB_IsInitialized 0x00000000008002cc USB_ControlRequest 0x00000000008002d4 PROVIDE (__bss_end, .) - 0x0000000000001ef8 __data_load_start = LOADADDR (.data) - 0x0000000000001f46 __data_load_end = (__data_load_start + SIZEOF (.data)) + 0x0000000000001f94 __data_load_start = LOADADDR (.data) + 0x0000000000001fe2 __data_load_end = (__data_load_start + SIZEOF (.data)) .noinit 0x00000000008002d4 0x0 0x00000000008002d4 PROVIDE (__noinit_start, .) @@ -1086,291 +1109,291 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .debug_sfnames *(.debug_sfnames) -.debug_aranges 0x0000000000000000 0x5a0 +.debug_aranges 0x0000000000000000 0x5e0 *(.debug_aranges) .debug_aranges - 0x0000000000000000 0x170 USBtoSerial.o + 0x0000000000000000 0x1b0 USBtoSerial.o .debug_aranges - 0x0000000000000170 0x20 Descriptors.o + 0x00000000000001b0 0x20 Descriptors.o .debug_aranges - 0x0000000000000190 0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x00000000000001d0 0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o .debug_aranges - 0x00000000000001c8 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + 0x0000000000000208 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o .debug_aranges - 0x00000000000001e8 0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000228 0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o .debug_aranges - 0x00000000000002b0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000002f0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o .debug_aranges - 0x00000000000002f0 0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x0000000000000330 0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o .debug_aranges - 0x0000000000000320 0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000000360 0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o .debug_aranges - 0x0000000000000358 0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + 0x0000000000000398 0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o .debug_aranges - 0x0000000000000390 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x00000000000003d0 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o .debug_aranges - 0x00000000000003b0 0x20 ../../LUFA/Drivers/USB/Core/Events.o + 0x00000000000003f0 0x20 ../../LUFA/Drivers/USB/Core/Events.o .debug_aranges - 0x00000000000003d0 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x0000000000000410 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o .debug_aranges - 0x00000000000003f0 0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + 0x0000000000000430 0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o .debug_aranges - 0x0000000000000420 0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000000460 0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o .debug_aranges - 0x00000000000004b8 0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + 0x00000000000004f8 0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o .debug_aranges - 0x00000000000004e8 0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + 0x0000000000000528 0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o .debug_aranges - 0x0000000000000518 0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + 0x0000000000000558 0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o .debug_aranges - 0x0000000000000558 0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + 0x0000000000000598 0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o .debug_pubnames - 0x0000000000000000 0xf39 + 0x0000000000000000 0xfa4 *(.debug_pubnames) .debug_pubnames - 0x0000000000000000 0x39e USBtoSerial.o + 0x0000000000000000 0x409 USBtoSerial.o .debug_pubnames - 0x000000000000039e 0x9e Descriptors.o + 0x0000000000000409 0x9e Descriptors.o .debug_pubnames - 0x000000000000043c 0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x00000000000004a7 0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o .debug_pubnames - 0x00000000000004ba 0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + 0x0000000000000525 0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o .debug_pubnames - 0x00000000000004ec 0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000557 0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o .debug_pubnames - 0x00000000000007cb 0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x0000000000000836 0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o .debug_pubnames - 0x000000000000087a 0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000000000008e5 0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o .debug_pubnames - 0x00000000000008c0 0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x000000000000092b 0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o .debug_pubnames - 0x0000000000000932 0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + 0x000000000000099d 0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o .debug_pubnames - 0x00000000000009cd 0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x0000000000000a38 0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o .debug_pubnames - 0x0000000000000a6e 0x25 ../../LUFA/Drivers/USB/Core/Events.o + 0x0000000000000ad9 0x25 ../../LUFA/Drivers/USB/Core/Events.o .debug_pubnames - 0x0000000000000a93 0x4f ../../LUFA/Drivers/USB/Core/USBTask.o + 0x0000000000000afe 0x4f ../../LUFA/Drivers/USB/Core/USBTask.o .debug_pubnames - 0x0000000000000ae2 0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + 0x0000000000000b4d 0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o .debug_pubnames - 0x0000000000000b5b 0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000000bc6 0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o .debug_pubnames - 0x0000000000000ce6 0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + 0x0000000000000d51 0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o .debug_pubnames - 0x0000000000000d56 0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + 0x0000000000000dc1 0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o .debug_pubnames - 0x0000000000000dc3 0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + 0x0000000000000e2e 0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o .debug_pubnames - 0x0000000000000e69 0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + 0x0000000000000ed4 0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o -.debug_info 0x0000000000000000 0x92a1 +.debug_info 0x0000000000000000 0x9390 *(.debug_info) - .debug_info 0x0000000000000000 0x14e3 USBtoSerial.o - .debug_info 0x00000000000014e3 0x77d Descriptors.o - .debug_info 0x0000000000001c60 0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_info 0x0000000000002359 0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_info 0x0000000000002431 0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_info 0x000000000000397d 0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_info 0x0000000000003f80 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_info 0x0000000000003fec 0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_info 0x0000000000004058 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_info 0x00000000000040c4 0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_info 0x00000000000044d6 0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_info 0x0000000000004b38 0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_info 0x0000000000004ec4 0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_info 0x0000000000005837 0x85 ../../LUFA/Drivers/USB/Core/Events.o - .debug_info 0x00000000000058bc 0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_info 0x0000000000005928 0x245 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_info 0x0000000000005b6d 0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_info 0x00000000000060d9 0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_info 0x0000000000006d14 0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_info 0x000000000000738e 0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_info 0x0000000000007b58 0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_info 0x0000000000008019 0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_info 0x0000000000008ed5 0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_info 0x0000000000008f41 0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_info 0x0000000000008fad 0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_info 0x0000000000009019 0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_info 0x0000000000009085 0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_info 0x00000000000090f1 0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_info 0x000000000000915d 0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_info 0x00000000000091c9 0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_info 0x0000000000009235 0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + .debug_info 0x0000000000000000 0x15d2 USBtoSerial.o + .debug_info 0x00000000000015d2 0x77d Descriptors.o + .debug_info 0x0000000000001d4f 0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_info 0x0000000000002448 0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_info 0x0000000000002520 0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_info 0x0000000000003a6c 0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_info 0x000000000000406f 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_info 0x00000000000040db 0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_info 0x0000000000004147 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_info 0x00000000000041b3 0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_info 0x00000000000045c5 0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_info 0x0000000000004c27 0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_info 0x0000000000004fb3 0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_info 0x0000000000005926 0x85 ../../LUFA/Drivers/USB/Core/Events.o + .debug_info 0x00000000000059ab 0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_info 0x0000000000005a17 0x245 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_info 0x0000000000005c5c 0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_info 0x00000000000061c8 0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_info 0x0000000000006e03 0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_info 0x000000000000747d 0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_info 0x0000000000007c47 0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_info 0x0000000000008108 0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_info 0x0000000000008fc4 0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_info 0x0000000000009030 0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_info 0x000000000000909c 0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_info 0x0000000000009108 0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_info 0x0000000000009174 0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_info 0x00000000000091e0 0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_info 0x000000000000924c 0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_info 0x00000000000092b8 0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_info 0x0000000000009324 0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o *(.gnu.linkonce.wi.*) -.debug_abbrev 0x0000000000000000 0x220b +.debug_abbrev 0x0000000000000000 0x21fc *(.debug_abbrev) - .debug_abbrev 0x0000000000000000 0x482 USBtoSerial.o - .debug_abbrev 0x0000000000000482 0x153 Descriptors.o - .debug_abbrev 0x00000000000005d5 0x1ec ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_abbrev 0x00000000000007c1 0x7d ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_abbrev 0x000000000000083e 0x18b ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_abbrev 0x00000000000009c9 0x1ee ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_abbrev 0x0000000000000bb7 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_abbrev 0x0000000000000be1 0x2a ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_abbrev 0x0000000000000c0b 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_abbrev 0x0000000000000c35 0x14d ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_abbrev 0x0000000000000d82 0x1e2 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_abbrev 0x0000000000000f64 0x148 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_abbrev 0x00000000000010ac 0x20b ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_abbrev 0x00000000000012b7 0x41 ../../LUFA/Drivers/USB/Core/Events.o - .debug_abbrev 0x00000000000012f8 0x2a ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_abbrev 0x0000000000001322 0x14b ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_abbrev 0x000000000000146d 0x160 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_abbrev 0x00000000000015cd 0x2ec ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_abbrev 0x00000000000018b9 0x1b5 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_abbrev 0x0000000000001a6e 0x205 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_abbrev 0x0000000000001c73 0x16c ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_abbrev 0x0000000000001ddf 0x2b2 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_abbrev 0x0000000000002091 0x2a ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_abbrev 0x00000000000020bb 0x2a ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_abbrev 0x00000000000020e5 0x2a ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_abbrev 0x000000000000210f 0x2a ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_abbrev 0x0000000000002139 0x2a ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_abbrev 0x0000000000002163 0x2a ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_abbrev 0x000000000000218d 0x2a ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_abbrev 0x00000000000021b7 0x2a ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_abbrev 0x00000000000021e1 0x2a ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o - -.debug_line 0x0000000000000000 0x7bee + .debug_abbrev 0x0000000000000000 0x473 USBtoSerial.o + .debug_abbrev 0x0000000000000473 0x153 Descriptors.o + .debug_abbrev 0x00000000000005c6 0x1ec ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_abbrev 0x00000000000007b2 0x7d ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_abbrev 0x000000000000082f 0x18b ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_abbrev 0x00000000000009ba 0x1ee ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_abbrev 0x0000000000000ba8 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_abbrev 0x0000000000000bd2 0x2a ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_abbrev 0x0000000000000bfc 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_abbrev 0x0000000000000c26 0x14d ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_abbrev 0x0000000000000d73 0x1e2 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_abbrev 0x0000000000000f55 0x148 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_abbrev 0x000000000000109d 0x20b ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_abbrev 0x00000000000012a8 0x41 ../../LUFA/Drivers/USB/Core/Events.o + .debug_abbrev 0x00000000000012e9 0x2a ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_abbrev 0x0000000000001313 0x14b ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_abbrev 0x000000000000145e 0x160 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_abbrev 0x00000000000015be 0x2ec ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_abbrev 0x00000000000018aa 0x1b5 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_abbrev 0x0000000000001a5f 0x205 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_abbrev 0x0000000000001c64 0x16c ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_abbrev 0x0000000000001dd0 0x2b2 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_abbrev 0x0000000000002082 0x2a ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_abbrev 0x00000000000020ac 0x2a ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_abbrev 0x00000000000020d6 0x2a ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_abbrev 0x0000000000002100 0x2a ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_abbrev 0x000000000000212a 0x2a ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_abbrev 0x0000000000002154 0x2a ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_abbrev 0x000000000000217e 0x2a ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_abbrev 0x00000000000021a8 0x2a ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_abbrev 0x00000000000021d2 0x2a ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + +.debug_line 0x0000000000000000 0x7d90 *(.debug_line) - .debug_line 0x0000000000000000 0x160b USBtoSerial.o - .debug_line 0x000000000000160b 0x1d9 Descriptors.o - .debug_line 0x00000000000017e4 0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_line 0x0000000000001f46 0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_line 0x00000000000020a5 0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_line 0x0000000000003b25 0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_line 0x00000000000040c6 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_line 0x0000000000004104 0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_line 0x0000000000004142 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_line 0x0000000000004180 0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_line 0x0000000000004492 0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_line 0x00000000000049ec 0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_line 0x0000000000004c55 0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_line 0x00000000000051f7 0x80 ../../LUFA/Drivers/USB/Core/Events.o - .debug_line 0x0000000000005277 0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_line 0x00000000000052b5 0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_line 0x0000000000005463 0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_line 0x0000000000005921 0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_line 0x00000000000062e3 0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_line 0x00000000000068a6 0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_line 0x0000000000006e6c 0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_line 0x0000000000007228 0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_line 0x00000000000079c0 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_line 0x00000000000079fe 0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_line 0x0000000000007a3c 0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_line 0x0000000000007a7a 0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_line 0x0000000000007ab8 0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_line 0x0000000000007af6 0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_line 0x0000000000007b34 0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_line 0x0000000000007b72 0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_line 0x0000000000007bb0 0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o - -.debug_frame 0x0000000000000000 0x900 + .debug_line 0x0000000000000000 0x17ad USBtoSerial.o + .debug_line 0x00000000000017ad 0x1d9 Descriptors.o + .debug_line 0x0000000000001986 0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_line 0x00000000000020e8 0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_line 0x0000000000002247 0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_line 0x0000000000003cc7 0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_line 0x0000000000004268 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_line 0x00000000000042a6 0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_line 0x00000000000042e4 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_line 0x0000000000004322 0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_line 0x0000000000004634 0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_line 0x0000000000004b8e 0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_line 0x0000000000004df7 0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_line 0x0000000000005399 0x80 ../../LUFA/Drivers/USB/Core/Events.o + .debug_line 0x0000000000005419 0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_line 0x0000000000005457 0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_line 0x0000000000005605 0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_line 0x0000000000005ac3 0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_line 0x0000000000006485 0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_line 0x0000000000006a48 0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_line 0x000000000000700e 0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_line 0x00000000000073ca 0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_line 0x0000000000007b62 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_line 0x0000000000007ba0 0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_line 0x0000000000007bde 0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_line 0x0000000000007c1c 0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_line 0x0000000000007c5a 0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_line 0x0000000000007c98 0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_line 0x0000000000007cd6 0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_line 0x0000000000007d14 0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_line 0x0000000000007d52 0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + +.debug_frame 0x0000000000000000 0x980 *(.debug_frame) - .debug_frame 0x0000000000000000 0x2c0 USBtoSerial.o - .debug_frame 0x00000000000002c0 0x20 Descriptors.o - .debug_frame 0x00000000000002e0 0x50 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_frame 0x0000000000000330 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_frame 0x0000000000000350 0x170 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_frame 0x00000000000004c0 0x60 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_frame 0x0000000000000520 0x40 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_frame 0x0000000000000560 0x50 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_frame 0x00000000000005b0 0x50 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_frame 0x0000000000000600 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_frame 0x0000000000000620 0x20 ../../LUFA/Drivers/USB/Core/Events.o - .debug_frame 0x0000000000000640 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_frame 0x0000000000000660 0x40 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_frame 0x00000000000006a0 0x110 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_frame 0x00000000000007b0 0x40 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_frame 0x00000000000007f0 0x40 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_frame 0x0000000000000830 0x60 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_frame 0x0000000000000890 0x70 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - -.debug_str 0x0000000000000000 0x3d74 + .debug_frame 0x0000000000000000 0x340 USBtoSerial.o + .debug_frame 0x0000000000000340 0x20 Descriptors.o + .debug_frame 0x0000000000000360 0x50 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_frame 0x00000000000003b0 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_frame 0x00000000000003d0 0x170 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_frame 0x0000000000000540 0x60 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_frame 0x00000000000005a0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_frame 0x00000000000005e0 0x50 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_frame 0x0000000000000630 0x50 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_frame 0x0000000000000680 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_frame 0x00000000000006a0 0x20 ../../LUFA/Drivers/USB/Core/Events.o + .debug_frame 0x00000000000006c0 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_frame 0x00000000000006e0 0x40 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_frame 0x0000000000000720 0x110 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_frame 0x0000000000000830 0x40 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_frame 0x0000000000000870 0x40 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_frame 0x00000000000008b0 0x60 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_frame 0x0000000000000910 0x70 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + +.debug_str 0x0000000000000000 0x3dc5 *(.debug_str) - .debug_str 0x0000000000000000 0xab6 USBtoSerial.o - 0xb6e (size before relaxing) - .debug_str 0x0000000000000ab6 0x8ba Descriptors.o + .debug_str 0x0000000000000000 0xb07 USBtoSerial.o + 0xbbf (size before relaxing) + .debug_str 0x0000000000000b07 0x8ba Descriptors.o 0x9e5 (size before relaxing) - .debug_str 0x0000000000001370 0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_str 0x00000000000013c1 0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o 0x5c5 (size before relaxing) - .debug_str 0x00000000000017ec 0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_str 0x000000000000183d 0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o 0x128 (size before relaxing) - .debug_str 0x0000000000001863 0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_str 0x00000000000018b4 0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o 0x73e (size before relaxing) - .debug_str 0x0000000000001df5 0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_str 0x0000000000001e46 0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o 0x53a (size before relaxing) - .debug_str 0x0000000000002007 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_str 0x0000000000002058 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o 0xd0 (size before relaxing) - .debug_str 0x0000000000002034 0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_str 0x0000000000002085 0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o 0xd6 (size before relaxing) - .debug_str 0x0000000000002067 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_str 0x00000000000020b8 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o 0xd0 (size before relaxing) - .debug_str 0x0000000000002094 0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_str 0x00000000000020e5 0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o 0x3f9 (size before relaxing) - .debug_str 0x000000000000229d 0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_str 0x00000000000022ee 0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o 0x3fb (size before relaxing) - .debug_str 0x00000000000023b0 0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_str 0x0000000000002401 0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o 0x310 (size before relaxing) - .debug_str 0x00000000000025d7 0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_str 0x0000000000002628 0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o 0x82e (size before relaxing) - .debug_str 0x0000000000002989 0x34 ../../LUFA/Drivers/USB/Core/Events.o + .debug_str 0x00000000000029da 0x34 ../../LUFA/Drivers/USB/Core/Events.o 0xd7 (size before relaxing) - .debug_str 0x00000000000029bd 0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_str 0x0000000000002a0e 0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o 0xd1 (size before relaxing) - .debug_str 0x00000000000029eb 0x4e ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_str 0x0000000000002a3c 0x4e ../../LUFA/Drivers/USB/Core/USBTask.o 0x27e (size before relaxing) - .debug_str 0x0000000000002a39 0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_str 0x0000000000002a8a 0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o 0x4fe (size before relaxing) - .debug_str 0x0000000000002c72 0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_str 0x0000000000002cc3 0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o 0x8b2 (size before relaxing) - .debug_str 0x0000000000002f6c 0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_str 0x0000000000002fbd 0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o 0x52d (size before relaxing) - .debug_str 0x0000000000003159 0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_str 0x00000000000031aa 0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o 0x68e (size before relaxing) - .debug_str 0x0000000000003396 0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_str 0x00000000000033e7 0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o 0x515 (size before relaxing) - .debug_str 0x00000000000034ae 0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_str 0x00000000000034ff 0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o 0xbc6 (size before relaxing) - .debug_str 0x0000000000003b96 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_str 0x0000000000003be7 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o 0xe1 (size before relaxing) - .debug_str 0x0000000000003bd4 0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_str 0x0000000000003c25 0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o 0xd6 (size before relaxing) - .debug_str 0x0000000000003c07 0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_str 0x0000000000003c58 0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o 0xd4 (size before relaxing) - .debug_str 0x0000000000003c38 0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_str 0x0000000000003c89 0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o 0xd4 (size before relaxing) - .debug_str 0x0000000000003c69 0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_str 0x0000000000003cba 0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o 0xdc (size before relaxing) - .debug_str 0x0000000000003ca2 0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_str 0x0000000000003cf3 0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o 0xd5 (size before relaxing) - .debug_str 0x0000000000003cd4 0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_str 0x0000000000003d25 0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o 0xd8 (size before relaxing) - .debug_str 0x0000000000003d09 0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_str 0x0000000000003d5a 0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o 0xd6 (size before relaxing) - .debug_str 0x0000000000003d3c 0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + .debug_str 0x0000000000003d8d 0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o 0xdb (size before relaxing) -.debug_loc 0x0000000000000000 0x4b3c +.debug_loc 0x0000000000000000 0x4b8d *(.debug_loc) - .debug_loc 0x0000000000000000 0xaa0 USBtoSerial.o - .debug_loc 0x0000000000000aa0 0xd3 Descriptors.o - .debug_loc 0x0000000000000b73 0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_loc 0x0000000000001402 0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_loc 0x0000000000002d84 0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_loc 0x0000000000003114 0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_loc 0x00000000000032a4 0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_loc 0x0000000000003560 0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_loc 0x000000000000378a 0x27 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_loc 0x00000000000037b1 0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_loc 0x000000000000391e 0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_loc 0x0000000000003e49 0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_loc 0x0000000000004092 0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_loc 0x00000000000041e4 0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_loc 0x00000000000043da 0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_loc 0x0000000000000000 0xaf1 USBtoSerial.o + .debug_loc 0x0000000000000af1 0xd3 Descriptors.o + .debug_loc 0x0000000000000bc4 0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_loc 0x0000000000001453 0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_loc 0x0000000000002dd5 0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_loc 0x0000000000003165 0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_loc 0x00000000000032f5 0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_loc 0x00000000000035b1 0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_loc 0x00000000000037db 0x27 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_loc 0x0000000000003802 0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_loc 0x000000000000396f 0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_loc 0x0000000000003e9a 0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_loc 0x00000000000040e3 0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_loc 0x0000000000004235 0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_loc 0x000000000000442b 0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o .debug_macinfo *(.debug_macinfo) @@ -1442,25 +1465,25 @@ LOAD linker stubs .debug_pubtypes 0x00000000000010ff 0x12 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o -.debug_ranges 0x0000000000000000 0x828 - .debug_ranges 0x0000000000000000 0x190 USBtoSerial.o - .debug_ranges 0x0000000000000190 0x10 Descriptors.o - .debug_ranges 0x00000000000001a0 0x100 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_ranges 0x00000000000002a0 0x10 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_ranges 0x00000000000002b0 0x298 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_ranges 0x0000000000000548 0xa8 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_ranges 0x00000000000005f0 0x20 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_ranges 0x0000000000000610 0x28 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_ranges 0x0000000000000638 0x28 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_ranges 0x0000000000000660 0x10 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_ranges 0x0000000000000670 0x10 ../../LUFA/Drivers/USB/Core/Events.o - .debug_ranges 0x0000000000000680 0x10 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_ranges 0x0000000000000690 0x20 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_ranges 0x00000000000006b0 0x88 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_ranges 0x0000000000000738 0x20 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_ranges 0x0000000000000758 0x20 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_ranges 0x0000000000000778 0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_ranges 0x00000000000007a8 0x80 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o +.debug_ranges 0x0000000000000000 0x868 + .debug_ranges 0x0000000000000000 0x1d0 USBtoSerial.o + .debug_ranges 0x00000000000001d0 0x10 Descriptors.o + .debug_ranges 0x00000000000001e0 0x100 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_ranges 0x00000000000002e0 0x10 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_ranges 0x00000000000002f0 0x298 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_ranges 0x0000000000000588 0xa8 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_ranges 0x0000000000000630 0x20 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_ranges 0x0000000000000650 0x28 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_ranges 0x0000000000000678 0x28 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_ranges 0x00000000000006a0 0x10 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_ranges 0x00000000000006b0 0x10 ../../LUFA/Drivers/USB/Core/Events.o + .debug_ranges 0x00000000000006c0 0x10 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_ranges 0x00000000000006d0 0x20 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_ranges 0x00000000000006f0 0x88 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_ranges 0x0000000000000778 0x20 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_ranges 0x0000000000000798 0x20 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_ranges 0x00000000000007b8 0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_ranges 0x00000000000007e8 0x80 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o Cross Reference Table @@ -1783,7 +1806,9 @@ delta_x USBtoSerial.o delta_y USBtoSerial.o exit /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o +init_leds USBtoSerial.o init_motors USBtoSerial.o +init_sw USBtoSerial.o main USBtoSerial.o /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o memcmp /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o) @@ -1804,12 +1829,18 @@ plate_pos_x USBtoSerial.o plate_pos_y USBtoSerial.o pos_report USBtoSerial.o print_steps_in_mm USBtoSerial.o +set_led0 USBtoSerial.o +set_led1 USBtoSerial.o +set_led2 USBtoSerial.o set_x USBtoSerial.o set_y USBtoSerial.o sign USBtoSerial.o stringbuffer USBtoSerial.o strncpy /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) USBtoSerial.o +sw0_state USBtoSerial.o +sw1_state USBtoSerial.o +sw2_state USBtoSerial.o t0ext USBtoSerial.o t0ovfcount USBtoSerial.o t0rst USBtoSerial.o diff --git a/firmware/USBtoSerial.o b/firmware/USBtoSerial.o index 04d74d5ab160011fc71119d19c98dd0061231841..6fb4646d5e8c65c3f272d46631ccf947a093469a 100644 GIT binary patch literal 64748 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 literal 60800 zcmeIbd3+Vs{r`U^H$a3yAS@yxTp%nWBw-aSLI?o?5h4VN>rEhmL_-p@uvn`JAVft8 zgeW2|RkW6B-KblwrfzjX#jUkgYqV<7TE&)DYqfq~uQTuWz2{C6m+$BMef++E{LX{P zJkNXH=Y8I1otblIhKpv-o8@_)(cqayCKfX$afLBA;ox|yFv66Y60~A@P>Bl*(KEN z=x#l{h2G+h-8&kS(8q+jozUe6UFP&OCX{BnbeRebcq0gF9TL4RU7*szgG$E{(C^>X zm`;+g0~03o^i{f0<%q6Plao5bfkZFV%^I*ryNIf_mMp3;Le;J*$e;GQdET6!w3RZ* z%;}lY#hC8UO!EDtW)I{pQDaim{R}${PoC2=4CS6N0i(Ur;Q$_ zuG@+mC{}GG9JAWPOZBokQ+-g(i3GIQU?+-t7!va;0nxN$%$S}`yR^$`DEQE0JU2S5 z1CCN{xa(Ccs}W)w&M>QEW4uV~%rdBRVQt0jTAe$j7+Mj2Blj zDd`Vi$E2HB4f+O*8S4t?*pg+zm2oyR+x~2=Sa#!`>Od|NqE4YzV_Fk!p0IO#7mSHi zjFw4s$C%07^~Zq|EWpAKq7K;3rG8C`8g|5NtrML(L-MJJM%#K?EW+x|aw^bvjOn&c za3tGzi}q&FRbz6jKNxj0W1WXKW;rbew@-4tRbOZK_J$|Z)*L58JNo8!!6abJ$uXbV z5c6VgGJ1*}#UPkwd-nVZwr4MhrSj#ut|B|ksjdbE=B-|sa5xp2L_0;f^OP0qAFGtK zj#FXCgNu?Z>HJw%f=NjwKUxY*Oz2QjR_&Wky5Jn@By^%qC=p##RWICNCH{dVdmxl# zV;#Is_jY&{oBF*?P&jYvVW6|HPY#^4m+8FXT6i1El9$OAK*Yz zha=9OiV`0IHb>-BlrThM1rZzb{A0`fVa&t#XF+#E2y$Ejn{EoHSAd*+Vxpf zJI}xQTUD(gbSTd{?Pt;D#b?`0CuY0+;a_bYwx*=kOqWhw%DgEsifPf9E*0Kd>`-(+ zdY&ic^P|-g?chh(NVKD0$6eNX%&=?1e3+9ePU@aqcqO8?wvugCYrQ5Hv%(XG`1P7x z;>SArn&)B$u^BmDVxCXf8iu;Sz=YTWbVSsK5{Bqe)gyAka^r_6X2B>2#M zK~1&s&hujlwrpOdA4}{$v#ii~ResDbw^!{KDaqHA0(M57+IC=Yn)|IV;j!mAQ`WQ%z zhZ^Cb(0?=qBr#*1UhLq7a0WL6B9XNQvDctGkO@1z+=1z&eqQoTPJ^ajKQCDuel;(I zL$)Hkjb3O&RAnQp$=AL(Cf!sI1-~{g^=p%Tp$}^+%>2AhY|Riu+rx%a+#p|0a}0y| z$NPlE_ErqBktrhi1ku$LYa7 z^#BK=-ihj|@v3h{RZoqnj-G?c)SQD6a9w`obUD!R5Lk+GoaTkMjx&mzl(Kz1y93qSL>J(>(E-#8N%vM_0v1 z%QR}l{u^=j#hbsxss|=%e}eDk-{Q2-z)5pxmUKCr`4?LK(=MV>`WA{VLAt-LQIGoYj!`{mlBUpV%qB^*dwkjJMnMd)obhUkN>04+A;U z+iTT~a-?6oM+SPH9Ur!?{K}RzBU>Mt;(LHw(r8ylIyTT4ocgVu#FOkXp3!h+%Rh;; zquNtTG&c1dC0}PwRL8e6*OtV$(poZYtw}sNTGnan+?e#0P$aHZU&2-C5PB0Tho-?+oi1I~46+(+7x7#<2jeIDTyIjUSso zj~|8+wb8{7SC)NLghPoSkvU~eLRQTAgLeHxHId79*-05iKc#1%c))NK%C+mP#i?# zp#ww)Ki8L{>H55l16>o?&BfEN<4j-yLri=<%eN3c4JF0TE|YnmSA`o#k7PsFglWJ& zyy}(n5oQjx!ZCX%4%?GwsE570<}sTM;-daZF9W|&rDLaDJy#GfNV z;nuUqoAhz5!J$+9lu^fU1*8%>))#9@elA0!j%i%I&@vqtpL9_)>2ZOi$3 z^onTG%s|r2SkjZMqoK3nlS-LOThEI_Q?w|hQ6qj)N~2X~XTVTd^ms6C=f6<7$BTYv zUJX@vV_@Be*%tfT%ITWGOvR-wUbHM!WbIxNb!kg9%W10%N=@kUsBU!7v2m}6szuFS z*}A0ju#h;j5Y2mKw0UP1u5+V)Ij*vYotYgI0sDhnvYmmtxjO1W+!-{qH+lvQPmj9n zp768!&-PFF=h@CGbkwa4&80zE*t3p55=1h!_UP_FU8fqU+4oK z*)8;o-mZY;rQj(q)LQbgtq9l7_m%ja>y>DQwjF;p&;Y;lbhOXmt%!!uAG~8wiecj* zYxA7>%KzPyRP5y77h_O@&Md)rw0E#We;F84@q?I#pVf4#d)@+TFx%^HW4Vlp$G$mV;=AoieBT|3xcki#zZ9;H z?}jfq)%C>}nZIG3Ai;2o^1OfjvorqMdBjUk&%nQVi)T%b?sFt{wcLEe z@x_a>nFjx6l&@M+xW{#QeN0>gNu&A_P9kg-NY%2r{ zZWZNNjE*n{ImRo?Q&GOgW&pLS>Ovg%lc=_@=r@_q(bmqGku$@#Xw)(Ee3eC0K!yQj zPmJhtLZMHh*jq$>0(+GwCd`y0N6LO-AbzyO@oU~C7ikWO2}=TM17d3XqH2yymnCRg z&ANS;jt$uU2A6J*=9QRmLLiyr(n8HV=22oO^mr?u)VJVXeGSTk@i_Ab{x6!pO3K<- zt3BbKKRw7SM+HZo# zQ^mfPK=rg_x>wKC4;`|&p$U{(a|otXxmwbFP#&sMi$laRZli>{%05H(Zom0NWNJ_I z*S+TFrujnB=&|tJ^3Yu79->+Oy(VyUMXv z+m^LW(W&Y?Si9V@c4=GI8lu+J2i?b2+>UnD+El;#`>9{oN*CJi3x8AY5H$CpZqF% z0!U2Q6G#?4PlQ4{qiUM7+SW2BCcGR-{y)$4rf9B-9e*j-ua!Nn0p9qrR!eZIOZ0vd zQ~O=iind>8IjA$AmO;zr*6PniSC6S~VyDmpoi%?r^L&j)RKvCMV8Dudtoa*`Jt@bu zwsr5OKOj1qukKx)*8)1h(zKQ4-9X;j9aL9ss82z8Fs|n%mFr&9>t5x-y<48p*X_=s zaccF^u^Vh1wXSDn%{?x8Y&O)xnykB2j`lp=>(EuRs;?7OuoAQqb>B_ws=LQXJkG7_ zqoq>wx{p)a)2>>Z>U+PR`W@e@u4M}D z3T?qSvzLX`oT>#ofSOUc>TAb|GuIR~r-wDUn%Dl8~@`I&Q0x9rnZ$j z)!tqmQGKne_ToBOs9td2p1si7YH@;itSPm-Xk0yQFRtAvUF?L;QOlZA<7z>D(&M@h z%2i*F2lv6_8rSim!%XG64=q!VbRRlRX<48)f_Z*hT=URf_rbDjPTs;X%x(!H9)p!-8~&d|Kn2h1TiM&}UB zE>~ZmW^v?$=)l#B2(=x`SG7svMX=E7m3k5EAliksaB5i{RQsA9h3|ufw*-TqoxuO; z7F+N&=1cE}y1VL18*A&f)p=KL+fchyK>gT zo7Zp7cqFOmOYg?Id+ILVcF%?zt^SQi-UI!#x(RjTHVocyJ@f}(JnrH_xtUqxHV@u> zJyML^dECxXJ4f%Fc~?WrZf{UUX2sx?aRa$!A2;)XnRo5>217QXX?Rmr3#I2bd585# znjGQLJbUzXIXd*N`ih2%87)mso15lBHld|HMc<6%WDYo4p)@|+EC+&tZMvmY2?^SsCA`5t9Xu+BdD>l>~Y-riGxps5UO{tq$ivzc(Y)`p2WqXgbt&O$YjM*BgZN%Sg zDGezPr!)*~=-agEmzj`E%Od8jOyp^ zT)L~3#g^Ic#w?oVr&L05T)2S$$RZ4Ud^+Ai7mv&t5^Y@B!Kl5yVQBU%omo9263{+Qk)(~~?}dp-9P zzh3(GNrcYqtFc{UnwwESJz7k2-;BQNZ*BQ7{nJtAAk(%^ul36GJ#u{u)S{I(v_Fz| z`r0(t*VU%fZ|K;RwBzlhPm|v6^=YDaxGrOBWYCqDSbw{>)MdQ2?S*Xvx20_Ry5W{u?#v+lY+Jmhc*X#@Jl3{g6&(5`=gjO*f)cJKl1o@w->(3J9Gdw-;53Y2v!bY z8`OJD2k%fOWML~0L&jO6#}MzZ=Je!g2eO{`3jTUt3oXscSP&U}R%X`IUg<}^WK%|c z%BGarDW*BAr8}%_l-_|ksc|c2FSWV#5n61(HsZ+1olruVS03`N!fc{3&UdPp@rZ%f zOrKE^Zv4Q6w;eQL)Jg4_Z5_;^tw`TD!!)=5Kr6Tyf7vj2lh=^|nv8J+keNZP#zxy6vKE<=Z0L z7HpfgEyJ0ow{E|F`yJaK+5WoQCd5-}7ee%0+e;Va_3fnX0@%mTm->?6y{Qlb;gNLwjj9{9ZB&0RX~&?XF-fNRH@#j=d^?dd+Y{c#u1&|R@7>rT z@o>@x)65#!<2Bln=bu%)!Ht)A=X*VJ2VIr4<0naXB^`;LNPlDVV65a9HIz3*8WuE6 zYsf%Z2DS97oVo!`FOOi@7DM zCAY=A!>RNfK3x8eX}&BjSHE2B@4hem zJ9yWSU1__9?i#*p*sf{2rtYF&0~`BftViFxHRH~fy(zyM$R0X++mvlRt}@N+I|nlk z;f!(h@XcQ}G$mfyl6xpCt8Qb;wqpugDtyZus6n}@!&p63i!oi>@^9~mrrHep;OCK) z(W7M$dm?M6`5Es4Z=}TN*RYJ^GiGO;mN78m9cd0f;63BTQgZ&t#5N*j@<5&GbcWfK za@D{F%vn4eJ#E{Z`LHKqe6{4;+R4vYGkoP&75=;qJHw7XzDv*!eMriv>oG7=_Z?Dg z{qyb*JX~e)tXAigaf?^{wqGaO7iQQRy27^0QyzO@KAm3& z+B3Awerx)(SzEHCCY^b7oVA*h;kjDvn{hd2o=dUCWVEVn+I>CimS=TJH&65qZ65C( zx*Yq92n)la}R6ZSn?E&+ANu^uh88FjhnZ^(~U+uF9b z{5zdjrnP^53RhY!4aR&N_6~nC+V5qxb(fFz4!@c9`i>VyA87fn$DW64%SD%>4^!_D zteR%fp|a5xEl(c(`!4yp6>u{5x3xFRWt!=I0<=*d_OBOLzjYb)r`uMv{o=XNZw~+MR|lH% z;ZX&)=dG9ib-UYt^f*i6%e4(zmIiFvi}IycUE}Ey?Qa}I&tvQ{cb-?nNX4-go6R3R z`sFUqV@_}TNUV?izfp#dJeDF~XCkSGEh*PVX9eHmhi!?qHsX&5dm!rusbI^!3Sqo2 z+OiJU;@T&=Z;&2j=b7NS#Gm)x!d+R)_UG>V(|xpSTOI8e_1NLHJ9u>KCs)6J>)Y;i zvoGh^@vjKg4);kmXRj$MWAX5lzRHcxacL(&f@+IsO5KO&1bYP9AarN*+8q8 z)Ny9BuRDH?;2H0twB)e=`Xl5F6S2v2U#4xSux zj|cU81@yB6@nHVJI2TD=`%?n(seyR-TjE;+$9Dzd>47*OjB@i2#yba&2jfcu$M*-~ zsew2jL3Z;C>hqN)_xPx9iO&xl9}tKa2I40K;(G(}(*yBff2+syWUhY?L0>~hDXB^=Pn`Ro-?% z^r&Z|!^-hUkN$s^Hm=Fa)EnJ9t>{#V9(CtRXJT|rs-`1yP>%*ju*w}($GjeOC&l)< zMcWpLtp@ye8OW_Blc0|su^{CY#0HuA z7H>SiEpb~ir&e4GG1b^q*7h09k-ClCj#%x+)!Da9X_}_p2{<}qsHR(z;A!oVO*HjpVAOb`sdZv)j@{U`QG8M- zXJ_)!Y}`^g-ONe!t(wuEu?rVMyskIq&$wOT*CeWns_~hPeM0N(=NKZ9)kVvz%PS*e z$C$J6Hb!-3(b{UW#!_Wfwb=sVhY@~HNqNok;);U8NJ&{qwfV@ER2CH!nhr^h4l^rQ zRux%Qj@MTBIfH0w9;qxUwMQa&f26RY#PG`mZ7YoR75IsP^CK0NMO9Tbl|?2E(Y3U1 zrh?X4S_;DJC)EX!b*3`PYt0tR%i%|4MM+UA zq`YiKaY5P2qC&$Lw%f|4y0W}xQ@xy@jElyqOb%kJ)=)P>(W&vE6WVuWA;;2@}-@!npMk+ zD(y?lt)!7PrRNt_mRA|Rm+Ty+ouWcb$~TYMUC`R-WmRSm;ua%S)kPKNc)YM%U9zgE zDpFlkhEMvfv9Iv1Dqmd`sVFU|E;4-ew!->C{VH_5$f{L_ueIV!fapdQ<(1XuW=0Dt ztBNAa@kUqyzVX9X7grUOl$le}_tAeNc-;urmLpc3S-yJ3^70ydAge|W78an>lopk( ztS&a2A+uTY1A`bYSI5QInV%zGRSl0;F0*e*nO{S&q@=RCrl8dCP!YDuoU-bo$`u88 z+i&2XDo)oDze9yT?_!M6}W+LRA&M3E$wGtUO7Drw~ zWO-@%@^d4FC94ttyBtLAtVDDwa$*|ubhD)gNDI1rEft7!J=w34CS{$&a%2)Z&rEbs)A}B<%hC@M{^4*ORCr5Aioe5 zJP0vg8ly&YnwxXRT%Ha3RoE8@IkVEAV?^-nxpSw$4`e1Qw{Q>1Bn}XBU*NkV>mEg*B^I zt&4A4y%0n%@ULP0%Y#*DyUKNKpQ}%5dyMkR#=UrnL~6>;Eh}GB7Kxa+j=y-(^o4oV zaXvv+JUlVer zy4KcEw1>pq)3xgTd27m}y&l(ytc2E0kcW%?a(tk(y1cL)_i4`5m0MJVPT|g$i)yMW z;5mkgEpI{D`31$L5vGn)lSY7Abc(R|c@cj2Cr&e$Umc)cIX*g2UX3gM?{*($Yuc8G zj$p*gM-BWr$}B8eUW89q6tcF>qLTBA&<8P}JGZNF4EY7_FypEz0=mRT+PD&#<>Qk?ivF(%3xU3?5e0@&eoiphW|BPT2)z zn2IZLFI-t>Yp|`U(%uBKH>|ab3hUe%*gxCo{ogm;8L>It+qjJ4@>N9{t4iP~zl@Pl zP`#>XWx=?yHDe(xD~ZgQKSOTyoo<7f(Jw9M9D6_HjGmdR(ZqgP*cogMw9zTGJyF-C zrRX1io!hG!mIWuPl+;3jovQ@2HRb8+Q`|3)6U#wKkrL=U6?1FUL^6ATPsz@&^T2`|X3s%c2i&pDV zD=MMeqHYDH=prJZsdT5;&+*SPzIO1STm(7?{h=BVtTXAsl(9aPj=o-2l%DD4A6tVO znI3v2YXgiIQHkyKEh%P9$rx2Y+!W_$ zpOaQp7Oc_<$CqGLQR>)_SJW&kgN{~wR9KBWqCpclgDu=wkY2GyGefs@?qhJU44%%gv-1NCn)SknN_`}nkZ z7hQaGj^%<~dr9~y>$ZNrJ(f@Ht&lX#gW=PR*xD)MnpXkXwYTp9zrN^SXF10D+klN} z)ZXyS*jggQQF|AHU3<-rJ=#(KZjdx;?=;xcwOkyE+Penq+S?C%P_^}kA0VRk?vgZW z?*%C7nlKJU?cFA6C}a2%_R_FtdAnm%|9%a2%R2)dVIRvh~NwCNCEC)a6ujS~51Wcp$u7^Ec3x_!B z-w{x9?d3T3j&$q|4A}cA?CF}iYp-9xUM}qM1O4>xD97Hh0egQP*LHcc1A6~~o-^E{ zzX7=A;IBJwz4U(=a|{$%4z9UtJ>xyzxOzSn_S)(% zYXbIefW6sbFYMUc6R`KAcI;gruy@e0$9|~(?GM@9A`UMlpMM#Fx`-Y5vw-pGKx8ra*S ziLh7yh6e0?342L6$nx?xCbgFxu;)$0S76()cVfU^;%|_z*kifX-kAY=*TA0srbV;r z-wy-!8Xk@H7yj0y_9_DQo`yY$qCxF#4d^}Fj^4ciz2~6UIchED-(Aq74;pqq8tZ>Z z67}yd0eio1$KE>ud(Do$Nshf#%ylf2_P@7bZ;3jAy_UBt^j!bmg+1+mCph+w4cI&W zcw_drVJ|IUuh(P7G((U5h2uoq0S-@Uz*yDKA zpye$I*h_po)*e|E8 z0DH;MpuHSy>fcWT_6EV;C~L|8qxSeiH`8dShduRg7KCc=@qoQk+OhXYz}_2tIiRE2b~%-@5^OnNP&dZ*v`cU16AMv_JnA_6E?91htn0J^G+wAMEu-g!MNM zoBEd)u=gJ96>1{v)!snpF^z`(u(ul#+GBZmjP1k!SI6~l4h9d$j|R2J|8B^&SNvqG z|K&ni?JWw}+W=#G)fo0_Z+^hu7T6nwgY<8qW3MD&Z#13`IlT>gg#ml_|JIm%=+Peg z4G!D#ZVK4j411h!HK>1e0egL)GG-r?Xpi%e+S?tl_W`k8*|Ez)9yE9-f^F?EL?L+@qKR9g5`-Ip-)DKyh*Dx1rpdLeWz}_n_;d}`h z?VX8@dh9R12dEE-nr2KEH*_ZXL65x@u=mFAaNXJ6w|6#F)!ttM_VRJFdL71=2DSH2 zz}}(veShd*J~p-YWx(El(K%07BhXX)EMV_T$KEo>UJu-#Y8r^mQglvy$ut@ilc7f+ zG$j26*W;*X`d5gJ$5?+u1NNR;gjWmI2#za;1NQoUU`#QL(B2AcYL6f1XBwVc7?v(J zrVNkrY2Yz#J+L{|YM#u;bt2Mg(0sXfx`%mpwJ|MteDGYze~69wq8SZDarPdsHRj_IIqXg(AsnoqxW4~C+p_obmYPnch#!P9aELqfu*UvrL(UGIMS^&rGg)Wfhp5@!)Kzw*hf9|hn?7Sd~5tB#PR(y+onA3 zh7d-{y%6Zw;c-mErU4trW^4WU-V$eM%) z(GW7ZQ6_|VCWo#*>B;&{Mm(?G^gL6?LMZOapZ1oTzDTQUDYTb{_;_q#Bx8IWcmOv1 zvvIC}494cyZ=#tG4m)wKXB>kK|ExZ~P-pr(@$O@ z3)=6DxCWbt#Qpq^HerePf>NsKZ_*__Z7}^*Ii78g4={NW=gg66!uJ2!0NORARIDgo zA;?^E{A>JFlB19=7q3=JvSwDDz8+Z?VVI&7%@W)RzARiSM$< zGtHk6=PbvWwFfHWi-3L)=cLR!7#fIA3dD0Ho^I`rH46jB&yYB?NyU6s9T%Tq8YJG? z9-nCL4Wxf1?)W5gIB>i-Cjx{e*itc{4U+hN8=qokNt`+?&w@al|6ij99xn*Q%OswP zW2u<`)=Hdpm};`3zbW|nWt+32$;*9ED#^SoB#qilSZxdU9OperD(25CBn}l@2UiB- z*GT*!98bla#0`PtcLd`86A{t>5hW5?v~cE0c=isE8=0*z&%%ruxpt3dJ?x`#)Zz;i z5^4S8z9W%e^c_hXztr1@wbI9DPMYjL*#?}P=|4iN4@U9m_|}hcKoWSu%*`*!zIBoOCsSIL%NP5PL-6l9G(zkJ zDCeOV|Dgu|Nd`W?5Q(fPEib6%GdWc&5G$>&S~1pnm^BhvX(iFe73>2J(U^UzA^5ar z^l03p4RO-o^9*etl!q9cCl~z375rxu^uYvw&j%!($CL5IDBc>uOIpPx=os-YMSat= zTh34T^7xy5`ppsZp~IjIPu1Aht@w0}a{TiRJi@-+`T<#;EoVx4_Tn)Qn)9wx4g@KG%P+P(u%wg|j;?I5?19l@Tg zBP5e?!haYS4O~Yc55c~-@PoKG97M+2Lnih^$zAaWf!Af!?~b%sdbiBqdU*Xs`Bunz ze_?fChv!}LIOLr#JRB#}Rl;18;_egfGGVLE#qcn}y$o{U?Rbz=bWZMVQxv$m=EHESx9*AY2GJmV>O$ zmpBi9?C?K?H^OE|_(wbZZ@_yAU)0IJf1#Y$dYK}hhVo7mZialWFz;P>zeW8d*x|i0 zISfCS3D%Z9KMUir1oNrzldu^=d6@6JXuDp*d9caf z7bs_5BZZ$weNPvj4Le-pr%op7>NMfIQ6{d{Q+_w{Ef>BY{3GE%vyTb$eaP*?U%<{y z!t}vj%frs!kk_w8&av}?Fn=q4Q}}k&6|d!)FVos}V(&7be0MK9s5fG&|8@L zgGGnFjV8l4+8ir#`ZhzDzAYxh4)32%6Apum94-+a40(-kI(VHh&ncXn=vxWetC5@v zA;ML{tHFCjCyYLG2N}NQLVmBv%aQhBvYg`{73TTm1<_&J*U3n`9CFTUUM~Q`LE(|$ ze~S+DO+Xt{|2lAAGW5~)On+f?J2Twjad0{b>dFslwUdA;RoG!-ccJlN|XJM}8I=HrcQFdz^O+lo5)B+1BfX*#tip z9s%C!$QvE`J~C|n48A`^X6Hv}7N*S?g=zCu;Su1!IP$+b@?^|4w0Q|^_9YL5GD3f0 z+8HJ~d?$P?ISe7fL}6ZYWr@z8V0#{UkX13c!c!4FU33iQh85(&zRo$qVMMD%=X11a zEqREqvr(8jSBTDf^nqPuPEZKf32y=aTy$PWALBW|gFUX_|61h#LAyLfM&DZt`P(9& z3I9J5`OT1jD)M>I|1TMKclJ{7~fVq8|&72Y*IJy;XAjVVqO{*U;}mMx9V6 zMK~KACc~Kq@GwVbq@%-YdfIspc4jy_CkanP+Jz1;5$3NbynbT7S>PgJ=37CA%`ai| z0+G*xyjD0Dyj66L#<;lJkzXsE2c12_OTo7aUkbjRjCx2$h2BR-USnaWS#(xF=W*dO z@GGK!4eITWKf6L=#zlNz`l7Df?FljyKtT~CI6K2vpz$kQReojk@SHFpW`NAzLQ`4=*Kij1_S zNc)_~pGN=ty~uY!{(;DEM4cQWkMnIF7Um@c?^9W~*I>@*LWa%1B5kV3`=Z_Zk=fx9 z1_-lV#*6+D$aj|LSHidXWcg`uq40j_M?_~Y+VLDR@*0G+Dchc?%dVUyS67mA!VFA;eyQf^T!TFz3TtMCU1# zM!@GvGJM#Myw-?(2Y7?a>uXB$uf46BCo!w~b=g6o7{^tFX$bW|=N4reqyiVUiM!lhU zW~VU6?_M%|$3L^r(YfEzdBV|o*3o&v(Rq!0D*8C`I_T(pB+T>3XAb{IxEJIdage_8 zR;9Bred|p=72_H<2Z)?g^~^{5z4Y(_!h|jAbdCYec|^|u73#6 zLAkyrOW#XGN1**Ppx>PgIs0mFk@Gk8K_YK}e3-~zLjNBt^4*XhFY+tU2XcgaL%vX$ z{zu695F!+coMkzW%t;Jkwa8hn4dg;!UN3T%v55@77q}4 zdlg+1dqQ{^B2B! zCJNL4slt80vxGT6lIe zuB|=j@T0=?{~2L+kC%jTx;C#1vs~{8vn(G9bAJ1~FouKqLbw{70AtK|H8`1!@xySG z!-ItB!?D8HnK8ojVX`oNm@dq|F-MqfbgFP3*se<>uS#%%$m!3yWdNt$_nI@5w`TPm((6^f%zFQbW$~-8{uKuVns=_=Y+z-s_b=nyWeqEUT`CW%U z5@vrs?68MfL?C^A9rkx{;< z{2Spc@YBNC;1`8wf&U;p8~nELT<{0N#bCRB4j;|||6AmxU=IbN|69OE2yX}5wRFg@ z10N;w8^MEw_kfQTz6Cr+_!r>G!q0=J3x5QjBm6P=RN+J5(}cTWPF^m|-xALi?gOq8 z=C#?6gn1pfL73NycD)@w^Lo;*w}Z36*N9FI_$J|5;GYW@g6|P71^-Hz&&)q2yc+zh zFrTk{S-2MbN8yd&KMU^x|5cd3CH_PBHt>Ih_klyW&S3rD3+^iXFu1pHGx!+c$H7B| z-vN&n=JSmcg!xTo|{+8HcNJEO>90K#O4rwh|2uRFak>J@ydFy}o! zqu>n!An>4yzT`9j!cbwh z-DqL9-2`FQ`H8}`KU0|YPZ4HcT`bK0d6w{auwDO0UaYrOBA*4W5uOYFvG79h#lrdE z%Y_TUO~RGnYlSZW|5W%w@EyYI!S@Mo0sn@~&W7-;a02*Mhu;+D9P*ySe-mc?{L|qC z-0#sQ=Za*9dkM2$`a68AFxz5`FkPA~JPJHrnDutD!;6F`LVkwB%Z1su&vkgMa2Dk2 z9llgJ8}jWAUoXsd`I&Go_%7i*@WaAO!A}aaU7i*<)f{N+2HVH!qlzD_~8Pvvk-{EJ4ssFMt z_1`3CQX6a0!h^w|2oD2)COiuKwJ`fnC$3Q=?GkVg@)!WZ(ZapJLxfpZ#|g6t{>X9#D3PZnlhS|pqUK0|mGc)9Rw@VUbCz*WNRV?PpRAKM^&EBG?u+rW*&cZ07H zz8`#(@P6>^qEliycgsJnXFzf2y!khznU(2){ z%SQ;00NXWx`Hdq?IhgVh!ptsHm}7R5FzYHycrJLha2_~U_)PFp;j_W{!o}cX;WBWA za5Z?X@LF)Ka6PzQcqiDd`NPi}!FJ6bd<*yn(P7>0C3EsYxX^eV~^XmH|4}cBV?i6NQ-!D7`+$_wpKP8+GJ|J8MeoeRn z+#*~FJ}7)X_>l0G;ID)^jyiL#8-DHu_ad{x5e5mfevTDp-xwpzHnqPUKz}fJy2xjN z=LqM4PZd5LY=1kL0YE6GT-g3z0A~HK6*>Eu{k;Hk=2b6pj*AB2OtAgE06JsAH&V`u zLbyX1MKupO{J1dNbic!|2s7U|9R5I_9?<=gBJ@g1D_?l0$e0~4tSL?`$>&(HTcKEYrz)_ zUjV*bxE9@Ii0~ z3>4NmpV96rJS+iyUYKhp#|USEhYE9@WVA59wKPGv5PYIApUa*pTnRo!cn5f~@GkIK z!nc8og!h403G=zf8sS6W9}9mDzF4?h2z_3-FStpV>;2aXbG`p&VXpVzE}RYir7(Z* z`?c^q@DsvZ`+rXOOz^A1{2ky;VXpnZC%hW`H(~yE{2BQabV!86-adB&Ckta3m|ntt z!2N{>gVTi5!DAerEX?_Hy2JB@$3uRGFz54P;o0B{;d$V-!nxq}!VAHd3Uj{NF3kCV zmoVq98-)wOdxeX^cMEgwdQf;1_)+0{@H4`Dz%L2&{Pnue-P+rs;t}7*Hk)yzn zoGf`g17=>--7owR_Drv7Un7g3?~*0$hhV0q?jg#h4!+GtZOBR1P*Q@?AF!ias0$XA}GDSEC zOy4-qmkHNm&vO9vxekAUBfn7O>=)EipEr`FPOcz}54*?(HY>w(1M}L0{f*dYpX=VY z2-C)1VV*m$w}4`dsrLjE#BG$5F!kJ%ZmZ(0mi& zleR@ia4Pf}lCdQgS~T4qcJ(_`p6}O*)d9n_UCUNG9K&kAKaYw1G)F!{xD)mx9i0=v z2}s0wdkVG?cq;ba*N4HhgEe;M&wNARVgI{!1~_)Ww8Jv9jQGhd%Jk9BjgaGXXXjt) zP*?S-!?`hGkYC?C&ryf^)-L2>a5^^1(R6;=LI48WD*=ULx!ktshIj~aPMbC_SAR&n zK95^{$f-}8sRQu`fqft~O!ECqg+B~z(}XnNM^u4HL_yAibI8&%$2|_45dP42+rH4D ze3YX<7EC*A(}^PIcTd>vw0Sz%wmWoYL6+snbA+is8%#SFU_VdfXG5Or$j=0)mf;Tq zcgp93>F0&m*J5M7Oq(Rky0K#ca@^9}_M#4Dw!Oeuma=V-fP%8GvQGG39LpWX)=8N4 zlX@QhAh4f@M4xri5q9v;)>kLtOvF>^0D{)ZE->qhK3s!+4mRd{DfY7|M_$KbzXTiY zQ_iweXBqZ|BHx64F*e%Sj(w?cBlfHx^}hnF{#S!jEAa<`b*=fb?&yC5_O;mPKY2Yi zu4^#VW262G?CF!*-vUU? z^`DUGx0lvGeNM-w{^M}8{`*mXOsvlzfqFg(vM{#J!fD_Tbm%W_QlB>1C&<~@PZDN- zo+3OO`z&lsOU`k)7_9TWt^bQ4K&Zv0a@Jug1qeH_rPf)r-}^~rBOr9dmN3qLzAK4w zR2a+K8Jm_j8La&+6&!-&oD+Icjan4Fcurr!X^K@7tFEFP3xTFUCWgPR-5ck zTCM~#8x4W&o7&T&--HHa6Oyf&E-;v`@~(Mjw`7pNEZkEycb&83tG%*1v541dhQ3$eA_Ui*wWx z2`6~gqP7_51%CX4-zjy}hU`phw+yu;Di4W^&Fu)hvl2z&$ftRHQQzGUL$>2f>}cPhFWNVF z9uH$n$novbehADp3fk9mG3!dt#mr03Wtm{6WwkIH<%wY0;hG7L(KnWrbxYsKQ?Tin zWp%Jze5QRinB!|acrKXZi_H3`4%g-K9Q~!j)HxGOAF8p>ceqe^E%wC@mkM8ieT8r> z_LbP^KjrM72VZv@k~3GksFOdob)zs2DO;oaC@Da<~*3mff|_lW#f>~9e{ z*ZTH?X@3a#7s7+VcMA^!-zyvjKPb#+{vQ_Z58e-EUcARV;OM*prq2hle;u3F{~KVf z|92dnj~$&uj?U+zlL-4?3Ri>K@##PPNx()QDDTL)aCflgn+n!^dr=Q*)3EP@js1|^ z4_oThu#Lbz!L*dK{7g$8hK>2M?4umc1T)_p?74=k_SuKj{zPyp8wX(uSnEGanDw8H zjb*98el9lJ0fQ@<8Vt*kv`uRM{!Z>*o_Vw7PvjzK0Mb0(bD@48>`v#G7y>y4jxz2p0 z$hlt1ILA0|`FDXi#>uz^q<=Sbl!}o((F4pHm!tCeG*iv`E2*Q4{%;7JQ#m;MB zrVV5NhA`{rU2Hm6b3H-lpAW%0|9nK9@xJ}PgVoNzglXqX>WB}Cs29CgN(QUX-G%8h z*BVrxYYxgIz^vyS?79BHvx+O zJYl)W`Cu(qFVK^;{ohC(DQ^Q=>ikNw*x4=mtn(X$Sy#7GXA&GhxDBjz z{tK|y`JL2}I=>f8A83c)$yte)5VieSY21f8XJc!K`!E72gp^ z#kB#$7hvYa@Lyq=vHns{=JlHDB!gM!?B~6(shxhJ0~2O|Fm`5`!y_G?QDC)`DRSmD zUKnWjElK8!otYv``^-Ca1~t%6z_i12^ek-D=XrB3nB~pGp1)79{)a$+KK87CaxV5- z|4YD{_H;1Q=3{?0Hrg-6z7U(v$t%D*CzpXWZ6#RyMmOYI2qmiN0XH zmgpz)?%4MiIe7rK)L!_5Fc=%tHejEIjcLieCZU|?(-9&k^ZG~AW|El+LKe0J{LVu6 zvayB0IoQv}mdb&HFdrM`3$f>xO2Y_Cu%%KN;dE@NM_aV_X{keeE~K2!B2;5z{V=S> zMrK>rI=oRBJA02$odhti4alfgdrhExqsXblYXj|vw}Dx%T$ib#^)}hyvQvcda>_SN0xl=CrjHs?#Q1avjZZ$ zf=%^bBTL_S*O4D2vy&nm#-{q8lLu0YHbjG~Jc%5J5P{b-D(_1k`3SP~C0>)L z{v@*Ww;V@4o1Es`$#djO$s>Gup(8IQ%h;@TJeEp4%yq-MTm+x@oJIU$3e2*i) zm7L+r_c`+W$(g?VaYz0X8EZZauQ>A8$a3C!*O4D2kN5QtJMz!TvbMnUwbok_d7`i1 z%aQjbV_k(I&5@5FPx9sC9r+}(oD+F2SNpTcoLCU@9QjhR+}jp9@?!E-U%%RsuO-WQ zYNI2sCujTmI~@5=vW)RPj{H_~j<3JZk>5|oJfK0xej)^99JcqT%DqI+s$)0OIe}e- zOnp|9@)Y5**mKC~T#+YyCict8GFPk==A62k%nT9E$3~|8O%7iw%sKu#VeI^G211`x z$}dDtzFV03kCHK0bVna~QkeG>&k3`iz9@Vz*p7YZv(LUE@@DXR!hPY~2f~?PJNBW^ zI`~rL+1Mu{4f7=@2{YdmhkFX&jXm#cs84@*9Z#k|Lxo2mFZ+MXLC$*Le<^$c;4{3aKy&abum8!#;Drt^5oW&m4%@i}`pmaN+0tY-yxg@`MnN5D4YZNZybI?csAtw9X=rZAmqPy_>aQ-A?LSs^ql*NFq*^s z%VGOoFe-uLo%aWNF1G)d)_A{+gD97C@lfHjp?|!?KM>vt`6&+D_kWT0M#z_ooV-%_ zUT~c-(0|Vt`n11AAafk?n>#A!|3O4%zv}7mk;1%m)mGztcochupr;D}1}i z(e#Gj&{6$n;m(l%*5PM`^C9QAb*Mid{3qcv!0$W!q3|-u?Yq6uC);mhf(ya?77y)Y zgOh~wz$wB@z&(YRg83~T>JJ7F6FvjX@9gNc*;HYkFJ?My-|e01_ZfbRhx*u=Gaa2m zhxwgc>I{I+`3_$wJP7gzVa_2tghzq-ogJnn?-f1)%yd3{}`C;Mpkn@|ol#`zk=I8wdXckEE)iy4mkZNA zzX3%1{h@P%FmH8#N>23WQhw7%b?ke@(5DW+-9tIc^^9;<0_J>&eu|ymeqJ9z-r3=9!u+Fd6^*>vf*Pe47 zo-fSn&C`Whma~QF=Q$3S3G=#awJ?1+Uzqt`D%^}Zyh50L?@EVv3A2y=#NnHT*~j>8 zBl3ndDxS%31+0LJ+dB=~~}xGL0e7Z{B+{aGuq5ynOP}_=CWD*Y&yz zvaHdqB@e(Kgj#I67RR>n!uW&GfKAujc9I8Ein#)tH-v=WGO+Rfi{Vae-Uy54ezL5a zHIsQ#MtBOFu8$ocb8~c7<_!hH=h*aG+Ms{y^|M_!;K>?+ z>lb=G*_S-YmxsxdeI7yPMFN6dAHa1E!z9Y5`kY0^d60qQP0xL~>#s^MprYzmzQf^GsoOk9_ix_=8Z0jocmkVloSd zP>PMrI;bE^A7*}J&arFB{qP6j0&Ha3sU=I_-Y87>>dCAyge};}+1NLbrO)pWrvE$1 z(*Ji0Q+@+^ApRii!A52=ZzYHE2jMnsUf5s1x|2Kze-QRzBeUDwPiBQ6JcNxL#=e;> zW9M<?h(SxhTqpJR_aA96dcWgg%d0pj|okO^`Nai?QOU|J-`oA#WfvP3T+_F)a{p)`LWNb(5 diff --git a/firmware/USBtoSerial.sym b/firmware/USBtoSerial.sym index 55ee5ca..853f2c0 100644 --- a/firmware/USBtoSerial.sym +++ b/firmware/USBtoSerial.sym @@ -258,111 +258,119 @@ 00000568 T touchpad_set_rel_mode_100dpi 00000590 T delta_y 000005b0 T delta_x -000005d0 T Usb2SerialTask -00000666 T SetupHardware -00000690 T EVENT_USB_Device_Connect -00000692 T EVENT_USB_Device_Disconnect -00000694 T EVENT_USB_Device_ConfigurationChanged -0000069c T EVENT_USB_Device_ControlRequest -000006a4 T __vector_23 -000006f8 T EVENT_CDC_Device_LineEncodingChanged -000007c4 T uart_putc -000007d4 T uart_puts -000007fa T my_uitoa -000008c6 T sign -000008de T uart_print_number_wlzeros -00000906 T uart_print_signed_number -0000094c T init_motors -00000966 T motor_step -000009ca T move_plate -00000a6c T print_steps_in_mm -00000ac0 T pos_report -00000ae6 T parse_command -00000e44 T main -00000ee6 T CALLBACK_USB_GetDescriptor -00000f40 T Endpoint_Write_Control_Stream_LE -00000ff4 T Endpoint_Write_Control_PStream_LE -000010aa T Endpoint_ConfigureEndpoint_Prv -00001118 T Endpoint_ConfigureEndpointTable -000011a0 T Endpoint_ClearStatusStage -000011de T Endpoint_WaitUntilReady -00001244 T USB_ResetInterface -000012b4 T USB_Init -000012c6 T USB_INT_DisableAllInterrupts -000012cc T USB_INT_ClearAllInterrupts -000012d2 T __vector_11 -0000141a T __vector_12 -00001490 T USB_Device_ProcessControlRequest -00001754 W EVENT_USB_Device_Reset -00001754 W EVENT_USB_Device_StartOfFrame -00001754 W EVENT_USB_Device_Suspend -00001754 W EVENT_USB_Device_WakeUp -00001754 T USB_Event_Stub -00001756 T USB_USBTask -0000178c T CDC_Device_ProcessControlRequest -000018e6 T CDC_Device_ConfigureEndpoints -0000192e T CDC_Device_SendByte -00001988 T CDC_Device_Flush -000019e2 T CDC_Device_USBTask -00001a10 T CDC_Device_ReceiveByte -00001a6a T CDC_Device_Event_Stub -00001a6a W EVENT_CDC_Device_BreakSent -00001a6a W EVENT_CDC_Device_ControLineStateChanged -00001a6c T __subsf3 -00001a6e T __addsf3 -00001a90 T __addsf3x -00001b36 T __cmpsf2 -00001b36 T __eqsf2 -00001b36 T __lesf2 -00001b36 T __ltsf2 -00001b36 T __nesf2 -00001b3e T __divsf3 -00001b58 T __divsf3x -00001b5c T __divsf3_pse -00001c0e T __fixunssfsi -00001c66 T __floatunsisf -00001c6a T __floatsisf -00001ce0 T __fp_cmp -00001d28 T __fp_inf -00001d34 T __fp_nan -00001d3a T __fp_pscA -00001d48 T __fp_pscB -00001d56 T __fp_round -00001d78 T __fp_split3 -00001d88 T __fp_splitA -00001dbc T __fp_zero -00001dbe T __fp_szero -00001dca T __gesf2 -00001dca T __gtsf2 -00001dd2 T __mulhi3 -00001dd6 t __mulhi3_loop -00001dde t __mulhi3_skip1 -00001df0 t __mulhi3_exit -00001df6 T __udivmodhi4 -00001dfe t __udivmodhi4_loop -00001e0c t __udivmodhi4_ep -00001e1e T __divmodhi4 -00001e1e T _div -00001e32 t __divmodhi4_neg2 -00001e38 t __divmodhi4_exit -00001e3a t __divmodhi4_neg1 -00001e44 T __udivmodsi4 -00001e50 t __udivmodsi4_loop -00001e6a t __udivmodsi4_ep -00001e88 T atoi -00001ec2 T strncpy -00001ee0 T __mulhi_const_10 -00001ef4 T _exit -00001ef4 W exit -00001ef6 t __stop_program -00001ef8 A __data_load_start -00001ef8 T _etext -00001f46 A __data_load_end +000005d0 T init_leds +000005d8 T set_led0 +000005ec T set_led1 +000005f8 T set_led2 +00000612 T init_sw +00000620 T sw0_state +00000634 T sw1_state +00000648 T sw2_state +0000065c T Usb2SerialTask +000006f2 T SetupHardware +0000071c T EVENT_USB_Device_Connect +0000071e T EVENT_USB_Device_Disconnect +00000720 T EVENT_USB_Device_ConfigurationChanged +00000728 T EVENT_USB_Device_ControlRequest +00000730 T __vector_23 +00000784 T EVENT_CDC_Device_LineEncodingChanged +00000850 T uart_putc +00000860 T uart_puts +00000886 T my_uitoa +00000952 T sign +0000096a T uart_print_number_wlzeros +00000992 T uart_print_signed_number +000009d8 T init_motors +000009f2 T motor_step +00000a56 T move_plate +00000af8 T print_steps_in_mm +00000b4c T pos_report +00000b72 T parse_command +00000ed0 T main +00000f82 T CALLBACK_USB_GetDescriptor +00000fdc T Endpoint_Write_Control_Stream_LE +00001090 T Endpoint_Write_Control_PStream_LE +00001146 T Endpoint_ConfigureEndpoint_Prv +000011b4 T Endpoint_ConfigureEndpointTable +0000123c T Endpoint_ClearStatusStage +0000127a T Endpoint_WaitUntilReady +000012e0 T USB_ResetInterface +00001350 T USB_Init +00001362 T USB_INT_DisableAllInterrupts +00001368 T USB_INT_ClearAllInterrupts +0000136e T __vector_11 +000014b6 T __vector_12 +0000152c T USB_Device_ProcessControlRequest +000017f0 W EVENT_USB_Device_Reset +000017f0 W EVENT_USB_Device_StartOfFrame +000017f0 W EVENT_USB_Device_Suspend +000017f0 W EVENT_USB_Device_WakeUp +000017f0 T USB_Event_Stub +000017f2 T USB_USBTask +00001828 T CDC_Device_ProcessControlRequest +00001982 T CDC_Device_ConfigureEndpoints +000019ca T CDC_Device_SendByte +00001a24 T CDC_Device_Flush +00001a7e T CDC_Device_USBTask +00001aac T CDC_Device_ReceiveByte +00001b06 T CDC_Device_Event_Stub +00001b06 W EVENT_CDC_Device_BreakSent +00001b06 W EVENT_CDC_Device_ControLineStateChanged +00001b08 T __subsf3 +00001b0a T __addsf3 +00001b2c T __addsf3x +00001bd2 T __cmpsf2 +00001bd2 T __eqsf2 +00001bd2 T __lesf2 +00001bd2 T __ltsf2 +00001bd2 T __nesf2 +00001bda T __divsf3 +00001bf4 T __divsf3x +00001bf8 T __divsf3_pse +00001caa T __fixunssfsi +00001d02 T __floatunsisf +00001d06 T __floatsisf +00001d7c T __fp_cmp +00001dc4 T __fp_inf +00001dd0 T __fp_nan +00001dd6 T __fp_pscA +00001de4 T __fp_pscB +00001df2 T __fp_round +00001e14 T __fp_split3 +00001e24 T __fp_splitA +00001e58 T __fp_zero +00001e5a T __fp_szero +00001e66 T __gesf2 +00001e66 T __gtsf2 +00001e6e T __mulhi3 +00001e72 t __mulhi3_loop +00001e7a t __mulhi3_skip1 +00001e8c t __mulhi3_exit +00001e92 T __udivmodhi4 +00001e9a t __udivmodhi4_loop +00001ea8 t __udivmodhi4_ep +00001eba T __divmodhi4 +00001eba T _div +00001ece t __divmodhi4_neg2 +00001ed4 t __divmodhi4_exit +00001ed6 t __divmodhi4_neg1 +00001ee0 T __udivmodsi4 +00001eec t __udivmodsi4_loop +00001f06 t __udivmodsi4_ep +00001f24 T atoi +00001f5e T strncpy +00001f7c T __mulhi_const_10 +00001f90 T _exit +00001f90 W exit +00001f92 t __stop_program +00001f94 A __data_load_start +00001f94 T _etext +00001fe2 A __data_load_end 00800100 D __data_start 00800128 D VirtualSerial_CDC_Interface 00800143 D phase_pattern -00800147 d CSWTCH.35 -00800149 d CSWTCH.38 +00800147 d CSWTCH.36 +00800149 d CSWTCH.39 0080014e B __bss_start 0080014e D __data_end 0080014e D _edata @@ -372,17 +380,17 @@ 0080015e b USBtoUSART_Buffer_Data 008001de b USARTtoUSB_Buffer 008001ea b USARTtoUSB_Buffer_Data -0080026a b nums_found.4233 -0080026b b num_start.4232 -0080026c b curCmdLen.4231 -0080026d b cmdPos.4230 -0080026e b postdot.4229 -00800270 b predot.4228 -00800272 b numbuffer.4227 -00800282 b cmdbuffer.4226 -008002a2 b todo_y.4212 -008002a4 b todo_x.4211 -008002a6 b phase_memory.4193 +0080026a b nums_found.4257 +0080026b b num_start.4256 +0080026c b curCmdLen.4255 +0080026d b cmdPos.4254 +0080026e b postdot.4253 +00800270 b predot.4252 +00800272 b numbuffer.4251 +00800282 b cmdbuffer.4250 +008002a2 b todo_y.4236 +008002a4 b todo_x.4235 +008002a6 b phase_memory.4217 008002a8 b y_mem.4090 008002aa b x_mem.4089 008002ac b last_pressure.4084 diff --git a/firmware/pins.h b/firmware/pins.h index a1c5389..49c1856 100644 --- a/firmware/pins.h +++ b/firmware/pins.h @@ -40,6 +40,47 @@ #define PORTY3 PORTC #define PINY3 PINC + + + +#define SW0 4 +#define DDRSW0 DDRD +#define PORTSW0 PORTD +#define PINSW0 PIND + +#define SW1 5 +#define DDRSW1 DDRC +#define PORTSW1 PORTC +#define PINSW1 PINC + +#define SW2 4 +#define DDRSW2 DDRC +#define PORTSW2 PORTC +#define PINSW2 PINC + + + + +#define LED0 1 +#define DDRLED0 DDRB +#define PORTLED0 PORTB +#define PINLED0 PINB + +#define LED1 0 +#define DDRLED1 DDRB +#define PORTLED1 PORTB +#define PINLED1 PINB + +#define LED2 6 +#define DDRLED2 DDRD +#define PORTLED2 PORTD +#define PINLED2 PIND + + + + + + #define X 0 #define Y 1 diff --git a/firmware/pins.h~ b/firmware/pins.h~ index 5f199ad..a1c5389 100644 --- a/firmware/pins.h~ +++ b/firmware/pins.h~ @@ -35,51 +35,10 @@ #define PORTY2 PORTC #define PINY2 PINC -#define Y3 4 -#define DDRY3 DDRD -#define PORTY3 PORTD -#define PINY3 PIND - - - - -#define SW0 4 -#define DDRSW0 DDRD -#define PORTSW0 PORTD -#define PINSW0 PIND - -#define SW1 5 -#define DDRSW1 DDRC -#define PORTSW1 PORTC -#define PINSW1 PINC - -#define SW2 4 -#define DDRSW2 DDRC -#define PORTSW2 PORTC -#define PINSW2 PINC - - - - -#define LED0 1 -#define DDRLED0 DDRB -#define PORTLED0 PORTB -#define PINLED0 PINB - -#define LED1 0 -#define DDRLED1 DDRB -#define PORTLED1 PORTB -#define PINLED1 PINB - -#define LED2 6 -#define DDRLED2 DDRD -#define PORTLED2 PORTD -#define PINLED2 PIND - - - - - +#define Y3 6 +#define DDRY3 DDRC +#define PORTY3 PORTC +#define PINY3 PINC #define X 0 #define Y 1 -- 2.43.0