From 73853444b450df25b560bd0ef6c39d9f60e265c9 Mon Sep 17 00:00:00 2001 From: Michael Wiebusch Date: Mon, 21 Oct 2013 13:03:51 +0200 Subject: [PATCH] a lot of things work, but the system does not like small steps --- firmware/USBtoSerial.c | 59 +- firmware/USBtoSerial.c~ | 59 +- firmware/USBtoSerial.elf | Bin 157357 -> 158087 bytes firmware/USBtoSerial.hex | 844 +++--- firmware/USBtoSerial.lss | 5537 +++++++++++++++++++------------------- firmware/USBtoSerial.map | 729 ++--- firmware/USBtoSerial.o | Bin 58600 -> 60636 bytes firmware/USBtoSerial.sym | 253 +- 8 files changed, 3822 insertions(+), 3659 deletions(-) diff --git a/firmware/USBtoSerial.c b/firmware/USBtoSerial.c index e5b7451..9ed439f 100644 --- a/firmware/USBtoSerial.c +++ b/firmware/USBtoSerial.c @@ -270,13 +270,13 @@ void uart_puts(const char *s ) // convert an unsigned integer to string -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { +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)) { - string[i] = ' '; + string[i] = leading_char; } else { string[i] = (zahl % 10) + '0'; } // Modulo rechnen, dann den ASCII-Code von '0' addieren @@ -291,12 +291,18 @@ int8_t sign(int16_t x) { void uart_print_number(uint32_t zahl, uint8_t no_digits) { - my_uitoa(abs(zahl),stringbuffer,no_digits); + my_uitoa(abs(zahl),stringbuffer,no_digits,' '); + uart_puts(stringbuffer); +} + + +void uart_print_number_wlzeros(uint32_t zahl, uint8_t no_digits) { + my_uitoa(abs(zahl),stringbuffer,no_digits,'0'); uart_puts(stringbuffer); - } + void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { - my_uitoa(abs(zahl),stringbuffer,no_digits); + my_uitoa(abs(zahl),stringbuffer,no_digits,' '); if (sign(zahl) < 0) { uart_putc('-'); } else { @@ -423,13 +429,26 @@ uint8_t move_plate(int16_t dx, int16_t dy){ } +void print_steps_in_mm(int16_t steps) { + int16_t predot,postdot; + + predot = steps/24; + postdot = ((abs(steps)%24)*417)/10; + uart_print_signed_number(predot,3); + uart_putc('.'); + uart_print_number_wlzeros(postdot,3); + +} + void pos_report(void){ uart_puts("x_pos: "); - uart_print_signed_number(plate_pos_x,6); +// uart_print_signed_number(plate_pos_x,6); + print_steps_in_mm(plate_pos_x); // my_uitoa(plate_pos_x, stringbuffer, 6); // uart_puts(stringbuffer); uart_puts(" y_pos: "); - uart_print_signed_number(plate_pos_y,6); +// uart_print_signed_number(plate_pos_y,6); + print_steps_in_mm(plate_pos_y); uart_puts("\r"); } @@ -441,7 +460,7 @@ void pos_report(void){ void parse_command(void){ - static char cmdbuffer[16]; + 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; @@ -528,15 +547,16 @@ void parse_command(void){ case GOTO: uart_puts("GOTO "); uart_putc(88+axis);// x or y + uart_putc(' '); uart_print_signed_number(predot*num_sign,3); uart_putc('.'); - uart_print_number(postdot,3); + uart_print_number_wlzeros(postdot,3); uart_puts("\r\n"); dest = num_sign *( predot*24 +(postdot*10)/416); if (axis == X) { - steps = dest - plate_pos_x; + steps = dest - plate_pos_x; // experimental correction! move_plate(steps,0); plate_pos_x += steps; } else if (axis == Y) { @@ -550,9 +570,10 @@ void parse_command(void){ case MOVEREL: uart_puts("MOVE "); uart_putc(88+axis);// x or y + uart_putc(' '); uart_print_signed_number(predot*num_sign,3); uart_putc('.'); - uart_print_number(postdot,3); + uart_print_number_wlzeros(postdot,3); uart_puts("\r\n"); steps = num_sign *( predot*24 +(postdot*10)/416); @@ -582,8 +603,18 @@ void parse_command(void){ } else { // queue command - cmdbuffer[cmdPos++] = byte; + if( cmdPos == 0 ){ + uart_puts("\r\n$ "); + } + + if( byte == 8 ){ // backspace + cmdPos--; + } else { + cmdbuffer[cmdPos++] = byte; + } uart_putc(byte); + + } } } @@ -616,7 +647,7 @@ int main(void) - uart_puts("you selected the relative position demo modus:\n\r"); +// uart_puts("you selected the relative position demo modus:\n\r"); touchpad_set_rel_mode_100dpi();// use touchpad in relative mode // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution int16_t x, y = 0; @@ -651,7 +682,7 @@ int main(void) pos_report(); } - _delay_ms(10); + _delay_ms(20); } // end of relative mode demo block diff --git a/firmware/USBtoSerial.c~ b/firmware/USBtoSerial.c~ index cd90034..077e024 100644 --- a/firmware/USBtoSerial.c~ +++ b/firmware/USBtoSerial.c~ @@ -270,13 +270,13 @@ void uart_puts(const char *s ) // convert an unsigned integer to string -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { +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)) { - string[i] = ' '; + string[i] = leading_char; } else { string[i] = (zahl % 10) + '0'; } // Modulo rechnen, dann den ASCII-Code von '0' addieren @@ -291,12 +291,18 @@ int8_t sign(int16_t x) { void uart_print_number(uint32_t zahl, uint8_t no_digits) { - my_uitoa(abs(zahl),stringbuffer,no_digits); + my_uitoa(abs(zahl),stringbuffer,no_digits,' '); + uart_puts(stringbuffer); +} + + +void uart_print_number_wlzeros(uint32_t zahl, uint8_t no_digits) { + my_uitoa(abs(zahl),stringbuffer,no_digits,'0'); uart_puts(stringbuffer); - } + void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { - my_uitoa(abs(zahl),stringbuffer,no_digits); + my_uitoa(abs(zahl),stringbuffer,no_digits,' '); if (sign(zahl) < 0) { uart_putc('-'); } else { @@ -423,13 +429,26 @@ uint8_t move_plate(int16_t dx, int16_t dy){ } +void print_steps_in_mm(int16_t steps) { + int16_t predot,postdot; + + predot = steps/24; + postdot = ((abs(steps)%24)*417)/10; + uart_print_signed_number(predot,3); + uart_putc('.'); + uart_print_number_wlzeros(postdot,3); + +} + void pos_report(void){ uart_puts("x_pos: "); - uart_print_signed_number(plate_pos_x,6); +// uart_print_signed_number(plate_pos_x,6); + print_steps_in_mm(plate_pos_x); // my_uitoa(plate_pos_x, stringbuffer, 6); // uart_puts(stringbuffer); uart_puts(" y_pos: "); - uart_print_signed_number(plate_pos_y,6); +// uart_print_signed_number(plate_pos_y,6); + print_steps_in_mm(plate_pos_y); uart_puts("\r"); } @@ -441,7 +460,7 @@ void pos_report(void){ void parse_command(void){ - static char cmdbuffer[16]; + 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; @@ -528,15 +547,16 @@ void parse_command(void){ case GOTO: uart_puts("GOTO "); uart_putc(88+axis);// x or y + uart_putc(' '); uart_print_signed_number(predot*num_sign,3); uart_putc('.'); - uart_print_number(postdot,3); + uart_print_number_wlzeros(postdot,3); uart_puts("\r\n"); dest = num_sign *( predot*24 +(postdot*10)/416); if (axis == X) { - steps = dest - plate_pos_x; + steps = dest - plate_pos_x; // experimental correction! move_plate(steps,0); plate_pos_x += steps; } else if (axis == Y) { @@ -544,14 +564,16 @@ void parse_command(void){ move_plate(0,steps); plate_pos_y += steps; } + pos_report(); break; case MOVEREL: uart_puts("MOVE "); uart_putc(88+axis);// x or y + uart_putc(' '); uart_print_signed_number(predot*num_sign,3); uart_putc('.'); - uart_print_number(postdot,3); + uart_print_number_wlzeros(postdot,3); uart_puts("\r\n"); steps = num_sign *( predot*24 +(postdot*10)/416); @@ -563,6 +585,7 @@ void parse_command(void){ move_plate(0,steps); plate_pos_y += steps; } + pos_report(); break; case SETZERO: @@ -580,8 +603,18 @@ void parse_command(void){ } else { // queue command - cmdbuffer[cmdPos++] = byte; + if( cmdPos == 0 ){ + uart_puts("\r\n$ "); + } + + if( byte == 8 ){ // backspace + cmdPos--; + } else { + cmdbuffer[cmdPos++] = byte; + } uart_putc(byte); + + } } } @@ -614,7 +647,7 @@ int main(void) - uart_puts("you selected the relative position demo modus:\n\r"); +// uart_puts("you selected the relative position demo modus:\n\r"); touchpad_set_rel_mode_100dpi();// use touchpad in relative mode // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution int16_t x, y = 0; diff --git a/firmware/USBtoSerial.elf b/firmware/USBtoSerial.elf index e7a1412859885515cb474c14940e3287651080f8..f34a9e7447040466f02443a3d2a11e5ce67b27a8 100755 GIT binary patch literal 158087 zcmb?^2Yggj_W!wWIteM%P$Yqb4$07qbV3zKXo9GukOTrD2}!6HCJ7}JA(LciHbiW! z1=O`5tAn~MpaQzCYoQES7F>iuqNpq8|2_B3+`LfS^8dY0-n{QA_uO;Ot?#}!ljS4E zjTAyq@X%;71*x83hTf{trbup(*n$C`CK2(z$Il90Qs~s zD{y`e`2@)M(aShr#JL;i^EjWyxeMphIG@D16Xy<`p;g(A(5m|N9s=fc zTX1f|S%tF#XF1LdIB(lev=-OccaRsZD{z+Jbm6=o=e;~-`R`5oz}dT^7<9e_uOOq>`DXQ^Iz@p z3GXcxI|uHuoxU>rlhCSV;iHfKDz+EzDbA^M6}yYYCU>c;v|VwZ;*zG7w${}viao{5 zNqF_As*;tJE5)YD)g`MF-m-gs6+4PwDt^HIQt1wNS^X$dblTE+OP4KOw~W|R?t4hI&Ufaw3GWfj=djKrULUdNA<+iBUY_=z zLLYONc}`ymO5y?%mQIn<83AeAJ!Sdj`NMr4&uY(D@Ot^m!na2E2kOwd?dx_=!j||g zqqd9;isVPg-1>Rq8rh?sKnpt!}ug!77eobVYbY_$%QRk#QR)3A?AszKDtgn%#4%;$lTjMR;X&<&;_+j83_wvAufV(M2-XdDrM)Ywyl$RSE-j{q|#78A9Ahc`9NLN zn7n1huJE!_tH)k-+J4D?y3r-G`^VyhjVY}+t#S7IQFtSK#R;d}N8QoxaCc4l#qv|- zb`Qt!!Z&`OtGGDTRciOF|I$_Yoc7g8SLI(cm-{bhLF*)^^cz>@^IEabRr!MUx04$$ zx-abX6(^Su**@g-6~d@z_po+Z>_orI{k*oS#_TQjY%DDH*zpOO&nSQ4hVtmjjpz+A z?z@E3eYe>7mdiaul)LW~9h&yDP4t(Yaigu;>+chrubR9iU%P#;p5Wf&a-W6PIg#)d zZFXFWad#96`7xE}D8_x3Vrrtiu5NBignuJidQ?KV*XQ;Lzx%XcYpKOyRhvU2lgnZ| zR&V&u?b~%CGIr?|J)cXVVO4(!iFVsPD_&i_e8pR3r^8=CUX`g7QISgFZGQ;TJb`~TNOtu^u8Tk`Kx&B zfya_}I6GAD_C0gwn@KI*T-UA#O3*T+QcE6K?d;|+!@0`YvARL3$=fJZc$=g~R2)KS z4&ppa@0R_o?3=PHWq%Q`h)ozF7kg%V^pToQrS6IOYGW^*y(gG_JHXsP|R(YITj~ec+7nt~)baS{Qvw_mBH$;&GSnzT<7S#cqq+ z)^=O_ZSA%V-Zp3(`w?B)B%#EaT>W&yZr`r(H=>_H3+w70;Evp^dAnS2`pzc!F|KTF zzxryq$Gqv=saKPR6t4((-;&|WM~@8;ca^fncX$4lM8%P@k$zW#@Vb0I3x~&*!1?QW z#JG2APWKa9hwy&U&dMjWn97|Pe|Bi)?#H!N;hUq&D<9Wfl{>UUBI}erA<|bC>!?N> z_oXI0e=0R$ar@a<^F2Wu?OOB+xz@&QNL3seol=Yx9z%*9$n|kePw_Z%-Jum5yjm~j zoYqSbtbyUak*7ACdHm!-(G;~)?kV;>niSMY`*s0Jd@gKmpyah_qGY5w&TiiWCtdCd z7_*YZkyB-$SAtFkJy9GuRdU+xyYEP_X9wG|KF-|*oxAmMuDWVJkAM@uh)Q_C+04Jz z>F^irUxBnKur*)fcwd-yH7TORRhgqjRLn;tOSIL!@9?kgImZ7$Z=5~*`PcTr*{ff* z*(-b&ujVs(O_-O+=W>^7WssHi!c5nvqd(HOrdKn61Z0suS3+@eiPP?%?~SNf0L%F} z^Kjd*mv9pnGKXiMY?Jj&?of`%SQy zSOrX8i?QoM%x6FNVWqG4Ld>2^xn1*p2U`3+BzM|1(RtzMdyHoN=E>b>~8cd@%bA_cb}mHMHS`3*2&W^;U8& zELFCee_>2@!B#nJ>Fw!U825!E;&o{`GB&$92JOa)c2he#zTM)lAxA`#HwG=pi565> zGST}0a-1r?9t*EW{~NDAJF($R?`yn%;{wQ3%PJ}dB*wM<8L`1~|oD*>-irmwa(z9~YdbJm7;VhM0?I^FVn&!BEPvt(Vx3xQ_@)D&b z=MNE^*iJL7JlvM;ms|Vz>cBi#YnSEjAKSzh|7h`Y4r%_C&NQqaVY%kYQC>5a;w;8l z62NB@eonaFn%6+x)@$B_>aBb zlF-H5F+pFKZfV-jpYJ}8_33w%?Dmt%8<(&sA=%furkU62{wEDu?yUSLIUyYg^c~PY zsaq=Z@+*-Foa9PBQeU9twsKd$`ueNQtXPm*_2yQ-4L}?yo8Fn;4E(OU*ixICFOL3vbjYz`$6W4D zX(Rmklo+|@1kuL(7_IQF`O_+#j+g1Tt4CYy#flm8++m!DFs`TihWR2+x!k8|!*W;U zX;?TzxR0tlBT-oZ`J~iGcF&jcP7AuFd?)pu_SVseiZkFxRGh|Vw7Sc`+1&!?R8mt9 zE%ywrR$NchI+=5uj~KgZnn;0GX6`&#XN>N8HWqNa<~T~X7) zTeq|_GBOIRxAFd92^r~DgJnI45xI4>%l#$s8gm6&L$Pne8;hj<(wcVCerZh`Tu;+# z>2C?-982cZ#_l?QWrTTE<0p=$pPv8l-`^qC#xc6`W|53=pQGq}7ur@t#W`a8?3bUG zRJAx3AtTR@4+hN7h+WFX}*3Nu?EY=*Y_s4rXKyuOB5ud+7 z?(jF=U*UE2ZS61V>+nbJww#F{-m!yV*KBnoTK{@(HvCmWE@^NX(k>lp& zn29RA0>5y&ZeF}En!lH$&;N?cI}uA{T`5mpN*NzJbqOTb5u z{gU|3q7?0p+tmuMYdWt|UGU%t;&W7s^{pRRVRQdb>RVsB_RPA{6zm+F6pc6W>SKa0 z?aWtLF{f5eqp#d9tm@BrF6JktT+EM8z-)^-w&PuclQeJ4-Gh_5Rt~Hbn^s^?q1%-d z>`(+fIwDM)=AOy-O+DVgn~K;xFOpJHl3E|%C$K9~Jpg_LHP;kxD}D&8mf#o|kNQme zp;qp4qfelYn4^z{cb;g8n0#1Wj(hxp#oKq&s%byrrPl zc$Y!reXY2^!(VEM7F*C^WSO{#asrl)s6TLPDXE{#p!2{NHUH8bk zjq4bfZRF22@^dXdgSENxINt}{Yib?H0Y#NO0kWIgeb-q*LmWs8Wb5}~xir1_z^=(*vL|~QWvmP(QoOeW6feE-Ha0u`( zUj%1m>;tP6@2`UQTz;;OThnXJ$Tic}v~JwZGSo8Bvd3RstdAXBo|RX5mI+2JyR^^o z>|)+2OGRW|vY&;QbF1N9Y`KT?!?pH4G}!x|$}ng1C{%0HbG5!Vls!kwK1+`*=Fv%C z>B-$fpWPGxQk-*Z^{?Vu%VYeli}lr13{u9RE&l0f(2tJS`ElC6%22M7nnoxW`_mfh zhfCzdxRh{l@I{?BRMv#PI??&OQpPUn^f%DD!j9$dPy5j6&-yUN->v%5!I9Ois&C&P zR_*ir<6qQXUe&H(`6%5Zud^i%@Y`Y!{Jn zHSOmG+g}LZjD0=3=i_7cYF-P49;>%s`*4W==VMNP>*|!j&HVrLPK@li|AIIC!!4J$ z#vZynHFnQsPm8G`T=Mj$T&BMMM=`4LN-!~cSM)QNdmIak@9+1WbslpkClC3?LoE+q z>3Hn7g!ad>!r8MoqT4m?V;gPzgKhU&hyRTbSJ$^hP5a8}DM_9Dj|`q@nd9H%{g*do z@cGMI1|7e=O71$c=Z~fwx>AN6B;JYK{IlJ2+84B^`?1#+<4U@La{ucX2VR}H-T$FqPqQ_;xqmMr*ucBTS?qu3*dCPK>z$pjB%!SRYbpKwuMd7d zkn>BP&#nxrF88=R`kvdyq(_tNp0iaB@8*A9%ioF-^5=w2=iX>v>G?6RU;3)&QshrZ zf2n>WJhD2qriC{zWqA_YXoAr@(!c3kq<1me+#_dKW4&+jW?{zObaqujK2|uL{M)bs z=ZJldatBMjHJt2I!*_-F&i;0>Nt345v$mgYUVnoo4Xt0a}xJKQ`n^&&G?zw-n!EM+6_8?K;c(*gcP4be*?*D6U==Ta2p%yXWG^B>51V}qwnyi3|`gN`w+nO5vJ=*Z4Q+BVO)7I!qM^||kSkf%^Dvs(K?X%i1ZvUR(`dxdU!()jPKMs`=R0r>w^)rg^nquXfLmSM+^5yXUbp z&EwhPRZ(ABybxUz%}*#f!ZH3GEnW)wD&&U{y`P~aRb^jEMeE>PcnADX;wWCwGFR71|i@8rnVo634|* z^qkRtfv2w&bLa{`b!Cq43R<+_^%9@FZ@^c(=clTgqf1iq^9uXNP)y9y0IE;*>(QvB zDM>LjKI!%mF(Bh&h)N^ywAsubC3gLhIt7k;4vW`37(w3RSo--VO-z`%xo>`%{#{ zw^B=m2T+W{1L22$B+?-13sZ?Sn7Szb5OOL!RC$+(XXAYpe>e?LIFW`ZJOZ}#BN0#4 zM=Lyv#wk3Sk`*39QxqOc(-ppr?oxOhr7ApL#+S)NyzMYY@slV=;bc6o*N;S+h$r_! zJc*VlJelrQcnY}`o~r65k#46l#h*s&6`oGz3g1Ch3eTV|3g2nKcNy^A20YV%Qw%uO zfYS^(-GFBqaE1YA8gP~Y&oqGDaH#>WFyNI2yvl%A8*rHc zuQA}Y2E5LI*BkHy2E4(5HyUuc0lN*j!hkCcxXOS%2E56DHyiL41Kw)D+YIPeNF=;O6*ySO9Keb6DfL!5pHW|hKd1f*AEyBd zpP)espQ0fO$B8)#w-s}Nc`VKd~YOkn7%p5t*buy7UQm(?C47fApD}EO$ zP`E1R?l6`n@B6~2RBRCorxtni)m zio$o%YYN{@dljBZ`xH*0Hx7>HT$)~W3&L~_=UnyKd-zZ#4XBA#S z-zvPC&MUlzE-1W~{0gt5?-gE8)e1jAKPtR|eo}ZN{i1L={i?8=ep9$YUzEyzR7n~y zP$jM+v%(&-D!hs83U8)*3U8xOg&(9ag&(2_g&(E{3O_=P6n>PND7>Ab6n>1FE4+hR zD*QOLQg|oDDEtJqQTR!UQ}`)rr|>h>LE&B0N#Q?G7logtc!i%Mr^3%ucZFY|o(k`# z-oP&)Zo#qZE#SIiS1%5$Ja|3N`g|l(9|P`d!2JxkzX9J$eO1~4)L-F&G(h3OGzj=O z><9fh4_w!ux??!&^TA{I5QRI@FklDfgP@&ez;*3((G$wF@ls#6lR$~ej*~_z+>J&n z+?~cM+>^#B+>0hC+=r4C?njdp?oU$`zLjoQcpyzzc#r`PrWuMqld6i%U43a3$-!s)bD;aRj^;SAcKa3+;2oJAE1&!#Gc zvuTsUxTjEf9&J;2K0TyxE*$EW5704%H_%54Z={bEE~ifvcGIT{SJ3AQSJH8XJ#VR{BQaZFE-Qhv{2|AEomOZ>I|iKSq9qchL6=KTg#O@1!3Ueu92d_(}Rj;iu?V zg`cM16n+Li3g1Re6dp%W3XiAe3QwSx3MWx3g(p#r!jq|u!c!1b#_out0remc_}Wv466RXE;& z6DUXVyHT#f-6>z;9#o)kPbyNl7cEk_H!V@P4=q!;AKj~Pf4X1c0pwD6AeAUQh*l^( zm{ut~gvt~iN^2D!M(Y(GP8$@){glEZs6ye9RHg7}+NAIp+M@7S+NSVr^pL{i=n;j- z({_a?&<=%@Xs5!-^rXTQ>1l;0(=LUl(6b6prRNpCopviconBP<4tiPP8T5+6chYML z-$i>BzMJ+bjC&}BQ^~7v8ojM>I=!p#EIOcYCLL5biw-M1hu&8>n~o?vmyRhsk3Ld3 zhdx#~k3La2pFUN10e!A;0UcMkkWMOGL_XjxhJNw%b^W5hpE4wNf~pVicZ5Z4}O+IE6E*ox)kv0r<~``u*E=_1no%zn!JNUcX(a zld{v5x+ok^@d_u9Q(-4{SGXJX1peNTuZAxa*1dmeXUMm`)YtRvK)scnj?`D-PShVb z8g_zXc*1oyyBci9OMTsD0u4}hoHR(`ZZt&U?ler{9+aqXPa3IkFB%Oz-r&RC|HcQ_ z5Be}xVJD4KxEoDSxH}~)+=C`5+>@p#+>34pzQ^Fhy6b$XdvD14K_8|o?4%hAccZ%$ z?oKlm?m?*v_o8%#dsBwOeJD%ezBEVSel%C%{*8>*LW>k0 zN=txu8Opx*y0Z7w3yV*_-)DV3_jX80F@{_kX9%>h*l{)jmi|B zZoqfYTE(A1>lMC}HYj`-l`DKVRVX}@suWJ4O$y`LlftuTo5C6Nkiwbth{9R4UEw*j zL*Z=NsqkESQsMdZw8FWxOW{0vR^fblUf~6_Tj4@_QQ;zbS>c8Bio%QNHH8<`UWJ#? zKH$#{b^7gfby|1Ng!T10?MQDb+{u7DlUMP((Ax@krFRvMrvnNn&_RWrbQsufsvT#d zfa{K3b@!B5U-zevOsnI*^uFTvqazCUr(+5appSri8uCgEBvz`-Z|Y=4Y_Kh}Va{*O2Cjb#bG8NhZX8+7=|6p`29^RerE?q|?9#_%=+ z|3Ass7(=5EQ>C2?1|NRA&WFB+yo~WN#>D84F(%i?p{2QY9OwefpmfM*-|pPz!V z)+#TUw6xExw3{nu=Nc@JN-7*TEaT?NxoNqzmZwh}F{5zy&6V>DXAP~@PM_Xy^oZZr z9#*T}ujjOpeKK!uyC832Zbq&8_$5>Cn3jEW^+GhSB16MklGkI-!Z|nBUzS;rS8IL7 zvN46D=iNkmc4nP+m6$a$u}9W5y0a1ri!x*bFUm92d-m{AvwJSQPB(vkVNpSL?(Bs5 zne%7mFHK3V^<>hOTx7rS7b*Ofom16^*}!qxbDQ2r;wj;eIM6%ZTL|qTtCLO z1FpZ|%KQUxJ_=Vpy5Kwsny*%e{zF#daOF8W3)c)>`QT;UVbG7@nu<(k;QBJI9JkML zEki8&h7lbE9XxpdO{0GxBznBRft=F?kDdUU+^*N<%!+3`3N(I~i`zl>|JJ+e%%kIxf>`UfCKQ=<0+*NsJ%BQ$B)AIitNQ@HIM-8q{A8ds!&&H&J@O;B+JT0|)05 z-;C%kN$LH!EI^;ZHE17&qlo6U?Y?(FA139oK5%VkxXy*X(J#Foqvi+wV%7BlgsJ&S_3sY|2L!HJh76de(Ovf#^@INR59kN!RskA~L>-JZy2WKozYk*L?3!MyH`LYdlqr1gp#u_UTCY+Qd^l|_#r7;-6g6q$e?%il6=ptw4k|J6x zQ9)r5tp`fWNToSz3Bw%KW^HOuF-0NkL|g zl%#ZXIy3UK>BXBWbk`N?VYFP9l3$QnSh%ntlj1-wVf!=)XsJZgfig04iqcY+Qh~xt zXuZU<;73YUc4kfnb;AfdwJ^Q=~rDA9=9 zM@*QKGIjE>l*G(M*|RcJhUewxV!2KoZX`^^CoOk& zW(H;5M6;+MFK1Hbf`yr=gL|M;TTeY`r%E$Cad^zMVa~32ZMQ0_WaDkl%mXBe2--@Z2)I} z-lEKu{G7C+ObU;{%0lMK`h~a$N|`^OCNVd!Fr^?fKd+#O<}jI7P?(uAD{ub%wA>7u zkHK|*T6Qi?McYUFO<9~-0Bf^B6*==3WzE8Rw}_Sogc)gQG&z~Mvy0}?I`CxH{H+>v zmxt@nOX&sB`id`oVOAD`vmcDxvkQtArse1jDuruh4Bx9|rOnEuzp{ZjX>cw-tq9Cq z*+;kGQ=iT6LqB>K{d@S(apQ&!9e$f^Z=*7c5;F^D6=dflYSacQdJ8l#dxBY~Nf~4# zAsdGVwlHmW=482;rRiXePs?2hpNi0f3Igo8U?&&kWh|Uk6yUIX%cOT1m=b=*XmK7R z33meM%|ibhJtlFI9`{Xfn+5PzF~<~T&L5MTl}8as$wG9i>xIPup)uv;>}8ppxtvw? z70IWd9>;0uf|E0IGbUxC31v=8o0qvTpA*m*80hph%DBcv;h;w3X5{B_6XsrtKAnQn zWv0!imyEIr3v+UU0^T!LiKZ1~7i9({DdR@q*Eeq_95#YpHVP+UAT%UQMTC@9qYUXR zh=G#nIVS5~a+bcEOOf^sRNFOaN7SaBi_!EZQlxE$@lZ*nPllv#-c*Q`voLU~l)A@g zfjm?hid=!A^!JruX+IBP!77qITyJO##-iWVft@@ICrYQTM}}A)#+dSNv|y_(7JN6+ zG6ZM}MwWl01zV*J4O(@|XD~GbBZD$^LnT<^;}1CXrK<_8;u&KT4vqjA`vVO=xnL1J zXl%^asZ2>r&&iYAXP~GCBPt+B4v|{(ux)q;&XN;bv8EYX=&L-Q*(>5 zF*sV7 zdTAil7);3M(rjsHPL52@J7R^j!Jr^Lt}A{VVl{_$>qc`?hFZG2%yF~Kkyqa9;Y=ph zfb1uRs0mmT)sC)7SyPtgXVUrKmk-O#%EL0EFyPirtPIVAFZW>e0Q-DC=Vy+Jz^1*F*Ynr2LpTOI5py1j1ed?zdgoEIOQ6w zMIZ`e3b_qnWrq16gSrQ}*OZRUEtKZ?jwA=QSpmhN3p29wf-9mMhb0`Ub<~1^Q9Y=T z23)IiO*vM>bN$xlR*YjI&^9c@Zk+8}v|)qN4KjVTt_II@ff>0a275zVmLy`uLhkGN z!?2e_%P{;K^hf3_ESy8FP>}{^FzDQz3~WwcI4N^hX7(b){^z>F0AJ?O0;9Yk9s3lh zAzp~`XpyO}LaDT_=J0|{$O5zRp&QAD<>bwphgEDqryfFV$myD@$dPS;@8*^veuRFD z#m4WqfbY?J3`#esifGiRK_eI|*r#lnAKwigM)Z5a)cDE2pWU%KIycB|405YAV$5uZ z%#3d(_rr(>4Sf8V#4*9_ZeZ$zYgD*eWWbWsX3fhiqFIQK(S+VKKEH+=bRmH~H)I&7 zf1^PT$@|hvzG2;m*?1w=2$Loxj`=rH>55vdqjrPR%(zx3=-4OM3dR)b1yn7!2i6XC z%=7FN2*RmrWgMk|jLY*Sre(wthgmpL8i7&~H;Lfk3;@jrseNfrkS1Y$8|^`}GH2OH z$+3Hx^96!yzX#(YnKcU*q@;1U?f1@Q9nJO&U(A+j9#OWV-`ejll^oj-e6d?DLSVAn z{Gcqt_KJm9#MXiMAnO=>2rECm)2uvYnyl~P(`+q4wOOn`!I;&`lda8q8XP;>hBNVw zWee*H`#!i4xM*#mpk>_(f!*Sm$zQW{q++kak;*JBmK={@ZRAMfr+r$iaFq82m9EQ7 zj*BR!W0p>tNpr!jBjYMm>)BvPSlvaqSf4=_WPJx-32Ot4E1GoxVr8;UK({qhy%X?F z)SK`Gt1iO_R3Q-7oxqxP2e8RH6_(9b7qA7MYkQGzy%3lcAs@cS=~{BFSvx^XSUW>Y zqk0#m__H5boGrzxP?5s=4E)fn{U9}2e_^u}VhhO?1E3Om70My`VhN0)=%Fuy7qUPE z$``s6UWXI~NK5D?Bo0{|AgyF;%JdS!8P?Z$>l-0H1V`-=p&6S%I`WWzs0=m7wE;w- zb2#7}*D>%XG+U>vjs(O!bgoW?klh@b{{|a)4-SMD=v6@u3ql#XP^UDqhlJ+(Sg9|w zmvV-j%h&`^_i*8~STnu>7n*K?n~n!rY2MU;QVc3QbUA0C#YT{}o3kllV_{tM7$gXv z3t-Y|XOI>;JtRmkCwr*KeF$X4m|PP1jNn5=(!wGV3v^0zjONNM&?$4o2;8xYLY=b8 zwkC@7BH0}+yFoKhzOtcn4f`tUIC7z{8oh z72mw{HDT4J>$#aeDcA>7FH}m@9}z+EB*SLX zp{H5Y>~++e*u^QRNq@-dYy1XE^B$lrD}`w-r~D8fmX!>fl_Hpy)iUK+xMC@j++>Dp zxwW+rmGH!}PKcJJY!d^6`4gmR`X_F)KEa*C^gJ7t?)capYV;{StRX1NA&`x^+k#?D zO*mE!9I#;Z2tD;J`5bseghi%*aSCaxtk6fOWlFI{&SXBmw9?i9S zG`TG_;Yh{QXWff}pDyu}B~wKV#sI80rP~+T93O2Oax=Ne#THqyvR-~-OCmk)Fice; zR7U#|Ts2yb9A%ZjS z0C`85dAQUyZ_ui=j?#ffve}93PVB+ENPmEBHWHoK1;z)NZY(;p4<7@6!gMpCJCTh$ zC(#V;&@@5_&Rq^B@PPMkJ9yALAz<&4aY8kkRVNC;YW%2;ojs*gCrZ^>tlE{=8?3<( z;#iBff#dmU8$ZQ}PXl-aAYm~FKHbSnYnKe-yU;&?Q>>LiWO$Itbux%&0r{OnQKf>| zP0WEI^JKv}@#8+utvi1A3e0J;b1{>j|FNK(c!ULa31;xaKxXz3y!mXNC!Py1`RO1F zct5)5pJ3OV!=ks5QO`;Q#XO(MpP1Z?(wlRc91g><|0SULxL^}pT-}?W&_>Pwkl|q_ zKV@V=FVUEjf5$21!A#!9ZaXB<OM?{OouXE`!ZUiljSVD|htqmW4b@2i#$3Wm0!1 z43Mn`-1${^X9&-1jlgb&)09_*4CD8K)dC(<+z}uav|(XkpLV$1j1A$kBe+D} zL>Ff46RfmTrFKDNdRH)mUp(N{{J2N2odaCXJ2-VO@g+--30C4a6Ik&$6kE^Xnc*12 z94PjjivpTH;&fGTA6G>m@Qdb~S>N^GgkEf}at!PVCD3kx>69r|BZTU`4wS zti`WAux3AKjwoa{BL@e%zBU-J3C}=X#6^rgCX5`c&#y>u8h*^wVG$FNa(UevsYa$D zCFs#eWzDD*nU$hLDmxu1J7_UrhlM)LhIt4XoK2<%auDIIcl<((97kgG(S!5iS1>p~ zewsC637KNVc<6n^%3TCcV6f0gvrO6!s(RASGHIfov@N^j6oQlS8zG#OpN;8Boib^kBVvA{~hLJrRT8gs+oPl?+V_RfwS|QEA*SV&)N)PS^ zjcQ+yPt$H8IAeZGhco9VkR7%$v0Iw2fNFFiK1_Qg9lefaIz}Dd!$#i_f|K(LK5U|k zIL-R+3&9+I-G{m38^G@{RyisdTTCVF_kQ-_n7CVV3Ya4^`!FzTcWLolXKd-^=X z!t*!-^9;iaOzQK@kAR$GV4isiiTUUgfvM#u3=IQi{l#cJIPkDBkRPd>zZ%1EdCa>=X&m~iYWc>v!d4%zx#kD4Ho})?9^MiCa zn)h~iXv)>Zbm(&<;P<+?AyhU*i%Q~-SSU9VZhM_`ERyEwwhEp+R%yJnph4&Z56DuC zL-W@W4d$M)LF)+l=Wu2)_Y9rn74N`(;F~r|V{PETz*lSOaiBZ#UENH0lFHuPr;XwD zX*zHb(=Kf)oC~f|e;M8gzV*D-?$ehF~AfCm=oP1bHCNOV&6bCq-D;eTA zBXNv_n839oMC>g7!eV-bQyJW_m^wgbqR|(NX*gK46pdY@62v#K%~=yycbl^u(fJvV(=~l>)5Lq5 z+A<#TH6iyl0~?wq-q6(Uox%crLsJWEXqx3Nrl#*=YWglF((Yq@{bE^%aTNXxLt^V# zt~B$jK44oJx}C74qiQtUTfin;7igMooiUeKY%X+6tL;lPC7bOy_;%aJ&y$uug$?tMoMpWR<_3aq`$OU}Hkca;PK*>G z@4&RVi5MddXdxx=#@tls7R(_RSsE1}Eg?nl#@sAGT0=Y->C7zxq%Gtur@bX$${un% zOIroVdLav#j1G{YA^dE~+&YjpEF^_JZ66@RLoPDeIY35)Jj-tM36POwnT<%8`{RF* zqF@g5lj1IP7`u0~hFQfHZ}?!_w~pq*;&p z#Q`k?p11IX)%y((Gp#kdN%+!Ll{4=LX)q>t+ zae-z9NK?o@mS$;s8!(4#<7j6Gq*k(IaU^rJA2|cf{Ghg6W$>`d;68R@yA)}$8ilSz zd)ffK`rL8I@)MhUL7OJ~hTPk>9zv$Vvg&KFY>UtsG@Bb7vQ0y1G}|a75VrThCtE0N z*9hB35Y)5%6|R#l6D)L+OYlrs-ry|>TVt8}4a8a4vVb+)BG@q5c$zcY8sgJpdmM?a zHV>@YYy#%&Hl9!&wg|MRdbS!!Lu~8754H7!o%*(0pc!Uc4IFM81Dg?ef?)Y>9kO$9 zH?mv|#MjXui7fs=cpY!Ukma%-P7|4uVa4(zJ6X?ci4q?G$ojD~SFJ^+5B4N2!xpAFjq7+FR@UF7(y$5m=lXBDcG}qooARC4v(*`)_L*B^GX1-@xqqFRr9C)cA z%cF3*mClc~IzMu=pvEk3g;Tfj3(Ffw8^5r;GlGY^OXfCVy2+nms;S0KHPt@EXH>Jc z>~%cvdJ55mhw^6pevlY*N#}6gH4Ei}zhc7V2OaKz%?6;x#D1OAtd!k{(1( zkY{s)J!};*$6(K5I?Eh`J&Wl)a|}i;CM*1+AK;Nje}hAT$#*O!T5cG@V+oqmM@^yh zzfQg;ewwJ=KOY9Q|6m@zg8YT4pSBzN)-E8(I-n6))*sMnG_oZ#VXnN)g1-ZkH4iVl z3+sdU)U0RmX|lS(H(S|ji!}z=YIVVo&AJU7JK62#C!$bx$30!3_Eb7-aPM(+2KBT~ znaQ*b*_of=Z0r{E3!_6aAI-6kbCrEji#0i7+1E3=%;I>LHNRvNTCCL}r?jux zRV~);sN!`0NS9G+`fy$`9Iqtf!$`l^f9iw{lMyp95tM(ngxgx zg|dTRfsivAV*NJP&6O9x3H!`szM6&3=5R5uCJ?0X-E08EksJd>_*o`RVi8DF>>+D- zeO9*0A=wnW(H5S@4%x&iDKEE$|HS%sIry1kKe2_6XWAh)N%^NX3f+mk*_!mIA%$|W zIJKl56w2PRc7WFOhsqK6u$@qG5z@$(cp~A0O1KQ)OrggQHzKT)5|}QUhs(gH2FMl^ zv6fv;6VD)J1K~rJidZQ`h~&Y8^c3{>h6_>V%`A%0Jf5)`eEStm; zR^){|HRpQ~-T`ZT7iT9M;-e5W{R#X=yE&JyxK6b7kxh0o^(!ZBA+6zqjmi1qGd2cu zG0+{%=FYJ4Yh1SPSk!a~5NmJX^o=p3;|S4aK(!@vT4n%+Xb&U$pL|FbrXb5!zi?PO36`w~9o-IfE)ryO ze3|LN?6gzTA2VISb=!>}FOnVO0ky1$lpz`iBu3Qd#AEAjOWvb$9V-~mL@GVk+hner zK9db!=O$r$TBpqR z?`{G0j80j}^h7g|yEuExOhDlnF%;IVKO&xFJ&J}Qto*xXnw5W%$7KBr_-1QY@GWHF zAJrC)nOU4b{?L(?f9^$CqhUz1j^hO6_!>(53J1SZ6s);=)vWO`YA)ojY`nWBOgxH( z-p~A=vbj^em0Z1lW~H92)B#F=hEjcgb`Od%g>jJ`1CW*0Qj_i3Px-hk7cn`Ftf2KB^WhIjwLsKmK_XWrXZP-xT8Yr7E zUP=EvIvoL z;{xz=DnkJdA-$mhmzbj*lCTradMGgjchk(4+U1JkA^=`bi51MNc z;(m178~Dnzuff-BWMJ^s&19{whuE9iwsDEcT3?gUxedOSg8c7%jS!P=T>rjWC%FOh z|0*yz$^RzkI%({0rruD{j{|U`0pFgRMsZL0j1BSa zwP_Uh1cC6x@#AI#!H-j`3?JXv2i*^f!OheHo zg8UDQ_86Qn6peqQ&QLV@vu!sj+8?3E-GG04^#(=buTdF_#=mZ6D4LJS+M;!6g*dMdM!wGZc+~wCMMXb|ZIxKq_{3C)&#m+~x0e8QisF5oK`K$z-j&b3hv0EoZXU z-3v_CHnKJ`|BJh~Ar-sJQNDq@{7o}M$DIjngS(5EtabNIkOp_ZVY1fU_||pYO$T{x zbbo)4i4Y@h+ywX=Zw4pV!Lq^0mzb<|@?Y#mZ4-!XQ^(0-CTnB*N09%mlLB2f@I-(& z`l`9}VtV9n+({?Ra(X-o%hE}+oF0GVeAz2=9M6Y?VnMD(m6+S|vZWNHobgg&j5ij| zom%eJ@I43EY{0)sZ;t2D;WenW;IHPsjq_HPbzu{?@<8$lo6wMkN0H3-<2c_cNghVm-lwM_SG_zlSW0ZW+d-SAV8ivX7~*^^oxL{25j zyK(GYgE%(J={|+haaJ75-5OI-AY72kgTuw&Jv4;NiNuC*jRt85S2>fl;d%{Zodp8I z<%2_8VABw;@1Ta*>Bn4_)rKpiZ6I7hc_3Vh9L(Q)km2e9)oZc~gi9&w;Zmd?E=3|- zKf${_$~zgZ$C$$(foa}7D#p&-USXc;J*Owa*K-Fe^ASJtMI_LQwak=>|e2jo$v@)*u}v_~F# zV^WGk(F$(CXnBKT@lLLxSR;_wP^`N_8j7_NWXmDQawJk2iuD}$|EI;8jy(85pPq*- z)_cg~2E{5uu>y^o#{vE|6K>r6RaZmfK8M7H#x2?hilvVQW0-KkbLPDM zFb{TujO>69Ic~6SGEVd0S&+((5XVC4S}p{fZ*bh`4?Kuzy(4r7?9HU!5jp|JGl`DC zzp1mAU67-i>qV%kaCKo> zZMgo-CVn?uEs;Qm>pQ4klihzEt|)j{sJxRMSN<4Lohd?g+)MEI217l6&t8U0pTQb- z34}|Z!8(I94E3`>w&a%;yYW5;j}`h1whsLN)1iJe@))b~kVE|=$m0e>{R*^#8x*S> z?|bmBh+eEcNGw}{UaUhP4aE{&Q7nG1*3R1_wZ-ZP{{LyQmLQMTDi2w#0m$RJVzuIb zJXG&a-hC9J4nZ|oW@vQCfwr%I0rNB5ju`idy-;X)E0hd-spgyQrJDc8y;O^3<^lL^ zql+mbd$Qo_oQCN1f@%w**+LRx0&6dp~w(9JCwE1_zW`?9tP8VYM) z#_KM-{C1;Ve!J1W!-~1vF2CJqcL8HF)NXxzBJ`}hFKZ3%%UXF~)*9TGwer5KHMlQp z<$YOea9`HS`?A)$`?A(uoIT#^K)^LOe}&!t4C)H5*uk;O?_}ELcQWl0;DnhRpK>Yr zn`Qh3sd^j-P>d;r3mJL{_oG@@$U_^Ug0wiG`tLBx7vd1qf*Z7939P6;D>Ioe%!X%6 z2E&N8oFI+uMPx8HonuQO{29i-XRRI7ZB68K(uafWLO6$BJ0v03iFQ~T<|@$MV{Sw; z=6dY|Hca({+qTlHP_31t56Evo`f-ZP zsHZ@F1bCdu^k&=yo(JT2wM24r56D*WNQ>=E7S)4|2)2_eMFXU$fku-=^oYD`yeipOq+hC?OM=5xSrTnh7 zjMVF#g$%Y5-pA(i*?h6!h@HgA=J}UYqPS)627{j&ij`3*AYTJ~m&tWe*&q)C9$|80 z)MAhy0kQ?*!L#KOZUNh5>tr6UE7|yrzGx*emf0kbC;GWeHyr^QB;v{F; z)Q+Z4a|)gq#2!wuA0KTh*yX*P!kS(wW>pHAs2;CfaEiTA55k59Xl3$M>8u~-s@dez zQ5zs->&y~Q%7XTX;viOj4v!6a3b5bF10CMKH4^eaqHFYOh?)XA#?+kxULJys_2D0H zXL-@>O@Xi1|F^H82J$*xo7e5vDVOBU+@V7x^sXG!aX z)2u3IN$c|;78%AjZB5BZY_rh^+9^6XvQHTF7`2DdXBBU-kJ&4r_f!Drwh{oC73P+_5X@eXm4X`Z3qqRWnl_y z#Q={TO<_(h=Tt@~S!*7nQ!IUuk$R#XrXGEV2OoXQQia)BHx0TG;x>-u906D4!DC2? zhKb~;VnIGXl6T{RhscdQVlaof`=#mp;R`{zxWi% zKa?;UjJt4(HIZnr5@s=39$610!(1jGYQPQ^0lvuO;|&KRZ3*C7CNH&wxkg!F*&8ju zr)YF1KB-YMe>M)PHMy5b%uQ9ea=I!`Tiu(}J_eSF8gk7r_Ys!-kj#?3wG!q&&5|GI z1|?>SUJ| za@ByC!jdHc!Uc(aB7bpQh$!a$F9~TT)^&L0zdl-;zOa5cw(f|)-^z3)LdmeOw%u$* zu>Jpx2-<%>BG~_n5rNlgmcUv~c6>{q^P^GV|bwQOb z;9)?+Fu*H0T`*k=!V8d-sT5r`oIAaVJAF8JYkVsN-Iu$y32(GWm&3W^BTu}_G8(DO zr**a*&@2aaVw48^^48`c+m{2H<&cCtpji&ffXO?W_n0dOG>bl<*@|J+@{2yAMt+Kz zSokg>4<_qNlOcNX!}*sWto%z54Mb-o5p4zc1^xkK?hg&buPBM=FPOoe zFcwbct?4HBfpu95*(Sf)-iU=oogkDpO}fn}aCs*~6pi9!Y}3|_ZE|(SK+uVWi!xZq zKPk~d3VFTDf}Si~EZ6lffR(_)rd+Ko7{tP*P5%s%;SeV8l|@Vh9L?nF*Msh8x;x{* zO_q{Rg6<5LMtO*y0>ND@T-Wp;AkzVJnA|7>z;F?h?no>OWB{hAlCZ$V!pe9Sa!KZ? zlCWSc3#)EpA(v#i%=8ivzgo75g(7F_TT0w)g(F!hv*6l! z8G<)ixbt}ya_u~&ga;rv#=>Xb3ku(mLaqZAe9ppMXIaReAC*F`0~UP6!arDeWy_v_ zDTTiQvEV!lpG#(;6K&=SgiZKm*O2Z2{F-MpgK&Tz08zmt&29zf|FQQifOQqs+IydU zlAb)8rtcK`NFS6^O5fCiSehm&4Yp}W(oza?nkFZ0AWdQ(rLD+IL`1}jh=^Jd0g;Qm zMK1CqauE@G6@iP0h`{xMh>D6>5%mAQHM91feR9&KwfEQm|2fdCSu<W&2#U4 z0%BmFEQf4fC#&0~j8i4$Q2*5_h|2SQ+Av?mO*=jT?sfe4nJ`2;&jj|uB}iO>e~7ya zvW$HJjH_&1-do;;M$j;QC20zLKJY$zBjT{kp$-_mmPv*F%S@sY^1X@djEr8#q+(yV za3Ab+;-&I(3+2K}FnTkShWm3N=l28F~y6R z)hlWS@Dn@fKZ_qg*eebgQ~WGMOn5_wf;LeIpV$b3lC1`l@S_YD`Dw%tOEWxFHXyvx zQxG#G!O9Iuynw&M{R_$QL`0h(ZRYR|TR-7%`h-7{^HzT) zJ%ryfiX!UIuN(bNpr1mv(Q^>E6#=>BM1rv=Am-bM!LO9^mC}0-_otHo$-vEzV(@*J zMvRjw#_y16gov?@VvJn?sYHfTj0__uu_o&U*%%k-bP?!yQMj$RwCt~m$?mta2 z+GApTClsTdVtfjuMvN^K;~PXpj1HFkOQP3MkWQj`3&FL_uO`>Cr1_;B{9y&Tt7j^B z7CD!J*l^xP&P$1&L{{5LxEbg;p85OlqsDdu4eKy&CdtnIAjrN*vTl}l9$WeAK;yc& zKy>j0;zbv~cKJx-1VpBb^^ClmT ziVeB*9)$BheL-HGsV3q!Y1~16(LQG-)?Vu^j zUxZV_VlVGWW*+k556SLoMB&wSNcQt*AzQ*OlT)?aI2+V5x!@e+3x4DWlaWKVaf2T* zXm@e>jM1m#n4xwxc$G*?^HVv8S|Ky{9DL(M&|CD`_9g$k{pCJsDXi z{1l`-C|inu{>mr7e4?V0euK30KvaG@EN&DCCX#4@za3PQ+iAs9*drJ_g(*k-LOBCr zK3C_z!~YT}r;_qpN0XYnq)b`F)Z_hWR{>{O3a{{|-T?eZq=aB>YCbCXG-=n|m=6`4 zjo@zl+YV$B-^26D(N?&N5PJ#!`S0-$L827-cO-gK9t2CKT*lP2KjkstS0j8a@n(O@ zGr$?XnfNBZoDa(|{2=ko{$_If1L8(3A~$wDrcesM%{Q7M@)#p}eZGiI3O`K9Szo3| z9k%-31RCjch!~Ht(LZ(E5GYU4Nz;&a46;oqK+S&!qF2fD{Fljc45C(&<#@7W!W&Hd zzwjoGJ!KNX5~3dlFIxUIAdfI&V+{;oqN0=Dg|ze{sFLTi=OQqHUwK>z z%Bx8I=HaAP^f20e;?iIOJqDl4yMQ#m7z3KAyvp;XMIhGr!zfm(as z^d;cM%#{k2Fc5D@OC`yZ@54zng*F&4^-u3g1F;AHt%Y3Fyre*jINW<`q(G zz6!MyE{uALQIAiUi#*RD_#DwEFJ}FhAZiKA9Dff=X9AxR_5aJ8eh1jSiZFYhzeQN> z0h%EC;P|_duN1*iL@^PUeoN9BjMysVJZM@(blZ5EE`v*nZij&DUp@s$2R$fKxW`tw%_44|8O-C$BLaS2@JQl3Zw52^vxPPsXtf(coooN0&m|8D||HWqPP`44;B7mRGyqM{NwArtVNz29OUiKV^7I1=J|Fi znAGESdF&~v$LsRgQ&NxD<*}!v9*qu8;8W4g2%yNa|(svL}FzF2$b~pxyYFc*`3#6F8H%k)-NXU}Lz^w&oou zcQhBBOgNi~%ZHQp0tBVB8lh_=9e!iaV~3e~6of(-`YyUh8LKvy-OQgx^&@&Wd(CEy zhY4>B#$(%SzLjM}J7Gj8HG;@ls2p@7%1cJ~J(98e9?95!k7Vq=M>2ljBiZsnR6Q@1 z_r-ElP_A#}seQ@yjXbq4xxSI7_9fRh^3=ZM`bJ*dzVdG3cEk`_YUJIy1Kd-x)JVxv zBPC0Xlq@w;veZb)QX?fxjg%}kQnJ)Y$xfD8T9*#IB(Q=bOO-+eEy zcu3tO7(sp~nt4b)%@@~P!mdLNc05N2}!G?Hv@A>JA$l!;} zvf+FP2L@i=&>^*_GMcZk9&##WCf{;gQyJ3C0uxh#T@CbVZvXT zz*o)q$4Ej+ugluDSXF^{R%%jUidjq;Tu@E)cjJGb}HFO%|9xIOReQ0a8uEbv8;}; ztew9{c1Iqm#b=rGGSWyb99|=luhxC zkd%bu%v}n)AgrZa#Cu0EI)?Y3m>gSQy976C+yVPG_}XEofM_6J8}N$;!TVOBaQ6jZ z!P#lV#GlHRcaQ|n^0dar3f>tq^!auAo(GHRL4P5L{ei0${UfE8- zJ6MMDiwLP+i{=gG7ZFls-xO~h@k;nbgw!^ljE5yYfWLOoDg7EsEGhUyF?}1prRNp= z@%>DN4}TT{7rgdPDK3%U1z`*R#0ugKCqwUrYz2Apj!hIk0$=UJCYnX_N8m$;cv+Qy zIC$bECnGlDn4y|O~0-x&T;4o6MO-AA<$~B51$aslJO0f(9b8FgB2IM9iL*WHvHd@EP$Do2>OgILP){QWUANw)1OyW`OoE?u^l*tC&qX~w+akPQ4;YL|H zOrMcp*c-=Y8WWDFqxIsY@IB-av}@w(gcwrrzd(OzGV$5OZ3v9#xRltHAp7xhJM{Aj z?tgj{r1WbNmy!GE*ml^MaJU}(G!kVm@>P(P*}1g{G+N&nAQDWp&*)Rh!6d(cHb2AX z{Fz^+rRzKw?ysEhQ1)jq_$&C>$$Y~5a?o6ffBwwL#VF$$1b;^K=*eS%GWZhFcTC}i z#cK#20*3xE?}y8tIv-KPk3o@Bsu1F{*X2w+_G%{9BkHg)aS9TqGx42Y)5K%K#2HAK z#l+*D)WlUxoZJE)OjyLkB_d!Ig0)1KPwqhKIs{K6x?;-NKsO-RMYMJrDmhKj!`Kwy z$EMkam`%VBVVNfAVG}g5iqriX^j-f7yN5|B4RJAgogu!0#2*H6 z`L~Ke`bnmI6X@Z*!>K?2>Z$(?^e^P;jT;VQ_5+A|e8RKY%(|um#^}j5IQU(0( zG1b6#iI|#wnT7s{rLZ&jH_@<%!#hr4&FVqE9{>DXe+8aW(j0ou$?OVDkTK=ZvBz*UqZ&uknuUnSZVy9-lvRj5XS7u`tx6qnuh3qOGgaRpT|>Qh7@V4 z|BwDM(6DO!E;gn3Je-}W-XAH&y(noWzXjm$A?1rI)J%}iXNBH42^ple)7}LFaW70* z#KbqH*kch~LiBIqES4d-oaotS9RGv*|q6BD|4!!uO7xN>wfCZ(u(`p~j?^ zh)FF**>gn9rBb5}l;y}Tv5E`(=jPYyOzwq}`>HVaBFX&#bI9819^Mj2ba+VHnKbC`bi|y;=d@LuN z$lJ+rA-9SA)ZvL;Xo%Eq+DqyLIR8Xy6aEINzaY6F#XDSusiP1s@(Se*j;Ui3_cO;V zo_?g{4UQ@E2FJXDf=2Ad;N7IdkaaCxE9aBvkkPt_1;c02P*B18(?Eu)d;Z6mX6Ltf zi|&wu&ZThf`9Eg#druc4FaJ4a>8`O1${FA9b|U^Ok0t z*}r?>Ey9!`&5LXNz6ngE#%D1xuJs4vmHZD_#Cnh~C8a2vm?)byG0HCI$Wv&a28tox z!x&f+UI&IKJMw%HQoAD$KW=};W)L|e&wd>c*qy2^5N41&RX+e}&YddJ``~t}c7li5 ze#);MiY6H3_EX*$>7ftq;R1`-?I)V>pthgv=93+>hFre@wv>A1o6J6QzUTeTPrU#D z*FNN(fPU)F&ok*VG#+kO2=QA8C%l45sUdy?OsViMpi33_8`%zc^?qa1CNEWJ(PZKK zK%FYGXsU3*F+huDJ%R0P4lOJrs}hTr6!Q9FYM7Lgm^#dyxizCmc`fKL z+{9#hDZa9Z;b&;7%>QaA&LMGe4h_ZOmBiHeP@EgcVS! zqUq0HTK24qR(usK$GwcG4=x4GSl*-1A66M79!2sY3AV}mhF0|PnIeAQ(a_u$(L5?Nqx}{V ztw%$dAIGR$VTDF1>q)mjCGR{Xy{1gQhnT9^^sOQP9hvMtUOCxigI;h3^K4-DX!XZwg0B7; zwyVF`O06^;gNC~=&Y#Y-KO3wxzmsWu3^pqNMi%oIgO%mqLK)sL*!cYS5c{ja%JV-@$~O%*E&p_K zdCOokykI3O`?uQ@@a$!&eE&ZnZi!ScB_Iz6hAR6 zPl}(U<&_-8;>s;rRy5N{-9?UmK1m`X2~6u8ebB6>=2y)`lE+v08Nz z$Dvf&Nj@juL&v91@e`Oo8yQcHb385NDE9ImuA zw);I{u35O|2u*fafSa=l$TdlP;}p!oQjmv>RYdpI2D{}K8vNHa)Rc?+{_ z{1&nVQ_u7B$1;!H;ti&r@8`e9)E2sqVCn_OnHN-$$!2C7uA3lI-iUA$WJEYc9TCn$M?Otw&LfVqkaLvXd|}w!CmgQx zSK&2WcSj88aARi715mGjjqmgM&#@<<>i#thmL1OE^*az8S5^uE{hQBY^vxu{@18mw45O{%sXA$@d1HVLIay0^fK%fSJ!`?z*S_)!)lF=g(c#8pE^|*XF z0!JWl69Wqoc#whP5qOG$6A?(9fWR6A4q>1Pf%ynbKavW!KY!0%l(-2|Cn9ai8U#*f zpay|U70_MvYfEw12A<@G5g1XUaEBlwSTDb_6(ph;{yzTw-nT{qkACoE^8UrKwq zDAveNg@hN8Fs}w$IL$5PBcBJw6n?4TD5QDiXS<0XJwgkeB{vp6#u+$v;o_EXHS+pX zX?52dTh&aIbiq)(L0PQqdNJDylrkqK!B_k#pb-(|ruW=SToG>Z!Td7zqucSssd5G+ z^Ph&yZx`mD2J_i+vFZ-#Xg?tSD{AFV>1=-iKJREY!Gk{Mw5Up4maqG_s4SCDL?Llm zaP^4KuIbPJwm&!4V&A8%?`3iLm{7K?@592+DB?+@2=F(u{+GzQow&&Ql=R&%0G}_b z{HKN2cYqt&f1X?R=lwHKgy`{?p!Md)y6daHx4>+xu?>B{h;HX9WRT^`A>ORN(;v^^ zw@CA#891Vg5sYQA4~BibJY2ipgLZM(uD5K5PR+U%t0MYosh0sKfPHWoo9y6v!8j>QC z6bubnE-u8(CW&`02m?tivZTVT*ph+?Nrw(Y`Q%rEBdL+(g{nCU12(_TwdWSFqJmNYWuTEN8 zNb<>%5S*?~aZu=CY9v(x=(GvmyphbiuILn0{IChWi{dMr^G1^Fa966Rs2P?wgke!f zM6xl{Oow+KCMphZptC{+K+6%!qh?zPOl4+^1mHbqp%rB=W5z?)d9%GpgN6Y{LpQQU zYPJ-jERe#a{n=VkaX1=MYi13O4uwLiMpTQWOz?R}5&Fak-}4qz99%yl7>|TwB>)cZ z3&(L-r*=!?r#?LMYr)M}cA(6`~WQEHh$}UnNELyeg3gy{3!b!If5JT`}4}yqLUdoC2lyomd1X;Cb(kWM)IGjKn0m%BG?d950q#d$d^g z>L{0quX71$FekYbjKDG~mj{ZR4nDl6%@_ATuCK|D`;#H+koM|>T&GhMcRF|#qwzIE z>1*J7!nPGx5Sa}gw^Qk;`%(u*<%UPqXI)1)D2PW!O*$${!IVoaP`!|Pz_RJkm*aDc zjt`0Q9$);AsWjALmRk?w#U}Tm)R<#e(c=oG^Dcq<^XR;3hQs3OFLm2?xZ6%625N|r zj^?3TN1;^7=txIwCY)SqtHH?|i!X~>gDSQI38@bu0i`@t8wO8F(<bxN&9od^Uc{?A^)!HL`nY24YW;9Qa+r|F`Ww>Z?${%RR zj@whz?ZbE(cT)W=qabQVEFL25pxdjph1O(xzuFrVP47?=nIBQ@`r@}45$pPqPaYmO zh!Ji>VE}hgw%aI~M1ozs({su+HWJ#jVVRjS#T)2gC^NgO{3GhL`eEJT9yDqqqi#o` zMx9yCdU&?W!1}EJ)PAJvfTLE3c~r`RwVGKVjL|MRHr`NnFqheq>4S&3Z3QnImV_!s zCE*T}4&1goGY#EY40EDW2$naK9F{=KDGNGtc0(U{3-8S}t4m37CU54d=p>w#6q<3Q zDC|@+nii|`9-7?}xMUgCd6=t!Qq#B4cG*qEMi>$GNjg7w0tQbTYctzoBpai1D0B$Z zGG#7%chq%ey3BdtdW>r#ayzbmQ}Llshd6N`tgQ}lvhEL^PL`Fc(}7JHr<1kEpaYyt zN#X-s5muZdv{7}hBAl7%bXGEso(^S<(G|*A-3=*=Iz9^@=c+ZbaA&nZrP`s4HN+Ew z?!2Y{oI_g<(^=DUT3PQLDR3`CU2NJqLR)*J zwotBHo!J1+b4rsx<92O1t@J?ZactE(5k3BS-6cLUipY!Sv-E8v${n-XBvv5dE4_ z25%rYgHMsVp<>HS)IK!6uE(1*ouNk6P&yKBGTICtjy!ht&2`@hi^BC09T|;xm~C;q z8y&TzY1%PS1RbGn;)+vdTj>_AI8!XW$V4}9oe9sOW1TH->~2SrPq6JP4DhWpNeTPx zB)1hK$BXHKp)+fR$#GMf;<`Wz897buh~h4BZtJpljpT5b11;0?6}cN)@@z+FICgB?CW`L9CI^ILmqlIoWa=0wz8xYUaJ}bUCV* zNnx}BvCvzHStMIgR=JoMXzv`aJ$!=naG2)Au${%`BNNwsE_zF}Wcfe0(Of@N7H~d&___DYI7+|vhPni*DU2p-> zObv>4YB1F8k|psjIm~ShJ=jIhV*gaVLd{0+&fzXccx)TQdnRTECPL;1re}`Hwr%KA z`yA#3k(pv<#l@H|l%#i~dua)jfV~KZx#~mErKV%Bjrql>Z{wDLmP7wq9&b6>`{Ve< zJwx)vVXo=hQ_Z==G+k}!_@8YP+2g+HcXs5*5p7g67LRd1no7n-euoY^$04ny6Rk(p z!EvqXmi*>8;>d75*Qp=o2-%~*Ed^R-?gdeyxyJRuFU;PiOgQ_m(dswu0rsk;ACJb( z509?|^!?ZWREWRwP9T5w>^b;<<(lOcA*||d+nVX_nX{^`r`g*}`kIDi%!B_cJGX4< z?ARA=WqVUk&z!2v*0$!%{?P7637y@UITdT`7bD9)OK@l2JA-E7{F~7UJA(gD*%&;Y8x60cqL-$EhK&w@Ix)c^!>x+ zXd%e%60#c*X+&Zu_(+0z8D!Bn0#YPgOci*ajeiI*nK%L|43YQ4fE0<4_#=Q6i4bL7 zFJ(PRBylXF86w$JfE0-kWc4ikX@reL3?+l$A(4p)WqQWKXDxir!sh`g>+2RTg|g&!g>oEEnEvo_Gei9LJP08@Bs@S1T^d!`V?{ymH|El zm`vPhL!vaqh|&N>X@H_MQu@JX&Y?PX1EFA#S@@)d&sxaOjWGQsz+~bZHbizWBZkT) z1iSAFyH|i1`4~zjTS2e~A+q2*E(l9#uA(A_lF2h{9McX#4D~QEq+uwT?6h&DDMt+9 zG)p@@q-7|XJO^ofYL1W()cBKKbyI zAEdw7;(T2K<8K5czgqyu0p1HZ9PmDye!qneSonyAzW`*uMAGn00+L_8g;M~7UN+ba zghm4L{Q$)00!N#zShESK-$d?n|_XszYq}5>m)7)WDWSX zSJLeSl$u$12O#;~4M;ie2V|Fh05E|6LFcp-j{;JH-GJoql8t}G#`Eo%%udh7HD59>xJLXM znIw~2Ejv>x%SWkiN~uK1rNau>YvB$H&jtjyPYJinh$PPg`A&plb+|}e6^k24CP%i9 zI9gb67nrVenoi&2#s`~}a-L05N+T#mP6pjbdz_)fvo=J&Pa=ln2_f;P09g-03;{L6$a z_+FnPq}Yi_!-b(_aIcLcm&?O6hLXVpHjZgmglP;VgNJP#D|R(v2tOOrFq8})vvDl< zTEq}u7t%1444y{Z!#3?vK$i8G#hfgnO^1XHxW49%H zG9+UNWcv#I0xkul z1jZuGwjG1>^>>%z6XTKF9MRy>wskcCLryPk714nECgiwbU>!hxA;N}7uopZ zEWQqqd^Z4^Vi`iQw@R_CK&S*hOiOk<0LlIwK+Z9*wduFm^t%8J8-~EMPMDSyA;zY>f6+jLzgv5UfNas!%4ll10kwJ|i zlI;Pc7b8pt*CO;cgeYV_Hd9&GLO`}mDInv=SUAnX85Yh0B*%q-q+blk{Kr{*sl}@- zej*@UL#>Ukw{We6>j24b10eae*!azW!Rd_YKdz8jk*^#ZaH&$0MLfRy+$i(hW> zD=mICAdO}h;B3Ha0fRHh`8tG{^JYNe_X4tn`vED_V>bOs3!ky^&sqF6K+?Zq@gyGj zA-|M`hX68tqQ$3Jd=?;k!+bz?szo+_xrHYJ1{*2SN`wg4G3FG8PD5xTUOKvSU2LX}pKIYl3mYw5XW?cGI{?Z5 z1`BVp@wZv{u#Nwo#eW8P2KRXqogWt|5|(J!?4MS!Hg*5dbD{6Rp9@h~6@d(@^s z1_%j$_dZ6xNF)e8Dz*Ft5LA8){^I+&68>vRw7u(jU&ppk0^ckk)gU*1xv}eR)*j#n z>_OO1)$LZVD$~>4-PYCH+1+C{Im6vbY)>HEl4-^MB$nq5y)7=SY?tb;WVllaWyFb~ zH$3&|j8Rl8SLlSaht~kvNA>`+Kfejc2K}3b#luX4;*y^YBQHuuqI{ zcR2gRP#2Qod%#GK$YtL;u2<^$7}SoC9e|L1n2@_Agw!)3^+rf-5OUf`sIv=QK`QbTChAxJOWxMG|~6OycGhsZ{{wqBwgh(^XIvBpX+HjaQhRU*i>K zrz;pLl|WyDMDw~p$uxN zDr+{bGHW_s^DRY{Td4Gb?9GtlWSgQnl_DEgf6C=I^O=2XhSc#n0)JO#LQGV4Do{4A z#i+3rX9>*Z75ONg=Fi4eJT+cNn3qCfR0t)`?u^PjyAx_Wm<~L3s=#QL@ScFI15TY{ zBdne%yGPGC2{@s$$JG0O^o*$sPteUlu8hc8+~#1ouk7sT?e1)E&vfg7uRC&M&eVTc zewS?*%!zLZ^{aZqg7YUbQD#n1{3N76%8g-)k}KS+digo0gf|PuaPZZ;KTWVdw5GYB zaQrWqCUUoLV`fWNdsFXz-4np0{`QQ%p|?BJv}G?1tb|V6YKe0+kPeCJPc{=bP02xG z%_Ti}%KEIyAa+w7GsG;sKJ(tbOiyp)_O1+O=CD2|IlLYak5-9I{li=^=fvmcVai@4|E4SX!v`dJGI)oTU8fv6+mZ!*4$Vcw z6Le=THc&ZO$LeDY(el^DBD1_(bAFgzulal4|9g?v01gwy-*h2zdiodYqhIi zt^Ory_eEFpgX%lax;efa)+)P|gMVh59kg0$8)d_PYV8hEKl>N8$hT_;|E6QrKtA&A zw)-cH1pjY)m4ABexM`Y9F2V@U5Iyd4K=y>SfSduW2jn=j0T8nWGw*9Bk_>(!BT7p$|yT2Z`WzgXDa~QhpC` zAt)aMWLZyI_%tALJ|V(BOC%Y5NrZhK2)96f1{kDS+DiyA?<;`Z^mx_ce*okJ{58O6 zf@_+BlPw+m)G3h{q3Y%h@!lsy}Fez*b z8*Q3`h*Owp3QKWiI9JgMDbx)Ht(fjwgiT^Om?j~jlxz~>TBgFVNthTm2@&0uGEKr5 z&BG>faa|KRO@h~K8yam29Uqj3LX>}AG*8P5E)bI-cclD5j75;V;Nxz}%WfWXWadhw z>x5+DKUDE~!4JYMGO+%F%i!@);n`Jl#55O~tuQx*!h~wdsH!#3jQvoPHn8UXKcg-! zRpI{yYGcF~1+rRnhV zO^WI8i%g2?@W+}I)8Utx6w~3CNeVms3KMNQ{E0v))=EjXzPHX$m=0eLgcVwA;W|Ke z_|pMdu@*pf_zpl+%=qAKMAQeLV<|5LWQV^9kY!$C;bnlxX?*bIMAQdg351q>HK6J6 zyAWdDYXR9SZm{@`fb8%$0XiLChC_A^wI%KN*}Woc66s0WBt%%63qkp|4>l?}ARqj8 zlZ3s*+S)-K7Ms+vv&W1a!{OUa@h{U9;mkxGmAak(e}>%f4*c6Q6b^^`n%E6ST>~HQ zeISqLPtW2E;-7f_v_FSW`$MbeiwBbD0L~=!=qAUZRXjPeJ;s#hQNt@;xY&fl zBF$&cefpg!q4C0FB!r#QrM;XNacaanwS)WW5jwC(#!JvPzc%Qi(eOnfY=+mU|6gG@bnrVmN2W9wU+o zKE%Ql6!3}^;F2kMGV$$*?2(X6SL>!6miS3qGBe&}CAkd{Ug@*aKz9-GgBPWN?lCEk zOUgqg&)I#86@rLa!q9 zb->poE%><9WDgK(@C`t=>EA3&j9|84x0IAm#1HNk=?aMiK?n6eLK2Qds0<-$exga0 z*mq_EvXt2t&Ie@aivWWy$j~y#D+rN8-0vY^f8JIgFC)mlZ6dc)a^6CLUQ{sk z?|O;BNkZ0|j^0dncVAcd!U80R1BCJSq5C&E4cgG#)X~z^&FcpkI7~`3AOLr4$666R z6XVrKC`=~OHswzi21{wyq&><)81qL%FQOSuN2YmS0Wv~5$K`;eSOJLMc%}5ldK-Bf zpy@QN3{|t7Gi+K1Aj;V-<@5qsgv6~jaR(s%_Bnv;ofiNm1NP5L7)l<7&=m*;7mLT< zg&@gqWMYEXWA9+d=f&8&5Hg}ORA*x#s(HrrejyCr636in5O#h-R_bBEz4pfAWU|GV z4IKQ*R`iMvd%YPZhX40+KgZhO{`ZW*a&~Tb?RO!XcfY$~R-e&cm=(R*!}Tw#fZSKb zoOGp&Pu6k}WcOx6V$_AdreQ2FGrF)ho9Uk3hYNdkypUYI8x-;0Oe;LbS|bnl9<^4w z+gK-J7^=097lI$N6px1#3^gI;H9*+@dD2by5b=W#NEdulQsiPR-sptr+a)?lL}pGU zCfdwGN+mk@lid0lWm0aE3}upXAIchUqRn<>xkR6U=$Qxw6?6p)85abf6JeGxTHYA4 zl+n0AYXRwou47{2A%t!; zWac^MnEunjvqu=T#%&FZ9RsN5$zd!Sy2zsCa4%|5`hBO9O*)KnUr&^(dP5OqaJ zQy_${jo}mFnut(ur$M1MrXxFB;#)Q*2gCoARw5$~wS*i43ANPdnwvgu5Eb=-EZXe6 z$|K70QJaHyJU^NG(927GPf2LWYNDiL_TkyHJL3z7lEBL-<||Eo*St zE3LJX!O$GQ?nVE>MXXm%Q(*Q02Q|df<0B+ev#OVS?1M^k89w6r-JjLc!T}OxL^E3; z{cDk<6VaXUsf8N=x$3=%jwTWOOb%UdA>s$-_T+6qxZb}9kmi1`p)@CM_Zv!c;`SgA z+StPu?g6C9z6r>Fmc+Z~egl{S z4|WLzasR8A^eUIzA4ec{r|BVjUe5ki+Tgjz^ZR{`O+#LbfY zeT42d$>u?+`y~2lL_cDpcZy1OOLXvGqO7M(%2mSe8I$sqq&x>C*d^L}$q;=^h+bj5 zc@*$f1lc}&n4Sp!P4Xqiii8&naXt_#A!T7H6N5R38D+@iB5S!#oyNGt>qwnpQok(% z&ywiiVPU@rNF^wi8VXaTMj(6j&>NAS@bKy5{qWFU_0~*BFQ2M~3yDvsS>8J!1R<-p zc3c@@ z&gp>3#N!CHAY^8y-3U!aOfMkU|Jwk+3V1dkdex`I+|C2Sj(Pzj6F)}iVv~HcnDnJU z_G)X_pemS@;Qzt3)&MX6j6FZ&(AYKoz8^#17Xv($HJ}CLC{Lf^Liq=n?EvN<6@4vj zol;dhxJO2nJ?((jLu0}-H=2wkwR!kGK5ampnTF)nae|h*x7I4Dhevr7n7ZM$)^ukOLI)?8o_(PSbThuY6F_pWTu!6;pRP z)8vWk#2GnWadTW1=HLv0l*(Ikstnoj;ADmrWMRzS@=P<*;O=-0r446{f&vSgG_DU^drm zT(v#I=2OdvI6YxgRIa^xuj}x7p@g>#ih0|6VPz7%Hu(U&m%d)3pYMXlkikx!lH}4L*8@_#PRIcdtI44pn4d)c56t7^ zGsjK(zsqG<4K9*()s<#sHGc1EAhhONEPTwuXGoL?J}fzY1|&F@o#Z7(`@uERcU}QP z`+m*PenPg8_5fjbNtPK{V&Nfx$ocCXWHX*fB6wA}mz$K2iyxk1Qhp~X(@o0dk}|`j z{8mzC0kIS1MTY3lLUb$;I@2mcyhl2Gt)VdPw+;w}US}wNBowC^itD9X8%)YG@Vh<3I~xn1Nr$E18;QZ6tlcSy>GCgppQa4J1ph>7Cr>X9J@(`O;f4$Q$(;%^oQW7Fb*j4uVGNsYH~Iv^e83_v={*?^Iw{4!!_ zw(4Tl6(Ml;xpcYXOsqCWLN6C^(sMw=m8Rni;-B(y6Yy5$Xkez@&ai z=GqSdVKY7|WOmcyDMRswNd62E&UKyxoC5efAO(04(1^y+XKV~pUINad-vmr1K8;Wk zkK2C^Fa-#~%q4_kAS5pZj1=)(#JE}@BjU-#avM?`0;Bt-4klS`B{$t& zuV}3lr?Qz|Vxh+COx9s`SIA5=DKo`2vy;iZ43s4(QPg-*>u4J9Yq+$@=&20fp7Su- z;s1qxLMbnW4)KkHB&HUF?+Y=5tY*7WEVf)QPs7D1aE-s$?D{;WjD-0AqcgaF((=*F zSo$B{WUW~3dH4Rl&MWs)bD-%ORIF1pfo3M8lR2dBV>0LD?>BLC(!vQA;vkAWF&^Lz zV{Q#(6&g*+kUc&nBd$x*9&7M$OJ53&6TQ0sl2rSa!tB1MxI!J>vfY`cClfE)vL93# z{NN+vfhZsZ+9?wgLHyu#nSKya2HL+AM~;`>Dty}IWkx^C%j_N!p`RmEZ=HxoY{E7kSL%DwguLkWwX7Re$B;Ti8C!H2=i5$YIvnHpd(NJgzzq zQ2sr)SNd|;DYUnN_E!UVrD%*%#!)p+xBW)hX#dH^)eY$MS{-=ANxh8bOeP+-yxlo_ zD0edP&8YYPEp$toTfLuNpwP`hm5&F+)L%BP`Js+zkg(r6ApP&7LcbQuqM5P_1(Rql z3@3G2m?N3^UlF5cLg@p1Qp(81MIOsj*4a?yR(cfmX4KT?+YHQ)Qg3!$BR9AT}Y_d{4y!re^7IX+bjj5$+{4EdmG2A&bCwP;Vs#`o=U)@Rva zGVzR!fiZnE?3CzQ(I;|{5<4e&-R&OdhuvecWfZx$_I`yuVq?s<3#$s|Z@R_)(q;a+ zkU8%>lbq{#LaljJ*vhPwWa1?o!;KW?K~eq3fQZ5Q{TSS7V;nzmX(+4e8mjue+w0Ba z9a5e@($^-sLIG2W)z?b!Dx%ij-Znrfa-9CasdD2j|gD`gC9SY=g_giCN^SdFzYu5 z7@lSeo{CKRdbE$CTD4Y5pPTATSG!Z`&G%7FPV+SwhE=^0Rj3a?Xi~1)y{22WGBe!mQyLb8#ZM26P zzMVV!NZ|iht$7~4?Bo3%Ki~7uomN~fIHEj$ZFvzO)A{4~jpqX@&Tk8Eb#OkP*X!W? zgzroT=cjY0I5}7~%YWs9QeM zvvKwV<C@cN8EId2^9ZvdEypioL2S?DmCkx+}h3{~1zS-?=2S?Dm zHw)jLg+G&pUzmkoV)1N!^K;F7Pe+GMCtij(8Yn$+{}NO1mA(||yluXCfb|F(%KYS@`t5;Jn>1kUsbsSpF`x?WK6w-ZuRjtFP?#qFYvlR z*_-a^&2;so+d9%)ws>oLHqJNV@H-Y>OItUXv~_lP*b47WZ|v*Y?sfES+1S_Gn(1~* zowq35{!KSz+L1?hdA#<{j!otAr>~=@ZBs|4r5uGu?^^{(mYZELU3G_`C`S9f=J zc2{<`WO~vdT3cP)n1+thX4@xi-`-)L9PrFDyA6HK&6%DauO8K2CX%IVdaAc{^=|iC zGRZf(o7w|G_6Yila2(+!Okjn(Nj9cY23=FOQFNZ8rc+}X#sczC^YyL)=$lvSD5 zroQ%Gud=VZ8;>7_4FuZEwqC1ls}V{zLt7?Y-L$pL!^P4o|;;z zJTLI3SJu>4SJzgquBxd$A-%dIgTvFVWo^A4xuwmQS|Tgx_4=B+d();J*)aHs&ROj{ zGTog$!mO^MzNYb%bZuux#%pTXm_94hjW4~V)4grYXU42){$dnBYoRfi#_sBdQv2{o zO6BIJ?&Y1`Tbg>kjcvVMVBN1!ucfnZV|#|?tWAZtoAeIYh5|w|LvqO&fb`m)n8{>E13P zs&S?pn;f7RVbizMulJew1ckv+Y=v!23Gn&%rwhQ1n`noH(w5-f@ps%!} zrrRvs?p4=T)vc~U|EsUAs5<53ike2)k#tY5c}q(j%m6Mavjs|lW9mRxNQ-N8*v~(D zQNKFk^Nel1+flEkZEf)`+kwwE_Ih(RcW%kd+0q6{xi>whsdr0eQ`3U^ee?M!Pg+$g zr(#FVTQC>@&8h3|JOeJL2iZE>(v`K9)b*UQm?p7$hRyv8R%+)O|{TnmQ zR->y+Q>~)wy58=%i&@^+-tH~i4l8ej3-4$NOYMm)peMt2Y)@~Y8=5zFZcA62)s-Cp zwuuh4T4~b5WQE@7&UFWkXLW{#kNyR9e$h=xjoH{F^Y>U~OA>Z(mcp8NSn0e`xg{8<$N4W9;gL-E0@f=nPlzfToso zJqzZegF60(&)wQOu>Erwowgp-i!ZscLt$PcE>gW?G-xeaXwQusJ6FJHaY4&HUEoNM?{;)7{$6%cMQlnhU5rw%f-!yJ2H1W|aq zcS7x&^2+jsvyYy=AeW|=_4P!ZnBxsx2R}W`<_nv@rlYmfGoF_pIWw*S#h5OOp0$y^ zOy+^!mZr82I=-HCE395xGA*ZvWFl5&J9V$e)@$rEsGW=1Q5|P{HE=82#E7aI)+}p0 zrLH<%*$_&^NnK;68x9-xB%UG{Q6r|3U7IodRl=&g#!eWQX(KJBZHE~}m-ltZG_|Q6 z6FW{cWHxP>mGy%>?T259*520J2JgU9MELNN&*?}K z5ybYRNR)=YjlF0B4)V+yk*6yvR}CyiWkp?$x2mb54`UcyNv1p0@LpwD0b9eA(3Dl# zP+3QDr8Q%E*h{(eeBIm4oSup`>O<*Jhh!73wVe%JnP#Z68Dnv8XEXfdT8t~5-8EH) zcV&&^j6y32D>0x2mkM%g*L z(kiS@+BmFsWZIp&*$ya^K-*s;aR+Yk>fX&L7vmW9TN!J&0X5F<3FE{a&n=v(8XH+n zMi`^Hwyo{kvhTJId;99HRa^jCKB{!jb{(&wy=iMEv>~wOz$ntvz|p|k3fW#D<~y`! z=JGq$+b}igfw`j(Yjr9cLP5k4DQ4#N+P65DG5srzp|(fXjTI|bE~}_~x2$6^%w{!$ z|13^npohJ>5a`pAM1pf29xdS_ zo6V9}riRY`4bDPl(lwtZq)`)DHd~cnwHq(1nXZM-v*i0GD6e7#8 z=%6{Oo@M-AR&n8+Mf8tGs_D=+_pmsZMKYe>Nv~?_K&ycbk$Rac*Ysw#q$7Kx*>-M% zMYf9o=+GcFlwv$A7)`+)sW8ECtFBvJ-nBls3N5)a~dm+1>-vsqcUW&PMvVm2)l^1&(*E1Se1lw8O21_ z*=toMlN6POjpMd13c6KJ*8cPNxU(=y3N~r#OO(sqi*pi+kp(T z9C{Wlv+{2Dp<<-+)MzA_X*c!*YC_DpTKB}(^uS?hh3V?WaKHzi%VK6#TZgXXYK?0d z*k3pNY-eAOnTbW!ukBoe@r@I(OiRSm*v0bprcFkzVow9sG_H^yjCI|cu#I8Zu@-Dz z>%-(D>D)r%rg3lPqX$U&}qiL!xa9VV9f4&O@4*i?X_=*O8Mgq!7NA-OB1nDp5B!ZKIf)9-#fjj|mpZ zwNDdJ32YW?3L2Y^OI{aAxN(c~Hl|2AL!YaLm=bVb)pE#Ib6B9UU13wvjv<*h6{S~Ju9Pli zE3QXSj=fq5wNPY}tuV!5P&tgvwT^h}sMh;aERLiWo=VAzsV-uLMYW2jI||W!@fPo2 zwrUq;Z47mwnb}9N9h-)L;o*V0hrRV;&1d9^Dj~kXnW@F4kCmd%BDNpqNTKQKc2;5? zP>0bl(<|Hf4yA3zI3ulLOyAT_R8K8|yJ8g^F@b@tpM`@J9vp>&$D7zu=9=oto2O-rclC7de%iGtFm8hA2NgWwt@ak6y#k z(B%{suS)Y_A+L2`TEjx9*!C4b42U(Y$Zsy0)&2?e4bteU2r}qWo!Vt5#Q4 zTbC%FQ1CUFrZW)>B%G#8u)Z1x*R8D)jT}Fdh+Au%V!J(xc8<*C!gq5A$ zsIp{vX&1vzPq6EQc5Yd=>euU)i%lG*082Qr3I$tatdvBhh^1hTtj&G zWZpdNf7*K}^X7-5h+voxgeo-?VV1I@sb_U_GZ%SL$+oQi8LZSbJ$4%iOR2C7Tmcbh zV%Tu@yF6>|i@t5GMf=^pyAfI=6k7WR&vLqYxsg^?-B4LyQ`fkI=irQuvE_0=gOzSq6E0J9cGu(dmK!-$ z4Vct7Z^p!SOBZGxa`YI^c+|pB`&t~@M`EpRl~OBOVTuwmJuPC71Mq?CXk^)2M>FiA z^7tNK8h1ZIa>p9+jCyiYP*QQ`Q5mvYq#k83324kc#O%97~rkey%IJ>9+O)^r36YvBiln!V-K6^(1^ao?$W zrS-XP?+#1G3JvpAnM~toiNl+fLbp~e8o4;_Eylmd`b%nWdn4LYXmPSB0>?wzbfW6;I4*jtU2s#0g?FRZ$&jz z0?eK4b{uIX&W%8uIqaO=5Zg>Ar1mz8z5a$1SnG%*t;AbC*0?lJSBFw2cLidNu)U*s zv&>RlQc59bEEwH+Am9jSSJhUTI$L)L;)-_-MpcTtR>q~;YV zv9@dM+_VX2@MtW~ru)&EMxjy0Ot=wtzyU65`^dxFHjXPeEZEGsaWf0^b*J)Xcrf)+ zA?$cyn{{tJE_@X^ISPV~)VFc3BM8UycpqhE{FA$uk!XU_YiSks%GKtFH|H_lG~KcgjUZioa*I22)R4ffoN8*!$9kc;etM&!^8jwOt`_yTTiA;<8H zfYOq-r_%#PEZE{!5n6L7wF`IdwwnViww;rc2PMXQI&d7&+|-4`Oq@pJT)@e5U z9OjkX7)mnBcugB-Y3x(Vs$Jb!vmAp1Ps61yuKc;J+hNNJ%GSVOIv(uQ`g z*H)oMBX4TFq-jT|Wc5yIT%v~4W{NO(8<~a{l>wzd31`a9H`!ZpxaH_LPHGn}Y*Nuq zl+}G&H5!(Kb{oiY>|D>>AM{#fzusYKn#eW{oo?j)cmiM>*BlPm&Hq|^L9C{wJtKP= zxFf}}mh^V)F_f~0q8kZ%98oK?(807E_{CdJ3qZ@kM$E+;v7R2&6CyB7fYa zXoa-*iohCaYAMpPU=hXf2#m8u8-@{*`NLncGs(2Kuo1)FMaT zH9aa#MkZM#v@)myqpTvx$=yv|aQ*1F5vf@b#R`z=Qq(;nTFl2Iai#g>?goVHAxDa> zB4MY^2o+Aw-MmQR9U0__HG{0XRyD+JH!41drMqnlrfn^_T7?X;>g1|*ZcAp)tnrWq zEb#c=q<*?};_R3s;KqR#%y?@p$rT7F9_Oa-)Tcb}Y?!Iczx=nVsFxHPOafen_7+C2Ml;l^BvHI6MukA9!ILy<5T<_CyXTyLS|!=NAE7r4-I%zS zFicSsS0lNFr7_zQWUDV16=rzG>g^PurX_Cw)?CAeh-^07b&6oNI6ITVh^FVaqAVl3 zrHPK*%_wHBTwwJQwU?pC-6Cfn+r)+PWYnL8X3iFtGYH-JHr>QFt0`-3^9pRDVM2jz zChI$@+vQs8;N}G)MBEQ+t6KvTPt(xX#j7frmen;?a8T6b~AQ3R%7~wmW0+eE>BB_sTqnMbY?X=Z#AyD;r>mmB$~S+b)2}e z+3OhmzuWsBFguI#-Z^JO8Z=O#=tC*Q7$YLZy_?MvHi9W3Bqk6sO)y3YoSfZrHoLHU z&U((-n9vqhiZLQZWW79;ONmlSxjg>iQktu+4-e4FO|AGKUM=OZ6mO|eFZw`5OIup{ z`_0Vz%{%j*v+Po`#e4hhGdu6Ud1vOGcmAC3&kXPE{Fl|WN~1nfS#7^Y#ixeW(&XUI z#|%rYCO7O4C@S? zj=RrbCss4x3{MqCrV50)1I>I>n<~_&0J)2_J1pJF5$4V`sT^s2_g0s&Zb{GOOxJoBpD! z5bbjyqjPMcizJc6%1#B7sXWYdeXckuGFi;R3R19}zF4dSStP~C0UwGml zm^<4PCa-p2sxTPT&NEj&Qpk!s-^5%fy+bK|9M<^>0?6A7lTuPc^3w>g5+h0!&4QBf zUjPoD$=rx=!Q#$cMD9q?`VgS~>B6K?4avtL6wCl4N@(rJdKyx_U8U;vWYu!qLg*%& zdRbQCuL1uyLcwlsV)NwAK})a$gjkO74vWWqZ6Roj5!kMbPey=qFzR<8qca`I=qv{^ zy4!(_xG@px^EIh2@q?B<%;=jI91 zY{4uo_jdZUB@HvW$$~X06}jVmx0dSg-$3$tAh9DeUSZi~M%x|8$R!$< zvJkByi2oA4+u}Q>3gs}q{s6RXuXoBBziix_RhjxYcjZF3-_?FckHW2g6`pf|Mrd?+~9>KbNri3Q6IL@W@RND`^m`YDRt z1#U7a2wC+{X1)Lwr=b}yM38BX@Dk5syj1ZB-|l&gzi4^RHwZszaW_2@ejY*3w#@fO z)&M>G8NbfTyY$T0<>hd~clz}0blrfOI?MN3%R6(Ig1NJ4ZxM1@f}na{H_+agbQPT7 zqX>{<^nDBN5SQ2u^fCn2W-sEqEqj>J{T9q71}(`H4_J1Y(L)x@JXcHJ3)YiPQnF+T zR$+58aqN_?szcG|5m>r^MZ6Hn2roh0=V8X&D=l3!>a^6s^j&7bDywL*Pt2IgWKe6b zI9{?W@@bUcNfpv6%{L#MDqI-)YFfrTKb24Mc!khquD&8$Y0Nj5OcgHGnWc$iJQO+} z?7GY~KNenQ7$GFgX;a2y>uge{wNwR))O1Fqyz@;w%Sb~D9~yolu$gDBUmUQaxrY0Z z*((xL#50uj<6$}P3MqejTr$za%zU$Ls_=o(!YI|J@H@+0ZJ58Mn6XLoju>mkVu5RF zd!>r=c&a*y%Rjvr|WeV;@zgo$3 zlE0d}z}c&4f{YqnUR6-?T4?l&{k24uvgkGxTEWx>g!BKiz!=y&AtKUFTk4r9E@{<_ zG#gNo=ZAuLWK8)XT|B&|omS+EW-oqfxC<_t!HOmz#`9EXjEkUNL(gUn-d?KFzzmqP7ZG4D0b&80kDm<2PBO~<58t*0wI(_TLdcM9{b zlrmq7nGP*+A4uIO#Y2ASLNm6S$Q^F>ntf);;V&)8Y7jCPsZV|} z*1q09!^?#kST$H99kF9;%+yQrR*k(o ze2fRVnKimHrvgQbA}NqPkLQ}D^(K9RrMogM1iV$@gm){PFpoS++vx@9*=*^q4uqXt zTqnvc0*{W%_*?|oyoQLX0ZI<4B^HCzZMnlYA-dUtQempth9FfV+)%idON&U^=*G@Q z5J*(Hw;}C?#I;sx_;y5hI8ZW@SPCS##HsCOiw8ZiZC`_fL|P=+I=tH?^-#8+mXtkd zSAH!CW^U_OHb2jFDHadN?Mkc)uRy6s!Hftfak>giagl4QEh~XY9eP8>%coAIJtT&j zeg!Bdm|H_huBjnXT;zV1OUDs^Ar7=d9gaoxMh8mG$o+yFDjChU+!01RG*5Z{z2F|S zf;+#F3GSpuC%98IK9C6xP|#R41B~V&;O);JN+QCN>cK2kHK?zOWWiKLP?a)pv;O%y zWZ^3-30S;7gtU_h9WTd`eItT;(d#6iid};2y_UU$(LM(R3-K2`P;I1c9=qM(cxA#|CmuGmkY*U=fR5IO;# zv#6d&iVA62>REyy#U{Me;%=RJ65x{+ehT1I72XZFN8ysc=wlK375|-pStQ9{>iGVaQNBshwWj{^`4RK`wp=FVJVIH!e>|AJaSC zJ;|@2<3)(*QyscsNiiL{FlP>q9#9(Ld}h+cG{WHRp!`1y&z z#Eg$Y!28aBR-Clpu|T1N(a8vuVtke(ixQGf^=zT7$ctSG($^7GGw;olJ_pjlSc-`r zMbI^T5;$wArtvnU1CXErFi97d;viXfnC&&$Y&tU0Wft-HO#NMl|3+MlNwp%%=o}G?__d>!Zg&dK>{Q zb`UKlR|_@WhoJ3sCGe{dl)Xe;Dj)FnFYMywdl8YiV2{of%*F+?Ey97&`a;vN&}OE% z)B7b_qlTx^uEjL`??{q2V%+lSx)xg7AM!bJzuQ4YUUL_~ejv)OZXPUE2M zvMI8A4Mdq*r4;>YVpHR=aP!k>Y00EY0umDKMopIq;yert4~K0JmzJ!Ie32e5paJgqNID#(~D+bHW&#n zmF?u@$Y;K!;W^;Ps(c9Z?Cvz}DWI)Kz?Z-;?I&=q6>{rD!siQ(PSilU&Rux< zlE=eNkehyCnl3&=t!O6k{ZV}7>(+jug`pDPWV@>qtoT{$>ycl> zBHLvq!|z!&u?t^MuR?phxqQK=3vlL>@TQ#*CGJ%Df;~`Pq-@+}c89!$Q^X5<=>@}G zk<#*pn^~i!_gF=5(OjMxO=zko7t9BQDzP?=8fH3>B~_c%M7ykuW>>B_FJt%AiQ9J) zRVUo8dQOTZao()$)#T;cFZj`P*=Q2-n7J&{=j@=WAS&C5b@Ie^MQWdZW){txBKE{| zu#__A=b<#ect)0VZL6PuH2U(zO0$cLJ#BVjdePI8h9!Ag457c0DeBd>t=~nqeG8~2gO6>9Vk#%p-ynS!ngPH_SANjP8}mMLWD@} zoth*a=TprgeLC&LV~)t7v@=*Nr>zs~4!ZVbi;$U(`7_g-pTXNN-qYXGoot9X@n@o( zY6YSezRKF!l1;A&wu0(@!#st%K5vIOHs#_u^=AN-Gwa{u$kdu>m0{y|t#i^ z`>@HO$=GPnZgUOMzs-q4sO69O{RAF%+crT0<&s+z@Zfu>MW6Iq*+2VJ34qUZa zjr+lI$cTxsKPI+1gzS1x@F(x?7LxZWDUVMQ_1#7eLyG?pp0*T^KkyVrb8~&l zdA&Pll_v@4UgY;T4ZDsW1yf{0klQG}l%8kf}hfXbysM z47%9Mn%|Bea>g0`xm}xl&(q~7Goa=Igra%u9Nc}J&UPF+sd7g7P%q0+G-sZNTgmXh zj^+O_#KI9@e+bMKJR85Vk>)<|+)%(xncbOO?$E5i0cX0Cr;2DT;WI7TGk#2dGSe0;v!86Q0~!}v#+7;Af7D=>Rp(;Q%lX!bXLz^IoUdiRpQL;8y> ztGFAYY~J0@*oLi|h~jb%cpoU@k^oWlQ*n=PEe4m4%_VM-_7s^jbG2b^U$DAAbRlv( zY#QAiyXWFgruyZMrsD0H_Gh+Si0ZMm?7V1)&FJtMH@&FsiYU59>Pkui_hsph*tm`QG=c?yh-INiW;jIUa1=<7W_XXxJnBh%brtb7VGTprlE zdkq|`kAqDzdb)e@hdfiS_>ksmko~bGKSl?SO&YD>P-XJ~LeU%tBV9J#DAUmeW<5fW zqNHc&K9A++^wTcSGwP5;eb;nwCBXQAO-^AvI(=9UxAeyZ@q~uxK$fP4a zlD07C7M3H|!aKppv~*};?x5S|c!m2t*_|%r_7<1(Ee28VaF#=IfW;q1OqVbm^iaw* zJQPJ1V$ccx9MiFY1=)k^K|{?MPx*)rPh4M42*U+t;0hj)Hx0C@OR`KB0l8- zIhq?GQ#2<|;>#zDsd}J@7D)pTota0>sIotY0=KK|$2>jfIvh1J%^h6l?;ztg>`wbk z5tVeD>}TMcGm;ff#|&=H9PN4^j&s-rR(zzx?U^pwx;&dCFMxx&oO9cd|4GJbyC?n4 za5tAyvDIk~f1UB$9ip%d^OQ>+xGM2)X6)SN>O~B1-d53m?-xXLrR!T6Bi+7z4aOL! z%5hYpw=PJ>Dkm8AJvYh!<+Wjwca*iCOey~(M>!FT8d(~+R3Fb#ev+e<@uNCU^-zwo z^7wnV37z{-a>GfvxQ{qTI0o(k&cKbo8Muo#19$FbI1>KBu*ip# z5HqYp+c9kQVHmMogs)S$(9@VQclq$Jk|#Wb_GGxuhwBkDaQkM4n|-(qF$4E&X5hxj z4BR4_fm;$YaHnAg?*A(nVeaY6u+azZ)62kJX5}Kxon9I4@!>JV4E<uR~)2 z_AUE~Xb1J=@$;S8UQEO9Wcc|EzXpV-Ign^$^q!(%T`0$|O6aKmnk053^{#X~TLp717h%4s#=tkpTcn%b<;h-;{}^uusi?}(_N_!OzbS-b`j1t1=peD69Y9IJ)7YpxKk>; z^1uKN2NrCUN51=1Lp-il5TzW?VT20B_8z+6KHC`^{+A$$MGf8~Brs{Nc@tJQg#ASx zuQwwQ#=^l~pT_?e7I_2_7C`oT8~$_QKz-*!-(%3XSCoJz;He4*Xub=%?Qi8f=kCI4 z8D|S%HHKiz=E$ahEe@a{(_f;GPqYLk>xgqPLWnZO138lW{CkaAsb)~o@xesy`xhJY zd)I^LFOeGpE-+c2c+QyDFY!W(*HSRKH~d1ud>6k`yyCL3QMZ~TVAe* zLbzHt7R(Lraxni>2g8j%Mr5zoeWzf44);jqlDvKw1cAvr8b7#>#%L;+@csYK3M3^=&Wb1$6& zyif7j|HAd$OH3V`2uP{|KyQ5 zg3}LqND%WN{{Z66XdjLR#1A5VT;Y!ae>ZTKzF?jNz5zH}u7JNEA--Md2g%%~@P)u{ zRrqnh$5j4HfnN!HvDMdQmIEJE{Ih|NtMumsuPOXO;Fl`-OMqXZ@XLTVfYZlWzmEgI z80DYz_-BCsK;i!rxLkA5zF$Rt16iI$^Ot~kDEyfWW?wz@{#Il|`)e-pJ7$jad)pl6 zcg7s&_ue_qZ`&N_H!#QfHId(UPLv)|G#>%}xWcak{;a}p0lqL>w-wD7fd8xF-v|7i zivLaEy$b(7!21>cW8jx4ybF``CWXHN_)itSR88V@(SLj9IKNeMoZsd-&aXPh`R$tH z{60Cy`SArRx#prj+%w1d-8aYiJu=7nJwC_zJv+zwEmS{&=E6Tuoa6jXo#Xt@nB)95 z&vAYObDZDA9Ot)pj`QPVWj>AL@AhNxEBCX&YyLOaV&I=o@Gk@ZJbq8|PQ%goJ^3dI z{~N&hRFHQbsPB2;e5%KLe#DPB%-t!+_74_+BXHgy!7|V4TLPR94-0wj#YLH=3byCHv$mwyrXPyPCr{KH`zJ{|qK=XV2M z;q6WS*}$JT0k8Ua{&|#F`ZojTUHR>vZ=cNKslX$?ydMLfPcdqqe>-sAX_xl+B5+;) zKL*aH%3|O9f%6H)ZlC@k;C#w+kH>!moKHut_V|&wCB>)2H+lR-;G&=Pc?WPlh35Sk z+VfoCd?Erh7Ow*5Qw6EdF5v5Mua?(Q_`SauxagxlehN6BMAKiW@6LpO0Qd^DH!tRY zFL1e7$N!ti|3kuGgucM1J*yx~{r$jo`FK%UbyoOR?lw& z5AFHfOCP1YYX46G|KG()NVEK1=Dz{g`Tc%^{{e75{oaQ*WO?rgei!V$80m@s8SqDx z|M84pKE3Jj{J#Y*7wz*p^i^)k!XmLhy&X88-k%Jd`j!LVhWd&Bz6&^?YHdaW@;3nI zQz^F368tX%m-?~&hJnk){B8iwr~0=5X8O+(SLOZhzz?82lx2Ai0N3_-0QfWDF~6hn z|J%U%1_8Sa^?fgq{~_=`=tq-S{!bHr5w?`_GyTyDXMIiquJb<)INwCz{Yc861(OXnt^&@dutT1IGjOf{ z4yK3yV+gb94*=&qR9;N~Rp6Wh76YgLhk&y_(q7*Iz8>u*{rL&t`;<9I91_@GZw9W*dn$0gB?FV&@~i;Pw}51RIup2V&n>{e4tue@ z><>f0IR|w6^ey0go90xHUkhBW#TZY28~7%a$Mu&k^LxPgG*DS0e&6i z?}Jj>?}xzIU&Veu0nWFTmUw;vj})}NBNF@l zzFm#~{|H>$_gMG}-)gELPulNIz@PX1h5ctK`RMPLd44Z&xmf4{7f%@3-B8)?8eV80_W3w(f1(mBT=4hUjAFa=R>*J z>wCbZ{On&(0oV5VF>t9r%Xc{1R`cHgoNv3ey#8NG_-_Ml;IF(mKJ@{AP}T2O68ZCh z-wD}O2%HZF6MmgI>c@-a-3|PIDSi8Z->dpNUrTM(w^SP=<Y>M^>8J#8?UMHZ;gv-b=Ju z8mdp!D#Vu)4_Z&pSE+OkUzEtz%aOweDowOnH|j7rS}iw9c%j1Onb1b-_3`Y5;w`O4 zwLDf@y>)Xx5@)X&dmJY8U$Tr=8zKZ^_92nb+`FrI!?;!{H!66AnaXxmYb_QD2`(r% zF9n283+yY$P8@_%X>4M2cw~9W7AnJWA)1LNMETs9^*cF z5U5pmQb9!MjR>*QW}=k1SK4gV$KiAJop^(UpC#B24I3!De__|#%6;AxH-`N>C9W|P z#Dw>ho6Rk)dIO&zCJemQ9#ial!ZB$*yi6Kl)5v%=ZckE#OUbx_R@W+x`bcH<;2`=F zdV$qUG1M)T+!LhfJSx@jXj%y&OBFo6sevzUstuh{sFRo3(i#~Z-7qHR@YLqW&KjC; zS9K7kD)q7{1@1TH%0TJE7-Xt}y3DNIy7v4FN*n}yJGlm$Xp~zc_1chKU6kHFz_zcI2J1EW%(5OQ*Bl=mX)OmFdY3nys)PP~NGw+>wa_8P>wL*d1{$05 z;21h*)xOlFRBWl%DrfIO6R8$yUj?yK_5pTgxzeV_E|j!6F+lSK59l+k9==1CQ7~v{ zTHcQ@*sIjlYSc&ZDT5vFHm(f<;ul#q_9GwjzUDx$n+rL3LHB@dT(~d4)C}$2#HRv{ z>SzfgQx#V2sf>@f28Q>o;Xu3^?o6+@A9(5(TsJz=9EM`P1&6@~>S3c$i4|>KxP~4O zWH9HHN~6{0P;c6U6si~)m>qo3?i3NR&#Q-|+=wyfE*0beYPVL0Dh9juP* zLQfGLu2L9DS`!$z&`qICdqPwPwi29?D+54q6cjXTrCxGF<(r%zNkI>9dQ)%?ixtvs zrRSe!@F^)K@j+KqQ>l)^lDi?{W)*F0KM94}st?4xAA;h(EYm(J-eE_L^WE6s291eU zlcgQm1!rWQzEoH|>J*A0}R=o_0UXuW=R>vFlG2gI5@cdSDq&ehQ zWaH%)I!h>5vrRGRDeoOxXJ6^e8T*`(CWg4UpY*cA*40>iJGP^HLb5zCT8%p>j9VKV zXBVk{D00_Ib*MZsYCTleArSJdep&#ro>ODonu$gO>!8s+TdJc&o9dXR(3i*;hb)yi zrO61owpJOhb2f^J(A=Zex3-QnS`+0_H}aJ@fM+fV8DHBzKW|R71`Wr*-T5}M6PK;1A9`hm!f-S( zz8&j4Ujy>f{ z#rIddQXGv&97?4R>*ibmx-;SGFbKx8%BC=_WIB3R=8ck=0!^oyUL1iQnvKaAliYf< zv~FY+{URHqHsI@56bysr;H73G7BdqVihZ9iRq5)Og!OdNAF78RF38#rT=0x)-lk{6 zvo6Jq-73`Wt)#30tab}TIU zDo88$=?OxOds!P|kwo`a^CkAI@dJsQu3A0yT|B-IteM%P$Yqb4k<|QC6rJ@FCr-V9w+>P@|oKN7~g)^`+&JkGok>g=tPPY~3 zW}KBc%W;Vs;wha{D4QZ^7_JLJ<>5*cZ5m5cX#@>{WGZT9D0QVtxOSsEaYlfj z2EAM=kST~lqrwj!yZE8!O)Zf+g1?Wc=^(eZtq)o{V=(kyY=jzsp zv4ihi+h*+!r0BG@^VTj~yKWu6ugvqXXq_9I+a~zVa6X529{%d^eGiK^;Pt3#UzP7+ z?((YBSN)PGpM<4Tq;!@~+IC-QZdvXyPgT|0s?p%}@RSB`3-1fmp>x|;?Nu>bqqmOS zI>MK0&#G=QZQA#O6~ASFo{Q_`ISSqw^E9R#^=b#1=L<5={mAJ_ndcsvX9whYO>n#x zl_Zzsm!y^ymZX&=&saHONl8YD^IVz7wbr?|;hF|(IEvxr!R5g(1(%0LZK`m(&S;yG zoE7+W1(yXM3@!^V3#(f5f3e_4csc~f-EmadtC}1LDLJ?DacX|+#Uy(*kV&d6on zT{omQS`Ttp+#nrl@RRc{xj}Bs+gjCnOTv}#q&phhs}CGoEOWi*2K^iD-F1W9XwT_7 zs%^Nlqj%k%L#iE~d?d}q`q*h$tg}BaHHn;zPhL} zxl4%^u*PS+Yy=2|N{H0@)X=w0=d3vKmy-~qAay2-uq8<*$hFSz$OU5&IdS7R;a z5N&Z>if~O8F}V>H=PANmh9;Iq zcC23SDfjI8A~bT@RXv|q1A{8_1HxVQs#PzqUAgK|>FMB?kXJ=Ag_I{#@WC>V^PJ8} zp|Xk;a6Ws}j&$Vr9jqiX9buD-Km$tf;9-cD+X% zUsx5}O!_eHiyGHO*CE$l*ACYv*GgB8E6Fv%HOLiX=;@ovca-lfKU99KT<_cA71zXL z4?dQ-E4D-RbDn2r9GuY7#dYm`uox{fEV=l>wXt#DQk-jIJ61PHHn|%m3wM*`kn*D_ z%@Le$(;KB9m401%we+vzC9xSJjE8eB#igzfa;%zEMdpSa-=h3Dp+}Gxgl^rVETehQY6I$Q= znA)-*d&geIV-=56=c2z6_lsZfE8IVvTIVW_Jbm>PT5b(mEyn8dLFE(5lge|-SC-!x z4gW}YuXsQd$CP<~73YF~2@fg$Ao{b)ab2cHjl7mv`K@@P{zrH0iFz$+k7q&jqAo>U zTwPiUdu3~ToZWloSacgV_Z?vgwG63#Q>?0Abw_dI3QMEvBgJ<25%IEkLR6sS-v%Y$ zJ-@_AFB9v&$;ic_M!#lJnjs;x0Yf0*Q1d8+t_a!=+lE^AcG z261bxtW!tC2dCE7XzmBk2=|6F2{P6AQ|u4-$T26Jo>eE>Y>(U?wY}~3_S@TSAGCeo zc6$|DZ4y%)n^?U&<~h%v;McnSna~=^cw-)Ox3Mcs!I;@n6>ot2VAeJ;s^~5ug6#g_Yj!3laM+Wp~Z>yw&0#0jX2(o3QbGx#wB*kdDExPy1p* zSh3T!S*}<%YelgM)hrFF3=A%-cm(zPu-3%Asq4mOC9#96WgMnmpWrUulvEOX_-aV` zV_L2DL(ta!zKl_StG21J-TTL5nw!1XFw!NtP59mK7KrX4_gX~vlP`*5N@uo1mFJ>^pJ4ERvB!~Kh14^Ul6zA_r$Bxa%f~`bp%>bELu_RNcMV*zX!Z0 z#PjZKA4HBTrN;&T!ebLWPQAh7^Ix#XN<C-;2=5Mb*hDWjD0QtmhFUNTw&J|+T$pCj5TK0Kg z%XXIRNGhw?rrEx@aYWR|n^WjD!R7D1eDdWNz8G@w}XII?uDFR^p-|8t6o=f^^0{yd%rwzK6J|^xyA{LdG}a( zY)5ZJ>=3Uj_I!0ycl4LBo^QYPdRn-Pz$=Ok^A^XhtG2q&UGSoheveoL1|&h&V^p3g++=4%xfDtN`-A*N5vFKAa6(5^0OYnpDcg;gIA5uWbu zl*WrJpI&uhMYC~^SOo3XPY}p`W(0UMz6Qt*6Sj8 zz3AWedTUG%XcAM~>&er} zy|rjtWXDVQ6rC^nwWv$cx|mJ5t7F4{O0CKW&InFku`PUC`)%Qwo!i8QcsFA_FZXod zwH8MH2}ykC8{Kq}?fB)PRfAV1bgnv88X4yePHMYZG~M}Q5wx8iV_$l4}pe?B2b&iQ_{={`oQJnR0v2B+gi`tAC$R{KNB&te|?8s}FSyOTXbJt3!@ zuG6$}rL*ERESw?S*HoO5sMLo%QtBal)tBENzgS{WG`1=ibizrTcxbgTZdp2eM5>uTJQ5wHJNp*0kFHoo?(v|m!wPTDW2 zX@l!&S}Xl6hMZ%`oZ8skvnl!b*Xkl!m$oJR>5=1(_8pn?c|~0gYO{*cRQ>|TE{+isda3wHxg@#)`z3r9U!^r z?ug&tAa{719xit~d$;x$_jY(g58DyXuP}Olt!;~3jzI;xMk`QF!wyqq<6Kzd#)iRE?xI<+BaT+!~>lQPUqyaU#$ z>daMV#kcU`TbYhy{GG23&Y=$0z%PgQad!xE3SYu4%DJ?tGj<1{&2pZPKESF2C8@cF zu>^ed*e{9K{UvC3+^$x+oilh9>Vya1B0k?~k)8(zl-pcCm3ST~S$}3jNfPelPm0Ey zd6hBVlXB)P)(y!O)9I|si94V(RTpz7Bwfsnj=^k;Ikw~MK@&80#NC4?bgdXrAvUkV zJ$~HPBzR6@fjb$oc~(qFN}AC6!~ua_g6jV8!>_rnXnWDaCz#g9 zz-ZKG%1^a&jC)vjUXrEN$HKe5Xo;A-UtNZ>l*c}Y==yDyRh-qvA{MvqeL2+>Pj9YmrN>;SaNo!~3gHzzCO?HS`8;jPEkpk(LyrzQ$9MQ)o%NoyA2UIuN8I6^cHuEsCIU9c+1@V-NoIo zljSY}wa&eqW26=Jb$Ck*(PE2S&kwA7WZkpt4z1(Jbd2d6GY0Fe2;fIVe0v>j!2RK# z_OG>PjnW7Ccb)uQFMrvN9?cg|OxANkuHy|kndL0ysE(Js;+mh2#iG|n;4H(*J-Gjd zt{WcRuxSJ1(oOukPX4aPufH}|pWwCr3R7!e9_J0UwFI@Ux5jN7N;kYGK0F@e)0$|| zN`r-D=)HNIXH$P<2XDS6Hh4~nJIdEroxfU)R=jR)iD%>5_XJj19_xux%z5t#D=-0f z1P%cH^>hEMjD1IEYj9U%wD$6~UpKi4GzQNv)REjy9N1~r+! z5+0rOm7d(a^VqARUxq>mgTZ4U)jPNDlrQxq%4RY@fP7TiwUll&8THi~1x$0`wql4_; z7mig_l?L0r+uC0U-hzELd)0@>?bW;%3Oru#u=f67?=Qz=y{)U01~v13=bjka{qO~M z@cUaYZ;L#7d1~ao%T+C=25`w!n{t_Ydv{<|>2F(YY0C-0+!CR*lu z_qqS+P8#(6<*frxTwWu00on5%Nk^}iVt!I9}@AF}=+DD#n4AC+_sV@72?63vce-j|et!?~5(+{^j^Sl-=!~7qc{`wEZhd zeY~#@ddHXZ3ss+99avpf<*d?oz&1_TF~MGSuF~P&^3NOj+b}}@60`aIYwatluK4yZ zU#_|o`tz}0t6vKatxm3K;m%1~Ie~37!RQ_8-F!aOy##IU(Q|9D-nY0jFk^2%wJ(dTWVL{DM4KupFtoZfa+3G8;K9|0I&*2vsxDS9<#0O6epXp5+w8%RW z?Q6?Fw}q#8cMMwQw(v{G)>JLBq*&~g9M#v_XS83^{%?Zo zcl{}Q^`?vVs;TWM%8A*=8Zw2>3 z%eD~jlPz8jC=K5hKC9}ftIn#jssrL(^w}-{bVS?Q)jPiAy7~B5r>w^*qItDmulA}d zSIer3s3hRZEJt75_i7c&R_0`d#C8wBbPgO>*MX(Ev|ZgrODm=crjWtQnuCG;+d}2@y1I!nENLv@EAEB0oJVeQrT|T13J8^oYFltdxSx#pw}9npu#UlO2(k zzAz_ZVNP0Me&2faiAqB7q}a?q#diI1IG**&qn^WJjg9!8+6$0;;wif6BYv<9l!h}K zAQV?8PCi=TjKb4kK04rBC6WFUk0_w)NuBZd1? zn8N+2rNaFwLg4}MLqFnap!9{Qcp5}q6n`+qDm+Aa7mw%Ky%m2L^;bBa1}i)qw)7(& zPsB$lJd(yLJc<$(PM|3YkER(4kD=KLkELXV$I19I8BgPBzT!`yEQJ&CtX)6iX(FDw z`|%`Ns_H@InL5HsBls&Nbjg2ApTW`378I zz=a09*npQ9@KOU_X28o0_+A5EVZiqp@cjn7(tw=?Tx7t-23%sms|j z!0QZny#a49;0Fx&K?B}sz?%%X%z#}6TyDS>23%>tRR+A-fVUX%Rs-H6#|(Iv0Y7fQPZ;nY4ERX{{-Xi!HsGfWc#i@9$$+0W;Aaf@Sp(i{ zz|R@*J_CNcjQ0P|R!=F5k#t9+O*@zh>X@t8TTHPgv>>PWvS+{u7D6E*ki zbRkXQu4Gm?nykP@Q1j>O0@3J;-{3J;}L3ddtX<@as40gs?Iia(N~6i%Ra3Xi4^3Xh>q z3Xi2O3Xh{`g~wB@!V{>Q!im&f;fd5!;mOon;VINt;i=SL;b}Bb;psG3;h8j4;aL=~ z@Le=Q;n_4w;k#+H!gFY>!bvn<;T%d-IF}|VyojbKoJZ3X&Zij)7tkz)3u(5(i)oI+ zODI|4rIf1hGD=f;Ib|q(FU?nY1uancKFU(~e#%yOCFLsYq&$U-s6gRjTC8vhEme3G zEmwFgtx$L!-LLR^aw@!miWPoPRP3cJJ>V0t z@Av0>;JW_Q9m83l4<5shE8K}b0Cr$L@Y`tyT-Qz)J)uk+E%kLfG4!Fb6H6Z}97mrh z+>Jg{xI3LtxCfn7xEFa8?n7r3?n`GC?nhrMJb=zAJkWp#(YJ~}guYjJr~wb73yL34 zUWJF#j|z{ZYK2G96@@3z&k85fuL@73YYI=I-xQv#-wevQO(BhM3?-gQW`(DbRpIGm zS9k{1Q+Or?Dm;sV6uyf>6uz4pC_IN6DV#)26i%Tqg;S}y!gHym!fDh>;dF{nID^_K zJddIj&ZKqSi9`#f>pL#1?Kz$W1r2Yyo zrhy7Cp}`6-qoE2fr+9_$r4b6>PoorGNuw2Z(pZIyX}rQEl&J73nxyb*nxgPpnx=3m z%}{t9%~E(h%~p5=%~AM4N>+Fyr7FCM(iASE424}ZU*U3Epl}6cDO^R_3U8)dg||?i z!dt08;cc{7;qA0k;YVn>!aHb%!aM1Hg&!lQ!n>$g;m2u}!cWi|h5taM3O`Bf75*bV zpzvJ_;qmme!V~COg(uN-3Qwlz6`n#bDm;~5 zQg|A@qVROuukZ{ypzusOsPJ9nR(LkOuJ9asL*XQPOW|ZXqHrp`t?)d0N8$POp2C@Q zT;T=ufx`FDhYByGj}^|QPZZ9j&lFxnClt=3lM3gPN8tiGqwrEXtMD@VTH)n%PT_m$ zTZLE9_X^)f7Zkpqyb7Y(sw>ZI@(>Z0&i zidJ|W#VS0Wx+y$?x+|PWJr$lvy%nBJeHETU{S}@{0~MY|gB6}ZLlvG$@e0qP5enZ$ zqZFP^qZPiJ#wv_^D20)sjv5o{*GYDq8T1P9n}+)R=%)JZWT@ZHQeUs%F0^0S z=}HF_j;4bO$Bo#NP9c3q$-cvY^jw{@aK2Z2h`cUES^s&M{=o8>^1|RPJ7e27Q z--pi>j-?X{$I(fJyOBrXJL!zV-RZ2tJ?LxTdksEpxXFjQ_lB(R_u-tvvGlFNarC{y z-ROeCcam4(9`vKaJ*isZUUWs_-t@D=edt$(`_eUq`_XR-_b0l;@7n;<6dp)sg$I*W z;UQ!P-eV~H{+r6)T{nnd`TS0$#eAwT=2L|+pDNssLKN;#4HOh3}$P3eTnph3}>|3eTY^g_EeA!l~3j;kndF;WX-^a5_aRoI$Y)&!=t* zXHs{C7f?@y7gBG9v#GDbIn-a_TpFnGA{wl4J`Gj4fZ`P{q!9`)rcnwnq0tI2rLn-D z8S3=go9eXgo(b#o!Fwj-74BrfohecAyU-+syV4YeqiLGLF*HNrSegZFH`R_aVZe3A zuDW|ltgrjiOQzLvZqJde65JfFHNoJlGS z&Z52wFQonoXVXB1b7`=`c{Ehve2Q1NfJP{ccBL@dmBMIO3NNGa3g1hKz{!S~=iXGm zb=N$4O>lb~>xaPO4S0e9Pc-032Fy=(^n;&k^HFZ_Vb@JQ4AYhI8;}3|M?4MpLvTkL zu>VOv>n9laqYc>T|2PBRSQh`A0c;0*WxgZc_m+U$;PdgDeD32{M_OYH#~AqkPQJz% z8hw~5?OZVU@Y_v3^fu&WjE^xUMt_Vkxj7Ck&9&n|7hoO-CaJbGz<>wR6vZD*(-a;; zGZY?5vlJdivlWh~ISLP_WQ9jis=}iwP2sVWp)lUTP5w3tnvBdue^AQ z@k6vFV|y_6DZM?gVm#et(4TF*ZobyjnFgPB-Xe81Os;zDLI~ z1q*Xy=FXkEtT473zzxQu9YA z%=}&DrM22~M@|?sF77tka~J03XLPGop4fft_~m!rMma5WaUDPInK@#{J>7p-+2BW9 z%A%38dfY}kBXenCc7A?FerByN%f|MZIH~9D5@hA16y#^-XVmJ)PtQo4n0h zR(a8+WxeL6++H~|+hBR*g#58X({8VvoswN^dB*hNv-0QNUO6{^?vPsT)ERw74gY=Z zp|#q5x=$a`EB*Gi^KuHa(`wbnEuA`Zdgkrb^U=Ht3=L~(&YklM=igp`d3s(>t@T;U z6Y@vha~th>>2=ywe8!0QJ2P(3og0&1kR}^=L5`u`Glz|w*S+v2-Q0!w1$mj-^I{gJ zFPxjZEGe;*l8TX8wFzY7!2JPHswYI0_3|Uy%?RT{E(+g^~ zyZ4xz({1kUw2?(NT(4DMI&b-u*c+Sd+?a)#`S>Z!ii@pP9XBgKCH}@v?^8`r&r3^6 zT~?4@tKM_ylp#}Y?8r*JFjwi%#>NEhF>qj%$B_%VC$3N8%ES35xGu(ZJd_G>eH~Zc zCix!MHn;|1(Gh}cD_rfkw!<|ZvJn=YKMmJL;PWvQ=X}uqZ5IEviIkFhiE|+6GU!F% z`ke2|Di7d14thJT8CLwMBV5aHMRru~yH?^_5A?&n>l3*06!J5!@8J4|4S$dc*AH>+ zfa|Zg9>?`vCLI z1rxpGqxbu+TpxUVreD;J<$52@m;N|4`m(pb9DUK)vccPpt6z`H9UF?e!ZjP$3|##O z%QWgV*q@&H(KtVZ9=GdwGzNeBW0_tb{p0=m(;!FFq1nD`Dz1~zC-yYNAN}G4zC%y< z=xBdBW{>sBxc%|LI()3rFY;G!ADzbg(?v8Q`hXj>@6hFsVCAFN^I14+5R)$7IKwah z8gc|n9eVlyjwYw4XF(IRQ$Aw#OC5Wa;Au1{*{|QSDdNdvKp4gVpFX#DJ~*F);Lnzn z-e1G;@*UH8xccpLx}Bimggkosu1G462YlCdhU>4;H@S8QQz->U!T68ZsnuVNYuetqm?U-=?`G6;=>;|f4xWR zZ1VTFlRla+8K@iGEgm!0S&1;gBrT;EeP|gaV8rsTH(HzhPvFS?-Xo*C5`33X< zP)b@V{ew9&cU%7tfU0ex@eRJs~{z58RhXHEAdi#K;pUZ zBPk;@Ju8jk>Jd%NPwh52JufpQYf4J~J@i2U(d6`k!rW0Qd1*^hkVC^jqT$nqkDrn> zb@I@p`1Hk@bJLTCp>yr<-l^lsPGUpZM;q#1~>|yg$vgf6zQO0dF z3-WTZCZ#VbOh+Bu3!U0}x|5zzX@kfp5_-0gD^8Y zvjFwU_boINw1i3d1?jo;J;;L0h3WZ81?k!Nie(86!vMZ8XK{K`F1}Prr#C?2Ta~1| z^xT}h0{V=}l)U`(q`5f@7p7#V(J>6L3sW+)>1B+RXp2cp(({n+D5!$ioW&V)u~sdh z&wawQ6f}UW^z3;B^XUihWG4Le44QsT9eNpsqGRZ*wba6l3=}jHjA@y91%)YDdgDmq z2q*A;Rz}L)bm{?l?)(%umzz=mX145a+wrT<%=e*Byn((tY{=NLLx&6-Biqi%^n&>G z{JD9Vxrh(7fr{Rm49xCe)@dFF*$BwSqOlaF%uAmv7os!+tZ^yXh485Wy&=!XUI2Dt z9zOJ$Tj1lcdl-n|9j^<1LC^mlqXIW*=*>l68kG<~Nss$xxXl81tC$G|=?fFGGjb>d zDOrdva{PC!dy;3pJUL{ z*BfIS69t1Bo}HGP!_AR<82V=tN|&CpkX|s##usK~`31b+s}fDm%PdIuNs`76$6vj? zop9)IdeJDHgh9=aFc}e2R*f>GvmgdarstTbd&yaPZZAdJ*HCRYq#a(Hb^%7l+eneN z8OAmxl|C7g9=xp(Dd%DkR4H|j(E@qcF%-ER!{YBN!O~$Kj{H?5eYn}sR*WmZs{=bZ z7%7xaU5^a0d>iA#ztDoMwiq*Rqh$!t6fD91g%)g;VAN1rb;@TjH47ud?<>I)AAiEB zFGEde6;BzPuzv)=IPPokiFu3ZA!B2{No7h(YF4`3^izq3Wu>R&`Kf&35BU64l9Wv@ zNGT}H$M3v!>TGP((^E1Fre+spV&+LnTPEEdD&6fg8237`(*^Fz{+pRE^W}%6OixP3 zbYDA6-s>A=5-=@DD?CnW#B1SH6ndF2RRShgbZNFUBr8iM=iRJ)+GtRa9@iB=4zZdK zGjgZ>KaYXQ4j8JtAG>g?c_Z=xYe8VMz3i%f24uUjg)oqCv^u3gk*+ygo;d zud8AlR)=SEh|?&!uF9~&yu9@6f~;ke)3Y)Xb1C0EYT=7QLO!xXim_MIdp&|`Tf6%!(8Q7dYe^UC~ zbbJk*M!(b*`uH-B78vCX>DVV<4e_FqM~ifQMM))fHHYP;L*|=}kKRf)G%IKBJy?M_v_p>`*N9Pu~B_Ow2BgV{j$;|k+@Gy*2p@EM}h)?imcMDVR-k`$OA_JC~GWVYJ z0-B5X7)|I+Ov{KP4zsw59w1OE`WmtD zAO1UW?LA2C%esSa64rHS58AuTSw2E?>}#2`7s0jPiy@E9ngt6|(w=3`iUq8r+0OCB zY&pXt$~^R2`~4-7WBZaXcFPwKnCv#bNw)~wOBP-cTL<8WtO@uLR(|rPS$WDdSzpDk z*_r@XE!IOYX0;}vAU5l6aO`A@W8yECt*k5TWpKlH(S8BeGWtPaw>akTCz6i#eesjb zEG?28=~x>%Qus-o7AYLldxJ{VWhTc>rk!t6Mlr%RRDX|Tn?ah zJ-iauPw}f+O=u}5Yh!dBRZ8v^=olt%V|z-$jI)i8S*XUMsP#(=t)3#Ubz@fA&Ass(O4Qqfog@0sdT z`lb)4m7IkZ8A93;&Zd}+1#!_MkRW&gfJvug{j|{O!G3xr*#kxP!yrQvvPtAJf)61R z3JXXq(kaam%$1v`Q|6H2xMLUjI%Sn@O%&)wvOB&+Zxg-() zgjJhPM)<^&f_*UcK&6DOKm^5;44X-ZcC)D2A5m{&52v6eeIcu_@!KQK?*wgGElle< z(W+utpmj+&0*f`6c!90X0>p%0{uhATMCli*PEu|Q&# zFqJ5kRUD?U6!I;3q@;RLE2wfiVE0;Y8|BmjbyVEnVr~!H<11< zw%JH@Viy=6VY;#C%szYw{4vwbgziKp?wo`N)nOVW1m`XX6L`RTu^nckcS6A4CE|qY z*Q`252v+0AWbEuIr8-8c&SllEyxw39eu&0eyrmn>Ps$cU8l3|0C_u~-0FfHYOKYbL z;v3L^3#V8wgUIj*lN)3Z&jIrLf}&CdF;2{fA@gLxIq{=9&aInx1%)wBmz|55{Opbe zarhJI5X=_L;0Jlkyi@Q-viTnIjE~7r_E^As%iUeDYtCZP>&U44ECj{8kjbB!oP*Mv zvzZ(Q!?6D{p!tMg6I@)~n?q=$=5J(pn8{BFSH-2EeKw^~ zFze_3j@d3E0^u;*L>+H=`&-)eJ7%tLwCm^oj@^EO*lwua4g3k%=YC=c2eYw|)mT?D z4&^a7zm;S@$0S^cj!3|z=f|tMwPcob(k0A2?vwNvcX6Y@zxE>s9$!YBhBxFpF69O= zQpzl*Bbt*2+{c_zlCu;k2WI-IfeZX-zyU5)g4E$5wd2Rg%sg6_#A132RyvlmJATd^ z;0#(y<}p&^bEFuw%un&%DQfir{F;&kd(DrA**|_d5Lt+vOj$gRS?5=X%nC8s1&${>@<#{7r@ituNA&_zrc>CjRXJBEFa9Su#oq0O<7Bz;&Z2- z22XqWMbe$Glso!(%R(NdeeN){GO4>01jtr>?p)K|8O$?VBd}ZHH04wx!{`HGwSdPI z^&Sul+OROcS36v$;q1N{MKCSl#?cLWZBIb0JNW%s?Y?0bK;q~j8gNBy5nMU^%$_TV zAJ(+x8E^#{8=3iNtOM4lm!A>e7^HJ0SaIU7Y~V@3iTPo_Y=MFwUYVX2%&7D+dx$qt z9MkiH8T=XmYw`n|?)(QyOfPbS8_p$)6U~`%K(NviDzy_L(;I>r{L%oY=0`Vr?Yzb1 zoXM$sh&?PlE?9}*DqzJEP;4E;GsAI)Sy1dg5Ct@S!09SEU6a!g)Yo|V*F$vS*wqM5 z&Mzde34Y$wI-o1_M?n2MPSZu~Vnw?Uti`V^ux1}<4$o&cBL@e%zBUN33C}=X#7h`` zOc*&>pI>j_H2lb@!vH2iUo(kny=t(=tq;a5Wq=@8dm@Wh-HEvDBs42GF(eu4NJ*8dI-8YN*%&K;G-nf4cBxr}RsEDQ7bkmbalc?UCRu|{V3 z9SjUwoRUSRwNlpsZ`G8?HB>6q3c+Tx?YN|6dP%vI{H6+<tg zJ99R$V~3<878CyE4C*+|$l1yq_E_m`VNMo1=ufp7oB^rrz;R1E!;tNOV{ApIvzg9E zb(jvz0BmDgE(l+jtG`R26L|gpFs$xj%WsNFC|A2X!81-Ye!2Lt&P3y9%aJ`8VbmuY zePn0hqd0vdJHwq!>LdGZK+e%OvbRHGK6<%X4dEV;0${4Iarf*4;edZ~D0F%s=w2f* z>f13yaf3Q1OMe~g(QIS@w-wVrC9^$hYc#K@1}z}db;;@rmOO%Z{Nd-n@^&>CZE+rF zIzbaNAm>Wwx1hM<7Q{=7s7$@g2Ro-IK7$*?vaUIG3HY-aCL zw3p$We--%auwH(NakUmzJz8H}Hoy*{zSPS=;ygC6QS&E`7}CqnH6|Y1a+IEU5yFM# zIj@r~4Si9w(>VUN&ODw&B*eHyaM(P7RX{j#F(-C`F77s%H|`X~rs#1n1Mzo8;vfex zhI^F|k%akvmwm2X7@Q`;?-tXS%rW?GG4Vg_m}n?~#k7JshEiBe zA8;yz8y3?P=u9;FVlm}_Ma$3;H7Z8E`Zf~ZimJPj$W3f69$0Jo?xBfy54GhyJZnPk z9{RQnO}u5Ot(d|BealeuZ5f(vUounQC)D(PLZmHYef?sYgl#0#FfkN*)=;iA^UEG! z+XQqoVe5zr)@*BlO}5Jzo6WW#(R?hnk?4q4+a6$>?QvMJ+a7{ufUO3a>vH}V=Q}u-6q~0G+)*!L8gCjo4&$X)@xvHAb3MF;3wo~ZX`G{QUt7rQF9ZK zAPr~%2`p_YbPMKymslF+BP{{_;ElPNkF*BNM%yyC@R7EFy`1(ApDBC59V~6-BkKk9 zW-{DI1_o%X+}f8mD4-omYi{o&g9Bb-va^p23CL$RdilsuvP2`6=DzsXHBm5!`AIPw z9Y!zMZdEXWD4O@Ef}LU4pYfS62iRJJ-0LGP0Xr~EnV<8K)`0fx>+?R+7VtciFZoD2 zS?*(7`^9-Z`!5CGd+XVMrLqs=3jM~HMhm#eHF3^IngZ6d^amel)}wyWM_Tl#dwrx; zkNPDaX$yFpBX`+H!kbsvn`$v1PSmrRXKQ270CjKXX#QGubN0zvtgn{4a)IXhNK-%w zOEWaR4VVK`INF&$sg*2UIg(l070y62KcuZx89bsgh-W8uN|6?+QQ&Iiv=Mssx#N)K z5S!eqO_zN`?jBpqkg2e&`3fu>zkj9KW`IMsRtSw|3qk^6s{kK6U*OaT8~*At3b-Av zldTJ~LnnC!o(aoqeA92^WjEQ1(Qt&VD=cZY0kC1R-Ob+HK0^gtYzvUsYMTvBo9zfR z?Y92|-(mX)H0#;kf;7N33E2eN2-5ntvq&3c8xI_8_UJ7?@H)f6-NwJxL2#gM2Nmd{t~B%PbVv z(nf4%6Bf$|!4JuF6Qk;yNbsf60!FY8WBn!q9PHpYA895_1?Mncd z6?Wy;v~?JFDIQUBQF!YJZsA&_!_fqeSVwXIw8#dI_hH03ip!%#Hg$wCmB6lPku4lQ zvgT-Ri&|ua;}wL!I!?FJ-f@ko@wzP5F#?_0Izgv;k?Br&YEA40GeP1NVDYK!!@O|d zSB-h`@RAi3a-7@GrwmVG=niSm!|P|SffN}b0Vurq+zrBaTN7Hq+FwX}zB>~%EnD+70AuFoxdHIgBGU_;=L?b0vzyJY@}`<&0BgL)?S$$}Yt5fYzMmMrI1#WLh0ajI$-AWjs>4xR-eXEelm z9XoS%FE~M;n#|Yv^=-#U=GFLu6ug8DU^tRvpa|Z}q)99WX^K2*4gQcrVUhp)IlJ?}19N4Bs4~$B%;JSSQIhT{I7tflv04EhuCnyP6`NLdpi> zk0^(TltP3^9y~}-LHBRi9{~}O4EM>glvSfRk{OsR8vdQ7ZId7!h8dyJ1y~jB`Ry?6 zfqsp@Wvat+P&*)OyqddkN3Lx%2C>Flne60*^d!hezp!%WH8QDa9L;vSa5ePB2-)N$ zlU=z9HZ8+XvrmN_r&IGr4Z# z_yHc>3z}NiL&^Y+0}>%VWaZIypOM_Favd!gzmHUUu481b4lK&_ToYw3aZJlxCrUbj zX_@OJnd^O^ks(K@wJ2wAu-nIN&3|xFTgf(;A-K`~9SPcS(-!jt2UldYx`QJ$UsAt7 z+B6Z~N1`Sc$mSggqpCW?d3+FAGKUBV`1lZ~Mu#!|`X)Ys=471s%3$x&R!}lbe5PC6 zb^hnKnz6`98;>Wy)=Th9yGw|2IAij4dP_eRuY=eoK4QN+qRHw9N5#&Y82&?awQuud zTtyr-Euk6S+0je$xtrqEy^YDrmg?w-L!m9#XkNeIQ4J6r((0) z9_IzR{cd<``vW%&%$ar<-axQDsZ+wv%ShWF_1QhsfaP>d;vi|jBVE3Ks_+q20L$VQ&=<>+{qsmJ^jzr3K~wP;IpK3m z-p|r#R{j)ZLynLC5WO4TYb5(NT5TkG^`#$8D!`Y|yMvxVHcjP?Y>3#+rYGLyBY$k5 z`#6!at&je%`#6bxoC;F+aSHo*ACuC@sjU1Y$htlzHRQ_hA0nmE9wV6@_6o?)kP3Gw zVj7BW(ziVP2{>q%*&%+d!PJ`J1!znEOl>$z9`K}prbza0Jje#;(N0WlYoNTCN%qgw zj+Ot$BuCiPp1rRDS;t*d_d4#Hde(8*G*Y_D>kzb-pJBeK#(!F*SyS1{Ld2c7E&zXo zVJJX0Wv`T=LOh=R2=We(VTA)@0l3teeN>k zWtqXjt7Ox8Mik;z&oBaz{aP8$20sV5Zl<1IMRfN#%DBe^HA4S9QQ8p%DOfc0+G z*w;z}A!5m`p|M9z-f0WL6*)w{Z7ht-CzPybo=IyXTp#bvG`ej=M9Ntc~ttOxC*l5y%_e{ry2E zL%hSB9WST;D>u5}$Jvq2hSx|zvZC##vPb+SX7|J+Ibmj!%J1bCy5|84+J zkNi!WbkZ!R$BD2koixkoF%zWp${fY>;XWq$&*7Qd^0MU$yTJp77Y484G++yuBe(|sC#4U(S?G+?r4!%sk30qZf@om#$voQjoqW7)ga z(k!Q&52Y+t9F2x|H|7FgxS%8t4i|sjX9(BhNNfn#Yak8bGDU%`4OeH7bruK+*Ks(s z6*djwN`{&oHaXJ;EUOLI{cM868T?;W~$$ z_9^dVxcEUI$uKKL4p&>$sO9Fx7k}s|!)0mB{q!sn%Wzp_>$(O~hRY&bS5#a6^BX37 zV}(>QAePQtLo2|qvsSeXs1pNA-Fe^AyN-L7?y?p5y|u(q%P{0os`41dd2B}>dSgdEaAYy(7F1_!g6TN7xT|kV$ler6>v0dP!tQ z*dxvIxX}tG+pt;g2nTp{ytyOr7r2Jd9zkM5Xgweeq3zHCWNl~@LEboS@MG|6$kPzo z)lgI8#(ONQ4ejG>qVBk%R3BqiUfSuQ{TpY_>mNO|UXXfdag~R8&_Se-p*3{`r><-N z@ffokC25T47(&}bn&r^?4;k7|c}BT8wEWq!A++6**bv&WAPu3dWU@B22SC>Kzf(&$ z9O?|4hR|Mvnu-@c-ZF$X7|$SX2(4_1%Jo4%Ab|{5FR0#--G3Y|e#4&swvHiOqovuK z!c~N^>lWeS@3#%%x*LfN;VJ}a2-lyPtPR&!Aa4wp7Y@yWO+&cab~c2I-=;Byt2bo7 zAFh^2Aj6dm)f=+=kHcj*W0+Ci$&Q;Z&E6C){ueWDG1T*y>@r;X47LV|Ww`Vi>`{<1 zT>1?5G02t?$TAM8WI*&8>^JcLr!!b@i+onEYm!T+BYi{GMet@4n?+KW7HDpso!_)zaI-hC9J z4nZ{*Y^2dq2im^=iQ`V(3>f!_`5pZG`a;RDmukMJt^DlUk{k<& ztx+pK`nIGbNJ?1wWg<(eE;CvAQ$x#Kox-C@{?yQtwi>E7xi4!Quc5H^`CPsB^;VSI zF25hN%kKy6^7}!%{{5iEZhd?r^sKxuYxVETT6tgA>fe{O^1iIqzb|WTj~-(6@5@?w zU)EZ8U)H*Zv$y?(+=b>^%dW_;9_{Px?27#A(JsGwwCi6zI=J{6f4jw>Al2hIfMQGm zT*$yO+(T+zArIucNi7Pf{(4lEmMg?jsQEW&gRa0EO@CHqGGRR$9LxGi3_~Vzf)utF z(wVub99s(D-=IQf9MNq}A=ioawlvIDp#6=xAx$y=Y45UOs_);n zm0ks^{o?xm4P2eCwunPRk+JD*xTDP9g|m0Fxr4(O+Rk43tD#SVfogUf_IVi<$gSYR=BGiHf#1TrALSw_BS6&`oYEe2vW6b(CcRjyIwyAqZ|j&e~4voKvhPn3uGjNt%Ucn z`Cc5kBEb>kzr@GpJEJ6F+_DFQ5sy=>4&#raM*&V@azj`q$XS4MnA{Y$1Y{~8TM$)v zww%CDZ{(^pV^ zd7ZA!>yC)JdCmS`=M@mB%9VISUfch7c?F?CYSg1PuYRrTmdk@0|D-lQ`GT+IcGIZk zznn%tL8ijo|2aY%Is&X&m$pF@wf4rZ+4>qd7OM#uZ&Auw(mMV$tIApOUwmb6YlU<| z>mh6cDfUHhy8G}etmkD$4+5LW&a)3bf8$1N>I+Q=&pxIkhV^*%F{QAm9?w1|!|Y?{ z*~fH5ltK@mk02e-KBgm^81n36Iw~R0KBl*&VV-?Ve`9Vv9{f%E?BjdDtk0R9xY);q z=^3`-Y|RAgQ{W=TGlc0aC72-v^|zxG+UuBFKV$HsFa>?Z0FNC_L06GTo66`9%)5ut zlgxXFk$R#Xq#k_-`yYMFQUx93R4LF65e+z&^O3oJ@EB68VMTdNu^?X<%DZv?Lu7}Z zF_Mcyd8qXtBA@CXia?@23%rJ0(Hh7pczEJlA2!c_Qz`TcQhWlYeANzbg(6FaS8$55 z(0U*l{>J3P4cH+wQV+!`9&b1ZX&V4GXYx`@m}`^)mc7v;{E9|*;g=dE@^53mT9Xw_ zVs5I$mD5FW+UlO1_A#(b)R1e2xzQ~7DUl`nYbDI>&5|n%{1P*Ta-}g>I`%UbA7XuL z=tK)HEB~2PF7Fda5ZVSsVCHz7Vl*|q7J)U{9BzO@G@aQ7L^f9qh!(J5Tk0c5LSmoD zH;zJtG4H=gNOQ30#4G>x5k-ArofcVlL_ja3Z-+t2u&}n>ZbY#C|BMLQzds__|AP^M z*J>8uT1|F*i?8FiM$BZ#w z@6PQJKrPUxnyXX;b=4s5?HYRfI!I)1*N#gYL2Fo0sjsYcL8UI>VL-z$z$-ajFhdH0 z`yeM%3A$=9cX|_d`e5$XCVrzOguAr~Z?s64gSq1)PrS+!j8x{+I$I8CmLobbQiFXS z&@4yTz8ugjMpW+uPz)~Fr4 zSOsP&PBHOgWY)MhSQcu;3y256Et8VVkTjVK)+Fv#jkr=OA$XL9lS51p-Un8O6tc~o z5In)cf=&=hnNj^O?T%6xE?9_*ze9u(kKtnXCe5W zg&UfF1M)|}YfNsE0bpoFFoi1=ivk&dw^d145W>QWXclrwPD&w{gayr6SUHA;ToU<) zUeilJZ6IjJ!fn#^?ts0S+*JTw8A-G5dVg^FRTr^~zc81Pw8r^sCmw?FEPUcw7IN)0 zSHfu!B(w0TzxjpHQpk0{f(0zxbB=}V`A{ij&sk8w!arGfWy_vVlfvJCSg?YH&&Zps zShSf15H{hLUGHbWuX&a;2nKi(Ak3enSwC?0g9A4?A2zdwP3@C;yeB0s#LI2KvIxO# znE!A!w`0D!Z@HNTHraXZ;9mG16h7hfHt`}HZF(ApKlJe|*XfQa&|&!r)^Uhq&}p0s z9`2nu2F(7NMfJqDEaD(osTFrdW}jnGppaI+1-`&^h~PVXzZEV7vwvn$=>KEyT>$GU zs=e{O&pt^{(lkxqY3U<<(AEllQA$B5q-{!rZ5orb6hsbba?%FUBqk@NMXnTiiWO0M z6%lJiK;Uu_0TB@q5i3^23S8uJQ64HHA_5}vVa5ONw`SJfvrkUiwD$Y-`+pp0)~uN| zYu2n;v*x+?_W3yL2x_a)o4~Rey@yFd{R&g=L=IX-cF>9;-lee2gx8G8j~!vIn-U*k zri1$uEGXO&Cg1fwxds>XcZ3N(KN%Xnk_(lb=gaUA*f$U>`!?Z2V6t!1>mjf!Ko@)% z@+P`|jNpL8&+s=T4fPyCMf`)udj>8&6v{|knt+N*HY4nntYu8e-ylQ68#n_T{KOUX zpCy+d?3L_7f?vXO#)LQMaTZVvpV$C`(&La5n1nyg@IXI}_`y>d9wZwOUfCIWM* z1|*)t-y#0{S;k3-Hb2_d^T39ZoqrO!Jr6S+MvngbnNrwtrN8b~%`<=hBh*+h&#A-c*I4!QE&|y|#E(9joMlgmA($%j8rIH_rOCOfITIalwE4!9?VcZQS6$8MM2&d<$9fP~X1@ zF~OiCVKhlxunkJF*NoF!giZnNV7`S67{lH`l9ukoAK4w=%yiECfC=9c-6Z9EV006B z(8p1S#69FZ8}cMNZ~^xY=9CM#9SMfbw(p>DAGRb#%Az-+X^I(#lpd+j*4ED_X{cKl*+H6COkr{MRHngW2VgK1h2i5=Rt$ zk*WXV`=19kV21yTPXea+z^DHV`y@Lewd6lb0zU3qHkl$l$I~J64Bt%%jcNck%qzcx zX}htqJ%y+gf2DiiI9dZoPm*L;w0;K(vY>s7J z?n2tw??Ww2Ux>X)B)TH);}a$`UHOov+kOQi51`5cooujlXN-X zPBLE634cJ^pFmV`IxOxw5Zp?lBmB*vn%G7wp2Qx(*xQ+Mq%V|rBYZFMqx`Reaxy6w z97$^Kk}_o{Q;+wj@RcwOOW~FNn^P=erT__rCz1itAe z4O%I3Bx1+lpZ_6$3=*ZtE+l%B9soPV8azD$uiZ1lZxG}3lN+(PmX zjvfHH6rC^yX}2KTxFXa%3xX{qI{ziI9Eqs!BF!61mQ1*ei5HAzKi`Vr6+|x?OHa8C z!RgNEpkv&@k~4{0m+hI}a#>PZ9n7 zAp~V$_gCm+!a2xOLuQOEM(hMW#%S0DU!Tv`;f*~eY+~Ync~fr(yDbQ__xT%y)ujl2hUf!h??S#E2wq1N6LIOc zB)yvv8-@H{1a}hMB)9Jv+)Z>d927h8G#(}teUQVw?@!}$rPwZ4rg4w0xSbvpDcoZ# z-eeIs&vfST|$#drIo@x;*xj)Z=w|>?x_o z>+;xBGJd?Cl*gWm+{5A`?vo|#K3VZj+6MQ@xJNh8&X*YWN@%i!bZ}pTD4jHwKFjt! z4)4E0=^HJ^yE;^Y|!o;ORNIMikDXm)Q zo+cfBqqt}7Pd*$%p$q*M-J_gU8^vzsPoeq|{UV~}=r`eQz_4bGXe;h0xkj`FM)d7^ zNark64!RK)B%}Kt$=H35WbD32axGf`4_nK9k7WG5N3!`MBo?F!zEXh-%Jq!`wJ*88 zQK0rE*Eb5(zU2Bwf!dc`-zbRNSHaCc1Lpy<)F`;)9B@y`QX?fxjg%}kQms>2xGXhN zveZb)QX?fxjg%}kQnJ)YnWct(v4!2zE}C!{8l`Z!|4VY8iAL~KhhaIBNWG4~LF!4w zBvW5QxFGd?{5{`K9f=$t^HbkP$_0KZ3vi*IS`2WJpW@xGzx!T6$$;7kFoMGQnDz{i zO<7D23x^?fz$&9kymK2ZJm8d_qS!u;rz{S$Rt)IQw^*Z@nwAM z-*0&g^2f_sU;0s3k~86Mlm%b&Ii!w-cd@iimi8n|>n3^u(Jav{3;8V2oWeIV{#L}B z!q0iWSK;Tz3;(E7_!%r*YQB}FJwi58^G^~jlUmEZyQ%1>Sk`l4Sy#MnWGCV<}9KkYJ(UA=Z z7?iR&C^{AV3%X~K^CE;jumx3+` zYbh7;jw*rKdq2T^(fZl~T!?Xf?GE(B&1*o^m#+=@&4Az|D^R%m0? zf||u7T~9ss<8mG^?)Bqxo{>6XFXtI7X)os)%sw<-cr%M1AP-FssCtB=$V1a9d1yK% z4^5}!q3M)7G@UXJO&2As>n^6far1H@TOoiyq*bJDD2FYkIuQ0!HHS0iVT3DEg|o0$ zO&x=#pOo5;zmvTI7XkRGufLZW?g429Uh$M__dg7L5WhK)>hw2&4P5M?i%Iig*-pSa zSO)Q%1F5V<3kLlF=8-b{rg-a!SNeNWZ}Q1_aN+{|wS!LCM^R#F(d#AjZTMQ9SM(>o z9+^J;D-g2ijrU1$iNd2GY|)=tK@7Ts&WCJ81@it)6h0K+#lt3=MGJ@Gvw(P6l|KzU z@sg9F>oP!7{&9j94=QHfBA@Ez;4nQ9sLN8tl-!Y#;yC$wqh#>{v0sSG##5IZA5Ex4@o7kQp`>}F6^h*iue|qDj z^c{)I$$dm@J8Wb)T#u5e0_WDRf~?%mtwo>_`o;i}V7z@spGpoU_`6{b800yB-dK(p zxX$y?iWPiIu|J)`)8Jz#@(J%rpqYw){)~wwDC0~7vqX=aI1(s>n}{AYi5nIdB6u^= zqyG&qd-7aHfsr?92|~9Z;Wj27b2Ss|5Or0UcsmmAV&eP0sfo9QiFYI6UM3#?b3_4@~5_>=*>65UrQO=OcIm(GLlF8iFlETfNa2qP)Qg+U!*S zTXZ?y*!VN*zYipAf^UXR(9I@zd;vt7>X)&tw%I*QN@F`Y znTL)rjdwWp=U+YfS3uhk4`UqylEH~l_&b^oV5$+gZpKnD7b{zy6-r0Sdu-3fRt& zBdKq&uigb(u^*=IA?Y37G@2=Ci}BC@wwUOT$kTi8&)H-%eQ}(O;E%%cqh5zKF^P(N z8pMbHYAi@+`E;spGxJpcI9Bw#Qc+ftpFw8c@kLtE@3Nwk;P;Jy4^qHWiQdLye@sK! z095Kd7rBq2d^?{**;4Q8IbuwF2f{O9Arl`GH7r7KDbXKGRT-=$`V&D}28|DRviv zj}U!FoW-LEK0);FGub%5MDTf{zCV-B;{}9YC!X-V_r65^FYIk#zd)hJq!#)#ssBLP zvqa1jq(+ZXmiM-^it~Es=J()C?s<}X;BlIJzT`dvxHsGXHO40&Z;}ThKdOfxh&x;c zgp^PHydR`d%dNm_dFQvWSAZ$#y2av;O?CKFT?c_D~To=RssTLdvO- za_lD=j*xCN(Py$f#P>#10ki$9S=niEF8myw;WDi^m+3Js^ZdJ5i@DXzz;29J$VcmoR@1d|K3PRZYjz5T508OW(W$3_3{&?)5*69`E#9I# zps3>nIQPP98U5kYg$NHPF-upqW$+Bsx(yZ-UcfZj7T}u`3(AV>GGxFFo1!+#NeO;? zG_Z{n4X;nd#YX1Y%z_5$WR*n)B_bo|c%Mg_+%v>(D#PZrO@qV9?BH--I5?b$4%7** z;T29`e?wj}#hjiHUS;m1KLd60D7l9C=c9Hxn?m12=N`&uCH(0OUVK zikSv7Z`gLXz@@`(bkSwrXrKP+eV`0QnSlr+%1Vl|25Cl=T9(~OR7Cjz(F=%*D0NRE z-&H{4B{mGZ-7Rr7O8f%|Z|OyN#;|)`!p1n8v*Kt^96c|dcgv_X7S>mZ26F=S`2?h9<`D}mv(MwLi{M)qpWo-5P zQB&MQ`W=a{3Q0-G8-IrIDiXd(mC)w&=YKKYvOD+ zXo7xjKNWn19{S)OF0gprexeEYYx~J=KG`vAK-&?prPRycWA@k3Lhtyg8|TUyz<>mx zpZd$QOj?B`FZHyHitk5ks>olHPE7| z;WkAN=Zx}Y|h-8P^7&2b1-gVGQAAn zF~smQC{^x%BNS&$T%1EfamJ&*sj;Cr8^~dtisO~?mSJkV&zrafB}KIfxEnM0hG!t$ zGAe5LnN-$n85ONESYhFIa4R|)y%UPSmeJuwA3Tx_zKL2DeTaf{>}(;?85A`!c|zeB zVofAVOg_vT%w{Y&x~L}2d@|;)`JT-uV{Qv2l0%X#GqxTBv}`8}s_)*+M z)1QAr`O_|1`3$%65`7SeV)O-$MCLqI{!H zK>o2`MU(p%3$1@BhKF%dfs08no^QzVFQv=zCah+?Zo>;*Lz>$nnq5MJ&pDFlR5XDmOjz&yks~=~4*>9Ecl_2&;UFI_WLY(%RVPs4pzS^7ii=*WGVYW2?Kd@%CVUHhN zn#{|?xVVC9e;b+Oj9c22@guz%cTS zyE87peSc8e(#l@6_m7I1(PJPeFK`vUX&NecD9`9}5;mU@CB&NZBd0Kdn)F7oE9uWa zca%(hEbjkXT+EO16A1aTofprx#hYqIat>0yA45FuEGE3}vEfMmS9An-Bwvq09>g$w zz$1A-hwq)J?4{o-E{ooCTR@p(j#v}oWByqoxZxnEx}FjdRve&p~z6&uD<4b-Tf ze56(x3=j4CsZ-^q@}-a=b($H^I3VIY3WJf1OR3fOfvK(qQy*dx9Q1-Y%yR~_N2@hDiya8f0U z`yoQZ6BK@^zk>OyL|1OUdh{)muZsCjLcU>a1Ai$~J_dAz?7+UC>bM8!$ORzNAGm^Q z)KWzKge8`*aTDvxV|Nbfz0x(H9-cTIe@ofgL;W99V!iHbxUx1+fx<|&hEhEjit!XMJ znSd>%{)$HSQV$=67;nH*T>SA<_wm7i)F4Tih4T$Rbu7a8Qc9&DJ9(QowTh(PfD3py zlzKSLsQF;)r7jTW9|yxk>T#q7DV{XqK({dU)JBjM*5EK8_4I#JzR5_w8Z@b2kU>Ez z^_v?=QHuwBWdd?rAq|}QB!@Gxm!NlL4Px`}BuklSphW<}6`Zp|n;j0im^=E^n z3Xf)CZyKzm@DEJ;i^0kY=QHgsgAFh2VA}sOSb1R&s*`%#U}FoX5c{jaDhgXjxyN8r z3J)chzZq;g)(oudJG{j?s618Ze;?wOO7&8{q47$ke!4JBmTqSKbYYk(<<%yv1PyUX zsmH( z@nLyV`~)qp^bHnYVbSu^D`6k0i54AOx`1_`WYG#E>tu^gDg7o!jnov2PA{#e4BXSNZ zOC9U;gRw?83oVglaeSP`3ChCgrqZG%_$(MXF7khGIG*HR5OQ1|=ZI&%#h8JvUc z>1y=(NlRoabh$-sg+66bTcIl~T4IX-j74qnS6USP?^UXMoBs^TD=06jy#>X|U7DiU zjIytd5#FUKTKzLIm4St)fmhL*hs95p6^=tqicX;e#mCpYf{Tkj^eUO(1N|1I8KkT1 zVV1Q&K$c+g7QgV9Xx<{Z#T!gM-!J?&Q=4gt!Q_wOb1|G7;pWIlMWUtY@|%x(OoX4GlLzhK5trq2WAq*iKf8n=fZ0=Wx6E!mznO zI7H{K!fS}`ju_72#>~h|(Bb?YzR%}BN0p-L{tgDqUqLtWuRjOD(d9qqZ1k2bjP54+ ztrs&m1HQ~)VeluUeS{h*pTyYR9BIqH1-1E)O7JUW{8%*!Zbt+7f4GX- zzRTEGwlnxJ)Zzb8IDCk)f0k_DVes$QfnW?z_3;4v%?#g2;u8Nhgi-G-KyiW^FHUgS zD^759C{EC47bne+bT!hl^s$ zMM+~6*F`Kqxe|~iZuaM}^Z>U)2qN^ufYtgHqK7Y-halkz3Ylyl5j3(cPxGDDl z8@>eCL&SChI~LfKpCQn|z|#n{G4NXiwlVNJ0{0?tD8Gw5C55(2RUt48fldZ^)uUi3 z0`Ea!90T(ZIFf=5RkP|^Z?Jh9Tpa1jeNhC~q3vpACI_YHuE=OScvj|Lj9DnX%^g{>~E;G5_ zqnT$&A4;GNcrgh#fpF?+ZYiJOr@togO9eZ~q~csR@ssb-LJyN03!mZ)9D7x9OSl>r9Q>Ck z==H`{H4`O0Vi0aHh?QM0W_u?}nH7`ZKmAFd5fNUd2($S;#8vn z$^4m+`PYRxzsEIGE>_(x9gQ!Fn0XuB#2wPv+JMj5L;L}sb6Qj-F3Y$5TUC~Apv{p5 zSC9DYn*RJB`m-<| zyp9EKWdBWm*`M{#L=mFLQ$g#^j&;{peeVdft;RO={eg5lS0RHeSH^gU?W8}ReiLE} zpcy!#OA(A^u@8oQx*}Y=o`-gE*RJK8p;NPN#j5C%0cfRv?4^3&j>`H@PFbrDc3HoP z%6c`YtZfIoticmQ9Ztl>BUguy9_+G?j>@XbDXZ+9gWO(CQCXkJDXZpSm-Wf0tncKM zwe?_^_06cP*K^9+b+F5NE-LF#-05&_BlVGk)?Ro~&!MHm1_q^vln(Lh{8fczh2TBX z3rdd}_`ZSF!_al7cmoG61O-gh2I2e)lK#MfASv)cQi!#8=~#Ho0XAa+Gp2?al7S>C z8WgfzfMK&ZiFYmt14$idNrhX9B?S|b4jPQ|$*&YgQp3m#y{3BDER5P^piCJ#NjU_i zTNK-uGfja7(@Ls`Re*R{6hU6SNyVNvgi zWMifo4sXnl-|O%OdRV9cXgOke_)IH-smx4~0K8|-v!cvq%vi`eXQmfv&@jMg=tfpc z&G_iZ5mK16KU*s*Zl0qKlyYP!6k0W+!c&DP6MT*uh(0mY$IOi4c;3+jOgKgY;PAds z05L9=>)4R76V28-&e0jNF9aI4_3;rx^`77;Pz<9|bb^#cMlAAMOi?{=iO7RqR}~o# zc`S8W3}T#*nPM#~?txriQyBLr1Johy)d#swXJFjv;8l#q*9@Ys zf$s_1R$M`3HhA1lrK9f492Aus5>=md9qOPU9u_s}@F)dSF10}QLh1p_r$S$j&oMe4 z6XiX=$AJ?n9|D$F8Es6-wt_3iTJzdD9FB$JLKlPKZ{;0}gT9X=q;! zG0f3Cbn7UTDj5;!h|Po-WofIy$s3C=k6ME&wgU;N$B=+h9-<91)(j7D8wFTJlL*mAj+mGW~!MhRM0XFK*;>uAIywlmtXfT(+*o#&iJr&BtXUhhn9@fZM z>{vCtaV|@yjE@Z1IDrFi3RmTYag`5}_}@VpE*hNj`x>(2 z_7rvdFkZ%;RBy{DikcCNhe$i<_G)dRHJRS8_69}MJCsJ|M^wAM_-#hSx_;!7hr|tH zsM}B&z+IH>He4o=U>EQ7oHC7ygf?whZl+A}209qZ%<0P%nX96caIT6ETyh*4 z7c7aI_Cv=R-+DWIl^w^2e3DHz19wkr9?LpJs zi2ki`q7g8e&(XwfssF>`!SK&}wK`)^VY?UScGiJzXDu=P)3LfXqeTo*_oBd4hyQQRfYZC&=RkxX-0;2fHx#CswOoe?+6 z_eP$@WpWs#bhZ}`kK7F{d8Q*Y96L5_RVhrJ9ZD9PQ{nb?NQDNR>xd~fa)eU`(&vS? z9&*8^Z6tiY70~}7TaUXG$Ag%LhYv9o)guM<9%3gsn+{@)bjH>yoQZO7SEo7TPPUwe zfQb)}nt87~U5@HyNRKuk=6Ulli)1UxDi;$2?VV$_hmVsU4q3*B?JVO|Wa7HdMQ@3g ztoY|Pn(K#(qwY&5!rfkLk6e+lkrA%$ zBF$m!6yA26$z9Flwi}*;va1?xrD#2q(l ziO|)g$kg0(CK!%8yMs;QfhW!dr~d02f!oIW+jmWCYVWnJec-!P+KjoqH@D$OX~UPt z9Y7zG{eQ}gKJ@4>dUpn;#xu3F!N8{<#=`<()wO%$c+B|MFE!D?_-Xt94_ht9#ap*6t>6 zFX^l57cme1U)-@_Lr43*XcxCNc6ZNOlG)hWl-VEJ{V1WMD>JKdb=?AF*=Gq3t>p1$ z^>la5YHM9PYh6>*tj3L9v*yh_a^?}Xil`-{THBl2dYUu)L(6>oMcS<}obj@7v!DAU6Ba9}5=Cd93nXcBxwwX=vO+=Vg65JIC_sL;tjR{=l7LQLO3 zejeFgE7?}t5Xr7X%ye__T%m z+z8WO1WYErYeQuB5@M)aLa_U>uzMMZk&mHdvIPWhAw(8@#|2?2%~e#yP%?R@jbqvv z#8408LmGyX$qpMwnhL}aPO-F8Lt2KC$&Vt9kL^wcTmVQ~zEFekSPK_gcq$+(!$)>m z?phn)Y~x!jzTQGUy-z+D1CpK}*(1)^B@o^SNPf2hjt0C3a0uYNHvK*e@3-(F3ts?a zzC_aSO#+f%p@owGgDe|tIzqz$`F;T6vjJICzS)#H=2P$2Co<43Ui2Ian$oO8ttII-E%1HxNA@p)UeXGRaTlOSf<@ zKq)h_6NimnVeFav+qT4zL(-H6T47Kk3antOaD}tdiUK7$Vlni#;IF@@YVhFDbX&6cdPaG%_=k41Nuo5=?$s zW(6P{W-1{0^G&7XG2f;yu<^&(_+u@;(BgcR4#%Y>HlFXBBcJ7fumhZ7V0Zl0k zA-nO0lW^^y$uj{d%v``Sz!Lyzc}py;0c6)*4M@6E0XZo1X)od}fb=wNfK*18jo%2! zT3l@5X8}ur?*OFO*8z?L+y!XFV+i7XNoq%g?4P#q`H+kukXZ1Gnu{)WZh24rV_$HphHol5#b3sZpP zR|ZIa!)<&yU~oEP#v^nj;3S(e1(4dGY4Q1htjR))FS7Vji=PC@)~*4Z30MahoJr0N z2r=hrfW*%Pq-^bglxd4iztF7Vfg?k68Rsi$4uWGkzYB zz2OBL|E7g+0|sj;(H?{dQ+T*1z~{9wQXsSza6BN(o&v}+XIOZWg*6tQZecSZ>94kM zyN$oo!n*-k=iPwp6MUeTe4n;(kA+xJNIZ7X1&#zH-x>?+Z2TGv+im%V6jX$A-+t!zx{{$IE!2xY{Hpf@~U=nNWE>mLzANV~WYkbQtpCbOSz1!RL>Zs9e6 zY|v{hywSqj0BIn%0|squ(z_5MhkF4zCAr_?4+0(u{9!!Ld^BoDNPQ8quM=`# zf{=P9q}~Xr4MI-L2z9vEwVL98w&}tD$oNQ7Zj}*gQCxly4{iuo<4bZ#f`1Q_xJ^WA z6+pQt&YsG26;uVu#g$&;73SvGc!jy?%17f>9-0;9_?CrSToDg`6e=P&ix!c~QscEv z6j!=`Hm-7L)t%Nl-_}}5IKWd2s+~y|*D5FrrPp}HRb?7ae@=dyuCT9o&CgEGd}`Jj zuY8q{!rs+Ws>ypXA;*a}MRO`eF0THR z6B*_+JH!mB<8uW5@qP=e##WLeFxTZQBv+hVT*Xu4b%c2_6h^h8#JQbO>z>;QH6Bd+ zo;p=xG)s7oLDoK}PO%YI&u-mA-n;~yP}u|F{XgWz)P-l&=Ezh=46BNG)DUfnwn4;tg_p08tW2oN4 zUBg-rzxjspG zBgY$Vjw{0)TB@1slZQHLb<41JD{)KzCI5F<^1rx}|ISVMLYT4_$-n1HzVm=2PX z*>%dHvn?)`@@Xy_o}jx2BbkHX;ZSCzY>Q+If;U3h`l^kVj-0=8bABnz8MeoI)jBsP zDPiyS_*bvh_FlF6m#E!WT+R2Z?>z11xGAhvZYu}>%r-k{wbC}qh5yvr9i)EtFKUtR z)(-wn$Ev=39ymgX)-w!bV&|=F9YOZhT?M~)@&fG&|E;SW)}dmLJI-8L|z66 zVJ?uIbwqHFKyt3Jl&1sE1LYZjEUVeV^?=CvmTBgFV zNthTm2@&0uGEKr5&BG>faa|KRO;Rx5(r8oY_@F!#qWmqF~D_(GGu`rMSz& zdkm%N@b?)?<9i=4DW=2kG%2RT?=mT-!#`qDOox9|QrO|2G|{HRKLvzhJuS)B_daVV zOox9S2rKl0g)aiK!@mN^ioF5I4*w1yDrS6e3a7ECnCbAPKu9?pkR5&`Aj=$M;dnsg zG(LC|5%s}SfzXm?0GbXz6CviE3&>tE-{K1Z+2M}?bUM5YhwQ0pOWN^sdqvnJ(yg^g zh_Eylg7RG-Y*cbUKKR`x344jPwSzh=HmYUkjv0A|!*`qFU#2O-nTa|obvys>47uTL z^LJ+`91iz2vFnez`aa&{msS$q(>R0pC!Rm;&*9Vl(CYc(f#f-WGf6$V$#ZBGPm-e` zIs0^vG3Ck6@JbghHsP>H^OUMEUuyzm$aVdr#dFXu&^8u6|y;RL{ifXT#@2rXsE z4<3}2$VosrpQ{0+Gpe(24IpnRoeIc11*ZYhNu3VJQ}nff$;7V_YGViwbqc$U68&>T zZ!yvLOZ0_6$o*0aw+dNsnXG26FqCh}YGxad;0%sxpGAo9YN4gzI}G7-!ty#GTq@iE z$fNKZ0nJp9p+$(f3y^0t_XCy!J_yJv>;mM(@KL~I;ueISuqjUga^QRskd=M|Ft|c4 zNxfyG_5jjJzXQk`C5D(Az9~S8Q37}_U>P8^@+*;bI1o;v%K=%Xv4B)!1t70>O#)=O zvjL;&>?MfdoFR9NNGABW2vbnN%Tj<#rsT=Q4s$mO9L%4DUV7@gGsqZQcg7~=25ZJO^RvMwI=0TlBXSrDV(8OQ7Bwdl9-3A!`0slPb&S+a;B;cOk^Sa}OX(xzEA}09pD@z+eM8K7`N=z+HgJ#Gep) zgdsn;OvHU02_7LmiQG!bdkY16QNh%|>m>#!30bS#vze~0p3d;q07wo82;=WV_iu6jxM(OiDB$0C#N1S`j@HO!M9bGD14X zCjd$DBp`a@XQekjZzEp@G@a&6hN@W3+cxbTK$P>al#?9ldGnE22uN;cs+IzLq0FYE*@o zN#VuVD@^p)C3>4gbLO<&M4MU24v7x_EVq8HGbuMqh8rd2USzn%M4Ro%+a&r#MBjr@ zP)S$tAmf7Iiz3V;jFxwE>}E9X-wC@%fv_t+&PaI>`AL)fT}gggqQ44)XHE1UB>LAx zf?pu|MTD6DWs__kPkvpJ?K7Wyh$Mpll8l9TZ&a{^!j&;}B12;kO8UnmG>M@k^*B}H zg1f~1%mzZjxqx&-^O%@;5TONz%serCtVCad=o3uzg_3)TM6W?~jfoa_T!*l@AW5a$ zIs+ji+L;WA2D3~p_$X4(6}sSBVRERtJPOw%Wo=0co;Z0qNtm0saB-DnQOmcL35BuLDHcXOQMr zgo8hc-@TpDx_5H7p^*n&??w0l(C!5M5#TOB^4U!qKX~>dWb`-?!lwX(zX-!u5M&MB z0wjGBZ=GY^O8_bNPzy%_LLT!bt}#G3l8tAie+)vCEZGbp+m4vI2yumeEMRcG^t&1a zSwX3nfXl{Uktxu{0=^}g#y$ zq?orPv;zsYi?%iyqE89Yxr{fD0&YQ&?Q<#96TyE7$IlqzONIEeK&XVPEZo7wU>0Jo zGh}j+^){P&C*u-tBK2;Q`a==;UWpEN3j3Wv7K389p)ghYHITh}=(R{sc=&Aket2lF zYGbB7%cpALLgLeDmUk3{AY}Dk*jM=#U~u3YHdjD^1U|XBKhp1IlC$4C;QKe@QP8&QHL@z@jnQao8()>q{jl;tF7%oRWK>R|NWZ{^zoX_*z+?Eja}34`!V!= zF~CDvea;&4l&8;dq5K2Pb^!B_%AV%d4ymdg+#{pPopwO$p)ui^8%@TN+C2OopEe-Q z^pN~|oD~)9J{up!x^oT7hze5M&ojS()p*Ckm32zY; z^RD;8$|QP0@d0=*eZ596-vy76cj<&xzw5(vKy-YWvo8?3ASbTZ(CMTpm+&D%r0vxQ zs`#!4q<9_hsqnCx9LjJhW1L?Lb?Xr@@etIx0{qdO3Ga(n&xcrQ8T;+!;fcAn&<=RK;b0l;U!WUt!@k8@~gP zCUuL2cLCB--VI1cc^_cpC~rax%~oBky5eNw6E+1RMz1T?*R1GR6*0QAPexlJMpwz& zisj{JMA_~G`7S_8v>T8TJr9^nY((fKgt$%j3S)fxQj^yuIryBYb&pB;qo}oTv?%;f zl2S~>4?ZI)r9grYlX)3JoIRHVM)e84CV42U>PDdbgh-~MnFn(4`4FE6W9k3 zq9i*R;|KpO+;>T`+2nXc5=i=}iQOSB{Dh%@PIUVekU^mMrJ<0U3(pI|Y{b4Gu`eO? zy2J%vmO|bH!iIPoFw&cSH##e!^A)X?;#4-%OD)uRoyj`P?(Aia%1oJPW+#(*?Iuf5 zqNwqr*3mTH*Klc*(Nh_|J?CMv!~e^@gi>A#9pW4NNlYyUKNVsIS4x-o-<38Rn=GH(~q0y8K+2d0(;<_a5wgwNk^wrQf;W~ORNwse& z%L^C$nla}h0nXZ z%;;x%ncYJo^mByjZFCg{UcU@^nRzG4pqO1DS1n)jB9D1o#ZulDQmTZi3Q+zi$;i%38AJi!4vAHS$SG~NDo{4LP(@OxPBY@bBYqZi zf`!4V(8bEd8zTho>q#hakqzllBQ+3?gIdhK#85K~&eFo(W7#UMoD?cY9ck3p=h7z= zXQ`;zvoTq*jCKw8;>r)cv(~|(*UB3W8#(e^ncd}fZdy1L#MauHzj z>WBsj`&9wbzZMnx%}^H2lv^m6L~~(y&&$Ic$;5XeMo)#(2l#lCk&BBwmZz+9p~|iF zC~8mC)aEM)%#TuUab4pNLn5Ty;mD)vNA%rphHtwWz8hxH%~_QzPu2exE}y{D>>P+h ziMw;^rfs3T%wZ5||7t1qx`#cD&X%DttXEVosm||@)ivguG-D9dWOHLV^nS2hO$m215$E_+EimRx zH8SLbrs;b|tk$AEAs64b$2m2}4wH$eYz&O)dts+U*NQ$ygOu1g!JBUPI6v$j6D_02 zy|wi!>>(Rtwq00NFyG@A`&*a!7enT}^GtHC;|aCqQDMt-Qj&=mZ45V3mH8WR_FXiM#_etKtcB(G6Opv8qljX|()K;y z`k)$qB8YXXtHW-kMw|;_)cstqKGTbrt~u4H)mbUj_ydK?M`c!Ap~ma*tWe_{tyXkm zr_-}JHeRPqnos$vf7AMDK3%Kn^iExr(&=VH@J#4CwCc)QaTO`IXie96bxc|%O%KeI zg>*40T`o%{RjBDIt;VZp_S=VKsZqI5v%qMcbiMa2p=ltckM-%k?%4*P2`6Ter{=9Q z3Zw2u%0Qb;o6zBTM}K&lEqE$2>Fd!xifYkXC4FwHGhOXYr8i$9H95^! zUKm#OMpU6b{Gd^}YWJFIc{@@+5lXGB@@T?5rfbU95neT*C2O`^n46B;%4Jo)p{p=IzpXdj z!TGVg-44zV(%~#Tq~~YoraCykGq=RS`Hi^o4$d#SH9I(h-Z2i&Z>jN%GpcWX*KDbS z^J`^ipv^U%A7zvw0`u$WSe)CZW@>Bd?gkAih9DI$%bIU7(T>Kq| zf6SkoKHH{WZqxh1@5@QQH3#2U`U5%ix%nT=Nxv-z&&_|klg_tZ-s#{7dUxmGn{x1T z9Gq`%yUW25^zO;QAI`y_%E2$p!7sCTuD*GJnD60ex9P!D6 z#QBnh7K`Wd_t1Cwn~8sotBec z;o!WG@gCFHj^`rPPh$BD6bJNG?q%W~}F8@x;|6bT7 z`6;gYSNvj|Uvcf9imU%r{FmglzOg%#?rhBBr4a4Bewpp4&vdmmw&Agr`b_r3wvM%p zZQ*n7I8HjtOE+iQ8aJmmbbC#09ZhGYn_D-g=Q!cHPIw;fqjt5nuk+IBjhQAKtfl9= zqzjz*BfM4JYv-E6`Be(9xwQ*fT07c3Y;0%KYkRskd+j|N*7mftWV)O(=FAT_bJO*i zHssMg8?UXSeO-n8>1pq7UDuvzu4rw~M&u_qwq{qgXItCqGL6lf(^Xwv9bJn%nls&L z5UsANX-GpOX|suww(sJw&jEPm3EcXgrlw4Hw^xTsE)vPo)!kJaIn-l- z>cYcBVRL{svngwpYc=ACP?y=zu`%ORpS51p*wb8xPp2%Zt&cQN-CbQHmFIQb^z!PO zs;ZjBE0%n6ri`O@HE$!&q(3thswq`p!y1kypu57v! zrjt#x&7qyTHxu^CqiwSB6^1Z0bbo!9tw&T+!HdmhfGIKo9UQ?XdB*cqpg4&pmQ}uWI2dimlnrs7m9e)_7lR$JZ6J z-mLW<8#1#tv^K48aY-N@G7 znqFM9*xF=Iwuyb8AAzc7w{3x*YmA9H`diuD+`IkKY$*D$G&L#et<84DeaF(Cwl;6k zW*Bw@JaKz-SZa6F=-nAMU0Zqs{mY!$vzt3xt*)#e-y}NJYNbgJD;0X9JGY-VoZS)H zI=U3pm8X#!S~p}mdT4mf9qG-k$hDaaEX8$i^*!C4kQ|+(vHhIJ^=)Zpj8RlJH?!-5 zLcC*oV`E#Kptb{k1j%p(+2)QcI*0YgRI&BPu3c*%7u`x7sA|;Ge)!3_9u0dHY~D{qH$?SiCT?V`MVgH=1M*JIOflE0f>pK1m}b*;T}FKO*=>Sz}Rt6RIW zJ&kQJ@pIW!wdZol_O7vUAsaTQ zds?#{jgficyJm0|5N-jK3{Pt31TtpB9J^rzQFya=V$G_G#TD~r9y#-fe41L+(;anU z4l!^Y{6a9BFKqtm_LdIMcwT;s%(w;=W4bJQ)>`&5j`rQ&hQ`)*I==373#?vRGA)OE zWFl5&J9XA$>os&3)K0SOK#n80YPgk6Vnj>oS1oEdrM4=)xIUDKv$cjy7aTV1Njyb9 zq6W+nJJ(~xTMVo68aiNHrj4|i)^p6jxwNNU=AVsin6Ysl%CRDPl}hv-ICwV^#R&ZY zbeC56wXS}Mz`jDl#?HpIt!=H@R(J=NBEpAXW==0vMB((`p~Hj{NK z)~FAqbE&`@2-lj9`p!%fRM~{FINQ+#Ke-y?N=H}q62p6Owd0IJD+ntgO3Y^grUHfs zhKZFu(TbtZJe3W5Q6#kt8Jl~WvVB(qjnu>|I`C8a$!+O3p_fy;i_%RW(Tu7EXg-~8 z#1QJNeC&wooxQrTtw(3cT1+}@vC1~C^Du43D2JiRC_8UgT7hLpD~HwgOq)|T+W}?X zXZuSeZr?3lm0gc=F^);&#@ek?|Kux@WtNSKrpSF%#MlSaZ!G($c`uz}gDAULfW>v}fkCx~ff>8g#?l(TBAzT>O4npkkQKX#~k>I!muUWE2@zHP->CRX9$> z=`XfpQX(}+5B1?n*INGBoWej4dvzhurzMF5=K?!gwM90YBd<&ia~mP74Y)4Ha<2zg zW91ROhUrGJH62;H67cel^IOrlNmKxlx_hwEK>yiiAJR55CMTb_jTG+G zxR<>*@IDKsn##a-n^+U|UF;Isy5X$KtHrl+VN#+SO!HRMd#0?FEiqm)?8Oz3)9#hs z-5pJ>MmJD~=?^(0vT5?Yb;6oV_Uw+Xv(&MfGMp(yj$zS3b5uRs_`RIs!a0lRAB|Mq zu5IpNJud5FJZ6(#(b|qy0~;cBGFPt7W;UcFd!pHPtb;|ii2&%(AT^X?JS-SZ!L6n+ z!EmdpU0K(Vu5PGWkzSf<l^d~kZNoxEgmTzm zI5hOK}u(ZN-^o4htV~a* zq}488j$LZA?c0~Vhi|U1PL6jaY3_7H$iC97h88c!45YoKE0e*RNqrw?t(nHI>Y6Cx zWNgo6bOSvNFU_xTFRC*8T-EIjU5)MC+|-Zu08XxNzz*SxwC+2Fylb#OW;x^`*S$p9 zK(h`L%Y29LV$0Z6E4CRBmQmeZU)8XxR(Fe{dRWQpPL3ZHERh}JFgq0+R<RgqMpZtT-WG1c8bdy5|vERt)VCZH17EY=h>HXWC|Hj;4d z2Ir+ok#vSWUkx!O;J&KmkgMjfKx4bYrm_t~7+ctG^yLT>$wJ>}FxMKaF;wG70N<6* zWHXT|#u+-b$|=eg0c#G2%3Nt8DQE)5^28OTmoHu}UCLHm&z2l}wGwKf$R=B1io>At z7@KPy@zznT_oi47Ni95;k`+^3#0raQ6;F2*qWR)2-n(qoF3MUP>OeEIk77GE4FSW$ z19cC3>&2SS$P-mUe1kJni%TCXMV&=#Kg^Lr)79-P$2y=EqhTg1+xQNpZN@kwtzk^x z)J{}SErGjYm1{A9fvum7gB6|?g@VVM*iq)Hs>MrBoV~`(g&3Z*rXhpv%`m6vqM@Uz zmScy^S0fAMFuJs>af2>$7O&4Voh2Ef{P2{y1{pt74M#(lQ&_w%0dOYQ+}Y8J$(sh! zc2iYxZ&g)wRgIC}jtML3IghET<)|zbontCm1s}qFG|h^AI&Q2gYG`NYC_;Rwk~n#L zNhs5rh_~cpU&fAUmeT<$5hK4&Df3nviq)dbN{MSYjlswq7TVnBbTk~E!)&=;Ib;%2 z)OKy$H$NJhd9b2s-^8`8of+HRZSngYOPEFZ)7Dn3TvBCSqIg2VS7DmYL@bbSOfJE? zDx65Sv_v#=;!Gm$wYwaIQa5YE{7?snmNsl$TGJ9%c6Ou6lI5jc3_Cr+t`FL{W!a)< zQ~Rtc7&xUm6DXd4+TDIx7xQZzA`PozYMa5#Jls!^D2G)YQ%weNs$aRZIz&#ce1Fv{ z?CKiDV6I8tx+oCc%IOG`Wg2HSDkrjQ>KklMS3|OEW>*y?6N?Yat6EuC-(ZXDruf*G zgDWvR{8qW{{L@t1B$HeHs(O_cn3l^awAme&RikkY;T4iObFlwuuanG~8;T-=VLlM5 z)J%j~%Cg4pl}$}tCAE?ZAn%A;=1bEhLv^c`l`yh#mmx*SFWh#>BGtvcQYqH+0w>VoF`{m z;4ow%N7XXd@{XoFoUt*sR1Rpc((P=-{fUmQI-K5eBWFoHCiPA0F|pmyiCKpnJ%%$L zwJ_Aa28Z^MSSwqk)XEl^qJ&IOi`e4;yze?1S@zb^47;d2zHXPs-Aj=Cu|_Hj0Z(4#wZ2h<-H;E5 z60>P#NpyF}&adpA?%s53Is%5Z@Vh@v-qNbdhE;XA$W*o5`dqhnhb3c$hIy(?rg5~y z;mt~+TdNk0T%7h6<6mU`CAGJ`5$!3oIN39s|50-|+nBYSLtq_A?#SWLP?6Sy!gxR2 zgGDpU&alE}U>7G5p$Ot%74zzGS3@?|9Co&VNPP0QqM9iI=1z7yjL*T$-n=Ln)KH0B}1wlvZ zS-aN}gyVUc#0`|6p5B! z5nX|k9eUZwmDe6?_sGeB2JC3V2m=?s>LP*j1K-LKk41tt!`c4@ZuuV`J|at19}bm^5l=;YtNtgL=VCXB}}7 zjIN_N6k%-*_MF9yI8#8#MfO1>a%cv}5=LEoPqwy@V|YeDX-V7D>472^Y;mgytvQt1 zi92_j%>fqM&dJGx5@SB?I1XrP?8IRvPNQ)yU@kT(6ZC6rYv9HZdRGswNMt?t$j%%* z$!V6`OCsi39zE$jPnVk8p|)vA!Y-NNSr8U(J{)utu6%inJ_PL~%R< z<7`p+4c0l038lp~<|bTW!9_BsE>>Auu2?p8YtCw%a@6{mSc|^X(OlIAPlUCha)TW( zF~p&%7>@K%7MXn50}MM%uBcDf<4l?Bv=x;#IR4_TpZ+uzHjnbZeheI~lIR$#+pWJ8 z1NM3q$7ecZY35N3OB=~%jSIei`KlV`wiL919&A1}%aM0=w@QN#ciqB)|Zrg%sYcsA^Aw#S>`D&ftl9@ASJY)e!cznH4FWowEcFd7+*=#SH zEKUTK?&L7T5xLKiYvyw$HD2?686z3Q6khU&`Y)u&daSK!VBH)dlj ztGf+{@Qf^8tr#uO!MihExHgXUqB$yFxpEP8Yr7PuReW{@b6Df-bhg~w*oj%5xrU{y zJy{Fe`2hR!W{)qt!48$VaL$D@Iw700a&g+OAb`EUs;U3bY8%>Nij_p0d6m8F`MZ6IsIc+@EWt!QlKGuNhu40k4 z5b6r8Y6XZkFkKB`j4*m;L+2}iwr(h}{eNZ$TD*(*{AeylaprLc=%1E^Nr21H-onV& zXogyqB#Jl1s1WEhc#=j9!qm@t_q_8@t0cSkBlL!$8x!{uhAC>|Y9zm~G-g|ZZ1v@% z!VJ$?y`2J7H^=SYnrqk)kOi zTjcCxo48P(jQW$%%-On1tFcPsz~G5=Du+ zY`L>{Lrl}rCeVIn=MjAjlbPmLtl)cjRVy}4-tx1B8*i3dhIAg+XpK1WqG_U%-HaWM z)tG*vC84#A%hQr!YKEd4omq{}TZwCKxPKEXiRNxd9Vf1A_BsZ0XJ=MrdvjMuYjdSM zW{Rf^Mbk{d&PP9Thu^>IcNQ#a_OA>~n)fe*Gl|>Jj5-_XcV%j^dx;@<|B8|3+rKRJ zc!s#GdIRPeZa%&w1}{wY3cdAL`mI;`4D&@Xg94!eXP9&e?{ektO~I=mX5gRi zopB$){U-PTz%Kj?yrL~%8iS|O=i(noG~4NTu|YHbCA`^RA~YQSzxJ*L%I>1P&%GOB zz!(FiG>0OM5fG`Sn@tFzU?e1@36Gd2A&Cmy+}*vKy|BA?d+*(tL<&(UMjBHv6jKbK zmZR1~Qx0MpsfPxn6sd9$>Z6vTMa1}`;Hy43q`%+HeE<1o{`W2$3M;n$_sq`snr~*l znfYe!|1nc$^ckz69F+B+l%?;dnmJZgIj?G#RrM~L{=zE|ZFL}{MK;lel1O4@r-I2; z9%4G~D{c{)EM{Q^DcHSQEY^lBl49h559}xmhNhipM#oW@ds`GHueN(fp(m)FVBYmm zAuH}g6LX>T9;NhASm!4QAa5;fk&+sc_anecj3`kwlS;z>8F2KOtQ!$7Slo3Nk(&bA z90X`TvbaU4hU94o1=G!l5?cF_o`zKC7ecBoPgX5=ElAhf)U&b*-w*st2nD-GiOrK6 z{LH{c4q`dN>nt9RwaK7OM_{`$J`n+(gV8((GCJLXjLvW%quU(Fi2DbjKHP%GUc~RS z?0!aHv|yibxx3JQ1Sy=*xy#T6*xg~WaW-|spOot?^`aex(vHHq9fk6a0x2J|RM*(O zI|`K@1yXL!$)@_z2vm9xLWgOFj?)FgPK1KFkkM@pl+@hw=*tLcsk!&jlL&FCB^9~* z5io`r{nCQn!sR|mMn zw-a4uMQ7c_cnASwfYCD!WHbqzt$@mCG6D_C*y+76=nZYU2SvCC0Tv?rQ?{^KT|N%Z zrw|f9EMyE)sWr2?-DcT&6XU%IGLsN~!1EYCsCa~zd9yHHgCL`q@HUIP8Hw;N1Z_g* zdp!bajQ1c&dgkl$a=nG{3ZK4}uEnsRvvHTTu`_Hb7&e<}9)RRS*6f+79tHYXOgefB zPFF#IZ5eTcGd04d0G*1!k{^S3iDmaQT4TY?7i&qTSZmp3Mm-kH3ZW%efz@=9(nu`9 z0|;WEl&)L>MXx|$>9!-@<>A{9-{WD%++{3Xrs=fQ!So$w(tNAvRv=W$n99U0wN@Oj z5_bDEs^3W!(ke|fZ{1ONTUdUiWz6$a`4o>Q(7OHd0B=@sJNi{hrk(s% z+&|4;MH6I{cX>fU$!oH?U`OG?9R;^kekoCPaRxmXI(fNNVFdTb3L_}I?OM7OD zOIkG}9SkVR^R6KFj43~)i`{EFXhp7QuACI$?HR0S0>YoCI%8Y}^(y#aR?)3xMQd8q ziM|sCzU!2NOPnut>~ex!eAhte`qoTd*H|o|e^H9o$!6?SNt0S&g4z1i#>~Nsl=4$T zYSn*rwE%AtS&7rkWGNi@vAI%ykc&+;(Zq9?$UW!a5J6p;iQbCBOYuNYN6qMke@RzH z8=zeU13k6==<{nkFP2{lwQj|HuZib~4zpb^I^&VpuJv?<$2#f{qC188H&`w0E@O2q z&$nBp3(eSSQm#YIm1e7%ap-{=*{DC%T#7xuBT_oTo(mW4FS41pNIv-Sv^|3bNIOoT zzqC4VI*G7;1Z{{J6JsEiEaB5bP{Qi zVC(QYk<>%kdQ?)@;;LUug0b8B`OVMi(ksQK9I-=gRbo|m1xosYsR}6ZSZ{*0)RvVX zXp2WhpvO)rU8p=49`wY^r?m7U_o5hT^cA3FJ-&vLTvJ1&xXArFmyRBPmve?UBl>9U z7s;LPNQ|ztV3pCw9VjMP26U|@t-lD76I@S?PH?>luE+$tDR?ykoC%|A5%9w04-P9m91>(7 zW!dW(O>-cllN=~nJp{p5f`r#K@J6${6fIi_DH>j_&dCYMeA(+$-S5XCi%cD9&mgd@ zjGsloV>?DgTfkmMhdEG`heY#iB8tcxDTG-M!6l8vZTy6=RdGAa*6@Ia2NG^Xz^hNa zHxc+a0t(7#x20ck`Ar1wc63Jf3Y`E?C{)iQMTN91_1uOa#U^~a#hrWI19-2(?*RN6 zh2IHypTZ@7(Z?d(r}*~+W|1U+ssB}=U59{f&n&4{O{d#%EaHa{ist0(vCFkBXdegd zU#;BiOzzeev^z3dS0?ueXmfDfV$lTJGc9NnA(P5Y&1fOt(?Q#6_07rhSk!{HI-`ZO z>srt*&S;^0&5Raa#tgK1S-yc5-bNZL?b0ldxtTs`wX_w}Wm1rfC*?qoSAKyWzq6O- z6XfDWz*zH7-?a<+;&<=@yEk|f297vgijek|xuE?af_Bum z{5HHS0;;hVC!4NA0C*{)Z4Q)7u0_I~J~88uAmDxHZxy##@MfS$$Y?JDvtaz7Ba0G} zKI7R!yEiX(1PXM4EmZd6^ig@z=^(9*rI@H6LD#SeoV8Tbcni{E)RqRoBwe^2u{#EK zTQ-}{1?>z3>1Kq_v3T5{KaZSF1Rd{t9g;bd2SI!Up=jpc^c3RbA)q>VU7(q^VHvq_XwV#UKqKpv4|Xi^(+shs{ny(Dph4_>l<8ULr1) z4|wYrcJXe#h)7(pht3LSXh#c;2Mu3l^KssU@MkO@ zmrvxSd;yPVkktDGxp>6n^~8Kh*Xqt?KJ5!thS;N~`AC`a56R-Pr+i7L>%s$@Kd>mx_p}Z*m^ z#Bzksx44t*13av7$#peoLEbA)ko?^91diRX&7y>UEm-4$!`efRAqv z+(h7OR>-Xr2|p@K0zXtt$%z_B*SQNXU-EXtdh~^9y7*|XKkg9i21f3qBu; zuYBEFFSOt)i;}V(toT{$YtOG?k?k;B!tYr%u?t^MuR?pdxopz41$5>U@TQ#*C2m*w zf<1~|q-@+_Hio=~Q^X5<=>@}Gp3?G$8(X8bzo&XxW;Dr5jpTxPi%=!jrcrLD4OvpP zSWOg7KI@{{kSoq}*gf_8tp|y!6K+>MEya>JZ`Rgo@^Y;g{Ajw&n}j^ZE{pUzJE$s% z%2s0SdSa_0wN5`ai{?!c_r%m$N}2ON=hFP*c}mi?tbYE{=yMk<%`PtXsM&?-MNdl_ zmgH$Mg#LV{s2AFj&u6lkV77hxvh3$ky0RUe3uoKkHfh8ZD;=EvgUG#2Zt=iuH-i4R z^s%OICx_9B4}IO$`lFcERGm)Jr+w;$#w8!zBOb`wzG%X2M-8XVt$9TgZt=zR*1EJz zs#glt&cN;HtqeHHY%%XLGhQ<(t6iS*eDfQn9C#KGU-?|~6iLyl9&JWM>=a+D-hl#T z6>0~!DtzmH-kRE~(rL$tj1VD`d%Gq{{d}r9q)(@v*yo5GN;`(da@snv?x1UHwg?%U z&mWuK{0!cD@t*#cZf8TxiN6-*R4Wj*@Kx5%mTY=Ouo_hN8-{myUk7pQgTzf%I_e=~8cX1MnYuCQc$=4|G0q;^vvM_istgeOwAg zMvM=IicimLdJTSOwrm&4TR`Uy%X&vf z-sn^9;M_DH0eb~D9CW)0LjG?-80nm6_A@8%`5{T)$&bG$`D z(LzHu&GtOkZHSJP9|q4^FDts;`b^F##@>E*XK9FjD<=w}raxKt&+)L^wh3BVl_H!z z?Y5?bnlC(;q&rml_wd30s0!_Q%h2~}FQ{^jjo3uH8MDAP_`Sbt%+KL4+BSGML^-hR zn7JB=-Ag(A#6T&VZ};+ymQrg=Ofa(_hb%Lr{Zpiz}JNBo8-+A%DS05vweeOxsEI0Lt? z0BIwV`!UP?z-#bQFP>azZf;DuUhj@J<>vi*6!|Sh!$zM|VT#NJxxLv->7kNr-b}{t zHrqy&MZMk@^_%l>|82D1a4*DI)J(G&a2n@03G{5y9a;zBpbE`J_PfwTA!+@Gq2t{-HBJ9&O zn(gR1sd7yDP%q0+G&i1&hmq)iZOi|5h=o(NJ_XDbJo8_fr`ZRda|PT7*&T!B&Z+t) zIHMi*R77hDpJ~ya`Gc~c!#s=tn=dn_ap)*zrY%@zKiOUlG%mFGl?lH8C});c=OWL` z^{uLB_->zdzNXphIjzng`bw5nJPc7b-`#FlV+>2q%XPpRYeNSFh^lW#bQYXT+vbvP zkd73YGjp|JZo94Shu@0a4jDyv+u=FAovD7mt*Ll>ru8u?Z$tIiT6SKvZZkUX#Z52g zA$iffX`L~r;di#S#+j%Kn%*uaICR(#EHda3JJmb_gqh?#&9}kGh@&}1R%p~~iN z1Z+S92e^4OFVnUQ9JGfXKvg*trd7Ss)BS-II6qtlYXudGYr*u{>W;OTiNrsrs zt;2H~)X@m&;cv)wi1=Uy}TMsGm;ffeFpbKjy9SPCn#(HD?UZxqnR$*Ej*hf zSD}NsoO3&We>P*a+y;IZx|>U>*y;dGfvxOF!@90RxAX5e1i4BR-I zftzJBOhNx(IM#;~5Hl=B+cB*6p&zkags)b((9@VQxBBp)k|*4U_GGx)hxa39;Eu@* zyL`AAF$1?qX5e1M4BVBNfx8ehaKB#$?%>P7-FO-1`@kJ`8Mr^JT!gu0E5kM)?!&I2 z4BWX=F2eju^*2{*3-Ci(eiqA*UoSmtDYp2kmCU#b^B{hKruA2lF!A;@(k;A1_F zU)BBQdT}hkvBgh6+g;@GbDe{|n1?GWV z&d)ITS%iEJAt{(IKeA!yRC);WQxFDzK9OFeEyBkN46703B7A`l-G~`JffxE2rXML% zV~?4JFaOF#_z8s*<|~?Gy(r69D;fC8UV4$nm*wOl%s0~*_~w{ggnyxMp|^`E`^-Ve zx6|`$OP|@;G}tWTh}}lB?&5xddU@#8%qGq=H#56=f?vZ6mb)QhX7*OPN7k2cdkDve zg6q)Xk?tX!?wa9M+!+;Kxw{+Z?+P}+Q`LQ{KAs3Gh*FN{E<%N3d(T{OpY1^y9=EU! zmN9s9kiZsm%C+y%$;EpvBaeT?$}FmE8(vN^K(@gkh^K&HP$2cKaHOxEX?#%n3z;f7!& z_m(#!Pvs*;4tI+pxr;6`=4J1vW_O8PA5ekGsXS%O%V#(l{uf?T!K4r44$IAUIeW3s@i%Bte@WHf2b^-9p1$)syx{&uk9Z#WJ3TC%pFCVJn`s1pNnU>qTwt`u%9jf7lZo7xKPZ}Ms(d2Hq`KX9o>DY-QL(>7j7v zPak+SpwMleK5!E7Il@MIj=yj{eSm4D?F{(m0O#+bxrmGSW8;3L4X`8AMV->akvi{_ochZKG_@GT0z z5%?~J?*_hI;roE!ukbGdzgyvt0l!b-KLY*>g?C^I{f5GS8~BykId5lcDz4E{u_bwc_x3q5;F3NVZZ*I3i+piPr~|C>iZ1v zEB$(v{6k?IJ`er8*EbXJTyJmk&jdb<{FZqBIl$#UDETXZ^S=BAp3i5od@k^iFYkMR z^Et+l=YJG9@3l*N{2g#z{(k_@=g4B;yMXig#73X~3&8oD=XQ@j37pSIuJZU4+>+vR z;p;vAD&V4@<$VKiK6mE*8QSw~;Cv-IStxGvB6z|Ted z!bDcS1YGC89yp(aulD=~@X(%5ANVuiTK_e`pDJ#FG|S&%J_uar_pt>3Byc_hUxzki zdG7*#E9^ZT>4|?1c(>|*4*}=%n@-RF7I3*}pTjU#A4mQ&o?Zu>&+AVFkNRc<-w*pr z|9vBHKG#~|$Inux$KYoB%)tLLaH${LuOGNv%KOT-&+HU0oe+(MeT<%X#g}(0q=W|Q3 z&qUlZUIAl@J*NQI{rf0&OPTHaTHw1?`^^Tf^P8XGX9MR(P14^k2F~|DPC%7tuSiR1e^;CwFI=lQ#ddwa4xcL3+RFmRDp-+jP&Pn8$be+4+_gz3PU-`9b& ze$syXfqxb4C*%8vz^AGDJqtY84|m+r(0mW&ey{J9z_q=82ly(qADfizHygMv?|k5V zPXYw_%niW# zJXXf*KLOX};fcE%|99ZiVV`|aN_%|^ILE8l>j%L3e$ouj|9O)B5ZFfRJDj#s_WfPp zd~aZnPyfb5ekpLiV}x#M^REKe{o(Bi{%+uM(T98j_yMd*c+noW0pAbU*#rI)cxcap zZOh<~CzvmQugm|{1b-a(_tpIKG;nR-$>>OYpQ#sl(tf`K{0a^(TeceV z%pSY~zH-G`e^e?FSYBEpz_}J!xNy0RoA~B}A0|?2bERJMi2AH==}@CmZ|V>IR#XOS z8!DQ@7dhQmfHU#w<4|R0r`cEd={v&n;}cA9~5qgfiRR~n6xdWGCMuF&VN zT(DwQ$*BMZNVCS*Xgy`&$~CJNE}1!djuGe-Gu&Us7h%YxR^K#p&a8R!OtaQoD{Y)P zr>k?WgF)}=JjL`3_AakA0C#l~?jGsutJHzw3&oz1`oh89b1OsS&N3)jZ>>qzJTqKt zG(B>v85$WZ;cbRGd0kyZ8>PP5$WSlw*~Ej^Q}R_RE#j*Yxq3Nr_ynbaR-1`B^bAzW z^%7p8aCs)Qfm&@idu4cKvtB6=mKLmDF%OBe7l}O%6Z&se1}b$C0x|nkNNDcuRJ=nx z)LX9i;w5D&+fW&5vPejoV|o3%PVGE5kFZ#|~iH-Tf)67(`D!Sd>GC2mhr zgiFb|fffw))@#+?1wB0&PZ$MOGsRH1P;yU@rt_#&!=q^>ge+C?`0_fwsj1X;Mxjn# zW@WQFFtBt`%;Bkx>iQux--b#LOjW`V3h+Er?(HtU9ZseasI$yjtIt}tszfK?+sQT1 zNWI*w)`k}L^DUxYGlDUR#znD8%%aj;;#jQI*=g}b9Qxhx06u#xVKkREnuQC_J@?E7 z3(v7?|ESUotqq4U($ha&?k!cB2-Zrot;pbNINgo#_Iht9_iW!u8-25_n0*V~4!6E? zPetp+2fu7LKR*3;0W<}a^}#9AyC}VL0Nb%v>ZuK(&&=v{a*g4EYI8Q=FuJ_yR2}pO zLSng6sfhtGT;pq1;%IEnJ%bpW75f^OQn9i!)O+S8G?8kN)>RNYWuI7QmMblK zBi%Gl=mB#~vy*R)Wt3T6!IiDSH|iDYYSwE5_*lXEyK~P90@5$CZ0u(|=KMx?mzxXe zyr8?=HZHm^zr_sg-N45H^~yjAo~Z(>cJ>ZeT?3={Eu zeD4j;2I^s>P>H!MyYLW3K#-YDCpS=O^mT>48GZDIPP($v6qCZ>!x$%(sSla3abVlasOEs&7>seF2q;fu|Eax1=i?nE|Y^Y~V#kEq& zIw7QA-=qcc!Xma!a4QCt@oaNmd1wTF0-wNE>geeZ!WWIzCi*6Aszgr#jCL6+E2lc^ zR9kO5ZDX8_bm#lu%8|x!)Ernw!7&YYiLRBgb;#p9%l6}IDy#kam4 z!xNI_?tw}?Kw;dWo?#A=%AZ8twYSn&9vQGbRMsI7@~wVy0B1YTEwj!@y^eLzz^0Xz zfxhK6OjGf!qoy0_qNNfiIq|7y4fPJ!I6uYT$f^8J3C;-4jUI&dt_^RpHTI)|6@q7W zH9`vwH+s$l36Pxu761+l#=&xx4KQGP+v;k)IZ_^QzOY1>o^?{l`1;TBGwDdP$Iv5g z%(t4I%B=0ZGnP3E4r*k03D%8oFW2c!`YYvO+d0D2yUD9l6N*#9nTfur5~d|zqEkcR z=yS@wy?&hH<>AN+(S^#`)y+5;bZ4jq!TH6r$?`CrWIDP|%~w6CFd9fTurxP&X12h9 zFLLY5(&Fj>#zW?tmg2is6b#O?=Mr-+7BM4m!G5flD)trX*kjHM)$3xFoWnx?#6HQ{9NtH2NA<17F!Y(u38l^>`&;U};nQ=nJbc z<=wIt!%~P{R?Uj|W#`?6o0OWJwGDkeSW&5|7eDdPtbNt>enqLuoN2}nM(KHWk?Lmp P%Fy~I=Y5VnJ2U 2a: 00 00 nop - 2c: 0c 94 31 09 jmp 0x1262 ; 0x1262 <__vector_11> - 30: 0c 94 d5 09 jmp 0x13aa ; 0x13aa <__vector_12> + 2c: 0c 94 69 09 jmp 0x12d2 ; 0x12d2 <__vector_11> + 30: 0c 94 0d 0a jmp 0x141a ; 0x141a <__vector_12> 34: 9c c0 rjmp .+312 ; 0x16e <__bad_interrupt> 36: 00 00 nop 38: 9a c0 rjmp .+308 ; 0x16e <__bad_interrupt> @@ -158,18 +158,18 @@ 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 e8 ldi r30, 0x88 ; 136 + 148: e8 ef ldi r30, 0xF8 ; 248 14a: fe e1 ldi r31, 0x1E ; 30 14c: 02 c0 rjmp .+4 ; 0x152 <__do_copy_data+0x10> 14e: 05 90 lpm r0, Z+ 150: 0d 92 st X+, r0 - 152: aa 37 cpi r26, 0x7A ; 122 + 152: ae 34 cpi r26, 0x4E ; 78 154: b1 07 cpc r27, r17 156: d9 f7 brne .-10 ; 0x14e <__do_copy_data+0xc> 00000158 <__do_clear_bss>: 158: 12 e0 ldi r17, 0x02 ; 2 - 15a: aa e7 ldi r26, 0x7A ; 122 + 15a: ae e4 ldi r26, 0x4E ; 78 15c: b1 e0 ldi r27, 0x01 ; 1 15e: 01 c0 rjmp .+2 ; 0x162 <.do_clear_bss_start> @@ -177,11 +177,11 @@ Disassembly of section .text: 160: 1d 92 st X+, r1 00000162 <.do_clear_bss_start>: - 162: a0 3f cpi r26, 0xF0 ; 240 + 162: a4 3d cpi r26, 0xD4 ; 212 164: b1 07 cpc r27, r17 166: e1 f7 brne .-8 ; 0x160 <.do_clear_bss_loop> - 168: 2f d6 rcall .+3166 ; 0xdc8
- 16a: 0c 94 42 0f jmp 0x1e84 ; 0x1e84 <_exit> + 168: 67 d6 rcall .+3278 ; 0xe38
+ 16a: 0c 94 7a 0f jmp 0x1ef4 ; 0x1ef4 <_exit> 0000016e <__bad_interrupt>: 16e: 48 cf rjmp .-368 ; 0x0 <__vectors> @@ -540,9 +540,9 @@ ISR( TIMER0_OVF_vect) { 2f4: 11 24 eor r1, r1 2f6: 8f 93 push r24 t0ovfcount++; - 2f8: 80 91 e2 02 lds r24, 0x02E2 + 2f8: 80 91 c6 02 lds r24, 0x02C6 2fc: 8f 5f subi r24, 0xFF ; 255 - 2fe: 80 93 e2 02 sts 0x02E2, r24 + 2fe: 80 93 c6 02 sts 0x02C6, r24 } 302: 8f 91 pop r24 304: 0f 90 pop r0 @@ -556,7 +556,7 @@ ISR( TIMER0_OVF_vect) { uint16_t t0ext(void) { return (t0ovfcount * 256 + (u16) TCNT0); // return current counter value 30e: 86 b5 in r24, 0x26 ; 38 - 310: 30 91 e2 02 lds r19, 0x02E2 + 310: 30 91 c6 02 lds r19, 0x02C6 314: 20 e0 ldi r18, 0x00 ; 0 316: 28 0f add r18, r24 318: 31 1d adc r19, r1 @@ -571,7 +571,7 @@ void t0rst(void) { TCNT0 = 0; // set counter to zero 31e: 16 bc out 0x26, r1 ; 38 t0ovfcount = 0; // set overflow counter to zero - 320: 10 92 e2 02 sts 0x02E2, r1 + 320: 10 92 c6 02 sts 0x02C6, r1 } 324: 08 95 ret @@ -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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 346: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 352: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 372: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 37e: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 392: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 39e: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> 3a2: 87 fd sbrc r24, 7 3a4: f2 cf rjmp .-28 ; 0x38a 3a6: 41 c0 rjmp .+130 ; 0x42a @@ -681,7 +681,7 @@ u08 adb(void) { if (adb_werte[z_byte] & bitpos) 3ae: e1 2e mov r14, r17 3b0: ff 24 eor r15, r15 - 3b2: 89 ec ldi r24, 0xC9 ; 201 + 3b2: 8d ea ldi r24, 0xAD ; 173 3b4: 92 e0 ldi r25, 0x02 ; 2 3b6: e8 0e add r14, r24 3b8: f9 1e adc r15, r25 @@ -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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 3d0: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 3dc: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 3ee: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 3fa: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 40e: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 41a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 43e: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 44a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> 44e: 87 fd sbrc r24, 7 450: f2 cf rjmp .-28 ; 0x436 ; @@ -801,19 +801,19 @@ 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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 45e: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 46a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> 46e: 87 fd sbrc r24, 7 470: f2 cf rjmp .-28 ; 0x456 ; // Entscheidung, ob noch weitere Daten übertragen werden if (adb_werte[0] == COM_LISTEN3) - 472: 80 91 c9 02 lds r24, 0x02C9 + 472: 80 91 ad 02 lds r24, 0x02AD 476: 8b 33 cpi r24, 0x3B ; 59 478: 29 f0 breq .+10 ; 0x484 anzahl_out = 2 + 1; @@ -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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 498: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 ad 0e call 0x1d5a ; 0x1d5a <__gesf2> + 4a4: 0e 94 e5 0e call 0x1dca ; 0x1dca <__gesf2> 4a8: 18 16 cp r1, r24 4aa: 0c f4 brge .+2 ; 0x4ae 4ac: 42 c0 rjmp .+132 ; 0x532 <__stack+0x33> @@ -869,7 +869,7 @@ u08 adb(void) { while (!(ADB_PIN & ADB_BIT)) 4b2: 48 9b sbis 0x09, 0 ; 9 4b4: fe cf rjmp .-4 ; 0x4b2 - 4b6: ca ec ldi r28, 0xCA ; 202 + 4b6: ce ea ldi r28, 0xAE ; 174 4b8: d2 e0 ldi r29, 0x02 ; 2 4ba: 11 e0 ldi r17, 0x01 ; 1 4bc: 01 c0 rjmp .+2 ; 0x4c0 @@ -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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 4d4: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 ad 0e call 0x1d5a ; 0x1d5a <__gesf2> + 4e0: 0e 94 e5 0e call 0x1dca ; 0x1dca <__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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 4fe: 0e 94 33 0e call 0x1c66 ; 0x1c66 <__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 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> + 50a: 0e 94 9b 0d call 0x1b36 ; 0x1b36 <__cmpsf2> 50e: 87 ff sbrs r24, 7 510: 03 c0 rjmp .+6 ; 0x518 <__stack+0x19> adb_werte[z_byte] += bitpos; @@ -1020,12 +1020,12 @@ void touchpad_init(void) { uint8_t touchpad_read(void) { adb_werte[0] = COM_TALK0; 556: 8c e3 ldi r24, 0x3C ; 60 - 558: 80 93 c9 02 sts 0x02C9, r24 + 558: 80 93 ad 02 sts 0x02AD, r24 adb_data_length = adb(); 55c: e4 de rcall .-568 ; 0x326 - 55e: 80 93 e3 02 sts 0x02E3, r24 + 55e: 80 93 c7 02 sts 0x02C7, r24 return adb_data_length; - 562: 80 91 e3 02 lds r24, 0x02E3 + 562: 80 91 c7 02 lds r24, 0x02C7 } 566: 08 95 ret @@ -1037,13 +1037,13 @@ void touchpad_set_rel_mode_100dpi(void) { // Auf Relativmodus umschalten adb_werte[0] = COM_LISTEN3; 568: 8b e3 ldi r24, 0x3B ; 59 - 56a: 80 93 c9 02 sts 0x02C9, r24 + 56a: 80 93 ad 02 sts 0x02AD, r24 adb_werte[1] = BITS(0110,0011); 56e: 83 e6 ldi r24, 0x63 ; 99 - 570: 80 93 ca 02 sts 0x02CA, r24 + 570: 80 93 ae 02 sts 0x02AE, r24 adb_werte[2] = 1; //default modus: 100 dpi mouse 574: 81 e0 ldi r24, 0x01 ; 1 - 576: 80 93 cb 02 sts 0x02CB, r24 + 576: 80 93 af 02 sts 0x02AF, r24 adb(); 57a: d5 de rcall .-598 ; 0x326 #else @@ -1073,13 +1073,13 @@ void touchpad_set_rel_mode_100dpi(void) { int8_t delta_y(void) { if(adb_data_length ==0) { - 590: 80 91 e3 02 lds r24, 0x02E3 + 590: 80 91 c7 02 lds r24, 0x02C7 594: 88 23 and r24, r24 596: 51 f0 breq .+20 ; 0x5ac return 0; } if (adb_werte[1] & 0b01000000) { - 598: 80 91 ca 02 lds r24, 0x02CA + 598: 80 91 ae 02 lds r24, 0x02AE 59c: 86 ff sbrs r24, 6 59e: 04 c0 rjmp .+8 ; 0x5a8 return -((128 - adb_werte[1]) & 0b00111111); @@ -1110,13 +1110,13 @@ int8_t delta_y(void) { int8_t delta_x(void) { if(adb_data_length ==0) { - 5b0: 80 91 e3 02 lds r24, 0x02E3 + 5b0: 80 91 c7 02 lds r24, 0x02C7 5b4: 88 23 and r24, r24 5b6: 51 f0 breq .+20 ; 0x5cc return 0; } if (adb_werte[2] & 0b01000000) { - 5b8: 80 91 cb 02 lds r24, 0x02CB + 5b8: 80 91 af 02 lds r24, 0x02AF 5bc: 86 ff sbrs r24, 6 5be: 04 c0 rjmp .+8 ; 0x5c8 return -((128 - adb_werte[2]) & 0b00111111); @@ -1171,8 +1171,8 @@ void Usb2SerialTask(void) { GlobalInterruptDisable(); Count = Buffer->Count; - 5d6: 20 91 88 01 lds r18, 0x0188 - 5da: 30 91 89 01 lds r19, 0x0189 + 5d6: 20 91 5c 01 lds r18, 0x015C + 5da: 30 91 5d 01 lds r19, 0x015D static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); @@ -1183,16 +1183,16 @@ void Usb2SerialTask(void) { /* 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 86 01 lds r24, 0x0186 - 5e4: 90 91 87 01 lds r25, 0x0187 + 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 { int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - 5ee: 84 e5 ldi r24, 0x54 ; 84 + 5ee: 88 e2 ldi r24, 0x28 ; 40 5f0: 91 e0 ldi r25, 0x01 ; 1 - 5f2: 0e 94 d0 0c call 0x19a0 ; 0x19a0 + 5f2: 0e 94 08 0d call 0x1a10 ; 0x1a10 5f6: bc 01 movw r22, r24 /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ @@ -1200,7 +1200,7 @@ void Usb2SerialTask(void) { 5f8: 97 fd sbrc r25, 7 5fa: 03 c0 rjmp .+6 ; 0x602 RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); - 5fc: 8e e7 ldi r24, 0x7E ; 126 + 5fc: 82 e5 ldi r24, 0x52 ; 82 5fe: 91 e0 ldi r25, 0x01 ; 1 600: b7 dd rcall .-1170 ; 0x170 static inline uint_reg_t GetGlobalInterruptMask(void) @@ -1217,8 +1217,8 @@ void Usb2SerialTask(void) { #if (ARCH == ARCH_AVR8) cli(); 604: f8 94 cli - 606: 80 91 14 02 lds r24, 0x0214 - 60a: 90 91 15 02 lds r25, 0x0215 + 606: 80 91 e8 01 lds r24, 0x01E8 + 60a: 90 91 e9 01 lds r25, 0x01E9 static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); @@ -1239,7 +1239,7 @@ void Usb2SerialTask(void) { { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 614: 20 91 55 01 lds r18, 0x0155 + 614: 20 91 29 01 lds r18, 0x0129 618: 2f 70 andi r18, 0x0F ; 15 61a: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. @@ -1277,15 +1277,15 @@ void Usb2SerialTask(void) { static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) { return *Buffer->Out; - 634: e0 91 0c 02 lds r30, 0x020C - 638: f0 91 0d 02 lds r31, 0x020D + 634: e0 91 e0 01 lds r30, 0x01E0 + 638: 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: 84 e5 ldi r24, 0x54 ; 84 + 63c: 88 e2 ldi r24, 0x28 ; 40 63e: 91 e0 ldi r25, 0x01 ; 1 640: 60 81 ld r22, Z - 642: 0e 94 5f 0c call 0x18be ; 0x18be + 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 @@ -1295,8 +1295,8 @@ void Usb2SerialTask(void) { /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ RingBuffer_Remove(&USARTtoUSB_Buffer); - 64c: 8a e0 ldi r24, 0x0A ; 10 - 64e: 92 e0 ldi r25, 0x02 ; 2 + 64c: 8e ed ldi r24, 0xDE ; 222 + 64e: 91 e0 ldi r25, 0x01 ; 1 650: aa dd rcall .-1196 ; 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 */ @@ -1312,11 +1312,11 @@ void Usb2SerialTask(void) { // sendPayload(&dummy,1,0); // } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); - 656: 84 e5 ldi r24, 0x54 ; 84 + 656: 88 e2 ldi r24, 0x28 ; 40 658: 91 e0 ldi r25, 0x01 ; 1 - 65a: 0e 94 b9 0c call 0x1972 ; 0x1972 + 65a: 0e 94 f1 0c call 0x19e2 ; 0x19e2 USB_USBTask(); - 65e: 0e 94 73 0b call 0x16e6 ; 0x16e6 + 65e: 0e 94 ab 0b call 0x1756 ; 0x1756 } 662: 1f 91 pop r17 @@ -1358,7 +1358,7 @@ void clock_prescale_set(clock_div_t __x) // LEDs_Init(); USB_Init(); } - 68e: da c5 rjmp .+2996 ; 0x1244 + 68e: 12 c6 rjmp .+3108 ; 0x12b4 00000690 : @@ -1385,9 +1385,9 @@ void EVENT_USB_Device_ConfigurationChanged(void) bool ConfigSuccess = true; ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); - 694: 84 e5 ldi r24, 0x54 ; 84 + 694: 88 e2 ldi r24, 0x28 ; 40 696: 91 e0 ldi r25, 0x01 ; 1 - 698: 0c 94 3b 0c jmp 0x1876 ; 0x1876 + 698: 0c 94 73 0c jmp 0x18e6 ; 0x18e6 0000069c : } @@ -1396,9 +1396,9 @@ void EVENT_USB_Device_ConfigurationChanged(void) void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); - 69c: 84 e5 ldi r24, 0x54 ; 84 + 69c: 88 e2 ldi r24, 0x28 ; 40 69e: 91 e0 ldi r25, 0x01 ; 1 - 6a0: 0c 94 8e 0b jmp 0x171c ; 0x171c + 6a0: 0c 94 c6 0b jmp 0x178c ; 0x178c 000006a4 <__vector_23>: @@ -1432,8 +1432,8 @@ ISR(USART1_RX_vect, ISR_BLOCK) 6cc: 84 30 cpi r24, 0x04 ; 4 6ce: 19 f4 brne .+6 ; 0x6d6 <__vector_23+0x32> RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); - 6d0: 8a e0 ldi r24, 0x0A ; 10 - 6d2: 92 e0 ldi r25, 0x02 ; 2 + 6d0: 8e ed ldi r24, 0xDE ; 222 + 6d2: 91 e0 ldi r25, 0x01 ; 1 6d4: 4d dd rcall .-1382 ; 0x170 } 6d6: ff 91 pop r31 @@ -1479,7 +1479,7 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI 710: a2 30 cpi r26, 0x02 ; 2 712: 28 f4 brcc .+10 ; 0x71e 714: b0 e0 ldi r27, 0x00 ; 0 - 716: ad 58 subi r26, 0x8D ; 141 + 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 @@ -1541,28 +1541,28 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI 75a: 87 95 ror r24 75c: 77 95 ror r23 75e: 67 95 ror r22 - 760: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 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 ff 0c call 0x19fe ; 0x19fe <__addsf3> + 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 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 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 67 0d call 0x1ace ; 0x1ace <__divsf3> + 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 fe 0c call 0x19fc ; 0x19fc <__subsf3> - 794: 0e 94 cf 0d call 0x1b9e ; 0x1b9e <__fixunssfsi> + 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 @@ -1601,8 +1601,8 @@ void uart_putc(unsigned char data) 7c8: 84 30 cpi r24, 0x04 ; 4 7ca: 19 f4 brne .+6 ; 0x7d2 RingBuffer_Insert(&USARTtoUSB_Buffer, data); - 7cc: 8a e0 ldi r24, 0x0A ; 10 - 7ce: 92 e0 ldi r25, 0x02 ; 2 + 7cc: 8e ed ldi r24, 0xDE ; 222 + 7ce: 91 e0 ldi r25, 0x01 ; 1 7d0: cf cc rjmp .-1634 ; 0x170 7d2: 08 95 ret @@ -1648,7 +1648,7 @@ void uart_puts(const char *s ) // convert an unsigned integer to string -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { +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 @@ -1667,8 +1667,8 @@ void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { 818: 1f 93 push r17 81a: cf 93 push r28 81c: df 93 push r29 - 81e: 7b 01 movw r14, r22 - 820: 8c 01 movw r16, r24 + 81e: 6b 01 movw r12, r22 + 820: 7c 01 movw r14, r24 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator @@ -1679,15 +1679,15 @@ void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { 82a: f9 1f adc r31, r25 82c: 10 82 st Z, r1 for (i = (no_digits - 1); i >= 0; i--) { - 82e: d2 2e mov r13, r18 - 830: da 94 dec r13 + 82e: 12 2f mov r17, r18 + 830: 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) { - 832: 4d 2c mov r4, r13 +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 @@ -1701,15 +1701,15 @@ void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { 840: aa 24 eor r10, r10 842: bb 24 eor r11, r11 if (zahl == 0 && i < (no_digits - 1)) { - string[i] = ' '; + string[i] = leading_char; } else { string[i] = (zahl % 10) + '0'; - 844: aa e0 ldi r26, 0x0A ; 10 - 846: 6a 2e mov r6, r26 + 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 -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { +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 @@ -1719,5075 +1719,5162 @@ void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { 850: 08 94 sec 852: 21 08 sbc r2, r1 854: 31 08 sbc r3, r1 - string[i] = ' '; - 856: f0 e2 ldi r31, 0x20 ; 32 - 858: cf 2e mov r12, r31 // convert an unsigned integer to string -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { +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--) { - 85a: 22 c0 rjmp .+68 ; 0x8a0 + 856: 22 c0 rjmp .+68 ; 0x89c if (zahl == 0 && i < (no_digits - 1)) { - 85c: e1 14 cp r14, r1 + 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: 01 05 cpc r16, r1 - 862: 11 05 cpc r17, r1 - 864: 41 f4 brne .+16 ; 0x876 + 860: 41 f4 brne .+16 ; 0x872 }/* uart_puts */ // convert an unsigned integer to string -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { - 866: c5 01 movw r24, r10 - 868: 84 0d add r24, r4 - 86a: 95 1d adc r25, r5 +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 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)) { - 86c: 82 15 cp r24, r2 - 86e: 93 05 cpc r25, r3 - 870: 14 f4 brge .+4 ; 0x876 - string[i] = ' '; - 872: c8 82 st Y, r12 - 874: 08 c0 rjmp .+16 ; 0x886 + 868: 82 15 cp r24, r2 + 86a: 93 05 cpc r25, r3 + 86c: 14 f4 brge .+4 ; 0x872 + string[i] = leading_char; + 86e: 08 83 st Y, r16 + 870: 08 c0 rjmp .+16 ; 0x882 } else { string[i] = (zahl % 10) + '0'; - 876: c8 01 movw r24, r16 - 878: b7 01 movw r22, r14 - 87a: a4 01 movw r20, r8 - 87c: 93 01 movw r18, r6 - 87e: 0e 94 ea 0e call 0x1dd4 ; 0x1dd4 <__udivmodsi4> - 882: 60 5d subi r22, 0xD0 ; 208 - 884: 68 83 st Y, r22 + 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 } // Modulo rechnen, dann den ASCII-Code von '0' addieren zahl /= 10; - 886: c8 01 movw r24, r16 - 888: b7 01 movw r22, r14 - 88a: a4 01 movw r20, r8 - 88c: 93 01 movw r18, r6 - 88e: 0e 94 ea 0e call 0x1dd4 ; 0x1dd4 <__udivmodsi4> - 892: 79 01 movw r14, r18 - 894: 8a 01 movw r16, r20 + 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 // convert an unsigned integer to string -void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { +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--) { - 896: da 94 dec r13 - 898: 21 97 sbiw r28, 0x01 ; 1 - 89a: 08 94 sec - 89c: a1 08 sbc r10, r1 - 89e: b1 08 sbc r11, r1 - 8a0: d7 fe sbrs r13, 7 - 8a2: dc cf rjmp .-72 ; 0x85c + 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 string[i] = (zahl % 10) + '0'; } // Modulo rechnen, dann den ASCII-Code von '0' addieren zahl /= 10; } } - 8a4: df 91 pop r29 - 8a6: cf 91 pop r28 - 8a8: 1f 91 pop r17 - 8aa: 0f 91 pop r16 - 8ac: ff 90 pop r15 - 8ae: ef 90 pop r14 - 8b0: df 90 pop r13 - 8b2: cf 90 pop r12 - 8b4: bf 90 pop r11 - 8b6: af 90 pop r10 - 8b8: 9f 90 pop r9 - 8ba: 8f 90 pop r8 - 8bc: 7f 90 pop r7 - 8be: 6f 90 pop r6 - 8c0: 5f 90 pop r5 - 8c2: 4f 90 pop r4 - 8c4: 3f 90 pop r3 - 8c6: 2f 90 pop r2 - 8c8: 08 95 ret - -000008ca : + 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 : int8_t sign(int16_t x) { return (x > 0) - (x < 0); - 8ca: 21 e0 ldi r18, 0x01 ; 1 - 8cc: 18 16 cp r1, r24 - 8ce: 19 06 cpc r1, r25 - 8d0: 0c f0 brlt .+2 ; 0x8d4 - 8d2: 20 e0 ldi r18, 0x00 ; 0 - 8d4: 89 2f mov r24, r25 + 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 - 8d8: 88 27 eor r24, r24 - 8da: 88 1f adc r24, r24 } - 8dc: 28 1b sub r18, r24 - 8de: 82 2f mov r24, r18 - 8e0: 08 95 ret - -000008e2 : - - -void uart_print_number(uint32_t zahl, uint8_t no_digits) { - 8e2: 24 2f mov r18, r20 - my_uitoa(abs(zahl),stringbuffer,no_digits); - 8e4: 77 ff sbrs r23, 7 - 8e6: 03 c0 rjmp .+6 ; 0x8ee - 8e8: 70 95 com r23 - 8ea: 61 95 neg r22 - 8ec: 7f 4f sbci r23, 0xFF ; 255 - 8ee: 88 27 eor r24, r24 - 8f0: 77 fd sbrc r23, 7 - 8f2: 80 95 com r24 - 8f4: 98 2f mov r25, r24 - 8f6: 42 ed ldi r20, 0xD2 ; 210 - 8f8: 52 e0 ldi r21, 0x02 ; 2 + 8d8: 28 1b sub r18, r24 + 8da: 82 2f mov r24, r18 + 8dc: 08 95 ret + +000008de : + 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 + 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 uart_puts(stringbuffer); - 8fc: 82 ed ldi r24, 0xD2 ; 210 + 8fc: 86 eb ldi r24, 0xB6 ; 182 8fe: 92 e0 ldi r25, 0x02 ; 2 - + 900: 69 df rcall .-302 ; 0x7d4 } - 900: 69 cf rjmp .-302 ; 0x7d4 + 902: 0f 91 pop r16 + 904: 08 95 ret + +00000906 : -00000902 : void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { - 902: 0f 93 push r16 - 904: 1f 93 push r17 - 906: 24 2f mov r18, r20 - my_uitoa(abs(zahl),stringbuffer,no_digits); - 908: 8b 01 movw r16, r22 - 90a: 77 ff sbrs r23, 7 - 90c: 03 c0 rjmp .+6 ; 0x914 - 90e: 70 95 com r23 - 910: 61 95 neg r22 - 912: 7f 4f sbci r23, 0xFF ; 255 - 914: 88 27 eor r24, r24 - 916: 77 fd sbrc r23, 7 - 918: 80 95 com r24 - 91a: 98 2f mov r25, r24 - 91c: 42 ed ldi r20, 0xD2 ; 210 - 91e: 52 e0 ldi r21, 0x02 ; 2 - 920: 6c df rcall .-296 ; 0x7fa + 906: ff 92 push r15 + 908: 0f 93 push r16 + 90a: 1f 93 push r17 + 90c: 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 if (sign(zahl) < 0) { - 922: c8 01 movw r24, r16 - 924: d2 df rcall .-92 ; 0x8ca - 926: 87 ff sbrs r24, 7 - 928: 02 c0 rjmp .+4 ; 0x92e + 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 uart_putc('-'); - 92a: 8d e2 ldi r24, 0x2D ; 45 - 92c: 01 c0 rjmp .+2 ; 0x930 + 936: 8d e2 ldi r24, 0x2D ; 45 + 938: 01 c0 rjmp .+2 ; 0x93c } else { uart_putc('+'); - 92e: 8b e2 ldi r24, 0x2B ; 43 - 930: 49 df rcall .-366 ; 0x7c4 + 93a: 8b e2 ldi r24, 0x2B ; 43 + 93c: 43 df rcall .-378 ; 0x7c4 } uart_puts(stringbuffer); - 932: 82 ed ldi r24, 0xD2 ; 210 - 934: 92 e0 ldi r25, 0x02 ; 2 - 936: 4e df rcall .-356 ; 0x7d4 + 93e: 86 eb ldi r24, 0xB6 ; 182 + 940: 92 e0 ldi r25, 0x02 ; 2 + 942: 48 df rcall .-368 ; 0x7d4 } - 938: 1f 91 pop r17 - 93a: 0f 91 pop r16 - 93c: 08 95 ret + 944: 1f 91 pop r17 + 946: 0f 91 pop r16 + 948: ff 90 pop r15 + 94a: 08 95 ret -0000093e : +0000094c : PORTY2 |= ((byte & (1<<2))>>2)<>3)< + 94c: 80 e0 ldi r24, 0x00 ; 0 + 94e: 44 dc rcall .-1912 ; 0x1d8 set_y(0); - 942: 80 e0 ldi r24, 0x00 ; 0 - 944: 84 dc rcall .-1784 ; 0x24e + 950: 80 e0 ldi r24, 0x00 ; 0 + 952: 7d dc rcall .-1798 ; 0x24e DDRX0 |= (1<: +00000966 : uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direction +1 or -1, 0 for coil deactivation - 958: 0f 93 push r16 - 95a: 1f 93 push r17 - 95c: 16 2f mov r17, r22 - 95e: 82 30 cpi r24, 0x02 ; 2 - 960: 50 f4 brcc .+20 ; 0x976 - 962: a8 2f mov r26, r24 - 964: b0 e0 ldi r27, 0x00 ; 0 - 966: aa 0f add r26, r26 - 968: bb 1f adc r27, r27 - 96a: ab 58 subi r26, 0x8B ; 139 - 96c: be 4f sbci r27, 0xFE ; 254 - 96e: 2d 91 ld r18, X+ - 970: 3c 91 ld r19, X - 972: 11 97 sbiw r26, 0x01 ; 1 - 974: 02 c0 rjmp .+4 ; 0x97a - 976: 2c ee ldi r18, 0xEC ; 236 - 978: 30 e0 ldi r19, 0x00 ; 0 + 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 case Y: setport = &set_y; break; } next_phase = (phase_memory[motor] + 4 + direction) % 4; - 97a: e8 2f mov r30, r24 - 97c: f0 e0 ldi r31, 0x00 ; 0 - 97e: 81 2f mov r24, r17 - 980: 99 27 eor r25, r25 - 982: 87 fd sbrc r24, 7 - 984: 90 95 com r25 - 986: 04 96 adiw r24, 0x04 ; 4 - 988: ee 53 subi r30, 0x3E ; 62 - 98a: fd 4f sbci r31, 0xFD ; 253 - 98c: 40 81 ld r20, Z - 98e: 84 0f add r24, r20 - 990: 91 1d adc r25, r1 - 992: 64 e0 ldi r22, 0x04 ; 4 - 994: 70 e0 ldi r23, 0x00 ; 0 - 996: 0e 94 d7 0e call 0x1dae ; 0x1dae <__divmodhi4> + 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> phase_memory[motor] = next_phase; - 99a: 80 83 st Z, r24 + 9a8: 80 83 st Z, r24 next_pattern = phase_pattern[next_phase]; - 99c: e8 2f mov r30, r24 - 99e: f0 e0 ldi r31, 0x00 ; 0 - 9a0: e1 59 subi r30, 0x91 ; 145 - 9a2: fe 4f sbci r31, 0xFE ; 254 - 9a4: 00 81 ld r16, Z + 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 if (direction != 0) { - 9a6: 11 23 and r17, r17 - 9a8: 11 f0 breq .+4 ; 0x9ae + 9b4: 11 23 and r17, r17 + 9b6: 11 f0 breq .+4 ; 0x9bc (*setport)(next_pattern); - 9aa: 80 2f mov r24, r16 - 9ac: 01 c0 rjmp .+2 ; 0x9b0 + 9b8: 80 2f mov r24, r16 + 9ba: 01 c0 rjmp .+2 ; 0x9be } else { (*setport)(0); - 9ae: 80 e0 ldi r24, 0x00 ; 0 - 9b0: f9 01 movw r30, r18 - 9b2: 09 95 icall + 9bc: 80 e0 ldi r24, 0x00 ; 0 + 9be: f9 01 movw r30, r18 + 9c0: 09 95 icall } return next_pattern; } - 9b4: 80 2f mov r24, r16 - 9b6: 1f 91 pop r17 - 9b8: 0f 91 pop r16 - 9ba: 08 95 ret + 9c2: 80 2f mov r24, r16 + 9c4: 1f 91 pop r17 + 9c6: 0f 91 pop r16 + 9c8: 08 95 ret -000009bc : +000009ca : return val; } uint8_t move_plate(int16_t dx, int16_t dy){ - 9bc: 0f 93 push r16 - 9be: 1f 93 push r17 + 9ca: 0f 93 push r16 + 9cc: 1f 93 push r17 static int16_t todo_x,todo_y = 0; int8_t signum; uint8_t returnval = 0; todo_x += dx; - 9c0: 20 91 c0 02 lds r18, 0x02C0 - 9c4: 30 91 c1 02 lds r19, 0x02C1 - 9c8: 28 0f add r18, r24 - 9ca: 39 1f adc r19, r25 - 9cc: 30 93 c1 02 sts 0x02C1, r19 - 9d0: 20 93 c0 02 sts 0x02C0, r18 + 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 todo_y += dy; - 9d4: 80 91 be 02 lds r24, 0x02BE - 9d8: 90 91 bf 02 lds r25, 0x02BF - 9dc: 86 0f add r24, r22 - 9de: 97 1f adc r25, r23 - 9e0: 90 93 bf 02 sts 0x02BF, r25 - 9e4: 80 93 be 02 sts 0x02BE, r24 + 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 signum = sign(todo_x); - 9e8: c9 01 movw r24, r18 - 9ea: 6f df rcall .-290 ; 0x8ca - 9ec: 08 2f mov r16, r24 + 9f6: c9 01 movw r24, r18 + 9f8: 66 df rcall .-308 ; 0x8c6 + 9fa: 08 2f mov r16, r24 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; - 9ee: 11 e0 ldi r17, 0x01 ; 1 - 9f0: 88 23 and r24, r24 - 9f2: 09 f4 brne .+2 ; 0x9f6 - 9f4: 10 e0 ldi r17, 0x00 ; 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 signum = sign(todo_x); if(signum != 0) { returnval++; } motor_step(X,signum); - 9f6: 80 e0 ldi r24, 0x00 ; 0 - 9f8: 60 2f mov r22, r16 - 9fa: ae df rcall .-164 ; 0x958 + a04: 80 e0 ldi r24, 0x00 ; 0 + a06: 60 2f mov r22, r16 + a08: ae df rcall .-164 ; 0x966 todo_x -= signum; - 9fc: 60 2f mov r22, r16 - 9fe: 77 27 eor r23, r23 - a00: 67 fd sbrc r22, 7 - a02: 70 95 com r23 - a04: 20 91 c0 02 lds r18, 0x02C0 - a08: 30 91 c1 02 lds r19, 0x02C1 - a0c: 26 1b sub r18, r22 - a0e: 37 0b sbc r19, r23 - a10: 30 93 c1 02 sts 0x02C1, r19 - a14: 20 93 c0 02 sts 0x02C0, r18 + 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 signum = sign(todo_y); - a18: 80 91 be 02 lds r24, 0x02BE - a1c: 90 91 bf 02 lds r25, 0x02BF - a20: 54 df rcall .-344 ; 0x8ca - a22: 08 2f mov r16, r24 + 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 if(signum != 0) { - a24: 81 11 cpse r24, r1 + a32: 81 11 cpse r24, r1 returnval++; - a26: 1f 5f subi r17, 0xFF ; 255 + a34: 1f 5f subi r17, 0xFF ; 255 } motor_step(Y,signum); - a28: 81 e0 ldi r24, 0x01 ; 1 - a2a: 60 2f mov r22, r16 - a2c: 95 df rcall .-214 ; 0x958 + a36: 81 e0 ldi r24, 0x01 ; 1 + a38: 60 2f mov r22, r16 + a3a: 95 df rcall .-214 ; 0x966 todo_y -= signum; - a2e: 60 2f mov r22, r16 - a30: 77 27 eor r23, r23 - a32: 67 fd sbrc r22, 7 - a34: 70 95 com r23 - a36: 20 91 be 02 lds r18, 0x02BE - a3a: 30 91 bf 02 lds r19, 0x02BF - a3e: 26 1b sub r18, r22 - a40: 37 0b sbc r19, r23 - a42: 30 93 bf 02 sts 0x02BF, r19 - a46: 20 93 be 02 sts 0x02BE, r18 + 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 return returnval; // busy } - a4a: 81 2f mov r24, r17 - a4c: 1f 91 pop r17 - a4e: 0f 91 pop r16 - a50: 08 95 ret + a58: 81 2f mov r24, r17 + a5a: 1f 91 pop r17 + a5c: 0f 91 pop r16 + a5e: 08 95 ret -00000a52 : +00000a60 : + +void print_steps_in_mm(int16_t steps) { + a60: 0f 93 push r16 + a62: 1f 93 push r17 + a64: 8c 01 movw r16, r24 + int16_t predot,postdot; + + predot = steps/24; + a66: 68 e1 ldi r22, 0x18 ; 24 + a68: 70 e0 ldi r23, 0x00 ; 0 + a6a: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> + postdot = ((abs(steps)%24)*417)/10; + uart_print_signed_number(predot,3); + a6e: 88 27 eor r24, r24 + a70: 77 fd sbrc r23, 7 + a72: 80 95 com r24 + a74: 98 2f mov r25, r24 + a76: 43 e0 ldi r20, 0x03 ; 3 + a78: 46 df rcall .-372 ; 0x906 + uart_putc('.'); + a7a: 8e e2 ldi r24, 0x2E ; 46 + a7c: a3 de rcall .-698 ; 0x7c4 + +void print_steps_in_mm(int16_t steps) { + int16_t predot,postdot; + + predot = steps/24; + postdot = ((abs(steps)%24)*417)/10; + a7e: c8 01 movw r24, r16 + a80: 17 ff sbrs r17, 7 + a82: 03 c0 rjmp .+6 ; 0xa8a + a84: 90 95 com r25 + a86: 81 95 neg r24 + a88: 9f 4f sbci r25, 0xFF ; 255 + a8a: 68 e1 ldi r22, 0x18 ; 24 + a8c: 70 e0 ldi r23, 0x00 ; 0 + a8e: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> + a92: 61 ea ldi r22, 0xA1 ; 161 + a94: 71 e0 ldi r23, 0x01 ; 1 + a96: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + a9a: 6a e0 ldi r22, 0x0A ; 10 + a9c: 70 e0 ldi r23, 0x00 ; 0 + a9e: 0e 94 0f 0f call 0x1e1e ; 0x1e1e <__divmodhi4> + uart_print_signed_number(predot,3); + uart_putc('.'); + uart_print_number_wlzeros(postdot,3); + aa2: 88 27 eor r24, r24 + aa4: 77 fd sbrc r23, 7 + aa6: 80 95 com r24 + aa8: 98 2f mov r25, r24 + aaa: 43 e0 ldi r20, 0x03 ; 3 + aac: 18 df rcall .-464 ; 0x8de + +} + aae: 1f 91 pop r17 + ab0: 0f 91 pop r16 + ab2: 08 95 ret + +00000ab4 : void pos_report(void){ uart_puts("x_pos: "); - a52: 80 e0 ldi r24, 0x00 ; 0 - a54: 91 e0 ldi r25, 0x01 ; 1 - a56: be de rcall .-644 ; 0x7d4 - uart_print_signed_number(plate_pos_x,6); - a58: 60 91 7a 01 lds r22, 0x017A - a5c: 70 91 7b 01 lds r23, 0x017B - a60: 88 27 eor r24, r24 - a62: 77 fd sbrc r23, 7 - a64: 80 95 com r24 - a66: 98 2f mov r25, r24 - a68: 46 e0 ldi r20, 0x06 ; 6 - a6a: 4b df rcall .-362 ; 0x902 + ab4: 80 e0 ldi r24, 0x00 ; 0 + ab6: 91 e0 ldi r25, 0x01 ; 1 + ab8: 8d de rcall .-742 ; 0x7d4 +// uart_print_signed_number(plate_pos_x,6); + print_steps_in_mm(plate_pos_x); + aba: 80 91 4e 01 lds r24, 0x014E + abe: 90 91 4f 01 lds r25, 0x014F + ac2: ce df rcall .-100 ; 0xa60 // my_uitoa(plate_pos_x, stringbuffer, 6); // uart_puts(stringbuffer); uart_puts(" y_pos: "); - a6c: 88 e0 ldi r24, 0x08 ; 8 - a6e: 91 e0 ldi r25, 0x01 ; 1 - a70: b1 de rcall .-670 ; 0x7d4 - uart_print_signed_number(plate_pos_y,6); - a72: 60 91 7c 01 lds r22, 0x017C - a76: 70 91 7d 01 lds r23, 0x017D - a7a: 88 27 eor r24, r24 - a7c: 77 fd sbrc r23, 7 - a7e: 80 95 com r24 - a80: 98 2f mov r25, r24 - a82: 46 e0 ldi r20, 0x06 ; 6 - a84: 3e df rcall .-388 ; 0x902 + ac4: 88 e0 ldi r24, 0x08 ; 8 + ac6: 91 e0 ldi r25, 0x01 ; 1 + ac8: 85 de rcall .-758 ; 0x7d4 +// uart_print_signed_number(plate_pos_y,6); + print_steps_in_mm(plate_pos_y); + aca: 80 91 50 01 lds r24, 0x0150 + ace: 90 91 51 01 lds r25, 0x0151 + ad2: c6 df rcall .-116 ; 0xa60 uart_puts("\r"); - a86: 82 e1 ldi r24, 0x12 ; 18 - a88: 91 e0 ldi r25, 0x01 ; 1 + ad4: 82 e1 ldi r24, 0x12 ; 18 + ad6: 91 e0 ldi r25, 0x01 ; 1 } - a8a: a4 ce rjmp .-696 ; 0x7d4 + ad8: 7d ce rjmp .-774 ; 0x7d4 -00000a8c : +00000ada : #define POSITION 0 #define GOTO 1 #define MOVEREL 2 #define SETZERO 3 void parse_command(void){ - a8c: cf 92 push r12 - a8e: df 92 push r13 - a90: ef 92 push r14 - a92: ff 92 push r15 - a94: 0f 93 push r16 - a96: 1f 93 push r17 - a98: cf 93 push r28 - a9a: df 93 push r29 + ada: cf 92 push r12 + adc: df 92 push r13 + ade: ef 92 push r14 + ae0: ff 92 push r15 + ae2: 0f 93 push r16 + ae4: 1f 93 push r17 + ae6: cf 93 push r28 + ae8: df 93 push r29 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - a9c: 2f b7 in r18, 0x3f ; 63 + aea: 2f b7 in r18, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - a9e: f8 94 cli + aec: f8 94 cli uint16_t Count; uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); Count = Buffer->Count; - aa0: 80 91 88 01 lds r24, 0x0188 - aa4: 90 91 89 01 lds r25, 0x0189 + aee: 80 91 5c 01 lds r24, 0x015C + af2: 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; - aa8: 2f bf out 0x3f, r18 ; 63 + af6: 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))) { - aaa: 00 97 sbiw r24, 0x00 ; 0 - aac: 09 f4 brne .+2 ; 0xab0 - aae: 83 c1 rjmp .+774 ; 0xdb6 + af8: 00 97 sbiw r24, 0x00 ; 0 + afa: 09 f4 brne .+2 ; 0xafe + afc: 94 c1 rjmp .+808 ; 0xe26 byte = RingBuffer_Remove(&USBtoUSART_Buffer); - ab0: 8e e7 ldi r24, 0x7E ; 126 - ab2: 91 e0 ldi r25, 0x01 ; 1 - ab4: 78 db rcall .-2320 ; 0x1a6 + afe: 82 e5 ldi r24, 0x52 ; 82 + b00: 91 e0 ldi r25, 0x01 ; 1 + b02: 51 db rcall .-2398 ; 0x1a6 + b04: 18 2f mov r17, r24 if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand! - ab6: 8d 30 cpi r24, 0x0D ; 13 - ab8: 19 f0 breq .+6 ; 0xac0 - aba: 8a 30 cpi r24, 0x0A ; 10 - abc: 09 f0 breq .+2 ; 0xac0 - abe: 70 c1 rjmp .+736 ; 0xda0 + b06: 8d 30 cpi r24, 0x0D ; 13 + b08: 19 f0 breq .+6 ; 0xb10 + b0a: 8a 30 cpi r24, 0x0A ; 10 + b0c: 09 f0 breq .+2 ; 0xb10 + b0e: 74 c1 rjmp .+744 ; 0xdf8 uart_puts("\r\n"); - ac0: 84 e1 ldi r24, 0x14 ; 20 - ac2: 91 e0 ldi r25, 0x01 ; 1 - ac4: 87 de rcall .-754 ; 0x7d4 + b10: 84 e1 ldi r24, 0x14 ; 20 + b12: 91 e0 ldi r25, 0x01 ; 1 + b14: 5f de rcall .-834 ; 0x7d4 cmdbuffer[cmdPos] = '\0'; // terminate new command string - ac6: 80 91 99 02 lds r24, 0x0299 - aca: e8 2f mov r30, r24 - acc: f0 e0 ldi r31, 0x00 ; 0 - ace: e2 55 subi r30, 0x52 ; 82 - ad0: fd 4f sbci r31, 0xFD ; 253 - ad2: 10 82 st Z, r1 + b16: 80 91 6d 02 lds r24, 0x026D + b1a: e8 2f mov r30, r24 + b1c: f0 e0 ldi r31, 0x00 ; 0 + b1e: ee 57 subi r30, 0x7E ; 126 + b20: fd 4f sbci r31, 0xFD ; 253 + b22: 10 82 st Z, r1 curCmdLen = cmdPos; - ad4: 80 93 98 02 sts 0x0298, r24 + b24: 80 93 6c 02 sts 0x026C, r24 cmdPos = 0; - ad8: 10 92 99 02 sts 0x0299, r1 + b28: 10 92 6d 02 sts 0x026D, r1 if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command - adc: 80 91 ae 02 lds r24, 0x02AE - ae0: 87 36 cpi r24, 0x67 ; 103 - ae2: 59 f0 breq .+22 ; 0xafa - ae4: 87 34 cpi r24, 0x47 ; 71 - ae6: 49 f0 breq .+18 ; 0xafa + b2c: 80 91 82 02 lds r24, 0x0282 + b30: 87 36 cpi r24, 0x67 ; 103 + b32: 59 f0 breq .+22 ; 0xb4a + b34: 87 34 cpi r24, 0x47 ; 71 + b36: 49 f0 breq .+18 ; 0xb4a action = GOTO; } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { - ae8: 8d 36 cpi r24, 0x6D ; 109 - aea: 49 f0 breq .+18 ; 0xafe - aec: 8d 34 cpi r24, 0x4D ; 77 - aee: 39 f0 breq .+14 ; 0xafe + b38: 8d 36 cpi r24, 0x6D ; 109 + b3a: 49 f0 breq .+18 ; 0xb4e + b3c: 8d 34 cpi r24, 0x4D ; 77 + b3e: 39 f0 breq .+14 ; 0xb4e action = MOVEREL; } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { - af0: 8a 37 cpi r24, 0x7A ; 122 - af2: 39 f0 breq .+14 ; 0xb02 - af4: 8a 35 cpi r24, 0x5A ; 90 - af6: 39 f4 brne .+14 ; 0xb06 - af8: 04 c0 rjmp .+8 ; 0xb02 + b40: 8a 37 cpi r24, 0x7A ; 122 + b42: 39 f0 breq .+14 ; 0xb52 + b44: 8a 35 cpi r24, 0x5A ; 90 + b46: 39 f4 brne .+14 ; 0xb56 + b48: 04 c0 rjmp .+8 ; 0xb52 curCmdLen = cmdPos; cmdPos = 0; if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command action = GOTO; - afa: 01 e0 ldi r16, 0x01 ; 1 - afc: 05 c0 rjmp .+10 ; 0xb08 + b4a: 01 e0 ldi r16, 0x01 ; 1 + b4c: 05 c0 rjmp .+10 ; 0xb58 } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { action = MOVEREL; - afe: 02 e0 ldi r16, 0x02 ; 2 - b00: 03 c0 rjmp .+6 ; 0xb08 + b4e: 02 e0 ldi r16, 0x02 ; 2 + b50: 03 c0 rjmp .+6 ; 0xb58 } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { action = SETZERO; - b02: 03 e0 ldi r16, 0x03 ; 3 - b04: 01 c0 rjmp .+2 ; 0xb08 + b52: 03 e0 ldi r16, 0x03 ; 3 + b54: 01 c0 rjmp .+2 ; 0xb58 } else { action = POSITION; - b06: 00 e0 ldi r16, 0x00 ; 0 + b56: 00 e0 ldi r16, 0x00 ; 0 } if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { - b08: 80 91 af 02 lds r24, 0x02AF - b0c: 88 37 cpi r24, 0x78 ; 120 - b0e: 39 f0 breq .+14 ; 0xb1e - b10: 88 35 cpi r24, 0x58 ; 88 - b12: 29 f0 breq .+10 ; 0xb1e + b58: 80 91 83 02 lds r24, 0x0283 + b5c: 88 37 cpi r24, 0x78 ; 120 + b5e: 39 f0 breq .+14 ; 0xb6e + b60: 88 35 cpi r24, 0x58 ; 88 + b62: 29 f0 breq .+10 ; 0xb6e axis = X; } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { - b14: 89 37 cpi r24, 0x79 ; 121 - b16: 29 f0 breq .+10 ; 0xb22 + b64: 89 37 cpi r24, 0x79 ; 121 + b66: 29 f0 breq .+10 ; 0xb72 #define POSITION 0 #define GOTO 1 #define MOVEREL 2 #define SETZERO 3 void parse_command(void){ - b18: 11 e0 ldi r17, 0x01 ; 1 - b1a: 89 35 cpi r24, 0x59 ; 89 - b1c: 19 f0 breq .+6 ; 0xb24 + b68: 11 e0 ldi r17, 0x01 ; 1 + b6a: 89 35 cpi r24, 0x59 ; 89 + b6c: 19 f0 breq .+6 ; 0xb74 } else { action = POSITION; } if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { axis = X; - b1e: 10 e0 ldi r17, 0x00 ; 0 - b20: 01 c0 rjmp .+2 ; 0xb24 + b6e: 10 e0 ldi r17, 0x00 ; 0 + b70: 01 c0 rjmp .+2 ; 0xb74 } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { axis = Y; - b22: 11 e0 ldi r17, 0x01 ; 1 + b72: 11 e0 ldi r17, 0x01 ; 1 } // if you expect coordinate, parse number! if (action == GOTO || action == MOVEREL){ - b24: 80 2f mov r24, r16 - b26: 81 50 subi r24, 0x01 ; 1 - b28: 82 30 cpi r24, 0x02 ; 2 - b2a: 08 f0 brcs .+2 ; 0xb2e - b2c: 6d c0 rjmp .+218 ; 0xc08 + b74: 80 2f mov r24, r16 + b76: 81 50 subi r24, 0x01 ; 1 + b78: 82 30 cpi r24, 0x02 ; 2 + b7a: 08 f0 brcs .+2 ; 0xb7e + b7c: 6d c0 rjmp .+218 ; 0xc58 predot = 0; - b2e: 10 92 9d 02 sts 0x029D, r1 - b32: 10 92 9c 02 sts 0x029C, r1 + b7e: 10 92 71 02 sts 0x0271, r1 + b82: 10 92 70 02 sts 0x0270, r1 postdot = 0; - b36: 10 92 9b 02 sts 0x029B, r1 - b3a: 10 92 9a 02 sts 0x029A, r1 + b86: 10 92 6f 02 sts 0x026F, r1 + b8a: 10 92 6e 02 sts 0x026E, r1 num_sign = 1; num_start = 0; - b3e: 10 92 97 02 sts 0x0297, r1 + b8e: 10 92 6b 02 sts 0x026B, r1 nums_found = 0; - b42: 10 92 96 02 sts 0x0296, r1 + b92: 10 92 6a 02 sts 0x026A, r1 for (uint8_t i=2; i<=curCmdLen; i++) { - b46: 92 e0 ldi r25, 0x02 ; 2 - b48: f9 2e mov r15, r25 + b96: 92 e0 ldi r25, 0x02 ; 2 + b98: f9 2e mov r15, r25 // if you expect coordinate, parse number! if (action == GOTO || action == MOVEREL){ predot = 0; postdot = 0; num_sign = 1; - b4a: dd 24 eor r13, r13 - b4c: d3 94 inc r13 + b9a: dd 24 eor r13, r13 + b9c: 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'; - b4e: 80 e3 ldi r24, 0x30 ; 48 - b50: c8 2e mov r12, r24 + b9e: 80 e3 ldi r24, 0x30 ; 48 + ba0: c8 2e mov r12, r24 postdot = 0; num_sign = 1; num_start = 0; nums_found = 0; for (uint8_t i=2; i<=curCmdLen; i++) { - b52: 54 c0 rjmp .+168 ; 0xbfc + ba2: 54 c0 rjmp .+168 ; 0xc4c if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before - b54: e0 90 97 02 lds r14, 0x0297 - b58: ee 20 and r14, r14 - b5a: 49 f4 brne .+18 ; 0xb6e - b5c: ef 2d mov r30, r15 - b5e: f0 e0 ldi r31, 0x00 ; 0 - b60: e2 55 subi r30, 0x52 ; 82 - b62: fd 4f sbci r31, 0xFD ; 253 - b64: 80 81 ld r24, Z - b66: 8d 32 cpi r24, 0x2D ; 45 - b68: 11 f4 brne .+4 ; 0xb6e + ba4: e0 90 6b 02 lds r14, 0x026B + ba8: ee 20 and r14, r14 + baa: 49 f4 brne .+18 ; 0xbbe + bac: ef 2d mov r30, r15 + bae: f0 e0 ldi r31, 0x00 ; 0 + bb0: ee 57 subi r30, 0x7E ; 126 + bb2: fd 4f sbci r31, 0xFD ; 253 + bb4: 80 81 ld r24, Z + bb6: 8d 32 cpi r24, 0x2D ; 45 + bb8: 11 f4 brne .+4 ; 0xbbe // you find a digit, it's a negative number num_sign = -1; - b6a: dd 24 eor r13, r13 - b6c: da 94 dec r13 + bba: dd 24 eor r13, r13 + bbc: da 94 dec r13 } if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number? - b6e: cf 2d mov r28, r15 - b70: d0 e0 ldi r29, 0x00 ; 0 - b72: fe 01 movw r30, r28 - b74: e2 55 subi r30, 0x52 ; 82 - b76: fd 4f sbci r31, 0xFD ; 253 - b78: 80 81 ld r24, Z - b7a: 80 53 subi r24, 0x30 ; 48 - b7c: 8a 30 cpi r24, 0x0A ; 10 - b7e: 28 f4 brcc .+10 ; 0xb8a + bbe: cf 2d mov r28, r15 + bc0: d0 e0 ldi r29, 0x00 ; 0 + bc2: fe 01 movw r30, r28 + bc4: ee 57 subi r30, 0x7E ; 126 + bc6: fd 4f sbci r31, 0xFD ; 253 + bc8: 80 81 ld r24, Z + bca: 80 53 subi r24, 0x30 ; 48 + bcc: 8a 30 cpi r24, 0x0A ; 10 + bce: 28 f4 brcc .+10 ; 0xbda if ( num_start == 0) { // this is the first digit in the string - b80: ee 20 and r14, r14 - b82: d9 f5 brne .+118 ; 0xbfa + bd0: ee 20 and r14, r14 + bd2: d9 f5 brne .+118 ; 0xc4a num_start = i; - b84: f0 92 97 02 sts 0x0297, r15 - b88: 38 c0 rjmp .+112 ; 0xbfa + bd4: f0 92 6b 02 sts 0x026B, r15 + bd8: 38 c0 rjmp .+112 ; 0xc4a } } else { // no digit! if ( num_start != 0) { // digits have been found before - b8a: ee 20 and r14, r14 - b8c: b1 f1 breq .+108 ; 0xbfa + bda: ee 20 and r14, r14 + bdc: b1 f1 breq .+108 ; 0xc4a strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to - b8e: 6e 2d mov r22, r14 - b90: 70 e0 ldi r23, 0x00 ; 0 - b92: c6 1b sub r28, r22 - b94: d7 0b sbc r29, r23 - b96: 62 55 subi r22, 0x52 ; 82 - b98: 7d 4f sbci r23, 0xFD ; 253 - b9a: 8e e9 ldi r24, 0x9E ; 158 - b9c: 92 e0 ldi r25, 0x02 ; 2 - b9e: ae 01 movw r20, r28 - ba0: 0e 94 29 0f call 0x1e52 ; 0x1e52 + bde: 6e 2d mov r22, r14 + be0: 70 e0 ldi r23, 0x00 ; 0 + be2: c6 1b sub r28, r22 + be4: d7 0b sbc r29, r23 + be6: 6e 57 subi r22, 0x7E ; 126 + be8: 7d 4f sbci r23, 0xFD ; 253 + bea: 82 e7 ldi r24, 0x72 ; 114 + bec: 92 e0 ldi r25, 0x02 ; 2 + bee: ae 01 movw r20, r28 + bf0: 0e 94 61 0f call 0x1ec2 ; 0x1ec2 // numbuffer numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string - ba4: c2 56 subi r28, 0x62 ; 98 - ba6: dd 4f sbci r29, 0xFD ; 253 - ba8: 18 82 st Y, r1 + bf4: ce 58 subi r28, 0x8E ; 142 + bf6: dd 4f sbci r29, 0xFD ; 253 + bf8: 18 82 st Y, r1 nums_found++; - baa: 80 91 96 02 lds r24, 0x0296 - bae: 8f 5f subi r24, 0xFF ; 255 - bb0: 80 93 96 02 sts 0x0296, r24 + bfa: 80 91 6a 02 lds r24, 0x026A + bfe: 8f 5f subi r24, 0xFF ; 255 + c00: 80 93 6a 02 sts 0x026A, r24 if(nums_found == 1) { // its the predot digits - bb4: 81 30 cpi r24, 0x01 ; 1 - bb6: 49 f4 brne .+18 ; 0xbca + c04: 81 30 cpi r24, 0x01 ; 1 + c06: 49 f4 brne .+18 ; 0xc1a predot = atoi(numbuffer); - bb8: 8e e9 ldi r24, 0x9E ; 158 - bba: 92 e0 ldi r25, 0x02 ; 2 - bbc: 0e 94 0c 0f call 0x1e18 ; 0x1e18 - bc0: 90 93 9d 02 sts 0x029D, r25 - bc4: 80 93 9c 02 sts 0x029C, r24 - bc8: 16 c0 rjmp .+44 ; 0xbf6 + c08: 82 e7 ldi r24, 0x72 ; 114 + c0a: 92 e0 ldi r25, 0x02 ; 2 + c0c: 0e 94 44 0f call 0x1e88 ; 0x1e88 + c10: 90 93 71 02 sts 0x0271, r25 + c14: 80 93 70 02 sts 0x0270, r24 + c18: 16 c0 rjmp .+44 ; 0xc46 } else { // its the postdot digits uint8_t postdotlen = i-num_start; - bca: 8f 2d mov r24, r15 - bcc: 8e 19 sub r24, r14 + c1a: 8f 2d mov r24, r15 + c1c: 8e 19 sub r24, r14 if (postdotlen < 3){ // if too small ,fill with zeros - bce: 83 30 cpi r24, 0x03 ; 3 - bd0: 40 f4 brcc .+16 ; 0xbe2 + c1e: 83 30 cpi r24, 0x03 ; 3 + c20: 40 f4 brcc .+16 ; 0xc32 for( uint8_t j = postdotlen; j <=2; j++) { numbuffer[j] = '0'; - bd2: e8 2f mov r30, r24 - bd4: f0 e0 ldi r31, 0x00 ; 0 - bd6: e2 56 subi r30, 0x62 ; 98 - bd8: fd 4f sbci r31, 0xFD ; 253 - bda: c0 82 st Z, r12 + c22: e8 2f mov r30, r24 + c24: f0 e0 ldi r31, 0x00 ; 0 + c26: ee 58 subi r30, 0x8E ; 142 + c28: fd 4f sbci r31, 0xFD ; 253 + c2a: 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++) { - bdc: 8f 5f subi r24, 0xFF ; 255 - bde: 83 30 cpi r24, 0x03 ; 3 - be0: c1 f7 brne .-16 ; 0xbd2 + c2c: 8f 5f subi r24, 0xFF ; 255 + c2e: 83 30 cpi r24, 0x03 ; 3 + c30: c1 f7 brne .-16 ; 0xc22 numbuffer[j] = '0'; } } // crop the number to three post dot digits numbuffer[3] = '\0'; - be2: 10 92 a1 02 sts 0x02A1, r1 + c32: 10 92 75 02 sts 0x0275, r1 postdot = atoi(numbuffer); - be6: 8e e9 ldi r24, 0x9E ; 158 - be8: 92 e0 ldi r25, 0x02 ; 2 - bea: 0e 94 0c 0f call 0x1e18 ; 0x1e18 - bee: 90 93 9b 02 sts 0x029B, r25 - bf2: 80 93 9a 02 sts 0x029A, r24 + c36: 82 e7 ldi r24, 0x72 ; 114 + c38: 92 e0 ldi r25, 0x02 ; 2 + c3a: 0e 94 44 0f call 0x1e88 ; 0x1e88 + c3e: 90 93 6f 02 sts 0x026F, r25 + c42: 80 93 6e 02 sts 0x026E, r24 } num_start = 0; - bf6: 10 92 97 02 sts 0x0297, r1 + c46: 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++) { - bfa: f3 94 inc r15 - bfc: 80 91 98 02 lds r24, 0x0298 - c00: 8f 15 cp r24, r15 - c02: 08 f0 brcs .+2 ; 0xc06 - c04: a7 cf rjmp .-178 ; 0xb54 - c06: 02 c0 rjmp .+4 ; 0xc0c - static char cmdbuffer[16]; + c4a: f3 94 inc r15 + c4c: 80 91 6c 02 lds r24, 0x026C + c50: 8f 15 cp r24, r15 + c52: 08 f0 brcs .+2 ; 0xc56 + c54: a7 cf rjmp .-178 ; 0xba4 + c56: 02 c0 rjmp .+4 ; 0xc5c + 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; - c08: dd 24 eor r13, r13 - c0a: d3 94 inc r13 + c58: dd 24 eor r13, r13 + c5a: d3 94 inc r13 } int16_t steps = 0,dest=0; switch (action) { - c0c: 02 30 cpi r16, 0x02 ; 2 - c0e: 09 f4 brne .+2 ; 0xc12 - c10: 5f c0 rjmp .+190 ; 0xcd0 - c12: 03 30 cpi r16, 0x03 ; 3 - c14: 09 f4 brne .+2 ; 0xc18 - c16: ba c0 rjmp .+372 ; 0xd8c - c18: 01 30 cpi r16, 0x01 ; 1 - c1a: 09 f0 breq .+2 ; 0xc1e - c1c: bf c0 rjmp .+382 ; 0xd9c + c5c: 02 30 cpi r16, 0x02 ; 2 + c5e: 09 f4 brne .+2 ; 0xc62 + c60: 61 c0 rjmp .+194 ; 0xd24 + c62: 03 30 cpi r16, 0x03 ; 3 + c64: 09 f4 brne .+2 ; 0xc68 + c66: be c0 rjmp .+380 ; 0xde4 + c68: 01 30 cpi r16, 0x01 ; 1 + c6a: 09 f0 breq .+2 ; 0xc6e + c6c: c3 c0 rjmp .+390 ; 0xdf4 case GOTO: uart_puts("GOTO "); - c1e: 87 e1 ldi r24, 0x17 ; 23 - c20: 91 e0 ldi r25, 0x01 ; 1 - c22: d8 dd rcall .-1104 ; 0x7d4 + c6e: 87 e1 ldi r24, 0x17 ; 23 + c70: 91 e0 ldi r25, 0x01 ; 1 + c72: b0 dd rcall .-1184 ; 0x7d4 uart_putc(88+axis);// x or y - c24: 81 2f mov r24, r17 - c26: 88 5a subi r24, 0xA8 ; 168 - c28: cd dd rcall .-1126 ; 0x7c4 + c74: 81 2f mov r24, r17 + c76: 88 5a subi r24, 0xA8 ; 168 + c78: a5 dd rcall .-1206 ; 0x7c4 + uart_putc(' '); + c7a: 80 e2 ldi r24, 0x20 ; 32 + c7c: a3 dd rcall .-1210 ; 0x7c4 uart_print_signed_number(predot*num_sign,3); - c2a: cd 2d mov r28, r13 - c2c: dd 27 eor r29, r29 - c2e: c7 fd sbrc r28, 7 - c30: d0 95 com r29 - c32: 60 91 9c 02 lds r22, 0x029C - c36: 70 91 9d 02 lds r23, 0x029D - c3a: ce 01 movw r24, r28 - c3c: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - c40: bc 01 movw r22, r24 - c42: 80 e0 ldi r24, 0x00 ; 0 - c44: 90 e0 ldi r25, 0x00 ; 0 - c46: 43 e0 ldi r20, 0x03 ; 3 - c48: 5c de rcall .-840 ; 0x902 + c7e: cd 2d mov r28, r13 + c80: dd 27 eor r29, r29 + c82: c7 fd sbrc r28, 7 + c84: d0 95 com r29 + c86: 60 91 70 02 lds r22, 0x0270 + c8a: 70 91 71 02 lds r23, 0x0271 + c8e: ce 01 movw r24, r28 + c90: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + c94: bc 01 movw r22, r24 + c96: 80 e0 ldi r24, 0x00 ; 0 + c98: 90 e0 ldi r25, 0x00 ; 0 + c9a: 43 e0 ldi r20, 0x03 ; 3 + c9c: 34 de rcall .-920 ; 0x906 uart_putc('.'); - c4a: 8e e2 ldi r24, 0x2E ; 46 - c4c: bb dd rcall .-1162 ; 0x7c4 - uart_print_number(postdot,3); - c4e: 60 91 9a 02 lds r22, 0x029A - c52: 70 91 9b 02 lds r23, 0x029B - c56: 80 e0 ldi r24, 0x00 ; 0 - c58: 90 e0 ldi r25, 0x00 ; 0 - c5a: 43 e0 ldi r20, 0x03 ; 3 - c5c: 42 de rcall .-892 ; 0x8e2 + c9e: 8e e2 ldi r24, 0x2E ; 46 + ca0: 91 dd rcall .-1246 ; 0x7c4 + uart_print_number_wlzeros(postdot,3); + ca2: 60 91 6e 02 lds r22, 0x026E + ca6: 70 91 6f 02 lds r23, 0x026F + caa: 80 e0 ldi r24, 0x00 ; 0 + cac: 90 e0 ldi r25, 0x00 ; 0 + cae: 43 e0 ldi r20, 0x03 ; 3 + cb0: 16 de rcall .-980 ; 0x8de uart_puts("\r\n"); - c5e: 84 e1 ldi r24, 0x14 ; 20 - c60: 91 e0 ldi r25, 0x01 ; 1 - c62: b8 dd rcall .-1168 ; 0x7d4 + cb2: 84 e1 ldi r24, 0x14 ; 20 + cb4: 91 e0 ldi r25, 0x01 ; 1 + cb6: 8e dd rcall .-1252 ; 0x7d4 dest = num_sign *( predot*24 +(postdot*10)/416); - c64: 80 91 9a 02 lds r24, 0x029A - c68: 90 91 9b 02 lds r25, 0x029B - c6c: 6a e0 ldi r22, 0x0A ; 10 - c6e: 70 e0 ldi r23, 0x00 ; 0 - c70: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - c74: 60 ea ldi r22, 0xA0 ; 160 - c76: 71 e0 ldi r23, 0x01 ; 1 - c78: 0e 94 c3 0e call 0x1d86 ; 0x1d86 <__udivmodhi4> - c7c: 9b 01 movw r18, r22 - c7e: 80 91 9c 02 lds r24, 0x029C - c82: 90 91 9d 02 lds r25, 0x029D - c86: 68 e1 ldi r22, 0x18 ; 24 - c88: 70 e0 ldi r23, 0x00 ; 0 - c8a: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - c8e: 28 0f add r18, r24 - c90: 39 1f adc r19, r25 - c92: ce 01 movw r24, r28 - c94: b9 01 movw r22, r18 - c96: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + cb8: 80 91 6e 02 lds r24, 0x026E + cbc: 90 91 6f 02 lds r25, 0x026F + cc0: 6a e0 ldi r22, 0x0A ; 10 + cc2: 70 e0 ldi r23, 0x00 ; 0 + cc4: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + cc8: 60 ea ldi r22, 0xA0 ; 160 + cca: 71 e0 ldi r23, 0x01 ; 1 + ccc: 0e 94 fb 0e call 0x1df6 ; 0x1df6 <__udivmodhi4> + cd0: 9b 01 movw r18, r22 + cd2: 80 91 70 02 lds r24, 0x0270 + cd6: 90 91 71 02 lds r25, 0x0271 + cda: 68 e1 ldi r22, 0x18 ; 24 + cdc: 70 e0 ldi r23, 0x00 ; 0 + cde: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + ce2: 28 0f add r18, r24 + ce4: 39 1f adc r19, r25 + ce6: ce 01 movw r24, r28 + ce8: b9 01 movw r22, r18 + cea: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> if (axis == X) { - c9a: 11 23 and r17, r17 - c9c: 69 f4 brne .+26 ; 0xcb8 - steps = dest - plate_pos_x; - c9e: 20 91 7a 01 lds r18, 0x017A - ca2: 30 91 7b 01 lds r19, 0x017B - ca6: e8 2e mov r14, r24 - ca8: e7 01 movw r28, r14 - caa: 7e 01 movw r14, r28 - cac: f9 2e mov r15, r25 - cae: e7 01 movw r28, r14 - cb0: c2 1b sub r28, r18 - cb2: d3 0b sbc r29, r19 + cee: 11 23 and r17, r17 + cf0: 69 f4 brne .+26 ; 0xd0c + steps = dest - plate_pos_x; // experimental correction! + cf2: 20 91 4e 01 lds r18, 0x014E + cf6: 30 91 4f 01 lds r19, 0x014F + cfa: e8 2e mov r14, r24 + cfc: e7 01 movw r28, r14 + cfe: 7e 01 movw r14, r28 + d00: f9 2e mov r15, r25 + d02: e7 01 movw r28, r14 + d04: c2 1b sub r28, r18 + d06: d3 0b sbc r29, r19 move_plate(steps,0); - cb4: ce 01 movw r24, r28 - cb6: 4d c0 rjmp .+154 ; 0xd52 + d08: ce 01 movw r24, r28 + d0a: 4f c0 rjmp .+158 ; 0xdaa plate_pos_x += steps; } else if (axis == Y) { steps = dest - plate_pos_y; - cb8: 20 91 7c 01 lds r18, 0x017C - cbc: 30 91 7d 01 lds r19, 0x017D - cc0: e8 2e mov r14, r24 - cc2: e7 01 movw r28, r14 - cc4: 7e 01 movw r14, r28 - cc6: f9 2e mov r15, r25 - cc8: e7 01 movw r28, r14 - cca: c2 1b sub r28, r18 - ccc: d3 0b sbc r29, r19 - cce: 4f c0 rjmp .+158 ; 0xd6e + d0c: 20 91 50 01 lds r18, 0x0150 + d10: 30 91 51 01 lds r19, 0x0151 + d14: e8 2e mov r14, r24 + d16: e7 01 movw r28, r14 + d18: 7e 01 movw r14, r28 + d1a: f9 2e mov r15, r25 + d1c: e7 01 movw r28, r14 + d1e: c2 1b sub r28, r18 + d20: d3 0b sbc r29, r19 + d22: 51 c0 rjmp .+162 ; 0xdc6 } pos_report(); break; case MOVEREL: uart_puts("MOVE "); - cd0: 8d e1 ldi r24, 0x1D ; 29 - cd2: 91 e0 ldi r25, 0x01 ; 1 - cd4: 7f dd rcall .-1282 ; 0x7d4 + d24: 8d e1 ldi r24, 0x1D ; 29 + d26: 91 e0 ldi r25, 0x01 ; 1 + d28: 55 dd rcall .-1366 ; 0x7d4 uart_putc(88+axis);// x or y - cd6: 81 2f mov r24, r17 - cd8: 88 5a subi r24, 0xA8 ; 168 - cda: 74 dd rcall .-1304 ; 0x7c4 + d2a: 81 2f mov r24, r17 + d2c: 88 5a subi r24, 0xA8 ; 168 + d2e: 4a dd rcall .-1388 ; 0x7c4 + uart_putc(' '); + d30: 80 e2 ldi r24, 0x20 ; 32 + d32: 48 dd rcall .-1392 ; 0x7c4 uart_print_signed_number(predot*num_sign,3); - cdc: cd 2d mov r28, r13 - cde: dd 27 eor r29, r29 - ce0: c7 fd sbrc r28, 7 - ce2: d0 95 com r29 - ce4: 60 91 9c 02 lds r22, 0x029C - ce8: 70 91 9d 02 lds r23, 0x029D - cec: ce 01 movw r24, r28 - cee: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - cf2: bc 01 movw r22, r24 - cf4: 80 e0 ldi r24, 0x00 ; 0 - cf6: 90 e0 ldi r25, 0x00 ; 0 - cf8: 43 e0 ldi r20, 0x03 ; 3 - cfa: 03 de rcall .-1018 ; 0x902 + d34: cd 2d mov r28, r13 + d36: dd 27 eor r29, r29 + d38: c7 fd sbrc r28, 7 + d3a: d0 95 com r29 + d3c: 60 91 70 02 lds r22, 0x0270 + d40: 70 91 71 02 lds r23, 0x0271 + d44: ce 01 movw r24, r28 + d46: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + d4a: bc 01 movw r22, r24 + d4c: 80 e0 ldi r24, 0x00 ; 0 + d4e: 90 e0 ldi r25, 0x00 ; 0 + d50: 43 e0 ldi r20, 0x03 ; 3 + d52: d9 dd rcall .-1102 ; 0x906 uart_putc('.'); - cfc: 8e e2 ldi r24, 0x2E ; 46 - cfe: 62 dd rcall .-1340 ; 0x7c4 - uart_print_number(postdot,3); - d00: 60 91 9a 02 lds r22, 0x029A - d04: 70 91 9b 02 lds r23, 0x029B - d08: 80 e0 ldi r24, 0x00 ; 0 - d0a: 90 e0 ldi r25, 0x00 ; 0 - d0c: 43 e0 ldi r20, 0x03 ; 3 - d0e: e9 dd rcall .-1070 ; 0x8e2 + d54: 8e e2 ldi r24, 0x2E ; 46 + d56: 36 dd rcall .-1428 ; 0x7c4 + uart_print_number_wlzeros(postdot,3); + d58: 60 91 6e 02 lds r22, 0x026E + d5c: 70 91 6f 02 lds r23, 0x026F + d60: 80 e0 ldi r24, 0x00 ; 0 + d62: 90 e0 ldi r25, 0x00 ; 0 + d64: 43 e0 ldi r20, 0x03 ; 3 + d66: bb dd rcall .-1162 ; 0x8de uart_puts("\r\n"); - d10: 84 e1 ldi r24, 0x14 ; 20 - d12: 91 e0 ldi r25, 0x01 ; 1 - d14: 5f dd rcall .-1346 ; 0x7d4 + d68: 84 e1 ldi r24, 0x14 ; 20 + d6a: 91 e0 ldi r25, 0x01 ; 1 + d6c: 33 dd rcall .-1434 ; 0x7d4 steps = num_sign *( predot*24 +(postdot*10)/416); - d16: 80 91 9a 02 lds r24, 0x029A - d1a: 90 91 9b 02 lds r25, 0x029B - d1e: 6a e0 ldi r22, 0x0A ; 10 - d20: 70 e0 ldi r23, 0x00 ; 0 - d22: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - d26: 60 ea ldi r22, 0xA0 ; 160 - d28: 71 e0 ldi r23, 0x01 ; 1 - d2a: 0e 94 c3 0e call 0x1d86 ; 0x1d86 <__udivmodhi4> - d2e: 9b 01 movw r18, r22 - d30: 80 91 9c 02 lds r24, 0x029C - d34: 90 91 9d 02 lds r25, 0x029D - d38: 68 e1 ldi r22, 0x18 ; 24 - d3a: 70 e0 ldi r23, 0x00 ; 0 - d3c: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - d40: 28 0f add r18, r24 - d42: 39 1f adc r19, r25 - d44: ce 01 movw r24, r28 - d46: b9 01 movw r22, r18 - d48: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> - d4c: ec 01 movw r28, r24 + d6e: 80 91 6e 02 lds r24, 0x026E + d72: 90 91 6f 02 lds r25, 0x026F + d76: 6a e0 ldi r22, 0x0A ; 10 + d78: 70 e0 ldi r23, 0x00 ; 0 + d7a: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + d7e: 60 ea ldi r22, 0xA0 ; 160 + d80: 71 e0 ldi r23, 0x01 ; 1 + d82: 0e 94 fb 0e call 0x1df6 ; 0x1df6 <__udivmodhi4> + d86: 9b 01 movw r18, r22 + d88: 80 91 70 02 lds r24, 0x0270 + d8c: 90 91 71 02 lds r25, 0x0271 + d90: 68 e1 ldi r22, 0x18 ; 24 + d92: 70 e0 ldi r23, 0x00 ; 0 + d94: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + d98: 28 0f add r18, r24 + d9a: 39 1f adc r19, r25 + d9c: ce 01 movw r24, r28 + d9e: b9 01 movw r22, r18 + da0: 0e 94 e9 0e call 0x1dd2 ; 0x1dd2 <__mulhi3> + da4: ec 01 movw r28, r24 if (axis == X) { - d4e: 11 23 and r17, r17 - d50: 71 f4 brne .+28 ; 0xd6e + da6: 11 23 and r17, r17 + da8: 71 f4 brne .+28 ; 0xdc6 move_plate(steps,0); - d52: 60 e0 ldi r22, 0x00 ; 0 - d54: 70 e0 ldi r23, 0x00 ; 0 - d56: 32 de rcall .-924 ; 0x9bc + daa: 60 e0 ldi r22, 0x00 ; 0 + dac: 70 e0 ldi r23, 0x00 ; 0 + dae: 0d de rcall .-998 ; 0x9ca plate_pos_x += steps; - d58: 80 91 7a 01 lds r24, 0x017A - d5c: 90 91 7b 01 lds r25, 0x017B - d60: 8c 0f add r24, r28 - d62: 9d 1f adc r25, r29 - d64: 90 93 7b 01 sts 0x017B, r25 - d68: 80 93 7a 01 sts 0x017A, r24 - d6c: 17 c0 rjmp .+46 ; 0xd9c + db0: 80 91 4e 01 lds r24, 0x014E + db4: 90 91 4f 01 lds r25, 0x014F + db8: 8c 0f add r24, r28 + dba: 9d 1f adc r25, r29 + dbc: 90 93 4f 01 sts 0x014F, r25 + dc0: 80 93 4e 01 sts 0x014E, r24 + dc4: 17 c0 rjmp .+46 ; 0xdf4 } else if (axis == Y) { move_plate(0,steps); - d6e: 80 e0 ldi r24, 0x00 ; 0 - d70: 90 e0 ldi r25, 0x00 ; 0 - d72: be 01 movw r22, r28 - d74: 23 de rcall .-954 ; 0x9bc + dc6: 80 e0 ldi r24, 0x00 ; 0 + dc8: 90 e0 ldi r25, 0x00 ; 0 + dca: be 01 movw r22, r28 + dcc: fe dd rcall .-1028 ; 0x9ca plate_pos_y += steps; - d76: 80 91 7c 01 lds r24, 0x017C - d7a: 90 91 7d 01 lds r25, 0x017D - d7e: 8c 0f add r24, r28 - d80: 9d 1f adc r25, r29 - d82: 90 93 7d 01 sts 0x017D, r25 - d86: 80 93 7c 01 sts 0x017C, r24 - d8a: 08 c0 rjmp .+16 ; 0xd9c + dce: 80 91 50 01 lds r24, 0x0150 + dd2: 90 91 51 01 lds r25, 0x0151 + dd6: 8c 0f add r24, r28 + dd8: 9d 1f adc r25, r29 + dda: 90 93 51 01 sts 0x0151, r25 + dde: 80 93 50 01 sts 0x0150, r24 + de2: 08 c0 rjmp .+16 ; 0xdf4 } pos_report(); break; case SETZERO: plate_pos_x = 0; - d8c: 10 92 7b 01 sts 0x017B, r1 - d90: 10 92 7a 01 sts 0x017A, r1 + de4: 10 92 4f 01 sts 0x014F, r1 + de8: 10 92 4e 01 sts 0x014E, r1 plate_pos_y = 0; - d94: 10 92 7d 01 sts 0x017D, r1 - d98: 10 92 7c 01 sts 0x017C, r1 + dec: 10 92 51 01 sts 0x0151, r1 + df0: 10 92 50 01 sts 0x0150, r1 pos_report(); break; case POSITION: pos_report(); - d9c: 5a de rcall .-844 ; 0xa52 + df4: 5f de rcall .-834 ; 0xab4 break; - d9e: 0b c0 rjmp .+22 ; 0xdb6 + df6: 17 c0 rjmp .+46 ; 0xe26 } } else { // queue command - cmdbuffer[cmdPos++] = byte; - da0: 90 91 99 02 lds r25, 0x0299 - da4: e9 2f mov r30, r25 - da6: f0 e0 ldi r31, 0x00 ; 0 - da8: e2 55 subi r30, 0x52 ; 82 - daa: fd 4f sbci r31, 0xFD ; 253 - dac: 80 83 st Z, r24 - dae: 9f 5f subi r25, 0xFF ; 255 - db0: 90 93 99 02 sts 0x0299, r25 + if( cmdPos == 0 ){ + df8: 80 91 6d 02 lds r24, 0x026D + dfc: 88 23 and r24, r24 + dfe: 19 f4 brne .+6 ; 0xe06 + uart_puts("\r\n$ "); + e00: 83 e2 ldi r24, 0x23 ; 35 + e02: 91 e0 ldi r25, 0x01 ; 1 + e04: e7 dc rcall .-1586 ; 0x7d4 + e06: 80 91 6d 02 lds r24, 0x026D + } + + if( byte == 8 ){ // backspace + e0a: 18 30 cpi r17, 0x08 ; 8 + e0c: 11 f4 brne .+4 ; 0xe12 + cmdPos--; + e0e: 81 50 subi r24, 0x01 ; 1 + e10: 06 c0 rjmp .+12 ; 0xe1e + } else { + cmdbuffer[cmdPos++] = byte; + e12: e8 2f mov r30, r24 + e14: f0 e0 ldi r31, 0x00 ; 0 + e16: ee 57 subi r30, 0x7E ; 126 + e18: fd 4f sbci r31, 0xFD ; 253 + e1a: 10 83 st Z, r17 + e1c: 8f 5f subi r24, 0xFF ; 255 + e1e: 80 93 6d 02 sts 0x026D, r24 + } uart_putc(byte); - db4: 07 dd rcall .-1522 ; 0x7c4 + e22: 81 2f mov r24, r17 + e24: cf dc rcall .-1634 ; 0x7c4 + + } } } - db6: df 91 pop r29 - db8: cf 91 pop r28 - dba: 1f 91 pop r17 - dbc: 0f 91 pop r16 - dbe: ff 90 pop r15 - dc0: ef 90 pop r14 - dc2: df 90 pop r13 - dc4: cf 90 pop r12 - dc6: 08 95 ret - -00000dc8
: + e26: df 91 pop r29 + e28: cf 91 pop r28 + e2a: 1f 91 pop r17 + e2c: 0f 91 pop r16 + e2e: ff 90 pop r15 + e30: ef 90 pop r14 + e32: df 90 pop r13 + e34: cf 90 pop r12 + e36: 08 95 ret + +00000e38
: int main(void) { - dc8: 0f 93 push r16 - dca: 1f 93 push r17 - dcc: df 93 push r29 - dce: cf 93 push r28 - dd0: 0f 92 push r0 - dd2: cd b7 in r28, 0x3d ; 61 - dd4: de b7 in r29, 0x3e ; 62 + e38: 0f 93 push r16 + e3a: 1f 93 push r17 + e3c: df 93 push r29 + e3e: cf 93 push r28 + e40: 0f 92 push r0 + e42: cd b7 in r28, 0x3d ; 61 + e44: de b7 in r29, 0x3e ; 62 init_motors(); - dd6: b3 dd rcall .-1178 ; 0x93e + e46: 82 dd rcall .-1276 ; 0x94c char dummy; uint8_t field_val = 0; SetupHardware(); - dd8: 46 dc rcall .-1908 ; 0x666 + e48: 0e dc rcall .-2020 ; 0x666 RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data)); - dda: 8e e7 ldi r24, 0x7E ; 126 - ddc: 91 e0 ldi r25, 0x01 ; 1 - dde: 6a e8 ldi r22, 0x8A ; 138 - de0: 71 e0 ldi r23, 0x01 ; 1 - de2: 6f da rcall .-2850 ; 0x2c2 + e4a: 82 e5 ldi r24, 0x52 ; 82 + e4c: 91 e0 ldi r25, 0x01 ; 1 + e4e: 6e e5 ldi r22, 0x5E ; 94 + e50: 71 e0 ldi r23, 0x01 ; 1 + e52: 37 da rcall .-2962 ; 0x2c2 RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data)); - de4: 8a e0 ldi r24, 0x0A ; 10 - de6: 92 e0 ldi r25, 0x02 ; 2 - de8: 66 e1 ldi r22, 0x16 ; 22 - dea: 72 e0 ldi r23, 0x02 ; 2 - dec: 6a da rcall .-2860 ; 0x2c2 + e54: 8e ed ldi r24, 0xDE ; 222 + e56: 91 e0 ldi r25, 0x01 ; 1 + e58: 6a ee ldi r22, 0xEA ; 234 + e5a: 71 e0 ldi r23, 0x01 ; 1 + e5c: 32 da rcall .-2972 ; 0x2c2 static inline void GlobalInterruptEnable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) sei(); - dee: 78 94 sei + e5e: 78 94 sei // LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); GlobalInterruptEnable(); touchpad_init(); // you need to call this to setup the I/O pin! - df0: aa db rcall .-2220 ; 0x546 - df2: 8f ef ldi r24, 0xFF ; 255 - df4: 99 e6 ldi r25, 0x69 ; 105 - df6: a8 e1 ldi r26, 0x18 ; 24 - df8: 81 50 subi r24, 0x01 ; 1 - dfa: 90 40 sbci r25, 0x00 ; 0 - dfc: a0 40 sbci r26, 0x00 ; 0 - dfe: e1 f7 brne .-8 ; 0xdf8 - e00: 00 c0 rjmp .+0 ; 0xe02 - e02: 00 00 nop + e60: 72 db rcall .-2332 ; 0x546 + e62: 2f ef ldi r18, 0xFF ; 255 + e64: 39 e6 ldi r19, 0x69 ; 105 + e66: 48 e1 ldi r20, 0x18 ; 24 + e68: 21 50 subi r18, 0x01 ; 1 + e6a: 30 40 sbci r19, 0x00 ; 0 + e6c: 40 40 sbci r20, 0x00 ; 0 + e6e: e1 f7 brne .-8 ; 0xe68 + e70: 00 c0 rjmp .+0 ; 0xe72 + e72: 00 00 nop _delay_ms(500); sei(); - e04: 78 94 sei - + e74: 78 94 sei uint16_t loopcounter=0; - uart_puts("you selected the relative position demo modus:\n\r"); - e06: 83 e2 ldi r24, 0x23 ; 35 - e08: 91 e0 ldi r25, 0x01 ; 1 - e0a: e4 dc rcall .-1592 ; 0x7d4 +// uart_puts("you selected the relative position demo modus:\n\r"); touchpad_set_rel_mode_100dpi();// use touchpad in relative mode - e0c: ad db rcall .-2214 ; 0x568 + e76: 78 db rcall .-2320 ; 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; - e0e: 10 e0 ldi r17, 0x00 ; 0 + e78: 10 e0 ldi r17, 0x00 ; 0 while (1) { Usb2SerialTask(); - e10: df db rcall .-2114 ; 0x5d0 + e7a: aa db rcall .-2220 ; 0x5d0 // loopcounter++; // if(loopcounter<2000) { // continue; // } // loopcounter=0; parse_command(); // read data from virtual comport - e12: 3c de rcall .-904 ; 0xa8c + e7c: 2e de rcall .-932 ; 0xada touchpad_read(); // read data from touchpad - e14: a0 db rcall .-2240 ; 0x556 + e7e: 6b db rcall .-2346 ; 0x556 dx = delta_x();// returns the amount your finger has moved in x direction since last readout - e16: cc db rcall .-2152 ; 0x5b0 - e18: 08 2f mov r16, r24 + e80: 97 db rcall .-2258 ; 0x5b0 + e82: 08 2f mov r16, r24 dy = delta_y();// returns the amount your finger has moved in y direction since last readout - e1a: ba db rcall .-2188 ; 0x590 + e84: 85 db rcall .-2294 ; 0x590 // increment/decrement some dummy variables with the plate_pos_x += dx; - e1c: 40 2f mov r20, r16 - e1e: 55 27 eor r21, r21 - e20: 47 fd sbrc r20, 7 - e22: 50 95 com r21 - e24: 20 91 7a 01 lds r18, 0x017A - e28: 30 91 7b 01 lds r19, 0x017B - e2c: 24 0f add r18, r20 - e2e: 35 1f adc r19, r21 - e30: 30 93 7b 01 sts 0x017B, r19 - e34: 20 93 7a 01 sts 0x017A, r18 + e86: 40 2f mov r20, r16 + e88: 55 27 eor r21, r21 + e8a: 47 fd sbrc r20, 7 + e8c: 50 95 com r21 + e8e: 20 91 4e 01 lds r18, 0x014E + e92: 30 91 4f 01 lds r19, 0x014F + e96: 24 0f add r18, r20 + e98: 35 1f adc r19, r21 + e9a: 30 93 4f 01 sts 0x014F, r19 + e9e: 20 93 4e 01 sts 0x014E, r18 plate_pos_y += dy; - e38: 68 2f mov r22, r24 - e3a: 77 27 eor r23, r23 - e3c: 67 fd sbrc r22, 7 - e3e: 70 95 com r23 - e40: 80 91 7c 01 lds r24, 0x017C - e44: 90 91 7d 01 lds r25, 0x017D - e48: 86 0f add r24, r22 - e4a: 97 1f adc r25, r23 - e4c: 90 93 7d 01 sts 0x017D, r25 - e50: 80 93 7c 01 sts 0x017C, r24 + ea2: 68 2f mov r22, r24 + ea4: 77 27 eor r23, r23 + ea6: 67 fd sbrc r22, 7 + ea8: 70 95 com r23 + eaa: 80 91 50 01 lds r24, 0x0150 + eae: 90 91 51 01 lds r25, 0x0151 + eb2: 86 0f add r24, r22 + eb4: 97 1f adc r25, r23 + eb6: 90 93 51 01 sts 0x0151, r25 + eba: 80 93 50 01 sts 0x0150, r24 last_busy = busy; busy = move_plate(dx,dy); - e54: ca 01 movw r24, r20 - e56: b2 dd rcall .-1180 ; 0x9bc + ebe: ca 01 movw r24, r20 + ec0: 84 dd rcall .-1272 ; 0x9ca if (last_busy && !(busy)){ - e58: 11 23 and r17, r17 - e5a: 29 f0 breq .+10 ; 0xe66 - e5c: 88 23 and r24, r24 - e5e: 19 f4 brne .+6 ; 0xe66 + ec2: 11 23 and r17, r17 + ec4: 29 f0 breq .+10 ; 0xed0 + ec6: 88 23 and r24, r24 + ec8: 19 f4 brne .+6 ; 0xed0 pos_report(); - e60: 89 83 std Y+1, r24 ; 0x01 - e62: f7 dd rcall .-1042 ; 0xa52 - e64: 89 81 ldd r24, Y+1 ; 0x01 - e66: af e3 ldi r26, 0x3F ; 63 - e68: bc e9 ldi r27, 0x9C ; 156 - e6a: 11 97 sbiw r26, 0x01 ; 1 - e6c: f1 f7 brne .-4 ; 0xe6a - e6e: 00 c0 rjmp .+0 ; 0xe70 - e70: 00 00 nop + eca: 89 83 std Y+1, r24 ; 0x01 + ecc: f3 dd rcall .-1050 ; 0xab4 + ece: 89 81 ldd r24, Y+1 ; 0x01 + ed0: 2f ef ldi r18, 0xFF ; 255 + ed2: 39 ef ldi r19, 0xF9 ; 249 + ed4: 40 e0 ldi r20, 0x00 ; 0 + ed6: 21 50 subi r18, 0x01 ; 1 + ed8: 30 40 sbci r19, 0x00 ; 0 + eda: 40 40 sbci r20, 0x00 ; 0 + edc: e1 f7 brne .-8 ; 0xed6 + ede: 00 c0 rjmp .+0 ; 0xee0 + ee0: 00 00 nop plate_pos_x += dx; plate_pos_y += dy; last_busy = busy; busy = move_plate(dx,dy); - e72: 18 2f mov r17, r24 - e74: cd cf rjmp .-102 ; 0xe10 + ee2: 18 2f mov r17, r24 + ee4: ca cf rjmp .-108 ; 0xe7a -00000e76 : +00000ee6 : const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) - e76: 92 30 cpi r25, 0x02 ; 2 - e78: 29 f0 breq .+10 ; 0xe84 - e7a: 93 30 cpi r25, 0x03 ; 3 - e7c: 41 f0 breq .+16 ; 0xe8e - e7e: 91 30 cpi r25, 0x01 ; 1 - e80: e9 f4 brne .+58 ; 0xebc - e82: 17 c0 rjmp .+46 ; 0xeb2 + 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 Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); - e84: 2e e3 ldi r18, 0x3E ; 62 - e86: 30 e0 ldi r19, 0x00 ; 0 + ef4: 2e e3 ldi r18, 0x3E ; 62 + ef6: 30 e0 ldi r19, 0x00 ; 0 case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; - e88: ea ea ldi r30, 0xAA ; 170 - e8a: f0 e0 ldi r31, 0x00 ; 0 + ef8: ea ea ldi r30, 0xAA ; 170 + efa: f0 e0 ldi r31, 0x00 ; 0 Size = sizeof(USB_Descriptor_Configuration_t); break; - e8c: 1b c0 rjmp .+54 ; 0xec4 + efc: 1b c0 rjmp .+54 ; 0xf34 case DTYPE_String: switch (DescriptorNumber) - e8e: 81 30 cpi r24, 0x01 ; 1 - e90: 41 f0 breq .+16 ; 0xea2 - e92: 81 30 cpi r24, 0x01 ; 1 - e94: 18 f0 brcs .+6 ; 0xe9c - e96: 82 30 cpi r24, 0x02 ; 2 - e98: 89 f4 brne .+34 ; 0xebc - e9a: 06 c0 rjmp .+12 ; 0xea8 + 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 { case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); - e9c: e8 ee ldi r30, 0xE8 ; 232 - e9e: f0 e0 ldi r31, 0x00 ; 0 - ea0: 05 c0 rjmp .+10 ; 0xeac + f0c: e8 ee ldi r30, 0xE8 ; 232 + f0e: f0 e0 ldi r31, 0x00 ; 0 + f10: 05 c0 rjmp .+10 ; 0xf1c break; case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); - ea2: ec ee ldi r30, 0xEC ; 236 - ea4: f0 e0 ldi r31, 0x00 ; 0 - ea6: 02 c0 rjmp .+4 ; 0xeac + f12: ec ee ldi r30, 0xEC ; 236 + f14: f0 e0 ldi r31, 0x00 ; 0 + f16: 02 c0 rjmp .+4 ; 0xf1c break; case 0x02: Address = &ProductString; Size = pgm_read_byte(&ProductString.Header.Size); - ea8: e6 e0 ldi r30, 0x06 ; 6 - eaa: f1 e0 ldi r31, 0x01 ; 1 - eac: 24 91 lpm r18, Z+ - eae: 30 e0 ldi r19, 0x00 ; 0 + 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 break; - eb0: 09 c0 rjmp .+18 ; 0xec4 + f20: 09 c0 rjmp .+18 ; 0xf34 switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); - eb2: 22 e1 ldi r18, 0x12 ; 18 - eb4: 30 e0 ldi r19, 0x00 ; 0 + f22: 22 e1 ldi r18, 0x12 ; 18 + f24: 30 e0 ldi r19, 0x00 ; 0 uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; - eb6: e8 e9 ldi r30, 0x98 ; 152 - eb8: f0 e0 ldi r31, 0x00 ; 0 - eba: 04 c0 rjmp .+8 ; 0xec4 + f26: e8 e9 ldi r30, 0x98 ; 152 + f28: f0 e0 ldi r31, 0x00 ; 0 + f2a: 04 c0 rjmp .+8 ; 0xf34 { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - ebc: 20 e0 ldi r18, 0x00 ; 0 - ebe: 30 e0 ldi r19, 0x00 ; 0 + f2c: 20 e0 ldi r18, 0x00 ; 0 + f2e: 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; - ec0: e0 e0 ldi r30, 0x00 ; 0 - ec2: f0 e0 ldi r31, 0x00 ; 0 + f30: e0 e0 ldi r30, 0x00 ; 0 + f32: f0 e0 ldi r31, 0x00 ; 0 } break; } *DescriptorAddress = Address; - ec4: da 01 movw r26, r20 - ec6: 11 96 adiw r26, 0x01 ; 1 - ec8: fc 93 st X, r31 - eca: ee 93 st -X, r30 + 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 return Size; } - ecc: c9 01 movw r24, r18 - ece: 08 95 ret + f3c: c9 01 movw r24, r18 + f3e: 08 95 ret -00000ed0 : +00000f40 : #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)); - ed0: 28 2f mov r18, r24 - ed2: 39 2f mov r19, r25 - ed4: f9 01 movw r30, r18 + f40: 28 2f mov r18, r24 + f42: 39 2f mov r19, r25 + f44: f9 01 movw r30, r18 bool LastPacketFull = false; if (Length > USB_ControlRequest.wLength) - ed6: 80 91 ee 02 lds r24, 0x02EE - eda: 90 91 ef 02 lds r25, 0x02EF - ede: 86 17 cp r24, r22 - ee0: 97 07 cpc r25, r23 - ee2: 18 f4 brcc .+6 ; 0xeea - ee4: bc 01 movw r22, r24 - ee6: 20 e0 ldi r18, 0x00 ; 0 - ee8: 34 c0 rjmp .+104 ; 0xf52 + 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 Length = USB_ControlRequest.wLength; else if (!(Length)) - eea: 61 15 cp r22, r1 - eec: 71 05 cpc r23, r1 - eee: d9 f7 brne .-10 ; 0xee6 + f5a: 61 15 cp r22, r1 + f5c: 71 05 cpc r23, r1 + f5e: d9 f7 brne .-10 ; 0xf56 */ 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)); - ef0: 80 91 e8 00 lds r24, 0x00E8 - ef4: 8e 77 andi r24, 0x7E ; 126 - ef6: 80 93 e8 00 sts 0x00E8, r24 - efa: f5 cf rjmp .-22 ; 0xee6 + 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 Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - efc: 8e b3 in r24, 0x1e ; 30 + f6c: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - efe: 88 23 and r24, r24 - f00: e9 f1 breq .+122 ; 0xf7c + f6e: 88 23 and r24, r24 + f70: e9 f1 breq .+122 ; 0xfec return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - f02: 85 30 cpi r24, 0x05 ; 5 - f04: b9 f1 breq .+110 ; 0xf74 + f72: 85 30 cpi r24, 0x05 ; 5 + f74: b9 f1 breq .+110 ; 0xfe4 * \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); - f06: 80 91 e8 00 lds r24, 0x00E8 + f76: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - f0a: 83 fd sbrc r24, 3 - f0c: 35 c0 rjmp .+106 ; 0xf78 + f7a: 83 fd sbrc r24, 3 + f7c: 35 c0 rjmp .+106 ; 0xfe8 * \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); - f0e: 80 91 e8 00 lds r24, 0x00E8 + f7e: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - f12: 82 fd sbrc r24, 2 - f14: 29 c0 rjmp .+82 ; 0xf68 + f82: 82 fd sbrc r24, 2 + f84: 29 c0 rjmp .+82 ; 0xfd8 * \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); - f16: 80 91 e8 00 lds r24, 0x00E8 + f86: 80 91 e8 00 lds r24, 0x00E8 break; if (Endpoint_IsINReady()) - f1a: 80 ff sbrs r24, 0 - f1c: 1a c0 rjmp .+52 ; 0xf52 + f8a: 80 ff sbrs r24, 0 + f8c: 1a c0 rjmp .+52 ; 0xfc2 #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; - f1e: 80 91 f2 00 lds r24, 0x00F2 - f22: 90 e0 ldi r25, 0x00 ; 0 + f8e: 80 91 f2 00 lds r24, 0x00F2 + f92: 90 e0 ldi r25, 0x00 ; 0 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - f24: 06 c0 rjmp .+12 ; 0xf32 + f94: 06 c0 rjmp .+12 ; 0xfa2 { TEMPLATE_TRANSFER_BYTE(DataStream); - f26: 21 91 ld r18, Z+ + f96: 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; - f28: 20 93 f1 00 sts 0x00F1, r18 + f98: 20 93 f1 00 sts 0x00F1, r18 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; - f2c: 61 50 subi r22, 0x01 ; 1 - f2e: 70 40 sbci r23, 0x00 ; 0 + f9c: 61 50 subi r22, 0x01 ; 1 + f9e: 70 40 sbci r23, 0x00 ; 0 BytesInEndpoint++; - f30: 01 96 adiw r24, 0x01 ; 1 + fa0: 01 96 adiw r24, 0x01 ; 1 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - f32: 61 15 cp r22, r1 - f34: 71 05 cpc r23, r1 - f36: 19 f0 breq .+6 ; 0xf3e - f38: 88 30 cpi r24, 0x08 ; 8 - f3a: 91 05 cpc r25, r1 - f3c: a0 f3 brcs .-24 ; 0xf26 + 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 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - f3e: 21 e0 ldi r18, 0x01 ; 1 - f40: 88 30 cpi r24, 0x08 ; 8 - f42: 91 05 cpc r25, r1 - f44: 09 f0 breq .+2 ; 0xf48 - f46: 20 e0 ldi r18, 0x00 ; 0 + 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 */ 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)); - f48: 80 91 e8 00 lds r24, 0x00E8 - f4c: 8e 77 andi r24, 0x7E ; 126 - f4e: 80 93 e8 00 sts 0x00E8, r24 + fb8: 80 91 e8 00 lds r24, 0x00E8 + fbc: 8e 77 andi r24, 0x7E ; 126 + fbe: 80 93 e8 00 sts 0x00E8, r24 if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) - f52: 61 15 cp r22, r1 - f54: 71 05 cpc r23, r1 - f56: 91 f6 brne .-92 ; 0xefc - f58: 22 23 and r18, r18 - f5a: 81 f6 brne .-96 ; 0xefc - f5c: 05 c0 rjmp .+10 ; 0xf68 + 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 } } while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - f5e: 8e b3 in r24, 0x1e ; 30 + fce: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - f60: 88 23 and r24, r24 - f62: 61 f0 breq .+24 ; 0xf7c + fd0: 88 23 and r24, r24 + fd2: 61 f0 breq .+24 ; 0xfec return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - f64: 85 30 cpi r24, 0x05 ; 5 - f66: 61 f0 breq .+24 ; 0xf80 + fd4: 85 30 cpi r24, 0x05 ; 5 + fd6: 61 f0 breq .+24 ; 0xff0 * \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); - f68: 80 91 e8 00 lds r24, 0x00E8 + fd8: 80 91 e8 00 lds r24, 0x00E8 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - f6c: 82 ff sbrs r24, 2 - f6e: f7 cf rjmp .-18 ; 0xf5e + fdc: 82 ff sbrs r24, 2 + fde: f7 cf rjmp .-18 ; 0xfce return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - f70: 80 e0 ldi r24, 0x00 ; 0 - f72: 08 95 ret + fe0: 80 e0 ldi r24, 0x00 ; 0 + fe2: 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; - f74: 83 e0 ldi r24, 0x03 ; 3 - f76: 08 95 ret + fe4: 83 e0 ldi r24, 0x03 ; 3 + fe6: 08 95 ret else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - f78: 81 e0 ldi r24, 0x01 ; 1 - f7a: 08 95 ret + fe8: 81 e0 ldi r24, 0x01 ; 1 + fea: 08 95 ret while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - f7c: 82 e0 ldi r24, 0x02 ; 2 - f7e: 08 95 ret + fec: 82 e0 ldi r24, 0x02 ; 2 + fee: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - f80: 83 e0 ldi r24, 0x03 ; 3 + ff0: 83 e0 ldi r24, 0x03 ; 3 } return ENDPOINT_RWCSTREAM_NoError; } - f82: 08 95 ret + ff2: 08 95 ret -00000f84 : +00000ff4 : #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)); - f84: e8 2f mov r30, r24 - f86: f9 2f mov r31, r25 + ff4: e8 2f mov r30, r24 + ff6: f9 2f mov r31, r25 bool LastPacketFull = false; if (Length > USB_ControlRequest.wLength) - f88: 80 91 ee 02 lds r24, 0x02EE - f8c: 90 91 ef 02 lds r25, 0x02EF - f90: 86 17 cp r24, r22 - f92: 97 07 cpc r25, r23 - f94: 18 f4 brcc .+6 ; 0xf9c - f96: bc 01 movw r22, r24 - f98: 20 e0 ldi r18, 0x00 ; 0 - f9a: 36 c0 rjmp .+108 ; 0x1008 + 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 Length = USB_ControlRequest.wLength; else if (!(Length)) - f9c: 61 15 cp r22, r1 - f9e: 71 05 cpc r23, r1 - fa0: d9 f7 brne .-10 ; 0xf98 + 100c: 61 15 cp r22, r1 + 100e: 71 05 cpc r23, r1 + 1010: d9 f7 brne .-10 ; 0x1008 */ 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)); - fa2: 80 91 e8 00 lds r24, 0x00E8 - fa6: 8e 77 andi r24, 0x7E ; 126 - fa8: 80 93 e8 00 sts 0x00E8, r24 - fac: f5 cf rjmp .-22 ; 0xf98 + 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 Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - fae: 8e b3 in r24, 0x1e ; 30 + 101e: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - fb0: 88 23 and r24, r24 - fb2: 09 f4 brne .+2 ; 0xfb6 - fb4: 3e c0 rjmp .+124 ; 0x1032 + 1020: 88 23 and r24, r24 + 1022: 09 f4 brne .+2 ; 0x1026 + 1024: 3e c0 rjmp .+124 ; 0x10a2 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - fb6: 85 30 cpi r24, 0x05 ; 5 - fb8: c1 f1 breq .+112 ; 0x102a + 1026: 85 30 cpi r24, 0x05 ; 5 + 1028: c1 f1 breq .+112 ; 0x109a * \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); - fba: 80 91 e8 00 lds r24, 0x00E8 + 102a: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - fbe: 83 fd sbrc r24, 3 - fc0: 36 c0 rjmp .+108 ; 0x102e + 102e: 83 fd sbrc r24, 3 + 1030: 36 c0 rjmp .+108 ; 0x109e * \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); - fc2: 80 91 e8 00 lds r24, 0x00E8 + 1032: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - fc6: 82 fd sbrc r24, 2 - fc8: 2a c0 rjmp .+84 ; 0x101e + 1036: 82 fd sbrc r24, 2 + 1038: 2a c0 rjmp .+84 ; 0x108e * \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); - fca: 80 91 e8 00 lds r24, 0x00E8 + 103a: 80 91 e8 00 lds r24, 0x00E8 break; if (Endpoint_IsINReady()) - fce: 80 ff sbrs r24, 0 - fd0: 1b c0 rjmp .+54 ; 0x1008 + 103e: 80 ff sbrs r24, 0 + 1040: 1b c0 rjmp .+54 ; 0x1078 #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; - fd2: 80 91 f2 00 lds r24, 0x00F2 - fd6: 90 e0 ldi r25, 0x00 ; 0 + 1042: 80 91 f2 00 lds r24, 0x00F2 + 1046: 90 e0 ldi r25, 0x00 ; 0 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - fd8: 07 c0 rjmp .+14 ; 0xfe8 + 1048: 07 c0 rjmp .+14 ; 0x1058 { TEMPLATE_TRANSFER_BYTE(DataStream); - fda: 24 91 lpm r18, Z+ + 104a: 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; - fdc: 20 93 f1 00 sts 0x00F1, r18 + 104c: 20 93 f1 00 sts 0x00F1, r18 TEMPLATE_BUFFER_MOVE(DataStream, 1); - fe0: 31 96 adiw r30, 0x01 ; 1 + 1050: 31 96 adiw r30, 0x01 ; 1 Length--; - fe2: 61 50 subi r22, 0x01 ; 1 - fe4: 70 40 sbci r23, 0x00 ; 0 + 1052: 61 50 subi r22, 0x01 ; 1 + 1054: 70 40 sbci r23, 0x00 ; 0 BytesInEndpoint++; - fe6: 01 96 adiw r24, 0x01 ; 1 + 1056: 01 96 adiw r24, 0x01 ; 1 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - fe8: 61 15 cp r22, r1 - fea: 71 05 cpc r23, r1 - fec: 19 f0 breq .+6 ; 0xff4 - fee: 88 30 cpi r24, 0x08 ; 8 - ff0: 91 05 cpc r25, r1 - ff2: 98 f3 brcs .-26 ; 0xfda + 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 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - ff4: 21 e0 ldi r18, 0x01 ; 1 - ff6: 88 30 cpi r24, 0x08 ; 8 - ff8: 91 05 cpc r25, r1 - ffa: 09 f0 breq .+2 ; 0xffe - ffc: 20 e0 ldi r18, 0x00 ; 0 + 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 */ 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)); - ffe: 80 91 e8 00 lds r24, 0x00E8 - 1002: 8e 77 andi r24, 0x7E ; 126 - 1004: 80 93 e8 00 sts 0x00E8, r24 + 106e: 80 91 e8 00 lds r24, 0x00E8 + 1072: 8e 77 andi r24, 0x7E ; 126 + 1074: 80 93 e8 00 sts 0x00E8, r24 if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) - 1008: 61 15 cp r22, r1 - 100a: 71 05 cpc r23, r1 - 100c: 81 f6 brne .-96 ; 0xfae - 100e: 22 23 and r18, r18 - 1010: 71 f6 brne .-100 ; 0xfae - 1012: 05 c0 rjmp .+10 ; 0x101e + 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 } } while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 1014: 8e b3 in r24, 0x1e ; 30 + 1084: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 1016: 88 23 and r24, r24 - 1018: 61 f0 breq .+24 ; 0x1032 + 1086: 88 23 and r24, r24 + 1088: 61 f0 breq .+24 ; 0x10a2 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 101a: 85 30 cpi r24, 0x05 ; 5 - 101c: 61 f0 breq .+24 ; 0x1036 + 108a: 85 30 cpi r24, 0x05 ; 5 + 108c: 61 f0 breq .+24 ; 0x10a6 * \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); - 101e: 80 91 e8 00 lds r24, 0x00E8 + 108e: 80 91 e8 00 lds r24, 0x00E8 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - 1022: 82 ff sbrs r24, 2 - 1024: f7 cf rjmp .-18 ; 0x1014 + 1092: 82 ff sbrs r24, 2 + 1094: f7 cf rjmp .-18 ; 0x1084 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - 1026: 80 e0 ldi r24, 0x00 ; 0 - 1028: 08 95 ret + 1096: 80 e0 ldi r24, 0x00 ; 0 + 1098: 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; - 102a: 83 e0 ldi r24, 0x03 ; 3 - 102c: 08 95 ret + 109a: 83 e0 ldi r24, 0x03 ; 3 + 109c: 08 95 ret else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - 102e: 81 e0 ldi r24, 0x01 ; 1 - 1030: 08 95 ret + 109e: 81 e0 ldi r24, 0x01 ; 1 + 10a0: 08 95 ret while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 1032: 82 e0 ldi r24, 0x02 ; 2 - 1034: 08 95 ret + 10a2: 82 e0 ldi r24, 0x02 ; 2 + 10a4: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - 1036: 83 e0 ldi r24, 0x03 ; 3 + 10a6: 83 e0 ldi r24, 0x03 ; 3 } return ENDPOINT_RWCSTREAM_NoError; } - 1038: 08 95 ret + 10a8: 08 95 ret -0000103a : +000010aa : UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - 103a: 98 2f mov r25, r24 - 103c: 2c c0 rjmp .+88 ; 0x1096 + 10aa: 98 2f mov r25, r24 + 10ac: 2c c0 rjmp .+88 ; 0x1106 */ 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); - 103e: 29 2f mov r18, r25 - 1040: 2f 70 andi r18, 0x0F ; 15 - 1042: 20 93 e9 00 sts 0x00E9, r18 + 10ae: 29 2f mov r18, r25 + 10b0: 2f 70 andi r18, 0x0F ; 15 + 10b2: 20 93 e9 00 sts 0x00E9, r18 uint8_t UECFG1XTemp; uint8_t UEIENXTemp; Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) - 1046: 98 17 cp r25, r24 - 1048: 39 f0 breq .+14 ; 0x1058 + 10b6: 98 17 cp r25, r24 + 10b8: 39 f0 breq .+14 ; 0x10c8 UECFG1XTemp = UECFG1XData; UEIENXTemp = 0; } else { UECFG0XTemp = UECFG0X; - 104a: 70 91 ec 00 lds r23, 0x00EC + 10ba: 70 91 ec 00 lds r23, 0x00EC UECFG1XTemp = UECFG1X; - 104e: 20 91 ed 00 lds r18, 0x00ED + 10be: 20 91 ed 00 lds r18, 0x00ED UEIENXTemp = UEIENX; - 1052: 50 91 f0 00 lds r21, 0x00F0 - 1056: 03 c0 rjmp .+6 ; 0x105e + 10c2: 50 91 f0 00 lds r21, 0x00F0 + 10c6: 03 c0 rjmp .+6 ; 0x10ce Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0XTemp = UECFG0XData; UECFG1XTemp = UECFG1XData; - 1058: 24 2f mov r18, r20 + 10c8: 24 2f mov r18, r20 Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0XTemp = UECFG0XData; - 105a: 76 2f mov r23, r22 + 10ca: 76 2f mov r23, r22 UECFG1XTemp = UECFG1XData; UEIENXTemp = 0; - 105c: 50 e0 ldi r21, 0x00 ; 0 + 10cc: 50 e0 ldi r21, 0x00 ; 0 UECFG0XTemp = UECFG0X; UECFG1XTemp = UECFG1X; UEIENXTemp = UEIENX; } if (!(UECFG1XTemp & (1 << ALLOC))) - 105e: 21 ff sbrs r18, 1 - 1060: 19 c0 rjmp .+50 ; 0x1094 + 10ce: 21 ff sbrs r18, 1 + 10d0: 19 c0 rjmp .+50 ; 0x1104 * to and from a host. */ static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_DisableEndpoint(void) { UECONX &= ~(1 << EPEN); - 1062: 30 91 eb 00 lds r19, 0x00EB - 1066: 3e 7f andi r19, 0xFE ; 254 - 1068: 30 93 eb 00 sts 0x00EB, r19 + 10d2: 30 91 eb 00 lds r19, 0x00EB + 10d6: 3e 7f andi r19, 0xFE ; 254 + 10d8: 30 93 eb 00 sts 0x00EB, r19 continue; Endpoint_DisableEndpoint(); UECFG1X &= ~(1 << ALLOC); - 106c: 30 91 ed 00 lds r19, 0x00ED - 1070: 3d 7f andi r19, 0xFD ; 253 - 1072: 30 93 ed 00 sts 0x00ED, r19 + 10dc: 30 91 ed 00 lds r19, 0x00ED + 10e0: 3d 7f andi r19, 0xFD ; 253 + 10e2: 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); - 1076: 30 91 eb 00 lds r19, 0x00EB - 107a: 31 60 ori r19, 0x01 ; 1 - 107c: 30 93 eb 00 sts 0x00EB, r19 + 10e6: 30 91 eb 00 lds r19, 0x00EB + 10ea: 31 60 ori r19, 0x01 ; 1 + 10ec: 30 93 eb 00 sts 0x00EB, r19 Endpoint_EnableEndpoint(); UECFG0X = UECFG0XTemp; - 1080: 70 93 ec 00 sts 0x00EC, r23 + 10f0: 70 93 ec 00 sts 0x00EC, r23 UECFG1X = UECFG1XTemp; - 1084: 20 93 ed 00 sts 0x00ED, r18 + 10f4: 20 93 ed 00 sts 0x00ED, r18 UEIENX = UEIENXTemp; - 1088: 50 93 f0 00 sts 0x00F0, r21 + 10f8: 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); - 108c: 20 91 ee 00 lds r18, 0x00EE + 10fc: 20 91 ee 00 lds r18, 0x00EE if (!(Endpoint_IsConfigured())) - 1090: 27 ff sbrs r18, 7 - 1092: 08 c0 rjmp .+16 ; 0x10a4 + 1100: 27 ff sbrs r18, 7 + 1102: 08 c0 rjmp .+16 ; 0x1114 UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - 1094: 9f 5f subi r25, 0xFF ; 255 - 1096: 95 30 cpi r25, 0x05 ; 5 - 1098: 90 f2 brcs .-92 ; 0x103e + 1104: 9f 5f subi r25, 0xFF ; 255 + 1106: 95 30 cpi r25, 0x05 ; 5 + 1108: 90 f2 brcs .-92 ; 0x10ae */ 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); - 109a: 8f 70 andi r24, 0x0F ; 15 - 109c: 80 93 e9 00 sts 0x00E9, r24 + 110a: 8f 70 andi r24, 0x0F ; 15 + 110c: 80 93 e9 00 sts 0x00E9, r24 if (!(Endpoint_IsConfigured())) return false; } Endpoint_SelectEndpoint(Number); return true; - 10a0: 81 e0 ldi r24, 0x01 ; 1 - 10a2: 08 95 ret + 1110: 81 e0 ldi r24, 0x01 ; 1 + 1112: 08 95 ret UECFG0X = UECFG0XTemp; UECFG1X = UECFG1XTemp; UEIENX = UEIENXTemp; if (!(Endpoint_IsConfigured())) return false; - 10a4: 80 e0 ldi r24, 0x00 ; 0 + 1114: 80 e0 ldi r24, 0x00 ; 0 } Endpoint_SelectEndpoint(Number); return true; #endif } - 10a6: 08 95 ret + 1116: 08 95 ret -000010a8 : +00001118 : uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE; #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { - 10a8: ef 92 push r14 - 10aa: ff 92 push r15 - 10ac: 0f 93 push r16 - 10ae: 1f 93 push r17 - 10b0: cf 93 push r28 - 10b2: df 93 push r29 - 10b4: 16 2f mov r17, r22 + 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 { if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; - 10b6: e8 2e mov r14, r24 - 10b8: e7 01 movw r28, r14 - 10ba: 7e 01 movw r14, r28 - 10bc: f9 2e mov r15, r25 - 10be: e7 01 movw r28, r14 + 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 #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - 10c0: 00 e0 ldi r16, 0x00 ; 0 - 10c2: 2a c0 rjmp .+84 ; 0x1118 + 1130: 00 e0 ldi r16, 0x00 ; 0 + 1132: 2a c0 rjmp .+84 ; 0x1188 { if (!(Table[i].Address)) - 10c4: 98 81 ld r25, Y - 10c6: 99 23 and r25, r25 - 10c8: 29 f1 breq .+74 ; 0x1114 + 1134: 98 81 ld r25, Y + 1136: 99 23 and r25, r25 + 1138: 29 f1 breq .+74 ; 0x1184 continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 10ca: 6b 81 ldd r22, Y+3 ; 0x03 - 10cc: e9 81 ldd r30, Y+1 ; 0x01 - 10ce: fa 81 ldd r31, Y+2 ; 0x02 - 10d0: 2c 81 ldd r18, Y+4 ; 0x04 + 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 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); - 10d2: 89 2f mov r24, r25 - 10d4: 8f 70 andi r24, 0x0F ; 15 + 1142: 89 2f mov r24, r25 + 1144: 8f 70 andi r24, 0x0F ; 15 if (Number >= ENDPOINT_TOTAL_ENDPOINTS) - 10d6: 85 30 cpi r24, 0x05 ; 5 - 10d8: 18 f5 brcc .+70 ; 0x1120 + 1146: 85 30 cpi r24, 0x05 ; 5 + 1148: 18 f5 brcc .+70 ; 0x1190 return false; return Endpoint_ConfigureEndpoint_Prv(Number, ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)), - 10da: 62 95 swap r22 - 10dc: 66 0f add r22, r22 - 10de: 66 0f add r22, r22 - 10e0: 60 7c andi r22, 0xC0 ; 192 - 10e2: 99 1f adc r25, r25 - 10e4: 99 27 eor r25, r25 - 10e6: 99 1f adc r25, r25 + 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 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - 10e8: 69 2b or r22, r25 - 10ea: 22 30 cpi r18, 0x02 ; 2 - 10ec: 10 f0 brcs .+4 ; 0x10f2 - 10ee: 96 e0 ldi r25, 0x06 ; 6 - 10f0: 01 c0 rjmp .+2 ; 0x10f4 - 10f2: 92 e0 ldi r25, 0x02 ; 2 + 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 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; - 10f4: 28 e0 ldi r18, 0x08 ; 8 - 10f6: 30 e0 ldi r19, 0x00 ; 0 + 1164: 28 e0 ldi r18, 0x08 ; 8 + 1166: 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; - 10f8: 40 e0 ldi r20, 0x00 ; 0 - 10fa: 03 c0 rjmp .+6 ; 0x1102 + 1168: 40 e0 ldi r20, 0x00 ; 0 + 116a: 03 c0 rjmp .+6 ; 0x1172 uint16_t CheckBytes = 8; while (CheckBytes < Bytes) { MaskVal++; - 10fc: 4f 5f subi r20, 0xFF ; 255 + 116c: 4f 5f subi r20, 0xFF ; 255 CheckBytes <<= 1; - 10fe: 22 0f add r18, r18 - 1100: 33 1f adc r19, r19 + 116e: 22 0f add r18, r18 + 1170: 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) - 1102: 2e 17 cp r18, r30 - 1104: 3f 07 cpc r19, r31 - 1106: d0 f3 brcs .-12 ; 0x10fc + 1172: 2e 17 cp r18, r30 + 1174: 3f 07 cpc r19, r31 + 1176: d0 f3 brcs .-12 ; 0x116c { MaskVal++; CheckBytes <<= 1; } return (MaskVal << EPSIZE0); - 1108: 42 95 swap r20 - 110a: 40 7f andi r20, 0xF0 ; 240 + 1178: 42 95 swap r20 + 117a: 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, - 110c: 49 2b or r20, r25 - 110e: 95 df rcall .-214 ; 0x103a - 1110: 88 23 and r24, r24 - 1112: 31 f0 breq .+12 ; 0x1120 + 117c: 49 2b or r20, r25 + 117e: 95 df rcall .-214 ; 0x10aa + 1180: 88 23 and r24, r24 + 1182: 31 f0 breq .+12 ; 0x1190 #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - 1114: 0f 5f subi r16, 0xFF ; 255 - 1116: 25 96 adiw r28, 0x05 ; 5 - 1118: 01 17 cp r16, r17 - 111a: a0 f2 brcs .-88 ; 0x10c4 + 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 if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; } return true; - 111c: 81 e0 ldi r24, 0x01 ; 1 - 111e: 01 c0 rjmp .+2 ; 0x1122 + 118c: 81 e0 ldi r24, 0x01 ; 1 + 118e: 01 c0 rjmp .+2 ; 0x1192 { if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; - 1120: 80 e0 ldi r24, 0x00 ; 0 + 1190: 80 e0 ldi r24, 0x00 ; 0 } return true; } - 1122: df 91 pop r29 - 1124: cf 91 pop r28 - 1126: 1f 91 pop r17 - 1128: 0f 91 pop r16 - 112a: ff 90 pop r15 - 112c: ef 90 pop r14 - 112e: 08 95 ret - -00001130 : + 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 : } } void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - 1130: 80 91 e8 02 lds r24, 0x02E8 - 1134: 87 ff sbrs r24, 7 - 1136: 11 c0 rjmp .+34 ; 0x115a - 1138: 03 c0 rjmp .+6 ; 0x1140 + 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 { while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 113a: 8e b3 in r24, 0x1e ; 30 - 113c: 88 23 and r24, r24 - 113e: b1 f0 breq .+44 ; 0x116c + 11aa: 8e b3 in r24, 0x1e ; 30 + 11ac: 88 23 and r24, r24 + 11ae: b1 f0 breq .+44 ; 0x11dc * \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); - 1140: 80 91 e8 00 lds r24, 0x00E8 + 11b0: 80 91 e8 00 lds r24, 0x00E8 void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) { while (!(Endpoint_IsOUTReceived())) - 1144: 82 ff sbrs r24, 2 - 1146: f9 cf rjmp .-14 ; 0x113a + 11b4: 82 ff sbrs r24, 2 + 11b6: f9 cf rjmp .-14 ; 0x11aa */ 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)); - 1148: 80 91 e8 00 lds r24, 0x00E8 - 114c: 8b 77 andi r24, 0x7B ; 123 - 114e: 80 93 e8 00 sts 0x00E8, r24 - 1152: 08 95 ret + 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 } else { while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 1154: 8e b3 in r24, 0x1e ; 30 - 1156: 88 23 and r24, r24 - 1158: 49 f0 breq .+18 ; 0x116c + 11c4: 8e b3 in r24, 0x1e ; 30 + 11c6: 88 23 and r24, r24 + 11c8: 49 f0 breq .+18 ; 0x11dc * \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); - 115a: 80 91 e8 00 lds r24, 0x00E8 + 11ca: 80 91 e8 00 lds r24, 0x00E8 Endpoint_ClearOUT(); } else { while (!(Endpoint_IsINReady())) - 115e: 80 ff sbrs r24, 0 - 1160: f9 cf rjmp .-14 ; 0x1154 + 11ce: 80 ff sbrs r24, 0 + 11d0: f9 cf rjmp .-14 ; 0x11c4 */ 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)); - 1162: 80 91 e8 00 lds r24, 0x00E8 - 1166: 8e 77 andi r24, 0x7E ; 126 - 1168: 80 93 e8 00 sts 0x00E8, r24 - 116c: 08 95 ret + 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 -0000116e : +000011de : * \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; - 116e: 80 91 e4 00 lds r24, 0x00E4 - 1172: 90 91 e5 00 lds r25, 0x00E5 + 11de: 80 91 e4 00 lds r24, 0x00E4 + 11e2: 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; - 1176: 44 e6 ldi r20, 0x64 ; 100 + 11e6: 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; - 1178: 20 91 ec 00 lds r18, 0x00EC - 117c: 20 ff sbrs r18, 0 - 117e: 25 c0 rjmp .+74 ; 0x11ca + 11e8: 20 91 ec 00 lds r18, 0x00EC + 11ec: 20 ff sbrs r18, 0 + 11ee: 25 c0 rjmp .+74 ; 0x123a * \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); - 1180: 20 91 e8 00 lds r18, 0x00E8 + 11f0: 20 91 e8 00 lds r18, 0x00E8 for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) { if (Endpoint_IsINReady()) - 1184: 20 fd sbrc r18, 0 - 1186: 15 c0 rjmp .+42 ; 0x11b2 + 11f4: 20 fd sbrc r18, 0 + 11f6: 15 c0 rjmp .+42 ; 0x1222 { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; } uint8_t USB_DeviceState_LCL = USB_DeviceState; - 1188: 2e b3 in r18, 0x1e ; 30 + 11f8: 2e b3 in r18, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 118a: 22 23 and r18, r18 - 118c: a1 f0 breq .+40 ; 0x11b6 + 11fa: 22 23 and r18, r18 + 11fc: a1 f0 breq .+40 ; 0x1226 return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 118e: 25 30 cpi r18, 0x05 ; 5 - 1190: a1 f0 breq .+40 ; 0x11ba + 11fe: 25 30 cpi r18, 0x05 ; 5 + 1200: a1 f0 breq .+40 ; 0x122a * \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); - 1192: 20 91 eb 00 lds r18, 0x00EB + 1202: 20 91 eb 00 lds r18, 0x00EB return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) - 1196: 25 fd sbrc r18, 5 - 1198: 12 c0 rjmp .+36 ; 0x11be - 119a: 20 91 e4 00 lds r18, 0x00E4 - 119e: 30 91 e5 00 lds r19, 0x00E5 + 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 return ENDPOINT_READYWAIT_EndpointStalled; uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); if (CurrentFrameNumber != PreviousFrameNumber) - 11a2: 28 17 cp r18, r24 - 11a4: 39 07 cpc r19, r25 - 11a6: 41 f3 breq .-48 ; 0x1178 + 1212: 28 17 cp r18, r24 + 1214: 39 07 cpc r19, r25 + 1216: 41 f3 breq .-48 ; 0x11e8 { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) - 11a8: 44 23 and r20, r20 - 11aa: 59 f0 breq .+22 ; 0x11c2 - 11ac: 41 50 subi r20, 0x01 ; 1 - 11ae: c9 01 movw r24, r18 - 11b0: e3 cf rjmp .-58 ; 0x1178 + 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 for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) { if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; - 11b2: 80 e0 ldi r24, 0x00 ; 0 - 11b4: 08 95 ret + 1222: 80 e0 ldi r24, 0x00 ; 0 + 1224: 08 95 ret } uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; - 11b6: 82 e0 ldi r24, 0x02 ; 2 - 11b8: 08 95 ret + 1226: 82 e0 ldi r24, 0x02 ; 2 + 1228: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; - 11ba: 83 e0 ldi r24, 0x03 ; 3 - 11bc: 08 95 ret + 122a: 83 e0 ldi r24, 0x03 ; 3 + 122c: 08 95 ret else if (Endpoint_IsStalled()) return ENDPOINT_READYWAIT_EndpointStalled; - 11be: 81 e0 ldi r24, 0x01 ; 1 - 11c0: 08 95 ret + 122e: 81 e0 ldi r24, 0x01 ; 1 + 1230: 08 95 ret if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; - 11c2: 84 e0 ldi r24, 0x04 ; 4 - 11c4: 08 95 ret + 1232: 84 e0 ldi r24, 0x04 ; 4 + 1234: 08 95 ret return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; - 11c6: 80 e0 ldi r24, 0x00 ; 0 + 1236: 80 e0 ldi r24, 0x00 ; 0 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 11c8: 08 95 ret + 1238: 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); - 11ca: 20 91 e8 00 lds r18, 0x00E8 + 123a: 20 91 e8 00 lds r18, 0x00E8 if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) - 11ce: 22 ff sbrs r18, 2 - 11d0: db cf rjmp .-74 ; 0x1188 - 11d2: f9 cf rjmp .-14 ; 0x11c6 + 123e: 22 ff sbrs r18, 2 + 1240: db cf rjmp .-74 ; 0x11f8 + 1242: f9 cf rjmp .-14 ; 0x1236 -000011d4 : +00001244 : { #if defined(USB_CAN_BE_BOTH) bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); #endif USB_INT_DisableAllInterrupts(); - 11d4: 40 d0 rcall .+128 ; 0x1256 + 1244: 40 d0 rcall .+128 ; 0x12c6 USB_INT_ClearAllInterrupts(); - 11d6: 42 d0 rcall .+132 ; 0x125c + 1246: 42 d0 rcall .+132 ; 0x12cc } static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Reset(void) { USBCON &= ~(1 << USBE); - 11d8: 80 91 d8 00 lds r24, 0x00D8 - 11dc: 8f 77 andi r24, 0x7F ; 127 - 11de: 80 93 d8 00 sts 0x00D8, r24 + 1248: 80 91 d8 00 lds r24, 0x00D8 + 124c: 8f 77 andi r24, 0x7F ; 127 + 124e: 80 93 d8 00 sts 0x00D8, r24 USBCON |= (1 << USBE); - 11e2: 80 91 d8 00 lds r24, 0x00D8 - 11e6: 80 68 ori r24, 0x80 ; 128 - 11e8: 80 93 d8 00 sts 0x00D8, r24 + 1252: 80 91 d8 00 lds r24, 0x00D8 + 1256: 80 68 ori r24, 0x80 ; 128 + 1258: 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); - 11ec: 80 91 d8 00 lds r24, 0x00D8 - 11f0: 8f 7d andi r24, 0xDF ; 223 - 11f2: 80 93 d8 00 sts 0x00D8, r24 + 125c: 80 91 d8 00 lds r24, 0x00D8 + 1260: 8f 7d andi r24, 0xDF ; 223 + 1262: 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; - 11f6: 84 e0 ldi r24, 0x04 ; 4 - 11f8: 89 bd out 0x29, r24 ; 41 + 1266: 84 e0 ldi r24, 0x04 ; 4 + 1268: 89 bd out 0x29, r24 ; 41 PLLCSR = (USB_PLL_PSC | (1 << PLLE)); - 11fa: 86 e0 ldi r24, 0x06 ; 6 - 11fc: 89 bd out 0x29, r24 ; 41 + 126a: 86 e0 ldi r24, 0x06 ; 6 + 126c: 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())); - 11fe: 09 b4 in r0, 0x29 ; 41 - 1200: 00 fe sbrs r0, 0 - 1202: fd cf rjmp .-6 ; 0x11fe + 126e: 09 b4 in r0, 0x29 ; 41 + 1270: 00 fe sbrs r0, 0 + 1272: fd cf rjmp .-6 ; 0x126e } #if defined(USB_CAN_BE_DEVICE) static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; - 1204: 1e ba out 0x1e, r1 ; 30 + 1274: 1e ba out 0x1e, r1 ; 30 USB_Device_ConfigurationNumber = 0; - 1206: 10 92 e4 02 sts 0x02E4, r1 + 1276: 10 92 c8 02 sts 0x02C8, r1 #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; - 120a: 10 92 e6 02 sts 0x02E6, r1 + 127a: 10 92 ca 02 sts 0x02CA, r1 #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; - 120e: 10 92 e5 02 sts 0x02E5, r1 + 127e: 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, - 1212: 80 e0 ldi r24, 0x00 ; 0 - 1214: 60 e0 ldi r22, 0x00 ; 0 - 1216: 42 e0 ldi r20, 0x02 ; 2 - 1218: 10 df rcall .-480 ; 0x103a + 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 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); - 121a: 80 91 e1 00 lds r24, 0x00E1 - 121e: 8e 7f andi r24, 0xFE ; 254 - 1220: 80 93 e1 00 sts 0x00E1, r24 + 128a: 80 91 e1 00 lds r24, 0x00E1 + 128e: 8e 7f andi r24, 0xFE ; 254 + 1290: 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); - 1224: 80 91 e2 00 lds r24, 0x00E2 - 1228: 81 60 ori r24, 0x01 ; 1 - 122a: 80 93 e2 00 sts 0x00E2, r24 + 1294: 80 91 e2 00 lds r24, 0x00E2 + 1298: 81 60 ori r24, 0x01 ; 1 + 129a: 80 93 e2 00 sts 0x00E2, r24 break; case USB_INT_EORSTI: UDIEN |= (1 << EORSTE); - 122e: 80 91 e2 00 lds r24, 0x00E2 - 1232: 88 60 ori r24, 0x08 ; 8 - 1234: 80 93 e2 00 sts 0x00E2, r24 + 129e: 80 91 e2 00 lds r24, 0x00E2 + 12a2: 88 60 ori r24, 0x08 ; 8 + 12a4: 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); - 1238: 80 91 e0 00 lds r24, 0x00E0 - 123c: 8e 7f andi r24, 0xFE ; 254 - 123e: 80 93 e0 00 sts 0x00E0, r24 + 12a8: 80 91 e0 00 lds r24, 0x00E0 + 12ac: 8e 7f andi r24, 0xFE ; 254 + 12ae: 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 } - 1242: 08 95 ret + 12b2: 08 95 ret -00001244 : +000012b4 : 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); - 1244: e3 e6 ldi r30, 0x63 ; 99 - 1246: f0 e0 ldi r31, 0x00 ; 0 - 1248: 80 81 ld r24, Z - 124a: 8e 7f andi r24, 0xFE ; 254 - 124c: 80 83 st Z, r24 + 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 UHWCON &= ~(1 << UIDE); USB_CurrentMode = Mode; } #endif USB_IsInitialized = true; - 124e: 81 e0 ldi r24, 0x01 ; 1 - 1250: 80 93 e7 02 sts 0x02E7, r24 + 12be: 81 e0 ldi r24, 0x01 ; 1 + 12c0: 80 93 cb 02 sts 0x02CB, r24 USB_ResetInterface(); } - 1254: bf cf rjmp .-130 ; 0x11d4 + 12c4: bf cf rjmp .-130 ; 0x1244 -00001256 : +000012c6 : #if defined(USB_CAN_BE_HOST) UHIEN = 0; #endif #if defined(USB_CAN_BE_DEVICE) UDIEN = 0; - 1256: 10 92 e2 00 sts 0x00E2, r1 + 12c6: 10 92 e2 00 sts 0x00E2, r1 #endif } - 125a: 08 95 ret + 12ca: 08 95 ret -0000125c : +000012cc : #if defined(USB_CAN_BE_HOST) UHINT = 0; #endif #if defined(USB_CAN_BE_DEVICE) UDINT = 0; - 125c: 10 92 e1 00 sts 0x00E1, r1 + 12cc: 10 92 e1 00 sts 0x00E1, r1 #endif } - 1260: 08 95 ret + 12d0: 08 95 ret -00001262 <__vector_11>: +000012d2 <__vector_11>: ISR(USB_GEN_vect, ISR_BLOCK) { - 1262: 1f 92 push r1 - 1264: 0f 92 push r0 - 1266: 0f b6 in r0, 0x3f ; 63 - 1268: 0f 92 push r0 - 126a: 11 24 eor r1, r1 - 126c: 2f 93 push r18 - 126e: 3f 93 push r19 - 1270: 4f 93 push r20 - 1272: 5f 93 push r21 - 1274: 6f 93 push r22 - 1276: 7f 93 push r23 - 1278: 8f 93 push r24 - 127a: 9f 93 push r25 - 127c: af 93 push r26 - 127e: bf 93 push r27 - 1280: ef 93 push r30 - 1282: ff 93 push r31 + 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 case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); case USB_INT_EORSTI: return (UDINT & (1 << EORSTI)); case USB_INT_SOFI: return (UDINT & (1 << SOFI)); - 1284: 80 91 e1 00 lds r24, 0x00E1 + 12f4: 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)) - 1288: 82 ff sbrs r24, 2 - 128a: 0a c0 rjmp .+20 ; 0x12a0 <__vector_11+0x3e> + 12f8: 82 ff sbrs r24, 2 + 12fa: 0a c0 rjmp .+20 ; 0x1310 <__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)); - 128c: 80 91 e2 00 lds r24, 0x00E2 - 1290: 82 ff sbrs r24, 2 - 1292: 06 c0 rjmp .+12 ; 0x12a0 <__vector_11+0x3e> + 12fc: 80 91 e2 00 lds r24, 0x00E2 + 1300: 82 ff sbrs r24, 2 + 1302: 06 c0 rjmp .+12 ; 0x1310 <__vector_11+0x3e> break; case USB_INT_EORSTI: UDINT &= ~(1 << EORSTI); break; case USB_INT_SOFI: UDINT &= ~(1 << SOFI); - 1294: 80 91 e1 00 lds r24, 0x00E1 - 1298: 8b 7f andi r24, 0xFB ; 251 - 129a: 80 93 e1 00 sts 0x00E1, r24 + 1304: 80 91 e1 00 lds r24, 0x00E1 + 1308: 8b 7f andi r24, 0xFB ; 251 + 130a: 80 93 e1 00 sts 0x00E1, r24 { USB_INT_Clear(USB_INT_SOFI); EVENT_USB_Device_StartOfFrame(); - 129e: 22 d2 rcall .+1092 ; 0x16e4 + 130e: 22 d2 rcall .+1092 ; 0x1754 #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); - 12a0: 80 91 e1 00 lds r24, 0x00E1 + 1310: 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)) - 12a4: 80 ff sbrs r24, 0 - 12a6: 16 c0 rjmp .+44 ; 0x12d4 <__vector_11+0x72> + 1314: 80 ff sbrs r24, 0 + 1316: 16 c0 rjmp .+44 ; 0x1344 <__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)); - 12a8: 80 91 e2 00 lds r24, 0x00E2 - 12ac: 80 ff sbrs r24, 0 - 12ae: 12 c0 rjmp .+36 ; 0x12d4 <__vector_11+0x72> + 1318: 80 91 e2 00 lds r24, 0x00E2 + 131c: 80 ff sbrs r24, 0 + 131e: 12 c0 rjmp .+36 ; 0x1344 <__vector_11+0x72> #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN &= ~(1 << SUSPE); - 12b0: 80 91 e2 00 lds r24, 0x00E2 - 12b4: 8e 7f andi r24, 0xFE ; 254 - 12b6: 80 93 e2 00 sts 0x00E2, r24 + 1320: 80 91 e2 00 lds r24, 0x00E2 + 1324: 8e 7f andi r24, 0xFE ; 254 + 1326: 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); - 12ba: 80 91 e2 00 lds r24, 0x00E2 - 12be: 80 61 ori r24, 0x10 ; 16 - 12c0: 80 93 e2 00 sts 0x00E2, r24 + 132a: 80 91 e2 00 lds r24, 0x00E2 + 132e: 80 61 ori r24, 0x10 ; 16 + 1330: 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); - 12c4: 80 91 d8 00 lds r24, 0x00D8 - 12c8: 80 62 ori r24, 0x20 ; 32 - 12ca: 80 93 d8 00 sts 0x00D8, r24 + 1334: 80 91 d8 00 lds r24, 0x00D8 + 1338: 80 62 ori r24, 0x20 ; 32 + 133a: 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; - 12ce: 19 bc out 0x29, r1 ; 41 + 133e: 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; - 12d0: 1e ba out 0x1e, r1 ; 30 + 1340: 1e ba out 0x1e, r1 ; 30 EVENT_USB_Device_Disconnect(); - 12d2: df d9 rcall .-3138 ; 0x692 + 1342: a7 d9 rcall .-3250 ; 0x692 case USB_INT_IDTI: return (USBINT & (1 << IDTI)); #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); - 12d4: 80 91 e1 00 lds r24, 0x00E1 + 1344: 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)) - 12d8: 84 ff sbrs r24, 4 - 12da: 2c c0 rjmp .+88 ; 0x1334 <__vector_11+0xd2> + 1348: 84 ff sbrs r24, 4 + 134a: 2c c0 rjmp .+88 ; 0x13a4 <__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)); - 12dc: 80 91 e2 00 lds r24, 0x00E2 - 12e0: 84 ff sbrs r24, 4 - 12e2: 28 c0 rjmp .+80 ; 0x1334 <__vector_11+0xd2> + 134c: 80 91 e2 00 lds r24, 0x00E2 + 1350: 84 ff sbrs r24, 4 + 1352: 28 c0 rjmp .+80 ; 0x13a4 <__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; - 12e4: 84 e0 ldi r24, 0x04 ; 4 - 12e6: 89 bd out 0x29, r24 ; 41 + 1354: 84 e0 ldi r24, 0x04 ; 4 + 1356: 89 bd out 0x29, r24 ; 41 PLLCSR = (USB_PLL_PSC | (1 << PLLE)); - 12e8: 86 e0 ldi r24, 0x06 ; 6 - 12ea: 89 bd out 0x29, r24 ; 41 + 1358: 86 e0 ldi r24, 0x06 ; 6 + 135a: 89 bd out 0x29, r24 ; 41 { if (!(USB_Options & USB_OPT_MANUAL_PLL)) { USB_PLL_On(); while (!(USB_PLL_IsReady())); - 12ec: 09 b4 in r0, 0x29 ; 41 - 12ee: 00 fe sbrs r0, 0 - 12f0: fd cf rjmp .-6 ; 0x12ec <__vector_11+0x8a> + 135c: 09 b4 in r0, 0x29 ; 41 + 135e: 00 fe sbrs r0, 0 + 1360: fd cf rjmp .-6 ; 0x135c <__vector_11+0x8a> } static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Unfreeze(void) { USBCON &= ~(1 << FRZCLK); - 12f2: 80 91 d8 00 lds r24, 0x00D8 - 12f6: 8f 7d andi r24, 0xDF ; 223 - 12f8: 80 93 d8 00 sts 0x00D8, r24 + 1362: 80 91 d8 00 lds r24, 0x00D8 + 1366: 8f 7d andi r24, 0xDF ; 223 + 1368: 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); - 12fc: 80 91 e1 00 lds r24, 0x00E1 - 1300: 8f 7e andi r24, 0xEF ; 239 - 1302: 80 93 e1 00 sts 0x00E1, r24 + 136c: 80 91 e1 00 lds r24, 0x00E1 + 1370: 8f 7e andi r24, 0xEF ; 239 + 1372: 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); - 1306: 80 91 e2 00 lds r24, 0x00E2 - 130a: 8f 7e andi r24, 0xEF ; 239 - 130c: 80 93 e2 00 sts 0x00E2, r24 + 1376: 80 91 e2 00 lds r24, 0x00E2 + 137a: 8f 7e andi r24, 0xEF ; 239 + 137c: 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); - 1310: 80 91 e2 00 lds r24, 0x00E2 - 1314: 81 60 ori r24, 0x01 ; 1 - 1316: 80 93 e2 00 sts 0x00E2, r24 + 1380: 80 91 e2 00 lds r24, 0x00E2 + 1384: 81 60 ori r24, 0x01 ; 1 + 1386: 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) - 131a: 80 91 e4 02 lds r24, 0x02E4 - 131e: 88 23 and r24, r24 - 1320: 21 f4 brne .+8 ; 0x132a <__vector_11+0xc8> + 138a: 80 91 c8 02 lds r24, 0x02C8 + 138e: 88 23 and r24, r24 + 1390: 21 f4 brne .+8 ; 0x139a <__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)); - 1322: 80 91 e3 00 lds r24, 0x00E3 + 1392: 80 91 e3 00 lds r24, 0x00E3 USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - 1326: 87 ff sbrs r24, 7 - 1328: 02 c0 rjmp .+4 ; 0x132e <__vector_11+0xcc> - 132a: 84 e0 ldi r24, 0x04 ; 4 - 132c: 01 c0 rjmp .+2 ; 0x1330 <__vector_11+0xce> - 132e: 81 e0 ldi r24, 0x01 ; 1 - 1330: 8e bb out 0x1e, r24 ; 30 + 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 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) EVENT_USB_Device_Connect(); - 1332: ae d9 rcall .-3236 ; 0x690 + 13a2: 76 d9 rcall .-3348 ; 0x690 case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); case USB_INT_EORSTI: return (UDINT & (1 << EORSTI)); - 1334: 80 91 e1 00 lds r24, 0x00E1 + 13a4: 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)) - 1338: 83 ff sbrs r24, 3 - 133a: 26 c0 rjmp .+76 ; 0x1388 <__vector_11+0x126> + 13a8: 83 ff sbrs r24, 3 + 13aa: 26 c0 rjmp .+76 ; 0x13f8 <__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)); - 133c: 80 91 e2 00 lds r24, 0x00E2 - 1340: 83 ff sbrs r24, 3 - 1342: 22 c0 rjmp .+68 ; 0x1388 <__vector_11+0x126> + 13ac: 80 91 e2 00 lds r24, 0x00E2 + 13b0: 83 ff sbrs r24, 3 + 13b2: 22 c0 rjmp .+68 ; 0x13f8 <__vector_11+0x126> break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); break; case USB_INT_EORSTI: UDINT &= ~(1 << EORSTI); - 1344: 80 91 e1 00 lds r24, 0x00E1 - 1348: 87 7f andi r24, 0xF7 ; 247 - 134a: 80 93 e1 00 sts 0x00E1, r24 + 13b4: 80 91 e1 00 lds r24, 0x00E1 + 13b8: 87 7f andi r24, 0xF7 ; 247 + 13ba: 80 93 e1 00 sts 0x00E1, r24 { USB_INT_Clear(USB_INT_EORSTI); USB_DeviceState = DEVICE_STATE_Default; - 134e: 82 e0 ldi r24, 0x02 ; 2 - 1350: 8e bb out 0x1e, r24 ; 30 + 13be: 82 e0 ldi r24, 0x02 ; 2 + 13c0: 8e bb out 0x1e, r24 ; 30 USB_Device_ConfigurationNumber = 0; - 1352: 10 92 e4 02 sts 0x02E4, r1 + 13c2: 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); - 1356: 80 91 e1 00 lds r24, 0x00E1 - 135a: 8e 7f andi r24, 0xFE ; 254 - 135c: 80 93 e1 00 sts 0x00E1, r24 + 13c6: 80 91 e1 00 lds r24, 0x00E1 + 13ca: 8e 7f andi r24, 0xFE ; 254 + 13cc: 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); - 1360: 80 91 e2 00 lds r24, 0x00E2 - 1364: 8e 7f andi r24, 0xFE ; 254 - 1366: 80 93 e2 00 sts 0x00E2, r24 + 13d0: 80 91 e2 00 lds r24, 0x00E2 + 13d4: 8e 7f andi r24, 0xFE ; 254 + 13d6: 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); - 136a: 80 91 e2 00 lds r24, 0x00E2 - 136e: 80 61 ori r24, 0x10 ; 16 - 1370: 80 93 e2 00 sts 0x00E2, r24 + 13da: 80 91 e2 00 lds r24, 0x00E2 + 13de: 80 61 ori r24, 0x10 ; 16 + 13e0: 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, - 1374: 80 e0 ldi r24, 0x00 ; 0 - 1376: 60 e0 ldi r22, 0x00 ; 0 - 1378: 42 e0 ldi r20, 0x02 ; 2 - 137a: 5f de rcall .-834 ; 0x103a + 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 break; case USB_INT_SOFI: UDIEN |= (1 << SOFE); break; case USB_INT_RXSTPI: UEIENX |= (1 << RXSTPE); - 137c: 80 91 f0 00 lds r24, 0x00F0 - 1380: 88 60 ori r24, 0x08 ; 8 - 1382: 80 93 f0 00 sts 0x00F0, r24 + 13ec: 80 91 f0 00 lds r24, 0x00F0 + 13f0: 88 60 ori r24, 0x08 ; 8 + 13f2: 80 93 f0 00 sts 0x00F0, r24 #if defined(INTERRUPT_CONTROL_ENDPOINT) USB_INT_Enable(USB_INT_RXSTPI); #endif EVENT_USB_Device_Reset(); - 1386: ae d1 rcall .+860 ; 0x16e4 + 13f6: ae d1 rcall .+860 ; 0x1754 USB_ResetInterface(); EVENT_USB_UIDChange(); } #endif } - 1388: ff 91 pop r31 - 138a: ef 91 pop r30 - 138c: bf 91 pop r27 - 138e: af 91 pop r26 - 1390: 9f 91 pop r25 - 1392: 8f 91 pop r24 - 1394: 7f 91 pop r23 - 1396: 6f 91 pop r22 - 1398: 5f 91 pop r21 - 139a: 4f 91 pop r20 - 139c: 3f 91 pop r19 - 139e: 2f 91 pop r18 - 13a0: 0f 90 pop r0 - 13a2: 0f be out 0x3f, r0 ; 63 - 13a4: 0f 90 pop r0 - 13a6: 1f 90 pop r1 - 13a8: 18 95 reti - -000013aa <__vector_12>: + 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>: #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) ISR(USB_COM_vect, ISR_BLOCK) { - 13aa: 1f 92 push r1 - 13ac: 0f 92 push r0 - 13ae: 0f b6 in r0, 0x3f ; 63 - 13b0: 0f 92 push r0 - 13b2: 11 24 eor r1, r1 - 13b4: 1f 93 push r17 - 13b6: 2f 93 push r18 - 13b8: 3f 93 push r19 - 13ba: 4f 93 push r20 - 13bc: 5f 93 push r21 - 13be: 6f 93 push r22 - 13c0: 7f 93 push r23 - 13c2: 8f 93 push r24 - 13c4: 9f 93 push r25 - 13c6: af 93 push r26 - 13c8: bf 93 push r27 - 13ca: ef 93 push r30 - 13cc: ff 93 push r31 + 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 */ 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()); - 13ce: 10 91 e9 00 lds r17, 0x00E9 - 13d2: 1f 70 andi r17, 0x0F ; 15 + 143e: 10 91 e9 00 lds r17, 0x00E9 + 1442: 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; - 13d4: 80 91 ec 00 lds r24, 0x00EC + 1444: 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); - 13d8: 10 92 e9 00 sts 0x00E9, r1 + 1448: 10 92 e9 00 sts 0x00E9, r1 break; case USB_INT_SOFI: UDIEN &= ~(1 << SOFE); break; case USB_INT_RXSTPI: UEIENX &= ~(1 << RXSTPE); - 13dc: 80 91 f0 00 lds r24, 0x00F0 - 13e0: 87 7f andi r24, 0xF7 ; 247 - 13e2: 80 93 f0 00 sts 0x00F0, r24 + 144c: 80 91 f0 00 lds r24, 0x00F0 + 1450: 87 7f andi r24, 0xF7 ; 247 + 1452: 80 93 f0 00 sts 0x00F0, r24 static inline void GlobalInterruptEnable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) sei(); - 13e6: 78 94 sei + 1456: 78 94 sei Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Disable(USB_INT_RXSTPI); GlobalInterruptEnable(); USB_Device_ProcessControlRequest(); - 13e8: 1b d0 rcall .+54 ; 0x1420 - 13ea: 10 92 e9 00 sts 0x00E9, r1 + 1458: 1b d0 rcall .+54 ; 0x1490 + 145a: 10 92 e9 00 sts 0x00E9, r1 break; case USB_INT_SOFI: UDIEN |= (1 << SOFE); break; case USB_INT_RXSTPI: UEIENX |= (1 << RXSTPE); - 13ee: 80 91 f0 00 lds r24, 0x00F0 - 13f2: 88 60 ori r24, 0x08 ; 8 - 13f4: 80 93 f0 00 sts 0x00F0, r24 - 13f8: 10 93 e9 00 sts 0x00E9, r17 + 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 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Enable(USB_INT_RXSTPI); Endpoint_SelectEndpoint(PrevSelectedEndpoint); } - 13fc: ff 91 pop r31 - 13fe: ef 91 pop r30 - 1400: bf 91 pop r27 - 1402: af 91 pop r26 - 1404: 9f 91 pop r25 - 1406: 8f 91 pop r24 - 1408: 7f 91 pop r23 - 140a: 6f 91 pop r22 - 140c: 5f 91 pop r21 - 140e: 4f 91 pop r20 - 1410: 3f 91 pop r19 - 1412: 2f 91 pop r18 - 1414: 1f 91 pop r17 - 1416: 0f 90 pop r0 - 1418: 0f be out 0x3f, r0 ; 63 - 141a: 0f 90 pop r0 - 141c: 1f 90 pop r1 - 141e: 18 95 reti - -00001420 : + 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 : #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) { - 1420: 1f 93 push r17 - 1422: df 93 push r29 - 1424: cf 93 push r28 - 1426: cd b7 in r28, 0x3d ; 61 - 1428: de b7 in r29, 0x3e ; 62 - 142a: ac 97 sbiw r28, 0x2c ; 44 - 142c: 0f b6 in r0, 0x3f ; 63 - 142e: f8 94 cli - 1430: de bf out 0x3e, r29 ; 62 - 1432: 0f be out 0x3f, r0 ; 63 - 1434: cd bf out 0x3d, r28 ; 61 + 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 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; - 1436: e8 ee ldi r30, 0xE8 ; 232 - 1438: f2 e0 ldi r31, 0x02 ; 2 + 14a6: ec ec ldi r30, 0xCC ; 204 + 14a8: 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; - 143a: 80 91 f1 00 lds r24, 0x00F1 + 14aa: 80 91 f1 00 lds r24, 0x00F1 for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) *(RequestHeader++) = Endpoint_Read_8(); - 143e: 81 93 st Z+, r24 + 14ae: 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++) - 1440: 22 e0 ldi r18, 0x02 ; 2 - 1442: e0 3f cpi r30, 0xF0 ; 240 - 1444: f2 07 cpc r31, r18 - 1446: c9 f7 brne .-14 ; 0x143a + 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 *(RequestHeader++) = Endpoint_Read_8(); #endif EVENT_USB_Device_ControlRequest(); - 1448: 29 d9 rcall .-3502 ; 0x69c + 14b8: f1 d8 rcall .-3614 ; 0x69c * \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); - 144a: 80 91 e8 00 lds r24, 0x00E8 + 14ba: 80 91 e8 00 lds r24, 0x00E8 if (Endpoint_IsSETUPReceived()) - 144e: 83 ff sbrs r24, 3 - 1450: 31 c1 rjmp .+610 ; 0x16b4 + 14be: 83 ff sbrs r24, 3 + 14c0: 31 c1 rjmp .+610 ; 0x1724 { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 1452: 80 91 e8 02 lds r24, 0x02E8 + 14c2: 80 91 cc 02 lds r24, 0x02CC switch (USB_ControlRequest.bRequest) - 1456: 20 91 e9 02 lds r18, 0x02E9 - 145a: 25 30 cpi r18, 0x05 ; 5 - 145c: 09 f4 brne .+2 ; 0x1460 - 145e: 84 c0 rjmp .+264 ; 0x1568 - 1460: 26 30 cpi r18, 0x06 ; 6 - 1462: 40 f4 brcc .+16 ; 0x1474 - 1464: 21 30 cpi r18, 0x01 ; 1 - 1466: a1 f1 breq .+104 ; 0x14d0 - 1468: 21 30 cpi r18, 0x01 ; 1 - 146a: 70 f0 brcs .+28 ; 0x1488 - 146c: 23 30 cpi r18, 0x03 ; 3 - 146e: 09 f0 breq .+2 ; 0x1472 - 1470: 21 c1 rjmp .+578 ; 0x16b4 - 1472: 2e c0 rjmp .+92 ; 0x14d0 - 1474: 28 30 cpi r18, 0x08 ; 8 - 1476: 09 f4 brne .+2 ; 0x147a - 1478: ef c0 rjmp .+478 ; 0x1658 - 147a: 29 30 cpi r18, 0x09 ; 9 - 147c: 09 f4 brne .+2 ; 0x1480 - 147e: fe c0 rjmp .+508 ; 0x167c - 1480: 26 30 cpi r18, 0x06 ; 6 - 1482: 09 f0 breq .+2 ; 0x1486 - 1484: 17 c1 rjmp .+558 ; 0x16b4 - 1486: 92 c0 rjmp .+292 ; 0x15ac + 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 { case REQ_GetStatus: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 1488: 80 38 cpi r24, 0x80 ; 128 - 148a: 21 f0 breq .+8 ; 0x1494 - 148c: 82 38 cpi r24, 0x82 ; 130 - 148e: 09 f0 breq .+2 ; 0x1492 - 1490: 11 c1 rjmp .+546 ; 0x16b4 - 1492: 08 c0 rjmp .+16 ; 0x14a4 + 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 Endpoint_ClearOUT(); } static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; - 1494: 80 91 e5 02 lds r24, 0x02E5 + 1504: 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) - 1498: 90 91 e6 02 lds r25, 0x02E6 - 149c: 99 23 and r25, r25 - 149e: 71 f0 breq .+28 ; 0x14bc + 1508: 90 91 ca 02 lds r25, 0x02CA + 150c: 99 23 and r25, r25 + 150e: 71 f0 breq .+28 ; 0x152c CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 14a0: 82 60 ori r24, 0x02 ; 2 - 14a2: 0c c0 rjmp .+24 ; 0x14bc + 1510: 82 60 ori r24, 0x02 ; 2 + 1512: 0c c0 rjmp .+24 ; 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); - 14a4: 80 91 ec 02 lds r24, 0x02EC - 14a8: 8f 70 andi r24, 0x0F ; 15 - 14aa: 80 93 e9 00 sts 0x00E9, r24 + 1514: 80 91 d0 02 lds r24, 0x02D0 + 1518: 8f 70 andi r24, 0x0F ; 15 + 151a: 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); - 14ae: 90 91 eb 00 lds r25, 0x00EB + 151e: 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(); - 14b2: 81 e0 ldi r24, 0x01 ; 1 - 14b4: 95 ff sbrs r25, 5 - 14b6: 80 e0 ldi r24, 0x00 ; 0 + 1522: 81 e0 ldi r24, 0x01 ; 1 + 1524: 95 ff sbrs r25, 5 + 1526: 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); - 14b8: 10 92 e9 00 sts 0x00E9, r1 + 1528: 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); - 14bc: 90 91 e8 00 lds r25, 0x00E8 - 14c0: 97 7f andi r25, 0xF7 ; 247 - 14c2: 90 93 e8 00 sts 0x00E8, r25 + 152c: 90 91 e8 00 lds r25, 0x00E8 + 1530: 97 7f andi r25, 0xF7 ; 247 + 1532: 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); - 14c6: 80 93 f1 00 sts 0x00F1, r24 + 1536: 80 93 f1 00 sts 0x00F1, r24 UEDATX = (Data >> 8); - 14ca: 10 92 f1 00 sts 0x00F1, r1 - 14ce: cf c0 rjmp .+414 ; 0x166e + 153a: 10 92 f1 00 sts 0x00F1, r1 + 153e: cf c0 rjmp .+414 ; 0x16de } break; case REQ_ClearFeature: case REQ_SetFeature: if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 14d0: 88 23 and r24, r24 - 14d2: 19 f0 breq .+6 ; 0x14da - 14d4: 82 30 cpi r24, 0x02 ; 2 - 14d6: 09 f0 breq .+2 ; 0x14da - 14d8: ed c0 rjmp .+474 ; 0x16b4 + 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 Endpoint_ClearStatusStage(); } static void USB_Device_ClearSetFeature(void) { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) - 14da: 90 e0 ldi r25, 0x00 ; 0 - 14dc: 8f 71 andi r24, 0x1F ; 31 - 14de: 90 70 andi r25, 0x00 ; 0 - 14e0: 00 97 sbiw r24, 0x00 ; 0 - 14e2: 29 f0 breq .+10 ; 0x14ee - 14e4: 82 30 cpi r24, 0x02 ; 2 - 14e6: 91 05 cpc r25, r1 - 14e8: 09 f0 breq .+2 ; 0x14ec - 14ea: e4 c0 rjmp .+456 ; 0x16b4 - 14ec: 0b c0 rjmp .+22 ; 0x1504 + 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 { #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) - 14ee: 80 91 ea 02 lds r24, 0x02EA - 14f2: 81 30 cpi r24, 0x01 ; 1 - 14f4: 09 f0 breq .+2 ; 0x14f8 - 14f6: de c0 rjmp .+444 ; 0x16b4 + 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 USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 14f8: 23 30 cpi r18, 0x03 ; 3 - 14fa: 09 f0 breq .+2 ; 0x14fe - 14fc: 80 e0 ldi r24, 0x00 ; 0 - 14fe: 80 93 e6 02 sts 0x02E6, r24 - 1502: 2c c0 rjmp .+88 ; 0x155c + 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 break; #endif #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 1504: 80 91 ea 02 lds r24, 0x02EA - 1508: 88 23 and r24, r24 - 150a: 41 f5 brne .+80 ; 0x155c + 1574: 80 91 ce 02 lds r24, 0x02CE + 1578: 88 23 and r24, r24 + 157a: 41 f5 brne .+80 ; 0x15cc { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 150c: 20 91 ec 02 lds r18, 0x02EC - 1510: 2f 70 andi r18, 0x0F ; 15 + 157c: 20 91 d0 02 lds r18, 0x02D0 + 1580: 2f 70 andi r18, 0x0F ; 15 if (EndpointIndex == ENDPOINT_CONTROLEP) - 1512: 09 f4 brne .+2 ; 0x1516 - 1514: cf c0 rjmp .+414 ; 0x16b4 + 1582: 09 f4 brne .+2 ; 0x1586 + 1584: cf c0 rjmp .+414 ; 0x1724 */ 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); - 1516: 20 93 e9 00 sts 0x00E9, r18 + 1586: 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); - 151a: 80 91 eb 00 lds r24, 0x00EB + 158a: 80 91 eb 00 lds r24, 0x00EB return; Endpoint_SelectEndpoint(EndpointIndex); if (Endpoint_IsEnabled()) - 151e: 80 ff sbrs r24, 0 - 1520: 1d c0 rjmp .+58 ; 0x155c + 158e: 80 ff sbrs r24, 0 + 1590: 1d c0 rjmp .+58 ; 0x15cc { if (USB_ControlRequest.bRequest == REQ_SetFeature) - 1522: 80 91 e9 02 lds r24, 0x02E9 - 1526: 83 30 cpi r24, 0x03 ; 3 - 1528: 21 f4 brne .+8 ; 0x1532 + 1592: 80 91 cd 02 lds r24, 0x02CD + 1596: 83 30 cpi r24, 0x03 ; 3 + 1598: 21 f4 brne .+8 ; 0x15a2 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_StallTransaction(void) { UECONX |= (1 << STALLRQ); - 152a: 80 91 eb 00 lds r24, 0x00EB - 152e: 80 62 ori r24, 0x20 ; 32 - 1530: 13 c0 rjmp .+38 ; 0x1558 + 159a: 80 91 eb 00 lds r24, 0x00EB + 159e: 80 62 ori r24, 0x20 ; 32 + 15a0: 13 c0 rjmp .+38 ; 0x15c8 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearStall(void) { UECONX |= (1 << STALLRQC); - 1532: 80 91 eb 00 lds r24, 0x00EB - 1536: 80 61 ori r24, 0x10 ; 16 - 1538: 80 93 eb 00 sts 0x00EB, r24 + 15a2: 80 91 eb 00 lds r24, 0x00EB + 15a6: 80 61 ori r24, 0x10 ; 16 + 15a8: 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)); - 153c: 81 e0 ldi r24, 0x01 ; 1 - 153e: 90 e0 ldi r25, 0x00 ; 0 - 1540: 02 c0 rjmp .+4 ; 0x1546 - 1542: 88 0f add r24, r24 - 1544: 99 1f adc r25, r25 - 1546: 2a 95 dec r18 - 1548: e2 f7 brpl .-8 ; 0x1542 - 154a: 80 93 ea 00 sts 0x00EA, r24 + 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 UERST = 0; - 154e: 10 92 ea 00 sts 0x00EA, r1 + 15be: 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); - 1552: 80 91 eb 00 lds r24, 0x00EB - 1556: 88 60 ori r24, 0x08 ; 8 - 1558: 80 93 eb 00 sts 0x00EB, r24 + 15c2: 80 91 eb 00 lds r24, 0x00EB + 15c6: 88 60 ori r24, 0x08 ; 8 + 15c8: 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); - 155c: 10 92 e9 00 sts 0x00E9, r1 + 15cc: 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); - 1560: 80 91 e8 00 lds r24, 0x00E8 - 1564: 87 7f andi r24, 0xF7 ; 247 - 1566: 86 c0 rjmp .+268 ; 0x1674 + 15d0: 80 91 e8 00 lds r24, 0x00E8 + 15d4: 87 7f andi r24, 0xF7 ; 247 + 15d6: 86 c0 rjmp .+268 ; 0x16e4 USB_Device_ClearSetFeature(); } break; case REQ_SetAddress: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 1568: 88 23 and r24, r24 - 156a: 09 f0 breq .+2 ; 0x156e - 156c: a3 c0 rjmp .+326 ; 0x16b4 + 15d8: 88 23 and r24, r24 + 15da: 09 f0 breq .+2 ; 0x15de + 15dc: a3 c0 rjmp .+326 ; 0x1724 } } static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 156e: 10 91 ea 02 lds r17, 0x02EA - 1572: 1f 77 andi r17, 0x7F ; 127 + 15de: 10 91 ce 02 lds r17, 0x02CE + 15e2: 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); - 1574: 80 91 e3 00 lds r24, 0x00E3 - 1578: 80 78 andi r24, 0x80 ; 128 - 157a: 81 2b or r24, r17 - 157c: 80 93 e3 00 sts 0x00E3, r24 - 1580: 80 91 e8 00 lds r24, 0x00E8 - 1584: 87 7f andi r24, 0xF7 ; 247 - 1586: 80 93 e8 00 sts 0x00E8, r24 + 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 USB_Device_SetDeviceAddress(DeviceAddress); Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 158a: d2 dd rcall .-1116 ; 0x1130 + 15fa: d2 dd rcall .-1116 ; 0x11a0 * \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); - 158c: 80 91 e8 00 lds r24, 0x00E8 + 15fc: 80 91 e8 00 lds r24, 0x00E8 while (!(Endpoint_IsINReady())); - 1590: 80 ff sbrs r24, 0 - 1592: fc cf rjmp .-8 ; 0x158c + 1600: 80 ff sbrs r24, 0 + 1602: fc cf rjmp .-8 ; 0x15fc 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); - 1594: 80 91 e3 00 lds r24, 0x00E3 - 1598: 80 68 ori r24, 0x80 ; 128 - 159a: 80 93 e3 00 sts 0x00E3, r24 + 1604: 80 91 e3 00 lds r24, 0x00E3 + 1608: 80 68 ori r24, 0x80 ; 128 + 160a: 80 93 e3 00 sts 0x00E3, r24 USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 159e: 11 23 and r17, r17 - 15a0: 11 f0 breq .+4 ; 0x15a6 - 15a2: 83 e0 ldi r24, 0x03 ; 3 - 15a4: 01 c0 rjmp .+2 ; 0x15a8 - 15a6: 82 e0 ldi r24, 0x02 ; 2 - 15a8: 8e bb out 0x1e, r24 ; 30 - 15aa: 84 c0 rjmp .+264 ; 0x16b4 + 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 if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_SetAddress(); break; case REQ_GetDescriptor: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 15ac: 80 58 subi r24, 0x80 ; 128 - 15ae: 82 30 cpi r24, 0x02 ; 2 - 15b0: 08 f0 brcs .+2 ; 0x15b4 - 15b2: 80 c0 rjmp .+256 ; 0x16b4 + 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 !(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)) - 15b4: 80 91 ea 02 lds r24, 0x02EA - 15b8: 90 91 eb 02 lds r25, 0x02EB - 15bc: 23 e0 ldi r18, 0x03 ; 3 - 15be: 8c 3d cpi r24, 0xDC ; 220 - 15c0: 92 07 cpc r25, r18 - 15c2: 91 f5 brne .+100 ; 0x1628 + 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 { USB_Descriptor_Header_t Header; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; - 15c4: 83 e0 ldi r24, 0x03 ; 3 - 15c6: 8c 83 std Y+4, r24 ; 0x04 + 1634: 83 e0 ldi r24, 0x03 ; 3 + 1636: 8c 83 std Y+4, r24 ; 0x04 SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 15c8: 8a e2 ldi r24, 0x2A ; 42 - 15ca: 8b 83 std Y+3, r24 ; 0x03 + 1638: 8a e2 ldi r24, 0x2A ; 42 + 163a: 8b 83 std Y+3, r24 ; 0x03 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 15cc: 5f b7 in r21, 0x3f ; 63 + 163c: 5f b7 in r21, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 15ce: f8 94 cli + 163e: f8 94 cli __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); #endif GCC_MEMORY_BARRIER(); - 15d0: de 01 movw r26, r28 - 15d2: 15 96 adiw r26, 0x05 ; 5 - 15d4: 80 e0 ldi r24, 0x00 ; 0 - 15d6: 90 e0 ldi r25, 0x00 ; 0 + 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 static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) { uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; - 15d8: 4e e0 ldi r20, 0x0E ; 14 + 1648: 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); - 15da: 61 e2 ldi r22, 0x21 ; 33 - 15dc: e4 2f mov r30, r20 - 15de: f0 e0 ldi r31, 0x00 ; 0 - 15e0: 60 93 57 00 sts 0x0057, r22 - 15e4: e4 91 lpm r30, Z+ + 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+ if (SerialCharNum & 0x01) - 15e6: 80 ff sbrs r24, 0 - 15e8: 03 c0 rjmp .+6 ; 0x15f0 + 1656: 80 ff sbrs r24, 0 + 1658: 03 c0 rjmp .+6 ; 0x1660 { SerialByte >>= 4; - 15ea: e2 95 swap r30 - 15ec: ef 70 andi r30, 0x0F ; 15 + 165a: e2 95 swap r30 + 165c: ef 70 andi r30, 0x0F ; 15 SigReadAddress++; - 15ee: 4f 5f subi r20, 0xFF ; 255 + 165e: 4f 5f subi r20, 0xFF ; 255 } SerialByte &= 0x0F; - 15f0: ef 70 andi r30, 0x0F ; 15 - 15f2: 2e 2f mov r18, r30 - 15f4: 30 e0 ldi r19, 0x00 ; 0 + 1660: ef 70 andi r30, 0x0F ; 15 + 1662: 2e 2f mov r18, r30 + 1664: 30 e0 ldi r19, 0x00 ; 0 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 15f6: ea 30 cpi r30, 0x0A ; 10 - 15f8: 18 f0 brcs .+6 ; 0x1600 - 15fa: 29 5c subi r18, 0xC9 ; 201 - 15fc: 3f 4f sbci r19, 0xFF ; 255 - 15fe: 02 c0 rjmp .+4 ; 0x1604 - 1600: 20 5d subi r18, 0xD0 ; 208 - 1602: 3f 4f sbci r19, 0xFF ; 255 - 1604: 2d 93 st X+, r18 - 1606: 3d 93 st X+, r19 - 1608: 01 96 adiw r24, 0x01 ; 1 + 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 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++) - 160a: 84 31 cpi r24, 0x14 ; 20 - 160c: 91 05 cpc r25, r1 - 160e: 31 f7 brne .-52 ; 0x15dc + 167a: 84 31 cpi r24, 0x14 ; 20 + 167c: 91 05 cpc r25, r1 + 167e: 31 f7 brne .-52 ; 0x164c static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 1610: 5f bf out 0x3f, r21 ; 63 + 1680: 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); - 1612: 80 91 e8 00 lds r24, 0x00E8 - 1616: 87 7f andi r24, 0xF7 ; 247 - 1618: 80 93 e8 00 sts 0x00E8, r24 + 1682: 80 91 e8 00 lds r24, 0x00E8 + 1686: 87 7f andi r24, 0xF7 ; 247 + 1688: 80 93 e8 00 sts 0x00E8, r24 USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); Endpoint_ClearSETUP(); Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); - 161c: ce 01 movw r24, r28 - 161e: 03 96 adiw r24, 0x03 ; 3 - 1620: 6a e2 ldi r22, 0x2A ; 42 - 1622: 70 e0 ldi r23, 0x00 ; 0 - 1624: 55 dc rcall .-1878 ; 0xed0 - 1626: 12 c0 rjmp .+36 ; 0x164c + 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 USB_Device_GetInternalSerialDescriptor(); return; } #endif if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 1628: 60 91 ec 02 lds r22, 0x02EC - 162c: ae 01 movw r20, r28 - 162e: 4f 5f subi r20, 0xFF ; 255 - 1630: 5f 4f sbci r21, 0xFF ; 255 - 1632: 21 dc rcall .-1982 ; 0xe76 - 1634: bc 01 movw r22, r24 - 1636: 00 97 sbiw r24, 0x00 ; 0 - 1638: 09 f4 brne .+2 ; 0x163c - 163a: 3c c0 rjmp .+120 ; 0x16b4 - 163c: 80 91 e8 00 lds r24, 0x00E8 - 1640: 87 7f andi r24, 0xF7 ; 247 - 1642: 80 93 e8 00 sts 0x00E8, r24 + 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 #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); - 1646: 89 81 ldd r24, Y+1 ; 0x01 - 1648: 9a 81 ldd r25, Y+2 ; 0x02 - 164a: 9c dc rcall .-1736 ; 0xf84 + 16b6: 89 81 ldd r24, Y+1 ; 0x01 + 16b8: 9a 81 ldd r25, Y+2 ; 0x02 + 16ba: 9c dc rcall .-1736 ; 0xff4 */ 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)); - 164c: 80 91 e8 00 lds r24, 0x00E8 - 1650: 8b 77 andi r24, 0x7B ; 123 - 1652: 80 93 e8 00 sts 0x00E8, r24 - 1656: 2e c0 rjmp .+92 ; 0x16b4 + 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 USB_Device_GetDescriptor(); } break; case REQ_GetConfiguration: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 1658: 80 38 cpi r24, 0x80 ; 128 - 165a: 61 f5 brne .+88 ; 0x16b4 + 16c8: 80 38 cpi r24, 0x80 ; 128 + 16ca: 61 f5 brne .+88 ; 0x1724 * \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); - 165c: 80 91 e8 00 lds r24, 0x00E8 - 1660: 87 7f andi r24, 0xF7 ; 247 - 1662: 80 93 e8 00 sts 0x00E8, r24 + 16cc: 80 91 e8 00 lds r24, 0x00E8 + 16d0: 87 7f andi r24, 0xF7 ; 247 + 16d2: 80 93 e8 00 sts 0x00E8, r24 static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); Endpoint_Write_8(USB_Device_ConfigurationNumber); - 1666: 80 91 e4 02 lds r24, 0x02E4 + 16d6: 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; - 166a: 80 93 f1 00 sts 0x00F1, r24 + 16da: 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)); - 166e: 80 91 e8 00 lds r24, 0x00E8 - 1672: 8e 77 andi r24, 0x7E ; 126 - 1674: 80 93 e8 00 sts 0x00E8, r24 + 16de: 80 91 e8 00 lds r24, 0x00E8 + 16e2: 8e 77 andi r24, 0x7E ; 126 + 16e4: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 1678: 5b dd rcall .-1354 ; 0x1130 - 167a: 1c c0 rjmp .+56 ; 0x16b4 + 16e8: 5b dd rcall .-1354 ; 0x11a0 + 16ea: 1c c0 rjmp .+56 ; 0x1724 if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_GetConfiguration(); break; case REQ_SetConfiguration: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 167c: 88 23 and r24, r24 - 167e: d1 f4 brne .+52 ; 0x16b4 + 16ec: 88 23 and r24, r24 + 16ee: d1 f4 brne .+52 ; 0x1724 } static void USB_Device_SetConfiguration(void) { #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 1680: 90 91 ea 02 lds r25, 0x02EA - 1684: 92 30 cpi r25, 0x02 ; 2 - 1686: b0 f4 brcc .+44 ; 0x16b4 + 16f0: 90 91 ce 02 lds r25, 0x02CE + 16f4: 92 30 cpi r25, 0x02 ; 2 + 16f6: b0 f4 brcc .+44 ; 0x1724 * \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); - 1688: 80 91 e8 00 lds r24, 0x00E8 - 168c: 87 7f andi r24, 0xF7 ; 247 - 168e: 80 93 e8 00 sts 0x00E8, r24 + 16f8: 80 91 e8 00 lds r24, 0x00E8 + 16fc: 87 7f andi r24, 0xF7 ; 247 + 16fe: 80 93 e8 00 sts 0x00E8, r24 #endif #endif Endpoint_ClearSETUP(); USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 1692: 90 93 e4 02 sts 0x02E4, r25 + 1702: 90 93 c8 02 sts 0x02C8, r25 Endpoint_ClearStatusStage(); - 1696: 4c dd rcall .-1384 ; 0x1130 + 1706: 4c dd rcall .-1384 ; 0x11a0 if (USB_Device_ConfigurationNumber) - 1698: 80 91 e4 02 lds r24, 0x02E4 - 169c: 88 23 and r24, r24 - 169e: 21 f4 brne .+8 ; 0x16a8 + 1708: 80 91 c8 02 lds r24, 0x02C8 + 170c: 88 23 and r24, r24 + 170e: 21 f4 brne .+8 ; 0x1718 } 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)); - 16a0: 80 91 e3 00 lds r24, 0x00E3 + 1710: 80 91 e3 00 lds r24, 0x00E3 USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - 16a4: 87 ff sbrs r24, 7 - 16a6: 02 c0 rjmp .+4 ; 0x16ac - 16a8: 84 e0 ldi r24, 0x04 ; 4 - 16aa: 01 c0 rjmp .+2 ; 0x16ae - 16ac: 81 e0 ldi r24, 0x01 ; 1 - 16ae: 8e bb out 0x1e, r24 ; 30 + 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 EVENT_USB_Device_ConfigurationChanged(); - 16b0: 0e 94 4a 03 call 0x694 ; 0x694 + 1720: 0e 94 4a 03 call 0x694 ; 0x694 * \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); - 16b4: 80 91 e8 00 lds r24, 0x00E8 + 1724: 80 91 e8 00 lds r24, 0x00E8 default: break; } } if (Endpoint_IsSETUPReceived()) - 16b8: 83 ff sbrs r24, 3 - 16ba: 0a c0 rjmp .+20 ; 0x16d0 + 1728: 83 ff sbrs r24, 3 + 172a: 0a c0 rjmp .+20 ; 0x1740 * \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); - 16bc: 80 91 e8 00 lds r24, 0x00E8 - 16c0: 87 7f andi r24, 0xF7 ; 247 - 16c2: 80 93 e8 00 sts 0x00E8, r24 + 172c: 80 91 e8 00 lds r24, 0x00E8 + 1730: 87 7f andi r24, 0xF7 ; 247 + 1732: 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); - 16c6: 80 91 eb 00 lds r24, 0x00EB - 16ca: 80 62 ori r24, 0x20 ; 32 - 16cc: 80 93 eb 00 sts 0x00EB, r24 + 1736: 80 91 eb 00 lds r24, 0x00EB + 173a: 80 62 ori r24, 0x20 ; 32 + 173c: 80 93 eb 00 sts 0x00EB, r24 { Endpoint_ClearSETUP(); Endpoint_StallTransaction(); } } - 16d0: ac 96 adiw r28, 0x2c ; 44 - 16d2: 0f b6 in r0, 0x3f ; 63 - 16d4: f8 94 cli - 16d6: de bf out 0x3e, r29 ; 62 - 16d8: 0f be out 0x3f, r0 ; 63 - 16da: cd bf out 0x3d, r28 ; 61 - 16dc: cf 91 pop r28 - 16de: df 91 pop r29 - 16e0: 1f 91 pop r17 - 16e2: 08 95 ret - -000016e4 : + 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 : #include "Events.h" void USB_Event_Stub(void) { } - 16e4: 08 95 ret + 1754: 08 95 ret -000016e6 : +00001756 : #if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) volatile uint8_t USB_DeviceState; #endif void USB_USBTask(void) { - 16e6: 1f 93 push r17 + 1756: 1f 93 push r17 } #if defined(USB_CAN_BE_DEVICE) static void USB_DeviceTask(void) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 16e8: 8e b3 in r24, 0x1e ; 30 - 16ea: 88 23 and r24, r24 - 16ec: a9 f0 breq .+42 ; 0x1718 + 1758: 8e b3 in r24, 0x1e ; 30 + 175a: 88 23 and r24, r24 + 175c: a9 f0 breq .+42 ; 0x1788 */ 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()); - 16ee: 80 91 e9 00 lds r24, 0x00E9 - 16f2: 8f 70 andi r24, 0x0F ; 15 + 175e: 80 91 e9 00 lds r24, 0x00E9 + 1762: 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; - 16f4: 90 91 ec 00 lds r25, 0x00EC - 16f8: 90 ff sbrs r25, 0 - 16fa: 02 c0 rjmp .+4 ; 0x1700 - 16fc: 10 e8 ldi r17, 0x80 ; 128 - 16fe: 01 c0 rjmp .+2 ; 0x1702 - 1700: 10 e0 ldi r17, 0x00 ; 0 + 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 */ 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()); - 1702: 18 2b or r17, r24 + 1772: 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); - 1704: 10 92 e9 00 sts 0x00E9, r1 + 1774: 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); - 1708: 80 91 e8 00 lds r24, 0x00E8 + 1778: 80 91 e8 00 lds r24, 0x00E8 uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); if (Endpoint_IsSETUPReceived()) - 170c: 83 ff sbrs r24, 3 - 170e: 01 c0 rjmp .+2 ; 0x1712 + 177c: 83 ff sbrs r24, 3 + 177e: 01 c0 rjmp .+2 ; 0x1782 USB_Device_ProcessControlRequest(); - 1710: 87 de rcall .-754 ; 0x1420 + 1780: 87 de rcall .-754 ; 0x1490 */ 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); - 1712: 1f 70 andi r17, 0x0F ; 15 - 1714: 10 93 e9 00 sts 0x00E9, r17 + 1782: 1f 70 andi r17, 0x0F ; 15 + 1784: 10 93 e9 00 sts 0x00E9, r17 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 1718: 1f 91 pop r17 - 171a: 08 95 ret + 1788: 1f 91 pop r17 + 178a: 08 95 ret -0000171c : +0000178c : #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) { - 171c: cf 93 push r28 - 171e: df 93 push r29 - 1720: ec 01 movw r28, r24 + 178c: cf 93 push r28 + 178e: df 93 push r29 + 1790: 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); - 1722: 80 91 e8 00 lds r24, 0x00E8 + 1792: 80 91 e8 00 lds r24, 0x00E8 if (!(Endpoint_IsSETUPReceived())) - 1726: 83 ff sbrs r24, 3 - 1728: a3 c0 rjmp .+326 ; 0x1870 + 1796: 83 ff sbrs r24, 3 + 1798: a3 c0 rjmp .+326 ; 0x18e0 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 172a: 88 81 ld r24, Y - 172c: 90 e0 ldi r25, 0x00 ; 0 - 172e: 20 91 ec 02 lds r18, 0x02EC - 1732: 30 91 ed 02 lds r19, 0x02ED - 1736: 28 17 cp r18, r24 - 1738: 39 07 cpc r19, r25 - 173a: 09 f0 breq .+2 ; 0x173e - 173c: 99 c0 rjmp .+306 ; 0x1870 + 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 return; switch (USB_ControlRequest.bRequest) - 173e: 80 91 e9 02 lds r24, 0x02E9 - 1742: 81 32 cpi r24, 0x21 ; 33 - 1744: 69 f0 breq .+26 ; 0x1760 - 1746: 82 32 cpi r24, 0x22 ; 34 - 1748: 20 f4 brcc .+8 ; 0x1752 - 174a: 80 32 cpi r24, 0x20 ; 32 - 174c: 09 f0 breq .+2 ; 0x1750 - 174e: 90 c0 rjmp .+288 ; 0x1870 - 1750: 3c c0 rjmp .+120 ; 0x17ca - 1752: 82 32 cpi r24, 0x22 ; 34 - 1754: 09 f4 brne .+2 ; 0x1758 - 1756: 6b c0 rjmp .+214 ; 0x182e - 1758: 83 32 cpi r24, 0x23 ; 35 - 175a: 09 f0 breq .+2 ; 0x175e - 175c: 89 c0 rjmp .+274 ; 0x1870 - 175e: 7a c0 rjmp .+244 ; 0x1854 + 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 { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 1760: 80 91 e8 02 lds r24, 0x02E8 - 1764: 81 3a cpi r24, 0xA1 ; 161 - 1766: 09 f0 breq .+2 ; 0x176a - 1768: 83 c0 rjmp .+262 ; 0x1870 + 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 * \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); - 176a: 80 91 e8 00 lds r24, 0x00E8 - 176e: 87 7f andi r24, 0xF7 ; 247 - 1770: 80 93 e8 00 sts 0x00E8, r24 + 17da: 80 91 e8 00 lds r24, 0x00E8 + 17de: 87 7f andi r24, 0xF7 ; 247 + 17e0: 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); - 1774: 80 91 e8 00 lds r24, 0x00E8 + 17e4: 80 91 e8 00 lds r24, 0x00E8 { Endpoint_ClearSETUP(); while (!(Endpoint_IsINReady())); - 1778: 80 ff sbrs r24, 0 - 177a: fc cf rjmp .-8 ; 0x1774 + 17e8: 80 ff sbrs r24, 0 + 17ea: fc cf rjmp .-8 ; 0x17e4 Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 177c: 8c 89 ldd r24, Y+20 ; 0x14 - 177e: 9d 89 ldd r25, Y+21 ; 0x15 - 1780: ae 89 ldd r26, Y+22 ; 0x16 - 1782: bf 89 ldd r27, Y+23 ; 0x17 + 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 * \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); - 1784: 80 93 f1 00 sts 0x00F1, r24 + 17f4: 80 93 f1 00 sts 0x00F1, r24 UEDATX = (Data >> 8); - 1788: 29 2f mov r18, r25 - 178a: 3a 2f mov r19, r26 - 178c: 4b 2f mov r20, r27 - 178e: 55 27 eor r21, r21 - 1790: 20 93 f1 00 sts 0x00F1, r18 + 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 UEDATX = (Data >> 16); - 1794: 9d 01 movw r18, r26 - 1796: 44 27 eor r20, r20 - 1798: 55 27 eor r21, r21 - 179a: 20 93 f1 00 sts 0x00F1, r18 + 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 UEDATX = (Data >> 24); - 179e: 8b 2f mov r24, r27 - 17a0: 99 27 eor r25, r25 - 17a2: aa 27 eor r26, r26 - 17a4: bb 27 eor r27, r27 - 17a6: 80 93 f1 00 sts 0x00F1, r24 + 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 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 17aa: 88 8d ldd r24, Y+24 ; 0x18 + 181a: 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; - 17ac: 80 93 f1 00 sts 0x00F1, r24 + 181c: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 17b0: 89 8d ldd r24, Y+25 ; 0x19 - 17b2: 80 93 f1 00 sts 0x00F1, r24 + 1820: 89 8d ldd r24, Y+25 ; 0x19 + 1822: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 17b6: 8a 8d ldd r24, Y+26 ; 0x1a - 17b8: 80 93 f1 00 sts 0x00F1, r24 + 1826: 8a 8d ldd r24, Y+26 ; 0x1a + 1828: 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)); - 17bc: 80 91 e8 00 lds r24, 0x00E8 - 17c0: 8e 77 andi r24, 0x7E ; 126 - 17c2: 80 93 e8 00 sts 0x00E8, r24 + 182c: 80 91 e8 00 lds r24, 0x00E8 + 1830: 8e 77 andi r24, 0x7E ; 126 + 1832: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 17c6: b4 dc rcall .-1688 ; 0x1130 - 17c8: 53 c0 rjmp .+166 ; 0x1870 + 1836: b4 dc rcall .-1688 ; 0x11a0 + 1838: 53 c0 rjmp .+166 ; 0x18e0 } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 17ca: 80 91 e8 02 lds r24, 0x02E8 - 17ce: 81 32 cpi r24, 0x21 ; 33 - 17d0: 09 f0 breq .+2 ; 0x17d4 - 17d2: 4e c0 rjmp .+156 ; 0x1870 + 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 * \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); - 17d4: 80 91 e8 00 lds r24, 0x00E8 - 17d8: 87 7f andi r24, 0xF7 ; 247 - 17da: 80 93 e8 00 sts 0x00E8, r24 + 1844: 80 91 e8 00 lds r24, 0x00E8 + 1848: 87 7f andi r24, 0xF7 ; 247 + 184a: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 17de: 04 c0 rjmp .+8 ; 0x17e8 + 184e: 04 c0 rjmp .+8 ; 0x1858 { if (USB_DeviceState == DEVICE_STATE_Unattached) - 17e0: 8e b3 in r24, 0x1e ; 30 - 17e2: 88 23 and r24, r24 - 17e4: 09 f4 brne .+2 ; 0x17e8 - 17e6: 44 c0 rjmp .+136 ; 0x1870 + 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 * \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); - 17e8: 80 91 e8 00 lds r24, 0x00E8 + 1858: 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())) - 17ec: 82 ff sbrs r24, 2 - 17ee: f8 cf rjmp .-16 ; 0x17e0 + 185c: 82 ff sbrs r24, 2 + 185e: f8 cf rjmp .-16 ; 0x1850 { uint32_t Value; uint8_t Bytes[4]; } Data; Data.Bytes[0] = UEDATX; - 17f0: 30 91 f1 00 lds r19, 0x00F1 + 1860: 30 91 f1 00 lds r19, 0x00F1 Data.Bytes[1] = UEDATX; - 17f4: 20 91 f1 00 lds r18, 0x00F1 + 1864: 20 91 f1 00 lds r18, 0x00F1 Data.Bytes[2] = UEDATX; - 17f8: 90 91 f1 00 lds r25, 0x00F1 + 1868: 90 91 f1 00 lds r25, 0x00F1 Data.Bytes[3] = UEDATX; - 17fc: 80 91 f1 00 lds r24, 0x00F1 + 186c: 80 91 f1 00 lds r24, 0x00F1 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 1800: 3c 8b std Y+20, r19 ; 0x14 - 1802: 2d 8b std Y+21, r18 ; 0x15 - 1804: 9e 8b std Y+22, r25 ; 0x16 - 1806: 8f 8b std Y+23, r24 ; 0x17 + 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 * \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; - 1808: 80 91 f1 00 lds r24, 0x00F1 + 1878: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 180c: 88 8f std Y+24, r24 ; 0x18 - 180e: 80 91 f1 00 lds r24, 0x00F1 + 187c: 88 8f std Y+24, r24 ; 0x18 + 187e: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 1812: 89 8f std Y+25, r24 ; 0x19 - 1814: 80 91 f1 00 lds r24, 0x00F1 + 1882: 89 8f std Y+25, r24 ; 0x19 + 1884: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 1818: 8a 8f std Y+26, r24 ; 0x1a + 1888: 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)); - 181a: 80 91 e8 00 lds r24, 0x00E8 - 181e: 8b 77 andi r24, 0x7B ; 123 - 1820: 80 93 e8 00 sts 0x00E8, r24 + 188a: 80 91 e8 00 lds r24, 0x00E8 + 188e: 8b 77 andi r24, 0x7B ; 123 + 1890: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); - 1824: 85 dc rcall .-1782 ; 0x1130 + 1894: 85 dc rcall .-1782 ; 0x11a0 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 1826: ce 01 movw r24, r28 - 1828: 0e 94 7c 03 call 0x6f8 ; 0x6f8 - 182c: 21 c0 rjmp .+66 ; 0x1870 + 1896: ce 01 movw r24, r28 + 1898: 0e 94 7c 03 call 0x6f8 ; 0x6f8 + 189c: 21 c0 rjmp .+66 ; 0x18e0 } break; case CDC_REQ_SetControlLineState: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 182e: 80 91 e8 02 lds r24, 0x02E8 - 1832: 81 32 cpi r24, 0x21 ; 33 - 1834: e9 f4 brne .+58 ; 0x1870 + 189e: 80 91 cc 02 lds r24, 0x02CC + 18a2: 81 32 cpi r24, 0x21 ; 33 + 18a4: e9 f4 brne .+58 ; 0x18e0 * \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); - 1836: 80 91 e8 00 lds r24, 0x00E8 - 183a: 87 7f andi r24, 0xF7 ; 247 - 183c: 80 93 e8 00 sts 0x00E8, r24 + 18a6: 80 91 e8 00 lds r24, 0x00E8 + 18aa: 87 7f andi r24, 0xF7 ; 247 + 18ac: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 1840: 77 dc rcall .-1810 ; 0x1130 + 18b0: 77 dc rcall .-1810 ; 0x11a0 CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 1842: 80 91 ea 02 lds r24, 0x02EA - 1846: 90 91 eb 02 lds r25, 0x02EB - 184a: 99 8b std Y+17, r25 ; 0x11 - 184c: 88 8b std Y+16, r24 ; 0x10 + 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 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 184e: ce 01 movw r24, r28 - 1850: d4 d0 rcall .+424 ; 0x19fa - 1852: 0e c0 rjmp .+28 ; 0x1870 + 18be: ce 01 movw r24, r28 + 18c0: d4 d0 rcall .+424 ; 0x1a6a + 18c2: 0e c0 rjmp .+28 ; 0x18e0 } break; case CDC_REQ_SendBreak: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 1854: 80 91 e8 02 lds r24, 0x02E8 - 1858: 81 32 cpi r24, 0x21 ; 33 - 185a: 51 f4 brne .+20 ; 0x1870 - 185c: 80 91 e8 00 lds r24, 0x00E8 - 1860: 87 7f andi r24, 0xF7 ; 247 - 1862: 80 93 e8 00 sts 0x00E8, r24 + 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 { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 1866: 64 dc rcall .-1848 ; 0x1130 + 18d6: 64 dc rcall .-1848 ; 0x11a0 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 1868: ce 01 movw r24, r28 - 186a: 60 91 ea 02 lds r22, 0x02EA - 186e: c5 d0 rcall .+394 ; 0x19fa + 18d8: ce 01 movw r24, r28 + 18da: 60 91 ce 02 lds r22, 0x02CE + 18de: c5 d0 rcall .+394 ; 0x1a6a } break; } } - 1870: df 91 pop r29 - 1872: cf 91 pop r28 - 1874: 08 95 ret + 18e0: df 91 pop r29 + 18e2: cf 91 pop r28 + 18e4: 08 95 ret -00001876 : +000018e6 : bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 1876: cf 93 push r28 - 1878: df 93 push r29 - 187a: ec 01 movw r28, r24 + 18e6: cf 93 push r28 + 18e8: df 93 push r29 + 18ea: ec 01 movw r28, r24 memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State)); - 187c: 40 96 adiw r24, 0x10 ; 16 - 187e: fc 01 movw r30, r24 - 1880: 8b e0 ldi r24, 0x0B ; 11 - 1882: df 01 movw r26, r30 - 1884: 1d 92 st X+, r1 - 1886: 8a 95 dec r24 - 1888: e9 f7 brne .-6 ; 0x1884 + 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 CDCInterfaceInfo->Config.DataINEndpoint.Type = EP_TYPE_BULK; - 188a: 82 e0 ldi r24, 0x02 ; 2 - 188c: 8c 83 std Y+4, r24 ; 0x04 + 18fa: 82 e0 ldi r24, 0x02 ; 2 + 18fc: 8c 83 std Y+4, r24 ; 0x04 CDCInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK; - 188e: 89 87 std Y+9, r24 ; 0x09 + 18fe: 89 87 std Y+9, r24 ; 0x09 CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; - 1890: 83 e0 ldi r24, 0x03 ; 3 - 1892: 8e 87 std Y+14, r24 ; 0x0e + 1900: 83 e0 ldi r24, 0x03 ; 3 + 1902: 8e 87 std Y+14, r24 ; 0x0e if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) - 1894: ce 01 movw r24, r28 - 1896: 01 96 adiw r24, 0x01 ; 1 - 1898: 61 e0 ldi r22, 0x01 ; 1 - 189a: 06 dc rcall .-2036 ; 0x10a8 - 189c: 88 23 and r24, r24 - 189e: 59 f0 breq .+22 ; 0x18b6 + 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 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) - 18a0: ce 01 movw r24, r28 - 18a2: 06 96 adiw r24, 0x06 ; 6 - 18a4: 61 e0 ldi r22, 0x01 ; 1 - 18a6: 00 dc rcall .-2048 ; 0x10a8 - 18a8: 88 23 and r24, r24 - 18aa: 29 f0 breq .+10 ; 0x18b6 + 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 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) - 18ac: ce 01 movw r24, r28 - 18ae: 0b 96 adiw r24, 0x0b ; 11 - 18b0: 61 e0 ldi r22, 0x01 ; 1 - 18b2: fa db rcall .-2060 ; 0x10a8 - 18b4: 01 c0 rjmp .+2 ; 0x18b8 + 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 if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) return false; - 18b6: 80 e0 ldi r24, 0x00 ; 0 + 1926: 80 e0 ldi r24, 0x00 ; 0 if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) return false; return true; } - 18b8: df 91 pop r29 - 18ba: cf 91 pop r28 - 18bc: 08 95 ret + 1928: df 91 pop r29 + 192a: cf 91 pop r28 + 192c: 08 95 ret -000018be : +0000192e : return Endpoint_Write_Stream_LE(Buffer, Length, NULL); } uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { - 18be: df 93 push r29 - 18c0: cf 93 push r28 - 18c2: 0f 92 push r0 - 18c4: cd b7 in r28, 0x3d ; 61 - 18c6: de b7 in r29, 0x3e ; 62 - 18c8: fc 01 movw r30, r24 + 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 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 18ca: 8e b3 in r24, 0x1e ; 30 - 18cc: 84 30 cpi r24, 0x04 ; 4 - 18ce: f9 f4 brne .+62 ; 0x190e - 18d0: 24 89 ldd r18, Z+20 ; 0x14 - 18d2: 35 89 ldd r19, Z+21 ; 0x15 - 18d4: 46 89 ldd r20, Z+22 ; 0x16 - 18d6: 57 89 ldd r21, Z+23 ; 0x17 - 18d8: 21 15 cp r18, r1 - 18da: 31 05 cpc r19, r1 - 18dc: 41 05 cpc r20, r1 - 18de: 51 05 cpc r21, r1 - 18e0: b1 f0 breq .+44 ; 0x190e + 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 */ 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); - 18e2: 81 81 ldd r24, Z+1 ; 0x01 - 18e4: 8f 70 andi r24, 0x0F ; 15 - 18e6: 80 93 e9 00 sts 0x00E9, r24 + 1952: 81 81 ldd r24, Z+1 ; 0x01 + 1954: 8f 70 andi r24, 0x0F ; 15 + 1956: 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); - 18ea: 80 91 e8 00 lds r24, 0x00E8 + 195a: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWSTREAM_DeviceDisconnected; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_IsReadWriteAllowed())) - 18ee: 85 fd sbrc r24, 5 - 18f0: 0a c0 rjmp .+20 ; 0x1906 + 195e: 85 fd sbrc r24, 5 + 1960: 0a c0 rjmp .+20 ; 0x1976 */ 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)); - 18f2: 80 91 e8 00 lds r24, 0x00E8 - 18f6: 8e 77 andi r24, 0x7E ; 126 - 18f8: 80 93 e8 00 sts 0x00E8, r24 + 1962: 80 91 e8 00 lds r24, 0x00E8 + 1966: 8e 77 andi r24, 0x7E ; 126 + 1968: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearIN(); uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 18fc: 69 83 std Y+1, r22 ; 0x01 - 18fe: 37 dc rcall .-1938 ; 0x116e - 1900: 69 81 ldd r22, Y+1 ; 0x01 - 1902: 88 23 and r24, r24 - 1904: 29 f4 brne .+10 ; 0x1910 + 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 * \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; - 1906: 60 93 f1 00 sts 0x00F1, r22 + 1976: 60 93 f1 00 sts 0x00F1, r22 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; - 190a: 80 e0 ldi r24, 0x00 ; 0 - 190c: 01 c0 rjmp .+2 ; 0x1910 + 197a: 80 e0 ldi r24, 0x00 ; 0 + 197c: 01 c0 rjmp .+2 ; 0x1980 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; - 190e: 82 e0 ldi r24, 0x02 ; 2 + 197e: 82 e0 ldi r24, 0x02 ; 2 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; } - 1910: 0f 90 pop r0 - 1912: cf 91 pop r28 - 1914: df 91 pop r29 - 1916: 08 95 ret + 1980: 0f 90 pop r0 + 1982: cf 91 pop r28 + 1984: df 91 pop r29 + 1986: 08 95 ret -00001918 : +00001988 : uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 1918: fc 01 movw r30, r24 + 1988: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 191a: 8e b3 in r24, 0x1e ; 30 - 191c: 84 30 cpi r24, 0x04 ; 4 - 191e: 19 f5 brne .+70 ; 0x1966 - 1920: 24 89 ldd r18, Z+20 ; 0x14 - 1922: 35 89 ldd r19, Z+21 ; 0x15 - 1924: 46 89 ldd r20, Z+22 ; 0x16 - 1926: 57 89 ldd r21, Z+23 ; 0x17 - 1928: 21 15 cp r18, r1 - 192a: 31 05 cpc r19, r1 - 192c: 41 05 cpc r20, r1 - 192e: 51 05 cpc r21, r1 - 1930: d1 f0 breq .+52 ; 0x1966 + 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 */ 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); - 1932: 81 81 ldd r24, Z+1 ; 0x01 - 1934: 8f 70 andi r24, 0x0F ; 15 - 1936: 80 93 e9 00 sts 0x00E9, r24 + 19a2: 81 81 ldd r24, Z+1 ; 0x01 + 19a4: 8f 70 andi r24, 0x0F ; 15 + 19a6: 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; - 193a: 80 91 f2 00 lds r24, 0x00F2 + 19aa: 80 91 f2 00 lds r24, 0x00F2 uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_BytesInEndpoint())) - 193e: 88 23 and r24, r24 - 1940: a1 f0 breq .+40 ; 0x196a + 19ae: 88 23 and r24, r24 + 19b0: a1 f0 breq .+40 ; 0x19da * 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); - 1942: 90 91 e8 00 lds r25, 0x00E8 + 19b2: 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)); - 1946: 80 91 e8 00 lds r24, 0x00E8 - 194a: 8e 77 andi r24, 0x7E ; 126 - 194c: 80 93 e8 00 sts 0x00E8, r24 + 19b6: 80 91 e8 00 lds r24, 0x00E8 + 19ba: 8e 77 andi r24, 0x7E ; 126 + 19bc: 80 93 e8 00 sts 0x00E8, r24 bool BankFull = !(Endpoint_IsReadWriteAllowed()); Endpoint_ClearIN(); if (BankFull) - 1950: 95 fd sbrc r25, 5 - 1952: 0d c0 rjmp .+26 ; 0x196e + 19c0: 95 fd sbrc r25, 5 + 19c2: 0d c0 rjmp .+26 ; 0x19de { if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 1954: 0c dc rcall .-2024 ; 0x116e - 1956: 88 23 and r24, r24 - 1958: 59 f4 brne .+22 ; 0x1970 - 195a: 90 91 e8 00 lds r25, 0x00E8 - 195e: 9e 77 andi r25, 0x7E ; 126 - 1960: 90 93 e8 00 sts 0x00E8, r25 - 1964: 08 95 ret + 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 } 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; - 1966: 82 e0 ldi r24, 0x02 ; 2 - 1968: 08 95 ret + 19d6: 82 e0 ldi r24, 0x02 ; 2 + 19d8: 08 95 ret uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_BytesInEndpoint())) return ENDPOINT_READYWAIT_NoError; - 196a: 80 e0 ldi r24, 0x00 ; 0 - 196c: 08 95 ret + 19da: 80 e0 ldi r24, 0x00 ; 0 + 19dc: 08 95 ret return ErrorCode; Endpoint_ClearIN(); } return ENDPOINT_READYWAIT_NoError; - 196e: 80 e0 ldi r24, 0x00 ; 0 + 19de: 80 e0 ldi r24, 0x00 ; 0 } - 1970: 08 95 ret + 19e0: 08 95 ret -00001972 : +000019e2 : return true; } void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 1972: 2e b3 in r18, 0x1e ; 30 - 1974: 24 30 cpi r18, 0x04 ; 4 - 1976: 99 f4 brne .+38 ; 0x199e - 1978: fc 01 movw r30, r24 - 197a: 24 89 ldd r18, Z+20 ; 0x14 - 197c: 35 89 ldd r19, Z+21 ; 0x15 - 197e: 46 89 ldd r20, Z+22 ; 0x16 - 1980: 57 89 ldd r21, Z+23 ; 0x17 - 1982: 21 15 cp r18, r1 - 1984: 31 05 cpc r19, r1 - 1986: 41 05 cpc r20, r1 - 1988: 51 05 cpc r21, r1 - 198a: 49 f0 breq .+18 ; 0x199e + 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 */ 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); - 198c: 21 81 ldd r18, Z+1 ; 0x01 - 198e: 2f 70 andi r18, 0x0F ; 15 - 1990: 20 93 e9 00 sts 0x00E9, r18 + 19fc: 21 81 ldd r18, Z+1 ; 0x01 + 19fe: 2f 70 andi r18, 0x0F ; 15 + 1a00: 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); - 1994: 20 91 e8 00 lds r18, 0x00E8 + 1a04: 20 91 e8 00 lds r18, 0x00E8 return; #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (Endpoint_IsINReady()) - 1998: 20 ff sbrs r18, 0 - 199a: 01 c0 rjmp .+2 ; 0x199e + 1a08: 20 ff sbrs r18, 0 + 1a0a: 01 c0 rjmp .+2 ; 0x1a0e CDC_Device_Flush(CDCInterfaceInfo); - 199c: bd cf rjmp .-134 ; 0x1918 - 199e: 08 95 ret + 1a0c: bd cf rjmp .-134 ; 0x1988 + 1a0e: 08 95 ret -000019a0 : +00001a10 : return 0; } } int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 19a0: fc 01 movw r30, r24 + 1a10: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 19a2: 8e b3 in r24, 0x1e ; 30 - 19a4: 84 30 cpi r24, 0x04 ; 4 - 19a6: 29 f5 brne .+74 ; 0x19f2 - 19a8: 24 89 ldd r18, Z+20 ; 0x14 - 19aa: 35 89 ldd r19, Z+21 ; 0x15 - 19ac: 46 89 ldd r20, Z+22 ; 0x16 - 19ae: 57 89 ldd r21, Z+23 ; 0x17 - 19b0: 21 15 cp r18, r1 - 19b2: 31 05 cpc r19, r1 - 19b4: 41 05 cpc r20, r1 - 19b6: 51 05 cpc r21, r1 - 19b8: e1 f0 breq .+56 ; 0x19f2 + 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 */ 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); - 19ba: 86 81 ldd r24, Z+6 ; 0x06 - 19bc: 8f 70 andi r24, 0x0F ; 15 - 19be: 80 93 e9 00 sts 0x00E9, r24 + 1a2a: 86 81 ldd r24, Z+6 ; 0x06 + 1a2c: 8f 70 andi r24, 0x0F ; 15 + 1a2e: 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); - 19c2: 80 91 e8 00 lds r24, 0x00E8 + 1a32: 80 91 e8 00 lds r24, 0x00E8 int16_t ReceivedByte = -1; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); if (Endpoint_IsOUTReceived()) - 19c6: 82 ff sbrs r24, 2 - 19c8: 14 c0 rjmp .+40 ; 0x19f2 + 1a36: 82 ff sbrs r24, 2 + 1a38: 14 c0 rjmp .+40 ; 0x1a62 #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; - 19ca: 80 91 f2 00 lds r24, 0x00F2 + 1a3a: 80 91 f2 00 lds r24, 0x00F2 { if (Endpoint_BytesInEndpoint()) - 19ce: 88 23 and r24, r24 - 19d0: 21 f0 breq .+8 ; 0x19da + 1a3e: 88 23 and r24, r24 + 1a40: 21 f0 breq .+8 ; 0x1a4a * \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; - 19d2: 20 91 f1 00 lds r18, 0x00F1 + 1a42: 20 91 f1 00 lds r18, 0x00F1 ReceivedByte = Endpoint_Read_8(); - 19d6: 30 e0 ldi r19, 0x00 ; 0 - 19d8: 02 c0 rjmp .+4 ; 0x19de + 1a46: 30 e0 ldi r19, 0x00 ; 0 + 1a48: 02 c0 rjmp .+4 ; 0x1a4e 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; - 19da: 2f ef ldi r18, 0xFF ; 255 - 19dc: 3f ef ldi r19, 0xFF ; 255 + 1a4a: 2f ef ldi r18, 0xFF ; 255 + 1a4c: 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; - 19de: 80 91 f2 00 lds r24, 0x00F2 + 1a4e: 80 91 f2 00 lds r24, 0x00F2 if (Endpoint_IsOUTReceived()) { if (Endpoint_BytesInEndpoint()) ReceivedByte = Endpoint_Read_8(); if (!(Endpoint_BytesInEndpoint())) - 19e2: 88 23 and r24, r24 - 19e4: 41 f4 brne .+16 ; 0x19f6 + 1a52: 88 23 and r24, r24 + 1a54: 41 f4 brne .+16 ; 0x1a66 */ 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)); - 19e6: 80 91 e8 00 lds r24, 0x00E8 - 19ea: 8b 77 andi r24, 0x7B ; 123 - 19ec: 80 93 e8 00 sts 0x00E8, r24 - 19f0: 02 c0 rjmp .+4 ; 0x19f6 + 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 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; - 19f2: 2f ef ldi r18, 0xFF ; 255 - 19f4: 3f ef ldi r19, 0xFF ; 255 + 1a62: 2f ef ldi r18, 0xFF ; 255 + 1a64: 3f ef ldi r19, 0xFF ; 255 if (!(Endpoint_BytesInEndpoint())) Endpoint_ClearOUT(); } return ReceivedByte; } - 19f6: c9 01 movw r24, r18 - 19f8: 08 95 ret + 1a66: c9 01 movw r24, r18 + 1a68: 08 95 ret -000019fa : +00001a6a : #endif void CDC_Device_Event_Stub(void) { } - 19fa: 08 95 ret - -000019fc <__subsf3>: - 19fc: 50 58 subi r21, 0x80 ; 128 - -000019fe <__addsf3>: - 19fe: bb 27 eor r27, r27 - 1a00: aa 27 eor r26, r26 - 1a02: 0e d0 rcall .+28 ; 0x1a20 <__addsf3x> - 1a04: 70 c1 rjmp .+736 ; 0x1ce6 <__fp_round> - 1a06: 61 d1 rcall .+706 ; 0x1cca <__fp_pscA> - 1a08: 30 f0 brcs .+12 ; 0x1a16 <__addsf3+0x18> - 1a0a: 66 d1 rcall .+716 ; 0x1cd8 <__fp_pscB> - 1a0c: 20 f0 brcs .+8 ; 0x1a16 <__addsf3+0x18> - 1a0e: 31 f4 brne .+12 ; 0x1a1c <__addsf3+0x1e> - 1a10: 9f 3f cpi r25, 0xFF ; 255 - 1a12: 11 f4 brne .+4 ; 0x1a18 <__addsf3+0x1a> - 1a14: 1e f4 brtc .+6 ; 0x1a1c <__addsf3+0x1e> - 1a16: 56 c1 rjmp .+684 ; 0x1cc4 <__fp_nan> - 1a18: 0e f4 brtc .+2 ; 0x1a1c <__addsf3+0x1e> - 1a1a: e0 95 com r30 - 1a1c: e7 fb bst r30, 7 - 1a1e: 4c c1 rjmp .+664 ; 0x1cb8 <__fp_inf> - -00001a20 <__addsf3x>: - 1a20: e9 2f mov r30, r25 - 1a22: 72 d1 rcall .+740 ; 0x1d08 <__fp_split3> - 1a24: 80 f3 brcs .-32 ; 0x1a06 <__addsf3+0x8> - 1a26: ba 17 cp r27, r26 - 1a28: 62 07 cpc r22, r18 - 1a2a: 73 07 cpc r23, r19 - 1a2c: 84 07 cpc r24, r20 - 1a2e: 95 07 cpc r25, r21 - 1a30: 18 f0 brcs .+6 ; 0x1a38 <__addsf3x+0x18> - 1a32: 71 f4 brne .+28 ; 0x1a50 <__addsf3x+0x30> - 1a34: 9e f5 brtc .+102 ; 0x1a9c <__addsf3x+0x7c> - 1a36: 8a c1 rjmp .+788 ; 0x1d4c <__fp_zero> - 1a38: 0e f4 brtc .+2 ; 0x1a3c <__addsf3x+0x1c> - 1a3a: e0 95 com r30 - 1a3c: 0b 2e mov r0, r27 - 1a3e: ba 2f mov r27, r26 - 1a40: a0 2d mov r26, r0 - 1a42: 0b 01 movw r0, r22 - 1a44: b9 01 movw r22, r18 - 1a46: 90 01 movw r18, r0 - 1a48: 0c 01 movw r0, r24 - 1a4a: ca 01 movw r24, r20 - 1a4c: a0 01 movw r20, r0 - 1a4e: 11 24 eor r1, r1 - 1a50: ff 27 eor r31, r31 - 1a52: 59 1b sub r21, r25 - 1a54: 99 f0 breq .+38 ; 0x1a7c <__addsf3x+0x5c> - 1a56: 59 3f cpi r21, 0xF9 ; 249 - 1a58: 50 f4 brcc .+20 ; 0x1a6e <__addsf3x+0x4e> - 1a5a: 50 3e cpi r21, 0xE0 ; 224 - 1a5c: 68 f1 brcs .+90 ; 0x1ab8 <__addsf3x+0x98> - 1a5e: 1a 16 cp r1, r26 - 1a60: f0 40 sbci r31, 0x00 ; 0 - 1a62: a2 2f mov r26, r18 - 1a64: 23 2f mov r18, r19 - 1a66: 34 2f mov r19, r20 - 1a68: 44 27 eor r20, r20 - 1a6a: 58 5f subi r21, 0xF8 ; 248 - 1a6c: f3 cf rjmp .-26 ; 0x1a54 <__addsf3x+0x34> - 1a6e: 46 95 lsr r20 - 1a70: 37 95 ror r19 - 1a72: 27 95 ror r18 - 1a74: a7 95 ror r26 - 1a76: f0 40 sbci r31, 0x00 ; 0 - 1a78: 53 95 inc r21 - 1a7a: c9 f7 brne .-14 ; 0x1a6e <__addsf3x+0x4e> - 1a7c: 7e f4 brtc .+30 ; 0x1a9c <__addsf3x+0x7c> - 1a7e: 1f 16 cp r1, r31 - 1a80: ba 0b sbc r27, r26 - 1a82: 62 0b sbc r22, r18 - 1a84: 73 0b sbc r23, r19 - 1a86: 84 0b sbc r24, r20 - 1a88: ba f0 brmi .+46 ; 0x1ab8 <__addsf3x+0x98> - 1a8a: 91 50 subi r25, 0x01 ; 1 - 1a8c: a1 f0 breq .+40 ; 0x1ab6 <__addsf3x+0x96> - 1a8e: ff 0f add r31, r31 - 1a90: bb 1f adc r27, r27 - 1a92: 66 1f adc r22, r22 - 1a94: 77 1f adc r23, r23 - 1a96: 88 1f adc r24, r24 - 1a98: c2 f7 brpl .-16 ; 0x1a8a <__addsf3x+0x6a> - 1a9a: 0e c0 rjmp .+28 ; 0x1ab8 <__addsf3x+0x98> - 1a9c: ba 0f add r27, r26 - 1a9e: 62 1f adc r22, r18 - 1aa0: 73 1f adc r23, r19 - 1aa2: 84 1f adc r24, r20 - 1aa4: 48 f4 brcc .+18 ; 0x1ab8 <__addsf3x+0x98> - 1aa6: 87 95 ror r24 - 1aa8: 77 95 ror r23 - 1aaa: 67 95 ror r22 - 1aac: b7 95 ror r27 - 1aae: f7 95 ror r31 - 1ab0: 9e 3f cpi r25, 0xFE ; 254 - 1ab2: 08 f0 brcs .+2 ; 0x1ab6 <__addsf3x+0x96> - 1ab4: b3 cf rjmp .-154 ; 0x1a1c <__addsf3+0x1e> - 1ab6: 93 95 inc r25 - 1ab8: 88 0f add r24, r24 - 1aba: 08 f0 brcs .+2 ; 0x1abe <__addsf3x+0x9e> - 1abc: 99 27 eor r25, r25 - 1abe: ee 0f add r30, r30 - 1ac0: 97 95 ror r25 - 1ac2: 87 95 ror r24 - 1ac4: 08 95 ret - -00001ac6 <__cmpsf2>: - 1ac6: d4 d0 rcall .+424 ; 0x1c70 <__fp_cmp> - 1ac8: 08 f4 brcc .+2 ; 0x1acc <__cmpsf2+0x6> - 1aca: 81 e0 ldi r24, 0x01 ; 1 - 1acc: 08 95 ret - -00001ace <__divsf3>: - 1ace: 0c d0 rcall .+24 ; 0x1ae8 <__divsf3x> - 1ad0: 0a c1 rjmp .+532 ; 0x1ce6 <__fp_round> - 1ad2: 02 d1 rcall .+516 ; 0x1cd8 <__fp_pscB> - 1ad4: 40 f0 brcs .+16 ; 0x1ae6 <__divsf3+0x18> - 1ad6: f9 d0 rcall .+498 ; 0x1cca <__fp_pscA> - 1ad8: 30 f0 brcs .+12 ; 0x1ae6 <__divsf3+0x18> - 1ada: 21 f4 brne .+8 ; 0x1ae4 <__divsf3+0x16> - 1adc: 5f 3f cpi r21, 0xFF ; 255 - 1ade: 19 f0 breq .+6 ; 0x1ae6 <__divsf3+0x18> - 1ae0: eb c0 rjmp .+470 ; 0x1cb8 <__fp_inf> - 1ae2: 51 11 cpse r21, r1 - 1ae4: 34 c1 rjmp .+616 ; 0x1d4e <__fp_szero> - 1ae6: ee c0 rjmp .+476 ; 0x1cc4 <__fp_nan> - -00001ae8 <__divsf3x>: - 1ae8: 0f d1 rcall .+542 ; 0x1d08 <__fp_split3> - 1aea: 98 f3 brcs .-26 ; 0x1ad2 <__divsf3+0x4> - -00001aec <__divsf3_pse>: - 1aec: 99 23 and r25, r25 - 1aee: c9 f3 breq .-14 ; 0x1ae2 <__divsf3+0x14> - 1af0: 55 23 and r21, r21 - 1af2: b1 f3 breq .-20 ; 0x1ae0 <__divsf3+0x12> - 1af4: 95 1b sub r25, r21 - 1af6: 55 0b sbc r21, r21 - 1af8: bb 27 eor r27, r27 - 1afa: aa 27 eor r26, r26 - 1afc: 62 17 cp r22, r18 - 1afe: 73 07 cpc r23, r19 - 1b00: 84 07 cpc r24, r20 - 1b02: 38 f0 brcs .+14 ; 0x1b12 <__divsf3_pse+0x26> - 1b04: 9f 5f subi r25, 0xFF ; 255 - 1b06: 5f 4f sbci r21, 0xFF ; 255 - 1b08: 22 0f add r18, r18 - 1b0a: 33 1f adc r19, r19 - 1b0c: 44 1f adc r20, r20 - 1b0e: aa 1f adc r26, r26 - 1b10: a9 f3 breq .-22 ; 0x1afc <__divsf3_pse+0x10> - 1b12: 33 d0 rcall .+102 ; 0x1b7a <__divsf3_pse+0x8e> - 1b14: 0e 2e mov r0, r30 - 1b16: 3a f0 brmi .+14 ; 0x1b26 <__divsf3_pse+0x3a> - 1b18: e0 e8 ldi r30, 0x80 ; 128 - 1b1a: 30 d0 rcall .+96 ; 0x1b7c <__divsf3_pse+0x90> - 1b1c: 91 50 subi r25, 0x01 ; 1 - 1b1e: 50 40 sbci r21, 0x00 ; 0 - 1b20: e6 95 lsr r30 - 1b22: 00 1c adc r0, r0 - 1b24: ca f7 brpl .-14 ; 0x1b18 <__divsf3_pse+0x2c> - 1b26: 29 d0 rcall .+82 ; 0x1b7a <__divsf3_pse+0x8e> - 1b28: fe 2f mov r31, r30 - 1b2a: 27 d0 rcall .+78 ; 0x1b7a <__divsf3_pse+0x8e> - 1b2c: 66 0f add r22, r22 - 1b2e: 77 1f adc r23, r23 - 1b30: 88 1f adc r24, r24 - 1b32: bb 1f adc r27, r27 - 1b34: 26 17 cp r18, r22 - 1b36: 37 07 cpc r19, r23 - 1b38: 48 07 cpc r20, r24 - 1b3a: ab 07 cpc r26, r27 - 1b3c: b0 e8 ldi r27, 0x80 ; 128 - 1b3e: 09 f0 breq .+2 ; 0x1b42 <__divsf3_pse+0x56> - 1b40: bb 0b sbc r27, r27 - 1b42: 80 2d mov r24, r0 - 1b44: bf 01 movw r22, r30 - 1b46: ff 27 eor r31, r31 - 1b48: 93 58 subi r25, 0x83 ; 131 - 1b4a: 5f 4f sbci r21, 0xFF ; 255 - 1b4c: 2a f0 brmi .+10 ; 0x1b58 <__divsf3_pse+0x6c> - 1b4e: 9e 3f cpi r25, 0xFE ; 254 - 1b50: 51 05 cpc r21, r1 - 1b52: 68 f0 brcs .+26 ; 0x1b6e <__divsf3_pse+0x82> - 1b54: b1 c0 rjmp .+354 ; 0x1cb8 <__fp_inf> - 1b56: fb c0 rjmp .+502 ; 0x1d4e <__fp_szero> - 1b58: 5f 3f cpi r21, 0xFF ; 255 - 1b5a: ec f3 brlt .-6 ; 0x1b56 <__divsf3_pse+0x6a> - 1b5c: 98 3e cpi r25, 0xE8 ; 232 - 1b5e: dc f3 brlt .-10 ; 0x1b56 <__divsf3_pse+0x6a> - 1b60: 86 95 lsr r24 - 1b62: 77 95 ror r23 - 1b64: 67 95 ror r22 - 1b66: b7 95 ror r27 - 1b68: f7 95 ror r31 - 1b6a: 9f 5f subi r25, 0xFF ; 255 - 1b6c: c9 f7 brne .-14 ; 0x1b60 <__divsf3_pse+0x74> - 1b6e: 88 0f add r24, r24 - 1b70: 91 1d adc r25, r1 - 1b72: 96 95 lsr r25 - 1b74: 87 95 ror r24 - 1b76: 97 f9 bld r25, 7 - 1b78: 08 95 ret - 1b7a: e1 e0 ldi r30, 0x01 ; 1 - 1b7c: 66 0f add r22, r22 - 1b7e: 77 1f adc r23, r23 - 1b80: 88 1f adc r24, r24 - 1b82: bb 1f adc r27, r27 - 1b84: 62 17 cp r22, r18 - 1b86: 73 07 cpc r23, r19 - 1b88: 84 07 cpc r24, r20 - 1b8a: ba 07 cpc r27, r26 - 1b8c: 20 f0 brcs .+8 ; 0x1b96 <__divsf3_pse+0xaa> - 1b8e: 62 1b sub r22, r18 - 1b90: 73 0b sbc r23, r19 - 1b92: 84 0b sbc r24, r20 - 1b94: ba 0b sbc r27, r26 - 1b96: ee 1f adc r30, r30 - 1b98: 88 f7 brcc .-30 ; 0x1b7c <__divsf3_pse+0x90> - 1b9a: e0 95 com r30 - 1b9c: 08 95 ret - -00001b9e <__fixunssfsi>: - 1b9e: bc d0 rcall .+376 ; 0x1d18 <__fp_splitA> - 1ba0: 88 f0 brcs .+34 ; 0x1bc4 <__fixunssfsi+0x26> - 1ba2: 9f 57 subi r25, 0x7F ; 127 - 1ba4: 90 f0 brcs .+36 ; 0x1bca <__fixunssfsi+0x2c> - 1ba6: b9 2f mov r27, r25 - 1ba8: 99 27 eor r25, r25 - 1baa: b7 51 subi r27, 0x17 ; 23 - 1bac: a0 f0 brcs .+40 ; 0x1bd6 <__fixunssfsi+0x38> - 1bae: d1 f0 breq .+52 ; 0x1be4 <__fixunssfsi+0x46> - 1bb0: 66 0f add r22, r22 - 1bb2: 77 1f adc r23, r23 - 1bb4: 88 1f adc r24, r24 - 1bb6: 99 1f adc r25, r25 - 1bb8: 1a f0 brmi .+6 ; 0x1bc0 <__fixunssfsi+0x22> - 1bba: ba 95 dec r27 - 1bbc: c9 f7 brne .-14 ; 0x1bb0 <__fixunssfsi+0x12> - 1bbe: 12 c0 rjmp .+36 ; 0x1be4 <__fixunssfsi+0x46> - 1bc0: b1 30 cpi r27, 0x01 ; 1 - 1bc2: 81 f0 breq .+32 ; 0x1be4 <__fixunssfsi+0x46> - 1bc4: c3 d0 rcall .+390 ; 0x1d4c <__fp_zero> - 1bc6: b1 e0 ldi r27, 0x01 ; 1 - 1bc8: 08 95 ret - 1bca: c0 c0 rjmp .+384 ; 0x1d4c <__fp_zero> - 1bcc: 67 2f mov r22, r23 - 1bce: 78 2f mov r23, r24 - 1bd0: 88 27 eor r24, r24 - 1bd2: b8 5f subi r27, 0xF8 ; 248 - 1bd4: 39 f0 breq .+14 ; 0x1be4 <__fixunssfsi+0x46> - 1bd6: b9 3f cpi r27, 0xF9 ; 249 - 1bd8: cc f3 brlt .-14 ; 0x1bcc <__fixunssfsi+0x2e> - 1bda: 86 95 lsr r24 - 1bdc: 77 95 ror r23 - 1bde: 67 95 ror r22 - 1be0: b3 95 inc r27 - 1be2: d9 f7 brne .-10 ; 0x1bda <__fixunssfsi+0x3c> - 1be4: 3e f4 brtc .+14 ; 0x1bf4 <__fixunssfsi+0x56> - 1be6: 90 95 com r25 - 1be8: 80 95 com r24 - 1bea: 70 95 com r23 - 1bec: 61 95 neg r22 - 1bee: 7f 4f sbci r23, 0xFF ; 255 - 1bf0: 8f 4f sbci r24, 0xFF ; 255 - 1bf2: 9f 4f sbci r25, 0xFF ; 255 - 1bf4: 08 95 ret - -00001bf6 <__floatunsisf>: - 1bf6: e8 94 clt - 1bf8: 09 c0 rjmp .+18 ; 0x1c0c <__floatsisf+0x12> - -00001bfa <__floatsisf>: - 1bfa: 97 fb bst r25, 7 - 1bfc: 3e f4 brtc .+14 ; 0x1c0c <__floatsisf+0x12> - 1bfe: 90 95 com r25 - 1c00: 80 95 com r24 - 1c02: 70 95 com r23 - 1c04: 61 95 neg r22 - 1c06: 7f 4f sbci r23, 0xFF ; 255 - 1c08: 8f 4f sbci r24, 0xFF ; 255 - 1c0a: 9f 4f sbci r25, 0xFF ; 255 - 1c0c: 99 23 and r25, r25 - 1c0e: a9 f0 breq .+42 ; 0x1c3a <__floatsisf+0x40> - 1c10: f9 2f mov r31, r25 - 1c12: 96 e9 ldi r25, 0x96 ; 150 - 1c14: bb 27 eor r27, r27 - 1c16: 93 95 inc r25 - 1c18: f6 95 lsr r31 - 1c1a: 87 95 ror r24 - 1c1c: 77 95 ror r23 - 1c1e: 67 95 ror r22 - 1c20: b7 95 ror r27 - 1c22: f1 11 cpse r31, r1 - 1c24: f8 cf rjmp .-16 ; 0x1c16 <__floatsisf+0x1c> - 1c26: fa f4 brpl .+62 ; 0x1c66 <__floatsisf+0x6c> - 1c28: bb 0f add r27, r27 - 1c2a: 11 f4 brne .+4 ; 0x1c30 <__floatsisf+0x36> - 1c2c: 60 ff sbrs r22, 0 - 1c2e: 1b c0 rjmp .+54 ; 0x1c66 <__floatsisf+0x6c> - 1c30: 6f 5f subi r22, 0xFF ; 255 - 1c32: 7f 4f sbci r23, 0xFF ; 255 - 1c34: 8f 4f sbci r24, 0xFF ; 255 - 1c36: 9f 4f sbci r25, 0xFF ; 255 - 1c38: 16 c0 rjmp .+44 ; 0x1c66 <__floatsisf+0x6c> - 1c3a: 88 23 and r24, r24 - 1c3c: 11 f0 breq .+4 ; 0x1c42 <__floatsisf+0x48> - 1c3e: 96 e9 ldi r25, 0x96 ; 150 - 1c40: 11 c0 rjmp .+34 ; 0x1c64 <__floatsisf+0x6a> - 1c42: 77 23 and r23, r23 - 1c44: 21 f0 breq .+8 ; 0x1c4e <__floatsisf+0x54> - 1c46: 9e e8 ldi r25, 0x8E ; 142 - 1c48: 87 2f mov r24, r23 - 1c4a: 76 2f mov r23, r22 - 1c4c: 05 c0 rjmp .+10 ; 0x1c58 <__floatsisf+0x5e> - 1c4e: 66 23 and r22, r22 - 1c50: 71 f0 breq .+28 ; 0x1c6e <__floatsisf+0x74> - 1c52: 96 e8 ldi r25, 0x86 ; 134 - 1c54: 86 2f mov r24, r22 - 1c56: 70 e0 ldi r23, 0x00 ; 0 - 1c58: 60 e0 ldi r22, 0x00 ; 0 - 1c5a: 2a f0 brmi .+10 ; 0x1c66 <__floatsisf+0x6c> - 1c5c: 9a 95 dec r25 - 1c5e: 66 0f add r22, r22 - 1c60: 77 1f adc r23, r23 - 1c62: 88 1f adc r24, r24 - 1c64: da f7 brpl .-10 ; 0x1c5c <__floatsisf+0x62> - 1c66: 88 0f add r24, r24 - 1c68: 96 95 lsr r25 - 1c6a: 87 95 ror r24 - 1c6c: 97 f9 bld r25, 7 - 1c6e: 08 95 ret - -00001c70 <__fp_cmp>: - 1c70: 99 0f add r25, r25 - 1c72: 00 08 sbc r0, r0 - 1c74: 55 0f add r21, r21 - 1c76: aa 0b sbc r26, r26 - 1c78: e0 e8 ldi r30, 0x80 ; 128 - 1c7a: fe ef ldi r31, 0xFE ; 254 - 1c7c: 16 16 cp r1, r22 - 1c7e: 17 06 cpc r1, r23 - 1c80: e8 07 cpc r30, r24 - 1c82: f9 07 cpc r31, r25 - 1c84: c0 f0 brcs .+48 ; 0x1cb6 <__fp_cmp+0x46> - 1c86: 12 16 cp r1, r18 - 1c88: 13 06 cpc r1, r19 - 1c8a: e4 07 cpc r30, r20 - 1c8c: f5 07 cpc r31, r21 - 1c8e: 98 f0 brcs .+38 ; 0x1cb6 <__fp_cmp+0x46> - 1c90: 62 1b sub r22, r18 - 1c92: 73 0b sbc r23, r19 - 1c94: 84 0b sbc r24, r20 - 1c96: 95 0b sbc r25, r21 - 1c98: 39 f4 brne .+14 ; 0x1ca8 <__fp_cmp+0x38> - 1c9a: 0a 26 eor r0, r26 - 1c9c: 61 f0 breq .+24 ; 0x1cb6 <__fp_cmp+0x46> - 1c9e: 23 2b or r18, r19 - 1ca0: 24 2b or r18, r20 - 1ca2: 25 2b or r18, r21 - 1ca4: 21 f4 brne .+8 ; 0x1cae <__fp_cmp+0x3e> - 1ca6: 08 95 ret - 1ca8: 0a 26 eor r0, r26 - 1caa: 09 f4 brne .+2 ; 0x1cae <__fp_cmp+0x3e> - 1cac: a1 40 sbci r26, 0x01 ; 1 - 1cae: a6 95 lsr r26 - 1cb0: 8f ef ldi r24, 0xFF ; 255 - 1cb2: 81 1d adc r24, r1 - 1cb4: 81 1d adc r24, r1 - 1cb6: 08 95 ret - -00001cb8 <__fp_inf>: - 1cb8: 97 f9 bld r25, 7 - 1cba: 9f 67 ori r25, 0x7F ; 127 - 1cbc: 80 e8 ldi r24, 0x80 ; 128 - 1cbe: 70 e0 ldi r23, 0x00 ; 0 - 1cc0: 60 e0 ldi r22, 0x00 ; 0 - 1cc2: 08 95 ret - -00001cc4 <__fp_nan>: - 1cc4: 9f ef ldi r25, 0xFF ; 255 - 1cc6: 80 ec ldi r24, 0xC0 ; 192 - 1cc8: 08 95 ret - -00001cca <__fp_pscA>: - 1cca: 00 24 eor r0, r0 - 1ccc: 0a 94 dec r0 - 1cce: 16 16 cp r1, r22 - 1cd0: 17 06 cpc r1, r23 - 1cd2: 18 06 cpc r1, r24 - 1cd4: 09 06 cpc r0, r25 - 1cd6: 08 95 ret - -00001cd8 <__fp_pscB>: - 1cd8: 00 24 eor r0, r0 - 1cda: 0a 94 dec r0 - 1cdc: 12 16 cp r1, r18 - 1cde: 13 06 cpc r1, r19 - 1ce0: 14 06 cpc r1, r20 - 1ce2: 05 06 cpc r0, r21 - 1ce4: 08 95 ret - -00001ce6 <__fp_round>: - 1ce6: 09 2e mov r0, r25 - 1ce8: 03 94 inc r0 - 1cea: 00 0c add r0, r0 - 1cec: 11 f4 brne .+4 ; 0x1cf2 <__fp_round+0xc> - 1cee: 88 23 and r24, r24 - 1cf0: 52 f0 brmi .+20 ; 0x1d06 <__fp_round+0x20> - 1cf2: bb 0f add r27, r27 - 1cf4: 40 f4 brcc .+16 ; 0x1d06 <__fp_round+0x20> - 1cf6: bf 2b or r27, r31 - 1cf8: 11 f4 brne .+4 ; 0x1cfe <__fp_round+0x18> - 1cfa: 60 ff sbrs r22, 0 - 1cfc: 04 c0 rjmp .+8 ; 0x1d06 <__fp_round+0x20> - 1cfe: 6f 5f subi r22, 0xFF ; 255 - 1d00: 7f 4f sbci r23, 0xFF ; 255 - 1d02: 8f 4f sbci r24, 0xFF ; 255 - 1d04: 9f 4f sbci r25, 0xFF ; 255 - 1d06: 08 95 ret - -00001d08 <__fp_split3>: - 1d08: 57 fd sbrc r21, 7 - 1d0a: 90 58 subi r25, 0x80 ; 128 - 1d0c: 44 0f add r20, r20 - 1d0e: 55 1f adc r21, r21 - 1d10: 59 f0 breq .+22 ; 0x1d28 <__fp_splitA+0x10> - 1d12: 5f 3f cpi r21, 0xFF ; 255 - 1d14: 71 f0 breq .+28 ; 0x1d32 <__fp_splitA+0x1a> - 1d16: 47 95 ror r20 - -00001d18 <__fp_splitA>: - 1d18: 88 0f add r24, r24 - 1d1a: 97 fb bst r25, 7 - 1d1c: 99 1f adc r25, r25 - 1d1e: 61 f0 breq .+24 ; 0x1d38 <__fp_splitA+0x20> - 1d20: 9f 3f cpi r25, 0xFF ; 255 - 1d22: 79 f0 breq .+30 ; 0x1d42 <__fp_splitA+0x2a> - 1d24: 87 95 ror r24 + 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 - 1d28: 12 16 cp r1, r18 - 1d2a: 13 06 cpc r1, r19 - 1d2c: 14 06 cpc r1, r20 - 1d2e: 55 1f adc r21, r21 - 1d30: f2 cf rjmp .-28 ; 0x1d16 <__fp_split3+0xe> - 1d32: 46 95 lsr r20 - 1d34: f1 df rcall .-30 ; 0x1d18 <__fp_splitA> - 1d36: 08 c0 rjmp .+16 ; 0x1d48 <__fp_splitA+0x30> - 1d38: 16 16 cp r1, r22 - 1d3a: 17 06 cpc r1, r23 - 1d3c: 18 06 cpc r1, r24 - 1d3e: 99 1f adc r25, r25 - 1d40: f1 cf rjmp .-30 ; 0x1d24 <__fp_splitA+0xc> - 1d42: 86 95 lsr r24 - 1d44: 71 05 cpc r23, r1 - 1d46: 61 05 cpc r22, r1 - 1d48: 08 94 sec - 1d4a: 08 95 ret - -00001d4c <__fp_zero>: - 1d4c: e8 94 clt - -00001d4e <__fp_szero>: - 1d4e: bb 27 eor r27, r27 - 1d50: 66 27 eor r22, r22 - 1d52: 77 27 eor r23, r23 - 1d54: cb 01 movw r24, r22 - 1d56: 97 f9 bld r25, 7 - 1d58: 08 95 ret - -00001d5a <__gesf2>: - 1d5a: 8a df rcall .-236 ; 0x1c70 <__fp_cmp> - 1d5c: 08 f4 brcc .+2 ; 0x1d60 <__gesf2+0x6> - 1d5e: 8f ef ldi r24, 0xFF ; 255 - 1d60: 08 95 ret - -00001d62 <__mulhi3>: - 1d62: 55 27 eor r21, r21 - 1d64: 00 24 eor r0, r0 - -00001d66 <__mulhi3_loop>: - 1d66: 80 ff sbrs r24, 0 - 1d68: 02 c0 rjmp .+4 ; 0x1d6e <__mulhi3_skip1> - 1d6a: 06 0e add r0, r22 - 1d6c: 57 1f adc r21, r23 - -00001d6e <__mulhi3_skip1>: - 1d6e: 66 0f add r22, r22 - 1d70: 77 1f adc r23, r23 - 1d72: 61 15 cp r22, r1 - 1d74: 71 05 cpc r23, r1 - 1d76: 21 f0 breq .+8 ; 0x1d80 <__mulhi3_exit> - 1d78: 96 95 lsr r25 - 1d7a: 87 95 ror r24 - 1d7c: 00 97 sbiw r24, 0x00 ; 0 - 1d7e: 99 f7 brne .-26 ; 0x1d66 <__mulhi3_loop> - -00001d80 <__mulhi3_exit>: - 1d80: 95 2f mov r25, r21 - 1d82: 80 2d mov r24, r0 - 1d84: 08 95 ret - -00001d86 <__udivmodhi4>: - 1d86: aa 1b sub r26, r26 - 1d88: bb 1b sub r27, r27 - 1d8a: 51 e1 ldi r21, 0x11 ; 17 - 1d8c: 07 c0 rjmp .+14 ; 0x1d9c <__udivmodhi4_ep> - -00001d8e <__udivmodhi4_loop>: - 1d8e: aa 1f adc r26, r26 - 1d90: bb 1f adc r27, r27 - 1d92: a6 17 cp r26, r22 - 1d94: b7 07 cpc r27, r23 - 1d96: 10 f0 brcs .+4 ; 0x1d9c <__udivmodhi4_ep> - 1d98: a6 1b sub r26, r22 - 1d9a: b7 0b sbc r27, r23 - -00001d9c <__udivmodhi4_ep>: - 1d9c: 88 1f adc r24, r24 - 1d9e: 99 1f adc r25, r25 - 1da0: 5a 95 dec r21 - 1da2: a9 f7 brne .-22 ; 0x1d8e <__udivmodhi4_loop> - 1da4: 80 95 com r24 - 1da6: 90 95 com r25 - 1da8: bc 01 movw r22, r24 - 1daa: cd 01 movw r24, r26 - 1dac: 08 95 ret - -00001dae <__divmodhi4>: - 1dae: 97 fb bst r25, 7 - 1db0: 09 2e mov r0, r25 - 1db2: 07 26 eor r0, r23 - 1db4: 0a d0 rcall .+20 ; 0x1dca <__divmodhi4_neg1> - 1db6: 77 fd sbrc r23, 7 - 1db8: 04 d0 rcall .+8 ; 0x1dc2 <__divmodhi4_neg2> - 1dba: e5 df rcall .-54 ; 0x1d86 <__udivmodhi4> - 1dbc: 06 d0 rcall .+12 ; 0x1dca <__divmodhi4_neg1> - 1dbe: 00 20 and r0, r0 - 1dc0: 1a f4 brpl .+6 ; 0x1dc8 <__divmodhi4_exit> - -00001dc2 <__divmodhi4_neg2>: - 1dc2: 70 95 com r23 - 1dc4: 61 95 neg r22 - 1dc6: 7f 4f sbci r23, 0xFF ; 255 - -00001dc8 <__divmodhi4_exit>: + +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 <__divmodhi4_neg1>: - 1dca: f6 f7 brtc .-4 ; 0x1dc8 <__divmodhi4_exit> - 1dcc: 90 95 com r25 - 1dce: 81 95 neg r24 - 1dd0: 9f 4f sbci r25, 0xFF ; 255 - 1dd2: 08 95 ret - -00001dd4 <__udivmodsi4>: - 1dd4: a1 e2 ldi r26, 0x21 ; 33 - 1dd6: 1a 2e mov r1, r26 - 1dd8: aa 1b sub r26, r26 - 1dda: bb 1b sub r27, r27 - 1ddc: fd 01 movw r30, r26 - 1dde: 0d c0 rjmp .+26 ; 0x1dfa <__udivmodsi4_ep> - -00001de0 <__udivmodsi4_loop>: - 1de0: aa 1f adc r26, r26 - 1de2: bb 1f adc r27, r27 - 1de4: ee 1f adc r30, r30 - 1de6: ff 1f adc r31, r31 - 1de8: a2 17 cp r26, r18 - 1dea: b3 07 cpc r27, r19 - 1dec: e4 07 cpc r30, r20 - 1dee: f5 07 cpc r31, r21 - 1df0: 20 f0 brcs .+8 ; 0x1dfa <__udivmodsi4_ep> - 1df2: a2 1b sub r26, r18 - 1df4: b3 0b sbc r27, r19 - 1df6: e4 0b sbc r30, r20 - 1df8: f5 0b sbc r31, r21 - -00001dfa <__udivmodsi4_ep>: - 1dfa: 66 1f adc r22, r22 - 1dfc: 77 1f adc r23, r23 - 1dfe: 88 1f adc r24, r24 - 1e00: 99 1f adc r25, r25 - 1e02: 1a 94 dec r1 - 1e04: 69 f7 brne .-38 ; 0x1de0 <__udivmodsi4_loop> - 1e06: 60 95 com r22 - 1e08: 70 95 com r23 - 1e0a: 80 95 com r24 - 1e0c: 90 95 com r25 - 1e0e: 9b 01 movw r18, r22 - 1e10: ac 01 movw r20, r24 - 1e12: bd 01 movw r22, r26 - 1e14: cf 01 movw r24, r30 - 1e16: 08 95 ret - -00001e18 : - 1e18: fc 01 movw r30, r24 - 1e1a: 88 27 eor r24, r24 - 1e1c: 99 27 eor r25, r25 - 1e1e: e8 94 clt - 1e20: 21 91 ld r18, Z+ - 1e22: 20 32 cpi r18, 0x20 ; 32 - 1e24: e9 f3 breq .-6 ; 0x1e20 - 1e26: 29 30 cpi r18, 0x09 ; 9 - 1e28: 10 f0 brcs .+4 ; 0x1e2e - 1e2a: 2e 30 cpi r18, 0x0E ; 14 - 1e2c: c8 f3 brcs .-14 ; 0x1e20 - 1e2e: 2b 32 cpi r18, 0x2B ; 43 - 1e30: 39 f0 breq .+14 ; 0x1e40 - 1e32: 2d 32 cpi r18, 0x2D ; 45 - 1e34: 31 f4 brne .+12 ; 0x1e42 - 1e36: 68 94 set - 1e38: 03 c0 rjmp .+6 ; 0x1e40 - 1e3a: 1a d0 rcall .+52 ; 0x1e70 <__mulhi_const_10> - 1e3c: 82 0f add r24, r18 - 1e3e: 91 1d adc r25, r1 - 1e40: 21 91 ld r18, Z+ - 1e42: 20 53 subi r18, 0x30 ; 48 - 1e44: 2a 30 cpi r18, 0x0A ; 10 - 1e46: c8 f3 brcs .-14 ; 0x1e3a - 1e48: 1e f4 brtc .+6 ; 0x1e50 - 1e4a: 90 95 com r25 - 1e4c: 81 95 neg r24 - 1e4e: 9f 4f sbci r25, 0xFF ; 255 - 1e50: 08 95 ret - -00001e52 : - 1e52: fb 01 movw r30, r22 - 1e54: dc 01 movw r26, r24 - 1e56: 41 50 subi r20, 0x01 ; 1 - 1e58: 50 40 sbci r21, 0x00 ; 0 - 1e5a: 48 f0 brcs .+18 ; 0x1e6e - 1e5c: 01 90 ld r0, Z+ - 1e5e: 0d 92 st X+, r0 - 1e60: 00 20 and r0, r0 - 1e62: c9 f7 brne .-14 ; 0x1e56 - 1e64: 01 c0 rjmp .+2 ; 0x1e68 - 1e66: 1d 92 st X+, r1 - 1e68: 41 50 subi r20, 0x01 ; 1 - 1e6a: 50 40 sbci r21, 0x00 ; 0 - 1e6c: e0 f7 brcc .-8 ; 0x1e66 - 1e6e: 08 95 ret - -00001e70 <__mulhi_const_10>: - 1e70: bc 01 movw r22, r24 - 1e72: 88 0f add r24, r24 - 1e74: 99 1f adc r25, r25 - 1e76: 88 0f add r24, r24 - 1e78: 99 1f adc r25, r25 - 1e7a: 86 0f add r24, r22 - 1e7c: 97 1f adc r25, r23 - 1e7e: 88 0f add r24, r24 - 1e80: 99 1f adc r25, r25 - 1e82: 08 95 ret - -00001e84 <_exit>: - 1e84: f8 94 cli - -00001e86 <__stop_program>: - 1e86: ff cf rjmp .-2 ; 0x1e86 <__stop_program> +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 + 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> diff --git a/firmware/USBtoSerial.map b/firmware/USBtoSerial.map index 48e5678..aeb65e5 100644 --- a/firmware/USBtoSerial.map +++ b/firmware/USBtoSerial.map @@ -98,6 +98,8 @@ Discarded input sections .text.y_abs 0x0000000000000000 0x3e USBtoSerial.o .text.decode_field 0x0000000000000000 0x8c USBtoSerial.o + .text.uart_print_number + 0x0000000000000000 0x2c USBtoSerial.o .text.times_ten_pow 0x0000000000000000 0x3a USBtoSerial.o .text 0x0000000000000000 0x0 Descriptors.o @@ -568,7 +570,7 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .rela.plt *(.rela.plt) -.text 0x0000000000000000 0x1e88 +.text 0x0000000000000000 0x1ef8 *(.vectors) .vectors 0x0000000000000000 0x98 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o 0x0000000000000000 __vectors @@ -729,189 +731,192 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a 0x00000000000007d4 0x26 USBtoSerial.o 0x00000000000007d4 uart_puts .text.my_uitoa - 0x00000000000007fa 0xd0 USBtoSerial.o + 0x00000000000007fa 0xcc USBtoSerial.o 0x00000000000007fa my_uitoa - .text.sign 0x00000000000008ca 0x18 USBtoSerial.o - 0x00000000000008ca sign - .text.uart_print_number - 0x00000000000008e2 0x20 USBtoSerial.o - 0x00000000000008e2 uart_print_number + .text.sign 0x00000000000008c6 0x18 USBtoSerial.o + 0x00000000000008c6 sign + .text.uart_print_number_wlzeros + 0x00000000000008de 0x28 USBtoSerial.o + 0x00000000000008de uart_print_number_wlzeros .text.uart_print_signed_number - 0x0000000000000902 0x3c USBtoSerial.o - 0x0000000000000902 uart_print_signed_number + 0x0000000000000906 0x46 USBtoSerial.o + 0x0000000000000906 uart_print_signed_number .text.init_motors - 0x000000000000093e 0x1a USBtoSerial.o - 0x000000000000093e init_motors + 0x000000000000094c 0x1a USBtoSerial.o + 0x000000000000094c init_motors .text.motor_step - 0x0000000000000958 0x64 USBtoSerial.o - 0x0000000000000958 motor_step + 0x0000000000000966 0x64 USBtoSerial.o + 0x0000000000000966 motor_step .text.move_plate - 0x00000000000009bc 0x96 USBtoSerial.o - 0x00000000000009bc move_plate + 0x00000000000009ca 0x96 USBtoSerial.o + 0x00000000000009ca move_plate + .text.print_steps_in_mm + 0x0000000000000a60 0x54 USBtoSerial.o + 0x0000000000000a60 print_steps_in_mm .text.pos_report - 0x0000000000000a52 0x3a USBtoSerial.o - 0x0000000000000a52 pos_report + 0x0000000000000ab4 0x26 USBtoSerial.o + 0x0000000000000ab4 pos_report .text.parse_command - 0x0000000000000a8c 0x33c USBtoSerial.o - 0x0000000000000a8c parse_command - .text.main 0x0000000000000dc8 0xae USBtoSerial.o - 0x0000000000000dc8 main + 0x0000000000000ada 0x35e USBtoSerial.o + 0x0000000000000ada parse_command + .text.main 0x0000000000000e38 0xae USBtoSerial.o + 0x0000000000000e38 main .text.CALLBACK_USB_GetDescriptor - 0x0000000000000e76 0x5a Descriptors.o - 0x0000000000000e76 CALLBACK_USB_GetDescriptor + 0x0000000000000ee6 0x5a Descriptors.o + 0x0000000000000ee6 CALLBACK_USB_GetDescriptor .text.Endpoint_Write_Control_Stream_LE - 0x0000000000000ed0 0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - 0x0000000000000ed0 Endpoint_Write_Control_Stream_LE + 0x0000000000000f40 0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000f40 Endpoint_Write_Control_Stream_LE .text.Endpoint_Write_Control_PStream_LE - 0x0000000000000f84 0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - 0x0000000000000f84 Endpoint_Write_Control_PStream_LE + 0x0000000000000ff4 0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000ff4 Endpoint_Write_Control_PStream_LE .text.Endpoint_ConfigureEndpoint_Prv - 0x000000000000103a 0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x000000000000103a Endpoint_ConfigureEndpoint_Prv + 0x00000000000010aa 0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000010aa Endpoint_ConfigureEndpoint_Prv .text.Endpoint_ConfigureEndpointTable - 0x00000000000010a8 0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x00000000000010a8 Endpoint_ConfigureEndpointTable + 0x0000000000001118 0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x0000000000001118 Endpoint_ConfigureEndpointTable .text.Endpoint_ClearStatusStage - 0x0000000000001130 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x0000000000001130 Endpoint_ClearStatusStage + 0x00000000000011a0 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000011a0 Endpoint_ClearStatusStage .text.Endpoint_WaitUntilReady - 0x000000000000116e 0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x000000000000116e Endpoint_WaitUntilReady + 0x00000000000011de 0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000011de Endpoint_WaitUntilReady .text.USB_ResetInterface - 0x00000000000011d4 0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - 0x00000000000011d4 USB_ResetInterface + 0x0000000000001244 0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x0000000000001244 USB_ResetInterface .text.USB_Init - 0x0000000000001244 0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - 0x0000000000001244 USB_Init + 0x00000000000012b4 0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000000000012b4 USB_Init .text.USB_INT_DisableAllInterrupts - 0x0000000000001256 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x0000000000001256 USB_INT_DisableAllInterrupts + 0x00000000000012c6 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000000000012c6 USB_INT_DisableAllInterrupts .text.USB_INT_ClearAllInterrupts - 0x000000000000125c 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x000000000000125c USB_INT_ClearAllInterrupts + 0x00000000000012cc 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000000000012cc USB_INT_ClearAllInterrupts .text.__vector_11 - 0x0000000000001262 0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x0000000000001262 __vector_11 + 0x00000000000012d2 0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000000000012d2 __vector_11 .text.__vector_12 - 0x00000000000013aa 0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x00000000000013aa __vector_12 + 0x000000000000141a 0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x000000000000141a __vector_12 .text.USB_Device_ProcessControlRequest - 0x0000000000001420 0x2c4 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - 0x0000000000001420 USB_Device_ProcessControlRequest + 0x0000000000001490 0x2c4 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x0000000000001490 USB_Device_ProcessControlRequest .text.USB_Event_Stub - 0x00000000000016e4 0x2 ../../LUFA/Drivers/USB/Core/Events.o - 0x00000000000016e4 EVENT_USB_Device_WakeUp - 0x00000000000016e4 USB_Event_Stub - 0x00000000000016e4 EVENT_USB_Device_Suspend - 0x00000000000016e4 EVENT_USB_Device_StartOfFrame - 0x00000000000016e4 EVENT_USB_Device_Reset + 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 .text.USB_USBTask - 0x00000000000016e6 0x36 ../../LUFA/Drivers/USB/Core/USBTask.o - 0x00000000000016e6 USB_USBTask + 0x0000000000001756 0x36 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x0000000000001756 USB_USBTask .text.CDC_Device_ProcessControlRequest - 0x000000000000171c 0x15a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x000000000000171c CDC_Device_ProcessControlRequest + 0x000000000000178c 0x15a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x000000000000178c CDC_Device_ProcessControlRequest .text.CDC_Device_ConfigureEndpoints - 0x0000000000001876 0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001876 CDC_Device_ConfigureEndpoints + 0x00000000000018e6 0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x00000000000018e6 CDC_Device_ConfigureEndpoints .text.CDC_Device_SendByte - 0x00000000000018be 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000018be CDC_Device_SendByte + 0x000000000000192e 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x000000000000192e CDC_Device_SendByte .text.CDC_Device_Flush - 0x0000000000001918 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001918 CDC_Device_Flush + 0x0000000000001988 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001988 CDC_Device_Flush .text.CDC_Device_USBTask - 0x0000000000001972 0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001972 CDC_Device_USBTask + 0x00000000000019e2 0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x00000000000019e2 CDC_Device_USBTask .text.CDC_Device_ReceiveByte - 0x00000000000019a0 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000019a0 CDC_Device_ReceiveByte + 0x0000000000001a10 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001a10 CDC_Device_ReceiveByte .text.CDC_Device_Event_Stub - 0x00000000000019fa 0x2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000019fa EVENT_CDC_Device_ControLineStateChanged - 0x00000000000019fa EVENT_CDC_Device_BreakSent - 0x00000000000019fa 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 .text.avr-libc.fplib - 0x00000000000019fc 0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) - 0x00000000000019fc __subsf3 - 0x00000000000019fe __addsf3 + 0x0000000000001a6c 0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) + 0x0000000000001a6c __subsf3 + 0x0000000000001a6e __addsf3 .text.avr-libc.fplib - 0x0000000000001a06 0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) - 0x0000000000001a20 __addsf3x + 0x0000000000001a76 0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) + 0x0000000000001a90 __addsf3x .text.avr-libc.fplib - 0x0000000000001ac6 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) - 0x0000000000001ac6 __lesf2 - 0x0000000000001ac6 __nesf2 - 0x0000000000001ac6 __eqsf2 - 0x0000000000001ac6 __cmpsf2 - 0x0000000000001ac6 __ltsf2 + 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 .text.avr-libc.fplib - 0x0000000000001ace 0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) - 0x0000000000001ace __divsf3 + 0x0000000000001b3e 0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) + 0x0000000000001b3e __divsf3 .text.avr-libc.fplib - 0x0000000000001ad2 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o) - 0x0000000000001ae8 __divsf3x - 0x0000000000001aec __divsf3_pse + 0x0000000000001b42 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o) + 0x0000000000001b58 __divsf3x + 0x0000000000001b5c __divsf3_pse .text.avr-libc.fplib - 0x0000000000001b9e 0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o) - 0x0000000000001b9e __fixunssfsi + 0x0000000000001c0e 0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o) + 0x0000000000001c0e __fixunssfsi .text.avr-libc.fplib - 0x0000000000001bf6 0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o) - 0x0000000000001bf6 __floatunsisf - 0x0000000000001bfa __floatsisf + 0x0000000000001c66 0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o) + 0x0000000000001c66 __floatunsisf + 0x0000000000001c6a __floatsisf .text.avr-libc.fplib - 0x0000000000001c70 0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o) - 0x0000000000001c70 __fp_cmp + 0x0000000000001ce0 0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o) + 0x0000000000001ce0 __fp_cmp .text.avr-libc.fplib - 0x0000000000001cb8 0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o) - 0x0000000000001cb8 __fp_inf + 0x0000000000001d28 0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o) + 0x0000000000001d28 __fp_inf .text.avr-libc.fplib - 0x0000000000001cc4 0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o) - 0x0000000000001cc4 __fp_nan + 0x0000000000001d34 0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o) + 0x0000000000001d34 __fp_nan .text.avr-libc.fplib - 0x0000000000001cca 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o) - 0x0000000000001cca __fp_pscA + 0x0000000000001d3a 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o) + 0x0000000000001d3a __fp_pscA .text.avr-libc.fplib - 0x0000000000001cd8 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o) - 0x0000000000001cd8 __fp_pscB + 0x0000000000001d48 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o) + 0x0000000000001d48 __fp_pscB .text.avr-libc.fplib - 0x0000000000001ce6 0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o) - 0x0000000000001ce6 __fp_round + 0x0000000000001d56 0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o) + 0x0000000000001d56 __fp_round .text.avr-libc.fplib - 0x0000000000001d08 0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o) - 0x0000000000001d08 __fp_split3 - 0x0000000000001d18 __fp_splitA + 0x0000000000001d78 0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o) + 0x0000000000001d78 __fp_split3 + 0x0000000000001d88 __fp_splitA .text.avr-libc.fplib - 0x0000000000001d4c 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o) - 0x0000000000001d4c __fp_zero - 0x0000000000001d4e __fp_szero + 0x0000000000001dbc 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o) + 0x0000000000001dbc __fp_zero + 0x0000000000001dbe __fp_szero .text.avr-libc.fplib - 0x0000000000001d5a 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) - 0x0000000000001d5a __gtsf2 - 0x0000000000001d5a __gesf2 - .text.libgcc 0x0000000000001d62 0x24 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) - 0x0000000000001d62 __mulhi3 - .text.libgcc 0x0000000000001d86 0x28 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) - 0x0000000000001d86 __udivmodhi4 - .text.libgcc 0x0000000000001dae 0x26 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_divmodhi4.o) - 0x0000000000001dae __divmodhi4 - 0x0000000000001dae _div - .text.libgcc 0x0000000000001dd4 0x44 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o) - 0x0000000000001dd4 __udivmodsi4 + 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 .text.avr-libc - 0x0000000000001e18 0x3a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) - 0x0000000000001e18 atoi + 0x0000000000001e88 0x3a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + 0x0000000000001e88 atoi .text.avr-libc - 0x0000000000001e52 0x1e /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) - 0x0000000000001e52 strncpy + 0x0000000000001ec2 0x1e /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + 0x0000000000001ec2 strncpy .text.avr-libc - 0x0000000000001e70 0x14 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) - 0x0000000000001e70 __mulhi_const_10 - 0x0000000000001e84 . = ALIGN (0x2) + 0x0000000000001ee0 0x14 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + 0x0000000000001ee0 __mulhi_const_10 + 0x0000000000001ef4 . = ALIGN (0x2) *(.fini9) - .fini9 0x0000000000001e84 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) - 0x0000000000001e84 exit - 0x0000000000001e84 _exit + .fini9 0x0000000000001ef4 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) + 0x0000000000001ef4 exit + 0x0000000000001ef4 _exit *(.fini9) *(.fini8) *(.fini8) @@ -930,55 +935,55 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a *(.fini1) *(.fini1) *(.fini0) - .fini0 0x0000000000001e84 0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) + .fini0 0x0000000000001ef4 0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) *(.fini0) - 0x0000000000001e88 _etext = . + 0x0000000000001ef8 _etext = . -.data 0x0000000000800100 0x7a load address 0x0000000000001e88 +.data 0x0000000000800100 0x4e load address 0x0000000000001ef8 0x0000000000800100 PROVIDE (__data_start, .) *(.data) - .data 0x0000000000800100 0x79 USBtoSerial.o - 0x0000000000800154 VirtualSerial_CDC_Interface - 0x000000000080016f phase_pattern + .data 0x0000000000800100 0x4d USBtoSerial.o + 0x0000000000800128 VirtualSerial_CDC_Interface + 0x0000000000800143 phase_pattern *(.data*) *(.rodata) *(.rodata*) *(.gnu.linkonce.d*) - 0x000000000080017a . = ALIGN (0x2) - *fill* 0x0000000000800179 0x1 00 - 0x000000000080017a _edata = . - 0x000000000080017a PROVIDE (__data_end, .) + 0x000000000080014e . = ALIGN (0x2) + *fill* 0x000000000080014d 0x1 00 + 0x000000000080014e _edata = . + 0x000000000080014e PROVIDE (__data_end, .) -.bss 0x000000000080017a 0x176 - 0x000000000080017a PROVIDE (__bss_start, .) +.bss 0x000000000080014e 0x186 + 0x000000000080014e PROVIDE (__bss_start, .) *(.bss) - .bss 0x000000000080017a 0x14f USBtoSerial.o - 0x000000000080017a plate_pos_x - 0x000000000080017c plate_pos_y + .bss 0x000000000080014e 0x15f USBtoSerial.o + 0x000000000080014e plate_pos_x + 0x0000000000800150 plate_pos_y *(.bss*) *(COMMON) - COMMON 0x00000000008002c9 0x1b USBtoSerial.o - 0x00000000008002c9 adb_werte - 0x00000000008002d2 stringbuffer - 0x00000000008002e2 t0ovfcount - 0x00000000008002e3 adb_data_length - COMMON 0x00000000008002e4 0x3 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - 0x00000000008002e4 USB_Device_ConfigurationNumber - 0x00000000008002e5 USB_Device_CurrentlySelfPowered - 0x00000000008002e6 USB_Device_RemoteWakeupEnabled - COMMON 0x00000000008002e7 0x9 ../../LUFA/Drivers/USB/Core/USBTask.o - 0x00000000008002e7 USB_IsInitialized - 0x00000000008002e8 USB_ControlRequest - 0x00000000008002f0 PROVIDE (__bss_end, .) - 0x0000000000001e88 __data_load_start = LOADADDR (.data) - 0x0000000000001f02 __data_load_end = (__data_load_start + SIZEOF (.data)) - -.noinit 0x00000000008002f0 0x0 - 0x00000000008002f0 PROVIDE (__noinit_start, .) + COMMON 0x00000000008002ad 0x1b USBtoSerial.o + 0x00000000008002ad adb_werte + 0x00000000008002b6 stringbuffer + 0x00000000008002c6 t0ovfcount + 0x00000000008002c7 adb_data_length + COMMON 0x00000000008002c8 0x3 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x00000000008002c8 USB_Device_ConfigurationNumber + 0x00000000008002c9 USB_Device_CurrentlySelfPowered + 0x00000000008002ca USB_Device_RemoteWakeupEnabled + COMMON 0x00000000008002cb 0x9 ../../LUFA/Drivers/USB/Core/USBTask.o + 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)) + +.noinit 0x00000000008002d4 0x0 + 0x00000000008002d4 PROVIDE (__noinit_start, .) *(.noinit*) - 0x00000000008002f0 PROVIDE (__noinit_end, .) - 0x00000000008002f0 _end = . - 0x00000000008002f0 PROVIDE (__heap_start, .) + 0x00000000008002d4 PROVIDE (__noinit_end, .) + 0x00000000008002d4 _end = . + 0x00000000008002d4 PROVIDE (__heap_start, .) .eeprom 0x0000000000810000 0x0 *(.eeprom*) @@ -1081,118 +1086,118 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .debug_sfnames *(.debug_sfnames) -.debug_aranges 0x0000000000000000 0x590 +.debug_aranges 0x0000000000000000 0x5a0 *(.debug_aranges) .debug_aranges - 0x0000000000000000 0x160 USBtoSerial.o + 0x0000000000000000 0x170 USBtoSerial.o .debug_aranges - 0x0000000000000160 0x20 Descriptors.o + 0x0000000000000170 0x20 Descriptors.o .debug_aranges - 0x0000000000000180 0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x0000000000000190 0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o .debug_aranges - 0x00000000000001b8 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + 0x00000000000001c8 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o .debug_aranges - 0x00000000000001d8 0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x00000000000001e8 0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o .debug_aranges - 0x00000000000002a0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000002b0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o .debug_aranges - 0x00000000000002e0 0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000000000002f0 0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o .debug_aranges - 0x0000000000000310 0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000000320 0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o .debug_aranges - 0x0000000000000348 0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + 0x0000000000000358 0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o .debug_aranges - 0x0000000000000380 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x0000000000000390 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o .debug_aranges - 0x00000000000003a0 0x20 ../../LUFA/Drivers/USB/Core/Events.o + 0x00000000000003b0 0x20 ../../LUFA/Drivers/USB/Core/Events.o .debug_aranges - 0x00000000000003c0 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x00000000000003d0 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o .debug_aranges - 0x00000000000003e0 0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + 0x00000000000003f0 0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o .debug_aranges - 0x0000000000000410 0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000000420 0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o .debug_aranges - 0x00000000000004a8 0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + 0x00000000000004b8 0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o .debug_aranges - 0x00000000000004d8 0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + 0x00000000000004e8 0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o .debug_aranges - 0x0000000000000508 0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + 0x0000000000000518 0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o .debug_aranges - 0x0000000000000548 0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + 0x0000000000000558 0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o .debug_pubnames - 0x0000000000000000 0xf05 + 0x0000000000000000 0xf39 *(.debug_pubnames) .debug_pubnames - 0x0000000000000000 0x36a USBtoSerial.o + 0x0000000000000000 0x39e USBtoSerial.o .debug_pubnames - 0x000000000000036a 0x9e Descriptors.o + 0x000000000000039e 0x9e Descriptors.o .debug_pubnames - 0x0000000000000408 0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x000000000000043c 0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o .debug_pubnames - 0x0000000000000486 0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + 0x00000000000004ba 0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o .debug_pubnames - 0x00000000000004b8 0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x00000000000004ec 0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o .debug_pubnames - 0x0000000000000797 0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000007cb 0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o .debug_pubnames - 0x0000000000000846 0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x000000000000087a 0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o .debug_pubnames - 0x000000000000088c 0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000000000008c0 0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o .debug_pubnames - 0x00000000000008fe 0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + 0x0000000000000932 0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o .debug_pubnames - 0x0000000000000999 0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x00000000000009cd 0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o .debug_pubnames - 0x0000000000000a3a 0x25 ../../LUFA/Drivers/USB/Core/Events.o + 0x0000000000000a6e 0x25 ../../LUFA/Drivers/USB/Core/Events.o .debug_pubnames - 0x0000000000000a5f 0x4f ../../LUFA/Drivers/USB/Core/USBTask.o + 0x0000000000000a93 0x4f ../../LUFA/Drivers/USB/Core/USBTask.o .debug_pubnames - 0x0000000000000aae 0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + 0x0000000000000ae2 0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o .debug_pubnames - 0x0000000000000b27 0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000000b5b 0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o .debug_pubnames - 0x0000000000000cb2 0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + 0x0000000000000ce6 0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o .debug_pubnames - 0x0000000000000d22 0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + 0x0000000000000d56 0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o .debug_pubnames - 0x0000000000000d8f 0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + 0x0000000000000dc3 0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o .debug_pubnames - 0x0000000000000e35 0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + 0x0000000000000e69 0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o -.debug_info 0x0000000000000000 0x9207 +.debug_info 0x0000000000000000 0x92a5 *(.debug_info) - .debug_info 0x0000000000000000 0x1449 USBtoSerial.o - .debug_info 0x0000000000001449 0x77d Descriptors.o - .debug_info 0x0000000000001bc6 0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_info 0x00000000000022bf 0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_info 0x0000000000002397 0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_info 0x00000000000038e3 0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_info 0x0000000000003ee6 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_info 0x0000000000003f52 0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_info 0x0000000000003fbe 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_info 0x000000000000402a 0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_info 0x000000000000443c 0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_info 0x0000000000004a9e 0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_info 0x0000000000004e2a 0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_info 0x000000000000579d 0x85 ../../LUFA/Drivers/USB/Core/Events.o - .debug_info 0x0000000000005822 0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_info 0x000000000000588e 0x245 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_info 0x0000000000005ad3 0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_info 0x000000000000603f 0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_info 0x0000000000006c7a 0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_info 0x00000000000072f4 0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_info 0x0000000000007abe 0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_info 0x0000000000007f7f 0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_info 0x0000000000008e3b 0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_info 0x0000000000008ea7 0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_info 0x0000000000008f13 0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_info 0x0000000000008f7f 0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_info 0x0000000000008feb 0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_info 0x0000000000009057 0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_info 0x00000000000090c3 0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_info 0x000000000000912f 0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_info 0x000000000000919b 0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + .debug_info 0x0000000000000000 0x14e7 USBtoSerial.o + .debug_info 0x00000000000014e7 0x77d Descriptors.o + .debug_info 0x0000000000001c64 0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_info 0x000000000000235d 0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_info 0x0000000000002435 0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_info 0x0000000000003981 0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_info 0x0000000000003f84 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_info 0x0000000000003ff0 0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_info 0x000000000000405c 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_info 0x00000000000040c8 0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_info 0x00000000000044da 0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_info 0x0000000000004b3c 0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_info 0x0000000000004ec8 0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_info 0x000000000000583b 0x85 ../../LUFA/Drivers/USB/Core/Events.o + .debug_info 0x00000000000058c0 0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_info 0x000000000000592c 0x245 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_info 0x0000000000005b71 0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_info 0x00000000000060dd 0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_info 0x0000000000006d18 0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_info 0x0000000000007392 0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_info 0x0000000000007b5c 0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_info 0x000000000000801d 0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_info 0x0000000000008ed9 0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_info 0x0000000000008f45 0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_info 0x0000000000008fb1 0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_info 0x000000000000901d 0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_info 0x0000000000009089 0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_info 0x00000000000090f5 0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_info 0x0000000000009161 0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_info 0x00000000000091cd 0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_info 0x0000000000009239 0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o *(.gnu.linkonce.wi.*) .debug_abbrev 0x0000000000000000 0x220b @@ -1229,143 +1234,143 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .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 0x7b46 +.debug_line 0x0000000000000000 0x7bdc *(.debug_line) - .debug_line 0x0000000000000000 0x1563 USBtoSerial.o - .debug_line 0x0000000000001563 0x1d9 Descriptors.o - .debug_line 0x000000000000173c 0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_line 0x0000000000001e9e 0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_line 0x0000000000001ffd 0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_line 0x0000000000003a7d 0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_line 0x000000000000401e 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_line 0x000000000000405c 0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_line 0x000000000000409a 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_line 0x00000000000040d8 0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_line 0x00000000000043ea 0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_line 0x0000000000004944 0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_line 0x0000000000004bad 0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_line 0x000000000000514f 0x80 ../../LUFA/Drivers/USB/Core/Events.o - .debug_line 0x00000000000051cf 0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_line 0x000000000000520d 0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_line 0x00000000000053bb 0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_line 0x0000000000005879 0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_line 0x000000000000623b 0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_line 0x00000000000067fe 0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_line 0x0000000000006dc4 0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_line 0x0000000000007180 0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_line 0x0000000000007918 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_line 0x0000000000007956 0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_line 0x0000000000007994 0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_line 0x00000000000079d2 0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_line 0x0000000000007a10 0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_line 0x0000000000007a4e 0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_line 0x0000000000007a8c 0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_line 0x0000000000007aca 0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_line 0x0000000000007b08 0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o - -.debug_frame 0x0000000000000000 0x8e0 + .debug_line 0x0000000000000000 0x15f9 USBtoSerial.o + .debug_line 0x00000000000015f9 0x1d9 Descriptors.o + .debug_line 0x00000000000017d2 0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_line 0x0000000000001f34 0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_line 0x0000000000002093 0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_line 0x0000000000003b13 0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_line 0x00000000000040b4 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_line 0x00000000000040f2 0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_line 0x0000000000004130 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_line 0x000000000000416e 0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_line 0x0000000000004480 0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_line 0x00000000000049da 0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_line 0x0000000000004c43 0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_line 0x00000000000051e5 0x80 ../../LUFA/Drivers/USB/Core/Events.o + .debug_line 0x0000000000005265 0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_line 0x00000000000052a3 0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_line 0x0000000000005451 0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_line 0x000000000000590f 0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_line 0x00000000000062d1 0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_line 0x0000000000006894 0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_line 0x0000000000006e5a 0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_line 0x0000000000007216 0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_line 0x00000000000079ae 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_line 0x00000000000079ec 0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_line 0x0000000000007a2a 0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_line 0x0000000000007a68 0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_line 0x0000000000007aa6 0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_line 0x0000000000007ae4 0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_line 0x0000000000007b22 0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_line 0x0000000000007b60 0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_line 0x0000000000007b9e 0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + +.debug_frame 0x0000000000000000 0x900 *(.debug_frame) - .debug_frame 0x0000000000000000 0x2a0 USBtoSerial.o - .debug_frame 0x00000000000002a0 0x20 Descriptors.o - .debug_frame 0x00000000000002c0 0x50 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_frame 0x0000000000000310 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_frame 0x0000000000000330 0x170 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_frame 0x00000000000004a0 0x60 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_frame 0x0000000000000500 0x40 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_frame 0x0000000000000540 0x50 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_frame 0x0000000000000590 0x50 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_frame 0x00000000000005e0 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_frame 0x0000000000000600 0x20 ../../LUFA/Drivers/USB/Core/Events.o - .debug_frame 0x0000000000000620 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_frame 0x0000000000000640 0x40 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_frame 0x0000000000000680 0x110 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_frame 0x0000000000000790 0x40 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_frame 0x00000000000007d0 0x40 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_frame 0x0000000000000810 0x60 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_frame 0x0000000000000870 0x70 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - -.debug_str 0x0000000000000000 0x3d5d + .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 0x3d96 *(.debug_str) - .debug_str 0x0000000000000000 0xa9f USBtoSerial.o - 0xb57 (size before relaxing) - .debug_str 0x0000000000000a9f 0x8ba Descriptors.o + .debug_str 0x0000000000000000 0xad8 USBtoSerial.o + 0xb90 (size before relaxing) + .debug_str 0x0000000000000ad8 0x8ba Descriptors.o 0xa07 (size before relaxing) - .debug_str 0x0000000000001359 0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_str 0x0000000000001392 0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o 0x5e7 (size before relaxing) - .debug_str 0x00000000000017d5 0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_str 0x000000000000180e 0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o 0x14a (size before relaxing) - .debug_str 0x000000000000184c 0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_str 0x0000000000001885 0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o 0x760 (size before relaxing) - .debug_str 0x0000000000001dde 0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_str 0x0000000000001e17 0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o 0x55c (size before relaxing) - .debug_str 0x0000000000001ff0 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_str 0x0000000000002029 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o 0xf2 (size before relaxing) - .debug_str 0x000000000000201d 0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_str 0x0000000000002056 0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o 0xf8 (size before relaxing) - .debug_str 0x0000000000002050 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_str 0x0000000000002089 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o 0xf2 (size before relaxing) - .debug_str 0x000000000000207d 0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_str 0x00000000000020b6 0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o 0x41b (size before relaxing) - .debug_str 0x0000000000002286 0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_str 0x00000000000022bf 0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o 0x41d (size before relaxing) - .debug_str 0x0000000000002399 0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_str 0x00000000000023d2 0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o 0x332 (size before relaxing) - .debug_str 0x00000000000025c0 0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_str 0x00000000000025f9 0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o 0x850 (size before relaxing) - .debug_str 0x0000000000002972 0x34 ../../LUFA/Drivers/USB/Core/Events.o + .debug_str 0x00000000000029ab 0x34 ../../LUFA/Drivers/USB/Core/Events.o 0xf9 (size before relaxing) - .debug_str 0x00000000000029a6 0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_str 0x00000000000029df 0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o 0xf3 (size before relaxing) - .debug_str 0x00000000000029d4 0x4e ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_str 0x0000000000002a0d 0x4e ../../LUFA/Drivers/USB/Core/USBTask.o 0x2a0 (size before relaxing) - .debug_str 0x0000000000002a22 0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_str 0x0000000000002a5b 0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o 0x520 (size before relaxing) - .debug_str 0x0000000000002c5b 0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_str 0x0000000000002c94 0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o 0x8d4 (size before relaxing) - .debug_str 0x0000000000002f55 0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_str 0x0000000000002f8e 0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o 0x54f (size before relaxing) - .debug_str 0x0000000000003142 0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_str 0x000000000000317b 0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o 0x6b0 (size before relaxing) - .debug_str 0x000000000000337f 0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_str 0x00000000000033b8 0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o 0x537 (size before relaxing) - .debug_str 0x0000000000003497 0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_str 0x00000000000034d0 0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o 0xbe8 (size before relaxing) - .debug_str 0x0000000000003b7f 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_str 0x0000000000003bb8 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o 0x103 (size before relaxing) - .debug_str 0x0000000000003bbd 0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_str 0x0000000000003bf6 0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o 0xf8 (size before relaxing) - .debug_str 0x0000000000003bf0 0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_str 0x0000000000003c29 0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o 0xf6 (size before relaxing) - .debug_str 0x0000000000003c21 0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_str 0x0000000000003c5a 0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o 0xf6 (size before relaxing) - .debug_str 0x0000000000003c52 0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_str 0x0000000000003c8b 0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o 0xfe (size before relaxing) - .debug_str 0x0000000000003c8b 0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_str 0x0000000000003cc4 0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o 0xf7 (size before relaxing) - .debug_str 0x0000000000003cbd 0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_str 0x0000000000003cf6 0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o 0xfa (size before relaxing) - .debug_str 0x0000000000003cf2 0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_str 0x0000000000003d2b 0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o 0xf8 (size before relaxing) - .debug_str 0x0000000000003d25 0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + .debug_str 0x0000000000003d5e 0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o 0xfd (size before relaxing) -.debug_loc 0x0000000000000000 0x4a7a +.debug_loc 0x0000000000000000 0x4b07 *(.debug_loc) - .debug_loc 0x0000000000000000 0x9de USBtoSerial.o - .debug_loc 0x00000000000009de 0xd3 Descriptors.o - .debug_loc 0x0000000000000ab1 0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_loc 0x0000000000001340 0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_loc 0x0000000000002cc2 0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_loc 0x0000000000003052 0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_loc 0x00000000000031e2 0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_loc 0x000000000000349e 0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_loc 0x00000000000036c8 0x27 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_loc 0x00000000000036ef 0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_loc 0x000000000000385c 0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_loc 0x0000000000003d87 0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_loc 0x0000000000003fd0 0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_loc 0x0000000000004122 0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_loc 0x0000000000004318 0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_loc 0x0000000000000000 0xa6b USBtoSerial.o + .debug_loc 0x0000000000000a6b 0xd3 Descriptors.o + .debug_loc 0x0000000000000b3e 0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_loc 0x00000000000013cd 0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_loc 0x0000000000002d4f 0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_loc 0x00000000000030df 0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_loc 0x000000000000326f 0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_loc 0x000000000000352b 0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_loc 0x0000000000003755 0x27 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_loc 0x000000000000377c 0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_loc 0x00000000000038e9 0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_loc 0x0000000000003e14 0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_loc 0x000000000000405d 0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_loc 0x00000000000041af 0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_loc 0x00000000000043a5 0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o .debug_macinfo *(.debug_macinfo) @@ -1437,25 +1442,25 @@ LOAD linker stubs .debug_pubtypes 0x00000000000010ff 0x12 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o -.debug_ranges 0x0000000000000000 0x818 - .debug_ranges 0x0000000000000000 0x180 USBtoSerial.o - .debug_ranges 0x0000000000000180 0x10 Descriptors.o - .debug_ranges 0x0000000000000190 0x100 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_ranges 0x0000000000000290 0x10 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_ranges 0x00000000000002a0 0x298 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_ranges 0x0000000000000538 0xa8 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_ranges 0x00000000000005e0 0x20 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_ranges 0x0000000000000600 0x28 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_ranges 0x0000000000000628 0x28 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_ranges 0x0000000000000650 0x10 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_ranges 0x0000000000000660 0x10 ../../LUFA/Drivers/USB/Core/Events.o - .debug_ranges 0x0000000000000670 0x10 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_ranges 0x0000000000000680 0x20 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_ranges 0x00000000000006a0 0x88 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_ranges 0x0000000000000728 0x20 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_ranges 0x0000000000000748 0x20 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_ranges 0x0000000000000768 0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_ranges 0x0000000000000798 0x80 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.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 Cross Reference Table @@ -1798,6 +1803,7 @@ phase_pattern USBtoSerial.o plate_pos_x USBtoSerial.o plate_pos_y USBtoSerial.o pos_report USBtoSerial.o +print_steps_in_mm USBtoSerial.o set_x USBtoSerial.o set_y USBtoSerial.o sign USBtoSerial.o @@ -1814,6 +1820,7 @@ touchpad_set_abs_mode USBtoSerial.o touchpad_set_rel_mode_100dpi USBtoSerial.o touchpad_set_rel_mode_200dpi USBtoSerial.o uart_print_number USBtoSerial.o +uart_print_number_wlzeros USBtoSerial.o uart_print_signed_number USBtoSerial.o uart_putc USBtoSerial.o uart_puts USBtoSerial.o diff --git a/firmware/USBtoSerial.o b/firmware/USBtoSerial.o index e19b913e8607ec2f57f4a7d3375226527c1c0998..09e575ef885f815bca42e407992d3e459ecdea3f 100644 GIT binary patch delta 21277 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 delta 19540 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 o!n}`WlLs2H$`u}pEMLbkT&6