From 36902b248745f1e3e4451a83a9bf92259a0e6dfd Mon Sep 17 00:00:00 2001 From: Timo Kasper Date: Wed, 4 Mar 2015 02:17:14 +0800 Subject: [PATCH] Unique VID/PID, granted by Alexander Simonov, Thanks for supporting the project! --- Firmware/Chameleon-Mini/Chameleon-Mini.bin | Bin 25376 -> 24444 bytes Firmware/Chameleon-Mini/Chameleon-Mini.elf | Bin 365854 -> 270402 bytes Firmware/Chameleon-Mini/Chameleon-Mini.hex | 3108 ++- Firmware/Chameleon-Mini/Chameleon-Mini.lss | 26067 +++++++++---------- Firmware/Chameleon-Mini/Chameleon-Mini.map | 3340 ++- Firmware/Chameleon-Mini/Chameleon-Mini.sym | 985 +- Firmware/Chameleon-Mini/LUFADescriptors.c | 4 +- 7 files changed, 16109 insertions(+), 17395 deletions(-) diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.bin b/Firmware/Chameleon-Mini/Chameleon-Mini.bin index 8a46d61ab5142db6071df1cb82ca778b05cbe92a..98c7e726011a2413e7acb0bef711d9b9cead9b9a 100755 GIT binary patch delta 16472 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

a(+U} zJ3T-BO#Oxzjr=p41MbgkymfxY1CIy0&Nn=GG`T;xO#MIW0UmJT=}=Dm(0H#y`Q+!n zXCYZk@k1+^&v%Yv>SUb|CC2>8{voE~`tKF_1(iR3c*7{94-WB)28)Z|Y$wkSF=tM? zkTLmch&r?Hh2Y8mLv+=v?s+`Oc+&8o>|RG}LrO<`XJcbRXEP|FaZJ_U{$onhg9mRu zK4_X89xAI2VhOdiKb!ZcuU>3g@8mg?#izGE?3vv3Kw?_YWc~f1VJ~~_Rg-6iW*c@3 zHcULl((+&A0BEV+DHcebCNRlHTVT>*mhBK*U;McXvHizg)5)e`_E~*`+s`*lJi*fb zfBpG}7Y&n7vGCkpb-ww*D`<=S4`ac!?g#f7WhZq_efhoVK~HmMd-H?7_C)Z2IrF_n zL6!rM{W2U=L1Jvve%|d+-uM~B=AH)f)yK1-micSO$q&L* zJ9_sr8yf|0pKsF-z0>gEI@l8+i#`4BfZ_$Ax&5#70Z`U$Xf&MW&^X~ii}XZJ(A0Iq zgS+P;^~!}t!|4YaU){bVzT)%eyN!Yu&p)}{@Zj9!!U)59!8@LJI+PnfL!7-FY>mQ1 z2W=IDm0$lbx^#wirgfHgx@x;=yK5(YY-{{^+xAX}vgJpR8yqHjY6nd8(*DKR{?`ib z28G5651PPkIQixL`}^-fDnTmbz$z3PK}EH}0}W|I&YK_3MSzzNb4=}jKmR=_j5wyQ zynRCd!ULGmP|g1zod*>Q3XKL2l(jX#cie_Jmt!hOw4rgrgOleurXmXGH;gQk>m#+p zJq|4R&}78qD+%~$KFwt2XVg@8u&Yo{D`uGi^;^Md0w^^XM zX5pvJw?Vna`!0yFp*=cB8(^?T%ih+nv1%x4U}fZa=*R3IT|F zuATv#V8r>M{rrsE=O#~#lH^N0|BnB^JnMun6CdbuPMN$WN{gd_w^3G5Wuoll8&N_0 zhwo=I)-bMlx8?m(#wmbeIT9=v({=h3IhqA~Jp>lj_*;{7LE#b{YRKD6e+h6gX7{du(gPz_@? zV;AEeMzJRGrsl@R{~Hd1x}!df-x()2eq)^cw{_y=|BVy#!6V1>CNGQ;w|jB%#rZ%T zLmh<&3PuaQbQ@)UF!<776#1dqDD#U#qRxR{Bg+pB#+F|c6VwhUC8#7QAJ9lpJfQwp z{eZz+3;xMJVl)`zCo9Iva~wQBLw|nl)R4(Ou~N+82NWk~#+vfxUesZ1X4GlbFIUnN zn_L^K80dXbhf$|hAwx;8nNj(V*?#nGbY4 zo$!F^K*#e554JP%9B9&Ss|cLDFkaZR@WN6N1CV)-Cp^f$5H;n;`BhWCFuvjiRo$RK zOT4g9;M;j)17bj0^xG%|4$1 delta 17518 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

acc~2f3y{yc$G#VI88Edo|7&vY~rX|a{7#PgJ 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�z`&r8XUf1(j;x@E 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 z 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 Vl3SWn3@Il;J&dBv^z_ss1^^wZ!zlm& literal 365854 zcmb<-^>JflWMqH=CWc@J7|(=(fuY8VmEjo!1A_^J0s{+!27@qz09bwtOalW0LthdE zvobI+FflNI<(-ll7#I{9z;crq7#Kj94JrpR|4K3g!z6_UFa{ZA&d0!jF3-Tw$N<8| z3=9k)43p12!objegn^;;2m?d&5eA0FBMc1nM;I7tk1#M)A7NmqJi@?GeuRO6`6vTJ z@eu}w!Xpd}`9~NSK>D(eFfe2uVPHrC85rIkW?*=In1SKtVFrfhhZz{29tQb&gZRV43=H=VGcepe%)oH_FayKQ z!wd}94>K@aJMFdRM1z;O651H-|? z3=I1ZGcfEu%)qewFayKR!wd}D4>K@qJkl(9tUb)Yu=+3q!^*=9 z49gEQFf2XHz_9o*1H;0@3=H!RGce3O%)l`FFayKP!wd}54>K@KJ#JZSu z3F}hU6|5^k`GJwq*DXHOCnU(x$J5;-gn@x!p~MY|PRU-$iIS5fpGbX|a$sO*VDfc~ zclL1%4)%18H}r-oGLz1f&XvxSHc|{$WME-oVD@#35AX>MHuR1+cLG@nGRYN15jz75 zl1U~olcJCn39vA*dItL&nwXdvJH`k5dAhlQ-GuINbkBioM8=_>F7ZK*elGsL$f5`~ zNZ!ZQEhOI4&pF7|*VPZ?d4x0rNInP@CO8y;F4MJVuP>_ zMsfj(B4e12cxQhFYKlU6W=V#EV_1-`yR)-`YA}PLsezG^F@vG8fu(^VgNdHGo)Lp;F#|O9sg^Q; zP_T|_FoTc3ql=TLAA_@xt78yI7)`*mR3SHvA*wY_1i2Vhf{r%iL-N7ye6Fq{> zg1LgBp6DU5Q*e@CkgKDMzn>3MbgKvn355oLtOIKX6Ba@s%Edq24_Vw6EE?n*?24Qt zoWP=?0q#MLE{M4E1&jK+`UZPOAw)r@MhJy^x?qSF2swp@gdlsZO=yx(H&is<$KMa) z!8t-Jgcb_xh6YyQj-H_MLcz^H zNFf5`VWi^Wgpq-PRj8l0pMSWYg0sJ`ucIGQFflMNoHQ~pwDR-|bM*0afhkZ34R(ZQ z##2THMsNiIjzNyTt|6{LVB4XDpo;vy^Y8CJy0`!Aet|~|9&C8@?!~8POb1ve@J?D} zxsmSNnjEq)1(IzCNnWjelTG&3sb{n1*VS24U-j_K3-^;=)usK&@kD9 z;m`xV1AJ2+2t1hhTjRsTKN_4<`KEaAKA8AbKm&o85pu!epEIvWL^0|(ZG<^^Mk?zg9i-{ zCOr7X*w8$&`6MI9RHcUo589qjLK2y&-e@q9b>W95gNdv=KXhtqet+`#(*u=>1`p0N zK0dGa*x*6OV`TNO9>Qd=oPYEFBUI(N^YWAUC-HCNpCqXA|GdQ1hKUsn&HuR$bUbL7 zT*1)swq-vkOd1&ePW^YFVPXJ7TSCL+0EUK%feelR|C|TWP5=L#7nl^rp!h&xaspU~ z!ej@A=C>0bH%wOJnlM?Ns|^&YTndw&8JeF>c+fDJi)F%OZkC40JS-C?^Rg&RW?)g6 z%*4_#@eE@}Lc`=Uj2u%T_P%)j;Xz|FgxCGBVR8cl$5c@G_tk^Kzxz$Y zhS5Jh-k(WdX#NLA;rSnU1y!Dh|MgFqm?+49;0DR`*2M1(5AIJq zKT&=n|3r?dcNl9XmMeFDP8WWE{uU$af!c}X%7LHDgkPLDoc5LxWWu-e8I6g856(B} zFS*}{q!VQO8^*+dLQassOdt6?vY7vY(GqUE%0wmQ#t(^xg{&DL?lCeSNH8p9b^M?^ z`7NX2G>|TpiHd?>&$k*(WL5kk(FAf4$5hYBAQ{GKx6X4+<(aZimt!i#mty*9%9@-Ef1DSZ|9!HxI}y_JI9x~jG)kQ{Gi8gFMo%zaboXekdJSE=a_n%ab4Jc-vi?geS9qu}IgL&EfdY~~g(nJ7oogA>)XUW! zu*!An&(dG5zgxXw@&e9=i3>T~KxNL8hRF*#8=!V#ih}$z;R(n+Fu4g(^^KDuzU=(o z@UUTWDjUaCP?}@7z;NO0_IukQVxV$Ajcvw*36oRVW<8uRIgxGtg9($DaSBXY&N<=D zgvm=eXFQxRc?oC3SvW{XZPRR z4@&La=lv(ePs*QEKdFDx{7LI4?Vogh()~&AC;guUE1wW4Aq$=ovZh}A4hmt02Oik#vJmtW{GkVwG?$uLxa!JqN;bJ}aw^Q_jpStR$ya>}Pevz){sUM}EtzWL*s%N49 zobiP8MNS@ZS$2*uFBlh0N@JUVlx{9e!c0pru>+GJX$hpq0gIjnEMg^k$f*iu5-2=j zsTU>&GX21$G`0;`Ou?ldl(Ipt2_RArHgiDnjqaBDj0)2mKj`q=$~#U3x!+;pLQc2; zf6jy4>M(HuCn {EqBmbQK_*(8WON-Tyy34{~wBqy?Pl@}TfT7c0P`4wu3qV&)(1J)k{`Cf>z@A;-cPtc;rxXC6V^|dKcRm@{e=7p z@e}+fL>|+hWIu^eiUj3T?dhNt+}o_F7s==-+VUWRJ(0DLmE%L}K}34}1y8TPre6Hs z!ar4hnf!KnP?`mmt}N1`+-ltB+^LKYbw28xY`WF-y6I07kEkrG9;-bo$Cs*uoQ+bA zU_X3`I;h)dqzg&u4<4S=`~G&n-h(Ii^gcXXulM}zJiX6P^Yxy*=+o0`w{G`qj&IIr zuWUEd@zjgb%hoGban-fZ-_DpJUC7BMF3!&J!Rz1-##gPsTS2ivYRZ4r{<|Hd&tTF5 zPLLU}bORCxr43Li3`#G!mi>d|rh*CBa?^u}3pt-b^VP>VpkpIxdK&G=vi*vW}PY35GP}%~g#t)az`8CEj zX0%qe-U8S5ptRZ9IIFRXf42NjMo`_pLVPFt&F_s5wBhAEsI7=A*V#|dpTIE{6gu0^ zaW+deYd708H=aYT2QnEQMO7XIf%BNdSM(eN%0IAtv*CkZSiJ8+k&7&zA8s+8;JYdJ zhp~5Ji79-xXM>K;%|UjWYOjRr42G#PMy2|dtk!1<-* zK#M`;$5sQ*FH;V*8E}5te4yQc^UJ0K9R{3VIu9&B^EIfyz^d7y%=u;UfsZHhg|Ckx}!*L?+D>jGR;No_{d$zs84&44M%2ATfoB zteQ&7iJyNko?~R1rWnw~KT%fkfs(S}2ZKh%2Zn+Q4-5kgnhmFcYTAY0Z{Rc`@)NoV zmS7X??KwXvJg|?4nKASGHXLRcK2Qwc__F-GvGUE&P5Kia{9t^+|5M(f(eQ!4J?94l zDBnNcp;<8?eiq|MQSANk9MK!M6tu zPnw!L9=3IZLYafD?LWtXhKZ9@8UwlvR(uecG)V;{K1rp^AmBrn!O8Ei9#CT=&wY@( z{`iK;AT==YhDL__PtJo{WQd-L&7(hz@A&`AKbrb!>WBJ&>JRGwslST+;}7kh7{U7| zM%el%9Vq=1OKAV(+W8J;$q$VN6F+cFO_X zzM$R=sJzhNx0HvJ7oheHsJ!5q+VFs5>f@JR9`(O(oIK;vV@pu4rTOKQM-7uFYfP9t zMWf-tlm`uyr)o@?JWT_X)~0Gqmwbx>LSf=m4TFi(G@j^xcyOOlXquL|HG9BEr2s=tJ!yMxg~?Mj3?@(0crbCY z#)pYhG#Z*6o98p?#oPNUOrES^FnNkbi+*E(i*nA9|BZ*^Gvy?>-;$2LBfNA2b~XQKH{0eV1UZ!Hh`pc`AMKsT|!?lK*GS_ zL&F392@o?lrgk>(yeTl5Q`1pD;K3|LC4OUhP_G|M$D8>oOy<%wn9QxoH{~d6#{Km- zIvX?e6XTj6*k5c!GDBe^r>4OJP`_Ngz*xOWAH@0zDLwc<%Y#ah=kecsCp1nJtT;eO zMLIzhVFXpU5>#PAP=zu<6+#46FdpET+8=Ls9@IMSkB9Vm-!T5T-w@l;ED0UE`NP=I zII(f2vfu|$o@)qJKi}{eRKkNs-x?-P*Jv{2{E~3s#D``>#*Z`fCj`wf;P~KsV8XXtP_8sg{IKC8sGrKpCNOEb2Iql> zi7ad_|LqTe#Mr=M5PgcDn+-j_G#IY@aNz^U1dw`=3C)H#KS1oP_yV(0@gvASj;SDZ zATvPf8U-OXb|~-s1hVPMd5}%5f8U-5sbXd0m0cyhvl!SjWfgzKTK(y zAq=W7rfY!685-ZAc^Nb+1{!6;oxMsp+G0lX@vYH8#Wi%5eD{Cf9R?ZXAiF^J zfb0O74>H?I^Tzq#j15ML9~ulhQEE!jX^6TqBcvLwt`tG5D>I|!NRE|n$`Y-n2Mv>FX{cREKiV)cgRS-NFQ|#l zU~!JAi4PkeWS>iT*!Uph9LT*qQ{1&7^iCc9_off*C+knvfYORkTH`fDT=9YaWcf++ zC-+b0o5H5oyM5kvo@u@N=k0HO#xYg-oy8-NUeyO?U^6h)a=_K{O*zflD9Ci6>kY@$ zO?O(Jf!aBR5BR3=uz^g1)rFwCX(71B(ZdL8@56cl=NK8MX)flRs=3hM!8-6*eZqsn z2PYW$ri8JzK3j;=6R)L%OIaih*VmB&*) z>b&9mE64Ca-~rzh8@BI^5BNXIH#Bda!mTUt0MyG`0Pm+9XXKpP@(jJV0~=Z4n7V>7 z;ZeZ@gqg<~`KHWZ>k*yH`teiOo5$x7GS|*4Ok~qk6l6c3@c0j-Lh~O+!6s0sD5CKG zFe)}G3bGz(Xlyig{Lo-5_yH7_0+ZM@L7@psJrGvg)0q#JT<7ERtOswt zJZNm}t8Z+Eq^B5GkREi=WU%Pt2R|PvHtJ7SXw;vqPejau;z@pz{$!fmoKeVCiGgZIJ6gYIh;2ZG6B3RonPL8LqYmu9oXA$Rwz_kGjFU zJ&X;H7T<-LTLxGA_Q`WqkgPnMr_fAV>FPJ`thP$>c_hu$#eJc6a$#t$iv%iyJ} z;)kv`5Oo^2TAo2zoloXI*ma=~$^-e}FxUsDZo@+4?JZD9^Gy+A2ho`MriStS`wI^Y zpB&aRdvICL=g}6uHpXp?4KG1`3{ZKm`0*QK%ft@l&JPETF0vMUxX#FY;DFIZR?iQ; zlWV~}eZ}cN7+WSb3Vu2NopIx&dPc?R-yWXlyC{Qd&ckot84afkG_``=3Tn|JMoT!R z{$W&@sKBIrK zsRqYX^#=-*XKUy@G9*In`N=2rCrq5JG1Y+cOUr==AEp~{e(^bw@Ks^rN{xnzb2K!> zIlsI)VDMnV1IFnZ;+E{3UqlXOJOq{BpgK%o(rk^!2j?epOr31N`6cGSjt>(aI80or zq5t0Cfr_*tXOsA3cFqs^2U;IAOa`fZb$*6{$S@bfVP&M$!njv5+%PlT&Zm^eoR z<~|TRVJe*WqToT#-l%s<~Sd8I}R)QuqDC`??YVK8yI#!tp4G2eU} znolw^PHULFOk=|2)#s@yJ1a;X-t?nUtJ0sfA+rn>K1>LjW%%JsLy*G6 zRT>5pS8M3o8?pv`fu#{pZ&P9NDh-3lt2Ge4QvQjMvII2S!7+7y%q#VMX-t^7T7zNw#ZQdW8z!&Pm@s*@ z#+CCACa%)>Fmbg8C{+qH!PGZQw9)KP&ivSK9Qm==*z@Dt$3Gvj9MCs5{Ge;B_@SOr zaiXH&kMrLd1)4xDi?)Y1^e)T`V7xeQ1CO9e@W6}bFt*2mmoH&# z`vb3DL)eucLH(ezTm27aJSe^;sLc5#>paBuoL^GUgIth&tLfp42dTH>&I?Sk(bPAd z`9asX@S~ElWV(!n`Z@WICOUl~iLeLfE=9~~b# z%|F2CJbwbOph{QVbpI3QRUQ~T_;OzPfx&~1=an89Ja~6r@qxjE*XKbqK`+jKWh{c5 znEB~ABjYrXi5=%TrY?B2?LpH6!D&5{1*eNn>zOP%z31_)M-7vAXiS*AQ={iKh`mc= z!sOi=0+Tjs2u#|bAuwr;hQOpP8UmBHY6whPukql?j|T#a1Q+!_n)sk?@$|+0@8`d7 zSUz!izNE)nNr`D09t{9Sdr5|dH&@0lmElzK`U2&JP>Yb zdpY4j+v@47yB(6D~u`Ug*bf^7oX0J5p`MRRlCgNEh@kG?$+YWqL&{lxhb`zP{G z;NQnTL4Jb7RD=!slVNsDn5e4&jT7dQ_JYI@6DDrd=#QT^wLiYo;Nf?eOC~gfT(C`J-}wm-CQOF- z3sfFYJ`ak`&F6cbBTT<=Ug1ICdE{`khlgat#I+ir84BM6D?WhcC29^Rd;TVI zbRB^C$9^KRk3jviA0I$-9AO7q3^KoiLbKuT_5%%18Ya83f$Gq;8jsF*8gPDzKG0?G z@|(aU2Tp-WZkz&>7&t)g-mY=^Jjk`d2O13uzx6)`m2;4g=mV|4;sBZB$_5IHwHo`* zgG`_Bq~UMNfeDjc+1jQyfa7YD#)OHR!Ev=oW5VRk8gm#yBW23koL|ZhC`{am*7eyv6el-Kp3Ve(py+VlO-5iTq{ z|6t-SjSmxdYcw=A3Yvla?8>Gvag&C@#Le(D1ZsgOelnc)VDc`F50iJpZ95OHpCS3O z5o|NWHQp$uvV%=^V`~T7Zwq#fE87n+?Z$TU{DjGFY}H_%E1L(neqXDh1s=nB@Z{Tr zmIqDELR|-5Tzt^*}%9c+j+b^77_Kjm@A|^RctA zzG%b5Z5kcQ2R{f*+NJ?&RVcDGOjcuKn7Bnl0F;+R1zBf)c`)&(#)pZ&G&rZiQo^#k z4HLI(Gzvx?0GS4A$%1-0w!tjHM?3y1Ya%ko}u6oq)h;wT4!?p)}Q`Yl8 znD|%Y!^D3YI~YOb9Ou*?#wq`84#?MmW*!Satzg7wP9xZycCa}NlecIHOa_&Jn=}L_ zZPoyphON{DrP;L_AQyvD?XvR%leTNX-0gUF+SK-`Fw8KW^UI#|4i7*jHmJV+>Z{Pm zq^C4hL6u2QZK~Q-1=R-;|NS9jzly&@)dPMW)mM0MNk8zxQS}4O{_!gM1`j}KhvV~1 zaNB*4256MLVKRv3n2MNlgslYXVf@25p|N4&9u3gEWAuTBFVl=xew<`F^CQRwCm9iI zXh327e*(u;(41t(muW_VA19eIew=E_`DMZZkpK2*fOI@N-)bQEJ>g-&gA zeV}0?8+cwa{{Seh?$PLa@Po0T8B|xDKi~2M#1?D<#rz%(g@*PgFx%UtJU=(NqnX=~mG^3lJCYhf6G})5# z!_M=PO;SzLO)^a#FFKo@A3#RyL35dWQ|_^WbT=4rerY_=V9xoW_xumWNsXP2GlVpK2Sp(9$$K;! z;eN?HpD=N+M!|zL{&IN`c6ks09y$5O)^Z-iPI&;DA7Y$_>od3c2u^|cUHbZb&?>PVe!GBSXFGc6`brCLccnERHJvK2}Y)Ad{e%$@q=|j-1YPtD6VqgI#thqn6y`; z^}+9R5c#WM`Iz$plOXBm*f~g_9Tsn(&;pqa2|ea%pj^W<GJB!goF;%1l~Cm5N*egMg5 zfaO6k_Kl5y0&E5cv>FwZ-uG#=fZNymH6~0xpaEJ#d{9GR(jjPm+o#d;1XSiD%Qilk zFp*Vrx&h~hh6fFk5h|OI&3V``8Py!n+!?-=YoIYVJ?L0o!^C~y+W6vuAK=b4{k8_Oa|q|i{LtY*@0ezfNwV#|4iVUVyx1y3QA=k8zAf( zjF48Q&@_Z>Q}buItnjp+$->h`kYrn$zrtlfZBtN6IKjB{YNO!HLwr+8R3<){q5gw$ zLNh1^_Gy4z(RUuyvT!=sV!-*K?L4~s{lM<`KG1B*`C;n8hKYwXKq=JZFf7HvN(xZv z0dnn}i4%-CzZ^O;!JP9${P`P<+%WKI_2@ z^&5*<>%HKZyV%fry;l_!5}@9J(6l=fYQZv1&6gW0z%r0H>zN2L`|m-J+4+YW zY&gHHKh$W$`Ni#UlMUw=&VvosoL|BZH-t4AaC}&P0FwK!T>;sA{vgN=J;f6mCzx@5 zaX*svxZpuFEwonD3%Y%7bH!d{gY%Kyg;b2+}Efr2D}OzK=4X z+zZOhpt0Y3Y;F$%9&BXYBagBs01rJ)@ z%y?9NyB(s21&zv>M}k!d}XMW%~R`!nJ6HBi23ZT{A93@jryt!J{>bn$6_ChP;tv^T3X zPMCN^LsJ|ynguD3K)GAs94x(qVjh%Voxthc{y>8%=NHcNGxR5fO)}v4vieYiao~pr zE5{EFHijP>Z4^H=*$94Uu)g>WVpa=0Pd`7~YRUP<|DeF6ec&4Y{#i(!2g&=O{C4eZ z*8@m>e(`L=#KRf}50k+&@UVL48{4*XHyCv$3r?Fe8IiJgpM|7>E0;krdG-J(4Kz$X ztkLtJVe&qWo@=l)46n+H;3sYC-iesQiK0KIyD# zQ@H5-go(#BI)(Gjf0%GWLjfF?J(EFfew|NKKB(~Pe4FxZ$_Ev(D?b=PEh~LpSlg;Y zrQyd!osAE=)jCugnmsVNg2xFyWL2s{ZSje=xp7(SJtez>kYM8y}oj>jCROt#RloC`B|kf0%F@P4|w= zKN#Pl=uT5f_)(~1_#j!WO|=19GAcYWc*qEjpA8SQ;qlY+2DFdk9-G3%Ga3yOFK9GO z1&xE=KXB&iG-w$TeD>H?SQ!h7i~DClas1(7KHLmQjXDilqrbV-p=|j12V-I*x*Ayf zW6h-uMuQii9KBHI2IHOyp;xB|!2V8n<2p69bnWh6Sy)}e$&xlUb0hity!s%z`K+Eo+OKsqE z32Jx6oq?p>@=G1cjUS-4Og^ju>ig}}(7y^wxu6;e6j~l<)WM+#Dvd#W2e3;)>qn4X z3Qo^PoL}aF-Klft2cuFW$c^e}lpDJmHH4MVs5EvrY6#1pQElvL)DV_FGog9&d59}a zE`joo?s>2olMicjKZrlqF!73phOq4U2NTa~G)%mx(J=Leu-N&AiB~mV2n(HWn0QWO z!o*7&6Q*_wbDy6u@tQ`bF#CCfiRU#YOuVcyVXCDt!}$pluWMKe|2gL{@rK5Pi8nPS zO!XB0dTzqRTN<9iAJ0vgcpEJ8=G+a&ITHn^{h0{bm*O)~XgZ{|y^Aqa-90uN!?hTVe&Z*Z~aj9H1OVu^BOPoA548P`GUq9T@Zay;{lj|N#hBazO2zO`HIGY zNmn%(CSTKVn0y`FHiML1ji(`DHtQlN%#6+>;x6jJSG^CD_GtuM0p&7Cd6ETH-3(SO z4X$Au1^L0cawcNtqHk=B&^XBg>$rFTWWLTs!Rb21Jrf(uIKSLE(Diu2gBZpQ54GWS z+w%wKu-0um4*Y)bp2E6~_X@Ff+mFkTS_@yj2CMzHTm;o^w@g)Fx z8U^2+X@u7tr%pja`|*Vi<%M`lgvA#?J(5kQ@b^d-odUHaLH(84jgy*n8kL(TtItrM zq&@}QUzvQWv$3HWB#W&#({gI|gO||I1m!+ROX1aNNL>cXnZ>89A3VlT;eI~halwNf zryCwmc%Td(A$h|HYJY&n*g<6u$gFeVRezvf38D=NYI%U32nS>3o%SzWUkqz_~+s4oTThk#nVkkSIw4*~UnIHo#GWYvV^ zHIOPu--Kf-Xcf5Q#|-{T`9F-x&y1frPIOWac<4I+0HdJF68#nGUHTIqMCiMygZ4VX zu!nl2y0X5px{A7~`l6}p3$)aqiGODo{60y)S${$^XjRl7#^z^}pZz=!GJPYJOkc?u zs@~8z;X#Y|RCdTpEXT%x2OxJeK5!BbX5aa_;lbDQe;A#g1v~)xcA{yrc19;$4jg6Ypuv(VtMLt*=-&NnJ%>p=gr2mcB~mBz1j#1Ddiq+$ zlhiHsji%ZcSgI@QgT_#l)hFpsn+gd%NJ$l=?X6ulHGOLMRQIWq)F&3q5KhQgF!{d5 zhsh5#9!!3y;V}7*M!@8|8VQr{X@F+DK(TmW;$4ji6YpuP)L&n);lYBq{l0JX-xqv% z@F4EL?}ceS6BRm}v>!~oqw#1eOjMz$^92_k9EiK`tFf?2d(zbT1uOM8JXjF5 z-*?W$PVE=^A09l2{O{Y)2#ICn)#)HR|1jQWe8o7ivEc#8tcJh62Mr!H{_QxZ@BlV` zPhI+g`g!=8CMrWhov^f(6r+2EK zY7m+>XQI&blWG@rKzk<281Jf_QMsYj(Ku&fr}_!4?nY3Xpi}*amcXOvdmQ>bx{U>b z_r6VeKIQt9<5L)v1wUj=`Tj#Np!0i2V~=V_b7y0(YG-p-W1nhQb9ZCEYBzZN7&00O zSp~!~RpCkWd4nfm=M|p3JZJFa$vK55<>w5Z6v20QoS*!Mv9a+`1FDM}8c%37H~!E% z@JRgLcE)9ljs=i5MvMB%yD;}04CwrR9y+smegb552*bS-`V9}Z-#w$u`NizOffqmS z-q3G&u>S6`sTTzgWPAkkRzP{Lz`TV}-eWLt7L<1f%$p45T?O-cpuBTnUhCZ+{kEwW z1sgIT<-vgmC&6{l{<|O-l-)g}eDTAH2Rp!O^T9e#By0rpGN8OwU|u5BoQ?#TIZw~y z8&k4jJk7{BJze|c$Ipz58V@vXY`om4rLS9Lqz@`bjo{^|k-phfUwuePTB4t(4r=v9 zYx`(t!Anykb%VbJ8AtS6^`_}9*W0bKLpPi8oyvceHM;Ejg6g2w-35Kd=^fubGdeUk zHXUkW#)w_ed@^kJ9LH4HxF2ZL>kW9+OZ#%eWJhg{%MFvAv{f%ROm@~*y4*0?MO*%I z!(>-&nad56-LxeyH%xZd7Q5Uq*+ZLeinri~%b>M16DB%pH%xTW2F+gu9oPUKG246q zH0v}2yx%73z?{n+%7PzqF9%$HgED5uF}2Y^@dL+~j04REncqRPfC~>yGI0FfFwt4N zQBeH=!$enYfr)O~`~`yQjG}_9H$OG#f4u~<3p6tI?7)MG-r64~`e-*ccGovHx4dYW z|ADa)yd(W#_!nP+CYXFfV_$tkbHjt{m$WbUU)gbfqTsgk0u!CJ<;#^Xw_mBh+@bvP zv%uuTEP{e%2SELC2km9&Cqzs#;P|lUJjg8*Cc0?%*eXAm#LoF8{lGd#*O++!go&=& zd{Zv6^e}?v8v4%vyR?I`d+nUH2QHRhYCk{0g7b^}fk_se9~#d$Omx-mFPM1=<{H69 zq2Ge)0zVrb^j~^>sZqc7Qp1DlOU{>^u4JE|D3}Sh5j47!a{kICknIhVZM03UG)%P7 z2DP>m!K42U+I&;o1%pBMd&NRD&ivpo`4r=0eVA&6|8LHNYH9m; zm}-yj2d2F^AHTog5@;+6)b^Ti;l;%t=Ncv+W&!Ph0gYlfXwN#|_~7?>r%U?hLFGcj zLTJ|$nCPiJVWOAzAIA65|NRvj|1ds? z`S0J*s3AV#WBtXw_rHVJws-N)mIa-qq59yGUau}F$0JHhP;TOwnt5^g{o2cog31RJ zrWbxznCPi(Fwsl6~Ah5A-n} zcmT>9oFBXnfJ)Ms1E3HDrIgSEpd1-{;O<4xO#A1Hje>p$I4^Z5SAGVW*ZvnYCJl2j z$o~%-ATDoc{HXIn>LUlp)RiAP9=s6y$kOrU86(R92s`pa=S1a;d5nw!f}H*DUr7Dn z0;%l$e((WAp7X-gCAyGY!uWuu2XD?Vxd2+J zQgy!J!842yyrFkeuNxYM*Df5G=&pTXqKEbY@r&#lA0V!*Kk$O_tP192h8{qqCr~&tG(yrzfQ@z+IcmO5zm`M&jhDL!08^NK+df~u>3lHkRp$99a7EJWi z-Z0TidwukN|DK5x9yB#iZfc=ZI zb4*3gGdCGmf@CMpkDt)YF|}c`ueOH1enFCc!GkF;H0MuX6jV`)Ht}_sc#I`r;&GPt zzd{ETCVOfdO!m?~&Db<`($op{Gt?XEXQ+clLK-G}YfqT$qs=i@FB-Jd3ZgD)YSGk! z`ZD!|`ZD#5_SSi!o z_yDx03#KCpNk=OYIvO%Ok#w|8Z7hK8(}Ty9<2L0kmUVX!S3c8A zQ|A2Qbs&bZhmj{<-v6V{RmPZ!p~@#eUS$-V_IBc*i9*wFFbYohnFyMNYck;Y;(TDn z!;Xh94L-64e9(9RTD3YqUWwmWUQgVf{le!N+N%2c1qKg5=jfz-eQ5HL)#K~@I!8h6 z0~1p2>G|nr>bL4QL_{{vYRWUf%zo!0z+N zKIMnDgdw#^!-G%fXFTY5u;;v^f#!z^87|75pYG}1JU=1lp5C?dpjGe78n-t}PLr7g zq6MLJB$N(>(lep-L@0d|N?(N1%cJ-ELrehWXb5Y06iAG%;d|o)-S<)d{Xx08VWOjU z`(KU&U+y&u@`6j_M!}!wIi_B|*C@z_#D9I3`5a`A-h+w9SUyZV&hjAYzyE>8i;W`B zz-hap!NTz4j(d%QYG7R*%9bBn4FW$Ra!%7rlS<39<9E30gaFOoi1GpfwthdYWS@?EDChsmT{IFMvW3vZJ7(vA?{b zSzwaAHmJ36e=_J?Cy}O>#>Rw}X1@y|7Y@9+@}Q%!zr3Tlqp=~Qqgh~*gSNmV8*PC} zcG?1yY_&TY8&W!&JsxB{X?T%$4@^JEy4TU#kkZlK+1QxS32u2q%(mbDW6FUy7au4+ z&}x765Y$du@Mg<{Thrc5zBToA;=%UTj+LnC&kdOM`H?_C4bD*rvv!CogIev2fah;IAq2&O^h0%+&fDHc%cu|v7=W6Ohv$)J{{qaa9K%YPB@j=NJV zpmrfF6b`d&gZTQz`@0a|zrL${`~SrE6ZcPC4_-4^KQVt|{6znWsB6_gZN5f9QScfU z2ko=qRa2)}K%vVw#YJ%Y`G$!nSla)uKi}}8Ve%=KU$<7BZ+`F!+)I1I=rHXMWA}sm zjIxuuroQ~%^q{A?v%UF2Uwh&MP@D3{-9|x{1CVq9+JAhGk!{+$yB*3KKZE4C!DEKc z&Vt5$uIV4wSD5Iatzw|~0g`$^tMy$vLp#$t%R61Q-L&1cXMS#MJbY)Z{vQ3mjEoZ) z6kdMc4?bZkOS+mHbn;WL{v7Z=sr{#r&%FV)JRv4KLQRIX6+t$zbc%MWb((iFYBOmw zYgc}5Y@BolWEN-^6co2GwNp>Q`em@OO^{nHKQzJjtb$fe{9!~jukmwZV`g*a9ayaZ zX~iMhpP7v_#0@@VHVfTRzn9tAD0uUHo4)g%h6h*Sr;6dX4K;i~wi(|6rxN)8VT1yEuUbxLDzTxxZyN!Zp&v!PTyxrM&@;sAhd(EdawllA@9vV9obW(lqN}#SL^o~FDl|jzPCiH~0oCwM+Kon>U%U@+d@w%HVAS~? zRAx6CWq#jtn*~4 z=XKY2Yv1nZ*Sy`?uYS9$U+nguI}l$%>|A@k$%yld$$@4g&JVlJLu>=}SXyqsxRWr^ zSsPjHbcnna=ZB@|OKxAh4eDF>bpGw&>y+>0xZSVIcDq5J<#wY!)9sF4hTEOJ|88~l z{<(GJ79t<)I|H+!<$Un%?RP+ZU{DXdqkCpIvQ0_nxBq83z zGJgW^lKBn16J-TeIHoR|zkzY{`~!@O=QCc|G{1niQC3i8qAbT$^wX8R zKwmG!F?GxNo`(}2Z9EU!-P15xMq$EaS%n3Yp@&IZc(*ec_ykHTK4eK6kc<}nczeisW@pj5}_IJ+c)q9}R%-Jl}JpDh@frbYY zUNBDYZJyVBj?sJC8ph1ts$NieEO^1UF|INEFV_M6MvGR^ECkP&S&TmzAMt;d7iiL( z_T<5{Lu(#vc<|!!zel?c)i7o=b}{~86l)T1YHn=&zw=;+O7oP7Iz4=I<-RjcZv4hL z`ETpQ$^RQC=7ZO&EIrt2WcdXl)@r2qWjo`92OloJI3K8EsH5;e!Dz*oZllBx8ebZW z0zWhx6@KA9&}(G*p~2Ymi(-Pt0i^_$1l0o?3Caf)5)}`q|5ZO=p>GguWl-@&?LXUr zUk~Ev8So0K1nUVO=z3rQW*h4%B=H>RGgADb_BZvQLJHe~9y7r&3K>iXI?NouAiEIM zE1RJ|HDt1Z#D@t%lMOV!fZCz|AOCFTJVz;xkJJIy1KSxJ9!+=(bi=? zP^H6opj1cYKktEmjIVe<$~H7M7z=*Utm8bO^q=iO@s#2zEC-tO+bTFe6i-q9D||rV zKi`2Uonn!QFTp(F62&^~&`{TDpL3yjicV{>$d1n}2Z}`mzL-le9x&8V`7a1k@p!@m zo%ZevI;~3oWezC*XFkyJbixCs10ByNJlM|21Gb^@gW_MN0}YQD4|G3L|J(Zr6jwzT zz_I#x!h_rkQB#(RocO$I$``OZw=;rjo}>#41-_jJt9dlxLG%TyDTV?+&j+0Q&ZyRC z-pF)7|GoYDlZ-mk9zEnf_~6aQ2g_TR|NVP@N$ZM)CG80T1^%DT-eEk=$aFw=BI^ZE zX#px5)bv3r&0Ed?{ylHfYF=;BZr*D6pYwp(W21J9wE zRUa$0YrHjlpt9e%opBndZNxeuF`&SKQQ*e+hN%;#g3g-+iGsx@po+rUMxb%N?#9Ny z%m?`2%fFX8(Da}8fL^10V^8DUMo?{;^5sS2&ql_{FPeWgvmJQR`m?n`pL1%bw&VA{ z#`%qm)B2j{H=h8P!JyiWW9l!)Rq7fBfgcqN8$Z67l0P}GJ}(}UR@eJ)d|-EB%LAJW z>HHP)o$|Bf7s`TWg}dY@$}W`6;xCkKlm)RAE^vOym|{Os>w(&QK@|f@gIL4K_r9HH zo|Gy1O5vqzkfULrte?i5bI?u@xe3J@UKIV<7B1_E5E-wzvaQQsne&n zPc5ICK6TgBliwMpgHNcN3aV?k^w_3=W>n3ms)OZ{_>1LRJxcx-YMzZ+@O>5IHzcJ zSax`H#JA+N)VB1r%x+oLva{tx%l(FT4SySW8l@XoHSTOY$A3{4r1~u*$JB+7r1Vxv z@0R|{$a?^E8t6Ou|MH8(H?u!s|H`iLVUhG^?kC(|xzps!I9MZ6P2Q1A_~LDFX|H$>73Z2KEAo>%w5pzyo41fYewp2*BBv z3?gv06@vtvZOtG9XWK9+z}dD8DsZ+P*exKg3xhp_4u}CZ-+{pZ&US>m&V|8=!2&Ms z%wPj&yD&Jw*{%$*gS}lC+!#FI;_eKvEWUvtt+*z}c}3OW^D{h81vjJi{6| zJAq*XoSn!3yD!FtA&FrJTs)a!51gICZ~)FuWjF$7r!ky>v(p*Qz}XoL7vStnhAVJ( z7Q+oVJDcGSoSnn)0M5>3cmikVF}#4Y^BLa2*#!(A;Os(%FK~7d!w)#SnBfncT>{BC z;CL)$U;*WGFuRO_1I{jI;DNI%7zE(#N@!65$`@4(5^(Wq1{pZJhCu<&u4Pbxv+Ec% z;Ou$^9XPvz!2r%~WH5oVn;0zM>}CcVIJ3GIC}=e1UP#p!xT7s7Q+lUdp5%yIC~Dm0yujv!xA`q9>WSa zdp^S&IC}xZ1~_{m!xlJu5yK8RdojZvIC}}h0XTap!x1=p8N&%UdpW}yIC}-d1vq;p z!xcDt6~hfUdo{xyIC~Al12}sv!xK1r9m5Madp*M&IC}%b2RM5p!xuPv6T=TUdo#ly zC>vBBgV>-tL51M}xb6UD4Ht&PAPS5@Y7q6p4Td|QdJddNZZh11vu`mxfV1x~Jc6_D zGCYB^?=w7uvo#p`IKjp8YvUsenVwl%{nxVR6) z95~yLVIG|A&#(Z_4rEvaX9qDXfwMyxmciL!3@f4;82A|xZjfh$)Rn8?YU~*hYzKxl zaB(Mwb#S&b!v;9pg<%t%?aHtP&URzi24{OP?0~a98Foc8Ftj7NVLH?ed*Etp84zqc zhJA2x2ZjT1wj;wKINOQg2%PQAa173NWjFz6yD^-Cv)viaz}X%Q=iqElh6`}E7sDku z+neDEobAhS4bJvwxB+JeGTZ{OnGj(szyt}~J0NjzT5@1OupJrh!Nr{!9>Ccy43FS! zSB58Wwj0AUINP1!1)S}{@CwfMWOxH-`!c+Pv;7%9z}bNepWy5uhA(h-FvB-EJB;B+ zGy_8=l3zNZeu1P^P+E0{F&SLoEfSD8;wl&y2FQgjAcded35W(^P@4oqgD|K~0-{0K z1>S-InS;381k?@z$%C*9yk!GYgSa}$1=`Aai{$3NP&faA`^%C6!M0-f0~hyZ_y=eE zGQb)}AbXjhjUhca-*Ffb%CBho-2Gb9aw+z!Gn@D?7({m9{i zxKjqyHUp^zVbm~z--g2gat}!UDw17KG3>GhDFI`!nb1Za$V?_U+n<32&JJK;gR=t} zINb zK-=>WHfkFlBnHBuHav(1VbrjNwUR;MjGQK6EoP87a+rI8i~wU723%>+A1n_dTo^FZ z9z;A8M1ipjLpYcQ5iSh5Ad2AtlHV`j^*gMG0CJ}hSTBe`^{+Wd2#itvZV46x5iSf? zAPS6K7_7lGh;V`TEpax3~P|wwg`VqPI6H^I2hPrA@Po7S7y{tzLWUqXyNDqK z&MsjHgR@H+BH-*YhA23@f*}UZZe)mqvzr(a;Ou6GBsjZ;AqCEEWk`dw+ZZz7>`sO( zIJ=u62hLv0ke9%~pvZNF&(H&BJ23RY+0G0T;A|I$NpQ9+!xT8%jbR#`?anYGfq{Xa9T9Hw?2vH#1XmNl zfM5qQe1VGxF?@rwgBgCn*&z(S;OtO_KX7&g!#_AXiUE9qCAe)9!@vZ(%o5CwV_<=^ z;~CiC>;wi5I6IMn3(ihr;DNJK82I4qR0aV!JDouY&dy*EfwQw1#Ng~~1_?Mjhd~O? z&Sj8+v-23_;Oqhh1vtBqK?%+-Vo-sziy745>=FhIIJ=BN3(hWQ(1Ein81&%mN(KWs zyNbaG&aPoFfwOBF%;4-g1`9a5k--YiZf3B7vs)PK;Otfg2ROTz!3oapXK;bDCos6d z*^?MN;OwakUU2p_1|K+k7K0z0J)0o_&Yr^%1ZU4>2!XTbF@(X{^BE%G>;()_aP~rm z7&v<=LmZsFj3EKeUe1sNXRlyLfwNaKq`}#%7&74O)eKp1_8Nv9ID0Ka9-O_7p#aWa z&rk$sZ(t~avo|x8!P#3GD&XvG3{`OUc7_@_dj~@uoV}Bw0nXmV&;)1iW@v%4_cFA> z+4~qe;OzYjU2ygRh8{Tk2tyy7eUxDWoPCU85}bX4VG5jml3^O0eTrcQoPC;M7My*C zVGf*qmSG;8eU4!PoPB{|5uAOIVF{dliD4O>eVJheoPC916`XyQVGW3_Uy@s(pPcMp z5#;M1rB}>QmYxq@R(Wo2p-upPy5lRGOKS zqMwzTmz|kctec%zT9Tn(o?nz*T#%TYs-IX^WTBg$SE>tAo1BrDnWtY|lnfHq&B;tk z)=w@fG1N~7k$S-l@$pHCDe;+kC8maU5Gc`&~@zyJ*w)J2)6yz3{6lLb6 z>*uECCKpu32j~SeKtrR@q#`*zh}QNNmlP%E79iW35@4C;97zXz^O6%wkS#7rcJ>T5 zpo_(*A#EC(;pCT3Ba4yZH@5&0yJcl20RhFdx3i!UVP|konxS(A&Fw5sEkW3sZ;~3~ z9YP~Jb2E#R^;1)eQsR?x@{_X>wt8ln1_g%G-qy;JRD`8P<;F=7hP1V`v>+uu3B^_q z^Zd$UW7^tUUW6XNu1O_DuI9A26~(LhE`G%kCN#1XUJ@6V6y@cl<{_6%i6Nnd6#+D| z7+OF;twkiKpaSneiwK%onv$8XUz$^rpBSH+SC(1?%Chdx&Q=NL-tje&t-2Nwea9|Hr!F{u0{E(Y)* z1Rpm8gBk+^g9$f8AJkazv?3FOnL5l|2X2UYPEgtfO1nX64=C-$&A`CMz`zgy1#7-2Jp1;5@`ko(AD9aq#3{izJH_{ zz*FfGG7LzAyAU}h2Hgah{TVWlaH)XO9Wo5yDd{&d3=B$)3=BMSpk)aR3?gz23}Orn z3>tC_@Tq%{e<0ywoene4N)F;a7dZw7DMki{IC)6C*2zP{=aD=Ec*?j>fdM>-c0z%H zVH3z8CCmch1!6vrDnz}QDkS_>R2jg_AS|HbPEhdxsCWugJP#^f z0~MbD6`utaUjY^00~J38r7x&L{PRGS0lYLqL=BQ}J=8!$l?)6WY7qBKQiG^lqy`Dc zRcZ|2r-B9p!vZD-hHY953}qmV zPz+kO!Nd@-6s8{}3`*BJ+6)Y0ObiTGx{!PU5(i<>auFs5p7qG;LE@kRX(k5#jWBT= zT}b}jrpv&P#K6EHp~nE8&Q8#0V0gsHz~E#E$uAoW85q)_Q<(^JQqRE55i*AOUkXYq z8AIHoV$8s>g^7XTgejzaeP_zRPzN#qiXr8Y<29H$Ic5wDa-j0j43dAhK>3%b869a=20|Ub{C)Dy2QVyoPf|<+W43STAMztT3AMd_~se9lIDJOGW zAn|v_g@M6^nSnvXgMlH8fq@~-gMncY0|Ubg4+iiu76VTPhHX&4fGE%e0TTo7N0@ma zu>j~)EUa962NGmpfG-08aUuGwf1v0CNiaal7ZB49M1aaXC=H?@^`gcT&6KG{NrbY)~hu>knjUbf|f9W>zP^sm^@4zV(u-tc%2UizAwLHA5)7Dp7&JW>L1~yhkD%s)D9~~sCI(wmxIY3I7(f#tMgfp? z8UUs9pma|F149u51H-=nNO^4*2${+23xtH<0Vw?`kbyypfq{W52-4135(M$zgkVU1 z1I;9Y(u7V31H&qiL!cOvuWg**?m-csi9`GwhB%}=33i5=b14MkpEn_pddDM_0ptXz z>5#ICiD7a8O#Q4-NPWH{6jBau31xsU83Jj7n9mmtQx6gYg&T;5CC_;<1_J|lc@-1G z>QtEezA#8Vd?O5!@3g`p`K>M-Q7(eYi8tYp^0p=dQXhfL?_ywJ*c5?iN5Jw8D7-=P zpf&}F2DSHKbU`E}Ulc_$FqA>l14s_y54%#ByFg+gPTkWc{$^du|{F42W=n zwJ$;829km;dxI?*gSF#ecry%+ih=5{9I#=F-Yz{~YBHn;Q{4Nf0tDV@*nT|vJ3l8zXUD(Z8heMouH@bRI zo@QdmfQvtgg5>|IXh^%hCK}p)i-xp^Kz;^cNO`<}56nEC7zX%qNre3EeK7g77zTzN z%pe&EhUiy00+XMW0Lf1fSq6q_e310dz`(+IhK+%NF`12lp%K&|fT@7eOpI(7*clj@ zH*qmAuvLNPa+w%8&apEvurRS^=9Mroi!(DYu+@O;btZOy&_Z4oR?xyH=9L@_3~Y6v z8E7UJb}x_w2kUo61_mY$c2_0_2IfD^3=Hhay$lQtte|OUX3z>D_LR9GK4^-Zjfs(g zfstK~aX$kC1ACYS0|UDPBd80=q|Cs;Va(3Jz^=#$N=lqe>}yy)gA|E!Ffg#MVSy@Q z2d(yna~T=9KOT!TUCCNVHD@SFzulTDC|fq{d48A}}_%&rx1V>r1O7}!@r zxs2>bIT;w(S3$W<>=JAY4D73+TxMR7JD8MN*dKy4t%VA+vD<@Gt%Gve88|>IR@v9H zfLz1L#D0(kRHU%aU}a!nKL}OCz+QpO1v~#B%UO`~ogIBZ>cGzL0+n5yOzcNkzJi=C z1PXy8a3h$JxnLuXuz(f_@r83UFt8tC0UH4_lYx_o{V0nC69WVLb5OJ#g&T1lnF}`J zC`&LC0|Q??$cINEMu5x&8F7rI8f3&#kkm1_5dt93!?<80j?a^bfXrlI^I&ISaA4oea)^b2f&HNh0|Wb3xG}Fm+-*=UBfBIh zAh$!gOza7uWVr*%WoF+5a@|fSmxWyuOBsVgzMa85lSORaqDq z1O!1okq~TUWMEJLt>0(R5S+usz+fQg#mT^6A*jH?z;J*;a0(j(!wCk#8*B^=7Z?OP zSQr>?FbEd1Ffcq|5DZ}kHD3imS>*$RAZSI-4+aJSRwj_GjI3E8TW^3`{erxl3=E8d zci0&im;|*L85o!u1UOhhs>E5lK&oDXDp5f`76t|uLC`W{HU@$1pph1K4c6@-c>#6? z1_r@cR*SwQaH$p~_30w>6g3<97f-i+*dtY1NjAA`y+!D*l!3WCd6K~^3I6|90L zTp;7WaxgHk3fh56VZk4u)C0;Jfo!rM=5kOT3uJ?pl!eG#Mo>u^$Y#L?${T(m4D5ky z;Bo?FCCG>%wgiw7pas0_L2x5xgNh#*7i>fjTQ$gt0M{S}_8^E6ATvQm1hXv$8KDcx zJi%}yI6x5!J1Dg>m0|OtsJ6jAWJ%Q^6Pq;C7^@xvcE9pbX;=8q2@Pce+Qf6b|_zAN871#zQCic0YB+JNgot=R}h)I~0BkmFh1A|CKH3I`j0;om6 zq|6{PlZSzUBN5adU{YojnWo3Uz>x%zV-}GDZ3#+-@K_j_LBnqxDHAyu7=)cT^FZsK zMU3(o7&r?+OpsZ5r3?(5MG*B4BA(_944lOfo+E=Oh@rsAz#!Jh!N6e8zziz;IZN(> zOl#pR^XFt>5cdxaVc@I)DPmG)5cl+B;H-pjoEVs$xfvKZtF$>87?>EDcCj-saI$k1 zGcE@emC{TM3|ys*pwSj4Wd`Sodw}> zGYGSA7f5n3Fo;H-o&b%pej}#lXN_53+(uS%86g4HE+ccN54k2}T~_ zgYCR^`#n z=4N0JF$N9R>wydcIjM<_fq_RKBmwex87Bh+k5MgX*j-srCBKZ7Kr6cdOm%?Q#x zgPVat226l>3{p%WL!_9RxfvK_89|nTB^jicmT)sLFtdX~z;O*11A_!3FWYZ!1_r@b z;2JIs6uN?EIYBkXZZ-x6MZscbP`zQo$-rPJSjNP_U?g~pg@NHeBLlNFI|Bo+=s}Qq zirfqgyt0Bk3=C3C;yfTLb$J*VWIzVX^m8yU$bekKAO~7>#w5kaET_QCz`$(7$Sj`% z+E1s&2=XJdoIL{r1B)ahv)lr61_o9eMrH*@Zcv|snGrNp2b$Vh#L2+GJV}9xF_D*n zK@nt!0Ve}P0I0I$Q#9jYU?~offZE9s3PCdx&fB;_CaGjHGBEJUv+;m9s*K&BPMjPgqblQXP=Zkfu`aPNFz_mZSS1_` z41zWwRvR+|gOC`AwG5O`TtTd0b_NE11rX~os2t)2u_lAcYIP9Hn~Q;gSsBCvt>Wbe zoA((M_F%Djpb}I7B-_o(z`(BrV#R?nvj&KDpP7My7cBM#lz?p+85!b0*@odJBfMv- z#0Tk_f_7Mf(gX-gv49F%M9-87SI?9QOV1Q{ca%99)FMK3N10PVEgx1;&SYa^e$EE& zih?R~=I3nXppjH%NJS3kGBR+0)ZJoWVBmE23t?b>&ejeZ^#kp|VPIooegW>)vV$se z<`-}yKovQh3pU~fn=GiO2dc=KUqFlinF%uDC7Ua#sRgRYnP0+<09E90F4%~dY@qFB z+@Ok_`6a{%keLiT;EJ62F&k*d7CWdSXMPGd22_zVKZ9}^c|raKRpg+qIH)2A*$k@4 z`9Kvp^DD3o(2ATdi=Tmk#TA_6`Mrc07#LZ%3o$V;2rLDqUx7RU1_mYp0|5pGW`S-Y z1_l;^X`u8haFdULflYvipMim0;ENCg1BbvzP@N?Z$;ZH;A`r*Rz@W+?$i(`=oQZ)! z2-Fy0{RAqKn3NfWK#c*`&k!CX1M^ZL1_st|AS>B~ScMq*K@Au~VFm_P5k`<^P}N(+ z&%nSc1}=7)l$qF%^Dr>5Nq7Tz-|vR$_C06 zWZ=sLskUcyVq#!m<7C~=*a!F6PPoT*g50_rY9AB(DUgZ#phmE;UkqYkU_Aikva-MA zW?*1F2<5V|bBi!AupWkT+1aH*9y<=@axn1S1MyEYN`oq8PS!7sGN86CI9$KMt?vMZ z+z+T8CU!wS1_sujP%bn3dJy*?l*I=BUYL5|u8mSR$7Vi4ZW$N=7AAp+jt$j1x{ zu>(wy)3P|xXFz^W^2s1G73%my}MG$0Ve{03Yz#s%lYwYi# zkt<{cDk(mI!iY(kNk|W5!DmQZGBYsCh%hj){{T6XjfGv7u?Ez+0c)3sCsnY11!!Vq zVqY)Jz`(8yp_DIDU%sfCo@Vlf*KrmLDHaO5~Nmu&VjfG;(~U( zOM!ZKj1Rgv7{Hsir9dS*<3mscg8Bi{pdmX@k3$*M^!yL9=MzXy>IKLJ;DSF8G=3t@ z!^OZL#Kpki4OjOKq3#KWl#dOb@HIZqs$3Xz0Cq5Y{JCAAb)^`fkD|A6#56D!ct5O49Yt} z5pV`70`fb989!+3e+o0ag;g#IX<@-8l0ebC1vG?(H1^MotA)i(QVWX(t%b#c)WSL^ z0XjEiGibRByMPP>!(2vo7HJ01?rn}K;tUL|EC*Q`85lT0Z4{Qn(B>ECa#;ojmLm`z zBj;r?1_qX+5FQifXAuSlmSYeeGp7?s<#7m)g@IWEw07(S$TGGcVjzoeScBSCm7rk+ z_J1;<@=g-8$cX)w45;Jv6{MVj?TZvh=`YZ(e0Cpk&~U~oF$M-E_AinQ3@q#lG7Jn{ z?4~jd3_R>7BtbK#T%e{CBa0kkC#XFKcDe#1#0{VxDrg=>kr8AX*L*Ps26h%xMjlYF z8LZG8rjQ%dN@KBrav8Z_f&66&-E3cVO}K??VRLrhl|6by0_ps+Fod4-)>l!1YpftM4kHiWSsq_!S(WD5Hh39xBP zr68uglLeWU%(xz;;;tmf+C&kMX&XRpW8gX`#lXP9Qp9Kq8mIt=ObOKe4BXxz&z3^D zjNFzWZW)xz#BB%SmP5JB+^<303MiL_`y+^33FWeKe+O}^pj9<3|!Yi!NW3zaSKQv zSm89NLI!RHkh^BpDb4*we)r7)00$Wf>SG*g2#a7-ZP>#2FYA*aM^)7*yDEWk9R5xX#Kl zFbJ^RX5<46EP=gq7iuvB_fC+#_n=%xi0|%0xlG(ipfGy?@fVdB#To!K7d8dc^3u-7Go%vg))CYE3}P=kdVG;_cb3^xKaa{%XpjR<6a8c@b% zgc}iw%mo|4$Z;9$3THATvQmFme0_86gd--@=g%mf+1%wY!_^j-&QC@{l~ScJ?48^O#G2|5YP+1Z(ag&AT5$V`wCEF6s>BQAiV zg#~Uz9VoxUxL_k#I6y;&g3it^3@j`VBS2_CAyg&F&ANTvqO9 zpkR6k<+5?V2XP-kx$N9uK%w>+%H`lb1d6dIP%bC;Y>;oBLb+VruR)3a8I;QnDRrJh zxzMWZ1(XXd&|gBie2_Bf6_m@*oeXmGYbaNMdl@Kz-$1#7+*?50w@|JS_Z1NL9h57~ z{RqT;59Nw*w}IUJ0m>ESZUdS85y}U{H*IfpR6e*MJ(m zU!hznZqRZ9mTyq5G&g8D0n2wNSB4w3oPgyAlq<^(T28?76Uvq21}!IG`32?5i-1Zp zCS?U~36R_WK!ugK)j-_8P_8n!35fd-%2nZZ0&)LCxvCFz+y_8h4k*`{`y7bN z3FVq_-vM#Cpj=ZCQ0`|^HWLA5VJ2k@5l}v4QnnHSWhN$N8xc^BU{bbY;5h+GI0E35 z&zlHt68dpC@-Z;5Zv;09d%=~(LQzn0zgZSkS#*LluxCnvDvJZ6pvvNdGy?-WJ0oZl z1G}&+Xx1`E8q|exlVV`tX1^i|YDhj3XJFuEHx&iVxbuoJFz_=#hkThJbGM=ak_-$? zj*QHr3d{@)Og4*) z$;ZGT>CeZ&01~~!#lXPm&mh6r2MVS*MvyAd&L6N!Wqt+*$p}6M29T%(sJETKAkGMy z)nLqE1gQe;0RpRJ=md3&89>8$&{cDwZ6BajbD$;8pk6ZwF9K~rLh3oQ;OaTE5ZiNx zhBqrCtMEn!1_n0pEGip#7L^S=i^>KXJz-`8&!Vz{XHnUZW>HzSK`ZdtRateb89__u zK;yr9AcL5c88|?*sI2-R2_|Jm4$v$rs}bnzHzs944$v$rt1*Np%mJE3Wi^BFL^&oh zGcd54LwMpGpjlK_3kXk=12l`uYPl7()=ycQ12l`uYIPjUljQ)-qOw{;c=8;eSyWco zEGh?R7L^q?i^>6-MP;=IExBP*R$<`mW@KOhVJ=VugP#GK__!H)m?nYxuHdn&^^6P* zd|(1Jp2NTc9@phzn#Bk@e+*2eGVY*#^R8F`pM zb_p=CGP1MjfQH_|)2wXZX;!wgplMb%@H8tMc$$?BJk81m8niKDL!M@37yZP@z`)AL zE*=Cjx>Gcd4AgN8Sm6+t73vKgQ$Xr??Skds?LOWZ)# z^MQ_@;{%OPF|aanNSp*2Hb)+0*kMJGVKs^j3`}f)3=EtM%sTQ63>>N;^9A$d85kHjg~97MlfY(zHX|{zd4tWo zE)Oy@SOH|FvLeXLSVfST@*sD!l_`L>X)uF~;8eQ;>c6vbiPSSQFmQ0IGca(8f*cA; zWvL1b3|wLm9wUc@E&~G>I7FC~nK()W7#O%DAnB2rgI$S%flCtP7$#*Fj!PhYQV^}E0ohXq+Fm6Ok^rUVa7_jVE``IOQc0Pafrkm? zFisG08PpjEr6YC*=2nmailDu1Li6Mp7??yEnT4{g85o!?7@37vDu71E89^lgXa^v; z6cBa+2?{cT1YAIq=%8Xu*bEd8LX02*(B43Z${!$=!i*pR&_+Rs;A4=W2qQ=Uv}+J7 zD6$TeCPcxB7$gYVMhKRe!NR~GdIl6jqM&rWjER9k>@UbFQBVqJOPkD?KADk0+!mxl zj1i;_wDS9eanbIpzV9o(?_c1dtDBT1_&0LVtYM=#q$qbD1KxIP^ zXt;G3Hv_{SZUzP$HUfsez4wK?P*7D&q@~i}o{udmfIvSeq}S7KmbvG$h=HH+Wi0~(a}FbT5}%O)R1z>TWN^Ue3EZIp3_Cv-6u^3*iG2bA4BjI^ z^hyj?rdrU_3P|IU4Hn|;jE$f$V+I$IAUA_{ID-zHVw46oYU06?pd#Imoq>TP4a@~4 zThQuQ4sfV4gB0!q$$~?b86*o@FV6`sURgoAc|AZYacn_)*+8-d91ILxpu>APk9smN zF!F%nVF75FF9R!+B4|9H71F?9%m-tZmx;3v zBs&qxW##})e=|>la#=Y4f)r1Na#=Y;K-?)%E*qyJNbgiAmz~4YkAZm_l*hpd8Xjey z4&`!kepO;%V4eZxa&c;aw9bTbxj8}Of6TL>Tpmu)AT#r9D3_O0R+)i;c@C7z#|au_ zW}XY>@^k(G88r{e72vc2DV`7I3UWq)xC@|MA#VG@t=3-M}U|?i^#CaXm=3S%=T8epB6*S?*Q?3k}BI4Pu1fC*-mb$!* zEW(1IRcYW35D&Nm!~^aC@qjx(Jm3xx54Z!wgVX_H(FQHLzWSPzQ*`9@OXnb$|pw)5Nct85jgXp~cT2#3;-J;);Na9nc84D3|~h77W7Rf=QU^ zGcyB&7$e9suq1;plL*KeNIf4GN6;o1UPe~7A{GV)9&k5@2i(o!0e5qFz}*}ka5sks z+|A(ucXN1hwfG1RyfkBXGu@VD=5YJ^51_oiCZe<1r z1s-QGd0Ux*L6OHmg@HkdXPF8EgE9}dDg%QGPmC%9gDMZB8UuqG&lM#G26YBzkOl1K z8K8X*Y#bt>6Dj#YT`CSyP@sU)EvQSyAqL?w@`Jim9N^GrQfA@@waz&tASs-gAJnDd zkOX<0NtuNo)TQE(g7BbSDh}x@AbX5CWb@e=82CY5Dh^neiXYUa;*bYPfbs{ZOU0o8 zYOgRUGcyP?fgC0PB3eN+HlUOV?NV_lg4)Cq;-GMXthZra%f`SU30euor~s-E7$nM6 z85kIy!L23cQ)~tq&%LHITWP) zf*S(^V?0O=gUmjVL^dOH3rGTNdp6j1@M4y1kaHnMW`qDahQvNK>=*h6_7A%-04bbdb^}kfYi_gS_gXi~$!4 zRE05hK%1W!lXNGrF);Y?F@UdIVDtd3kOt z3p0y>L7kVKfdM2c!Oy_J*sH0^&cFa#t)wM|@UALM-q3&@(p3gI(1@`Ov|(=@BPhH; zM+{v7jT=1VW?;|;g+&xU1H&Ycnft`J85mSyTu69ifL$8L&%jUyQsVKCi-7?-JV2s7 zAQ?n>XoE7`G=2sKA<$Z=1J^)?!nis&L1Vf-jNo`##?QcT2c$P*J~smcI9}jFfvPYj z)E(e>S;5Z$zP^Idqm3KY9Y^>X7;b>fLb!uL9n_0^2VVEcz`z)-30k!+!^6O!`Gk#u z!GMQ>K@}!x_=}B!!4-PKhA}9J7(q#s!H7{AlxjaPf`mYaGG&1ld=>CBFld8Hgg5~P zh6W)92FA~h{0t155*!Q+{=5tfn!Fqg45c6j69)ssWYDT=kje@n1_l!q4h9B8eGUeO z)w~Q0CRQ8_47#B5GDUy^e4hs63{B8cQJ(A!47#AC3laz2kHMI@kB5Q56ck+`AqG%a zKF~~piGcwUJdk9YA;7?30Fv@p%7Yp_+XNUGPJyBWDR{skS|Px|5CGDWa)Sq&Y=a@m z_LTqw!#|Lg)UTj010~yiybKHwNzlbiBA~^HX+j`>f+R13B*A$EB%uM4Ob2HJ1_lOQ zP$6F-2ie}K@l(1FD>;9 z;B=!S$iNT-GC%h^FEri2g#uM!OlZJ>)31Rb1A_}lhX=?D$mtg(8Ud0)3K+1K3PA>j z9*{&KXq_(9BVZYj=mL;T5jP(+$e^JD65RrlDF&5knxIfI2klNV1tr97f(#5ZKprXq zCqyq$7=RLDJRbvt*#;&C25=&52dQUZFa=e94FU`dCqO!88B7Ev2v9Kt5_Kz|6Sl~i|sxT%bSW>_~c_hfd@D1c%kE<}lpv4?WlnZ1Qda!5- zF)-MHBzjUfh6lSV3MHa#gLK{B#{P^Y=8zP0|SG3n-Bv7sHy-J zIB>+e$0wfe@ zR=|u}0t5*&Fm!;VJXQ%XFo09w93chfA0A)^4x=IpeU|0dt znDQ8=@hC_h9IqdQ85np(7#J8+LHQo6`4(J~PlSO%3nZB)3-T~1MZ5(`f{Ox>gd0dQ z9juE1w3r=I8l(v`FdP6`II~O$S{jH5Gcag^N&_7b15_IL2t!K)km?5@)dfv3OF+xl zA?1Oe2m?bM$dcT*g3yEy7YbB`F(C;*3GAUD5e9}dkPeTFFyj!x1d;$P^kGB|Ca}h3 zA`A?NKpG1{xdZH{Qjnj(k|2qDAju+ike5Iq(FvCXN&Esy7Q4VCLE9}Dz-7Zf5e9}I zAn!rShP@#FgUW_W!l0DH0xcV!feeF|4WI-M+BU(6R5pOb99S3_7;BfqtWXCnMS>KX zq6`c%pk!JlBn%BC9hgv{DvSvUq&%>93`7|iTtGTJzQK$`1QJLh0wjqgkg7x(7{F7% zb^0KWfWpBB><&;u14%3bX{-lDE;t1JL6YF)0+QGUl57A=B!MJAEf@xC#u89tP=pbj z^+DMlbo5~vC_F)l(+1pp6=4MB{hJ~T3^w4rF9OcUvZ4$OHsH(;>AS~^GBB7$u)uP^ zG+5CEQCMzQ0OxLXF$M-mZdU~J{l!4e0Cxo#MHm=tL0zx^%nWwc8Vn4Kav&$Lf*YLn zpuu+*XI)S%FxrF0-C5-qLpY#ucMfGx$BmKEfl*(Xfq~tgkx>-XH53JPY#A6ptI3%d zl6c@F!0*%{!-=4NDad{h76+~TMH&I7!b)+_JS+=%9+s5}bZQZFP?3!ZJgCT;JcogS zfgRLq;Q$XRvi7ip&cx#c4Jxwsu}_2yDsq7a6BI^_=myHWFsK`1M%4O&D^kZP12IX;Zfd&;>r$f1% zT%bWk))`PP7Z+$yk##1N%gqHERAik6hlq=4_4H{HrUB~REwA&VRWEAf*(AkK* zd(;>h1bCg)7#JjY4b>SK6nN{^7#K8o->5M#81P39oOSyWD}kR(hnZj;{}iF z@q)+oc){a(yx?&?UhudcFVeUkn|3;Anp~AlH-(vjK>#$a$EF7|h)J1205q=0rVo-} zQf3qYjq9-)l|jb!1VH0@Y{n3tumEUWkIf9i6BPiB>#>H zIUQ_@v;b&akIiZ&m?tX$8rNg9hVbMCK;wFBuyH*B(6}BOY+O$OG_J>HzaFelg+UOM zz)L{8Zb3oF&mhdm$^_y<$_9{YM8O28oxlK@aA0Ms0gvl}ECWk2urkdB8HY5k$L6>c zw0MA#o$WVh$vAjij~6_y#|s|U;{}iF@q)+oc){a(yx?&?UgU8-cF}{(3=DjX?Ba@` z@jdXk9xr%Yj~8iNk6oILg@FM)uE#EG&ceXJ%47>3*9!)X>w&Bn?T3%+@iB4;XMhYV zRA*pd;GGOgJ`Bt)>I@7VVj%T=j2sd>K=R;mKVI;-A1`>^j~6`d#|s|!;{}iV@q)+w zc){a-yx?&^UZin94%K271_sEuAEz)ID+2>Bc-)T{JnqK}9{1w~kNfe0$NhN0<9@v0 zaX()0xF0XlxF4t5VHO4kel{+VJkUlu&{!OoD9E9pv<4cB;}V1L7zIFMaa`aKV^U@k z0FA|QNkCF1vjAu;j!P2c7$#*F0nk_+mlT8t9gE|V76k2+Hs+FD1F{D+7RLn}ixU8i z#c|1lBtU5zG#1CDunDx)Pnns4l?mi9K@f3>m4QJBl$xMpaa@X(tPBhi25JlpOj?Z0 z&sZ54BtZ)Un6yACi$P)vNJ5Q~`9EAj4J;wW0*W0mMo`TLI?xxinSc@0m6Qf~pAqcg zt6~fcGP^3DDZGaJA2@3=C=#3=GO3K8i{PS+S0@!9Zkj>T-5S!gWHiJB= z2r>_3s|UztS0#1^2C$iVATvQ?C}ygH+!-X!zz_pc9jXL!BLjmh2P*>u=;mOEMJ6DN zKx_U%Az})$XsrYT1K8nv#2FaQfwUTfEja+P1jI+Ngh5t;m4V?S+~GKikV=CgSJ)81F1HII$WMbf`Q>SHv@ybj|2n5 zQxGFSf`Q>ZDBc7?7Rhozla@S#I^$%}Mz=ynP^f{4K7&OY zI2agYzJpRpCCC(3=1D3I3<^g<0#zUZSxE*4`56)n44@<^zX8f%&}0k-DVfR$G6-~Z zv?FL$AU7uigLD*V>B3adoJfHr1A{adXx@A(sEm9e35ihf8V>=`vCtN*3=A@AAcN+D zv_h9UXoD7VfXZIRB&`5e1_lN2@{I)`BUC^eWxz`v7JwWFZjZ4t334(p=zuh6FouE> z?j}Z%i$DiigT0u<$-tls+LO+>2~@r@X6T;RWME+21S%C6)AST185lrnK}lc_$ka&i zF^d|EOF<4h#t4!F9fl1y>mbO7V6%>a%(9ebV31Y=*?A1);ZzV8?BQb|*Y1{PV9@Ua z1H<1_o)cgD-)? zs8$9Nh*v-^eJI1gU1^rXlCO8m*(;eG8aLy$+-};f)gCzI-qDY1~u{7oVS6xYmCOACO*5o4!DVL3~J(Y zDTC?*Mn)6x>J%P6@O%rSDR?lOTZWO*l+hKmR!;-O0u3&5%Q7;WF{Z0CFz{xxfKOax z1jVQ*DCvoU5{D>gnFWJ6<6|`j2HtoU$Z8RY3`m-R;S4WmX=60#KnTbxgfkkDZo>i4 z;wDg^fq{X+M+tQm0!iHl@G1o6x?E68AM4?g(?N?Mp*@JnAXTvCB+woN=o(yb4+4Db zBx?%j5H@yDZsK5Kea;5D44V_QC5H7m+Z>Q?Wd=^rmKZn}bW|4WbGH8s&;z?zpR=t2 zwT3~fNEtYoSYNQIgSM)I&iP<{0XG74&Igr1#1pb=v@7i`2!Hqg0tyr6SFSYJYn0GY|a2R`S6^)cH?kTIb7eb%RNV?Z09 zSf4?;jQk+~g60iDjt0#Uf@}tz^C9pPbQq7-1a46Zfm@V9;1;D2 zxJ4-hZcz$>Ta-fJ7Nrn!i;_(gbOEy8U=U^mEsGTaSuZjRbeJ`$bYc)>WEWltG7Q{%5CZoeguuNAA#m?O2;6%R z0{0$-ka`d7+91w_eilo`c9y$5!qT2K>PSx^kr zdtf()@Px%cg$}zJgeNKnYB#Z)LwMq1pxy(!1%xLl2I@VqTh0TUA}t2$J+NDC0P|$U zK)nZcYY0zX4AgsIhxH!BK)nZcSnoj$)O%pJ2W589ssM3N;;v?9V34>9TI9?i$;iqC z;!1&61LMUx<2~f|1jY|a7CKm%WM!7^m4h6*=q%98N zF^WOj;-Iv~q|77+X^TVRm{|pfu%mhtqa>Gu$69XNGz?}$+E0CF> z+L=2El*XBqnZ-b--EpIycE_Ef1X||l#FMuWWEN;@ou>fA1cd|WkP#l(AtPd-Lq>Su zhm44W4BZHG8T615o)S>sL9~UZ>;b631R4x3JnGZCL=~>L3RcPInbIxCL>TtGswq+M&$$< zL9H*)O(x(*UO1>dF9u%G2`bSTGZa7($S4RZ*`Tc|1yCe1f*an9DGZ7kAX79MK_>J` zF)$pI1uahJU|>)Jo1zIa<*zIQgA&*rO^`X7atsVgU_&%P4#}5eU{D5~1)3wpz)%L- zqoaMAoq<7x6*O}z$H1Tp5(CZmsWGN8e`d^pss@QRfK==JfT_L&QVkM=ss=Y&)IqLd z4C7^BP=of+AgxdhM$kE5jAo1=dC<)*VE=0{f=&rzv}Oc}fbMYti)u3N0r}E_5mdr~ zL_s&ZfMwQzd260_L+>fBW4h%Ysb3q~jj39eJx5t3(x&oR8&17H<0-43Bz`($u$G8!s zE(Tn#g4BU-m;tNRVf+P>Nn`|xfbN?Ci-HcOQuHl|Hf{GvrM`3dI;fia;0A zfED&|!Xi)%6oFX^um}_b`Eoyq3ywfBPy{|zU|`Vqk!E06AkDx~4LZdR>^*6ae~dtz zOVmN;GQQ(rU{GVs0JZdV7(u7JF&Z#}BtW;{fGyp{$-rO$+7Ac{R6~$3SPz2{qYuc5 z72wbZ34`v*i2^OIF9xmN;MHPaV5|T!I~5ribTb(k!M(S)iVO_K2c#JoKt~Npb0MOi zsfR%gnv_|Y+dvIn<8x4DPPmj!11q}&RhEfM*)otagE!I)3?R=kurgJ0F))~bYC|2y zOCUeAF@oF6L=E)ij4Cb030S-_=vNBKAXkY-hc#3(TEgmLlyT|-7NEvqv4`}BBD5aUi z@-Q%1fI35robI6MX;x--%?1WbP+y7N8MH%)kBd8}P0PBf?Qm_apkAevX8*o=nAe)5|ls3W9 zB?4lBWko=pItE)tCk+M$fh?#JbZG`I&=MJjbD(4UApJQvO-O&v0Ccbev_JPz9koA) zZKnlk8v(%E@tC2VIMBcgd>RPa7hz{)5eA*#&jD`vbAVg^9N?Be2e{?W0dDzofLs0? zNG*RBZP4x)PE{6N(6KjMpq4+29>^djWd<%#%b!IbB*CQ2$OUTovlxMv=QAk_a)Da@ zEXEL?Fc+xh&teAQiE@Ej{w(GYo;Vk%<c* z=rbuZae?|h91@Te&ddes_i(_rSaN~-JshZ8EIFh>hthExbI5A4Ffed|`aSUVz+9ky z4~INR0+c^M{T>blebAzE@EiolVca0X9<-Vqlro|H9uCECpgAt^>9dSdjG(Fmbf+G; zZk`TW3l8EjcC#@sh(OzptjwI64Gbdi_5-NM5rNjmOdQ4x3_^^Spb=I%Mvzv}#e87H zK-U5YgLsUf9aKacCdya}GR%Y#l)pgQK{x!(0xj-|1NE(>K#L#2#qfJ&1_tpJG7Jol zWEdDEj)S%int_UEXB7qp$u%+z3>QGloG-~RFx&z$uE;PjfEG?jUXx*9cn4bK{6L0* z0n`Q;Va#AOW&n8uH2%h@!U(bvbe|yD8}nHi7^E{97*#=Lr>VfKQUh^8m*~lWR5F4* z%OJ}*ALMk%k%S;&(5`f_A##kIAekUWkO=5%Lhy2--yjbqfF(f1f2}G5gBZ9e1a9qa zR%Kw2l#yd#0J(rco>38`FdQ5#AQP-WdyGLlUY$T4BXF>UgP1o}85kt8L24sFPUKf( zV2}Z+g*cIw$pbXu11ho40K3@X`n79(K@~e(a#756pegQ!E%bKuaH( z`=MM$4$#sE<_SZ(`TLp<+5;qmOd~~hH_asKuaH(r$D)E9H6BS z%u}IUc6P{qDp060DRXdumOd~~he~pCfR;Wm&wz5dI6zAum}f${+#H~#56rWmTpkY4 z(g)_*P%bYAXz2s<94MEM<2@?_1M^%cm!AW)^nrOElq_s4xhE zBJl&Lvf==FhC!H-iwVSqEXV*2EQ*2&aKnlV+_2(e0FkTDlz2)JQ|Z9zs8VnN1cP!-O!6TBefJZR_Rvi z2iOt`P6{WlmulO*b)g&DF_cbEXye^4_+d{DZ2|~52$&iHiy3FhLM;0klK{6u;2s38!K^D+7c0cP<77MhQk{E;i8Bs3{;0s5X;0 z52}YGK%$bbK};!-C<7N0C^Jeif=&+cc6QH!Bwv`BWRkDF^&-=0=nfFEV`VH zfkEarD+2>av;eg0JE5G7fk76uXn~D+x<&)Te7P4OPsuL;)tCQRLEYJz8lWQp6hYeZ zpraYpz!UEIpd)1ufcB|@8w~lNJYb>Dz@VPV zz*qkJ>H*ojQk{W81?;mPu+P%u z1K1%Bn*ovrtz2YakY+RknY4isWD4kRWw1%opy4vGNgF^)tuz@J)UJV|c>~D1X&^4x zyBk1m-J{9CptB3q>;s){qzi4VLdG}r7~Mg}?`8y*B_QKL*E4?tnY5M@=GfgJEA+G& z7}UTav>Oycby^UY?ghy`(qdrHzoWpw;LgRs&!=MXq4TF{yFzCO6Dg#|K z26GCEGSFHZ27S;uBp}mn;xg?AXf#cqO%Y-#186A&HcKT~85kJ!MWD*maVY~WxM0v% zf-3XFr7Qw$ngLWL3nQa3c+iC_n}rdSf*3(zFA8Fbf?`{gA9Ogi33$|o3pQ#4 zkpW3FFzf}L%+9b1bmSVOg_)}jX<-V04|M?rCJM zi3iPQqnvjEol36&Nno2whYq^1Le}20B!gCcvVqbmc;=iX1#|`s8|cU+b|#kRZ1+G1 zU4UlJS)Q|jw*G?-J13MGTOE%E4pB$i>bC#EIBS16fa4y)0 zmu&SQBS4e9EH5EOfXrmz1<#zbJZ3u#I=%rkbI$SMS#$ zTu4iuWhRshX{oc!f^s1(b(YysE~KT-G6%|qwA5MVLb;HZI?FsL7t&H^nGfYcTIwtd zpj=2xon;}E3u&pdEP`?&Ep?W~P%fmU&awo`g|yUJmO{DW4E&&$I?FQl^Pur9$X#QC ztgLaMfn_1kq$?|I(iL*6NFpc&GbuAdZWVz|x(b0NU0G2lU0GAYL7VWM*z&G{+K8aJ zHnsu~6Lg3_Xr>15%?_ZINFo8u@GHjHN*04mYhf!B1+~pU5zJNrQpBXpAPTG zgvZSw$ih)@A7lV%?v`G8;TA4uzH22C;53&M2_sY=(GE9t-Ni-DHg!`byz`!7` zr^CR&C?283z`!KFSPOL4E%QzgN6G{=>kaOhaSAU6sRwt=#6j&HMse`ipE!8zPaHh< zCk`I_69 z9NaMz2Y1ZG!5uSkaK}s>+%Xdecg)1W9W!yHjv1%)G6Rz# zXeggSn(?VN0|TQHBdER6qzJuh3pA-MQ_R4q1Y)exW?+y7NijxoF)+wMYj;*=289L& zIcTc_G=0OsAkWkSYI}kVR%E;gGFOceq;ZuZ1H%IlSDc-J0c5Tk$XtFM1_q^M21a#| zdUG8H2IUp(3=B^}%}j9nP7@UCp*joL7kQh8r0`jW^H)2%|M4$R*ogzHDS?V9)?h3tLZNU|`sw!@!^co(HxD+5Ak0 zfk76emT@J9k;vYbgAOc0+HsnUpewH!D;PmK55R1aR08?lk&$r&I|G9jXnLQ~33S03 zgCZm7<}1cpMvzh_B?bl=(7bOd2Lprlban=Ydx{JUpdI0i&GsA&3_3SJ&66eU3=H17 z3=DeD6d4#m$5XO%pvMY>-X}!{hOb-<4Duj3#tcRyImR?bX9m4*ijc!9jUnPpJq!%` zAZr=bKJ8kK7#PyH85j)Wlo%KaK#U|M1_sc2 zLS3FyuaMtP=JoD2-$CWbL+-jJ=~4^*59bkjDd)Hepr8*)v6 zXa?U41nO~sYmfg7CRw1BBXT034l66Ojb;Ob320`KksDNKGD7mT38*Wumty4 zIqez2r?Z-Y%4RcAk;-7oxL=!rfm;ZCj14%6gU8z$Oc}+s85nr@AmX6(4iUFx`~h;* zY(_>8pHza{Nqysu|Oxt@+pE?+d#6{K`cFxt->G{ zJIEe>Mn+S{FdYU4j$Vk3pvxH{rdu;Mf^3|^$Oz#x1b_~bWHRM0WCI;4zlH_E1+7A5U&F!$IuH$d zvpQ%sEf1*u&AFtD!&yM_aFv-&!ay`a7!`$4E822N0q63zuX{~!x! z0-qatvpU%MZJ?9-I6yb6e*_r;Iw_9*2;2zh&FTl90=l_H0D7}J*a(oB3>=`F z)j=2ZaDq<7WIqZw0(!GLk`YH){FxXS1fVyogN*>02{Pgs3us)H6MC~cL=OX}0O)$E zV^9;pt~kar31kHHW_7R;ATvQm9B0`DI`|8EvpUQO=*{X7F4&0UELTBBKyOwD8v!yC zWW))UzaS$(N06|efLhDIc@K2UEsP5`;sgt*{|UQU9c%>1Oa@-q&FcF=mtlfV6=UBD zH|90uW_74bIH5PIL%2+w(3{mETxL$tfCu|ds9qLM&`l%kyP#ZFNYdF2<+5?6ffDo{ zD3_fR)X8Sw3*~Zff^HgN-v{M#a)NFeVc!qsa&dxg8eu;G<#O|Zk`t3M4=3nO5%xn+ zVaRcB?1!OTem+o&VNw?014TQNvJf9A?wFKC_&^cBq%6h<3PmPm2~N;a=PCff`HgKea4&DN#n-^@RtPBjCpiVve3%C)WPCc9pHsS>vXeW*U zs8i4W0%8QnOpp;T*+99L6I7_Mzl0kB>eR!zU?X0#O$Lphf;#o=FCj*N%!GF8*&nlA z2e|~)sb_x*HwM(HXMYCeGV+1^3+mK^91ZH!gKUO(>e*j`ZQx*H|HcNo<(6~39s>jW zH>hR?PCi2|07_Y=zH;;aJs>KByD%{c|+tKU#A4`&jH`v=P9h2)06P%bn#{DX4& zIYHMDu>Xg01vo*=4%r#lAqh#46Lbv$J0p}U#0k2FfSn1-73Kt8L%_}q<%)2Et|4G& zfpSGTLDvwlvqHIIoSC|44a_c)|Jsv0*n)i62Txj0ogL36LkAh-@AIeqWybR(BK)H&Xpvwu^1)*FePSE89>_Skk zGAHPA0(N02SA`RFIRU!}l&i}55M-1nl&i*h0u)DLP_8=Xe~_#=l&isc4J0c8%Qcn zTmw$fRS4_~P_7{-=qdzuMJU&Z6Lb{TuV*`5LXk*wc=C-akZdaYX*LGPzu&&2jxuI zL@wwyKo0OFfXwZB3=AAfr$OVxOcz0;$BbJ!85kad?ppyZ9b;fF(q~}cP<{he@CmK} z)N~gH5e%$M9H9HrLCr1ZR*+g1kYS=?9BPqV3=CqsvKbgS)Im(ps&hM#Z5jta7auDN zh?N*HFmPys>|#lJE^W|$JW*9H-Nm3=%|XlOxb#2k_c_zbdf zhRbLvXgnLbafZtn!h>v_;WC5pARA}6%pp9;#u+XP2oJJxhRgC8*c8ad87`|EU>;=S z43{;82iZ8oWef5old>Xs;|v$d#u+YqPsGO#k80iBo*x`my~@d+0LgCrw2n=PHoF)1_1dipW&RYEw>;Z43Oe$c(A?EJ-yExZg2;5{Y$@NrG>o)UiexF&c{ z2|s*X6TGK{A8lNdzn0OCmw`c4Kp+Kl8kiVpTvGrxt_j{#B9H+JGuWOIflLSwvZq8K z3&I2KDG@062D;20G_ENC8`lKyDG`8=Yl?CUo|G_EO74e}3Y zTvJq9Ajtuw2sExKkUaskRT8?VM4%pI1$8YrPM$icSr z*TN;Vz!C~_dJGKA(;1l+89{>vj6&eD3pAi{ONoJ@7&J7smydx#=`?8RwGgN{Gt^^X zP(Gu?!0;AyJ)-SPUIx`L*iv+6E(S&h21UkTkQOtr zc_6cjlo=QxLISYhFaw#lMW2B|1AL@`g&F8{^BzV`&_Y~BOHkRM<;};yV57{y-~(D4 zXw50Wz@QDfJcfB<)O;O~7;G&()5ItS2K5AxN+f47HNba7fLsMz9uHP54$9_k0t^h` z93;=6$oLQxXwF~dvj0jaG z&`mO`^OPAFKuaW91(9SB9%E(Z0IdsG=Tl)|ScdHPI=J7NI27Ps2Q6+;VRQ#2uqd!s zLEiKLof-{FJnPDf=Rv!@y|FesO)Ffg0|g@+2`Bv9zrfVF|Nw7@L+4cAr!(zY9< ztwDu>0n~V5P+!2nT5chs83Gwq9cf26Z7- z1_nM^M2Z3x2dFt%h4DQo-q(W71DT})Gj9#ZJh1E6g3Q|tGEYI3fk7Q)9%BZh0o7_9PgQ}J)1B0t91H%tt=ngAngBg@f zRN;l!6;QnG1Dgsm(FtZM=%hDDGS~-ls=NsUgSs6NUQY#OkfUJpKxPHN%mdvF2`S5u zg3NOTndgJ#bwgwq!ZIDG>;aXqnjk~ZfDHv1m;y8OFWl>AKwhslVPH@VgL?h52*m3s z1~VupAiSOriuG$?Q$Z%?!A$iPh2?;2Ag68wIW$HZeIdw|Pr#;vOq>8S^%uxg za2fIhLF_`DyfgI~> z%D|vLjR?Irfk$1H(2@OyP`qBgSQ*tjPy45oFp0m_uiROawmO zXbmz_0b(S`I1x1l26r=1b4LQ^Z3VC+Uz;&7D6^?S3sn=w6CmGdKs16hd8jck2%0l6 zFs6evf_5Q z0OepcNWHyR0#VAM>>>o+48)+C0#)_|mogJj^{!l`#=yV_a!-RAwC*!v6a}R#JBWKg zZkeP8E$}@h85oSgKC%P*sK2xcPa zG#iKyUBEuv1o9!Mv1};Ez%WS?)l>%Md1}y-*@zL`1ond%2{LXK%*d;7NBV&sdBcK% zK^b(Kou?cF1A__UcThx!Ks16hIjJ)+{Ig(SVB9MOi|7!r#tusc2GjkZ*bM{Aodxm1 zlhWbf?&ecV1_m?G#X3b&3=F2AxfjMLuqU{z7#Pfx85pA(K^=V~D+UG&(9ubz;HmUj zuwGXy1_o2`TzV{c77wI|fkE{aG}2~DA$-otJV61`EMux+U{F_5ha>@5V#ZX$z{+%3 zih)4{G|FK4UWb8!MGb5(^HV7X22J^V1_l;g@T|89;|fsf%Y%dmC@fZ~Gcfd8F)%QK zhOHp6od*sNacc$!s}oWT3@+*n3^PEdMinqxNHZ{4fR2>6zA44P5Ni#Z7E_+44$T}k zpmla!&i6p)f-~BH*4c5(>w!01ii3KRpj#@ztz=dP8_;|!Uu_KNP$Nbg(0nUj9cV_2 zk!!Ir@W+yEDN0oE*XL7IWVjxkD)fkAjP6C-H39V4h$BMd6!gh4AJz@tI- z3=ZHM%DCLYLo$q@;u0*u;0WHrB&Np5=mfsii_3$N(MN`X0b&5C`Oe?~zW7K)4jc)L z#VC@(U@ll0D^sNm1B0^*_>dn-=pjFL;5CM#@hlLhfg0mrd%*;Q1Nhz|5qXHophhob zv;kxuM1>RMc3lPrPJTv4P}^3x1T>@T#Q5HTfq_$ikrC9igorsZf+kg&Uo$c~f-mkA zmj|&xmvxFOfV>7e#fwLakrC7!L-Lvv`0y(p9Y#h_lL|bzfh6kyKD&xX7ZPTmHUdNi zsBmU*0xwjSaAafzRrW}_oWLu5C7c-`o7{?$7y3zy`MlRsP0=OX=htUyy!~nM{C?r7p zvBb0)89{{ zCUnw>CDx5$5L11Fh5)0gdf(R)Q=91sZ50|T4n7SObX?KVCrFEV2~F8Z+lVznGCA*_o+jhd7uej#e5b9hV9l242o4O3=G$-85opO zSQr@ISu-#wM}o{y0oN*w=8Pb1Utn6lvoJ8IHh?TOKh4O%0PPeosDP^*Mkhv)LIn+| zJu0j)#ZJhI)xb-I7`+)mSqY?g8))gL4Fdxs=kk~(v+M}SIxk?~6OtEEP&<2Tt)Iwa!qRGI(1KN&o z476ketZFq#6-W%BNbOh8pQv#)bR^~Y%fyG7) z42<9dWLcS4f&{>s9(=bXEAtAF01rq7Xz-7Lm3b~m;6KO=HBbq`$~+GwpaxQ*4iQ)e z5&)mcqyehJSeX}q1e!rAv_Sckm3fIq1A{22zPQD~z#s;yO`t0#*=tXM`UQ{`lk9b% zwgq&>Bzrw0C^a$)FtLMHOoFOn@QO+H21%&6JV+c=*+5rJLNtRbEk{nMHUAlmK`SPi zWDLQYj6uzNCRtEv4LTVUbPNk8bfIGfXgU{6G=uKfG_Bd`30L4s9gkVp)tRJ8v$ye!MR`~Ua*;hnpdC}8uJT?5g;=e*qNALvVpGg1@F~i zehD`M)Ix)E!A87fs{k1RYN0W|gct!b6WT&!e$2K97izVeesEOyqn&-#Fz#s@}Z?P7Dm`utHf}r*mE3CaG2x@P!!rNOypgbA}YTSU% zjDgOjvX+3hc?h(ymi2;KZ=m)TYXwLVsEq--f}j$@fws3;t1`ix(V2F!Gcd5TvlTNw zWr8-l*if5YY^cpHHq>Sp8(OoAt(I{k6pZ#SUwB34)qk>=~e-V^U@m z1U0+ZGa)=SK~S@cJqyC)W)NUuF97eP0X4hWVa+Zr@tD06Vk*bWRG$q5KTYkcA)eEDQ_+ij3<(0WIR0!oav54qAx*LMM-}HmF2HMmPluUL|=nKMMe#DSjiKR)O!$L`YDL{0Tc$Z((NE+e?h_w z3^LZN3=DGd@yQH~+>D@mMnLOYWFZ0qj7gwf=%CIl*s~yMVUTB;7{o!&0Tc57K_;I9 zM+&11XqyT@$oSJ>CfL@~AX^o{mYxP#3UTHc5K{(pR=YGPTp2Hb!c|rpJgjyBR3J)& zN7TSf1_qgLApd}(gYhaTI-m-#A{2s|3=Fc;pcrJl1&TqaqFV?>U?%7QT_z>a)*w*q z$!ma|yN?l+R2Wl1?gt0xK2U&y!utRyyrCu?MwoOMBn+Cp1Fd*xlw@QC#RaJHx6)-` zm}SSnz*x+|z@P+f-%5g8_O|v649dq?7#N;tGcbTuF={fZz}TvnSr`~*+A}by-eF;2 zSPNo2XJKIYZO_1<23q^5?!d*s0J>^Ym5G&sA=QC_K^3$NbGZX(LYs?$;XFG7gQ_Ge z1H&^11_q6ERt5$)9R`L5&{hN{M$JA}1_lmC1_sS$Rt5$w5CgP+GT4!UL2Ci%G{2dw z3=HZAxEL6sK*oG$WnidwWMELapu@m$Lx+Jum6?r!VX-3vgBl-bn3+NQg$@J5I~@jw z9(D!>9Z<^~x}RJHCZW2Om4RV5NC#-6KLdk`k}d;-nJ#Gfo|S>&vLge7Hb?}t#0^vy zs@`K|VE7GE{t~nbQx~LC58B;es)J+*eG?r9hDuHb20d6?uZn?z!2q;J$qVF8kXN}F zwKy0UG%Y}}=)}OF^?{3lLDiX!fx#2R;{aVU=*z~y@X(2YK{bMnfx*%loY4%Y=`b)% z=VV|ongeC{bAarDtbt%<<_GQZH3W?itmb53(BA=71al!Pvk*uD11JxJ_9ZY{GBSeV z*G3oGKonZS!oV<#gMk5@c~}{YWk5-8^J)&zUT4rce(^321_onrvuzJ3iLo-T(r921 z0#zy(5!y^Z!>X*c2f>Xp6VR|KYuzjc1_nk(6VR|KYyA(f3@g(=4h9Br?P~%WR%LAv z0JpDLnLwwRvw>w2lsxwV~TsxMVcIn!r0)xMV?PIU}PGD8GOX z)d%}SguxU%@Tyt@Qpw8f2+C1GoD2+R;2}0x#7noo$2XA2G(qd!;1tvty z0=!v{OOufi!e{so+9JyER2klO+X!vDf$m{tLb}*9+OzT0$LH5HkgVyCSIf52g3xK8% zn4CdrjFFKOr1t|O0|VHm{|tgljTso2xj+YfF|sn-Xf-e}1WAKVtX~OQCIJ~-)pLL} z-(P_Ct}#GBvKMOeoeg=z4svo}tHB&xMNJOO_Z=7**cz)rA;ZD$3Oei@bi5OLGHA|# z6;#@Tch|G0%mvjSpj^tv1UfK_U5;@-DC$8iTXqHT;rvXXTiuO8Z9GNBMWDSpfz}KR zjO;3m-$BjxC2k_l*`I~6=YNsl*`8M=fc3i-VEikvj0ua>dv( zFmQ3TIxsK@aBZ_-U=ZY*ZO_0U#Fb&fz#zagv-fWfs4VMfkBar z6*M%)wa1l#L78j19Rq_3*ICel!4(61DA*c1H)Ygt_Kzj4EGqgUOO=`+-KlAYr??rfPu^3 zo`K;Z1J`?V28KrrToz6Y438POE?6=!JYnGKaAjb4%E0Al$-wZ8forV|1H*F$t~e_O zh8GN6Z(SG|UNUeUw_#v-#lRJ9%E0iNf$NPu1H&5zE;lm6U!zTu=B~}a!pBcDV%@`QIFmO59GBA8);5u*0!0?TM z>!R*-7X9aKNz?s+b}TvWZ=>?WnlQlz;(!;f#Ej;*BlE5hCd8k3!NAk{xWdM zS~D>GW8kuOW?=Zwz!hZ9z|g?R)#b>*(8$QOz=eUKiIJ<=f`Or#kt@cHfuV(w%fXF- zp_P&Ar75U*;$pC8U}$IL5_4u?=wRe}>Bzv)$;jnk#lX;lfGB8|c=U6}W^PbFn0*qI%fb#iy^eh{ zl*`HvI=zm43Y5#n4m!P#eJYg8&JCKSmu!ByoW1kM?aeg-aJSO2xI!4s>V& zCz}IE)d_YNkgD|#AXPs=LR{fC3=B+M6>gxKG#6C(Gw?96|7OntRYc&eV!xr*GO&YY z{n%k#Mh0Gxx^{L320rjsvES^I7#JA%K^B0FVBlB}GGYrO0|Pq)2P{R*M&^QzVBk0f zG9th=2&4{d1jtN~5sVz4Kt|MnqJ$A{1n9mcb{H3I1S1FN#xg!tMATvQm zFmafIwzx{mFfgz)!Hr-==7No2;t1dXdBoWXqz-HZ$V`wC%p4UUBi6|>Ft9VjjaY=t z1slQ40lG$u&)L}-qz-HZ$V`wCEF8N*MqChKU|?r~8&M~L#049{!f_4a3Kx(%un{0L zK}K+MfZFHmYe0Iq;YKV$=7Npj<^T<*3fPM?FtBq&!UAL_$Os+|&>$-NQIN}d;6`Xj zGBB{ixL_lAIATB}rD_m$U{`?51R2500qPsDvw}7X@xqPxE6TvY4&#E2;N_SPG9m~R z&b$y;fXoCL!N+l&6Vw0!N%6sr_zemg7#C~=AIBq*5rUva9efZYKxTrB;OF4tVqjqZ z3-UZa+z4l6F4zcu4plA&1_5u7Rs0YmKxQ(q?Ga&MaA3d5&Imf$8@yldHawAo_v_t( zav9kRLBVqu%4K5b0-1FW%4KG60Lk8ma#`5HyH_7TxvcEqeR>a}TsC&_KD|d!E<5`d zP^dkIayi%!fnw|ll*`FJ8|0g(P%anyYfv6|2IWEvt>;iKw9tA1`wPmI7X+1LOv(!E;Qe}kpu$S*;Qe}kpgDXR&B$|ELa4M9+$!lbMv2r3zvlyw9_*_%mOj~%>& zjuo0D4cM1}QVScDYse1XLB|f|8nJ_S&~ZSy#_Zr7bevGG2|H+^4m%f=YbprJ{Y=Vc zf}kwSq--Gw%7;wKR)V0+#H4H^2+9#m%61GKCqM~D0G#r9nApuYOhIWJT#%bV4TBcs zFfKT&m~jN~g33R?5C(QLNLJwmon6nv#BR+|0WtzykXyrz02kyiF4zcbj>#Y+zy-NA z#0Zd?pbTrnu^VIrxFENI8v!oJVO+2gHXPSLMt}=)8;B7gGeJh!a{L1s0WQdG;YNT9 zau^qEge`|8AIKx1g4`Bj1jtN~5gr_ld<+bbBGdzJ1h@!=aluA-aK!L2FhGh>4~P*U zGeJgpa!joe@$Ov!|>IpFdWG2W6FOK6NBfv$d7u*PN5enmi zjqu`l1Tq3#gnB`Y0GY|aw#p2&*;s_*mLLNIJGk%?gBt@byu_hgXyGLR;iUlOLJKcNC>L6IDM7i=!b=&- zg%(~aP%gCaQiXD%g_jzX3oX3Vp3C7G63~F0}B{ zg>s>VmmZW0Exh!hTxj8C0OdjpFGDC7T6h^jxzNJP7|MkfUM5g3wD2;8a^(diK~UiZ%1BJgTI`^4RCYV4G97mCR$+T6 zSC<{URoDT_)nf;56?TMj^&thF6O;=r=$xTkXhG)!3K}x`0BTHdG0K5D{KB%J4nJu9DHoTU6axb{*A-FF zfC^}ZI4_r}C<6l@7q1v-Z!V`fs5#A^%rOsSTQ_KdE7y9^I09Fr8OWaHrXX^^F~}Y{ zD-b!s3S`@TXAoHm8ZzN3a|JbnIsb!)bgDRRgG|x}jfim_wgn9&+%achIKaSVUU@N&Iy0C}aw3G9^#vY>9jTn<-|8P`NWX2gMnxY}hv0S8)Q%gn&J-w~wh zAV)Sx)ojpkH`iH^1;Jb6*jASegy`aV&80|o{T*e+yI&>$#>{b8^^6$Y^)VFrc{ z5e5cvP?+&ENH9t=fw++C`<99@Fi3+5&D1_l{MkY!*=21%xkAmfk* zK{*_E3WKirV`bwPWnkcX#R3|b0&h;{0&h;{0&h;{0&h;{0&h;{0&h;{Lf)LrDtc7} zdaXCBtg0vjgCvu-D9C0{cA=#hG$?KWJX4JHg+;3M_8z(?wFfsfSV z0w1Zz)vXN52jC<1xWGs1aT%z9u3rKlsmBFAQjZIKq#hUeNIfo;BlY@485l&E7^M`% z7#Kw5T^Se{r9n(k3UUPTWFS0723Amn2{SUv7l<)1aBTwjmJ31iZd_b;prkDe>Me7L zgNIp#EJ6OeV-3p1vp}PjT=M3i>}F^V%5Jx;7#O%1m<>RhwN=F!800c785o!x7@4Pt zfj0O$gE%1D806+SFfcH?F*2_ON%We7IN-3BOE6<#VAW@2z5|i~-TlU@4~hVDI0Hn(30($;OCY0)!5SDq8h%+aFfjHrf)pp{GcbGv zX#m~Pt!@Dtub2o5fJ7Gt2KBwB3=H5Mnheb@3=A3x+zbpn5)2ILh9I{e1u1*s!oZ;E zlv%>Scnri%ab;l8YT#yIP`_i(z`%GNB(}kofkC|xG@fw>6a+Ux%cdB#Ku5)?M}yq4 z1*C|mPs%$=(K}& z;xK~eV;8$IFz7Uc+{Ofsh=U-_irgRp3r0p=#w1WUH83)Q4A@}E!0-cP$W{pk20f5T zZiWmDt3V5{ni=&$vW&c-y32rZI>>@{Mn;gB5NOY%I|BowofHFu2Iz1yV<`p(9nich zV=vgw0(S-m9Vd`)`@sAe?hFiupeO~c3p)ogzMD~8l7Ybp6sITLL6_cvlFJ=K28L%K z*(HpIprj~b#K52enuedq7!Oi?L5zXni#r2@@li1b2BTeK3=G^J3=Ae9C8pp_cnl1N zpp>d(#K2$&(l?cHGDzPKF$M-*4+aL~w_*$oCN@S445n<*6>^|0!C<>$j2IYlKzdd% zo(Aaw+2sn-1Gg&%WEV&Y*e*o|2D4p83=E*a_$$f4V4lgqI2RlNg&qtHS{Jw(7|i42 zOBfgzFoNpi37}~^28$1d3=E(UwFEiQL7IU<4zw+YF@w>}6nx;KRf!P;14!JIF@w<@ zBF3N(vIi0o*0U-Z7#L;!K}`ncZ5j;>tiMGW7_6UzCSG+@!J<1f8W<#*K(jm6`#{M> z4iVlbINJ?+bWS4y(Krs7b|W%c!r+zyLbDPa0GMNP`M) z28J8pMR6C^;S;Md?vPov4Lpz;H4s@Ch&roA(v}6(Sv4leR2sBt!O8?}YOpb~2=4;T znt@vw?BEs#JGh0x4sKzvgIgHv;1&iuQVWAcyB)MbPL)Ns1#|)&sD;6z2QmnB1Rkh` z!J-e6U{Yq}1hp_&jHZF+B9#R>K`jgxV+c=}6V$?BF@x|#IYHB`EaniNI47uu!D0d7 zNpgZ(7%Z0C!KO%af?60XR-iNFn3QEXZ?ZBluvkNQ@|>U+2K<^ZPEa`yzb1?m)WTq~ z2dz9~QdVK$0^Q9r1#~taC{yt>@G$Z+fw+)s!Zw2DQ^5qN{A1t+w=j5_=75&1F@h}P z2T3yUGVKL93aN#`;&>FamXMK^4YVkY9o)iT2e&ZT!7U7Sa0`PS+`?c7w=mejEev+l z7RE!+IWwSZo>^rLLHC+4nS+*=G5Ufo-T)cQ4?1rEase0{BcoXrXqr+Blxf*nJwRKrc_2yC@}8;T@DRe1}$=DN{4zEBqF#EWQG~U3?a~2&tNmm5N4Qx&3Fh_2GS^$333kj6iSG3 z79dd(zc42TCQDG2!63@G3{*rrGJ*;yDbO@D=!^qVMrV+y8zV?W2_f1C67^;TiKxIt z#TYd}qJiKN93*~0H~mfc*xAaAO*S`S;L!wL24Qk1A{Gy(aprb5bDjqAPrL~1G*X- zB*MTTtH8s+0NNKI_YdT#T96Z%dKl&RF+mJ<0PWaoOlDzVkov&Hz>w?Bz@YGyiGe}t z783(QBgpjgObiS&y%`u36L=UHWZ0M)7&dw{Fv$F7Vqm!A&A_1a!i0eVv{h!51aW*`R0 zw{bq8tE!_DNd>I=2s3d8{E4)SGSkcO!Q+Yb@}%@3O}Fcg?DFo0G_ z$vp>!csex1B|#ysX2QUb0x~=sR9JvRJj)k3#OpvdfI@s4$Of2laHy~IMGke4DR@I2 zq_>(Aw3`{SY>8=NIXu)2;Gu5Jz@YNQgn_}xl!2j@je$Y+0;p9p8I=BR`Z6%6F_i}EZOC42V1jv-y`F*Nzm$;*+`}de3@RY2HkdLn z7=Tu{fjtave*X7mU{IO?wGPE6kTwsa5d(wT6k|w$fKH#rrpAFmZI%hdIc4l`7%D^Dx$H2g-!@f$)4(re?hJgV`Kzr%Q0hM zXaTuGjT7byF|aG1`7tnP-2thDtaD_VSf%w4#FYZK@|Y%8s_B_QLTC{OS_nY{8rh9% zc2LFVkrhv@g1gZe9=C=JYJO0~e~=Y7VE2$x98@tp9w%19O|?KWl|c@)P?^ydROhiW z@6l*rkUI+UkUc1xSef@~G%#p`Rx`0UgZ2wDGHQc1L$k`Of$p?r)L|3>)js-+;Bbc2 zmY~v}L5Fd&5(5L9I3pt{gCQjN!LquH)gWyK;JS?wl)4cr7<3q;RTvo9Bp4Y%_oMKG z36L&`R$iuCpkj-a0g*Ed) z0R~zD#SYpl%Fn>T$Rd0dv>*!H?BfJC`#8bPK2C76j}zSN;{-SRI8mB?AVauRS#;-v znoW>qAIKmkWd?3YvkxS}q|C?-Y4(9~2a~cOH>BAI;R$m?ntc$SC^w|p2jPixLz;aM zo+LM<*>?%l!cvyzhBW&?mohLZ%W{KCau#a{Po5j4*~g92?Bj+s`(A-fQDI;M&76bQ z#z6xE)a(OsA*BJ`P4k*Zm;7z|B5RaI=r|FR0nZDdWk&z|0A10Z1LzrO(HUrW?1Zl)o$ZgfjM9%SWP}y4KEXD=auM2kYoiT^C7qq6(DJdrV5Y}1~JAW zP_wav5meZAfrg|(ZBcQ?wII<6j3ALMFwuX^3=G1c^u{<9l*<^z7!5!c%wz`1h->Xg93ei00V>63mygrEzlZ$aI;e#tc9tEQHGhBfk6c{*v8Aiz^KK@ zz{Pz!l8EAg9I5z#uEn%)nqC%)lTk!py)BAI!iYuffZ}py18Sz|bDdz@Xs3 z%)oFm7}OrMV_=X5ohpTBcq$<`JQexu7#K{D6--QqD==1KgIC84%An+%V9vl$0P1UR z$N@R(8E8LH2m^!cZBR2C#JB)zW`{5^sK8VzfcCM3f)%fk7>k zfzcVA2<>!Ly;q4CdhnHBpeK7V32QsMZ(Ka0tOrNwNf}VsI$Tu7*t?N!9fiY0d3Q;U|{%U z!N4$)9TNW<;P~GZ&cLAl$O01o45~hs3=9pH3=9{ciWY%eL>EAcf-E75)MH?b92lbv z%3zQ>!OOs~9JJ+mF(_kx0PD_(U|`S&_bxwz`C6Kwto#X_X=g+*Fz9%vRx&VtX8aF1 zCs7C7Ui<=03f$6{Kt;({D3@JT!is?bH0cD|@Bm823}9~@h+tq~P_?pRV2H9}V94fx zc##b(#}WyW%L6U9v|?arhsyDRoJ zq?eFo>lolsikwk3LCymy23>!r1UIS*rkJUU0iFQN7&Ji+1`V}?Zoz}8W@SF2(EvA{ ziNk?GGsTL50i+Cc3m!t*2^3`t44NP>P7-Ed0BtsfDPyWZ*bQ(5Y>^tQZ(RSTQg>2VFpz$-vkSj>n!z1_t#5R?t*&0mcALPJj!OS5OfK z8BjqXV9me)-XCSgsK&*>08YJkBB7;ML=-gjZir%FkZ0gyU;w9F5RZXDRl$aVLCTha z0d!{wD9R^*t>=hlV33mFV_=8|Z3qGn$W8(e$T~zbFfgdA*+3oUV8g($0aUo9z(nd` zB8y-m`(PrEU?P8@A`CL1O4-hqfgu5Od$%XkKF}3F8O#g}3{n+*3=C61wFo$|`+!|l z5)Di2zF;cf!4NdHUP%gXb7Y7Cg9!CZS8*WH~jscsw3*U|`TZ=D@%JO6-%k85rPE4^Ql% z-B_UXyB}E=DPf=_c98Qxir*qDMoMs~i5=u%P%0MTL0F6>u{$_I61z2uGK|EY_w7_=Nf1)&$Xv2{9z zfk8_S#PMHiMMt&SPd^IAYJhAO)Hgh+vZ4#>~KQJC=b#ZZ#++GiZJQH4KCq z7}oG2;)V%P3Ne~6sQ)l$V7M*Jz@Q0Q0=`d}f#C)YwGIsGJeE+k+bkIvKx$b)r~bl< zLnL#J7&PZuL6oTDP~yO#2`YbH3NtW(4$^|hbpr!~<{WDVhQGoL49VzvA;lacNUt@- z_%?JU(2~xGLH&X?)V0r`YB%9js|hLzKuP`vk`h+tGvJ~aZmD{JEyP6i7$`#%bZ`gA zrM#eHhmivUu1T}Y7UEI^bR}??YA&&b6xqS(N)V>3v4u2u%FvZSO>tn*EU|-FG!uss zBL?*@JE#Xh8$%(n4%KuHrzTC%ekV|5f5fRo-NON5u4aq_#0|2bW0R4?1L{m82F(@+ zNaQ*rDZvP8%|56>X-KM&Q!dCLM~GdWxRuO-Dp`YD$u>tw*q=vN0uOt|eV{wXkel;J zDIK&|3)JlawQ|7yX=VmC5T75klnyl5z{;S<7zk?XlrS-Z`Z3F#7#M!WGB7ZLP8ik) zH;PJ_K%E(lI0gm-(3%=XP(sWE9V845K+xHTu$BfRasyIx614c6hNPOQ2j0p+Qf$m% z2(lS$HY~3}#@yg0Bi8{8dW>11QmdYc5u}a9nSo(u90LPmr4R!H#L@L&M?Z{XU{KxR z#K7>(iGd+Sh=D=P$=R8Ku?^e`Q;la}(7XoPY9q|RUQB6Kmk^ zGl4f=3>g>{|3J-!OB=wBH3Z8FUSy~1V3bW5JY~9LmeU{=}Z(Nr+-0X zq>NmQpah=e4BaLT+SbPo9%bMHP3T$1gLVdhZlVOW4;bp>85lUghv9I8{B;n-1x*k# z@__Vxjb~us6me!?@Nxzz10@~sV3k(_$VXh@e8CM4VMZB7P%;78`T%A#NC0B949Mn; z1endB@hpaU2_PduOCIDvHa`Gy!8Xf-Y!*pmVBjorW?)zWw;6n%k53}VW+uo;9fJ;N zOD@A1M8H3T27Cfiz@JT^AmG7cv-l39k@sd`U<_acc{<01fgvlAfr0TDXvWwxkAX1& zl#m%S*nL5Y0zsUfL)oYi?)J{-;m0{!28ODfuYWwfnhpmb21OewX;D=`ObifhB+W6 z`xOv#E-2={q%tsYW-&0%1BokuHdF9#ac5w-;LgCn>0esHz_=GA;giO|Ah6AyfdLda z-~mO@z^xEt21^Ztp%eoHgD^NXae*@-<3&c0&(b^?7~<0y7#KmLraT59cU%PdZfhFM z$(KP+ew_yK&K;0F(di5f{5Bp83=tkM`$3lrFyyB*FmQqwNj(B7Yf5Ke5U}%rI7h(G zgMk6$90mpsaM{H83LF<8`(Jo4Fw9A3U|<9tYsY>EL4iMA&XVt zWic@Dr+6|j?DAw_5C>;%MX(RVvKbh}!FgMk5tJ^|K>Ph6%SJ(0Kg)m!7BI;VTO2Iw z3QE*+msmh&Rw#gOC@y4Gaug?4aHMo%-;KD%%HAQJoL~6{`@enL)$y5;}#& z8V;KCWVU2l2`Vb3d_ZI_NQf=i2joQdFTM;6j4YGifFzFkgUDY#3=E8H_Pz`ZOl&Ls zKx+f+{6U9CBzZG1u(B!pGBB{Qf#!4B*$Vv`7&sU>I9Qenf|fJ=%Vc0+Sq_R2&~hd( z5N`#9$HKt;(VKyRWhKZO4px@+jv)2m)2=o`R4{NJ@?l_L*#rt|&W13HtT!yB}n@yKSl9pLG5xSr!6 z!$3={xcwLySWbYHF)6b$a5L3_mJVI?Wnf@A31V_cv785;V!-JQvgsnkWel8PdoRPx zSS-N6z;XrT9VTT~&U+x0S3!Znq|C)RA7uVD2v3NCc{a%T*Fgu=acHsJ1sz?=c^aht zKFmi~LA(bLdzd)yf^geQ)A#}+6nSw0w}Cr%YhE>VrThy7Bm+IHvcokZU)XIkghKv3D8kb zJRnEh1%)r389pt3{Py_heK{hZjf@GMK8Tl(f zlFW?xpd+J{PqOhhg8aq?&dbco{p|ePLCV<~>%sC9*!iPD_H%%T$(WU|vGacfspn+u z2g~1JXW*I3#J~VDjThu1VFn(Mw?MkVd`<=)kZVDzp?qjFMqnez;XI5lKyxKBEHR8X znHd=P!NC{D2njz1{s$np#)I9)q%6e`4wwWeSDHa!HOOg+jElg<?yJFo>Q4Wmrv6bo1mhFo^yG6+c?DSQ!{v@);OJo`Yny7qBug zF!wxW5ETXK)d5As50K&$AjP_%L>O7Xz#z7OpMgPC7337qwJi+pg$xX$D?nTeP#W1< z$iN_ef}erm3h4Yt(3&2`;~;BuK_{z-zu;$Jc+CQ-UuJ?Vm5MW@4WMyCweFO3^ zI1TMBVqg$65MW>sxdk%&D=4~{dMqWcfE>dM4zD{!3=HBC0t^gxpk+&$42;ZRVew+n zwd|n41nnZ1f%g2^COS@GQnp}VU=S++-DZ@@z<3wr0Bw+J1_o}X63`SFNJO>{bYm#f zG-d_{9#HIp!VsJY7#X;kKmy!MptJ!_(i=dhgMktdJA)jf9Vis77{O@_WIYJm7lRJ7 zWMg2E2gjuqI9~S@GcYJpUa${E25L4E~c@QH1paF++C z&T>Xj@~kccE%*nyuYwU2%#3OBHJ~I`3FfUYV_*>L5P+QRRt=8A3m~Btpea{SF~V32 zwjuzuXq16LnUM#S)x#m-%%}niKn4cTsaZ@6lR-xlL(a-!41m;@9D*QcLGZ*p)Y_8r zRlUri0SpYxlR;S$e7YqI+F3a)$YI*ychy>qz&jK0yvkEfrE+V zIonfEX99E*0n2kX(0~9JX!QpJ8xzY5HeS%F1NoqZw=dvEfKIn$fpNh`ykOG+trG#A zZprcjVg$%ckP$E00zgJU&mRXRUXUw5r(3eTgqjF8;w4))$OzEsmMkwJMu5y@;CaTy zz`()sm<_aagB^6bCCgK&J_dHs89*%0pj<{?kbjw!nRr2tW>RM11=$Qb-IDJo0|Nug zE3ggFW(GeK>xbu{CBC5ZELlH+aw3y5g8-<8X9brCpn8OPsSpDL>$gLor6Nvjd8(il z8lVj(Yy}`DNIhte2^;JLO99XcmTd47ECoS^nu1#Apu?J=Cs?wTd;*!)!d8|7I@=O- zatB)lND-4VgRrL`16w7813kf#t;zv(Fw(^U1_q`g(ArB8rUoX^k&Ga-L5pU@Km>z0 zlSEV?0|O&d$3`Xw21%ztP#cyRBqDhZw6>f&h)B~B!AjJ^G zz`(@K$jA&@J|O)aq=%ak%>L}pz`(@A$j8jUAkzg>3|T(IAj<(dFC5h1W)NWlIYN%{ zc>n_gqZj1#I0goW8|4fPjD5@u4DulJ7`;HoL5oKPkg1H`AW8NL1_pUhurvBhW@cbu zOi={65t4&I{b!|DObiVA6$}i@_m~(MK*v~tMT$PM9e zH{@3^Fff8nh=jNy9K#I}AU9lsyCD+d2Kg7D!X^sLNkVl{9N0k|l~^6506LV6fkBQj z9^{N1xHCLJnI3Wa?p1hZg8e4GijxDa@Z4lNdBW;lc<~3sVOgTZJiP{>+#L zQJKQPpvhPUN(klPk`SZ~gs)dIFfg{W!rWU9a&KNW%)J#L_ih1k_k$c*2~zm0nt?&< zCCH>|P((P?FfeF;5MW@?G6RX#_pmZB#MLk`Xnh888$cykTMYw)4oX}%fzKZY#rL`z ztik)N2IM$h5CNJ3W{}MXodOH49|S?!X%Q;}gAgdQu`=j^&hBHYox}>-#GwZ|yN|67 zv=fApQ4e%>A6xxNu#5=Pc~%AnR#4fZ2Ravkt>Gb5{5eP*louH;34;0^w?WI6A%%Tn z5Tvk=5CXXbg0~f-7WS;T4n|`ocrY4t3kSG_XG;c^n26KR*it~{Gb)Glp_m z*rhBP7}!jpTvqmGkYZCPmyO*X)PgXBa@pBI7s<1kL%AI6po`?$ETCLY4rgB%1~yA5 zmkYe*p3Mr%_6V36Q;31eW8;!Xmsh~a)3#K54$eK?YVL76)`ih)6eJ1T;KL6w^+nt?%$+a;8N zL5tfkl7T^+y9%@fgj+d`fkBu1YA6GP9`~^*1_piZ(kKQ71Mc!L1_mQ;>2L-HWA5m1 z1_l#uk6;D{Q*N6m1_m?k6X6UD7Tnpv3=EdsrqK)xR^0ESL7SPmH-#`T9A@CY6~Vx8 zhJo8U1az<%H){;&ye|eGCbs8n+d;cPKs7ttb2eC})UKMu2K|I2UZh3pP<^1_tnT^lUF6Mu5x&8S#?M7Ia)3 zsAgw-2{!^%v%|SyBVMvafQ$gu>})R~Mu5y@U<23eY>(OIfQ$jv>}*fr#(-*ewr5Z- zqaet?Ov+4xAV)JPvj~E02G#7GpqicS71#zICbn;E7eHo#uA^uB2Gz{K4!VvW&ILQ^ z8{2D;lR($evwed&X$5E|nGJj$J=;4rP_l+3*AH-Gz{&L^l*FE^x!FP2(X;)Aa(UQ6*U_{6fpVd_=P#5CIem-mACwC@3xe%GlnXfvf{lS4 zl8_*0L9j7GxsbCU*qESP$XO6<%up`mEC@ChC>L@T1RE=q3popdjSb2b2Ong^#t!8| z&Vpd$fN~*cL9lT`xsbCU*tnov$XO6<+)ys$EC@CpC>L@T1RF1uD+fNvhK&!(m1hTC zN6*F&U zl&i)Lx{jVr49Zn!2VFL_Z1e*es3przgO%ck4oH42VF+&VJT?aAsnHA!9IIG3 z7#M^SLKqkrIX185U|`_>mjUYVJ`Dy{R$@U649whtAs{d9iw1cqAR6Q){t%Fte1aGl zIJv#T85p>@Gb0%oxVgO}K#RJClA=MzJvsw2?iXlzAom532)9Bss1+mZ#FY0Rd^?0SC55&>SdJ>kcZa=fnsuf6le>h z#Qrb_2Ig~&%#%487$iaW5HOzuF&U&l5g@%Tf`Ng>l992Boq>T_W=bRj14|VnBeU!j zP^$4~WMn?g$-p3|0aE492x2oxfs{&52W`n%$;fz*lYxO5I?^U<91Lo}F)=bTfL6$X zgNKm`#Ac8J#hSEe1Oo$;0aTOBDo|+71zENVWSBA|BeMlaAIObN%8Xz~%BX@mRT~%? znI&$6{Bezu8MM|9;*V=!CGx8y85o%FKwKg#2a0zEMn=YFE(Qh#yC4PzMkPqITy{Dr zk+?H5GJ=i|S5$}xwQwRJatsoBAYLsa<4!IH2BkM)3=E9*pzvXkSOzliJtN~?ki>ov z=OdWe2Wqx|0(px;ndvbX1A~f0JxKO8Bcl>G1B0*?<6SXs1_lvBP@cOF$|s;i0-F0~ zd;n6wq|C&iWDbhDhaW+Q)r*3RGU8@n5CbINEp=KmI9qm zpbYMOs`^HPu5M;zRQ&;RP#+_s8e3_5GM7#Mi#7#NJ5xEL6Icrh@5r;<8BH&UATb1^Vz zgC_JfKfnz91T|3e3uqS#cyvq~luiY_85lNzj7~bq$G~880%Y_tE(QkAItB)vi(Cv0 znIJo!a4|4^@Md600gdMUY35^KFoki=Kq-`|htU|6?tXYPFob~AJoDmXU@)=gW?*Qn zV_-0aiJN(WF40WY3FT&Bm{!NYU_OJBfdM4>%bS6L`HA^5P6h@L^ACvoR2@VG`7ki( z^D!{!Byuw_Y^`HpFnR!TV=gxX!+j9%2Z&e6&A?z%&%mJ5!p*>tQ4dO*3>Kh0RUq9U z2QmLO*~iJi&<2sx4D*46vq6Fn1A~Mh0|RIct|7E5&pdH|y&bHHv@wM$f>!T_!$_?L4_wM zA!L9e`m|;r)aRNrpt>~Icr!3;1cjHyJZ=VtE#3?ahd};&E7c>_sgGU`iLA9T@0JPv^Wv~K`Ixy8r3xGx) ztU#jWq<<*$yP~71ZC=f{NH`H!#>R z3W6%CqmUVSMq9>Q5ce=6BdAQU16M}&j1M9i7?`FpGBVmTUIbN#)nMlBa0UjZIZTX< zHjGok7#Nt6AeA7a1LLnS1_tg_sF7xZ3=DQ)0#sl#NP%h^d&X9fHJyy0yHJ~i85lTQ z!Gr6Jpwi9`RJ($$wgYh)q;drr7?hbn`WzU0qZk;t^O?X^93v=2AsOw&XbE!CSw==i zP_h9V!C=qW3=(VtJGoVdfq{pek&)4vv000Of#)a4@!vpRDuOzm0etQ}L!>!;!dof^ zGOCk-G^+EW4AdxKy8xOTXXH2sYG*($5M?6zo&y#}n;6if3?rx}s`G&^ykM*lHURm7BO$)Vql=c^aSYqeipP5D;A^?E6`j6 z`0Rer$OQ}P$OW7Wo(*`;b_;1v0yJ{L1sd7`O(?toUjx7n8o6LW9l3yW!A87blLbvE zK<6aDMu5x&8S#?M6*OiB8o6LW9l3yW!A87fO8^-G8o6MBj9hSm%tXvdECCq<8o6LW z9l2nEk6iGA{0o|s0Nq^xnv($83>vwB%}Ic4fOdEIotW}KixCCDtHZ=8eY z7!Zwf@EpT0Mg|6<4TxJwnMy#rSovF+$~0kf3``XuMbJ40rb-A0-Z*Ck4Woh^=WKqd zpy>s0<6IQnI2Q#s&PBnEb5U^PTolqc=jUKuyahBP0&3f^!n#BPpe_+BtV<*S>JqWS zxFm zC~8y=fqbb9x;2ZDmDygqfr0fpGpJYqUu32Nsu~zoKw;0w%Iv7!z@P%E9~ia4^#d!j zgLVUhD!hCbV_{%W0}%}1Dno-2Rt$nnWYh$=mDxKO85wfeKpn&fmhb}cF|^RQfmCSh zssuR$Tp)rA4a%3Qf`_@8(FzS_Rsq z3Jqq|LIchP8-Y}4FhhnrxuAsxGg6_!j9O^GxnLuZ3Jqq=LWB7+8z|<%qle6>g$6T` zg$DC0aIwV3#Qcp7v^kv}G~CIII@}58f}Qk@?K7wx0}XdFLxwxKKuMN?2Rz)#{EiJ& zn1Y8pnNf#3nNf#3nNf#3nNf#3nNf#3nc>5oydYP?hC7*2hdY^3hdY^3hdY^3hdY^3 zhdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3 zhdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY^3hdY@Cq2q3l;ZA1M;ZA1M;ZA1M z;ZA1M;ZA1M;ZA1M;ZA1M;ZA1M;ZA1M;ZA00sH-5uoy@4ioy@4ioy@4ioy@4ioy@4i zoy@4ioy@4ioy@4ioy@4ioy@4ioy@4ioy@4ioy@4ioy@4ioy>^gPCn3ZC$ly?C}+a! zf0jJZJ#OIopQQlAgw_8nu)#TS{m%j)oCDYYM?uq`)vWNrIhK+pRt5(C7M8Lvpk-a4 zH3lpdAVtvnpQRGQf!6;lRTo$p7(^HaLA!M{;d9pDwKaku6I9t47=%FPvoeT+>Nu8K zQ8rKqM-)`Yu|PXGqM$mCrQQcDBgPcO#=yV|D(OT)bsS3r=#phdMlq%=kT}SChFy}N z`sSY%yuP^_3u%CZPJ##bq!}0(=2xTEHx%4Ag*>gwj#l5WBiA?VNc9anYJCIef{Imk zr22*(wZ36Ts&Cj)>l-*1Yy?t$!;V_tup`ws?5On(oC`JrslH*ytZ&$n>Kk^{`i7mz z`i31+-@p^;fHzV(Nok~VAR4LgaeHthl>?=b%7M~IFo`-PFfcHSx+XF(u!z2i2MuP6sDL%Zf#yC%bwS%&MGqu^ zG^_(_sEP$$HY2t(k%589myuB!v~m>ju? zI3=Mjgfl==@*u~HNHQ>Vfg1MU7QZ4)NCC`ckYMxxMFwQ)KB&dt;LE^pvWbC#F^d&? zE(^0Fh#A}rbw0Ba$VHtXE-09pl|jzG*v!Bn^&gZDRLfWy7{pr`7^FbXXI29%25~`= zzzlAeA8mp9=7|pjgMlyu1G9+?Xn{G%$udm73=CjTu=p}C=z+YY2NN-Xi5U4ZFn|@u z`7$to{3nwGWiZHsns;(crK}7LN^;P%{ zejADpOF>+O4~5&I(FgINe>>ENAiF#uJ_Iqrjs`KnJ_IqqJ_Io^Mc|6TJ_M-&F&HEm zuf&7S=|)Lm&Fu^fj56$S|A3gh9Vq^B25}Mo>Fz-B&qWXy;UCUU6#uw(BKZe&A_21r zYWjm`47h(VMd1Fi0L3cEKOhE!tRm=eIVK6l%0vurRdzBkFn&h$7IPPhx6(megtyjr zp?K>nh>P&n=M6LSv(1LJEBcr<}BR&NiAe-4AV z2>)>RqWC8e#6|dLCWwp3SXXf!Q5Y z))e$HKnoAJS1=PJrU+ayC{=<}1Bk&O!N`Rfk9~a%42+LK6Putdn2-WRq94WIH6Sj+ z-$(jU{LM81r9hbt;v)QgeFBod4?z5VLzsbK7AMFM(8LX{9QDWy8d1UD*hk^ zDJXG+@PvsB42&N z#(2!g-!Ykiff01>2>6sQNaQRG^9Y_09|2# zRyJXJ8B+u$5cY91FyIe_$4Dwz8yIRBWKaS@5EOr?DIshcDChIQQv#@f{xuCH5Dcb6 zTLh3QwPHF-AnXHi5h+1<21-ispMewz3RnUGv)sZI0R;j$!a?OSIKtB;85qv+U zxHHq^T;DxmgL)Eou|sl)^Z1{PIN<9N~>1_qS?5e9}cd<+ayxp52(EC!&G`y@y_ zLxh20DoETuo`C^!Ncg8Y3=GmH%nS@qd>I%TKpW6(Wi`P?MDIC43Mztor@ASo9Cj04f{Nl zu(6-Vz@Rcign%0S{9L>L%0@-r| zFfe|Eg$=7BsLarv4-FeuaJp%n4-FeuaJqRppMgQ;fd~V`4w(I{;BHUg0whoW5Mf|o zwE+7S(;J|q4VD5G4+#HUg`4LJitCgG82*6=4OpWDiZU=v0Er`#Y}jI`Z*}|`7%D_Txm-2HpMfF6pMjwkq!iS&V{rsE?eZ2w zn>Z|vpmciJO4|5{?N=QNnT3QcyU8v{AR1(1AM~T!b!#TZ6NhC;(LosNuL{DFXvzE$G4~ zL=kGb3?&?+mw|i-(h4pn)`Pf+aQwcEfkEYlC%XyrEwkQsx0M}p1z`!_L92#hl0({a+XrQrzE2JGOp@9aekQ7!i zFsNjRF)$>FLqiEtfOo7y3JuWxLwGABc~I&CwKOBdkpij#n!3Oh4m=~*!z}`r?8{bR zqz+I~2KG8wqXeT$B8EqIu3}(dtd>CWDAQ^bk7}$&@o2+p1_qS{Vhjx45-1)$u^P#v z2gC@}RB(?vN)YsD2HYaBN1v_6>QTtdeYXU3)dVYp8faF7sTSlpMn*NztOjh^mKtbQ zgQZCap~v=*ouWKf5%1OPRs8PypdgN~ufVgwI8 zGpfVadVyti;p+(?ZesY&1Dd@79Tdm{*%Zf?1ev{=ApuI55F9cIb@qk@c~cy-1TzBz zOSLa(Yc6C_6|*=kBps&~hKpU@GeixDg?seS$D9*oYTw#-Q1D(843u7Z4*rW-_obvA$%B z1{ncbc*Ob=ZUkt{6r2k-;w4)d$OzEFBi5G?BS2q^(ovK(3UCI zXHYI9FUY^3g-0MqgBBivY=$p9Vtoa+fsKjv8{0dOS)erptlyxTAzP;4T(FbAv2lX7 z(}C6yuzrI$=@@9P5VD4V^&ML)EA&!b)(>!FKwG9*KSH^XEmN$Ypj^n7Db~+WE@aCT z>lY{&vSo_(E0oL13vwlF4FT(Ss4!&96zdNt7qVrF^(T}I*)qlY3(AFTnPUA7d! zlndE1#mWNZLbgn?vO>9#EmN#)P%dQ46e~NF3)wQo$^qpsx2*)qk-1LZ=tOtJDpxsWYWtb9-|WXlvQKa>mEGQ}zYukS$ZJVo)w*%M`0PlndE1#VP^iLbgn?N=1OE@aCTt2~qo*)qkd0OdlqOtC6LxsWYW ztV&QWWXlw*GL#G1GR3L_%@Yl03(5y(ve?IsmClFY!+z$h>k#A5^% zt#er!7zA0_;+Q}a`xVs;3~ULYDuGFvK?rml0$U=e&}33(6awu>XG?;}F$+m?Ffgzs zLwGC<%wnLkmr@Rb%o1RCGh}065C$zZVD|tOPSB+W?4A$~2ZLY|yGt0zzAPOE26itH z6J+1*T+r3T5c?7sM0nX47}D4n7(_w7U}a#wk<7rr?gKJg47@&(!*3BA1A_o~eWCz( zeWCz(eWHL0X!DQ&czvP(WPPF_2j}9CAPYh36FFh)6NNzQ6FFg1ze1q(iJZ$J)-wr# z)+chVfbdv^K{o!=3C+GG=)HCK_J#? zihx4Ro*n8j=vfdlkld2qvqv566+<{wO*5+?(LBFNK>O(1nYS2HjueFuem3&>w; zYZw@m*g@H?1Eer%4FiMn-&6($#!d}R1_tQv3Y9<<31T!#zf=rtmbhJhaQ!N97h6_|olM&1Z zsgrWyW?)cZ0&Po@0+qt@jH)2N?_vb`nE_Omfx^C-n}NX)CZco>=j znZbCN5u{!RrsoJZ1A{782m=E+f6@KwILXI2ag=Kq?svIKTl8>XIzHbw{HYEz!$G=NP%>JHqL~1d6>xDF#bX;Qt7Vz-!3aF?xmU7`;Mvl6r;gh+ZKF zTCb1;saH5foPmLr;~)d5{{!kgaU6y;=NZ_S%Q7%<9D(o{*)NNM&Lf8KnAksyFfec& zgYcNyoj@v&LwGC<%o^eh3>+swJw}e>pc;WgfKe56s^ccm;kTSe(m=t(1wOciLzl$} z)S&_$+`^&H0x^Ms8+33BhXIt!$ejqX+7QZR;szbu!eIpEGIN6tZs9P7a#^@R2e)vT zK)I~kpo3dDOrcyhZqUIk9A;21J2&Wr3l4KAmxCL0a0`b8l*`EjI=F?y63XS`eyGC0 zz+naDa&v>absW}EE)VxnP6h@J8z`5TJB)*Yfx{Nc<>LnRQaS9PTz+oQ!7Uv2P_6(2 zFX-SF4hI%cC~<%fZsBldkp-R42tK%l6MS$BC-~qNPVm7koZy37I5|KEw{U_FZs7zU z+`Zy17)boWMlX zI=&Y)3c&#xg%C7j0iF2+-pRo6j_oTu0|O+v!bc$>$@L?&>&^&qFnkn(8+33B2YeKQ z8+33B2YeKQ8+33B2YeJl801POWj5|-pnM4*h2VY<;=)HExIqWEaKJ|)xIqWEaKJ|) zxIqWEaQuckhld+@~6atca;G+=S?^zibIN+lY+{uy*3>^QVdIh+bNrTR_h4u#p zxwnA0j8Lu+_Z1KqJ_^D82*ibtLU6Z%iYoXh1a}+AWcVlq_Y@EpJ_^CT2*ibtLU0Fz z%0T!i1os+t&^?1td!@L4gUSQ=CVU&HO0a`E;E0V9VxV^HDh>t)agfWP9dMQskY%DREM+%2Ku3;;hA^;H zfD|z)Ge~&)F|brZIM5C_OVw7;(JA182u?pyP6h@}@IVA7cp!okJP^UD0&0kJf(Ifv zAp;STpl&z|v>WaLT7C!WhO@MSn9`tbI19KNE)D92vp~AxGN4AYEbR1?G>{%pZ$4f?ggD@0wSb9N?9I&luChm>nsn!Oi=HOLIJm^#wHqfaoil9?j*!&q8na#Ku7?eP#vatCxg4hf) zAf?KTuAtqV$&8>*$Qw`~f_gx0pu;Un(+R|F0Uhh0lFiA$pb*Nypav4!rd|TNJT8=h!3@OR;m^&$pfMX%&S`+oj$qW7 z05VUb6+~)+bbyp;ZRBKN@X!Vw&!Wf+IsuM>L5DGeiL*h6F^!4CLx(Yi(Sku2q!J{p z16q8JEW^N{euNWZp$*8=-I*XuFLHubTBv{`2P6u1@LmShf3Q#hc?ui~YK+@J0cywy z^7yP!28NX&&wKMQFzA7fVPSLyg*s!h3Nsf2gHI>}gCEEaR~11n2r~f0b<>XsWnhR4 zWnlQl&A?y)T2sO32}+w%hM)sk7(GEL@y1351_u3%PzHv)PzDBN9+*NekV0vQLNAcQ z?;wTh(p(G-J)sN?eIN@W9C#QQj5N6z7`QeuFfbT{+{xGvI@H7jbj$%)97rD{qY3DQ z1Fk$!>Skm#0Ud6@RRQIIw#sq`)`PlfjI1Cr6HvF18`>=dXZwXb&}^T?VEPl3H1sEe zl(RCY=`}EjfwKN#mD(W=tPIok36w z$OP0=WNBam9ZJP$#>4?SgbGw{m^0o0WuC>1jOL7MQW+Rn7cnwgfX7c*rhs!Rqa`R` zAqWPBaxPE@;e<21TdAH7>70RBvFw{27}z zJ7^CsWd4jTpM43D^Jn1ZDwEAMkaBQyRRG*v6#zF^1;EW!0Z4OI$cZJ76Er;rX|95p zpcx*N=BhAia}_*aBng@b133rYTm@Ms)WTBc!N$NK2AXVRsQ@WrQf3eXH&-DXcym<+ zG`$3FuCn{J5Ib)Mo;89sSGTi4XN_1|K}_(h5u~{ao;70W04=bDoRB9joX)_&)XjL4 zje&s~L`ZCTkkk1_s3pb_RweAVw@Z1H%pwBM8b+f@x8%V`pGEvzdWGMJJ4bK?T&l15GP| z8^fyL#;_{5F{}nMA0({`Y78UGFfgctQUvH4^B9mD0>HtL5yrrf2jbd+`ZbCm&pZUX z_bD3#Lq!+^Lk&pMBo*Y|Z)^+t5r&udMia@oVrym1rC4>X5r&y~3 zLCQJU7M}-M4qC3k23xKH-l@+9Tdn~r#>6XPJK4iCPq=)Oa_K#Mp5Mq28I?!(NF0N46Tf!KQb5?{xdT0^Kb-!P6-#V1q}cP zfx5wvzX@H2A6JqJx9=wvc5a3mOk z&W}=NVBqKF@Z(`&U=RS!&2vP9uABmy3%b;fBN=2NlQItjGg}4&14kN2y96T-$b0J< zK?cBjpt4&S7#JJDd-uVTAg0e21_sb&jSQKb3=B!2OX#4JzDzw#(u`@0hLHV3j38-g zs1*2OUUrBqgKQfM1A`nB$Z_(Fhe77<2dysz+X+64M1gT3=mJ6TtuSEGwIF9q1??Qp z11Z-4Ib+^d1_tmZJdlbPEDQ`vH$j^8K|%IpD+2?Aa)cxU!(>*_gf>V5d}ZbLtqcrG z=^!)ag4A(sV_;C44~ocnpd2I%;?{x`&j)c$w=poNfbJ|~TmZ5g?B_Y03=HY43=A-j zF;y{0vn5PsOq|Tf)W9Ik7B`tOeljCd1?cE$1_lPuu3xaecbp6ioyhuNDkMO)iyGq! z4hDwAZAd->EsIjx3p$j+66DgdZ45|~2iRb~0_WCFkh{UY0%zAbATHQfB_MCCM>e(@ zq!aALN|4-fxEHHH$5MmWk;C1r%*DW9%ZB9F2B@zIz91@HvOyvyHY)O+D zlfi+2EoeZe#*(JF4iT;(&1#GXI2ah7Bl`-pTuNyZC|Y|!f%OLz0N}9e1#$VeGcYK< z07Yvbh^qwRf`gzR6a=Q*VX-{nCCG4cPrf1?3=B$OC#8a%)CqS|+FcH4n4`qXWp*U@VZ;i$ z>lss+DjB31lb9;7rd3dwV)ZpPeHd}^frEiz>vpIko4BA1kZZw-X(Cn;O;F-NN;nJ* z;Ny)znLrCvy?}BpgDi*z76-*QSR9n@k;Flv4;BZ-Kax1eO<-|QY(T|96%;GzXmXIL ztPI+qRvK&VR}N5HOdHfnV}%}Xqz!7NvDWK=+i!AAMx4-Anl`AF#@gTl754&(gK9Tz z&`K4~Xi$yD$f%9nGSmStb7Gy$1TIn;+c_B+biu@Q(BQFb59rKtrb(O(46>l29K85n zkI@=bAg_h!I1ADND(iGXIv@mC>=H-VVH~ z<$|5v%EQILpbI8Isu^TKgTQi3;#>?22KwNIcdVczTy?-3GPx#0mhCY*f;52%h$c|| zst;bg#|k=yRgZBRsOFgfaWp6m=%P6q?0kfy4Z&;LSc@1TI`qNIn^-{y&ocD$gT_U7 zdcYf}DmjpGQ4Vl13Q9K&440RoHcn9vGzITAV8&Qi!i;5I3G+(Oy2m=u#%=5y47)|G&cIR&l02k$muflcf~MoZybP-Bq=X}19jWS$?k+kgdWw*d=$o*z6~ z3g?22K-z7<0-5LMg6=k8LE3G=0-xsxkCwu@U?Y%r8?Zp;`MHpG8?YelHei9z^TV!Q zgREO2u-kwIvfBXOWMz%x1GV%(O;%QLp$BS$fSRnVu$9N)CMzpSla&><$;z5?7IcxC z6H}fK$ShEkm8k&41epaIT7fUc1s|D)Sc(fSJ7PdhR?z+hXp@zxL=w~nZDA_whBaB4 zDnN>$O;)B#2nX6^WvWUC9hnMUihB@rWGZ+mt|)jZt|)jZt|)jZt|(+Ft_XM(hRyF2 zNGW*Ikl^X6?28>i%{NeUm>s1#%#P9=W{0g_767eYW{0g_2A{6Vj=Fl8eHF-h$iY<{ zuC<`%Ffj*Lff~HvgGa@~au^u+I6r}IR~AkxO=IBv3}S);JU)wof%A(sXrxD(NuVr; zfr0ZYsA^+UW@Z=2W?XVNzz1$Vts(;ADex*(3@|OBguW84Xw%7?_kfB+^q$ z7&ti?-N0Nf_G2J(IT=B21vN}1nfO2wkoLC}*bLANj5J788pL9dWNHJQeZ?fo!oUDg z05S?D2U;s4VxGmoz{s_%7Ib6iBG5(5qIW?eq8(Wb3<{!$vKbf@MZL2b7?ebBWiv1+ zGl+D8Zb;?YI02-=G@F4zfq{*ktC;Z`3j+hYG!p{@S1DsI*yjxFpgZcg%D@XMnUq=B z|9~d8Dxq9f_Q@b_4V25q!1n}n`EM;F$Y6c}?i6LvP$Hxr;z^Z=i^I4_fI{3gIy^@N;wL<$@H= z16{#U39=BR=xjCv19vsZKcJh8`K7s&K=-DBy9nIbk3b==%pd^jB5>D(tYA_WU|?PY zTD;Z-GE4?`W*O){TV@&95oI7dnPp3|85o#+m>8L_ure^nfpe)36Nt?q4+=8{?<@ue zCJiQV05Z$4F)%2~gG98LK(dOeAhtGytqo%9K-h*Lwl0{>pu`xa!@$5;48DvPH2QWU zjDg|QcF=X*Yzz#_H8~*3C2R}~KSAxMEny4{y?hJ|>1+%Ps?cr-QxBsmxQC*00xH{z zBFhGmRRbB!2+|DG2=2ddLu47`SAvetVgiMn5@W6w0|Vm}a7=@AX@xT|MC|}2JJ7jK zU?)uhIjM681B3GVVg?4rsa)&~40m^cF7^v&VA##az@P@w#CV<$%^)+NHfKy`%$&@~{FyOL6?!!R^Jm5sRp=sjkgf6yL1$4h zEe8!j%7Y?ZiLp}ywC)=u$pA9yO*jLC+b#wMMk@|jgscQPX~ixE24zr^U|a=~`Lm0G zK@+q!Wmh-@!zIuG_8YZsgflQa31?tX=U`ya1|4p~xD}K&%yu&{sNV@^VEDtwz@UCF zoPmLzAGDwuq!Sc&>Mz0>7{owA@*w3pUqLxoj}cs8KpG3s0o`5>1_s?^&>_;G!1UbB zz@TRhI#W-d5mcI#?q*=n2dQ7n&cL9`n8y5>F@u3YiSZ1myx0%+AINVt5ey8gcQY_B zN^`>ew;$v`-aRl!9|5@{5yX81a>;2>PAS>Lz+kYNm4QJmf`MUzBm)EE39#=&A{ZFr zA{ZDLPpgAuz}`uSfO<780^(KmJg5kRA>$8F0%&IhxnffU1HvR2(Dl7S%vWWNaq$d`7gslsj_0|VoFE?7FS1E+)BeGCkyU;%kPJp3^vD%aRJC64o3JuNcw&T z21d~B7JA@9go6O3%G)G>|GKrzOOu?Q3j{)~*Eq*MgDVF9&hjuY*uc29uUQ!woDMQD z*nVeaV2A=SnAsQ@ia-p0HU@^SgA5Gn7ocfN{R)h61ID-mWiT*U?__0Qh>2og$ckcM zV6@ccWni#7&dR{B2xLNB6r|u%NrE!iKuen#Gnncb7*x`rVp34C1_lOwkRhOwP8GI` zrXiAnAs3V!_eC-=)PNYLBB6NzbRQTf>8t;PI!2u-3X&Pr*`lD?gCmN8p`D+B!CnmH zx-O7S(1-&U4(fVQP*V+H3Y|a-H)AODgDDJ%f)qFEc~Ix87r_{1Fh)fbq=0j10T~9e zUwr~h|0JkIj-aSxL@lZWLCtkdJ_ZIMP-C8z!3orXXQ~CoEhD27r~}UgUA^N3>cBJA z2k?Qq_L59te9(O!PM{7vQ$q$+JP#xeYU?|JI`BNvp!~$h=mhG(^FY@WIfFa!Op}?w zEe^)jd<+cIU;4j5^<{v^K>}|2G*+})!<$KY-m@Y zvmsxB&W3aaIveU0=x{Em2h4_a1v(q*73ge8SD>@O?mUODS^~}Bfi4Q?U}8hM0-X)@ z3UoH4E6~|scb>ynEg>0!bOkya<`w8{NLQe+F^!K;=YgLb`u*4wjv zgWjJG+4T?Sf&=Co+dt4j1fccyY~LWavV-ndhTa^&_KvLzw(Fnm1Kb$U_7Jv@P%dQG zKielL7qaW0?K6}M+4ax%1!0l}lndGQ&-M?>h3xug`w!(pcKx$4utO|@?D}V8 zgmNLf{@IwIT*$6}HfAVSgdMcro{a^{h3xugV})`dyZ+hOpj^nVe>Qd~7qaW0jRVSs zuUdjQ1G4L%jSDIZ+4axH4dp_1{j>2vxsYA|Y`jn|WY<3%ACwE(_0Pr+17G*FT#Ol&j1RT5r!L4CO+0{j-TcxvH>>QXy`J?D}UDgUUj7{j-TfxsYA| zY!XneChVeAh+fF9e>N$oEPT}xL>98^pG^iTs|&j*6(S4S_0J{;m4)p3XOo9=A-n$B z6rfzlu75T~C>OHppG^tMh3xugQ-*ROyZ+f!pj^nVe>PPp7qaW0O%2M0?D}U@hjJmi z{@FC3T*$6}HccoOvg@Bs3(AG=`e)N-2jxuIkeUFy+eT2o9<(Ni-2-%;IjCRn>BqqC z3E^-s@F%gmfYuKQLN?%om`utHf{+dPpb=aqN;d78HSo?Koh=c7mW`I}X@Pvmj`_IR|XmP7pNH%z-*=$C2_8bT@$$b6x?+EKu){ zxd6ljxdqf8Wd_e(F)2F;f>uN^gQu>TlpPs_KwYQ?&?+jB%b>${%q5_iDE=1avh|?l zO(5ShSAY~jea~D8;XsG&n5(+k7#JX9aa?|{LCdR%8;j#yYz5jQ3>u4rpCllNa*}`` z#^N|(Q`3TwlLR1g@RI~U*29O^pi|1?D{?{ip{g^rgN_QgmiXsAw(&1D9xdE&~HMgLt?fNQWi3|1B!z1Df5=1qq1;gKjor;OFEC zc>!{J2R{P?PZ%f=K_Tsz$H2f70g6s0Wk$iNxeN?EQLdm{&Xm~%|K%_+@IXhPI2icZ zdGa+m7#IXQKw1jj!HO6JuYvSNk%4RRtA0no*+Mv0iYRY zo*d9P0mucQ;Uu0ikkgoyIT@JufJ~?aStJ2ED1d1J_?|dsNzm95vo9kf$X;eC#wVcg zLCgRjILN@j_!KlPcK{St8X)GrL(ns@Ks`=R&^*dqe+C9de~{}~4l^*w>VmFy3IK(K z42WCf%fP@G2;%C4xcng5pbuOO3@(Qm800{Ptl?!~0G~p&otJ?@7_=<_+9GDEU{HW| zVVJ6*if{2k=lz}{pORX`pum{MRLY>hn8H+2uYi~v1`Q`Lb2BhR9ARgb!z^*m}IkOkU1-sfD#9e!sfk7GUY6}i-s6*xW7#MaVJG6`e=1@ihh+pja z7#KhswcrQU*1(l8H86qP*;uato3jOJhfili^f&S`Fo=N9J%-*jSq8Ox5okyTBmr8& zg%*IIRN?FfhH=MK*<+e{(xdi4OISs(iMXWhy@l0xf?7FiaCh5I%6a#t#*M^E+|q# z7~C(;;bvfv2B+69PR``+4+H2NVPIfX z;Dwnp17wcuQ3eLhNYK81kYNlA42*L%(~!9NE zM;RDoeLxOh3rcy-M;REj9)lEa1Z66PS7d(f{2N_IeV7$u9z@P^vK+(;h0;&Uaz#UFz zP=`~Wkrh;yZ)IfU?jE{kVL8SmR2oAouLZuqa zgjnGUN_-$?jEtZlhgbo26xa%VaL=3hFe4+V*a5qnK^Hvl%?F$Jz5=orOn^*ePyuPy z0e6v^L0x2Ha8H=I2vYqp8iTvm%t=tL3Ap>s4C;P^3JZt@I^ZrcGicUY7d%eDJedjN zM+bfe20btV@*abVD?bB+Dw8)q1A_{v9yVfZ%wu5SF98n&GJ=wz9>_Hi0<=J%!4y1d zzy}>Q(1SZ$4;)AgbHEEYFZjbd-Mw0|d3O2~3P1f=-M(A|}Q`Oi-H`)WXI)F&+q-7zcIn zp)G8t63_%A=q^#vQcCavUrZGsMevDn2nX82W~u^>ok3dI?0$QQpY3K_%nh6ErrP39 zkoBj->c_w-0Oj(stAP{?Lb-hGS|F2!z_u_c^FtO*NrH|^0L3Fe z1D_R0UYHT&LN;DbX~t~0b7Y|wLY*TA<+88~7cww#%0syv?3^GI6rdLJFz}rL@f8_W zSr{1jdAI_0urM$PfI1jl@P(?NrKwyYpwtXXw4jM=u22Y%O`xlQfq^R=RAn$Jb2ISk zaz(!e8L%HD91C(dD5WxicnKh7qRLv@LO{E34pr0pe_YhL^;w7 zHCGzQF`%^q%mN@2GC@X5zz!G##U-=kD$t$Opk2!@tPBj`-O^0Tj373HG{{jhtD+eg znC3DvGRvq2F)%P~U}R*LWxNE6W<<}!_!t8NBk0~dxo4o*)&Mb+jzOEiiJVYI0gO=% zW57k)U?Njtj8&ipJE)ju1gU0_zRJqLpvVOBrxN2gkR@J>Aoqh*fbceu3tZV47$7e2 z0=eMnG0=hq1_p+$pxw%B3=Ar;hIS953b-u^UVg_2l7>lvTbgVTSq8QBAdA|-7BS|s zF)*luz1IdZTmy6y1tVm~kLD*(aBN^?oCsI50ios;sIX#?Wn=;=ih{RV-HwAUJ>h`4 zI0~fU&~eZ)x2zx!F)(b9VqjpbxX#AFpluFX_I!c?N%90pvhoW|(hDT1;|bLX($83< z6O7EQMU|~bm2J=hg&j!W1CYVVx7isOv_Yp5Hk@E!(ETCBz@V4N#=x-R1T-o^YZsM4 z%0Z`lO=L$3+ByamXeW@-UIjWa&NQ){0j?T!Y8WiEnLw%`ZAp+CaC=jW3u=cci~+I? zECmu_V9*C0bOAaf&Oihdq8XrMaODI8gCQt}KyCtI#-cf(N%AT-28K^37#NH|Vj!#s zTFk(8l7T@-8aZ^fpmGm@t%KX^fZ-C52-rtnTnr2oIk5ZR7TNz`6G4d@>N}9(U=u31 z7#Q{;o6rDN0ro9e8%QmfF#*FNASnhxP;K;=gMmQ^RK~F~7(?cL-g1CucZ?zPKA?68 zBct&i4h9CMdKK^jO+_Xx&;m_RE7}+`?_&cMcLIrnsxo8HybpIYH~3CwW6-=0H?$RP z0&We0=0!l^&u9v6RDyl@Vtl#xQ)n^#0bekX5cm=c!~xT66WAi#uVJZ2G8hN zfZK?mxg@ZempK_2%)ta$q4W*V-Xx}boD2-opu*FVF&9*H9cE+%B|?Z{7T~MTc&r)0 zr8A=x7XyPim;mKLbI`6K25C^`Ck@(Gr3k){&lKFk1y2H*f)6HSn#Rb;Xa$}C0-Z2z z4Q^=iKpUDlAQQm^l8J>}pt1?HUERi-QN56XfvXqdVNiUTgEBUQ34G=W>@|i%pphd6 zj$nBERI3QmKFvUCpMutakljAT*C++GEs-0glR#%fgFFOol*0G6!*8L7H%dWGZ^#r6 z3)0?p7Sz4%EJ%CX;kVF3W{KcjaElUYZ#xU>eV;5yd)rxHJBlE)L~t(H2&4^0bh(tC zl@+nUh!r;M3*KPF3LEwnAfizU*j61qK~{iTam;5ydJ;g|#X)1XpgTT+djF1gO;L$8bkTh(|0Hh@Y zk!6rA0dFS)Ib4GACCFS?a5#Z11mR;KOGQ{27$m`#x`Hg#IK{vq35ozlH;_!tDFz04 z@S-zsP*@x~#lWEOk{P5Kf*FIrTQxve5P|2s4cHkNxR7`AfVTcXhq_Fpp)CVO1IYfQ zOwg)3SxL~UNG5q!1_oJB>?<)Y2Dvl>#iigu!!Ec>BS0>_dWwNT8SJ!Jkkc45RK7zU z79h>Qz?cYk7?=UF3)1i_0okg?SOBuc0^TswJk7wsco%Mi1;~bo)6j8jkoUl*G_x~6 zhNu};kUR-q6~Z9F*a9*#2PIzjfQ&5%t%?K(aSq7X*Qa4YoC}h%KZ72oC8$AM3AP&K z25=BhVrO6gHF{uC&eX#o4QqU11o1AAXJuXIPgSJ#_f(cMQ(u@Ne6%IBE zwC!3)HW|zYN$Mh+7ka1*M)cr~6R^uPz)c5kSknR2Ow|MvAXA`LfJ!u7M0HF(vL0Pz?w2C1^~EI}FtH10_+=m=bq5gvTbZyqJN3I}#Ee+zk9o z-0`PD1{?wjC&CPPU&O$`o$3hkgEAunKRhCzRv+Zrep-F(Ln>aOv;QPHUoGCx&nMmNdYmYR1NYhKNBN!8b}Xl zDFhQg6Nt?KUPrIU_zx6H$&4WTAO$M}!_+ej42+jG?i2DEhn z#YLCEF1i64!%}420SfJC|+~A zz`(%h1lnN?j?>*BuPwO%bMFC=dw+nq;0+7MK}nGNA_IdyCv*&H2B?{N1l8lm!5#o5 z05Ai^mv9jV1I8U7*Ob6ppIR58TPGlaTmo`QS7l{j*n5!y zN%90pvUw>?@-s+M12lRF3I-5nY}0Ur8U*IHqsn%o%65Sr3im@eET-ThAO<*yK`{Z# zO-wzY!wVU!K`H1O=C%pY5i=0aT?2Ve^Ab`(J^;D@K0I81fVj_49gzle1ZWDFL6I>T zWX*foUQ5l>V3obK2cTK2*-FoCQG}VJr9oWErn8!c? z#Gow%N*9u-CWAXai{U0qf=zw{H(45NveFf($zXHL7~MclWJTLY0GeJl2d8ybZ~+P( z88-*Jm<_y&2-=fikO$=@GsZ-adw9@{(cxxbfEdGrX$&ulF&2yyKn^iMGr@rIEGPmI za|u~j7#J8`d0>&J0gAlMR~Q)J<;X{F1_rIEAWgQQ2Ab(r1_n!ShFas_HQViM?%D@QAD3IPFc=R@u2R?dh1L=r?f`F0H2GS7&weJ}j zZ6F=78t|E$l1xpYGdDq_w>FTD*c7PvERZ;8kjDlzddm|HYPvBp+JM>~JkZfwTX?Sw zRF*Mb=V4%w1{0t{oIxIR?}H@MBOXxQ#Kgd0#|Rr~1=V8GU^VvO4jF9KzAR|<4X8ST ztl9^08RV5f*LgF6;>ZEf33Ej4ggGIGgh8PWG20Q|GXuNM5k7Vb<~krcV2-G(_MO3l zwxCt}4v67sTSm}@+q|$v4xq@BhP#x(5k8C!H5+t`2zcz8fmayR`U35pf!+<#SO)3b z1;~OTAA*gKqjv5{Is*#4gn+3I_Ywlo@_uH-@_v?NtlR8C9aL~XZ*-eIYCjKjZ6MNW z0?^z&rK<@b+w9p8+w9p;w%N16*6V_|*|Wjd>tfwz&j#IQ&xY7$&xX9so(*-IJsZ+C zd$tusZ?k77Wt%+*Vw*h&$~Jorlx_ALD5p+wz?Sxcx7l-`o;t;Ww9THAoNe|@J)j|0 zNG}TtIqboosLW_I`OYFN1l2}j)>QY5ifz~0M zuLNak5zbPOzGLq|(#d6D9cMrqxz2!Q+(kEmj=K<52ALsxuN<`En4t``;`mPm=q53K zHm+L+psrFwH3I|Joyj2gDKjuICxEzjK?d-1a6L@`srXRAz`*q!y2?R7s+@s=>ji|z z!oXZx$-uz%5>zbn>u`PK15M$B)qjSlV1TIq0^zX;+$m*X;Q9*TaR_9Ac;6sA9)X)6 z9_UUk1}0?zfpie>2SiRpK(LB|f$JxPCn0bO04F+aaknjG1mLRZ6aIrDgg0{MVoy!4T7{R~}_8%vd%fc=R@*fwJ%fa3ZvJ1B4 zgNOYwC}?0yJ_OivL5g8ZK13M!wt)EjjG!T5HWMy!M$lw5JJ>!+sEJVfq@Y}=ebP`a zWSIt+43x_Qu^zUjLjYnuY)yv<`xKCM3Q)xo?1w>qSA=q9*u6l0SAudCAZ}HLa#h$j zfPz~E%GF?h1~N(&%GF_yC}UvYQiF0082Ic#{#IuM9dyOU!==wSlZ}A^;xR+0BB;lV zpj@cOjGw1jIe_$f*N5D;|S&QFz^|J z9O=Zk6k?(mqb)nkQ9e*bP!oNjTo&*u7%o33mxFy5$V~xIE)N4A3n<6}8NY)}l;MhG z+ygf;8mb6tVhofEbz>})%OT;PnZm#o59RW(mx4k$0m>C%KLv`RL?~B;9kjNUD+$V# zVBqTkNhdRUvV(&tn-O&386=2up^Bi^=Rvtp>+_*pXb=@ZxjYPfb3yS|$an%|q6}9h zc&9kT#A>J_sEIXDF4V+YC>QFXdMFp_p#~@y>Y+v`7wVxVC|81k?;XfP&5WQ;By18~ z-Hf2=eu(wGP(@Jd`=DH?_5DyT)I$@XT&VSvpj@c+lc8J@20j^3ikQMUlY@bQUxGUT zbT&Kq^gV8r$usT{P^AhVfC`21pr>(!L3rE(#Z?Rp+!3IoNI<1iUNvZN3RHkHDGM?1 zw{gdU76S-GRWdMe$Ag%lai>M43=G^!pk12G$_?iLGl32`5N86V9&sj6o)l*SWessAP>vU80u@H$OrY{a z-VtP|1a#YLBsT+t0ytnKz=5Rb@0r5DD9H#G2YXS9F%G0g8ssc##$*s1>|Yu1aWx8H z56d!Ua5FG4$bq~i2l9{{C~fdz@YjHbkG6i3=HZwWEdDUn79}iazMNfARZqV1H;a13=A5eqiDel&{C3nAQ62o z1_m(0ii?4P_c{ZEhAZf}+8YcE8laMR1_q5ZE(V4@AO>jh2$)gB#lY|y zB+|~sz~Fp~fk9&u7Xw2hh%uLofngemu@cHq{RfU~1_lmU1_s9Kp!M=k84 zn0S|gL2WKK#9wL?xfvMtf<#)m85l(Gfed6|(1lP844{2Qdf=QF56XGI_n^m)+!lm7 z_n9CA!&+Ws2S`8;CgBtU-Ms-aM??r+ld=#4!y{~(96_247|(#RY!P^qH^=}GPP)gy zz*xe^z@P$7GDV;yGw~kO5k5i;4CZ{uj$qURj~|1_DL}HJD6(u2SwoP)j38-P@PWsk zxgoL)%8b3BwA=hXy#v1XGYQ#v>pj%oy82CBjC?f-I0Y2>-qhI&wmQfdOK~Mz9fO4;UCszysTx zz-7iM5T6y~fX(1?L*O9;gLyZIe~1y(SZ3;BM0GRBLa^sA3o$S}=0}Q~iM}w;GjZsk z`~I5{G)h6*_yv%()iI!}1*b4G#%xeAbp_Q=VGkJ?82`fkbOr3Edkn7Z1quK8F8irkU5}>MJ+%>S8NSMQ1J?oIB3zl1!U+7l%yFMEkJ!F z*ntz4j5`z<7b%_(f!*6$}q%1PwqLBMdL8Wnkz)8d1IuvV@7@u3=9lUq8J#eq8S+WJz`*BoB&$An_N=Cz^DUahCXIsV9Us4 zV6-=8U|{G5@pAH^ycZx|1(aj_1ho5%X&UIXMizE2CI$u$#&;k)0>O5G%&&=t9u4;p zZbu-VCYTu#pu2w?q9KzfFiot?G76wp zBRAtUkhUa7kn$NYEv}3V3_K6P5}+k}P>UFN?|_8DK`w{tmtX<~D`z}B&cx~%7&agU zYsCcy1}648(D{m>(v_L%Yb^r<6CX$*4P-P6WFH_C=ngUFs$d3?K^*7U85me0k-!3p z5*BD&K*EcKgY`QoW;obgLH2`&>sdhiLKxVC@UvpD45H`z|ABMav3Arb#?{@90F!3sb|!Q|{285sDO_!*=07#JAU!O}c23=C;83=GSjFfcHF1YNUG%)qD)_SZy4 z!8`^=^%e#OhT~5d7zEOCOBfi{L28&LvI+?&7BDbsnlUgih@>$vYJsd}>R}YgWMI?= zc@-L~qAoEE44{NA1{GlHVHAUQLs)twr!a}ZdLcd1Aa{d8UL52d3C7ww1_ssyCa^0R z!9L&x+06^Gl7YdM6_hrd5aGH=~1T_(pL3~i6kYfZTnb}Vn7=)4;7!?>nUZ3)efk7CQFBlcU{F%=g z7=$J385kIq!2FyS3=F~=Aigq~-}QolK?Ib?7*!Z|fmSp1Fp3tXmM}1$WO@_Nz#t}2 z&%nTF$Rs`)|z-hdYBj(B*A*K zz_JVyQLzjRGI0zH&Y;Vr3-U@B7&VzdLGlaaD^UJt)M5hN%Axd(I22%uhMDRZ7-YEOAZm~W86;HV7#IrT7#Qk6&aPl!3}FHtt`hr_fk7rGj)6f7 zyapON2mm@lA9B3`qZI>#L{S_A!?!pFhK-<=ddolo9LoesG1VZ=?=UqpFi3!ugW{tU zv~Lqs3Np5W{XHKPD2w7579 zOt2CLh5}IC!XS|ZFGz#y85k}g6{O`?Q43OL@(NN`aP7(T=@kP50~;u3GkpdzK|4S| zwI|aTP_Qs5GqHn838t^m5|RUydze_k9%E8w;RK}{CN?OSjT2ORGO;rXf&8G%!3nB8 znK&3h>rR-Ixi~59$1!#fr|-rY&^7t0B(z6m67(OL1Fqpq$U|{4=W?)nUg?qy*1_l9eNvQ@h_R1>; z2EiK%3=Bfhg((b-f{dzs!raV!(tM$8f{a0o0&ENnOezfA+;-f|d<+cCVhqfDR@~Oy zp27?aEKqR{1_oAB29OAwFe5V`H@6kHH7jWFfSnhjn$=U-0(A2@R5L3`DW@q;4RM+%BcrDRA zWFg`V3~~rj(5Sw=8aQbvz*3DOXu*~eLJcJ9l#vBM+9-}X)UafSg(U|(BEVq`ia1at zK|_fPE(^}dNKpvNX*|f0#S6CptQ3?(q1hLtlph*pU^xNgq#_877jUu=f+Q7TXqvIGXLfK&$^$E8c#(@9KI9UIAGO30fR#9cuo6cIQsM}Mf)W&_BB1gG zQsRh0N*pne2q@i%!)*r_H4=!@0Mv{DsgOj3HUoncBCHu0q!9%XNHGJ03_`a8*f?2G zB*<|yGBBWIZE&K5#e)LEd{8P>MB;*$-Xkmo$%5KOjDn2N1gL^k#;8KFJ_7?NUxR`k zT2QFVG9tING*}r7g=JV77&Ji)kdazo1{VW^HnK{P&vi@~48et;E=UH}Km*C>f%Je{ zp!#42Hv@wKh{3>M2-d>Jz+i-&^1%LurCwu{JY)jWz`$UNYy$&>86*vx!-`XoofgO@ zLenzLOiO4ev3d%FykrG34PEe}ahprRjCNkZFtAQ?rZbO83K5+s#Ea}fgr zN(Mq!%)p=qQVKFe9bU?FtMh=J3(C0+3>wHO04@%4pC*P3ES+kByuiSqjat|0KuTg= zB;SK>^nhh(eMl~V=6M5T!_l&VAw;DixWi`z<1jE7qo-aIWIuTdgQ{~=WFe4%8Qdap zu7T9==IDadtn%OqAJHQNC3{eWLen`h-Dz+u5Zuh>L#>neVXbZf@kZMO7o+rWSPzKsVfSMqS$PbX*B8Nx{ z;Hm@cC*A@NSkxiH(B!9q zoJ_#>Kym|0nujJ!kPOHMq*MIObUV&{kC83B+8$XgiQIi!&xcoG6B6h=vEB1nl)6dnkOravrR#84BsI3!Up zFi0Tc1(e<-5h+9pVh^askVZ{wG7v@3#4d|7<;fwt2kZx!Yfu_`(DVk&2nvuSrigGD zq%naqRsu>=%5dXZL9Gi=*rp@u< z%H>2ZNV#CGZEg^QfdSDB0jDE6HA4`EAfzM(b>l%U2DdvT5dqJ@AcY*3;3xz|6R1^> zD|yO*icaKauq?Rf(wOFn2)PB9ImasLTZypWt>sq>cg=c_23!AuNTYabvitNM)M|x*#P97?SMRAn6!3 zLNhk zg2r)0QCkCI$c3^vtWcIfZ9zz)Cv+)R`1lasG>lLNN`SH`sXz`X7082v6Vxq%6qbBGyy8TKz;`$H_+vnpez6`u@FfBWR)r?_ka>LWJnUxzJ@pfR2XZZrgBXjITR^D zLwl{T90syh2V_43gDyA=f|?I7^FflJ^owX4fD$kRWVp@{(U%8}#3ChMP-@0(KqLGH zsq;~q4X`TS3{nxAgNklM_Z2DqTOtQ4q=jvT>}gODkJe70G>3qq6r-m}L4%vv+yN?t z!TAYkbR3jbgg~tXNF!Mo5?msX0*b^YH*%(tf@KU5WEJZsgB*E307IKaP znV}7?SGX7$poKd)7r@G8P#)BSw2eS&^--%3*!T_Vcs8Q(3{JG5+zTFV2N_@t&8*Oo z6SSfntQ1y4m_l<4R4I6L2V?}OAq^@ypyC#goNI}Q70|F6NFjJY2b#&jCAu{%ciTXX zhPSnCL1(+!!9yMFZb;6umtbIEKpD4zzmZef9vx-uv)FfgFxKX9Ui=RRoq1yx&I3=AkOX|(LEj--^0fk6X3-)X|C z7zPF{q-?B>CgIS@cI!$kXDe(A@wG~ znh81Sf|4l6FjGj8iWt%XCu>R*FSsfhnC2Gpa15wIfu;{|g#zoL3d4G+pd}HYVg@?e zB8o`zVvr;+4hbF!c!33;+ffkg=V>qCbxge!F1A{6o7pQ?43=Ha^0u>bh z;1ml@ekf!AAO#Ez+7JUkDiLG;kaWqwpof&Aq3IJ;F&Ti8CCo^WPUx@;NDe;q2ogtX zJAs-~Cg=q=ta1RC;2;%V56}%@}PEs8hJ>|1|XG_B5J!&3DFz@=Sf)oft(4!7J&y+K}9-xPY1a~ z1{(ou7lG#7p)LVcSsI|+2uj(=9e6ed2H5y1B$qNU=s*(iS1~KFiL2IvwBa8;c z8fYLCl%YX^3tIdID!D=F5Y(UmMVAyPRzV7(3%|fKZ-(HRRFpY4SW*Suo&YifTKaZQ~QHOgCJwby82tYo8rhI6-3p$1c z8x{abf~K<(Hb6$8P$nE8wF)BZfQOYKf_k7PCi&$sC^axJu)$IbJ1n(uAg4G^SYgYB zTnd6pUT7eLOJ4e zsfgkU+)e`d4YY6oq!gOMAmtTu0s{@CLK7HxR0C8d!%`;bU_ns+fEfgu!h(${qo-(n zXy*s&7HF#a|p;LL6a0H8G_6r-<60$7!)<|H6U!zH~_hZi-Cb1)o~nHoC2$0 zK})Ydu@2J7#=yXZtQ5rxZX_$%z#AHnhh=yn{s(!E4`De213yHZfk6O~L=8ZTg2tOc85^ol8dl!Pz{)#W zsKKDH0ZoxW`dH*g9=uftE*}tWb+|aV9^ybQPtj{|_*f-aDR`a=RB!XZ+|CPgJ7~EX zD`+%eXjLXLiDqJ^atVblx&s^USR2Mruiq_6@lQH8{zIEVtd z02V1A)u0L-su~*fpfzcrLNr+eu5kYH3-%_1#uzk3!qEy(UXD_ z+}{W@VVM_fTS20(5H7`?E~1*87pX;1t=}RhR(pX4s3-Km?MiG!>~damIh(*3ra?y`;t+U zBzUS4R5XB^h0v)=P?ZfENQ0F{h(QMAB1RplEYg5TfGaTu25c)sU@n5ys2~@CYE)2y zXJ7yimcd*C^0O|a_?rw`ORWb@{NUjN(EJD$(h!BI9Si>UV?O+2JV83Th9B-y|gvx2iQXbMaQ+6@M$JO&2Xz$};xiWJxyC2-o4 zhbjiQC_uVlEAhaxilE^z&@>^abOBFYD1%ZxC_})OH9)FEP$EYgiUp+uculPiNrWKl zktasj7#KheHRx0xxVsEe0$$LH+)059Zm}^i=%RLv^^jX@Af4c4tqcs%))=JqXNZ)- zjUWlt7)c*EnoK~ARZyleg*cRf!3;DK2O8KhN3xQefx!YK%lxoiXGuaI5-9&ZAZi`2z(WaGu$+= zJ*Z=D*!$s#y>u+dn!)i3swGg(Kp(e5=%zwGA3F5~YVH?>l`LY=YzB@wP&N}s&)T4- z0z8)?T5sr8ffOkD!LkMegES;P%fJ$=ENWr}?NR|R^Z+Fld8B-x04bP3W4?+ICbZB; z%IuKNHzLC$CvQ;3K-r-JNqB0Iq^k}onGj13!QKX?VU(2tAb}B;IB;Ymq(&qp%*9}Z z?1%~-;<1j;;M z2?how(C8C5w=giMfU+eh&!G)oKr=WbmJ#dI;n@Qv$AGd2q74Qw$+aMPOdB~dfs`Uf z$)Lu8>_-_V1F0HnDGHt_z%4c6w%tNoe$Y0)2&|Kc*nSH)6kPWs6~(Y2UObBrAw?Uk z(FLw_LFGA8qYGpRsM&?I;TfsUltYd;XkQajo1!d0h3f#tBCJCPYHfo$bg1orq#_%X zs*$$qf=X!>SQ-W`T7fpSuuYkR+yJr*F@_8F8`vGNRzI|V0LmenNSOfKZbRK1!3OON zAaWOY-W=pUJ#byc#=xMDT$O>WMs2mh8e*V1NyOxbF>0PQ0dYZYg!Fw-rX)eh-3*cA zAx$vk^iN!qg_^3cH?*L0d*Jppz7q_C>f~N#Q2}TjtD^`LfOl45Q1SK97 z$WRfahpmc~FyRw|3=Hb1nFCaNKr0~7JUL2RNDG#vw6XPPbs%X-7d^QlHW-0hN2ndr zp^(aulMkqLg@y^JOeQ=uiJBAGB6ei3u}nx?Kmk#g!`ct9ja%SW3S!m+Txg;sNoCZgHK9@tI%on)g3yvp1C$&z zQ42mTL^=m;AciJDP${Z|>{PHrU=0hWQ3#3pF>Mqcf4yfr2N!g%=xBp12+M7VCE*Bf!)!xtRkJcMm|!>yW(cf-4Rr@%MjCx;3AB<347nom1(fl4eQ7vPTPRiY)}R0ybaZ4Xv`Ea{RJ{O+rdh zNb4WvEDneS)GRe5f!CfC_N%&=D+o!#g*KoC966gIn`-tOgph*>!*fb#t5pmQTxN!lJ z!QR0JB{4+z8k)dSy4Rr8I9hyzj?RK5LwfgWAdMerL66vU1TI`bi4i`)2phYE7WL3W zlL!{ph=z|kC^=}LCUWT5Bq#}?FaCj+^5EnLb_guR>p&Mzf;s`9#T!UXedPV!ps4@` zLt#W-KshQ2Y$B`{0~g^ig&?;e1~HLaG)VI*AVn1PXJB42M{+y3KLeZHLG7kkqIXk3 zTO|;)7uN9Vk%7SmQKmpLGGZwRI3yu83SvVnJO|sO`V^wh0l7g2>U|)##zIYFV4%*j z5a?V1c=R3XYz1A%X=yoZ0c#1N4_H9cJAAGI)-D4F3F_QCqq4#?dhlr>zSjAo0R^B}b( zN~Q$~fx-(V+d^zXZq!k8nsL-D$dU2brvMNu(^#On5VHzph1OiqDwNFxentyuG>#os zGGNAMJ_ZI>gkKT+OTk?q&@?irfPr>ZVF&F%xv=&3&>>nbXulT9MXbL^?B(QzWEeh> zBN!O?kv)l)9|e$tmWzQw5Q)piz#s%V>jAW>4(d3RO?9AffbWlBU=TwJR`^bESpOHA znUR~UNC5{87ku{zfP4Z9&H)NIu=~L!Agt&F1srJj0os~^1ss$s1Wlq)E+`0*6oa-c zfI<``%f-MT$^}W!tf0#+#JHd>O9lpU7!xEefhg-i=Wju^GcdppVFQ(FSmuX7DIRn@ z5wtdd)p)Sc5(V%`7&r31d2s%N6p4rq6gU7Nf++Lvpz@UbSVe8Lvq2L!G}(hP1t`#< zTv(=nCVNn(fCd6+yauu536TqUAh`g%v6O*<4@WLwVBkkh^stx(<$N{<2Ix*91_tDP zLJVS{t9=-3m_av;{O03gU}R(j-IB`aSWu9YnVeXXnV-ktoS%}K%#dsqQ&5zjUX+-t zkd~Q~TCAW^VPU2jlUS0QngbyfO7in_k~0!B^I{UqiYye;lapie5=%16Qe%wuO!SQO z3=Is7z*4&Dd8N7t)k&FoF?xFXIhjfN>B-6ZiDgClCVJ+2M*4bs2m}(%%uCKGO-UV0 zZUMQL0qjhlP&Y??m!izF)S_bj&|oKh=lr5n{Rm%IcSn6aJz~^A6ys8vlUQ7=?~+=U znVbp=73cii-26Nu6hq<<T%>ehLUIqgX14D3X zNl9j2dNITkKCUhhhHq+aeo-Za9h8`tk`MKzQ)x*_ejY>|be)|T=%RFHMotC>MrKA% zCNRl@K|;hKBt({pfsuuYnIEcy4M_)t4Ix<=7+DyZ^EufV7+IK^^}wo&IJv;0Ih-I_ z7UnuI&B)9G7H4Ia2lJVk^Fe%OMota}MrLLZ$->B-3X(%}C)`z>pxfLSr-8}@hWDTw z_!yB(hS72Wl=~nh6H=K3E(Zo8Y+z-go}NCq1cK3cN+M!a!pb9j>OnaYOR0oUOMX!* z0|UsdE~&-IMVSR9`9;N$f(2eYFrpL>kb)y6H4Rd51ec^B>qIF&-~|RNqHus07;Ko< zf=e$%slW~@-dLFyaWXJ4-)3ZFRtM+j1aNMt;}l|GWUdFZ6~QDEC_gf%fY}gnX)qfi zo(+~|;S>Pt0_8p?aK5bolMwadNa~Bh?0QfRWrnC^hN^_?0&(jY$~TRVaH0tmhfh%boXyMg#Z2)+l1FO1-Of%qb@!UEi=Vqj$o0EvnsR0V%)rLKw`<%AlMC&(vKYJav7+>$i=|O4AGSfQVGuXydV}c8(1AX zm<>@4slM{TW{H8#0%c}KX0YjSS4;3PFfi|Dgq3ZOGKCkcsTfQ$bMk>p9VRwr22eH1 z#>@=13St<k*C zKrw?EY!ZazWC2wXPM}hlVawnSLuhjkBMd>|wuXm+L5P_Z?0+V3f~^3hF-X4%oTR}i z3Csffo`H#l8I<~XzzLC=4N|XzL?OK=D2oLm&0GO8lYxl^oMJf`7}=m94$crTad@Hz z+rV57c7YH`Co^iC81OPMFw27S2NT$Q5K9Wm0_z346I|#`V?xrw46~Jq8D=XJB&C4#FoSJnmIPVDTm$wQq=f=b zMf15pH-|3(<;Ovr69-YL0B*k`Rgj=ModG&5fsx3O2343ahe8-&RU|V}RU|0K>;a|0 zT$q;N7 zB=JJbWv;>@t^^jh0h172vmoUrxYY|c0@Nyh!~j+`111j|*#YMdNNK_R7$QF%*0)2K z$L0i(xsVDQLe_yj0nXRZu^b4y1{{X>89?}6JvkC|b?0&*#G zhX_*WD1ueKgt)67)DVFu8#w_62IddoAW~ppWL{j)38FS4`yX6nF+;lgkP!IK^E4!;w?cSlz=NI8$`v!-t-$df1a>BQUNivfg?Mop zt-W{?5+#tqBZvnfekuiL`bXf*4fiZ4v4B%6JT0#gVqjqY2`-~ez^!yps~)U`nF*W= zC)RVyfgAdu(tvOpmjaJMgBtvhw)Dn&P7!dK3bGm!CZwlvP=OCm;~)+bs854d2&0Rm zrEzp=Seii>ho^Cn1bGPnmc~IQz|%O0LyWU=xeJ&0MM$I{f~4wwkh1u29k_&pa3JXc zq6|{D(I}0B3Q}Ss7v>d6l7IvZh>c4ePZ|el`wA&p3qfTxvoM&1G=$SpZ=+Zx>STT>5en}fQnkTGU(rw!7#V`2t3fmoQB1;81s29)+$7@3to zI+%UIVg_Iml3O694P?v*+}3AdVvYmlDHcX%$Ycm4yYgVs1FAe=dcegAXipZ{9&jE6 zI~Cm7MXA=HI|ZB7zBoW;P(Bqqtgz`Ti(k(nFpJ|<2j z21ZULQ1QjU%9H|X9GBxKw8Ve zUI33^K%ENd>_NmCIb~oY^$Wp;W)x`N7^TpJFD4j7CBmZEykix)8{OFlYdR z2sIGJL@ZDN&8I^K?TAo}O9^CBIX@jTkqk?6q!jXyMIsDXOM7S?0xq?2%qJi%U}3|u zfCXu>3dFC_#VXK6E${^_oXCq*xEL5P>xcv?1_oxNX^12cUlTOQ&j6ky-~eT87Dnc3 zaA68*K7zZo@cu#{NQW7yZ4YTrO#tz&5&TIY{sC|S04WMV-3CYrQUxvyAjKb~mH-#e z@Npqf^#m>|;FcW%8FqmIGGBhX=2YOxtXgC~&O!@$bKBgeqNd={LcA>{`Pto_5l$|M4kya<*A<$Ort z3(n_|MRg3UOd231*T70Z1p*{EATv_njy=Spr{Gl&#-rJkxD~fKF zjRcGwiqxq@>u!RSgL4@A0tfh_1{TyA8=Pwym>?ZVD^M!C0ZwJ03<+EP;{p=C$H2(E zw;r5nfLP2o$ge2KKaP7$hCLtn_xf)3C2O^RNt`&K}y)uYMF<8AkxcaFA zn+Xw51B;u1>t!z}8`Mxp0JHhQ_U3>|hfWLl8^A6DROoSqD=19$sbBvfK6uWK|C%BQr0k|IG|(`hc@OGsJ7uV#8Ks zfJ!1rFha^zi2uQhiJ4izWgD#1*r&k2z`Oz0;(+v?p?zJ5qriio@J{0ikn-I~oyG!i zNP~(sNaqkzxIt`1?KDcj3e73tg6=a$K?iHW4@gH1GQb8Q2YQ$d;tB|f6u7o-ogh!=Is1CnC+`g%}13b#vfSqtAhfwWLR8MK`MmNGE= zc1YzbGolNIy1#(X0%6!L19*pwodH~!gSQqS77BARFhuy~r-1i7fVVj0<|gK)_+;jR z){`-U`*6rlbQftphliVO_Qil8PEayi`u5>*8?@j+|*nV301 zWhx6Ja|N{2<6;11Vn}ae6-cc$$OKRy1Xj{-1BrtAAmA+t@HW!{knmq{HU*WyknRCw z_!~0C;0P|&AN#GI-6n?P5ybh4?3=H8u zknnuCFl_PZG?4I8RN;-_MJi#S(h2)u7AzTp@&QuqPdGUvX&mu|8?5;>5KT8okqRNv z3s$5!(npG1{3RK@JSCV0Kxu|HWiFm_7THfQHfXR5TylXnU@$T;Ao&%tVJkG)2}?P~ z%)sD?x(AE}-2a5{-zqLif%HY$P&RUa2Ep>7_JOyCp_ZY@%YwlLBxFdA1F7kYx>Jl3 zQOYBiv9K~6KG4RE*bD+M*LlE&G;}u@FH$9w!N3RcOuk+Q185rwc%vPp7C{<~V@KIC z#)4F`gWBxi?PDzP1)bnMD)4C_=w#14P_ZKfD!4%%NmfohaIp+3+QG}@7+9HZfmF!A zR4{|uYRurG8PZ8)U}a)cW?*1eg{gqFB_XY@YH*ne>3hP=lK`pKhp7fP=HVu(faJ_T zJ$MoDFk&94kY{0J76UirS-^u|LeSoR5lHP}@X#D+T>-d;08ib%1T4^&hb7?^K?!vqvQVAnzy07F`{;Ki2E#hhRf zxL-U#TA#zULTWb1WD8_Y4IC`YkfqR&Y6#N41y@yYV+ugVe1jVU_9k4i3MBalhhz&# zvWXG2Sr4=^5VUy@dBg+NwX;Bqd%=piK~*RVBXc>@@Cd5n4IstvnvEGe=>u7i1b5j3 zkP>(;$IJvyHsG;MxDp;!1_tJ3uo@2%s&Gj$kmOnoYO1G93d+_TiAc0Fs;rULOI{ z37Lt+9Y+s9$``FMbsD=m{)+6fO?ZGpo|Jlb+AU12S~|AxDv=9G^E1~ zvl^rolJg)_2e3hJkT^T2xPo`bJ3xl*0~-eN0cy^h1d==gmn7u9MIhzp;L5>`T6hv% z1(Li14oA?8J7m0{7u?DQkNSg4HSiujP^ku+M`r+KPv~lB=$t5|6oJe=Kw8z{vIIKR z4;dK|02if@6e9*LN}bdh7?|HNF|x2Q?}X?E=TwySrQo8Eg^~FH6L@Va3%IZZD`R0{ z-dzhSs39TO0-k|w9qmk$c%Z-#=uG2j*ui?DB=wGwTV6<0mq_g^c#8_u27*pg!dp~G z`|;r|Dt6=+6$fM-auq0fYr|R`kjxLR&>(BYnZW~l@UG-OkZN;;YEZ!d$ykug1e#(4 zm4^aIi^0Bt^c(`0SfHW;w?YLC1_tKSV1=NruQ8}a!z>2skFqc^&jByvWnpA~4bI!l zkagb>_kM;f%aZ|@3QXW>ig%DD#a|#Y9gqeFcy|*sR5iqtka2zRupX!+0hJ*vpoJd| zFkeBo|K9+c!@|h?A7Z-(C`&_|MqXexxX@sREQSLc$1DKqAG0tqe}L(o0-nlbVPbw$ z2bN-Fo(gdnq@-YCeg$4a%fiUK94x}z4Jqv)PJu4ohWL06LWS+2fz|g$NGUCYX~NNz$8DI1UFh)n3(_6f#yP47@6B)j{OO9EHn_oPGezW{tk0& zH&}#O2BeXB70h9vl);3ks92alQX1g%5EQ^R!n_WO>Q-=~Kz4f{#8B`C6}UKjozONd z1_tIk;I-kPBqab!Bg{C^hYZmiuLCKAn4tw4Hei@FS`Lq_au`%P z!bSnXg)w}3mIz+!86eLN1*NO zI@$~j%rn3ZCJAugjS*CCfp@b(iXlkr4KidW3MxiHWgBxcsBr>W)B!FMz+2@0|bASA@0vS5Rv zz_O4s15#Y7fXe}hE=c1JA`V`C$t;BEazUGinjrP?R;QIN0|WC;CQxC^z{q$Tw4ajU zDu_fGY8*s^Vvrs7py4mbVNi&Je87X>r~^0P^#>`b$$H74l+M7#4q8k70Asr!#3V2Y zHyAW9hBO8Rw-$X6ZZHMSAaV=19n0Vu>~CmdVq&aoCYMg@H z2brqS0$UC-7}5s@?=FVVt3oV?43&X*8AJM)%%GknWXCTvWcC$Ylrn<61lg&~%mQXZ z)`7D@OG}U!7eIFEKzsz*mk%jkA^wH!lmIyqQu;v}sIZa^G}i)A4{1g1_tJTjG#4cphb4S7{Gh%+8`@^WT34lP#{36 z6^M&s!DhdQG%g_?fsl}JgedBU6!V;5yCKO5<`YmbKop6BO@e5HsE4p2B%~&QgbTQN z$_xoeIk3C-LiTDx41zfiR3DuLuU&+s6DSE;fd^3vA!k9XgE;IoL>CS2CISho}3IB7?}SvF*5H04++4xiGpGk z+|PnmuMj`ONJMx+f*F#?A#6yJhLA8{f>v@t^lpMA0C1BW?uZQ_N3=16`f#9_1*>FX zV%`C95;&4r7@3blv_b|pSePf(f;`2-$UFhEjuB!zL=B{|0ZDfOp!jBCWu8|HO8+d3 z%#XqQ+gMnbdul-e!otY>6SBb=6339kB*3A>!phtZ)Ab9i3)-;(yAU2$5Z{4F$O2MG z&Va0>r~z34Zt5g}QWhIC1IQJS77sXyfSAnS)D32VeF0|Gf|^EkXnB1$jmYR7*4XW~L<;rH1B|6eZ?lre~BuY8ZHxW9$g2XOLUI=xdtbH4QV;>OyFf zRLGctf%zb~lMZTSH1Zi({k~TP#L7Jf~jLecC>sXkW zGeMTHFfy+OI~(F!C@*f8<|SYsK`jP*6XH@R39d(37?~eIq64A;67=9=2O0!m)0joUodig!!33&^ zpkqvs0b+<=$c7$>31AV(z$pVO(+N`s2IhY7NHC;G1Qi015*%z5yz%}Hq!2W^4k<+- zK@DSrstC~fS5Wx}Sw;>Ts{%Jr+BrcvUt@^peDD#RnV_~kBLkwPNlCU3f}N_#%)sDW zR9R4xZwM(vK+9ut%orG$5vL)+5-TKbKocUc6(3z7g%jYDE657LH9fpdw*{ndCRT-D zP4EP938Zi#Od)*5$t{rZGDbw1a|a}_8hpwUXtanCG*HFD#Jm=~0h@)9c?P6L-CYA7 zt^!wZEKJNh!3_)+M&>h+ov+};2+s$g6j%z*K-0k*n3*^u7#Nvl!6g`EY6a|A=40Sx zjLf$gKr$>$%n!kvhFKVy7eP`XEbT*D8Uo;k`5N#D96eOU-Oi#hoZwE^;cY^Z|xFY-mZdZbt z-~m@?a~4uQuz?HHKFG!eNOKe7e8@UfUT}EahLi+I?Ga`c1{Fih++ekk zHLJ)ZKUf^>F=j{+0rnEKeGNV22htFPia}~ zw{#&<2O%L-X5ggA{1DvSfjR)<(N2h)AcZ~?rx^ny^CU>5T!nae9XJq~r-LgY7AEG+ z;3!~WWWE52XhE>gbU;A}YNCJ|C*YB0u(_BbC@F0F_5MqCNtSOgchIScL*A4eB|Kz|8|>HmER07H0;lff&32V%%(q`~QNEJ7V4eK3)xK zIy9EnGJ<^wUfIA59<^p}0*5_wBe-?~CuXqkpe*PvCx|Ivv06?Y@UaXaZ+!y?3}gg~ zg^77Gp}YvGT(5(pk%ftQHCQ{O zgw#)StZE{HNfY^zRg!FL{dz15&nf!bvTBtJm%9W!{E9TFN3AnEl@EjV}~T~&xs zDqCmcdsDp$jG6`133_B?g5maQUVPRz63UT)LI&eb_VrvRGQO<;< zmOJ2Jhu5$vP7DmpU%&^Vf}9DPHV4H9q_l$!wLk)$1ysX94iken#g>5#_zyM!qzO_U zKstbsyG!Mek3#d?nwo)~NbJOYzIw#vY4 zg)Ae6WHX9w1W|6ZgWKTaN?qK2|U69HSk`*B&Oav6~kTQ=O9Gb8+0MZ31h9O&Q zz^9@>%U{T#C(L}1doW!BmWAig92d|KAOq-(0)%q#Oer&@T7b2}AO$f*4WwcM9nJvj z|6c(a16ti2X7e9d1KyoRVU~N>$St(qgp(x181qN28G>~PW z0~I;Jfk1m94Hm0uz^Oeeq+?FSg)G^?*aoYOvuk0R9jpaJUm?j z5{rsciy*_+$gL<3PZ#jm7R1?*5h#Rm@NNZALkqlSLKW8JVFk}|g11;f?|y+Cs}CXb zz_QCA(kx(38JG+LlYNjqxX&T-YwN&*5M>bkwO|oRFbNT72D2d~MC3F?H$(_xAXqcF z)zk_x^FKrlm;{UOgDBJon-&TtHNa#9n1q-NR*uD2VB?t=fQ<$hClA3Y!Ayv`5XW$W z&4Q?gh(OqwBt#ZM27+~!gGq=8*mTf(Fi^`DSx5=22qImLgKY~I=Kzz)7DLQ|=z_>X zL?EUitAwzRA-uaAtOmoo>mhyzOENHpC!^EQCb18X^KF!NGF_%!H=3e6Ycg5RnG6r$NjV0dpWGUxs-43B+{} zF*UF}#9bC(_6LYG#4LM|5GQPr6F4952A8Mk=?db~8jx~k9xw@U9>f;NvIa<+;m44L zsH_5uLoxtFBo{1F0VcuDL3PL-JPu(4Yl2t~DN!JnV>%6D6~uCgnj(;1RI7e6fwq-` z{0uP?5=8W2LlQN_nUL^>h=AD;XDWi{NB@I5=qQV!u+}r6L!SoIWa%Js3wS9Iu0TWD zsR+HO3FmE55T&4ff}llS$oDRRJFSqpU1VW!O^IBwA}t_dW?&%p@+Np)dj_%u5mGp? zFfkv1Bp;+QiiMGRA0!onb1ozuF|dMHB!M=Nfr}WhE*2){O<)Eys`fJw?U2L>$qHaL zs!^chAt1UTN+2YpY=Ve`*{GU+LY)tG8syR)7AEF?h?>L(muxXflDB(*V3P6x5%A zbcZ2bU<2@?ScnLu!vX0wdV@PFJfPuSP)-F6^09&TNVGt-K?bQIqm_{HW$;)g3lp;) zxR25a=?8a#=iylxnVmp=7U;SIhy{KJuPnVxD$Aj8Z%@y7GxF`#l^3{{bLp;<{#h_yIB~Sdmw8kz`ZgSCgvj$ ze}lW!kWvd0NT8nB3dpn!#Fd6%uYuhMU8V$KL%L`XKR~Y|cnx+ud;|bAgaA?d4YuwX zG=>`j4i(5qAH{H164tTpN zNH=t`BJ@mt$ayc|p#`Yp3czlFI364X5dHAD0)+)c9Bdgx7YhsX4e;bPGZ&~W133UvKmeo!MJ~+2=LUchO&uuF=rJ-2fO8V~L@O31<_F+Z z&cevN3X%sQ1s$YtD+H^A3=4wi`k_f2NgT4)@*${+%y1M$5|z*(RsCR!y20cY;*t?0 z4B^csI0Kd*pp_&zjlt6s&b>cS)!?%sK#2w1CDjD290M(V1b0+7ih)Mm9uZxdKpaSH znSyXXuF?r&o_HK}Zi2(gB0@E-!&k3puWV7(A~A)W?18R9?|W(HQK6`rxf=DFZD zHVZTJQ}9A{XoC#W2!l=eg63x-i)YipO<{;EC%Co(@4SPU18E0B%@GE-xWR@qXM$CV zf<+)M$pEhm0bfM`X`_MN3`z*hU^jz86%rwk7AVB;;2?#Ll!8YJS(upDfu$hs2k8QH zp=yx2*wD~UM+!H{5FL2P5aNE&5!&Ez0GT5URtd2YLS}+RM8PB^5D!obSZ;LE_k ztORP*fcB6=YD4g1YliifJDGLk>wyNAY?K~1v7Y(8xnS) zwh1`wK%P+m%R=VvwLolW>w^{6G*v>G<^$UV_5+v&@dv~nOcLy77A9uMv@8oNXq*CM zCqyO0{SXpdGO{o+UxskOBnvC^8c2H=+-?Kg2Wj&{^dpmyS_Lvs9S!mY^e}%pFgp!Q zN`Xo6a32;wf~`c3b+CP4A0UgOupzRLxfO_OAf|wAg-~><8em`BSFXsHGctHD=xfKnW+^u@@rAU6;Fau?(aX2{?GB)zshMex5R{}ZG8)fr0q} zc!w&eB@Mnc6Egh`KkwQIqy+iUYCfc!v;shq@ar6y!TKTdfDEimc_2y1r4FE(Bk+1{ z23DpXkZ=?DqBxM9khwX@tVPeE_7% z3fiQCdIn|%sH=@l&nJ)`@Qq}kAc5EeUJn7;LB_z!#1+KAz`P2)?H@Ge4QaoEl`w<5 zuaLzCkk&6Vcv%W)S2(DShaTAkI=u;ckP~D}Eps_|;RCq0jI0}SAPnd(L6DV@Grd9A zF@cY=fu0luS;_(K?=wR-Yk(WyEKJPDAjb+Vg)DyoI|LFw%#h_Scfn10X2_9GkS(H+ z#r}|B;Rf}|nVCTQ*I5{u7l2PAV1_jBxxou^Kr0v;_E;Vn{&2gNPx7fr0rjI93>-E9!Vay$;CU zbWkgcxdb$V0pTV92 zhcOp`Jpfr60NHED2No{@i}Qflu(SZW+6BBB4)@9va%6bH2bCUYVqjnz3{^D|RmSK- z#PsB3P>ro`qGzsW1Zv#Cg9QB+6H+QuY!`iiYgB9!;B)^lt5viL8C=zd20MA?m82FG zl@^pBSHbW_jChY5gxH~%!2qvwQJ2}E968Mn>btTsT>|Cv$MCuYlC_zbjlub;2V9b~ zFft!Q-HQGOr0E@avn^=s0&?UXgoGKe3e13%ODv4c_rM0AY=Z;Wtt`yU7NBuW78Yh> zP%#6km{?eu&w@{lU}1uuSHi-`90!tzmz^G=3=GWnj4W)-zrlqJbSMmS5gsG+A@Jlk z{LnJUep%4YK*+2tq_zcb*<)d2{tGb;b@^NaWP}bpHUv2)2~tk-fD42jgQY+KC2z>e z$uiP$$H*lB?sX;bTn}GQf|~2u zkQ>;b%eGDVPh(+X22Yu= zFfwO@3IRx0fQ6a)7fe|f#84K{GGx%)4Y;Yw!U$S_3!2sew+mUAnZLmt`U%{;hc!h( zN7*s4F@w*OV_{?th1vn~0Tc5f@QPs;M&=C=JCGdb3|1%s@&_cu)`QD~2gH>J;BB9f z$Qw-k+ri`(P|b}!?;!;qG^abmuRsLlLadcJ0ZowXPPBb!ra`J`qIH8dV=*|Erex-W z_t8Sq0c2kTJgehe3km6qV>BQj`xsCcnXxb+*#dDRq_>V?cLwOXNR$OIYKkTpQqkbS}sHbf1wH4qVqEQExJ@PeHM5kV#)vY6|v zc0e2lQ3_E+gf)h3Pyq?LZV+??CNWp- zpxpGpju^Itn2GFa(8BV*Fa`$Z&)^;rXmkTMMh5EWK>9S0u?a5lwkPm_4&>N&=;^B9 zQ@9}A0|r*68z94`f(uDdLj-*07N}@q2JdcQW(IGUf^<0;K`T>`dlw9>Oj_X#49p9_ z+CkkGWbGh6s&3|!WphYT7%#d0Fq6=Kxu`n`6g6aTxAZ`M= z{WI8F$l3$MB_rUVgSeZ8i5YTaCwK&ug^{@coTREi4OA8;X2=3#m|QVvG!GimkikjV z2pcG+gVQw&6EhEJ$P>~y=ad4SYyyjT&~~_`si4tTX2`WJ=3u>$V-b;6 zg1cJKi)7qE*%5MADmZ8%DIYwT&%(q!6_)!!79d&A!pQs*G6s$$2uX?1@gqO5J7f^1 zGb6hIG71mbyj2KN3CU$D;Ing%jJ8N}71AspPI5+K zW?oEUS&@Z8dUA41USdgRS!#^2o{653o}qz(5m-t$J+D+3p*jiI4O4^lW@(bUailb6 z;LTE^G?CL-f}N6t+`EIYksBSbCJwR~sEGrfbA`;mLav9#*iwXjv>7zUlb2GE4{3ja zZeB*;k_jIlhKv=%oC)!w9{4h8m>9&lkOQ6&okOInq%j*&#U(|VdFhZH_n-z9xTx1) zWWEpS*DV6K51w3nFk?45?L6$h8plvfzpZtQ;y0VM9n{&B!8< zT}qJNDbjHgt zh4>3XLR5n*U{ILCd*KjSWD=|fVh0NoGk7r&3nQdC1k%Zz1#%;_RRCU&3)$KO@nAOi zSdagt54Mq9sDS!Pqdix$=FiZ2oZur-ic)D`^7!QMoNTd}pkWvw%2i-03VwR180bLGm7HNG}SP_eq^_U^2fq~b}LNY2OqoHJD zq+$)6;UM~vNk{<+&U}z;2kQWw0{4(XWd|fjLo`9ykg^p#+6T?OU^c1&h|B6B{U31l zhq@86PXufj=yC{%+2GQGg^~FpxM*TwVqSwPeiYJW$mvkdSN!D_(EFi&sc~1UDIRm3h#z3ZfD++5)kG33Pik zXq6-Qd<>Y`7O+)-kO32L;STj8#0aovX0Y2(U4>ZK2vG>}9C)oiWMLR+K#P%iDOf9{ z)%QS8!cf*OPJKM%;Z#1vm4rAWMBv=$^ ztzidiC?YrJKpk`F+yk{o*ALUrjictAm#u8^s8a6mzHvoJC1f&Bp1%nS)0 zn6tpgO|vjD>wr~&MIpsFY%&AYviESyASn;*X7EG=vR@&mv4H0bSeTf_5k|8xLc9Wv zI7mQ(PalB{12BVYIu<4<5A0x62P{TAy%*wQutIQm2W%;{aSb*M+a$$ISQ3N;5HziV z102=1Hn>8t4XBd6_$0S5fplP71OXCfgd`Vc6L8S@gGq=_zyS(%7MKn86*%oMgF9|4 zOw3mxO2G!PFfy-&bPd28rJ=zKuD+2?fw0ldVon6xtO_QOBjdEkUSlhV?kN?7tdgf<^-sE2amf$mM}oZ-3csVfHf1~ z>Yv> z4&dVzm?6jDLqs6C8C+;UbNNL`B?>ux03r<`p(pf1R#!m^X@~?wH^e*$8$v>4!PO}9 zLx`!6h77VabWIb)JO~Lf2|7pM04|1*bwJoIU~x?IAeKVZ5KlsML5Afaj(~_jOn`{Y zhj5-kid_f^DFz|(5NTwx5bQ>1Qvf3I5TXw<67~cVDBvoF`8q@fq72#gBM?=0ArwUM zGDv+5z2pF*6B1I^U^^kIz-Rk2Z-l6YDAEK=L)g%uhj5M|8xI}Uf>i$yw}4xB%wTgN z1wO0=`3c@8f+&P|0761UAT1C`y$gw3NPvNBC{)AR;4KMA%MLR44>kr=O`%OOK)SVH zSx8leYS>cnee0km2zclZWB{Zo0cJr$1zdYVQa-BY&2Y^SCxdq_gEgjrf)LC?HUh~N z5aXbgIkGr}4KWYGMhYfW>#s4xS_2T};NSpT3LfYMvoNiPBu8YUAr?SL3~`8+W6W zn8ll!=qF|7fjam(nMwMnd$eE;AIhD868bP>8H)1?Kw}AM@dc3ZFD^+*ECNkeL#lkp ztU2jy;_PYeSCvpVAf9YY-*Yn?KWc}y$}jEte6MlQJcL){)oWsks;5mjOd zYY3Ucyt@^Xqgo;qRj zVRG_1x^nV5a`Fbu+ZgLXB{`cro0SeTmt|9wg+UQmK-&^D4x$Yr*h2KI6fi}@Kyt21 z)*zZuI&%(Kn=G3gh&E&9bO+IF+H5*t8e|$%AxH;X1BkTJDbi)GEM(@9)v?l1us)@y zW2?hlV(Dn73%1Atq{$O>{+A|*h-Bu`*3r=g34%;CvDQ`8Nzv1>wo=g1lhN@>0ZC}u zgGe@Qh?C`YQmjDsuobfDSZnFX=|n=D2~uMSBKqth0uIdgYuuR^F>5oif_lZEf{)=b zy~=0WWh{oYg3^*?M7o2gsT6n;1Qjo{5*Qem)fiK)taXagQ=*vIKw$tnKL7v!|Nj{o znCew{6quGUGBEHkKme!}(8It0K4Kr68WjcxhDDqV3{5!HNH8!kcrY+9sBl5dbmU`h zWOC$VX<&x%L2?FMpp60uz7ZD#LmLBvzk`c`fe(p)3~Cn0jUfG(xEL60kmUKe85q=% z_$J&CvvB$I1p@k45$5xOZ+d$#k z&g#g=-ofU`$I;2|$j8~m;mF6;&FRR;-NWU`$J5L0$j95q-R^VbM5Fmy44&2Ivk-wZOp1!R6J$ow{t`RyR{J3!`lg3Rv%ncodE zzXxP~FUb5pkoo-}^Cy7JpD5_aCp<^Ukxyi3?RQb@-d^B0aM=xRS)A&K;uu6LZm^E zd55GJ7_^{n2JzoWF)(l;@xMtiFgPIb&7>I^@{ssTq#@x23LlXEP12C?Le94^xBQWY zq-9V!08%R zgVeo|VPH^z)(;>)j~oL72Q;ohd=WVY1`&w+P~sXSry<9{AcUiy0J*Dxje)^R4iT0h zzKa|KgA~+05I;_yfdLd2ps)k+>*V3?MzIeh_eh?BVGY#nAby_$1A`T`Yyk03C@?T= zfVdUe&p7Kk0d@w43Pp(fK=y<9O^OT*8W1y3><7uMQiRkyAish5+tBnLP-I|m!l9Q* ziGiU3>UNOcCM8JO3^S_(jo+sPi3gbcG$D~BOiw|AEzT9mlGeiBOi|=AFm@HpF1BD*q?XU85nLULGlx_J}0m~N3cGST97+H zYT1+_aSr24C_};o6lNfK6=g{N$5yXFiy3fU0;w%hW?Iao=6F_C@L{M2e2UM2Mxi{1zKi-^m(X3%4>u^NE!vnb*Q0+`y@4p zJ7M9xNDY$jKC54JoFa?b{C28LDY zh;#tr?^8##D?$7(>X0-CDx*Ps1q}vTXx zz-bVqCqbWq;Sp9nlR6r&Ad**Y3>IaZMCqqcxkDRtZ^%qEPgCPS$62wfR z>+&hQ3=BfXkTeI10uWycjjv=32}5xB@G>x{7&9;|fy4`r_8cEKC=S4G=4D_wVG8L# zA-fq=W`XQ_XUf1(2MKEoH#>q`){y*x-nIm}HGq$SA;%2Tr-1Rh%n)rUko*=j`AcR9 zzk=j%nL+#(!N9-(;@>f2VCdimw^iFfao-L~a~+_#>;%P27bsr3LGjW9ikDtcozMqr zU-yIB*AqbP>xrQD^&C+9dM-b>vXBFX1IX+YC(Qa8)TRW_!$@;I79kK;JAR6Ss?Ko7f3k)7I)-h0rmAjFWTc<4#aI?gFLbZcsYz0j1+!P&)1d#aTZn9ZvwILT^?}^d4|2-{kXt5#+%gB`mbvVZItxub z_VNWZzQVx3fTk8vNA!Tq?gg3M2Qs@KOX8@2Fi;(!VCFEW8u}= z=O%#i+(b~Gn*%Ca=JGJ$HK!YtUVA|4m7qDGG7{t-&_ygxkaiCu-D8YVA<9TB`GsKG z2bEhhX*@fi(Ar)5G$~{n78v?3;0vH&KpnYf% zA9Ua{Xq*`)4?1HRnGZTv8JQ0{Pq_$5Kj>g&*qAWLJka^ap!OlmJkX)W$o7HGD@Nvn z&LRdm3p6eO(hoX$cow9*L>?D%?fez{g zwO3$#(D}NcvYwe9)Pipz&^Sy#;M6g8U1T z108k=ZS%p~0l4B$K#G9@bfh0_E(XM35en%mgW7i>KIrJaTM+l6^{v4Dq$!}XW-6$x znFcCrri03w8KAOeCaA2L1!~942DQiMf!gEq`LWm8Ah*u}c@Ua8ko^S;M`XDK1_lOX zz9S!VE2!RV1J#@Dpt7q2RCaZO+|>ngS2xIAJs@}Wg51>ya#ugdT@yg=nh0{&9MCxY zTmdIO5l~FxcB6wd0|V&DAJAAhvKv9}2g!j>@IeoIP~3y$K*#fd!qkzE8E?4-YX5-L zgU;gtjWJ^zM}s9?P}qRfLW2!Fo(JNC&e53wi8G8c52hF9X3$YLpm{1}|Dc--Qwus; zW*@{{c-n%=!Q6n)9GKsb)MB^~+_vL`q(P8hU~19b1mlAaT>-W8U}hIZGB8*{%5t1- zS8VwKG@qd$3$qQ}|D@{tkrSUNIB|j8jcgAnJtOn!nVtneg)r31$nge>Q(SVOx*JUn zPkIIoI%DrcgY1}q!+ua)qRC;T6IeP1g(tFFeCFbl!P_UK0fZ&pLH7KDGGd(9I#0PfQqLixZGO&^!+;RC3bxu2&85rD}n3|beSXx=z*xK1UI667IxVpJ} zczSvJ`1<)L2uu{5BQ#f-M@9jgS)epN2lNmyToe(#9ha@KDq{f#pI2IJ-WF{w;Waj6EBo=48mF6X*i!oprX9zYg#ML)| zAtbdZH#09W2c#LMu!OKYJVTvAk;T*6S4nx0u)l3HYF77yYSrxul^ro&e`8L zfWap}9TH;6pi`xs^YhX&(@TrMp$Rh@5eZ-y2Dk=!FgW}Bxp}(B`?|#k|Fi;Kab=Ij^Z z19k*>dx>XWT7EppSCIW1ptOk|$HqpW0CCPpEON^)%1wm$5h;S;k%JLt#vqNQnRzAP zG!R@_T#}j_oRgYb;F<@@2(Z9{Miw}vU@6-pF)t-26-`Ber=KC%OlTSfd*0K}%^&Rh zAlG2m5C-4W-29?S&%8{OTo#mCoLU0$K5}vaD?>>@uAnRc4Q*%tP`?lcXAi?5*I*9@ zpZxTY%;an+--iJbU?KS)`Ng304N2@4@g)qPH0l9%IZ_~5Koc-V7=Z&9R7gO~3oc14 zNrfd6w} zm_Xe45|Ed{Ap}liz5yYTU|*FWg5BNK&o#)?nISl}q$D#hz1Sx|F$Js!$>-o`#dH(M zNg%I5OAF}TOyD!<(-M377 z7?>f-M{tBW`uH#uXI7<_R2D!|6iN|hXa+J3S-&HSX->!)DLAzxG&2R9kdSq_F*xU^ zq$Y!kW3XIqVrCwLvxgBl;duImxcNA`2QxT(7=s0nb(%s&eNgN)2L~cb`C|ZbC2Dc5 zmyDvxk^viv|7HA%XL=8%anj+F6G|77Ug&2l`Yz8GlPd`|)gH{;egyx!8Qd9}feW0`gO%<@x z0PINDFz1jU)NryujvIGG+(3#Nur82kD6X>rxdSN*3>_Kbo$~W@ki*i@nE_t>CTAoT z!NLGhtb=MSbc5U&oIMP{F${@mDA$L}+uA{!gUmoUKX1J?(zSc!*KN~mQp!tb7bA+AAwjy@p&V+60E5!hQGag-`P*wfG5 z$JN!(#nlC*50W{+B?+wdatsaefYw~-Eh%%57Lbw9^c3do?BW>)F73b>59C8|#zQI8 zVEzD=W}v)LQk0(qs=UEvY%#2m^>vGf)u|@l44!@=;8X@G^1wMF2%00DeFHogAb|+7 zjltPBzz0-7g7Q2{(s5$&4UGVs0dlaj2ckU$FQE)w7=l9_LqdZwW8Dng%z#9*C+JKG z&}BOi3&HgeIK;pXgGRZthohgns|%8ELVZGl9DO|9Jwg~j+07}l1WVcjr!7!I0M%HK zIx{%4DivC2p)?*qwu1vV*xAt!l2YJ}JResVaFPm0EXpjY3;`9eD1{JMB*@hb93Iei z8(0ifN&0{y1<`i%bV03v0unQeK-DQYPeGG1*fLO!8;h2gEx%`v#XL zC4&wt0v&)>l3D~e3|c9n_%OJn2;zeH_{5ZyB11EtkN!!RZOr6q7RATfk< z<2_OnQ$S&k%Wh}K08g;xSY75@np2YLoROH9mzu-i0*zS|s}Mep2Rj=UaREj7CHcwu zIiNrR>x1ip7y}71hVrn)oYGW=ko=Ow9Mnh!X9Z9x1WFNp`JfnsnaL0zUzA#0no|OH zI5;-b4pT+@)Ao@q0J)(pHMePgp-T)lEFq`^*iV^Q)nj- z?sa%N1ZzVIW_T1jd&VOafyzRJZSg1`j4y%s8Wt|aU?ahvaSQ=%@J`H2f%^kF%mPaj zb28I1@kOd*h%eO1{v{cyMGV2EN#MuSKRFZP5U>^4a+^zLQEGAts1|~T5j5MQl?0F?1!M|1PW4G>L?saGYAu@JmUOH|=;3cVlfp30FYB57VeojtiUOG4c$`W&YA$?n< zBnRqL$CQ+!)M7|dN4PS$GzpaWilOlibqOrI;jRHC9E2vc+yp7-peA5- zvvYnasDTSrNL1Bnd(G?XYUMlbBafeo(MFzNwVI)@i}aJ8_a+tUTzIJm=M zno+_CTLOls0#GnR(=gm3a3nMMB<7`;CZ?xCq91oeK`e*J<0-j7l^HB{u!gNGsF=x1 zEdlieeViPfz2iZV<(^uCh%W}X6A{%{VnJe3W=>{FW@<4*P-;$UVlk}O39b;}I*OrP zeI(O@Q;RYabNotk;iiS=WhUpRz`YC}WN<7gDauSLElGvMA}BW_%s{HuA>j~T!VvBf z5+C3i6mMqY?Bfk;@*;OrEE)WRo#TU?jg5SrgIwL>Bm9G%jg7#{K>cWVTRz^!GYrzF z1*vxn3Jd}@5aTUF{2|>kRK@;oZXk<7oDE>@R3Cq5Zzs=?U*CucJt z^usz2pa3rcwfO^rJkg{fy)T3okn_N<0O^C?F#P ze0)I0gZVCQK0ct-?db>73099t>qam?2e<|~g}O2Lg@Ky5ATyyZ4D|_sIUg2SU{eEp zJwXFwuu!!CX-P*J5iv9c+XeM>P;dx%9L*)jfB_VehDdP)P1hjjxq$`|K|X-z97CfJ ze@KQxO%34Tc#y3y&jooy=e?aBQHMT^k>ka{1fQebGn0P+<~8K^BC z66E8G94dxpC_Hl%o(0(NU{8aK)6ih2V1IB~2yzTG?ICgkDEbhJK`d~|i=;Nl8KfpX z8JE;V1WY(Z1f7-7c$xg zicC;$LH4gPitmk4V#XN7uf`}bV+<)(VF?Cf)1y2@6A^zYobdVs}pWxC1Y&@!O!Gq)|jd{If z2B*-F5P!dTM`!TVW^jmqkZZiJt1p^(kgKz!j}I1!P)`@|d}zFjt8(Uk&sQ@*+VQ@b z#kq+k$r-3B+*3<@GK)*lJOFZM5NHH4-qR1}P#;&9cxQhXSLgVU2YTXVIv@513<=yxCZ%pf(E9Y{r&tvgR`K1Dp(dZ z+`;o|s6x(>&OWa3!LA`8o__AZ3{I6LsZOP7X{kjZi(umMkik}l0_ZKKsVR{71y8l0 znuiDhL{x#sl)*6rb0dd zm;qeDLrjHu3OX$xoLb^k>6rpD5R|I@gCe0p>4Iz|!bu>1!vZNjC?X^RtP_%Yf+FD4 zjo>*Wuum}qAGB-$DfMAG2OMecIr&M6Ij}&(mWmzyT>O0znaUqDtAdh=A>j^6FyKBu z$fZH4;3-1zFb8DHz&*7Dnw%hfy=3TI0!X3~G~=6*SOn1z8hy*p(@SRXNUiY90}Y*k z%q|9TL3zM8u>v#|59UKMW=KBNXb2UO?~z&ok%3Nz2c;&aIDvaW;BfVKclU8+2=MeX z1{Z{(!Hz*8@y_6c=^GpXt|UQ=SHO}W4Ng9ue%|pG5e#lQiNzT(OCWOwpk9E1uVb(` z1K0xC=mA7Bv;frh1xqjlx%xT=K-~kn`Xm(;P9a5^>7X%r(7ZmHb%qfP0g36U5U&S# z`Wb=c!7hLp4)-;(`#pnPz%%1;XEQ)#p#?dF1M#Y3aHOBJN07gte`qkMG65SMUX%&X z_YiBGb5au_WdI}?j3O9<13VES8sO}y;|S!6*}w=CIVNCJ{X;`Q&31@eAg+T)Bq%9DBwX^#^AJG|_6f*^3<3T@ zpgs>oQBZ1fVonZ{ttQYI1se+zhmskoWO-7 zEXMsqLqP38m*Ns|9pvf)^_pn}$TMajtqlI5AtCNQpd@1mNivlssl`62X(bScLL!1djL0t{A817rptX^qx5OmcMgNtVn$TG0BXR%XhaV0}=YGG+= zUUDiZ2Em?&Bu$Vf{rsVIG9;11N{dub8ibA;Bcc^88nucT8hE(!5;oWAy5sVDgm5~QB?T&`?*6Ez)f_j1iK_OGX+wvF@$7f z7DN0EN>8Z>$AdlU=;s3SDMXQ8GD84pOc^vU2`;`t4Tk)5_tX+l(*x{Y*cyi5)I3-z zoS*KSnhQ?&&?!+!4uyCvu_PY6#4Q+N2GoU6h5l)2pmq(YLWY?OU+e<509==VrZ2#k z6vV^De86@>N;A+XJ2-EF#oUTgQ$c2eoRkl*DDu-mB^2Bz2v>mo1xXALBcTStUF(?w zub!cyT$T#e4U1c7YQ_{#EK7xJ)=Opp*Apo)T`(C?)`5!o6~P3Hk<9c=VTg}UO)W2q zPXd*d@fF5Ki6*6Rl}N6Fsw_%DRq5mE5|o+(NvI5h$($P6cFngX=y0oq<=fEyJGGs@G?9g%=QYtO*>1~OC) zy5=H2C^b1X6BJb?si+E341*a5a#?rfV1e>fWh6e-4IiO}C12&rxODsSWsOhOG44@S;;Q>%DgC=s45|gt* zr6vQ?fQOL*3J+ztz{rdNc@dd=DrgBLe0__N1uWJ<^#Q1y$WKWHjc^)(2vmcdQ7mym z;h~J?8G#nrfs+=Z*$+)yAX^|s8&n`TwFJ}v^3Tfwb!fqwf>TRC4oS_0In6z_B&fJJ z6B-E6WR7gTG0K3Uu?318Xt5pGTu=iZyvhp6T%XhwaCrbuT+n6>D3QCQmL!5Z&|saQ zP7zoqs5i#|@&l-VK{5vJ1^A(`0Z6it3J9zhw!+X6)Nq0Z0n9vbtin>VK2#F4^uRSB z05sMD6#*&tNlgh#O+ogi5lRpkS)$0HER!^HV(>35@l7o*PE1dQxe{b3B+-Hzec(lq zj-X~G)K1XY0mMqE07yMFlEAKmnFDRQKvlV?mOu@K3P8(Puuq{v&~g@82xNF@L3&YQ zN-DB9jLl%SKvM`Psrr|e1SA$E!qW;!FH(3zErHYpP!33mM`}(1%rtP(4V80GEeT64 z0<9Z>$wGVtZdoGK_@?F}i@?(dgJ&L!Yl2ftpcNpfQUfO%(1ZreY>-R99dTp^7=5>)WOB}x)YN{c;Hz@ZL~Ko6Ld zJHpAJj8Fm-2e}o}O+*%f1T{JiW|n|f_dp|^0c1B+7HmC~4Ng`JpvH7*F(ku)(gIi$w6uU1YM>?qsN#c1 zJXjStH9-w?%P-AKVJLuw9JI~uk_wu7hbmzxfaDdJ8d#ABG91)K0Ik!8>I091>4QnV zWYBPaxI1_h#3eYyAKdwZ>}LrE3kC!`hPi@zC}8yv6F|AeH7qzXINsUAH#8zX#M#v_ z-q{&E1Oe`jdHRJIfacA?Js(t+&LEZGttP>Vxdl0?0hxIW$SNG2o#MkG8)BS2ApK`& z4}2>p2II76AsDIH(Zv}Qbl^Pg z>;V~BLbfZ!*~Ks(ODrJ*2t4fz&vaN*6*$XbBuhuI&ES9l&1E?|LYMtO;u+ZyAPR*f?WtIaRNb;Lg~pE(E<)pumwS>pdB@tdFf7| z#q8jS3$bG)0QkB_Gxcx44#FP3^9tk>BYYb^*4 zbcmJ^ zpbkWOGH9m??hwZC3Ao0E7E9?Q2y6ihPfSJzCg8FcR_+Cd zfF=#l>N=>9Ap>Z$q;Gx-sA-%EZsej`=7OW(axs9__bAq&1Rk^@icyR~3nXy*bM`O> zC1Fq$!z*;i5*cK7fSRGusvlVxTnRz5h)-g133|DUsEnZd!H_kBtOQ3b*d53+(6kFK zzL3R1I>5y*M%sn8Krws@(gDtE;CMwg3slKL8`j|HhLqzNsSIQQIJLW2Ca5S)&ue>v~vJilL&4UK}YH#GaDd>g6alW7k5{1YZzHS z$id)v0_P^sW-&7p(8du&a~@oDf|P-M9OMaVcY>-JP|=*3m;>5HgKQu)w?l+V7(i|Y z_kB>(E;NmTCH$MgLM`sUHP>Kx(ErbHgKsqgu2n44kP}|SY48=G^N(7q-u^ZA| z134TVArQUJpq`8;WT7)g zf`vagS0KxP^8mEaM-~U=BXHWlQaXcs5g*g9UI z!4as-kSzcSJNtsikx-H!q>e?(C(tP;9HkayK`64ph-3g+l@9VFxcv2T4RZyrKu1yS z9~1)4p5VwqPB5M>kPb6soDj4mG0YV-^j45q0$v>fTKfQ7W#Q!PY{=l`>}Fh7JNiKnf`Zh%6z3pkM+~Ko1qHAmKsVg6pa4>eAO)8` zx+1+~2Dmlg;Y(b$fcyUFx*ZD&K(!UZ2*?&K==djSp}S*9e0Y#&h$};AW{R^9gfv8` z4^PZa4K08O8$q>!f)>gQa&>fxG(_gW6nQxMgfKWK7NrEG78m5_6{j+QCVWzh;9Q7P z!Fwk&lcC`ZQXlN-4cWMgq5$d<(77;0l?5gFhK{8r84S)4wqIsaQcfy^cWR}7T3T^x z2{aNQ2jM_^saDfjShlBqApOK=qd>6$a{@#SBzb|ytsyEP!ibfl&}j*nE)*v~a~jnB!Ko#s z1q|`#PNAMI&`5^Hi(^3nI0GO@94z1H8iSgj&YLuCJUm_E0~~{bUE@9Tic8Z#2Uw-%l{n|;fDTd0 z%+Cu*EXgPat3nk63k9VX5>z>;*8o-+N&{+X^?h*&hg5>Avdw9A8Bo-B?7U@AwAPY_{@$htk zy00WP7i15T)gW$s34?1zL4F>n7vYpy0xc(C0RUPdl$o5E0|_0N^Gi~5{YsJJ#lzDj zxFj(-+rKQeC@m+y9HJbw+y&%2u#J!i1P3xm9Ig`NSBMeezvXeX>TCl*w3G7-_ji57Aic-rm z^Gk~%85QhkP(a7K78T_efjV`dt*Q`9A+i|h72;M;7f{d^gE~RJu!S$~1Y)TqH5cSX zkPRSo%a4bV}6{%Hu6;In!PNFy!6eB?@ zv6_qN7Qg%w$ow-rtAo~lmVv6dVo>db)g=r;u7UBO1uD>z8@6;S9^7mICBTsU^z@um zaGa&)m4Hg6(qfn{NWy_`qQITLAbCExBrz`q+?*@~)yUv2>Yz1Ypb{Fo0uHj%9OPmK z7uPUPXV-X0O9N(4Y6>`^K+FRz9z-l1gB(u)-iGMx>k{u8JPAb-djg1nRhP*BE$`Ze(uaMj?U5|D48?nd$>%pyqg0tW;v z&S3!!IT{7VgC14}HW%t4T3=;q@X z?17OA!NCVjp-6!O(E{2+9}hZD0W_ipGY#TBhyoN(!W2NH&;t}E3(*cb@e|29h#=G% z=z$jRS?uWtiiS$m2oB9lECH=aM9ui%xmD2WUuX(NPD7BRJ0UR#lZJ(0JR}=K6JR`~ z$AFxrK{FPxyzCU}=H?1s^N*(80-W$+c^Guo2|VRMf(6Zwpn>W5qEygXtZfX-3_H@08_3642jp$rONXxV~lE~JbOE&;7{L`pND#z1ObNls;OYEBw> zS{ga2c@{%LE`9iRH7~s+137WP7v90j zyQEyG1HkQ);LLPT8iXYqn6VIVq2?{5aK$J@p;an4O2Nq^32F(f5`}vV5!Mhd!p;#u zGTpNn>YU)z5_mv^(<#J3SduBY7y<9;N=yc?Q*m>33<(Vatt0dSHQ>O7o=0L1Xfv1- zs1`+Df)DdFIO&0c5D(gFt0$X8K?wk-2kRxPNl_&G>y=hm{}5JgafQl)TnbNl`FWsH0V)#|j@qe#>xTpZtU^UH z2$WzTVGFKB;(eTb&;t&p3u*_l?I7>N3Z{6NsXnd<6QFu!B|vPdVDSYG zF=(iOEJx^u`pYvfIUlr+wZB-Kc^!$Jg9+&CuX7nOhl3?(RFwn2l$$rU_M z3*n)=3>Gy6Qy@qIM!>?B)Z=hCNDqq3Aa0097Ka711;S;1r8zn9V2A1VECxk0IA9!e za`MYlQy@hIv}1)F2w+9;*VWfDWO}4ol1d4>o{C z9>HxwXm=bDC@3Wxj?x6)&4+1Ya1DTn`GSTZp&{)X3>wXF4FHWBfEFBs&c{Qf4bXHJ zXlFt^R5d(E(Om>FxU?u0W?6hdP#9cwJhD1f9wVDpp~!;S>rvgbyqRO(I~&fLaikcA-~apgne=Ba9JV21jQ|zH0zz zL=GI{Afq8}1T|bxA{NsEl(GP%6XsB7f4`6*fAGvNvM{`x4O8bC?2mln0fCeX%KPwC zNrFQgp!8f?Vwg?uUZgYoKO1Kd)udhl2TSP0yw0a=S=1XvcV4rD;EzndqVgA!Dwxv3Bd&Gjp&hk$K zr)7vs{6gYA5{vzllR*vA6e40090(w{!y^*D&eqV#6mBS@M~&eK)X)M)GH4wY*gUBb)`^2Mf0a#c*hy22EnnE)ts2nR%JHrMZxF3UUGJ&>K`Mk{*zQ!F#qCP^`iz z(u)yBLb5^%sv*9K6<~`I9zpbHK>HLkL4g2@BXCNAxGXIn$qZ1qK+V7xw6IKz2w9M! zu;@bSk3qZxj#g+$fx4Y2&I8@A1PUxj^8Lo3Zo2aQl5ou3WX3Q3{yNR9>Va)%~V(55%oRYl0ELESNE^nsLsyAY7Q z;S8lIi6x21YTa^5i!;CiAVa~mW^!UdacNFs323qnx^x9(Dby+HsU@KExxojIf%QSf zor_XIS0I5F8D!?AL&6Cx@8=)l=@t(en*uupEDEv>GM)tLD8Ze{0PA&t!V^)qLfT`H zkOH{{9HPjFje{Z#BmprtFU2(v;S12Dd177)+*;7)*i6JFPjGQiusIc_CT4?g^l&T9 z$pK42{Z~*5@i)j8s1P(L;=zkQK!oWV|q7@(KT5FekG37Q^qafYQ!kjIN* zp}>#^o|JWVaYoGxNREJnJ2bpOlfR%Ka8E6P9SRPfScTXJD#&qn^pT554^J0VcY?+t zpp&G2kVQYBRu0%~kbS|aC7z%Qoxt&13`uJ#3?QL^)S}G%6xW=@g5uN^2FPJ#usK>k zxEWCQVJS*rJ_<(i5y)KVLXD!-GE`@Qodk9}QdS1labPiUsSPp`YGDbu*$uAEK^ycf;k#i6u{Mi%XH8bH#qdbjrGLL zJW%2Sg8?m06%*fZGT1X^PfSk*M>)jFddVQ?LnFdBvBD?R4nvW(AX;6gf;21%X4#-F>PK6A!Ashti^m^tYy8vV?ln;pjWGA5( zGzep`CTAZ0u3O)t|vNQyt6XZmwb?|ZxbemgHn5zqTT)~*Z*VDxlQprI^ zKtPuYfP|p&150mUWl%AwQQ(>pq6uOOR2ovRfm~<^7Dx3KYJq@kYzbI3EHXiv0hbLp z0>lV=6Bv}PVGU4_eW+;@YzIR?kY5PQW~lc-wE>DaNB~hic)GfRhIlgb(tT3%AnL#d zLz6J5Rzx-wS64?|i9!Hi2Spo`o6iZ;WC$d6F2?edW zP-6sHSqXYGz|agd{DZ6n9DIH8d;b?CkVi*pxHhkzX-Mf11=n#pH_n8L#Rqf z$auP-cmbof2O9!W8V{93(EthvBxj(eKxEC3w2CYO2^w&5foMz-Ec&1^22KGGcY#*x zA|)zVJ__=4@q`yxSfVqqG_|NQ-aj*i0d%ee`i4fGq<}<$_xS{{Bv&!~?AhpDvn|_+*i#(N|d zrIaTYr9z6$c;}pa&>}gg*T5bD)ocYhsU@I$U?HybPE9Rv%*iZEMV11q1$mUg(G9fP z4(xY`dPsX2<~+x;#LOJ<>F5NbAFLf5FOWdiOJ)cRbq$IHjj=#hpd-a5%zUWZAv$0c zA;cue90qE%BRm5Y2bI*2V}YWH-=sZ7IJ;W)L^g>cCWZ^1ANoZbXUS>%qcynS3G;PD3kP0^e zUK%BqB*r7;Q=qvKnkXPff;^H6awo*Luw>}PiGHQI(4xaN2YeS1=$;u!e;JaoQxXeG zQj3C13qZ~J)D(YD7f?-7_- z8rJtFPBl{Jfdn7GTcE^Qg50nmP6s%JlHj1=lFXbO&s@V$hg*N`5?81VqFaF~rA%Y%Iyl zi!V!z&jFo;A0MBdSDFmx(#VCG`TFov0Sok!8OqWMK&|mK&>6C+iMb4Ep!PIFUVeN* zdTue~X35f=lKe!5q{QM>2HH6a<_^7NhNRLo@RgVh<(VlZ86bzn=M*HSFccJ}CNq?P z)`b_B6y@cl=EVmv#K(hO7oV9|mReK-QVWuxp*z9hqnFIEh?9X~2PXpq8$-rq#>~l# zAoeLv1_l;}&x{%KL99zivLN;yxGacu4@nlp{sor>v6#3JCWF{2TriUvpa5n+BSR+4 zGDe0>n8}O`nJ{A*88V?-;BIDQ$iVJgMurURE@foM!0t#!h78>9JHW}nz{FrMA4H!( z@-K)Dax@b|9|MR6*$GkyqHiIo1F=Cq0;vPh@1W*^Y~(@;ArPB~3uIRx%&TC(g6svE z3!*{xurVY}W=x*U2x5cm0?C1Bkl8Rf5c?a{9uN%*MwlFk4YHe=fx~V-hyk(`CJADT zfE{5lA4E%l9SE@y#8!aHfoM>4!t}vh{DqT&0b~IqLlR6#h>L*%q!mdBq*INHfq|J} zk^&Qmp#kMEgBS)-4hzf#FKz|~KW;=?0ZvHv|F+y-Lb1M6t1pATYi z@gN)yVsnE{XsMqMVt|Z;Y zhr|c5KY;mJlNqxoGlJMZ!2F!ajJcB;|8O%faDbf$kq5Dbzzj2C@%i4-H_i!^X90A8d8b}!n4=6&?V6q^efJ}h-1jIhW&A`CV(8$2?U#f{gj=7VG zfkA0LNbnX|qNyG%1(N^?f(+(iXsYK>g^7YhK)!{U3u1#p48vTQL(rTFQqRZ$cP5An z2`ET_BLWJ-hnWIX$H}*T#E;ksSqjCf`@@21gsYlFd%jW*kgV5^Fa)VK@drpL3KO~3=LpK zlN6Xhj3y|D8N_ITa#%o&IZzHOvfduBg^)l3u|bMZGZDy!Hb`WED3Bs%hPHZmhJp#g zs=Wz33=C7irlJPT8Xg9QbxU zlQJK~0@=vM08tHMgG`0UBAa;vY$l}82eCosfK(+RnE{c7>Dt7@zyPuxW;VKA$m&3* zfl7=|JPZsB;Lw1$2c`!k2U8DHdjlMiIUwp6IQjK4fM}3bCWgLxCSC>xFs`habLggJ=4hZnu>K&V0uVUV~9SU1FtAT~%hEQDdU81XVNfJ}xZs3=|r zh9a;&NX#zbWnkEX#7EZ$@^c(q479r^dvDZMPK-31Xj;?x`8$e<30IVDm zsv!0oj8Fxsx&l@O2|W<|9yrr9A@brOUIqq`cJv@ch(oM+!pp$$3Tzl8NMTL^S-K&n{4svsT!u|eiBGaz{YqzGgw zEbd_r`^3w@pbXZG>R^yH8hnuWgQ@l5V_-PJ$H2e?ZHJ@k_`=7)@C)n(uK&z%#|iK= zFevbYJPz?F%q)2g{5d>!2?l*0jH=s`K0Acg^y!v$g(K{?zYh6$9z17es#IlLf-1(d@F zVpu^r{2+!6lp_FQ*g-jhAjTRYP)JNt5P}6+m;eJqivTFCaWSyW&l6%`m?Q*>poGbc ziHK$!Sd|d2$gU7#U}y#FLe2IQ1R&y!49PI-UI{QTED{10eGxDr20;dfC19a&n2?Sj z14AF!K-9_&Bo49&$v}|MEGBALYGBflb@-|2iWCkoT zfY=~K=)DF)>Ogu9fZYLc7l?gC5ES@*_47dtP@usqf%#iY2qSdtgfKz}6o>1e@yG;X zY=Cl@L5xjM4hx8}1aRkcY1u>36IeZ|-2`Gmj#5e`z2!I%8pd3LE;~bPD1Y%r(a)d#QD^QLIh;dB_ zl(~CEK(v_{m@N+rJW#N_0w)?ssS09))PR}+8StDBQdJ=gO39G&5mJ_dM1F{Z%$t}F zqSeGeIpQ;8%6t$@2W->CbPx?Pkq6owf#^lH-$ode5+NxM#0Htm#sJAnAoc@@9Z5*0 zCc#W)V~Co}7>&qt?}Qi_U+!i6Y_##0FW;#4s@%rm01k zf#HcLsAx(CQ6On%2CfC1FsqOXohiZ$3^Tw{jhY1J2s1E1^l@H?r??GJK~RGUX4e&{ z7&8M$FkImWs30RlC`=un2*f}}h7g#L7E}n?I4`Ie8w09)K;j_3FfyQe31${Z9^_u+ zVCaIH#mvCj0(aUns35YXhp>p<6Tu#aFbjW)Ffj0lf=WT8t_?^K-4!4)kV25lKr|mX z@*qVih%E#*q_2KHh@pWb39~6h6cTdG44lnyZ&X1AkwUl+E(8zZMNlDR&w{eOg&4@; zlN6Xh3@a#y8N{%Ga#%nNJ1B=0#BhLe*gy;?D2E-y*Z}3g8!sR$8pJ?p6q3+E>{-xq zC}Tc|wFpTT#0D9GTDpPEC=vr@7Ua?mBm&Y8Qkw!c38WKyDF!mZ4{Q&lcmc6N`q>y_ zCNsuPW(2Y8z)r8J2OBjHtQaB*VlRL?IcYwKwGK%Z#0FUmaz+w7P6EUj7!t%l1q8I1 z192vR{QxN#AnpK(fcyY1!#*>n$bc;eS%JL_%M)W@0EHl|i3?(PfgJ-$M6h%M@()N3 z)(wP-gB-dE?9WLGOd!S8+805g=WH=v0n}N+uwvu3A0NIaJ9LvCk z;3K#or-M{6Gfa$vCp8ao28KAW<%aXK#2FYsL4`ELi;zZ)7J-5pqzuKJbK(pPSD@yA z=r>?bB!2=4K^zH-*Gq6AxXVD%01A5)6T8G27#4ukG8oQZC(ghCQiS9(gfzlsAXkBu zp_r2+!N5=gj*Simh4~E<3=A!B9?VUfBp4XBfTA2Uk_}>PgL0Tb3^7SaAqO8J0x3Tr zfhd+h>=$4@q-_pje*p6#4FVAR6POQ?2eJQw`4D*!n@bX89z>o;l7RtaDf$>6$lg6* zeULg0#D=JY@L}Eoi5~(d6GYhDkYHf=0@e%3>>&0JurK@S=Ytp!gCLSHgFs>`l8~ec zqBX#5!}%au2h28_526jgY~%SL+62rtnGd2Zz--g`Ale4ZHk%Kk9l&h!`5@W}%(j>h zqTRr3gZUuZ3(Pj052F3RY@_)gIta`*o)4nKz-*KGAUX=nHk}Wm77 zqEo{1Z?gjH9VFqG@w1F~r+I$de z7FZUd8pH+}h~B*cnF`VgD{Db)kY11}DPU6|x*&BI%q<|XdC*kJ1Y#_Ja+pDkMNke4 zh>;)#Nxbl}SCHN{5U+tKJt>g)6G4=L6wLb|mK{U_L^;4EKrE1nj0}m$ZdrxoQxIE6 z3XzyWY>;^%AEnI)v22iJL2Qtr5LpllWITGpUna@Gumv1<2J=Dm5ir|uK8U^qW*f~1 z(GS3EiiX&F6z?kRL&I!NM>} zih&^o8c|FjMjDjE3}R$JIV>PXACv=+Pmtasa9m}8s8TR94Mc&Ig2EM1)qvFIfkPjX zDnaZnFdtIzfY`lYKBT<`V#7>9jHiK20h!OpkOHE5z&0j=D3E$ahBOcb)0P6yY&lX4 z3?LVRX7;2Q7(iMX8E`nXOp1X4WFR90VRI)*F)(aEax{p&51wK{tOH20Aod}+EGz;* zW-O9IZzO_5K>9&}m@*&40_nuwNQ9XH8x#TQT?dY}Oy; zB!7X}FW~+Mu|6Tmg4kc+vLF`70`#(QhcpAj5pd8N%m>kzz-+_$AR1&M6NAxw5d8`) zZZIEY&JQr#a6X6znF&$@^CE~ZE&~dEh?_xd2^sV_0;%EvtAfN4hz(K+tG7UGm@Y(| zfkdQapuq=X$Ur&FAch>2!vbO`Ksl@+Mh27vpPvUAqz|?p;z$rX0nCR4EQp;B=0oH` zY>*+KoQo*_K&I$`RY5!fVyA%lkZu)-4blno6o?Ho1>q?*83qO$8Bi`Vm=B^uz-+_$ zAR43^IdD5<7#O;so?!wpdY~L;5Tg&uVF58FKsl@+#uO-r4a9f@wx9IBGVt;nBqkvX z^0zsP*dG}N237`UPR#}e5R*X`h*|(@iL{bBZ=zz_FBx?}c63mCx2OzeU9C}^_ zsWJgOvm;Xg9(hC% zg4kQYd`J+2*n7ZyNPh{$-UsGGNv+iX6FHUYEE=YwdF6F`ks5FG>-H=GZm!@z8#`5-z9%r>46qT|49 zlldSz3CuQ~52Dk+Y_s_wIt$D;pAVvQz-){8Ai4m|Hkc2hOTcWy`5?Li%r=@2qHDlx zxx zVaX1}ih@Xhs2I2ehy^kcsRIZy?;4U%L2M62P&h$yABYVy59Fh?`5;yVk}QY~G87^U zVu6fD Lb7#JRa``5>B05tROo=YwboFxzB4h*kr$P3MDX z6ENFsK8OanhKa!(>?%L7xWRmo8xp{5!}%aO1@527=`Y~%SLItR=)nGd21z--g` zAi4z1Hk%KkL4E<54@*NJejV8NkOCdVZUplosRYDsf(JHC7f7T98jVaKMjMpF3}UQ; za^S@&NO>37P>3ZU_6jf`5+N{S`xF@%W`ZL*ZGj>K1IQet)pH=DCxLZAOaZY$s$mIu zjv@oYJg_{(R1h0v1WX=g3rru9(I91;z*-?jgVY1j!umuzR7%!0-WV3B+k2HiHr(F~fW{Pl1a#%o&S5OWsi17}}VFNKfKsoFn#wRF;1H||O<#2)+Ov;dm-~ut&pd7e+K`!}@ z$D2ENisDpCYL5v0{hXcfDf^s-Pj20+|3&iMva=1Z^E{I>a zL9~hr*pJ$#2jRnP zTcpgu05TEO7CNTPz;HnsRGCFfs4y^qj0Fk9l!EvcDu~npVq1avkm?)6b_4Sv4hOM4 zz`;N^HYN~b50t|UVjO~USU`*;P!21IaRSO=12IlPIqV?D87PMX z#5f1#aDo_jpd2m`;{lWd&($E8Ttsp&hz(MNn&d$u&tO_Xj2BQ2Gl=mH%3%R9K0rCF zAjTIchYiH|2Ia7W7(bvK4iMuPl*0*PaHvAUg$u;sfpXyP1-axel6ygHkRnv~fAa($TE|5qFSQW%<5IYpihv)*aQ!sRaL^8puAi6;8JPcJJ zkuoGzAa*&J4>23WuEEd+5@`Udf|w0rH-h;PT_E-Z3|%0RsbEzQT_E->3{@bJMM$bZ z?8RU{#B30I1%@t=$QrOJh}j_aS}-4?3&h@op$jB(5UdKK3&cK#p$a5&8c7w1eE~xi zNaP}tDiHethANQAGgzVrF7k}42; z5r!&|$WkO#AoeN@RUnZyP>(Z#80(-MW)Ncol*0mIY=UxFL5wX>4jYKE4a#8$F?K*X z93aLnD2Efo*aPKoff!EekTlE<^A*S?*O1%`Vymfx5^LOK#`wvMAhs4*Q(gUh5Cdca zdVlGh8UuqJSQBbfXP+7a14xdUf#d&t5W@(p2ojGl7u-{0VE6!b0Yo#1Edf>sX??-e zJyK&}kW&Y>l`>#L*tGrw8wJq{Vl#k^g0^$i85pn`4f0bR*prhKm_UpMD2ExuXoGTC zK#UG3hZV#Ct^5J)BxD0I`k*rGAjSkJhXcfz1m$po7z>~rE)ZiClmjm-KrV>@yBLxb zLF}nuKEwwg_7Zhi;s>!nMxe(>iaG;BhB^a-5JT6YIw1!Y12GW?6>SYh1~K9JAn_b^ z1_nWfE(SCykZ~)pOTj`MWZMRHQ1jVf{uXrxhJC0J0uw@a5KJ300|#QzT0w(>K}iFW z9+^OlZCVfxGt4%S3I`2vl!K@gFf%7ZgMpy~%*+5$6Tr+I5H$h3GBC)2g)%^t zBA5x6P0?gvNYey4!4>X=8mRY}7!c0d0Ww7kq|Oko?vN$}!&yjpg6xO6>zpP7!xdC# zfw;F(Eq#BhLexIqjTD2E5cu+jyE2xv1Q z#Pc90hG>HlMh1u~gE0HF85s6Km>}vL*o01l`5?v%h&YH6(*gOd(_lV`0Wul2GUU@? zU;xP=_d}m(Gcb7RfZSj(A4Koc0ok1hqV_?BLG(K?+i*UJR?-D40Z|}3kdqnAG-d|Q z6JX<}fQ`!l8FvQkIL;IEFX%8ZJb`gu=rAyV3K>T>H_+HXSFfYXz+j{c3T=qFAT}sG(ABBw zGB9X?)j`Y!u_3;$5`sq^D49Xi1;|gB5e{<=NMRT_;Tg;a(Me#o;d~IC2WA`12hmkv zw()!r-3Dfx%m>jROPCl;!HM=0Slo0zC|z-Z^PI_i5G?>^8_x&PVqmt>d=M=IW*g22 z(V);q&NERu3=AtB&FVbOPC_&=a=`b)fAo06&7#Mnx_%Qzl=rAyV%w}ZB z0~rr8mXRS3WHQJ^Mut3)p&-K;8S+5pfy`lK$O9QQ6`W-AK;a2;Eh9r7%+PJR3=BKK zxo46B6Ns@3%3%gE4na9AAjT0WhZV#)2Ia7U7$=|{b`V2C50n=tDZtmog9N0Yf=nQW z43xtRVyHklEFgv&l*0;QXh1n^Achu{!wzETKsg*BMuI-XK2DgI4D=Wn%=AE&Sto<3 z)O--rLl0CY!H@GW(PLn+1FPs@FjSfEpvS1L$G{K;HmZZcMruBY83#5h6GVY5Vr2l!fS6nK7#O%9 z`lm43NX>^C4^;xP!cQMnNsK-N1ISurZOC>f=|PHZ5DhY(ks%Xgs+B%O7({!3JrD?@ zK&CS?WWo$ZI{TzVkAa~M?C=Z_1u-fKp%C6CpQ6XWFhdVf3V_%k)vOH6TaX$RV)_gW zMqrEKI%V`37!1Hd@F)WLED0L3Odv)Il*0^SQVX+<3=sabGGt(|F+}h| zY><(x49uI5{0$Ovf!f3bVz@y$%pk@FCOpEi>USA2Fn}BZV#CY^$%E`y z9ff8fOqiL0LlJHZ$lyyx5QnlELmbD*kOH&fg%Jb8CnHb{!z*tUV+IB_XgD%~7#dIx zGl-!D<* zB!)oj3}aZ20mK5CfIbTWG9>`43o=j#Qa1sK4`MHanvynun=u2!J|tNX`;;-rT@Ld> z^d}@a5c>~YCx|6y0&*?H9uPal1me21`5;z-3CJ9e`5?LsF4JVfz%U2S1F@DMnF3n4q;WW?%pXG9yDKD10XygVIeVC@?{R#K@2d3LRAwuqeojt07E~AO1s_ zAUDREf)#)qG#$bO*}fgZgr!Rls8!4i94_#*3=?Ey`1I^NOeF&Y140~9Yl2ysj^wt*v~fe}O>0(&F_L_LQJ!>m&?VPF8oIxKCX8);<9zyJyWm^@5h zo-qSM4LFN%xXcHI8_3Nl9*3!bIU1%2#z!{^W&=VUs;59{928ezOF*`PoCfBA+y{zy zFb8HVOgYRtm<|{prU}N!)CaL1p%21G=!5WK`an(t1tf|iV1nqDAjDA(fyD-L9~UNu zZU#ae(+mS>EQ4qpNaTa4WT-IA%|A>S7(k)O$Pf<`3NvM30Htyyp$Vo844~AGBm@fW zQ{X%dS|4P}z;Fi2VFoeYK{@c65v2SkIHy92OAz}Nm=76V1hLeTq16au<1tt*V6O_XYVtj#eSU`+#P!21I@dL_X12O(UIUFEHjv1)TL!4v*vVqAA zR1`rR31Vk~`H=7hu|axJ-F3%|f#IGRs5G0TzyxAEfO42Yj7Lxo3yARq%3%dDoAjQJqeHd~Nth%AWx z&lV;NVy&=8$b#5v4lr2|tH=={3u4ze!el`#klSDd1+x28!0v%mZy*;;N8*FnJQfgB z(&mF$9u^=wAgV#^C2&~~Yl8*I{~q%}^cf_TAodNgoWpz&eFsSn#1^xJ*#Tl%SR(B3 zv1DKfMB;+avF&{*)fXjeb8<6yY*lp0XkTxI0>T*Ds3Sxs&0L0EIjtmSlz$pb1iy-zrXi7<& z4`MxW1Z7GNjrkzPAGj2V#pDE)0x_hVU@ir*6kt*y1}L#Xtb-*rAv*?!2s?07;D{pw z!xcv`6GVY*VP#-Gh}3<6DQ08%wC)xI0|Q70NEwWeZYV5WBh*215VATsa7Z>Vf@nRk zLoz@V$W2TP4U8bI$H0!t08t>@K*BH+LM#{=o%W{`29 zfPl%v%taCU!#EmEQYKWB!}*6kQoqhh+Q!C^UN6-)|rFS zi{X3_y$8%Tnh&DSfZ4|LLG&#!+hjh7egS5i&Ii$7z-+VmYPJjvQMMp+%;xjhGcbV4 z7SQN5tV{v1VRkB5FfjOob2G$0pp>~C91ajZvN}lkL1Gl74ia7vJ}A5);RWGi>Vx6y`Hf#sY;TjE`wQ#AgU|Abf;55I({j2p?w78w&;oP$k63 z5DP2w85v?>vJsXH3~832tYJ7GL>GbCM)N^*1DI_*A4G#HCQx#NRR$n7C`)C5vz5vG zCR+vukc&X#pkf4+tU+v0V1u$8hz-hiprRba28Fg6xN%`JKf;NDAr8uhx$BT61H&^* zP>RU_Q7A0+Fo4_$8#ITR597nkm9S!9kh22$*I+(~ zRspjO=Ywc1FxzN8h&BMTjpu`Ckhvf?!_2Um57};zxv*RSG7qF5 z#s}#I71uC6DD8mK4U7*;KcG4q#>X@lk}DAALih-CA$)|n5I(|O2p?u{oDBoR92-zN zGMo>h?||7x^Fg!}I8PYQ2hr$ZY-hv3kYoc&*YPzr3=9h(%sn;?3=bg8U(kp_>S4`u zU|=}v0Me5La}Lt!6x$pa7$6}7Il#)viGcwUG7vt@#a|p47=Af`Tx>8OL^C*o*oN~# zG#i+0G#^CsfZ4|LK{Uu* z85l0vf&wfWCIsSw$|pt!xKNor14ETPC=d+hPqSxWcxI2jDH~)hsGW&@8}=M~28K2E z3=Dh>eW0U=EmWF7l;V7ln2ZC+EJ)`u3w)F^!YpJ_nDanx0rh`itt${4R9u3ZoEh_B zdLcYyJs>q~44)hxGe8mn$h9y&OdZIbP;~)l>cD)Mx+C@s44CeQ$$~Oh8n{I~Nr4H( z$bfQ~L5yWk4!oNWQl94oYO+JT3t~5b`H*fth}{h4L*zm17HIQ3V?Kzr2rLUx4Pq|^ zThUQFAH)FJhZ-6nkriMilN6Xhj8#w$Gl;PU%3%R9Hb6P7AO?#wCb+XFf03FHot7Kkjetsp(H)0{x;Ft9F&>p*OfPG*KaMzF0Q=ff0(*dQa(r<28; z85mTYL76lKM7e>PSuiU>I*PznK%xP}z5)*}5bFVwEV3?;PFV1O*g3G^0Wmgv)CC&^CO<-@QfT$&4 zCOiZ{Iv#=DK1qQI#K>_0#q%Tu_%bVy;4^UYHJA^gUx8iP&A|CkYCeel&Y6LMo1urn zK?*FUI3FbN$r-eU3?bOUz@Z?eJ|86f&6$Bg97#P`s*8bhij<=Ie2}D!3j>2J4h8)T z9K}-V^Fc~fTtKm!38Hks%w!N{0A?nEC@&XKKImjr`lN=0942G&8 zNmvMjG}*a;irOAf8Ec`^4Wbn1gTx$MKues!0-#fjJzN+V0$f0)FJv1dWJ~~N5XksE zXgD%~7zI!cGl+2o%7K?+Ai)wB(1JYXJD|fR7)?|;{!1|{C^RrAfy7t1Fff=hV9HHl z>|wB%0x2~BDV@To*uwzP>Hy`>2Wj2n!oXmURXg)tuyv?rKn2kZ0vWQ+g@Hksp@X3l zYD)sl7Lddd7X}6ih7Jbidtfsm+Tki-Ap`RJHK_lYK#Utu4l{^x3(8>uG44P)tRTic zD2ENicmUg=sI^0+h{(B z-UMbF&j-;U_k*T_z_xin)UbFkFo5g;Ez|;}k}9 zj{i~?Dm@HS7`qrCJjMAS6~Ej;nFg|!7qW&JX2v#G28MG`w@z|nU|0oqtHJy{cLoNK zTafKTsI{1nP-}st7I7rj4tEBIPwt?yA^~O<$oXQ>)WHN|NI*HvAcho_!vbQ+Ksl@+ zh8&c`24bW^Iqb-$DuJUKlDt4{8!#V|yg+P_CQuY2rWq7G7#Kh*g%~B59K7-|>{r8*eY;nRyCFJwUd&IDp)K{?DI#tSG1Ubuk-E5OOf zU_OYh0xRHbm=9vy0$Z8`qMm@686XN|2D0-&Mu1d<#IVWdc`z^(K(vD>kWxm5oH`E% zh6aczi0T0|b3s%en3(~hW`UWxAZiYnnE|3!fSI` zxghEon3(~hE`gc3AnFR3nE|36fSI`l~G4Sg&b zW(ugJMzANk!r17Cv7@(FnHZ4OLYg8ly{K}K-X}~BMzb+QOlFKkq+2G2i9s+qCWeXd z6Sa}uhwevYb(nI9Gl&r8BE*o6*+5~!&+9}Hg>T+KI?n}(3A2EM!C?Mm77&Js2rz_9 zW(=Lo2q~y1x=)6eTx<-JS&;d-Rq~;jfiQuOVKNK0CNFOF$ZkP4hct1R-;h=^A~Bg5 zCc+muk}Zs+5oQ|?)^_LM6@|GQ{p?EQ%z?~?sYg!m$ZTx#j0}-5VHnNG0Pl}*FicFD z!pQkY3SLMcNg^>}T0z|~7#l`o69d&=bg!CW4noi8=zP>R5V|bFlm<|v1RgNV3=N1q zf@}<^lIVPdA*e+gdQ7A9Vfv866ni5GSp_m1X2O8P0LW5O8%Hn)qsId}AE6Gtf`^QL z;F3p(qjpD`8S0SZ6IBwS3ANfnui{|pkYfP*jRDw2k@dmMLiaceL*K>*;3>aHklX@_gW#(ih;HvA6FM_P z-$Z!R8;j&_oRT~YEiaf2Rr(l|xXv@n;4&ZGNSHcM3MHaof+>d$v?KVaiH)#0dSXRQ zPcZ#NIt!$X)UFK73QVt{CV5c0K`bRl=t5P65JzuTV-FaRi-`ztkTN1XhOiyd%SG@Z zqmeK^$S;V2F7y-dFf$nFZfBTY7>yZTs6GbSfe0`3t^>MmRMjv$kg_e(d^kugA_pT$ zASp*xgD?-iO9Z3c5o#_5jRn1c4mB}>7_XolW)R~Il*0mIyn}LBL5xpO4jYK^1w3%n!v>;jd_Y4Z zJ%?ZpVEEz5!0->O0MYL<^I~8K@dAw{X6AV@Ff4>HpLj7ayoWG3ycrm{yuk|GycrlG zA!&V6MkT(OvF$nXPHv_{P2oq-i3@-+TTVO*IDts6iK+Z#I^}h3B zU;x?0$dCxq_W`UI-uwH3R~F;}kn5QkCRW;bGcbT03Sz@-HiC+wC-ooR3=ApYP@3on zuSNfOGcbtxfX3e}=7Z=^ACTwa!)XX7*bZ1_p>qc&WhQ!@!^bmdyiE zN?>LNh%y2*^UQo07#tu>C%8#@AOi!yq8T6xVkmrlwrb z>1JbSuIKoV=w^T%A^|oL*-BX8AY2X~ZVK{dV94?Y1%bhQ5DkiLMutRCoZf>9gJ@7Z zA@#ZoycrlkD%l{{X~P4w&WC}a0UXMpQ|84@rX{Hb@gFg(50>gf2*^ zgLFLs>w@G59bX296kkw51L4>BGBAKlL61FzIgn}{WR410AEb%|u|Z~mY)_dFVnIxS z$iiaafDZ!$NGB|Jg4haRQy_i->5D<)gV=H4fM}?n4`O5?NrKopFi8*tVk5*PWE(;L z1;r`IbdX;`>>^(V29RH2O$HDfq#q;)(|ZI|Ap3%Iy6Hp-0UNvWL`^h#F#`*hQp7nEMA; z+QQ6DsD2EQ~?1R>h!%6l>@u8+syv#T#-0MP|dguh`VV#IQFMv5Ug= z4CZt)+I*x^^ASC#fOdqyJH?>XiCpTSYk;K|6hQ1fU_K=Af!N#pV7uu+tbKlG_=F7lv88Yx6;>W-c>j#<+$SCq-U?_tyVG2R+fVdxZ zP`bsBfuRRgDNGBfT%bpH6lNcKl>~|eV#Zq`5dt#>Idm|)kf>^5deCRs2=QV1knKWV zZim!(MOFgShSc%F&V(t%RYxJ|f+?k8WWlUJk012VMU5}~vIsLF84*<83k!i8ehdu%z-GoyW{jE42x3Fbj05u#=0M7JggFrP$mW3bfyyL=I}GQyLEXW~ z5DU`^QUcS)=g+_(?GLV4Ciyck%!V*G_%kqUfiPhT5$-^Bf1E!9LyA8rIP2=?gBS&1 zPeL3EVpqW=VJ2nxGcaVL8h*&1f#DRY5KJ}2*$HF-d?hl7gMA1eW*@n^4mDJegBZQA zL@(wLHbVl9SUyZ0vR(A7sKED%z#M^IrlLr~6yYxbV5&fIM31Hk$R2ou6lVEAMn7tX z28U=2V(T23ACJsORS)yQKqUt(kqZi8dc-8m>jN2iLo4snH?k;=A4m;~FoiNc!kqZY zjB&^r3bhPJFQ+m2`1Ql=K?-XmCKg$k5XIRBW)Qjgfm-29YIvfmhxr02(2$r|WP1V_ z7W z_K20wO9B`ejs<|)eUPnzAU4PfRt9EIsBJfpq(N+uDJ%?4`w-(lTtN&BJVBs_(L-}PU`k+om_tG87{Govn9mf05ax*x1_qEFj12JI9w0+oLO@XhDU?C%DPTS%5rf#vzctHi3Knx!!hZ)3}1?9k%$AvO5YEm3yHK3>9IZKrou$6~@2-Qh>Y{_*p0eLk3vh7)c(nKloiJ0|OgWJ|Yai zT97)B8st62d|?a>W?=n@8&2imVu-z9DsVBx#j6N0#93=6{XF;BVc^noP zAU-G%kT*IvgfTFni^0?r*~Wq?M{h}?_vumV5Oi5)hK@@3#5Sr@m<2?-2c!&M`hYlt z`5+|t5l6_!9l<<|8KS6Du&BX=zSab03Q|dl5Q0~22qE}cB`_iM8U`lL#4s_J5E~}X z%+P^o&cOtUbx}A>1B^yLDhDQx%SAAG9IhZH5U{uvmu<-6q}q(E7Z)3=nV=GF0<_p; z0x>2*Im{r&4JZd*L4cG`3j@`akh%=S-UsGG>P8UzKp3PEmoXp2x`reRVqXUv*-<(l z!~mI(nhHT8x4=p!DKLQ;cc2_*5JM{*Qb5Dq15*A9Yy-qSAod5i{a{u&!nG{n3=FJb zK4c>>hz&9l(+MCM*vR};TnCBhK%K(`V(39R%pisVl*0mI7(qF#AchH)!vN${^AQ_nFKACv3y2Lf1<|1ai8Mex%>-gJ zK{?DIMhld~0%Ej5IjkT?2b9AGV)Q^c>>$RQa8O;1=&ONjm*ks%G)xU~5o<3L&%8PY%$OeZ4L?u9cjJP8N2uHbt{VR;g% z*Nt>s7OKTCwXi@%@FC8H@jhpHN6%ND3-m_Uqe zP!2PQQ4k3U0Jt|n$}b@~6vVy^=0ids#0F_Xwd6ts0|N)xD9-=$K@6QpQ1n7V2E^6_ z^C5n>iezALfGGwsV!)CR#UM7wd}apD|L~}Sg$t;0Ma0-OOgUyiLF|CZqxu28fru&# z(}UhdLFXgXK|G7#L&6WnC)RXyQy_y|FjLTd2oonVpg_v7w_KSRdf=^CCWan9n87d_ z-D31{SXA$!%N9j4FqD8(z$67G5TgvrVFocOpd1zuqYBDl1u<%%95xVRO%x>Q!pGS_ zrq+X#5+u+->{(zwB-%mjMUk*#2E^ivLZngxAP#D>W;Gc+O$MH;(A5r-+} zVyNMm!pQMo3d=4m%y1*7Fa#xt;g;4&?0!QU$FLwqPhP09FjY(p6Z5gLVPfbt7INV4CIgsJm}w1C2E*jh0}-DrOb=b1 zz|7E51uvCRT}z^SK+Yzo6oxOrU}ETjvtf2)hA(POf$C!PnjdBg(tt1%LjzJ%1Hs0j z1iK0F!@5y*!G&SE(A|U1hpA&?m{?AT4UUq z^vA@2=zrt#0(z=~w3HC4iK$O8yTO<#7tsyI6>mtfjj$foIn;10U85X5!Jv8o=1mHn zglZ_dmH0ccFehL}A!f=(jzY+iP=sz&)i7}iJ%*lv&^?N3DfO}!%=zd+iEck?;v_Gi zL1rQX7G^V%0S8isy&i%YL=P{ZM-w(XF}(;Iutc~Nwa`FMk)VJ=3|PW+fkJ?Y0vx0a z9#BjSh}#8W=3sL(Vhjvjmbj=!8$Lt?0Zs{+Yp@iBNJ41Z5zd5ZM-Mt|&PBKerVA8C zqy{BO54?>5;=p^L^s0N1!Ug6L9K(_@X^=CC@Fz?;X56C|JD_xlhywJyfL|772TI!t zF+PMt7`rZbiwsp4To|Sc-9P9qB&SfLI7o?UWuOdPqK7lOukb2Hk%WZ{#eN_^S-_lt z-bqB~Bh---N$94b2N@xGnC(Oc6i6Ao$OUoW_z6e-Zft{KV*r6`gx2cig~ z>%giAMF$E8rX1G|6g?{VRgkNXiDBSOhWUt_p+|>JnWKk62`R+sCJ1u{<`qk*2Xr$t z^dQzdp)1BKNs?l`Cc)f_yu1s&Q;ICd#DG{oi7Jj*3dYR9kps^X$cpe8408xd8ph3m zDd%B;6#u9pi<$-rsX$f@Gna#*1ugjyBLdTn;%>ZxYz&{$HX^l42=QTtp{D?JKHf;j zD@i?*U~Xk%=+U4C8)gRGGBQ?+V6Gsyd?Z&Naw^4c26j=x`UtCl`5C({=YIp~8^a6D{4rB*n z^a6dOD8gls^>7G2YEvI%3Su}3y_SaQ0tE&|X$)il_MipHz-Q%|7&h+z@K zz`)MX!8(OWnQ=ad;|vz)fe66t1X)o4);39j3B&;1BFV(iqkycS4#^%68>9xkNC6qt z16BtKFA&=<7UVuiNI8KH4NpMuk+U zNI^1);sFOjN5Fg#Lj)o&70bY21ZHM{!Z#1X1W}-nVqxff$}qn!mVsdoL;^(3j|C+= zki@!J28J^b2@rK2E+G@gz>pmWvN)q4j)9>F%!~q2YrxEm4RH(%2O!L2aSRNnAk0s3 z3=9GBAZ<|~DhSLB1yOgv%&0f<3=ChuOnAmP6vMy(auFj#5-9H0fSr>BqCl==WC#LL zAeS*RBwdMRV7LWQ0HQ#yWMl{eQGQ?tB!MW9D;XK0K~xPy6ht+Fnb9Ds1I$bUQUAcq zXb{B%c2*LI;)@5Rk7@?ae^T>7YypTAh!O)cqd`;zn31u4-$%wu2xC7vyi6az{;APbO& z`+H&;7(ihNTlKXkmVp5jWH3I=ltplLkSl>N!PPOB zpxj%|I3L7tfQUQAGcbU{j*%f8L_wk|7(_u5B7C3CqId>|HDCic6y}2%TfhdueKsqB zfniPp$bv}=0$lh(%6|}h1DFpf6F}@u z380J#y0Z|(dWIwmVuOrCtw=#;t^uop6u2NZNGGhj0%BiBk_WNhfccQ>8N`N}ifF;a za569?a56B|a56AVfVZ|77{oXk7#1P%L2MPI)j1%x0T%-U2pe%RFo5t5E(Qh=KE}ns z0K%8J7#Kj9kDGx3giW{^7(mzoeyI=x!y;}5hBMp@4EI24;7tt%1~ncAh7=wKh8!LS zhB72^3mygrD;@@h2p$H8C?s)^nNHjc3?S^n&An}Gp@C3qMZKp5G65W9khfdPc;co-N!cn%K(0|>7{ za?d3m28K@{J}(1<5`6zT1A`AQ149BY1H%Mf28LBg;vl^SybKH=ya!3#kB@;Nh>w9G zjE{jK3u#^S3VsHLHT(<=8~7O*j_|`W76U_y00Tpf00YB30R{#gK~(VysQ5Yf{!xf} zQp7U^7#Io!7#Kql_f#HWJ1A~qj1B00u zLcNDD0|SRB0|SpJ1H&n#6}f)G3=C<)3=A`b85sQF4KxM@ka!YQ{Dd&V98$%Dgc%s3 zgc%s(gc%q>=FJgiVAz0U9!Lyi{}o{dh7U;MAh9f{n_%wNL2@@tzDtCGVHuLU|A{a# zut5E(futUnILM9)VFm_}*}IU`!^BfW85pXN!~?__80y3r7#hSF7`nt57-oqvFf2d{ zXHXh{!^^+`!YX_W3?OX6$G`x>3j7QVAS@@qzyQK)gcuk=7!*$+yaCA^CUFJ^4RHpB zdEyKV3&auO4-zvIXJBBHU|{f)K!}6HV#FC3;=~ykDv;E}#P*0YFfbvh2dROX4U&VI zbU=cEfkl#mfk%>oK}-@R%D`|#f`Q?d1Ovkl2?mB=Naldt93{cP0Kyp(3=AN=NrHg^ zghBd2I7O0y0fgsBGBAK}f)v8sc~T4v>!cVMHb^lr>_QR;sY#MzU;yDhDFy}*o*>1* z0K$``7#KkKkQ4(02)~hHU;yE7QVa|rY$naX0K!Y885lr#lQaVZ2>+30U;tqW83qOr z&Vb*~%)kI*SI96hfN+Nl0|N-Zkzrr}VIDaK1`rmJV_*Pb4LJq|5Vn#-_`^kxfgw+h zfuTu`fnk{(1H%_N28Mrf3=Dko3=B&03=9tP3=DDd({z0CB!9;<9!B2sKp%31vVqgG;0m$zl4Dufc*U2+5 zfH25h5C*9S;S&lB3?N*g2y-n1Lz^N4L!Tl8!z@Jxh6PCC_Y@fz{($&O3=B+42=%zc zL25*l7#O6K7#K2?7#MPt7#Nz6^nvVbQexmxl@gS;gK2x1A{sP0}GP4 zi#h{CjXDFv5_JZKRYZt`?7F4IzyQK*$_xx3ETPQ60KzKD3=AM#q|Cqo!YV2Z3?S^G z!oUE+1u6^-AY7%wzyQK6Dhv!DJWGXv0faZGFff4d0~H1a5av;3U;tq;RR#tSR#9bO z0AUMN1_lszQe|KO;Q&WU;yC>stgPuJWG{<0fbkmGBAMf z9#sYg5I&~LzyQJ*R2djR_<ap+tv)p-P8=p+Sd%p-qQ@ zp$Ewx(2N}jgTe&lZxFUY@_(2f1H%?Q1_ld#1_nQU28I}Y28INEm}?jq@}TnQ;s6dz;MKof#HcGro50H149BC@@5tc3>z#M7*^OZFnqFu zn62Q1Fh9hCfnkXSM4X8T@jXy;Kx&cA!6|OZz%b2^!ij+)4#^$?YX$}d zYX*jS)(i~GtP$?QC9Y$`z+h*?z~E-Xzz}A`z>sCbz))kuz|dmDz%a#zfnk*m1H&F0 z28JUx3=CIn7#LpIFfjbGVPIggWnd7pMVN1A%fR4g%fP^6&%jV-j}YHt%fPVBmVsf4 z0|P^mBLjmIlABYI+*) zc;SIi|HgxXLCuqaLC2GU!N3zC4$_ zuja$RpyR{90J@JIrXF>lJdn0ineMh+hk8+2VeOdfP?dxsALLyr#w!yF$5hIu{=3`=|%7?$}!ZgD479ms6Z zCDAZ_=Q!)SDM#EOG1bN=H4xs5r<7iJ1*5F8c5WMJmP=;1C7y4wPDHN^ry1_scD z7BK&U?%4p{PXQ9&Mt7G5wKrUS-@(X!9P(@A)$@fDT!Q zxeIg_Jm?H~koX6Gm?-3oc+h$3=;AQ@U^Gkzj1QxSx;VN1AXgu#YyjO31Jh3_4KfRK z7XU7EKyskl18~Wsi^Jj*bcpB~=s}`U!3+#V&_g$2@}Pq}U7&}H;*tlQt|=7Ez<^I3 z=tNGCI?y4dFmpgBgTm|~Bo90GazO|K!=ezFE(QkBVU-{;*eQ{)BO*bEP96whV1OMq z3DW^m?-jzpFd>A2VH%P-ps+IvU|;~@fB*&t5Y7u=U;tszxxF9^I#3sc%>o%1K)5fE zfdPaM1Trvy@TWiq1`r0FTnoaWb6r6gbd)FvGl1+1VPF6q{|UmNLoZ?O0IlgAam=;AOwOrKf=1A`CrBq7ilKrnHbIv7nz z{8j`514ASO1MGksn0nA@ISP>s41Q2Km^jGopu@^Q7<2{~2!l?N0%6brN-%ptY>>M^ z7<70KOdP}p9i#)}6QV(CK_{qyFzECVm^*Ok!zE8GahScNnn$TVn0^>ds{MmaJQY%Ur^imQ_5*hT8ii;WaQd0|x z@^e8-AsP~sic5+Z^pf*)b5rv`N>h_c)8iA167$kiiy8D%z}(Edw0sylF)67iwG76~ z$;?ZIvD1nYbKxAYsSw>c`N=RPP-EdPC(Mv$fHb;c^X^+17#RBC=O%;JQbEiBjgNx@ zo*BedXkc(kW?+~EVnZ=V4#WhFGlN!kg49h?XkfUK%)nrdH0cUc2O9qau|et>7#hLq zkjAbUKyo1SKr2IGY!II#g@Iv(C}_C}hzFYf2Q7kQV6b8UtvP^*fyfP&3=AFc1(Fay zg2X}N5FqmmKpX}J28%`p2Bfh>u)QF8A85Ehl`*6@GB7kCO)7)bfaE~w3dRQUpZ75^ z%s7e=fw9uj%&QM!V&H_Ir;Ko4DVn;D?Mw{S*FYviFwDG0G<7U}%nU5b5H%nYc03&D z{ArLLn14AoGBa$g2dRKykQ@llL^E%%0SklHYls>U2~q>1m!PS8F3rmDKo%qe!7z28 z`DRGmLd1_-vNCLfFu^2D9f*c6gk@l0D6wT_P%vj;0L?RhV}!&nXbv2-jsn@dDJ857 zT}YEdAalS5;~|*AvCF^!x*`{(jF|yqGbo)x_%Itlp$ke+uuufag81KgT z^TT`yQqI7_@bN!rp4$%00}&tpgXSR-V}Kw3t1>V!AjT9w{?}t*U;yPgkZJ~okN=Uz ze;Gi0(6}NZtUvxo>W|UIKG0nNpoJ=+m}6pqY)J+!Sb_0t86XQ+V0=&+1zNxY!l z=pd<2W@2D4K~kT?#K2&M-9Ek8+ z1PUJ{{%SP$?f``^yjoynIK#xiz=p)XkEWj1<@pCX+xL^s_A$Y#cm_}rMEm-Yo6h!$ zFf%ZK+cPYn{L9QBO=tVn=xm=MGXsOP0<8RHVsNIj{XWc)#WkRHfuQ;=m6?HIHd1|% z&CI|s2Z>+D%)l@giQmc0z%UP~JekJKz_380fdNv5Ff%M>W?)!?B)@@~fng<*eo%R| z3`zb7GXuj4B>A&+4v*W+3=E)!5>?Rp`WZ6=!ww|(ePw1~*oDMrWnp00h~!=&76yh5 zNPI;W28K0Ad;=B+hAl|?Em;^C)+5QgvM?~LL*o0gFfgn|;zzMCFlC+O%Zb#bqep*9n3aJ6w4k8} znm^=O85r(sG%$d&DaikttPBiykoZQd3=9ei4WO}n21W)Z1}jzuh605K22j@*#CN2# z`$Oq$UmTt7%b>G;^>nsx0-fz!MrZqW)7ic=bhhs@D+2>)pnDFq{J71^z#yXlYcDV{ zJfO3C-qP7VP+t~WJ=3MXhdjgwsvmgS7#NNu!d$?}AjihQa0Q94&&I&;2#N0i8d!oV z2kG}?V_?XEkFPT_#IZ3j1R?PY(9~D3F);KX$+x4))4D&{PiOmP)7ifDbhhsxo$b3o zXZ!Bb*}e~Sw(l>U?Gr$nQUH}7w9fB}bhgim&i47x*}g`Zb)84bh-^T#)@cIUyTvLDwvS z_~$tx8!kcK1o6LeGBAJ^DuUKEg82V9AseCU7$EKyX5SVr$N>wW znSYRa&><0GNs#$akpJ&+F))A@T!OCZ1v z8?x~hv{C`2-w;jSmK(C+Ee#rfQqRW# z9$y5>v+*!6+yO;414xXKL5c^mA+rn`KdL+o3~71|44|bsAorT{Al5^H!q*OTU`03s z15AAo4`f3uXl)C~`~)5b2GGWhC!l#h21bTP9@OydL*vf^MFc}518D7&AOj1-N*)FV z&_-MvsC#zvKsL65#z#TspW%UQRs?wg#D9Wj-UpC-6&S$lp+NGCphGegA#0>Sd|_Tx z_sH`?7Q5|%+NXymZ-vHpz;Fk2 z?itiSQ}`GdKnr|lK>172+_RC7fk6S3xWMV}%fMg(HSZ%I zJUc%FgNh?7LCK=_Ymmd70@DesQ)hWqvp@2{0t0Y2@DLd^71E|`K$tvjpLy5 zA7s9m0IL6$(fE1-kOL%O<)@_pWP>`ae)183Yy^jeZ=3++U>aEd%S1D;42|C;z`)?C z4O!0uijO%0kOlal^BX|!TPFZHh@*=cl3ou8KsKtw?7NI+-hBb&^5^6Kj{>OS^H%_} zfga{QK0yYCM;Z+bpmkj!`;`P47*6UnfSLjf0u0RH18p3T>K7Y928JC`3=AOugYuJy zAZqx92r@A2iDm%LH-Ow9hbEsT2s!Ad1sZ>iX!5;i{F#D~12$mkVWA*oqdhD=ZbDNJ zI=lw7(K8Hc{wYBQ2GB+X(D*0FJud|z2MB@YLqPnWX!==&Q2iq)1le4=4QigO5CcO? z0>u9y{i;F?44{n-p!G%|zO4{s!z;|aK|%}+poROe@;OzAfdRDOALhPlAqEB;r0|`E zX8$sfejmtsB~X2~PY7~Q2xwg%$iDMJi1-DyudWF}4om>8mj%hcKr`=)5Cg+1r1I~t z5M;wGti2)tI&emtfk6yfAE^tYhKI2*1Na~YSo(7nh8$1=OHZIfb&%V8pu=@Q2d}{D z-%Mc!1}P?pe*_sA8ES+f2SLEh>l0>R04>OdwLhk!*}o8tzZQ+ZQ<#APwDA!Z{-6Vb zKpR#->wQ7t@d!yC6rR7)^s|XTHVnH!^P8{;WTQSTe$_-67(fS#NI~l_JrM>5&;cH> z_Ku?n0|RJd$`fdM0Uca~93D|34B&%yKnw6d?nxD4VED%YYFmIXBSVP@14ABC`l=H_ z4gYQt1_p1W@?trf{ALjb24e=udQ<@h7KQ_8@@LTaH_`adL>L%A8-0qP?gt%C1X>sm z^B=P)1NeXnSo-1WfD#vI{9O=(94rD_mkUyV zPmF;9bnqFh{QV%tz+j_=Xb=2Bv!6p8a-bZn{E`ue983d?Pfc-D|9}pALUyl{I0FM{ zqcE)g_7g{xSD^R=9RdZ~2(}99-V$-hflRRWOBb5?)6n>f#2FYs2U~&GcY^%42~B>V zIOMP>Sow2FoPps52c-N4+5b=+a)1piJ%18sU;rIx0E<6P2?p@NHJ}SSK<3Lxp!!!6 zjc+P}oPL-Y96^UxIWsW8;x|-+fq_%A0os0NW=N5M9Q+5XpE4yN8&E*?E6BclH1n&` z_#J5c$!Prf5|D$Ul%VC+S_#NOQn2*83#49+fdQ62PD?N__#&mJmlBYJtU%}0fZX#H zq#mh1&nO8wPzlz56p%y>A6ZG%{AnV|z~HFe0AAk-YHzrssSiQpCmjS4%<;LTrPkpEgO<{@*%D$U%cJ{~bm%|C}V`kf}9L{ddviUq~`AfHnhx_7{Ns z|4|Zh&=4&A*rXU3G!hsX+@Sg;r632Q!1AYo6y)F`Sb5|u1vxln3$%WXlY$&bu?VU^ zOA0mo%Fy^tXnfG&W1s`TVCC5oG6tpLPR-1TzD;Kk!fr zav&mTy$Q&_pFszi`7tnrK+}(?G^+a)(fGR3ki&K!LDgGILpDgk%1?VV_1@A93>%^t zz&jg2`7vA?a*!3wKjqSpgQZ~Z?LgB%1$2O#1Oo#s{jHEjEnl`tLk@_7mA_}uWgv$)!Ro(Q8RYVVi6I3|eE}N3Mh0@Q$~$gI|6qy?YWsbr4CFw+NznAR6ixpo zH2z*R{z)0gMqpTZcvA*7e|?dGY!HUYv&y3SS5OvmfEKL$SC)kwdlk>R^6~;=|>)ouMIl*PXX3HWn!?9 zhaB7o8&C6;ha89tYoCRp=}&~}2km1NWME<_kcS+!wg4Q5j0{a^>igsw7%Z3=7(jcX zK>Zca0fe9f7GdSlK9G3{knvVG~3$iYgm`d3wff#FFa z0|V%sF;M(lC@?U9Hl*%=_E#K1`sE<)8<2Y<6&M&C*%%nkF+$Q$8b}@~y%j4kFn~6L zgZf(_^Xe5Khe5*n#|%E9ZjLUg#mPmP1ts}K#d^sM@$ta{@gDK<5QYzg5#;I)W;i*oEO9B#&8>uRLlTR# zAza6Tf}G4`uv&x~B*CE6;#8peDc%v zk{NvR)7?t*lKs=tV9b!zqTI~9#2gUcH#HYZ1(Xy)Sw5+0B_Jk9n{R4veo-Ze=bN9B z3Nbf6K3UJq*u;{-$JIqInZYS1GcOzDrsTvNkYkKYOhGar-4ON8`MJ4?c`1;nP1Z9r zF|%L*n_*&R24k4O7)DTrxiOSsX$WDM8bWoM8bPH@&CQ`w=B6+POv(akj;RGqjfEvd zjhUe(1Jp%6nR%%o50s{*r51UnR4@dWB$kvGLtG7Zp`j7fg@#5J4Drc1sfk7LNyWu_ zpxx2=2!4EVNn#ObGc~eUPJVs?gL6h=ZfZ_yex9yxW?rUVGDC1>aY<^fUNS>aVqQu< zhyij8IIbaKt(VLIVK4-zmXu`XrGvr^7G-+L3@|1*!KUUURx(6@q6TbIVotJiMrv|) zacQnza(-TMNkLJ5ft~@_U#SevrA0-lc_nV3ZQFjOxk;%-3_+~CmdVq&aoVm!uXk1SjSe#YDH!VLwqS*0Bit)8=qRh z5RW7s56+PBAYEXU#U=R#@dZWs=|zdTkOZoi%;4ea5|CI_oLU5m2XI}2S~q#*7nh)h zHN^MuKmjR$a{@98Qqck&Bm|dtEKSMGM-4*{PZv}H-^AkL;FA2J#Pn1&2~QVKRFMEs zNT(K|3I_SPcm|^iIp(Dl4kiq9 z8;4p`y-?K0Z#4&ff80hs8rf+dZ`;IJE?pcms;^3sQ?p zDjDF4eS={tgPnstK_zTrUJ9(}LMZd_bb+aZ*54kUEN1!mW}x~pHMP7bzR1ubzQWij(WDfV zZE{O!qO72gmkL1ah<6vN$9OMEhmOBkG8oY5^$ zg#}$Ptm+R2Cm>Mu3KIc^pG$suUQT`@)PcnyCuSz*WLBl7Ae>}ugla8F5kq`@YC&dB zetKzYd{Js~Nq$jkaeO@3o8Tycrx$3g@19!XR9TV=Z47{AK_x5HC}=E!8#OStA*e}( zDsO2BuR$Ea&0J7PkL-JBl7<%NL8*nMsl_EAbKHwkQ}aNPmY;{@FHjQx-K$8+E(Lf6g z?BM~=ZiWU(zBV#p02R8aDX>Nul8?eti;6Sz^N>V*Qd5FbQ!rAqV?hCGlo=X?-)T}MdDalWa&&(@JEh<4snSolf(Acstgf|L7h6I-s zW#**^Ac_lc3nw0$4C0~nk&i3Xx!}S-Gug4A0Gw12+F+Rro_Qc44~vI*h_MLc-~nlA zfH1_fIM_8LGyq;$!4;W+8rDgPDe;-Gb_GLjYHo5tCBlz}Mxd+)?mGmhmVg>r{&_i- z4Dc330H|9MoLT~E{z3!O$JHe$H3gcqA>P7);CZi@p}3?d zFS(#HJ^(onx#g4=XCRzp4oV`R)0N^u#YB8+9#X+zXlMdU5}>jK5`5594h}1b3m_c; zSCFrr^7BhT=A;(EBM{m&ga;ESl%UaUXlMYL|lVqJpIrzGbD__ zHB1sHc_Zo=sB4Vj{juQG5=ciE5#WXfp!x}>657cHXDVnm2L*L#L3&YQN-8Y$A&moY z*$(Msfy)qhkQy2w1%;&rI7z^L7o3`tnp~2a;^yh*kLEM~&=6>Bh8BQg4HBJ5&hW`k z2PH*>I&13<&ab2YVzZH4n*X zP;CK=tYT5XWof=vIDuCQk z3ZVG-%)HDJq?8z%nG&2?1&S+Z(3+Znyp^0=5Fdb4e}j7M&Oy$OFrAb-d zEaABY6eG~=0;{BaKy4SeQbS{CegVg$Z(?3)T4HiZX;Eqsq>6yq1u_Vdq`^J7_##By z7$W69L!>Il)C?SY;C^O&a7k$rB8q}b5_57wiW2jR6CuM@7)`?9(&7S0sQ?WUb6BJY zrkJmmagXk-lW z5v)H9D+oLi^HOqLGLFA`mc)bG78JIBv8lmw|1CQmvQUj=D z02f9+`FZKk1O#p4=jTDISqy_*GK-VZYa%01+5wk-pvXqbl^~yjMtr~l4yue@GK)c@ zo~YF^wA=x;>Qhs|Emn-|4)V8&HzLqdQqvMkbC4=SQ&cU`CLuh^3=I)M6>n?|ZH@<* zi%92!A`w)F-0JUQooLb_8S}dS6S)o-YtX@H_LXAM7 z0(BU2UNSR-M=&&RKnFG89yA6eJ*ZA|cts3y3$*D6iWyjp$Aj9C#SHMQACeEv_HYH@ zUIDyg7J#KIWr~zA&5`O93uDLtDxy>{0@cpBr8)VK<{%_OLC%4dUXVduSbBk$uEFqJ z3HPI!0W?=b!yrEonl2&DR!AcjsvXpFfHXm%u?Q)BK;=EG>;fkrIeE$QB}{0HnAvGDB4HpyDgu0-AS`vXoO%YGO8cE&?q9Aem!gff79V z>CpK(a3+O&!_deCRGfeY5g0(j*{B|YW)!$3p2ePiAU9QlYYJ#`2ujV(FG&TpVoM8L z^FXyPsNhBno})MemeCLnFf;=>0Nkj6CIwI?fQ*8`Ee4l$;O;+kk^*Vu4wgK?(F7eG z^2&+QGQBkGH7N4oH)QC0(BLrah{qBZh#|1K;>Y5 z3Q|kT0x4%1B9;FZ;9v%sk)M(Z&ILaC>F@yu&lKc-1yWNO9!#d777(U2QO*C<4BOw9F}ijwpzklfY634WK<2B z($NAIl=zU!cckcoRi)6H9#k%ZEd`a^MJe&vJNA}H-Zw(>iV0Hufv0Dojx~cd*8*}% ziw(1(O@nxICx&>?JPl-cwK%a1Jhlp(O2SrTgPjJAZ^)n(JW33~4#_ReDTb7jKCUhy LMVaa8sYMI`O5xjc diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Chameleon-Mini.hex index 03767e9..3d1baa0 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.hex @@ -1,1588 +1,1530 @@ -:100000006DC4000087C4000085C4000083C40000E4 -:1000100081C400007FC400007DC400007BC40000D8 -:1000200079C4000077C4000003C5000073C4000059 -:1000300071C400006FC400006DC400006BC40000F8 -:1000400069C4000067C4000065C4000063C4000008 -:1000500061C400005FC400000C940C175BC4000076 -:1000600059C4000057C4000055C4000053C4000028 -:1000700051C400004FC400004DC400004BC4000038 -:1000800049C4000047C400000C94DB1643C40000C0 -:1000900041C400003FC400003DC400003BC4000058 -:1000A00039C4000037C4000035C4000033C4000068 -:1000B00031C400002FC400002DC400002BC4000078 -:1000C00029C4000027C4000025C4000023C4000088 -:1000D00021C400001FC400001DC400001BC4000098 -:1000E00019C4000017C4000015C4000013C40000A8 -:1000F00011C400000FC400000DC400000BC40000B8 -:1001000009C4000007C4000005C4000003C40000C7 -:1001100001C40000FFC30000FDC30000FBC30000DA -:10012000F9C30000F7C30000F5C30000F3C30000EB -:10013000F1C30000EFC30000EDC30000EBC30000FB -:10014000E9C30000E7C30000E5C300000C94B0174A -:10015000E1C30000DFC30000DDC30000DBC300001B -:10016000D9C30000D7C30000D5C30000D3C300002B -:10017000D1C30000CFC30000CDC30000CBC300003B -:10018000C9C30000C7C30000C5C30000C3C300004B -:10019000C1C30000BFC30000BDC30000BBC300005B -:1001A000B9C30000B7C30000B5C30000B3C300006B -:1001B000B1C30000AFC30000ADC30000ABC300007B -:1001C000A9C30000A7C30000A5C30000A3C300008B -:1001D000A1C300009FC300009DC300009BC300009B -:1001E00099C3000097C3000095C3000093C30000AB -:1001F00091C300000C94DA2A8DC300001C034C004C -:100200005500460041002000430044004300200008 -:10021000440065006D006F00000018034400650095 -:1002200061006E002000430061006D0065007200F7 -:10023000610000000403090409023E00020100C03D -:10024000320904000001020201000524001001042B -:100250002402060524060001070582030800FF09A1 -:10026000040100020A00000007050402100005074F -:100270000583021000051201100102000008EB03C3 -:10028000442001000102DC01004E4F4E45000000F9 -:10029000000000000000000000A005A105A205A3C9 -:1002A00005A405A505A805A90500000001014D4606 -:1002B0005F554C5452414C49474854000000A11826 -:1002C000D81889198D1991199219E41AF71A400052 -:1002D0000700024D465F434C41535349435F314B46 -:1002E000000000A118D818361B691B6D1B6E1B324D -:1002F00021532100040400034D465F504C555331F7 -:100300004B5F374200000000A118D818451B691B3D -:100310006D1B6E1B3221532100040700044D465F04 -:10032000434C41535349435F344B000000A118D85C -:10033000185A1B691B6D1B6E1B32215321001004C0 -:10034000000549534F3134343433415F534E4946ED -:100350004600A118D818A205A305A405A505A8055F -:10036000A905000000014E4F4E45000000000000AE -:10037000000000000000000000000000000000007D -:100380000000000000005549445F52414E444F4D6B -:10039000000000000000000000000000000000005D -:1003A0000000000000005549445F4C4546545F4939 -:1003B0004E4352454D454E540000000000000000E1 -:1003C0000000000000005549445F52494748545F0F -:1003D000494E4352454D454E540000000000000078 -:1003E0000000000000005549445F4C4546545F44FE -:1003F000454352454D454E540000000000000000AA -:100400000000000000005549445F52494748545FCE -:1004100044454352454D454E540000000000000045 -:100420000000000000004359434C455F53455454BD -:10043000494E47530000000000000000000000008B -:1004400000000000000053544F52455F4D454D00E1 -:10045000000000000000000000000000000000009C -:10046000000000000000524543414C4C5F4D454D9B -:10047000000000000000000000000000000000007C -:100480000000000000004F46460000000000000091 -:100490000000000000004D454D4F52590000000083 -:1004A0000000000000005445524D494E414C0000F0 -:1004B0000000000000002C004E4F4E4500000000E0 -:1004C000000000000000000000000000000000002C -:1004D00000000000000000005445524D494E414CC0 -:1004E0005F434F4E4E00000000000000000000007F -:1004F00000000000000000005445524D494E414CA0 -:100500005F52585458000000000000000000000036 -:10051000000000000000000053455454494E475F5E -:100520004348414E47450000000000000000000025 -:1005300000000000000000004D454D4F52595F5330 -:10054000544F52454400000000000000000000002D -:1005500000000000000000004D454D4F52595F4320 -:1005600048414E47454400000000000000000000E4 -:100570000000000000000000434F4445435F525814 -:10058000000000000000000000000000000000006B -:100590000000000000000000434F4445435F5458F2 -:1005A000000000000000000000000000000000004B -:1005B00000000000000000004368616D656C656F1D -:1005C0006E2D4D696E69202553207573696E672005 -:1005D0004C55464120255320636F6D70696C6564EE -:1005E0002077697468204156522D47434320255394 -:1005F000003135303232330031333039303100346C -:100600002E372E320025730052414E444F4D0025A7 -:10061000750025750025532C2553004C4F4144424D -:10062000494E00434C454152002575004C4F414412 -:1006300042494E00434C45415200253575206D56C8 -:100640000056455253494F4E000000000000000084 -:1006500000000000004F11434F4E46494700000084 -:10066000000000000000008C1183116D11554944F9 -:10067000000000000000000000000000000000B9C1 -:10068000119211524541444F4E4C59000000000058 -:1006900000000000002412121255504C4F4144003B -:1006A00000000000000000000038120000000044BC -:1006B0004F574E4C4F414400000000000000003DE9 -:1006C0001200000000524553455400000000000095 -:1006D0000000000000421200000000555047524147 -:1006E00044450000000000000000004D1200000022 -:1006F000004D454D53495A450000000000000000E0 -:100700000000000000581255494453495A45000062 -:10071000000000000000000000000070124255546C -:10072000544F4E00000000000000000000861292AE -:10073000128B12425554544F4E5F4C4F4E4700009F -:100740000000009C12A812A1124C45444752454596 -:100750004E0000000000000000B212BE12B7124CA2 -:10076000454452454400000000000000000000C85D -:1007700012D412CD124C4F474D4F4445000000009B -:100780000000000000DE12E812E3124C4F474D4516 -:100790004D00000000000000000000F01224130AC9 -:1007A0001353455454494E47000000000000000018 -:1007B00000000049134413434C454152000000001F -:1007C0000000000000000051130000000048454CEC -:1007D0005000000000000000000000000055130061 -:1007E00000000052535349000000000000000000C8 -:1007F00000000000000000A1130000000000000045 -:100800000000000000000000000000000000000DDB -:100810000A000D0A00643130303A4F4B00000000EE -:1008200000000000000000000000000000000000C8 -:10083000000000000000653130313A4F4B2057492D -:1008400054482054455854000000000000000000A7 -:10085000000000000000006E3131303A5741495429 -:10086000494E4720464F5220584D4F44454D0000B9 -:100870000000000000000000C83230303A554E4BF6 -:100880004E4F574E20434F4D4D414E440000000007 -:10089000000000000000000000C93230313A494E2B -:1008A00056414C494420434F4D4D414E44205553F1 -:1008B00041474500000000000000CA3230323A498A -:1008C0004E56414C494420504152414D45544552A9 -:1008D00000000000000000000000000011241FBE06 -:1008E000CFEFDFE2DEBFCDBF10E2A0E0B0E2EEE886 -:1008F000F2E602C005900D92A239B107D9F72EE2B7 -:10090000A2E9B0E201C01D92A93CB207E1F703D011 -:100910000C94453187C08DD00E94340E0E94D20DB8 -:100920000E941D0FFDD231D10E94DB10A4D195D7BA -:1009300081E0809300021092010292E09093020203 -:1009400093E0909304028093200288E38093210235 -:10095000F1D080914800816080934800C2E00EC0D1 -:100960000E94E010E091FB28F091FC2809950E947C -:10097000480DE091F528F091F6280995809103043F -:1009800081FFEECF8091010480FDFCCFC093030472 -:1009900085D10E94011168D70E94470D0E94220F45 -:1009A000DFCF292F33272230310539F123303105AC -:1009B000A9F02130310549F020E030E080E090E0FE -:1009C000FA0180839183C901089522E130E086E72E -:1009D00092E0FA0180839183C901089599278130BB -:1009E0009105A1F082309105B9F0892B29F7E4E354 -:1009F000F2E0249130E0CF01E3CF2EE330E088E352 -:100A000092E0FA0180839183C9010895EAE1F2E05E -:100A1000249130E0CF01D4CFECEFF1E0249130E02D -:100A2000CF01CECF1F920F920FB60F921124FFCF9E -:100A300018958091780083FF0AC088E08093780041 -:100A400088ED84BF81E080938000FD95FEC0809199 -:100A500050008660809350008091510081FFFCCF50 -:100A60008091510082FFFCCF1092560021E020932C -:100A7000600088ED84BF2093400083ED90E3809375 -:100A8000260A9093270A86E08093000A2093430069 -:100A900083E690E080930A0490930B0480930C0407 -:100AA00090930D0420930004209302048091CC01C4 -:100AB00088608093CC01089588ED84BF81E0E8E7E9 -:100AC000F0E08183089588ED84BF8BE180938000FE -:100AD0000895809148008E7F809348008BEC80932E -:100AE00052008091500088608093500080915100A6 -:100AF00083FFFCCF84EC809355008091500080618F -:100B0000809350008091510084FFFCCF0895E8E469 -:100B1000F0E0808181608083E0E4F0E084818E7F7A -:100B20008483E0E5F0E080818F7E80838081877F11 -:100B30008083089587E0E0EAF0E082837894089566 -:100B40000895089508950895089580E090E0089527 -:100B500008950895E0910A29F0910B29838395E285 -:100B6000899FB001112468577D4F45E250E082EE25 -:100B700098E20E94CC2DE091F728F091F828099591 -:100B8000E091F328F091F4280994E0910A29F0917A -:100B90000B298381DFCF0F931F93CF93DF9320E047 -:100BA00030E015E2AC014F5F5F4F022F129FF00162 -:100BB000139FF00D1124E757FD4F649161110FC091 -:100BC000EC016881662301F12F5F3F4F263031052C -:100BD00061F780E0DF91CF911F910F910895DC01C3 -:100BE0007C91772389F36713EFCFDA0105C07D91FC -:100BF000772351F37613E8CF3196ED0164916111BB -:100C0000F6CF68816111E0CF802FA4DF81E0DF9112 -:100C1000CF911F910F910895CF93DF93EC01615015 -:100C2000710980E090E035E24CE2389FF001399F95 -:100C3000F00D1124E757FD4F2491222381F06131FB -:100C4000710568F0DE0103C06031710541F02D933C -:100C5000ED0131966150710924912111F5CF853054 -:100C6000910521F41882DF91CF9108954993615045 -:100C700071090196DACF08950C94BE2D08951F9343 -:100C8000CF93DF93162F662329F0EC01F5DF8993CC -:100C90001150E1F7DF91CF911F9108950E94BE2D71 -:100CA0000E94BE2D0E94BE2D0C94BE2DCF93DF93CB -:100CB000DC01615071092115310599F1623071052E -:100CC00080F1FA01240F351F2150310940E050E036 -:100CD00017C0D05DDC93CF708C2F90E00A97FCF4A6 -:100CE000C05D1196CC9311971296625071094E5FB8 -:100CF0005F4FE217F307B9F031966230710598F053 -:100D0000C081DC2FD295DF708D2F90E00A970CF315 -:100D1000D95CDC93CF708C2F90E00A970CF3C95C00 -:100D2000E0CF40E050E01C92CA01DF91CF910895DE -:100D3000FA0140814423F1F151815523D9F1611524 -:100D40007105C1F1DC0120E030E013C04295407F25 -:100D5000513428F5582F452B4D932F5F3F4F329636 -:100D60004081442329F15181552321F162177307F2 -:100D7000F9F0842F80538A3018F081518630D0F4F6 -:100D8000852F80538A3020F0952F9154963090F41F -:100D90004134E0F24295407F40575134D8F25753E6 -:100DA000452B4D932F5F3F4F329640814111DBCF52 -:100DB000C901089520E030E0C9010895FB01EE5615 -:100DC000FF4DA0E0B4E0A61BB70B9A01A417B5072E -:100DD00008F49D012115310541F02E0F3F1FDC0164 -:100DE00081918D93E217F307D9F70895DB01AE5691 -:100DF000BF4DE0E0F4E0E61BF70B9A01E417F507BE -:100E000008F49F012115310549F0FC01C9018E0F3D -:100E10009F1F21912D93E817F907D9F761E185E02C -:100E20000C94AF0FE2E9F0E2119284E2E239F807A4 -:100E3000D9F708958091092990E0A0E0B0E04AE058 -:100E4000880F991FAA1FBB1F4A95D1F740E157EDA4 -:100E500030E4409366065093A0092091A10926FF33 -:100E6000FCCF3093A1092091A0091092A0092091F4 -:100E7000A10926FFFCCF3093A1092091A00940933E -:100E8000650627FFE6CF20E12093660623E0209346 -:100E9000A0092091A10926FFFCCF20E42093A109FD -:100EA0002091A009AD01662777274093A0092091E2 -:100EB000A10926FFFCCF20E42093A1092091A009DD -:100EC000892F9A2FAB2FBB278093A0098091A1096E -:100ED00086FFFCCF80E48093A1098091A009109245 -:100EE000A0098091A10986FFFCCF80E48093A1092D -:100EF0008091A009E2E9F0E290E41092A0098091CB -:100F0000A10986FFFCCF9093A1098091A00981934C -:100F100084E2E239F80789F780E180936506089555 -:100F2000CF93DF9300D000D0CDB7DEB780E18093C0 -:100F3000650692E09093660698E0909365069AE1C4 -:100F4000909361069FE09093A6091092A70990ECF8 -:100F50009093A50998E19093A4098093660687ED84 -:100F60008093A0098091A10986FFFCCF80E4809343 -:100F7000A1098091A0091092A0098091A10986FF82 -:100F8000FCCF80E48093A1098091A00990E1909327 -:100F9000650680FD3EC08DE389838AE28A8380E80E -:100FA0008B8386EA8C8320E137ED90E420936606FC -:100FB0003093A0098091A10986FFFCCF9093A109ED -:100FC0008091A0091092A0098091A10986FFFCCF11 -:100FD0009093A1098091A0092093650687FFE6CF31 -:100FE00080E180936606FE013196CE01059630E4DD -:100FF00021912093A0092091A10926FFFCCF3093D5 -:10100000A1092091A009E817F90791F780E18093E1 -:1010100065062496CDBFDEBFDF91CF910BCF4F92F7 -:101020005F926F927F928F929F92AF92BF92CF9278 -:10103000DF92EF92FF920F931F93CF93DF938091F4 -:10104000092990E0A0E0B0E06AE0880F991FAA1F8C -:10105000BB1F6A95D1F7E2E9F0E200E014E0E12C71 -:10106000FF24F394C0E1CC2ED7EDBD2E20E4D22E88 -:1010700030E1A32E47ED942E53E5452E64E8562E1D -:1010800073E8672E492F5A2F6B2F7727852E382F1D -:10109000E701C81BD1090C171D0708F4E801A0924D -:1010A00066069092A0092091A10926FFFCCFD0925C -:1010B000A1092091A0091092A0092091A10926FF61 -:1010C000FCCFD092A1092091A009C092650627FF0C -:1010D000E6CFA09266064092A0092091A10926FFC2 -:1010E000FCCFD092A1092091A0098092A009209163 -:1010F000A10926FFFCCFD092A1092091A009742E4E -:101100004093A0092091A10926FFFCCFD092A1090C -:101110002091A0091092A0092091A10926FFFCCFDF -:10112000D092A1092091A009C0926506C0926606DE -:10113000B092A0092091A10926FFFCCFD092A1096D -:101140002091A0091092A0092091A10926FFFCCFAF -:10115000D092A1092091A009C092650627FFE6CF91 -:10116000A09266065092A0092091A10926FFFCCF0B -:10117000D092A1092091A0091092A0092091A10963 -:1011800026FFFCCFD092A1092091A0091092A009BE -:101190002091A10926FFFCCFD092A1092091A0099E -:1011A0003093A0092091A10926FFFCCFD092A1097C -:1011B0002091A0099F01209781F02C0F3D1F4191A4 -:1011C0004093A0094091A10946FFFCCFD092A1090C -:1011D0004091A009E217F30791F7C0926506C0920B -:1011E0006606B092A0094091A10946FFFCCFD092BB -:1011F000A1094091A0091092A0094091A10946FFC0 -:10120000FCCFD092A1094091A009C092650647FF8A -:10121000E6CFA09266066092A0094091A10946FF20 -:10122000FCCFD092A1094091A0098092A0094091E1 -:10123000A10946FFFCCFD092A1094091A00970926C -:10124000A0094091A10946FFFCCFD092A10940918D -:10125000A0091092A0094091A10946FFFCCFD092AD -:10126000A1094091A009C09265060C1B1D0B8C0FB3 -:101270009D1FA11DB11DF9010115110509F002CF36 -:1012800060E185E06CD663E184E0DF91CF911F914E -:101290000F91FF90EF90DF90CF90BF90AF909F9015 -:1012A0008F907F906F905F904F9059C62F923F9292 -:1012B0004F925F926F927F928F929F92AF92BF9266 -:1012C000CF92DF92EF92FF920F931F93CF93DF9312 -:1012D000CDB7DEB72B97CDBFDEBF8D83292E590149 -:1012E000411584E058076105710508F085C18091BA -:1012F000092990E0A0E0B0E0FAE0880F991FAA1F4A -:10130000BB1FFA95D1F7840F951FA61FB71F00E0EA -:1013100014E020E030E0041B150B260B370B6501B1 -:10132000E12CF12CC982DA82EB82FC820C151D05BE -:101330002E053F0508F47AC109811A8101151105AE -:1013400009F45AC12D81322DE12CFF24F394E0E100 -:10135000CE2EF7EDBF2EE0E4DE2EF0E1AF2EE7ED6E -:101360009E2EF3E56F2EE4E88E2E2A873B874E8370 -:101370005F8368877987362C492E5A2E6B2E772407 -:10138000452D382FB701681B71090617170708F09C -:101390004AC1B801EA85FB85A09266069092A00931 -:1013A0002091A10926FFFCCFD092A1092091A0098C -:1013B0001092A0092091A10926FFFCCFD092A1098B -:1013C0002091A009C092650627FFE6CFEA87FB8738 -:1013D000A09266063092A009EA85FB852091A109BA -:1013E00026FFFCCFEA87FB87D092A1092091A009B4 -:1013F0004093A009EA85FB852091A10926FFFCCF37 -:10140000EA87FB87D092A1092091A009542D409230 -:10141000A009EA85FB852091A10926FFFCCFEA8778 -:10142000FB87D092A1092091A0091092A009EA851A -:10143000FB852091A10926FFFCCFEA87FB87D0928C -:10144000A1092091A009C0926506EA85FB85C0929A -:101450006606B092A0092091A10926FFFCCFD09288 -:10146000A1092091A0091092A0092091A10926FFAD -:10147000FCCFD092A1092091A009C092650627FF58 -:10148000E6CFEA87FB87A09266068092A009EA85EC -:10149000FB852091A10926FFFCCFEA87FB87D0922C -:1014A000A1092091A0091092A009EA85FB8520914D -:1014B000A10926FFFCCFEA87FB87D092A1092091E2 -:1014C000A0091092A009EA85FB852091A10926FFB9 -:1014D000FCCFEA87FB87D092A1092091A009309325 -:1014E000A009EA85FB852091A10926FFFCCFEA87A8 -:1014F000FB87D092A1092091A0092A853B8561151F -:10150000710591F0260F371FEA85FB857190709267 -:10151000A0097090A10976FEFCCFD092A10970902D -:10152000A009E217F30791F7C0926506C09266061C -:10153000B092A009E091A109E6FFFCCFD092A109E9 -:10154000E091A0091092A009E091A109E6FFFCCF6B -:10155000D092A109E091A009C0926506E7FFE6CF0D -:10156000A0926606E3E8E093A009E091A109E6FFF6 -:10157000FCCFD092A109E091A0094093A00940912D -:10158000A10946FFFCCFD092A1094091A009509338 -:10159000A0094091A10946FFFCCFD092A10940913A -:1015A000A0091092A0094091A10946FFFCCFD0925A -:1015B000A1094091A009C0926506061B170B860F72 -:1015C000971FA11DB11D2A873B870115110509F041 -:1015D000D3CE4E815F8168857985DA01AE56BF4DE5 -:1015E0002D81322D89819A818A0F9B1FF9012191CA -:1015F0002D93A817B907D9F781E02B96CDBFDEBF91 -:10160000DF91CF911F910F91FF90EF90DF90CF90DE -:10161000BF90AF909F908F907F906F905F904F9012 -:101620003F902F900895EA85FB85B6CE09831A83F3 -:101630002B833C8381CECF92DF92EF92FF920F9368 -:101640001F936901411524E052076105710540F5BA -:1016500000E014E020E030E0041B150B260B370BF4 -:10166000E12CF12C0C151D052E053F05B0F04E5652 -:101670005F4DC114D10449F0DA01C80ED91EFC0136 -:101680008D918193EC15FD05D9F781E01F910F91A4 -:10169000FF90EF90DF90CF90089568017901E7CF38 -:1016A00080E01F910F91FF90EF90DF90CF90089511 -:1016B000FF920F931F93CF93DF93CDB7DEB7A09721 -:1016C000CDBFDEBF8130E9F0823009F455C08330F0 -:1016D00009F474C0843079F1853009F494C08630FF -:1016E00009F4B3C0873009F4B2C0883009F489C066 -:1016F000A096CDBFDEBFDF91CF911F910F91FF90DC -:10170000089580910529882309F4A3C0F12C8E0146 -:101710000F5F1F4FB1DAF801EF0DF11D8083F394D5 -:1017200080910529F816B0F3E0910129F091022982 -:10173000C8010995DDCFE091FF28F09100298E01C5 -:101740000F5F1F4FC801099520910529222361F3DE -:10175000F801CE0102962150820F911D21E0222333 -:1017600031F0308121E0311120E031503083319669 -:10177000E817F907A1F7D8CFE091FF28F0910029E9 -:101780008E010F5F1F4FC801099520910529222363 -:1017900059F2F801CE0102962150820F911D21E0ED -:1017A000222339F0308121E03F3F09F020E03F5F04 -:1017B00030833196E817F90799F7B6CFE091FF2803 -:1017C000F09100298E010F5F1F4FC80109952091EC -:1017D000052931E0215008F4A7CF3323D9F3822F14 -:1017E00090E0F801E80FF91F408131E04F3F09F028 -:1017F00030E0F801E80FF91F4F5F4083215068F790 -:1018000093CF18DB75CFE091FF28F09100298E016E -:101810000F5F1F4FC80109952091052931E0215024 -:1018200008F482CF3323D9F3822F90E0F801E80F38 -:10183000F91F408131E0411130E0F801E80FF91F54 -:1018400041504083215070F76FCF50D251CFE7DB2A -:101850004FCF8E010F5F1F4F67CFE0E0F6E080E4CF -:10186000828388E1868B08958091080686FF08C0F0 -:101870008091922481508A30A8F010929224089589 -:10188000809192248A3050F08A30C9F7E0910A2979 -:10189000F0910B2981810CDF809192248F5F8093DE -:1018A00092240895E0910A29F0910B29808100DFAC -:1018B000E4CFCF93DF93EC016150710980E090E0B9 -:1018C0003CE2FC01EE0FFF1FE295F295F07FFE2750 -:1018D000E07FFE27EA59FC4F2491222381F06132F8 -:1018E000710568F0DE0103C06032710541F02D938F -:1018F000ED0131966150710924912111F5CF8830A5 -:10190000910521F41882DF91CF91089539936150A8 -:1019100071090196D6CF882319F0813091F008958E -:1019200060930C29609312296093182960931E29F3 -:101930006093242960932A29609330296093362983 -:10194000089560930D29609313296093192960937A -:101950001F296093252960932B2960933129609377 -:1019600037290895FB01882321F0813081F010820E -:101970000895A0910A29B0910B296C9180E2689F8B -:10198000B00111246A597C4FCF010C94EE2DA09127 -:101990000A29B0910B2911966C91F0CF1F93CF9328 -:1019A000DF93182FEB0166E673E0CE010E94D52D80 -:1019B000892BF1F166E873E0CE010E94D52D892BC9 -:1019C00009F43EC066EA73E0CE010E94D52D892B52 -:1019D000C9F166EC73E0CE010E94D52D892BA1F1EF -:1019E00066EE73E0CE010E94D52D892B79F166E079 -:1019F00074E0CE010E94D52D892B51F166E274E08E -:101A0000CE010E94D52D892B29F166E474E0CE0128 -:101A10000E94D52D892B01F166E674E0CE010E946B -:101A2000D52D892BD9F080E0DF91CF911F910895BA -:101A300060E0812F70DF81E0DF91CF911F910895E9 -:101A400061E0F7CF62E0F5CF63E0F3CF64E0F1CF80 -:101A500065E0EFCF66E0EDCF67E0EBCF68E0E9CF80 -:101A600008951F93CF93DF93EB01142F682F80E02D -:101A700090E20E94BF2B612F80E090E20E94BF2B7A -:101A8000612F70E0CE01DF91CF911F918EC3089539 -:101A900008954115E4E05E076105710580F44D5637 -:101AA0005B4D2115310549F0DA01280F391FFC0182 -:101AB0008D918193E217F307D9F781E0089580E0D3 -:101AC0000895E3E9F4E28FEF819398E2E339F907AF -:101AD000D9F783E994E2809393289093942880E047 -:101AE00094E0809395289093962808958091952866 -:101AF000909196280895E0910A29F0910B2982830C -:101B0000813091F038F480E39DE080930729909331 -:101B100008290895823009F0089581E39DE08093BB -:101B200007299093082908958BE99DE08093072960 -:101B30009093082908952091952830919628E42FB4 -:101B4000F0E0DF0112962A173B0750F122503109CD -:101B50002E1B3F0B2093952830939628E0919328D5 -:101B6000F0919428808341839F012E5F3F4F209303 -:101B7000932830939428842F8150442381F0FB01D3 -:101B8000D901982F41914D939150E0F790E0019643 -:101B9000820F931F8093932890939428089508951B -:101BA00080E0A9CF8EDFE0910A29F0910B29828194 -:101BB000A2CFCF93DF93EC0166E874E00E94D52DAD -:101BC000892B91F066E974E0CE010E94D52D892B16 -:101BD00089F066EA74E0CE010E94D52D892B61F070 -:101BE00080E0DF91CF91089580E085DF81E0DF9193 -:101BF000CF91089581E0F9CF82E0F7CFAB01E0917A -:101C00000A29F0910B29628120E1629FB001112421 -:101C10006A577B4F0C94EE2D0F931F93CF93DF9356 -:101C2000EC018B011882AB0166E874E00E94DE2DA6 -:101C3000A80166EB74E0CE010E94DE2DA80166E9E2 -:101C400074E0CE010E94DE2DA80166EB74E0CE01A7 -:101C50000E94DE2DA80166EA74E0CE01DF91CF91EB -:101C60001F910F910C94DE2D43E350E060E070E093 -:101C700089E099E20C94003043E350E060E070E0CA -:101C800089E099E20C940B301F93CF93DF931F925E -:101C9000CDB7DEB7182F1150183030F080E00F901C -:101CA000DF91CF911F9108958983B9D910930929A4 -:101CB000412F50E09A01220F331F240F351F220FAE -:101CC000331F245F364D20930A2930930B290E943D -:101CD000C50568DFAFD88981682F615E83E03FD199 -:101CE00081E00F90DF91CF911F91089520910929F4 -:101CF00030E02F5F3F4F27703327822F2F5F3F4FFA -:101D0000F901EE0FFF1FE20FF31FEE0FFF1FE75F5A -:101D1000F64D9081911178C027703327822F2F5F65 -:101D20003F4FF901EE0FFF1FE20FF31FEE0FFF1FF2 -:101D3000E75FF64D9081911167C027703327822F9E -:101D40002F5F3F4FF901EE0FFF1FE20FF31FEE0F62 -:101D5000FF1FE75FF64D9081911156C02770332722 -:101D6000822F2F5F3F4FF901EE0FFF1FE20FF31F8E -:101D7000EE0FFF1FE75FF64D9081911145C0277070 -:101D80003327822F2F5F3F4FF901EE0FFF1FE20F26 -:101D9000F31FEE0FFF1FE75FF64D9081911134C0E6 +:10000000E8C4000002C5000000C50000FEC40000F6 +:10001000FCC40000FAC40000F8C40000F6C40000EC +:10002000F4C40000F2C400007BC50000EEC4000070 +:10003000ECC40000EAC40000E8C40000E6C400000C +:10004000E4C40000E2C40000E0C40000DEC400001C +:10005000DCC40000DAC400000C946C17D6C40000A5 +:10006000D4C40000D2C40000D0C40000CEC400003C +:10007000CCC40000CAC40000C8C40000C6C400004C +:10008000C4C40000C2C400000C943B17BEC40000EE +:10009000BCC40000BAC40000B8C40000B6C400006C +:1000A000B4C40000B2C40000B0C40000AEC400007C +:1000B000ACC40000AAC40000A8C40000A6C400008C +:1000C000A4C40000A2C40000A0C400009EC400009C +:1000D0009CC400009AC4000098C4000096C40000AC +:1000E00094C4000092C4000090C400008EC40000BC +:1000F0008CC400008AC4000088C4000086C40000CC +:1001000084C4000082C4000080C400007EC40000DB +:100110007CC400007AC4000078C4000076C40000EB +:1001200074C4000072C4000070C400006EC40000FB +:100130006CC400006AC4000068C4000066C400000B +:1001400064C4000062C4000060C400000C9426185F +:100150005CC400005AC4000058C4000056C400002B +:1001600054C4000052C4000050C400004EC400003B +:100170004CC400004AC4000048C4000046C400004B +:1001800044C4000042C4000040C400003EC400005B +:100190003CC400003AC4000038C4000036C400006B +:1001A00034C4000032C4000030C400002EC400007B +:1001B0002CC400002AC4000028C4000026C400008B +:1001C00024C4000022C4000020C400001EC400009B +:1001D0001CC400001AC4000018C4000016C40000AB +:1001E00014C4000012C4000010C400000EC40000BB +:1001F0000CC400000C94142908C40000820F800F66 +:10020000800F800F800F800F800F800F800F800F76 +:10021000800F800F800F800F800F800F8D0FA10F38 +:10022000A70FAD0F800F800F800F800F800F800F02 +:10023000800F800F800F800F800F800F990F990F14 +:10024000990F990F990F990F990F990F790F770FB0 +:10025000770F770F770F770F770F770F770F770F6E +:10026000770F770F770F770F770F770F930FC30FF6 +:10027000B50FBB0F770F770F770F770F770F770FCC +:10028000770F770F770F770F770F770FC90FC90F9A +:10029000C90FC90FC90FC90FC90FC90F8814881416 +:1002A00094149D14AC145B1475147B146F14EA1829 +:1002B00076187F18861894189F18C4183E18D218FC +:1002C000D918E0183C1C3C1C541CAB1C8E1D6E1C29 +:1002D0006A1DBA1CD81C001C1F1C1F1C1F1C1F24BD +:1002E000EC238B23EC238B23DA23BC238B23B32334 +:1002F0009C231C034C005500460041002000430095 +:10030000440043002000440065006D006F000000C1 +:1003100018034400650061006E0020004300610086 +:100320006D00650072006100000004030904090209 +:100330003E00020100C03209040000010202010077 +:100340000524001001042402060524060001070507 +:1003500082030800FF09040100020A0000000705EB +:1003600004021000050705830210000512011001A8 +:1003700002000008D016B20401000102DC01004EA8 +:100380004F4E450000000000000000000000001873 +:100390000619061A061B061C061D06200621060065 +:1003A000000001014D465F554C5452414C494748AD +:1003B0005400000004193B19EB19EF19F319F41953 +:1003C000451B581B40000700024D465F434C4153FC +:1003D0005349435F314B00000004193B19971BCA76 +:1003E0001BCE1BCF1BCE20EF2000040400034D4684 +:1003F0005F504C5553314B5F3742000000000419E9 +:100400003B19A61BCA1BCE1BCF1BCE20EF2000041E +:100410000700044D465F434C41535349435F344BFF +:1004200000000004193B19BB1BCA1BCE1BCF1BCEFF +:1004300020EF20001004000549534F313434343389 +:10044000415F534E4946460004193B191A061B06E4 +:100450001C061D0620062106000000014E4F4E45D9 +:10046000000000000000000000000000000000008C +:100470000000000000000000000000005549445F3B +:1004800052414E444F4D00000000000000000000AB +:100490000000000000000000000000005549445F1B +:1004A0004C4546545F494E4352454D454E5400001D +:1004B0000000000000000000000000005549445FFB +:1004C00052494748545F494E4352454D454E5400AA +:1004D0000000000000000000000000005549445FDB +:1004E0004C4546545F44454352454D454E540000EB +:1004F0000000000000000000000000005549445FBB +:1005000052494748545F44454352454D454E540077 +:100510000000000000000000000000004359434CB0 +:10052000455F53455454494E4753000000000000B6 +:1005300000000000000000000000000053544F5273 +:10054000455F4D454D000000000000000000000028 +:100550000000000000000000000000005245434180 +:100560004C4C5F4D454D00000000000000000000B5 +:100570000000000000000000000000002C004F46BA +:1005800046000000000000000000000000004D4593 +:100590004D4F52590000000000000000000054457B +:1005A000524D494E414C00000000000000004E4FEB +:1005B0004E450000000000000000000000000000A8 +:1005C0000000000000000000000000000000544592 +:1005D000524D494E414C5F434F4E4E0000000000CB +:1005E0000000000000000000000000000000544572 +:1005F000524D494E414C5F52585458000000000083 +:100600000000000000000000000000000000534552 +:100610005454494E475F4348414E4745000000004F +:1006200000000000000000000000000000004D4538 +:100630004D4F52595F53544F524544000000000043 +:1006400000000000000000000000000000004D4518 +:100650004D4F52595F4348414E474544000000000A +:100660000000000000000000000000000000434FF8 +:100670004445435F525800000000000000000000A5 +:100680000000000000000000000000000000434FD8 +:100690004445435F54580000000000000000000083 +:1006A00000000000000000000000000000002535F0 +:1006B00075206D5600434C454152004C4F41444219 +:1006C000494E0025750025532C2553004C4F4144BD +:1006D00042494E00434C45415200257500257500A6 +:1006E00052414E444F4D002573004368616D656C67 +:1006F000656F6E2D4D696E69202553207573696E87 +:1007000067204C55464120255320636F6D70696CFE +:1007100065642077697468204156522D4743432011 +:1007200025530031353033303400313330393031F6 +:1007300000342E382E31000D0A000D0A00643130CD +:10074000303A4F4B000000000000000000000000A5 +:100750000000000000000000000000000000653103 +:1007600030313A4F4B205749544820544558540093 +:100770000000000000000000000000000000006E0B +:100780003131303A57414954494E4720464F522063 +:10079000584D4F44454D000000000000000000008F +:1007A000C83230303A554E4B4E4F574E20434F4D86 +:1007B0004D414E4400000000000000000000000019 +:1007C00000C93230313A494E56414C494420434FDA +:1007D0004D4D414E44205553414745000000000017 +:1007E0000000CA3230323A494E56414C49442050FA +:1007F0004152414D455445520000000000000000A8 +:1008000000000056455253494F4E000000000000C2 +:10081000000000000000009911434F4E4649470078 +:10082000000000000000000000D611CD11B71155E6 +:10083000494400000000000000000000000000002B +:10084000000612DC11524541444F4E4C5900000045 +:10085000000000000000006A12581255504C4F4131 +:1008600044000000000000000000007E12000000B4 +:1008700000444F574E4C4F41440000000000000020 +:100880000083120000000052455345540000000050 +:1008900000000000000000881200000000555047D2 +:1008A0005241444500000000000000000093120087 +:1008B0000000004D454D53495A450000000000001E +:1008C000000000000000009E1255494453495A455B +:1008D00000000000000000000000000000B612420E +:1008E0005554544F4E00000000000000000000CCA2 +:1008F00012D812D112425554544F4E5F4C4F4E47AE +:100900000000000000E212EE12E7124C454447528C +:1009100045454E0000000000000000F8120413FDE1 +:10092000124C454452454400000000000000000005 +:10093000000E131A1313134C4F474D4F444500003C +:100940000000000000000024132E1329134C4F4711 +:100950004D454D0000000000000000000036136A05 +:1009600013501353455454494E47000000000000F3 +:1009700000000000008F138A13434C4541520000D1 +:100980000000000000000000009713000000004875 +:10099000454C500000000000000000000000009BDB +:1009A00013000000005253534900000000000000F3 +:1009B000000000000000000000E51300000000003F +:1009C0000000000000000000000000000000000027 +:1009D000000011241FBECFEFCDBFDFE2DEBF10E26B +:1009E000A0E0B0E2EAEEFEE502C005900D92A23969 +:1009F000B107D9F72EE2A2E9B0E201C01D92A93CED +:100A0000B207E1F703D00C94732F84C08AD00E9400 +:100A1000890E0E94F00D0E946B0F07D32ED10E9409 +:100A20002411A7D168D781E08093000210920102BF +:100A300092E09093020293E090930402809320024C +:100A400088E380932102EED08091480081608093FA +:100A50004800C2E00EC00E942911E091FB28F091ED +:100A6000FC2809950E949D0DE091F528F091F6284B +:100A700009958091030481FFEECF8091010480FDF0 +:100A8000FCCFC093030489D10E944A113BD70E9436 +:100A90009C0D0E94700FDFCF292F332722303105A4 +:100AA00029F12330310599F02130310541F080E002 +:100AB00090E020E030E0FA0120833183089582E164 +:100AC00090E02CE633E0FA012083318308959927E2 +:100AD0008130910599F082309105B1F0892B39F779 +:100AE000EAE2F3E0849190E09F01E5CF8EE390E0AD +:100AF0002EE233E0FA01208331830895E0E1F3E050 +:100B0000849190E09F01D7CFE2EFF2E0849190E0F2 +:100B10009F01D1CF1F920F920FB60F921124FFCFDA +:100B200018958091780083FF0AC088E08093780050 +:100B300088ED84BF81E080938000FD95FEC08091A8 +:100B400050008660809350008091510081FFFCCF5F +:100B50008091510082FFFCCF1092560021E020933B +:100B6000600088ED84BF2093400083ED90E3809384 +:100B7000260A9093270A86E08093000A2093430078 +:100B800083E690E080930A0490930B0480930C0416 +:100B900090930D0420930004209302048091CC01D3 +:100BA00088608093CC01089588ED84BF81E0E8E7F8 +:100BB000F0E08183089588ED84BF8BE1809380000D +:100BC0000895809148008E7F809348008BEC80933D +:100BD00052008091500088608093500080915100B5 +:100BE00083FFFCCF84EC809355008091500080619E +:100BF000809350008091510084FFFCCF0895E8E479 +:100C0000F0E0808181608083E0E4F0E084818E7F89 +:100C10008483E0E5F0E080818F7E80838081877F20 +:100C20008083089587E0E0EAF0E082837894089575 +:100C30000895089508950895089580E090E0089536 +:100C400008950895E0910A29F0910B29838395E294 +:100C5000899FB001112462587C4F45E250E082EE3A +:100C600098E20E94F62BE091F728F091F828099578 +:100C7000E091F328F091F4280994E0910A29F09189 +:100C80000B298381DFCF0F931F93CF93DF934FE720 +:100C900053E010E0BC016F5F7F4F9A01FA01C491ED +:100CA000C1110FC0EC012881222311F11F5F4B5DA0 +:100CB0005F4F163091F780E0DF91CF911F910F9138 +:100CC0000895DC01FC91FF2389F3CF13EFCFDB0103 +:100CD00005C0FD91FF2351F3F013E8CF2F5F3F4F85 +:100CE000ED01F90104910111F4CF28812111DECF2A +:100CF000812FA8DF81E0DF91CF911F910F9108959F +:100D00000F931F93CF93DF93615071094FE753E027 +:100D10001CE29A01FA010491002349F16131710545 +:100D200020F425C06031710561F0DC010196EC0111 +:100D30000C932F5F3F4F61507109F901049101112C +:100D4000F1CFF4E048335F0761F0CE0101961883DC +:100D5000615071094B5D5F4F24E04D355207C9F674 +:100D6000EC011882DF91CF911F910F910895EC0152 +:100D7000E8CF08950C94E82B08951F93CF93DF9349 +:100D8000662339F0EC01162F0E94E82B899311504D +:100D9000D9F7DF91CF911F9108950E94E82B0E940F +:100DA000E82B0E94E82B0C94E82BCF93DF93DC0117 +:100DB0006150710921153105A9F16230710590F179 +:100DC000FA0121503109240F351F80E090E017C04F +:100DD000D05DDC93CF704C2F50E04A30510504F5C4 +:100DE000C05D1196CC9311971296625071090296CC +:100DF000E217F307C9F0319662307105A8F0C0819F +:100E0000DC2FD295DF704D2F50E04A30510504F3AE +:100E1000D95CDC93CF704C2F50E04A30510504F37D +:100E2000C95CDFCF80E090E01C92DF91CF91089504 +:100E3000DC01FA018081882309F441C09181992362 +:100E4000D9F120E030E061157105A1F433C082953D +:100E5000807F913430F5942F892B8D932F5F3F4FF6 +:100E600032968081882331F19181992329F162178B +:100E7000730701F140ED480F4A3020F04FEB480F67 +:100E80004630D0F440ED490F4A3020F05FEB590F67 +:100E9000563090F48134D8F28295807F8057913417 +:100EA000D0F29753892B8D932F5F3F4F32968081DD +:100EB0008111DACFC901089580E090E0089520E023 +:100EC00030E0F8CFFB01EE56FF4D20E034E0261B6A +:100ED000370B4217530708F49A012115310549F0E1 +:100EE000DC01CF01820F931F21912D93E817F907A1 +:100EF000D9F70895DB01AE56BF4D20E034E0261B44 +:100F0000370B4217530708F49A012115310541F0B8 +:100F1000FC01820F931F21912D93E817F907D9F750 +:100F200061E185E00C94F10F80E094E0E2E9F0E209 +:100F3000DF019C011D9221503040E1F7089580911E +:100F4000092990E0A0E0B0E04AE0880F991FAA1FAD +:100F5000BB1F4A95D1F740E157ED30E44093660658 +:100F60005093A0092091A10926FFFCCF3093A1093D +:100F70002091A0091092A0092091A10926FFFCCF81 +:100F80003093A1092091A0094093650627FFE6CF81 +:100F900020E12093660623E02093A0092091A10977 +:100FA00026FFFCCF20E42093A1092091A009AD01E8 +:100FB000662777274093A0092091A10926FFFCCF3F +:100FC00020E42093A1092091A009892F9A2FAB2F0B +:100FD000BB278093A0098091A10986FFFCCF80E404 +:100FE0008093A1098091A0091092A0098091A10984 +:100FF00086FFFCCF80E48093A1098091A009E2E9FB +:10100000F0E290E41092A0098091A10986FFFCCF44 +:101010009093A1098091A009819384E2E239F807B5 +:1010200089F780E1809365060895CF93DF9300D020 +:1010300000D0CDB7DEB780E18093650692E0909353 +:10104000660698E0909365069AE1909361069FE0AA +:101050009093A6091092A70990EC9093A50998E1A6 +:101060009093A4098093660687ED8093A0098091F0 +:10107000A10986FFFCCF80E48093A1098091A0099B +:101080001092A0098091A10986FFFCCF80E4809393 +:10109000A1098091A00990E19093650680FD3EC072 +:1010A0008DE389838AE28A8380E88B8386EA8C8356 +:1010B00020E137ED90E4209366063093A0098091FB +:1010C000A10986FFFCCF9093A1098091A0091092FD +:1010D000A0098091A10986FFFCCF9093A10980917E +:1010E000A0092093650687FFE6CF80E1809366061E +:1010F000FE013196CE01059630E421912093A0099E +:101100002091A10926FFFCCF3093A1092091A009CD +:10111000E817F90791F780E1809365062496CDBF23 +:10112000DEBFDF91CF910BCF5F926F927F928F9254 +:101130009F92AF92BF92CF92DF92EF92FF920F9366 +:101140001F93CF93DF938091092990E0A0E0B0E056 +:101150006AE0880F991FAA1FBB1F6A95D1F722E981 +:1011600030E200E014E0E12CFF24F394E0E1CE2E25 +:10117000F7EDBF2EC0E4DC2ED0E1AD2E47ED942E6E +:1011800053E5652E64E8762E73E8872E492F5A2F93 +:101190006B2F7727F82FE701C81BD1090C171D0704 +:1011A00008F4E801A09266069092A009E091A109D6 +:1011B000E6FFFCCFD092A109E091A0091092A0090E +:1011C000E091A109E6FFFCCFD092A109E091A0092E +:1011D000C0926506E7FFE6CFA09266066092A0097E +:1011E000E091A109E6FFFCCFD092A109E091A0090E +:1011F0005093A009E091A109E6FFFCCFD092A1098C +:10120000E091A0094093A009E091A109E6FFFCCF7D +:10121000D092A109E091A0091092A009E091A10942 +:10122000E6FFFCCFD092A109E091A009C09265062B +:10123000C0926606B092A009E091A109E6FFFCCF3A +:10124000D092A109E091A0091092A009E091A10912 +:10125000E6FFFCCFD092A109E091A009C0926506FB +:10126000E7FFE6CFA09266067092A009E091A1097F +:10127000E6FFFCCFD092A109E091A0091092A0094D +:10128000E091A109E6FFFCCFD092A109E091A0096D +:101290001092A009E091A109E6FFFCCFD092A1092C +:1012A000E091A009F093A009E091A109E6FFFCCF2D +:1012B000D092A109E091A009209789F0F9012C0FA3 +:1012C0003D1F51905092A0095090A10956FEFCCFAD +:1012D000D092A1095090A009E217F30791F7C092AC +:1012E0006506C0926606B092A009E091A109E6FFEA +:1012F000FCCFD092A109E091A0091092A009E09141 +:10130000A109E6FFFCCFD092A109E091A009C0920B +:101310006506E7FFE6CFA09266068092A009E091FD +:10132000A109E6FFFCCFD092A109E091A00950935A +:10133000A009E091A109E6FFFCCFD092A109E091BC +:10134000A0094093A0094091A10946FFFCCFD0928B +:10135000A1094091A0091092A0094091A10946FF5E +:10136000FCCFD092A1094091A009C09265060C1B48 +:101370001D0B8C0F9D1FA11DB11D0115110509F03D +:1013800005CF60E185E02DD663E184E0DF91CF9168 +:101390001F910F91FF90EF90DF90CF90BF90AF9093 +:1013A0009F908F907F906F905F901BC62F923F927F +:1013B0004F925F926F927F928F929F92AF92BF9265 +:1013C000CF92DF92EF92FF920F931F93CF93DF9311 +:1013D000CDB7DEB72C97CDBFDEBF4C01411504E081 +:1013E00050076105710508F05DC18091092990E001 +:1013F000A0E0B0E01AE0880F991FAA1FBB1F1A9542 +:10140000D1F7840F951FA61FB71FC12C04E0D02E63 +:10141000E12CF12C890120E030E0C41AD50AE60A5B +:10142000F70ACD82DE82EF82F8860C151D052E05A7 +:101430003F0508F451C1ED80FE80E114F10409F488 +:1014400031C1A82C392CC12CDD24D39410E1712E8C +:1014500007ED602E20E4B22E30E1532EE7ED4E2E44 +:10146000F3E52F2E04E813E849875A876B877C87BA +:10147000292F3A2F4B2F552729833A834B835C839F +:10148000382FA601481B5109E416F50608F4A701F8 +:10149000509266064092A0092091A10926FFFCCF38 +:1014A000B092A1092091A0091092A0092091A10950 +:1014B00026FFFCCFB092A1092091A0097092650689 +:1014C00027FFE6CF509266062092A0092091A1093D +:1014D00026FFFCCFB092A1092091A0096A816093F8 +:1014E000A0092091A10926FFFCCFB092A10920916B +:1014F000A009E981E093A0092091A10926FFFCCF72 +:10150000B092A1092091A0091092A0092091A109EF +:1015100026FFFCCFB092A1092091A0097092650628 +:10152000709266066092A0092091A10926FFFCCF67 +:10153000B092A1092091A0091092A0092091A109BF +:1015400026FFFCCFB092A1092091A00970926506F8 +:1015500027FFE6CF509266060093A0092091A109CB +:1015600026FFFCCFB092A1092091A0091092A009FA +:101570002091A10926FFFCCFB092A1092091A009DA +:101580001092A0092091A10926FFFCCFB092A109D9 +:101590002091A0093093A0092091A10926FFFCCF3A +:1015A000B092A1092091A0094115510509F491C0FB +:1015B000EA2DF32D9F01240F351F61916093A0093F +:1015C0006091A10966FFFCCFB092A1096091A009CA +:1015D000E217F30791F770926506709266066092C3 +:1015E000A0096091A10966FFFCCFB092A1096091AA +:1015F000A0091092A0096091A10966FFFCCFB092EA +:10160000A1096091A0097092650667FFE6CF50922C +:1016100066061093A0096091A10966FFFCCFB09205 +:10162000A1096091A009FA81F093A0096091A10934 +:1016300066FFFCCFB092A1096091A0096981609317 +:10164000A0096091A10966FFFCCFB092A109609149 +:10165000A0091092A0096091A10966FFFCCFB09289 +:10166000A1096091A00970926506E41AF50A840F39 +:10167000951FA11DB11DA22E332EE114F10409F016 +:10168000F7CE49855A856B857C85DA01AE56BF4D0C +:101690008D819E818A0F9B1FF40121912D93A817A4 +:1016A000B907D9F781E02C96CDBFDEBFDF91CF918E +:1016B0001F910F91FF90EF90DF90CF90BF90AF9070 +:1016C0009F908F907F906F905F904F903F902F9062 +:1016D00008952A2D332D7FCF0D831E832F833887C6 +:1016E000AACECF92DF92EF92FF920F931F936901E0 +:1016F000411524E052076105710540F500E014E052 +:1017000020E030E0E12CF12C041B150B260B370BED +:10171000C016D106E206F306B0F04E565F4D011535 +:10172000110549F0DA01FC01080F191F8D91819311 +:10173000E017F107D9F781E01F910F91FF90EF902B +:10174000DF90CF90089597018601E7CF80E01F9149 +:101750000F91FF90EF90DF90CF900895FF920F933D +:101760001F93CF93DF93CDB7DEB7A097CDBFDEBF7A +:101770008130E9F0823009F451C0833009F46CC043 +:10178000843079F1853009F48CC0863009F4ABC01F +:10179000873009F4AAC0883009F481C0A096CDBF73 +:1017A000DEBFDF91CF911F910F91FF90089580913F +:1017B0000529882309F49BC0F12C8E010F5F1F4F70 +:1017C000D9DAF801EF0DF11D8083F394809105299A +:1017D000F816B0F3E0910129F0910229C8010995AA +:1017E000DDCFE091FF28F09100298E010F5F1F4FA0 +:1017F000C801099520910529222361F3F80191E0A0 +:10180000992331F0808191E0811190E081508083B3 +:1018100031968E2F801B821798F3DCCFE091FF2842 +:10182000F09100298E010F5F1F4FC801099520918B +:101830000529222379F2F80191E0992339F080817A +:1018400091E08F3F09F090E08F5F808331968E2F7B +:10185000801B821790F3BECFE091FF28F091002902 +:101860008E010F5F1F4FC80109952091052931E0B6 +:10187000215008F4AFCF3323D9F3822F90E0F80141 +:10188000E80FF91F408131E04F3F09F030E0F801E7 +:10189000E80FF91F4F5F4083215068F79BCF4FDB64 +:1018A0007DCFE091FF28F09100298E010F5F1F4F3F +:1018B000C80109952091052931E0215008F48ACF0B +:1018C0003323D9F3822F90E0F801E80FF91F40810C +:1018D00031E0411130E0F801E80FF91F4150408339 +:1018E000215070F777CF57D259CF1EDC57CF8E01DA +:1018F0000F5F1F4F6FCFE0E0F6E080E4828388E166 +:10190000868B08958091080686FF08C080919224F6 +:1019100081508A30A8F010929224089580919224E8 +:101920008A3050F08A30C9F7E0910A29F0910B29EA +:10193000818114DF809192248F5F80939224089597 +:10194000E0910A29F0910B29808108DFE4CF0F9301 +:101950001F93CF93DF93615071094CE554E01CE273 +:101960009A01FA010491002349F16132710520F4D2 +:1019700025C06032710561F0DC010196EC010C9329 +:101980002F5F3F4F61507109F90104910111F1CFAF +:10199000F5E04C355F0761F0CE0101961883615088 +:1019A0007109405E5F4F25E04C375207C9F6EC01E4 +:1019B0001882DF91CF911F910F910895EC01E8CF2C +:1019C000882319F0813091F0089560930C29609379 +:1019D00012296093182960931E296093242960932B +:1019E0002A296093302960933629089560930D2940 +:1019F000609313296093192960931F296093252907 +:101A000060932B2960933129609337290895FB0156 +:101A1000882321F0813081F010820895A0910A2955 +:101A2000B0910B296C9180E2689FB0011124645A37 +:101A30007B4FCF010C94182CA0910A29B0910B294F +:101A400011966C91F0CF1F93CF93DF93182FEB017A +:101A50006CE574E0CE010E94FF2B892BF1F16CE75D +:101A600074E0CE010E94FF2B892B09F43EC06CE983 +:101A700074E0CE010E94FF2B892BC9F16CEB74E05E +:101A8000CE010E94FF2B892BA1F16CED74E0CE01F9 +:101A90000E94FF2B892B79F16CEF74E0CE010E943C +:101AA000FF2B892B51F16CE175E0CE010E94FF2BD9 +:101AB000892B29F16CE375E0CE010E94FF2B892B65 +:101AC00001F16CE575E0CE010E94FF2B892BD9F066 +:101AD00080E0DF91CF911F91089560E0812F70DF4A +:101AE00081E0DF91CF911F91089561E0F7CF62E02F +:101AF000F5CF63E0F3CF64E0F1CF65E0EFCF66E0D0 +:101B0000EDCF67E0EBCF68E0E9CF08951F93CF9367 +:101B1000DF93EB01142F682F81E090E20E94F529FA +:101B2000612F81E090E20E94F529612F70E0CE01E3 +:101B3000DF91CF911F9182C3089508954115E4E08C +:101B40005E076105710580F449565B4D211531052D +:101B500049F0DA01FC01280F391F8D918193E217BA +:101B6000F307D9F781E0089580E0089540E054E05C +:101B70006FEF7FEF87E994E20E94302C87E994E2CF +:101B8000809395249093962480E094E0809393240E +:101B9000909394240895809193249091942408958F +:101BA000E0910A29F0910B298283813091F050F065 +:101BB000823039F486E89DE08093072990930829C4 +:101BC0000895089585E89DE080930729909308295A +:101BD000089587EF9DE08093072990930829089541 +:101BE000C5DFE0910A29F0910B298281D9CF20919C +:101BF000932430919424E42FF0E0DF0112962A1709 +:101C00003B0750F1225031092E1B3F0B20939324A8 +:101C100030939424E0919524F091962480839F0141 +:101C20002E5F3F4F209395243093962441838FEF6E +:101C3000840F442381F0FB01D901982F41914D93EA +:101C40009150E0F790E00196820F931F80939524C6 +:101C5000909396240895089580E0A2CFCF93DF93C8 +:101C6000EC016EE775E00E94FF2B892B91F06EE886 +:101C700075E0CE010E94FF2B892B89F06EE975E09B +:101C8000CE010E94FF2B892B61F080E0DF91CF9184 +:101C9000089580E085DF81E0DF91CF91089581E0B4 +:101CA000F9CF82E0F7CFAB01E0910A29F0910B293F +:101CB000628120E1629FB001112462587A4F0C9436 +:101CC000182C0F931F93CF93DF93EC018B01188295 +:101CD000AB016EE775E00E94082CA8016CE775E087 +:101CE000CE010E94082CA8016EE875E0CE010E948A +:101CF000082CA8016CE775E0CE010E94082CA80111 +:101D00006EE975E0CE01DF91CF911F910F910C9498 +:101D1000082C43E350E060E070E089E099E20C9425 +:101D2000272E43E350E060E070E089E099E20C94F4 +:101D3000322E1F93CF93DF931F92CDB7DEB71FEFE5 +:101D4000180F183030F080E00F90DF91CF911F9185 +:101D500008958983E9D910930929412F50E09A0108 +:101D6000220F331F240F351F220F331F245F364DE0 +:101D700020930A2930930B290E943D0631DFDFD8DA +:101D800089816FE1680F83E02CD181E00F90DF91B2 +:101D9000CF911F9108952091092930E02F5F3F4F87 :101DA00027703327822F2F5F3F4FF901EE0FFF1F60 :101DB000E20FF31FEE0FFF1FE75FF64D90819111C9 -:101DC00023C027703327822F2F5F3F4FF901EE0F7B +:101DC00078C027703327822F2F5F3F4FF901EE0F26 :101DD000FF1FE20FF31FEE0FFF1FE75FF64D90812D -:101DE000911112C027703327822F2F5F3F4FF901C7 +:101DE000911167C027703327822F2F5F3F4FF90172 :101DF000EE0FFF1FE20FF31FEE0FFF1FE75FF64D21 -:101E00009081911101C008958F5F3ECF8091092983 -:101E10008F5F0895CF93DF93EC01F8DF805D8883B7 -:101E20001982DF91CF910895FC01808191819923DE -:101E300011F080E00895805327CF80E3E0E0F6E0E2 -:101E40008183089580919728823109F460C0C8F099 -:101E5000833101F1982F9052983008F04DC0909145 -:101E600099289F5F913009F46BC0909399288091D5 -:101E700098288231E1F480E2809307061092982836 -:101E80000895803161F0B0F180E1809305061092F1 -:101E9000972809C08091040684FF3FC080E18093A9 -:101EA00006061092972880919828823121F3833179 -:101EB00048F48031A9F0D0F080E2809305061092BA -:101EC000982808958331D9F0982F9052983078F45B -:101ED000909199289F5F913021F1909399280895CE -:101EE00080E280930606109298280895811110923E -:101EF000982808958823B9F210929728D4CF80911A -:101F0000040685FDEDCF80E280930506089580E10B -:101F10008093070610929728C6CF80E1809305062C -:101F2000C2CF109299289091040695FFECCF90E2D1 -:101F3000909306068032D9F28150809398280895B4 -:101F4000109299289091040694FFE7CF90E1909326 -:101F50000606803289F2815080939728A4CFE091C1 -:101F60000A29F0910B299581981731F094819813E3 -:101F7000089560939728089560939828F7CFCF939A -:101F8000DF93EC016150710980E090E03CE2FC01DC -:101F9000EE0FFF1FE295F295F07FFE27E07FFE2710 -:101FA000E854FB4F2491222381F06132710568F0DF -:101FB000DE0103C06032710541F02D93ED013196D1 -:101FC0006150710924912111F5CF8730910521F4D9 -:101FD0001882DF91CF91089539936150710901966C -:101FE000D6CF982F907185FD03C091113FC0089501 -:101FF00060931129992359F160931029609317294F -:102000006093162960931D2960931C2960932329EE -:1020100060932229609329296093282960932F29AE -:1020200060932E29609335296093342960933B296E -:1020300060933A2980E280930606109298289923AB -:10204000B1F280E18093060610929728089560937C -:10205000172960931D296093232960932929609390 -:102060002F296093352960933B29E4CF6093102991 -:102070006093162960931C29609322296093282974 -:1020800060932E296093342960933A29D8CFFB01BD -:10209000803221F0803189F010820895A0910A29C0 -:1020A000B0910B2915966C9180E2689FB0011124C4 -:1020B00068547B4FCF010C94EE2DA0910A29B0916A -:1020C0000B2914966C91F0CF1F93CF93DF93182FA9 -:1020D000EB0168EB74E0CE010E94D52D892BB1F1A4 -:1020E00068ED74E0CE010E94D52D892BB9F168EF1F -:1020F00074E0CE010E94D52D892B91F168E175E045 -:10210000CE010E94D52D892B69F168E375E0CE01DF -:102110000E94D52D892B41F168E575E0CE010E9422 -:10212000D52D892B19F168E775E0CE010E94D52DD8 -:10213000892BF1F068E975E0CE010E94D52D892B3D -:10214000C9F080E0DF91CF911F91089560E0812F69 -:1021500048DF81E0DF91CF911F91089561E0F7CFD3 -:1021600062E0F5CF63E0F3CF64E0F1CF65E0EFCF5D -:1021700066E0EDCF67E0EBCFBC0180E090E20C942D -:102180006C2BCF93DF93EC012196FC0164916623C5 -:1021900049F080E090E20E94BF2BFE0121966491FD -:1021A0006111F7CFDF91CF910895AB01BC0180E0C1 -:1021B00090E20C94952B80E2E0E6F6E082830895AD -:1021C000CF93DF9380919A28823019F0DF91CF91DD -:1021D000089580E090E20E943E2C0E943F2680E01D -:1021E00090E20E94592CEC0197FDF0CF63E182E070 -:1021F000B6DE8C2F15D38111E9CF8C2FDF91CF91D3 -:1022000095C480919A28813009F138F0823071F1BB -:10221000833071F0823041F108958091680685FF26 -:10222000FBCF84E180931B2081E080939A2808955E -:1022300080911B20815080931B208111EDCF0E9443 -:10224000692A0E94870510929A28089580911B2080 -:10225000815080931B208111DFCF0E9469050E946D -:10226000A42A82E080939A2826D467C580916806C4 -:1022700085FDFACF84E180931B2083E080939A2828 -:10228000089561E181E06BCE60E181E068CE80E09D -:1022900090E20C94472B80E090E20C94B92C2FEF45 -:1022A00035E03F932F9328EF35E03F932F9321EFB5 -:1022B00035E03F932F9328EB35E03F932F9321E0B8 -:1022C0002F931F929F938F930E94062E8DB79EB7D8 -:1022D0000C968DBF9EBF85E6089523EE38E23F93AE -:1022E0002F9325E036E03F932F9321E02F931F9209 -:1022F0009F938F930E94062E8DB79EB708968DBF31 -:102300009EBF85E608950E94CB05811102C08AEC2C -:102310000895B2DC84E6089560E071E00E940C0646 -:1023200085E608950F931F93CF93DF93CDB7DEB764 -:10233000A197CDBFDEBF8C0120910529E091FF2838 -:10234000F0910029CE01019629A3099529A130E039 -:10235000AE014F5F5F4F60E071E0C8010E9456061A -:1023600085E6A196CDBFDEBFDF91CF911F910F9182 -:102370000895BF92CF92DF92EF92FF920F931F9337 -:10238000CF93DF93CDB7DEB7A097CDBFDEBF8C0173 -:10239000C0900529D12C68E076E00E94D52D892BCC -:1023A00059F5C114D104C1F1B12CEE24E394F12C00 -:1023B000EC0EFD1E00E010E00E943C06F701E00F6D -:1023C000F11F8083B3940B2D10E00C151D05A0F3B5 -:1023D000E0910129F0910229C701099584E6A096B0 -:1023E000CDBFDEBFDF91CF911F910F91FF90EF9096 -:1023F000DF90CF90BF900895A80160E270E0EE24D6 -:10240000E394F12CEC0EFD1EC7010E9498068C157A -:102410009D05F1F28AECE3CFEE24E394F12CEC0E6F -:10242000FD1ED6CF20910629211107C020E3FC0113 -:102430002083FC01118285E6089521E3FC012083BD -:10244000FC01118285E60895FC012181211105C05E -:102450008081813341F0803311F08AEC089510922D -:10246000062984E6089581E08093062984E608958C -:1024700086E599E0A4D18EE608958BE19BE0BAD180 -:102480008EE60895E0ECF4E081818E7F81830E94E6 -:10249000692A0E945C0584E60895E0ECF4E08181FD -:1024A0008E7F81830E94692A0E94630584E60895D5 -:1024B000E3E0F9E221812F9320812F932FE036E092 -:1024C0003F932F9321E02F931F929F938F930E940E -:1024D000062E8DB79EB708968DBF9EBF85E60895E0 -:1024E000209105291F922F9322E136E03F932F93ED -:1024F00021E02F931F929F938F930E94062E8DB7FA -:102500009EB708968DBF9EBF85E6089560E071E096 -:10251000D0D985E6089540E051E0BC0180E022DAA0 -:1025200085E60895BC0180E039DA811102C08AECA9 -:102530000895A2DB84E6089560E071E0BAD985E6EB -:10254000089540E051E0BC0181E00CDA85E6089591 -:10255000BC0181E023DA811102C08AEC08958CDB92 -:1025600084E6089560E071E00ADD85E6089540E0C4 -:1025700051E0BC0180E28BDD85E60895BC0180E27C -:10258000A3DD811102C08AEC089576DB84E608950C -:1025900060E071E0F4DC85E6089540E051E0BC01C4 -:1025A00080E175DD85E60895BC0180E18DDD811156 -:1025B00002C08AEC089560DB84E6089560E071E073 -:1025C0002BDB85E6089560E071E018DB85E6089571 -:1025D000F0DA811102C08AEC08954EDB84E608959A -:1025E00023E236E03F932F932BE136E03F932F9386 -:1025F00025E136E03F932F9321E02F931F929F9385 -:102600008F930E94062E8DB79EB70A968DBF9EBFF0 -:1026100085E60895CF93DF93EC0168DA9F938F935B -:1026200029E236E03F932F9381E08F931F92DF934F -:10263000CF930E94062E8DB79EB708968DBF9EBF82 -:1026400085E6DF91CF910895CF93DF93EC016CE2A3 -:1026500076E00E94D52D892B81F064E376E0CE01EF -:102660000E94D52D892B21F08AECDF91CF9108951E -:1026700028DA84E6DF91CF91089589E49DE0BAD00D -:102680008EE6DF91CF91089560E071E0C3DB85E6CF -:102690000895CADB811102C08AEC0895EDDA84E660 -:1026A00008950E94120784E60895BF92CF92DF92A8 -:1026B000EF92FF920F931F93CF93DF937C01CFEFA5 -:1026C000D0E031E4C32E36E0D32E4CE2B42E8601A6 -:1026D000B60180E990E20E94D52D892B21F1F60107 -:1026E0008491882389F0C132D10570F0D70103C0ED -:1026F000C032D10549F08D937D010F5F1F4F2197A7 -:10270000F80184918111F4CFF701B1927F012197F3 -:10271000F6E1CF0ED11C8601B60180E990E20E945D -:10272000D52D892BE1F6F7013197108285E6DF91EF -:10273000CF911F910F91FF90EF90DF90CF90BF90BE -:102740000895FC012091200220682093200220910E -:10275000230220FFFCCF81E080932302A09110028E -:10276000B0911102AE5BB109B7FD1CC029E637E597 -:102770004BE050E00E94562DAA27BB279F938F93D2 -:102780002AE336E03F932F9381E08F931F92FF93CC -:10279000EF930E94062E8DB79EB708968DBF9EBF01 -:1027A00085E60895A0E0B0E0E1CF80E0ECE3F9E257 -:1027B0009191890F99E2EC3BF907D1F7089521E057 -:1027C00020939B2820939C282CE320939D2825E090 -:1027D00030E020939E2830939F281092A0281092DA -:1027E000A1281092A2281092A3288093A428909345 -:1027F000A528089527E020939B282CE231E0209320 -:102800009E2830939F281092A0281092A128109201 -:10281000A2281092A3288093A4289093A528089515 -:10282000CF93C82F90919B28953009F484C0E0F095 -:10283000973009F44CC060F52091A92880919C281C -:10284000281709F4ECC030E090E001972817390709 -:1028500009F414C168E180E090E20E94BF2B10925D -:102860009B2881E0CF910895933009F45CC0B8F0C3 -:1028700090E04091A9282FEF30E0241B3109821706 -:10288000930709F06FC085E080939B2881E0EACF31 -:10289000983019F19930B1F080E0CF9108959130DE -:1028A000D8F3813009F4ECC0843039F0883151F02C -:1028B0008B3141F081E0CF91089566E080E090E2B5 -:1028C0000E94BF2B10929B2881E0CF910895853103 -:1028D00009F457C08B3109F450C0C83171F3C630C8 -:1028E00009F451C0C53131F761E080E090E20E9407 -:1028F000BF2B60919C2880E090E20E94BF2B6091EA -:102900009C28609580E090E20E94BF2B60E870E018 -:102910008CE399E24ADC49DF682F80E090E20E9474 -:10292000BF2B81E09FCF8093A92884E080939B28D0 -:1029300081E0CF9108952091A6283091A728F90130 -:10294000E45CF64D8083C90101968093A62890939C -:10295000A7288038910509F0ADCF86E080939B28A9 -:1029600081E080CF65E180E090E20E94BF2B82E0B1 -:1029700080939B2881E0CF91089510929B2881E05D -:102980009ACF10929C2880919C288F5F80939C28DE -:102990004091A0285091A1286091A2287091A3286D -:1029A000E091A428F091A52820E830E08CE399E29A -:1029B0000995882309F46FC061E080E090E20E94ED -:1029C000BF2B60919C2880E090E20E94BF2B609119 -:1029D0009C28609580E090E20E94BF2B60E870E048 -:1029E0008CE399E2E2DBE1DE682F80E090E20E9476 -:1029F000BF2B8091A0289091A128A091A228B091EE -:102A0000A32880589F4FAF4FBF4F8093A02890932B -:102A1000A128A093A228B093A32881E04CCFC5DEC3 -:102A20008C13A0CF4091A0285091A1286091A2289A -:102A30007091A328E091A428F091A52820E830E027 -:102A40008CE399E20995882381F180919C288F5F1E -:102A500080939C288091A0289091A128A091A228E1 -:102A6000B091A32880589F4FAF4FBF4F8093A028AD -:102A70009093A128A093A228B093A32866E073CFD7 -:102A80001092A6281092A7281092A82883E080937D -:102A90009B2881E0E7CE64E080E090E20E94BF2BBB -:102AA00089E080939B2881E0DDCE68E180E090E2C0 -:102AB0000E94BF2BCFCE80919B28813099F0873028 -:102AC00009F0089580919E2890919F289C012150A3 -:102AD000310920939E2830939F28892B91F71092DB -:102AE0009B28089580919E2890919F289C012150B9 -:102AF000310920939E2830939F28892B11F78091CC -:102B00009D28982F915090939D28811109C0109273 -:102B10009B2885E090E080939E2890939F280895BD -:102B200065E180E090E20E94BF2BF3CFAF92BF92AD -:102B3000DF92EF92FF920F931F93CF93DF931F9239 -:102B4000CDB7DEB7982F91549A3120F090529A3138 -:102B5000F0F480522091AA283091AB282F3F310504 -:102B600050F4F901E45CF64D80832F5F3F4F2093D2 -:102B7000AA283093AB2881E00F90DF91CF911F916D -:102B80000F91FF90EF90DF90BF90AF9008959F5C02 -:102B90009A3000F38F35F1F28F33E1F28D33D1F2B9 -:102BA0008D30A9F0883039F08B3129F71092AA289E -:102BB0001092AB28E0CF8091AA289091AB28009783 -:102BC000D1F201978093AA289093AB28D4CFE091BB -:102BD000AA28F091AB28E45CF64D10821092AA2846 -:102BE0001092AB2880913C29882369F18F3359F1E9 -:102BF0008D3349F1EDE3F9E204C02F3331F02D3389 -:102C000021F07F0121912111F8CFF701108200E01E -:102C100010E086E1D82ED09E5001D19EB00C112438 -:102C200081E496E0A80EB91EB5018CE399E22983F0 -:102C30000E94D52D2981892B09F43FC00F5F1F4FBA -:102C40000531110541F788EC10E0E5E1F8E0E49189 -:102C50008E1709F463C0E6E3F8E0E4918E1709F4F7 -:102C60005AC0E7E5F8E0E4918E1709F451C0E8E7AF -:102C7000F8E0E4918E1709F448C0E9E9F8E0E4913E -:102C80008E1709F43FC0EAEBF8E0E4918E1779F172 -:102C900080E090E076DA8FE098E073DA112309F4AF -:102CA0006ACF80913C29882309F465CF8CE399E2AF -:102CB00063DA82E198E065DA5ECF10923C292F3327 -:102CC00099F02D3371F1222319F089EC11E0BDCF79 -:102CD000F501709685919491FC010097B1F38CE316 -:102CE00099E2099511E0B1CFF5017496F3CF25E093 -:102CF00030E041E2429FC001439F900D11248A5E63 -:102D0000974FC8CF24E030E0F4CF23E030E0F1CF9C -:102D100022E030E0EECF21E030E0EBCF20E030E009 -:102D2000E8CFF501729685919491FC01009769F2C4 -:102D3000C7010196099511E088CF0895A0E2B6E099 -:102D400082E011968C93119715968C9315978CE3CE -:102D50009AE28093B8289093B9288CEB9AE28093FA -:102D6000BA289093BB281092B1281092B0281092E4 -:102D7000AC281092B4281092B5281092AF28E0E445 -:102D8000F8E010A211A28DE291E086A397A38FEF45 -:102D90009FEF80A791A781E0808388E8838383E009 -:102DA000878384E01A968C93E8E4F0E08081817F49 -:102DB0008660808308951F920F920FB60F921124A0 -:102DC0008F939F93EF93FF93E8E4F0E08081817FFE -:102DD0008083E0E4F8E0138286E990E086AB97AB6D -:102DE0008AE190E080AF91AFE0E4F9E010A211A297 -:102DF0008FEF9FEF86A397A389E883838EE080837C -:102E0000E0E2F6E01286FF91EF919F918F910F9093 -:102E10000FBE0F901F9018951F920F920FB60F9232 -:102E200011242F938F939F93EF93FF9390912806F4 -:102E30008091B028957021E009F020E0880F822B66 -:102E40008093B0289091AC289923A1F1982F977086 -:102E5000973009F442C0982F9C7061F191E082FD97 -:102E60006BC09093AE288091AF2881116DC0809186 -:102E7000B1288695992309F471C020E8282B209366 -:102E8000B1288091B4289091B52801968093B428F8 -:102E90009093B52887709927892B61F4E091B82821 -:102EA000F091B9282193E093B828F093B92881E0F4 -:102EB0008093AF288091AC2891E089278093AC283B -:102EC00088E880934308FF91EF919F918F912F9114 -:102ED0000F900FBE0F901F9018951092400880E140 -:102EE00080934C08109243098091AE28882379F191 -:102EF0008CEB94E080936609909367091092AD285B -:102F000081E080934C0983E0809346098091B42846 -:102F10009091B528877061F09091B1288F5F969558 -:102F20008F5F8930E1F7E091B828F091B92890835C -:102F300081E08093B628BECF90E09093AE28809138 -:102F4000AF28882309F493CF1092AF28B3CF8CE732 -:102F500094E08093660990936709D0CF20E08ECFEC -:102F60001F920F920FB60F9211242F933F938F93BE -:102F70009F93EF93FF938091AD28853009F44DC066 -:102F8000A8F0883009F47CC020F5863009F4B8C078 -:102F9000873009F48AC0FF91EF919F918F913F9103 -:102FA0002F910F900FBE0F901F901895823071F1E6 -:102FB000F8F0833009F456C0843069F78091B12865 -:102FC00080FDB7C080E48093460685E08093AD28FD -:102FD000E2CF893009F45BC08A30E9F610924009EB -:102FE000109246091092000881E08093B728D3CF51 -:102FF000882309F453C0813071F68FE390E0809309 -:103000006609909367098EE08093000880E48093BE -:10301000450683E08093AD28BECF8091B12890E42F -:1030200080FD84C09093450686958093B128809159 -:10303000B2289091B32801968093B2289093B32838 -:103040009C0127703327232B09F477C02091B428E3 -:103050003091B5288217930709F04EC088E080931D -:10306000AD2899CF80E48093460684E08093AD2814 -:10307000E091B828F091B92880818093B1288BCF56 -:1030800080E48093460689E08093AD2884CF80E475 -:10309000809346068AE08093AD287DCF8FE790E04D -:1030A000809366099093670976CFE091BA28F091F2 -:1030B000BB288081811136C080E480934506209131 -:1030C000B2283091B3288091B4289091B528281760 -:1030D000390721F23196E093BA28F093BB28E091AA -:1030E000B828F091B928CF0101968093B828909321 -:1030F000B92881818093B12884E08093AD284BCF9B -:10310000E091BA28F091BB288081811107C080E44A -:103110008093460687E08093AD283DCF80E480937E -:103120004506F8CF80E480934606C9CF90934606C3 -:103130007BCF80E48093450648CF86E08093AD281E -:103140002ACFCF93DF93E0E4F6E084E08283128A13 -:10315000C0E8D1E082E68E83A0E2B6E085E0129678 -:103160008C93129781E052968C93529782E05096FE -:103170008C9350971A961C921A9783E019968C9309 -:103180009AE5988398E5998390E491839683818367 -:103190008683E0E0F8E08FE090E086A397A388E0E4 -:1031A00090E082A793A783E28183DF91CF91C6CD80 -:1031B0000F931F93CF93DF938091B6288823C1F09C -:1031C0001092B62882E08093210680932606009113 -:1031D000B4281091B5280115110599F4E091F9284A -:1031E000F091FA2809951092400910924609A6DD3F -:1031F0008091B72881115AC0DF91CF911F910F9113 -:103200000895A801495F5F4F569547955695479594 -:1032100056954795E0910729F09108296CE37AE2E9 -:1032200080E2099563E186E00E94AF0FE091FD28FE -:10323000F091FE28B8018CE39AE209958C0194FF85 -:103240003CC01F7E0115110571F2A801495F5F4F57 -:10325000569547955695479556954795E091072978 -:10326000F09108296CE37AE281E2099563E187E055 -:103270000E94AF0F0093B4281093B5281092B22883 -:103280001092B3288CE39AE28093B8289093B928DF -:103290008CEB9AE28093BA289093BB2881E08093CC -:1032A000AD288091B728882309F4A6CF1092B728BB -:1032B000DF91CF911F910F9141CD9695879596956E -:1032C000879596958795009709F4BCCF40E020E05C -:1032D00030E0F901E45CF54D2081022E2295202595 -:1032E000022E269526952025E058FF4F30E02F5FCF -:1032F0003F4F21FB552750F9C52F20E0D22F51E039 -:10330000C527C0834F5F242F30E02817390708F303 -:1033100099CF81E08093BC28089581E08093BC28F8 -:1033200008950895FF920F931F93CF93DF9300D0DA -:1033300000D0CDB7DEB78C01FC0190818091BC2814 -:10334000823009F45BC080F49632A9F1923599F18C -:1033500020E030E0C9012496CDBFDEBFDF91CF91E0 -:103360001F910F91FF900895843079F168F496329F -:1033700011F1923501F1953909F490C081E0809303 -:10338000BC2820E030E0E6CF853011F760E170E046 -:10339000C801E7D7882309F46BC0809106298823E8 -:1033A00009F46FC084E08093BC288AE0F801808330 -:1033B00024E030E0CFCF84E4F8018083118282E002 -:1033C0008093BC2820E130E0C5CF9632A1F392353E -:1033D00091F3903309F48EC0923A09F4BAC0903A4E -:1033E00009F4D4C0903551F6F8018181882309F49D -:1033F000DFC0F801108224E030E0ACCF9632D9F281 -:103400009235C9F2933909F0B9CF19821A821B8219 -:103410001C8288E8898343E050E060E070E0CE01E0 -:1034200002960E94DE06F8018181803209F481C093 -:10343000803709F08DCFF80192818981981388CF68 -:1034400093818A81981384CF94818B81981380CF44 -:1034500095818C8198137CCF84E0808361E070E05B -:10346000C80150D783E08093BC2828E130E072CFB8 -:1034700084E08093BC2881E0F801808324E030E080 -:1034800069CF6091BD2870E0660F771F660F771FC8 -:1034900044E050E0C8010E94F60684CF44E050E0CA -:1034A00064E070E0CE0101960E94DE06F8018181A1 -:1034B000803209F43EC0803709F04ACFF80192818A -:1034C0008981981345CF93818A81981341CF948144 -:1034D0008B8198133DCF95818C81981339CF1082C1 -:1034E00061E070E0C8010ED784E08093BC2828E139 -:1034F00030E030CFF801F18062E070E0C80131D7F0 -:10350000882309F4B8CFFFE0FF1508F472CF6F2DC0 -:1035100070E0660F771F660F771F40E150E0C8012B -:103520000E94DE0660E170E0C801ECD620E930E0E0 -:1035300011CF8981F80180833A8131832B812283E5 -:103540009C819383832782278927848328E230E024 -:1035500001CFF801F18066E070E0C80102D788234E -:1035600009F489CF8F2D82508E3008F042CF8091A0 -:10357000062981111ACFF4E0FF9EB001112444E026 -:1035800050E0C80102960E94F6060FCFF801F180C4 -:1035900062E070E0C801E5D6882309F46CCF8F2D76 -:1035A00082508E3008F025CFF092BD2885E0FBCE0A -:1035B00062E070E0C801D5D6882309F45CCF109290 -:1035C000BC2820E030E0C6CECF93DF93EC0143E08F -:1035D00050E060E070E00E94DE0644E050E064E00D -:1035E00070E0CE010396DF91CF910C94DE060F932D -:1035F0001F93CF93DF9300D0CDB7DEB78C01FC01D2 -:1036000080819181892798E88927928189278A83F7 -:103610008481938189279581892796818927898348 -:1036200043E050E060E070E0C8010E94F60641E02F -:1036300050E063E070E0CE0102960E94F60644E09E -:1036400050E064E070E0C80103960E94F60641E095 -:1036500050E068E070E0CE0101960E94F6060F90FF -:103660000F90DF91CF911F910F91089581E080938A -:10367000BE2884E090E08093BF289093C02888E023 -:103680008093C1281092C228089581E08093BE28BB -:1036900084E490E08093BF289093C02888E08093D2 -:1036A000C12881E090910529973009F080E080934E -:1036B000C228089581E08093BE2882E090E0809344 -:1036C000BF289093C02888E18093C1281092C22817 -:1036D000089581E08093BE28089508956F927F92A7 -:1036E0008F929F92AF92BF92CF92DF92EF92FF9212 -:1036F0000F931F93CF93DF93CDB7DEB72E97CDBF38 -:10370000DEBF8C018091BE28853009F4D1C0F8F06D -:10371000883009F41BC1B8F5863009F4F5C187304B -:1037200009F4C9C120E030E0C9012E96CDBFDEBF4B -:10373000DF91CF911F910F91FF90EF90DF90CF908D -:10374000BF90AF909F908F907F906F900895823040 -:1037500009F4E1C008F05AC02091BF289091C02818 -:10376000D8018C91863209F4AEC0823509F4ABC021 -:103770008034C1F682E08093BE288AE0D8018C9321 -:1037800024E030E0D1CF893009F4A6C08D3050F666 -:10379000D801FC900E9433248F25F8018083F180AA -:1037A0000E9433248F25D80111968C93119712967D -:1037B000FC900E9433248F25F8018283F3800E94BD -:1037C00033248F25D80113968C9313971496FC906D -:1037D0000E9433248F25F8018483F5800E943324CE -:1037E0008F25D80115968C9364E070E0C801B9D597 -:1037F000811199C20E94742491E09827F801908366 -:1038000088E08093BE2824E030E08ECF833009F436 -:1038100042C1843009F086CF2091BF289091C02802 -:10382000D8018C91863209F44EC0823509F44BC020 -:10383000833909F095C18091C228882309F434C3E3 -:1038400043E050E060E070E0CE0102960E94DE06A8 -:1038500088E88983D80111969C91903209F4C2C4FA -:10386000903709F05FCFD80112968C911297883863 -:1038700009F058CF13969C9113978A81981352CFD1 -:1038800014969C9114978B8198134CCF15969C910C -:1038900015978C81981346CF84E08C9361E070E09B -:1038A000C80130D585E08093BE2828E130E03CCFC8 -:1038B0002091BF289091C028D8018C91863219F0B0 -:1038C000823509F04AC1F8012083918384E0809316 -:1038D000BE2820E130E028CF7801D12CD701CC9050 -:1038E000C2D78C25F70181937F01D394F2E1DF12D7 -:1038F000F5CF60E170E0C80134D5882309F47ACFB0 -:1039000080910629882309F43EC1EED79AE09827D2 -:10391000D8019C9375CFF8018081833409F46DC17F -:10392000813409F42BC1803309F434C4803A09F49A -:1039300056C1803509F0F6CEF8018181882309F45B -:103940001DC4F801108224E030E0EECED801DC90F6 -:103950008AD78D25F8018083D18085D78D25D80120 -:1039600011968C9311971296DC907DD78D25F801D6 -:103970008283D38078D78D25D80113968C931397A3 -:103980008C91803309F4FDC1803A09F46FC2803C08 -:1039900009F4AFC2813C09F446C3823C09F409C171 -:1039A000803B09F457C38056823008F0A7C062E01C -:1039B00070E0C801D6D4882309F4CFC1F801818111 -:1039C0008C739081903609F447C46AE370E05B0120 -:1039D000F0E18F9FA00CB11C11246E0137E0C30EE3 -:1039E000D11C64E0C6010E943F068091C2287E017E -:1039F000882309F415C48BE0E80EF11C44E050E084 -:103A000063E070E0C7010E94DE0646E050E0B501C9 -:103A1000CE0101960E94DE068F818093C42888859E -:103A20008093C52889858093C6288A858093C72876 -:103A300060E470E084EC98E27BD78091C4288093A6 -:103A4000C8288091C5288093C9288091C628809372 -:103A5000CA288091C7288093CB2860E270E088EC68 -:103A600098E266D7A601B701CE01019633D58F81C2 -:103A7000D8018C93888511968C931197898512961D -:103A80008C9312978A8513968C9387E08093BE2837 -:103A900020E230E049CE60E170E0C80162D48823C2 -:103AA00009F463C080910629882309F45EC18AE085 -:103AB000D8018C935DC0C801ADD6F801F480D3D68F -:103AC0008F25D80114968C9314971596FC90CBD61D -:103AD0008F25F8018583F680C6D68F25D8011696E6 -:103AE0008C9316971796FC90BED68F25F801878386 -:103AF00024819091C428291709F484C081E080931F -:103B0000BE2820E030E010CE2091BF289091C02840 -:103B1000F8018081863209F442C0823509F43FC041 -:103B2000803509F409CF982F9056923008F4ABC233 -:103B3000803351F0803A41F0803C31F0813C21F0FB -:103B4000823C11F0803BD1F681E08093BE2884E076 -:103B5000D8018C9324E030E0E7CD853909F44FC1DA -:103B60001092BE2820E030E0DFCD81E0F8018083B4 -:103B700082E08093BE2824E030E0D6CD8AE08083C6 -:103B800024E030E0D1CD6091C32830E1639FB001E3 -:103B9000112440E150E0C8010E94F606B6CED801DB -:103BA0002C9311969C9384E08093BE2820E130E012 -:103BB000BBCD62E070E0C801D4D3882309F4CDC046 -:103BC000F80181818093C3288CE08093BE288CD635 -:103BD0009AE09827D8019C9324E030E0A5CD62E0DC -:103BE00070E0C801BED3882309F4CEC2F8018181F8 -:103BF0008093C32883E08093BE288AE0808324E0FA -:103C000030E092CD25819091C528291377CF268168 -:103C10009091C628291372CF9091C72889136ECF2F -:103C2000F090C82820D68F25D8018C93F090C82812 -:103C30000F2CF294F0240F2CF694F694F02416D462 -:103C4000F801E058FF4F2F2D30E02F5F3F4F21FB51 -:103C5000882480F8912CB1E08B2688258083F09011 -:103C6000C92801D68F25F8018183F090C9280F2C2F -:103C7000F294F0240F2CF694F694F024F7D3F80184 -:103C8000EF57FF4F2F2D30E02F5F3F4F21FBAA242E -:103C9000A0F8B12C31E0A3268A258083F090CA28B1 -:103CA000E2D58F25D80112968C93F090CA280F2C5C -:103CB000F294F0240F2CF694F694F024D7D3F80164 -:103CC000EE57FF4F2F2D30E02F5F3F4F21FBCC24CD -:103CD000C0F8D12CB1E0CB268C258083F090CB2886 -:103CE000C2D58F25F8018383F090CB280F2CF29456 -:103CF000F0240F2CF694F694F024B8D3F801ED5785 -:103D0000FF4F2F2D30E02F5F3F4F21FB662460F8DF -:103D1000712C31E063268625808388E08093BE285D -:103D200020E230E101CD6091C328B0E16B9FB0018A -:103D3000112440E150E08CEC98E20E94DE062091D4 -:103D4000CC288091D0288095281709F4DFC0CCD5E5 -:103D500096E09827D8019C9353CDC6D591E098273B -:103D6000F801908324E030E0DFCC6091C328F0E1DB -:103D70006F9FB001112440E150E0C8010E94F60697 -:103D800096CE62E070E0C801ECD2882331F3F801EE -:103D90006181F0E16F9FB001112440E150E0C80162 -:103DA0000E94DE0660E170E0C801ACD2680130E834 -:103DB000C30ED11CA12CD801BC9055D58B25F80180 -:103DC00081938F010B2CB294B0240B2CB694B69433 -:103DD000B0244CD32B2D30E02F5F3F4F21FBEE243E -:103DE000E0F8F12CF1E0EF268E25D6018D936D01E0 -:103DF000A394B2E1AB12DFCF20E930E195CC44E0EF -:103E000050E063E070E0CE0101960E94DE069091E2 -:103E1000C128D80111968C91803209F4D3C1803722 -:103E200009F080CCD80112962C9112978981281321 -:103E300079CC13962C9113978A81281373CC1496FE -:103E40002C9114978B8128136DCC15962C91159776 -:103E50008C81281367CC9C9361E070E0C80152D23A -:103E600086E08093BE2828E130E05ECC62E070E01E -:103E7000C80177D2882381F0D80111968C91809364 -:103E8000C32889E08093BE282FD59AE09827F801AF -:103E9000908324E030E048CC27D591E09827D801E2 -:103EA0009C9324E030E040CC44E050E060E070E0DF -:103EB000CE0101960E94DE069091C128F801818111 -:103EC000803209F49EC1803709F02CCCF8012281A0 -:103ED0008981281327CC23818A81281323CC24812C -:103EE0008B8128131FCC25818C8128131BCC9083B8 -:103EF000B3CF62E070E0C80134D2882309F42DCF3B -:103F0000F80181818093C3288BE05FCE8091D42813 -:103F100028131DCFE091CD288091D1288095E813FA -:103F200016CF8091D528E81312CF8091CE2890919A -:103F3000D228909589130BCF9091D628891307CF5B -:103F40003091CF289091D3289095391300CF90913C -:103F5000D7283913FCCE4091D8289091D928909534 -:103F60004913F5CE9091DA284913F1CE9091DB28D0 -:103F700090954913ECCED8019C911196FC91119724 -:103F800012964C91129750E060E070E0BA0155270C -:103F900044275F2B492B13969C91792B90E0A0E04E -:103FA000B0E0DC01992788279E2B822BB32B209130 -:103FB000BE282B3009F4DDC02A3021F4840F951F70 -:103FC000A61FB71F8093CC28C92EDA2EEB2EFF2414 -:103FD000C092CD288D01222733270093CE284B2F66 -:103FE0005527662777274093CF28E82FE095E09361 -:103FF000D028EC2DE095E093D128E02FE095E093D8 -:10400000D228E42FE095E093D3288093D428C0925F -:10401000D5280093D6284093D72888E08093BE28DF -:1040200020E030E081CB62E070E0C8019AD18823C3 -:1040300009F432CFD80111968C918093C3285AE0AD -:10404000F52EF092BE2850D48F25F801808324E00D -:1040500030E06ACB62E070E0C80183D1882309F4C4 -:104060001BCF8091062981110FCFD80111966C9139 -:10407000B0E16B9FB001112440E150E08CEC98E27C -:104080000E94F60601CF62E070E0C8016AD1882381 -:1040900009F4D1C0D80111962C9111972C738C91F1 -:1040A000803609F4DCC08AE390E05C01B0E12B9F2C -:1040B000A00CB11C11246E01E7E0CE0ED11C64E00F -:1040C000C6010E943F068091C2287E01882309F420 -:1040D000B8C0FBE0EF0EF11C44E050E063E070E09C -:1040E000C7010E94DE0646E050E0B501CE01019610 -:1040F0000E94DE068F818093C42888858093C5281E -:1041000089858093C6288A858093C72860E470E0FB -:1041100084EC98E20DD48091C4288093C8288091C3 -:10412000C5288093C9288091C6288093CA28809189 -:10413000C7288093CB2860E270E088EC98E2F8D33F -:1041400087E08093BE288F81D8018C938885119653 -:104150008C931197898512968C9312978A85139662 -:104160008C93A601B701CE010196B4D120E230E0D4 -:10417000DBCA841B950BA60BB70B24CF62E070E063 -:10418000C801EFD08111ECCC81E0D8018C9324E000 -:1041900030E0CACA62E070E0C801E3D08823A1F32E -:1041A000F8016181F0E16F9FB001112440E150E01E -:1041B000C8010E94DE0660E170E0C801A3D020E9DA -:1041C00030E0B2CA8981F80180833A8131832B8142 -:1041D00022839C819383832782278927848328E2F3 -:1041E00030E0A2CAF80180833A8131839B819283B7 -:1041F0002C812383932798279227948328E230E009 -:1042000093CA898180833A8131832B8122839C8167 -:104210009383832782278927848328E230E084CA16 -:104220009BE0E90EF11C44E050E060E070E0C70163 -:104230000E94DE06EACB81E0F801808324E030E0D2 -:1042400073CA3BE0E30EF11C44E050E060E070E034 -:10425000C7010E94DE0647CF60E370E0B8CB80E381 -:1042600090E023CFCF93DF93EC018091C22881119E -:1042700009C044E050E060E070E0CE01DF91CF91F2 -:104280000C94DE0643E050E060E070E0CE010E9456 -:10429000DE0644E050E063E070E0CE010396DF917B -:1042A000CF910C94DE06CF93DF931F92CDB7DEB78C -:1042B0002091C22821111BC0FC01218130812327BC -:1042C0003281232733812327298344E050E060E0B3 -:1042D00070E00E94F60641E050E064E070E0CE013C -:1042E00001960E94F6060F90DF91CF9108954091BC -:1042F000052950E060E070E00E94F6060F90DF9123 -:10430000CF9108956115710541F1680F791FFC0186 -:1043100023E633E64191422750E1459FC001112435 -:10432000A42FA8278A2F90E0582F4427880F991F81 -:10433000880F991F880F991F48275927232F332744 -:1043400024273527A295AF702A27E617F70711F71C -:10435000922F832F908381830895FC0183E693E657 -:10436000F9CF61157105B1F1680F791FFC0123E6E2 -:1043700033E64191422750E1459FC0011124A42F0B -:10438000A8278A2F90E0582F4427880F991F880F5D -:10439000991F880F991F48275927232F3327242730 -:1043A0003527A295AF702A27E617F70711F7A9015D -:1043B0005527808190E08417950711F080E00895DB -:1043C000418150E0232F332781E042175307B9F38F -:1043D00080E0F5CFFC0143E650E023E633E6E9CF89 -:1043E000CF93B091DF28C091E0284091E128A091BF -:1043F000DC28F091DD28E091DE289C2F90712B2F96 -:10440000217E9227242F207292272A2F2479922707 -:104410002F2F237792272E2F2A739227392F329509 -:104420003F703927232F269526952327922F96957F -:1044300050E060E070E0BA01552744275C2B4B2B1D -:104440007695679557954795922791709813606870 -:10445000A093DF28F093E028E093E1284093DC2844 -:104460005093DD286093DE28CF910895CF93DF939A -:10447000C091DD289091DE28A92FAF70B0E0A05E3A -:10448000BF4DEC2FEF70F0E0E05EFF4DD0968C91C9 -:104490002089822BE091DC28E295EF70F0E0E05E6D -:1044A000FF4D2081822BC295CF70D0E0C05EDF4DE2 -:1044B00028A1822B92959F70A92FB0E0A05ABF4DE2 -:1044C0009C91892BE82FF0E0E059FF4D8081DF912E -:1044D000CF910895CF92DF92EF92FF920F931F93A7 -:1044E000CF93DF93FC01DB01EA01918180E0208121 -:1044F000822B80FD8DC130E081FD88C120E0969542 -:10450000879596958795432F406880FD342F422FDD -:10451000406881FD242F96958795969587953695C9 -:104520002695432F406880FD342F422F406881FD3F -:10453000242F969587959695879536952695432FA2 -:10454000406880FD342F422F406881FD242F9695CE -:1045500087959695879536952695432F406880FDDB -:10456000342F422F406881FD242F9695879596958C -:10457000879536952695432F406880FD342F422F2E -:10458000406881FD242F9695879596958795369559 -:104590002695432F406880FD342F422F406881FDCF -:1045A000242F969587959695879536952695532F22 -:1045B0005068422F406880FD352F3093DF2881FD01 -:1045C000242F2093DC28938180E02281822B80FDA0 -:1045D0001BC130E081FD16C120E096958795969528 -:1045E0008795432F406880FD342F422F406881FD1E -:1045F000242F969587959695879536952695432FE2 -:10460000406880FD342F422F406881FD242F96950D -:1046100087959695879536952695432F406880FD1A -:10462000342F422F406881FD242F969587959695CB -:10463000879536952695432F406880FD342F422F6D -:10464000406881FD242F9695879596958795369598 -:104650002695432F406880FD342F422F406881FD0E -:10466000242F969587959695879536952695432F71 -:10467000406880FD342F422F406881FD242F96959D -:1046800087959695879536952695532F5068422F96 -:10469000406880FD352F3093E02881FD242F209342 -:1046A000DD28958180E02481822B80FDA9C030E047 -:1046B00081FDA4C020E09695879596958795432F18 -:1046C000406880FD342F422F406881FD242F96954D -:1046D00087959695879536952695432F406880FD5A -:1046E000342F422F406881FD242F9695879596950B -:1046F000879536952695432F406880FD342F422FAD -:10470000406881FD242F96958795969587953695D7 -:104710002695432F406880FD342F422F406881FD4D -:10472000242F969587959695879536952695432FB0 -:10473000406880FD342F422F406881FD242F9695DC -:1047400087959695879536952695432F406880FDE9 -:10475000342F422F406881FD242F9695879596959A -:10476000879536952695532F5068422F406880FDD7 -:10477000352F3093E12881FD242F2093DE28898175 -:1047800011969C9111978927CA8012969C91129735 -:10479000C926D12CE12CF12C7601DD24CC24D82A99 -:1047A00088819C918927C82A8B8113969C9189279F -:1047B000F82A10E25BDE082F8C2D817011DEF69452 -:1047C000E794D794C794002311F06894F7F8115038 -:1047D00089F788818C25888389818D2589838A81C1 -:1047E0008E258A838B818F258B83DF91CF911F91BB -:1047F0000F91FF90EF90DF90CF90089520E45BCF72 -:1048000030E456CF20E4E9CE30E4E4CE20E477CEA5 -:1048100030E472CECF92DF92EF92FF92CF93FC0101 -:104820008181C280D12CE12CF12C7601DD24CC24B5 -:10483000D82A8081C82A8381F82AC0E217DEB7010E -:10484000A60141705527662777278427C9DDF6948E -:10485000E794D794C794C15089F7CF91FF90EF9018 -:10486000DF90CF900895CF93DF9300DEC82F80E0D4 -:10487000B7DDCC2309F436C0C0E8F8DDD82F80E0DE -:10488000AFDDC695D111C068F1DDD82F80E0A8DD7D -:10489000C695D111C068EADDD82F80E0A1DDC695AC -:1048A000D111C068E3DDD82F80E09ADDC695D11123 -:1048B000C068DCDDD82F80E093DDC695D111C068DB -:1048C000D5DDD82F80E08CDDC695D111C068CEDD56 -:1048D000D82F80E085DD8C2F8695D1118068DF91FF -:1048E000CF910895C0E0C9CFCF93DF93BFDDC82F2C -:1048F00080E076DDCC23D1F0C8E0B8DDD82F80E0B1 -:104900006FDDC695D111C860B1DDD82F80E068DDBC -:10491000C695D111C860AADDD82F80E061DD8C2F4B -:104920008695D1118860DF91CF910895C0E0E5CFE1 -:104930006F927F928F929F92AF92BF92CF92DF92AF -:10494000EF92FF920F931F93CF93DF933C01CB0124 -:104950000197672BC9F1F301A281C081B181D38195 -:104960002A2F2D72322F32953F703227232F269512 -:1049700026952327322F36954D2F50E060E070E0CA -:10498000742F6627552744275B2B4C2B6A2B769573 -:10499000679557954795322730FD7068C42F852E4F -:1049A000962EA72EBB24B82D6B01EE24FF24AC2D30 -:1049B000072F112722273327D02F019788F6F301DD -:1049C00040838182C2820383DF91CF911F910F9137 -:1049D000FF90EF90DF90CF90BF90AF909F908F901F -:1049E0007F906F9008950F931F93CF93DF93CDB770 -:1049F000DEB7EC97CDBFDEBF2BD38093412B28D3FE -:104A00008093422B25D38093432B22D38093442B36 -:104A10001FD38093452B1CD38093462B19D38093AF -:104A2000472B16D38093482B0E944B11B0D3882379 -:104A300089F09091412B8091422B853009F452C02E -:104A4000B0F0883009F4B3C0893009F498C08630DA -:104A500009F45AC09CD3882311F06DD350D3EC963F -:104A6000CDBFDEBFDF91CF911F910F9108958130AF -:104A700021F008F468C0833069F7992309F4A1C0D4 -:104A8000923041F78091432B811127C00091452B33 -:104A90001091462B0F70112701151105D9F2802FA7 -:104AA000F5D28091422B833009F4E6C0E0914B2B84 -:104AB000F0914C2B81818B7F818384E8809FF00172 -:104AC000819FF00D1124E157F44D1082E0914B2BA2 -:104AD000F0914C2B80818E7F808380E0D7D22BD3C6 -:104AE0008FD4B8CF9111B6CF1091432B1F7723D31A -:104AF00087D47FD38823E9F31093C304111176C0C0 -:104B000082E08093402BA6CF9058923008F0A2CF3D -:104B10008091432B9091442B8C3D23E0920709F424 -:104B200067C0AE01455C5F4F6091452B0E94D10488 -:104B30008C01009709F48ECFFED2B8018BAD9CADED -:104B4000C0D177D287CF903809F447C0923809F0A6 -:104B500081CF8091452B8F7099D2E0914B2BF091B2 -:104B60004C2B118112FB112710F980E08FD2E3D278 -:104B7000812F7DD280E07BD243D242D46BCF911182 -:104B800069CF8091432B823008F064CFD4D28091DA -:104B9000432B80933C2B34D480913C2B882309F405 -:104BA00061C084E08093402B0E94471153CF90381E -:104BB00009F050CFC0D280913C2B59D221D220D4C1 -:104BC00049CF9091432B913009F044CF91E083304D -:104BD00009F090E090933E2B80CF10913D2B809177 -:104BE0003E2B882309F4C3CF1260C1CF83E089CF65 -:104BF00083E08A838AE389835FB7F89482E08093B5 -:104C0000CA01E8E0F0E0E4911092CA01DE011396D7 -:104C100020E038E042E0EF708E2F90E0EA30B8F00C -:104C2000C7968D939D932F5F2C3199F04093CA01C5 -:104C3000E32FF0E0E4911092CA0120FFECCFE2955F -:104C4000EF703F5FEF708E2F90E0EA3048F7C0962C -:104C5000E8CF5FBF70D26AE370E0CE01019690D0DA -:104C6000E8D1F8CE8091C304882321F084E08093BA -:104C7000402B9ACF81E0FBCF42D22FCF0895CF9324 -:104C80008091402B811102C0CF910895C0914D2B8E -:104C900080E0FCD17CD2811103C08C2FCF91F6C172 -:104CA000A2DE8C2FCF91F2C1AF92BF92DF92EF9232 -:104CB000FF920F931F93CF93DF938C01EB017A0147 -:104CC000B5D3D82E811127C0E114F104A1F1F70169 -:104CD00020813181C21BD30B020F131F2097D9F003 -:104CE000A12CB12C8091492B90914A2BFC01EF5BB8 -:104CF000FF4F2081FC01E05CFF4F8081281790F17D -:104D00007FD1BDDFF701808191818A0D9B1D80835A -:104D1000918325E0D22E8D2DDF91CF911F910F91A0 -:104D2000FF90EF90DF90BF90AF90089569D1A7DF1B -:104D30007DD3811123C0209771F32091492B3091AD -:104D40004A2BF901EF5BFF4F9081F901E05CFF4FC7 -:104D50008081981758F7F80181918F0188D12197A8 -:104D600061F7D9CFF80181918F0181D1FFEFAF1A9F -:104D7000BF0ACA15DB0509F0B5CFCDCFD82ECBCFF2 -:104D8000CF92DF92EF92FF920F931F93CF93DF9317 -:104D90006C01EB0180914D2B806878D10091472BFD -:104DA0001091482B0C171D0720F0209709F483C0A1 -:104DB0008E01C0E00115110509F04AC0CC2309F4A9 -:104DC0005CC08091402B882309F455C0853009F4DC -:104DD0005DC0DDD181116DC0F3D181114EC009D20A -:104DE000882379F380914D2B87FD5AC02091492B60 -:104DF00030914A2BF901E05CFF4FE080F901EF5B55 -:104E0000FF4F8081F12CE81AF10801151105A9F076 -:104E100088E0E816F10488F4E60104C088E0E816AA -:104E2000F10459F0899123D16E01015011098FEFDE -:104E3000E81AF80A0115110589F7C1E088E0E816BB -:104E4000F10409F0C0E0DCD00115110509F4B6CF7A -:104E50008091402B882379F08530C1F098D1811161 -:104E600028C0AED1811109C0C4D18111BBCF8091BE -:104E7000402B8111F1CF82E00AC0A2D181111FC065 -:104E80008091402B8823B9F38530B9F783E0DF9117 -:104E9000CF911F910F91FF90EF90DF90CF900895E9 -:104EA000E091492BF0914A2BEF5BFF4FE080F12C12 -:104EB000ACCF81E0ECCFA4D000E010E07ACF80E06E -:104EC000E6CFCF92DF92EF92FF920F931F93CF9393 -:104ED000DF93D82EC92E8B0180914D2B8068D6D0C0 -:104EE000C091472BD091482BC017D10728F001154E -:104EF000110509F47FC0E801ED2CFC2CD12C209782 -:104F000009F045C0DD2009F457C08091402B88236B -:104F100009F450C0853009F458C039D1811168C0F6 -:104F20004FD1811149C065D1882379F380914D2BF0 -:104F300087FD55C08091492B90914A2BFC01E05C84 -:104F4000FF4F0081FC01EF5BFF4F808110E0081BE9 -:104F50001109209791F00830110520F00EC008309B -:104F6000110559F0F701849182D0FFEFEF1AFF0A83 -:104F700021970F5F1F4F209791F7DD24D3940830BE -:104F8000110509F0D12C3CD0209709F4BBCF8091BA -:104F9000402B882379F08530C1F0F9D0811128C0E9 -:104FA0000FD1811109C025D18111C0CF8091402B33 -:104FB0008111F1CF82E00AC003D181111FC080911D -:104FC000402B8823B9F38530B9F783E0DF91CF9187 -:104FD0001F910F91FF90EF90DF90CF900895E09197 -:104FE000492BF0914A2BEF5BFF4F008110E0B1CFCE -:104FF00081E0ECCF05D0C0E0D0E07ECF80E0E6CF0E -:10500000E0914B2BF0914C2BA091492BB0914A2B66 -:10501000AF5BBF4F8C9190E08283938380818D79C9 -:105020008083E091492BF0914A2BEF5BFF4F108278 -:105030000895E0914B2BF0914C2B80818D798083EA -:10504000E091492BF0914A2BEF5BFF4F10820895BE -:105050008091492B90914A2BFC01EF5BFF4F2081FF -:10506000DC01A20FB11D8C912F5F20830895209148 -:10507000492B30914A2BF901EF5BFF4F9081D90109 -:10508000A90FB11D8C939F5F9083089580934D2B42 -:10509000282F2F70622F70E094E8299F900111242F -:1050A000225B344D4091C6045091C70487FD12C065 -:1050B0002093492B30934A2BCB0182959295907F78 -:1050C0009827807F9827840F951F80934B2B909370 -:1050D0004C2B08952E5B3F4F2093492B30934A2B46 -:1050E00062957295707F7627607F7627685F7F4F25 -:1050F000640F751F60934B2B70934C2B0895E091B8 -:105100004B2BF0914C2B818184608183E0914B2B60 -:10511000F0914C2B8181807C803409F0089580913E -:105120004D2B8058B3DFE0914B2BF0914C2B8181BC -:1051300084608183089580914D2B8F77A7DFE09164 -:105140004B2BF0914C2B80818D788083E0914B2B01 -:10515000F0914C2B808181608083E091492BF0910C -:105160004A2BEF5BFF4F108280914D2B80688EDFC2 -:10517000E0914B2BF0914C2B808181608083E091FA -:10518000492BF0914A2BEF5BFF4F108208958091DD -:105190004D2B8F777BDFE0914B2BF0914C2B808157 -:1051A00084FF0CC02091492B30914A2B828193813E -:1051B000F901E05CFF4F808381E0089580E008956D -:1051C00080914D2B8F7762DFE0914B2BF0914C2B30 -:1051D000808185FF0CC02091492B30914A2B828120 -:1051E0009381F901E05CFF4F808381E0089580E0C6 -:1051F000089580914D2B806849DFE0914B2BF09111 -:105200004C2B80818695817008951F93CF93DF93F7 -:1052100000D0CDB7DEB7182F4A83698337DFE0911E -:105220004B2BF0914C2B1182E0914B2BF0914C2B9E -:105230004A81698117FD22C01082E0914B2BF091C9 -:105240004C2B6183E0914B2BF0914C2B12821382FB -:105250008091492B90914A2B8483958340E0FC01F7 -:10526000E05CFF4F4083FC01EF5BFF4F108281E069 -:105270000F900F90DF91CF911F91089582E080836E -:10528000E0914B2BF0914C2B6183E0914B2BF091F3 -:105290004C2B128213828091492B90914A2B84834C -:1052A0009583DDCFAF92BF92DF92EF92FF920F9383 -:1052B0001F93CF93DF9300D0CDB7DEB7E62E6623E2 -:1052C00009F44AC05C018C010C5F1F4FF12CD50121 -:1052D0005C915523C9F1D5011196ED91FC9112977E -:1052E000D80111974C91D8018C91823008F443C0B9 -:1052F00098E188E1E930F10550F028E030E090E0F5 -:105300009F5F220F331F2E173F07D0F3982B252FB7 -:105310002F7030E02630310564F5E134F10548F5B1 -:105320009F7E41112BC09064DE2E4E2F692F852F5A -:10533000805859839A8369DF9A8159814D2D692F4D -:10534000852F63DF8823A9F0F394B5E0AB0EB11C81 -:105350000B5F1F4FFE10BBCF81E00F900F90DF91CE -:10536000CF911F910F91FF90EF90DF90BF90AF9082 -:10537000089580E0F2CF98E088E0BCCF413029F07A -:105380009068442389F2DE2ED9CF906CDE2ED6CFE2 -:10539000E0ECF4E0A681B78119961C92A681B78152 -:1053A00011961C92A681B78159961C92A681B7814D -:1053B00051961C92A681B78199961C92A681B781BD -:1053C00091961C92A681B781D9961C92A681B7812D -:1053D000D1961C92A681B781A75BBF4F1C92A68174 -:1053E000B781AF5BBF4F1C92A681B781A75ABF4F51 -:1053F0001C920680F781E02DEF5AFF4F108208952E -:105400008091412B87FD08C0F4DE81110DC0809191 -:10541000402B8111F9CF0895D3DE811106C0809110 -:10542000402B8111F9CF0895EBCD03CE1F93CF937D -:10543000DF93E091C604F091C704E05AFF4FC081AA -:10544000D18114E680914D2B8078803831F1B8DE1F -:10545000811126C08091402B882339F1853051F18C -:10546000E0914B2BF0914C2B818182FD28C0E09183 -:10547000C604F091C704E05AFF4F80819181C8179C -:10548000D90701F3212F21501123F1F0EC01122F44 -:1054900080914D2B80788038D1F6ABDE8823D1F215 -:1054A00080E0DF91CF911F91089582E0DF91CF914D -:1054B0001F91089583E0DF91CF911F91089581E0BE -:1054C000DF91CF911F91089584E0DF91CF911F91DB -:1054D000089563D069D0E0ECF4E081818E7F818310 -:1054E00080818F77808310923F2B0895CF93DF9335 -:1054F000E0E4F0E014828481816084834ED054D053 -:10550000C0ECD4E088818F77888388818068888325 -:105510001092402B10923C2B10923E2B10923D2B60 -:1055200088818064888348E068E480E86EDE48E033 -:1055300068E480E06ADE888580648887898181608C -:105540008983DF91CF910895CF93DF933FB7F8948C -:10555000C0ECD1E022E02A87EAE1F0E0E491A0EC9F -:10556000B4E0DA96EC93DA97EBE1F0E0E491DB96C5 -:10557000EC93DB971A8687E69EE28E7F16968D93D4 -:105580009C93179785E18C9318962C933FBF81E0ED -:1055900080933F2BDF91CF91A9CFE0ECF4E08085A1 -:1055A0008370808711860895E0ECF4E08FEF8287A6 -:1055B000848708951F920F920FB60F9211242F9394 -:1055C0003F934F935F936F937F938F939F93AF938B -:1055D000BF93EF93FF938091CA0487FD4DC08091E4 -:1055E000CA0486FD41C08091CA0485FF0CC080E2D8 -:1055F0008093CA0480913C2B882371F184E08093CE -:10560000402B0E9441118091CA0484FF14C080E1A4 -:105610008093CA0482E08093402B10923C2B10921E -:10562000C304B6DE48E068E480E8EFDD48E068E403 -:1056300080E0EBDD23DBFF91EF91BF91AF919F9174 -:105640008F917F916F915F914F913F912F910F902B -:105650000FBE0F901F9018958091C304811115C043 -:1056600081E08093402BCDCF80E48093CA041092D8 -:10567000402B0E944411B7CF8091C80487FFAFCF61 -:1056800080E88093CA04FADAAACF83E0EACFCF9306 -:10569000DF93EC014096FC018BE0DF011D928A95BF -:1056A000E9F782E08C83898783E08E8761E0CE0111 -:1056B0000196F8DD811104C080E0DF91CF9108955B -:1056C00061E0CE010696EEDD8823B1F361E0CE0104 -:1056D0000B96DF91CF91E6CDCF93DF93D62FC72FD7 -:1056E0002091402B243021F082E0DF91CF9108956A -:1056F000FC014489558966897789452B462B472BC0 -:1057000099F38181C3DCAD2FBC2FFD0101900020F6 -:10571000E9F7BF01615071096A1B7B0B40E050E063 -:105720008D2F9C2FDF91CF91BFCAEF92FF920F93E5 -:105730001F93CF93DF93EB017A012091402B24300C -:1057400041F082E0DF91CF911F910F91FF90EF9098 -:105750000895FC010489158926893789012B022BBC -:10576000032B79F3818192DC40E050E0B701CE0158 -:10577000DF91CF911F910F91FF90EF9095CA0F93FA -:105780001F93CF93DF931F92CDB7DEB72091402BAD -:10579000243039F082E00F90DF91CF911F910F916B -:1057A0000895FC010489158926893789012B022B6C -:1057B000032B81F38181698369DC2091492B30912E -:1057C0004A2BF901EF5BFF4F9081F901E05CFF4F3D -:1057D00080816981981730F0698312DC27DE698146 -:1057E0008111D9CF862F43DC80E0D5CF0F931F9353 -:1057F000CF93DF931F92CDB7DEB72091402B24309B -:1058000039F082E00F90DF91CF911F910F910895B1 -:10581000FC014489558966897789452B462B472B9E -:1058200081F3818133DC80914D2B2091492B309184 -:105830004A2BF90187FD1DC0E05CFF4F8081F90113 -:10584000EF5BFF4F408190E0841B9109892B11F49D -:1058500080E0D8CF0081F901E05CFF4F1081D0DB00 -:105860000117B0F3E3DD8111CDCF8983C9DB8981D5 -:10587000C9CFEF5BFF4F808190E0E8CFCF93DF93FC -:10588000EC018091402B843019F0DF91CF91089585 -:105890004C895D896E897F89452B462B472BA9F35F -:1058A0008981F4DBA6DC882381F3CE01DF91CF91DF -:1058B0009DCFCF93DF932091402B2430C1F5FC0185 -:1058C0004489558966897789452B462B472B79F181 -:1058D0008681DCDB75DC882351F180914D2B87FDBF -:1058E0003DC08091492B90914A2BFC01E05CFF4F19 -:1058F0002081FC01EF5BFF4F408130E0241B310928 -:10590000232BD9F4CFEFDFEF20914D2B27FD23C0C0 -:10591000DC01A05CBF4F8C91208190E0821B91093B -:10592000892B39F486DBCE01DF91CF910895CFEF3B -:10593000DFEFCE01DF91CF9108958ADBC82FD0E051 -:105940008091492B90914A2BFC01EF5BFF4F2091F6 -:105950004D2B27FFDDCF808190E0E2CF8091492B56 -:1059600090914A2BFC01EF5BFF4F208130E0C8CFC4 -:105970000895FF920F931F93CF93DF93EC0107DC01 -:10598000882349F0888190E02091452B3091462B67 -:105990002817390731F0DF91CF911F910F91FF90B8 -:1059A00008958091422B813209F44BC008F033C036 -:1059B000803289F78091412B813269F7BCDB04C0CA -:1059C0008091402B882339F3FBDB8823C9F340DB2C -:1059D000082F3EDB182F3CDBF82E3ADB4F2D50E032 -:1059E00060E070E0BA0155274427782B402B512BFB -:1059F0004C8B5D8B6E8B7F8B2BDB888F29DB898FAC -:105A000027DB8A8F16DBFCDCCE01DF91CF911F9163 -:105A10000F91FF90ADCF823209F434C0833209F088 -:105A2000BACF8091412B813209F0B5CF84DBE8DC1D -:105A30006091432BCE01DF91CF911F910F91FF9089 -:105A400097CF8091412B813A09F0A5CF74DBD1DB50 -:105A50008823E9F38C89FD880E891F8908DB8F2D47 -:105A600006DB802F04DB812F02DB888D00DB898D34 -:105A7000FEDA8A8DFCDAC4DADF91CF911F910F91A3 -:105A8000FF90BECC8091412B813209F084CF53DB53 -:105A9000B7DC8091432B9091442B888B998BCE015E -:105AA000DF91CF911F910F91FF9062CFB7FF04C09C -:105AB00003D0821B930B089509D0A59F900DB49F2E -:105AC000900DA49F800D911D11240895A29FB001F7 -:105AD000B39FC001A39F01D0B29F700D811D1124FF -:105AE000911D08958F929F92AF92BF92CF92DF92B5 -:105AF000EF92FF92CF93DF93EC01688179818A81E5 -:105B00009B81611571058105910521F464E279EDB0 -:105B10008BE597E02DE133EF41E050E048D34901B8 -:105B20005A019B01AC01A7EAB1E4C6DF6B017C011D -:105B3000ACEEB4EFA5019401BBDFC60ED71EE81E84 -:105B4000F91EF7FE06C081E0C81AD108E10880E816 -:105B5000F80AC882D982EA82FB82E894D7F8EE2458 -:105B6000FF24C601DF91CF91FF90EF90DF90CF909F -:105B7000BF90AF909F908F900895B4CF8CE190E24A -:105B8000B1CFA0E0B0E080931C2090931D20A093A3 -:105B90001E20B0931F200895FB01DC0102C0059078 -:105BA0000D9241505040D8F70895FB01DC018D91D2 -:105BB000059080190110D9F3990B0895FB01DC01C0 -:105BC0000D900020E9F711974150504028F00590C2 -:105BD00000200D92C9F708951C920895FB01DC0185 -:105BE0004150504048F005900D920020C9F701C087 -:105BF0001D9241505040E0F70895FB01DC0102C0C6 -:105C000001900D9241505040D8F70895AEE0B0E0B9 -:105C1000EBE0FEE2F5C20D891E898F89988D2EE09A -:105C20002C8309831A8397FF02C080E090E80197D4 -:105C30008D839E83CE014B96AC01698D7A8DCE010A -:105C4000019611D04D815E8157FD0AC02F813885A4 -:105C5000421753070CF49A01F801E20FF31F108268 -:105C60002E96E4E0E6C2ACE0B0E0E8E3FEE2BAC2C1 -:105C70007C016B018A01FC0116821782838181FFFE -:105C8000B9C188248394912C8C0E9D1EF7019381B9 -:105C9000F60193FD859193FF81916F01882309F4AB -:105CA000A5C1853239F493FD859193FF81916F01F0 -:105CB000853221F4B70190E0F0D1E8CF512C312C9E -:105CC00020E02032A8F48B3261F028F4803251F0C9 -:105CD000833271F40BC08D3239F0803349F4216086 -:105CE00028C02260246025C0286023C0206121C014 -:105CF00027FD27C0382F30533A3078F426FF06C0EE -:105D0000FAE05F9E300D1124532E13C08AE0389EB6 -:105D1000300D1124332E20620CC08E3221F426FD6A -:105D200065C1206406C08C3611F4206802C0883634 -:105D300041F4F60193FD859193FF81916F018111EB -:105D4000C0CF982F9554933018F09052933028F488 -:105D50000C5F1F4FFFE3F9830DC0833631F08337AB -:105D600071F0833509F05AC022C0F801808189831F -:105D70000E5F1F4F44244394512C540114C038012A -:105D8000F2E06F0E711CF801A080B18026FF03C005 -:105D9000652D70E002C06FEF7FEFC5012C8772D1D7 -:105DA0002C0183012C856FE7262E222217C0380193 -:105DB000F2E06F0E711CF801A080B18026FF03C0D5 -:105DC000652D70E002C06FEF7FEFC5012C874FD1CA -:105DD0002C012C8550E8252E222A830123FC1AC091 -:105DE00005C0B70180E290E058D13A94832D90E04D -:105DF00048165906B0F30EC0F50127FC859127FE21 -:105E000081915F01B70190E048D131103A94F1E0FF -:105E10004F1A51084114510479F7E5C0843611F046 -:105E2000893639F5F80127FF07C0608171818281C9 -:105E300093810C5F1F4F08C060817181882777FDB7 -:105E40008095982F0E5F1F4F4FE6B42EB22297FF1A -:105E500009C090958095709561957F4F8F4F9F4FAA -:105E6000F0E8BF2A2AE030E0A40143D1A82EA81808 -:105E700042C0853731F43FEEB32EB2222AE030E043 -:105E800024C099EFB92EB2228F36B9F020F48835AC -:105E900009F0ACC00DC0803721F0883709F0A6C0EA -:105EA00002C020E1B22AB4FE0BC084E0B82A08C0C8 -:105EB00024FF09C0E6E0BE2A06C028E030E005C0A5 -:105EC00020E130E002C020E132E0F801B7FE07C077 -:105ED00060817181828193810C5F1F4F06C0608158 -:105EE000718180E090E00E5F1F4FA40102D1A82EC7 -:105EF000A818FFE7BF22B6FE0BC02B2D2E7FA514DE -:105F000050F4B4FE0AC0B2FC08C02B2D2E7E05C092 -:105F10007A2C2B2D03C07A2C01C0752C24FF0DC0C8 -:105F2000FE01EA0DF11D8081803311F4297E09C044 -:105F300022FF06C07394739404C0822F867809F000 -:105F4000739423FD13C020FF0EC05A2C731458F411 -:105F5000530C5718732C07C0B70180E290E02C87D0 -:105F60009CD073942C857314B8F304C0731410F48C -:105F7000371801C0312C24FF11C0B70180E390E035 -:105F80002C878BD02C8522FF1CC021FF03C088E505 -:105F900090E002C088E790E0B7010CC0822F8678BD -:105FA00081F021FD02C080E201C08BE227FD8DE27D -:105FB000B70190E072D005C0B70180E390E06DD0EA -:105FC0005A94A514C8F3AA94F401EA0DF11DB7017F -:105FD000808190E062D0A110F6CF05C0B70180E2C9 -:105FE00090E05BD03A943110F9CF50CEF701268182 -:105FF000378102C02FEF3FEFC9012C96E2E10BC1C0 -:10600000E0ECF1E0A785A7FDFDCFA485A860A487FB -:106010006050704FF2CDDC01CB0102C02D9105D054 -:1060200041505040D8F70895262FE0ECF1E0378535 -:1060300037FDFDCF3485377F3487378531FF09C081 -:1060400036E3328738ED34BF31E03387378537FDAB -:10605000FDCF33E33287808391831282248325E34B -:10606000228728ED31E024BF338701960895FC0193 -:106070000590615070400110D8F7809590958E0F73 -:106080009F1F0895FC016150704001900110D8F7E6 -:10609000809590958E0F9F1F08950F931F93CF9318 -:1060A000DF938C01EB018B8181FD03C00FEF1FEFAC -:1060B0001AC082FF0DC02E813F818C819D812817DF -:1060C000390764F4E881F9810193E883F98306C014 -:1060D000E885F985802F0995892B41F78E819F816D -:1060E00001968E839F83C801DF91CF911F910F91FD -:1060F0000895FA01AA27283051F1203181F1E8945E -:106100006F936E7F6E5F7F4F8F4F9F4FAF4FB1E0AA -:106110003ED0B4E03CD0670F781F891F9A1FA11DA5 -:10612000680F791F8A1F911DA11D6A0F711D811DA6 -:10613000911DA11D20D009F468943F912AE0269F6B -:1061400011243019305D3193DEF6CF010895462FCA -:106150004770405D4193B3E00FD0C9F7F6CF462FAB -:106160004F70405D4A3318F0495D31FD4052419314 -:1061700002D0A9F7EACFB4E0A695979587957795D1 -:106180006795BA95C9F700976105710508959B0158 -:10619000AC010A2E06945795479537952795BA95E1 -:1061A000C9F7620F731F841F951FA01D0895052E48 -:1061B00097FB16F4009406D057FD0CD044D007FC92 -:1061C00009D07EF490958095709561957F4F8F4FA3 -:1061D0009F4F089550954095309521953F4F4F4FD3 -:1061E0005F4F08952F923F924F925F926F927F92EE -:1061F0008F929F92AF92BF92CF92DF92EF92FF92D7 -:106200000F931F93CF93DF93CDB7DEB7CA1BDB0B82 -:10621000CDBFDEBF09942A88398848885F846E84A0 -:106220007D848C849B84AA84B984C884DF80EE80BA -:10623000FD800C811B81AA81B981CE0FD11DCDBFFC -:10624000DEBFED010895A1E21A2EAA1BBB1BFD01C2 -:106250000DC0AA1FBB1FEE1FFF1FA217B307E40745 -:10626000F50720F0A21BB30BE40BF50B661F771F9D -:10627000881F991F1A9469F760957095809590957D -:0E6280009B01AC01BD01CF010895F894FFCF42 -:10628E0000831000000104100000018208000001CC -:10629E0000000000000000000000001401000000DB -:1062AE0000010101000000010000010001010001D8 -:1062BE0000000002020000020002020202000002C0 -:1062CE0000000004040000040004040404000004A0 -:1062DE000008080800000008000008000808000870 -:1062EE000000001010000010001010101000001020 -:1062FE00000100010000000000000001000101018A -:10630E000101010001000100000001010001010175 -:02631E0000007D +:101E00009081911156C027703327822F2F5F3F4F4B +:101E1000F901EE0FFF1FE20FF31FEE0FFF1FE75F49 +:101E2000F64D9081911145C027703327822F2F5F87 +:101E30003F4FF901EE0FFF1FE20FF31FEE0FFF1FE1 +:101E4000E75FF64D9081911134C027703327822FC0 +:101E50002F5F3F4FF901EE0FFF1FE20FF31FEE0F51 +:101E6000FF1FE75FF64D9081911123C02770332744 +:101E7000822F2F5F3F4FF901EE0FFF1FE20FF31F7D +:101E8000EE0FFF1FE75FF64D9081911112C0277092 +:101E90003327822F2F5F3F4FF901EE0FFF1FE20F15 +:101EA000F31FEE0FFF1FE75FF64D9081911101C008 +:101EB00008958F5F3ECF209109292F5CFC0120837C +:101EC00011820895FC0180819181992311F080E0B5 +:101ED000089580532ECF80E3E0E0F6E081830895FB +:101EE00020919728822F90E08832910588F01092F7 +:101EF000972820919828822F90E08832910518F039 +:101F0000109298280895FC01E250FF4F0C947A2B10 +:101F1000FC01EA5DFE4F0C947A2B80E2809306066A +:101F200010929828089580E18093060610929728D1 +:101F3000E0CF809199288F5F813099F18093992823 +:101F4000089580E28093050610929828089580E213 +:101F5000809307061092982808958091040685FDC5 +:101F6000DCCF80E280930506089580E18093070628 +:101F700010929728BECF8091040684FDD4CF80E1D3 +:101F800080930506B6CF80E18093050610929728CE +:101F9000B0CF809199288F5F813099F080939928F4 +:101FA000A8CF109299288091040685FFDACF80E2AD +:101FB00080930606203209F4A3CF2150209398285D +:101FC0000895109299288091040684FFD8CF80E16B +:101FD00080930606203209F48ACF21502093972857 +:101FE00088CFE0910A29F0910B299581981731F05B +:101FF0009481981308956093972808956093982882 +:10200000F7CF0F931F93CF93DF93615071094EEA7F +:1020100055E01CE29A01FA010491002349F1613272 +:10202000710520F425C06032710561F0DC01019674 +:10203000EC010C932F5F3F4F61507109F90104913E +:102040000111F1CFF6E04E385F0761F0CE01019645 +:10205000188361507109405E5F4F26E04E3A520787 +:10206000C9F6EC011882DF91CF911F910F9108956D +:10207000EC01E8CF982F907185FD03C091113FC00E +:10208000089560931129992359F160931029609361 +:1020900017296093162960931D2960931C2960936A +:1020A000232960932229609329296093282960932A +:1020B0002F2960932E2960933529609334296093EA +:1020C0003B2960933A2980E2809306061092982873 +:1020D0009923B1F280E18093060610929728089523 +:1020E0006093172960931D29609323296093292900 +:1020F00060932F296093352960933B29E4CF609347 +:1021000010296093162960931C29609322296093FB +:10211000282960932E296093342960933A29D8CFD7 +:10212000FB01803221F0803189F010820895A09166 +:102130000A29B0910B2915966C9180E2689FB00135 +:10214000112462557A4FCF010C94182CA0910A29C2 +:10215000B0910B2914966C91F0CF1F93CF93DF931E +:10216000182FEB016EEA75E0CE010E94FF2B892B40 +:10217000B1F16EEC75E0CE010E94FF2B892BB9F115 +:102180006EEE75E0CE010E94FF2B892B91F16EE07F +:1021900076E0CE010E94FF2B892B69F16EE276E09A +:1021A000CE010E94FF2B892B41F16EE476E0CE0137 +:1021B0000E94FF2B892B19F16EE676E0CE010E947A +:1021C000FF2B892BF1F06EE876E0CE010E94FF2B09 +:1021D000892BC9F080E0DF91CF911F91089560E0D5 +:1021E000812F48DF81E0DF91CF911F91089561E059 +:1021F000F7CF62E0F5CF63E0F3CF64E0F1CF65E0C5 +:10220000EFCF66E0EDCF67E0EBCFBC0181E090E27D +:102210000C94A629CF93DF93EC012196FC016491E5 +:10222000662349F081E090E20E94F529FE01649165 +:1022300021966111F7CFDF91CF910895AB01BC01D9 +:1022400081E090E20C94CB2980E2E0E6F6E0828324 +:102250000895CF93DF9380919A28823019F0DF910F +:10226000CF91089581E090E20E94682A0E948B2419 +:1022700081E090E20E94832AEC0197FDF0CF63E1B8 +:1022800082E0AFDE8C2F06D38111E9CF8C2FDF9156 +:10229000CF91A5C480919A28813039F1D8F082304D +:1022A00051F0833099F48091002081508093002078 +:1022B000882351F108958091680685FD09C084E165 +:1022C0008093002083E080939A280895823091F7CC +:1022D0004BD493C58091680685FFECCF84E1809351 +:1022E000002081E080939A280895809100208150F9 +:1022F000809300208111DECF0E94E1050E94DF283B +:1023000082E080939A28E4CF0E94A4280E94FF05CF +:1023100010929A28089561E181E063CE60E181E046 +:1023200060CE81E090E20C94812981E090E20C94EF +:10233000E02A21E337E03F932F932AE237E03F93EF +:102340002F9323E237E03F932F932AEE36E03F931B +:102350002F9321E02F931F929F938F930E94372CEE +:102360008DB79EB70C968DBF9EBF85E6089523EE70 +:1023700038E23F932F9327EE36E03F932F9321E0EF +:102380002F931F929F938F930E94372C8DB79EB7E8 +:1023900008968DBF9EBF85E608950E944306811171 +:1023A00002C08AEC0895BDDC84E6089560E071E027 +:1023B0000E94800685E60895EF92FF920F931F9387 +:1023C000CF93DF93CDB7DEB7A097CDBFDEBF8C0133 +:1023D000E0900529F12CE091FF28F0910029CE0131 +:1023E000019609959701AE014F5F5F4F60E071E084 +:1023F000C8010E94D50685E6A096CDBFDEBFDF915D +:10240000CF911F910F91FF90EF900895BF92CF92BF +:10241000DF92EF92FF920F931F93CF93DF93CDB78D +:10242000DEB7A097CDBFDEBF8C01C0900529D12CAF +:1024300060EE76E00E94FF2B892B49F5C114D10490 +:1024400099F1B12CCE0101967C0100E010E00E94D0 +:10245000BA06F701E00FF11F8083B3940B2D10E053 +:102460000C151D05A0F3E0910129F0910229C70187 +:10247000099584E6A096CDBFDEBFDF91CF911F9175 +:102480000F91FF90EF90DF90CF90BF900895A8013B +:1024900060E270E0CE0101967C010E9418078C1565 +:1024A0009D0509F38AECE6CFCE0101967C01DBCFD6 +:1024B00020910629211107C020E3FC012083FC01A3 +:1024C000118285E6089521E3FC012083FC0111823D +:1024D00085E60895FC012181211105C080818133A9 +:1024E00041F0803311F08AEC08951092062984E6B9 +:1024F000089581E08093062984E6089586ED99E0A9 +:1025000098D18EE6089581E79BE0AED18EE60895DE +:10251000E0ECF4E081818E7F81830E94A4280E94F8 +:10252000D40584E60895E0ECF4E081818E7F818318 +:102530000E94A4280E94DB0584E60895E3E0F9E206 +:1025400021812F9320812F932DED36E03F932F9300 +:1025500021E02F931F929F938F930E94372C8DB76A +:102560009EB708968DBF9EBF85E6089520910529E8 +:102570001F922F932AED36E03F932F9321E02F9364 +:102580001F929F938F930E94372C8DB79EB708960A +:102590008DBF9EBF85E6089560E071E0D8D985E6DD +:1025A000089540E051E0BC0180E031DA85E608950D +:1025B000BC0180E048DA811102C08AEC0895B1DBE9 +:1025C00084E6089560E071E0C2D985E6089540E0B0 +:1025D00051E0BC0181E01BDA85E60895BC0181E091 +:1025E00032DA811102C08AEC08959BDB84E60895FB +:1025F00060E071E006DD85E6089540E051E0BC0151 +:1026000080E28EDD85E60895BC0180E2A6DD8111C1 +:1026100002C08AEC089585DB84E6089560E071E0ED +:10262000F0DC85E6089540E051E0BC0180E178DD12 +:1026300085E60895BC0180E190DD811102C08AEC3D +:1026400008956FDB84E6089560E071E03ADB85E68B +:10265000089560E071E027DB85E60895FFDA8111D7 +:1026600002C08AEC08955DDB84E6089524ED36E02F +:102670003F932F932CEC36E03F932F9326EC36E0DC +:102680003F932F9321E02F931F929F938F930E944C +:10269000372C8DB79EB70A968DBF9EBF85E60895ED +:1026A000CF93DF93EC0177DA9F938F9323EC36E09F +:1026B0003F932F9381E08F931F92DF93CF930E94DC +:1026C000372C8DB79EB708968DBF9EBF85E6DF91EC +:1026D000CF910895CF93DF93EC016BEB76E00E94EE +:1026E000FF2B892B81F065EB76E0CE010E94FF2B5A +:1026F000892B21F08AECDF91CF91089537DA84E6B7 +:10270000DF91CF9108958EE99DE0AED08EE6DF9106 +:10271000CF91089560E071E0CEDB85E60895D2DBCD +:10272000811102C08AEC0895FCDA84E608950E94C3 +:10273000940784E60895DF92EF92FF920F931F9320 +:10274000CF93DF937C01CFEFD0E003E018E08CE281 +:10275000D82EB80180E990E20E94FF2B892B39F135 +:10276000F8014491442379F1C132D10560F1D701D8 +:10277000F80104C0C032D10551F0DC01CD01019651 +:102780009C014C933196219744914111F3CF7901EB +:102790008FEFE81AF80AF901D08221970A5E1F4FDD +:1027A000B80180E990E20E94FF2B892BC9F6D7017E +:1027B00011971C9285E6DF91CF911F910F91FF90A9 +:1027C000EF90DF9008959701E2CFFC012091200265 +:1027D0002068209320022091230220FFFCCF81E07B +:1027E00080932302A0911002B0911102AE5BB10957 +:1027F000B7FD1CC029E637E54BE050E00E94802B76 +:10280000AA27BB279F938F932EEA36E03F932F93FF +:1028100081E08F931F92FF93EF930E94372C8DB727 +:102820009EB708968DBF9EBF85E60895A0E0B0E0F4 +:10283000E1CF21E02093A9282093A8282CE320931E +:10284000A52825E030E02093A3283093A4281092F7 +:102850009D2810929E2810929F281092A028809365 +:102860009B2890939C28089527E02093A9282CE288 +:1028700031E02093A3283093A42810929D28109231 +:102880009E2810929F281092A02880939B289093B6 +:102890009C280895CF934091A92850E0FA013197E0 +:1028A000E930F10520F0C0E08C2FCF910895E25B74 +:1028B000FE4F0C947A2B2091A7289091A8282917D5 +:1028C00009F4EAC030E0892F90E001972817390712 +:1028D00009F42DC168E181E090E20E94F52910928F +:1028E000A928C1E08C2FCF910895853109F47FC0CC +:1028F0008B3109F478C0883109F410C1863009F4AD +:1029000078C0853109F449C0C1E08C2FCF9108957A +:10291000813009F40EC1843009F400C18831F9F224 +:102920008B31E9F2C1E0F1CF8093A72884E0809356 +:10293000A928C1E08C2FCF91089590E04091A7285D +:102940002FEF30E0241B310982179307E1F485E073 +:102950008093A928C1E0A8CF4091A1285091A22836 +:102960009A012F5F3F4F2093A1283093A228FA01AC +:10297000E45CF64D80832038310531F686E08093A3 +:10298000A928C1E091CF65E181E090E20E94F5299C +:1029900082E08093A928C1E087CF61E081E090E2E6 +:1029A0000E94F5296091A82881E090E20E94F52913 +:1029B0006091A828609581E090E20E94F52960E886 +:1029C00070E08CE399E23ADCECE3F9E260E08191BB +:1029D000680F29E2EC3BF207D1F781E090E20E9418 +:1029E000F529C1E092CF1092A928C1E08ECF1092B4 +:1029F000A8288091A8288F5F8093A82840919D28BF +:102A000050919E2860919F287091A028E0919B286A +:102A1000F0919C2820E830E08CE399E20995C82FDA +:102A2000882309F491C061E081E090E20E94F529D9 +:102A30006091A82881E090E20E94F5296091A82881 +:102A4000609581E090E20E94F52960E870E08CE3F7 +:102A500099E2F4DBECE3F9E260E08191680F89E24E +:102A6000EC3BF807D1F781E090E20E94F529409114 +:102A70009D2850919E2860919F287091A0284058D1 +:102A80005F4F6F4F7F4F40939D2850939E286093D8 +:102A90009F287093A02808CFECE3F9E290E0219101 +:102AA000920F29E2EC3BF207D1F789136CCF4091EA +:102AB0009D2850919E2860919F287091A028E091B8 +:102AC0009B28F0919C2820E830E08CE399E209955E +:102AD000C82F882309F442C08091A8288F5F809373 +:102AE000A82840919D2850919E2860919F28709120 +:102AF000A02840585F4F6F4F7F4F40939D285093C1 +:102B00009E2860939F287093A02866E081E090E261 +:102B10000E94F52982E08093A928C6CE66E081E074 +:102B200090E20E94F5291092A928C1E0BDCE66E08E +:102B30002BCF1092A1281092A2281092A62883E0F1 +:102B40008093A928C1E0B0CE64E081E090E20E94C9 +:102B5000F52989E08093A928C1E0A6CE68E181E04B +:102B600090E20E94F529B6CE8091A928813099F093 +:102B7000873081F48091A3289091A4289C01215052 +:102B800031092093A3283093A428892B11F41092A3 +:102B9000A928089508958091A3289091A4289C01C4 +:102BA000215031092093A3283093A428892B89F739 +:102BB0008091A5289FEF980F9093A528811109C0B7 +:102BC0001092A92885E090E08093A3289093A428F0 +:102BD000089565E181E090E20E94F529F3CFEF923C +:102BE000FF920F931F93CF93DF931F92CDB7DEB762 +:102BF0009FEB980F9A3128F09FE9980F9A31E0F4F3 +:102C000080522091AA283091AB282F3F310558F4EB +:102C1000A9014F5F5F4F4093AA285093AB28F90159 +:102C2000E45CF64D808381E00F90DF91CF911F919E +:102C30000F91FF90EF90089590ED980F9A3008F360 +:102C40008F35F9F2982F9D7F9D33D9F28D30A9F001 +:102C5000883039F08B3139F71092AA281092AB28BE +:102C6000E2CF8091AA289091AB280097E1F20197DA +:102C70008093AA289093AB28D6CFE091AA28F09110 +:102C8000AB28E45CF64D10821092AA281092AB2873 +:102C900080913C29882331F18D7F8D3319F1EDE34B +:102CA000F9E204C02F3331F02D3321F08F0121914F +:102CB0002111F8CFF801108283E0E82E88E0F82E89 +:102CC000B7018CE399E229830E94FF2B2981892B8C +:102CD00009F443C0F6E1EF0EF11C81EDE81689E03E +:102CE000F80671F788EC10E0EDE3F7E0E4918E1759 +:102CF00009F470C0EEE5F7E0E4918E1709F467C0BF +:102D0000EFE7F7E0E4918E1709F45EC0E0EAF7E040 +:102D1000E4918E1709F455C0E1ECF7E0E4918E17C9 +:102D200009F44CC0E2EEF7E0E4918E1709F43BC0E1 +:102D300080E090E06FDA8AE397E06CDA112309F41F +:102D400072CF80913C29882309F46DCF8CE399E2FE +:102D50005CDA87E397E05EDA66CF10923C292F3386 +:102D6000B9F02D3309F439C0222319F089EC11E0B0 +:102D7000BBCF9701205F3F4FF90145915491411519 +:102D80005105A1F38CE399E2FA01099511E0ACCF6A +:102D900097012C5E3F4FF901459154914115510522 +:102DA00089F789ECE4CF25E030E041E2429FC001A1 +:102DB000439F900D1124825C984FBCCF24E030E0FB +:102DC000F4CF23E030E0F1CF22E030E0EECF21E09D +:102DD00030E0EBCF20E030E0E8CF97012E5E3F4FB0 +:102DE000F901459154914115510509F4BFCFC8012E +:102DF0000196FA01099511E077CF0895A0E2B6E0B7 +:102E000082E011968C93119715968C9315978CE30D +:102E10009AE28093B8289093B9288CEB9AE2809339 +:102E2000B6289093B7281092B1281092B02810922B +:102E3000AC281092B4281092B5281092AF28E0E484 +:102E4000F8E010A211A28DE291E086A397A38FEF84 +:102E50009FEF80A791A781E0808388E8838383E048 +:102E6000878384E01A968C93E8E4F0E08081817F88 +:102E70008660808308951F920F920FB60F921124DF +:102E80008F939F93EF93FF93E8E4F0E08081817F3D +:102E90008083E0E4F8E0138286E990E086AB97ABAC +:102EA0008AE190E080AF91AFE0E4F9E010A211A2D6 +:102EB0008FEF9FEF86A397A389E883838EE08083BB +:102EC000E0E2F6E01286FF91EF919F918F910F90D3 +:102ED0000FBE0F901F9018951F920F920FB60F9272 +:102EE00011242F933F934F938F939F93EF93FF93CF +:102EF000909128068091B028957021E009F020E09B +:102F0000880F822B8093B0289091AC289923C1F12F +:102F1000982F9770973009F448C0982F9C7081F1D2 +:102F200082FB882780F991E089278093AE289091D1 +:102F3000AF2891117FC09091B1289695882309F40C +:102F400083C020E8292B2093B1288091B428909148 +:102F5000B52801968093B4289093B5288770992757 +:102F6000892B71F4E091B828F091B928CF0101962E +:102F70008093B8289093B928208381E08093AF286C +:102F80008091AC2891E089278093AC2888E88093D1 +:102F90004308FF91EF919F918F914F913F912F9116 +:102FA0000F900FBE0F901F9018951092400880E16F +:102FB00080934C08109243098091AE288823E9F150 +:102FC0008CEB94E080936609909367091092AD288A +:102FD00081E080934C0983E0809346098091B42876 +:102FE0009091B528877011F19091B128969522E0C3 +:102FF000280F8730B1F0969543E0480F283088F4C9 +:10300000969534E0380F483060F4969525E0280F07 +:10301000383038F49695283020F49695813009F4AC +:103020009695E091B828F091B928908381E080933B +:10303000BA28A6CF1092AF28A3CF8CE794E0809354 +:10304000660990936709C2CF20E07CCF1F920F9250 +:103050000FB60F9211242F933F938F939F93AF93AB +:10306000BF93EF93FF938091AD2890E08B30910553 +:1030700080F5FC01E95AFE4F0C947A2BE091B628BA +:10308000F091B72880818111ACC080E4809345061F +:103090002091B2283091B3288091B4289091B5281E +:1030A0002817390709F46CC03196E093B628F093DD +:1030B000B728E091B828F091B928CF010196809304 +:1030C000B8289093B92881818093B12884E08093B7 +:1030D000AD28FF91EF91BF91AF919F918F913F915B +:1030E0002F910F900FBE0F901F9018958FE390E0D7 +:1030F00080936609909367098EE08093000880E4CE +:103100008093450683E08093AD28E3CF80E48093ED +:10311000460684E08093AD28E091B828F091B92864 +:1031200080818093B128D5CF8091B12880FD64C083 +:1031300080E48093460685E08093AD28CACF8091D5 +:10314000B12890E480FD55C0909345068695809304 +:10315000B1288091B2289091B32801968093B2282B +:103160009093B3289C0127703327232B09F448C080 +:103170002091B4283091B5288217930709F0A6CF83 +:1031800088E08093AD28A5CFE091B628F091B728CC +:10319000808181112AC080E48093460687E0809375 +:1031A000AD2897CF80E48093460689E08093AD28D0 +:1031B00090CF80E4809346068AE08093AD2889CF43 +:1031C00010924009109246091092000881E0809305 +:1031D000BB287FCF8FE790E08093660990936709C3 +:1031E00078CF80E48093460653CF80E480934506F1 +:1031F000D5CF90934606AACF80E4809345069BCF17 +:1032000086E08093AD2865CFCF93DF93E0E4F6E0CE +:1032100084E08283128AC0E8D1E082E68E83A0E255 +:10322000B6E085E012968C93129781E052968C93CB +:10323000529782E050968C9350971A961C921A9748 +:1032400083E019968C939AE5988398E5998390E4A6 +:103250009183968381838683E0E0F8E08FE090E0BD +:1032600086A397A388E090E082A793A783E2818357 +:10327000DF91CF91C3CD0F931F93CF93DF938091B5 +:10328000BA288823C1F01092BA2882E080932106E0 +:10329000809326060091B4281091B52801151105D8 +:1032A00099F4E091F928F091FA28099510924009D3 +:1032B00010924609A3DD8091BB2881115AC0DF918D +:1032C000CF911F910F910895A801495F5F4F5695C7 +:1032D00047955695479556954795E0910729F09162 +:1032E00008296CE37AE280E2099563E186E00E94B6 +:1032F000F10FE091FD28F091FE28B8018CE39AE2ED +:1033000009958C0194FF3CC01F7E0115110571F2D7 +:10331000A801495F5F4F5695479556954795569535 +:103320004795E0910729F09108296CE37AE281E260 +:10333000099563E187E00E94F10F0093B428109390 +:10334000B5281092B2281092B3288CE39AE28093A9 +:10335000B8289093B9288CEB9AE28093B628909382 +:10336000B72881E08093AD288091BB28882309F499 +:10337000A6CF1092BB28DF91CF911F910F913ECD28 +:10338000AC015695479556954795569547954115E5 +:10339000510509F4BACF90E020E030E0F901E45C97 +:1033A000F54D8081082E82958025082E869586957C +:1033B0008025E058FF4F8F5F86958170C82F80E091 +:1033C000D82F81E0C827C0839F5F292F30E02417C2 +:1033D000350720F39DCF81E08093BD28089581E0DB +:1033E0008093BD2808950895FF920F931F93CF9364 +:1033F000DF9300D000D0CDB7DEB78C01FC01908107 +:103400008091BD28823009F45BC0D8F0843009F483 +:103410003EC030F18530C9F460E170E0C8013CD7AE +:10342000882309F486C080910629882309F48AC07C +:1034300084E08093BD288AE0F801808384E090E0F6 +:1034400006C09632D1F09235C1F080E090E024962B +:10345000CDBFDEBFDF91CF911F910F91FF900895F7 +:10346000963259F0923549F0953909F478C081E0E7 +:103470008093BD2880E090E0EACF84E4F801808367 +:10348000118282E08093BD2880E190E0E0CF963207 +:10349000A1F3923591F3903309F48DC0923A09F477 +:1034A000B9C0903A09F4D3C0903509F7F801818189 +:1034B000882309F4DEC0F801108284E090E0C7CFD1 +:1034C0009632D9F29235C9F2933989F619821A8265 +:1034D0001B821C8288E8898343E050E060E070E052 +:1034E000CE0102960E946207F8018181803209F4C0 +:1034F00081C0803709F0A9CFF801928189819813A2 +:10350000A4CF93818A819813A0CF94818B81981343 +:103510009CCF95818C81981398CF84E0808361E063 +:1035200070E0C8018BD683E08093BD2888E190E0ED +:103530008ECF84E08093BD2881E0F801808384E011 +:1035400090E085CF6091BC2870E0660F771F660F12 +:10355000771F44E050E0C8010E947A0769CF44E039 +:1035600050E064E070E0CE0101960E946207F8012D +:103570008181803209F43EC0803709F066CFF801BE +:1035800092818981981361CF93818A8198135DCF4D +:1035900094818B81981359CF95818C81981355CF45 +:1035A000108261E070E0C80149D684E08093BD28B4 +:1035B00088E190E04CCFF801F18062E070E0C80152 +:1035C0006BD6882309F4B8CFFFE0FF1508F473CF5A +:1035D0006F2D70E0660F771F660F771F40E150E098 +:1035E000C8010E94620760E170E0C80127D680E947 +:1035F00090E02DCF8981F80180833A8131832B813E +:1036000022839C819383832782278927848388E26E +:1036100090E01DCFF801F18066E070E0C8013CD673 +:10362000882309F489CF8EEF8F0D8E3008F043CFB9 +:10363000809106298111FFCEF4E0FF9EB001112494 +:1036400044E050E0C80102960E947A07F4CEF801E7 +:10365000F18062E070E0C8011FD6882309F46CCFC6 +:103660008EEF8F0D8E3008F026CFF092BC2885E0CB +:10367000E0CE62E070E0C8010FD6882309F45CCF89 +:103680001092BD2880E090E0E2CECF93DF93EC0172 +:1036900043E050E060E070E00E94620744E050E0E8 +:1036A00064E070E0CE010396DF91CF910C94620745 +:1036B0000F931F93CF93DF9300D0CDB7DEB78C016C +:1036C000FC0180819181892798E889279281892747 +:1036D0008A83848193818927958189279681892787 +:1036E000898343E050E060E070E0C8010E947A07FF +:1036F00041E050E063E070E0CE0102960E947A075C +:1037000044E050E064E070E0C80103960E947A074C +:1037100041E050E068E070E0CE0101960E947A0737 +:103720000F900F90DF91CF911F910F91089581E03D +:103730008093DB2884E090E08093C0289093C12898 +:1037400088E08093BF281092BE28089581E080937E +:10375000DB2884E490E08093C0289093C12888E01F +:103760008093BF2881E090910529973009F080E08F +:103770008093BE28089581E08093DB2882E090E06A +:103780008093C0289093C12888E18093BF2810922D +:10379000BE28089581E08093DB28089508957F92E4 +:1037A0008F929F92AF92BF92CF92DF92EF92FF9251 +:1037B0000F931F93CF93DF93CDB7DEB72E97CDBF77 +:1037C000DEBF8C014091DB2850E04D30510598F070 +:1037D00080E090E02E96CDBFDEBFDF91CF911F91AC +:1037E0000F91FF90EF90DF90CF90BF90AF909F90A0 +:1037F0008F907F900895FA01EE59FE4F0C947A2B2A +:103800007C01D12CF701C080EFD68C25D7018D9398 +:103810007D01D394B2E1DB12F5CF60E170E0C80125 +:103820003BD5882309F433C280910629882309F403 +:10383000A8C1EDD69AE09827D8019C9317C07C01C7 +:1038400056E0D52ED701CC90CFD68C25F7018193A9 +:103850007F01DA94B9F764E070E0C8011DD58111E9 +:10386000FCC1D5D691E09827D8019C9388E080933D +:10387000DB2884E090E0AECF2091C0289091C12851 +:10388000D8018C91863209F45BC1823509F458C1A4 +:10389000803409F09DCF82E08093DB288AE0D80154 +:1038A0008C9384E090E096CFFC018081982F9D7FDF +:1038B000913409F458C1803309F485C1803A09F480 +:1038C00029C4803509F084CFF8018181882309F467 +:1038D00025C2D8011C9284E090E07CCF2091C028C2 +:1038E0009091C128F8018081863209F432C1823575 +:1038F00009F42FC1853909F01EC144E050E063E0AE +:1039000070E0CE0101960E9462079091BF28F801F5 +:103910008181803209F4D1C3803709F059CFF80191 +:1039200022818981281354CF23818A81281350CF83 +:1039300024818B8128134CCF25818C81281348CF7B +:10394000908361E070E0C80179D486E08093DB2841 +:1039500088E190E03FCF60E170E09ED4882309F4D5 +:1039600007C180910629882309F4E0C18AE0F801A3 +:10397000808301C114D67801B4E0EB0EF11CB12CA8 +:10398000F701A08031D68A25D7018D937D01B394AC +:10399000B4E0BB12F5CFF80194818091D328981739 +:1039A00009F41DC181E08093DB2880E090E012CF14 +:1039B0006C01E4E0BE2ED601AC9016D68A25F60145 +:1039C00081936F01BA94B9F7D8018C91803309F4CF +:1039D000BCC1803A09F4F3C1803C09F430C2813C97 +:1039E00009F4C7C2823C09F4D8C0803B09F4D8C2AC +:1039F00080568230B8F662E070E0C8014DD488236A +:103A000009F4A0C1F80181818C739081903609F48A +:103A1000A1C36AE370E07B01F0E18F9FE00CF11C31 +:103A200011244E0137E0830E911C64E0C4010E9412 +:103A3000BD068091BE285E01882309F480C38BE017 +:103A4000A80EB11C44E050E063E070E0C5010E94A4 +:103A5000620746E050E0B701CE0101960E9462077E +:103A60008F819885A985BA858093D3289093D4288F +:103A7000A093D528B093D62860E470E083ED98E257 +:103A8000D9D5C090D328D090D428E090D528F090F4 +:103A9000D628C092D728D092D828E092D928F09280 +:103AA000DA2860E270E087ED98E2C4D5A401B501A0 +:103AB000CE010196A7D48F819885A985BA85F80192 +:103AC00080839183A283B38387E08093DB2880E2A5 +:103AD00090E080CE2091C0289091C128D8018C918F +:103AE000863271F1823561F1803509F412C190EAB4 +:103AF000980F923008F46DC2982F9F77903331F071 +:103B0000803A21F0805C833008F04CCF81E08093D4 +:103B1000DB2884E0D8018C9390E05CCE2091C02813 +:103B20009091C128F8018081863299F0823589F020 +:103B3000833909F4B2C01092DB2880E090E04ACECD +:103B4000F8012083918384E08093DB2880E190E07A +:103B500041CED8012C9311969C9384E08093DB286E +:103B600080E190E037CE8AE0808384E090E032CE3E +:103B700081E0D8018C9382E08093DB2884E090E0A0 +:103B800029CE6091D228E0E16E9FB001112440E17E +:103B900050E0C8010E947A074CCE62E070E0C80194 +:103BA0007BD3882309F4ADC0F80181818093D228AA +:103BB0008CE08093DB282BD59AE09827D8019C9342 +:103BC00084E090E007CE62E070E0C80165D3811127 +:103BD000CFC281E0F801808384E090E0FBCD958145 +:103BE0008091D4289813DECE96818091D5289813A1 +:103BF000D9CE97818091D6289813D4CE780107ED3D +:103C000018E25F01F0E8AF0EB11C4801D8017D90C9 +:103C10008D01EAD48725F70181937F01D4019C901F +:103C2000092C92949024092C969496949024B8D3BD +:103C3000939491FACC24C0F8D12CB1E0CB268C25FA +:103C4000F50181935F01F8E20B3D1F07F1F688E073 +:103C50008093DB2880E290E1BDCD6091D228F0E135 +:103C60006F9FB001112440E150E082EC98E20E9485 +:103C700062072091C2288091C6288095281709F4F0 +:103C8000EBC0C5D496E09827F8019083EFCDBFD460 +:103C900091E09827F8019083E9CD8091BE28882390 +:103CA00009F49FC043E050E060E070E0CE0102966E +:103CB0000E94620788E88983F8019181903209F4B3 +:103CC0001BC2903709F084CDF8018281883809F051 +:103CD0007FCD93818A8198137BCD94818B819813BA +:103CE00077CD95818C81981373CD84E0808361E0DA +:103CF00070E0C801A3D285E08093DB2888E190E0E2 +:103D000069CD85D491E09827F801908384E090E014 +:103D100061CDD80111968C918111DBCD62E070E00C +:103D2000C801BAD2882309F454CF05CF6091D228B4 +:103D3000B0E16B9FB001112440E150E0C8010E9446 +:103D40007A0714CE64D491E038CF62E070E0C80105 +:103D5000A3D28823B1F2F8016181F0E16F9FB00135 +:103D6000112440E150E0C8010E94620760E170E068 +:103D7000C80164D2680130E8C30ED11C72E1A72EDD +:103D8000D801BC9031D48B25F80181938F010B2C85 +:103D9000B294B0240B2CB694B694B02401D3B3944F +:103DA000B1FAEE24E0F8F12CF1E0EF268E25D601F1 +:103DB0008D936D01AA9421F780E990E10BCD62E02B +:103DC00070E0C80169D2882309F4BCCFD8011196EC +:103DD0008C918093D22889E08093DB2818D49AE0D4 +:103DE00092CF44E050E060E070E0CE0101960E9486 +:103DF00062079091BF28D80111968C91803209F406 +:103E00006BC1803709F0E4CCD80112962C9112973F +:103E100089812813DDCC13962C9113978A8128135E +:103E2000D7CC14962C9114978B812813D1CC15964E +:103E30002C9115978C812813CBCC9C9382CD62E07A +:103E400070E0C80129D2882309F45BCFF801818191 +:103E50008093D2288BE0ADCE8091CA28281311CF51 +:103E6000E091C3288091C7288095E8130ACF8091FC +:103E7000CB28E81306CF8091C4289091C82890954C +:103E80008913FFCE9091CC288913FBCE3091C528A1 +:103E90009091C92890953913F4CE9091CD2839137B +:103EA000F0CE4091CE289091CF2890954913E9CE3D +:103EB0009091D0284913E5CE9091D128909549133F +:103EC000E0CED8019C911196FC91119712964C91DD +:103ED000129750E060E070E0BA01552744275F2B4D +:103EE000492B13969C91792B90E0A0E0B0E0DC0187 +:103EF000992788279E2B822BB32B2091DB282B30F0 +:103F000009F4D6C02A3021F4840F951FA61FB71FCD +:103F10008093C228C92EDA2EEB2EFF24C092C3282C +:103F20008D01222733270093C4284B2F552766275E +:103F300077274093C528E82FE095E093C628EC2D1D +:103F4000E095E093C728E02FE095E093C828E42FA0 +:103F5000E095E093C9288093CA28C092CB280093AB +:103F6000CC284093CD2888E08093DB2880E090E047 +:103F700031CC62E070E0C8018FD1882309F4E2CE31 +:103F8000D80111968C918093D2286AE0F62EF09297 +:103F9000DB283DD38F25F801808384E090E01ACCA4 +:103FA00062E070E0C80178D1882309F4CBCE80911B +:103FB0000629811113CFD80111966C91B0E16B9F46 +:103FC000B001112440E150E082EC98E20E947A07AF +:103FD00005CF62E070E0C8015FD1882309F4F9CD14 +:103FE000F80121812C738081803609F4D4C08AE3E2 +:103FF00090E07C01F0E12F9FE00CF11C11244E01B8 +:1040000037E0830E911C64E0C4010E94BD068091DC +:10401000BE285E01882309F4A0C08BE0A80EB11C65 +:1040200044E050E063E070E0C5010E94620746E0B2 +:1040300050E0B701CE0101960E9462078F819885FA +:10404000A985BA858093D3289093D428A093D528A6 +:10405000B093D62860E470E083ED98E2EBD28091D3 +:10406000D3289091D428A091D528B091D6288093B8 +:10407000D7289093D828A093D928B093DA2860E263 +:1040800070E087ED98E2D6D287E08093DB288F81BD +:104090009885A985BA85F80180839183A283B3832B +:1040A000A401B501CE010196ADD180E290E092CBA2 +:1040B000841B950BA60BB70B2BCF898180833A818C +:1040C00031832B8122839C819383832782278927B5 +:1040D000848388E290E07ECB8981F80180833A81F5 +:1040E00031832B8122839C81938383278227892795 +:1040F000848388E290E06ECB80833A8131839B8118 +:1041000092832C812383932798279227948388E294 +:1041100090E060CB62E070E0C801BED0882309F473 +:1041200058CDD80111968C9111978093D22883E0B5 +:104130008093DB288AE08C9384E090E04BCB9BE07B +:10414000A90EB11C44E050E060E070E0C5010E949F +:1041500062077FCC60E370E05ECC9BE0A90EB11CEF +:1041600044E050E060E070E0C5010E9462075FCF6C +:10417000D80111966C91B0E16B9FB001112440E120 +:1041800050E0C8010E94620760E170E0C80156D0AB +:1041900080E990E01FCB80E390E02BCFCF93DF93BB +:1041A000EC018091BE28811109C044E050E060E03C +:1041B00070E0CE01DF91CF910C94620743E050E0B4 +:1041C00060E070E0CE010E94620744E050E063E0EE +:1041D00070E0CE010396DF91CF910C946207CF93EC +:1041E000DF931F92CDB7DEB72091BE2821111BC0EF +:1041F000FC0121813081232732812327338123272A +:10420000298344E050E060E070E00E947A0741E0DA +:1042100050E064E070E0CE0101960E947A070F90B2 +:10422000DF91CF9108954091052950E060E070E062 +:104230000E947A070F90DF91CF910895FC016115DC +:10424000710539F1680F791F23E633E64191422762 +:1042500050E1459FC0011124A42FA8278A2F90E088 +:10426000582F4427880F991F880F991F880F991F6F +:1042700048275927232F332724273527A295AF70A6 +:104280002A27E617F70711F7922F832F9083818350 +:10429000089583E693E6FACFFC0161157105A9F153 +:1042A000680F791F23E633E64191422750E1459F8D +:1042B000C0011124A42FA8278A2F90E0582F44274B +:1042C000880F991F880F991F880F991F4827592712 +:1042D000232F332724273527A295AF702A27E617E7 +:1042E000F70711F7A9015527808190E084179507FA +:1042F00011F080E00895418150E0232F332781E0C1 +:1043000042175307B9F380E0F5CF43E650E023E6C8 +:1043100033E6EACFCF93B091DF28C091E0284091F7 +:10432000E128A091DC28F091DD28E091DE289C2F87 +:1043300090712B2F217E9227242F207292272A2FD3 +:10434000247992272F2F237792272E2F2A739227B3 +:10435000392F32953F703927232F2695269523270D +:10436000922F969550E060E070E0BA0155274427FF +:104370005C2B4B2B769567955795479592279170B7 +:1043800098136068A093DF28F093E028E093E12879 +:104390004093DC285093DD286093DE28CF91089568 +:1043A000CF93DF93A091DD28EA2FEF70F0E0E05C7F +:1043B000FF4DC091DC28C295CF70D0E0C05CDF4DCE +:1043C000E0898881E82BA295AF70B0E0A05CBF4D7A +:1043D00090968C91E82BA091DE28CA2FCF70D0E068 +:1043E000C05CDF4D88A9E82BA295AF70B0E0A05863 +:1043F000BF4D8C91E82BF0E0E05EFF4D8081DF91B6 +:10440000CF910895AF92BF92CF92DF92EF92FF9239 +:104410000F931F93CF93DF935B01EA01DC011196A9 +:104420004FED58E26CED78E2CD010197FC0120815F +:104430008C9130E0382B20FFB0C000E421FFABC0EE +:1044400010E4C9019695879596958795302F306829 +:1044500080FF302F212F206881FF212F969587958F +:104460009695879536952695132F106880FD312FE8 +:10447000122F106881FD212F969587959695879527 +:1044800036952695132F106880FD312F122F106856 +:1044900081FD212F9695879596958795369526953A +:1044A000132F106880FD312F122F106881FD212FEE +:1044B000969587959695879536952695132F10682E +:1044C00080FD312F122F106881FD212F9695879541 +:1044D0009695879536952695132F106880FD312F78 +:1044E000122F106881FD212F9695879596958795B7 +:1044F00036952695032F0068122F106880FD302F07 +:10450000FA013193AF0181FD212FFB012193BF01FE +:104510001296F8E2423E5F0709F086CFF5018181ED +:1045200099818927C2809A81C926D12CE12CF12C4E +:104530007601DD24CC24D82A808198818927C82A55 +:1045400083819B818927F82A10E22ADF082F8C2D8E +:104550008170E0DEF694E794D794C794002311F0BD +:104560006894F7F8115089F788818C2588838981B0 +:104570008D2589838A818E258A838B818F258B83E4 +:10458000DF91CF911F910F91FF90EF90DF90CF902F +:10459000BF90AF90089510E054CF00E04FCFCF927E +:1045A000DF92EF92FF92CF93FC018181C280D12CE8 +:1045B000E12CF12C7601DD24CC24D82A8081C82A74 +:1045C0008381F82AC0E2ECDE9C2D91708927A2DE5F +:1045D000F694E794D794C794C150A9F7CF91FF9070 +:1045E000EF90DF90CF9008951F93CF93DF93D8E0A3 +:1045F000C0E0D6DE182F80E08DDEC6951111C068B0 +:10460000D150B9F78C2FDF91CF911F9108951F934F +:10461000CF93DF93D4E0C0E0C3DE182F80E07ADED2 +:10462000C6951111C860D150B9F78C2FDF91CF9189 +:104630001F9108958F929F92AF92BF92CF92DF9277 +:10464000EF92FF920F931F93FC01CB010197672B11 +:10465000B1F1B281A0818180038102C0A42FBC2D61 +:104660002B2F2D72322F32953F703227232F269514 +:1046700026952327322F3695402F50E060E070E0DA +:10468000742F66275527442758294A2B6B2B76957C +:10469000679557954795322730FD7068852E962E81 +:1046A000A72EBB246B01EE24FF24072F11272227FE +:1046B0003327019798F640838182C28203831F913A +:1046C0000F91FF90EF90DF90CF90BF90AF909F90B1 +:1046D0008F9008950F931F93CF93DF93CDB7DEB7DD +:1046E000EA97CDBFDEBF01E41BE2F7D2F801819368 +:1046F0008F01FBE209341F07C1F70E9495116BD3AC +:10470000882349F03091412B2091422B822F90E059 +:104710008A30910568F05FD3882311F075D3A0D358 +:10472000EA96CDBFDEBFDF91CF911F910F91089523 +:10473000FC01E159FE4FDEC73111EDCF8091432BD3 +:10474000823048F761D38091432B80933C2B93D4E4 +:1047500080913C2B882309F4D1C084E08093402BC6 +:104760000E949111D8CF3038B1F64ED380913C2BB6 +:10477000C4D28BD280D4CFCF3058323060F6809103 +:10478000432B9091442B8C3DE3E09E0709F488C0B5 +:10479000AE014F5F5F4F6091452B0E944C058C012D +:1047A000009709F4B8CF30D3B80189819A81C1D17B +:1047B00085D2B1CF3111AFCF1091432B1F7724D3C6 +:1047C0005AD4E4D28823E9F31093C304111166C0CC +:1047D00082E08093402B9FCF332309F44BC03230CB +:1047E00009F099CF8091432B811124C01091452B62 +:1047F0001F7009F490CF812F90D28091422B83308B +:1048000009F486C0A0914B2BB0914C2B11968C9142 +:1048100011978B7F11968C9324E8129FF00111243D +:10482000E157F44D1082E0914B2BF0914C2B80819D +:104830008E7F808380E071D2E7D21DD46CCF303878 +:1048400029F1323809F067CF8091452B8F7065D2FE +:10485000E0914B2BF0914C2B118112FB112710F999 +:1048600080E05BD2D1D2812F48D280E046D20DD2F7 +:1048700002D451CF8091432B813009F04CCF81E09D +:10488000233009F080E080933E2BD4CF10913D2B54 +:1048900080913E2B882331F31260E4CF83E099CFDF +:1048A00083E08A838AE389835FB7F894DE011396F5 +:1048B00020E038E042E007C090E0C7968D939D93DA +:1048C0002F5F2C3191F04093CA01E32FF0E08491E7 +:1048D0001092CA0120FF03C082958F703F5F8F70D6 +:1048E0008A3050F790E0C096E9CF5FBF8DD26AE37F +:1048F00070E0CE01019688D0E1D10DCF8091C30444 +:10490000882321F084E08093402B2ACF81E0FBCFE5 +:10491000A7D290CF0895CF938091402B811102C0F0 +:10492000CF910895C0914D2B80E0F7D154D28111E1 +:1049300003C08C2FCF91F1C1CDDE8C2FCF91EDC173 +:10494000CF92DF92EF92FF920F931F93CF93DF935B +:104950008C01EB017A01A5D3811125C0E114F1048A +:1049600081F1F70180819181C81BD90B080F191FB4 +:10497000209709F43BC0C12CD12C2091492B3091B8 +:104980004A2BF901EF5BFF4F908131978081981797 +:1049900078F17BD1C0DFF701808191818C0D9D1D65 +:1049A0008083918385E0DF91CF911F910F91FF90DC +:1049B000EF90DF90CF90089568D1ADDF72D3811171 +:1049C000F2CF209799F02091492B30914A2BF90191 +:1049D000EF5BFF4F908131978081981768F7F8015E +:1049E00081918F018AD12197209769F780E0DBCFF1 +:1049F000F80181918F0181D1FFEFCF1ADF0ACC1529 +:104A0000DD0509F0BACFF2CFCF92DF92EF92FF929D +:104A10000F931F93CF93DF936C018B0180914D2BEC +:104A200080687BD1C091472BD091482BC017D1070C +:104A300028F00115110509F46FC0E80110E0209776 +:104A400039F511110CC02FC0853091F1C4D18111FD +:104A500031C0A8D1811127C099D181112DC0809179 +:104A6000402B8111F1CF82E0DF91CF911F910F9107 +:104A7000FF90EF90DF90CF9008958530C9F0ABD1D3 +:104A8000811118C08FD181110EC080D1811114C045 +:104A90008091402B8111F1CFE6CF8091402B88236C +:104AA00011F3853029F07ED18823B9F380E0DCCF83 +:104AB00083E0DACF81E0D8CF80914D2B87FD30C0E5 +:104AC0002091492B30914A2BF901E05CFF4FE080A7 +:104AD00031968081F12CE81AF1082097A9F088E03E +:104AE000E816F10488F4860104C088E0E816F104B1 +:104AF00059F0F80181918F0100D168012197FFEFF2 +:104B0000EF1AFF0A209789F711E0E8E0EE16F104AA +:104B100009F010E0BAD093CFB8D0C0E0D0E08ECF8B +:104B2000E091492BF0914A2BEF5BFF4FE080F12C95 +:104B3000D4CFDF92EF92FF920F931F93CF93DF9327 +:104B4000F82EE92E8B0180914D2B8068E6D0C09124 +:104B5000472BD091482BC017D10728F0011511051C +:104B600009F486C0E8010F2D1E2DD12C209739F5B0 +:104B7000D1100DC02FC0853009F438C02CD181115F +:104B80003EC010D1811126C001D1811141C0809158 +:104B9000402B8111F0CF82E0DF91CF911F910F91D7 +:104BA000FF90EF90DF900895853001F114D18111CD +:104BB00026C0F8D081110EC0E9D0811129C08091A2 +:104BC000402B8111F1CFE7CF8091402B882319F33F +:104BD000853061F0E7D08823B9F380E0DF91CF9191 +:104BE0001F910F91FF90EF90DF90089583E0DF9188 +:104BF000CF911F910F91FF90EF90DF90089581E08A +:104C0000DF91CF911F910F91FF90EF90DF9008956A +:104C100080914D2B87FD30C08091492B90914A2B7C +:104C2000FC01E05CFF4FE08031968081F12CE81AB6 +:104C3000F1082097A1F088E0E816F10428F00FC0F1 +:104C400088E0E816F10459F0F801849156D00F5F1E +:104C50001F4F2197FFEFEF1AFF0A209789F7DD24F6 +:104C6000D394E8E0EE16F10409F0D12C0ED07ECFFB +:104C70000CD0C0E0D0E077CFE091492BF0914A2BE7 +:104C8000EF5BFF4FE080F12CD4CFE0914B2BF09104 +:104C90004C2BA091492BB0914A2BAF5BBF4F8C910D +:104CA00090E08283938380818D798083E091492B8A +:104CB000F0914A2BEF5BFF4F10820895E0914B2B50 +:104CC000F0914C2B80818D798083E091492BF0917C +:104CD0004A2BEF5BFF4F108208958091492B9091F2 +:104CE0004A2BFC01EF5BFF4F208131E0320F308314 +:104CF000FC01E20FF11D808108952091492B309134 +:104D00004A2BF901EF5BFF4F908141E0490F40834F +:104D1000F901E90FF11D8083089580934D2B282F11 +:104D20002F70622F70E094E8299F90011124225B7C +:104D3000344D4091C6045091C70487FD12C02093A2 +:104D4000492B30934A2BCB0182959295907F9827DF +:104D5000807F9827840F951F80934B2B90934C2B2B +:104D600008952E5B3F4F2093492B30934A2B629539 +:104D70007295707F7627607F7627685F7F4F640F1C +:104D8000751F60934B2B70934C2B089580914D2B86 +:104D90008068C3DFE0914B2BF0914C2B808186958E +:104DA0008170089580914D2B8F77B7DFE0914B2B69 +:104DB000F0914C2B808185FF0CC02091492B3091C4 +:104DC0004A2B82819381F901E05CFF4F808381E06F +:104DD000089580E0089580914D2B8F779EDFE091BC +:104DE0004B2BF0914C2B808184FF0CC02091492BE0 +:104DF00030914A2B82819381F901E05CFF4F8083DF +:104E000081E0089580E0089580914D2B8F7785DFB4 +:104E1000E0914B2BF0914C2B80818D788083E09139 +:104E20004B2BF0914C2B808181608083E091492B4A +:104E3000F0914A2BEF5BFF4F108280914D2B8068E1 +:104E40006CDFE0914B2BF0914C2B80818160808353 +:104E5000E091492BF0914A2BEF5BFF4F10820895B0 +:104E6000E0914B2BF0914C2B818184608183E09108 +:104E70004B2BF0914C2B8181807C803409F008957C +:104E800080914D2B805849DFE0914B2BF0914C2BBA +:104E900081818460818308951F93CF93DF9300D035 +:104EA000CDB7DEB7182F4A83698337DFE0914B2BEC +:104EB000F0914C2B1182E0914B2BF0914C2B4A81BD +:104EC000698117FD20C01082E0914B2BF0914C2B93 +:104ED0006183E0914B2BF0914C2B128213828091D5 +:104EE000492B90914A2B8483958340E0FC01E05C40 +:104EF000FF4F40833196108281E00F900F90DF9139 +:104F0000CF911F91089582E08083E0914B2BF09127 +:104F10004C2B6183E0914B2BF0914C2B128213822E +:104F20008091492B90914A2B84839583DFCFCF9238 +:104F3000DF92EF92FF920F931F93CF93DF931F9215 +:104F4000CDB7DEB7F62E662309F43EC06C0100E053 +:104F5000D6011C91112391F1D6011196ED91FC918E +:104F6000129713968C91139714969C91923008F493 +:104F700045C098E148E1E930F10550F028E030E023 +:104F800090E09F5F220F331F2E173F07D0F3942B23 +:104F9000212F2F7030E0263031059CF59F7EE134C3 +:104FA000F10578F5882301F18130C9F4906CEE2E7B +:104FB0004E2D692F812F70DF882319F10F5FB5E027 +:104FC000CB0ED11C0F11C4CF81E00F90DF91CF9198 +:104FD0001F910F91FF90EF90DF90CF900895906810 +:104FE000882319F0EE2EE4CF9064EE2E4E2F692F19 +:104FF00080E8810F998350DF9981DACF98E048E00B +:10500000BACF80E0E2CFE0ECF4E0A681B781199658 +:105010001C92A681B78111961C92A681B7815996E0 +:105020001C92A681B78151961C92A681B781999650 +:105030001C92A681B78191961C92A681B781D996C0 +:105040001C92A681B781D1961C92A681B781A75BDD +:10505000BF4F1C92A681B781AF5BBF4F1C92A68148 +:10506000B781A75ABF4F1C920680F781E02DEF5AF7 +:10507000FF4F108208958091412B87FF05C00CC01F +:105080008091402B882361F081DE8823C9F3FDCD18 +:105090008091402B882321F085DE8823C9F30ECE32 +:1050A00008951F93CF93DF93E091C604F091C70456 +:1050B000E05AFF4FC081D18114E680914D2B80785A +:1050C000803831F16FDE811126C08091402B88231A +:1050D00039F1853051F1E0914B2BF0914C2B8181CE +:1050E00082FD28C0E091C604F091C704E05AFF4F4A +:1050F00080819181C817D90701F32FEF210F112368 +:10510000F1F0EC01122F80914D2B80788038D1F690 +:105110003DDE8823D1F280E0DF91CF911F91089589 +:1051200082E0DF91CF911F91089583E0DF91CF91CD +:105130001F91089581E0DF91CF911F91089584E040 +:10514000DF91CF911F91089562D068D0E0ECF4E038 +:1051500081818E7F818380818F77808310923F2B26 +:105160000895CF93DF93E0E4F0E0148284818160BE +:1051700084834DD053D0C0ECD4E088818F7788836E +:105180008881806888831092402B10923C2B10926B +:105190003E2B10923D2B88818064888348E068E430 +:1051A00080E87ADE48E068E480E076DE8885806426 +:1051B0008887898181608983DF91CF9108952FB796 +:1051C000F89482E0E0ECF1E08287EAE1F0E0E4913B +:1051D000A0ECB4E0DA96EC93DA97EBE1F0E0E4913E +:1051E000DB96EC93DB97E0ECF1E0128687E69EE23B +:1051F0008E7F16968D939C93179785E18C9382E012 +:1052000018968C932FBF81E080933F2BAACFE0ECC0 +:10521000F4E080858370808711860895E0ECF4E0E7 +:105220008FEF8287848708951F920F920FB60F9297 +:1052300011242F933F934F935F936F937F938F939B +:105240009F93AF93BF93EF93FF938091CA0487FD21 +:105250004DC08091CA0486FD41C08091CA0485FF7B +:105260000CC080E28093CA0480913C2B882371F1AA +:1052700084E08093402B0E948B118091CA0484FFAC +:1052800014C080E18093CA0482E08093402B109286 +:105290003C2B1092C304B7DE48E068E480E8FCDDF4 +:1052A00048E068E480E0F8DD35DBFF91EF91BF91E5 +:1052B000AF919F918F917F916F915F914F913F91AE +:1052C0002F910F900FBE0F901F9018958091C304DF +:1052D000811115C081E08093402BCDCF80E4809375 +:1052E000CA041092402B0E948E11B7CF8091C8043F +:1052F00087FFAFCF80E88093CA040CDBAACF83E09E +:10530000EACFCF93DF93EC01FC0170968BE0DF01D5 +:105310001D928A95E9F782E08C83898783E08E87E6 +:1053200061E0CE01019603DE811104C080E0DF91CF +:10533000CF91089561E0CE010696F9DD8823B1F39F +:1053400061E0CE010B96DF91CF91F1CDCF93DF934A +:10535000EB012091402B243021F082E0DF91CF91AE +:105360000895FC014489558966897789452B462B28 +:10537000472B99F38181D1DCFE0101900020E9F7F0 +:10538000BF01615071096C1B7D0B40E050E0CE0104 +:10539000DF91CF91D5CAEF92FF920F931F93CF93D6 +:1053A000DF93EB017A012091402B243041F082E021 +:1053B000DF91CF911F910F91FF90EF900895FC0125 +:1053C0000489158926893789012B022B032B79F350 +:1053D0008181A3DC40E050E0B701CE01DF91CF91A5 +:1053E0001F910F91FF90EF90ABCA0F931F93CF9334 +:1053F000DF931F92CDB7DEB72091402B243039F0D8 +:1054000082E00F90DF91CF911F910F910895FC01E1 +:105410000489158926893789012B022B032B81F3F7 +:10542000818169837ADC2091492B30914A2BF901E3 +:10543000EF5BFF4F9081319780816981981730F041 +:10544000698323DC2EDE69818111DBCF862F55DC59 +:1054500080E0D7CFCF93DF932091402B243021F0F1 +:1054600082E0DF91CF910895FC01448955896689D6 +:105470007789452B462B472B99F381814EDC809110 +:105480004D2B2091492B30914A2BF90187FD1BC0F0 +:10549000E05CFF4F80813196408190E0841B910950 +:1054A000892B11F480E0DDCFF901EF5BFF4FD08154 +:1054B0003197C081EADBDC17A8F3F3DD8111D1CF8E +:1054C000E4DB80E0CECFEF5BFF4F808190E0E8CF60 +:1054D000CF93DF93EC018091402B843019F0DF9162 +:1054E000CF9108954C895D896E897F89452B462B24 +:1054F000472BA9F3898111DC49DC882381F3CE0194 +:10550000DF91CF91A7CFCF93DF932091402B243011 +:10551000A9F5FC014489558966897789452B462B75 +:10552000472B61F18681F9DB3DDC882339F18091DD +:105530004D2B4091492B50914A2BFA0187FD3AC0DF +:10554000E05CFF4F80813196208190E0821B9109C1 +:10555000892BC9F4CFEFDFEF80914D2BFA0187FD46 +:105560001EC0E05CFF4F20813196808130E0281B17 +:105570003109D9F0CE01DF91CF9108958FEF9FEFE0 +:10558000DF91CF910895A9DBC82FD0E04091492B3E +:1055900050914A2B80914D2BFA0187FFE2CFEF5BB0 +:1055A000FF4F208130E0232B29F788DBCE01DF91EC +:1055B000CF910895EF5BFF4F808190E0C9CF0895B0 +:1055C000FF920F931F93CF93DF93EC0104DC8823AA +:1055D00049F0888190E02091452B3091462B281787 +:1055E000390731F0DF91CF911F910F91FF9008950E +:1055F0008091422B813209F448C0A0F0823209F434 +:1056000065C0833279F78091412B813259F7FCDBF9 +:1056100032DD6091432BCE01DF91CF911F910F912D +:10562000FF90CDCF8032F1F68091412B8132D1F6BF +:10563000EBDB04C08091402B8823A1F2B3DB8823ED +:10564000C9F34BDB082F49DB182F47DBF82E45DB6E +:105650004F2D50E060E070E0BA0155274427782BC9 +:10566000402B512B4C8B5D8B6E8B7F8B36DB888F69 +:1056700034DB898F32DB8A8F21DBFDDCCE01DF91C9 +:10568000CF911F910F91FF909ACF8091412B813A3A +:1056900009F0A8CFB9DB7ADB8823E9F38C89FD8890 +:1056A0000E891F892ADB8F2D28DB802F26DB812F97 +:1056B00024DB888D22DB898D20DB8A8D1EDBE5DAF9 +:1056C000DF91CF911F910F91FF90D5CC8091412B0D +:1056D000813209F087CF98DBCEDC8091432B90910B +:1056E000442B888B998BCE01DF91CF911F910F9125 +:1056F000FF9065CFEE0FFF1F0590F491E02D099408 +:10570000B7FF04C003D0821B930B089509D0A59F57 +:10571000900DB49F900DA49F800D911D11240895AC +:10572000A29FB001B39FC001A39F700D811D1124E2 +:10573000911DB29F700D811D1124911D08958F92AE +:105740009F92AF92BF92CF92DF92EF92FF92CF9350 +:10575000DF93EC01688179818A819B8161157105F4 +:105760008105910521F464E279ED8BE597E02DE167 +:1057700033EF41E050E048D349015A019B01AC01AD +:10578000A7EAB1E4C3DF6B017C01ACEEB4EFA50185 +:105790009401B8DFC60ED71EE81EF91EF7FE06C03C +:1057A00081E0C81AD108E10880E8F80AC882D982E5 +:1057B000EA82FB82C6019F77DF91CF91FF90EF9045 +:1057C000DF90CF90BF90AF909F908F900895B7CF0C +:1057D0008CE190E2B4CFA0E0B0E080931C209093E5 +:1057E0001D20A0931E20B0931F200895FB01DC0113 +:1057F00002C005900D9241505040D8F70895FB012A +:10580000DC018D91059080190110D9F3990B089551 +:10581000FB01DC010D900020E9F711974150504049 +:1058200028F0059000200D92C9F708951C92089564 +:10583000FB01DC014150504048F005900D920020E2 +:10584000C9F701C01D9241505040E0F70895FB0197 +:10585000DC0102C001900D9241505040D8F70895EC +:10586000DC0101C06D9341505040E0F70895AEE077 +:10587000B0E0ECE3FCE2F2C20D891E898F89988DBD +:105880002EE02C8309831A8397FF02C080E090E802 +:1058900001978D839E83AE01455E5F4F698D7A8D42 +:1058A000CE01019611D04D815E8157FD0AC02F8136 +:1058B0003885421753070CF49A01F801E20FF31FE1 +:1058C00010822E96E4E0E3C2ACE0B0E0E9E6FCE250 +:1058D000B7C27C016B018A01FC01168217828381A9 +:1058E00081FFB0C1CE0101964C01F7019381F60111 +:1058F00093FD859193FF81916F01882309F49EC1E7 +:10590000853239F493FD859193FF81916F01853242 +:1059100021F4B70190E0E8D1E8CF512C312C20E000 +:105920002032A0F48B3269F030F4803259F08332A7 +:1059300069F420612CC08D3239F0803339F4216054 +:1059400026C02260246023C0286021C027FD27C014 +:1059500030ED380F3A3078F426FF06C0FAE05F9E4B +:10596000300D1124532E13C08AE0389E300D1124BF +:10597000332E20620CC08E3221F426FD5FC12064DC +:1059800006C08C3611F4206802C0883641F4F60156 +:1059900093FD859193FF81916F018111C1CF982F64 +:1059A0009F7D9554933028F40C5F1F4FFFE3F983DC +:1059B0000DC0833631F0833771F0833509F057C05D +:1059C00021C0F801808189830E5F1F4F44244394D6 +:1059D000512C540114C03801F2E06F0E711CF80113 +:1059E000A080B18026FF03C0652D70E002C06FEF7C +:1059F0007FEFC5012C876DD12C0183012C852F777A +:105A0000222E16C03801F2E06F0E711CF801A08042 +:105A1000B18026FF03C0652D70E002C06FEF7FEFFD +:105A2000C5012C874BD12C012C852068222E8301A7 +:105A300023FC19C0832D90E048165906A0F4B70145 +:105A400080E290E051D13A94F5CFF50127FC8591A1 +:105A500027FE81915F01B70190E046D131103A9461 +:105A6000F1E04F1A51084114510479F7DEC0843631 +:105A700011F0893631F5F80127FF07C06081718187 +:105A8000828193810C5F1F4F08C0608171818827DC +:105A900077FD8095982F0E5F1F4F2F76B22E97FFC0 +:105AA00009C090958095709561957F4F8F4F9F4F5E +:105AB0002068B22E2AE030E0A40148D1A82EA81810 +:105AC00043C0853729F42F7EB22E2AE030E025C06E +:105AD000F22FF97FBF2E8F36C1F018F4883579F098 +:105AE000ADC0803719F0883721F0A8C02F2F206172 +:105AF000B22EB4FE0DC08B2D8460B82E09C024FFD9 +:105B00000AC09F2F9660B92E06C028E030E005C07D +:105B100020E130E002C020E132E0F801B7FE07C02A +:105B200060817181828193810C5F1F4F06C060810B +:105B3000718180E090E00E5F1F4FA40107D1A82E75 +:105B4000A818FB2DFF77BF2EB6FE0BC02B2D2E7F86 +:105B5000A51450F4B4FE0AC0B2FC08C02B2D2E7E52 +:105B600005C07A2C2B2D03C07A2C01C0752C24FF84 +:105B70000DC0FE01EA0DF11D8081803311F4297EF4 +:105B800009C022FF06C07394739404C0822F8678E4 +:105B900009F0739423FD12C020FF06C05A2C731421 +:105BA00018F4530C5718732C731460F4B70180E287 +:105BB00090E02C8799D073942C85F6CF731410F451 +:105BC000371801C0312C24FF11C0B70180E390E0E9 +:105BD0002C878AD02C8522FF16C021FF03C088E5C0 +:105BE00090E002C088E790E0B7010CC0822F867871 +:105BF00051F021FD02C080E201C08BE227FD8DE261 +:105C0000B70190E071D0A51430F4B70180E390E0C3 +:105C10006BD05A94F8CFAA94F401EA0DF11D80815B +:105C2000B70190E061D0A110F6CF332009F45DCE2A +:105C3000B70180E290E058D03A94F7CFF70186811F +:105C4000978102C08FEF9FEF2C96E2E112C1E0EC4A +:105C5000F1E0A785A7FDFDCFA485A860A4876050CB +:105C6000704FF5CDDC01CB0102C02D9105D0415024 +:105C70005040D8F70895262FE0ECF1E0378537FD46 +:105C8000FDCF3485377F3487378531FF09C036E350 +:105C9000328738ED34BF31E03387378537FDFDCFAC +:105CA00033E33287808391831282248325E3228722 +:105CB00028ED31E024BF338701960895FC0105905B +:105CC000615070400110D8F7809590958E0F9F1FFE +:105CD0000895FC016150704001900110D8F7809543 +:105CE00090958E0F9F1F08950F931F93CF93DF936F +:105CF000182F092FEB018B8181FD03C08FEF9FEFE0 +:105D000020C082FF10C04E815F812C813D814217EF +:105D100053077CF4E881F9819F012F5F3F4F28836F +:105D20003983108306C0E885F985812F0995892B71 +:105D300029F72E813F812F5F3F4F2E833F83812F95 +:105D4000902FDF91CF911F910F910895FA01AA270B +:105D5000283051F1203181F1E8946F936E7F6E5FAE +:105D60007F4F8F4F9F4FAF4FB1E03ED0B4E03CD05C +:105D7000670F781F891F9A1FA11D680F791F8A1F3F +:105D8000911DA11D6A0F711D811D911DA11D20D0A6 +:105D900009F468943F912AE0269F11243019305D60 +:105DA0003193DEF6CF010895462F4770405D419351 +:105DB000B3E00FD0C9F7F6CF462F4F70405D4A339E +:105DC00018F0495D31FD4052419302D0A9F7EACF66 +:105DD000B4E0A6959795879577956795BA95C9F795 +:105DE00000976105710508959B01AC010A2E069488 +:105DF0005795479537952795BA95C9F7620F731F41 +:105E0000841F951FA01D0895052E97FB16F400947E +:105E10000FD057FD05D045D007FC02D046F408C08E +:105E200050954095309521953F4F4F4F5F4F0895C6 +:105E300090958095709561957F4F8F4F9F4F0895F6 +:105E40002F923F924F925F926F927F928F929F928A +:105E5000AF92BF92CF92DF92EF92FF920F931F9378 +:105E6000CF93DF93CDB7DEB7CA1BDB0BCDBFDEBF51 +:105E700009942A88398848885F846E847D848C845C +:105E80009B84AA84B984C884DF80EE80FD800C8165 +:105E90001B81AA81B981CE0FD11DCDBFDEBFED011F +:105EA0000895A1E21A2EAA1BBB1BFD010DC0AA1F5B +:105EB000BB1FEE1FFF1FA217B307E407F50720F073 +:105EC000A21BB30BE40BF50B661F771F881F991FEE +:105ED0001A9469F760957095809590959B01AC0137 +:0A5EE000BD01CF010895F894FFCF33 +:105EEA001400831000000104100000018208000061 +:105EFA000100000000000000000000000100000096 +:105F0A000001000100000000000000010001010181 +:105F1A00010101000100010000000101000101016D +:105F2A00000101010000000100000100010100015F +:105F3A000000000202000002000202020200000247 +:105F4A000000000404000004000404040400000427 +:105F5A0000080808000000080000080008080008F7 +:105F6A0000000010100000100010101010000010A7 +:025F7A00000025 :00000001FF diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.lss b/Firmware/Chameleon-Mini/Chameleon-Mini.lss index 3ea4573..78dd927 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.lss +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.lss @@ -3,5587 +3,5341 @@ Chameleon-Mini.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 0000628e 00000000 00000000 000000b4 2**1 + 0 .text 00005eea 00000000 00000000 000000b4 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 00000092 00802000 0000628e 00006342 2**0 + 1 .data 00000092 00802000 00005eea 00005f9e 2**0 CONTENTS, ALLOC, LOAD, DATA - 2 .bss 00000e37 00802092 00802092 000063d4 2**0 + 2 .bss 00000e37 00802092 00802092 00006030 2**0 ALLOC - 3 .eeprom 00000033 00810000 00810000 000063d4 2**0 + 3 .eeprom 00000033 00810000 00810000 00006030 2**0 CONTENTS, ALLOC, LOAD, DATA - 4 .stab 000015a8 00000000 00000000 00006408 2**2 - CONTENTS, READONLY, DEBUGGING - 5 .stabstr 00000788 00000000 00000000 000079b0 2**0 - CONTENTS, READONLY, DEBUGGING - 6 .comment 0000002f 00000000 00000000 00008138 2**0 + 4 .comment 0000008b 00000000 00000000 00006063 2**0 CONTENTS, READONLY - 7 .debug_aranges 00000d80 00000000 00000000 00008167 2**0 + 5 .debug_aranges 00000970 00000000 00000000 000060ee 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_info 0001c598 00000000 00000000 00008ee7 2**0 + 6 .debug_info 000153c4 00000000 00000000 00006a5e 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_abbrev 00006309 00000000 00000000 0002547f 2**0 + 7 .debug_abbrev 00004448 00000000 00000000 0001be22 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_line 0000d67b 00000000 00000000 0002b788 2**0 + 8 .debug_line 00008de3 00000000 00000000 0002026a 2**0 CONTENTS, READONLY, DEBUGGING - 11 .debug_frame 00002304 00000000 00000000 00038e04 2**2 + 9 .debug_frame 000019fc 00000000 00000000 00029050 2**2 CONTENTS, READONLY, DEBUGGING - 12 .debug_str 00007fb5 00000000 00000000 0003b108 2**0 + 10 .debug_str 000063bb 00000000 00000000 0002aa4c 2**0 CONTENTS, READONLY, DEBUGGING - 13 .debug_loc 0000eb2a 00000000 00000000 000430bd 2**0 + 11 .debug_loc 0000ad30 00000000 00000000 00030e07 2**0 CONTENTS, READONLY, DEBUGGING - 14 .debug_ranges 00001de0 00000000 00000000 00051be7 2**0 + 12 .debug_ranges 00001568 00000000 00000000 0003bb37 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: - 0: 6d c4 rjmp .+2266 ; 0x8dc <__ctors_end> + 0: e8 c4 rjmp .+2512 ; 0x9d2 <__ctors_end> 2: 00 00 nop - 4: 87 c4 rjmp .+2318 ; 0x914 <__bad_interrupt> + 4: 02 c5 rjmp .+2564 ; 0xa0a <__bad_interrupt> 6: 00 00 nop - 8: 85 c4 rjmp .+2314 ; 0x914 <__bad_interrupt> + 8: 00 c5 rjmp .+2560 ; 0xa0a <__bad_interrupt> a: 00 00 nop - c: 83 c4 rjmp .+2310 ; 0x914 <__bad_interrupt> + c: fe c4 rjmp .+2556 ; 0xa0a <__bad_interrupt> e: 00 00 nop - 10: 81 c4 rjmp .+2306 ; 0x914 <__bad_interrupt> + 10: fc c4 rjmp .+2552 ; 0xa0a <__bad_interrupt> 12: 00 00 nop - 14: 7f c4 rjmp .+2302 ; 0x914 <__bad_interrupt> + 14: fa c4 rjmp .+2548 ; 0xa0a <__bad_interrupt> 16: 00 00 nop - 18: 7d c4 rjmp .+2298 ; 0x914 <__bad_interrupt> + 18: f8 c4 rjmp .+2544 ; 0xa0a <__bad_interrupt> 1a: 00 00 nop - 1c: 7b c4 rjmp .+2294 ; 0x914 <__bad_interrupt> + 1c: f6 c4 rjmp .+2540 ; 0xa0a <__bad_interrupt> 1e: 00 00 nop - 20: 79 c4 rjmp .+2290 ; 0x914 <__bad_interrupt> + 20: f4 c4 rjmp .+2536 ; 0xa0a <__bad_interrupt> 22: 00 00 nop - 24: 77 c4 rjmp .+2286 ; 0x914 <__bad_interrupt> + 24: f2 c4 rjmp .+2532 ; 0xa0a <__bad_interrupt> 26: 00 00 nop - 28: 03 c5 rjmp .+2566 ; 0xa30 <__vector_10> + 28: 7b c5 rjmp .+2806 ; 0xb20 <__vector_10> 2a: 00 00 nop - 2c: 73 c4 rjmp .+2278 ; 0x914 <__bad_interrupt> + 2c: ee c4 rjmp .+2524 ; 0xa0a <__bad_interrupt> 2e: 00 00 nop - 30: 71 c4 rjmp .+2274 ; 0x914 <__bad_interrupt> + 30: ec c4 rjmp .+2520 ; 0xa0a <__bad_interrupt> 32: 00 00 nop - 34: 6f c4 rjmp .+2270 ; 0x914 <__bad_interrupt> + 34: ea c4 rjmp .+2516 ; 0xa0a <__bad_interrupt> 36: 00 00 nop - 38: 6d c4 rjmp .+2266 ; 0x914 <__bad_interrupt> + 38: e8 c4 rjmp .+2512 ; 0xa0a <__bad_interrupt> 3a: 00 00 nop - 3c: 6b c4 rjmp .+2262 ; 0x914 <__bad_interrupt> + 3c: e6 c4 rjmp .+2508 ; 0xa0a <__bad_interrupt> 3e: 00 00 nop - 40: 69 c4 rjmp .+2258 ; 0x914 <__bad_interrupt> + 40: e4 c4 rjmp .+2504 ; 0xa0a <__bad_interrupt> 42: 00 00 nop - 44: 67 c4 rjmp .+2254 ; 0x914 <__bad_interrupt> + 44: e2 c4 rjmp .+2500 ; 0xa0a <__bad_interrupt> 46: 00 00 nop - 48: 65 c4 rjmp .+2250 ; 0x914 <__bad_interrupt> + 48: e0 c4 rjmp .+2496 ; 0xa0a <__bad_interrupt> 4a: 00 00 nop - 4c: 63 c4 rjmp .+2246 ; 0x914 <__bad_interrupt> + 4c: de c4 rjmp .+2492 ; 0xa0a <__bad_interrupt> 4e: 00 00 nop - 50: 61 c4 rjmp .+2242 ; 0x914 <__bad_interrupt> + 50: dc c4 rjmp .+2488 ; 0xa0a <__bad_interrupt> 52: 00 00 nop - 54: 5f c4 rjmp .+2238 ; 0x914 <__bad_interrupt> + 54: da c4 rjmp .+2484 ; 0xa0a <__bad_interrupt> 56: 00 00 nop - 58: 0c 94 0c 17 jmp 0x2e18 ; 0x2e18 <__vector_22> - 5c: 5b c4 rjmp .+2230 ; 0x914 <__bad_interrupt> + 58: 0c 94 6c 17 jmp 0x2ed8 ; 0x2ed8 <__vector_22> + 5c: d6 c4 rjmp .+2476 ; 0xa0a <__bad_interrupt> 5e: 00 00 nop - 60: 59 c4 rjmp .+2226 ; 0x914 <__bad_interrupt> + 60: d4 c4 rjmp .+2472 ; 0xa0a <__bad_interrupt> 62: 00 00 nop - 64: 57 c4 rjmp .+2222 ; 0x914 <__bad_interrupt> + 64: d2 c4 rjmp .+2468 ; 0xa0a <__bad_interrupt> 66: 00 00 nop - 68: 55 c4 rjmp .+2218 ; 0x914 <__bad_interrupt> + 68: d0 c4 rjmp .+2464 ; 0xa0a <__bad_interrupt> 6a: 00 00 nop - 6c: 53 c4 rjmp .+2214 ; 0x914 <__bad_interrupt> + 6c: ce c4 rjmp .+2460 ; 0xa0a <__bad_interrupt> 6e: 00 00 nop - 70: 51 c4 rjmp .+2210 ; 0x914 <__bad_interrupt> + 70: cc c4 rjmp .+2456 ; 0xa0a <__bad_interrupt> 72: 00 00 nop - 74: 4f c4 rjmp .+2206 ; 0x914 <__bad_interrupt> + 74: ca c4 rjmp .+2452 ; 0xa0a <__bad_interrupt> 76: 00 00 nop - 78: 4d c4 rjmp .+2202 ; 0x914 <__bad_interrupt> + 78: c8 c4 rjmp .+2448 ; 0xa0a <__bad_interrupt> 7a: 00 00 nop - 7c: 4b c4 rjmp .+2198 ; 0x914 <__bad_interrupt> + 7c: c6 c4 rjmp .+2444 ; 0xa0a <__bad_interrupt> 7e: 00 00 nop - 80: 49 c4 rjmp .+2194 ; 0x914 <__bad_interrupt> + 80: c4 c4 rjmp .+2440 ; 0xa0a <__bad_interrupt> 82: 00 00 nop - 84: 47 c4 rjmp .+2190 ; 0x914 <__bad_interrupt> + 84: c2 c4 rjmp .+2436 ; 0xa0a <__bad_interrupt> 86: 00 00 nop - 88: 0c 94 db 16 jmp 0x2db6 ; 0x2db6 <__vector_34> - 8c: 43 c4 rjmp .+2182 ; 0x914 <__bad_interrupt> + 88: 0c 94 3b 17 jmp 0x2e76 ; 0x2e76 <__vector_34> + 8c: be c4 rjmp .+2428 ; 0xa0a <__bad_interrupt> 8e: 00 00 nop - 90: 41 c4 rjmp .+2178 ; 0x914 <__bad_interrupt> + 90: bc c4 rjmp .+2424 ; 0xa0a <__bad_interrupt> 92: 00 00 nop - 94: 3f c4 rjmp .+2174 ; 0x914 <__bad_interrupt> + 94: ba c4 rjmp .+2420 ; 0xa0a <__bad_interrupt> 96: 00 00 nop - 98: 3d c4 rjmp .+2170 ; 0x914 <__bad_interrupt> + 98: b8 c4 rjmp .+2416 ; 0xa0a <__bad_interrupt> 9a: 00 00 nop - 9c: 3b c4 rjmp .+2166 ; 0x914 <__bad_interrupt> + 9c: b6 c4 rjmp .+2412 ; 0xa0a <__bad_interrupt> 9e: 00 00 nop - a0: 39 c4 rjmp .+2162 ; 0x914 <__bad_interrupt> + a0: b4 c4 rjmp .+2408 ; 0xa0a <__bad_interrupt> a2: 00 00 nop - a4: 37 c4 rjmp .+2158 ; 0x914 <__bad_interrupt> + a4: b2 c4 rjmp .+2404 ; 0xa0a <__bad_interrupt> a6: 00 00 nop - a8: 35 c4 rjmp .+2154 ; 0x914 <__bad_interrupt> + a8: b0 c4 rjmp .+2400 ; 0xa0a <__bad_interrupt> aa: 00 00 nop - ac: 33 c4 rjmp .+2150 ; 0x914 <__bad_interrupt> + ac: ae c4 rjmp .+2396 ; 0xa0a <__bad_interrupt> ae: 00 00 nop - b0: 31 c4 rjmp .+2146 ; 0x914 <__bad_interrupt> + b0: ac c4 rjmp .+2392 ; 0xa0a <__bad_interrupt> b2: 00 00 nop - b4: 2f c4 rjmp .+2142 ; 0x914 <__bad_interrupt> + b4: aa c4 rjmp .+2388 ; 0xa0a <__bad_interrupt> b6: 00 00 nop - b8: 2d c4 rjmp .+2138 ; 0x914 <__bad_interrupt> + b8: a8 c4 rjmp .+2384 ; 0xa0a <__bad_interrupt> ba: 00 00 nop - bc: 2b c4 rjmp .+2134 ; 0x914 <__bad_interrupt> + bc: a6 c4 rjmp .+2380 ; 0xa0a <__bad_interrupt> be: 00 00 nop - c0: 29 c4 rjmp .+2130 ; 0x914 <__bad_interrupt> + c0: a4 c4 rjmp .+2376 ; 0xa0a <__bad_interrupt> c2: 00 00 nop - c4: 27 c4 rjmp .+2126 ; 0x914 <__bad_interrupt> + c4: a2 c4 rjmp .+2372 ; 0xa0a <__bad_interrupt> c6: 00 00 nop - c8: 25 c4 rjmp .+2122 ; 0x914 <__bad_interrupt> + c8: a0 c4 rjmp .+2368 ; 0xa0a <__bad_interrupt> ca: 00 00 nop - cc: 23 c4 rjmp .+2118 ; 0x914 <__bad_interrupt> + cc: 9e c4 rjmp .+2364 ; 0xa0a <__bad_interrupt> ce: 00 00 nop - d0: 21 c4 rjmp .+2114 ; 0x914 <__bad_interrupt> + d0: 9c c4 rjmp .+2360 ; 0xa0a <__bad_interrupt> d2: 00 00 nop - d4: 1f c4 rjmp .+2110 ; 0x914 <__bad_interrupt> + d4: 9a c4 rjmp .+2356 ; 0xa0a <__bad_interrupt> d6: 00 00 nop - d8: 1d c4 rjmp .+2106 ; 0x914 <__bad_interrupt> + d8: 98 c4 rjmp .+2352 ; 0xa0a <__bad_interrupt> da: 00 00 nop - dc: 1b c4 rjmp .+2102 ; 0x914 <__bad_interrupt> + dc: 96 c4 rjmp .+2348 ; 0xa0a <__bad_interrupt> de: 00 00 nop - e0: 19 c4 rjmp .+2098 ; 0x914 <__bad_interrupt> + e0: 94 c4 rjmp .+2344 ; 0xa0a <__bad_interrupt> e2: 00 00 nop - e4: 17 c4 rjmp .+2094 ; 0x914 <__bad_interrupt> + e4: 92 c4 rjmp .+2340 ; 0xa0a <__bad_interrupt> e6: 00 00 nop - e8: 15 c4 rjmp .+2090 ; 0x914 <__bad_interrupt> + e8: 90 c4 rjmp .+2336 ; 0xa0a <__bad_interrupt> ea: 00 00 nop - ec: 13 c4 rjmp .+2086 ; 0x914 <__bad_interrupt> + ec: 8e c4 rjmp .+2332 ; 0xa0a <__bad_interrupt> ee: 00 00 nop - f0: 11 c4 rjmp .+2082 ; 0x914 <__bad_interrupt> + f0: 8c c4 rjmp .+2328 ; 0xa0a <__bad_interrupt> f2: 00 00 nop - f4: 0f c4 rjmp .+2078 ; 0x914 <__bad_interrupt> + f4: 8a c4 rjmp .+2324 ; 0xa0a <__bad_interrupt> f6: 00 00 nop - f8: 0d c4 rjmp .+2074 ; 0x914 <__bad_interrupt> + f8: 88 c4 rjmp .+2320 ; 0xa0a <__bad_interrupt> fa: 00 00 nop - fc: 0b c4 rjmp .+2070 ; 0x914 <__bad_interrupt> + fc: 86 c4 rjmp .+2316 ; 0xa0a <__bad_interrupt> fe: 00 00 nop - 100: 09 c4 rjmp .+2066 ; 0x914 <__bad_interrupt> + 100: 84 c4 rjmp .+2312 ; 0xa0a <__bad_interrupt> 102: 00 00 nop - 104: 07 c4 rjmp .+2062 ; 0x914 <__bad_interrupt> + 104: 82 c4 rjmp .+2308 ; 0xa0a <__bad_interrupt> 106: 00 00 nop - 108: 05 c4 rjmp .+2058 ; 0x914 <__bad_interrupt> + 108: 80 c4 rjmp .+2304 ; 0xa0a <__bad_interrupt> 10a: 00 00 nop - 10c: 03 c4 rjmp .+2054 ; 0x914 <__bad_interrupt> + 10c: 7e c4 rjmp .+2300 ; 0xa0a <__bad_interrupt> 10e: 00 00 nop - 110: 01 c4 rjmp .+2050 ; 0x914 <__bad_interrupt> + 110: 7c c4 rjmp .+2296 ; 0xa0a <__bad_interrupt> 112: 00 00 nop - 114: ff c3 rjmp .+2046 ; 0x914 <__bad_interrupt> + 114: 7a c4 rjmp .+2292 ; 0xa0a <__bad_interrupt> 116: 00 00 nop - 118: fd c3 rjmp .+2042 ; 0x914 <__bad_interrupt> + 118: 78 c4 rjmp .+2288 ; 0xa0a <__bad_interrupt> 11a: 00 00 nop - 11c: fb c3 rjmp .+2038 ; 0x914 <__bad_interrupt> + 11c: 76 c4 rjmp .+2284 ; 0xa0a <__bad_interrupt> 11e: 00 00 nop - 120: f9 c3 rjmp .+2034 ; 0x914 <__bad_interrupt> + 120: 74 c4 rjmp .+2280 ; 0xa0a <__bad_interrupt> 122: 00 00 nop - 124: f7 c3 rjmp .+2030 ; 0x914 <__bad_interrupt> + 124: 72 c4 rjmp .+2276 ; 0xa0a <__bad_interrupt> 126: 00 00 nop - 128: f5 c3 rjmp .+2026 ; 0x914 <__bad_interrupt> + 128: 70 c4 rjmp .+2272 ; 0xa0a <__bad_interrupt> 12a: 00 00 nop - 12c: f3 c3 rjmp .+2022 ; 0x914 <__bad_interrupt> + 12c: 6e c4 rjmp .+2268 ; 0xa0a <__bad_interrupt> 12e: 00 00 nop - 130: f1 c3 rjmp .+2018 ; 0x914 <__bad_interrupt> + 130: 6c c4 rjmp .+2264 ; 0xa0a <__bad_interrupt> 132: 00 00 nop - 134: ef c3 rjmp .+2014 ; 0x914 <__bad_interrupt> + 134: 6a c4 rjmp .+2260 ; 0xa0a <__bad_interrupt> 136: 00 00 nop - 138: ed c3 rjmp .+2010 ; 0x914 <__bad_interrupt> + 138: 68 c4 rjmp .+2256 ; 0xa0a <__bad_interrupt> 13a: 00 00 nop - 13c: eb c3 rjmp .+2006 ; 0x914 <__bad_interrupt> + 13c: 66 c4 rjmp .+2252 ; 0xa0a <__bad_interrupt> 13e: 00 00 nop - 140: e9 c3 rjmp .+2002 ; 0x914 <__bad_interrupt> + 140: 64 c4 rjmp .+2248 ; 0xa0a <__bad_interrupt> 142: 00 00 nop - 144: e7 c3 rjmp .+1998 ; 0x914 <__bad_interrupt> + 144: 62 c4 rjmp .+2244 ; 0xa0a <__bad_interrupt> 146: 00 00 nop - 148: e5 c3 rjmp .+1994 ; 0x914 <__bad_interrupt> + 148: 60 c4 rjmp .+2240 ; 0xa0a <__bad_interrupt> 14a: 00 00 nop - 14c: 0c 94 b0 17 jmp 0x2f60 ; 0x2f60 <__vector_83> - 150: e1 c3 rjmp .+1986 ; 0x914 <__bad_interrupt> + 14c: 0c 94 26 18 jmp 0x304c ; 0x304c <__vector_83> + 150: 5c c4 rjmp .+2232 ; 0xa0a <__bad_interrupt> 152: 00 00 nop - 154: df c3 rjmp .+1982 ; 0x914 <__bad_interrupt> + 154: 5a c4 rjmp .+2228 ; 0xa0a <__bad_interrupt> 156: 00 00 nop - 158: dd c3 rjmp .+1978 ; 0x914 <__bad_interrupt> + 158: 58 c4 rjmp .+2224 ; 0xa0a <__bad_interrupt> 15a: 00 00 nop - 15c: db c3 rjmp .+1974 ; 0x914 <__bad_interrupt> + 15c: 56 c4 rjmp .+2220 ; 0xa0a <__bad_interrupt> 15e: 00 00 nop - 160: d9 c3 rjmp .+1970 ; 0x914 <__bad_interrupt> + 160: 54 c4 rjmp .+2216 ; 0xa0a <__bad_interrupt> 162: 00 00 nop - 164: d7 c3 rjmp .+1966 ; 0x914 <__bad_interrupt> + 164: 52 c4 rjmp .+2212 ; 0xa0a <__bad_interrupt> 166: 00 00 nop - 168: d5 c3 rjmp .+1962 ; 0x914 <__bad_interrupt> + 168: 50 c4 rjmp .+2208 ; 0xa0a <__bad_interrupt> 16a: 00 00 nop - 16c: d3 c3 rjmp .+1958 ; 0x914 <__bad_interrupt> + 16c: 4e c4 rjmp .+2204 ; 0xa0a <__bad_interrupt> 16e: 00 00 nop - 170: d1 c3 rjmp .+1954 ; 0x914 <__bad_interrupt> + 170: 4c c4 rjmp .+2200 ; 0xa0a <__bad_interrupt> 172: 00 00 nop - 174: cf c3 rjmp .+1950 ; 0x914 <__bad_interrupt> + 174: 4a c4 rjmp .+2196 ; 0xa0a <__bad_interrupt> 176: 00 00 nop - 178: cd c3 rjmp .+1946 ; 0x914 <__bad_interrupt> + 178: 48 c4 rjmp .+2192 ; 0xa0a <__bad_interrupt> 17a: 00 00 nop - 17c: cb c3 rjmp .+1942 ; 0x914 <__bad_interrupt> + 17c: 46 c4 rjmp .+2188 ; 0xa0a <__bad_interrupt> 17e: 00 00 nop - 180: c9 c3 rjmp .+1938 ; 0x914 <__bad_interrupt> + 180: 44 c4 rjmp .+2184 ; 0xa0a <__bad_interrupt> 182: 00 00 nop - 184: c7 c3 rjmp .+1934 ; 0x914 <__bad_interrupt> + 184: 42 c4 rjmp .+2180 ; 0xa0a <__bad_interrupt> 186: 00 00 nop - 188: c5 c3 rjmp .+1930 ; 0x914 <__bad_interrupt> + 188: 40 c4 rjmp .+2176 ; 0xa0a <__bad_interrupt> 18a: 00 00 nop - 18c: c3 c3 rjmp .+1926 ; 0x914 <__bad_interrupt> + 18c: 3e c4 rjmp .+2172 ; 0xa0a <__bad_interrupt> 18e: 00 00 nop - 190: c1 c3 rjmp .+1922 ; 0x914 <__bad_interrupt> + 190: 3c c4 rjmp .+2168 ; 0xa0a <__bad_interrupt> 192: 00 00 nop - 194: bf c3 rjmp .+1918 ; 0x914 <__bad_interrupt> + 194: 3a c4 rjmp .+2164 ; 0xa0a <__bad_interrupt> 196: 00 00 nop - 198: bd c3 rjmp .+1914 ; 0x914 <__bad_interrupt> + 198: 38 c4 rjmp .+2160 ; 0xa0a <__bad_interrupt> 19a: 00 00 nop - 19c: bb c3 rjmp .+1910 ; 0x914 <__bad_interrupt> + 19c: 36 c4 rjmp .+2156 ; 0xa0a <__bad_interrupt> 19e: 00 00 nop - 1a0: b9 c3 rjmp .+1906 ; 0x914 <__bad_interrupt> + 1a0: 34 c4 rjmp .+2152 ; 0xa0a <__bad_interrupt> 1a2: 00 00 nop - 1a4: b7 c3 rjmp .+1902 ; 0x914 <__bad_interrupt> + 1a4: 32 c4 rjmp .+2148 ; 0xa0a <__bad_interrupt> 1a6: 00 00 nop - 1a8: b5 c3 rjmp .+1898 ; 0x914 <__bad_interrupt> + 1a8: 30 c4 rjmp .+2144 ; 0xa0a <__bad_interrupt> 1aa: 00 00 nop - 1ac: b3 c3 rjmp .+1894 ; 0x914 <__bad_interrupt> + 1ac: 2e c4 rjmp .+2140 ; 0xa0a <__bad_interrupt> 1ae: 00 00 nop - 1b0: b1 c3 rjmp .+1890 ; 0x914 <__bad_interrupt> + 1b0: 2c c4 rjmp .+2136 ; 0xa0a <__bad_interrupt> 1b2: 00 00 nop - 1b4: af c3 rjmp .+1886 ; 0x914 <__bad_interrupt> + 1b4: 2a c4 rjmp .+2132 ; 0xa0a <__bad_interrupt> 1b6: 00 00 nop - 1b8: ad c3 rjmp .+1882 ; 0x914 <__bad_interrupt> + 1b8: 28 c4 rjmp .+2128 ; 0xa0a <__bad_interrupt> 1ba: 00 00 nop - 1bc: ab c3 rjmp .+1878 ; 0x914 <__bad_interrupt> + 1bc: 26 c4 rjmp .+2124 ; 0xa0a <__bad_interrupt> 1be: 00 00 nop - 1c0: a9 c3 rjmp .+1874 ; 0x914 <__bad_interrupt> + 1c0: 24 c4 rjmp .+2120 ; 0xa0a <__bad_interrupt> 1c2: 00 00 nop - 1c4: a7 c3 rjmp .+1870 ; 0x914 <__bad_interrupt> + 1c4: 22 c4 rjmp .+2116 ; 0xa0a <__bad_interrupt> 1c6: 00 00 nop - 1c8: a5 c3 rjmp .+1866 ; 0x914 <__bad_interrupt> + 1c8: 20 c4 rjmp .+2112 ; 0xa0a <__bad_interrupt> 1ca: 00 00 nop - 1cc: a3 c3 rjmp .+1862 ; 0x914 <__bad_interrupt> + 1cc: 1e c4 rjmp .+2108 ; 0xa0a <__bad_interrupt> 1ce: 00 00 nop - 1d0: a1 c3 rjmp .+1858 ; 0x914 <__bad_interrupt> + 1d0: 1c c4 rjmp .+2104 ; 0xa0a <__bad_interrupt> 1d2: 00 00 nop - 1d4: 9f c3 rjmp .+1854 ; 0x914 <__bad_interrupt> + 1d4: 1a c4 rjmp .+2100 ; 0xa0a <__bad_interrupt> 1d6: 00 00 nop - 1d8: 9d c3 rjmp .+1850 ; 0x914 <__bad_interrupt> + 1d8: 18 c4 rjmp .+2096 ; 0xa0a <__bad_interrupt> 1da: 00 00 nop - 1dc: 9b c3 rjmp .+1846 ; 0x914 <__bad_interrupt> + 1dc: 16 c4 rjmp .+2092 ; 0xa0a <__bad_interrupt> 1de: 00 00 nop - 1e0: 99 c3 rjmp .+1842 ; 0x914 <__bad_interrupt> + 1e0: 14 c4 rjmp .+2088 ; 0xa0a <__bad_interrupt> 1e2: 00 00 nop - 1e4: 97 c3 rjmp .+1838 ; 0x914 <__bad_interrupt> + 1e4: 12 c4 rjmp .+2084 ; 0xa0a <__bad_interrupt> 1e6: 00 00 nop - 1e8: 95 c3 rjmp .+1834 ; 0x914 <__bad_interrupt> + 1e8: 10 c4 rjmp .+2080 ; 0xa0a <__bad_interrupt> 1ea: 00 00 nop - 1ec: 93 c3 rjmp .+1830 ; 0x914 <__bad_interrupt> + 1ec: 0e c4 rjmp .+2076 ; 0xa0a <__bad_interrupt> 1ee: 00 00 nop - 1f0: 91 c3 rjmp .+1826 ; 0x914 <__bad_interrupt> + 1f0: 0c c4 rjmp .+2072 ; 0xa0a <__bad_interrupt> 1f2: 00 00 nop - 1f4: 0c 94 da 2a jmp 0x55b4 ; 0x55b4 <__vector_125> - 1f8: 8d c3 rjmp .+1818 ; 0x914 <__bad_interrupt> + 1f4: 0c 94 14 29 jmp 0x5228 ; 0x5228 <__vector_125> + 1f8: 08 c4 rjmp .+2064 ; 0xa0a <__bad_interrupt> 1fa: 00 00 nop + 1fc: 82 0f add r24, r18 + 1fe: 80 0f add r24, r16 + 200: 80 0f add r24, r16 + 202: 80 0f add r24, r16 + 204: 80 0f add r24, r16 + 206: 80 0f add r24, r16 + 208: 80 0f add r24, r16 + 20a: 80 0f add r24, r16 + 20c: 80 0f add r24, r16 + 20e: 80 0f add r24, r16 + 210: 80 0f add r24, r16 + 212: 80 0f add r24, r16 + 214: 80 0f add r24, r16 + 216: 80 0f add r24, r16 + 218: 80 0f add r24, r16 + 21a: 80 0f add r24, r16 + 21c: 8d 0f add r24, r29 + 21e: a1 0f add r26, r17 + 220: a7 0f add r26, r23 + 222: ad 0f add r26, r29 + 224: 80 0f add r24, r16 + 226: 80 0f add r24, r16 + 228: 80 0f add r24, r16 + 22a: 80 0f add r24, r16 + 22c: 80 0f add r24, r16 + 22e: 80 0f add r24, r16 + 230: 80 0f add r24, r16 + 232: 80 0f add r24, r16 + 234: 80 0f add r24, r16 + 236: 80 0f add r24, r16 + 238: 80 0f add r24, r16 + 23a: 80 0f add r24, r16 + 23c: 99 0f add r25, r25 + 23e: 99 0f add r25, r25 + 240: 99 0f add r25, r25 + 242: 99 0f add r25, r25 + 244: 99 0f add r25, r25 + 246: 99 0f add r25, r25 + 248: 99 0f add r25, r25 + 24a: 99 0f add r25, r25 + 24c: 79 0f add r23, r25 + 24e: 77 0f add r23, r23 + 250: 77 0f add r23, r23 + 252: 77 0f add r23, r23 + 254: 77 0f add r23, r23 + 256: 77 0f add r23, r23 + 258: 77 0f add r23, r23 + 25a: 77 0f add r23, r23 + 25c: 77 0f add r23, r23 + 25e: 77 0f add r23, r23 + 260: 77 0f add r23, r23 + 262: 77 0f add r23, r23 + 264: 77 0f add r23, r23 + 266: 77 0f add r23, r23 + 268: 77 0f add r23, r23 + 26a: 77 0f add r23, r23 + 26c: 93 0f add r25, r19 + 26e: c3 0f add r28, r19 + 270: b5 0f add r27, r21 + 272: bb 0f add r27, r27 + 274: 77 0f add r23, r23 + 276: 77 0f add r23, r23 + 278: 77 0f add r23, r23 + 27a: 77 0f add r23, r23 + 27c: 77 0f add r23, r23 + 27e: 77 0f add r23, r23 + 280: 77 0f add r23, r23 + 282: 77 0f add r23, r23 + 284: 77 0f add r23, r23 + 286: 77 0f add r23, r23 + 288: 77 0f add r23, r23 + 28a: 77 0f add r23, r23 + 28c: c9 0f add r28, r25 + 28e: c9 0f add r28, r25 + 290: c9 0f add r28, r25 + 292: c9 0f add r28, r25 + 294: c9 0f add r28, r25 + 296: c9 0f add r28, r25 + 298: c9 0f add r28, r25 + 29a: c9 0f add r28, r25 + 29c: 88 14 cp r8, r8 + 29e: 88 14 cp r8, r8 + 2a0: 94 14 cp r9, r4 + 2a2: 9d 14 cp r9, r13 + 2a4: ac 14 cp r10, r12 + 2a6: 5b 14 cp r5, r11 + 2a8: 75 14 cp r7, r5 + 2aa: 7b 14 cp r7, r11 + 2ac: 6f 14 cp r6, r15 + 2ae: ea 18 sub r14, r10 + 2b0: 76 18 sub r7, r6 + 2b2: 7f 18 sub r7, r15 + 2b4: 86 18 sub r8, r6 + 2b6: 94 18 sub r9, r4 + 2b8: 9f 18 sub r9, r15 + 2ba: c4 18 sub r12, r4 + 2bc: 3e 18 sub r3, r14 + 2be: d2 18 sub r13, r2 + 2c0: d9 18 sub r13, r9 + 2c2: e0 18 sub r14, r0 + 2c4: 3c 1c adc r3, r12 + 2c6: 3c 1c adc r3, r12 + 2c8: 54 1c adc r5, r4 + 2ca: ab 1c adc r10, r11 + 2cc: 8e 1d adc r24, r14 + 2ce: 6e 1c adc r6, r14 + 2d0: 6a 1d adc r22, r10 + 2d2: ba 1c adc r11, r10 + 2d4: d8 1c adc r13, r8 + 2d6: 00 1c adc r0, r0 + 2d8: 1f 1c adc r1, r15 + 2da: 1f 1c adc r1, r15 + 2dc: 1f 1c adc r1, r15 + 2de: 1f 24 eor r1, r15 + 2e0: ec 23 and r30, r28 + 2e2: 8b 23 and r24, r27 + 2e4: ec 23 and r30, r28 + 2e6: 8b 23 and r24, r27 + 2e8: da 23 and r29, r26 + 2ea: bc 23 and r27, r28 + 2ec: 8b 23 and r24, r27 + 2ee: b3 23 and r27, r19 + 2f0: 9c 23 and r25, r28 -000001fc : - 1fc: 1c 03 4c 00 55 00 46 00 41 00 20 00 43 00 44 00 ..L.U.F.A. .C.D. - 20c: 43 00 20 00 44 00 65 00 6d 00 6f 00 00 00 C. .D.e.m.o... +000002f2 : + 2f2: 1c 03 4c 00 55 00 46 00 41 00 20 00 43 00 44 00 ..L.U.F.A. .C.D. + 302: 43 00 20 00 44 00 65 00 6d 00 6f 00 00 00 C. .D.e.m.o... -0000021a : - 21a: 18 03 44 00 65 00 61 00 6e 00 20 00 43 00 61 00 ..D.e.a.n. .C.a. - 22a: 6d 00 65 00 72 00 61 00 00 00 m.e.r.a... +00000310 : + 310: 18 03 44 00 65 00 61 00 6e 00 20 00 43 00 61 00 ..D.e.a.n. .C.a. + 320: 6d 00 65 00 72 00 61 00 00 00 m.e.r.a... -00000234 : - 234: 04 03 09 04 .... +0000032a : + 32a: 04 03 09 04 .... -00000238 : - 238: 09 02 3e 00 02 01 00 c0 32 09 04 00 00 01 02 02 ..>.....2....... - 248: 01 00 05 24 00 10 01 04 24 02 06 05 24 06 00 01 ...$....$...$... - 258: 07 05 82 03 08 00 ff 09 04 01 00 02 0a 00 00 00 ................ - 268: 07 05 04 02 10 00 05 07 05 83 02 10 00 05 .............. +0000032e : + 32e: 09 02 3e 00 02 01 00 c0 32 09 04 00 00 01 02 02 ..>.....2....... + 33e: 01 00 05 24 00 10 01 04 24 02 06 05 24 06 00 01 ...$....$...$... + 34e: 07 05 82 03 08 00 ff 09 04 01 00 02 0a 00 00 00 ................ + 35e: 07 05 04 02 10 00 05 07 05 83 02 10 00 05 .............. -00000276 : - 276: 12 01 10 01 02 00 00 08 eb 03 44 20 01 00 01 02 ..........D .... - 286: dc 01 .. +0000036c : + 36c: 12 01 10 01 02 00 00 08 d0 16 b2 04 01 00 01 02 ................ + 37c: dc 01 .. -00000288 : - 288: 00 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 .NONE........... - 298: 00 a0 05 a1 05 a2 05 a3 05 a4 05 a5 05 a8 05 a9 ................ - 2a8: 05 00 00 00 01 01 4d 46 5f 55 4c 54 52 41 4c 49 ......MF_ULTRALI - 2b8: 47 48 54 00 00 00 a1 18 d8 18 89 19 8d 19 91 19 GHT............. - 2c8: 92 19 e4 1a f7 1a 40 00 07 00 02 4d 46 5f 43 4c ......@....MF_CL - 2d8: 41 53 53 49 43 5f 31 4b 00 00 00 a1 18 d8 18 36 ASSIC_1K.......6 - 2e8: 1b 69 1b 6d 1b 6e 1b 32 21 53 21 00 04 04 00 03 .i.m.n.2!S!..... - 2f8: 4d 46 5f 50 4c 55 53 31 4b 5f 37 42 00 00 00 00 MF_PLUS1K_7B.... - 308: a1 18 d8 18 45 1b 69 1b 6d 1b 6e 1b 32 21 53 21 ....E.i.m.n.2!S! - 318: 00 04 07 00 04 4d 46 5f 43 4c 41 53 53 49 43 5f .....MF_CLASSIC_ - 328: 34 4b 00 00 00 a1 18 d8 18 5a 1b 69 1b 6d 1b 6e 4K.......Z.i.m.n - 338: 1b 32 21 53 21 00 10 04 00 05 49 53 4f 31 34 34 .2!S!.....ISO144 - 348: 34 33 41 5f 53 4e 49 46 46 00 a1 18 d8 18 a2 05 43A_SNIFF....... - 358: a3 05 a4 05 a5 05 a8 05 a9 05 00 00 00 01 .............. +0000037e : + 37e: 00 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 .NONE........... + 38e: 00 18 06 19 06 1a 06 1b 06 1c 06 1d 06 20 06 21 ............. .! + 39e: 06 00 00 00 01 01 4d 46 5f 55 4c 54 52 41 4c 49 ......MF_ULTRALI + 3ae: 47 48 54 00 00 00 04 19 3b 19 eb 19 ef 19 f3 19 GHT.....;....... + 3be: f4 19 45 1b 58 1b 40 00 07 00 02 4d 46 5f 43 4c ..E.X.@....MF_CL + 3ce: 41 53 53 49 43 5f 31 4b 00 00 00 04 19 3b 19 97 ASSIC_1K.....;.. + 3de: 1b ca 1b ce 1b cf 1b ce 20 ef 20 00 04 04 00 03 ........ . ..... + 3ee: 4d 46 5f 50 4c 55 53 31 4b 5f 37 42 00 00 00 00 MF_PLUS1K_7B.... + 3fe: 04 19 3b 19 a6 1b ca 1b ce 1b cf 1b ce 20 ef 20 ..;.......... . + 40e: 00 04 07 00 04 4d 46 5f 43 4c 41 53 53 49 43 5f .....MF_CLASSIC_ + 41e: 34 4b 00 00 00 04 19 3b 19 bb 1b ca 1b ce 1b cf 4K.....;........ + 42e: 1b ce 20 ef 20 00 10 04 00 05 49 53 4f 31 34 34 .. . .....ISO144 + 43e: 34 33 41 5f 53 4e 49 46 46 00 04 19 3b 19 1a 06 43A_SNIFF...;... + 44e: 1b 06 1c 06 1d 06 20 06 21 06 00 00 00 01 ...... .!..... -00000366 : - 366: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ - 376: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 386: 55 49 44 5f 52 41 4e 44 4f 4d 00 00 00 00 00 00 UID_RANDOM...... - 396: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 3a6: 55 49 44 5f 4c 45 46 54 5f 49 4e 43 52 45 4d 45 UID_LEFT_INCREME - 3b6: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. - 3c6: 55 49 44 5f 52 49 47 48 54 5f 49 4e 43 52 45 4d UID_RIGHT_INCREM - 3d6: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. - 3e6: 55 49 44 5f 4c 45 46 54 5f 44 45 43 52 45 4d 45 UID_LEFT_DECREME - 3f6: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. - 406: 55 49 44 5f 52 49 47 48 54 5f 44 45 43 52 45 4d UID_RIGHT_DECREM - 416: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. - 426: 43 59 43 4c 45 5f 53 45 54 54 49 4e 47 53 00 00 CYCLE_SETTINGS.. - 436: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 446: 53 54 4f 52 45 5f 4d 45 4d 00 00 00 00 00 00 00 STORE_MEM....... - 456: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 466: 52 45 43 41 4c 4c 5f 4d 45 4d 00 00 00 00 00 00 RECALL_MEM...... - 476: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0000045c : + 45c: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ + 46c: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 47c: 55 49 44 5f 52 41 4e 44 4f 4d 00 00 00 00 00 00 UID_RANDOM...... + 48c: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 49c: 55 49 44 5f 4c 45 46 54 5f 49 4e 43 52 45 4d 45 UID_LEFT_INCREME + 4ac: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. + 4bc: 55 49 44 5f 52 49 47 48 54 5f 49 4e 43 52 45 4d UID_RIGHT_INCREM + 4cc: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. + 4dc: 55 49 44 5f 4c 45 46 54 5f 44 45 43 52 45 4d 45 UID_LEFT_DECREME + 4ec: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. + 4fc: 55 49 44 5f 52 49 47 48 54 5f 44 45 43 52 45 4d UID_RIGHT_DECREM + 50c: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. + 51c: 43 59 43 4c 45 5f 53 45 54 54 49 4e 47 53 00 00 CYCLE_SETTINGS.. + 52c: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 53c: 53 54 4f 52 45 5f 4d 45 4d 00 00 00 00 00 00 00 STORE_MEM....... + 54c: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 55c: 52 45 43 41 4c 4c 5f 4d 45 4d 00 00 00 00 00 00 RECALL_MEM...... + 56c: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -00000486 : - 486: 4f 46 46 00 00 00 00 00 00 00 00 00 00 00 00 00 OFF............. - 496: 4d 45 4d 4f 52 59 00 00 00 00 00 00 00 00 00 00 MEMORY.......... - 4a6: 54 45 52 4d 49 4e 41 4c 00 00 00 00 00 00 00 00 TERMINAL........ +0000057c <__c.6448>: + 57c: 2c 00 ,. -000004b6 <__c.6349>: - 4b6: 2c 00 ,. +0000057e : + 57e: 4f 46 46 00 00 00 00 00 00 00 00 00 00 00 00 00 OFF............. + 58e: 4d 45 4d 4f 52 59 00 00 00 00 00 00 00 00 00 00 MEMORY.......... + 59e: 54 45 52 4d 49 4e 41 4c 00 00 00 00 00 00 00 00 TERMINAL........ -000004b8 : - 4b8: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ - 4c8: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 4d8: 54 45 52 4d 49 4e 41 4c 5f 43 4f 4e 4e 00 00 00 TERMINAL_CONN... - 4e8: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 4f8: 54 45 52 4d 49 4e 41 4c 5f 52 58 54 58 00 00 00 TERMINAL_RXTX... - 508: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 518: 53 45 54 54 49 4e 47 5f 43 48 41 4e 47 45 00 00 SETTING_CHANGE.. - 528: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 538: 4d 45 4d 4f 52 59 5f 53 54 4f 52 45 44 00 00 00 MEMORY_STORED... - 548: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 558: 4d 45 4d 4f 52 59 5f 43 48 41 4e 47 45 44 00 00 MEMORY_CHANGED.. - 568: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 578: 43 4f 44 45 43 5f 52 58 00 00 00 00 00 00 00 00 CODEC_RX........ - 588: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 598: 43 4f 44 45 43 5f 54 58 00 00 00 00 00 00 00 00 CODEC_TX........ - 5a8: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +000005ae : + 5ae: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ + 5be: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 5ce: 54 45 52 4d 49 4e 41 4c 5f 43 4f 4e 4e 00 00 00 TERMINAL_CONN... + 5de: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 5ee: 54 45 52 4d 49 4e 41 4c 5f 52 58 54 58 00 00 00 TERMINAL_RXTX... + 5fe: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 60e: 53 45 54 54 49 4e 47 5f 43 48 41 4e 47 45 00 00 SETTING_CHANGE.. + 61e: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 62e: 4d 45 4d 4f 52 59 5f 53 54 4f 52 45 44 00 00 00 MEMORY_STORED... + 63e: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 64e: 4d 45 4d 4f 52 59 5f 43 48 41 4e 47 45 44 00 00 MEMORY_CHANGED.. + 65e: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 66e: 43 4f 44 45 43 5f 52 58 00 00 00 00 00 00 00 00 CODEC_RX........ + 67e: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 68e: 43 4f 44 45 43 5f 54 58 00 00 00 00 00 00 00 00 CODEC_TX........ + 69e: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000005b8 <__c.6462>: - 5b8: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % - 5c8: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S - 5d8: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV - 5e8: 52 2d 47 43 43 20 25 53 00 R-GCC %S. +000006ae <__c.6718>: + 6ae: 25 35 75 20 6d 56 00 %5u mV. -000005f1 <__c.6464>: - 5f1: 31 35 30 32 32 33 00 150223. +000006b5 <__c.6688>: + 6b5: 43 4c 45 41 52 00 CLEAR. -000005f8 <__c.6466>: - 5f8: 31 33 30 39 30 31 00 130901. +000006bb <__c.6686>: + 6bb: 4c 4f 41 44 42 49 4e 00 LOADBIN. -000005ff <__c.6468>: - 5ff: 34 2e 37 2e 32 00 4.7.2. +000006c3 <__c.6681>: + 6c3: 25 75 00 %u. -00000605 <__c.6473>: - 605: 25 73 00 %s. +000006c6 <__c.6672>: + 6c6: 25 53 2c 25 53 00 %S,%S. -00000608 <__c.6491>: - 608: 52 41 4e 44 4f 4d 00 RANDOM. +000006cc <__c.6674>: + 6cc: 4c 4f 41 44 42 49 4e 00 LOADBIN. -0000060f <__c.6518>: - 60f: 25 75 00 %u. +000006d4 <__c.6676>: + 6d4: 43 4c 45 41 52 00 CLEAR. -00000612 <__c.6523>: - 612: 25 75 00 %u. +000006da <__c.6622>: + 6da: 25 75 00 %u. -00000615 <__c.6573>: - 615: 25 53 2c 25 53 00 %S,%S. +000006dd <__c.6617>: + 6dd: 25 75 00 %u. -0000061b <__c.6575>: - 61b: 4c 4f 41 44 42 49 4e 00 LOADBIN. +000006e0 <__c.6590>: + 6e0: 52 41 4e 44 4f 4d 00 RANDOM. -00000623 <__c.6577>: - 623: 43 4c 45 41 52 00 CLEAR. +000006e7 <__c.6572>: + 6e7: 25 73 00 %s. -00000629 <__c.6582>: - 629: 25 75 00 %u. +000006ea <__c.6561>: + 6ea: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % + 6fa: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S + 70a: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV + 71a: 52 2d 47 43 43 20 25 53 00 R-GCC %S. -0000062c <__c.6587>: - 62c: 4c 4f 41 44 42 49 4e 00 LOADBIN. +00000723 <__c.6563>: + 723: 31 35 30 33 30 34 00 150304. -00000634 <__c.6589>: - 634: 43 4c 45 41 52 00 CLEAR. +0000072a <__c.6565>: + 72a: 31 33 30 39 30 31 00 130901. -0000063a <__c.6619>: - 63a: 25 35 75 20 6d 56 00 %5u mV. +00000731 <__c.6567>: + 731: 34 2e 38 2e 31 00 4.8.1. -00000641 : - 641: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... - 651: 00 00 00 00 4f 11 43 4f 4e 46 49 47 00 00 00 00 ....O.CONFIG.... - 661: 00 00 00 00 00 00 8c 11 83 11 6d 11 55 49 44 00 ..........m.UID. - 671: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b9 11 ................ - 681: 92 11 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 ..READONLY...... - 691: 00 00 00 00 24 12 12 12 55 50 4c 4f 41 44 00 00 ....$...UPLOAD.. - 6a1: 00 00 00 00 00 00 00 00 38 12 00 00 00 00 44 4f ........8.....DO - 6b1: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 3d 12 WNLOAD........=. - 6c1: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... - 6d1: 00 00 00 00 42 12 00 00 00 00 55 50 47 52 41 44 ....B.....UPGRAD - 6e1: 45 00 00 00 00 00 00 00 00 00 4d 12 00 00 00 00 E.........M..... - 6f1: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... - 701: 00 00 00 00 58 12 55 49 44 53 49 5a 45 00 00 00 ....X.UIDSIZE... - 711: 00 00 00 00 00 00 00 00 00 00 70 12 42 55 54 54 ..........p.BUTT - 721: 4f 4e 00 00 00 00 00 00 00 00 00 00 86 12 92 12 ON.............. - 731: 8b 12 42 55 54 54 4f 4e 5f 4c 4f 4e 47 00 00 00 ..BUTTON_LONG... - 741: 00 00 9c 12 a8 12 a1 12 4c 45 44 47 52 45 45 4e ........LEDGREEN - 751: 00 00 00 00 00 00 00 00 b2 12 be 12 b7 12 4c 45 ..............LE - 761: 44 52 45 44 00 00 00 00 00 00 00 00 00 00 c8 12 DRED............ - 771: d4 12 cd 12 4c 4f 47 4d 4f 44 45 00 00 00 00 00 ....LOGMODE..... - 781: 00 00 00 00 de 12 e8 12 e3 12 4c 4f 47 4d 45 4d ..........LOGMEM - 791: 00 00 00 00 00 00 00 00 00 00 f0 12 24 13 0a 13 ............$... - 7a1: 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 00 00 SETTING......... - 7b1: 00 00 49 13 44 13 43 4c 45 41 52 00 00 00 00 00 ..I.D.CLEAR..... - 7c1: 00 00 00 00 00 00 51 13 00 00 00 00 48 45 4c 50 ......Q.....HELP - 7d1: 00 00 00 00 00 00 00 00 00 00 00 00 55 13 00 00 ............U... - 7e1: 00 00 52 53 53 49 00 00 00 00 00 00 00 00 00 00 ..RSSI.......... - 7f1: 00 00 00 00 00 00 a1 13 00 00 00 00 00 00 00 00 ................ - 801: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .............. +00000737 <__c.6227>: + 737: 0d 0a 00 ... -0000080f <__c.6126>: - 80f: 0d 0a 00 ... +0000073a <__c.6225>: + 73a: 0d 0a 00 ... -00000812 <__c.6128>: - 812: 0d 0a 00 ... +0000073d : + 73d: 64 31 30 30 3a 4f 4b 00 00 00 00 00 00 00 00 00 d100:OK......... + 74d: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 75d: 00 65 31 30 31 3a 4f 4b 20 57 49 54 48 20 54 45 .e101:OK WITH TE + 76d: 58 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XT.............. + 77d: 00 00 6e 31 31 30 3a 57 41 49 54 49 4e 47 20 46 ..n110:WAITING F + 78d: 4f 52 20 58 4d 4f 44 45 4d 00 00 00 00 00 00 00 OR XMODEM....... + 79d: 00 00 00 c8 32 30 30 3a 55 4e 4b 4e 4f 57 4e 20 ....200:UNKNOWN + 7ad: 43 4f 4d 4d 41 4e 44 00 00 00 00 00 00 00 00 00 COMMAND......... + 7bd: 00 00 00 00 c9 32 30 31 3a 49 4e 56 41 4c 49 44 .....201:INVALID + 7cd: 20 43 4f 4d 4d 41 4e 44 20 55 53 41 47 45 00 00 COMMAND USAGE.. + 7dd: 00 00 00 00 00 ca 32 30 32 3a 49 4e 56 41 4c 49 ......202:INVALI + 7ed: 44 20 50 41 52 41 4d 45 54 45 52 00 00 00 00 00 D PARAMETER..... + 7fd: 00 00 00 00 00 00 ...... -00000815 : - 815: 64 31 30 30 3a 4f 4b 00 00 00 00 00 00 00 00 00 d100:OK......... - 825: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 835: 00 65 31 30 31 3a 4f 4b 20 57 49 54 48 20 54 45 .e101:OK WITH TE - 845: 58 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XT.............. - 855: 00 00 6e 31 31 30 3a 57 41 49 54 49 4e 47 20 46 ..n110:WAITING F - 865: 4f 52 20 58 4d 4f 44 45 4d 00 00 00 00 00 00 00 OR XMODEM....... - 875: 00 00 00 c8 32 30 30 3a 55 4e 4b 4e 4f 57 4e 20 ....200:UNKNOWN - 885: 43 4f 4d 4d 41 4e 44 00 00 00 00 00 00 00 00 00 COMMAND......... - 895: 00 00 00 00 c9 32 30 31 3a 49 4e 56 41 4c 49 44 .....201:INVALID - 8a5: 20 43 4f 4d 4d 41 4e 44 20 55 53 41 47 45 00 00 COMMAND USAGE.. - 8b5: 00 00 00 00 00 ca 32 30 32 3a 49 4e 56 41 4c 49 ......202:INVALI - 8c5: 44 20 50 41 52 41 4d 45 54 45 52 00 00 00 00 00 D PARAMETER..... - 8d5: 00 00 00 00 00 00 00 ....... +00000803 : + 803: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... + 813: 00 00 00 00 99 11 43 4f 4e 46 49 47 00 00 00 00 ......CONFIG.... + 823: 00 00 00 00 00 00 d6 11 cd 11 b7 11 55 49 44 00 ............UID. + 833: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 12 ................ + 843: dc 11 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 ..READONLY...... + 853: 00 00 00 00 6a 12 58 12 55 50 4c 4f 41 44 00 00 ....j.X.UPLOAD.. + 863: 00 00 00 00 00 00 00 00 7e 12 00 00 00 00 44 4f ........~.....DO + 873: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 83 12 WNLOAD.......... + 883: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... + 893: 00 00 00 00 88 12 00 00 00 00 55 50 47 52 41 44 ..........UPGRAD + 8a3: 45 00 00 00 00 00 00 00 00 00 93 12 00 00 00 00 E............... + 8b3: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... + 8c3: 00 00 00 00 9e 12 55 49 44 53 49 5a 45 00 00 00 ......UIDSIZE... + 8d3: 00 00 00 00 00 00 00 00 00 00 b6 12 42 55 54 54 ............BUTT + 8e3: 4f 4e 00 00 00 00 00 00 00 00 00 00 cc 12 d8 12 ON.............. + 8f3: d1 12 42 55 54 54 4f 4e 5f 4c 4f 4e 47 00 00 00 ..BUTTON_LONG... + 903: 00 00 e2 12 ee 12 e7 12 4c 45 44 47 52 45 45 4e ........LEDGREEN + 913: 00 00 00 00 00 00 00 00 f8 12 04 13 fd 12 4c 45 ..............LE + 923: 44 52 45 44 00 00 00 00 00 00 00 00 00 00 0e 13 DRED............ + 933: 1a 13 13 13 4c 4f 47 4d 4f 44 45 00 00 00 00 00 ....LOGMODE..... + 943: 00 00 00 00 24 13 2e 13 29 13 4c 4f 47 4d 45 4d ....$...).LOGMEM + 953: 00 00 00 00 00 00 00 00 00 00 36 13 6a 13 50 13 ..........6.j.P. + 963: 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 00 00 SETTING......... + 973: 00 00 8f 13 8a 13 43 4c 45 41 52 00 00 00 00 00 ......CLEAR..... + 983: 00 00 00 00 00 00 97 13 00 00 00 00 48 45 4c 50 ............HELP + 993: 00 00 00 00 00 00 00 00 00 00 00 00 9b 13 00 00 ................ + 9a3: 00 00 52 53 53 49 00 00 00 00 00 00 00 00 00 00 ..RSSI.......... + 9b3: 00 00 00 00 00 00 e5 13 00 00 00 00 00 00 00 00 ................ + 9c3: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... -000008dc <__ctors_end>: - 8dc: 11 24 eor r1, r1 - 8de: 1f be out 0x3f, r1 ; 63 - 8e0: cf ef ldi r28, 0xFF ; 255 - 8e2: df e2 ldi r29, 0x2F ; 47 - 8e4: de bf out 0x3e, r29 ; 62 - 8e6: cd bf out 0x3d, r28 ; 61 +000009d2 <__ctors_end>: + 9d2: 11 24 eor r1, r1 + 9d4: 1f be out 0x3f, r1 ; 63 + 9d6: cf ef ldi r28, 0xFF ; 255 + 9d8: cd bf out 0x3d, r28 ; 61 + 9da: df e2 ldi r29, 0x2F ; 47 + 9dc: de bf out 0x3e, r29 ; 62 -000008e8 <__do_copy_data>: - 8e8: 10 e2 ldi r17, 0x20 ; 32 - 8ea: a0 e0 ldi r26, 0x00 ; 0 - 8ec: b0 e2 ldi r27, 0x20 ; 32 - 8ee: ee e8 ldi r30, 0x8E ; 142 - 8f0: f2 e6 ldi r31, 0x62 ; 98 - 8f2: 02 c0 rjmp .+4 ; 0x8f8 <__do_copy_data+0x10> - 8f4: 05 90 lpm r0, Z+ - 8f6: 0d 92 st X+, r0 - 8f8: a2 39 cpi r26, 0x92 ; 146 - 8fa: b1 07 cpc r27, r17 - 8fc: d9 f7 brne .-10 ; 0x8f4 <__do_copy_data+0xc> +000009de <__do_copy_data>: + 9de: 10 e2 ldi r17, 0x20 ; 32 + 9e0: a0 e0 ldi r26, 0x00 ; 0 + 9e2: b0 e2 ldi r27, 0x20 ; 32 + 9e4: ea ee ldi r30, 0xEA ; 234 + 9e6: fe e5 ldi r31, 0x5E ; 94 + 9e8: 02 c0 rjmp .+4 ; 0x9ee <__do_copy_data+0x10> + 9ea: 05 90 lpm r0, Z+ + 9ec: 0d 92 st X+, r0 + 9ee: a2 39 cpi r26, 0x92 ; 146 + 9f0: b1 07 cpc r27, r17 + 9f2: d9 f7 brne .-10 ; 0x9ea <__do_copy_data+0xc> -000008fe <__do_clear_bss>: - 8fe: 2e e2 ldi r18, 0x2E ; 46 - 900: a2 e9 ldi r26, 0x92 ; 146 - 902: b0 e2 ldi r27, 0x20 ; 32 - 904: 01 c0 rjmp .+2 ; 0x908 <.do_clear_bss_start> +000009f4 <__do_clear_bss>: + 9f4: 2e e2 ldi r18, 0x2E ; 46 + 9f6: a2 e9 ldi r26, 0x92 ; 146 + 9f8: b0 e2 ldi r27, 0x20 ; 32 + 9fa: 01 c0 rjmp .+2 ; 0x9fe <.do_clear_bss_start> -00000906 <.do_clear_bss_loop>: - 906: 1d 92 st X+, r1 +000009fc <.do_clear_bss_loop>: + 9fc: 1d 92 st X+, r1 -00000908 <.do_clear_bss_start>: - 908: a9 3c cpi r26, 0xC9 ; 201 - 90a: b2 07 cpc r27, r18 - 90c: e1 f7 brne .-8 ; 0x906 <.do_clear_bss_loop> - 90e: 03 d0 rcall .+6 ; 0x916

- 910: 0c 94 45 31 jmp 0x628a ; 0x628a <_exit> +000009fe <.do_clear_bss_start>: + 9fe: a9 3c cpi r26, 0xC9 ; 201 + a00: b2 07 cpc r27, r18 + a02: e1 f7 brne .-8 ; 0x9fc <.do_clear_bss_loop> + a04: 03 d0 rcall .+6 ; 0xa0c
+ a06: 0c 94 73 2f jmp 0x5ee6 ; 0x5ee6 <_exit> -00000914 <__bad_interrupt>: - 914: 87 c0 rjmp .+270 ; 0xa24 <__vector_default> +00000a0a <__bad_interrupt>: + a0a: 84 c0 rjmp .+264 ; 0xb14 <__vector_default> -00000916
: +00000a0c
: #include "Chameleon-Mini.h" int main(void) { SystemInit(); - 916: 8d d0 rcall .+282 ; 0xa32 + a0c: 8a d0 rcall .+276 ; 0xb22 + a0e: 0e 94 89 0e call 0x1d12 ; 0x1d12 SettingsLoad(); - 918: 0e 94 34 0e call 0x1c68 ; 0x1c68 + a12: 0e 94 f0 0d call 0x1be0 ; 0x1be0 LogInit(); - 91c: 0e 94 d2 0d call 0x1ba4 ; 0x1ba4 + a16: 0e 94 6b 0f call 0x1ed6 ; 0x1ed6 LEDInit(); - 920: 0e 94 1d 0f call 0x1e3a ; 0x1e3a + a1a: 07 d3 rcall .+1550 ; 0x102a MemoryInit(); - 924: fd d2 rcall .+1530 ; 0xf20 + a1c: 2e d1 rcall .+604 ; 0xc7a + a1e: 0e 94 24 11 call 0x2248 ; 0x2248 ConfigurationInit(); - 926: 31 d1 rcall .+610 ; 0xb8a + a22: a7 d1 rcall .+846 ; 0xd72 TerminalInit(); - 928: 0e 94 db 10 call 0x21b6 ; 0x21b6 + a24: 68 d7 rcall .+3792 ; 0x18f6 + a26: 81 e0 ldi r24, 0x01 ; 1 RandomInit(); - 92c: a4 d1 rcall .+840 ; 0xc76 + a28: 80 93 00 02 sts 0x0200, r24 ButtonInit(); - 92e: 95 d7 rcall .+3882 ; 0x185a + a2c: 10 92 01 02 sts 0x0201, r1 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE) static inline void AntennaLevelInit(void) { ADCA.CTRLA = ADC_ENABLE_bm; - 930: 81 e0 ldi r24, 0x01 ; 1 - 932: 80 93 00 02 sts 0x0200, r24 + a30: 92 e0 ldi r25, 0x02 ; 2 + a32: 90 93 02 02 sts 0x0202, r25 ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; - 936: 10 92 01 02 sts 0x0201, r1 + a36: 93 e0 ldi r25, 0x03 ; 3 + a38: 90 93 04 02 sts 0x0204, r25 ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; - 93a: 92 e0 ldi r25, 0x02 ; 2 - 93c: 90 93 02 02 sts 0x0202, r25 + a3c: 80 93 20 02 sts 0x0220, r24 ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; - 940: 93 e0 ldi r25, 0x03 ; 3 - 942: 90 93 04 02 sts 0x0204, r25 + a40: 88 e3 ldi r24, 0x38 ; 56 + a42: 80 93 21 02 sts 0x0221, r24 ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; - 946: 80 93 20 02 sts 0x0220, r24 + a46: ee d0 rcall .+476 ; 0xc24 + a48: 80 91 48 00 lds r24, 0x0048 ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc; - 94a: 88 e3 ldi r24, 0x38 ; 56 - 94c: 80 93 21 02 sts 0x0221, r24 + a4c: 81 60 ori r24, 0x01 ; 1 + a4e: 80 93 48 00 sts 0x0048, r24 AntennaLevelInit(); SystemInterruptInit(); - 950: f1 d0 rcall .+482 ; 0xb34 + a52: c2 e0 ldi r28, 0x02 ; 2 asm volatile("sleep"); } INLINE void SystemSleepEnable(void) { SLEEP.CTRL |= SLEEP_SEN_bm; - 952: 80 91 48 00 lds r24, 0x0048 - 956: 81 60 ori r24, 0x01 ; 1 - 958: 80 93 48 00 sts 0x0048, r24 + a54: 0e c0 rjmp .+28 ; 0xa72 + a56: 0e 94 29 11 call 0x2252 ; 0x2252 + a5a: e0 91 fb 28 lds r30, 0x28FB { if (RTC.INTFLAGS & RTC_COMPIF_bm) { while(RTC.STATUS & RTC_SYNCBUSY_bm) ; RTC.INTFLAGS = RTC_COMPIF_bm; - 95c: c2 e0 ldi r28, 0x02 ; 2 - 95e: 0e c0 rjmp .+28 ; 0x97c + a5e: f0 91 fc 28 lds r31, 0x28FC ButtonTick(); LogTick(); LEDTick(); } TerminalTask(); - 960: 0e 94 e0 10 call 0x21c0 ; 0x21c0 + a62: 09 95 icall + a64: 0e 94 9d 0d call 0x1b3a ; 0x1b3a INLINE void ApplicationInit(void) { ActiveConfiguration.ApplicationInitFunc(); } INLINE void ApplicationTask(void) { ActiveConfiguration.ApplicationTaskFunc(); - 964: e0 91 fb 28 lds r30, 0x28FB - 968: f0 91 fc 28 lds r31, 0x28FC - 96c: 09 95 icall + a68: e0 91 f5 28 lds r30, 0x28F5 + a6c: f0 91 f6 28 lds r31, 0x28F6 ApplicationTask(); LogTask(); - 96e: 0e 94 48 0d call 0x1a90 ; 0x1a90 + a70: 09 95 icall + a72: 80 91 03 04 lds r24, 0x0403 INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); } INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); - 972: e0 91 f5 28 lds r30, 0x28F5 - 976: f0 91 f6 28 lds r31, 0x28F6 - 97a: 09 95 icall + a76: 81 ff sbrs r24, 1 + a78: ee cf rjmp .-36 ; 0xa56 + a7a: 80 91 01 04 lds r24, 0x0401 INLINE void SystemSleepDisable(void); INLINE void SystemSleepSetMode(uint8_t SleepMode); INLINE bool SystemTick100ms(void) { if (RTC.INTFLAGS & RTC_COMPIF_bm) { - 97c: 80 91 03 04 lds r24, 0x0403 - 980: 81 ff sbrs r24, 1 - 982: ee cf rjmp .-36 ; 0x960 + a7e: 80 fd sbrc r24, 0 + a80: fc cf rjmp .-8 ; 0xa7a + a82: c0 93 03 04 sts 0x0403, r28 while(RTC.STATUS & RTC_SYNCBUSY_bm) - 984: 80 91 01 04 lds r24, 0x0401 - 988: 80 fd sbrc r24, 0 - 98a: fc cf rjmp .-8 ; 0x984 + a86: 89 d1 rcall .+786 ; 0xd9a + a88: 0e 94 4a 11 call 0x2294 ; 0x2294 + a8c: 3b d7 rcall .+3702 ; 0x1904 ; RTC.INTFLAGS = RTC_COMPIF_bm; - 98c: c0 93 03 04 sts 0x0403, r28 + a8e: 0e 94 9c 0d call 0x1b38 ; 0x1b38 SystemInterruptInit(); SystemSleepEnable(); while(1) { if (SystemTick100ms()) { RandomTick(); - 990: 85 d1 rcall .+778 ; 0xc9c + a92: 0e 94 70 0f call 0x1ee0 ; 0x1ee0 TerminalTick(); - 992: 0e 94 01 11 call 0x2202 ; 0x2202 - ButtonTick(); - 996: 68 d7 rcall .+3792 ; 0x1868 - LogTick(); - 998: 0e 94 47 0d call 0x1a8e ; 0x1a8e - LEDTick(); - 99c: 0e 94 22 0f call 0x1e44 ; 0x1e44 - 9a0: df cf rjmp .-66 ; 0x960 + a96: df cf rjmp .-66 ; 0xa56 -000009a2 : - break; - } - - *DescriptorAddress = Address; - return Size; -} - 9a2: 29 2f mov r18, r25 - 9a4: 33 27 eor r19, r19 +00000a98 : + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + a98: 29 2f mov r18, r25 + a9a: 33 27 eor r19, r19 const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) - 9a6: 22 30 cpi r18, 0x02 ; 2 - 9a8: 31 05 cpc r19, r1 - 9aa: 39 f1 breq .+78 ; 0x9fa - 9ac: 23 30 cpi r18, 0x03 ; 3 - 9ae: 31 05 cpc r19, r1 - 9b0: a9 f0 breq .+42 ; 0x9dc - 9b2: 21 30 cpi r18, 0x01 ; 1 - 9b4: 31 05 cpc r19, r1 - 9b6: 49 f0 breq .+18 ; 0x9ca + a9c: 22 30 cpi r18, 0x02 ; 2 + a9e: 31 05 cpc r19, r1 + aa0: 29 f1 breq .+74 ; 0xaec + aa2: 23 30 cpi r18, 0x03 ; 3 + aa4: 31 05 cpc r19, r1 + aa6: 99 f0 breq .+38 ; 0xace + aa8: 21 30 cpi r18, 0x01 ; 1 + aaa: 31 05 cpc r19, r1 + aac: 41 f0 breq .+16 ; 0xabe { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - 9b8: 20 e0 ldi r18, 0x00 ; 0 - 9ba: 30 e0 ldi r19, 0x00 ; 0 + aae: 80 e0 ldi r24, 0x00 ; 0 + ab0: 90 e0 ldi r25, 0x00 ; 0 const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; - 9bc: 80 e0 ldi r24, 0x00 ; 0 - 9be: 90 e0 ldi r25, 0x00 ; 0 + ab2: 20 e0 ldi r18, 0x00 ; 0 + ab4: 30 e0 ldi r19, 0x00 ; 0 } break; } *DescriptorAddress = Address; - 9c0: fa 01 movw r30, r20 - 9c2: 80 83 st Z, r24 - 9c4: 91 83 std Z+1, r25 ; 0x01 + ab6: fa 01 movw r30, r20 + ab8: 20 83 st Z, r18 + aba: 31 83 std Z+1, r19 ; 0x01 return Size; } - 9c6: c9 01 movw r24, r18 - 9c8: 08 95 ret + abc: 08 95 ret switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); - 9ca: 22 e1 ldi r18, 0x12 ; 18 - 9cc: 30 e0 ldi r19, 0x00 ; 0 + abe: 82 e1 ldi r24, 0x12 ; 18 + ac0: 90 e0 ldi r25, 0x00 ; 0 uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; - 9ce: 86 e7 ldi r24, 0x76 ; 118 - 9d0: 92 e0 ldi r25, 0x02 ; 2 + ac2: 2c e6 ldi r18, 0x6C ; 108 + ac4: 33 e0 ldi r19, 0x03 ; 3 } break; } *DescriptorAddress = Address; - 9d2: fa 01 movw r30, r20 - 9d4: 80 83 st Z, r24 - 9d6: 91 83 std Z+1, r25 ; 0x01 + ac6: fa 01 movw r30, r20 + ac8: 20 83 st Z, r18 + aca: 31 83 std Z+1, r19 ; 0x01 return Size; } - 9d8: c9 01 movw r24, r18 - 9da: 08 95 ret - 9dc: 99 27 eor r25, r25 + acc: 08 95 ret + ace: 99 27 eor r25, r25 case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: switch (DescriptorNumber) - 9de: 81 30 cpi r24, 0x01 ; 1 - 9e0: 91 05 cpc r25, r1 - 9e2: a1 f0 breq .+40 ; 0xa0c - 9e4: 82 30 cpi r24, 0x02 ; 2 - 9e6: 91 05 cpc r25, r1 - 9e8: b9 f0 breq .+46 ; 0xa18 - 9ea: 89 2b or r24, r25 - 9ec: 29 f7 brne .-54 ; 0x9b8 + ad0: 81 30 cpi r24, 0x01 ; 1 + ad2: 91 05 cpc r25, r1 + ad4: 99 f0 breq .+38 ; 0xafc + ad6: 82 30 cpi r24, 0x02 ; 2 + ad8: 91 05 cpc r25, r1 + ada: b1 f0 breq .+44 ; 0xb08 + adc: 89 2b or r24, r25 + ade: 39 f7 brne .-50 ; 0xaae { case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); - 9ee: e4 e3 ldi r30, 0x34 ; 52 - 9f0: f2 e0 ldi r31, 0x02 ; 2 - 9f2: 24 91 lpm r18, Z - 9f4: 30 e0 ldi r19, 0x00 ; 0 + ae0: ea e2 ldi r30, 0x2A ; 42 + ae2: f3 e0 ldi r31, 0x03 ; 3 + ae4: 84 91 lpm r24, Z + ae6: 90 e0 ldi r25, 0x00 ; 0 break; case DTYPE_String: switch (DescriptorNumber) { case 0x00: Address = &LanguageString; - 9f6: cf 01 movw r24, r30 + ae8: 9f 01 movw r18, r30 Size = pgm_read_byte(&LanguageString.Header.Size); break; - 9f8: e3 cf rjmp .-58 ; 0x9c0 + aea: e5 cf rjmp .-54 ; 0xab6 Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); - 9fa: 2e e3 ldi r18, 0x3E ; 62 - 9fc: 30 e0 ldi r19, 0x00 ; 0 + aec: 8e e3 ldi r24, 0x3E ; 62 + aee: 90 e0 ldi r25, 0x00 ; 0 case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; - 9fe: 88 e3 ldi r24, 0x38 ; 56 - a00: 92 e0 ldi r25, 0x02 ; 2 + af0: 2e e2 ldi r18, 0x2E ; 46 + af2: 33 e0 ldi r19, 0x03 ; 3 } break; } *DescriptorAddress = Address; - a02: fa 01 movw r30, r20 - a04: 80 83 st Z, r24 - a06: 91 83 std Z+1, r25 ; 0x01 + af4: fa 01 movw r30, r20 + af6: 20 83 st Z, r18 + af8: 31 83 std Z+1, r19 ; 0x01 return Size; } - a08: c9 01 movw r24, r18 - a0a: 08 95 ret + afa: 08 95 ret Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); break; case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); - a0c: ea e1 ldi r30, 0x1A ; 26 - a0e: f2 e0 ldi r31, 0x02 ; 2 - a10: 24 91 lpm r18, Z - a12: 30 e0 ldi r19, 0x00 ; 0 + afc: e0 e1 ldi r30, 0x10 ; 16 + afe: f3 e0 ldi r31, 0x03 ; 3 + b00: 84 91 lpm r24, Z + b02: 90 e0 ldi r25, 0x00 ; 0 case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); break; case 0x01: Address = &ManufacturerString; - a14: cf 01 movw r24, r30 + b04: 9f 01 movw r18, r30 Size = pgm_read_byte(&ManufacturerString.Header.Size); break; - a16: d4 cf rjmp .-88 ; 0x9c0 + b06: d7 cf rjmp .-82 ; 0xab6 case 0x02: Address = &ProductString; Size = pgm_read_byte(&ProductString.Header.Size); - a18: ec ef ldi r30, 0xFC ; 252 - a1a: f1 e0 ldi r31, 0x01 ; 1 - a1c: 24 91 lpm r18, Z - a1e: 30 e0 ldi r19, 0x00 ; 0 + b08: e2 ef ldi r30, 0xF2 ; 242 + b0a: f2 e0 ldi r31, 0x02 ; 2 + b0c: 84 91 lpm r24, Z + b0e: 90 e0 ldi r25, 0x00 ; 0 case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); break; case 0x02: Address = &ProductString; - a20: cf 01 movw r24, r30 + b10: 9f 01 movw r18, r30 Size = pgm_read_byte(&ProductString.Header.Size); break; - a22: ce cf rjmp .-100 ; 0x9c0 + b12: d1 cf rjmp .-94 ; 0xab6 + +00000b14 <__vector_default>: +#define WDT_PER_500CLK_gc WDT_PER_512CLK_gc +#endif -00000a24 <__vector_default>: -#include "System.h" -#include "LED.h" -#include ISR(BADISR_vect) { - a24: 1f 92 push r1 - a26: 0f 92 push r0 - a28: 0f b6 in r0, 0x3f ; 63 - a2a: 0f 92 push r0 - a2c: 11 24 eor r1, r1 - a2e: ff cf rjmp .-2 ; 0xa2e <__vector_default+0xa> + b14: 1f 92 push r1 + b16: 0f 92 push r0 + b18: 0f b6 in r0, 0x3f ; 63 + b1a: 0f 92 push r0 + b1c: 11 24 eor r1, r1 + b1e: ff cf rjmp .-2 ; 0xb1e <__vector_default+0xa> -00000a30 <__vector_10>: +00000b20 <__vector_10>: while(1); } EMPTY_INTERRUPT(RTC_OVF_vect); - a30: 18 95 reti + b20: 18 95 reti -00000a32 : +00000b22 : void SystemInit(void) { if (RST.STATUS & RST_WDRF_bm) { - a32: 80 91 78 00 lds r24, 0x0078 - a36: 83 ff sbrs r24, 3 - a38: 0a c0 rjmp .+20 ; 0xa4e + b22: 80 91 78 00 lds r24, 0x0078 + b26: 83 ff sbrs r24, 3 + b28: 0a c0 rjmp .+20 ; 0xb3e /* On Watchdog reset clear WDRF bit, disable watchdog * and jump into bootloader */ RST.STATUS = RST_WDRF_bm; - a3a: 88 e0 ldi r24, 0x08 ; 8 - a3c: 80 93 78 00 sts 0x0078, r24 + b2a: 88 e0 ldi r24, 0x08 ; 8 + b2c: 80 93 78 00 sts 0x0078, r24 CCP = CCP_IOREG_gc; - a40: 88 ed ldi r24, 0xD8 ; 216 - a42: 84 bf out 0x34, r24 ; 52 + b30: 88 ed ldi r24, 0xD8 ; 216 + b32: 84 bf out 0x34, r24 ; 52 WDT.CTRL = WDT_CEN_bm; - a44: 81 e0 ldi r24, 0x01 ; 1 - a46: 80 93 80 00 sts 0x0080, r24 + b34: 81 e0 ldi r24, 0x01 ; 1 + b36: 80 93 80 00 sts 0x0080, r24 asm volatile ("jmp %0"::"i" (BOOT_SECTION_START + 0x1FC)); - a4a: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f1edc> + b3a: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f2280> } /* 32MHz system clock using internal RC and 32K DFLL*/ OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm; - a4e: 80 91 50 00 lds r24, 0x0050 - a52: 86 60 ori r24, 0x06 ; 6 - a54: 80 93 50 00 sts 0x0050, r24 + b3e: 80 91 50 00 lds r24, 0x0050 + b42: 86 60 ori r24, 0x06 ; 6 + b44: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_RC32MRDY_bm)) - a58: 80 91 51 00 lds r24, 0x0051 - a5c: 81 ff sbrs r24, 1 - a5e: fc cf rjmp .-8 ; 0xa58 + b48: 80 91 51 00 lds r24, 0x0051 + b4c: 81 ff sbrs r24, 1 + b4e: fc cf rjmp .-8 ; 0xb48 ; while(!(OSC.STATUS & OSC_RC32KRDY_bm)) - a60: 80 91 51 00 lds r24, 0x0051 - a64: 82 ff sbrs r24, 2 - a66: fc cf rjmp .-8 ; 0xa60 + b50: 80 91 51 00 lds r24, 0x0051 + b54: 82 ff sbrs r24, 2 + b56: fc cf rjmp .-8 ; 0xb50 ; OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; - a68: 10 92 56 00 sts 0x0056, r1 + b58: 10 92 56 00 sts 0x0056, r1 DFLLRC32M.CTRL = DFLL_ENABLE_bm; - a6c: 21 e0 ldi r18, 0x01 ; 1 - a6e: 20 93 60 00 sts 0x0060, r18 + b5c: 21 e0 ldi r18, 0x01 ; 1 + b5e: 20 93 60 00 sts 0x0060, r18 CCP = CCP_IOREG_gc; - a72: 88 ed ldi r24, 0xD8 ; 216 - a74: 84 bf out 0x34, r24 ; 52 + b62: 88 ed ldi r24, 0xD8 ; 216 + b64: 84 bf out 0x34, r24 ; 52 CLK.CTRL = CLK_SCLKSEL_RC32M_gc; - a76: 20 93 40 00 sts 0x0040, r18 + b66: 20 93 40 00 sts 0x0040, r18 /* Use TCE0 as system tick */ TCE0.PER = F_CPU / 256 / SYSTEM_TICK_FREQ - 1; - a7a: 83 ed ldi r24, 0xD3 ; 211 - a7c: 90 e3 ldi r25, 0x30 ; 48 - a7e: 80 93 26 0a sts 0x0A26, r24 - a82: 90 93 27 0a sts 0x0A27, r25 + b6a: 83 ed ldi r24, 0xD3 ; 211 + b6c: 90 e3 ldi r25, 0x30 ; 48 + b6e: 80 93 26 0a sts 0x0A26, r24 + b72: 90 93 27 0a sts 0x0A27, r25 TCE0.CTRLA = TC_CLKSEL_DIV256_gc; - a86: 86 e0 ldi r24, 0x06 ; 6 - a88: 80 93 00 0a sts 0x0A00, r24 + b76: 86 e0 ldi r24, 0x06 ; 6 + b78: 80 93 00 0a sts 0x0A00, r24 /* Enable RTC with roughly 1kHz clock for system tick * and to wake up while sleeping. */ CLK.RTCCTRL = CLK_RTCSRC_ULP_gc | CLK_RTCEN_bm; - a8c: 20 93 43 00 sts 0x0043, r18 + b7c: 20 93 43 00 sts 0x0043, r18 RTC.PER = 1000 / SYSTEM_TICK_FREQ - 1; - a90: 83 e6 ldi r24, 0x63 ; 99 - a92: 90 e0 ldi r25, 0x00 ; 0 - a94: 80 93 0a 04 sts 0x040A, r24 - a98: 90 93 0b 04 sts 0x040B, r25 + b80: 83 e6 ldi r24, 0x63 ; 99 + b82: 90 e0 ldi r25, 0x00 ; 0 + b84: 80 93 0a 04 sts 0x040A, r24 + b88: 90 93 0b 04 sts 0x040B, r25 RTC.COMP = 1000 / SYSTEM_TICK_FREQ - 1; - a9c: 80 93 0c 04 sts 0x040C, r24 - aa0: 90 93 0d 04 sts 0x040D, r25 + b8c: 80 93 0c 04 sts 0x040C, r24 + b90: 90 93 0d 04 sts 0x040D, r25 RTC.CTRL = RTC_PRESCALER_DIV1_gc; - aa4: 20 93 00 04 sts 0x0400, r18 + b94: 20 93 00 04 sts 0x0400, r18 RTC.INTCTRL = RTC_OVFINTLVL_LO_gc; - aa8: 20 93 02 04 sts 0x0402, r18 + b98: 20 93 02 04 sts 0x0402, r18 /* Enable EEPROM data memory mapping */ NVM.CTRLB |= NVM_EEMAPEN_bm; - aac: 80 91 cc 01 lds r24, 0x01CC - ab0: 88 60 ori r24, 0x08 ; 8 - ab2: 80 93 cc 01 sts 0x01CC, r24 - ab6: 08 95 ret + b9c: 80 91 cc 01 lds r24, 0x01CC + ba0: 88 60 ori r24, 0x08 ; 8 + ba2: 80 93 cc 01 sts 0x01CC, r24 + ba6: 08 95 ret -00000ab8 : +00000ba8 : } void SystemReset(void) { CCP = CCP_IOREG_gc; - ab8: 88 ed ldi r24, 0xD8 ; 216 - aba: 84 bf out 0x34, r24 ; 52 + ba8: 88 ed ldi r24, 0xD8 ; 216 + baa: 84 bf out 0x34, r24 ; 52 RST.CTRL = RST_SWRST_bm; - abc: 81 e0 ldi r24, 0x01 ; 1 - abe: e8 e7 ldi r30, 0x78 ; 120 - ac0: f0 e0 ldi r31, 0x00 ; 0 - ac2: 81 83 std Z+1, r24 ; 0x01 - ac4: 08 95 ret + bac: 81 e0 ldi r24, 0x01 ; 1 + bae: e8 e7 ldi r30, 0x78 ; 120 + bb0: f0 e0 ldi r31, 0x00 ; 0 + bb2: 81 83 std Z+1, r24 ; 0x01 + bb4: 08 95 ret -00000ac6 : +00000bb6 : } void SystemEnterBootloader(void) { /* Use Watchdog timer to reset into bootloader. */ CCP = CCP_IOREG_gc; - ac6: 88 ed ldi r24, 0xD8 ; 216 - ac8: 84 bf out 0x34, r24 ; 52 + bb6: 88 ed ldi r24, 0xD8 ; 216 + bb8: 84 bf out 0x34, r24 ; 52 WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; - aca: 8b e1 ldi r24, 0x1B ; 27 - acc: 80 93 80 00 sts 0x0080, r24 - ad0: 08 95 ret + bba: 8b e1 ldi r24, 0x1B ; 27 + bbc: 80 93 80 00 sts 0x0080, r24 + bc0: 08 95 ret -00000ad2 : +00000bc2 : SLEEP.CTRL |= SLEEP_SEN_bm; } INLINE void SystemSleepDisable(void) { SLEEP.CTRL &= ~SLEEP_SEN_bm; - ad2: 80 91 48 00 lds r24, 0x0048 - ad6: 8e 7f andi r24, 0xFE ; 254 - ad8: 80 93 48 00 sts 0x0048, r24 + bc2: 80 91 48 00 lds r24, 0x0048 + bc6: 8e 7f andi r24, 0xFE ; 254 + bc8: 80 93 48 00 sts 0x0048, r24 void SystemStartUSBClock(void) { SystemSleepDisable(); /* 48MHz USB Clock using 12MHz XTAL */ OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; - adc: 8b ec ldi r24, 0xCB ; 203 - ade: 80 93 52 00 sts 0x0052, r24 + bcc: 8b ec ldi r24, 0xCB ; 203 + bce: 80 93 52 00 sts 0x0052, r24 OSC.CTRL |= OSC_XOSCEN_bm; - ae2: 80 91 50 00 lds r24, 0x0050 - ae6: 88 60 ori r24, 0x08 ; 8 - ae8: 80 93 50 00 sts 0x0050, r24 + bd2: 80 91 50 00 lds r24, 0x0050 + bd6: 88 60 ori r24, 0x08 ; 8 + bd8: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_XOSCRDY_bm)) - aec: 80 91 51 00 lds r24, 0x0051 - af0: 83 ff sbrs r24, 3 - af2: fc cf rjmp .-8 ; 0xaec + bdc: 80 91 51 00 lds r24, 0x0051 + be0: 83 ff sbrs r24, 3 + be2: fc cf rjmp .-8 ; 0xbdc ; OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (4 << OSC_PLLFAC_gp); - af4: 84 ec ldi r24, 0xC4 ; 196 - af6: 80 93 55 00 sts 0x0055, r24 + be4: 84 ec ldi r24, 0xC4 ; 196 + be6: 80 93 55 00 sts 0x0055, r24 OSC.CTRL |= OSC_PLLEN_bm; - afa: 80 91 50 00 lds r24, 0x0050 - afe: 80 61 ori r24, 0x10 ; 16 - b00: 80 93 50 00 sts 0x0050, r24 + bea: 80 91 50 00 lds r24, 0x0050 + bee: 80 61 ori r24, 0x10 ; 16 + bf0: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_PLLRDY_bm)) - b04: 80 91 51 00 lds r24, 0x0051 - b08: 84 ff sbrs r24, 4 - b0a: fc cf rjmp .-8 ; 0xb04 + bf4: 80 91 51 00 lds r24, 0x0051 + bf8: 84 ff sbrs r24, 4 + bfa: fc cf rjmp .-8 ; 0xbf4 ; } - b0c: 08 95 ret + bfc: 08 95 ret -00000b0e : +00000bfe : asm volatile("sleep"); } INLINE void SystemSleepEnable(void) { SLEEP.CTRL |= SLEEP_SEN_bm; - b0e: e8 e4 ldi r30, 0x48 ; 72 - b10: f0 e0 ldi r31, 0x00 ; 0 - b12: 80 81 ld r24, Z - b14: 81 60 ori r24, 0x01 ; 1 - b16: 80 83 st Z, r24 + bfe: e8 e4 ldi r30, 0x48 ; 72 + c00: f0 e0 ldi r31, 0x00 ; 0 + c02: 80 81 ld r24, Z + c04: 81 60 ori r24, 0x01 ; 1 + c06: 80 83 st Z, r24 void SystemStopUSBClock(void) { SystemSleepEnable(); /* Disable USB Clock to minimize power consumption */ CLK.USBCTRL &= ~CLK_USBSEN_bm; - b18: e0 e4 ldi r30, 0x40 ; 64 - b1a: f0 e0 ldi r31, 0x00 ; 0 - b1c: 84 81 ldd r24, Z+4 ; 0x04 - b1e: 8e 7f andi r24, 0xFE ; 254 - b20: 84 83 std Z+4, r24 ; 0x04 + c08: e0 e4 ldi r30, 0x40 ; 64 + c0a: f0 e0 ldi r31, 0x00 ; 0 + c0c: 84 81 ldd r24, Z+4 ; 0x04 + c0e: 8e 7f andi r24, 0xFE ; 254 + c10: 84 83 std Z+4, r24 ; 0x04 OSC.CTRL &= ~OSC_PLLEN_bm; - b22: e0 e5 ldi r30, 0x50 ; 80 - b24: f0 e0 ldi r31, 0x00 ; 0 - b26: 80 81 ld r24, Z - b28: 8f 7e andi r24, 0xEF ; 239 - b2a: 80 83 st Z, r24 + c12: e0 e5 ldi r30, 0x50 ; 80 + c14: f0 e0 ldi r31, 0x00 ; 0 + c16: 80 81 ld r24, Z + c18: 8f 7e andi r24, 0xEF ; 239 + c1a: 80 83 st Z, r24 OSC.CTRL &= ~OSC_XOSCEN_bm; - b2c: 80 81 ld r24, Z - b2e: 87 7f andi r24, 0xF7 ; 247 - b30: 80 83 st Z, r24 - b32: 08 95 ret + c1c: 80 81 ld r24, Z + c1e: 87 7f andi r24, 0xF7 ; 247 + c20: 80 83 st Z, r24 + c22: 08 95 ret -00000b34 : +00000c24 : } void SystemInterruptInit(void) { /* Enable all interrupt levels */ PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; - b34: 87 e0 ldi r24, 0x07 ; 7 - b36: e0 ea ldi r30, 0xA0 ; 160 - b38: f0 e0 ldi r31, 0x00 ; 0 - b3a: 82 83 std Z+2, r24 ; 0x02 + c24: 87 e0 ldi r24, 0x07 ; 7 + c26: e0 ea ldi r30, 0xA0 ; 160 + c28: f0 e0 ldi r31, 0x00 ; 0 + c2a: 82 83 std Z+2, r24 ; 0x02 sei(); - b3c: 78 94 sei - b3e: 08 95 ret + c2c: 78 94 sei + c2e: 08 95 ret -00000b40 : +00000c30 : /* Include all Codecs and Applications */ #include "Codec/Codec.h" #include "Application/Application.h" static void CodecInitDummy(void) { } - b40: 08 95 ret + c30: 08 95 ret -00000b42 : +00000c32 : static void CodecTaskDummy(void) { } - b42: 08 95 ret + c32: 08 95 ret -00000b44 : +00000c34 : static void ApplicationInitDummy(void) {} - b44: 08 95 ret + c34: 08 95 ret -00000b46 : +00000c36 : static void ApplicationResetDummy(void) {} - b46: 08 95 ret + c36: 08 95 ret -00000b48 : +00000c38 : static void ApplicationTaskDummy(void) {} - b48: 08 95 ret + c38: 08 95 ret -00000b4a : +00000c3a : static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } - b4a: 80 e0 ldi r24, 0x00 ; 0 - b4c: 90 e0 ldi r25, 0x00 ; 0 - b4e: 08 95 ret + c3a: 80 e0 ldi r24, 0x00 ; 0 + c3c: 90 e0 ldi r25, 0x00 ; 0 + c3e: 08 95 ret -00000b50 : +00000c40 : static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } - b50: 08 95 ret + c40: 08 95 ret -00000b52 : +00000c42 : static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } - b52: 08 95 ret + c42: 08 95 ret -00000b54 : +00000c44 : ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); } void ConfigurationSetById( ConfigurationEnum Configuration ) { GlobalSettings.ActiveSettingPtr->Configuration = Configuration; - b54: e0 91 0a 29 lds r30, 0x290A - b58: f0 91 0b 29 lds r31, 0x290B - b5c: 83 83 std Z+3, r24 ; 0x03 + c44: e0 91 0a 29 lds r30, 0x290A + c48: f0 91 0b 29 lds r31, 0x290B + c4c: 83 83 std Z+3, r24 ; 0x03 /* Copy struct from PROGMEM to RAM */ memcpy_P(&ActiveConfiguration, &ConfigurationTable[Configuration], sizeof(ConfigurationType)); - b5e: 95 e2 ldi r25, 0x25 ; 37 - b60: 89 9f mul r24, r25 - b62: b0 01 movw r22, r0 - b64: 11 24 eor r1, r1 - b66: 68 57 subi r22, 0x78 ; 120 - b68: 7d 4f sbci r23, 0xFD ; 253 + c4e: 95 e2 ldi r25, 0x25 ; 37 + c50: 89 9f mul r24, r25 + c52: b0 01 movw r22, r0 + c54: 11 24 eor r1, r1 + c56: 62 58 subi r22, 0x82 ; 130 + c58: 7c 4f sbci r23, 0xFC ; 252 void ConfigurationSetById( ConfigurationEnum Configuration ) { GlobalSettings.ActiveSettingPtr->Configuration = Configuration; /* Copy struct from PROGMEM to RAM */ memcpy_P(&ActiveConfiguration, - b6a: 45 e2 ldi r20, 0x25 ; 37 - b6c: 50 e0 ldi r21, 0x00 ; 0 - b6e: 82 ee ldi r24, 0xE2 ; 226 - b70: 98 e2 ldi r25, 0x28 ; 40 - b72: 0e 94 cc 2d call 0x5b98 ; 0x5b98 + c5a: 45 e2 ldi r20, 0x25 ; 37 + c5c: 50 e0 ldi r21, 0x00 ; 0 + c5e: 82 ee ldi r24, 0xE2 ; 226 + c60: 98 e2 ldi r25, 0x28 ; 40 + c62: 0e 94 f6 2b call 0x57ec ; 0x57ec #include "MifareClassic.h" /* Function wrappers */ INLINE void ApplicationInit(void) { ActiveConfiguration.ApplicationInitFunc(); - b76: e0 91 f7 28 lds r30, 0x28F7 - b7a: f0 91 f8 28 lds r31, 0x28F8 - b7e: 09 95 icall + c66: e0 91 f7 28 lds r30, 0x28F7 + c6a: f0 91 f8 28 lds r31, 0x28F8 + c6e: 09 95 icall #define CODEC_CARRIER_FREQ 13560000 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); - b80: e0 91 f3 28 lds r30, 0x28F3 - b84: f0 91 f4 28 lds r31, 0x28F4 - b88: 09 94 ijmp + c70: e0 91 f3 28 lds r30, 0x28F3 + c74: f0 91 f4 28 lds r31, 0x28F4 + c78: 09 94 ijmp -00000b8a : +00000c7a : ConfigurationType ActiveConfiguration; void ConfigurationInit(void) { ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); - b8a: e0 91 0a 29 lds r30, 0x290A - b8e: f0 91 0b 29 lds r31, 0x290B - b92: 83 81 ldd r24, Z+3 ; 0x03 - b94: df cf rjmp .-66 ; 0xb54 + c7a: e0 91 0a 29 lds r30, 0x290A + c7e: f0 91 0b 29 lds r31, 0x290B + c82: 83 81 ldd r24, Z+3 ; 0x03 + c84: df cf rjmp .-66 ; 0xc44 -00000b96 : +00000c86 : ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) { - b96: 0f 93 push r16 - b98: 1f 93 push r17 - b9a: cf 93 push r28 - b9c: df 93 push r29 - b9e: 20 e0 ldi r18, 0x00 ; 0 - ba0: 30 e0 ldi r19, 0x00 ; 0 + c86: 0f 93 push r16 + c88: 1f 93 push r17 + c8a: cf 93 push r28 + c8c: df 93 push r29 + c8e: 4f e7 ldi r20, 0x7F ; 127 + c90: 53 e0 ldi r21, 0x03 ; 3 uint8_t i; /* Loop through table trying to find the configuration */ for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { + c92: 10 e0 ldi r17, 0x00 ; 0 + c94: bc 01 movw r22, r24 + c96: 6f 5f subi r22, 0xFF ; 255 + c98: 7f 4f sbci r23, 0xFF ; 255 const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; - ba2: 15 e2 ldi r17, 0x25 ; 37 - - ApplicationInit(); - CodecInit(); -} - -bool ConfigurationSetByName(const char* ConfigurationName) - ba4: ac 01 movw r20, r24 - ba6: 4f 5f subi r20, 0xFF ; 255 - ba8: 5f 4f sbci r21, 0xFF ; 255 - baa: 02 2f mov r16, r18 -{ - uint8_t i; - - /* Loop through table trying to find the configuration */ - for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { - const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; - bac: 12 9f mul r17, r18 - bae: f0 01 movw r30, r0 - bb0: 13 9f mul r17, r19 - bb2: f0 0d add r31, r0 - bb4: 11 24 eor r1, r1 - bb6: e7 57 subi r30, 0x77 ; 119 - bb8: fd 4f sbci r31, 0xFD ; 253 + c9a: 9a 01 movw r18, r20 const char* pRequestedConfigName = ConfigurationName; bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); - bba: 64 91 lpm r22, Z + c9c: fa 01 movw r30, r20 + c9e: c4 91 lpm r28, Z /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - bbc: 61 11 cpse r22, r1 - bbe: 0f c0 rjmp .+30 ; 0xbde + ca0: c1 11 cpse r28, r1 + ca2: 0f c0 rjmp .+30 ; 0xcc2 uint8_t i; /* Loop through table trying to find the configuration */ for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; const char* pRequestedConfigName = ConfigurationName; - bc0: ec 01 movw r28, r24 + ca4: ec 01 movw r28, r24 bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - bc2: 68 81 ld r22, Y - bc4: 66 23 and r22, r22 - bc6: 01 f1 breq .+64 ; 0xc08 - bc8: 2f 5f subi r18, 0xFF ; 255 - bca: 3f 4f sbci r19, 0xFF ; 255 + ca6: 28 81 ld r18, Y + ca8: 22 23 and r18, r18 + caa: 11 f1 breq .+68 ; 0xcf0 bool ConfigurationSetByName(const char* ConfigurationName) { uint8_t i; /* Loop through table trying to find the configuration */ for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { - bcc: 26 30 cpi r18, 0x06 ; 6 - bce: 31 05 cpc r19, r1 - bd0: 61 f7 brne .-40 ; 0xbaa + cac: 1f 5f subi r17, 0xFF ; 255 + cae: 4b 5d subi r20, 0xDB ; 219 + cb0: 5f 4f sbci r21, 0xFF ; 255 + cb2: 16 30 cpi r17, 0x06 ; 6 + cb4: 91 f7 brne .-28 ; 0xc9a ConfigurationSetById(i); return true; } } return false; - bd2: 80 e0 ldi r24, 0x00 ; 0 + cb6: 80 e0 ldi r24, 0x00 ; 0 } - bd4: df 91 pop r29 - bd6: cf 91 pop r28 - bd8: 1f 91 pop r17 - bda: 0f 91 pop r16 - bdc: 08 95 ret + cb8: df 91 pop r29 + cba: cf 91 pop r28 + cbc: 1f 91 pop r17 + cbe: 0f 91 pop r16 + cc0: 08 95 ret bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - bde: dc 01 movw r26, r24 - be0: 7c 91 ld r23, X - be2: 77 23 and r23, r23 - be4: 89 f3 breq .-30 ; 0xbc8 + cc2: dc 01 movw r26, r24 + cc4: fc 91 ld r31, X + cc6: ff 23 and r31, r31 + cc8: 89 f3 breq .-30 ; 0xcac /* One String ended before the other did -> unequal length */ StringMismatch = true; break; } if (c != *pRequestedConfigName) { - be6: 67 13 cpse r22, r23 - be8: ef cf rjmp .-34 ; 0xbc8 - - ApplicationInit(); - CodecInit(); -} - -bool ConfigurationSetByName(const char* ConfigurationName) - bea: da 01 movw r26, r20 - bec: 05 c0 rjmp .+10 ; 0xbf8 + cca: cf 13 cpse r28, r31 + ccc: ef cf rjmp .-34 ; 0xcac + cce: db 01 movw r26, r22 + cd0: 05 c0 rjmp .+10 ; 0xcdc bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - bee: 7d 91 ld r23, X+ - bf0: 77 23 and r23, r23 - bf2: 51 f3 breq .-44 ; 0xbc8 + cd2: fd 91 ld r31, X+ + cd4: ff 23 and r31, r31 + cd6: 51 f3 breq .-44 ; 0xcac /* One String ended before the other did -> unequal length */ StringMismatch = true; break; } if (c != *pRequestedConfigName) { - bf4: 76 13 cpse r23, r22 - bf6: e8 cf rjmp .-48 ; 0xbc8 + cd8: f0 13 cpse r31, r16 + cda: e8 cf rjmp .-48 ; 0xcac StringMismatch = true; break; } /* Proceed to next character */ pTableConfigName++; - bf8: 31 96 adiw r30, 0x01 ; 1 + cdc: 2f 5f subi r18, 0xFF ; 255 + cde: 3f 4f sbci r19, 0xFF ; 255 pRequestedConfigName++; - bfa: ed 01 movw r28, r26 + ce0: ed 01 movw r28, r26 c = pgm_read_byte(pTableConfigName); - bfc: 64 91 lpm r22, Z + ce2: f9 01 movw r30, r18 + ce4: 04 91 lpm r16, Z const char* pRequestedConfigName = ConfigurationName; bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - bfe: 61 11 cpse r22, r1 - c00: f6 cf rjmp .-20 ; 0xbee - c02: 68 81 ld r22, Y - c04: 61 11 cpse r22, r1 - c06: e0 cf rjmp .-64 ; 0xbc8 + ce6: 01 11 cpse r16, r1 + ce8: f4 cf rjmp .-24 ; 0xcd2 + cea: 28 81 ld r18, Y + cec: 21 11 cpse r18, r1 + cee: de cf rjmp .-68 ; 0xcac c = pgm_read_byte(pTableConfigName); } if (!StringMismatch) { /* Configuration found */ ConfigurationSetById(i); - c08: 80 2f mov r24, r16 - c0a: a4 df rcall .-184 ; 0xb54 + cf0: 81 2f mov r24, r17 + cf2: a8 df rcall .-176 ; 0xc44 return true; - c0c: 81 e0 ldi r24, 0x01 ; 1 + cf4: 81 e0 ldi r24, 0x01 ; 1 } } return false; } - c0e: df 91 pop r29 - c10: cf 91 pop r28 - c12: 1f 91 pop r17 - c14: 0f 91 pop r16 - c16: 08 95 ret + cf6: df 91 pop r29 + cf8: cf 91 pop r28 + cfa: 1f 91 pop r17 + cfc: 0f 91 pop r16 + cfe: 08 95 ret -00000c18 : +00000d00 : void ConfigurationGetList(char* ConfigListOut, uint16_t ByteCount) { - c18: cf 93 push r28 - c1a: df 93 push r29 - c1c: ec 01 movw r28, r24 + d00: 0f 93 push r16 + d02: 1f 93 push r17 + d04: cf 93 push r28 + d06: df 93 push r29 uint8_t i; /* Account for '\0' */ ByteCount--; - c1e: 61 50 subi r22, 0x01 ; 1 - c20: 71 09 sbc r23, r1 - c22: 80 e0 ldi r24, 0x00 ; 0 - c24: 90 e0 ldi r25, 0x00 ; 0 - - for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - c38: 24 91 lpm r18, Z - c3a: 22 23 and r18, r18 - c3c: 81 f0 breq .+32 ; 0xc5e - c3e: 61 31 cpi r22, 0x11 ; 17 - c40: 71 05 cpc r23, r1 - c42: 68 f0 brcs .+26 ; 0xc5e - c44: de 01 movw r26, r28 - c46: 03 c0 rjmp .+6 ; 0xc4e - c48: 60 31 cpi r22, 0x10 ; 16 - c4a: 71 05 cpc r23, r1 - c4c: 41 f0 breq .+16 ; 0xc5e + d14: fa 01 movw r30, r20 + d16: 04 91 lpm r16, Z + d18: 00 23 and r16, r16 + d1a: 49 f1 breq .+82 ; 0xd6e + d1c: 61 31 cpi r22, 0x11 ; 17 + d1e: 71 05 cpc r23, r1 + d20: 20 f4 brcc .+8 ; 0xd2a + d22: 25 c0 rjmp .+74 ; 0xd6e + d24: 60 31 cpi r22, 0x10 ; 16 + d26: 71 05 cpc r23, r1 + d28: 61 f0 breq .+24 ; 0xd42 + d2a: dc 01 movw r26, r24 + d2c: 01 96 adiw r24, 0x01 ; 1 + d2e: ec 01 movw r28, r24 /* While not end-of-string and enough buffer to * put a complete configuration name */ *ConfigListOut++ = c; - c4e: 2d 93 st X+, r18 - c50: ed 01 movw r28, r26 + d30: 0c 93 st X, r16 ConfigName++; - c52: 31 96 adiw r30, 0x01 ; 1 + d32: 2f 5f subi r18, 0xFF ; 255 + d34: 3f 4f sbci r19, 0xFF ; 255 ByteCount--; - c54: 61 50 subi r22, 0x01 ; 1 - c56: 71 09 sbc r23, r1 + d36: 61 50 subi r22, 0x01 ; 1 + d38: 71 09 sbc r23, r1 for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - c58: 24 91 lpm r18, Z - c5a: 21 11 cpse r18, r1 - c5c: f5 cf rjmp .-22 ; 0xc48 + d3a: f9 01 movw r30, r18 + d3c: 04 91 lpm r16, Z + d3e: 01 11 cpse r16, r1 + d40: f1 cf rjmp .-30 ; 0xd24 *ConfigListOut++ = c; ConfigName++; ByteCount--; } if ( i < (CONFIG_COUNT - 1) ) { - c5e: 85 30 cpi r24, 0x05 ; 5 - c60: 91 05 cpc r25, r1 - c62: 21 f4 brne .+8 ; 0xc6c + d42: f4 e0 ldi r31, 0x04 ; 4 + d44: 48 33 cpi r20, 0x38 ; 56 + d46: 5f 07 cpc r21, r31 + d48: 61 f0 breq .+24 ; 0xd62 + /* No comma on last configuration */ *ConfigListOut++ = ','; + d4a: ce 01 movw r24, r28 + d4c: 01 96 adiw r24, 0x01 ; 1 + d4e: 18 83 st Y, r17 + ByteCount--; + d50: 61 50 subi r22, 0x01 ; 1 + d52: 71 09 sbc r23, r1 + d54: 4b 5d subi r20, 0xDB ; 219 + d56: 5f 4f sbci r21, 0xFF ; 255 + uint8_t i; + + /* Account for '\0' */ + ByteCount--; + + for (i=0; i + ByteCount--; + } + + if ( i < (CONFIG_COUNT - 1) ) { + /* No comma on last configuration */ + *ConfigListOut++ = ','; + d60: ec 01 movw r28, r24 ByteCount--; } } *ConfigListOut = '\0'; - c64: 18 82 st Y, r1 + d62: 18 82 st Y, r1 } - c66: df 91 pop r29 - c68: cf 91 pop r28 - c6a: 08 95 ret - ByteCount--; - } + d64: df 91 pop r29 + d66: cf 91 pop r28 + d68: 1f 91 pop r17 + d6a: 0f 91 pop r16 + d6c: 08 95 ret - if ( i < (CONFIG_COUNT - 1) ) { - /* No comma on last configuration */ - *ConfigListOut++ = ','; - c6c: 49 93 st Y+, r20 - ByteCount--; - c6e: 61 50 subi r22, 0x01 ; 1 - c70: 71 09 sbc r23, r1 - c72: 01 96 adiw r24, 0x01 ; 1 - c74: da cf rjmp .-76 ; 0xc2a + for (i=0; i: + while( (c = pgm_read_byte(ConfigName)) != '\0' && ByteCount > CONFIGURATION_NAME_LENGTH_MAX) { + d6e: ec 01 movw r28, r24 + d70: e8 cf rjmp .-48 ; 0xd42 + +00000d72 : #include "Random.h" #include void RandomInit(void) { - c76: 08 95 ret + d72: 08 95 ret -00000c78 : +00000d74 : } uint8_t RandomGetByte(void) { return rand() & 0xFF; - c78: 0c 94 be 2d jmp 0x5b7c ; 0x5b7c + d74: 0c 94 e8 2b jmp 0x57d0 ; 0x57d0 } - c7c: 08 95 ret + d78: 08 95 ret -00000c7e : +00000d7a : void RandomGetBuffer(void* Buffer, uint8_t ByteCount) { - c7e: 1f 93 push r17 - c80: cf 93 push r28 - c82: df 93 push r29 - c84: 16 2f mov r17, r22 + d7a: 1f 93 push r17 + d7c: cf 93 push r28 + d7e: df 93 push r29 uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - c86: 66 23 and r22, r22 - c88: 29 f0 breq .+10 ; 0xc94 - c8a: ec 01 movw r28, r24 - *BufferPtr++ = RandomGetByte(); - c8c: f5 df rcall .-22 ; 0xc78 - c8e: 89 93 st Y+, r24 - c90: 11 50 subi r17, 0x01 ; 1 + d80: 66 23 and r22, r22 + d82: 39 f0 breq .+14 ; 0xd92 + d84: ec 01 movw r28, r24 + d86: 16 2f mov r17, r22 + +} + +uint8_t RandomGetByte(void) +{ + return rand() & 0xFF; + d88: 0e 94 e8 2b call 0x57d0 ; 0x57d0 + d8c: 89 93 st Y+, r24 + d8e: 11 50 subi r17, 0x01 ; 1 void RandomGetBuffer(void* Buffer, uint8_t ByteCount) { uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - c92: e1 f7 brne .-8 ; 0xc8c + d90: d9 f7 brne .-10 ; 0xd88 *BufferPtr++ = RandomGetByte(); } } - c94: df 91 pop r29 - c96: cf 91 pop r28 - c98: 1f 91 pop r17 - c9a: 08 95 ret + d92: df 91 pop r29 + d94: cf 91 pop r28 + d96: 1f 91 pop r17 + d98: 08 95 ret -00000c9c : +00000d9a : void RandomTick(void) { rand(); - c9c: 0e 94 be 2d call 0x5b7c ; 0x5b7c + d9a: 0e 94 e8 2b call 0x57d0 ; 0x57d0 rand(); - ca0: 0e 94 be 2d call 0x5b7c ; 0x5b7c + d9e: 0e 94 e8 2b call 0x57d0 ; 0x57d0 rand(); - ca4: 0e 94 be 2d call 0x5b7c ; 0x5b7c + da2: 0e 94 e8 2b call 0x57d0 ; 0x57d0 rand(); - ca8: 0c 94 be 2d jmp 0x5b7c ; 0x5b7c + da6: 0c 94 e8 2b jmp 0x57d0 ; 0x57d0 -00000cac : +00000daa : #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) { - cac: cf 93 push r28 - cae: df 93 push r29 - cb0: dc 01 movw r26, r24 + daa: cf 93 push r28 + dac: df 93 push r29 + dae: dc 01 movw r26, r24 uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; - cb2: 61 50 subi r22, 0x01 ; 1 - cb4: 71 09 sbc r23, r1 + db0: 61 50 subi r22, 0x01 ; 1 + db2: 71 09 sbc r23, r1 while( (ByteCount > 0) && (MaxChars >= 2) ) { - cb6: 21 15 cp r18, r1 - cb8: 31 05 cpc r19, r1 - cba: 99 f1 breq .+102 ; 0xd22 - cbc: 62 30 cpi r22, 0x02 ; 2 - cbe: 71 05 cpc r23, r1 - cc0: 80 f1 brcs .+96 ; 0xd22 - cc2: fa 01 movw r30, r20 + db4: 21 15 cp r18, r1 + db6: 31 05 cpc r19, r1 + db8: a9 f1 breq .+106 ; 0xe24 + dba: 62 30 cpi r22, 0x02 ; 2 + dbc: 71 05 cpc r23, r1 + dbe: 90 f1 brcs .+100 ; 0xe24 + dc0: fa 01 movw r30, r20 + dc2: 21 50 subi r18, 0x01 ; 1 + dc4: 31 09 sbc r19, r1 + dc6: 24 0f add r18, r20 + dc8: 35 1f adc r19, r21 #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) - cc4: 24 0f add r18, r20 - cc6: 35 1f adc r19, r21 - cc8: 21 50 subi r18, 0x01 ; 1 - cca: 31 09 sbc r19, r1 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; - ccc: 40 e0 ldi r20, 0x00 ; 0 - cce: 50 e0 ldi r21, 0x00 ; 0 - cd0: 17 c0 rjmp .+46 ; 0xd00 + dca: 80 e0 ldi r24, 0x00 ; 0 + dcc: 90 e0 ldi r25, 0x00 ; 0 + dce: 17 c0 rjmp .+46 ; 0xdfe MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { uint8_t Byte = *ByteBuffer; HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - cd2: d0 5d subi r29, 0xD0 ; 208 - cd4: dc 93 st X, r29 + dd0: d0 5d subi r29, 0xD0 ; 208 + dd2: dc 93 st X, r29 HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - cd6: cf 70 andi r28, 0x0F ; 15 - cd8: 8c 2f mov r24, r28 - cda: 90 e0 ldi r25, 0x00 ; 0 - cdc: 0a 97 sbiw r24, 0x0a ; 10 - cde: fc f4 brge .+62 ; 0xd1e - ce0: c0 5d subi r28, 0xD0 ; 208 - ce2: 11 96 adiw r26, 0x01 ; 1 - ce4: cc 93 st X, r28 - ce6: 11 97 sbiw r26, 0x01 ; 1 + dd4: cf 70 andi r28, 0x0F ; 15 + dd6: 4c 2f mov r20, r28 + dd8: 50 e0 ldi r21, 0x00 ; 0 + dda: 4a 30 cpi r20, 0x0A ; 10 + ddc: 51 05 cpc r21, r1 + dde: 04 f5 brge .+64 ; 0xe20 + de0: c0 5d subi r28, 0xD0 ; 208 + de2: 11 96 adiw r26, 0x01 ; 1 + de4: cc 93 st X, r28 + de6: 11 97 sbiw r26, 0x01 ; 1 HexOut += 2; - ce8: 12 96 adiw r26, 0x02 ; 2 + de8: 12 96 adiw r26, 0x02 ; 2 MaxChars -= 2; - cea: 62 50 subi r22, 0x02 ; 2 - cec: 71 09 sbc r23, r1 + dea: 62 50 subi r22, 0x02 ; 2 + dec: 71 09 sbc r23, r1 CharCount += 2; - cee: 4e 5f subi r20, 0xFE ; 254 - cf0: 5f 4f sbci r21, 0xFF ; 255 + dee: 02 96 adiw r24, 0x02 ; 2 uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { - cf2: e2 17 cp r30, r18 - cf4: f3 07 cpc r31, r19 - cf6: b9 f0 breq .+46 ; 0xd26 - cf8: 31 96 adiw r30, 0x01 ; 1 - cfa: 62 30 cpi r22, 0x02 ; 2 - cfc: 71 05 cpc r23, r1 - cfe: 98 f0 brcs .+38 ; 0xd26 + df0: e2 17 cp r30, r18 + df2: f3 07 cpc r31, r19 + df4: c9 f0 breq .+50 ; 0xe28 + df6: 31 96 adiw r30, 0x01 ; 1 + df8: 62 30 cpi r22, 0x02 ; 2 + dfa: 71 05 cpc r23, r1 + dfc: a8 f0 brcs .+42 ; 0xe28 uint8_t Byte = *ByteBuffer; - d00: c0 81 ld r28, Z + dfe: c0 81 ld r28, Z HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - d02: dc 2f mov r29, r28 - d04: d2 95 swap r29 - d06: df 70 andi r29, 0x0F ; 15 - d08: 8d 2f mov r24, r29 - d0a: 90 e0 ldi r25, 0x00 ; 0 - d0c: 0a 97 sbiw r24, 0x0a ; 10 - d0e: 0c f3 brlt .-62 ; 0xcd2 - d10: d9 5c subi r29, 0xC9 ; 201 - d12: dc 93 st X, r29 + e00: dc 2f mov r29, r28 + e02: d2 95 swap r29 + e04: df 70 andi r29, 0x0F ; 15 + e06: 4d 2f mov r20, r29 + e08: 50 e0 ldi r21, 0x00 ; 0 + e0a: 4a 30 cpi r20, 0x0A ; 10 + e0c: 51 05 cpc r21, r1 + e0e: 04 f3 brlt .-64 ; 0xdd0 + e10: d9 5c subi r29, 0xC9 ; 201 + e12: dc 93 st X, r29 HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - d14: cf 70 andi r28, 0x0F ; 15 - d16: 8c 2f mov r24, r28 - d18: 90 e0 ldi r25, 0x00 ; 0 - d1a: 0a 97 sbiw r24, 0x0a ; 10 - d1c: 0c f3 brlt .-62 ; 0xce0 - d1e: c9 5c subi r28, 0xC9 ; 201 - d20: e0 cf rjmp .-64 ; 0xce2 + e14: cf 70 andi r28, 0x0F ; 15 + e16: 4c 2f mov r20, r28 + e18: 50 e0 ldi r21, 0x00 ; 0 + e1a: 4a 30 cpi r20, 0x0A ; 10 + e1c: 51 05 cpc r21, r1 + e1e: 04 f3 brlt .-64 ; 0xde0 + e20: c9 5c subi r28, 0xC9 ; 201 + e22: df cf rjmp .-66 ; 0xde2 #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; - d22: 40 e0 ldi r20, 0x00 ; 0 - d24: 50 e0 ldi r21, 0x00 ; 0 + e24: 80 e0 ldi r24, 0x00 ; 0 + e26: 90 e0 ldi r25, 0x00 ; 0 CharCount += 2; ByteBuffer++; ByteCount -= 1; } *HexOut = '\0'; - d26: 1c 92 st X, r1 + e28: 1c 92 st X, r1 return CharCount; } - d28: ca 01 movw r24, r20 - d2a: df 91 pop r29 - d2c: cf 91 pop r28 - d2e: 08 95 ret + e2a: df 91 pop r29 + e2c: cf 91 pop r28 + e2e: 08 95 ret -00000d30 : +00000e30 : uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) { - d30: fa 01 movw r30, r20 + e30: dc 01 movw r26, r24 + e32: fa 01 movw r30, r20 uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - d32: 40 81 ld r20, Z - d34: 44 23 and r20, r20 - d36: f1 f1 breq .+124 ; 0xdb4 - d38: 51 81 ldd r21, Z+1 ; 0x01 - d3a: 55 23 and r21, r21 - d3c: d9 f1 breq .+118 ; 0xdb4 - d3e: 61 15 cp r22, r1 - d40: 71 05 cpc r23, r1 - d42: c1 f1 breq .+112 ; 0xdb4 - d44: dc 01 movw r26, r24 - d46: 20 e0 ldi r18, 0x00 ; 0 - d48: 30 e0 ldi r19, 0x00 ; 0 - d4a: 13 c0 rjmp .+38 ; 0xd72 + e34: 80 81 ld r24, Z + e36: 88 23 and r24, r24 + e38: 09 f4 brne .+2 ; 0xe3c + e3a: 41 c0 rjmp .+130 ; 0xebe + e3c: 91 81 ldd r25, Z+1 ; 0x01 + e3e: 99 23 and r25, r25 + e40: d9 f1 breq .+118 ; 0xeb8 +} + +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t ByteCount = 0; + e42: 20 e0 ldi r18, 0x00 ; 0 + e44: 30 e0 ldi r19, 0x00 ; 0 + + while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { + e46: 61 15 cp r22, r1 + e48: 71 05 cpc r23, r1 + e4a: a1 f4 brne .+40 ; 0xe74 + e4c: 33 c0 rjmp .+102 ; 0xeb4 if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { uint8_t Byte = 0; Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - d4c: 42 95 swap r20 - d4e: 40 7f andi r20, 0xF0 ; 240 + e4e: 82 95 swap r24 + e50: 80 7f andi r24, 0xF0 ; 240 Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - d50: 51 34 cpi r21, 0x41 ; 65 - d52: 28 f5 brcc .+74 ; 0xd9e - d54: 58 2f mov r21, r24 - d56: 45 2b or r20, r21 + e52: 91 34 cpi r25, 0x41 ; 65 + e54: 30 f5 brcc .+76 ; 0xea2 + e56: 94 2f mov r25, r20 + e58: 89 2b or r24, r25 *ByteBuffer = Byte; - d58: 4d 93 st X+, r20 + e5a: 8d 93 st X+, r24 ByteBuffer++; MaxBytes--; ByteCount++; - d5a: 2f 5f subi r18, 0xFF ; 255 - d5c: 3f 4f sbci r19, 0xFF ; 255 + e5c: 2f 5f subi r18, 0xFF ; 255 + e5e: 3f 4f sbci r19, 0xFF ; 255 HexIn += 2; - d5e: 32 96 adiw r30, 0x02 ; 2 + e60: 32 96 adiw r30, 0x02 ; 2 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - d60: 40 81 ld r20, Z - d62: 44 23 and r20, r20 - d64: 29 f1 breq .+74 ; 0xdb0 - d66: 51 81 ldd r21, Z+1 ; 0x01 - d68: 55 23 and r21, r21 - d6a: 21 f1 breq .+72 ; 0xdb4 - d6c: 62 17 cp r22, r18 - d6e: 73 07 cpc r23, r19 - d70: f9 f0 breq .+62 ; 0xdb0 + e62: 80 81 ld r24, Z + e64: 88 23 and r24, r24 + e66: 31 f1 breq .+76 ; 0xeb4 + e68: 91 81 ldd r25, Z+1 ; 0x01 + e6a: 99 23 and r25, r25 + e6c: 29 f1 breq .+74 ; 0xeb8 + e6e: 62 17 cp r22, r18 + e70: 73 07 cpc r23, r19 + e72: 01 f1 breq .+64 ; 0xeb4 if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { - d72: 84 2f mov r24, r20 - d74: 80 53 subi r24, 0x30 ; 48 - d76: 8a 30 cpi r24, 0x0A ; 10 - d78: 18 f0 brcs .+6 ; 0xd80 - d7a: 81 51 subi r24, 0x11 ; 17 - d7c: 86 30 cpi r24, 0x06 ; 6 - d7e: d0 f4 brcc .+52 ; 0xdb4 - d80: 85 2f mov r24, r21 - d82: 80 53 subi r24, 0x30 ; 48 - d84: 8a 30 cpi r24, 0x0A ; 10 - d86: 20 f0 brcs .+8 ; 0xd90 - d88: 95 2f mov r25, r21 - d8a: 91 54 subi r25, 0x41 ; 65 - d8c: 96 30 cpi r25, 0x06 ; 6 - d8e: 90 f4 brcc .+36 ; 0xdb4 + e74: 40 ed ldi r20, 0xD0 ; 208 + e76: 48 0f add r20, r24 + e78: 4a 30 cpi r20, 0x0A ; 10 + e7a: 20 f0 brcs .+8 ; 0xe84 + e7c: 4f eb ldi r20, 0xBF ; 191 + e7e: 48 0f add r20, r24 + e80: 46 30 cpi r20, 0x06 ; 6 + e82: d0 f4 brcc .+52 ; 0xeb8 + e84: 40 ed ldi r20, 0xD0 ; 208 + e86: 49 0f add r20, r25 + e88: 4a 30 cpi r20, 0x0A ; 10 + e8a: 20 f0 brcs .+8 ; 0xe94 + e8c: 5f eb ldi r21, 0xBF ; 191 + e8e: 59 0f add r21, r25 + e90: 56 30 cpi r21, 0x06 ; 6 + e92: 90 f4 brcc .+36 ; 0xeb8 uint8_t Byte = 0; Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - d90: 41 34 cpi r20, 0x41 ; 65 - d92: e0 f2 brcs .-72 ; 0xd4c - d94: 42 95 swap r20 - d96: 40 7f andi r20, 0xF0 ; 240 - d98: 40 57 subi r20, 0x70 ; 112 + e94: 81 34 cpi r24, 0x41 ; 65 + e96: d8 f2 brcs .-74 ; 0xe4e + e98: 82 95 swap r24 + e9a: 80 7f andi r24, 0xF0 ; 240 + e9c: 80 57 subi r24, 0x70 ; 112 Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - d9a: 51 34 cpi r21, 0x41 ; 65 - d9c: d8 f2 brcs .-74 ; 0xd54 - d9e: 57 53 subi r21, 0x37 ; 55 - da0: 45 2b or r20, r21 + e9e: 91 34 cpi r25, 0x41 ; 65 + ea0: d0 f2 brcs .-76 ; 0xe56 + ea2: 97 53 subi r25, 0x37 ; 55 + ea4: 89 2b or r24, r25 *ByteBuffer = Byte; - da2: 4d 93 st X+, r20 + ea6: 8d 93 st X+, r24 ByteBuffer++; MaxBytes--; ByteCount++; - da4: 2f 5f subi r18, 0xFF ; 255 - da6: 3f 4f sbci r19, 0xFF ; 255 + ea8: 2f 5f subi r18, 0xFF ; 255 + eaa: 3f 4f sbci r19, 0xFF ; 255 HexIn += 2; - da8: 32 96 adiw r30, 0x02 ; 2 + eac: 32 96 adiw r30, 0x02 ; 2 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - daa: 40 81 ld r20, Z - dac: 41 11 cpse r20, r1 - dae: db cf rjmp .-74 ; 0xd66 + eae: 80 81 ld r24, Z + eb0: 81 11 cpse r24, r1 + eb2: da cf rjmp .-76 ; 0xe68 + if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { /* Odd number of characters */ return 0; } return ByteCount; -} - db0: c9 01 movw r24, r18 - db2: 08 95 ret + eb4: c9 01 movw r24, r18 + eb6: 08 95 ret } } if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { /* Odd number of characters */ return 0; - db4: 20 e0 ldi r18, 0x00 ; 0 - db6: 30 e0 ldi r19, 0x00 ; 0 + eb8: 80 e0 ldi r24, 0x00 ; 0 + eba: 90 e0 ldi r25, 0x00 ; 0 } return ByteCount; } - db8: c9 01 movw r24, r18 - dba: 08 95 ret + ebc: 08 95 ret +} -00000dbc : +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t ByteCount = 0; + ebe: 20 e0 ldi r18, 0x00 ; 0 + ec0: 30 e0 ldi r19, 0x00 ; 0 + ec2: f8 cf rjmp .-16 ; 0xeb4 + +00000ec4 : MemoryRecall(); } void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) { uint8_t* SrcPtr = &Memory[Address]; - dbc: fb 01 movw r30, r22 - dbe: ee 56 subi r30, 0x6E ; 110 - dc0: ff 4d sbci r31, 0xDF ; 223 + ec4: fb 01 movw r30, r22 + ec6: ee 56 subi r30, 0x6E ; 110 + ec8: ff 4d sbci r31, 0xDF ; 223 uint8_t* DstPtr = (uint8_t*) Buffer; /* Prevent Buf Ovfs */ ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - dc2: a0 e0 ldi r26, 0x00 ; 0 - dc4: b4 e0 ldi r27, 0x04 ; 4 - dc6: a6 1b sub r26, r22 - dc8: b7 0b sbc r27, r23 - dca: 9a 01 movw r18, r20 - dcc: a4 17 cp r26, r20 - dce: b5 07 cpc r27, r21 - dd0: 08 f4 brcc .+2 ; 0xdd4 - dd2: 9d 01 movw r18, r26 - - while(ByteCount--) { - dd4: 21 15 cp r18, r1 - dd6: 31 05 cpc r19, r1 - dd8: 41 f0 breq .+16 ; 0xdea - - /* Load permanent flash contents to memory at startup */ - MemoryRecall(); -} - -void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) - dda: 2e 0f add r18, r30 - ddc: 3f 1f adc r19, r31 -{ - uint8_t* SrcPtr = &Memory[Address]; - uint8_t* DstPtr = (uint8_t*) Buffer; - dde: dc 01 movw r26, r24 - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + eca: 20 e0 ldi r18, 0x00 ; 0 + ecc: 34 e0 ldi r19, 0x04 ; 4 + ece: 26 1b sub r18, r22 + ed0: 37 0b sbc r19, r23 + ed2: 42 17 cp r20, r18 + ed4: 53 07 cpc r21, r19 + ed6: 08 f4 brcc .+2 ; 0xeda + ed8: 9a 01 movw r18, r20 while(ByteCount--) { + eda: 21 15 cp r18, r1 + edc: 31 05 cpc r19, r1 + ede: 49 f0 breq .+18 ; 0xef2 + ee0: dc 01 movw r26, r24 + ee2: cf 01 movw r24, r30 + ee4: 82 0f add r24, r18 + ee6: 93 1f adc r25, r19 *DstPtr++ = *SrcPtr++; - de0: 81 91 ld r24, Z+ - de2: 8d 93 st X+, r24 + ee8: 21 91 ld r18, Z+ + eea: 2d 93 st X+, r18 uint8_t* DstPtr = (uint8_t*) Buffer; /* Prevent Buf Ovfs */ ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); while(ByteCount--) { - de4: e2 17 cp r30, r18 - de6: f3 07 cpc r31, r19 - de8: d9 f7 brne .-10 ; 0xde0 - dea: 08 95 ret + eec: e8 17 cp r30, r24 + eee: f9 07 cpc r31, r25 + ef0: d9 f7 brne .-10 ; 0xee8 + ef2: 08 95 ret -00000dec : +00000ef4 : } void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { uint8_t* SrcPtr = (uint8_t*) Buffer; uint8_t* DstPtr = &Memory[Address]; - dec: db 01 movw r26, r22 - dee: ae 56 subi r26, 0x6E ; 110 - df0: bf 4d sbci r27, 0xDF ; 223 + ef4: db 01 movw r26, r22 + ef6: ae 56 subi r26, 0x6E ; 110 + ef8: bf 4d sbci r27, 0xDF ; 223 /* Prevent Buf Ovfs */ ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - df2: e0 e0 ldi r30, 0x00 ; 0 - df4: f4 e0 ldi r31, 0x04 ; 4 - df6: e6 1b sub r30, r22 - df8: f7 0b sbc r31, r23 - dfa: 9a 01 movw r18, r20 - dfc: e4 17 cp r30, r20 - dfe: f5 07 cpc r31, r21 - e00: 08 f4 brcc .+2 ; 0xe04 - e02: 9f 01 movw r18, r30 + efa: 20 e0 ldi r18, 0x00 ; 0 + efc: 34 e0 ldi r19, 0x04 ; 4 + efe: 26 1b sub r18, r22 + f00: 37 0b sbc r19, r23 + f02: 42 17 cp r20, r18 + f04: 53 07 cpc r21, r19 + f06: 08 f4 brcc .+2 ; 0xf0a + f08: 9a 01 movw r18, r20 while(ByteCount--) { - e04: 21 15 cp r18, r1 - e06: 31 05 cpc r19, r1 - e08: 49 f0 breq .+18 ; 0xe1c - e0a: fc 01 movw r30, r24 - while(ByteCount--) { + f0a: 21 15 cp r18, r1 + f0c: 31 05 cpc r19, r1 + f0e: 41 f0 breq .+16 ; 0xf20 + f10: fc 01 movw r30, r24 + f12: 82 0f add r24, r18 + f14: 93 1f adc r25, r19 *DstPtr++ = *SrcPtr++; - } -} - -void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) - e0c: c9 01 movw r24, r18 - e0e: 8e 0f add r24, r30 - e10: 9f 1f adc r25, r31 - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - - while(ByteCount--) { - *DstPtr++ = *SrcPtr++; - e12: 21 91 ld r18, Z+ - e14: 2d 93 st X+, r18 + f16: 21 91 ld r18, Z+ + f18: 2d 93 st X+, r18 uint8_t* DstPtr = &Memory[Address]; /* Prevent Buf Ovfs */ ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); while(ByteCount--) { - e16: e8 17 cp r30, r24 - e18: f9 07 cpc r31, r25 - e1a: d9 f7 brne .-10 ; 0xe12 + f1a: e8 17 cp r30, r24 + f1c: f9 07 cpc r31, r25 + f1e: d9 f7 brne .-10 ; 0xf16 *DstPtr++ = *SrcPtr++; } LEDTrigger(LED_MEMORY_CHANGED, LED_ON); - e1c: 61 e1 ldi r22, 0x11 ; 17 - e1e: 85 e0 ldi r24, 0x05 ; 5 - e20: 0c 94 af 0f jmp 0x1f5e ; 0x1f5e + f20: 61 e1 ldi r22, 0x11 ; 17 + f22: 85 e0 ldi r24, 0x05 ; 5 + f24: 0c 94 f1 0f jmp 0x1fe2 ; 0x1fe2 -00000e24 : +00000f28 : } void MemoryClear(void) { - e24: e2 e9 ldi r30, 0x92 ; 146 - e26: f0 e2 ldi r31, 0x20 ; 32 - for (uint16_t i=0; i + f3c: 08 95 ret -void MemoryClear(void) -{ - for (uint16_t i=0; i - Memory[i] = 0; - } +00000f3e : } - e32: 08 95 ret - -00000e34 : void MemoryRecall(void) { /* Recall memory from permanent flash */ FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); - e34: 80 91 09 29 lds r24, 0x2909 - e38: 90 e0 ldi r25, 0x00 ; 0 - e3a: a0 e0 ldi r26, 0x00 ; 0 - e3c: b0 e0 ldi r27, 0x00 ; 0 - e3e: 4a e0 ldi r20, 0x0A ; 10 - e40: 88 0f add r24, r24 - e42: 99 1f adc r25, r25 - e44: aa 1f adc r26, r26 - e46: bb 1f adc r27, r27 - e48: 4a 95 dec r20 - e4a: d1 f7 brne .-12 ; 0xe40 + f3e: 80 91 09 29 lds r24, 0x2909 + f42: 90 e0 ldi r25, 0x00 ; 0 + f44: a0 e0 ldi r26, 0x00 ; 0 + f46: b0 e0 ldi r27, 0x00 ; 0 + f48: 4a e0 ldi r20, 0x0A ; 10 + f4a: 88 0f add r24, r24 + f4c: 99 1f adc r25, r25 + f4e: aa 1f adc r26, r26 + f50: bb 1f adc r27, r27 + f52: 4a 95 dec r20 + f54: d1 f7 brne .-12 ; 0xf4a INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e4c: 40 e1 ldi r20, 0x10 ; 16 + f56: 40 e1 ldi r20, 0x10 ; 16 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e4e: 57 ed ldi r21, 0xD7 ; 215 + f58: 57 ed ldi r21, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e50: 30 e4 ldi r19, 0x40 ; 64 + f5a: 30 e4 ldi r19, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e52: 40 93 66 06 sts 0x0666, r20 + f5c: 40 93 66 06 sts 0x0666, r20 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e56: 50 93 a0 09 sts 0x09A0, r21 + f60: 50 93 a0 09 sts 0x09A0, r21 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e5a: 20 91 a1 09 lds r18, 0x09A1 - e5e: 26 ff sbrs r18, 6 - e60: fc cf rjmp .-8 ; 0xe5a + f64: 20 91 a1 09 lds r18, 0x09A1 + f68: 26 ff sbrs r18, 6 + f6a: fc cf rjmp .-8 ; 0xf64 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e62: 30 93 a1 09 sts 0x09A1, r19 + f6c: 30 93 a1 09 sts 0x09A1, r19 return MEMORY_FLASH_USART.DATA; - e66: 20 91 a0 09 lds r18, 0x09A0 + f70: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e6a: 10 92 a0 09 sts 0x09A0, r1 + f74: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e6e: 20 91 a1 09 lds r18, 0x09A1 - e72: 26 ff sbrs r18, 6 - e74: fc cf rjmp .-8 ; 0xe6e + f78: 20 91 a1 09 lds r18, 0x09A1 + f7c: 26 ff sbrs r18, 6 + f7e: fc cf rjmp .-8 ; 0xf78 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e76: 30 93 a1 09 sts 0x09A1, r19 + f80: 30 93 a1 09 sts 0x09A1, r19 return MEMORY_FLASH_USART.DATA; - e7a: 20 91 a0 09 lds r18, 0x09A0 + f84: 20 91 a0 09 lds r18, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - e7e: 40 93 65 06 sts 0x0665, r20 + f88: 40 93 65 06 sts 0x0665, r20 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashRead(void* Buffer, uint32_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - e82: 27 ff sbrs r18, 7 - e84: e6 cf rjmp .-52 ; 0xe52 + f8c: 27 ff sbrs r18, 7 + f8e: e6 cf rjmp .-52 ; 0xf5c MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e86: 20 e1 ldi r18, 0x10 ; 16 - e88: 20 93 66 06 sts 0x0666, r18 + f90: 20 e1 ldi r18, 0x10 ; 16 + f92: 20 93 66 06 sts 0x0666, r18 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e8c: 23 e0 ldi r18, 0x03 ; 3 - e8e: 20 93 a0 09 sts 0x09A0, r18 + f96: 23 e0 ldi r18, 0x03 ; 3 + f98: 20 93 a0 09 sts 0x09A0, r18 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e92: 20 91 a1 09 lds r18, 0x09A1 - e96: 26 ff sbrs r18, 6 - e98: fc cf rjmp .-8 ; 0xe92 + f9c: 20 91 a1 09 lds r18, 0x09A1 + fa0: 26 ff sbrs r18, 6 + fa2: fc cf rjmp .-8 ; 0xf9c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e9a: 20 e4 ldi r18, 0x40 ; 64 - e9c: 20 93 a1 09 sts 0x09A1, r18 + fa4: 20 e4 ldi r18, 0x40 ; 64 + fa6: 20 93 a1 09 sts 0x09A1, r18 return MEMORY_FLASH_USART.DATA; - ea0: 20 91 a0 09 lds r18, 0x09A0 + faa: 20 91 a0 09 lds r18, 0x09A0 { while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); - ea4: ad 01 movw r20, r26 - ea6: 66 27 eor r22, r22 - ea8: 77 27 eor r23, r23 + fae: ad 01 movw r20, r26 + fb0: 66 27 eor r22, r22 + fb2: 77 27 eor r23, r23 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - eaa: 40 93 a0 09 sts 0x09A0, r20 + fb4: 40 93 a0 09 sts 0x09A0, r20 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - eae: 20 91 a1 09 lds r18, 0x09A1 - eb2: 26 ff sbrs r18, 6 - eb4: fc cf rjmp .-8 ; 0xeae + fb8: 20 91 a1 09 lds r18, 0x09A1 + fbc: 26 ff sbrs r18, 6 + fbe: fc cf rjmp .-8 ; 0xfb8 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - eb6: 20 e4 ldi r18, 0x40 ; 64 - eb8: 20 93 a1 09 sts 0x09A1, r18 + fc0: 20 e4 ldi r18, 0x40 ; 64 + fc2: 20 93 a1 09 sts 0x09A1, r18 return MEMORY_FLASH_USART.DATA; - ebc: 20 91 a0 09 lds r18, 0x09A0 + fc6: 20 91 a0 09 lds r18, 0x09A0 while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); SPITransferByte( (Address >> 8) & 0xFF ); - ec0: 89 2f mov r24, r25 - ec2: 9a 2f mov r25, r26 - ec4: ab 2f mov r26, r27 - ec6: bb 27 eor r27, r27 + fca: 89 2f mov r24, r25 + fcc: 9a 2f mov r25, r26 + fce: ab 2f mov r26, r27 + fd0: bb 27 eor r27, r27 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ec8: 80 93 a0 09 sts 0x09A0, r24 + fd2: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ecc: 80 91 a1 09 lds r24, 0x09A1 - ed0: 86 ff sbrs r24, 6 - ed2: fc cf rjmp .-8 ; 0xecc + fd6: 80 91 a1 09 lds r24, 0x09A1 + fda: 86 ff sbrs r24, 6 + fdc: fc cf rjmp .-8 ; 0xfd6 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ed4: 80 e4 ldi r24, 0x40 ; 64 - ed6: 80 93 a1 09 sts 0x09A1, r24 + fde: 80 e4 ldi r24, 0x40 ; 64 + fe0: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - eda: 80 91 a0 09 lds r24, 0x09A0 + fe4: 80 91 a0 09 lds r24, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ede: 10 92 a0 09 sts 0x09A0, r1 + fe8: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ee2: 80 91 a1 09 lds r24, 0x09A1 - ee6: 86 ff sbrs r24, 6 - ee8: fc cf rjmp .-8 ; 0xee2 + fec: 80 91 a1 09 lds r24, 0x09A1 + ff0: 86 ff sbrs r24, 6 + ff2: fc cf rjmp .-8 ; 0xfec MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - eea: 80 e4 ldi r24, 0x40 ; 64 - eec: 80 93 a1 09 sts 0x09A1, r24 + ff4: 80 e4 ldi r24, 0x40 ; 64 + ff6: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - ef0: 80 91 a0 09 lds r24, 0x09A0 -} - -INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) -{ + ffa: 80 91 a0 09 lds r24, 0x09A0 + ffe: e2 e9 ldi r30, 0x92 ; 146 + 1000: f0 e2 ldi r31, 0x20 ; 32 uint8_t* ByteBuffer = (uint8_t*) Buffer; - ef4: e2 e9 ldi r30, 0x92 ; 146 - ef6: f0 e2 ldi r31, 0x20 ; 32 while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = 0; while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ef8: 90 e4 ldi r25, 0x40 ; 64 + 1002: 90 e4 ldi r25, 0x40 ; 64 INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = 0; - efa: 10 92 a0 09 sts 0x09A0, r1 + 1004: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - efe: 80 91 a1 09 lds r24, 0x09A1 - f02: 86 ff sbrs r24, 6 - f04: fc cf rjmp .-8 ; 0xefe + 1008: 80 91 a1 09 lds r24, 0x09A1 + 100c: 86 ff sbrs r24, 6 + 100e: fc cf rjmp .-8 ; 0x1008 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f06: 90 93 a1 09 sts 0x09A1, r25 + 1010: 90 93 a1 09 sts 0x09A1, r25 *ByteBuffer++ = MEMORY_FLASH_USART.DATA; - f0a: 80 91 a0 09 lds r24, 0x09A0 - f0e: 81 93 st Z+, r24 + 1014: 80 91 a0 09 lds r24, 0x09A0 + 1018: 81 93 st Z+, r24 INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - f10: 84 e2 ldi r24, 0x24 ; 36 - f12: e2 39 cpi r30, 0x92 ; 146 - f14: f8 07 cpc r31, r24 - f16: 89 f7 brne .-30 ; 0xefa + 101a: 84 e2 ldi r24, 0x24 ; 36 + 101c: e2 39 cpi r30, 0x92 ; 146 + 101e: f8 07 cpc r31, r24 + 1020: 89 f7 brne .-30 ; 0x1004 SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); SPITransferByte( (Address >> 8) & 0xFF ); SPITransferByte( (Address >> 0) & 0xFF ); SPIReadBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f18: 80 e1 ldi r24, 0x10 ; 16 - f1a: 80 93 65 06 sts 0x0665, r24 - f1e: 08 95 ret + 1022: 80 e1 ldi r24, 0x10 ; 16 + 1024: 80 93 65 06 sts 0x0665, r24 + 1028: 08 95 ret -00000f20 : +0000102a : SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } void MemoryInit(void) { - f20: cf 93 push r28 - f22: df 93 push r29 - f24: 00 d0 rcall .+0 ; 0xf26 - f26: 00 d0 rcall .+0 ; 0xf28 - f28: cd b7 in r28, 0x3d ; 61 - f2a: de b7 in r29, 0x3e ; 62 + 102a: cf 93 push r28 + 102c: df 93 push r29 + 102e: 00 d0 rcall .+0 ; 0x1030 + 1030: 00 d0 rcall .+0 ; 0x1032 + 1032: cd b7 in r28, 0x3d ; 61 + 1034: de b7 in r29, 0x3e ; 62 /* Configure MEMORY_FLASH_USART for SPI master mode 0 with maximum clock frequency */ MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f2c: 80 e1 ldi r24, 0x10 ; 16 - f2e: 80 93 65 06 sts 0x0665, r24 + 1036: 80 e1 ldi r24, 0x10 ; 16 + 1038: 80 93 65 06 sts 0x0665, r24 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_SCK; - f32: 92 e0 ldi r25, 0x02 ; 2 - f34: 90 93 66 06 sts 0x0666, r25 + 103c: 92 e0 ldi r25, 0x02 ; 2 + 103e: 90 93 66 06 sts 0x0666, r25 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_MOSI; - f38: 98 e0 ldi r25, 0x08 ; 8 - f3a: 90 93 65 06 sts 0x0665, r25 + 1042: 98 e0 ldi r25, 0x08 ; 8 + 1044: 90 93 65 06 sts 0x0665, r25 MEMORY_FLASH_PORT.DIRSET = MEMORY_FLASH_SCK | MEMORY_FLASH_MOSI | MEMORY_FLASH_CS; - f3e: 9a e1 ldi r25, 0x1A ; 26 - f40: 90 93 61 06 sts 0x0661, r25 + 1048: 9a e1 ldi r25, 0x1A ; 26 + 104a: 90 93 61 06 sts 0x0661, r25 MEMORY_FLASH_USART.BAUDCTRLA = 15;//0; - f44: 9f e0 ldi r25, 0x0F ; 15 - f46: 90 93 a6 09 sts 0x09A6, r25 + 104e: 9f e0 ldi r25, 0x0F ; 15 + 1050: 90 93 a6 09 sts 0x09A6, r25 MEMORY_FLASH_USART.BAUDCTRLB = 0; - f4a: 10 92 a7 09 sts 0x09A7, r1 + 1054: 10 92 a7 09 sts 0x09A7, r1 MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; // | USART_CHSIZE_8BIT_gc; - f4e: 90 ec ldi r25, 0xC0 ; 192 - f50: 90 93 a5 09 sts 0x09A5, r25 + 1058: 90 ec ldi r25, 0xC0 ; 192 + 105a: 90 93 a5 09 sts 0x09A5, r25 MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; - f54: 98 e1 ldi r25, 0x18 ; 24 - f56: 90 93 a4 09 sts 0x09A4, r25 + 105e: 98 e1 ldi r25, 0x18 ; 24 + 1060: 90 93 a4 09 sts 0x09A4, r25 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f5a: 80 93 66 06 sts 0x0666, r24 + 1064: 80 93 66 06 sts 0x0666, r24 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f5e: 87 ed ldi r24, 0xD7 ; 215 - f60: 80 93 a0 09 sts 0x09A0, r24 + 1068: 87 ed ldi r24, 0xD7 ; 215 + 106a: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f64: 80 91 a1 09 lds r24, 0x09A1 - f68: 86 ff sbrs r24, 6 - f6a: fc cf rjmp .-8 ; 0xf64 + 106e: 80 91 a1 09 lds r24, 0x09A1 + 1072: 86 ff sbrs r24, 6 + 1074: fc cf rjmp .-8 ; 0x106e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f6c: 80 e4 ldi r24, 0x40 ; 64 - f6e: 80 93 a1 09 sts 0x09A1, r24 + 1076: 80 e4 ldi r24, 0x40 ; 64 + 1078: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - f72: 80 91 a0 09 lds r24, 0x09A0 + 107c: 80 91 a0 09 lds r24, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f76: 10 92 a0 09 sts 0x09A0, r1 + 1080: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f7a: 80 91 a1 09 lds r24, 0x09A1 - f7e: 86 ff sbrs r24, 6 - f80: fc cf rjmp .-8 ; 0xf7a + 1084: 80 91 a1 09 lds r24, 0x09A1 + 1088: 86 ff sbrs r24, 6 + 108a: fc cf rjmp .-8 ; 0x1084 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f82: 80 e4 ldi r24, 0x40 ; 64 - f84: 80 93 a1 09 sts 0x09A1, r24 + 108c: 80 e4 ldi r24, 0x40 ; 64 + 108e: 80 93 a1 09 sts 0x09A1, r24 return MEMORY_FLASH_USART.DATA; - f88: 80 91 a0 09 lds r24, 0x09A0 + 1092: 80 91 a0 09 lds r24, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f8c: 90 e1 ldi r25, 0x10 ; 16 - f8e: 90 93 65 06 sts 0x0665, r25 + 1096: 90 e1 ldi r25, 0x10 ; 16 + 1098: 90 93 65 06 sts 0x0665, r25 MEMORY_FLASH_USART.BAUDCTRLB = 0; MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; // | USART_CHSIZE_8BIT_gc; MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { - f92: 80 fd sbrc r24, 0 - f94: 3e c0 rjmp .+124 ; 0x1012 + 109c: 80 fd sbrc r24, 0 + 109e: 3e c0 rjmp .+124 ; 0x111c return !(FlashReadStatusRegister() & FLASH_STATUS_REG_READY_BIT); } INLINE void FlashConfigurePageSize(void) { uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; - f96: 8d e3 ldi r24, 0x3D ; 61 - f98: 89 83 std Y+1, r24 ; 0x01 - f9a: 8a e2 ldi r24, 0x2A ; 42 - f9c: 8a 83 std Y+2, r24 ; 0x02 - f9e: 80 e8 ldi r24, 0x80 ; 128 - fa0: 8b 83 std Y+3, r24 ; 0x03 - fa2: 86 ea ldi r24, 0xA6 ; 166 - fa4: 8c 83 std Y+4, r24 ; 0x04 + 10a0: 8d e3 ldi r24, 0x3D ; 61 + 10a2: 89 83 std Y+1, r24 ; 0x01 + 10a4: 8a e2 ldi r24, 0x2A ; 42 + 10a6: 8a 83 std Y+2, r24 ; 0x02 + 10a8: 80 e8 ldi r24, 0x80 ; 128 + 10aa: 8b 83 std Y+3, r24 ; 0x03 + 10ac: 86 ea ldi r24, 0xA6 ; 166 + 10ae: 8c 83 std Y+4, r24 ; 0x04 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - fa6: 20 e1 ldi r18, 0x10 ; 16 + 10b0: 20 e1 ldi r18, 0x10 ; 16 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - fa8: 37 ed ldi r19, 0xD7 ; 215 + 10b2: 37 ed ldi r19, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - faa: 90 e4 ldi r25, 0x40 ; 64 + 10b4: 90 e4 ldi r25, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - fac: 20 93 66 06 sts 0x0666, r18 + 10b6: 20 93 66 06 sts 0x0666, r18 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - fb0: 30 93 a0 09 sts 0x09A0, r19 + 10ba: 30 93 a0 09 sts 0x09A0, r19 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fb4: 80 91 a1 09 lds r24, 0x09A1 - fb8: 86 ff sbrs r24, 6 - fba: fc cf rjmp .-8 ; 0xfb4 + 10be: 80 91 a1 09 lds r24, 0x09A1 + 10c2: 86 ff sbrs r24, 6 + 10c4: fc cf rjmp .-8 ; 0x10be MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fbc: 90 93 a1 09 sts 0x09A1, r25 + 10c6: 90 93 a1 09 sts 0x09A1, r25 return MEMORY_FLASH_USART.DATA; - fc0: 80 91 a0 09 lds r24, 0x09A0 + 10ca: 80 91 a0 09 lds r24, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - fc4: 10 92 a0 09 sts 0x09A0, r1 + 10ce: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fc8: 80 91 a1 09 lds r24, 0x09A1 - fcc: 86 ff sbrs r24, 6 - fce: fc cf rjmp .-8 ; 0xfc8 + 10d2: 80 91 a1 09 lds r24, 0x09A1 + 10d6: 86 ff sbrs r24, 6 + 10d8: fc cf rjmp .-8 ; 0x10d2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fd0: 90 93 a1 09 sts 0x09A1, r25 + 10da: 90 93 a1 09 sts 0x09A1, r25 return MEMORY_FLASH_USART.DATA; - fd4: 80 91 a0 09 lds r24, 0x09A0 + 10de: 80 91 a0 09 lds r24, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - fd8: 20 93 65 06 sts 0x0665, r18 + 10e2: 20 93 65 06 sts 0x0665, r18 INLINE void FlashConfigurePageSize(void) { uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; while(FlashIsBusy()); - fdc: 87 ff sbrs r24, 7 - fde: e6 cf rjmp .-52 ; 0xfac + 10e6: 87 ff sbrs r24, 7 + 10e8: e6 cf rjmp .-52 ; 0x10b6 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - fe0: 80 e1 ldi r24, 0x10 ; 16 - fe2: 80 93 66 06 sts 0x0666, r24 - } -} - -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ + 10ea: 80 e1 ldi r24, 0x10 ; 16 + 10ec: 80 93 66 06 sts 0x0666, r24 + 10f0: fe 01 movw r30, r28 + 10f2: 31 96 adiw r30, 0x01 ; 1 + 10f4: ce 01 movw r24, r28 + 10f6: 05 96 adiw r24, 0x05 ; 5 uint8_t* ByteBuffer = (uint8_t*) Buffer; - fe6: fe 01 movw r30, r28 - fe8: 31 96 adiw r30, 0x01 ; 1 - fea: ce 01 movw r24, r28 - fec: 05 96 adiw r24, 0x05 ; 5 while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fee: 30 e4 ldi r19, 0x40 ; 64 + 10f8: 30 e4 ldi r19, 0x40 ; 64 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; - ff0: 21 91 ld r18, Z+ - ff2: 20 93 a0 09 sts 0x09A0, r18 + 10fa: 21 91 ld r18, Z+ + 10fc: 20 93 a0 09 sts 0x09A0, r18 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ff6: 20 91 a1 09 lds r18, 0x09A1 - ffa: 26 ff sbrs r18, 6 - ffc: fc cf rjmp .-8 ; 0xff6 + 1100: 20 91 a1 09 lds r18, 0x09A1 + 1104: 26 ff sbrs r18, 6 + 1106: fc cf rjmp .-8 ; 0x1100 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ffe: 30 93 a1 09 sts 0x09A1, r19 + 1108: 30 93 a1 09 sts 0x09A1, r19 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - 1002: 20 91 a0 09 lds r18, 0x09A0 + 110c: 20 91 a0 09 lds r18, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - 1006: e8 17 cp r30, r24 - 1008: f9 07 cpc r31, r25 - 100a: 91 f7 brne .-28 ; 0xff0 + 1110: e8 17 cp r30, r24 + 1112: f9 07 cpc r31, r25 + 1114: 91 f7 brne .-28 ; 0x10fa while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPIWriteBlock(Sequence, sizeof(Sequence)); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 100c: 80 e1 ldi r24, 0x10 ; 16 - 100e: 80 93 65 06 sts 0x0665, r24 + 1116: 80 e1 ldi r24, 0x10 ; 16 + 1118: 80 93 65 06 sts 0x0665, r24 FlashConfigurePageSize(); } /* Load permanent flash contents to memory at startup */ MemoryRecall(); } - 1012: 24 96 adiw r28, 0x04 ; 4 - 1014: cd bf out 0x3d, r28 ; 61 - 1016: de bf out 0x3e, r29 ; 62 - 1018: df 91 pop r29 - 101a: cf 91 pop r28 + 111c: 24 96 adiw r28, 0x04 ; 4 + 111e: cd bf out 0x3d, r28 ; 61 + 1120: de bf out 0x3e, r29 ; 62 + 1122: df 91 pop r29 + 1124: cf 91 pop r28 /* Configure for 256 byte Dataflash if not already done. */ FlashConfigurePageSize(); } /* Load permanent flash contents to memory at startup */ MemoryRecall(); - 101c: 0b cf rjmp .-490 ; 0xe34 + 1126: 0b cf rjmp .-490 ; 0xf3e -0000101e : +00001128 : /* Recall memory from permanent flash */ FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); } void MemoryStore(void) { - 101e: 4f 92 push r4 - 1020: 5f 92 push r5 - 1022: 6f 92 push r6 - 1024: 7f 92 push r7 - 1026: 8f 92 push r8 - 1028: 9f 92 push r9 - 102a: af 92 push r10 - 102c: bf 92 push r11 - 102e: cf 92 push r12 - 1030: df 92 push r13 - 1032: ef 92 push r14 - 1034: ff 92 push r15 - 1036: 0f 93 push r16 - 1038: 1f 93 push r17 - 103a: cf 93 push r28 - 103c: df 93 push r29 + 1128: 5f 92 push r5 + 112a: 6f 92 push r6 + 112c: 7f 92 push r7 + 112e: 8f 92 push r8 + 1130: 9f 92 push r9 + 1132: af 92 push r10 + 1134: bf 92 push r11 + 1136: cf 92 push r12 + 1138: df 92 push r13 + 113a: ef 92 push r14 + 113c: ff 92 push r15 + 113e: 0f 93 push r16 + 1140: 1f 93 push r17 + 1142: cf 93 push r28 + 1144: df 93 push r29 /* Store current memory into permanent flash */ FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); - 103e: 80 91 09 29 lds r24, 0x2909 - 1042: 90 e0 ldi r25, 0x00 ; 0 - 1044: a0 e0 ldi r26, 0x00 ; 0 - 1046: b0 e0 ldi r27, 0x00 ; 0 - 1048: 6a e0 ldi r22, 0x0A ; 10 - 104a: 88 0f add r24, r24 - 104c: 99 1f adc r25, r25 - 104e: aa 1f adc r26, r26 - 1050: bb 1f adc r27, r27 - 1052: 6a 95 dec r22 - 1054: d1 f7 brne .-12 ; 0x104a - 1056: e2 e9 ldi r30, 0x92 ; 146 - 1058: f0 e2 ldi r31, 0x20 ; 32 - 105a: 00 e0 ldi r16, 0x00 ; 0 - 105c: 14 e0 ldi r17, 0x04 ; 4 + 1146: 80 91 09 29 lds r24, 0x2909 + 114a: 90 e0 ldi r25, 0x00 ; 0 + 114c: a0 e0 ldi r26, 0x00 ; 0 + 114e: b0 e0 ldi r27, 0x00 ; 0 + 1150: 6a e0 ldi r22, 0x0A ; 10 + 1152: 88 0f add r24, r24 + 1154: 99 1f adc r25, r25 + 1156: aa 1f adc r26, r26 + 1158: bb 1f adc r27, r27 + 115a: 6a 95 dec r22 + 115c: d1 f7 brne .-12 ; 0x1152 + 115e: 22 e9 ldi r18, 0x92 ; 146 + 1160: 30 e2 ldi r19, 0x20 ; 32 + 1162: 00 e0 ldi r16, 0x00 ; 0 + 1164: 14 e0 ldi r17, 0x04 ; 4 INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { uint16_t PageAddress = Address / FLASH_PAGE_SIZE; uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - 105e: e1 2c mov r14, r1 - 1060: ff 24 eor r15, r15 - 1062: f3 94 inc r15 + 1166: e1 2c mov r14, r1 + 1168: ff 24 eor r15, r15 + 116a: f3 94 inc r15 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1064: c0 e1 ldi r28, 0x10 ; 16 - 1066: cc 2e mov r12, r28 + 116c: e0 e1 ldi r30, 0x10 ; 16 + 116e: ce 2e mov r12, r30 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1068: d7 ed ldi r29, 0xD7 ; 215 - 106a: bd 2e mov r11, r29 + 1170: f7 ed ldi r31, 0xD7 ; 215 + 1172: bf 2e mov r11, r31 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 106c: 20 e4 ldi r18, 0x40 ; 64 - 106e: d2 2e mov r13, r18 + 1174: c0 e4 ldi r28, 0x40 ; 64 + 1176: dc 2e mov r13, r28 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1070: 30 e1 ldi r19, 0x10 ; 16 - 1072: a3 2e mov r10, r19 + 1178: d0 e1 ldi r29, 0x10 ; 16 + 117a: ad 2e mov r10, r29 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1074: 47 ed ldi r20, 0xD7 ; 215 - 1076: 94 2e mov r9, r20 - 1078: 53 e5 ldi r21, 0x53 ; 83 - 107a: 45 2e mov r4, r21 - 107c: 64 e8 ldi r22, 0x84 ; 132 - 107e: 56 2e mov r5, r22 - 1080: 73 e8 ldi r23, 0x83 ; 131 - 1082: 67 2e mov r6, r23 + 117c: 47 ed ldi r20, 0xD7 ; 215 + 117e: 94 2e mov r9, r20 + 1180: 53 e5 ldi r21, 0x53 ; 83 + 1182: 65 2e mov r6, r21 + 1184: 64 e8 ldi r22, 0x84 ; 132 + 1186: 76 2e mov r7, r22 + 1188: 73 e8 ldi r23, 0x83 ; 131 + 118a: 87 2e mov r8, r23 } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { uint16_t PageAddress = Address / FLASH_PAGE_SIZE; - 1084: 49 2f mov r20, r25 - 1086: 5a 2f mov r21, r26 - 1088: 6b 2f mov r22, r27 - 108a: 77 27 eor r23, r23 - 108c: 85 2e mov r8, r21 + 118c: 49 2f mov r20, r25 + 118e: 5a 2f mov r21, r26 + 1190: 6b 2f mov r22, r27 + 1192: 77 27 eor r23, r23 uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; - 108e: 38 2f mov r19, r24 + 1194: f8 2f mov r31, r24 uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - 1090: e7 01 movw r28, r14 - 1092: c8 1b sub r28, r24 - 1094: d1 09 sbc r29, r1 - 1096: 0c 17 cp r16, r28 - 1098: 1d 07 cpc r17, r29 - 109a: 08 f4 brcc .+2 ; 0x109e - 109c: e8 01 movw r28, r16 + 1196: e7 01 movw r28, r14 + 1198: c8 1b sub r28, r24 + 119a: d1 09 sbc r29, r1 + 119c: 0c 17 cp r16, r28 + 119e: 1d 07 cpc r17, r29 + 11a0: 08 f4 brcc .+2 ; 0x11a4 + 11a2: e8 01 movw r28, r16 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 109e: a0 92 66 06 sts 0x0666, r10 + 11a4: a0 92 66 06 sts 0x0666, r10 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 10a2: 90 92 a0 09 sts 0x09A0, r9 + 11a8: 90 92 a0 09 sts 0x09A0, r9 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 10a6: 20 91 a1 09 lds r18, 0x09A1 - 10aa: 26 ff sbrs r18, 6 - 10ac: fc cf rjmp .-8 ; 0x10a6 + 11ac: e0 91 a1 09 lds r30, 0x09A1 + 11b0: e6 ff sbrs r30, 6 + 11b2: fc cf rjmp .-8 ; 0x11ac MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10ae: d0 92 a1 09 sts 0x09A1, r13 + 11b4: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 10b2: 20 91 a0 09 lds r18, 0x09A0 + 11b8: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 10b6: 10 92 a0 09 sts 0x09A0, r1 + 11bc: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 10ba: 20 91 a1 09 lds r18, 0x09A1 - 10be: 26 ff sbrs r18, 6 - 10c0: fc cf rjmp .-8 ; 0x10ba + 11c0: e0 91 a1 09 lds r30, 0x09A1 + 11c4: e6 ff sbrs r30, 6 + 11c6: fc cf rjmp .-8 ; 0x11c0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10c2: d0 92 a1 09 sts 0x09A1, r13 + 11c8: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 10c6: 20 91 a0 09 lds r18, 0x09A0 + 11cc: e0 91 a0 09 lds r30, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 10ca: c0 92 65 06 sts 0x0665, r12 + 11d0: c0 92 65 06 sts 0x0665, r12 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashMemoryToBuffer(uint16_t PageAddress) { while(FlashIsBusy()); - 10ce: 27 ff sbrs r18, 7 - 10d0: e6 cf rjmp .-52 ; 0x109e + 11d4: e7 ff sbrs r30, 7 + 11d6: e6 cf rjmp .-52 ; 0x11a4 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 10d2: a0 92 66 06 sts 0x0666, r10 + 11d8: a0 92 66 06 sts 0x0666, r10 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 10d6: 40 92 a0 09 sts 0x09A0, r4 + 11dc: 60 92 a0 09 sts 0x09A0, r6 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 10da: 20 91 a1 09 lds r18, 0x09A1 - 10de: 26 ff sbrs r18, 6 - 10e0: fc cf rjmp .-8 ; 0x10da + 11e0: e0 91 a1 09 lds r30, 0x09A1 + 11e4: e6 ff sbrs r30, 6 + 11e6: fc cf rjmp .-8 ; 0x11e0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10e2: d0 92 a1 09 sts 0x09A1, r13 + 11e8: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 10e6: 20 91 a0 09 lds r18, 0x09A0 + 11ec: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 10ea: 80 92 a0 09 sts 0x09A0, r8 + 11f0: 50 93 a0 09 sts 0x09A0, r21 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 10ee: 20 91 a1 09 lds r18, 0x09A1 - 10f2: 26 ff sbrs r18, 6 - 10f4: fc cf rjmp .-8 ; 0x10ee + 11f4: e0 91 a1 09 lds r30, 0x09A1 + 11f8: e6 ff sbrs r30, 6 + 11fa: fc cf rjmp .-8 ; 0x11f4 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10f6: d0 92 a1 09 sts 0x09A1, r13 + 11fc: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 10fa: 20 91 a0 09 lds r18, 0x09A0 - while(FlashIsBusy()); - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - SPITransferByte(FLASH_CMD_MEM_TO_BUF1); - SPITransferByte( (PageAddress >> 8) & 0xFF ); - SPITransferByte( (PageAddress >> 0) & 0xFF ); - 10fe: 74 2e mov r7, r20 + 1200: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1100: 40 93 a0 09 sts 0x09A0, r20 + 1204: 40 93 a0 09 sts 0x09A0, r20 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1104: 20 91 a1 09 lds r18, 0x09A1 - 1108: 26 ff sbrs r18, 6 - 110a: fc cf rjmp .-8 ; 0x1104 + 1208: e0 91 a1 09 lds r30, 0x09A1 + 120c: e6 ff sbrs r30, 6 + 120e: fc cf rjmp .-8 ; 0x1208 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 110c: d0 92 a1 09 sts 0x09A1, r13 + 1210: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1110: 20 91 a0 09 lds r18, 0x09A0 + 1214: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1114: 10 92 a0 09 sts 0x09A0, r1 + 1218: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1118: 20 91 a1 09 lds r18, 0x09A1 - 111c: 26 ff sbrs r18, 6 - 111e: fc cf rjmp .-8 ; 0x1118 + 121c: e0 91 a1 09 lds r30, 0x09A1 + 1220: e6 ff sbrs r30, 6 + 1222: fc cf rjmp .-8 ; 0x121c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1120: d0 92 a1 09 sts 0x09A1, r13 + 1224: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1124: 20 91 a0 09 lds r18, 0x09A0 + 1228: e0 91 a0 09 lds r30, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_MEM_TO_BUF1); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1128: c0 92 65 06 sts 0x0665, r12 + 122c: c0 92 65 06 sts 0x0665, r12 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 112c: c0 92 66 06 sts 0x0666, r12 + 1230: c0 92 66 06 sts 0x0666, r12 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1130: b0 92 a0 09 sts 0x09A0, r11 + 1234: b0 92 a0 09 sts 0x09A0, r11 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1134: 20 91 a1 09 lds r18, 0x09A1 - 1138: 26 ff sbrs r18, 6 - 113a: fc cf rjmp .-8 ; 0x1134 + 1238: e0 91 a1 09 lds r30, 0x09A1 + 123c: e6 ff sbrs r30, 6 + 123e: fc cf rjmp .-8 ; 0x1238 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 113c: d0 92 a1 09 sts 0x09A1, r13 + 1240: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1140: 20 91 a0 09 lds r18, 0x09A0 + 1244: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1144: 10 92 a0 09 sts 0x09A0, r1 + 1248: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1148: 20 91 a1 09 lds r18, 0x09A1 - 114c: 26 ff sbrs r18, 6 - 114e: fc cf rjmp .-8 ; 0x1148 + 124c: e0 91 a1 09 lds r30, 0x09A1 + 1250: e6 ff sbrs r30, 6 + 1252: fc cf rjmp .-8 ; 0x124c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1150: d0 92 a1 09 sts 0x09A1, r13 + 1254: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1154: 20 91 a0 09 lds r18, 0x09A0 + 1258: e0 91 a0 09 lds r30, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1158: c0 92 65 06 sts 0x0665, r12 + 125c: c0 92 65 06 sts 0x0665, r12 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWriteBuffer(const void* Buffer, uint8_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - 115c: 27 ff sbrs r18, 7 - 115e: e6 cf rjmp .-52 ; 0x112c + 1260: e7 ff sbrs r30, 7 + 1262: e6 cf rjmp .-52 ; 0x1230 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1160: a0 92 66 06 sts 0x0666, r10 + 1264: a0 92 66 06 sts 0x0666, r10 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1164: 50 92 a0 09 sts 0x09A0, r5 + 1268: 70 92 a0 09 sts 0x09A0, r7 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1168: 20 91 a1 09 lds r18, 0x09A1 - 116c: 26 ff sbrs r18, 6 - 116e: fc cf rjmp .-8 ; 0x1168 + 126c: e0 91 a1 09 lds r30, 0x09A1 + 1270: e6 ff sbrs r30, 6 + 1272: fc cf rjmp .-8 ; 0x126c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1170: d0 92 a1 09 sts 0x09A1, r13 + 1274: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1174: 20 91 a0 09 lds r18, 0x09A0 + 1278: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1178: 10 92 a0 09 sts 0x09A0, r1 + 127c: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 117c: 20 91 a1 09 lds r18, 0x09A1 - 1180: 26 ff sbrs r18, 6 - 1182: fc cf rjmp .-8 ; 0x117c + 1280: e0 91 a1 09 lds r30, 0x09A1 + 1284: e6 ff sbrs r30, 6 + 1286: fc cf rjmp .-8 ; 0x1280 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1184: d0 92 a1 09 sts 0x09A1, r13 + 1288: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1188: 20 91 a0 09 lds r18, 0x09A0 + 128c: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 118c: 10 92 a0 09 sts 0x09A0, r1 + 1290: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1190: 20 91 a1 09 lds r18, 0x09A1 - 1194: 26 ff sbrs r18, 6 - 1196: fc cf rjmp .-8 ; 0x1190 + 1294: e0 91 a1 09 lds r30, 0x09A1 + 1298: e6 ff sbrs r30, 6 + 129a: fc cf rjmp .-8 ; 0x1294 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1198: d0 92 a1 09 sts 0x09A1, r13 + 129c: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 119c: 20 91 a0 09 lds r18, 0x09A0 + 12a0: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 11a0: 30 93 a0 09 sts 0x09A0, r19 + 12a4: f0 93 a0 09 sts 0x09A0, r31 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11a4: 20 91 a1 09 lds r18, 0x09A1 - 11a8: 26 ff sbrs r18, 6 - 11aa: fc cf rjmp .-8 ; 0x11a4 + 12a8: e0 91 a1 09 lds r30, 0x09A1 + 12ac: e6 ff sbrs r30, 6 + 12ae: fc cf rjmp .-8 ; 0x12a8 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 11ac: d0 92 a1 09 sts 0x09A1, r13 + 12b0: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 11b0: 20 91 a0 09 lds r18, 0x09A0 -{ - /* Recall memory from permanent flash */ - FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - -void MemoryStore(void) - 11b4: 9f 01 movw r18, r30 + 12b4: e0 91 a0 09 lds r30, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - 11b6: 20 97 sbiw r28, 0x00 ; 0 - 11b8: 81 f0 breq .+32 ; 0x11da -{ - /* Recall memory from permanent flash */ - FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - -void MemoryStore(void) - 11ba: 2c 0f add r18, r28 - 11bc: 3d 1f adc r19, r29 -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - - while(ByteCount-- > 0) { + 12b8: 20 97 sbiw r28, 0x00 ; 0 + 12ba: 89 f0 breq .+34 ; 0x12de + 12bc: f9 01 movw r30, r18 + 12be: 2c 0f add r18, r28 + 12c0: 3d 1f adc r19, r29 MEMORY_FLASH_USART.DATA = *ByteBuffer++; - 11be: 41 91 ld r20, Z+ - 11c0: 40 93 a0 09 sts 0x09A0, r20 + 12c2: 51 90 ld r5, Z+ + 12c4: 50 92 a0 09 sts 0x09A0, r5 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11c4: 40 91 a1 09 lds r20, 0x09A1 - 11c8: 46 ff sbrs r20, 6 - 11ca: fc cf rjmp .-8 ; 0x11c4 + 12c8: 50 90 a1 09 lds r5, 0x09A1 + 12cc: 56 fe sbrs r5, 6 + 12ce: fc cf rjmp .-8 ; 0x12c8 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 11cc: d0 92 a1 09 sts 0x09A1, r13 + 12d0: d0 92 a1 09 sts 0x09A1, r13 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - 11d0: 40 91 a0 09 lds r20, 0x09A0 + 12d4: 50 90 a0 09 lds r5, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - 11d4: e2 17 cp r30, r18 - 11d6: f3 07 cpc r31, r19 - 11d8: 91 f7 brne .-28 ; 0x11be + 12d8: e2 17 cp r30, r18 + 12da: f3 07 cpc r31, r19 + 12dc: 91 f7 brne .-28 ; 0x12c2 SPITransferByte(FLASH_CMD_BUF1_WRITE); SPITransferByte( 0 ); SPITransferByte( 0 ); SPITransferByte( Address ); SPIWriteBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 11da: c0 92 65 06 sts 0x0665, r12 + 12de: c0 92 65 06 sts 0x0665, r12 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 11de: c0 92 66 06 sts 0x0666, r12 + 12e2: c0 92 66 06 sts 0x0666, r12 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 11e2: b0 92 a0 09 sts 0x09A0, r11 + 12e6: b0 92 a0 09 sts 0x09A0, r11 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11e6: 40 91 a1 09 lds r20, 0x09A1 - 11ea: 46 ff sbrs r20, 6 - 11ec: fc cf rjmp .-8 ; 0x11e6 + 12ea: e0 91 a1 09 lds r30, 0x09A1 + 12ee: e6 ff sbrs r30, 6 + 12f0: fc cf rjmp .-8 ; 0x12ea MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 11ee: d0 92 a1 09 sts 0x09A1, r13 + 12f2: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 11f2: 40 91 a0 09 lds r20, 0x09A0 + 12f6: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 11f6: 10 92 a0 09 sts 0x09A0, r1 + 12fa: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11fa: 40 91 a1 09 lds r20, 0x09A1 - 11fe: 46 ff sbrs r20, 6 - 1200: fc cf rjmp .-8 ; 0x11fa + 12fe: e0 91 a1 09 lds r30, 0x09A1 + 1302: e6 ff sbrs r30, 6 + 1304: fc cf rjmp .-8 ; 0x12fe MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1202: d0 92 a1 09 sts 0x09A1, r13 + 1306: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1206: 40 91 a0 09 lds r20, 0x09A0 + 130a: e0 91 a0 09 lds r30, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 120a: c0 92 65 06 sts 0x0665, r12 + 130e: c0 92 65 06 sts 0x0665, r12 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashBufferToMemory(uint16_t PageAddress) { while(FlashIsBusy()); - 120e: 47 ff sbrs r20, 7 - 1210: e6 cf rjmp .-52 ; 0x11de + 1312: e7 ff sbrs r30, 7 + 1314: e6 cf rjmp .-52 ; 0x12e2 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1212: a0 92 66 06 sts 0x0666, r10 + 1316: a0 92 66 06 sts 0x0666, r10 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1216: 60 92 a0 09 sts 0x09A0, r6 + 131a: 80 92 a0 09 sts 0x09A0, r8 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 121a: 40 91 a1 09 lds r20, 0x09A1 - 121e: 46 ff sbrs r20, 6 - 1220: fc cf rjmp .-8 ; 0x121a + 131e: e0 91 a1 09 lds r30, 0x09A1 + 1322: e6 ff sbrs r30, 6 + 1324: fc cf rjmp .-8 ; 0x131e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1222: d0 92 a1 09 sts 0x09A1, r13 + 1326: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1226: 40 91 a0 09 lds r20, 0x09A0 + 132a: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 122a: 80 92 a0 09 sts 0x09A0, r8 + 132e: 50 93 a0 09 sts 0x09A0, r21 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 122e: 40 91 a1 09 lds r20, 0x09A1 - 1232: 46 ff sbrs r20, 6 - 1234: fc cf rjmp .-8 ; 0x122e + 1332: e0 91 a1 09 lds r30, 0x09A1 + 1336: e6 ff sbrs r30, 6 + 1338: fc cf rjmp .-8 ; 0x1332 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1236: d0 92 a1 09 sts 0x09A1, r13 + 133a: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 123a: 40 91 a0 09 lds r20, 0x09A0 + 133e: e0 91 a0 09 lds r30, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 123e: 70 92 a0 09 sts 0x09A0, r7 + 1342: 40 93 a0 09 sts 0x09A0, r20 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1242: 40 91 a1 09 lds r20, 0x09A1 - 1246: 46 ff sbrs r20, 6 - 1248: fc cf rjmp .-8 ; 0x1242 + 1346: 40 91 a1 09 lds r20, 0x09A1 + 134a: 46 ff sbrs r20, 6 + 134c: fc cf rjmp .-8 ; 0x1346 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 124a: d0 92 a1 09 sts 0x09A1, r13 + 134e: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 124e: 40 91 a0 09 lds r20, 0x09A0 + 1352: 40 91 a0 09 lds r20, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1252: 10 92 a0 09 sts 0x09A0, r1 + 1356: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1256: 40 91 a1 09 lds r20, 0x09A1 - 125a: 46 ff sbrs r20, 6 - 125c: fc cf rjmp .-8 ; 0x1256 + 135a: 40 91 a1 09 lds r20, 0x09A1 + 135e: 46 ff sbrs r20, 6 + 1360: fc cf rjmp .-8 ; 0x135a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 125e: d0 92 a1 09 sts 0x09A1, r13 + 1362: d0 92 a1 09 sts 0x09A1, r13 return MEMORY_FLASH_USART.DATA; - 1262: 40 91 a0 09 lds r20, 0x09A0 + 1366: 40 91 a0 09 lds r20, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_BUF1_TO_MEM_ERASE); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1266: c0 92 65 06 sts 0x0665, r12 + 136a: c0 92 65 06 sts 0x0665, r12 FlashMemoryToBuffer(PageAddress); FlashWriteBuffer(Buffer, ByteAddress, PageBytes); FlashBufferToMemory(PageAddress); ByteCount -= PageBytes; - 126a: 0c 1b sub r16, r28 - 126c: 1d 0b sbc r17, r29 + 136e: 0c 1b sub r16, r28 + 1370: 1d 0b sbc r17, r29 Address += PageBytes; - 126e: 8c 0f add r24, r28 - 1270: 9d 1f adc r25, r29 - 1272: a1 1d adc r26, r1 - 1274: b1 1d adc r27, r1 - Buffer += PageBytes; - 1276: f9 01 movw r30, r18 + 1372: 8c 0f add r24, r28 + 1374: 9d 1f adc r25, r29 + 1376: a1 1d adc r26, r1 + 1378: b1 1d adc r27, r1 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - 1278: 01 15 cp r16, r1 - 127a: 11 05 cpc r17, r1 - 127c: 09 f0 breq .+2 ; 0x1280 - 127e: 02 cf rjmp .-508 ; 0x1084 + 137a: 01 15 cp r16, r1 + 137c: 11 05 cpc r17, r1 + 137e: 09 f0 breq .+2 ; 0x1382 + 1380: 05 cf rjmp .-502 ; 0x118c void MemoryStore(void) { /* Store current memory into permanent flash */ FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); LEDTrigger(LED_MEMORY_CHANGED, LED_OFF); - 1280: 60 e1 ldi r22, 0x10 ; 16 - 1282: 85 e0 ldi r24, 0x05 ; 5 - 1284: 6c d6 rcall .+3288 ; 0x1f5e + 1382: 60 e1 ldi r22, 0x10 ; 16 + 1384: 85 e0 ldi r24, 0x05 ; 5 + 1386: 2d d6 rcall .+3162 ; 0x1fe2 LEDTrigger(LED_MEMORY_STORED, LED_PULSE); - 1286: 63 e1 ldi r22, 0x13 ; 19 - 1288: 84 e0 ldi r24, 0x04 ; 4 + 1388: 63 e1 ldi r22, 0x13 ; 19 + 138a: 84 e0 ldi r24, 0x04 ; 4 } - 128a: df 91 pop r29 - 128c: cf 91 pop r28 - 128e: 1f 91 pop r17 - 1290: 0f 91 pop r16 - 1292: ff 90 pop r15 - 1294: ef 90 pop r14 - 1296: df 90 pop r13 - 1298: cf 90 pop r12 - 129a: bf 90 pop r11 - 129c: af 90 pop r10 - 129e: 9f 90 pop r9 - 12a0: 8f 90 pop r8 - 12a2: 7f 90 pop r7 - 12a4: 6f 90 pop r6 - 12a6: 5f 90 pop r5 - 12a8: 4f 90 pop r4 + 138c: df 91 pop r29 + 138e: cf 91 pop r28 + 1390: 1f 91 pop r17 + 1392: 0f 91 pop r16 + 1394: ff 90 pop r15 + 1396: ef 90 pop r14 + 1398: df 90 pop r13 + 139a: cf 90 pop r12 + 139c: bf 90 pop r11 + 139e: af 90 pop r10 + 13a0: 9f 90 pop r9 + 13a2: 8f 90 pop r8 + 13a4: 7f 90 pop r7 + 13a6: 6f 90 pop r6 + 13a8: 5f 90 pop r5 { /* Store current memory into permanent flash */ FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); LEDTrigger(LED_MEMORY_CHANGED, LED_OFF); LEDTrigger(LED_MEMORY_STORED, LED_PULSE); - 12aa: 59 c6 rjmp .+3250 ; 0x1f5e + 13aa: 1b c6 rjmp .+3126 ; 0x1fe2 -000012ac : +000013ac : } bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - 12ac: 2f 92 push r2 - 12ae: 3f 92 push r3 - 12b0: 4f 92 push r4 - 12b2: 5f 92 push r5 - 12b4: 6f 92 push r6 - 12b6: 7f 92 push r7 - 12b8: 8f 92 push r8 - 12ba: 9f 92 push r9 - 12bc: af 92 push r10 - 12be: bf 92 push r11 - 12c0: cf 92 push r12 - 12c2: df 92 push r13 - 12c4: ef 92 push r14 - 12c6: ff 92 push r15 - 12c8: 0f 93 push r16 - 12ca: 1f 93 push r17 - 12cc: cf 93 push r28 - 12ce: df 93 push r29 - 12d0: cd b7 in r28, 0x3d ; 61 - 12d2: de b7 in r29, 0x3e ; 62 - 12d4: 2b 97 sbiw r28, 0x0b ; 11 - 12d6: cd bf out 0x3d, r28 ; 61 - 12d8: de bf out 0x3e, r29 ; 62 - 12da: 8d 83 std Y+5, r24 ; 0x05 - 12dc: 29 2e mov r2, r25 - 12de: 59 01 movw r10, r18 + 13ac: 2f 92 push r2 + 13ae: 3f 92 push r3 + 13b0: 4f 92 push r4 + 13b2: 5f 92 push r5 + 13b4: 6f 92 push r6 + 13b6: 7f 92 push r7 + 13b8: 8f 92 push r8 + 13ba: 9f 92 push r9 + 13bc: af 92 push r10 + 13be: bf 92 push r11 + 13c0: cf 92 push r12 + 13c2: df 92 push r13 + 13c4: ef 92 push r14 + 13c6: ff 92 push r15 + 13c8: 0f 93 push r16 + 13ca: 1f 93 push r17 + 13cc: cf 93 push r28 + 13ce: df 93 push r29 + 13d0: cd b7 in r28, 0x3d ; 61 + 13d2: de b7 in r29, 0x3e ; 62 + 13d4: 2c 97 sbiw r28, 0x0c ; 12 + 13d6: cd bf out 0x3d, r28 ; 61 + 13d8: de bf out 0x3e, r29 ; 62 + 13da: 4c 01 movw r8, r24 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 12e0: 41 15 cp r20, r1 - 12e2: 84 e0 ldi r24, 0x04 ; 4 - 12e4: 58 07 cpc r21, r24 - 12e6: 61 05 cpc r22, r1 - 12e8: 71 05 cpc r23, r1 - 12ea: 08 f0 brcs .+2 ; 0x12ee - 12ec: 85 c1 rjmp .+778 ; 0x15f8 + 13dc: 41 15 cp r20, r1 + 13de: 04 e0 ldi r16, 0x04 ; 4 + 13e0: 50 07 cpc r21, r16 + 13e2: 61 05 cpc r22, r1 + 13e4: 71 05 cpc r23, r1 + 13e6: 08 f0 brcs .+2 ; 0x13ea + 13e8: 5d c1 rjmp .+698 ; 0x16a4 /* Prevent writing out of bounds by silently ignoring it */ return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING; - 12ee: 80 91 09 29 lds r24, 0x2909 - 12f2: 90 e0 ldi r25, 0x00 ; 0 - 12f4: a0 e0 ldi r26, 0x00 ; 0 - 12f6: b0 e0 ldi r27, 0x00 ; 0 - 12f8: fa e0 ldi r31, 0x0A ; 10 - 12fa: 88 0f add r24, r24 - 12fc: 99 1f adc r25, r25 - 12fe: aa 1f adc r26, r26 - 1300: bb 1f adc r27, r27 - 1302: fa 95 dec r31 - 1304: d1 f7 brne .-12 ; 0x12fa - 1306: 84 0f add r24, r20 - 1308: 95 1f adc r25, r21 - 130a: a6 1f adc r26, r22 - 130c: b7 1f adc r27, r23 + 13ea: 80 91 09 29 lds r24, 0x2909 + 13ee: 90 e0 ldi r25, 0x00 ; 0 + 13f0: a0 e0 ldi r26, 0x00 ; 0 + 13f2: b0 e0 ldi r27, 0x00 ; 0 + 13f4: 1a e0 ldi r17, 0x0A ; 10 + 13f6: 88 0f add r24, r24 + 13f8: 99 1f adc r25, r25 + 13fa: aa 1f adc r26, r26 + 13fc: bb 1f adc r27, r27 + 13fe: 1a 95 dec r17 + 1400: d1 f7 brne .-12 ; 0x13f6 + 1402: 84 0f add r24, r20 + 1404: 95 1f adc r25, r21 + 1406: a6 1f adc r26, r22 + 1408: b7 1f adc r27, r23 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { /* Prevent writing out of bounds by silently ignoring it */ return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - 130e: 00 e0 ldi r16, 0x00 ; 0 - 1310: 14 e0 ldi r17, 0x04 ; 4 - 1312: 20 e0 ldi r18, 0x00 ; 0 - 1314: 30 e0 ldi r19, 0x00 ; 0 - 1316: 04 1b sub r16, r20 - 1318: 15 0b sbc r17, r21 - 131a: 26 0b sbc r18, r22 - 131c: 37 0b sbc r19, r23 + 140a: c1 2c mov r12, r1 + 140c: 04 e0 ldi r16, 0x04 ; 4 + 140e: d0 2e mov r13, r16 + 1410: e1 2c mov r14, r1 + 1412: f1 2c mov r15, r1 uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING; ByteCount = MIN(ByteCount, BytesLeft); - 131e: 65 01 movw r12, r10 - 1320: e1 2c mov r14, r1 - 1322: f1 2c mov r15, r1 - 1324: c9 82 std Y+1, r12 ; 0x01 - 1326: da 82 std Y+2, r13 ; 0x02 - 1328: eb 82 std Y+3, r14 ; 0x03 - 132a: fc 82 std Y+4, r15 ; 0x04 - 132c: 0c 15 cp r16, r12 - 132e: 1d 05 cpc r17, r13 - 1330: 2e 05 cpc r18, r14 - 1332: 3f 05 cpc r19, r15 - 1334: 08 f4 brcc .+2 ; 0x1338 - 1336: 7a c1 rjmp .+756 ; 0x162c - 1338: 09 81 ldd r16, Y+1 ; 0x01 - 133a: 1a 81 ldd r17, Y+2 ; 0x02 + 1414: 89 01 movw r16, r18 + 1416: 20 e0 ldi r18, 0x00 ; 0 + 1418: 30 e0 ldi r19, 0x00 ; 0 + 141a: c4 1a sub r12, r20 + 141c: d5 0a sbc r13, r21 + 141e: e6 0a sbc r14, r22 + 1420: f7 0a sbc r15, r23 + 1422: cd 82 std Y+5, r12 ; 0x05 + 1424: de 82 std Y+6, r13 ; 0x06 + 1426: ef 82 std Y+7, r14 ; 0x07 + 1428: f8 86 std Y+8, r15 ; 0x08 + 142a: 0c 15 cp r16, r12 + 142c: 1d 05 cpc r17, r13 + 142e: 2e 05 cpc r18, r14 + 1430: 3f 05 cpc r19, r15 + 1432: 08 f4 brcc .+2 ; 0x1436 + 1434: 51 c1 rjmp .+674 ; 0x16d8 + 1436: ed 80 ldd r14, Y+5 ; 0x05 + 1438: fe 80 ldd r15, Y+6 ; 0x06 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - 133c: 01 15 cp r16, r1 - 133e: 11 05 cpc r17, r1 - 1340: 09 f4 brne .+2 ; 0x1344 - 1342: 5a c1 rjmp .+692 ; 0x15f8 - 1344: 2d 81 ldd r18, Y+5 ; 0x05 - 1346: 32 2d mov r19, r2 + 143a: e1 14 cp r14, r1 + 143c: f1 04 cpc r15, r1 + 143e: 09 f4 brne .+2 ; 0x1442 + 1440: 31 c1 rjmp .+610 ; 0x16a4 + 1442: a8 2c mov r10, r8 + 1444: 39 2c mov r3, r9 uint16_t PageAddress = Address / FLASH_PAGE_SIZE; uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - 1348: e1 2c mov r14, r1 - 134a: ff 24 eor r15, r15 - 134c: f3 94 inc r15 + 1446: c1 2c mov r12, r1 + 1448: dd 24 eor r13, r13 + 144a: d3 94 inc r13 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 134e: e0 e1 ldi r30, 0x10 ; 16 - 1350: ce 2e mov r12, r30 + 144c: 10 e1 ldi r17, 0x10 ; 16 + 144e: 71 2e mov r7, r17 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1352: f7 ed ldi r31, 0xD7 ; 215 - 1354: bf 2e mov r11, r31 + 1450: 07 ed ldi r16, 0xD7 ; 215 + 1452: 60 2e mov r6, r16 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1356: e0 e4 ldi r30, 0x40 ; 64 - 1358: de 2e mov r13, r30 + 1454: 20 e4 ldi r18, 0x40 ; 64 + 1456: b2 2e mov r11, r18 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 135a: f0 e1 ldi r31, 0x10 ; 16 - 135c: af 2e mov r10, r31 + 1458: 30 e1 ldi r19, 0x10 ; 16 + 145a: 53 2e mov r5, r19 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 135e: e7 ed ldi r30, 0xD7 ; 215 - 1360: 9e 2e mov r9, r30 - 1362: f3 e5 ldi r31, 0x53 ; 83 - 1364: 6f 2e mov r6, r31 - 1366: e4 e8 ldi r30, 0x84 ; 132 - 1368: 8e 2e mov r8, r30 - 136a: 2a 87 std Y+10, r18 ; 0x0a - 136c: 3b 87 std Y+11, r19 ; 0x0b - 136e: 4e 83 std Y+6, r20 ; 0x06 - 1370: 5f 83 std Y+7, r21 ; 0x07 - 1372: 68 87 std Y+8, r22 ; 0x08 - 1374: 79 87 std Y+9, r23 ; 0x09 - 1376: 36 2c mov r3, r6 + 145c: e7 ed ldi r30, 0xD7 ; 215 + 145e: 4e 2e mov r4, r30 + 1460: f3 e5 ldi r31, 0x53 ; 83 + 1462: 2f 2e mov r2, r31 + 1464: 04 e8 ldi r16, 0x84 ; 132 + 1466: 13 e8 ldi r17, 0x83 ; 131 + 1468: 49 87 std Y+9, r20 ; 0x09 + 146a: 5a 87 std Y+10, r21 ; 0x0a + 146c: 6b 87 std Y+11, r22 ; 0x0b + 146e: 7c 87 std Y+12, r23 ; 0x0c } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { uint16_t PageAddress = Address / FLASH_PAGE_SIZE; - 1378: 49 2e mov r4, r25 - 137a: 5a 2e mov r5, r26 - 137c: 6b 2e mov r6, r27 - 137e: 77 24 eor r7, r7 - 1380: 45 2d mov r20, r5 + 1470: 29 2f mov r18, r25 + 1472: 3a 2f mov r19, r26 + 1474: 4b 2f mov r20, r27 + 1476: 55 27 eor r21, r21 + 1478: 29 83 std Y+1, r18 ; 0x01 + 147a: 3a 83 std Y+2, r19 ; 0x02 + 147c: 4b 83 std Y+3, r20 ; 0x03 + 147e: 5c 83 std Y+4, r21 ; 0x04 uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; - 1382: 38 2f mov r19, r24 + 1480: 38 2f mov r19, r24 uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - 1384: b7 01 movw r22, r14 - 1386: 68 1b sub r22, r24 - 1388: 71 09 sbc r23, r1 - 138a: 06 17 cp r16, r22 - 138c: 17 07 cpc r17, r23 - 138e: 08 f0 brcs .+2 ; 0x1392 - 1390: 4a c1 rjmp .+660 ; 0x1626 - 1392: b8 01 movw r22, r16 - 1394: ea 85 ldd r30, Y+10 ; 0x0a - 1396: fb 85 ldd r31, Y+11 ; 0x0b + 1482: a6 01 movw r20, r12 + 1484: 48 1b sub r20, r24 + 1486: 51 09 sbc r21, r1 + 1488: e4 16 cp r14, r20 + 148a: f5 06 cpc r15, r21 + 148c: 08 f4 brcc .+2 ; 0x1490 + 148e: a7 01 movw r20, r14 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1398: a0 92 66 06 sts 0x0666, r10 + 1490: 50 92 66 06 sts 0x0666, r5 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 139c: 90 92 a0 09 sts 0x09A0, r9 + 1494: 40 92 a0 09 sts 0x09A0, r4 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 13a0: 20 91 a1 09 lds r18, 0x09A1 - 13a4: 26 ff sbrs r18, 6 - 13a6: fc cf rjmp .-8 ; 0x13a0 + 1498: 20 91 a1 09 lds r18, 0x09A1 + 149c: 26 ff sbrs r18, 6 + 149e: fc cf rjmp .-8 ; 0x1498 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 13a8: d0 92 a1 09 sts 0x09A1, r13 + 14a0: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 13ac: 20 91 a0 09 lds r18, 0x09A0 + 14a4: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 13b0: 10 92 a0 09 sts 0x09A0, r1 + 14a8: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 13b4: 20 91 a1 09 lds r18, 0x09A1 - 13b8: 26 ff sbrs r18, 6 - 13ba: fc cf rjmp .-8 ; 0x13b4 + 14ac: 20 91 a1 09 lds r18, 0x09A1 + 14b0: 26 ff sbrs r18, 6 + 14b2: fc cf rjmp .-8 ; 0x14ac MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 13bc: d0 92 a1 09 sts 0x09A1, r13 + 14b4: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 13c0: 20 91 a0 09 lds r18, 0x09A0 + 14b8: 20 91 a0 09 lds r18, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 13c4: c0 92 65 06 sts 0x0665, r12 + 14bc: 70 92 65 06 sts 0x0665, r7 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashMemoryToBuffer(uint16_t PageAddress) { while(FlashIsBusy()); - 13c8: 27 ff sbrs r18, 7 - 13ca: e6 cf rjmp .-52 ; 0x1398 - 13cc: ea 87 std Y+10, r30 ; 0x0a - 13ce: fb 87 std Y+11, r31 ; 0x0b + 14c0: 27 ff sbrs r18, 7 + 14c2: e6 cf rjmp .-52 ; 0x1490 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 13d0: a0 92 66 06 sts 0x0666, r10 + 14c4: 50 92 66 06 sts 0x0666, r5 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 13d4: 30 92 a0 09 sts 0x09A0, r3 - 13d8: ea 85 ldd r30, Y+10 ; 0x0a - 13da: fb 85 ldd r31, Y+11 ; 0x0b + 14c8: 20 92 a0 09 sts 0x09A0, r2 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 13dc: 20 91 a1 09 lds r18, 0x09A1 - 13e0: 26 ff sbrs r18, 6 - 13e2: fc cf rjmp .-8 ; 0x13dc - 13e4: ea 87 std Y+10, r30 ; 0x0a - 13e6: fb 87 std Y+11, r31 ; 0x0b + 14cc: 20 91 a1 09 lds r18, 0x09A1 + 14d0: 26 ff sbrs r18, 6 + 14d2: fc cf rjmp .-8 ; 0x14cc MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 13e8: d0 92 a1 09 sts 0x09A1, r13 + 14d4: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 13ec: 20 91 a0 09 lds r18, 0x09A0 + 14d8: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 13f0: 40 93 a0 09 sts 0x09A0, r20 - 13f4: ea 85 ldd r30, Y+10 ; 0x0a - 13f6: fb 85 ldd r31, Y+11 ; 0x0b + 14dc: 6a 81 ldd r22, Y+2 ; 0x02 + 14de: 60 93 a0 09 sts 0x09A0, r22 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 13f8: 20 91 a1 09 lds r18, 0x09A1 - 13fc: 26 ff sbrs r18, 6 - 13fe: fc cf rjmp .-8 ; 0x13f8 - 1400: ea 87 std Y+10, r30 ; 0x0a - 1402: fb 87 std Y+11, r31 ; 0x0b + 14e2: 20 91 a1 09 lds r18, 0x09A1 + 14e6: 26 ff sbrs r18, 6 + 14e8: fc cf rjmp .-8 ; 0x14e2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1404: d0 92 a1 09 sts 0x09A1, r13 + 14ea: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1408: 20 91 a0 09 lds r18, 0x09A0 - while(FlashIsBusy()); - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - SPITransferByte(FLASH_CMD_MEM_TO_BUF1); - SPITransferByte( (PageAddress >> 8) & 0xFF ); - SPITransferByte( (PageAddress >> 0) & 0xFF ); - 140c: 54 2d mov r21, r4 + 14ee: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 140e: 40 92 a0 09 sts 0x09A0, r4 - 1412: ea 85 ldd r30, Y+10 ; 0x0a - 1414: fb 85 ldd r31, Y+11 ; 0x0b + 14f2: e9 81 ldd r30, Y+1 ; 0x01 + 14f4: e0 93 a0 09 sts 0x09A0, r30 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1416: 20 91 a1 09 lds r18, 0x09A1 - 141a: 26 ff sbrs r18, 6 - 141c: fc cf rjmp .-8 ; 0x1416 - 141e: ea 87 std Y+10, r30 ; 0x0a - 1420: fb 87 std Y+11, r31 ; 0x0b + 14f8: 20 91 a1 09 lds r18, 0x09A1 + 14fc: 26 ff sbrs r18, 6 + 14fe: fc cf rjmp .-8 ; 0x14f8 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1422: d0 92 a1 09 sts 0x09A1, r13 + 1500: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1426: 20 91 a0 09 lds r18, 0x09A0 + 1504: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 142a: 10 92 a0 09 sts 0x09A0, r1 - 142e: ea 85 ldd r30, Y+10 ; 0x0a - 1430: fb 85 ldd r31, Y+11 ; 0x0b + 1508: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1432: 20 91 a1 09 lds r18, 0x09A1 - 1436: 26 ff sbrs r18, 6 - 1438: fc cf rjmp .-8 ; 0x1432 - 143a: ea 87 std Y+10, r30 ; 0x0a - 143c: fb 87 std Y+11, r31 ; 0x0b + 150c: 20 91 a1 09 lds r18, 0x09A1 + 1510: 26 ff sbrs r18, 6 + 1512: fc cf rjmp .-8 ; 0x150c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 143e: d0 92 a1 09 sts 0x09A1, r13 + 1514: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1442: 20 91 a0 09 lds r18, 0x09A0 + 1518: 20 91 a0 09 lds r18, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_MEM_TO_BUF1); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1446: c0 92 65 06 sts 0x0665, r12 - 144a: ea 85 ldd r30, Y+10 ; 0x0a - 144c: fb 85 ldd r31, Y+11 ; 0x0b + 151c: 70 92 65 06 sts 0x0665, r7 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 144e: c0 92 66 06 sts 0x0666, r12 + 1520: 70 92 66 06 sts 0x0666, r7 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1452: b0 92 a0 09 sts 0x09A0, r11 + 1524: 60 92 a0 09 sts 0x09A0, r6 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1456: 20 91 a1 09 lds r18, 0x09A1 - 145a: 26 ff sbrs r18, 6 - 145c: fc cf rjmp .-8 ; 0x1456 + 1528: 20 91 a1 09 lds r18, 0x09A1 + 152c: 26 ff sbrs r18, 6 + 152e: fc cf rjmp .-8 ; 0x1528 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 145e: d0 92 a1 09 sts 0x09A1, r13 + 1530: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1462: 20 91 a0 09 lds r18, 0x09A0 + 1534: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1466: 10 92 a0 09 sts 0x09A0, r1 + 1538: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 146a: 20 91 a1 09 lds r18, 0x09A1 - 146e: 26 ff sbrs r18, 6 - 1470: fc cf rjmp .-8 ; 0x146a + 153c: 20 91 a1 09 lds r18, 0x09A1 + 1540: 26 ff sbrs r18, 6 + 1542: fc cf rjmp .-8 ; 0x153c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1472: d0 92 a1 09 sts 0x09A1, r13 + 1544: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1476: 20 91 a0 09 lds r18, 0x09A0 + 1548: 20 91 a0 09 lds r18, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 147a: c0 92 65 06 sts 0x0665, r12 + 154c: 70 92 65 06 sts 0x0665, r7 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWriteBuffer(const void* Buffer, uint8_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - 147e: 27 ff sbrs r18, 7 - 1480: e6 cf rjmp .-52 ; 0x144e - 1482: ea 87 std Y+10, r30 ; 0x0a - 1484: fb 87 std Y+11, r31 ; 0x0b + 1550: 27 ff sbrs r18, 7 + 1552: e6 cf rjmp .-52 ; 0x1520 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1486: a0 92 66 06 sts 0x0666, r10 + 1554: 50 92 66 06 sts 0x0666, r5 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 148a: 80 92 a0 09 sts 0x09A0, r8 - 148e: ea 85 ldd r30, Y+10 ; 0x0a - 1490: fb 85 ldd r31, Y+11 ; 0x0b + 1558: 00 93 a0 09 sts 0x09A0, r16 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1492: 20 91 a1 09 lds r18, 0x09A1 - 1496: 26 ff sbrs r18, 6 - 1498: fc cf rjmp .-8 ; 0x1492 - 149a: ea 87 std Y+10, r30 ; 0x0a - 149c: fb 87 std Y+11, r31 ; 0x0b + 155c: 20 91 a1 09 lds r18, 0x09A1 + 1560: 26 ff sbrs r18, 6 + 1562: fc cf rjmp .-8 ; 0x155c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 149e: d0 92 a1 09 sts 0x09A1, r13 + 1564: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 14a2: 20 91 a0 09 lds r18, 0x09A0 + 1568: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 14a6: 10 92 a0 09 sts 0x09A0, r1 - 14aa: ea 85 ldd r30, Y+10 ; 0x0a - 14ac: fb 85 ldd r31, Y+11 ; 0x0b + 156c: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 14ae: 20 91 a1 09 lds r18, 0x09A1 - 14b2: 26 ff sbrs r18, 6 - 14b4: fc cf rjmp .-8 ; 0x14ae - 14b6: ea 87 std Y+10, r30 ; 0x0a - 14b8: fb 87 std Y+11, r31 ; 0x0b + 1570: 20 91 a1 09 lds r18, 0x09A1 + 1574: 26 ff sbrs r18, 6 + 1576: fc cf rjmp .-8 ; 0x1570 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 14ba: d0 92 a1 09 sts 0x09A1, r13 + 1578: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 14be: 20 91 a0 09 lds r18, 0x09A0 + 157c: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 14c2: 10 92 a0 09 sts 0x09A0, r1 - 14c6: ea 85 ldd r30, Y+10 ; 0x0a - 14c8: fb 85 ldd r31, Y+11 ; 0x0b + 1580: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 14ca: 20 91 a1 09 lds r18, 0x09A1 - 14ce: 26 ff sbrs r18, 6 - 14d0: fc cf rjmp .-8 ; 0x14ca - 14d2: ea 87 std Y+10, r30 ; 0x0a - 14d4: fb 87 std Y+11, r31 ; 0x0b + 1584: 20 91 a1 09 lds r18, 0x09A1 + 1588: 26 ff sbrs r18, 6 + 158a: fc cf rjmp .-8 ; 0x1584 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 14d6: d0 92 a1 09 sts 0x09A1, r13 + 158c: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 14da: 20 91 a0 09 lds r18, 0x09A0 + 1590: 20 91 a0 09 lds r18, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 14de: 30 93 a0 09 sts 0x09A0, r19 - 14e2: ea 85 ldd r30, Y+10 ; 0x0a - 14e4: fb 85 ldd r31, Y+11 ; 0x0b + 1594: 30 93 a0 09 sts 0x09A0, r19 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 14e6: 20 91 a1 09 lds r18, 0x09A1 - 14ea: 26 ff sbrs r18, 6 - 14ec: fc cf rjmp .-8 ; 0x14e6 - 14ee: ea 87 std Y+10, r30 ; 0x0a - 14f0: fb 87 std Y+11, r31 ; 0x0b + 1598: 20 91 a1 09 lds r18, 0x09A1 + 159c: 26 ff sbrs r18, 6 + 159e: fc cf rjmp .-8 ; 0x1598 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 14f2: d0 92 a1 09 sts 0x09A1, r13 + 15a0: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 14f6: 20 91 a0 09 lds r18, 0x09A0 - - LEDTrigger(LED_MEMORY_CHANGED, LED_OFF); - LEDTrigger(LED_MEMORY_STORED, LED_PULSE); -} - -bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 14fa: 2a 85 ldd r18, Y+10 ; 0x0a - 14fc: 3b 85 ldd r19, Y+11 ; 0x0b + 15a4: 20 91 a0 09 lds r18, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - 14fe: 61 15 cp r22, r1 - 1500: 71 05 cpc r23, r1 - 1502: 91 f0 breq .+36 ; 0x1528 - - LEDTrigger(LED_MEMORY_CHANGED, LED_OFF); - LEDTrigger(LED_MEMORY_STORED, LED_PULSE); -} - -bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 1504: 26 0f add r18, r22 - 1506: 37 1f adc r19, r23 - 1508: ea 85 ldd r30, Y+10 ; 0x0a - 150a: fb 85 ldd r31, Y+11 ; 0x0b -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - - while(ByteCount-- > 0) { + 15a8: 41 15 cp r20, r1 + 15aa: 51 05 cpc r21, r1 + 15ac: 09 f4 brne .+2 ; 0x15b0 + 15ae: 91 c0 rjmp .+290 ; 0x16d2 + 15b0: ea 2d mov r30, r10 + 15b2: f3 2d mov r31, r3 + 15b4: 9f 01 movw r18, r30 + 15b6: 24 0f add r18, r20 + 15b8: 35 1f adc r19, r21 MEMORY_FLASH_USART.DATA = *ByteBuffer++; - 150c: 71 90 ld r7, Z+ - 150e: 70 92 a0 09 sts 0x09A0, r7 + 15ba: 61 91 ld r22, Z+ + 15bc: 60 93 a0 09 sts 0x09A0, r22 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1512: 70 90 a1 09 lds r7, 0x09A1 - 1516: 76 fe sbrs r7, 6 - 1518: fc cf rjmp .-8 ; 0x1512 + 15c0: 60 91 a1 09 lds r22, 0x09A1 + 15c4: 66 ff sbrs r22, 6 + 15c6: fc cf rjmp .-8 ; 0x15c0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 151a: d0 92 a1 09 sts 0x09A1, r13 + 15c8: b0 92 a1 09 sts 0x09A1, r11 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - 151e: 70 90 a0 09 lds r7, 0x09A0 + 15cc: 60 91 a0 09 lds r22, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - 1522: e2 17 cp r30, r18 - 1524: f3 07 cpc r31, r19 - 1526: 91 f7 brne .-28 ; 0x150c + 15d0: e2 17 cp r30, r18 + 15d2: f3 07 cpc r31, r19 + 15d4: 91 f7 brne .-28 ; 0x15ba SPITransferByte(FLASH_CMD_BUF1_WRITE); SPITransferByte( 0 ); SPITransferByte( 0 ); SPITransferByte( Address ); SPIWriteBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1528: c0 92 65 06 sts 0x0665, r12 + 15d6: 70 92 65 06 sts 0x0665, r7 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 152c: c0 92 66 06 sts 0x0666, r12 + 15da: 70 92 66 06 sts 0x0666, r7 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1530: b0 92 a0 09 sts 0x09A0, r11 + 15de: 60 92 a0 09 sts 0x09A0, r6 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1534: e0 91 a1 09 lds r30, 0x09A1 - 1538: e6 ff sbrs r30, 6 - 153a: fc cf rjmp .-8 ; 0x1534 + 15e2: 60 91 a1 09 lds r22, 0x09A1 + 15e6: 66 ff sbrs r22, 6 + 15e8: fc cf rjmp .-8 ; 0x15e2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 153c: d0 92 a1 09 sts 0x09A1, r13 + 15ea: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1540: e0 91 a0 09 lds r30, 0x09A0 + 15ee: 60 91 a0 09 lds r22, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1544: 10 92 a0 09 sts 0x09A0, r1 + 15f2: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1548: e0 91 a1 09 lds r30, 0x09A1 - 154c: e6 ff sbrs r30, 6 - 154e: fc cf rjmp .-8 ; 0x1548 + 15f6: 60 91 a1 09 lds r22, 0x09A1 + 15fa: 66 ff sbrs r22, 6 + 15fc: fc cf rjmp .-8 ; 0x15f6 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1550: d0 92 a1 09 sts 0x09A1, r13 + 15fe: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1554: e0 91 a0 09 lds r30, 0x09A0 + 1602: 60 91 a0 09 lds r22, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1558: c0 92 65 06 sts 0x0665, r12 + 1606: 70 92 65 06 sts 0x0665, r7 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashBufferToMemory(uint16_t PageAddress) { while(FlashIsBusy()); - 155c: e7 ff sbrs r30, 7 - 155e: e6 cf rjmp .-52 ; 0x152c + 160a: 67 ff sbrs r22, 7 + 160c: e6 cf rjmp .-52 ; 0x15da MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1560: a0 92 66 06 sts 0x0666, r10 + 160e: 50 92 66 06 sts 0x0666, r5 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1564: e3 e8 ldi r30, 0x83 ; 131 - 1566: e0 93 a0 09 sts 0x09A0, r30 + 1612: 10 93 a0 09 sts 0x09A0, r17 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 156a: e0 91 a1 09 lds r30, 0x09A1 - 156e: e6 ff sbrs r30, 6 - 1570: fc cf rjmp .-8 ; 0x156a + 1616: 60 91 a1 09 lds r22, 0x09A1 + 161a: 66 ff sbrs r22, 6 + 161c: fc cf rjmp .-8 ; 0x1616 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1572: d0 92 a1 09 sts 0x09A1, r13 + 161e: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 1576: e0 91 a0 09 lds r30, 0x09A0 + 1622: 60 91 a0 09 lds r22, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 157a: 40 93 a0 09 sts 0x09A0, r20 + 1626: fa 81 ldd r31, Y+2 ; 0x02 + 1628: f0 93 a0 09 sts 0x09A0, r31 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 157e: 40 91 a1 09 lds r20, 0x09A1 - 1582: 46 ff sbrs r20, 6 - 1584: fc cf rjmp .-8 ; 0x157e + 162c: 60 91 a1 09 lds r22, 0x09A1 + 1630: 66 ff sbrs r22, 6 + 1632: fc cf rjmp .-8 ; 0x162c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1586: d0 92 a1 09 sts 0x09A1, r13 + 1634: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 158a: 40 91 a0 09 lds r20, 0x09A0 + 1638: 60 91 a0 09 lds r22, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 158e: 50 93 a0 09 sts 0x09A0, r21 + 163c: 69 81 ldd r22, Y+1 ; 0x01 + 163e: 60 93 a0 09 sts 0x09A0, r22 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1592: 40 91 a1 09 lds r20, 0x09A1 - 1596: 46 ff sbrs r20, 6 - 1598: fc cf rjmp .-8 ; 0x1592 + 1642: 60 91 a1 09 lds r22, 0x09A1 + 1646: 66 ff sbrs r22, 6 + 1648: fc cf rjmp .-8 ; 0x1642 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 159a: d0 92 a1 09 sts 0x09A1, r13 + 164a: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 159e: 40 91 a0 09 lds r20, 0x09A0 + 164e: 60 91 a0 09 lds r22, 0x09A0 static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 15a2: 10 92 a0 09 sts 0x09A0, r1 + 1652: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 15a6: 40 91 a1 09 lds r20, 0x09A1 - 15aa: 46 ff sbrs r20, 6 - 15ac: fc cf rjmp .-8 ; 0x15a6 + 1656: 60 91 a1 09 lds r22, 0x09A1 + 165a: 66 ff sbrs r22, 6 + 165c: fc cf rjmp .-8 ; 0x1656 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 15ae: d0 92 a1 09 sts 0x09A1, r13 + 165e: b0 92 a1 09 sts 0x09A1, r11 return MEMORY_FLASH_USART.DATA; - 15b2: 40 91 a0 09 lds r20, 0x09A0 + 1662: 60 91 a0 09 lds r22, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_BUF1_TO_MEM_ERASE); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 15b6: c0 92 65 06 sts 0x0665, r12 + 1666: 70 92 65 06 sts 0x0665, r7 FlashMemoryToBuffer(PageAddress); FlashWriteBuffer(Buffer, ByteAddress, PageBytes); FlashBufferToMemory(PageAddress); ByteCount -= PageBytes; - 15ba: 06 1b sub r16, r22 - 15bc: 17 0b sbc r17, r23 + 166a: e4 1a sub r14, r20 + 166c: f5 0a sbc r15, r21 Address += PageBytes; - 15be: 86 0f add r24, r22 - 15c0: 97 1f adc r25, r23 - 15c2: a1 1d adc r26, r1 - 15c4: b1 1d adc r27, r1 + 166e: 84 0f add r24, r20 + 1670: 95 1f adc r25, r21 + 1672: a1 1d adc r26, r1 + 1674: b1 1d adc r27, r1 Buffer += PageBytes; - 15c6: 2a 87 std Y+10, r18 ; 0x0a - 15c8: 3b 87 std Y+11, r19 ; 0x0b + 1676: a2 2e mov r10, r18 + 1678: 33 2e mov r3, r19 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - 15ca: 01 15 cp r16, r1 - 15cc: 11 05 cpc r17, r1 - 15ce: 09 f0 breq .+2 ; 0x15d2 - 15d0: d3 ce rjmp .-602 ; 0x1378 - 15d2: 4e 81 ldd r20, Y+6 ; 0x06 - 15d4: 5f 81 ldd r21, Y+7 ; 0x07 - 15d6: 68 85 ldd r22, Y+8 ; 0x08 - 15d8: 79 85 ldd r23, Y+9 ; 0x09 + 167a: e1 14 cp r14, r1 + 167c: f1 04 cpc r15, r1 + 167e: 09 f0 breq .+2 ; 0x1682 + 1680: f7 ce rjmp .-530 ; 0x1470 + 1682: 49 85 ldd r20, Y+9 ; 0x09 + 1684: 5a 85 ldd r21, Y+10 ; 0x0a + 1686: 6b 85 ldd r22, Y+11 ; 0x0b + 1688: 7c 85 ldd r23, Y+12 ; 0x0c /* Store into flash */ FlashWrite(Buffer, FlashAddress, ByteCount); /* Store to local memory */ uint8_t* DstPtr = &Memory[BlockAddress]; - 15da: da 01 movw r26, r20 - 15dc: ae 56 subi r26, 0x6E ; 110 - 15de: bf 4d sbci r27, 0xDF ; 223 - 15e0: 2d 81 ldd r18, Y+5 ; 0x05 - 15e2: 32 2d mov r19, r2 - - LEDTrigger(LED_MEMORY_CHANGED, LED_OFF); - LEDTrigger(LED_MEMORY_STORED, LED_PULSE); -} - -bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 15e4: 89 81 ldd r24, Y+1 ; 0x01 - 15e6: 9a 81 ldd r25, Y+2 ; 0x02 - 15e8: 8a 0f add r24, r26 - 15ea: 9b 1f adc r25, r27 - 15ec: f9 01 movw r30, r18 - /* Store to local memory */ - uint8_t* DstPtr = &Memory[BlockAddress]; + 168a: da 01 movw r26, r20 + 168c: ae 56 subi r26, 0x6E ; 110 + 168e: bf 4d sbci r27, 0xDF ; 223 + 1690: 8d 81 ldd r24, Y+5 ; 0x05 + 1692: 9e 81 ldd r25, Y+6 ; 0x06 + 1694: 8a 0f add r24, r26 + 1696: 9b 1f adc r25, r27 + 1698: f4 01 movw r30, r8 uint8_t* SrcPtr = (uint8_t*) Buffer; while(ByteCount--) { *DstPtr++ = *SrcPtr++; - 15ee: 21 91 ld r18, Z+ - 15f0: 2d 93 st X+, r18 + 169a: 21 91 ld r18, Z+ + 169c: 2d 93 st X+, r18 /* Store to local memory */ uint8_t* DstPtr = &Memory[BlockAddress]; uint8_t* SrcPtr = (uint8_t*) Buffer; while(ByteCount--) { - 15f2: a8 17 cp r26, r24 - 15f4: b9 07 cpc r27, r25 - 15f6: d9 f7 brne .-10 ; 0x15ee + 169e: a8 17 cp r26, r24 + 16a0: b9 07 cpc r27, r25 + 16a2: d9 f7 brne .-10 ; 0x169a } return true; } } - 15f8: 81 e0 ldi r24, 0x01 ; 1 - 15fa: 2b 96 adiw r28, 0x0b ; 11 - 15fc: cd bf out 0x3d, r28 ; 61 - 15fe: de bf out 0x3e, r29 ; 62 - 1600: df 91 pop r29 - 1602: cf 91 pop r28 - 1604: 1f 91 pop r17 - 1606: 0f 91 pop r16 - 1608: ff 90 pop r15 - 160a: ef 90 pop r14 - 160c: df 90 pop r13 - 160e: cf 90 pop r12 - 1610: bf 90 pop r11 - 1612: af 90 pop r10 - 1614: 9f 90 pop r9 - 1616: 8f 90 pop r8 - 1618: 7f 90 pop r7 - 161a: 6f 90 pop r6 - 161c: 5f 90 pop r5 - 161e: 4f 90 pop r4 - 1620: 3f 90 pop r3 - 1622: 2f 90 pop r2 - 1624: 08 95 ret - 1626: ea 85 ldd r30, Y+10 ; 0x0a - 1628: fb 85 ldd r31, Y+11 ; 0x0b - 162a: b6 ce rjmp .-660 ; 0x1398 + 16a4: 81 e0 ldi r24, 0x01 ; 1 + 16a6: 2c 96 adiw r28, 0x0c ; 12 + 16a8: cd bf out 0x3d, r28 ; 61 + 16aa: de bf out 0x3e, r29 ; 62 + 16ac: df 91 pop r29 + 16ae: cf 91 pop r28 + 16b0: 1f 91 pop r17 + 16b2: 0f 91 pop r16 + 16b4: ff 90 pop r15 + 16b6: ef 90 pop r14 + 16b8: df 90 pop r13 + 16ba: cf 90 pop r12 + 16bc: bf 90 pop r11 + 16be: af 90 pop r10 + 16c0: 9f 90 pop r9 + 16c2: 8f 90 pop r8 + 16c4: 7f 90 pop r7 + 16c6: 6f 90 pop r6 + 16c8: 5f 90 pop r5 + 16ca: 4f 90 pop r4 + 16cc: 3f 90 pop r3 + 16ce: 2f 90 pop r2 + 16d0: 08 95 ret + 16d2: 2a 2d mov r18, r10 + 16d4: 33 2d mov r19, r3 + 16d6: 7f cf rjmp .-258 ; 0x15d6 return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING; ByteCount = MIN(ByteCount, BytesLeft); - 162c: 09 83 std Y+1, r16 ; 0x01 - 162e: 1a 83 std Y+2, r17 ; 0x02 - 1630: 2b 83 std Y+3, r18 ; 0x03 - 1632: 3c 83 std Y+4, r19 ; 0x04 - 1634: 81 ce rjmp .-766 ; 0x1338 + 16d8: 0d 83 std Y+5, r16 ; 0x05 + 16da: 1e 83 std Y+6, r17 ; 0x06 + 16dc: 2f 83 std Y+7, r18 ; 0x07 + 16de: 38 87 std Y+8, r19 ; 0x08 + 16e0: aa ce rjmp .-684 ; 0x1436 -00001636 : +000016e2 : } } bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - 1636: cf 92 push r12 - 1638: df 92 push r13 - 163a: ef 92 push r14 - 163c: ff 92 push r15 - 163e: 0f 93 push r16 - 1640: 1f 93 push r17 - 1642: 69 01 movw r12, r18 + 16e2: cf 92 push r12 + 16e4: df 92 push r13 + 16e6: ef 92 push r14 + 16e8: ff 92 push r15 + 16ea: 0f 93 push r16 + 16ec: 1f 93 push r17 + 16ee: 69 01 movw r12, r18 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 1644: 41 15 cp r20, r1 - 1646: 24 e0 ldi r18, 0x04 ; 4 - 1648: 52 07 cpc r21, r18 - 164a: 61 05 cpc r22, r1 - 164c: 71 05 cpc r23, r1 - 164e: 40 f5 brcc .+80 ; 0x16a0 + 16f0: 41 15 cp r20, r1 + 16f2: 24 e0 ldi r18, 0x04 ; 4 + 16f4: 52 07 cpc r21, r18 + 16f6: 61 05 cpc r22, r1 + 16f8: 71 05 cpc r23, r1 + 16fa: 40 f5 brcc .+80 ; 0x174c /* There are bytes out of bounds to be read. Notify that we are done. */ return false; } else { /* Calculate bytes left in memory and issue reading */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - 1650: 00 e0 ldi r16, 0x00 ; 0 - 1652: 14 e0 ldi r17, 0x04 ; 4 - 1654: 20 e0 ldi r18, 0x00 ; 0 - 1656: 30 e0 ldi r19, 0x00 ; 0 - 1658: 04 1b sub r16, r20 - 165a: 15 0b sbc r17, r21 - 165c: 26 0b sbc r18, r22 - 165e: 37 0b sbc r19, r23 + 16fc: 00 e0 ldi r16, 0x00 ; 0 + 16fe: 14 e0 ldi r17, 0x04 ; 4 + 1700: 20 e0 ldi r18, 0x00 ; 0 + 1702: 30 e0 ldi r19, 0x00 ; 0 //uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; ByteCount = MIN(ByteCount, BytesLeft); - 1660: e1 2c mov r14, r1 - 1662: f1 2c mov r15, r1 - 1664: 0c 15 cp r16, r12 - 1666: 1d 05 cpc r17, r13 - 1668: 2e 05 cpc r18, r14 - 166a: 3f 05 cpc r19, r15 - 166c: b0 f0 brcs .+44 ; 0x169a + 1704: e1 2c mov r14, r1 + 1706: f1 2c mov r15, r1 + 1708: 04 1b sub r16, r20 + 170a: 15 0b sbc r17, r21 + 170c: 26 0b sbc r18, r22 + 170e: 37 0b sbc r19, r23 + 1710: c0 16 cp r12, r16 + 1712: d1 06 cpc r13, r17 + 1714: e2 06 cpc r14, r18 + 1716: f3 06 cpc r15, r19 + 1718: b0 f0 brcs .+44 ; 0x1746 /* Output local memory contents */ uint8_t* DstPtr = (uint8_t*) Buffer; uint8_t* SrcPtr = &Memory[BlockAddress]; - 166e: 4e 56 subi r20, 0x6E ; 110 - 1670: 5f 4d sbci r21, 0xDF ; 223 - - while(ByteCount--) { - 1672: c1 14 cp r12, r1 - 1674: d1 04 cpc r13, r1 - 1676: 49 f0 breq .+18 ; 0x168a - 1678: da 01 movw r26, r20 - return true; - } - -} - -bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 167a: c8 0e add r12, r24 - 167c: d9 1e adc r13, r25 - uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - //uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - ByteCount = MIN(ByteCount, BytesLeft); - - /* Output local memory contents */ - uint8_t* DstPtr = (uint8_t*) Buffer; - 167e: fc 01 movw r30, r24 - uint8_t* SrcPtr = &Memory[BlockAddress]; + 171a: 4e 56 subi r20, 0x6E ; 110 + 171c: 5f 4d sbci r21, 0xDF ; 223 while(ByteCount--) { + 171e: 01 15 cp r16, r1 + 1720: 11 05 cpc r17, r1 + 1722: 49 f0 breq .+18 ; 0x1736 + 1724: da 01 movw r26, r20 + 1726: fc 01 movw r30, r24 + 1728: 08 0f add r16, r24 + 172a: 19 1f adc r17, r25 *DstPtr++ = *SrcPtr++; - 1680: 8d 91 ld r24, X+ - 1682: 81 93 st Z+, r24 + 172c: 8d 91 ld r24, X+ + 172e: 81 93 st Z+, r24 /* Output local memory contents */ uint8_t* DstPtr = (uint8_t*) Buffer; uint8_t* SrcPtr = &Memory[BlockAddress]; while(ByteCount--) { - 1684: ec 15 cp r30, r12 - 1686: fd 05 cpc r31, r13 - 1688: d9 f7 brne .-10 ; 0x1680 + 1730: e0 17 cp r30, r16 + 1732: f1 07 cpc r31, r17 + 1734: d9 f7 brne .-10 ; 0x172c *DstPtr++ = *SrcPtr++; } return true; - 168a: 81 e0 ldi r24, 0x01 ; 1 + 1736: 81 e0 ldi r24, 0x01 ; 1 } } - 168c: 1f 91 pop r17 - 168e: 0f 91 pop r16 - 1690: ff 90 pop r15 - 1692: ef 90 pop r14 - 1694: df 90 pop r13 - 1696: cf 90 pop r12 - 1698: 08 95 ret + 1738: 1f 91 pop r17 + 173a: 0f 91 pop r16 + 173c: ff 90 pop r15 + 173e: ef 90 pop r14 + 1740: df 90 pop r13 + 1742: cf 90 pop r12 + 1744: 08 95 ret return false; } else { /* Calculate bytes left in memory and issue reading */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; //uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; ByteCount = MIN(ByteCount, BytesLeft); - 169a: 68 01 movw r12, r16 - 169c: 79 01 movw r14, r18 - 169e: e7 cf rjmp .-50 ; 0x166e + 1746: 97 01 movw r18, r14 + 1748: 86 01 movw r16, r12 + 174a: e7 cf rjmp .-50 ; 0x171a bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { /* There are bytes out of bounds to be read. Notify that we are done. */ return false; - 16a0: 80 e0 ldi r24, 0x00 ; 0 + 174c: 80 e0 ldi r24, 0x00 ; 0 *DstPtr++ = *SrcPtr++; } return true; } } - 16a2: 1f 91 pop r17 - 16a4: 0f 91 pop r16 - 16a6: ff 90 pop r15 - 16a8: ef 90 pop r14 - 16aa: df 90 pop r13 - 16ac: cf 90 pop r12 - 16ae: 08 95 ret + 174e: 1f 91 pop r17 + 1750: 0f 91 pop r16 + 1752: ff 90 pop r15 + 1754: ef 90 pop r14 + 1756: df 90 pop r13 + 1758: cf 90 pop r12 + 175a: 08 95 ret -000016b0 : +0000175c : [BUTTON_ACTION_STORE_MEM] = "STORE_MEM", [BUTTON_ACTION_RECALL_MEM] = "RECALL_MEM", }; static void ExecuteButtonAction(ButtonActionEnum ButtonAction) { - 16b0: ff 92 push r15 - 16b2: 0f 93 push r16 - 16b4: 1f 93 push r17 - 16b6: cf 93 push r28 - 16b8: df 93 push r29 - 16ba: cd b7 in r28, 0x3d ; 61 - 16bc: de b7 in r29, 0x3e ; 62 - 16be: a0 97 sbiw r28, 0x20 ; 32 - 16c0: cd bf out 0x3d, r28 ; 61 - 16c2: de bf out 0x3e, r29 ; 62 + 175c: ff 92 push r15 + 175e: 0f 93 push r16 + 1760: 1f 93 push r17 + 1762: cf 93 push r28 + 1764: df 93 push r29 + 1766: cd b7 in r28, 0x3d ; 61 + 1768: de b7 in r29, 0x3e ; 62 + 176a: a0 97 sbiw r28, 0x20 ; 32 + 176c: cd bf out 0x3d, r28 ; 61 + 176e: de bf out 0x3e, r29 ; 62 uint8_t UidBuffer[32]; if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { - 16c4: 81 30 cpi r24, 0x01 ; 1 - 16c6: e9 f0 breq .+58 ; 0x1702 + 1770: 81 30 cpi r24, 0x01 ; 1 + 1772: e9 f0 breq .+58 ; 0x17ae for (uint8_t i=0; i - 16cc: 55 c0 rjmp .+170 ; 0x1778 + 1774: 82 30 cpi r24, 0x02 ; 2 + 1776: 09 f4 brne .+2 ; 0x177a + 1778: 51 c0 rjmp .+162 ; 0x181c UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { - 16ce: 83 30 cpi r24, 0x03 ; 3 - 16d0: 09 f4 brne .+2 ; 0x16d4 - 16d2: 74 c0 rjmp .+232 ; 0x17bc + 177a: 83 30 cpi r24, 0x03 ; 3 + 177c: 09 f4 brne .+2 ; 0x1780 + 177e: 6c c0 rjmp .+216 ; 0x1858 UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - 16d4: 84 30 cpi r24, 0x04 ; 4 - 16d6: 79 f1 breq .+94 ; 0x1736 + 1780: 84 30 cpi r24, 0x04 ; 4 + 1782: 79 f1 breq .+94 ; 0x17e2 UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - 16d8: 85 30 cpi r24, 0x05 ; 5 - 16da: 09 f4 brne .+2 ; 0x16de - 16dc: 94 c0 rjmp .+296 ; 0x1806 + 1784: 85 30 cpi r24, 0x05 ; 5 + 1786: 09 f4 brne .+2 ; 0x178a + 1788: 8c c0 rjmp .+280 ; 0x18a2 UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { - 16de: 86 30 cpi r24, 0x06 ; 6 - 16e0: 09 f4 brne .+2 ; 0x16e4 - 16e2: b3 c0 rjmp .+358 ; 0x184a + 178a: 86 30 cpi r24, 0x06 ; 6 + 178c: 09 f4 brne .+2 ; 0x1790 + 178e: ab c0 rjmp .+342 ; 0x18e6 SettingsCycle(); } else if (ButtonAction == BUTTON_ACTION_STORE_MEM) { - 16e4: 87 30 cpi r24, 0x07 ; 7 - 16e6: 09 f4 brne .+2 ; 0x16ea - 16e8: b2 c0 rjmp .+356 ; 0x184e + 1790: 87 30 cpi r24, 0x07 ; 7 + 1792: 09 f4 brne .+2 ; 0x1796 + 1794: aa c0 rjmp .+340 ; 0x18ea MemoryStore(); } else if (ButtonAction == BUTTON_ACTION_RECALL_MEM) { - 16ea: 88 30 cpi r24, 0x08 ; 8 - 16ec: 09 f4 brne .+2 ; 0x16f0 - 16ee: 89 c0 rjmp .+274 ; 0x1802 + 1796: 88 30 cpi r24, 0x08 ; 8 + 1798: 09 f4 brne .+2 ; 0x179c + 179a: 81 c0 rjmp .+258 ; 0x189e MemoryRecall(); } } - 16f0: a0 96 adiw r28, 0x20 ; 32 - 16f2: cd bf out 0x3d, r28 ; 61 - 16f4: de bf out 0x3e, r29 ; 62 - 16f6: df 91 pop r29 - 16f8: cf 91 pop r28 - 16fa: 1f 91 pop r17 - 16fc: 0f 91 pop r16 - 16fe: ff 90 pop r15 - 1700: 08 95 ret + 179c: a0 96 adiw r28, 0x20 ; 32 + 179e: cd bf out 0x3d, r28 ; 61 + 17a0: de bf out 0x3e, r29 ; 62 + 17a2: df 91 pop r29 + 17a4: cf 91 pop r28 + 17a6: 1f 91 pop r17 + 17a8: 0f 91 pop r16 + 17aa: ff 90 pop r15 + 17ac: 08 95 ret static void ExecuteButtonAction(ButtonActionEnum ButtonAction) { uint8_t UidBuffer[32]; if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { for (uint8_t i=0; i - 170a: a3 c0 rjmp .+326 ; 0x1852 - 170c: f1 2c mov r15, r1 - 170e: 8e 01 movw r16, r28 - 1710: 0f 5f subi r16, 0xFF ; 255 - 1712: 1f 4f sbci r17, 0xFF ; 255 + 17ae: 80 91 05 29 lds r24, 0x2905 + 17b2: 88 23 and r24, r24 + 17b4: 09 f4 brne .+2 ; 0x17b8 + 17b6: 9b c0 rjmp .+310 ; 0x18ee + 17b8: f1 2c mov r15, r1 + 17ba: 8e 01 movw r16, r28 + 17bc: 0f 5f subi r16, 0xFF ; 255 + 17be: 1f 4f sbci r17, 0xFF ; 255 UidBuffer[i] = RandomGetByte(); - 1714: b1 da rcall .-2718 ; 0xc78 - 1716: f8 01 movw r30, r16 - 1718: ef 0d add r30, r15 - 171a: f1 1d adc r31, r1 - 171c: 80 83 st Z, r24 + 17c0: d9 da rcall .-2638 ; 0xd74 + 17c2: f8 01 movw r30, r16 + 17c4: ef 0d add r30, r15 + 17c6: f1 1d adc r31, r1 + 17c8: 80 83 st Z, r24 static void ExecuteButtonAction(ButtonActionEnum ButtonAction) { uint8_t UidBuffer[32]; if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { for (uint8_t i=0; i + 17ca: f3 94 inc r15 + 17cc: 80 91 05 29 lds r24, 0x2905 + 17d0: f8 16 cp r15, r24 + 17d2: b0 f3 brcs .-20 ; 0x17c0 INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); } INLINE void ApplicationSetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationSetUidFunc(Uid); - 1728: e0 91 01 29 lds r30, 0x2901 - 172c: f0 91 02 29 lds r31, 0x2902 - 1730: c8 01 movw r24, r16 - 1732: 09 95 icall - 1734: dd cf rjmp .-70 ; 0x16f0 + 17d4: e0 91 01 29 lds r30, 0x2901 + 17d8: f0 91 02 29 lds r31, 0x2902 + 17dc: c8 01 movw r24, r16 + 17de: 09 95 icall + 17e0: dd cf rjmp .-70 ; 0x179c ActiveConfiguration.ApplicationResetFunc(); //LogEntry(LOG_INFO_APP_RESET, NULL, 0); } INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); - 1736: e0 91 ff 28 lds r30, 0x28FF - 173a: f0 91 00 29 lds r31, 0x2900 - 173e: 8e 01 movw r16, r28 - 1740: 0f 5f subi r16, 0xFF ; 255 - 1742: 1f 4f sbci r17, 0xFF ; 255 - 1744: c8 01 movw r24, r16 - 1746: 09 95 icall + 17e2: e0 91 ff 28 lds r30, 0x28FF + 17e6: f0 91 00 29 lds r31, 0x2900 + 17ea: 8e 01 movw r16, r28 + 17ec: 0f 5f subi r16, 0xFF ; 255 + 17ee: 1f 4f sbci r17, 0xFF ; 255 + 17f0: c8 01 movw r24, r16 + 17f2: 09 95 icall } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1750: f8 01 movw r30, r16 - [BUTTON_ACTION_CYCLE_SETTINGS] = "CYCLE_SETTINGS", - [BUTTON_ACTION_STORE_MEM] = "STORE_MEM", - [BUTTON_ACTION_RECALL_MEM] = "RECALL_MEM", -}; - -static void ExecuteButtonAction(ButtonActionEnum ButtonAction) - 1752: ce 01 movw r24, r28 - 1754: 02 96 adiw r24, 0x02 ; 2 - 1756: 21 50 subi r18, 0x01 ; 1 - 1758: 82 0f add r24, r18 - 175a: 91 1d adc r25, r1 + 17f4: 20 91 05 29 lds r18, 0x2905 + 17f8: 22 23 and r18, r18 + 17fa: 61 f3 breq .-40 ; 0x17d4 + 17fc: f8 01 movw r30, r16 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 175c: 21 e0 ldi r18, 0x01 ; 1 + 17fe: 91 e0 ldi r25, 0x01 ; 1 uint8_t i; for (i=0; i + 1800: 99 23 and r25, r25 + 1802: 31 f0 breq .+12 ; 0x1810 if (UidBuffer[i] == 0x00) { - 1762: 30 81 ld r19, Z - 1764: 21 e0 ldi r18, 0x01 ; 1 - 1766: 31 11 cpse r19, r1 - 1768: 20 e0 ldi r18, 0x00 ; 0 + 1804: 80 81 ld r24, Z + 1806: 91 e0 ldi r25, 0x01 ; 1 + 1808: 81 11 cpse r24, r1 + 180a: 90 e0 ldi r25, 0x00 ; 0 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - 176a: 31 50 subi r19, 0x01 ; 1 - 176c: 30 83 st Z, r19 - 176e: 31 96 adiw r30, 0x01 ; 1 + 180c: 81 50 subi r24, 0x01 ; 1 + 180e: 80 83 st Z, r24 + 1810: 31 96 adiw r30, 0x01 ; 1 + 1812: 8e 2f mov r24, r30 + 1814: 80 1b sub r24, r16 } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1776: d8 cf rjmp .-80 ; 0x1728 - 1778: e0 91 ff 28 lds r30, 0x28FF - 177c: f0 91 00 29 lds r31, 0x2900 - 1780: 8e 01 movw r16, r28 - 1782: 0f 5f subi r16, 0xFF ; 255 - 1784: 1f 4f sbci r17, 0xFF ; 255 - 1786: c8 01 movw r24, r16 - 1788: 09 95 icall + 1816: 82 17 cp r24, r18 + 1818: 98 f3 brcs .-26 ; 0x1800 + 181a: dc cf rjmp .-72 ; 0x17d4 + 181c: e0 91 ff 28 lds r30, 0x28FF + 1820: f0 91 00 29 lds r31, 0x2900 + 1824: 8e 01 movw r16, r28 + 1826: 0f 5f subi r16, 0xFF ; 255 + 1828: 1f 4f sbci r17, 0xFF ; 255 + 182a: c8 01 movw r24, r16 + 182c: 09 95 icall } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1792: f8 01 movw r30, r16 - [BUTTON_ACTION_CYCLE_SETTINGS] = "CYCLE_SETTINGS", - [BUTTON_ACTION_STORE_MEM] = "STORE_MEM", - [BUTTON_ACTION_RECALL_MEM] = "RECALL_MEM", -}; - -static void ExecuteButtonAction(ButtonActionEnum ButtonAction) - 1794: ce 01 movw r24, r28 - 1796: 02 96 adiw r24, 0x02 ; 2 - 1798: 21 50 subi r18, 0x01 ; 1 - 179a: 82 0f add r24, r18 - 179c: 91 1d adc r25, r1 + 182e: 20 91 05 29 lds r18, 0x2905 + 1832: 22 23 and r18, r18 + 1834: 79 f2 breq .-98 ; 0x17d4 + 1836: f8 01 movw r30, r16 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 179e: 21 e0 ldi r18, 0x01 ; 1 + 1838: 91 e0 ldi r25, 0x01 ; 1 uint8_t i; for (i=0; i + 183a: 99 23 and r25, r25 + 183c: 39 f0 breq .+14 ; 0x184c if (UidBuffer[i] == 0xFF) { - 17a4: 30 81 ld r19, Z - 17a6: 21 e0 ldi r18, 0x01 ; 1 - 17a8: 3f 3f cpi r19, 0xFF ; 255 - 17aa: 09 f0 breq .+2 ; 0x17ae - 17ac: 20 e0 ldi r18, 0x00 ; 0 + 183e: 80 81 ld r24, Z + 1840: 91 e0 ldi r25, 0x01 ; 1 + 1842: 8f 3f cpi r24, 0xFF ; 255 + 1844: 09 f0 breq .+2 ; 0x1848 + 1846: 90 e0 ldi r25, 0x00 ; 0 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 17ae: 3f 5f subi r19, 0xFF ; 255 - 17b0: 30 83 st Z, r19 - 17b2: 31 96 adiw r30, 0x01 ; 1 + 1848: 8f 5f subi r24, 0xFF ; 255 + 184a: 80 83 st Z, r24 + 184c: 31 96 adiw r30, 0x01 ; 1 + 184e: 8e 2f mov r24, r30 + 1850: 80 1b sub r24, r16 } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 17ba: b6 cf rjmp .-148 ; 0x1728 - 17bc: e0 91 ff 28 lds r30, 0x28FF - 17c0: f0 91 00 29 lds r31, 0x2900 - 17c4: 8e 01 movw r16, r28 - 17c6: 0f 5f subi r16, 0xFF ; 255 - 17c8: 1f 4f sbci r17, 0xFF ; 255 - 17ca: c8 01 movw r24, r16 - 17cc: 09 95 icall + 1852: 82 17 cp r24, r18 + 1854: 90 f3 brcs .-28 ; 0x183a + 1856: be cf rjmp .-132 ; 0x17d4 + 1858: e0 91 ff 28 lds r30, 0x28FF + 185c: f0 91 00 29 lds r31, 0x2900 + 1860: 8e 01 movw r16, r28 + 1862: 0f 5f subi r16, 0xFF ; 255 + 1864: 1f 4f sbci r17, 0xFF ; 255 + 1866: c8 01 movw r24, r16 + 1868: 09 95 icall ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; - 17ce: 20 91 05 29 lds r18, 0x2905 + 186a: 20 91 05 29 lds r18, 0x2905 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 17d2: 31 e0 ldi r19, 0x01 ; 1 + 186e: 31 e0 ldi r19, 0x01 ; 1 uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 17d4: 21 50 subi r18, 0x01 ; 1 - 17d6: 08 f4 brcc .+2 ; 0x17da - 17d8: a7 cf rjmp .-178 ; 0x1728 + 1870: 21 50 subi r18, 0x01 ; 1 + 1872: 08 f4 brcc .+2 ; 0x1876 + 1874: af cf rjmp .-162 ; 0x17d4 if (Carry) { - 17da: 33 23 and r19, r19 - 17dc: d9 f3 breq .-10 ; 0x17d4 + 1876: 33 23 and r19, r19 + 1878: d9 f3 breq .-10 ; 0x1870 if (UidBuffer[i] == 0xFF) { - 17de: 82 2f mov r24, r18 - 17e0: 90 e0 ldi r25, 0x00 ; 0 - 17e2: f8 01 movw r30, r16 - 17e4: e8 0f add r30, r24 - 17e6: f9 1f adc r31, r25 - 17e8: 40 81 ld r20, Z - 17ea: 31 e0 ldi r19, 0x01 ; 1 - 17ec: 4f 3f cpi r20, 0xFF ; 255 - 17ee: 09 f0 breq .+2 ; 0x17f2 - 17f0: 30 e0 ldi r19, 0x00 ; 0 + 187a: 82 2f mov r24, r18 + 187c: 90 e0 ldi r25, 0x00 ; 0 + 187e: f8 01 movw r30, r16 + 1880: e8 0f add r30, r24 + 1882: f9 1f adc r31, r25 + 1884: 40 81 ld r20, Z + 1886: 31 e0 ldi r19, 0x01 ; 1 + 1888: 4f 3f cpi r20, 0xFF ; 255 + 188a: 09 f0 breq .+2 ; 0x188e + 188c: 30 e0 ldi r19, 0x00 ; 0 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 17f2: f8 01 movw r30, r16 - 17f4: e8 0f add r30, r24 - 17f6: f9 1f adc r31, r25 - 17f8: 4f 5f subi r20, 0xFF ; 255 - 17fa: 40 83 st Z, r20 + 188e: f8 01 movw r30, r16 + 1890: e8 0f add r30, r24 + 1892: f9 1f adc r31, r25 + 1894: 4f 5f subi r20, 0xFF ; 255 + 1896: 40 83 st Z, r20 } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 17fc: 21 50 subi r18, 0x01 ; 1 - 17fe: 68 f7 brcc .-38 ; 0x17da - 1800: 93 cf rjmp .-218 ; 0x1728 + 1898: 21 50 subi r18, 0x01 ; 1 + 189a: 68 f7 brcc .-38 ; 0x1876 + 189c: 9b cf rjmp .-202 ; 0x17d4 } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { SettingsCycle(); } else if (ButtonAction == BUTTON_ACTION_STORE_MEM) { MemoryStore(); } else if (ButtonAction == BUTTON_ACTION_RECALL_MEM) { MemoryRecall(); - 1802: 18 db rcall .-2512 ; 0xe34 - 1804: 75 cf rjmp .-278 ; 0x16f0 - 1806: e0 91 ff 28 lds r30, 0x28FF - 180a: f0 91 00 29 lds r31, 0x2900 - 180e: 8e 01 movw r16, r28 - 1810: 0f 5f subi r16, 0xFF ; 255 - 1812: 1f 4f sbci r17, 0xFF ; 255 - 1814: c8 01 movw r24, r16 - 1816: 09 95 icall + 189e: 4f db rcall .-2402 ; 0xf3e + 18a0: 7d cf rjmp .-262 ; 0x179c + 18a2: e0 91 ff 28 lds r30, 0x28FF + 18a6: f0 91 00 29 lds r31, 0x2900 + 18aa: 8e 01 movw r16, r28 + 18ac: 0f 5f subi r16, 0xFF ; 255 + 18ae: 1f 4f sbci r17, 0xFF ; 255 + 18b0: c8 01 movw r24, r16 + 18b2: 09 95 icall ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; - 1818: 20 91 05 29 lds r18, 0x2905 + 18b4: 20 91 05 29 lds r18, 0x2905 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 181c: 31 e0 ldi r19, 0x01 ; 1 + 18b8: 31 e0 ldi r19, 0x01 ; 1 uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 181e: 21 50 subi r18, 0x01 ; 1 - 1820: 08 f4 brcc .+2 ; 0x1824 - 1822: 82 cf rjmp .-252 ; 0x1728 + 18ba: 21 50 subi r18, 0x01 ; 1 + 18bc: 08 f4 brcc .+2 ; 0x18c0 + 18be: 8a cf rjmp .-236 ; 0x17d4 if (Carry) { - 1824: 33 23 and r19, r19 - 1826: d9 f3 breq .-10 ; 0x181e + 18c0: 33 23 and r19, r19 + 18c2: d9 f3 breq .-10 ; 0x18ba if (UidBuffer[i] == 0x00) { - 1828: 82 2f mov r24, r18 - 182a: 90 e0 ldi r25, 0x00 ; 0 - 182c: f8 01 movw r30, r16 - 182e: e8 0f add r30, r24 - 1830: f9 1f adc r31, r25 - 1832: 40 81 ld r20, Z - 1834: 31 e0 ldi r19, 0x01 ; 1 - 1836: 41 11 cpse r20, r1 - 1838: 30 e0 ldi r19, 0x00 ; 0 + 18c4: 82 2f mov r24, r18 + 18c6: 90 e0 ldi r25, 0x00 ; 0 + 18c8: f8 01 movw r30, r16 + 18ca: e8 0f add r30, r24 + 18cc: f9 1f adc r31, r25 + 18ce: 40 81 ld r20, Z + 18d0: 31 e0 ldi r19, 0x01 ; 1 + 18d2: 41 11 cpse r20, r1 + 18d4: 30 e0 ldi r19, 0x00 ; 0 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - 183a: f8 01 movw r30, r16 - 183c: e8 0f add r30, r24 - 183e: f9 1f adc r31, r25 - 1840: 41 50 subi r20, 0x01 ; 1 - 1842: 40 83 st Z, r20 + 18d6: f8 01 movw r30, r16 + 18d8: e8 0f add r30, r24 + 18da: f9 1f adc r31, r25 + 18dc: 41 50 subi r20, 0x01 ; 1 + 18de: 40 83 st Z, r20 } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 1844: 21 50 subi r18, 0x01 ; 1 - 1846: 70 f7 brcc .-36 ; 0x1824 - 1848: 6f cf rjmp .-290 ; 0x1728 + 18e0: 21 50 subi r18, 0x01 ; 1 + 18e2: 70 f7 brcc .-36 ; 0x18c0 + 18e4: 77 cf rjmp .-274 ; 0x17d4 } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { SettingsCycle(); - 184a: 50 d2 rcall .+1184 ; 0x1cec - 184c: 51 cf rjmp .-350 ; 0x16f0 + 18e6: 57 d2 rcall .+1198 ; 0x1d96 + 18e8: 59 cf rjmp .-334 ; 0x179c } else if (ButtonAction == BUTTON_ACTION_STORE_MEM) { MemoryStore(); - 184e: e7 db rcall .-2098 ; 0x101e - 1850: 4f cf rjmp .-354 ; 0x16f0 - 1852: 8e 01 movw r16, r28 - 1854: 0f 5f subi r16, 0xFF ; 255 - 1856: 1f 4f sbci r17, 0xFF ; 255 - 1858: 67 cf rjmp .-306 ; 0x1728 + 18ea: 1e dc rcall .-1988 ; 0x1128 + 18ec: 57 cf rjmp .-338 ; 0x179c + 18ee: 8e 01 movw r16, r28 + 18f0: 0f 5f subi r16, 0xFF ; 255 + 18f2: 1f 4f sbci r17, 0xFF ; 255 + 18f4: 6f cf rjmp .-290 ; 0x17d4 -0000185a : +000018f6 : } } void ButtonInit(void) { BUTTON_PORT.DIRCLR = BUTTON_MASK; - 185a: e0 e0 ldi r30, 0x00 ; 0 - 185c: f6 e0 ldi r31, 0x06 ; 6 - 185e: 80 e4 ldi r24, 0x40 ; 64 - 1860: 82 83 std Z+2, r24 ; 0x02 + 18f6: e0 e0 ldi r30, 0x00 ; 0 + 18f8: f6 e0 ldi r31, 0x06 ; 6 + 18fa: 80 e4 ldi r24, 0x40 ; 64 + 18fc: 82 83 std Z+2, r24 ; 0x02 BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; - 1862: 88 e1 ldi r24, 0x18 ; 24 - 1864: 86 8b std Z+22, r24 ; 0x16 - 1866: 08 95 ret + 18fe: 88 e1 ldi r24, 0x18 ; 24 + 1900: 86 8b std Z+22, r24 ; 0x16 + 1902: 08 95 ret -00001868 : +00001904 : } void ButtonTick(void) { static uint8_t PressTickCounter = 0; uint8_t ThisButtonState = ~BUTTON_PORT.IN; - 1868: 80 91 08 06 lds r24, 0x0608 + 1904: 80 91 08 06 lds r24, 0x0608 if (ThisButtonState & BUTTON_MASK) { - 186c: 86 ff sbrs r24, 6 - 186e: 08 c0 rjmp .+16 ; 0x1880 + 1908: 86 ff sbrs r24, 6 + 190a: 08 c0 rjmp .+16 ; 0x191c /* Button is still pressed, ignore */ } } else if (!(ThisButtonState & BUTTON_MASK)) { /* Button is currently not being pressed. Check if PressTickCounter contains * a recent short button press. */ if ( (PressTickCounter > 0) && (PressTickCounter <= LONG_PRESS_TICK_COUNT) ) { - 1870: 80 91 92 24 lds r24, 0x2492 - 1874: 81 50 subi r24, 0x01 ; 1 - 1876: 8a 30 cpi r24, 0x0A ; 10 - 1878: a8 f0 brcs .+42 ; 0x18a4 + 190c: 80 91 92 24 lds r24, 0x2492 + 1910: 81 50 subi r24, 0x01 ; 1 + 1912: 8a 30 cpi r24, 0x0A ; 10 + 1914: a8 f0 brcs .+42 ; 0x1940 /* We have a short button press */ ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonAction); } PressTickCounter = 0; - 187a: 10 92 92 24 sts 0x2492, r1 - 187e: 08 95 ret + 1916: 10 92 92 24 sts 0x2492, r1 + 191a: 08 95 ret static uint8_t PressTickCounter = 0; uint8_t ThisButtonState = ~BUTTON_PORT.IN; if (ThisButtonState & BUTTON_MASK) { /* Button is currently pressed */ if (PressTickCounter < LONG_PRESS_TICK_COUNT) { - 1880: 80 91 92 24 lds r24, 0x2492 - 1884: 8a 30 cpi r24, 0x0A ; 10 - 1886: 50 f0 brcs .+20 ; 0x189c + 191c: 80 91 92 24 lds r24, 0x2492 + 1920: 8a 30 cpi r24, 0x0A ; 10 + 1922: 50 f0 brcs .+20 ; 0x1938 /* Count ticks while button is being pressed */ PressTickCounter++; } else if (PressTickCounter == LONG_PRESS_TICK_COUNT) { - 1888: 8a 30 cpi r24, 0x0A ; 10 - 188a: c9 f7 brne .-14 ; 0x187e + 1924: 8a 30 cpi r24, 0x0A ; 10 + 1926: c9 f7 brne .-14 ; 0x191a /* Long button press detected execute button action and advance PressTickCounter * to an invalid state. */ ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonLongAction); - 188c: e0 91 0a 29 lds r30, 0x290A - 1890: f0 91 0b 29 lds r31, 0x290B - 1894: 81 81 ldd r24, Z+1 ; 0x01 - 1896: 0c df rcall .-488 ; 0x16b0 + 1928: e0 91 0a 29 lds r30, 0x290A + 192c: f0 91 0b 29 lds r31, 0x290B + 1930: 81 81 ldd r24, Z+1 ; 0x01 + 1932: 14 df rcall .-472 ; 0x175c PressTickCounter++; - 1898: 80 91 92 24 lds r24, 0x2492 - 189c: 8f 5f subi r24, 0xFF ; 255 - 189e: 80 93 92 24 sts 0x2492, r24 - 18a2: 08 95 ret + 1934: 80 91 92 24 lds r24, 0x2492 + 1938: 8f 5f subi r24, 0xFF ; 255 + 193a: 80 93 92 24 sts 0x2492, r24 + 193e: 08 95 ret } else if (!(ThisButtonState & BUTTON_MASK)) { /* Button is currently not being pressed. Check if PressTickCounter contains * a recent short button press. */ if ( (PressTickCounter > 0) && (PressTickCounter <= LONG_PRESS_TICK_COUNT) ) { /* We have a short button press */ ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonAction); - 18a4: e0 91 0a 29 lds r30, 0x290A - 18a8: f0 91 0b 29 lds r31, 0x290B - 18ac: 80 81 ld r24, Z - 18ae: 00 df rcall .-512 ; 0x16b0 - 18b0: e4 cf rjmp .-56 ; 0x187a + 1940: e0 91 0a 29 lds r30, 0x290A + 1944: f0 91 0b 29 lds r31, 0x290B + 1948: 80 81 ld r24, Z + 194a: 08 df rcall .-496 ; 0x175c + 194c: e4 cf rjmp .-56 ; 0x1916 -000018b2 : +0000194e : PressTickCounter = 0; } } void ButtonGetActionList(char* ListOut, uint16_t BufferSize) { - 18b2: cf 93 push r28 - 18b4: df 93 push r29 - 18b6: ec 01 movw r28, r24 + 194e: 0f 93 push r16 + 1950: 1f 93 push r17 + 1952: cf 93 push r28 + 1954: df 93 push r29 uint8_t i; /* Account for '\0' */ BufferSize--; - 18b8: 61 50 subi r22, 0x01 ; 1 - 18ba: 71 09 sbc r23, r1 - 18bc: 80 e0 ldi r24, 0x00 ; 0 - 18be: 90 e0 ldi r25, 0x00 ; 0 + 1956: 61 50 subi r22, 0x01 ; 1 + 1958: 71 09 sbc r23, r1 + 195a: 4c e5 ldi r20, 0x5C ; 92 + 195c: 54 e0 ldi r21, 0x04 ; 4 BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { /* No comma on last configuration */ *ListOut++ = ','; - 18c0: 3c e2 ldi r19, 0x2C ; 44 + 195e: 1c e2 ldi r17, 0x2C ; 44 /* Account for '\0' */ BufferSize--; for (i=0; i sizeof(ButtonActionTable[i]) ) { - 18d8: 24 91 lpm r18, Z - 18da: 22 23 and r18, r18 - 18dc: 81 f0 breq .+32 ; 0x18fe - 18de: 61 32 cpi r22, 0x21 ; 33 - 18e0: 71 05 cpc r23, r1 - 18e2: 68 f0 brcs .+26 ; 0x18fe - 18e4: de 01 movw r26, r28 - 18e6: 03 c0 rjmp .+6 ; 0x18ee - 18e8: 60 32 cpi r22, 0x20 ; 32 - 18ea: 71 05 cpc r23, r1 - 18ec: 41 f0 breq .+16 ; 0x18fe + 1962: fa 01 movw r30, r20 + 1964: 04 91 lpm r16, Z + 1966: 00 23 and r16, r16 + 1968: 49 f1 breq .+82 ; 0x19bc + 196a: 61 32 cpi r22, 0x21 ; 33 + 196c: 71 05 cpc r23, r1 + 196e: 20 f4 brcc .+8 ; 0x1978 + 1970: 25 c0 rjmp .+74 ; 0x19bc + 1972: 60 32 cpi r22, 0x20 ; 32 + 1974: 71 05 cpc r23, r1 + 1976: 61 f0 breq .+24 ; 0x1990 + 1978: dc 01 movw r26, r24 + 197a: 01 96 adiw r24, 0x01 ; 1 + 197c: ec 01 movw r28, r24 /* While not end-of-string and enough buffer to * put a complete configuration name */ *ListOut++ = c; - 18ee: 2d 93 st X+, r18 - 18f0: ed 01 movw r28, r26 + 197e: 0c 93 st X, r16 ActionName++; - 18f2: 31 96 adiw r30, 0x01 ; 1 + 1980: 2f 5f subi r18, 0xFF ; 255 + 1982: 3f 4f sbci r19, 0xFF ; 255 BufferSize--; - 18f4: 61 50 subi r22, 0x01 ; 1 - 18f6: 71 09 sbc r23, r1 + 1984: 61 50 subi r22, 0x01 ; 1 + 1986: 71 09 sbc r23, r1 for (i=0; i sizeof(ButtonActionTable[i]) ) { - 18f8: 24 91 lpm r18, Z - 18fa: 21 11 cpse r18, r1 - 18fc: f5 cf rjmp .-22 ; 0x18e8 + 1988: f9 01 movw r30, r18 + 198a: 04 91 lpm r16, Z + 198c: 01 11 cpse r16, r1 + 198e: f1 cf rjmp .-30 ; 0x1972 *ListOut++ = c; ActionName++; BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { - 18fe: 88 30 cpi r24, 0x08 ; 8 - 1900: 91 05 cpc r25, r1 - 1902: 21 f4 brne .+8 ; 0x190c + 1990: f5 e0 ldi r31, 0x05 ; 5 + 1992: 4c 35 cpi r20, 0x5C ; 92 + 1994: 5f 07 cpc r21, r31 + 1996: 61 f0 breq .+24 ; 0x19b0 + /* No comma on last configuration */ *ListOut++ = ','; + 1998: ce 01 movw r24, r28 + 199a: 01 96 adiw r24, 0x01 ; 1 + 199c: 18 83 st Y, r17 + BufferSize--; + 199e: 61 50 subi r22, 0x01 ; 1 + 19a0: 71 09 sbc r23, r1 + 19a2: 40 5e subi r20, 0xE0 ; 224 + 19a4: 5f 4f sbci r21, 0xFF ; 255 + uint8_t i; + + /* Account for '\0' */ + BufferSize--; + + for (i=0; i + BufferSize--; + } + + if ( i < (BUTTON_ACTION_COUNT - 1) ) { + /* No comma on last configuration */ + *ListOut++ = ','; + 19ae: ec 01 movw r28, r24 BufferSize--; } } *ListOut = '\0'; - 1904: 18 82 st Y, r1 + 19b0: 18 82 st Y, r1 } - 1906: df 91 pop r29 - 1908: cf 91 pop r28 - 190a: 08 95 ret - BufferSize--; - } + 19b2: df 91 pop r29 + 19b4: cf 91 pop r28 + 19b6: 1f 91 pop r17 + 19b8: 0f 91 pop r16 + 19ba: 08 95 ret - if ( i < (BUTTON_ACTION_COUNT - 1) ) { - /* No comma on last configuration */ - *ListOut++ = ','; - 190c: 39 93 st Y+, r19 - BufferSize--; - 190e: 61 50 subi r22, 0x01 ; 1 - 1910: 71 09 sbc r23, r1 - 1912: 01 96 adiw r24, 0x01 ; 1 - 1914: d6 cf rjmp .-84 ; 0x18c2 + for (i=0; i: + while( (c = pgm_read_byte(ActionName)) != '\0' && BufferSize > sizeof(ButtonActionTable[i]) ) { + 19bc: ec 01 movw r28, r24 + 19be: e8 cf rjmp .-48 ; 0x1990 + +000019c0 : *ListOut = '\0'; } void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action) { - 1916: 88 23 and r24, r24 - 1918: 19 f0 breq .+6 ; 0x1920 - 191a: 81 30 cpi r24, 0x01 ; 1 - 191c: 91 f0 breq .+36 ; 0x1942 - 191e: 08 95 ret + 19c0: 88 23 and r24, r24 + 19c2: 19 f0 breq .+6 ; 0x19ca + 19c4: 81 30 cpi r24, 0x01 ; 1 + 19c6: 91 f0 breq .+36 ; 0x19ec + 19c8: 08 95 ret } #else /* Write button action to all settings when using global settings */ for (uint8_t i=0; i: +00001a0e : } #endif } void ButtonGetActionByName(ButtonTypeEnum Type, char* ActionOut, uint16_t BufferSize) { - 1964: fb 01 movw r30, r22 + 1a0e: fb 01 movw r30, r22 if (Type == BUTTON_PRESS_SHORT) { - 1966: 88 23 and r24, r24 - 1968: 21 f0 breq .+8 ; 0x1972 + 1a10: 88 23 and r24, r24 + 1a12: 21 f0 breq .+8 ; 0x1a1c strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonAction], BufferSize); } else if (Type == BUTTON_PRESS_LONG) { - 196a: 81 30 cpi r24, 0x01 ; 1 - 196c: 81 f0 breq .+32 ; 0x198e + 1a14: 81 30 cpi r24, 0x01 ; 1 + 1a16: 81 f0 breq .+32 ; 0x1a38 strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonLongAction], BufferSize); } else { /* Should not happen (TM) */ *ActionOut = '\0'; - 196e: 10 82 st Z, r1 - 1970: 08 95 ret + 1a18: 10 82 st Z, r1 + 1a1a: 08 95 ret } void ButtonGetActionByName(ButtonTypeEnum Type, char* ActionOut, uint16_t BufferSize) { if (Type == BUTTON_PRESS_SHORT) { strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonAction], BufferSize); - 1972: a0 91 0a 29 lds r26, 0x290A - 1976: b0 91 0b 29 lds r27, 0x290B - 197a: 6c 91 ld r22, X + 1a1c: a0 91 0a 29 lds r26, 0x290A + 1a20: b0 91 0b 29 lds r27, 0x290B + 1a24: 6c 91 ld r22, X } else if (Type == BUTTON_PRESS_LONG) { strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonLongAction], BufferSize); - 197c: 80 e2 ldi r24, 0x20 ; 32 - 197e: 68 9f mul r22, r24 - 1980: b0 01 movw r22, r0 - 1982: 11 24 eor r1, r1 - 1984: 6a 59 subi r22, 0x9A ; 154 - 1986: 7c 4f sbci r23, 0xFC ; 252 - 1988: cf 01 movw r24, r30 - 198a: 0c 94 ee 2d jmp 0x5bdc ; 0x5bdc - 198e: a0 91 0a 29 lds r26, 0x290A - 1992: b0 91 0b 29 lds r27, 0x290B - 1996: 11 96 adiw r26, 0x01 ; 1 - 1998: 6c 91 ld r22, X - 199a: f0 cf rjmp .-32 ; 0x197c + 1a26: 80 e2 ldi r24, 0x20 ; 32 + 1a28: 68 9f mul r22, r24 + 1a2a: b0 01 movw r22, r0 + 1a2c: 11 24 eor r1, r1 + 1a2e: 64 5a subi r22, 0xA4 ; 164 + 1a30: 7b 4f sbci r23, 0xFB ; 251 + 1a32: cf 01 movw r24, r30 + 1a34: 0c 94 18 2c jmp 0x5830 ; 0x5830 + 1a38: a0 91 0a 29 lds r26, 0x290A + 1a3c: b0 91 0b 29 lds r27, 0x290B + 1a40: 11 96 adiw r26, 0x01 ; 1 + 1a42: 6c 91 ld r22, X + 1a44: f0 cf rjmp .-32 ; 0x1a26 -0000199c : +00001a46 : *ActionOut = '\0'; } } bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action) { - 199c: 1f 93 push r17 - 199e: cf 93 push r28 - 19a0: df 93 push r29 - 19a2: 18 2f mov r17, r24 - 19a4: eb 01 movw r28, r22 + 1a46: 1f 93 push r17 + 1a48: cf 93 push r28 + 1a4a: df 93 push r29 + 1a4c: 18 2f mov r17, r24 + 1a4e: eb 01 movw r28, r22 uint8_t i; for (i=0; i - 19b0: 89 2b or r24, r25 - 19b2: f1 f1 breq .+124 ; 0x1a30 - 19b4: 66 e8 ldi r22, 0x86 ; 134 - 19b6: 73 e0 ldi r23, 0x03 ; 3 - 19b8: ce 01 movw r24, r28 - 19ba: 0e 94 d5 2d call 0x5baa ; 0x5baa - 19be: 89 2b or r24, r25 - 19c0: 09 f4 brne .+2 ; 0x19c4 - 19c2: 3e c0 rjmp .+124 ; 0x1a40 - 19c4: 66 ea ldi r22, 0xA6 ; 166 - 19c6: 73 e0 ldi r23, 0x03 ; 3 - 19c8: ce 01 movw r24, r28 - 19ca: 0e 94 d5 2d call 0x5baa ; 0x5baa - 19ce: 89 2b or r24, r25 - 19d0: c9 f1 breq .+114 ; 0x1a44 - 19d2: 66 ec ldi r22, 0xC6 ; 198 - 19d4: 73 e0 ldi r23, 0x03 ; 3 - 19d6: ce 01 movw r24, r28 - 19d8: 0e 94 d5 2d call 0x5baa ; 0x5baa - 19dc: 89 2b or r24, r25 - 19de: a1 f1 breq .+104 ; 0x1a48 - 19e0: 66 ee ldi r22, 0xE6 ; 230 - 19e2: 73 e0 ldi r23, 0x03 ; 3 - 19e4: ce 01 movw r24, r28 - 19e6: 0e 94 d5 2d call 0x5baa ; 0x5baa - 19ea: 89 2b or r24, r25 - 19ec: 79 f1 breq .+94 ; 0x1a4c - 19ee: 66 e0 ldi r22, 0x06 ; 6 - 19f0: 74 e0 ldi r23, 0x04 ; 4 - 19f2: ce 01 movw r24, r28 - 19f4: 0e 94 d5 2d call 0x5baa ; 0x5baa - 19f8: 89 2b or r24, r25 - 19fa: 51 f1 breq .+84 ; 0x1a50 - 19fc: 66 e2 ldi r22, 0x26 ; 38 - 19fe: 74 e0 ldi r23, 0x04 ; 4 - 1a00: ce 01 movw r24, r28 - 1a02: 0e 94 d5 2d call 0x5baa ; 0x5baa - 1a06: 89 2b or r24, r25 - 1a08: 29 f1 breq .+74 ; 0x1a54 - 1a0a: 66 e4 ldi r22, 0x46 ; 70 - 1a0c: 74 e0 ldi r23, 0x04 ; 4 - 1a0e: ce 01 movw r24, r28 - 1a10: 0e 94 d5 2d call 0x5baa ; 0x5baa - 1a14: 89 2b or r24, r25 - 1a16: 01 f1 breq .+64 ; 0x1a58 - 1a18: 66 e6 ldi r22, 0x66 ; 102 - 1a1a: 74 e0 ldi r23, 0x04 ; 4 - 1a1c: ce 01 movw r24, r28 - 1a1e: 0e 94 d5 2d call 0x5baa ; 0x5baa - 1a22: 89 2b or r24, r25 - 1a24: d9 f0 breq .+54 ; 0x1a5c + 1a50: 6c e5 ldi r22, 0x5C ; 92 + 1a52: 74 e0 ldi r23, 0x04 ; 4 + 1a54: ce 01 movw r24, r28 + 1a56: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1a5a: 89 2b or r24, r25 + 1a5c: f1 f1 breq .+124 ; 0x1ada + 1a5e: 6c e7 ldi r22, 0x7C ; 124 + 1a60: 74 e0 ldi r23, 0x04 ; 4 + 1a62: ce 01 movw r24, r28 + 1a64: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1a68: 89 2b or r24, r25 + 1a6a: 09 f4 brne .+2 ; 0x1a6e + 1a6c: 3e c0 rjmp .+124 ; 0x1aea + 1a6e: 6c e9 ldi r22, 0x9C ; 156 + 1a70: 74 e0 ldi r23, 0x04 ; 4 + 1a72: ce 01 movw r24, r28 + 1a74: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1a78: 89 2b or r24, r25 + 1a7a: c9 f1 breq .+114 ; 0x1aee + 1a7c: 6c eb ldi r22, 0xBC ; 188 + 1a7e: 74 e0 ldi r23, 0x04 ; 4 + 1a80: ce 01 movw r24, r28 + 1a82: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1a86: 89 2b or r24, r25 + 1a88: a1 f1 breq .+104 ; 0x1af2 + 1a8a: 6c ed ldi r22, 0xDC ; 220 + 1a8c: 74 e0 ldi r23, 0x04 ; 4 + 1a8e: ce 01 movw r24, r28 + 1a90: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1a94: 89 2b or r24, r25 + 1a96: 79 f1 breq .+94 ; 0x1af6 + 1a98: 6c ef ldi r22, 0xFC ; 252 + 1a9a: 74 e0 ldi r23, 0x04 ; 4 + 1a9c: ce 01 movw r24, r28 + 1a9e: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1aa2: 89 2b or r24, r25 + 1aa4: 51 f1 breq .+84 ; 0x1afa + 1aa6: 6c e1 ldi r22, 0x1C ; 28 + 1aa8: 75 e0 ldi r23, 0x05 ; 5 + 1aaa: ce 01 movw r24, r28 + 1aac: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1ab0: 89 2b or r24, r25 + 1ab2: 29 f1 breq .+74 ; 0x1afe + 1ab4: 6c e3 ldi r22, 0x3C ; 60 + 1ab6: 75 e0 ldi r23, 0x05 ; 5 + 1ab8: ce 01 movw r24, r28 + 1aba: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1abe: 89 2b or r24, r25 + 1ac0: 01 f1 breq .+64 ; 0x1b02 + 1ac2: 6c e5 ldi r22, 0x5C ; 92 + 1ac4: 75 e0 ldi r23, 0x05 ; 5 + 1ac6: ce 01 movw r24, r28 + 1ac8: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1acc: 89 2b or r24, r25 + 1ace: d9 f0 breq .+54 ; 0x1b06 return true; } } /* Button action not found */ return false; - 1a26: 80 e0 ldi r24, 0x00 ; 0 + 1ad0: 80 e0 ldi r24, 0x00 ; 0 } - 1a28: df 91 pop r29 - 1a2a: cf 91 pop r28 - 1a2c: 1f 91 pop r17 - 1a2e: 08 95 ret + 1ad2: df 91 pop r29 + 1ad4: cf 91 pop r28 + 1ad6: 1f 91 pop r17 + 1ad8: 08 95 ret bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action) { uint8_t i; for (i=0; i + 1adc: 81 2f mov r24, r17 + 1ade: 70 df rcall .-288 ; 0x19c0 return true; - 1a36: 81 e0 ldi r24, 0x01 ; 1 + 1ae0: 81 e0 ldi r24, 0x01 ; 1 } } /* Button action not found */ return false; } - 1a38: df 91 pop r29 - 1a3a: cf 91 pop r28 - 1a3c: 1f 91 pop r17 - 1a3e: 08 95 ret + 1ae2: df 91 pop r29 + 1ae4: cf 91 pop r28 + 1ae6: 1f 91 pop r17 + 1ae8: 08 95 ret bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action) { uint8_t i; for (i=0; i - 1a44: 62 e0 ldi r22, 0x02 ; 2 - 1a46: f5 cf rjmp .-22 ; 0x1a32 - 1a48: 63 e0 ldi r22, 0x03 ; 3 - 1a4a: f3 cf rjmp .-26 ; 0x1a32 - 1a4c: 64 e0 ldi r22, 0x04 ; 4 - 1a4e: f1 cf rjmp .-30 ; 0x1a32 - 1a50: 65 e0 ldi r22, 0x05 ; 5 - 1a52: ef cf rjmp .-34 ; 0x1a32 - 1a54: 66 e0 ldi r22, 0x06 ; 6 - 1a56: ed cf rjmp .-38 ; 0x1a32 - 1a58: 67 e0 ldi r22, 0x07 ; 7 - 1a5a: eb cf rjmp .-42 ; 0x1a32 - if (strcmp_P(Action, ButtonActionTable[i]) == 0) { - 1a5c: 68 e0 ldi r22, 0x08 ; 8 - 1a5e: e9 cf rjmp .-46 ; 0x1a32 + 1aea: 61 e0 ldi r22, 0x01 ; 1 + 1aec: f7 cf rjmp .-18 ; 0x1adc + 1aee: 62 e0 ldi r22, 0x02 ; 2 + 1af0: f5 cf rjmp .-22 ; 0x1adc + 1af2: 63 e0 ldi r22, 0x03 ; 3 + 1af4: f3 cf rjmp .-26 ; 0x1adc + 1af6: 64 e0 ldi r22, 0x04 ; 4 + 1af8: f1 cf rjmp .-30 ; 0x1adc + 1afa: 65 e0 ldi r22, 0x05 ; 5 + 1afc: ef cf rjmp .-34 ; 0x1adc + 1afe: 66 e0 ldi r22, 0x06 ; 6 + 1b00: ed cf rjmp .-38 ; 0x1adc + 1b02: 67 e0 ldi r22, 0x07 ; 7 + 1b04: eb cf rjmp .-42 ; 0x1adc + 1b06: 68 e0 ldi r22, 0x08 ; 8 + 1b08: e9 cf rjmp .-46 ; 0x1adc -00001a60 : +00001b0a : [LOG_MODE_MEMORY] = "MEMORY", [LOG_MODE_TERMINAL] = "TERMINAL" }; static void LogFuncOff(LogEntryEnum Entry, void* Data, uint8_t Length) { - 1a60: 08 95 ret + 1b0a: 08 95 ret -00001a62 : +00001b0c : LogSetModeById(LOG_MODE_OFF); } } static void LogFuncTerminal(LogEntryEnum Entry, void* Data, uint8_t Length) { - 1a62: 1f 93 push r17 - 1a64: cf 93 push r28 - 1a66: df 93 push r29 - 1a68: eb 01 movw r28, r22 - 1a6a: 14 2f mov r17, r20 + 1b0c: 1f 93 push r17 + 1b0e: cf 93 push r28 + 1b10: df 93 push r29 + 1b12: eb 01 movw r28, r22 + 1b14: 14 2f mov r17, r20 void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } - 1a6c: 68 2f mov r22, r24 - 1a6e: 80 e0 ldi r24, 0x00 ; 0 - 1a70: 90 e2 ldi r25, 0x20 ; 32 - 1a72: 0e 94 bf 2b call 0x577e ; 0x577e - 1a76: 61 2f mov r22, r17 - 1a78: 80 e0 ldi r24, 0x00 ; 0 - 1a7a: 90 e2 ldi r25, 0x20 ; 32 - 1a7c: 0e 94 bf 2b call 0x577e ; 0x577e + 1b16: 68 2f mov r22, r24 + 1b18: 81 e0 ldi r24, 0x01 ; 1 + 1b1a: 90 e2 ldi r25, 0x20 ; 32 + 1b1c: 0e 94 f5 29 call 0x53ea ; 0x53ea + 1b20: 61 2f mov r22, r17 + 1b22: 81 e0 ldi r24, 0x01 ; 1 + 1b24: 90 e2 ldi r25, 0x20 ; 32 + 1b26: 0e 94 f5 29 call 0x53ea ; 0x53ea TerminalSendByte((uint8_t) Entry); TerminalSendByte((uint8_t) Length); TerminalSendBlock(Data, Length); - 1a80: 61 2f mov r22, r17 - 1a82: 70 e0 ldi r23, 0x00 ; 0 - 1a84: ce 01 movw r24, r28 + 1b2a: 61 2f mov r22, r17 + 1b2c: 70 e0 ldi r23, 0x00 ; 0 + 1b2e: ce 01 movw r24, r28 } - 1a86: df 91 pop r29 - 1a88: cf 91 pop r28 - 1a8a: 1f 91 pop r17 + 1b30: df 91 pop r29 + 1b32: cf 91 pop r28 + 1b34: 1f 91 pop r17 static void LogFuncTerminal(LogEntryEnum Entry, void* Data, uint8_t Length) { TerminalSendByte((uint8_t) Entry); TerminalSendByte((uint8_t) Length); TerminalSendBlock(Data, Length); - 1a8c: 8e c3 rjmp .+1820 ; 0x21aa + 1b36: 82 c3 rjmp .+1796 ; 0x223c -00001a8e : +00001b38 : LogMemClear(); LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); } void LogTick(void) { - 1a8e: 08 95 ret + 1b38: 08 95 ret -00001a90 : +00001b3a : } void LogTask(void) { - 1a90: 08 95 ret + 1b3a: 08 95 ret -00001a92 : +00001b3c : } bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { if (BlockAddress < sizeof(LogMem)) { - 1a92: 41 15 cp r20, r1 - 1a94: e4 e0 ldi r30, 0x04 ; 4 - 1a96: 5e 07 cpc r21, r30 - 1a98: 61 05 cpc r22, r1 - 1a9a: 71 05 cpc r23, r1 - 1a9c: 80 f4 brcc .+32 ; 0x1abe + 1b3c: 41 15 cp r20, r1 + 1b3e: e4 e0 ldi r30, 0x04 ; 4 + 1b40: 5e 07 cpc r21, r30 + 1b42: 61 05 cpc r22, r1 + 1b44: 71 05 cpc r23, r1 + 1b46: 80 f4 brcc .+32 ; 0x1b68 uint8_t* DataPtr = (uint8_t*) Buffer; uint8_t* MemPtr = &LogMem[BlockAddress]; - 1a9e: 4d 56 subi r20, 0x6D ; 109 - 1aa0: 5b 4d sbci r21, 0xDB ; 219 - - while(ByteCount-- > 0) { - 1aa2: 21 15 cp r18, r1 - 1aa4: 31 05 cpc r19, r1 - 1aa6: 49 f0 breq .+18 ; 0x1aba - 1aa8: da 01 movw r26, r20 -void LogTask(void) -{ - -} - -bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 1aaa: 28 0f add r18, r24 - 1aac: 39 1f adc r19, r25 -{ - if (BlockAddress < sizeof(LogMem)) { - uint8_t* DataPtr = (uint8_t*) Buffer; - 1aae: fc 01 movw r30, r24 - uint8_t* MemPtr = &LogMem[BlockAddress]; + 1b48: 49 56 subi r20, 0x69 ; 105 + 1b4a: 5b 4d sbci r21, 0xDB ; 219 while(ByteCount-- > 0) { + 1b4c: 21 15 cp r18, r1 + 1b4e: 31 05 cpc r19, r1 + 1b50: 49 f0 breq .+18 ; 0x1b64 + 1b52: da 01 movw r26, r20 + 1b54: fc 01 movw r30, r24 + 1b56: 28 0f add r18, r24 + 1b58: 39 1f adc r19, r25 *DataPtr++ = *MemPtr++; - 1ab0: 8d 91 ld r24, X+ - 1ab2: 81 93 st Z+, r24 + 1b5a: 8d 91 ld r24, X+ + 1b5c: 81 93 st Z+, r24 { if (BlockAddress < sizeof(LogMem)) { uint8_t* DataPtr = (uint8_t*) Buffer; uint8_t* MemPtr = &LogMem[BlockAddress]; while(ByteCount-- > 0) { - 1ab4: e2 17 cp r30, r18 - 1ab6: f3 07 cpc r31, r19 - 1ab8: d9 f7 brne .-10 ; 0x1ab0 + 1b5e: e2 17 cp r30, r18 + 1b60: f3 07 cpc r31, r19 + 1b62: d9 f7 brne .-10 ; 0x1b5a *DataPtr++ = *MemPtr++; } return true; - 1aba: 81 e0 ldi r24, 0x01 ; 1 - 1abc: 08 95 ret + 1b64: 81 e0 ldi r24, 0x01 ; 1 + 1b66: 08 95 ret } else { return false; - 1abe: 80 e0 ldi r24, 0x00 ; 0 + 1b68: 80 e0 ldi r24, 0x00 ; 0 } } - 1ac0: 08 95 ret + 1b6a: 08 95 ret -00001ac2 : +00001b6c : void LogMemClear(void) { - 1ac2: e3 e9 ldi r30, 0x93 ; 147 - 1ac4: f4 e2 ldi r31, 0x24 ; 36 - uint16_t i; + 1b6c: 40 e0 ldi r20, 0x00 ; 0 + 1b6e: 54 e0 ldi r21, 0x04 ; 4 + 1b70: 6f ef ldi r22, 0xFF ; 255 + 1b72: 7f ef ldi r23, 0xFF ; 255 + 1b74: 87 e9 ldi r24, 0x97 ; 151 + 1b76: 94 e2 ldi r25, 0x24 ; 36 + 1b78: 0e 94 30 2c call 0x5860 ; 0x5860 for (i=0; i - LogMem[i] = (uint8_t) LOG_EMPTY; } LogMemPtr = LogMem; - 1ad2: 83 e9 ldi r24, 0x93 ; 147 - 1ad4: 94 e2 ldi r25, 0x24 ; 36 - 1ad6: 80 93 93 28 sts 0x2893, r24 - 1ada: 90 93 94 28 sts 0x2894, r25 + 1b7c: 87 e9 ldi r24, 0x97 ; 151 + 1b7e: 94 e2 ldi r25, 0x24 ; 36 + 1b80: 80 93 95 24 sts 0x2495, r24 + 1b84: 90 93 96 24 sts 0x2496, r25 LogMemLeft = sizeof(LogMem); - 1ade: 80 e0 ldi r24, 0x00 ; 0 - 1ae0: 94 e0 ldi r25, 0x04 ; 4 - 1ae2: 80 93 95 28 sts 0x2895, r24 - 1ae6: 90 93 96 28 sts 0x2896, r25 - 1aea: 08 95 ret + 1b88: 80 e0 ldi r24, 0x00 ; 0 + 1b8a: 94 e0 ldi r25, 0x04 ; 4 + 1b8c: 80 93 93 24 sts 0x2493, r24 + 1b90: 90 93 94 24 sts 0x2494, r25 + 1b94: 08 95 ret -00001aec : +00001b96 : } uint16_t LogMemFree(void) { return LogMemLeft; } - 1aec: 80 91 95 28 lds r24, 0x2895 - 1af0: 90 91 96 28 lds r25, 0x2896 - 1af4: 08 95 ret + 1b96: 80 91 93 24 lds r24, 0x2493 + 1b9a: 90 91 94 24 lds r25, 0x2494 + 1b9e: 08 95 ret -00001af6 : +00001ba0 : void LogSetModeById(LogModeEnum Mode) { GlobalSettings.ActiveSettingPtr->LogMode = Mode; - 1af6: e0 91 0a 29 lds r30, 0x290A - 1afa: f0 91 0b 29 lds r31, 0x290B - 1afe: 82 83 std Z+2, r24 ; 0x02 + 1ba0: e0 91 0a 29 lds r30, 0x290A + 1ba4: f0 91 0b 29 lds r31, 0x290B + 1ba8: 82 83 std Z+2, r24 ; 0x02 switch(Mode) { - 1b00: 81 30 cpi r24, 0x01 ; 1 - 1b02: 91 f0 breq .+36 ; 0x1b28 - 1b04: 38 f4 brcc .+14 ; 0x1b14 - case LOG_MODE_OFF: - LogFunc = LogFuncOff; - 1b06: 80 e3 ldi r24, 0x30 ; 48 - 1b08: 9d e0 ldi r25, 0x0D ; 13 - 1b0a: 80 93 07 29 sts 0x2907, r24 - 1b0e: 90 93 08 29 sts 0x2908, r25 - break; - 1b12: 08 95 ret - -void LogSetModeById(LogModeEnum Mode) -{ - GlobalSettings.ActiveSettingPtr->LogMode = Mode; - - switch(Mode) { - 1b14: 82 30 cpi r24, 0x02 ; 2 - 1b16: 09 f0 breq .+2 ; 0x1b1a - 1b18: 08 95 ret + 1baa: 81 30 cpi r24, 0x01 ; 1 + 1bac: 91 f0 breq .+36 ; 0x1bd2 + 1bae: 50 f0 brcs .+20 ; 0x1bc4 + 1bb0: 82 30 cpi r24, 0x02 ; 2 + 1bb2: 39 f4 brne .+14 ; 0x1bc2 case LOG_MODE_MEMORY: LogFunc = LogFuncMemory; break; case LOG_MODE_TERMINAL: LogFunc = LogFuncTerminal; - 1b1a: 81 e3 ldi r24, 0x31 ; 49 - 1b1c: 9d e0 ldi r25, 0x0D ; 13 - 1b1e: 80 93 07 29 sts 0x2907, r24 - 1b22: 90 93 08 29 sts 0x2908, r25 - 1b26: 08 95 ret + 1bb4: 86 e8 ldi r24, 0x86 ; 134 + 1bb6: 9d e0 ldi r25, 0x0D ; 13 + 1bb8: 80 93 07 29 sts 0x2907, r24 + 1bbc: 90 93 08 29 sts 0x2908, r25 + 1bc0: 08 95 ret + 1bc2: 08 95 ret +{ + GlobalSettings.ActiveSettingPtr->LogMode = Mode; + + switch(Mode) { case LOG_MODE_OFF: LogFunc = LogFuncOff; + 1bc4: 85 e8 ldi r24, 0x85 ; 133 + 1bc6: 9d e0 ldi r25, 0x0D ; 13 + 1bc8: 80 93 07 29 sts 0x2907, r24 + 1bcc: 90 93 08 29 sts 0x2908, r25 break; + 1bd0: 08 95 ret case LOG_MODE_MEMORY: LogFunc = LogFuncMemory; - 1b28: 8b e9 ldi r24, 0x9B ; 155 - 1b2a: 9d e0 ldi r25, 0x0D ; 13 - 1b2c: 80 93 07 29 sts 0x2907, r24 - 1b30: 90 93 08 29 sts 0x2908, r25 + 1bd2: 87 ef ldi r24, 0xF7 ; 247 + 1bd4: 9d e0 ldi r25, 0x0D ; 13 + 1bd6: 80 93 07 29 sts 0x2907, r24 + 1bda: 90 93 08 29 sts 0x2908, r25 break; - 1b34: 08 95 ret + 1bde: 08 95 ret -00001b36 : - /* Do nothing */ -} - -static void LogFuncMemory(LogEntryEnum Entry, void* Data, uint8_t Length) -{ - if (LogMemLeft >= (Length + 2)) { - 1b36: 20 91 95 28 lds r18, 0x2895 - 1b3a: 30 91 96 28 lds r19, 0x2896 - 1b3e: e4 2f mov r30, r20 - 1b40: f0 e0 ldi r31, 0x00 ; 0 - 1b42: df 01 movw r26, r30 - 1b44: 12 96 adiw r26, 0x02 ; 2 - 1b46: 2a 17 cp r18, r26 - 1b48: 3b 07 cpc r19, r27 - 1b4a: 50 f1 brcs .+84 ; 0x1ba0 - LogMemLeft -= Length + 2; - 1b4c: 22 50 subi r18, 0x02 ; 2 - 1b4e: 31 09 sbc r19, r1 - 1b50: 2e 1b sub r18, r30 - 1b52: 3f 0b sbc r19, r31 - 1b54: 20 93 95 28 sts 0x2895, r18 - 1b58: 30 93 96 28 sts 0x2896, r19 - - uint8_t* DataPtr = (uint8_t*) Data; - - *LogMemPtr++ = (uint8_t) Entry; - 1b5c: e0 91 93 28 lds r30, 0x2893 - 1b60: f0 91 94 28 lds r31, 0x2894 - 1b64: 80 83 st Z, r24 - *LogMemPtr++ = (uint8_t) Length; - 1b66: 41 83 std Z+1, r20 ; 0x01 - 1b68: 9f 01 movw r18, r30 - 1b6a: 2e 5f subi r18, 0xFE ; 254 - 1b6c: 3f 4f sbci r19, 0xFF ; 255 - 1b6e: 20 93 93 28 sts 0x2893, r18 - 1b72: 30 93 94 28 sts 0x2894, r19 - - while(Length--) { - 1b76: 84 2f mov r24, r20 - 1b78: 81 50 subi r24, 0x01 ; 1 - 1b7a: 44 23 and r20, r20 - 1b7c: 81 f0 breq .+32 ; 0x1b9e - 1b7e: fb 01 movw r30, r22 - 1b80: d9 01 movw r26, r18 - 1b82: 98 2f mov r25, r24 - *LogMemPtr++ = *DataPtr++; - 1b84: 41 91 ld r20, Z+ - 1b86: 4d 93 st X+, r20 - uint8_t* DataPtr = (uint8_t*) Data; - - *LogMemPtr++ = (uint8_t) Entry; - *LogMemPtr++ = (uint8_t) Length; - - while(Length--) { - 1b88: 91 50 subi r25, 0x01 ; 1 - 1b8a: e0 f7 brcc .-8 ; 0x1b84 -static void LogFuncOff(LogEntryEnum Entry, void* Data, uint8_t Length) -{ - /* Do nothing */ -} - -static void LogFuncMemory(LogEntryEnum Entry, void* Data, uint8_t Length) - 1b8c: 90 e0 ldi r25, 0x00 ; 0 - 1b8e: 01 96 adiw r24, 0x01 ; 1 - 1b90: 82 0f add r24, r18 - 1b92: 93 1f adc r25, r19 - 1b94: 80 93 93 28 sts 0x2893, r24 - 1b98: 90 93 94 28 sts 0x2894, r25 - 1b9c: 08 95 ret - 1b9e: 08 95 ret - while(Length--) { - *LogMemPtr++ = *DataPtr++; - } - } else { - /* If memory full. Deactivate logmode */ - LogSetModeById(LOG_MODE_OFF); - 1ba0: 80 e0 ldi r24, 0x00 ; 0 - 1ba2: a9 cf rjmp .-174 ; 0x1af6 - -00001ba4 : +00001be0 : TerminalSendBlock(Data, Length); } void LogInit(void) { LogMemClear(); - 1ba4: 8e df rcall .-228 ; 0x1ac2 + 1be0: c5 df rcall .-118 ; 0x1b6c LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); - 1ba6: e0 91 0a 29 lds r30, 0x290A - 1baa: f0 91 0b 29 lds r31, 0x290B - 1bae: 82 81 ldd r24, Z+2 ; 0x02 - 1bb0: a2 cf rjmp .-188 ; 0x1af6 + 1be2: e0 91 0a 29 lds r30, 0x290A + 1be6: f0 91 0b 29 lds r31, 0x290B + 1bea: 82 81 ldd r24, Z+2 ; 0x02 + 1bec: d9 cf rjmp .-78 ; 0x1ba0 -00001bb2 : +00001bee : + /* Do nothing */ +} + +static void LogFuncMemory(LogEntryEnum Entry, void* Data, uint8_t Length) +{ + if (LogMemLeft >= (Length + 2)) { + 1bee: 20 91 93 24 lds r18, 0x2493 + 1bf2: 30 91 94 24 lds r19, 0x2494 + 1bf6: e4 2f mov r30, r20 + 1bf8: f0 e0 ldi r31, 0x00 ; 0 + 1bfa: df 01 movw r26, r30 + 1bfc: 12 96 adiw r26, 0x02 ; 2 + 1bfe: 2a 17 cp r18, r26 + 1c00: 3b 07 cpc r19, r27 + 1c02: 50 f1 brcs .+84 ; 0x1c58 + LogMemLeft -= Length + 2; + 1c04: 22 50 subi r18, 0x02 ; 2 + 1c06: 31 09 sbc r19, r1 + 1c08: 2e 1b sub r18, r30 + 1c0a: 3f 0b sbc r19, r31 + 1c0c: 20 93 93 24 sts 0x2493, r18 + 1c10: 30 93 94 24 sts 0x2494, r19 + + uint8_t* DataPtr = (uint8_t*) Data; + + *LogMemPtr++ = (uint8_t) Entry; + 1c14: e0 91 95 24 lds r30, 0x2495 + 1c18: f0 91 96 24 lds r31, 0x2496 + 1c1c: 80 83 st Z, r24 + *LogMemPtr++ = (uint8_t) Length; + 1c1e: 9f 01 movw r18, r30 + 1c20: 2e 5f subi r18, 0xFE ; 254 + 1c22: 3f 4f sbci r19, 0xFF ; 255 + 1c24: 20 93 95 24 sts 0x2495, r18 + 1c28: 30 93 96 24 sts 0x2496, r19 + 1c2c: 41 83 std Z+1, r20 ; 0x01 + + while(Length--) { + 1c2e: 8f ef ldi r24, 0xFF ; 255 + 1c30: 84 0f add r24, r20 + 1c32: 44 23 and r20, r20 + 1c34: 81 f0 breq .+32 ; 0x1c56 + 1c36: fb 01 movw r30, r22 + 1c38: d9 01 movw r26, r18 + 1c3a: 98 2f mov r25, r24 + *LogMemPtr++ = *DataPtr++; + 1c3c: 41 91 ld r20, Z+ + 1c3e: 4d 93 st X+, r20 + uint8_t* DataPtr = (uint8_t*) Data; + + *LogMemPtr++ = (uint8_t) Entry; + *LogMemPtr++ = (uint8_t) Length; + + while(Length--) { + 1c40: 91 50 subi r25, 0x01 ; 1 + 1c42: e0 f7 brcc .-8 ; 0x1c3c + 1c44: 90 e0 ldi r25, 0x00 ; 0 + 1c46: 01 96 adiw r24, 0x01 ; 1 + 1c48: 82 0f add r24, r18 + 1c4a: 93 1f adc r25, r19 + 1c4c: 80 93 95 24 sts 0x2495, r24 + 1c50: 90 93 96 24 sts 0x2496, r25 + 1c54: 08 95 ret + 1c56: 08 95 ret + *LogMemPtr++ = *DataPtr++; + } + } else { + /* If memory full. Deactivate logmode */ + LogSetModeById(LOG_MODE_OFF); + 1c58: 80 e0 ldi r24, 0x00 ; 0 + 1c5a: a2 cf rjmp .-188 ; 0x1ba0 + +00001c5c : } } bool LogSetModeByName(const char* Name) { - 1bb2: cf 93 push r28 - 1bb4: df 93 push r29 - 1bb6: ec 01 movw r28, r24 + 1c5c: cf 93 push r28 + 1c5e: df 93 push r29 + 1c60: ec 01 movw r28, r24 uint8_t i; for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { if (strcmp_P(Name, LogModeTable[i]) == 0) { - 1bb8: 66 e8 ldi r22, 0x86 ; 134 - 1bba: 74 e0 ldi r23, 0x04 ; 4 - 1bbc: 0e 94 d5 2d call 0x5baa ; 0x5baa - 1bc0: 89 2b or r24, r25 - 1bc2: 91 f0 breq .+36 ; 0x1be8 - 1bc4: 66 e9 ldi r22, 0x96 ; 150 - 1bc6: 74 e0 ldi r23, 0x04 ; 4 - 1bc8: ce 01 movw r24, r28 - 1bca: 0e 94 d5 2d call 0x5baa ; 0x5baa - 1bce: 89 2b or r24, r25 - 1bd0: 89 f0 breq .+34 ; 0x1bf4 - 1bd2: 66 ea ldi r22, 0xA6 ; 166 - 1bd4: 74 e0 ldi r23, 0x04 ; 4 - 1bd6: ce 01 movw r24, r28 - 1bd8: 0e 94 d5 2d call 0x5baa ; 0x5baa - 1bdc: 89 2b or r24, r25 - 1bde: 61 f0 breq .+24 ; 0x1bf8 + 1c62: 6e e7 ldi r22, 0x7E ; 126 + 1c64: 75 e0 ldi r23, 0x05 ; 5 + 1c66: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1c6a: 89 2b or r24, r25 + 1c6c: 91 f0 breq .+36 ; 0x1c92 + 1c6e: 6e e8 ldi r22, 0x8E ; 142 + 1c70: 75 e0 ldi r23, 0x05 ; 5 + 1c72: ce 01 movw r24, r28 + 1c74: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1c78: 89 2b or r24, r25 + 1c7a: 89 f0 breq .+34 ; 0x1c9e + 1c7c: 6e e9 ldi r22, 0x9E ; 158 + 1c7e: 75 e0 ldi r23, 0x05 ; 5 + 1c80: ce 01 movw r24, r28 + 1c82: 0e 94 ff 2b call 0x57fe ; 0x57fe + 1c86: 89 2b or r24, r25 + 1c88: 61 f0 breq .+24 ; 0x1ca2 LogSetModeById(i); return true; } } return false; - 1be0: 80 e0 ldi r24, 0x00 ; 0 + 1c8a: 80 e0 ldi r24, 0x00 ; 0 } - 1be2: df 91 pop r29 - 1be4: cf 91 pop r28 - 1be6: 08 95 ret + 1c8c: df 91 pop r29 + 1c8e: cf 91 pop r28 + 1c90: 08 95 ret bool LogSetModeByName(const char* Name) { uint8_t i; for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { - 1be8: 80 e0 ldi r24, 0x00 ; 0 + 1c92: 80 e0 ldi r24, 0x00 ; 0 if (strcmp_P(Name, LogModeTable[i]) == 0) { LogSetModeById(i); - 1bea: 85 df rcall .-246 ; 0x1af6 + 1c94: 85 df rcall .-246 ; 0x1ba0 return true; - 1bec: 81 e0 ldi r24, 0x01 ; 1 + 1c96: 81 e0 ldi r24, 0x01 ; 1 } } return false; } - 1bee: df 91 pop r29 - 1bf0: cf 91 pop r28 - 1bf2: 08 95 ret + 1c98: df 91 pop r29 + 1c9a: cf 91 pop r28 + 1c9c: 08 95 ret bool LogSetModeByName(const char* Name) { uint8_t i; for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { - 1bf4: 81 e0 ldi r24, 0x01 ; 1 - 1bf6: f9 cf rjmp .-14 ; 0x1bea - if (strcmp_P(Name, LogModeTable[i]) == 0) { - 1bf8: 82 e0 ldi r24, 0x02 ; 2 - 1bfa: f7 cf rjmp .-18 ; 0x1bea + 1c9e: 81 e0 ldi r24, 0x01 ; 1 + 1ca0: f9 cf rjmp .-14 ; 0x1c94 + 1ca2: 82 e0 ldi r24, 0x02 ; 2 + 1ca4: f7 cf rjmp .-18 ; 0x1c94 -00001bfc : +00001ca6 : return false; } void LogGetModeByName(char* Name, uint16_t BufferSize) { - 1bfc: ab 01 movw r20, r22 + 1ca6: ab 01 movw r20, r22 strncpy_P(Name, LogModeTable[GlobalSettings.ActiveSettingPtr->LogMode], BufferSize); - 1bfe: e0 91 0a 29 lds r30, 0x290A - 1c02: f0 91 0b 29 lds r31, 0x290B - 1c06: 62 81 ldd r22, Z+2 ; 0x02 - 1c08: 20 e1 ldi r18, 0x10 ; 16 - 1c0a: 62 9f mul r22, r18 - 1c0c: b0 01 movw r22, r0 - 1c0e: 11 24 eor r1, r1 - 1c10: 6a 57 subi r22, 0x7A ; 122 - 1c12: 7b 4f sbci r23, 0xFB ; 251 - 1c14: 0c 94 ee 2d jmp 0x5bdc ; 0x5bdc + 1ca8: e0 91 0a 29 lds r30, 0x290A + 1cac: f0 91 0b 29 lds r31, 0x290B + 1cb0: 62 81 ldd r22, Z+2 ; 0x02 + 1cb2: 20 e1 ldi r18, 0x10 ; 16 + 1cb4: 62 9f mul r22, r18 + 1cb6: b0 01 movw r22, r0 + 1cb8: 11 24 eor r1, r1 + 1cba: 62 58 subi r22, 0x82 ; 130 + 1cbc: 7a 4f sbci r23, 0xFA ; 250 + 1cbe: 0c 94 18 2c jmp 0x5830 ; 0x5830 -00001c18 : +00001cc2 : } void LogGetModeList(char* List, uint16_t BufferSize) { - 1c18: 0f 93 push r16 - 1c1a: 1f 93 push r17 - 1c1c: cf 93 push r28 - 1c1e: df 93 push r29 - 1c20: ec 01 movw r28, r24 - 1c22: 8b 01 movw r16, r22 + 1cc2: 0f 93 push r16 + 1cc4: 1f 93 push r17 + 1cc6: cf 93 push r28 + 1cc8: df 93 push r29 + 1cca: ec 01 movw r28, r24 + 1ccc: 8b 01 movw r16, r22 uint8_t i; *List = '\0'; - 1c24: 18 82 st Y, r1 + 1cce: 18 82 st Y, r1 for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { strncat_P(List, LogModeTable[i], BufferSize); - 1c26: ab 01 movw r20, r22 - 1c28: 66 e8 ldi r22, 0x86 ; 134 - 1c2a: 74 e0 ldi r23, 0x04 ; 4 - 1c2c: 0e 94 de 2d call 0x5bbc ; 0x5bbc + 1cd0: ab 01 movw r20, r22 + 1cd2: 6e e7 ldi r22, 0x7E ; 126 + 1cd4: 75 e0 ldi r23, 0x05 ; 5 + 1cd6: 0e 94 08 2c call 0x5810 ; 0x5810 if (i < (sizeof(LogModeTable) / sizeof(*LogModeTable) - 1)) { strncat_P(List, PSTR(","), BufferSize); - 1c30: a8 01 movw r20, r16 - 1c32: 66 eb ldi r22, 0xB6 ; 182 - 1c34: 74 e0 ldi r23, 0x04 ; 4 - 1c36: ce 01 movw r24, r28 - 1c38: 0e 94 de 2d call 0x5bbc ; 0x5bbc + 1cda: a8 01 movw r20, r16 + 1cdc: 6c e7 ldi r22, 0x7C ; 124 + 1cde: 75 e0 ldi r23, 0x05 ; 5 + 1ce0: ce 01 movw r24, r28 + 1ce2: 0e 94 08 2c call 0x5810 ; 0x5810 uint8_t i; *List = '\0'; for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { strncat_P(List, LogModeTable[i], BufferSize); - 1c3c: a8 01 movw r20, r16 - 1c3e: 66 e9 ldi r22, 0x96 ; 150 - 1c40: 74 e0 ldi r23, 0x04 ; 4 - 1c42: ce 01 movw r24, r28 - 1c44: 0e 94 de 2d call 0x5bbc ; 0x5bbc + 1ce6: a8 01 movw r20, r16 + 1ce8: 6e e8 ldi r22, 0x8E ; 142 + 1cea: 75 e0 ldi r23, 0x05 ; 5 + 1cec: ce 01 movw r24, r28 + 1cee: 0e 94 08 2c call 0x5810 ; 0x5810 if (i < (sizeof(LogModeTable) / sizeof(*LogModeTable) - 1)) { strncat_P(List, PSTR(","), BufferSize); - 1c48: a8 01 movw r20, r16 - 1c4a: 66 eb ldi r22, 0xB6 ; 182 - 1c4c: 74 e0 ldi r23, 0x04 ; 4 - 1c4e: ce 01 movw r24, r28 - 1c50: 0e 94 de 2d call 0x5bbc ; 0x5bbc + 1cf2: a8 01 movw r20, r16 + 1cf4: 6c e7 ldi r22, 0x7C ; 124 + 1cf6: 75 e0 ldi r23, 0x05 ; 5 + 1cf8: ce 01 movw r24, r28 + 1cfa: 0e 94 08 2c call 0x5810 ; 0x5810 uint8_t i; *List = '\0'; for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { strncat_P(List, LogModeTable[i], BufferSize); - 1c54: a8 01 movw r20, r16 - 1c56: 66 ea ldi r22, 0xA6 ; 166 - 1c58: 74 e0 ldi r23, 0x04 ; 4 - 1c5a: ce 01 movw r24, r28 + 1cfe: a8 01 movw r20, r16 + 1d00: 6e e9 ldi r22, 0x9E ; 158 + 1d02: 75 e0 ldi r23, 0x05 ; 5 + 1d04: ce 01 movw r24, r28 if (i < (sizeof(LogModeTable) / sizeof(*LogModeTable) - 1)) { strncat_P(List, PSTR(","), BufferSize); } } } - 1c5c: df 91 pop r29 - 1c5e: cf 91 pop r28 - 1c60: 1f 91 pop r17 - 1c62: 0f 91 pop r16 + 1d06: df 91 pop r29 + 1d08: cf 91 pop r28 + 1d0a: 1f 91 pop r17 + 1d0c: 0f 91 pop r16 uint8_t i; *List = '\0'; for (i=0; i<(sizeof(LogModeTable) / sizeof(*LogModeTable)); i++) { strncat_P(List, LogModeTable[i], BufferSize); - 1c64: 0c 94 de 2d jmp 0x5bbc ; 0x5bbc + 1d0e: 0c 94 08 2c jmp 0x5810 ; 0x5810 -00001c68 : - .LEDGreenFunction = DEFAULT_GREEN_LED_ACTION - } } -}; - -void SettingsLoad(void) { - eeprom_read_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 1c68: 43 e3 ldi r20, 0x33 ; 51 - 1c6a: 50 e0 ldi r21, 0x00 ; 0 - 1c6c: 60 e0 ldi r22, 0x00 ; 0 - 1c6e: 70 e0 ldi r23, 0x00 ; 0 - 1c70: 89 e0 ldi r24, 0x09 ; 9 - 1c72: 99 e2 ldi r25, 0x29 ; 41 - 1c74: 0c 94 00 30 jmp 0x6000 ; 0x6000 <__eerd_block_x32a4u> - -00001c78 : -} - -void SettingsSave(void) { -#if ENABLE_EEPROM_SETTINGS - eeprom_write_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 1c78: 43 e3 ldi r20, 0x33 ; 51 - 1c7a: 50 e0 ldi r21, 0x00 ; 0 - 1c7c: 60 e0 ldi r22, 0x00 ; 0 - 1c7e: 70 e0 ldi r23, 0x00 ; 0 - 1c80: 89 e0 ldi r24, 0x09 ; 9 - 1c82: 99 e2 ldi r25, 0x29 ; 41 - 1c84: 0c 94 0b 30 jmp 0x6016 ; 0x6016 <__eewr_block_x32a4u> - -00001c88 : - break; - } +00001d12 : } } -bool SettingsSetActiveById(uint8_t Setting) { - 1c88: 1f 93 push r17 - 1c8a: cf 93 push r28 - 1c8c: df 93 push r29 - 1c8e: 1f 92 push r1 - 1c90: cd b7 in r28, 0x3d ; 61 - 1c92: de b7 in r29, 0x3e ; 62 - if ( (Setting >= SETTINGS_FIRST) && (Setting <= SETTINGS_LAST) ) { - 1c94: 18 2f mov r17, r24 - 1c96: 11 50 subi r17, 0x01 ; 1 - 1c98: 18 30 cpi r17, 0x08 ; 8 - 1c9a: 30 f0 brcs .+12 ; 0x1ca8 - /* Notify LED. blink according to current setting */ - LEDTrigger(LED_SETTING_CHANGE, LED_BLINK + SettingIdx); - - return true; - } else { - return false; - 1c9c: 80 e0 ldi r24, 0x00 ; 0 - } +uint8_t SettingsGetActiveById(void) { + return INDEX_TO_SETTING(GlobalSettings.ActiveSettingIdx); } - 1c9e: 0f 90 pop r0 - 1ca0: df 91 pop r29 - 1ca2: cf 91 pop r28 - 1ca4: 1f 91 pop r17 - 1ca6: 08 95 ret + 1d12: 43 e3 ldi r20, 0x33 ; 51 + 1d14: 50 e0 ldi r21, 0x00 ; 0 + 1d16: 60 e0 ldi r22, 0x00 ; 0 + 1d18: 70 e0 ldi r23, 0x00 ; 0 + 1d1a: 89 e0 ldi r24, 0x09 ; 9 + 1d1c: 99 e2 ldi r25, 0x29 ; 41 + 1d1e: 0c 94 27 2e jmp 0x5c4e ; 0x5c4e <__eerd_block_x32a4u> -bool SettingsSetActiveById(uint8_t Setting) { - if ( (Setting >= SETTINGS_FIRST) && (Setting <= SETTINGS_LAST) ) { - uint8_t SettingIdx = SETTING_TO_INDEX(Setting); - /* Store current memory contents permanently */ - MemoryStore(); - 1ca8: 89 83 std Y+1, r24 ; 0x01 - 1caa: b9 d9 rcall .-3214 ; 0x101e +00001d22 : + 1d22: 43 e3 ldi r20, 0x33 ; 51 + 1d24: 50 e0 ldi r21, 0x00 ; 0 + 1d26: 60 e0 ldi r22, 0x00 ; 0 + 1d28: 70 e0 ldi r23, 0x00 ; 0 + 1d2a: 89 e0 ldi r24, 0x09 ; 9 + 1d2c: 99 e2 ldi r25, 0x29 ; 41 + 1d2e: 0c 94 32 2e jmp 0x5c64 ; 0x5c64 <__eewr_block_x32a4u> - GlobalSettings.ActiveSettingIdx = SettingIdx; - 1cac: 10 93 09 29 sts 0x2909, r17 - GlobalSettings.ActiveSettingPtr = - &GlobalSettings.Settings[SettingIdx]; - 1cb0: 41 2f mov r20, r17 - 1cb2: 50 e0 ldi r21, 0x00 ; 0 - 1cb4: 9a 01 movw r18, r20 - 1cb6: 22 0f add r18, r18 - 1cb8: 33 1f adc r19, r19 - 1cba: 24 0f add r18, r20 - 1cbc: 35 1f adc r19, r21 - 1cbe: 22 0f add r18, r18 - 1cc0: 33 1f adc r19, r19 - 1cc2: 24 5f subi r18, 0xF4 ; 244 - 1cc4: 36 4d sbci r19, 0xD6 ; 214 - uint8_t SettingIdx = SETTING_TO_INDEX(Setting); - /* Store current memory contents permanently */ - MemoryStore(); +00001d32 : + 1d32: 1f 93 push r17 + 1d34: cf 93 push r28 + 1d36: df 93 push r29 + 1d38: 1f 92 push r1 + 1d3a: cd b7 in r28, 0x3d ; 61 + 1d3c: de b7 in r29, 0x3e ; 62 + 1d3e: 1f ef ldi r17, 0xFF ; 255 + 1d40: 18 0f add r17, r24 + 1d42: 18 30 cpi r17, 0x08 ; 8 + 1d44: 30 f0 brcs .+12 ; 0x1d52 + 1d46: 80 e0 ldi r24, 0x00 ; 0 + 1d48: 0f 90 pop r0 + 1d4a: df 91 pop r29 + 1d4c: cf 91 pop r28 + 1d4e: 1f 91 pop r17 + 1d50: 08 95 ret + 1d52: 89 83 std Y+1, r24 ; 0x01 + 1d54: e9 d9 rcall .-3118 ; 0x1128 + 1d56: 10 93 09 29 sts 0x2909, r17 + 1d5a: 41 2f mov r20, r17 + 1d5c: 50 e0 ldi r21, 0x00 ; 0 + 1d5e: 9a 01 movw r18, r20 + 1d60: 22 0f add r18, r18 + 1d62: 33 1f adc r19, r19 + 1d64: 24 0f add r18, r20 + 1d66: 35 1f adc r19, r21 + 1d68: 22 0f add r18, r18 + 1d6a: 33 1f adc r19, r19 + 1d6c: 24 5f subi r18, 0xF4 ; 244 + 1d6e: 36 4d sbci r19, 0xD6 ; 214 + 1d70: 20 93 0a 29 sts 0x290A, r18 + 1d74: 30 93 0b 29 sts 0x290B, r19 + 1d78: 0e 94 3d 06 call 0xc7a ; 0xc7a + 1d7c: 31 df rcall .-414 ; 0x1be0 + 1d7e: df d8 rcall .-3650 ; 0xf3e + 1d80: 89 81 ldd r24, Y+1 ; 0x01 + 1d82: 6f e1 ldi r22, 0x1F ; 31 + 1d84: 68 0f add r22, r24 + 1d86: 83 e0 ldi r24, 0x03 ; 3 + 1d88: 2c d1 rcall .+600 ; 0x1fe2 + 1d8a: 81 e0 ldi r24, 0x01 ; 1 + 1d8c: 0f 90 pop r0 + 1d8e: df 91 pop r29 + 1d90: cf 91 pop r28 + 1d92: 1f 91 pop r17 + 1d94: 08 95 ret - GlobalSettings.ActiveSettingIdx = SettingIdx; - GlobalSettings.ActiveSettingPtr = - 1cc6: 20 93 0a 29 sts 0x290A, r18 - 1cca: 30 93 0b 29 sts 0x290B, r19 - &GlobalSettings.Settings[SettingIdx]; - - /* Settings have changed. Progress changes through system */ - ConfigurationInit(); - 1cce: 0e 94 c5 05 call 0xb8a ; 0xb8a - LogInit(); - 1cd2: 68 df rcall .-304 ; 0x1ba4 - - /* Recall new memory contents */ - MemoryRecall(); - 1cd4: af d8 rcall .-3746 ; 0xe34 - - /* Notify LED. blink according to current setting */ - LEDTrigger(LED_SETTING_CHANGE, LED_BLINK + SettingIdx); - 1cd6: 89 81 ldd r24, Y+1 ; 0x01 - 1cd8: 68 2f mov r22, r24 - 1cda: 61 5e subi r22, 0xE1 ; 225 - 1cdc: 83 e0 ldi r24, 0x03 ; 3 - 1cde: 3f d1 rcall .+638 ; 0x1f5e - - return true; - 1ce0: 81 e0 ldi r24, 0x01 ; 1 - } else { - return false; - } -} - 1ce2: 0f 90 pop r0 - 1ce4: df 91 pop r29 - 1ce6: cf 91 pop r28 - 1ce8: 1f 91 pop r17 - 1cea: 08 95 ret - -00001cec : - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; - 1cec: 20 91 09 29 lds r18, 0x2909 - 1cf0: 30 e0 ldi r19, 0x00 ; 0 - 1cf2: 2f 5f subi r18, 0xFF ; 255 - 1cf4: 3f 4f sbci r19, 0xFF ; 255 - 1cf6: 27 70 andi r18, 0x07 ; 7 - 1cf8: 33 27 eor r19, r19 - 1cfa: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { - 1cfc: 2f 5f subi r18, 0xFF ; 255 - 1cfe: 3f 4f sbci r19, 0xFF ; 255 - 1d00: f9 01 movw r30, r18 - 1d02: ee 0f add r30, r30 - 1d04: ff 1f adc r31, r31 - 1d06: e2 0f add r30, r18 - 1d08: f3 1f adc r31, r19 - 1d0a: ee 0f add r30, r30 - 1d0c: ff 1f adc r31, r31 - 1d0e: e7 5f subi r30, 0xF7 ; 247 - 1d10: f6 4d sbci r31, 0xD6 ; 214 - 1d12: 90 81 ld r25, Z - 1d14: 91 11 cpse r25, r1 - 1d16: 78 c0 rjmp .+240 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; - 1d18: 27 70 andi r18, 0x07 ; 7 - 1d1a: 33 27 eor r19, r19 - 1d1c: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { - 1d1e: 2f 5f subi r18, 0xFF ; 255 - 1d20: 3f 4f sbci r19, 0xFF ; 255 - 1d22: f9 01 movw r30, r18 - 1d24: ee 0f add r30, r30 - 1d26: ff 1f adc r31, r31 - 1d28: e2 0f add r30, r18 - 1d2a: f3 1f adc r31, r19 - 1d2c: ee 0f add r30, r30 - 1d2e: ff 1f adc r31, r31 - 1d30: e7 5f subi r30, 0xF7 ; 247 - 1d32: f6 4d sbci r31, 0xD6 ; 214 - 1d34: 90 81 ld r25, Z - 1d36: 91 11 cpse r25, r1 - 1d38: 67 c0 rjmp .+206 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; - 1d3a: 27 70 andi r18, 0x07 ; 7 - 1d3c: 33 27 eor r19, r19 - 1d3e: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { - 1d40: 2f 5f subi r18, 0xFF ; 255 - 1d42: 3f 4f sbci r19, 0xFF ; 255 - 1d44: f9 01 movw r30, r18 - 1d46: ee 0f add r30, r30 - 1d48: ff 1f adc r31, r31 - 1d4a: e2 0f add r30, r18 - 1d4c: f3 1f adc r31, r19 - 1d4e: ee 0f add r30, r30 - 1d50: ff 1f adc r31, r31 - 1d52: e7 5f subi r30, 0xF7 ; 247 - 1d54: f6 4d sbci r31, 0xD6 ; 214 - 1d56: 90 81 ld r25, Z - 1d58: 91 11 cpse r25, r1 - 1d5a: 56 c0 rjmp .+172 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; - 1d5c: 27 70 andi r18, 0x07 ; 7 - 1d5e: 33 27 eor r19, r19 - 1d60: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { - 1d62: 2f 5f subi r18, 0xFF ; 255 - 1d64: 3f 4f sbci r19, 0xFF ; 255 - 1d66: f9 01 movw r30, r18 - 1d68: ee 0f add r30, r30 - 1d6a: ff 1f adc r31, r31 - 1d6c: e2 0f add r30, r18 - 1d6e: f3 1f adc r31, r19 - 1d70: ee 0f add r30, r30 - 1d72: ff 1f adc r31, r31 - 1d74: e7 5f subi r30, 0xF7 ; 247 - 1d76: f6 4d sbci r31, 0xD6 ; 214 - 1d78: 90 81 ld r25, Z - 1d7a: 91 11 cpse r25, r1 - 1d7c: 45 c0 rjmp .+138 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; - 1d7e: 27 70 andi r18, 0x07 ; 7 - 1d80: 33 27 eor r19, r19 - 1d82: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { - 1d84: 2f 5f subi r18, 0xFF ; 255 - 1d86: 3f 4f sbci r19, 0xFF ; 255 - 1d88: f9 01 movw r30, r18 - 1d8a: ee 0f add r30, r30 - 1d8c: ff 1f adc r31, r31 - 1d8e: e2 0f add r30, r18 - 1d90: f3 1f adc r31, r19 - 1d92: ee 0f add r30, r30 - 1d94: ff 1f adc r31, r31 - 1d96: e7 5f subi r30, 0xF7 ; 247 - 1d98: f6 4d sbci r31, 0xD6 ; 214 - 1d9a: 90 81 ld r25, Z - 1d9c: 91 11 cpse r25, r1 - 1d9e: 34 c0 rjmp .+104 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; +00001d96 : + 1d96: 20 91 09 29 lds r18, 0x2909 + 1d9a: 30 e0 ldi r19, 0x00 ; 0 + 1d9c: 2f 5f subi r18, 0xFF ; 255 + 1d9e: 3f 4f sbci r19, 0xFF ; 255 1da0: 27 70 andi r18, 0x07 ; 7 1da2: 33 27 eor r19, r19 1da4: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { 1da6: 2f 5f subi r18, 0xFF ; 255 1da8: 3f 4f sbci r19, 0xFF ; 255 1daa: f9 01 movw r30, r18 @@ -5597,18 +5351,10 @@ bool SettingsSetActiveById(uint8_t Setting) { 1dba: f6 4d sbci r31, 0xD6 ; 214 1dbc: 90 81 ld r25, Z 1dbe: 91 11 cpse r25, r1 - 1dc0: 23 c0 rjmp .+70 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; + 1dc0: 78 c0 rjmp .+240 ; 0x1eb2 1dc2: 27 70 andi r18, 0x07 ; 7 1dc4: 33 27 eor r19, r19 1dc6: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { 1dc8: 2f 5f subi r18, 0xFF ; 255 1dca: 3f 4f sbci r19, 0xFF ; 255 1dcc: f9 01 movw r30, r18 @@ -5622,18 +5368,10 @@ bool SettingsSetActiveById(uint8_t Setting) { 1ddc: f6 4d sbci r31, 0xD6 ; 214 1dde: 90 81 ld r25, Z 1de0: 91 11 cpse r25, r1 - 1de2: 12 c0 rjmp .+36 ; 0x1e08 - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; + 1de2: 67 c0 rjmp .+206 ; 0x1eb2 1de4: 27 70 andi r18, 0x07 ; 7 1de6: 33 27 eor r19, r19 1de8: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { 1dea: 2f 5f subi r18, 0xFF ; 255 1dec: 3f 4f sbci r19, 0xFF ; 255 1dee: f9 01 movw r30, r18 @@ -5647,11064 +5385,10929 @@ bool SettingsSetActiveById(uint8_t Setting) { 1dfe: f6 4d sbci r31, 0xD6 ; 214 1e00: 90 81 ld r25, Z 1e02: 91 11 cpse r25, r1 - 1e04: 01 c0 rjmp .+2 ; 0x1e08 - 1e06: 08 95 ret - SettingsSetActiveById(INDEX_TO_SETTING(SettingIdx)); - 1e08: 8f 5f subi r24, 0xFF ; 255 - 1e0a: 3e cf rjmp .-388 ; 0x1c88 + 1e04: 56 c0 rjmp .+172 ; 0x1eb2 + 1e06: 27 70 andi r18, 0x07 ; 7 + 1e08: 33 27 eor r19, r19 + 1e0a: 82 2f mov r24, r18 + 1e0c: 2f 5f subi r18, 0xFF ; 255 + 1e0e: 3f 4f sbci r19, 0xFF ; 255 + 1e10: f9 01 movw r30, r18 + 1e12: ee 0f add r30, r30 + 1e14: ff 1f adc r31, r31 + 1e16: e2 0f add r30, r18 + 1e18: f3 1f adc r31, r19 + 1e1a: ee 0f add r30, r30 + 1e1c: ff 1f adc r31, r31 + 1e1e: e7 5f subi r30, 0xF7 ; 247 + 1e20: f6 4d sbci r31, 0xD6 ; 214 + 1e22: 90 81 ld r25, Z + 1e24: 91 11 cpse r25, r1 + 1e26: 45 c0 rjmp .+138 ; 0x1eb2 + 1e28: 27 70 andi r18, 0x07 ; 7 + 1e2a: 33 27 eor r19, r19 + 1e2c: 82 2f mov r24, r18 + 1e2e: 2f 5f subi r18, 0xFF ; 255 + 1e30: 3f 4f sbci r19, 0xFF ; 255 + 1e32: f9 01 movw r30, r18 + 1e34: ee 0f add r30, r30 + 1e36: ff 1f adc r31, r31 + 1e38: e2 0f add r30, r18 + 1e3a: f3 1f adc r31, r19 + 1e3c: ee 0f add r30, r30 + 1e3e: ff 1f adc r31, r31 + 1e40: e7 5f subi r30, 0xF7 ; 247 + 1e42: f6 4d sbci r31, 0xD6 ; 214 + 1e44: 90 81 ld r25, Z + 1e46: 91 11 cpse r25, r1 + 1e48: 34 c0 rjmp .+104 ; 0x1eb2 + 1e4a: 27 70 andi r18, 0x07 ; 7 + 1e4c: 33 27 eor r19, r19 + 1e4e: 82 2f mov r24, r18 + 1e50: 2f 5f subi r18, 0xFF ; 255 + 1e52: 3f 4f sbci r19, 0xFF ; 255 + 1e54: f9 01 movw r30, r18 + 1e56: ee 0f add r30, r30 + 1e58: ff 1f adc r31, r31 + 1e5a: e2 0f add r30, r18 + 1e5c: f3 1f adc r31, r19 + 1e5e: ee 0f add r30, r30 + 1e60: ff 1f adc r31, r31 + 1e62: e7 5f subi r30, 0xF7 ; 247 + 1e64: f6 4d sbci r31, 0xD6 ; 214 + 1e66: 90 81 ld r25, Z + 1e68: 91 11 cpse r25, r1 + 1e6a: 23 c0 rjmp .+70 ; 0x1eb2 + 1e6c: 27 70 andi r18, 0x07 ; 7 + 1e6e: 33 27 eor r19, r19 + 1e70: 82 2f mov r24, r18 + 1e72: 2f 5f subi r18, 0xFF ; 255 + 1e74: 3f 4f sbci r19, 0xFF ; 255 + 1e76: f9 01 movw r30, r18 + 1e78: ee 0f add r30, r30 + 1e7a: ff 1f adc r31, r31 + 1e7c: e2 0f add r30, r18 + 1e7e: f3 1f adc r31, r19 + 1e80: ee 0f add r30, r30 + 1e82: ff 1f adc r31, r31 + 1e84: e7 5f subi r30, 0xF7 ; 247 + 1e86: f6 4d sbci r31, 0xD6 ; 214 + 1e88: 90 81 ld r25, Z + 1e8a: 91 11 cpse r25, r1 + 1e8c: 12 c0 rjmp .+36 ; 0x1eb2 + 1e8e: 27 70 andi r18, 0x07 ; 7 + 1e90: 33 27 eor r19, r19 + 1e92: 82 2f mov r24, r18 + 1e94: 2f 5f subi r18, 0xFF ; 255 + 1e96: 3f 4f sbci r19, 0xFF ; 255 + 1e98: f9 01 movw r30, r18 + 1e9a: ee 0f add r30, r30 + 1e9c: ff 1f adc r31, r31 + 1e9e: e2 0f add r30, r18 + 1ea0: f3 1f adc r31, r19 + 1ea2: ee 0f add r30, r30 + 1ea4: ff 1f adc r31, r31 + 1ea6: e7 5f subi r30, 0xF7 ; 247 + 1ea8: f6 4d sbci r31, 0xD6 ; 214 + 1eaa: 90 81 ld r25, Z + 1eac: 91 11 cpse r25, r1 + 1eae: 01 c0 rjmp .+2 ; 0x1eb2 + 1eb0: 08 95 ret + 1eb2: 8f 5f subi r24, 0xFF ; 255 + 1eb4: 3e cf rjmp .-388 ; 0x1d32 -00001e0c : - return false; - } -} - -uint8_t SettingsGetActiveById(void) { - return INDEX_TO_SETTING(GlobalSettings.ActiveSettingIdx); - 1e0c: 80 91 09 29 lds r24, 0x2909 -} - 1e10: 8f 5f subi r24, 0xFF ; 255 - 1e12: 08 95 ret - -00001e14 : +00001eb6 : void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { - 1e14: cf 93 push r28 - 1e16: df 93 push r29 - 1e18: ec 01 movw r28, r24 SettingOut[0] = SettingsGetActiveById() + '0'; - 1e1a: f8 df rcall .-16 ; 0x1e0c - 1e1c: 80 5d subi r24, 0xD0 ; 208 - 1e1e: 88 83 st Y, r24 + 1eb6: 20 91 09 29 lds r18, 0x2909 + 1eba: 2f 5c subi r18, 0xCF ; 207 + 1ebc: fc 01 movw r30, r24 + 1ebe: 20 83 st Z, r18 SettingOut[1] = '\0'; - 1e20: 19 82 std Y+1, r1 ; 0x01 -} - 1e22: df 91 pop r29 - 1e24: cf 91 pop r28 - 1e26: 08 95 ret + 1ec0: 11 82 std Z+1, r1 ; 0x01 + 1ec2: 08 95 ret -00001e28 : +00001ec4 : +} bool SettingsSetActiveByName(const char* Setting) { - 1e28: fc 01 movw r30, r24 + 1ec4: fc 01 movw r30, r24 uint8_t SettingNr = Setting[0] - '0'; - 1e2a: 80 81 ld r24, Z + 1ec6: 80 81 ld r24, Z if (Setting[1] == '\0') { - 1e2c: 91 81 ldd r25, Z+1 ; 0x01 - 1e2e: 99 23 and r25, r25 - 1e30: 11 f0 breq .+4 ; 0x1e36 + 1ec8: 91 81 ldd r25, Z+1 ; 0x01 + 1eca: 99 23 and r25, r25 + 1ecc: 11 f0 breq .+4 ; 0x1ed2 return SettingsSetActiveById(SettingNr); } else { return false; } } - 1e32: 80 e0 ldi r24, 0x00 ; 0 - 1e34: 08 95 ret + 1ece: 80 e0 ldi r24, 0x00 ; 0 + 1ed0: 08 95 ret bool SettingsSetActiveByName(const char* Setting) { uint8_t SettingNr = Setting[0] - '0'; if (Setting[1] == '\0') { return SettingsSetActiveById(SettingNr); - 1e36: 80 53 subi r24, 0x30 ; 48 - 1e38: 27 cf rjmp .-434 ; 0x1c88 + 1ed2: 80 53 subi r24, 0x30 ; 48 + 1ed4: 2e cf rjmp .-420 ; 0x1d32 -00001e3a : +00001ed6 : } } void LEDInit(void) { LED_PORT.DIRSET = LED_MASK; - 1e3a: 80 e3 ldi r24, 0x30 ; 48 - 1e3c: e0 e0 ldi r30, 0x00 ; 0 - 1e3e: f6 e0 ldi r31, 0x06 ; 6 - 1e40: 81 83 std Z+1, r24 ; 0x01 - 1e42: 08 95 ret - -00001e44 : - -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1e44: 80 91 97 28 lds r24, 0x2897 - 1e48: 82 31 cpi r24, 0x12 ; 18 - 1e4a: 09 f4 brne .+2 ; 0x1e4e - 1e4c: 60 c0 rjmp .+192 ; 0x1f0e - 1e4e: c8 f0 brcs .+50 ; 0x1e82 - 1e50: 83 31 cpi r24, 0x13 ; 19 - 1e52: 01 f1 breq .+64 ; 0x1e94 - 1e54: 98 2f mov r25, r24 - 1e56: 90 52 subi r25, 0x20 ; 32 - 1e58: 98 30 cpi r25, 0x08 ; 8 - 1e5a: 08 f0 brcs .+2 ; 0x1e5e - 1e5c: 4d c0 rjmp .+154 ; 0x1ef8 - *Action = LED_NO_ACTION; - } - break; - - case LED_BLINK_1X ... LED_BLINK_8X: - if (++BlinkPrescaler == BLINK_PRESCALER) { - 1e5e: 90 91 99 28 lds r25, 0x2899 - 1e62: 9f 5f subi r25, 0xFF ; 255 - 1e64: 91 30 cpi r25, 0x01 ; 1 - 1e66: 09 f4 brne .+2 ; 0x1e6a - 1e68: 6b c0 rjmp .+214 ; 0x1f40 - 1e6a: 90 93 99 28 sts 0x2899, r25 - -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1e6e: 80 91 98 28 lds r24, 0x2898 - 1e72: 82 31 cpi r24, 0x12 ; 18 - 1e74: e1 f4 brne .+56 ; 0x1eae - LED_PORT.OUTSET = Mask; - *Action = LED_NO_ACTION; - break; - - case LED_TOGGLE: - LED_PORT.OUTTGL = Mask; - 1e76: 80 e2 ldi r24, 0x20 ; 32 - 1e78: 80 93 07 06 sts 0x0607, r24 - *Action = LED_NO_ACTION; - 1e7c: 10 92 98 28 sts 0x2898, r1 - 1e80: 08 95 ret - -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1e82: 80 31 cpi r24, 0x10 ; 16 - 1e84: 61 f0 breq .+24 ; 0x1e9e - 1e86: b0 f1 brcs .+108 ; 0x1ef4 - LED_PORT.OUTCLR = Mask; - *Action = LED_NO_ACTION; - break; - - case LED_ON: - LED_PORT.OUTSET = Mask; - 1e88: 80 e1 ldi r24, 0x10 ; 16 - 1e8a: 80 93 05 06 sts 0x0605, r24 - *Action = LED_NO_ACTION; - 1e8e: 10 92 97 28 sts 0x2897, r1 - 1e92: 09 c0 rjmp .+18 ; 0x1ea6 - LED_PORT.OUTTGL = Mask; - *Action = LED_NO_ACTION; - break; - - case LED_PULSE: - if (!(LED_PORT.OUT & Mask)) { - 1e94: 80 91 04 06 lds r24, 0x0604 - 1e98: 84 ff sbrs r24, 4 - 1e9a: 3f c0 rjmp .+126 ; 0x1f1a - LED_PORT.OUTSET = Mask; - } else { - LED_PORT.OUTCLR = Mask; - 1e9c: 80 e1 ldi r24, 0x10 ; 16 - 1e9e: 80 93 06 06 sts 0x0606, r24 - *Action = LED_NO_ACTION; - 1ea2: 10 92 97 28 sts 0x2897, r1 - -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1ea6: 80 91 98 28 lds r24, 0x2898 - 1eaa: 82 31 cpi r24, 0x12 ; 18 - 1eac: 21 f3 breq .-56 ; 0x1e76 - 1eae: 83 31 cpi r24, 0x13 ; 19 - 1eb0: 48 f4 brcc .+18 ; 0x1ec4 - 1eb2: 80 31 cpi r24, 0x10 ; 16 - 1eb4: a9 f0 breq .+42 ; 0x1ee0 - 1eb6: d0 f0 brcs .+52 ; 0x1eec - LED_PORT.OUTCLR = Mask; - *Action = LED_NO_ACTION; - break; - - case LED_ON: - LED_PORT.OUTSET = Mask; - 1eb8: 80 e2 ldi r24, 0x20 ; 32 - 1eba: 80 93 05 06 sts 0x0605, r24 - *Action = LED_NO_ACTION; - 1ebe: 10 92 98 28 sts 0x2898, r1 - 1ec2: 08 95 ret - -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1ec4: 83 31 cpi r24, 0x13 ; 19 - 1ec6: d9 f0 breq .+54 ; 0x1efe - 1ec8: 98 2f mov r25, r24 - 1eca: 90 52 subi r25, 0x20 ; 32 - 1ecc: 98 30 cpi r25, 0x08 ; 8 - 1ece: 78 f4 brcc .+30 ; 0x1eee - *Action = LED_NO_ACTION; - } - break; - - case LED_BLINK_1X ... LED_BLINK_8X: - if (++BlinkPrescaler == BLINK_PRESCALER) { - 1ed0: 90 91 99 28 lds r25, 0x2899 - 1ed4: 9f 5f subi r25, 0xFF ; 255 - 1ed6: 91 30 cpi r25, 0x01 ; 1 - 1ed8: 21 f1 breq .+72 ; 0x1f22 - 1eda: 90 93 99 28 sts 0x2899, r25 + 1ed6: 80 e3 ldi r24, 0x30 ; 48 + 1ed8: e0 e0 ldi r30, 0x00 ; 0 + 1eda: f6 e0 ldi r31, 0x06 ; 6 + 1edc: 81 83 std Z+1, r24 ; 0x01 1ede: 08 95 ret +00001ee0 : + +INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) +{ + static uint8_t BlinkPrescaler = 0; + + switch (*Action) + 1ee0: 20 91 97 28 lds r18, 0x2897 + 1ee4: 82 2f mov r24, r18 + 1ee6: 90 e0 ldi r25, 0x00 ; 0 + 1ee8: 88 32 cpi r24, 0x28 ; 40 + 1eea: 91 05 cpc r25, r1 + 1eec: 88 f0 brcs .+34 ; 0x1f10 + } + break; + + default: + /* Should not happen (TM) */ + *Action = LED_NO_ACTION; + 1eee: 10 92 97 28 sts 0x2897, r1 + +INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) +{ + static uint8_t BlinkPrescaler = 0; + + switch (*Action) + 1ef2: 20 91 98 28 lds r18, 0x2898 + 1ef6: 82 2f mov r24, r18 + 1ef8: 90 e0 ldi r25, 0x00 ; 0 + 1efa: 88 32 cpi r24, 0x28 ; 40 + 1efc: 91 05 cpc r25, r1 + 1efe: 18 f0 brcs .+6 ; 0x1f06 + } + break; + + default: + /* Should not happen (TM) */ + *Action = LED_NO_ACTION; + 1f00: 10 92 98 28 sts 0x2898, r1 + 1f04: 08 95 ret + +INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) +{ + static uint8_t BlinkPrescaler = 0; + + switch (*Action) + 1f06: fc 01 movw r30, r24 + 1f08: e2 50 subi r30, 0x02 ; 2 + 1f0a: ff 4f sbci r31, 0xFF ; 255 + 1f0c: 0c 94 7a 2b jmp 0x56f4 ; 0x56f4 <__tablejump2__> + 1f10: fc 01 movw r30, r24 + 1f12: ea 5d subi r30, 0xDA ; 218 + 1f14: fe 4f sbci r31, 0xFE ; 254 + 1f16: 0c 94 7a 2b jmp 0x56f4 ; 0x56f4 <__tablejump2__> + case LED_PULSE: if (!(LED_PORT.OUT & Mask)) { LED_PORT.OUTSET = Mask; } else { LED_PORT.OUTCLR = Mask; - 1ee0: 80 e2 ldi r24, 0x20 ; 32 - 1ee2: 80 93 06 06 sts 0x0606, r24 + 1f1a: 80 e2 ldi r24, 0x20 ; 32 + 1f1c: 80 93 06 06 sts 0x0606, r24 *Action = LED_NO_ACTION; - 1ee6: 10 92 98 28 sts 0x2898, r1 - 1eea: 08 95 ret + 1f20: 10 92 98 28 sts 0x2898, r1 + 1f24: 08 95 ret -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1eec: 81 11 cpse r24, r1 + case LED_PULSE: + if (!(LED_PORT.OUT & Mask)) { + LED_PORT.OUTSET = Mask; + } else { + LED_PORT.OUTCLR = Mask; + 1f26: 80 e1 ldi r24, 0x10 ; 16 + 1f28: 80 93 06 06 sts 0x0606, r24 + *Action = LED_NO_ACTION; + 1f2c: 10 92 97 28 sts 0x2897, r1 + 1f30: e0 cf rjmp .-64 ; 0x1ef2 } break; - default: - /* Should not happen (TM) */ + case LED_BLINK_1X ... LED_BLINK_8X: + if (++BlinkPrescaler == BLINK_PRESCALER) { + 1f32: 80 91 99 28 lds r24, 0x2899 + 1f36: 8f 5f subi r24, 0xFF ; 255 + 1f38: 81 30 cpi r24, 0x01 ; 1 + 1f3a: 99 f1 breq .+102 ; 0x1fa2 + 1f3c: 80 93 99 28 sts 0x2899, r24 + 1f40: 08 95 ret + LED_PORT.OUTCLR = Mask; *Action = LED_NO_ACTION; - 1eee: 10 92 98 28 sts 0x2898, r1 - 1ef2: 08 95 ret - -INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) -{ - static uint8_t BlinkPrescaler = 0; - - switch (*Action) - 1ef4: 88 23 and r24, r24 - 1ef6: b9 f2 breq .-82 ; 0x1ea6 - } break; - default: - /* Should not happen (TM) */ + case LED_ON: + LED_PORT.OUTSET = Mask; + 1f42: 80 e2 ldi r24, 0x20 ; 32 + 1f44: 80 93 05 06 sts 0x0605, r24 *Action = LED_NO_ACTION; - 1ef8: 10 92 97 28 sts 0x2897, r1 - 1efc: d4 cf rjmp .-88 ; 0x1ea6 + 1f48: 10 92 98 28 sts 0x2898, r1 + 1f4c: 08 95 ret + break; + + case LED_TOGGLE: LED_PORT.OUTTGL = Mask; + 1f4e: 80 e2 ldi r24, 0x20 ; 32 + 1f50: 80 93 07 06 sts 0x0607, r24 *Action = LED_NO_ACTION; + 1f54: 10 92 98 28 sts 0x2898, r1 + 1f58: 08 95 ret break; case LED_PULSE: if (!(LED_PORT.OUT & Mask)) { - 1efe: 80 91 04 06 lds r24, 0x0604 - 1f02: 85 fd sbrc r24, 5 - 1f04: ed cf rjmp .-38 ; 0x1ee0 + 1f5a: 80 91 04 06 lds r24, 0x0604 + 1f5e: 85 fd sbrc r24, 5 + 1f60: dc cf rjmp .-72 ; 0x1f1a BlinkPrescaler = 0; /* Blink functionality occurs at slower speed than Tick-frequency */ if (!(LED_PORT.OUT & Mask)) { /* LED is off, turn it on */ LED_PORT.OUTSET = Mask; - 1f06: 80 e2 ldi r24, 0x20 ; 32 - 1f08: 80 93 05 06 sts 0x0605, r24 - 1f0c: 08 95 ret + 1f62: 80 e2 ldi r24, 0x20 ; 32 + 1f64: 80 93 05 06 sts 0x0605, r24 + 1f68: 08 95 ret LED_PORT.OUTSET = Mask; *Action = LED_NO_ACTION; break; case LED_TOGGLE: LED_PORT.OUTTGL = Mask; - 1f0e: 80 e1 ldi r24, 0x10 ; 16 - 1f10: 80 93 07 06 sts 0x0607, r24 + 1f6a: 80 e1 ldi r24, 0x10 ; 16 + 1f6c: 80 93 07 06 sts 0x0607, r24 *Action = LED_NO_ACTION; - 1f14: 10 92 97 28 sts 0x2897, r1 - 1f18: c6 cf rjmp .-116 ; 0x1ea6 + 1f70: 10 92 97 28 sts 0x2897, r1 + 1f74: be cf rjmp .-132 ; 0x1ef2 + break; + + case LED_PULSE: + if (!(LED_PORT.OUT & Mask)) { + 1f76: 80 91 04 06 lds r24, 0x0604 + 1f7a: 84 fd sbrc r24, 4 + 1f7c: d4 cf rjmp .-88 ; 0x1f26 BlinkPrescaler = 0; /* Blink functionality occurs at slower speed than Tick-frequency */ if (!(LED_PORT.OUT & Mask)) { /* LED is off, turn it on */ LED_PORT.OUTSET = Mask; - 1f1a: 80 e1 ldi r24, 0x10 ; 16 - 1f1c: 80 93 05 06 sts 0x0605, r24 - 1f20: c2 cf rjmp .-124 ; 0x1ea6 + 1f7e: 80 e1 ldi r24, 0x10 ; 16 + 1f80: 80 93 05 06 sts 0x0605, r24 + 1f84: b6 cf rjmp .-148 ; 0x1ef2 + LED_PORT.OUTCLR = Mask; + *Action = LED_NO_ACTION; + break; + + case LED_ON: + LED_PORT.OUTSET = Mask; + 1f86: 80 e1 ldi r24, 0x10 ; 16 + 1f88: 80 93 05 06 sts 0x0605, r24 + *Action = LED_NO_ACTION; + 1f8c: 10 92 97 28 sts 0x2897, r1 + 1f90: b0 cf rjmp .-160 ; 0x1ef2 + *Action = LED_NO_ACTION; + } + break; + + case LED_BLINK_1X ... LED_BLINK_8X: + if (++BlinkPrescaler == BLINK_PRESCALER) { + 1f92: 80 91 99 28 lds r24, 0x2899 + 1f96: 8f 5f subi r24, 0xFF ; 255 + 1f98: 81 30 cpi r24, 0x01 ; 1 + 1f9a: 99 f0 breq .+38 ; 0x1fc2 + 1f9c: 80 93 99 28 sts 0x2899, r24 + 1fa0: a8 cf rjmp .-176 ; 0x1ef2 + BlinkPrescaler = 0; + 1fa2: 10 92 99 28 sts 0x2899, r1 + /* Blink functionality occurs at slower speed than Tick-frequency */ + + if (!(LED_PORT.OUT & Mask)) { + 1fa6: 80 91 04 06 lds r24, 0x0604 + 1faa: 85 ff sbrs r24, 5 + 1fac: da cf rjmp .-76 ; 0x1f62 + /* LED is off, turn it on */ + LED_PORT.OUTSET = Mask; + } else { + /* LED is on, turn it off and change state */ + LED_PORT.OUTCLR = Mask; + 1fae: 80 e2 ldi r24, 0x20 ; 32 + 1fb0: 80 93 06 06 sts 0x0606, r24 + + if (*Action == LED_BLINK_1X) { + 1fb4: 20 32 cpi r18, 0x20 ; 32 + 1fb6: 09 f4 brne .+2 ; 0x1fba + 1fb8: a3 cf rjmp .-186 ; 0x1f00 + *Action = LED_NO_ACTION; + } else { + /* Still some blinks to do. Use the fact that LED_BLINK_XY are ordered sequentially */ + *Action = *Action - 1; + 1fba: 21 50 subi r18, 0x01 ; 1 + 1fbc: 20 93 98 28 sts 0x2898, r18 + 1fc0: 08 95 ret } break; case LED_BLINK_1X ... LED_BLINK_8X: if (++BlinkPrescaler == BLINK_PRESCALER) { BlinkPrescaler = 0; - 1f22: 10 92 99 28 sts 0x2899, r1 + 1fc2: 10 92 99 28 sts 0x2899, r1 /* Blink functionality occurs at slower speed than Tick-frequency */ if (!(LED_PORT.OUT & Mask)) { - 1f26: 90 91 04 06 lds r25, 0x0604 - 1f2a: 95 ff sbrs r25, 5 - 1f2c: ec cf rjmp .-40 ; 0x1f06 + 1fc6: 80 91 04 06 lds r24, 0x0604 + 1fca: 84 ff sbrs r24, 4 + 1fcc: d8 cf rjmp .-80 ; 0x1f7e /* LED is off, turn it on */ LED_PORT.OUTSET = Mask; } else { /* LED is on, turn it off and change state */ LED_PORT.OUTCLR = Mask; - 1f2e: 90 e2 ldi r25, 0x20 ; 32 - 1f30: 90 93 06 06 sts 0x0606, r25 + 1fce: 80 e1 ldi r24, 0x10 ; 16 + 1fd0: 80 93 06 06 sts 0x0606, r24 if (*Action == LED_BLINK_1X) { - 1f34: 80 32 cpi r24, 0x20 ; 32 - 1f36: d9 f2 breq .-74 ; 0x1eee + 1fd4: 20 32 cpi r18, 0x20 ; 32 + 1fd6: 09 f4 brne .+2 ; 0x1fda + 1fd8: 8a cf rjmp .-236 ; 0x1eee *Action = LED_NO_ACTION; } else { /* Still some blinks to do. Use the fact that LED_BLINK_XY are ordered sequentially */ *Action = *Action - 1; - 1f38: 81 50 subi r24, 0x01 ; 1 - 1f3a: 80 93 98 28 sts 0x2898, r24 - 1f3e: 08 95 ret - } - break; + 1fda: 21 50 subi r18, 0x01 ; 1 + 1fdc: 20 93 97 28 sts 0x2897, r18 + 1fe0: 88 cf rjmp .-240 ; 0x1ef2 - case LED_BLINK_1X ... LED_BLINK_8X: - if (++BlinkPrescaler == BLINK_PRESCALER) { - BlinkPrescaler = 0; - 1f40: 10 92 99 28 sts 0x2899, r1 - /* Blink functionality occurs at slower speed than Tick-frequency */ - - if (!(LED_PORT.OUT & Mask)) { - 1f44: 90 91 04 06 lds r25, 0x0604 - 1f48: 94 ff sbrs r25, 4 - 1f4a: e7 cf rjmp .-50 ; 0x1f1a - /* LED is off, turn it on */ - LED_PORT.OUTSET = Mask; - } else { - /* LED is on, turn it off and change state */ - LED_PORT.OUTCLR = Mask; - 1f4c: 90 e1 ldi r25, 0x10 ; 16 - 1f4e: 90 93 06 06 sts 0x0606, r25 - - if (*Action == LED_BLINK_1X) { - 1f52: 80 32 cpi r24, 0x20 ; 32 - 1f54: 89 f2 breq .-94 ; 0x1ef8 - *Action = LED_NO_ACTION; - } else { - /* Still some blinks to do. Use the fact that LED_BLINK_XY are ordered sequentially */ - *Action = *Action - 1; - 1f56: 81 50 subi r24, 0x01 ; 1 - 1f58: 80 93 97 28 sts 0x2897, r24 - 1f5c: a4 cf rjmp .-184 ; 0x1ea6 - -00001f5e : +00001fe2 : Tick(LED_GREEN, &LEDGreenAction); } /* TODO: This would be nicer as INLINE */ void LEDTrigger(LEDFunctionEnum Func, LEDActionEnum Action) { if (GlobalSettings.ActiveSettingPtr->LEDGreenFunction == Func) { - 1f5e: e0 91 0a 29 lds r30, 0x290A - 1f62: f0 91 0b 29 lds r31, 0x290B - 1f66: 95 81 ldd r25, Z+5 ; 0x05 - 1f68: 98 17 cp r25, r24 - 1f6a: 31 f0 breq .+12 ; 0x1f78 + 1fe2: e0 91 0a 29 lds r30, 0x290A + 1fe6: f0 91 0b 29 lds r31, 0x290B + 1fea: 95 81 ldd r25, Z+5 ; 0x05 + 1fec: 98 17 cp r25, r24 + 1fee: 31 f0 breq .+12 ; 0x1ffc LEDGreenAction = Action; } if (GlobalSettings.ActiveSettingPtr->LEDRedFunction == Func) { - 1f6c: 94 81 ldd r25, Z+4 ; 0x04 - 1f6e: 98 13 cpse r25, r24 - 1f70: 08 95 ret + 1ff0: 94 81 ldd r25, Z+4 ; 0x04 + 1ff2: 98 13 cpse r25, r24 + 1ff4: 08 95 ret LEDRedAction = Action; - 1f72: 60 93 97 28 sts 0x2897, r22 - 1f76: 08 95 ret + 1ff6: 60 93 97 28 sts 0x2897, r22 + 1ffa: 08 95 ret } /* TODO: This would be nicer as INLINE */ void LEDTrigger(LEDFunctionEnum Func, LEDActionEnum Action) { if (GlobalSettings.ActiveSettingPtr->LEDGreenFunction == Func) { LEDGreenAction = Action; - 1f78: 60 93 98 28 sts 0x2898, r22 - 1f7c: f7 cf rjmp .-18 ; 0x1f6c + 1ffc: 60 93 98 28 sts 0x2898, r22 + 2000: f7 cf rjmp .-18 ; 0x1ff0 -00001f7e : +00002002 : LEDRedAction = Action; } } void LEDGetFuncList(char* ListOut, uint16_t BufferSize) { - 1f7e: cf 93 push r28 - 1f80: df 93 push r29 - 1f82: ec 01 movw r28, r24 + 2002: 0f 93 push r16 + 2004: 1f 93 push r17 + 2006: cf 93 push r28 + 2008: df 93 push r29 uint8_t i; /* Account for '\0' */ BufferSize--; - 1f84: 61 50 subi r22, 0x01 ; 1 - 1f86: 71 09 sbc r23, r1 - 1f88: 80 e0 ldi r24, 0x00 ; 0 - 1f8a: 90 e0 ldi r25, 0x00 ; 0 + 200a: 61 50 subi r22, 0x01 ; 1 + 200c: 71 09 sbc r23, r1 + 200e: 4e ea ldi r20, 0xAE ; 174 + 2010: 55 e0 ldi r21, 0x05 ; 5 BufferSize--; } if ( i < (LED_FUNC_COUNT - 1) ) { /* No comma on last configuration */ *ListOut++ = ','; - 1f8c: 3c e2 ldi r19, 0x2C ; 44 + 2012: 1c e2 ldi r17, 0x2C ; 44 /* Account for '\0' */ BufferSize--; for (i=0; i sizeof(LEDFuncTable[i]) ) { - 1fa4: 24 91 lpm r18, Z - 1fa6: 22 23 and r18, r18 - 1fa8: 81 f0 breq .+32 ; 0x1fca - 1faa: 61 32 cpi r22, 0x21 ; 33 - 1fac: 71 05 cpc r23, r1 - 1fae: 68 f0 brcs .+26 ; 0x1fca - 1fb0: de 01 movw r26, r28 - 1fb2: 03 c0 rjmp .+6 ; 0x1fba - 1fb4: 60 32 cpi r22, 0x20 ; 32 - 1fb6: 71 05 cpc r23, r1 - 1fb8: 41 f0 breq .+16 ; 0x1fca + 2016: fa 01 movw r30, r20 + 2018: 04 91 lpm r16, Z + 201a: 00 23 and r16, r16 + 201c: 49 f1 breq .+82 ; 0x2070 + 201e: 61 32 cpi r22, 0x21 ; 33 + 2020: 71 05 cpc r23, r1 + 2022: 20 f4 brcc .+8 ; 0x202c + 2024: 25 c0 rjmp .+74 ; 0x2070 + 2026: 60 32 cpi r22, 0x20 ; 32 + 2028: 71 05 cpc r23, r1 + 202a: 61 f0 breq .+24 ; 0x2044 + 202c: dc 01 movw r26, r24 + 202e: 01 96 adiw r24, 0x01 ; 1 + 2030: ec 01 movw r28, r24 /* While not end-of-string and enough buffer to * put a complete configuration name */ *ListOut++ = c; - 1fba: 2d 93 st X+, r18 - 1fbc: ed 01 movw r28, r26 + 2032: 0c 93 st X, r16 FuncName++; - 1fbe: 31 96 adiw r30, 0x01 ; 1 + 2034: 2f 5f subi r18, 0xFF ; 255 + 2036: 3f 4f sbci r19, 0xFF ; 255 BufferSize--; - 1fc0: 61 50 subi r22, 0x01 ; 1 - 1fc2: 71 09 sbc r23, r1 + 2038: 61 50 subi r22, 0x01 ; 1 + 203a: 71 09 sbc r23, r1 for (i=0; i sizeof(LEDFuncTable[i]) ) { - 1fc4: 24 91 lpm r18, Z - 1fc6: 21 11 cpse r18, r1 - 1fc8: f5 cf rjmp .-22 ; 0x1fb4 + 203c: f9 01 movw r30, r18 + 203e: 04 91 lpm r16, Z + 2040: 01 11 cpse r16, r1 + 2042: f1 cf rjmp .-30 ; 0x2026 *ListOut++ = c; FuncName++; BufferSize--; } if ( i < (LED_FUNC_COUNT - 1) ) { - 1fca: 87 30 cpi r24, 0x07 ; 7 - 1fcc: 91 05 cpc r25, r1 - 1fce: 21 f4 brne .+8 ; 0x1fd8 + 2044: f6 e0 ldi r31, 0x06 ; 6 + 2046: 4e 38 cpi r20, 0x8E ; 142 + 2048: 5f 07 cpc r21, r31 + 204a: 61 f0 breq .+24 ; 0x2064 + /* No comma on last configuration */ *ListOut++ = ','; + 204c: ce 01 movw r24, r28 + 204e: 01 96 adiw r24, 0x01 ; 1 + 2050: 18 83 st Y, r17 + BufferSize--; + 2052: 61 50 subi r22, 0x01 ; 1 + 2054: 71 09 sbc r23, r1 + 2056: 40 5e subi r20, 0xE0 ; 224 + 2058: 5f 4f sbci r21, 0xFF ; 255 + uint8_t i; + + /* Account for '\0' */ + BufferSize--; + + for (i=0; i + BufferSize--; + } + + if ( i < (LED_FUNC_COUNT - 1) ) { + /* No comma on last configuration */ + *ListOut++ = ','; + 2062: ec 01 movw r28, r24 BufferSize--; } } *ListOut = '\0'; - 1fd0: 18 82 st Y, r1 + 2064: 18 82 st Y, r1 } - 1fd2: df 91 pop r29 - 1fd4: cf 91 pop r28 - 1fd6: 08 95 ret - BufferSize--; - } + 2066: df 91 pop r29 + 2068: cf 91 pop r28 + 206a: 1f 91 pop r17 + 206c: 0f 91 pop r16 + 206e: 08 95 ret - if ( i < (LED_FUNC_COUNT - 1) ) { - /* No comma on last configuration */ - *ListOut++ = ','; - 1fd8: 39 93 st Y+, r19 - BufferSize--; - 1fda: 61 50 subi r22, 0x01 ; 1 - 1fdc: 71 09 sbc r23, r1 - 1fde: 01 96 adiw r24, 0x01 ; 1 - 1fe0: d6 cf rjmp .-84 ; 0x1f8e + for (i=0; i: + while( (c = pgm_read_byte(FuncName)) != '\0' && BufferSize > sizeof(LEDFuncTable[i]) ) { + 2070: ec 01 movw r28, r24 + 2072: e8 cf rjmp .-48 ; 0x2044 + +00002074 : *ListOut = '\0'; } void LEDSetFuncById(uint8_t Mask, LEDFunctionEnum Func) { - 1fe2: 98 2f mov r25, r24 - 1fe4: 90 71 andi r25, 0x10 ; 16 - 1fe6: 85 fd sbrc r24, 5 - 1fe8: 03 c0 rjmp .+6 ; 0x1ff0 - 1fea: 91 11 cpse r25, r1 - 1fec: 3f c0 rjmp .+126 ; 0x206c - 1fee: 08 95 ret + 2074: 98 2f mov r25, r24 + 2076: 90 71 andi r25, 0x10 ; 16 + 2078: 85 fd sbrc r24, 5 + 207a: 03 c0 rjmp .+6 ; 0x2082 + 207c: 91 11 cpse r25, r1 + 207e: 3f c0 rjmp .+126 ; 0x20fe + 2080: 08 95 ret } #else /* Write LED func to all settings when using global settings */ for (uint8_t i=0; i + 2082: 60 93 11 29 sts 0x2911, r22 + 2086: 99 23 and r25, r25 + 2088: 59 f1 breq .+86 ; 0x20e0 } if (Mask & LED_RED) { GlobalSettings.Settings[i].LEDRedFunction = Func; - 1ff8: 60 93 10 29 sts 0x2910, r22 + 208a: 60 93 10 29 sts 0x2910, r22 } #else /* Write LED func to all settings when using global settings */ for (uint8_t i=0; i + 20d0: 99 23 and r25, r25 + 20d2: b1 f2 breq .-84 ; 0x2080 LED_PORT.OUTCLR = LED_RED; - 2042: 80 e1 ldi r24, 0x10 ; 16 - 2044: 80 93 06 06 sts 0x0606, r24 + 20d4: 80 e1 ldi r24, 0x10 ; 16 + 20d6: 80 93 06 06 sts 0x0606, r24 LEDRedAction = LED_NO_ACTION; - 2048: 10 92 97 28 sts 0x2897, r1 - 204c: 08 95 ret + 20da: 10 92 97 28 sts 0x2897, r1 + 20de: 08 95 ret } #else /* Write LED func to all settings when using global settings */ for (uint8_t i=0; i + 20e0: 60 93 17 29 sts 0x2917, r22 + 20e4: 60 93 1d 29 sts 0x291D, r22 + 20e8: 60 93 23 29 sts 0x2923, r22 + 20ec: 60 93 29 29 sts 0x2929, r22 + 20f0: 60 93 2f 29 sts 0x292F, r22 + 20f4: 60 93 35 29 sts 0x2935, r22 + 20f8: 60 93 3b 29 sts 0x293B, r22 + 20fc: e4 cf rjmp .-56 ; 0x20c6 } if (Mask & LED_RED) { GlobalSettings.Settings[i].LEDRedFunction = Func; - 206c: 60 93 10 29 sts 0x2910, r22 - 2070: 60 93 16 29 sts 0x2916, r22 - 2074: 60 93 1c 29 sts 0x291C, r22 - 2078: 60 93 22 29 sts 0x2922, r22 - 207c: 60 93 28 29 sts 0x2928, r22 - 2080: 60 93 2e 29 sts 0x292E, r22 - 2084: 60 93 34 29 sts 0x2934, r22 - 2088: 60 93 3a 29 sts 0x293A, r22 - 208c: d8 cf rjmp .-80 ; 0x203e + 20fe: 60 93 10 29 sts 0x2910, r22 + 2102: 60 93 16 29 sts 0x2916, r22 + 2106: 60 93 1c 29 sts 0x291C, r22 + 210a: 60 93 22 29 sts 0x2922, r22 + 210e: 60 93 28 29 sts 0x2928, r22 + 2112: 60 93 2e 29 sts 0x292E, r22 + 2116: 60 93 34 29 sts 0x2934, r22 + 211a: 60 93 3a 29 sts 0x293A, r22 + 211e: d8 cf rjmp .-80 ; 0x20d0 -0000208e : +00002120 : } } void LEDGetFuncByName(uint8_t Mask, char* FuncOut, uint16_t BufferSize) { - 208e: fb 01 movw r30, r22 + 2120: fb 01 movw r30, r22 if (Mask == LED_GREEN) { - 2090: 80 32 cpi r24, 0x20 ; 32 - 2092: 21 f0 breq .+8 ; 0x209c + 2122: 80 32 cpi r24, 0x20 ; 32 + 2124: 21 f0 breq .+8 ; 0x212e strncpy_P(FuncOut, LEDFuncTable[GlobalSettings.ActiveSettingPtr->LEDGreenFunction], BufferSize); } else if (Mask == LED_RED) { - 2094: 80 31 cpi r24, 0x10 ; 16 - 2096: 89 f0 breq .+34 ; 0x20ba + 2126: 80 31 cpi r24, 0x10 ; 16 + 2128: 89 f0 breq .+34 ; 0x214c strncpy_P(FuncOut, LEDFuncTable[GlobalSettings.ActiveSettingPtr->LEDRedFunction], BufferSize); } else { *FuncOut = '\0'; - 2098: 10 82 st Z, r1 - 209a: 08 95 ret + 212a: 10 82 st Z, r1 + 212c: 08 95 ret } void LEDGetFuncByName(uint8_t Mask, char* FuncOut, uint16_t BufferSize) { if (Mask == LED_GREEN) { strncpy_P(FuncOut, LEDFuncTable[GlobalSettings.ActiveSettingPtr->LEDGreenFunction], BufferSize); - 209c: a0 91 0a 29 lds r26, 0x290A - 20a0: b0 91 0b 29 lds r27, 0x290B - 20a4: 15 96 adiw r26, 0x05 ; 5 - 20a6: 6c 91 ld r22, X + 212e: a0 91 0a 29 lds r26, 0x290A + 2132: b0 91 0b 29 lds r27, 0x290B + 2136: 15 96 adiw r26, 0x05 ; 5 + 2138: 6c 91 ld r22, X } else if (Mask == LED_RED) { strncpy_P(FuncOut, LEDFuncTable[GlobalSettings.ActiveSettingPtr->LEDRedFunction], BufferSize); - 20a8: 80 e2 ldi r24, 0x20 ; 32 - 20aa: 68 9f mul r22, r24 - 20ac: b0 01 movw r22, r0 - 20ae: 11 24 eor r1, r1 - 20b0: 68 54 subi r22, 0x48 ; 72 - 20b2: 7b 4f sbci r23, 0xFB ; 251 - 20b4: cf 01 movw r24, r30 - 20b6: 0c 94 ee 2d jmp 0x5bdc ; 0x5bdc - 20ba: a0 91 0a 29 lds r26, 0x290A - 20be: b0 91 0b 29 lds r27, 0x290B - 20c2: 14 96 adiw r26, 0x04 ; 4 - 20c4: 6c 91 ld r22, X - 20c6: f0 cf rjmp .-32 ; 0x20a8 + 213a: 80 e2 ldi r24, 0x20 ; 32 + 213c: 68 9f mul r22, r24 + 213e: b0 01 movw r22, r0 + 2140: 11 24 eor r1, r1 + 2142: 62 55 subi r22, 0x52 ; 82 + 2144: 7a 4f sbci r23, 0xFA ; 250 + 2146: cf 01 movw r24, r30 + 2148: 0c 94 18 2c jmp 0x5830 ; 0x5830 + 214c: a0 91 0a 29 lds r26, 0x290A + 2150: b0 91 0b 29 lds r27, 0x290B + 2154: 14 96 adiw r26, 0x04 ; 4 + 2156: 6c 91 ld r22, X + 2158: f0 cf rjmp .-32 ; 0x213a -000020c8 : +0000215a : *FuncOut = '\0'; } } bool LEDSetFuncByName(uint8_t Mask, const char* FuncName) { - 20c8: 1f 93 push r17 - 20ca: cf 93 push r28 - 20cc: df 93 push r29 - 20ce: 18 2f mov r17, r24 - 20d0: eb 01 movw r28, r22 + 215a: 1f 93 push r17 + 215c: cf 93 push r28 + 215e: df 93 push r29 + 2160: 18 2f mov r17, r24 + 2162: eb 01 movw r28, r22 uint8_t i; for (i=0; i - 20dc: 89 2b or r24, r25 - 20de: b1 f1 breq .+108 ; 0x214c - 20e0: 68 ed ldi r22, 0xD8 ; 216 - 20e2: 74 e0 ldi r23, 0x04 ; 4 - 20e4: ce 01 movw r24, r28 - 20e6: 0e 94 d5 2d call 0x5baa ; 0x5baa - 20ea: 89 2b or r24, r25 - 20ec: b9 f1 breq .+110 ; 0x215c - 20ee: 68 ef ldi r22, 0xF8 ; 248 - 20f0: 74 e0 ldi r23, 0x04 ; 4 - 20f2: ce 01 movw r24, r28 - 20f4: 0e 94 d5 2d call 0x5baa ; 0x5baa - 20f8: 89 2b or r24, r25 - 20fa: 91 f1 breq .+100 ; 0x2160 - 20fc: 68 e1 ldi r22, 0x18 ; 24 - 20fe: 75 e0 ldi r23, 0x05 ; 5 - 2100: ce 01 movw r24, r28 - 2102: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2106: 89 2b or r24, r25 - 2108: 69 f1 breq .+90 ; 0x2164 - 210a: 68 e3 ldi r22, 0x38 ; 56 - 210c: 75 e0 ldi r23, 0x05 ; 5 - 210e: ce 01 movw r24, r28 - 2110: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2114: 89 2b or r24, r25 - 2116: 41 f1 breq .+80 ; 0x2168 - 2118: 68 e5 ldi r22, 0x58 ; 88 - 211a: 75 e0 ldi r23, 0x05 ; 5 - 211c: ce 01 movw r24, r28 - 211e: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2122: 89 2b or r24, r25 - 2124: 19 f1 breq .+70 ; 0x216c - 2126: 68 e7 ldi r22, 0x78 ; 120 - 2128: 75 e0 ldi r23, 0x05 ; 5 - 212a: ce 01 movw r24, r28 - 212c: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2130: 89 2b or r24, r25 - 2132: f1 f0 breq .+60 ; 0x2170 - 2134: 68 e9 ldi r22, 0x98 ; 152 - 2136: 75 e0 ldi r23, 0x05 ; 5 - 2138: ce 01 movw r24, r28 - 213a: 0e 94 d5 2d call 0x5baa ; 0x5baa - 213e: 89 2b or r24, r25 - 2140: c9 f0 breq .+50 ; 0x2174 + 2164: 6e ea ldi r22, 0xAE ; 174 + 2166: 75 e0 ldi r23, 0x05 ; 5 + 2168: ce 01 movw r24, r28 + 216a: 0e 94 ff 2b call 0x57fe ; 0x57fe + 216e: 89 2b or r24, r25 + 2170: b1 f1 breq .+108 ; 0x21de + 2172: 6e ec ldi r22, 0xCE ; 206 + 2174: 75 e0 ldi r23, 0x05 ; 5 + 2176: ce 01 movw r24, r28 + 2178: 0e 94 ff 2b call 0x57fe ; 0x57fe + 217c: 89 2b or r24, r25 + 217e: b9 f1 breq .+110 ; 0x21ee + 2180: 6e ee ldi r22, 0xEE ; 238 + 2182: 75 e0 ldi r23, 0x05 ; 5 + 2184: ce 01 movw r24, r28 + 2186: 0e 94 ff 2b call 0x57fe ; 0x57fe + 218a: 89 2b or r24, r25 + 218c: 91 f1 breq .+100 ; 0x21f2 + 218e: 6e e0 ldi r22, 0x0E ; 14 + 2190: 76 e0 ldi r23, 0x06 ; 6 + 2192: ce 01 movw r24, r28 + 2194: 0e 94 ff 2b call 0x57fe ; 0x57fe + 2198: 89 2b or r24, r25 + 219a: 69 f1 breq .+90 ; 0x21f6 + 219c: 6e e2 ldi r22, 0x2E ; 46 + 219e: 76 e0 ldi r23, 0x06 ; 6 + 21a0: ce 01 movw r24, r28 + 21a2: 0e 94 ff 2b call 0x57fe ; 0x57fe + 21a6: 89 2b or r24, r25 + 21a8: 41 f1 breq .+80 ; 0x21fa + 21aa: 6e e4 ldi r22, 0x4E ; 78 + 21ac: 76 e0 ldi r23, 0x06 ; 6 + 21ae: ce 01 movw r24, r28 + 21b0: 0e 94 ff 2b call 0x57fe ; 0x57fe + 21b4: 89 2b or r24, r25 + 21b6: 19 f1 breq .+70 ; 0x21fe + 21b8: 6e e6 ldi r22, 0x6E ; 110 + 21ba: 76 e0 ldi r23, 0x06 ; 6 + 21bc: ce 01 movw r24, r28 + 21be: 0e 94 ff 2b call 0x57fe ; 0x57fe + 21c2: 89 2b or r24, r25 + 21c4: f1 f0 breq .+60 ; 0x2202 + 21c6: 6e e8 ldi r22, 0x8E ; 142 + 21c8: 76 e0 ldi r23, 0x06 ; 6 + 21ca: ce 01 movw r24, r28 + 21cc: 0e 94 ff 2b call 0x57fe ; 0x57fe + 21d0: 89 2b or r24, r25 + 21d2: c9 f0 breq .+50 ; 0x2206 return true; } } /* LED Func not found */ return false; - 2142: 80 e0 ldi r24, 0x00 ; 0 + 21d4: 80 e0 ldi r24, 0x00 ; 0 } - 2144: df 91 pop r29 - 2146: cf 91 pop r28 - 2148: 1f 91 pop r17 - 214a: 08 95 ret + 21d6: df 91 pop r29 + 21d8: cf 91 pop r28 + 21da: 1f 91 pop r17 + 21dc: 08 95 ret bool LEDSetFuncByName(uint8_t Mask, const char* FuncName) { uint8_t i; for (i=0; i + 21e0: 81 2f mov r24, r17 + 21e2: 48 df rcall .-368 ; 0x2074 return true; - 2152: 81 e0 ldi r24, 0x01 ; 1 + 21e4: 81 e0 ldi r24, 0x01 ; 1 } } /* LED Func not found */ return false; } - 2154: df 91 pop r29 - 2156: cf 91 pop r28 - 2158: 1f 91 pop r17 - 215a: 08 95 ret + 21e6: df 91 pop r29 + 21e8: cf 91 pop r28 + 21ea: 1f 91 pop r17 + 21ec: 08 95 ret bool LEDSetFuncByName(uint8_t Mask, const char* FuncName) { uint8_t i; for (i=0; i - 2160: 62 e0 ldi r22, 0x02 ; 2 - 2162: f5 cf rjmp .-22 ; 0x214e - 2164: 63 e0 ldi r22, 0x03 ; 3 - 2166: f3 cf rjmp .-26 ; 0x214e - 2168: 64 e0 ldi r22, 0x04 ; 4 - 216a: f1 cf rjmp .-30 ; 0x214e - 216c: 65 e0 ldi r22, 0x05 ; 5 - 216e: ef cf rjmp .-34 ; 0x214e - 2170: 66 e0 ldi r22, 0x06 ; 6 - 2172: ed cf rjmp .-38 ; 0x214e - if (strcmp_P(FuncName, LEDFuncTable[i]) == 0) { - 2174: 67 e0 ldi r22, 0x07 ; 7 - 2176: eb cf rjmp .-42 ; 0x214e + 21ee: 61 e0 ldi r22, 0x01 ; 1 + 21f0: f7 cf rjmp .-18 ; 0x21e0 + 21f2: 62 e0 ldi r22, 0x02 ; 2 + 21f4: f5 cf rjmp .-22 ; 0x21e0 + 21f6: 63 e0 ldi r22, 0x03 ; 3 + 21f8: f3 cf rjmp .-26 ; 0x21e0 + 21fa: 64 e0 ldi r22, 0x04 ; 4 + 21fc: f1 cf rjmp .-30 ; 0x21e0 + 21fe: 65 e0 ldi r22, 0x05 ; 5 + 2200: ef cf rjmp .-34 ; 0x21e0 + 2202: 66 e0 ldi r22, 0x06 ; 6 + 2204: ed cf rjmp .-38 ; 0x21e0 + 2206: 67 e0 ldi r22, 0x07 ; 7 + 2208: eb cf rjmp .-42 ; 0x21e0 -00002178 : +0000220a : uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE]; TerminalStateEnum TerminalState = TERMINAL_UNINITIALIZED; static uint8_t TerminalInitDelay = INIT_DELAY; void TerminalSendString(const char* s) { CDC_Device_SendString(&TerminalHandle, s); - 2178: bc 01 movw r22, r24 - 217a: 80 e0 ldi r24, 0x00 ; 0 - 217c: 90 e2 ldi r25, 0x20 ; 32 - 217e: 0c 94 6c 2b jmp 0x56d8 ; 0x56d8 + 220a: bc 01 movw r22, r24 + 220c: 81 e0 ldi r24, 0x01 ; 1 + 220e: 90 e2 ldi r25, 0x20 ; 32 + 2210: 0c 94 a6 29 jmp 0x534c ; 0x534c -00002182 : +00002214 : } void TerminalSendStringP(const char* s) { - 2182: cf 93 push r28 - 2184: df 93 push r29 + 2214: cf 93 push r28 + 2216: df 93 push r29 char c; while( (c = pgm_read_byte(s++)) != '\0' ) { - 2186: ec 01 movw r28, r24 - 2188: 21 96 adiw r28, 0x01 ; 1 - 218a: fc 01 movw r30, r24 - 218c: 64 91 lpm r22, Z - 218e: 66 23 and r22, r22 - 2190: 49 f0 breq .+18 ; 0x21a4 + 2218: ec 01 movw r28, r24 + 221a: 21 96 adiw r28, 0x01 ; 1 + 221c: fc 01 movw r30, r24 + 221e: 64 91 lpm r22, Z + 2220: 66 23 and r22, r22 + 2222: 49 f0 breq .+18 ; 0x2236 void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } - 2192: 80 e0 ldi r24, 0x00 ; 0 - 2194: 90 e2 ldi r25, 0x20 ; 32 - 2196: 0e 94 bf 2b call 0x577e ; 0x577e - 219a: fe 01 movw r30, r28 - 219c: 21 96 adiw r28, 0x01 ; 1 - 219e: 64 91 lpm r22, Z - 21a0: 61 11 cpse r22, r1 - 21a2: f7 cf rjmp .-18 ; 0x2192 + 2224: 81 e0 ldi r24, 0x01 ; 1 + 2226: 90 e2 ldi r25, 0x20 ; 32 + 2228: 0e 94 f5 29 call 0x53ea ; 0x53ea + 222c: fe 01 movw r30, r28 + 222e: 64 91 lpm r22, Z + 2230: 21 96 adiw r28, 0x01 ; 1 + 2232: 61 11 cpse r22, r1 + 2234: f7 cf rjmp .-18 ; 0x2224 TerminalSendChar(c); } } - 21a4: df 91 pop r29 - 21a6: cf 91 pop r28 - 21a8: 08 95 ret + 2236: df 91 pop r29 + 2238: cf 91 pop r28 + 223a: 08 95 ret -000021aa : +0000223c : #endif void TerminalSendBlock(void* Buffer, uint16_t ByteCount) { - 21aa: ab 01 movw r20, r22 + 223c: ab 01 movw r20, r22 CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); - 21ac: bc 01 movw r22, r24 - 21ae: 80 e0 ldi r24, 0x00 ; 0 - 21b0: 90 e2 ldi r25, 0x20 ; 32 - 21b2: 0c 94 95 2b jmp 0x572a ; 0x572a + 223e: bc 01 movw r22, r24 + 2240: 81 e0 ldi r24, 0x01 ; 1 + 2242: 90 e2 ldi r25, 0x20 ; 32 + 2244: 0c 94 cb 29 jmp 0x5396 ; 0x5396 -000021b6 : +00002248 : } } void TerminalInit(void) { TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK; - 21b6: 80 e2 ldi r24, 0x20 ; 32 - 21b8: e0 e6 ldi r30, 0x60 ; 96 - 21ba: f6 e0 ldi r31, 0x06 ; 6 - 21bc: 82 83 std Z+2, r24 ; 0x02 - 21be: 08 95 ret + 2248: 80 e2 ldi r24, 0x20 ; 32 + 224a: e0 e6 ldi r30, 0x60 ; 96 + 224c: f6 e0 ldi r31, 0x06 ; 6 + 224e: 82 83 std Z+2, r24 ; 0x02 + 2250: 08 95 ret -000021c0 : +00002252 : } void TerminalTask(void) { - 21c0: cf 93 push r28 - 21c2: df 93 push r29 + 2252: cf 93 push r28 + 2254: df 93 push r29 if (TerminalState == TERMINAL_INITIALIZED) { - 21c4: 80 91 9a 28 lds r24, 0x289A - 21c8: 82 30 cpi r24, 0x02 ; 2 - 21ca: 19 f0 breq .+6 ; 0x21d2 + 2256: 80 91 9a 28 lds r24, 0x289A + 225a: 82 30 cpi r24, 0x02 ; 2 + 225c: 19 f0 breq .+6 ; 0x2264 CDC_Device_USBTask(&TerminalHandle); USB_USBTask(); ProcessByte(); } } - 21cc: df 91 pop r29 - 21ce: cf 91 pop r28 - 21d0: 08 95 ret + 225e: df 91 pop r29 + 2260: cf 91 pop r28 + 2262: 08 95 ret } void TerminalTask(void) { if (TerminalState == TERMINAL_INITIALIZED) { CDC_Device_USBTask(&TerminalHandle); - 21d2: 80 e0 ldi r24, 0x00 ; 0 - 21d4: 90 e2 ldi r25, 0x20 ; 32 - 21d6: 0e 94 3e 2c call 0x587c ; 0x587c + 2264: 81 e0 ldi r24, 0x01 ; 1 + 2266: 90 e2 ldi r25, 0x20 ; 32 + 2268: 0e 94 68 2a call 0x54d0 ; 0x54d0 USB_USBTask(); - 21da: 0e 94 3f 26 call 0x4c7e ; 0x4c7e + 226c: 0e 94 8b 24 call 0x4916 ; 0x4916 CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); } static void ProcessByte(void) { int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle); - 21de: 80 e0 ldi r24, 0x00 ; 0 - 21e0: 90 e2 ldi r25, 0x20 ; 32 - 21e2: 0e 94 59 2c call 0x58b2 ; 0x58b2 - 21e6: ec 01 movw r28, r24 + 2270: 81 e0 ldi r24, 0x01 ; 1 + 2272: 90 e2 ldi r25, 0x20 ; 32 + 2274: 0e 94 83 2a call 0x5506 ; 0x5506 + 2278: ec 01 movw r28, r24 if (Byte >= 0) { - 21e8: 97 fd sbrc r25, 7 - 21ea: f0 cf rjmp .-32 ; 0x21cc + 227a: 97 fd sbrc r25, 7 + 227c: f0 cf rjmp .-32 ; 0x225e /* Byte received */ LEDTrigger(LED_TERMINAL_RXTX, LED_PULSE); - 21ec: 63 e1 ldi r22, 0x13 ; 19 - 21ee: 82 e0 ldi r24, 0x02 ; 2 - 21f0: b6 de rcall .-660 ; 0x1f5e + 227e: 63 e1 ldi r22, 0x13 ; 19 + 2280: 82 e0 ldi r24, 0x02 ; 2 + 2282: af de rcall .-674 ; 0x1fe2 if (XModemProcessByte(Byte)) { - 21f2: 8c 2f mov r24, r28 - 21f4: 15 d3 rcall .+1578 ; 0x2820 - 21f6: 81 11 cpse r24, r1 - 21f8: e9 cf rjmp .-46 ; 0x21cc + 2284: 8c 2f mov r24, r28 + 2286: 06 d3 rcall .+1548 ; 0x2894 + 2288: 81 11 cpse r24, r1 + 228a: e9 cf rjmp .-46 ; 0x225e /* XModem handled the byte */ } else if (CommandLineProcessByte(Byte)) { - 21fa: 8c 2f mov r24, r28 + 228c: 8c 2f mov r24, r28 CDC_Device_USBTask(&TerminalHandle); USB_USBTask(); ProcessByte(); } } - 21fc: df 91 pop r29 - 21fe: cf 91 pop r28 + 228e: df 91 pop r29 + 2290: cf 91 pop r28 /* Byte received */ LEDTrigger(LED_TERMINAL_RXTX, LED_PULSE); if (XModemProcessByte(Byte)) { /* XModem handled the byte */ } else if (CommandLineProcessByte(Byte)) { - 2200: 95 c4 rjmp .+2346 ; 0x2b2c + 2292: a5 c4 rjmp .+2378 ; 0x2bde -00002202 : +00002294 : } } static void SenseVBus(void) { switch(TerminalState) { - 2202: 80 91 9a 28 lds r24, 0x289A - 2206: 81 30 cpi r24, 0x01 ; 1 - 2208: 09 f1 breq .+66 ; 0x224c - 220a: 38 f0 brcs .+14 ; 0x221a - 220c: 82 30 cpi r24, 0x02 ; 2 - 220e: 71 f1 breq .+92 ; 0x226c - 2210: 83 30 cpi r24, 0x03 ; 3 - 2212: 71 f0 breq .+28 ; 0x2230 - -void TerminalTick(void) -{ - SenseVBus(); - - if (TerminalState == TERMINAL_INITIALIZED) { - 2214: 82 30 cpi r24, 0x02 ; 2 - 2216: 41 f1 breq .+80 ; 0x2268 - 2218: 08 95 ret - -static void SenseVBus(void) -{ - switch(TerminalState) { - case TERMINAL_UNINITIALIZED: - if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { - 221a: 80 91 68 06 lds r24, 0x0668 - 221e: 85 ff sbrs r24, 5 - 2220: fb cf rjmp .-10 ; 0x2218 - /* Not initialized and VBUS sense high */ - TerminalInitDelay = INIT_DELAY; - 2222: 84 e1 ldi r24, 0x14 ; 20 - 2224: 80 93 1b 20 sts 0x201B, r24 - TerminalState = TERMINAL_INITIALIZING; - 2228: 81 e0 ldi r24, 0x01 ; 1 - 222a: 80 93 9a 28 sts 0x289A, r24 - 222e: 08 95 ret + 2294: 80 91 9a 28 lds r24, 0x289A + 2298: 81 30 cpi r24, 0x01 ; 1 + 229a: 39 f1 breq .+78 ; 0x22ea + 229c: d8 f0 brcs .+54 ; 0x22d4 + 229e: 82 30 cpi r24, 0x02 ; 2 + 22a0: 51 f0 breq .+20 ; 0x22b6 + 22a2: 83 30 cpi r24, 0x03 ; 3 + 22a4: 99 f4 brne .+38 ; 0x22cc TerminalState = TERMINAL_UNITIALIZING; } break; case TERMINAL_UNITIALIZING: if (--TerminalInitDelay == 0) { - 2230: 80 91 1b 20 lds r24, 0x201B - 2234: 81 50 subi r24, 0x01 ; 1 - 2236: 80 93 1b 20 sts 0x201B, r24 - 223a: 81 11 cpse r24, r1 - 223c: ed cf rjmp .-38 ; 0x2218 - USB_Disable(); - 223e: 0e 94 69 2a call 0x54d2 ; 0x54d2 - SystemStopUSBClock(); - 2242: 0e 94 87 05 call 0xb0e ; 0xb0e - TerminalState = TERMINAL_UNINITIALIZED; - 2246: 10 92 9a 28 sts 0x289A, r1 - 224a: 08 95 ret - TerminalState = TERMINAL_INITIALIZING; - } - break; - - case TERMINAL_INITIALIZING: - if (--TerminalInitDelay == 0) { - 224c: 80 91 1b 20 lds r24, 0x201B - 2250: 81 50 subi r24, 0x01 ; 1 - 2252: 80 93 1b 20 sts 0x201B, r24 - 2256: 81 11 cpse r24, r1 - 2258: df cf rjmp .-66 ; 0x2218 - SystemStartUSBClock(); - 225a: 0e 94 69 05 call 0xad2 ; 0xad2 - USB_Init(); - 225e: 0e 94 a4 2a call 0x5548 ; 0x5548 - TerminalState = TERMINAL_INITIALIZED; - 2262: 82 e0 ldi r24, 0x02 ; 2 - 2264: 80 93 9a 28 sts 0x289A, r24 -void TerminalTick(void) -{ - SenseVBus(); - - if (TerminalState == TERMINAL_INITIALIZED) { - XModemTick(); - 2268: 26 d4 rcall .+2124 ; 0x2ab6 - CommandLineTick(); - 226a: 67 c5 rjmp .+2766 ; 0x2d3a + 22a6: 80 91 00 20 lds r24, 0x2000 + 22aa: 81 50 subi r24, 0x01 ; 1 + 22ac: 80 93 00 20 sts 0x2000, r24 + 22b0: 88 23 and r24, r24 + 22b2: 51 f1 breq .+84 ; 0x2308 + 22b4: 08 95 ret TerminalState = TERMINAL_INITIALIZED; } break; case TERMINAL_INITIALIZED: if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { - 226c: 80 91 68 06 lds r24, 0x0668 - 2270: 85 fd sbrc r24, 5 - 2272: fa cf rjmp .-12 ; 0x2268 + 22b6: 80 91 68 06 lds r24, 0x0668 + 22ba: 85 fd sbrc r24, 5 + 22bc: 09 c0 rjmp .+18 ; 0x22d0 /* Initialized and VBUS sense low */ TerminalInitDelay = INIT_DELAY; - 2274: 84 e1 ldi r24, 0x14 ; 20 - 2276: 80 93 1b 20 sts 0x201B, r24 + 22be: 84 e1 ldi r24, 0x14 ; 20 + 22c0: 80 93 00 20 sts 0x2000, r24 TerminalState = TERMINAL_UNITIALIZING; - 227a: 83 e0 ldi r24, 0x03 ; 3 - 227c: 80 93 9a 28 sts 0x289A, r24 - 2280: 08 95 ret + 22c4: 83 e0 ldi r24, 0x03 ; 3 + 22c6: 80 93 9a 28 sts 0x289A, r24 + 22ca: 08 95 ret -00002282 : +void TerminalTick(void) +{ + SenseVBus(); + + if (TerminalState == TERMINAL_INITIALIZED) { + 22cc: 82 30 cpi r24, 0x02 ; 2 + 22ce: 91 f7 brne .-28 ; 0x22b4 + XModemTick(); + 22d0: 4b d4 rcall .+2198 ; 0x2b68 + CommandLineTick(); + 22d2: 93 c5 rjmp .+2854 ; 0x2dfa + +static void SenseVBus(void) +{ + switch(TerminalState) { + case TERMINAL_UNINITIALIZED: + if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { + 22d4: 80 91 68 06 lds r24, 0x0668 + 22d8: 85 ff sbrs r24, 5 + 22da: ec cf rjmp .-40 ; 0x22b4 + /* Not initialized and VBUS sense high */ + TerminalInitDelay = INIT_DELAY; + 22dc: 84 e1 ldi r24, 0x14 ; 20 + 22de: 80 93 00 20 sts 0x2000, r24 + TerminalState = TERMINAL_INITIALIZING; + 22e2: 81 e0 ldi r24, 0x01 ; 1 + 22e4: 80 93 9a 28 sts 0x289A, r24 + 22e8: 08 95 ret + } + break; + + case TERMINAL_INITIALIZING: + if (--TerminalInitDelay == 0) { + 22ea: 80 91 00 20 lds r24, 0x2000 + 22ee: 81 50 subi r24, 0x01 ; 1 + 22f0: 80 93 00 20 sts 0x2000, r24 + 22f4: 81 11 cpse r24, r1 + 22f6: de cf rjmp .-68 ; 0x22b4 + SystemStartUSBClock(); + 22f8: 0e 94 e1 05 call 0xbc2 ; 0xbc2 + USB_Init(); + 22fc: 0e 94 df 28 call 0x51be ; 0x51be + TerminalState = TERMINAL_INITIALIZED; + 2300: 82 e0 ldi r24, 0x02 ; 2 + 2302: 80 93 9a 28 sts 0x289A, r24 + 2306: e4 cf rjmp .-56 ; 0x22d0 + } + break; + + case TERMINAL_UNITIALIZING: + if (--TerminalInitDelay == 0) { + USB_Disable(); + 2308: 0e 94 a4 28 call 0x5148 ; 0x5148 + SystemStopUSBClock(); + 230c: 0e 94 ff 05 call 0xbfe ; 0xbfe + TerminalState = TERMINAL_UNINITIALIZED; + 2310: 10 92 9a 28 sts 0x289A, r1 + 2314: 08 95 ret + +00002316 : } /** Event handler for the library USB Connection event. */ void EVENT_USB_Device_Connect(void) { LEDTrigger(LED_TERMINAL_CONN, LED_ON); - 2282: 61 e1 ldi r22, 0x11 ; 17 - 2284: 81 e0 ldi r24, 0x01 ; 1 - 2286: 6b ce rjmp .-810 ; 0x1f5e + 2316: 61 e1 ldi r22, 0x11 ; 17 + 2318: 81 e0 ldi r24, 0x01 ; 1 + 231a: 63 ce rjmp .-826 ; 0x1fe2 -00002288 : +0000231c : } /** Event handler for the library USB Disconnection event. */ void EVENT_USB_Device_Disconnect(void) { LEDTrigger(LED_TERMINAL_CONN, LED_OFF); - 2288: 60 e1 ldi r22, 0x10 ; 16 - 228a: 81 e0 ldi r24, 0x01 ; 1 - 228c: 68 ce rjmp .-816 ; 0x1f5e + 231c: 60 e1 ldi r22, 0x10 ; 16 + 231e: 81 e0 ldi r24, 0x01 ; 1 + 2320: 60 ce rjmp .-832 ; 0x1fe2 -0000228e : +00002322 : /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { CDC_Device_ConfigureEndpoints(&TerminalHandle); - 228e: 80 e0 ldi r24, 0x00 ; 0 - 2290: 90 e2 ldi r25, 0x20 ; 32 - 2292: 0c 94 47 2b jmp 0x568e ; 0x568e + 2322: 81 e0 ldi r24, 0x01 ; 1 + 2324: 90 e2 ldi r25, 0x20 ; 32 + 2326: 0c 94 81 29 jmp 0x5302 ; 0x5302 -00002296 : +0000232a : } /** Event handler for the library USB Control Request reception event. */ void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&TerminalHandle); - 2296: 80 e0 ldi r24, 0x00 ; 0 - 2298: 90 e2 ldi r25, 0x20 ; 32 - 229a: 0c 94 b9 2c jmp 0x5972 ; 0x5972 + 232a: 81 e0 ldi r24, 0x01 ; 1 + 232c: 90 e2 ldi r25, 0x20 ; 32 + 232e: 0c 94 e0 2a jmp 0x55c0 ; 0x55c0 -0000229e : +00002332 : extern const PROGMEM CommandEntryType CommandTable[]; CommandStatusIdType CommandGetVersion(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR( - 229e: 2f ef ldi r18, 0xFF ; 255 - 22a0: 35 e0 ldi r19, 0x05 ; 5 - 22a2: 3f 93 push r19 - 22a4: 2f 93 push r18 - 22a6: 28 ef ldi r18, 0xF8 ; 248 - 22a8: 35 e0 ldi r19, 0x05 ; 5 - 22aa: 3f 93 push r19 - 22ac: 2f 93 push r18 - 22ae: 21 ef ldi r18, 0xF1 ; 241 - 22b0: 35 e0 ldi r19, 0x05 ; 5 - 22b2: 3f 93 push r19 - 22b4: 2f 93 push r18 - 22b6: 28 eb ldi r18, 0xB8 ; 184 - 22b8: 35 e0 ldi r19, 0x05 ; 5 - 22ba: 3f 93 push r19 - 22bc: 2f 93 push r18 - 22be: 21 e0 ldi r18, 0x01 ; 1 - 22c0: 2f 93 push r18 - 22c2: 1f 92 push r1 - 22c4: 9f 93 push r25 - 22c6: 8f 93 push r24 - 22c8: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 2332: 21 e3 ldi r18, 0x31 ; 49 + 2334: 37 e0 ldi r19, 0x07 ; 7 + 2336: 3f 93 push r19 + 2338: 2f 93 push r18 + 233a: 2a e2 ldi r18, 0x2A ; 42 + 233c: 37 e0 ldi r19, 0x07 ; 7 + 233e: 3f 93 push r19 + 2340: 2f 93 push r18 + 2342: 23 e2 ldi r18, 0x23 ; 35 + 2344: 37 e0 ldi r19, 0x07 ; 7 + 2346: 3f 93 push r19 + 2348: 2f 93 push r18 + 234a: 2a ee ldi r18, 0xEA ; 234 + 234c: 36 e0 ldi r19, 0x06 ; 6 + 234e: 3f 93 push r19 + 2350: 2f 93 push r18 + 2352: 21 e0 ldi r18, 0x01 ; 1 + 2354: 2f 93 push r18 + 2356: 1f 92 push r1 + 2358: 9f 93 push r25 + 235a: 8f 93 push r24 + 235c: 0e 94 37 2c call 0x586e ; 0x586e "Chameleon-Mini %S using LUFA %S compiled with AVR-GCC %S" ), PSTR(CHAMELEON_MINI_VERSION_STRING), PSTR(LUFA_VERSION_STRING), PSTR(__VERSION__) ); return COMMAND_INFO_OK_WITH_TEXT_ID; - 22cc: 8d b7 in r24, 0x3d ; 61 - 22ce: 9e b7 in r25, 0x3e ; 62 - 22d0: 0c 96 adiw r24, 0x0c ; 12 - 22d2: 8d bf out 0x3d, r24 ; 61 - 22d4: 9e bf out 0x3e, r25 ; 62 + 2360: 8d b7 in r24, 0x3d ; 61 + 2362: 9e b7 in r25, 0x3e ; 62 + 2364: 0c 96 adiw r24, 0x0c ; 12 + 2366: 8d bf out 0x3d, r24 ; 61 + 2368: 9e bf out 0x3e, r25 ; 62 } - 22d6: 85 e6 ldi r24, 0x65 ; 101 - 22d8: 08 95 ret + 236a: 85 e6 ldi r24, 0x65 ; 101 + 236c: 08 95 ret -000022da : +0000236e : CommandStatusIdType CommandGetConfig(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 22da: 23 ee ldi r18, 0xE3 ; 227 - 22dc: 38 e2 ldi r19, 0x28 ; 40 - 22de: 3f 93 push r19 - 22e0: 2f 93 push r18 - 22e2: 25 e0 ldi r18, 0x05 ; 5 - 22e4: 36 e0 ldi r19, 0x06 ; 6 - 22e6: 3f 93 push r19 - 22e8: 2f 93 push r18 - 22ea: 21 e0 ldi r18, 0x01 ; 1 - 22ec: 2f 93 push r18 - 22ee: 1f 92 push r1 - 22f0: 9f 93 push r25 - 22f2: 8f 93 push r24 - 22f4: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 236e: 23 ee ldi r18, 0xE3 ; 227 + 2370: 38 e2 ldi r19, 0x28 ; 40 + 2372: 3f 93 push r19 + 2374: 2f 93 push r18 + 2376: 27 ee ldi r18, 0xE7 ; 231 + 2378: 36 e0 ldi r19, 0x06 ; 6 + 237a: 3f 93 push r19 + 237c: 2f 93 push r18 + 237e: 21 e0 ldi r18, 0x01 ; 1 + 2380: 2f 93 push r18 + 2382: 1f 92 push r1 + 2384: 9f 93 push r25 + 2386: 8f 93 push r24 + 2388: 0e 94 37 2c call 0x586e ; 0x586e PSTR("%s"), ActiveConfiguration.ConfigurationName); return COMMAND_INFO_OK_WITH_TEXT_ID; - 22f8: 8d b7 in r24, 0x3d ; 61 - 22fa: 9e b7 in r25, 0x3e ; 62 - 22fc: 08 96 adiw r24, 0x08 ; 8 - 22fe: 8d bf out 0x3d, r24 ; 61 - 2300: 9e bf out 0x3e, r25 ; 62 + 238c: 8d b7 in r24, 0x3d ; 61 + 238e: 9e b7 in r25, 0x3e ; 62 + 2390: 08 96 adiw r24, 0x08 ; 8 + 2392: 8d bf out 0x3d, r24 ; 61 + 2394: 9e bf out 0x3e, r25 ; 62 } - 2302: 85 e6 ldi r24, 0x65 ; 101 - 2304: 08 95 ret + 2396: 85 e6 ldi r24, 0x65 ; 101 + 2398: 08 95 ret -00002306 : +0000239a : CommandStatusIdType CommandSetConfig(const char* InParam) { if (ConfigurationSetByName(InParam)) { - 2306: 0e 94 cb 05 call 0xb96 ; 0xb96 - 230a: 81 11 cpse r24, r1 - 230c: 02 c0 rjmp .+4 ; 0x2312 + 239a: 0e 94 43 06 call 0xc86 ; 0xc86 + 239e: 81 11 cpse r24, r1 + 23a0: 02 c0 rjmp .+4 ; 0x23a6 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 230e: 8a ec ldi r24, 0xCA ; 202 + 23a2: 8a ec ldi r24, 0xCA ; 202 } } - 2310: 08 95 ret + 23a4: 08 95 ret } CommandStatusIdType CommandSetConfig(const char* InParam) { if (ConfigurationSetByName(InParam)) { SettingsSave(); - 2312: b2 dc rcall .-1692 ; 0x1c78 + 23a6: bd dc rcall .-1670 ; 0x1d22 return COMMAND_INFO_OK_ID; - 2314: 84 e6 ldi r24, 0x64 ; 100 - 2316: 08 95 ret + 23a8: 84 e6 ldi r24, 0x64 ; 100 + 23aa: 08 95 ret -00002318 : +000023ac : } } CommandStatusIdType CommandExecConfig(char* OutMessage) { ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); - 2318: 60 e0 ldi r22, 0x00 ; 0 - 231a: 71 e0 ldi r23, 0x01 ; 1 - 231c: 0e 94 0c 06 call 0xc18 ; 0xc18 + 23ac: 60 e0 ldi r22, 0x00 ; 0 + 23ae: 71 e0 ldi r23, 0x01 ; 1 + 23b0: 0e 94 80 06 call 0xd00 ; 0xd00 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2320: 85 e6 ldi r24, 0x65 ; 101 - 2322: 08 95 ret + 23b4: 85 e6 ldi r24, 0x65 ; 101 + 23b6: 08 95 ret -00002324 : +000023b8 : CommandStatusIdType CommandGetUid(char* OutParam) { - 2324: 0f 93 push r16 - 2326: 1f 93 push r17 - 2328: cf 93 push r28 - 232a: df 93 push r29 - 232c: cd b7 in r28, 0x3d ; 61 - 232e: de b7 in r29, 0x3e ; 62 - 2330: a1 97 sbiw r28, 0x21 ; 33 - 2332: cd bf out 0x3d, r28 ; 61 - 2334: de bf out 0x3e, r29 ; 62 - 2336: 8c 01 movw r16, r24 + 23b8: ef 92 push r14 + 23ba: ff 92 push r15 + 23bc: 0f 93 push r16 + 23be: 1f 93 push r17 + 23c0: cf 93 push r28 + 23c2: df 93 push r29 + 23c4: cd b7 in r28, 0x3d ; 61 + 23c6: de b7 in r29, 0x3e ; 62 + 23c8: a0 97 sbiw r28, 0x20 ; 32 + 23ca: cd bf out 0x3d, r28 ; 61 + 23cc: de bf out 0x3e, r29 ; 62 + 23ce: 8c 01 movw r16, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; - 2338: 20 91 05 29 lds r18, 0x2905 + 23d0: e0 90 05 29 lds r14, 0x2905 + 23d4: f1 2c mov r15, r1 ActiveConfiguration.ApplicationResetFunc(); //LogEntry(LOG_INFO_APP_RESET, NULL, 0); } INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); - 233c: e0 91 ff 28 lds r30, 0x28FF - 2340: f0 91 00 29 lds r31, 0x2900 - 2344: ce 01 movw r24, r28 - 2346: 01 96 adiw r24, 0x01 ; 1 - 2348: 29 a3 std Y+33, r18 ; 0x21 - 234a: 09 95 icall + 23d6: e0 91 ff 28 lds r30, 0x28FF + 23da: f0 91 00 29 lds r31, 0x2900 + 23de: ce 01 movw r24, r28 + 23e0: 01 96 adiw r24, 0x01 ; 1 + 23e2: 09 95 icall ApplicationGetUid(UidBuffer); BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE, - 234c: 29 a1 ldd r18, Y+33 ; 0x21 - 234e: 30 e0 ldi r19, 0x00 ; 0 - 2350: ae 01 movw r20, r28 - 2352: 4f 5f subi r20, 0xFF ; 255 - 2354: 5f 4f sbci r21, 0xFF ; 255 - 2356: 60 e0 ldi r22, 0x00 ; 0 - 2358: 71 e0 ldi r23, 0x01 ; 1 - 235a: c8 01 movw r24, r16 - 235c: 0e 94 56 06 call 0xcac ; 0xcac + 23e4: 97 01 movw r18, r14 + 23e6: ae 01 movw r20, r28 + 23e8: 4f 5f subi r20, 0xFF ; 255 + 23ea: 5f 4f sbci r21, 0xFF ; 255 + 23ec: 60 e0 ldi r22, 0x00 ; 0 + 23ee: 71 e0 ldi r23, 0x01 ; 1 + 23f0: c8 01 movw r24, r16 + 23f2: 0e 94 d5 06 call 0xdaa ; 0xdaa UidBuffer, UidSize); return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2360: 85 e6 ldi r24, 0x65 ; 101 - 2362: a1 96 adiw r28, 0x21 ; 33 - 2364: cd bf out 0x3d, r28 ; 61 - 2366: de bf out 0x3e, r29 ; 62 - 2368: df 91 pop r29 - 236a: cf 91 pop r28 - 236c: 1f 91 pop r17 - 236e: 0f 91 pop r16 - 2370: 08 95 ret + 23f6: 85 e6 ldi r24, 0x65 ; 101 + 23f8: a0 96 adiw r28, 0x20 ; 32 + 23fa: cd bf out 0x3d, r28 ; 61 + 23fc: de bf out 0x3e, r29 ; 62 + 23fe: df 91 pop r29 + 2400: cf 91 pop r28 + 2402: 1f 91 pop r17 + 2404: 0f 91 pop r16 + 2406: ff 90 pop r15 + 2408: ef 90 pop r14 + 240a: 08 95 ret -00002372 : +0000240c : CommandStatusIdType CommandSetUid(const char* InParam) { - 2372: bf 92 push r11 - 2374: cf 92 push r12 - 2376: df 92 push r13 - 2378: ef 92 push r14 - 237a: ff 92 push r15 - 237c: 0f 93 push r16 - 237e: 1f 93 push r17 - 2380: cf 93 push r28 - 2382: df 93 push r29 - 2384: cd b7 in r28, 0x3d ; 61 - 2386: de b7 in r29, 0x3e ; 62 - 2388: a0 97 sbiw r28, 0x20 ; 32 - 238a: cd bf out 0x3d, r28 ; 61 - 238c: de bf out 0x3e, r29 ; 62 - 238e: 8c 01 movw r16, r24 + 240c: bf 92 push r11 + 240e: cf 92 push r12 + 2410: df 92 push r13 + 2412: ef 92 push r14 + 2414: ff 92 push r15 + 2416: 0f 93 push r16 + 2418: 1f 93 push r17 + 241a: cf 93 push r28 + 241c: df 93 push r29 + 241e: cd b7 in r28, 0x3d ; 61 + 2420: de b7 in r29, 0x3e ; 62 + 2422: a0 97 sbiw r28, 0x20 ; 32 + 2424: cd bf out 0x3d, r28 ; 61 + 2426: de bf out 0x3e, r29 ; 62 + 2428: 8c 01 movw r16, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; - 2390: c0 90 05 29 lds r12, 0x2905 - 2394: d1 2c mov r13, r1 + 242a: c0 90 05 29 lds r12, 0x2905 + 242e: d1 2c mov r13, r1 if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { - 2396: 68 e0 ldi r22, 0x08 ; 8 - 2398: 76 e0 ldi r23, 0x06 ; 6 - 239a: 0e 94 d5 2d call 0x5baa ; 0x5baa - 239e: 89 2b or r24, r25 - 23a0: 59 f5 brne .+86 ; 0x23f8 + 2430: 60 ee ldi r22, 0xE0 ; 224 + 2432: 76 e0 ldi r23, 0x06 ; 6 + 2434: 0e 94 ff 2b call 0x57fe ; 0x57fe + 2438: 89 2b or r24, r25 + 243a: 49 f5 brne .+82 ; 0x248e /* Load with random bytes */ for (uint8_t i=0; i - 23a8: b1 2c mov r11, r1 - 23aa: ee 24 eor r14, r14 - 23ac: e3 94 inc r14 - 23ae: f1 2c mov r15, r1 - 23b0: ec 0e add r14, r28 - 23b2: fd 1e adc r15, r29 - 23b4: 00 e0 ldi r16, 0x00 ; 0 - 23b6: 10 e0 ldi r17, 0x00 ; 0 + 243c: c1 14 cp r12, r1 + 243e: d1 04 cpc r13, r1 + 2440: 99 f1 breq .+102 ; 0x24a8 + 2442: b1 2c mov r11, r1 + 2444: ce 01 movw r24, r28 + 2446: 01 96 adiw r24, 0x01 ; 1 + 2448: 7c 01 movw r14, r24 + 244a: 00 e0 ldi r16, 0x00 ; 0 + 244c: 10 e0 ldi r17, 0x00 ; 0 UidBuffer[i] = RandomGetByte(); - 23b8: 0e 94 3c 06 call 0xc78 ; 0xc78 - 23bc: f7 01 movw r30, r14 - 23be: e0 0f add r30, r16 - 23c0: f1 1f adc r31, r17 - 23c2: 80 83 st Z, r24 + 244e: 0e 94 ba 06 call 0xd74 ; 0xd74 + 2452: f7 01 movw r30, r14 + 2454: e0 0f add r30, r16 + 2456: f1 1f adc r31, r17 + 2458: 80 83 st Z, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { /* Load with random bytes */ for (uint8_t i=0; i + 245a: b3 94 inc r11 + 245c: 0b 2d mov r16, r11 + 245e: 10 e0 ldi r17, 0x00 ; 0 + 2460: 0c 15 cp r16, r12 + 2462: 1d 05 cpc r17, r13 + 2464: a0 f3 brcs .-24 ; 0x244e } INLINE void ApplicationSetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationSetUidFunc(Uid); - 23d0: e0 91 01 29 lds r30, 0x2901 - 23d4: f0 91 02 29 lds r31, 0x2902 - 23d8: c7 01 movw r24, r14 - 23da: 09 95 icall + 2466: e0 91 01 29 lds r30, 0x2901 + 246a: f0 91 02 29 lds r31, 0x2902 + 246e: c7 01 movw r24, r14 + 2470: 09 95 icall } } ApplicationSetUid(UidBuffer); return COMMAND_INFO_OK_ID; - 23dc: 84 e6 ldi r24, 0x64 ; 100 + 2472: 84 e6 ldi r24, 0x64 ; 100 } - 23de: a0 96 adiw r28, 0x20 ; 32 - 23e0: cd bf out 0x3d, r28 ; 61 - 23e2: de bf out 0x3e, r29 ; 62 - 23e4: df 91 pop r29 - 23e6: cf 91 pop r28 - 23e8: 1f 91 pop r17 - 23ea: 0f 91 pop r16 - 23ec: ff 90 pop r15 - 23ee: ef 90 pop r14 - 23f0: df 90 pop r13 - 23f2: cf 90 pop r12 - 23f4: bf 90 pop r11 - 23f6: 08 95 ret + 2474: a0 96 adiw r28, 0x20 ; 32 + 2476: cd bf out 0x3d, r28 ; 61 + 2478: de bf out 0x3e, r29 ; 62 + 247a: df 91 pop r29 + 247c: cf 91 pop r28 + 247e: 1f 91 pop r17 + 2480: 0f 91 pop r16 + 2482: ff 90 pop r15 + 2484: ef 90 pop r14 + 2486: df 90 pop r13 + 2488: cf 90 pop r12 + 248a: bf 90 pop r11 + 248c: 08 95 ret for (uint8_t i=0; i - 240e: 8c 15 cp r24, r12 - 2410: 9d 05 cpc r25, r13 - 2412: f1 f2 breq .-68 ; 0x23d0 + 248e: a8 01 movw r20, r16 + 2490: 60 e2 ldi r22, 0x20 ; 32 + 2492: 70 e0 ldi r23, 0x00 ; 0 + 2494: ce 01 movw r24, r28 + 2496: 01 96 adiw r24, 0x01 ; 1 + 2498: 7c 01 movw r14, r24 + 249a: 0e 94 18 07 call 0xe30 ; 0xe30 + 249e: 8c 15 cp r24, r12 + 24a0: 9d 05 cpc r25, r13 + 24a2: 09 f3 breq .-62 ; 0x2466 /* Malformed input. Abort */ return COMMAND_ERR_INVALID_PARAM_ID; - 2414: 8a ec ldi r24, 0xCA ; 202 - 2416: e3 cf rjmp .-58 ; 0x23de - 2418: ee 24 eor r14, r14 - 241a: e3 94 inc r14 - 241c: f1 2c mov r15, r1 - 241e: ec 0e add r14, r28 - 2420: fd 1e adc r15, r29 - 2422: d6 cf rjmp .-84 ; 0x23d0 + 24a4: 8a ec ldi r24, 0xCA ; 202 + 24a6: e6 cf rjmp .-52 ; 0x2474 + 24a8: ce 01 movw r24, r28 + 24aa: 01 96 adiw r24, 0x01 ; 1 + 24ac: 7c 01 movw r14, r24 + 24ae: db cf rjmp .-74 ; 0x2466 -00002424 : +000024b0 : return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetReadOnly(char* OutParam) { if (ActiveConfiguration.ReadOnly) { - 2424: 20 91 06 29 lds r18, 0x2906 - 2428: 21 11 cpse r18, r1 - 242a: 07 c0 rjmp .+14 ; 0x243a + 24b0: 20 91 06 29 lds r18, 0x2906 + 24b4: 21 11 cpse r18, r1 + 24b6: 07 c0 rjmp .+14 ; 0x24c6 OutParam[0] = COMMAND_CHAR_TRUE; } else { OutParam[0] = COMMAND_CHAR_FALSE; - 242c: 20 e3 ldi r18, 0x30 ; 48 - 242e: fc 01 movw r30, r24 - 2430: 20 83 st Z, r18 + 24b8: 20 e3 ldi r18, 0x30 ; 48 + 24ba: fc 01 movw r30, r24 + 24bc: 20 83 st Z, r18 } OutParam[1] = '\0'; - 2432: fc 01 movw r30, r24 - 2434: 11 82 std Z+1, r1 ; 0x01 + 24be: fc 01 movw r30, r24 + 24c0: 11 82 std Z+1, r1 ; 0x01 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2436: 85 e6 ldi r24, 0x65 ; 101 - 2438: 08 95 ret + 24c2: 85 e6 ldi r24, 0x65 ; 101 + 24c4: 08 95 ret } CommandStatusIdType CommandGetReadOnly(char* OutParam) { if (ActiveConfiguration.ReadOnly) { OutParam[0] = COMMAND_CHAR_TRUE; - 243a: 21 e3 ldi r18, 0x31 ; 49 - 243c: fc 01 movw r30, r24 - 243e: 20 83 st Z, r18 + 24c6: 21 e3 ldi r18, 0x31 ; 49 + 24c8: fc 01 movw r30, r24 + 24ca: 20 83 st Z, r18 } else { OutParam[0] = COMMAND_CHAR_FALSE; } OutParam[1] = '\0'; - 2440: fc 01 movw r30, r24 - 2442: 11 82 std Z+1, r1 ; 0x01 + 24cc: fc 01 movw r30, r24 + 24ce: 11 82 std Z+1, r1 ; 0x01 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2444: 85 e6 ldi r24, 0x65 ; 101 - 2446: 08 95 ret + 24d0: 85 e6 ldi r24, 0x65 ; 101 + 24d2: 08 95 ret -00002448 : +000024d4 : CommandStatusIdType CommandSetReadOnly(const char* InParam) { if (InParam[1] == '\0') { - 2448: fc 01 movw r30, r24 - 244a: 21 81 ldd r18, Z+1 ; 0x01 - 244c: 21 11 cpse r18, r1 - 244e: 05 c0 rjmp .+10 ; 0x245a + 24d4: fc 01 movw r30, r24 + 24d6: 21 81 ldd r18, Z+1 ; 0x01 + 24d8: 21 11 cpse r18, r1 + 24da: 05 c0 rjmp .+10 ; 0x24e6 if (InParam[0] == COMMAND_CHAR_TRUE) { - 2450: 80 81 ld r24, Z - 2452: 81 33 cpi r24, 0x31 ; 49 - 2454: 41 f0 breq .+16 ; 0x2466 + 24dc: 80 81 ld r24, Z + 24de: 81 33 cpi r24, 0x31 ; 49 + 24e0: 41 f0 breq .+16 ; 0x24f2 ActiveConfiguration.ReadOnly = true; return COMMAND_INFO_OK_ID; } else if (InParam[0] == COMMAND_CHAR_FALSE) { - 2456: 80 33 cpi r24, 0x30 ; 48 - 2458: 11 f0 breq .+4 ; 0x245e + 24e2: 80 33 cpi r24, 0x30 ; 48 + 24e4: 11 f0 breq .+4 ; 0x24ea ActiveConfiguration.ReadOnly = false; return COMMAND_INFO_OK_ID; } } return COMMAND_ERR_INVALID_PARAM_ID; - 245a: 8a ec ldi r24, 0xCA ; 202 + 24e6: 8a ec ldi r24, 0xCA ; 202 } - 245c: 08 95 ret + 24e8: 08 95 ret if (InParam[1] == '\0') { if (InParam[0] == COMMAND_CHAR_TRUE) { ActiveConfiguration.ReadOnly = true; return COMMAND_INFO_OK_ID; } else if (InParam[0] == COMMAND_CHAR_FALSE) { ActiveConfiguration.ReadOnly = false; - 245e: 10 92 06 29 sts 0x2906, r1 + 24ea: 10 92 06 29 sts 0x2906, r1 return COMMAND_INFO_OK_ID; - 2462: 84 e6 ldi r24, 0x64 ; 100 - 2464: 08 95 ret + 24ee: 84 e6 ldi r24, 0x64 ; 100 + 24f0: 08 95 ret CommandStatusIdType CommandSetReadOnly(const char* InParam) { if (InParam[1] == '\0') { if (InParam[0] == COMMAND_CHAR_TRUE) { ActiveConfiguration.ReadOnly = true; - 2466: 81 e0 ldi r24, 0x01 ; 1 - 2468: 80 93 06 29 sts 0x2906, r24 + 24f2: 81 e0 ldi r24, 0x01 ; 1 + 24f4: 80 93 06 29 sts 0x2906, r24 return COMMAND_INFO_OK_ID; - 246c: 84 e6 ldi r24, 0x64 ; 100 - 246e: 08 95 ret + 24f8: 84 e6 ldi r24, 0x64 ; 100 + 24fa: 08 95 ret -00002470 : +000024fc : return COMMAND_ERR_INVALID_PARAM_ID; } CommandStatusIdType CommandExecUpload(char* OutMessage) { XModemReceive(MemoryUploadBlock); - 2470: 86 e5 ldi r24, 0x56 ; 86 - 2472: 99 e0 ldi r25, 0x09 ; 9 - 2474: a4 d1 rcall .+840 ; 0x27be + 24fc: 86 ed ldi r24, 0xD6 ; 214 + 24fe: 99 e0 ldi r25, 0x09 ; 9 + 2500: 98 d1 rcall .+816 ; 0x2832 return COMMAND_INFO_XMODEM_WAIT_ID; } - 2476: 8e e6 ldi r24, 0x6E ; 110 - 2478: 08 95 ret + 2502: 8e e6 ldi r24, 0x6E ; 110 + 2504: 08 95 ret -0000247a : +00002506 : CommandStatusIdType CommandExecDownload(char* OutMessage) { XModemSend(MemoryDownloadBlock); - 247a: 8b e1 ldi r24, 0x1B ; 27 - 247c: 9b e0 ldi r25, 0x0B ; 11 - 247e: ba d1 rcall .+884 ; 0x27f4 + 2506: 81 e7 ldi r24, 0x71 ; 113 + 2508: 9b e0 ldi r25, 0x0B ; 11 + 250a: ae d1 rcall .+860 ; 0x2868 return COMMAND_INFO_XMODEM_WAIT_ID; } - 2480: 8e e6 ldi r24, 0x6E ; 110 - 2482: 08 95 ret + 250c: 8e e6 ldi r24, 0x6E ; 110 + 250e: 08 95 ret -00002484 : +00002510 : * enumerating the device once attached until \ref USB_Attach() is called. */ static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; static inline void USB_Detach(void) { USB.CTRLB &= ~USB_ATTACH_bm; - 2484: e0 ec ldi r30, 0xC0 ; 192 - 2486: f4 e0 ldi r31, 0x04 ; 4 - 2488: 81 81 ldd r24, Z+1 ; 0x01 - 248a: 8e 7f andi r24, 0xFE ; 254 - 248c: 81 83 std Z+1, r24 ; 0x01 + 2510: e0 ec ldi r30, 0xC0 ; 192 + 2512: f4 e0 ldi r31, 0x04 ; 4 + 2514: 81 81 ldd r24, Z+1 ; 0x01 + 2516: 8e 7f andi r24, 0xFE ; 254 + 2518: 81 83 std Z+1, r24 ; 0x01 CommandStatusIdType CommandExecReset(char* OutMessage) { USB_Detach(); USB_Disable(); - 248e: 0e 94 69 2a call 0x54d2 ; 0x54d2 + 251a: 0e 94 a4 28 call 0x5148 ; 0x5148 SystemReset(); - 2492: 0e 94 5c 05 call 0xab8 ; 0xab8 + 251e: 0e 94 d4 05 call 0xba8 ; 0xba8 return COMMAND_INFO_OK_ID; } - 2496: 84 e6 ldi r24, 0x64 ; 100 - 2498: 08 95 ret + 2522: 84 e6 ldi r24, 0x64 ; 100 + 2524: 08 95 ret -0000249a : - 249a: e0 ec ldi r30, 0xC0 ; 192 - 249c: f4 e0 ldi r31, 0x04 ; 4 - 249e: 81 81 ldd r24, Z+1 ; 0x01 - 24a0: 8e 7f andi r24, 0xFE ; 254 - 24a2: 81 83 std Z+1, r24 ; 0x01 +00002526 : + 2526: e0 ec ldi r30, 0xC0 ; 192 + 2528: f4 e0 ldi r31, 0x04 ; 4 + 252a: 81 81 ldd r24, Z+1 ; 0x01 + 252c: 8e 7f andi r24, 0xFE ; 254 + 252e: 81 83 std Z+1, r24 ; 0x01 #ifdef SUPPORT_FIRMWARE_UPGRADE CommandStatusIdType CommandExecUpgrade(char* OutMessage) { USB_Detach(); USB_Disable(); - 24a4: 0e 94 69 2a call 0x54d2 ; 0x54d2 + 2530: 0e 94 a4 28 call 0x5148 ; 0x5148 SystemEnterBootloader(); - 24a8: 0e 94 63 05 call 0xac6 ; 0xac6 + 2534: 0e 94 db 05 call 0xbb6 ; 0xbb6 return COMMAND_INFO_OK_ID; } - 24ac: 84 e6 ldi r24, 0x64 ; 100 - 24ae: 08 95 ret + 2538: 84 e6 ldi r24, 0x64 ; 100 + 253a: 08 95 ret -000024b0 : +0000253c : #endif CommandStatusIdType CommandGetMemSize(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.MemorySize); - 24b0: e3 e0 ldi r30, 0x03 ; 3 - 24b2: f9 e2 ldi r31, 0x29 ; 41 - 24b4: 21 81 ldd r18, Z+1 ; 0x01 - 24b6: 2f 93 push r18 - 24b8: 20 81 ld r18, Z - 24ba: 2f 93 push r18 - 24bc: 2f e0 ldi r18, 0x0F ; 15 - 24be: 36 e0 ldi r19, 0x06 ; 6 - 24c0: 3f 93 push r19 - 24c2: 2f 93 push r18 - 24c4: 21 e0 ldi r18, 0x01 ; 1 - 24c6: 2f 93 push r18 - 24c8: 1f 92 push r1 - 24ca: 9f 93 push r25 - 24cc: 8f 93 push r24 - 24ce: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 253c: e3 e0 ldi r30, 0x03 ; 3 + 253e: f9 e2 ldi r31, 0x29 ; 41 + 2540: 21 81 ldd r18, Z+1 ; 0x01 + 2542: 2f 93 push r18 + 2544: 20 81 ld r18, Z + 2546: 2f 93 push r18 + 2548: 2d ed ldi r18, 0xDD ; 221 + 254a: 36 e0 ldi r19, 0x06 ; 6 + 254c: 3f 93 push r19 + 254e: 2f 93 push r18 + 2550: 21 e0 ldi r18, 0x01 ; 1 + 2552: 2f 93 push r18 + 2554: 1f 92 push r1 + 2556: 9f 93 push r25 + 2558: 8f 93 push r24 + 255a: 0e 94 37 2c call 0x586e ; 0x586e return COMMAND_INFO_OK_WITH_TEXT_ID; - 24d2: 8d b7 in r24, 0x3d ; 61 - 24d4: 9e b7 in r25, 0x3e ; 62 - 24d6: 08 96 adiw r24, 0x08 ; 8 - 24d8: 8d bf out 0x3d, r24 ; 61 - 24da: 9e bf out 0x3e, r25 ; 62 + 255e: 8d b7 in r24, 0x3d ; 61 + 2560: 9e b7 in r25, 0x3e ; 62 + 2562: 08 96 adiw r24, 0x08 ; 8 + 2564: 8d bf out 0x3d, r24 ; 61 + 2566: 9e bf out 0x3e, r25 ; 62 } - 24dc: 85 e6 ldi r24, 0x65 ; 101 - 24de: 08 95 ret + 2568: 85 e6 ldi r24, 0x65 ; 101 + 256a: 08 95 ret -000024e0 : +0000256c : CommandStatusIdType CommandGetUidSize(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.UidSize); - 24e0: 20 91 05 29 lds r18, 0x2905 - 24e4: 1f 92 push r1 - 24e6: 2f 93 push r18 - 24e8: 22 e1 ldi r18, 0x12 ; 18 - 24ea: 36 e0 ldi r19, 0x06 ; 6 - 24ec: 3f 93 push r19 - 24ee: 2f 93 push r18 - 24f0: 21 e0 ldi r18, 0x01 ; 1 - 24f2: 2f 93 push r18 - 24f4: 1f 92 push r1 - 24f6: 9f 93 push r25 - 24f8: 8f 93 push r24 - 24fa: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 256c: 20 91 05 29 lds r18, 0x2905 + 2570: 1f 92 push r1 + 2572: 2f 93 push r18 + 2574: 2a ed ldi r18, 0xDA ; 218 + 2576: 36 e0 ldi r19, 0x06 ; 6 + 2578: 3f 93 push r19 + 257a: 2f 93 push r18 + 257c: 21 e0 ldi r18, 0x01 ; 1 + 257e: 2f 93 push r18 + 2580: 1f 92 push r1 + 2582: 9f 93 push r25 + 2584: 8f 93 push r24 + 2586: 0e 94 37 2c call 0x586e ; 0x586e return COMMAND_INFO_OK_WITH_TEXT_ID; - 24fe: 8d b7 in r24, 0x3d ; 61 - 2500: 9e b7 in r25, 0x3e ; 62 - 2502: 08 96 adiw r24, 0x08 ; 8 - 2504: 8d bf out 0x3d, r24 ; 61 - 2506: 9e bf out 0x3e, r25 ; 62 + 258a: 8d b7 in r24, 0x3d ; 61 + 258c: 9e b7 in r25, 0x3e ; 62 + 258e: 08 96 adiw r24, 0x08 ; 8 + 2590: 8d bf out 0x3d, r24 ; 61 + 2592: 9e bf out 0x3e, r25 ; 62 } - 2508: 85 e6 ldi r24, 0x65 ; 101 - 250a: 08 95 ret + 2594: 85 e6 ldi r24, 0x65 ; 101 + 2596: 08 95 ret -0000250c : +00002598 : CommandStatusIdType CommandExecButton(char* OutMessage) { ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - 250c: 60 e0 ldi r22, 0x00 ; 0 - 250e: 71 e0 ldi r23, 0x01 ; 1 - 2510: d0 d9 rcall .-3168 ; 0x18b2 + 2598: 60 e0 ldi r22, 0x00 ; 0 + 259a: 71 e0 ldi r23, 0x01 ; 1 + 259c: d8 d9 rcall .-3152 ; 0x194e return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2512: 85 e6 ldi r24, 0x65 ; 101 - 2514: 08 95 ret + 259e: 85 e6 ldi r24, 0x65 ; 101 + 25a0: 08 95 ret -00002516 : +000025a2 : CommandStatusIdType CommandGetButton(char* OutParam) { ButtonGetActionByName(BUTTON_PRESS_SHORT, OutParam, TERMINAL_BUFFER_SIZE); - 2516: 40 e0 ldi r20, 0x00 ; 0 - 2518: 51 e0 ldi r21, 0x01 ; 1 - 251a: bc 01 movw r22, r24 - 251c: 80 e0 ldi r24, 0x00 ; 0 - 251e: 22 da rcall .-3004 ; 0x1964 + 25a2: 40 e0 ldi r20, 0x00 ; 0 + 25a4: 51 e0 ldi r21, 0x01 ; 1 + 25a6: bc 01 movw r22, r24 + 25a8: 80 e0 ldi r24, 0x00 ; 0 + 25aa: 31 da rcall .-2974 ; 0x1a0e return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2520: 85 e6 ldi r24, 0x65 ; 101 - 2522: 08 95 ret + 25ac: 85 e6 ldi r24, 0x65 ; 101 + 25ae: 08 95 ret -00002524 : +000025b0 : CommandStatusIdType CommandSetButton(const char* InParam) { if (ButtonSetActionByName(BUTTON_PRESS_SHORT, InParam)) { - 2524: bc 01 movw r22, r24 - 2526: 80 e0 ldi r24, 0x00 ; 0 - 2528: 39 da rcall .-2958 ; 0x199c - 252a: 81 11 cpse r24, r1 - 252c: 02 c0 rjmp .+4 ; 0x2532 + 25b0: bc 01 movw r22, r24 + 25b2: 80 e0 ldi r24, 0x00 ; 0 + 25b4: 48 da rcall .-2928 ; 0x1a46 + 25b6: 81 11 cpse r24, r1 + 25b8: 02 c0 rjmp .+4 ; 0x25be SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 252e: 8a ec ldi r24, 0xCA ; 202 + 25ba: 8a ec ldi r24, 0xCA ; 202 } } - 2530: 08 95 ret + 25bc: 08 95 ret } CommandStatusIdType CommandSetButton(const char* InParam) { if (ButtonSetActionByName(BUTTON_PRESS_SHORT, InParam)) { SettingsSave(); - 2532: a2 db rcall .-2236 ; 0x1c78 + 25be: b1 db rcall .-2206 ; 0x1d22 return COMMAND_INFO_OK_ID; - 2534: 84 e6 ldi r24, 0x64 ; 100 - 2536: 08 95 ret + 25c0: 84 e6 ldi r24, 0x64 ; 100 + 25c2: 08 95 ret -00002538 : +000025c4 : } } CommandStatusIdType CommandExecButtonLong(char* OutMessage) { ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - 2538: 60 e0 ldi r22, 0x00 ; 0 - 253a: 71 e0 ldi r23, 0x01 ; 1 - 253c: ba d9 rcall .-3212 ; 0x18b2 + 25c4: 60 e0 ldi r22, 0x00 ; 0 + 25c6: 71 e0 ldi r23, 0x01 ; 1 + 25c8: c2 d9 rcall .-3196 ; 0x194e return COMMAND_INFO_OK_WITH_TEXT_ID; } - 253e: 85 e6 ldi r24, 0x65 ; 101 - 2540: 08 95 ret + 25ca: 85 e6 ldi r24, 0x65 ; 101 + 25cc: 08 95 ret -00002542 : +000025ce : CommandStatusIdType CommandGetButtonLong(char* OutParam) { ButtonGetActionByName(BUTTON_PRESS_LONG, OutParam, TERMINAL_BUFFER_SIZE); - 2542: 40 e0 ldi r20, 0x00 ; 0 - 2544: 51 e0 ldi r21, 0x01 ; 1 - 2546: bc 01 movw r22, r24 - 2548: 81 e0 ldi r24, 0x01 ; 1 - 254a: 0c da rcall .-3048 ; 0x1964 + 25ce: 40 e0 ldi r20, 0x00 ; 0 + 25d0: 51 e0 ldi r21, 0x01 ; 1 + 25d2: bc 01 movw r22, r24 + 25d4: 81 e0 ldi r24, 0x01 ; 1 + 25d6: 1b da rcall .-3018 ; 0x1a0e return COMMAND_INFO_OK_WITH_TEXT_ID; } - 254c: 85 e6 ldi r24, 0x65 ; 101 - 254e: 08 95 ret + 25d8: 85 e6 ldi r24, 0x65 ; 101 + 25da: 08 95 ret -00002550 : +000025dc : CommandStatusIdType CommandSetButtonLong(const char* InParam) { if (ButtonSetActionByName(BUTTON_PRESS_LONG, InParam)) { - 2550: bc 01 movw r22, r24 - 2552: 81 e0 ldi r24, 0x01 ; 1 - 2554: 23 da rcall .-3002 ; 0x199c - 2556: 81 11 cpse r24, r1 - 2558: 02 c0 rjmp .+4 ; 0x255e + 25dc: bc 01 movw r22, r24 + 25de: 81 e0 ldi r24, 0x01 ; 1 + 25e0: 32 da rcall .-2972 ; 0x1a46 + 25e2: 81 11 cpse r24, r1 + 25e4: 02 c0 rjmp .+4 ; 0x25ea SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 255a: 8a ec ldi r24, 0xCA ; 202 + 25e6: 8a ec ldi r24, 0xCA ; 202 } } - 255c: 08 95 ret + 25e8: 08 95 ret } CommandStatusIdType CommandSetButtonLong(const char* InParam) { if (ButtonSetActionByName(BUTTON_PRESS_LONG, InParam)) { SettingsSave(); - 255e: 8c db rcall .-2280 ; 0x1c78 + 25ea: 9b db rcall .-2250 ; 0x1d22 return COMMAND_INFO_OK_ID; - 2560: 84 e6 ldi r24, 0x64 ; 100 - 2562: 08 95 ret + 25ec: 84 e6 ldi r24, 0x64 ; 100 + 25ee: 08 95 ret -00002564 : +000025f0 : } } CommandStatusIdType CommandExecLedGreen(char* OutMessage) { LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE); - 2564: 60 e0 ldi r22, 0x00 ; 0 - 2566: 71 e0 ldi r23, 0x01 ; 1 - 2568: 0a dd rcall .-1516 ; 0x1f7e + 25f0: 60 e0 ldi r22, 0x00 ; 0 + 25f2: 71 e0 ldi r23, 0x01 ; 1 + 25f4: 06 dd rcall .-1524 ; 0x2002 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 256a: 85 e6 ldi r24, 0x65 ; 101 - 256c: 08 95 ret + 25f6: 85 e6 ldi r24, 0x65 ; 101 + 25f8: 08 95 ret -0000256e : +000025fa : CommandStatusIdType CommandGetLedGreen(char* OutParam) { LEDGetFuncByName(LED_GREEN, OutParam, TERMINAL_BUFFER_SIZE); - 256e: 40 e0 ldi r20, 0x00 ; 0 - 2570: 51 e0 ldi r21, 0x01 ; 1 - 2572: bc 01 movw r22, r24 - 2574: 80 e2 ldi r24, 0x20 ; 32 - 2576: 8b dd rcall .-1258 ; 0x208e + 25fa: 40 e0 ldi r20, 0x00 ; 0 + 25fc: 51 e0 ldi r21, 0x01 ; 1 + 25fe: bc 01 movw r22, r24 + 2600: 80 e2 ldi r24, 0x20 ; 32 + 2602: 8e dd rcall .-1252 ; 0x2120 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2578: 85 e6 ldi r24, 0x65 ; 101 - 257a: 08 95 ret + 2604: 85 e6 ldi r24, 0x65 ; 101 + 2606: 08 95 ret -0000257c : +00002608 : CommandStatusIdType CommandSetLedGreen(const char* InParam) { if (LEDSetFuncByName(LED_GREEN, InParam)) { - 257c: bc 01 movw r22, r24 - 257e: 80 e2 ldi r24, 0x20 ; 32 - 2580: a3 dd rcall .-1210 ; 0x20c8 - 2582: 81 11 cpse r24, r1 - 2584: 02 c0 rjmp .+4 ; 0x258a + 2608: bc 01 movw r22, r24 + 260a: 80 e2 ldi r24, 0x20 ; 32 + 260c: a6 dd rcall .-1204 ; 0x215a + 260e: 81 11 cpse r24, r1 + 2610: 02 c0 rjmp .+4 ; 0x2616 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 2586: 8a ec ldi r24, 0xCA ; 202 + 2612: 8a ec ldi r24, 0xCA ; 202 } } - 2588: 08 95 ret + 2614: 08 95 ret } CommandStatusIdType CommandSetLedGreen(const char* InParam) { if (LEDSetFuncByName(LED_GREEN, InParam)) { SettingsSave(); - 258a: 76 db rcall .-2324 ; 0x1c78 + 2616: 85 db rcall .-2294 ; 0x1d22 return COMMAND_INFO_OK_ID; - 258c: 84 e6 ldi r24, 0x64 ; 100 - 258e: 08 95 ret + 2618: 84 e6 ldi r24, 0x64 ; 100 + 261a: 08 95 ret -00002590 : +0000261c : } } CommandStatusIdType CommandExecLedRed(char* OutMessage) { LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE); - 2590: 60 e0 ldi r22, 0x00 ; 0 - 2592: 71 e0 ldi r23, 0x01 ; 1 - 2594: f4 dc rcall .-1560 ; 0x1f7e + 261c: 60 e0 ldi r22, 0x00 ; 0 + 261e: 71 e0 ldi r23, 0x01 ; 1 + 2620: f0 dc rcall .-1568 ; 0x2002 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 2596: 85 e6 ldi r24, 0x65 ; 101 - 2598: 08 95 ret + 2622: 85 e6 ldi r24, 0x65 ; 101 + 2624: 08 95 ret -0000259a : +00002626 : CommandStatusIdType CommandGetLedRed(char* OutParam) { LEDGetFuncByName(LED_RED, OutParam, TERMINAL_BUFFER_SIZE); - 259a: 40 e0 ldi r20, 0x00 ; 0 - 259c: 51 e0 ldi r21, 0x01 ; 1 - 259e: bc 01 movw r22, r24 - 25a0: 80 e1 ldi r24, 0x10 ; 16 - 25a2: 75 dd rcall .-1302 ; 0x208e + 2626: 40 e0 ldi r20, 0x00 ; 0 + 2628: 51 e0 ldi r21, 0x01 ; 1 + 262a: bc 01 movw r22, r24 + 262c: 80 e1 ldi r24, 0x10 ; 16 + 262e: 78 dd rcall .-1296 ; 0x2120 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 25a4: 85 e6 ldi r24, 0x65 ; 101 - 25a6: 08 95 ret + 2630: 85 e6 ldi r24, 0x65 ; 101 + 2632: 08 95 ret -000025a8 : +00002634 : CommandStatusIdType CommandSetLedRed(const char* InParam) { if (LEDSetFuncByName(LED_RED, InParam)) { - 25a8: bc 01 movw r22, r24 - 25aa: 80 e1 ldi r24, 0x10 ; 16 - 25ac: 8d dd rcall .-1254 ; 0x20c8 - 25ae: 81 11 cpse r24, r1 - 25b0: 02 c0 rjmp .+4 ; 0x25b6 + 2634: bc 01 movw r22, r24 + 2636: 80 e1 ldi r24, 0x10 ; 16 + 2638: 90 dd rcall .-1248 ; 0x215a + 263a: 81 11 cpse r24, r1 + 263c: 02 c0 rjmp .+4 ; 0x2642 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 25b2: 8a ec ldi r24, 0xCA ; 202 + 263e: 8a ec ldi r24, 0xCA ; 202 } } - 25b4: 08 95 ret + 2640: 08 95 ret } CommandStatusIdType CommandSetLedRed(const char* InParam) { if (LEDSetFuncByName(LED_RED, InParam)) { SettingsSave(); - 25b6: 60 db rcall .-2368 ; 0x1c78 + 2642: 6f db rcall .-2338 ; 0x1d22 return COMMAND_INFO_OK_ID; - 25b8: 84 e6 ldi r24, 0x64 ; 100 - 25ba: 08 95 ret + 2644: 84 e6 ldi r24, 0x64 ; 100 + 2646: 08 95 ret -000025bc : +00002648 : } CommandStatusIdType CommandExecLogMode(char* OutMessage) { /* Get list of log modes */ LogGetModeList(OutMessage, TERMINAL_BUFFER_SIZE); - 25bc: 60 e0 ldi r22, 0x00 ; 0 - 25be: 71 e0 ldi r23, 0x01 ; 1 - 25c0: 2b db rcall .-2474 ; 0x1c18 + 2648: 60 e0 ldi r22, 0x00 ; 0 + 264a: 71 e0 ldi r23, 0x01 ; 1 + 264c: 3a db rcall .-2444 ; 0x1cc2 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 25c2: 85 e6 ldi r24, 0x65 ; 101 - 25c4: 08 95 ret + 264e: 85 e6 ldi r24, 0x65 ; 101 + 2650: 08 95 ret -000025c6 : +00002652 : CommandStatusIdType CommandGetLogMode(char* OutParam) { /* Get Logmode */ LogGetModeByName(OutParam, TERMINAL_BUFFER_SIZE); - 25c6: 60 e0 ldi r22, 0x00 ; 0 - 25c8: 71 e0 ldi r23, 0x01 ; 1 - 25ca: 18 db rcall .-2512 ; 0x1bfc + 2652: 60 e0 ldi r22, 0x00 ; 0 + 2654: 71 e0 ldi r23, 0x01 ; 1 + 2656: 27 db rcall .-2482 ; 0x1ca6 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 25cc: 85 e6 ldi r24, 0x65 ; 101 - 25ce: 08 95 ret + 2658: 85 e6 ldi r24, 0x65 ; 101 + 265a: 08 95 ret -000025d0 : +0000265c : CommandStatusIdType CommandSetLogMode(const char* InParam) { if (LogSetModeByName(InParam)) { - 25d0: f0 da rcall .-2592 ; 0x1bb2 - 25d2: 81 11 cpse r24, r1 - 25d4: 02 c0 rjmp .+4 ; 0x25da + 265c: ff da rcall .-2562 ; 0x1c5c + 265e: 81 11 cpse r24, r1 + 2660: 02 c0 rjmp .+4 ; 0x2666 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 25d6: 8a ec ldi r24, 0xCA ; 202 + 2662: 8a ec ldi r24, 0xCA ; 202 } } - 25d8: 08 95 ret + 2664: 08 95 ret } CommandStatusIdType CommandSetLogMode(const char* InParam) { if (LogSetModeByName(InParam)) { SettingsSave(); - 25da: 4e db rcall .-2404 ; 0x1c78 + 2666: 5d db rcall .-2374 ; 0x1d22 return COMMAND_INFO_OK_ID; - 25dc: 84 e6 ldi r24, 0x64 ; 100 - 25de: 08 95 ret + 2668: 84 e6 ldi r24, 0x64 ; 100 + 266a: 08 95 ret -000025e0 : +0000266c : } } CommandStatusIdType CommandExecLogMem(char* OutMessage) { snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, - 25e0: 23 e2 ldi r18, 0x23 ; 35 - 25e2: 36 e0 ldi r19, 0x06 ; 6 - 25e4: 3f 93 push r19 - 25e6: 2f 93 push r18 - 25e8: 2b e1 ldi r18, 0x1B ; 27 - 25ea: 36 e0 ldi r19, 0x06 ; 6 - 25ec: 3f 93 push r19 - 25ee: 2f 93 push r18 - 25f0: 25 e1 ldi r18, 0x15 ; 21 - 25f2: 36 e0 ldi r19, 0x06 ; 6 - 25f4: 3f 93 push r19 - 25f6: 2f 93 push r18 - 25f8: 21 e0 ldi r18, 0x01 ; 1 - 25fa: 2f 93 push r18 - 25fc: 1f 92 push r1 - 25fe: 9f 93 push r25 - 2600: 8f 93 push r24 - 2602: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 266c: 24 ed ldi r18, 0xD4 ; 212 + 266e: 36 e0 ldi r19, 0x06 ; 6 + 2670: 3f 93 push r19 + 2672: 2f 93 push r18 + 2674: 2c ec ldi r18, 0xCC ; 204 + 2676: 36 e0 ldi r19, 0x06 ; 6 + 2678: 3f 93 push r19 + 267a: 2f 93 push r18 + 267c: 26 ec ldi r18, 0xC6 ; 198 + 267e: 36 e0 ldi r19, 0x06 ; 6 + 2680: 3f 93 push r19 + 2682: 2f 93 push r18 + 2684: 21 e0 ldi r18, 0x01 ; 1 + 2686: 2f 93 push r18 + 2688: 1f 92 push r1 + 268a: 9f 93 push r25 + 268c: 8f 93 push r24 + 268e: 0e 94 37 2c call 0x586e ; 0x586e PSTR("%S,%S"), PSTR(COMMAND_LOGMEM_LOADBIN), PSTR(COMMAND_LOGMEM_CLEAR) ); return COMMAND_INFO_OK_WITH_TEXT_ID; - 2606: 8d b7 in r24, 0x3d ; 61 - 2608: 9e b7 in r25, 0x3e ; 62 - 260a: 0a 96 adiw r24, 0x0a ; 10 - 260c: 8d bf out 0x3d, r24 ; 61 - 260e: 9e bf out 0x3e, r25 ; 62 + 2692: 8d b7 in r24, 0x3d ; 61 + 2694: 9e b7 in r25, 0x3e ; 62 + 2696: 0a 96 adiw r24, 0x0a ; 10 + 2698: 8d bf out 0x3d, r24 ; 61 + 269a: 9e bf out 0x3e, r25 ; 62 } - 2610: 85 e6 ldi r24, 0x65 ; 101 - 2612: 08 95 ret + 269c: 85 e6 ldi r24, 0x65 ; 101 + 269e: 08 95 ret -00002614 : +000026a0 : CommandStatusIdType CommandGetLogMem(char* OutParam) { - 2614: cf 93 push r28 - 2616: df 93 push r29 - 2618: ec 01 movw r28, r24 + 26a0: cf 93 push r28 + 26a2: df 93 push r29 + 26a4: ec 01 movw r28, r24 snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 261a: 68 da rcall .-2864 ; 0x1aec - 261c: 9f 93 push r25 - 261e: 8f 93 push r24 - 2620: 29 e2 ldi r18, 0x29 ; 41 - 2622: 36 e0 ldi r19, 0x06 ; 6 - 2624: 3f 93 push r19 - 2626: 2f 93 push r18 - 2628: 81 e0 ldi r24, 0x01 ; 1 - 262a: 8f 93 push r24 - 262c: 1f 92 push r1 - 262e: df 93 push r29 - 2630: cf 93 push r28 - 2632: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 26a6: 77 da rcall .-2834 ; 0x1b96 + 26a8: 9f 93 push r25 + 26aa: 8f 93 push r24 + 26ac: 23 ec ldi r18, 0xC3 ; 195 + 26ae: 36 e0 ldi r19, 0x06 ; 6 + 26b0: 3f 93 push r19 + 26b2: 2f 93 push r18 + 26b4: 81 e0 ldi r24, 0x01 ; 1 + 26b6: 8f 93 push r24 + 26b8: 1f 92 push r1 + 26ba: df 93 push r29 + 26bc: cf 93 push r28 + 26be: 0e 94 37 2c call 0x586e ; 0x586e PSTR("%u"), LogMemFree()); return COMMAND_INFO_OK_WITH_TEXT_ID; - 2636: 8d b7 in r24, 0x3d ; 61 - 2638: 9e b7 in r25, 0x3e ; 62 - 263a: 08 96 adiw r24, 0x08 ; 8 - 263c: 8d bf out 0x3d, r24 ; 61 - 263e: 9e bf out 0x3e, r25 ; 62 + 26c2: 8d b7 in r24, 0x3d ; 61 + 26c4: 9e b7 in r25, 0x3e ; 62 + 26c6: 08 96 adiw r24, 0x08 ; 8 + 26c8: 8d bf out 0x3d, r24 ; 61 + 26ca: 9e bf out 0x3e, r25 ; 62 } - 2640: 85 e6 ldi r24, 0x65 ; 101 - 2642: df 91 pop r29 - 2644: cf 91 pop r28 - 2646: 08 95 ret + 26cc: 85 e6 ldi r24, 0x65 ; 101 + 26ce: df 91 pop r29 + 26d0: cf 91 pop r28 + 26d2: 08 95 ret -00002648 : +000026d4 : CommandStatusIdType CommandSetLogMem(const char* InParam) { - 2648: cf 93 push r28 - 264a: df 93 push r29 - 264c: ec 01 movw r28, r24 + 26d4: cf 93 push r28 + 26d6: df 93 push r29 + 26d8: ec 01 movw r28, r24 if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_LOADBIN)) == 0) { - 264e: 6c e2 ldi r22, 0x2C ; 44 - 2650: 76 e0 ldi r23, 0x06 ; 6 - 2652: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2656: 89 2b or r24, r25 - 2658: 81 f0 breq .+32 ; 0x267a + 26da: 6b eb ldi r22, 0xBB ; 187 + 26dc: 76 e0 ldi r23, 0x06 ; 6 + 26de: 0e 94 ff 2b call 0x57fe ; 0x57fe + 26e2: 89 2b or r24, r25 + 26e4: 81 f0 breq .+32 ; 0x2706 XModemSend(LogMemLoadBlock); return COMMAND_INFO_XMODEM_WAIT_ID; } else if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_CLEAR)) == 0) { - 265a: 64 e3 ldi r22, 0x34 ; 52 - 265c: 76 e0 ldi r23, 0x06 ; 6 - 265e: ce 01 movw r24, r28 - 2660: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2664: 89 2b or r24, r25 - 2666: 21 f0 breq .+8 ; 0x2670 + 26e6: 65 eb ldi r22, 0xB5 ; 181 + 26e8: 76 e0 ldi r23, 0x06 ; 6 + 26ea: ce 01 movw r24, r28 + 26ec: 0e 94 ff 2b call 0x57fe ; 0x57fe + 26f0: 89 2b or r24, r25 + 26f2: 21 f0 breq .+8 ; 0x26fc LogMemClear(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 2668: 8a ec ldi r24, 0xCA ; 202 + 26f4: 8a ec ldi r24, 0xCA ; 202 } } - 266a: df 91 pop r29 - 266c: cf 91 pop r28 - 266e: 08 95 ret + 26f6: df 91 pop r29 + 26f8: cf 91 pop r28 + 26fa: 08 95 ret { if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_LOADBIN)) == 0) { XModemSend(LogMemLoadBlock); return COMMAND_INFO_XMODEM_WAIT_ID; } else if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_CLEAR)) == 0) { LogMemClear(); - 2670: 28 da rcall .-2992 ; 0x1ac2 + 26fc: 37 da rcall .-2962 ; 0x1b6c return COMMAND_INFO_OK_ID; - 2672: 84 e6 ldi r24, 0x64 ; 100 + 26fe: 84 e6 ldi r24, 0x64 ; 100 } else { return COMMAND_ERR_INVALID_PARAM_ID; } } - 2674: df 91 pop r29 - 2676: cf 91 pop r28 - 2678: 08 95 ret + 2700: df 91 pop r29 + 2702: cf 91 pop r28 + 2704: 08 95 ret } CommandStatusIdType CommandSetLogMem(const char* InParam) { if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_LOADBIN)) == 0) { XModemSend(LogMemLoadBlock); - 267a: 89 e4 ldi r24, 0x49 ; 73 - 267c: 9d e0 ldi r25, 0x0D ; 13 - 267e: ba d0 rcall .+372 ; 0x27f4 + 2706: 8e e9 ldi r24, 0x9E ; 158 + 2708: 9d e0 ldi r25, 0x0D ; 13 + 270a: ae d0 rcall .+348 ; 0x2868 return COMMAND_INFO_XMODEM_WAIT_ID; - 2680: 8e e6 ldi r24, 0x6E ; 110 + 270c: 8e e6 ldi r24, 0x6E ; 110 LogMemClear(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; } } - 2682: df 91 pop r29 - 2684: cf 91 pop r28 - 2686: 08 95 ret + 270e: df 91 pop r29 + 2710: cf 91 pop r28 + 2712: 08 95 ret -00002688 : +00002714 : CommandStatusIdType CommandGetSetting(char* OutParam) { SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); - 2688: 60 e0 ldi r22, 0x00 ; 0 - 268a: 71 e0 ldi r23, 0x01 ; 1 - 268c: c3 db rcall .-2170 ; 0x1e14 + 2714: 60 e0 ldi r22, 0x00 ; 0 + 2716: 71 e0 ldi r23, 0x01 ; 1 + 2718: ce db rcall .-2148 ; 0x1eb6 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 268e: 85 e6 ldi r24, 0x65 ; 101 - 2690: 08 95 ret + 271a: 85 e6 ldi r24, 0x65 ; 101 + 271c: 08 95 ret -00002692 : +0000271e : CommandStatusIdType CommandSetSetting(const char* InParam) { if (SettingsSetActiveByName(InParam)) { - 2692: ca db rcall .-2156 ; 0x1e28 - 2694: 81 11 cpse r24, r1 - 2696: 02 c0 rjmp .+4 ; 0x269c + 271e: d2 db rcall .-2140 ; 0x1ec4 + 2720: 81 11 cpse r24, r1 + 2722: 02 c0 rjmp .+4 ; 0x2728 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 2698: 8a ec ldi r24, 0xCA ; 202 + 2724: 8a ec ldi r24, 0xCA ; 202 } } - 269a: 08 95 ret + 2726: 08 95 ret } CommandStatusIdType CommandSetSetting(const char* InParam) { if (SettingsSetActiveByName(InParam)) { SettingsSave(); - 269c: ed da rcall .-2598 ; 0x1c78 + 2728: fc da rcall .-2568 ; 0x1d22 return COMMAND_INFO_OK_ID; - 269e: 84 e6 ldi r24, 0x64 ; 100 - 26a0: 08 95 ret + 272a: 84 e6 ldi r24, 0x64 ; 100 + 272c: 08 95 ret -000026a2 : +0000272e : } } CommandStatusIdType CommandExecClear(char* OutParam) { MemoryClear(); - 26a2: 0e 94 12 07 call 0xe24 ; 0xe24 + 272e: 0e 94 94 07 call 0xf28 ; 0xf28 return COMMAND_INFO_OK_ID; } - 26a6: 84 e6 ldi r24, 0x64 ; 100 - 26a8: 08 95 ret + 2732: 84 e6 ldi r24, 0x64 ; 100 + 2734: 08 95 ret -000026aa : +00002736 : CommandStatusIdType CommandExecHelp(char* OutMessage) { - 26aa: bf 92 push r11 - 26ac: cf 92 push r12 - 26ae: df 92 push r13 - 26b0: ef 92 push r14 - 26b2: ff 92 push r15 - 26b4: 0f 93 push r16 - 26b6: 1f 93 push r17 - 26b8: cf 93 push r28 - 26ba: df 93 push r29 - 26bc: 7c 01 movw r14, r24 + 2736: df 92 push r13 + 2738: ef 92 push r14 + 273a: ff 92 push r15 + 273c: 0f 93 push r16 + 273e: 1f 93 push r17 + 2740: cf 93 push r28 + 2742: df 93 push r29 + 2744: 7c 01 movw r14, r24 const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ - 26be: cf ef ldi r28, 0xFF ; 255 - 26c0: d0 e0 ldi r29, 0x00 ; 0 + 2746: cf ef ldi r28, 0xFF ; 255 + 2748: d0 e0 ldi r29, 0x00 ; 0 return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; - 26c2: 31 e4 ldi r19, 0x41 ; 65 - 26c4: c3 2e mov r12, r19 - 26c6: 36 e0 ldi r19, 0x06 ; 6 - 26c8: d3 2e mov r13, r19 + 274a: 03 e0 ldi r16, 0x03 ; 3 + 274c: 18 e0 ldi r17, 0x08 ; 8 *OutMessage++ = c; CommandName++; ByteCount--; } *OutMessage++ = ','; - 26ca: 4c e2 ldi r20, 0x2C ; 44 - 26cc: b4 2e mov r11, r20 + 274e: 8c e2 ldi r24, 0x2C ; 44 + 2750: d8 2e mov r13, r24 CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { - 26ce: 86 01 movw r16, r12 - 26d0: b6 01 movw r22, r12 - 26d2: 80 e9 ldi r24, 0x90 ; 144 - 26d4: 90 e2 ldi r25, 0x20 ; 32 - 26d6: 0e 94 d5 2d call 0x5baa ; 0x5baa - 26da: 89 2b or r24, r25 - 26dc: 21 f1 breq .+72 ; 0x2726 + 2752: b8 01 movw r22, r16 + 2754: 80 e9 ldi r24, 0x90 ; 144 + 2756: 90 e2 ldi r25, 0x20 ; 32 + 2758: 0e 94 ff 2b call 0x57fe ; 0x57fe + 275c: 89 2b or r24, r25 + 275e: 39 f1 breq .+78 ; 0x27ae const char* CommandName = EntryPtr->Command; char c; while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { - 26de: f6 01 movw r30, r12 - 26e0: 84 91 lpm r24, Z - 26e2: 88 23 and r24, r24 - 26e4: 89 f0 breq .+34 ; 0x2708 - 26e6: c1 32 cpi r28, 0x21 ; 33 - 26e8: d1 05 cpc r29, r1 - 26ea: 70 f0 brcs .+28 ; 0x2708 - 26ec: d7 01 movw r26, r14 - 26ee: 03 c0 rjmp .+6 ; 0x26f6 - 26f0: c0 32 cpi r28, 0x20 ; 32 - 26f2: d1 05 cpc r29, r1 - 26f4: 49 f0 breq .+18 ; 0x2708 + 2760: f8 01 movw r30, r16 + 2762: 44 91 lpm r20, Z + 2764: 44 23 and r20, r20 + 2766: 79 f1 breq .+94 ; 0x27c6 + 2768: c1 32 cpi r28, 0x21 ; 33 + 276a: d1 05 cpc r29, r1 + 276c: 60 f1 brcs .+88 ; 0x27c6 + 276e: d7 01 movw r26, r14 + 2770: f8 01 movw r30, r16 + 2772: 04 c0 rjmp .+8 ; 0x277c + 2774: c0 32 cpi r28, 0x20 ; 32 + 2776: d1 05 cpc r29, r1 + 2778: 51 f0 breq .+20 ; 0x278e + 277a: dc 01 movw r26, r24 + 277c: cd 01 movw r24, r26 + 277e: 01 96 adiw r24, 0x01 ; 1 + 2780: 9c 01 movw r18, r24 *OutMessage++ = c; - 26f6: 8d 93 st X+, r24 - 26f8: 7d 01 movw r14, r26 + 2782: 4c 93 st X, r20 CommandName++; - 26fa: 0f 5f subi r16, 0xFF ; 255 - 26fc: 1f 4f sbci r17, 0xFF ; 255 + 2784: 31 96 adiw r30, 0x01 ; 1 ByteCount--; - 26fe: 21 97 sbiw r28, 0x01 ; 1 + 2786: 21 97 sbiw r28, 0x01 ; 1 while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { const char* CommandName = EntryPtr->Command; char c; while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { - 2700: f8 01 movw r30, r16 - 2702: 84 91 lpm r24, Z - 2704: 81 11 cpse r24, r1 - 2706: f4 cf rjmp .-24 ; 0x26f0 + 2788: 44 91 lpm r20, Z + 278a: 41 11 cpse r20, r1 + 278c: f3 cf rjmp .-26 ; 0x2774 *OutMessage++ = c; CommandName++; ByteCount--; } *OutMessage++ = ','; - 2708: f7 01 movw r30, r14 - 270a: b1 92 st Z+, r11 - 270c: 7f 01 movw r14, r30 + 278e: 79 01 movw r14, r18 + 2790: 8f ef ldi r24, 0xFF ; 255 + 2792: e8 1a sub r14, r24 + 2794: f8 0a sbc r15, r24 + 2796: f9 01 movw r30, r18 + 2798: d0 82 st Z, r13 ByteCount--; - 270e: 21 97 sbiw r28, 0x01 ; 1 + 279a: 21 97 sbiw r28, 0x01 ; 1 EntryPtr++; - 2710: f6 e1 ldi r31, 0x16 ; 22 - 2712: cf 0e add r12, r31 - 2714: d1 1c adc r13, r1 + 279c: 0a 5e subi r16, 0xEA ; 234 + 279e: 1f 4f sbci r17, 0xFF ; 255 CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { - 2716: 86 01 movw r16, r12 - 2718: b6 01 movw r22, r12 - 271a: 80 e9 ldi r24, 0x90 ; 144 - 271c: 90 e2 ldi r25, 0x20 ; 32 - 271e: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2722: 89 2b or r24, r25 - 2724: e1 f6 brne .-72 ; 0x26de + 27a0: b8 01 movw r22, r16 + 27a2: 80 e9 ldi r24, 0x90 ; 144 + 27a4: 90 e2 ldi r25, 0x20 ; 32 + 27a6: 0e 94 ff 2b call 0x57fe ; 0x57fe + 27aa: 89 2b or r24, r25 + 27ac: c9 f6 brne .-78 ; 0x2760 ByteCount--; EntryPtr++; } *--OutMessage = '\0'; - 2726: f7 01 movw r30, r14 - 2728: 31 97 sbiw r30, 0x01 ; 1 - 272a: 10 82 st Z, r1 + 27ae: d7 01 movw r26, r14 + 27b0: 11 97 sbiw r26, 0x01 ; 1 + 27b2: 1c 92 st X, r1 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 272c: 85 e6 ldi r24, 0x65 ; 101 - 272e: df 91 pop r29 - 2730: cf 91 pop r28 - 2732: 1f 91 pop r17 - 2734: 0f 91 pop r16 - 2736: ff 90 pop r15 - 2738: ef 90 pop r14 - 273a: df 90 pop r13 - 273c: cf 90 pop r12 - 273e: bf 90 pop r11 - 2740: 08 95 ret + 27b4: 85 e6 ldi r24, 0x65 ; 101 + 27b6: df 91 pop r29 + 27b8: cf 91 pop r28 + 27ba: 1f 91 pop r17 + 27bc: 0f 91 pop r16 + 27be: ff 90 pop r15 + 27c0: ef 90 pop r14 + 27c2: df 90 pop r13 + 27c4: 08 95 ret -00002742 : + while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { + const char* CommandName = EntryPtr->Command; + char c; + + while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { + 27c6: 97 01 movw r18, r14 + 27c8: e2 cf rjmp .-60 ; 0x278e + +000027ca : + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} CommandStatusIdType CommandGetRssi(char* OutParam) { - 2742: fc 01 movw r30, r24 + 27ca: fc 01 movw r30, r24 } static inline uint16_t AntennaLevelGet(void) { ADCA.CH0.CTRL |= ADC_CH_START_bm; - 2744: 20 91 20 02 lds r18, 0x0220 - 2748: 20 68 ori r18, 0x80 ; 128 - 274a: 20 93 20 02 sts 0x0220, r18 + 27cc: 20 91 20 02 lds r18, 0x0220 + 27d0: 20 68 ori r18, 0x80 ; 128 + 27d2: 20 93 20 02 sts 0x0220, r18 while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); - 274e: 20 91 23 02 lds r18, 0x0223 - 2752: 20 ff sbrs r18, 0 - 2754: fc cf rjmp .-8 ; 0x274e + 27d6: 20 91 23 02 lds r18, 0x0223 + 27da: 20 ff sbrs r18, 0 + 27dc: fc cf rjmp .-8 ; 0x27d6 ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; - 2756: 81 e0 ldi r24, 0x01 ; 1 - 2758: 80 93 23 02 sts 0x0223, r24 + 27de: 81 e0 ldi r24, 0x01 ; 1 + 27e0: 80 93 23 02 sts 0x0223, r24 int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; - 275c: a0 91 10 02 lds r26, 0x0210 - 2760: b0 91 11 02 lds r27, 0x0211 + 27e4: a0 91 10 02 lds r26, 0x0210 + 27e8: b0 91 11 02 lds r27, 0x0211 + 27ec: ae 5b subi r26, 0xBE ; 190 + 27ee: b1 09 sbc r27, r1 + 27f0: b7 fd sbrc r27, 7 + 27f2: 1c c0 rjmp .+56 ; 0x282c if (Result < 0) Result = 0; return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); - 2764: ae 5b subi r26, 0xBE ; 190 - 2766: b1 09 sbc r27, r1 - 2768: b7 fd sbrc r27, 7 - 276a: 1c c0 rjmp .+56 ; 0x27a4 - 276c: 29 e6 ldi r18, 0x69 ; 105 - 276e: 37 e5 ldi r19, 0x57 ; 87 - 2770: 4b e0 ldi r20, 0x0B ; 11 - 2772: 50 e0 ldi r21, 0x00 ; 0 - 2774: 0e 94 56 2d call 0x5aac ; 0x5aac <__mulshisi3> - 2778: aa 27 eor r26, r26 - 277a: bb 27 eor r27, r27 + 27f4: 29 e6 ldi r18, 0x69 ; 105 + 27f6: 37 e5 ldi r19, 0x57 ; 87 + 27f8: 4b e0 ldi r20, 0x0B ; 11 + 27fa: 50 e0 ldi r21, 0x00 ; 0 + 27fc: 0e 94 80 2b call 0x5700 ; 0x5700 <__mulshisi3> + 2800: aa 27 eor r26, r26 + 2802: bb 27 eor r27, r27 snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 277c: 9f 93 push r25 - 277e: 8f 93 push r24 - 2780: 2a e3 ldi r18, 0x3A ; 58 - 2782: 36 e0 ldi r19, 0x06 ; 6 - 2784: 3f 93 push r19 - 2786: 2f 93 push r18 - 2788: 81 e0 ldi r24, 0x01 ; 1 - 278a: 8f 93 push r24 - 278c: 1f 92 push r1 - 278e: ff 93 push r31 - 2790: ef 93 push r30 - 2792: 0e 94 06 2e call 0x5c0c ; 0x5c0c + 2804: 9f 93 push r25 + 2806: 8f 93 push r24 + 2808: 2e ea ldi r18, 0xAE ; 174 + 280a: 36 e0 ldi r19, 0x06 ; 6 + 280c: 3f 93 push r19 + 280e: 2f 93 push r18 + 2810: 81 e0 ldi r24, 0x01 ; 1 + 2812: 8f 93 push r24 + 2814: 1f 92 push r1 + 2816: ff 93 push r31 + 2818: ef 93 push r30 + 281a: 0e 94 37 2c call 0x586e ; 0x586e PSTR("%5u mV"), AntennaLevelGet()); return COMMAND_INFO_OK_WITH_TEXT_ID; - 2796: 8d b7 in r24, 0x3d ; 61 - 2798: 9e b7 in r25, 0x3e ; 62 - 279a: 08 96 adiw r24, 0x08 ; 8 - 279c: 8d bf out 0x3d, r24 ; 61 - 279e: 9e bf out 0x3e, r25 ; 62 + 281e: 8d b7 in r24, 0x3d ; 61 + 2820: 9e b7 in r25, 0x3e ; 62 + 2822: 08 96 adiw r24, 0x08 ; 8 + 2824: 8d bf out 0x3d, r24 ; 61 + 2826: 9e bf out 0x3e, r25 ; 62 } - 27a0: 85 e6 ldi r24, 0x65 ; 101 - 27a2: 08 95 ret - 27a4: a0 e0 ldi r26, 0x00 ; 0 - 27a6: b0 e0 ldi r27, 0x00 ; 0 - 27a8: e1 cf rjmp .-62 ; 0x276c - -000027aa : -static uint32_t BlockAddress; - -static XModemCallbackType CallbackFunc; - -static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { - uint8_t Checksum = CHECKSUM_INIT_VALUE; - 27aa: 80 e0 ldi r24, 0x00 ; 0 - uint8_t* DataPtr = (uint8_t*) Buffer; - 27ac: ec e3 ldi r30, 0x3C ; 60 - 27ae: f9 e2 ldi r31, 0x29 ; 41 - - while(ByteCount--) { - Checksum += *DataPtr++; - 27b0: 91 91 ld r25, Z+ - 27b2: 89 0f add r24, r25 - -static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { - uint8_t Checksum = CHECKSUM_INIT_VALUE; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 27b4: 99 e2 ldi r25, 0x29 ; 41 - 27b6: ec 3b cpi r30, 0xBC ; 188 - 27b8: f9 07 cpc r31, r25 - 27ba: d1 f7 brne .-12 ; 0x27b0 - Checksum += *DataPtr++; - } + 2828: 85 e6 ldi r24, 0x65 ; 101 + 282a: 08 95 ret + 282c: a0 e0 ldi r26, 0x00 ; 0 + 282e: b0 e0 ldi r27, 0x00 ; 0 + 2830: e1 cf rjmp .-62 ; 0x27f4 +00002832 : return Checksum; } - 27bc: 08 95 ret - -000027be : void XModemReceive(XModemCallbackType TheCallbackFunc) { State = STATE_RECEIVE_INIT; - 27be: 21 e0 ldi r18, 0x01 ; 1 - 27c0: 20 93 9b 28 sts 0x289B, r18 + 2832: 21 e0 ldi r18, 0x01 ; 1 + 2834: 20 93 a9 28 sts 0x28A9, r18 CurrentFrameNumber = FIRST_FRAME_NUMBER; - 27c4: 20 93 9c 28 sts 0x289C, r18 + 2838: 20 93 a8 28 sts 0x28A8, r18 RetryCount = RECV_INIT_COUNT; - 27c8: 2c e3 ldi r18, 0x3C ; 60 - 27ca: 20 93 9d 28 sts 0x289D, r18 + 283c: 2c e3 ldi r18, 0x3C ; 60 + 283e: 20 93 a5 28 sts 0x28A5, r18 RetryTimeout = RECV_INIT_TIMEOUT; - 27ce: 25 e0 ldi r18, 0x05 ; 5 - 27d0: 30 e0 ldi r19, 0x00 ; 0 - 27d2: 20 93 9e 28 sts 0x289E, r18 - 27d6: 30 93 9f 28 sts 0x289F, r19 + 2842: 25 e0 ldi r18, 0x05 ; 5 + 2844: 30 e0 ldi r19, 0x00 ; 0 + 2846: 20 93 a3 28 sts 0x28A3, r18 + 284a: 30 93 a4 28 sts 0x28A4, r19 BlockAddress = 0; - 27da: 10 92 a0 28 sts 0x28A0, r1 - 27de: 10 92 a1 28 sts 0x28A1, r1 - 27e2: 10 92 a2 28 sts 0x28A2, r1 - 27e6: 10 92 a3 28 sts 0x28A3, r1 + 284e: 10 92 9d 28 sts 0x289D, r1 + 2852: 10 92 9e 28 sts 0x289E, r1 + 2856: 10 92 9f 28 sts 0x289F, r1 + 285a: 10 92 a0 28 sts 0x28A0, r1 CallbackFunc = TheCallbackFunc; - 27ea: 80 93 a4 28 sts 0x28A4, r24 - 27ee: 90 93 a5 28 sts 0x28A5, r25 - 27f2: 08 95 ret + 285e: 80 93 9b 28 sts 0x289B, r24 + 2862: 90 93 9c 28 sts 0x289C, r25 + 2866: 08 95 ret -000027f4 : +00002868 : } void XModemSend(XModemCallbackType TheCallbackFunc) { State = STATE_SEND_INIT; - 27f4: 27 e0 ldi r18, 0x07 ; 7 - 27f6: 20 93 9b 28 sts 0x289B, r18 + 2868: 27 e0 ldi r18, 0x07 ; 7 + 286a: 20 93 a9 28 sts 0x28A9, r18 RetryTimeout = SEND_INIT_TIMEOUT; - 27fa: 2c e2 ldi r18, 0x2C ; 44 - 27fc: 31 e0 ldi r19, 0x01 ; 1 - 27fe: 20 93 9e 28 sts 0x289E, r18 - 2802: 30 93 9f 28 sts 0x289F, r19 + 286e: 2c e2 ldi r18, 0x2C ; 44 + 2870: 31 e0 ldi r19, 0x01 ; 1 + 2872: 20 93 a3 28 sts 0x28A3, r18 + 2876: 30 93 a4 28 sts 0x28A4, r19 BlockAddress = 0; - 2806: 10 92 a0 28 sts 0x28A0, r1 - 280a: 10 92 a1 28 sts 0x28A1, r1 - 280e: 10 92 a2 28 sts 0x28A2, r1 - 2812: 10 92 a3 28 sts 0x28A3, r1 + 287a: 10 92 9d 28 sts 0x289D, r1 + 287e: 10 92 9e 28 sts 0x289E, r1 + 2882: 10 92 9f 28 sts 0x289F, r1 + 2886: 10 92 a0 28 sts 0x28A0, r1 CallbackFunc = TheCallbackFunc; - 2816: 80 93 a4 28 sts 0x28A4, r24 - 281a: 90 93 a5 28 sts 0x28A5, r25 - 281e: 08 95 ret + 288a: 80 93 9b 28 sts 0x289B, r24 + 288e: 90 93 9c 28 sts 0x289C, r25 + 2892: 08 95 ret -00002820 : +00002894 : } bool XModemProcessByte(uint8_t Byte) { - 2820: cf 93 push r28 - 2822: c8 2f mov r28, r24 + 2894: cf 93 push r28 switch(State) { - 2824: 90 91 9b 28 lds r25, 0x289B - 2828: 95 30 cpi r25, 0x05 ; 5 - 282a: 09 f4 brne .+2 ; 0x282e - 282c: 84 c0 rjmp .+264 ; 0x2936 - 282e: e0 f0 brcs .+56 ; 0x2868 - 2830: 97 30 cpi r25, 0x07 ; 7 - 2832: 09 f4 brne .+2 ; 0x2836 - 2834: 4c c0 rjmp .+152 ; 0x28ce - 2836: 60 f5 brcc .+88 ; 0x2890 - } - - break; - - case STATE_RECEIVE_PROCESS: - if (ReceivedFrameNumber == CurrentFrameNumber) { - 2838: 20 91 a9 28 lds r18, 0x28A9 - 283c: 80 91 9c 28 lds r24, 0x289C - 2840: 28 17 cp r18, r24 - 2842: 09 f4 brne .+2 ; 0x2846 - 2844: ec c0 rjmp .+472 ; 0x2a1e - } else { - /* Data seems to be damaged */ - TerminalSendByte(BYTE_NAK); - State = STATE_RECEIVE_WAIT; - } - } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { - 2846: 30 e0 ldi r19, 0x00 ; 0 - 2848: 90 e0 ldi r25, 0x00 ; 0 - 284a: 01 97 sbiw r24, 0x01 ; 1 - 284c: 28 17 cp r18, r24 - 284e: 39 07 cpc r19, r25 - 2850: 09 f4 brne .+2 ; 0x2854 - 2852: 14 c1 rjmp .+552 ; 0x2a7c -INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } - 2854: 68 e1 ldi r22, 0x18 ; 24 - 2856: 80 e0 ldi r24, 0x00 ; 0 - 2858: 90 e2 ldi r25, 0x20 ; 32 - 285a: 0e 94 bf 2b call 0x577e ; 0x577e - TerminalSendByte(BYTE_ACK); - State = STATE_RECEIVE_WAIT; - } else { - /* This frame is completely out of order. Just cancel */ - TerminalSendByte(BYTE_CAN); - State = STATE_OFF; - 285e: 10 92 9b 28 sts 0x289B, r1 - default: - return false; - break; - } - - return true; - 2862: 81 e0 ldi r24, 0x01 ; 1 -} - 2864: cf 91 pop r28 - 2866: 08 95 ret - CallbackFunc = TheCallbackFunc; -} - -bool XModemProcessByte(uint8_t Byte) -{ - switch(State) { - 2868: 93 30 cpi r25, 0x03 ; 3 - 286a: 09 f4 brne .+2 ; 0x286e - 286c: 5c c0 rjmp .+184 ; 0x2926 - 286e: b8 f0 brcs .+46 ; 0x289e - ReceivedFrameNumber = Byte; - State = STATE_RECEIVE_FRAMENUM2; - break; - - case STATE_RECEIVE_FRAMENUM2: - if (Byte == (255 - ReceivedFrameNumber)) { - 2870: 90 e0 ldi r25, 0x00 ; 0 - 2872: 40 91 a9 28 lds r20, 0x28A9 - 2876: 2f ef ldi r18, 0xFF ; 255 - 2878: 30 e0 ldi r19, 0x00 ; 0 - 287a: 24 1b sub r18, r20 - 287c: 31 09 sbc r19, r1 - 287e: 82 17 cp r24, r18 - 2880: 93 07 cpc r25, r19 - 2882: 09 f0 breq .+2 ; 0x2886 - 2884: 6f c0 rjmp .+222 ; 0x2964 - /* frame-number check passed. */ - State = STATE_RECEIVE_DATA; - 2886: 85 e0 ldi r24, 0x05 ; 5 - 2888: 80 93 9b 28 sts 0x289B, r24 - default: - return false; - break; - } - - return true; - 288c: 81 e0 ldi r24, 0x01 ; 1 - 288e: ea cf rjmp .-44 ; 0x2864 - CallbackFunc = TheCallbackFunc; -} - -bool XModemProcessByte(uint8_t Byte) -{ - switch(State) { - 2890: 98 30 cpi r25, 0x08 ; 8 - 2892: 19 f1 breq .+70 ; 0x28da - 2894: 99 30 cpi r25, 0x09 ; 9 - 2896: b1 f0 breq .+44 ; 0x28c4 + 2896: 40 91 a9 28 lds r20, 0x28A9 + 289a: 50 e0 ldi r21, 0x00 ; 0 + 289c: fa 01 movw r30, r20 + 289e: 31 97 sbiw r30, 0x01 ; 1 + 28a0: e9 30 cpi r30, 0x09 ; 9 + 28a2: f1 05 cpc r31, r1 + 28a4: 20 f0 brcs .+8 ; 0x28ae /* Receive Ack */ State = STATE_OFF; break; default: return false; - 2898: 80 e0 ldi r24, 0x00 ; 0 + 28a6: c0 e0 ldi r28, 0x00 ; 0 break; } return true; } - 289a: cf 91 pop r28 - 289c: 08 95 ret + 28a8: 8c 2f mov r24, r28 + 28aa: cf 91 pop r28 + 28ac: 08 95 ret CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 289e: 91 30 cpi r25, 0x01 ; 1 - 28a0: d8 f3 brcs .-10 ; 0x2898 - case STATE_RECEIVE_INIT: - case STATE_RECEIVE_WAIT: - if (Byte == BYTE_SOH) { - 28a2: 81 30 cpi r24, 0x01 ; 1 - 28a4: 09 f4 brne .+2 ; 0x28a8 - 28a6: ec c0 rjmp .+472 ; 0x2a80 - /* Next frame incoming */ - BufferIdx = 0; - Checksum = CHECKSUM_INIT_VALUE; - State = STATE_RECEIVE_FRAMENUM1; - } else if (Byte == BYTE_EOT) { - 28a8: 84 30 cpi r24, 0x04 ; 4 - 28aa: 39 f0 breq .+14 ; 0x28ba - /* Transmission finished */ + 28ae: e2 5b subi r30, 0xB2 ; 178 + 28b0: fe 4f sbci r31, 0xFE ; 254 + 28b2: 0c 94 7a 2b jmp 0x56f4 ; 0x56f4 <__tablejump2__> + } + + break; + + case STATE_RECEIVE_PROCESS: + if (ReceivedFrameNumber == CurrentFrameNumber) { + 28b6: 20 91 a7 28 lds r18, 0x28A7 + 28ba: 90 91 a8 28 lds r25, 0x28A8 + 28be: 29 17 cp r18, r25 + 28c0: 09 f4 brne .+2 ; 0x28c4 + 28c2: ea c0 rjmp .+468 ; 0x2a98 + } else { + /* Data seems to be damaged */ + TerminalSendByte(BYTE_NAK); + State = STATE_RECEIVE_WAIT; + } + } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { + 28c4: 30 e0 ldi r19, 0x00 ; 0 + 28c6: 89 2f mov r24, r25 + 28c8: 90 e0 ldi r25, 0x00 ; 0 + 28ca: 01 97 sbiw r24, 0x01 ; 1 + 28cc: 28 17 cp r18, r24 + 28ce: 39 07 cpc r19, r25 + 28d0: 09 f4 brne .+2 ; 0x28d4 + 28d2: 2d c1 rjmp .+602 ; 0x2b2e +INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } + 28d4: 68 e1 ldi r22, 0x18 ; 24 + 28d6: 81 e0 ldi r24, 0x01 ; 1 + 28d8: 90 e2 ldi r25, 0x20 ; 32 + 28da: 0e 94 f5 29 call 0x53ea ; 0x53ea TerminalSendByte(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + } else { + /* This frame is completely out of order. Just cancel */ + TerminalSendByte(BYTE_CAN); State = STATE_OFF; - } else if ( (Byte == BYTE_CAN) || (Byte == BYTE_ESC) ) { - 28ac: 88 31 cpi r24, 0x18 ; 24 - 28ae: 51 f0 breq .+20 ; 0x28c4 - 28b0: 8b 31 cpi r24, 0x1B ; 27 - 28b2: 41 f0 breq .+16 ; 0x28c4 + 28de: 10 92 a9 28 sts 0x28A9, r1 default: return false; break; } return true; - 28b4: 81 e0 ldi r24, 0x01 ; 1 + 28e2: c1 e0 ldi r28, 0x01 ; 1 } - 28b6: cf 91 pop r28 - 28b8: 08 95 ret - 28ba: 66 e0 ldi r22, 0x06 ; 6 - 28bc: 80 e0 ldi r24, 0x00 ; 0 - 28be: 90 e2 ldi r25, 0x20 ; 32 - 28c0: 0e 94 bf 2b call 0x577e ; 0x577e - - case STATE_SEND_WAIT: - if (Byte == BYTE_CAN) { - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - 28c4: 10 92 9b 28 sts 0x289B, r1 - default: - return false; - break; - } - - return true; - 28c8: 81 e0 ldi r24, 0x01 ; 1 -} - 28ca: cf 91 pop r28 - 28cc: 08 95 ret + 28e4: 8c 2f mov r24, r28 + 28e6: cf 91 pop r28 + 28e8: 08 95 ret break; case STATE_SEND_INIT: /* Start sending on NAK */ if (Byte == BYTE_NAK) { - 28ce: 85 31 cpi r24, 0x15 ; 21 - 28d0: 09 f4 brne .+2 ; 0x28d4 - 28d2: 57 c0 rjmp .+174 ; 0x2982 + 28ea: 85 31 cpi r24, 0x15 ; 21 + 28ec: 09 f4 brne .+2 ; 0x28f0 + 28ee: 7f c0 rjmp .+254 ; 0x29ee CurrentFrameNumber = FIRST_FRAME_NUMBER - 1; Byte = BYTE_ACK; } else if (Byte == BYTE_ESC) { - 28d4: 8b 31 cpi r24, 0x1B ; 27 - 28d6: 09 f4 brne .+2 ; 0x28da - 28d8: 50 c0 rjmp .+160 ; 0x297a + 28f0: 8b 31 cpi r24, 0x1B ; 27 + 28f2: 09 f4 brne .+2 ; 0x28f6 + 28f4: 78 c0 rjmp .+240 ; 0x29e6 } /* Fallthrough */ case STATE_SEND_WAIT: if (Byte == BYTE_CAN) { - 28da: c8 31 cpi r28, 0x18 ; 24 - 28dc: 71 f3 breq .-36 ; 0x28ba + 28f6: 88 31 cpi r24, 0x18 ; 24 + 28f8: 09 f4 brne .+2 ; 0x28fc + 28fa: 10 c1 rjmp .+544 ; 0x2b1c /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_ACK) { - 28de: c6 30 cpi r28, 0x06 ; 6 - 28e0: 09 f4 brne .+2 ; 0x28e4 - 28e2: 51 c0 rjmp .+162 ; 0x2986 + 28fc: 86 30 cpi r24, 0x06 ; 6 + 28fe: 09 f4 brne .+2 ; 0x2902 + 2900: 78 c0 rjmp .+240 ; 0x29f2 BlockAddress += XMODEM_BLOCK_SIZE; } else { TerminalSendByte(BYTE_EOT); State = STATE_SEND_EOT; } } else if (Byte == BYTE_NAK){ - 28e4: c5 31 cpi r28, 0x15 ; 21 - 28e6: 31 f7 brne .-52 ; 0x28b4 - 28e8: 61 e0 ldi r22, 0x01 ; 1 - 28ea: 80 e0 ldi r24, 0x00 ; 0 - 28ec: 90 e2 ldi r25, 0x20 ; 32 - 28ee: 0e 94 bf 2b call 0x577e ; 0x577e - 28f2: 60 91 9c 28 lds r22, 0x289C - 28f6: 80 e0 ldi r24, 0x00 ; 0 - 28f8: 90 e2 ldi r25, 0x20 ; 32 - 28fa: 0e 94 bf 2b call 0x577e ; 0x577e - /* Resend frame */ - TerminalSendByte(BYTE_SOH); - TerminalSendByte(CurrentFrameNumber); - TerminalSendByte(255 - CurrentFrameNumber); - 28fe: 60 91 9c 28 lds r22, 0x289C - 2902: 60 95 com r22 - 2904: 80 e0 ldi r24, 0x00 ; 0 - 2906: 90 e2 ldi r25, 0x20 ; 32 - 2908: 0e 94 bf 2b call 0x577e ; 0x577e - TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 290c: 60 e8 ldi r22, 0x80 ; 128 - 290e: 70 e0 ldi r23, 0x00 ; 0 - 2910: 8c e3 ldi r24, 0x3C ; 60 - 2912: 99 e2 ldi r25, 0x29 ; 41 - 2914: 4a dc rcall .-1900 ; 0x21aa - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 2916: 49 df rcall .-366 ; 0x27aa - 2918: 68 2f mov r22, r24 - 291a: 80 e0 ldi r24, 0x00 ; 0 - 291c: 90 e2 ldi r25, 0x20 ; 32 - 291e: 0e 94 bf 2b call 0x577e ; 0x577e + 2902: 85 31 cpi r24, 0x15 ; 21 + 2904: 09 f4 brne .+2 ; 0x2908 + 2906: 49 c0 rjmp .+146 ; 0x299a default: return false; break; } return true; - 2922: 81 e0 ldi r24, 0x01 ; 1 - 2924: 9f cf rjmp .-194 ; 0x2864 + 2908: c1 e0 ldi r28, 0x01 ; 1 +} + 290a: 8c 2f mov r24, r28 + 290c: cf 91 pop r28 + 290e: 08 95 ret +bool XModemProcessByte(uint8_t Byte) +{ + switch(State) { + case STATE_RECEIVE_INIT: + case STATE_RECEIVE_WAIT: + if (Byte == BYTE_SOH) { + 2910: 81 30 cpi r24, 0x01 ; 1 + 2912: 09 f4 brne .+2 ; 0x2916 + 2914: 0e c1 rjmp .+540 ; 0x2b32 + /* Next frame incoming */ + BufferIdx = 0; + Checksum = CHECKSUM_INIT_VALUE; + State = STATE_RECEIVE_FRAMENUM1; + } else if (Byte == BYTE_EOT) { + 2916: 84 30 cpi r24, 0x04 ; 4 + 2918: 09 f4 brne .+2 ; 0x291c + 291a: 00 c1 rjmp .+512 ; 0x2b1c + /* Transmission finished */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if ( (Byte == BYTE_CAN) || (Byte == BYTE_ESC) ) { + 291c: 88 31 cpi r24, 0x18 ; 24 + 291e: f9 f2 breq .-66 ; 0x28de + 2920: 8b 31 cpi r24, 0x1B ; 27 + 2922: e9 f2 breq .-70 ; 0x28de + default: + return false; + break; + } + + return true; + 2924: c1 e0 ldi r28, 0x01 ; 1 + 2926: f1 cf rjmp .-30 ; 0x290a break; case STATE_RECEIVE_FRAMENUM1: /* Store frame number */ ReceivedFrameNumber = Byte; - 2926: 80 93 a9 28 sts 0x28A9, r24 + 2928: 80 93 a7 28 sts 0x28A7, r24 State = STATE_RECEIVE_FRAMENUM2; - 292a: 84 e0 ldi r24, 0x04 ; 4 - 292c: 80 93 9b 28 sts 0x289B, r24 + 292c: 84 e0 ldi r24, 0x04 ; 4 + 292e: 80 93 a9 28 sts 0x28A9, r24 default: return false; break; } return true; - 2930: 81 e0 ldi r24, 0x01 ; 1 + 2932: c1 e0 ldi r28, 0x01 ; 1 } - 2932: cf 91 pop r28 - 2934: 08 95 ret + 2934: 8c 2f mov r24, r28 + 2936: cf 91 pop r28 + 2938: 08 95 ret + ReceivedFrameNumber = Byte; + State = STATE_RECEIVE_FRAMENUM2; + break; + + case STATE_RECEIVE_FRAMENUM2: + if (Byte == (255 - ReceivedFrameNumber)) { + 293a: 90 e0 ldi r25, 0x00 ; 0 + 293c: 40 91 a7 28 lds r20, 0x28A7 + 2940: 2f ef ldi r18, 0xFF ; 255 + 2942: 30 e0 ldi r19, 0x00 ; 0 + 2944: 24 1b sub r18, r20 + 2946: 31 09 sbc r19, r1 + 2948: 82 17 cp r24, r18 + 294a: 93 07 cpc r25, r19 + 294c: e1 f4 brne .+56 ; 0x2986 + /* frame-number check passed. */ + State = STATE_RECEIVE_DATA; + 294e: 85 e0 ldi r24, 0x05 ; 5 + 2950: 80 93 a9 28 sts 0x28A9, r24 + default: + return false; + break; + } + + return true; + 2954: c1 e0 ldi r28, 0x01 ; 1 + 2956: a8 cf rjmp .-176 ; 0x28a8 break; case STATE_RECEIVE_DATA: /* Process byte and update checksum */ TerminalBuffer[BufferIdx++] = Byte; - 2936: 20 91 a6 28 lds r18, 0x28A6 - 293a: 30 91 a7 28 lds r19, 0x28A7 - 293e: f9 01 movw r30, r18 - 2940: e4 5c subi r30, 0xC4 ; 196 - 2942: f6 4d sbci r31, 0xD6 ; 214 - 2944: 80 83 st Z, r24 - 2946: c9 01 movw r24, r18 - 2948: 01 96 adiw r24, 0x01 ; 1 - 294a: 80 93 a6 28 sts 0x28A6, r24 - 294e: 90 93 a7 28 sts 0x28A7, r25 + 2958: 40 91 a1 28 lds r20, 0x28A1 + 295c: 50 91 a2 28 lds r21, 0x28A2 + 2960: 9a 01 movw r18, r20 + 2962: 2f 5f subi r18, 0xFF ; 255 + 2964: 3f 4f sbci r19, 0xFF ; 255 + 2966: 20 93 a1 28 sts 0x28A1, r18 + 296a: 30 93 a2 28 sts 0x28A2, r19 + 296e: fa 01 movw r30, r20 + 2970: e4 5c subi r30, 0xC4 ; 196 + 2972: f6 4d sbci r31, 0xD6 ; 214 + 2974: 80 83 st Z, r24 if (BufferIdx == XMODEM_BLOCK_SIZE) { - 2952: 80 38 cpi r24, 0x80 ; 128 - 2954: 91 05 cpc r25, r1 - 2956: 09 f0 breq .+2 ; 0x295a - 2958: ad cf rjmp .-166 ; 0x28b4 + 2976: 20 38 cpi r18, 0x80 ; 128 + 2978: 31 05 cpc r19, r1 + 297a: 31 f6 brne .-116 ; 0x2908 /* Block full */ State = STATE_RECEIVE_PROCESS; - 295a: 86 e0 ldi r24, 0x06 ; 6 - 295c: 80 93 9b 28 sts 0x289B, r24 + 297c: 86 e0 ldi r24, 0x06 ; 6 + 297e: 80 93 a9 28 sts 0x28A9, r24 default: return false; break; } return true; - 2960: 81 e0 ldi r24, 0x01 ; 1 - 2962: 80 cf rjmp .-256 ; 0x2864 - 2964: 65 e1 ldi r22, 0x15 ; 21 - 2966: 80 e0 ldi r24, 0x00 ; 0 - 2968: 90 e2 ldi r25, 0x20 ; 32 - 296a: 0e 94 bf 2b call 0x577e ; 0x577e + 2982: c1 e0 ldi r28, 0x01 ; 1 + 2984: 91 cf rjmp .-222 ; 0x28a8 + 2986: 65 e1 ldi r22, 0x15 ; 21 + 2988: 81 e0 ldi r24, 0x01 ; 1 + 298a: 90 e2 ldi r25, 0x20 ; 32 + 298c: 0e 94 f5 29 call 0x53ea ; 0x53ea State = STATE_RECEIVE_WAIT; } } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { /* This is a retransmission */ TerminalSendByte(BYTE_ACK); State = STATE_RECEIVE_WAIT; - 296e: 82 e0 ldi r24, 0x02 ; 2 - 2970: 80 93 9b 28 sts 0x289B, r24 + 2990: 82 e0 ldi r24, 0x02 ; 2 + 2992: 80 93 a9 28 sts 0x28A9, r24 default: return false; break; } return true; - 2974: 81 e0 ldi r24, 0x01 ; 1 -} - 2976: cf 91 pop r28 - 2978: 08 95 ret + 2996: c1 e0 ldi r28, 0x01 ; 1 + 2998: 87 cf rjmp .-242 ; 0x28a8 + 299a: 61 e0 ldi r22, 0x01 ; 1 + 299c: 81 e0 ldi r24, 0x01 ; 1 + 299e: 90 e2 ldi r25, 0x20 ; 32 + 29a0: 0e 94 f5 29 call 0x53ea ; 0x53ea + 29a4: 60 91 a8 28 lds r22, 0x28A8 + 29a8: 81 e0 ldi r24, 0x01 ; 1 + 29aa: 90 e2 ldi r25, 0x20 ; 32 + 29ac: 0e 94 f5 29 call 0x53ea ; 0x53ea + } + } else if (Byte == BYTE_NAK){ + /* Resend frame */ + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + 29b0: 60 91 a8 28 lds r22, 0x28A8 + 29b4: 60 95 com r22 + 29b6: 81 e0 ldi r24, 0x01 ; 1 + 29b8: 90 e2 ldi r25, 0x20 ; 32 + 29ba: 0e 94 f5 29 call 0x53ea ; 0x53ea + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + 29be: 60 e8 ldi r22, 0x80 ; 128 + 29c0: 70 e0 ldi r23, 0x00 ; 0 + 29c2: 8c e3 ldi r24, 0x3C ; 60 + 29c4: 99 e2 ldi r25, 0x29 ; 41 + 29c6: 3a dc rcall .-1932 ; 0x223c + 29c8: ec e3 ldi r30, 0x3C ; 60 + 29ca: f9 e2 ldi r31, 0x29 ; 41 +static uint32_t BlockAddress; + +static XModemCallbackType CallbackFunc; + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + 29cc: 60 e0 ldi r22, 0x00 ; 0 + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + Checksum += *DataPtr++; + 29ce: 81 91 ld r24, Z+ + 29d0: 68 0f add r22, r24 + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 29d2: 29 e2 ldi r18, 0x29 ; 41 + 29d4: ec 3b cpi r30, 0xBC ; 188 + 29d6: f2 07 cpc r31, r18 + 29d8: d1 f7 brne .-12 ; 0x29ce + 29da: 81 e0 ldi r24, 0x01 ; 1 + 29dc: 90 e2 ldi r25, 0x20 ; 32 + 29de: 0e 94 f5 29 call 0x53ea ; 0x53ea + default: + return false; + break; + } + + return true; + 29e2: c1 e0 ldi r28, 0x01 ; 1 + 29e4: 92 cf rjmp .-220 ; 0x290a /* Start sending on NAK */ if (Byte == BYTE_NAK) { CurrentFrameNumber = FIRST_FRAME_NUMBER - 1; Byte = BYTE_ACK; } else if (Byte == BYTE_ESC) { State = STATE_OFF; - 297a: 10 92 9b 28 sts 0x289B, r1 + 29e6: 10 92 a9 28 sts 0x28A9, r1 default: return false; break; } return true; - 297e: 81 e0 ldi r24, 0x01 ; 1 - 2980: 9a cf rjmp .-204 ; 0x28b6 + 29ea: c1 e0 ldi r28, 0x01 ; 1 + 29ec: 8e cf rjmp .-228 ; 0x290a break; case STATE_SEND_INIT: /* Start sending on NAK */ if (Byte == BYTE_NAK) { CurrentFrameNumber = FIRST_FRAME_NUMBER - 1; - 2982: 10 92 9c 28 sts 0x289C, r1 + 29ee: 10 92 a8 28 sts 0x28A8, r1 /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_ACK) { /* Acknowledge. Proceed to next frame, get data and calc checksum */ CurrentFrameNumber++; - 2986: 80 91 9c 28 lds r24, 0x289C - 298a: 8f 5f subi r24, 0xFF ; 255 - 298c: 80 93 9c 28 sts 0x289C, r24 + 29f2: 80 91 a8 28 lds r24, 0x28A8 + 29f6: 8f 5f subi r24, 0xFF ; 255 + 29f8: 80 93 a8 28 sts 0x28A8, r24 if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 2990: 40 91 a0 28 lds r20, 0x28A0 - 2994: 50 91 a1 28 lds r21, 0x28A1 - 2998: 60 91 a2 28 lds r22, 0x28A2 - 299c: 70 91 a3 28 lds r23, 0x28A3 - 29a0: e0 91 a4 28 lds r30, 0x28A4 - 29a4: f0 91 a5 28 lds r31, 0x28A5 - 29a8: 20 e8 ldi r18, 0x80 ; 128 - 29aa: 30 e0 ldi r19, 0x00 ; 0 - 29ac: 8c e3 ldi r24, 0x3C ; 60 - 29ae: 99 e2 ldi r25, 0x29 ; 41 - 29b0: 09 95 icall - 29b2: 88 23 and r24, r24 - 29b4: 09 f4 brne .+2 ; 0x29b8 - 29b6: 6f c0 rjmp .+222 ; 0x2a96 - 29b8: 61 e0 ldi r22, 0x01 ; 1 - 29ba: 80 e0 ldi r24, 0x00 ; 0 - 29bc: 90 e2 ldi r25, 0x20 ; 32 - 29be: 0e 94 bf 2b call 0x577e ; 0x577e - 29c2: 60 91 9c 28 lds r22, 0x289C - 29c6: 80 e0 ldi r24, 0x00 ; 0 - 29c8: 90 e2 ldi r25, 0x20 ; 32 - 29ca: 0e 94 bf 2b call 0x577e ; 0x577e + 29fc: 40 91 9d 28 lds r20, 0x289D + 2a00: 50 91 9e 28 lds r21, 0x289E + 2a04: 60 91 9f 28 lds r22, 0x289F + 2a08: 70 91 a0 28 lds r23, 0x28A0 + 2a0c: e0 91 9b 28 lds r30, 0x289B + 2a10: f0 91 9c 28 lds r31, 0x289C + 2a14: 20 e8 ldi r18, 0x80 ; 128 + 2a16: 30 e0 ldi r19, 0x00 ; 0 + 2a18: 8c e3 ldi r24, 0x3C ; 60 + 2a1a: 99 e2 ldi r25, 0x29 ; 41 + 2a1c: 09 95 icall + 2a1e: c8 2f mov r28, r24 + 2a20: 88 23 and r24, r24 + 2a22: 09 f4 brne .+2 ; 0x2a26 + 2a24: 91 c0 rjmp .+290 ; 0x2b48 + 2a26: 61 e0 ldi r22, 0x01 ; 1 + 2a28: 81 e0 ldi r24, 0x01 ; 1 + 2a2a: 90 e2 ldi r25, 0x20 ; 32 + 2a2c: 0e 94 f5 29 call 0x53ea ; 0x53ea + 2a30: 60 91 a8 28 lds r22, 0x28A8 + 2a34: 81 e0 ldi r24, 0x01 ; 1 + 2a36: 90 e2 ldi r25, 0x20 ; 32 + 2a38: 0e 94 f5 29 call 0x53ea ; 0x53ea TerminalSendByte(BYTE_SOH); TerminalSendByte(CurrentFrameNumber); TerminalSendByte(255 - CurrentFrameNumber); - 29ce: 60 91 9c 28 lds r22, 0x289C - 29d2: 60 95 com r22 - 29d4: 80 e0 ldi r24, 0x00 ; 0 - 29d6: 90 e2 ldi r25, 0x20 ; 32 - 29d8: 0e 94 bf 2b call 0x577e ; 0x577e + 2a3c: 60 91 a8 28 lds r22, 0x28A8 + 2a40: 60 95 com r22 + 2a42: 81 e0 ldi r24, 0x01 ; 1 + 2a44: 90 e2 ldi r25, 0x20 ; 32 + 2a46: 0e 94 f5 29 call 0x53ea ; 0x53ea + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + 2a4a: 60 e8 ldi r22, 0x80 ; 128 + 2a4c: 70 e0 ldi r23, 0x00 ; 0 + 2a4e: 8c e3 ldi r24, 0x3C ; 60 + 2a50: 99 e2 ldi r25, 0x29 ; 41 + 2a52: f4 db rcall .-2072 ; 0x223c + 2a54: ec e3 ldi r30, 0x3C ; 60 + 2a56: f9 e2 ldi r31, 0x29 ; 41 +static uint32_t BlockAddress; + +static XModemCallbackType CallbackFunc; + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + 2a58: 60 e0 ldi r22, 0x00 ; 0 + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + Checksum += *DataPtr++; + 2a5a: 81 91 ld r24, Z+ + 2a5c: 68 0f add r22, r24 + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 2a5e: 89 e2 ldi r24, 0x29 ; 41 + 2a60: ec 3b cpi r30, 0xBC ; 188 + 2a62: f8 07 cpc r31, r24 + 2a64: d1 f7 brne .-12 ; 0x2a5a + 2a66: 81 e0 ldi r24, 0x01 ; 1 + 2a68: 90 e2 ldi r25, 0x20 ; 32 + 2a6a: 0e 94 f5 29 call 0x53ea ; 0x53ea + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 29dc: 60 e8 ldi r22, 0x80 ; 128 - 29de: 70 e0 ldi r23, 0x00 ; 0 - 29e0: 8c e3 ldi r24, 0x3C ; 60 - 29e2: 99 e2 ldi r25, 0x29 ; 41 - 29e4: e2 db rcall .-2108 ; 0x21aa TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 29e6: e1 de rcall .-574 ; 0x27aa - 29e8: 68 2f mov r22, r24 - 29ea: 80 e0 ldi r24, 0x00 ; 0 - 29ec: 90 e2 ldi r25, 0x20 ; 32 - 29ee: 0e 94 bf 2b call 0x577e ; 0x577e BlockAddress += XMODEM_BLOCK_SIZE; - 29f2: 80 91 a0 28 lds r24, 0x28A0 - 29f6: 90 91 a1 28 lds r25, 0x28A1 - 29fa: a0 91 a2 28 lds r26, 0x28A2 - 29fe: b0 91 a3 28 lds r27, 0x28A3 - 2a02: 80 58 subi r24, 0x80 ; 128 - 2a04: 9f 4f sbci r25, 0xFF ; 255 - 2a06: af 4f sbci r26, 0xFF ; 255 - 2a08: bf 4f sbci r27, 0xFF ; 255 - 2a0a: 80 93 a0 28 sts 0x28A0, r24 - 2a0e: 90 93 a1 28 sts 0x28A1, r25 - 2a12: a0 93 a2 28 sts 0x28A2, r26 - 2a16: b0 93 a3 28 sts 0x28A3, r27 - default: - return false; - break; - } + 2a6e: 40 91 9d 28 lds r20, 0x289D + 2a72: 50 91 9e 28 lds r21, 0x289E + 2a76: 60 91 9f 28 lds r22, 0x289F + 2a7a: 70 91 a0 28 lds r23, 0x28A0 + 2a7e: 40 58 subi r20, 0x80 ; 128 + 2a80: 5f 4f sbci r21, 0xFF ; 255 + 2a82: 6f 4f sbci r22, 0xFF ; 255 + 2a84: 7f 4f sbci r23, 0xFF ; 255 + 2a86: 40 93 9d 28 sts 0x289D, r20 + 2a8a: 50 93 9e 28 sts 0x289E, r21 + 2a8e: 60 93 9f 28 sts 0x289F, r22 + 2a92: 70 93 a0 28 sts 0x28A0, r23 + 2a96: 08 cf rjmp .-496 ; 0x28a8 + 2a98: ec e3 ldi r30, 0x3C ; 60 + 2a9a: f9 e2 ldi r31, 0x29 ; 41 + } - return true; - 2a1a: 81 e0 ldi r24, 0x01 ; 1 - 2a1c: 4c cf rjmp .-360 ; 0x28b6 + break; + + case STATE_RECEIVE_PROCESS: + if (ReceivedFrameNumber == CurrentFrameNumber) { + 2a9c: 90 e0 ldi r25, 0x00 ; 0 +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + Checksum += *DataPtr++; + 2a9e: 21 91 ld r18, Z+ + 2aa0: 92 0f add r25, r18 + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 2aa2: 29 e2 ldi r18, 0x29 ; 41 + 2aa4: ec 3b cpi r30, 0xBC ; 188 + 2aa6: f2 07 cpc r31, r18 + 2aa8: d1 f7 brne .-12 ; 0x2a9e case STATE_RECEIVE_PROCESS: if (ReceivedFrameNumber == CurrentFrameNumber) { /* This is the expected frame. Calculate and verify checksum */ if (CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE) == Byte) { - 2a1e: c5 de rcall .-630 ; 0x27aa - 2a20: 8c 13 cpse r24, r28 - 2a22: a0 cf rjmp .-192 ; 0x2964 + 2aaa: 89 13 cpse r24, r25 + 2aac: 6c cf rjmp .-296 ; 0x2986 /* Checksum is valid. Pass received data to callback function */ if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 2a24: 40 91 a0 28 lds r20, 0x28A0 - 2a28: 50 91 a1 28 lds r21, 0x28A1 - 2a2c: 60 91 a2 28 lds r22, 0x28A2 - 2a30: 70 91 a3 28 lds r23, 0x28A3 - 2a34: e0 91 a4 28 lds r30, 0x28A4 - 2a38: f0 91 a5 28 lds r31, 0x28A5 - 2a3c: 20 e8 ldi r18, 0x80 ; 128 - 2a3e: 30 e0 ldi r19, 0x00 ; 0 - 2a40: 8c e3 ldi r24, 0x3C ; 60 - 2a42: 99 e2 ldi r25, 0x29 ; 41 - 2a44: 09 95 icall - 2a46: 88 23 and r24, r24 - 2a48: 81 f1 breq .+96 ; 0x2aaa + 2aae: 40 91 9d 28 lds r20, 0x289D + 2ab2: 50 91 9e 28 lds r21, 0x289E + 2ab6: 60 91 9f 28 lds r22, 0x289F + 2aba: 70 91 a0 28 lds r23, 0x28A0 + 2abe: e0 91 9b 28 lds r30, 0x289B + 2ac2: f0 91 9c 28 lds r31, 0x289C + 2ac6: 20 e8 ldi r18, 0x80 ; 128 + 2ac8: 30 e0 ldi r19, 0x00 ; 0 + 2aca: 8c e3 ldi r24, 0x3C ; 60 + 2acc: 99 e2 ldi r25, 0x29 ; 41 + 2ace: 09 95 icall + 2ad0: c8 2f mov r28, r24 + 2ad2: 88 23 and r24, r24 + 2ad4: 09 f4 brne .+2 ; 0x2ad8 + 2ad6: 42 c0 rjmp .+132 ; 0x2b5c /* Proceed to next frame and send ACK */ CurrentFrameNumber++; - 2a4a: 80 91 9c 28 lds r24, 0x289C - 2a4e: 8f 5f subi r24, 0xFF ; 255 - 2a50: 80 93 9c 28 sts 0x289C, r24 + 2ad8: 80 91 a8 28 lds r24, 0x28A8 + 2adc: 8f 5f subi r24, 0xFF ; 255 + 2ade: 80 93 a8 28 sts 0x28A8, r24 BlockAddress += XMODEM_BLOCK_SIZE; - 2a54: 80 91 a0 28 lds r24, 0x28A0 - 2a58: 90 91 a1 28 lds r25, 0x28A1 - 2a5c: a0 91 a2 28 lds r26, 0x28A2 - 2a60: b0 91 a3 28 lds r27, 0x28A3 - 2a64: 80 58 subi r24, 0x80 ; 128 - 2a66: 9f 4f sbci r25, 0xFF ; 255 - 2a68: af 4f sbci r26, 0xFF ; 255 - 2a6a: bf 4f sbci r27, 0xFF ; 255 - 2a6c: 80 93 a0 28 sts 0x28A0, r24 - 2a70: 90 93 a1 28 sts 0x28A1, r25 - 2a74: a0 93 a2 28 sts 0x28A2, r26 - 2a78: b0 93 a3 28 sts 0x28A3, r27 - 2a7c: 66 e0 ldi r22, 0x06 ; 6 - 2a7e: 73 cf rjmp .-282 ; 0x2966 - switch(State) { - case STATE_RECEIVE_INIT: - case STATE_RECEIVE_WAIT: - if (Byte == BYTE_SOH) { - /* Next frame incoming */ - BufferIdx = 0; - 2a80: 10 92 a6 28 sts 0x28A6, r1 - 2a84: 10 92 a7 28 sts 0x28A7, r1 - Checksum = CHECKSUM_INIT_VALUE; - 2a88: 10 92 a8 28 sts 0x28A8, r1 - State = STATE_RECEIVE_FRAMENUM1; - 2a8c: 83 e0 ldi r24, 0x03 ; 3 - 2a8e: 80 93 9b 28 sts 0x289B, r24 - default: - return false; - break; - } - - return true; - 2a92: 81 e0 ldi r24, 0x01 ; 1 - 2a94: e7 ce rjmp .-562 ; 0x2864 - 2a96: 64 e0 ldi r22, 0x04 ; 4 - 2a98: 80 e0 ldi r24, 0x00 ; 0 - 2a9a: 90 e2 ldi r25, 0x20 ; 32 - 2a9c: 0e 94 bf 2b call 0x577e ; 0x577e - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - - BlockAddress += XMODEM_BLOCK_SIZE; - } else { - TerminalSendByte(BYTE_EOT); - State = STATE_SEND_EOT; - 2aa0: 89 e0 ldi r24, 0x09 ; 9 - 2aa2: 80 93 9b 28 sts 0x289B, r24 - default: - return false; - break; - } - - return true; - 2aa6: 81 e0 ldi r24, 0x01 ; 1 - 2aa8: dd ce rjmp .-582 ; 0x2864 - 2aaa: 68 e1 ldi r22, 0x18 ; 24 - 2aac: 80 e0 ldi r24, 0x00 ; 0 - 2aae: 90 e2 ldi r25, 0x20 ; 32 - 2ab0: 0e 94 bf 2b call 0x577e ; 0x577e - 2ab4: cf ce rjmp .-610 ; 0x2854 - -00002ab6 : -} - -void XModemTick(void) -{ - /* Timeouts go here */ - switch(State) { - 2ab6: 80 91 9b 28 lds r24, 0x289B - 2aba: 81 30 cpi r24, 0x01 ; 1 - 2abc: 99 f0 breq .+38 ; 0x2ae4 - 2abe: 87 30 cpi r24, 0x07 ; 7 - 2ac0: 09 f0 breq .+2 ; 0x2ac4 - 2ac2: 08 95 ret - RetryTimeout = RECV_INIT_TIMEOUT; - } - break; - - case STATE_SEND_INIT: - if (RetryTimeout-- == 0) { - 2ac4: 80 91 9e 28 lds r24, 0x289E - 2ac8: 90 91 9f 28 lds r25, 0x289F - 2acc: 9c 01 movw r18, r24 - 2ace: 21 50 subi r18, 0x01 ; 1 - 2ad0: 31 09 sbc r19, r1 - 2ad2: 20 93 9e 28 sts 0x289E, r18 - 2ad6: 30 93 9f 28 sts 0x289F, r19 - 2ada: 89 2b or r24, r25 - 2adc: 91 f7 brne .-28 ; 0x2ac2 - /* Abort */ - State = STATE_OFF; - 2ade: 10 92 9b 28 sts 0x289B, r1 - 2ae2: 08 95 ret -void XModemTick(void) -{ - /* Timeouts go here */ - switch(State) { - case STATE_RECEIVE_INIT: - if (RetryTimeout-- == 0) { - 2ae4: 80 91 9e 28 lds r24, 0x289E - 2ae8: 90 91 9f 28 lds r25, 0x289F - 2aec: 9c 01 movw r18, r24 - 2aee: 21 50 subi r18, 0x01 ; 1 - 2af0: 31 09 sbc r19, r1 - 2af2: 20 93 9e 28 sts 0x289E, r18 - 2af6: 30 93 9f 28 sts 0x289F, r19 - 2afa: 89 2b or r24, r25 - 2afc: 11 f7 brne .-60 ; 0x2ac2 - if (RetryCount-- > 0) { - 2afe: 80 91 9d 28 lds r24, 0x289D - 2b02: 98 2f mov r25, r24 - 2b04: 91 50 subi r25, 0x01 ; 1 - 2b06: 90 93 9d 28 sts 0x289D, r25 - 2b0a: 81 11 cpse r24, r1 - 2b0c: 09 c0 rjmp .+18 ; 0x2b20 - /* Put out communication request */ - TerminalSendChar(BYTE_NAK); - } else { - /* Just shut off after some time. */ - State = STATE_OFF; - 2b0e: 10 92 9b 28 sts 0x289B, r1 - } - - RetryTimeout = RECV_INIT_TIMEOUT; - 2b12: 85 e0 ldi r24, 0x05 ; 5 - 2b14: 90 e0 ldi r25, 0x00 ; 0 - 2b16: 80 93 9e 28 sts 0x289E, r24 - 2b1a: 90 93 9f 28 sts 0x289F, r25 - 2b1e: 08 95 ret + 2ae2: 40 91 9d 28 lds r20, 0x289D + 2ae6: 50 91 9e 28 lds r21, 0x289E + 2aea: 60 91 9f 28 lds r22, 0x289F + 2aee: 70 91 a0 28 lds r23, 0x28A0 + 2af2: 40 58 subi r20, 0x80 ; 128 + 2af4: 5f 4f sbci r21, 0xFF ; 255 + 2af6: 6f 4f sbci r22, 0xFF ; 255 + 2af8: 7f 4f sbci r23, 0xFF ; 255 + 2afa: 40 93 9d 28 sts 0x289D, r20 + 2afe: 50 93 9e 28 sts 0x289E, r21 + 2b02: 60 93 9f 28 sts 0x289F, r22 + 2b06: 70 93 a0 28 sts 0x28A0, r23 void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } - 2b20: 65 e1 ldi r22, 0x15 ; 21 - 2b22: 80 e0 ldi r24, 0x00 ; 0 - 2b24: 90 e2 ldi r25, 0x20 ; 32 - 2b26: 0e 94 bf 2b call 0x577e ; 0x577e - 2b2a: f3 cf rjmp .-26 ; 0x2b12 + 2b0a: 66 e0 ldi r22, 0x06 ; 6 + 2b0c: 81 e0 ldi r24, 0x01 ; 1 + 2b0e: 90 e2 ldi r25, 0x20 ; 32 + 2b10: 0e 94 f5 29 call 0x53ea ; 0x53ea + TerminalSendChar(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + 2b14: 82 e0 ldi r24, 0x02 ; 2 + 2b16: 80 93 a9 28 sts 0x28A9, r24 + 2b1a: c6 ce rjmp .-628 ; 0x28a8 +INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } + 2b1c: 66 e0 ldi r22, 0x06 ; 6 + 2b1e: 81 e0 ldi r24, 0x01 ; 1 + 2b20: 90 e2 ldi r25, 0x20 ; 32 + 2b22: 0e 94 f5 29 call 0x53ea ; 0x53ea + Checksum = CHECKSUM_INIT_VALUE; + State = STATE_RECEIVE_FRAMENUM1; + } else if (Byte == BYTE_EOT) { + /* Transmission finished */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + 2b26: 10 92 a9 28 sts 0x28A9, r1 + default: + return false; + break; + } -00002b2c : + return true; + 2b2a: c1 e0 ldi r28, 0x01 ; 1 + 2b2c: bd ce rjmp .-646 ; 0x28a8 + 2b2e: 66 e0 ldi r22, 0x06 ; 6 + 2b30: 2b cf rjmp .-426 ; 0x2988 + switch(State) { + case STATE_RECEIVE_INIT: + case STATE_RECEIVE_WAIT: + if (Byte == BYTE_SOH) { + /* Next frame incoming */ + BufferIdx = 0; + 2b32: 10 92 a1 28 sts 0x28A1, r1 + 2b36: 10 92 a2 28 sts 0x28A2, r1 + Checksum = CHECKSUM_INIT_VALUE; + 2b3a: 10 92 a6 28 sts 0x28A6, r1 + State = STATE_RECEIVE_FRAMENUM1; + 2b3e: 83 e0 ldi r24, 0x03 ; 3 + 2b40: 80 93 a9 28 sts 0x28A9, r24 + default: + return false; + break; + } + + return true; + 2b44: c1 e0 ldi r28, 0x01 ; 1 + 2b46: b0 ce rjmp .-672 ; 0x28a8 + 2b48: 64 e0 ldi r22, 0x04 ; 4 + 2b4a: 81 e0 ldi r24, 0x01 ; 1 + 2b4c: 90 e2 ldi r25, 0x20 ; 32 + 2b4e: 0e 94 f5 29 call 0x53ea ; 0x53ea + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + + BlockAddress += XMODEM_BLOCK_SIZE; + } else { + TerminalSendByte(BYTE_EOT); + State = STATE_SEND_EOT; + 2b52: 89 e0 ldi r24, 0x09 ; 9 + 2b54: 80 93 a9 28 sts 0x28A9, r24 + default: + return false; + break; + } + + return true; + 2b58: c1 e0 ldi r28, 0x01 ; 1 + 2b5a: a6 ce rjmp .-692 ; 0x28a8 + 2b5c: 68 e1 ldi r22, 0x18 ; 24 + 2b5e: 81 e0 ldi r24, 0x01 ; 1 + 2b60: 90 e2 ldi r25, 0x20 ; 32 + 2b62: 0e 94 f5 29 call 0x53ea ; 0x53ea + 2b66: b6 ce rjmp .-660 ; 0x28d4 + +00002b68 : +} + +void XModemTick(void) +{ + /* Timeouts go here */ + switch(State) { + 2b68: 80 91 a9 28 lds r24, 0x28A9 + 2b6c: 81 30 cpi r24, 0x01 ; 1 + 2b6e: 99 f0 breq .+38 ; 0x2b96 + 2b70: 87 30 cpi r24, 0x07 ; 7 + 2b72: 81 f4 brne .+32 ; 0x2b94 + RetryTimeout = RECV_INIT_TIMEOUT; + } + break; + + case STATE_SEND_INIT: + if (RetryTimeout-- == 0) { + 2b74: 80 91 a3 28 lds r24, 0x28A3 + 2b78: 90 91 a4 28 lds r25, 0x28A4 + 2b7c: 9c 01 movw r18, r24 + 2b7e: 21 50 subi r18, 0x01 ; 1 + 2b80: 31 09 sbc r19, r1 + 2b82: 20 93 a3 28 sts 0x28A3, r18 + 2b86: 30 93 a4 28 sts 0x28A4, r19 + 2b8a: 89 2b or r24, r25 + 2b8c: 11 f4 brne .+4 ; 0x2b92 + /* Abort */ + State = STATE_OFF; + 2b8e: 10 92 a9 28 sts 0x28A9, r1 + 2b92: 08 95 ret + 2b94: 08 95 ret +void XModemTick(void) +{ + /* Timeouts go here */ + switch(State) { + case STATE_RECEIVE_INIT: + if (RetryTimeout-- == 0) { + 2b96: 80 91 a3 28 lds r24, 0x28A3 + 2b9a: 90 91 a4 28 lds r25, 0x28A4 + 2b9e: 9c 01 movw r18, r24 + 2ba0: 21 50 subi r18, 0x01 ; 1 + 2ba2: 31 09 sbc r19, r1 + 2ba4: 20 93 a3 28 sts 0x28A3, r18 + 2ba8: 30 93 a4 28 sts 0x28A4, r19 + 2bac: 89 2b or r24, r25 + 2bae: 89 f7 brne .-30 ; 0x2b92 + if (RetryCount-- > 0) { + 2bb0: 80 91 a5 28 lds r24, 0x28A5 + 2bb4: 9f ef ldi r25, 0xFF ; 255 + 2bb6: 98 0f add r25, r24 + 2bb8: 90 93 a5 28 sts 0x28A5, r25 + 2bbc: 81 11 cpse r24, r1 + 2bbe: 09 c0 rjmp .+18 ; 0x2bd2 + /* Put out communication request */ + TerminalSendChar(BYTE_NAK); + } else { + /* Just shut off after some time. */ + State = STATE_OFF; + 2bc0: 10 92 a9 28 sts 0x28A9, r1 + } + + RetryTimeout = RECV_INIT_TIMEOUT; + 2bc4: 85 e0 ldi r24, 0x05 ; 5 + 2bc6: 90 e0 ldi r25, 0x00 ; 0 + 2bc8: 80 93 a3 28 sts 0x28A3, r24 + 2bcc: 90 93 a4 28 sts 0x28A4, r25 + 2bd0: 08 95 ret +void EVENT_USB_Device_Connect(void); +void EVENT_USB_Device_Disconnect(void); +void EVENT_USB_Device_ConfigurationChanged(void); +void EVENT_USB_Device_ControlRequest(void); + +INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } + 2bd2: 65 e1 ldi r22, 0x15 ; 21 + 2bd4: 81 e0 ldi r24, 0x01 ; 1 + 2bd6: 90 e2 ldi r25, 0x20 ; 32 + 2bd8: 0e 94 f5 29 call 0x53ea ; 0x53ea + 2bdc: f3 cf rjmp .-26 ; 0x2bc4 + +00002bde : void CommandLineInit(void) { BufferIdx = 0; } bool CommandLineProcessByte(uint8_t Byte) { - 2b2c: af 92 push r10 - 2b2e: bf 92 push r11 - 2b30: df 92 push r13 - 2b32: ef 92 push r14 - 2b34: ff 92 push r15 - 2b36: 0f 93 push r16 - 2b38: 1f 93 push r17 - 2b3a: cf 93 push r28 - 2b3c: df 93 push r29 - 2b3e: 1f 92 push r1 - 2b40: cd b7 in r28, 0x3d ; 61 - 2b42: de b7 in r29, 0x3e ; 62 + 2bde: ef 92 push r14 + 2be0: ff 92 push r15 + 2be2: 0f 93 push r16 + 2be4: 1f 93 push r17 + 2be6: cf 93 push r28 + 2be8: df 93 push r29 + 2bea: 1f 92 push r1 + 2bec: cd b7 in r28, 0x3d ; 61 + 2bee: de b7 in r29, 0x3e ; 62 if (IS_CHARACTER(Byte)){ - 2b44: 98 2f mov r25, r24 - 2b46: 91 54 subi r25, 0x41 ; 65 - 2b48: 9a 31 cpi r25, 0x1A ; 26 - 2b4a: 20 f0 brcs .+8 ; 0x2b54 - 2b4c: 90 52 subi r25, 0x20 ; 32 - 2b4e: 9a 31 cpi r25, 0x1A ; 26 - 2b50: f0 f4 brcc .+60 ; 0x2b8e + 2bf0: 9f eb ldi r25, 0xBF ; 191 + 2bf2: 98 0f add r25, r24 + 2bf4: 9a 31 cpi r25, 0x1A ; 26 + 2bf6: 28 f0 brcs .+10 ; 0x2c02 + 2bf8: 9f e9 ldi r25, 0x9F ; 159 + 2bfa: 98 0f add r25, r24 + 2bfc: 9a 31 cpi r25, 0x1A ; 26 + 2bfe: e0 f4 brcc .+56 ; 0x2c38 /* Store uppercase character */ if (IS_LOWERCASE(Byte)) { Byte = TO_UPPERCASE(Byte); - 2b52: 80 52 subi r24, 0x20 ; 32 + 2c00: 80 52 subi r24, 0x20 ; 32 } /* Prevent buffer overflow and account for '\0' */ if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { - 2b54: 20 91 aa 28 lds r18, 0x28AA - 2b58: 30 91 ab 28 lds r19, 0x28AB - 2b5c: 2f 3f cpi r18, 0xFF ; 255 - 2b5e: 31 05 cpc r19, r1 - 2b60: 50 f4 brcc .+20 ; 0x2b76 + 2c02: 20 91 aa 28 lds r18, 0x28AA + 2c06: 30 91 ab 28 lds r19, 0x28AB + 2c0a: 2f 3f cpi r18, 0xFF ; 255 + 2c0c: 31 05 cpc r19, r1 + 2c0e: 58 f4 brcc .+22 ; 0x2c26 TerminalBuffer[BufferIdx++] = Byte; - 2b62: f9 01 movw r30, r18 - 2b64: e4 5c subi r30, 0xC4 ; 196 - 2b66: f6 4d sbci r31, 0xD6 ; 214 - 2b68: 80 83 st Z, r24 - 2b6a: 2f 5f subi r18, 0xFF ; 255 - 2b6c: 3f 4f sbci r19, 0xFF ; 255 - 2b6e: 20 93 aa 28 sts 0x28AA, r18 - 2b72: 30 93 ab 28 sts 0x28AB, r19 + 2c10: a9 01 movw r20, r18 + 2c12: 4f 5f subi r20, 0xFF ; 255 + 2c14: 5f 4f sbci r21, 0xFF ; 255 + 2c16: 40 93 aa 28 sts 0x28AA, r20 + 2c1a: 50 93 ab 28 sts 0x28AB, r21 + 2c1e: f9 01 movw r30, r18 + 2c20: e4 5c subi r30, 0xC4 ; 196 + 2c22: f6 4d sbci r31, 0xD6 ; 214 + 2c24: 80 83 st Z, r24 } else { /* Ignore other chars */ } return true; } - 2b76: 81 e0 ldi r24, 0x01 ; 1 - 2b78: 0f 90 pop r0 - 2b7a: df 91 pop r29 - 2b7c: cf 91 pop r28 - 2b7e: 1f 91 pop r17 - 2b80: 0f 91 pop r16 - 2b82: ff 90 pop r15 - 2b84: ef 90 pop r14 - 2b86: df 90 pop r13 - 2b88: bf 90 pop r11 - 2b8a: af 90 pop r10 - 2b8c: 08 95 ret + 2c26: 81 e0 ldi r24, 0x01 ; 1 + 2c28: 0f 90 pop r0 + 2c2a: df 91 pop r29 + 2c2c: cf 91 pop r28 + 2c2e: 1f 91 pop r17 + 2c30: 0f 91 pop r16 + 2c32: ff 90 pop r15 + 2c34: ef 90 pop r14 + 2c36: 08 95 ret { BufferIdx = 0; } bool CommandLineProcessByte(uint8_t Byte) { if (IS_CHARACTER(Byte)){ - 2b8e: 9f 5c subi r25, 0xCF ; 207 - 2b90: 9a 30 cpi r25, 0x0A ; 10 - 2b92: 00 f3 brcs .-64 ; 0x2b54 - 2b94: 8f 35 cpi r24, 0x5F ; 95 - 2b96: f1 f2 breq .-68 ; 0x2b54 - 2b98: 8f 33 cpi r24, 0x3F ; 63 - 2b9a: e1 f2 breq .-72 ; 0x2b54 - 2b9c: 8d 33 cpi r24, 0x3D ; 61 - 2b9e: d1 f2 breq .-76 ; 0x2b54 + 2c38: 90 ed ldi r25, 0xD0 ; 208 + 2c3a: 98 0f add r25, r24 + 2c3c: 9a 30 cpi r25, 0x0A ; 10 + 2c3e: 08 f3 brcs .-62 ; 0x2c02 + 2c40: 8f 35 cpi r24, 0x5F ; 95 + 2c42: f9 f2 breq .-66 ; 0x2c02 + 2c44: 98 2f mov r25, r24 + 2c46: 9d 7f andi r25, 0xFD ; 253 + 2c48: 9d 33 cpi r25, 0x3D ; 61 + 2c4a: d9 f2 breq .-74 ; 0x2c02 /* Prevent buffer overflow and account for '\0' */ if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { TerminalBuffer[BufferIdx++] = Byte; } }else if (Byte == '\r') { - 2ba0: 8d 30 cpi r24, 0x0D ; 13 - 2ba2: a9 f0 breq .+42 ; 0x2bce + 2c4c: 8d 30 cpi r24, 0x0D ; 13 + 2c4e: a9 f0 breq .+42 ; 0x2c7a /* Process on \r. Terminate string and decode. */ TerminalBuffer[BufferIdx] = '\0'; BufferIdx = 0; DecodeCommand(); }else if (Byte == '\b') { - 2ba4: 88 30 cpi r24, 0x08 ; 8 - 2ba6: 39 f0 breq .+14 ; 0x2bb6 + 2c50: 88 30 cpi r24, 0x08 ; 8 + 2c52: 39 f0 breq .+14 ; 0x2c62 /* Backspace. Delete last character in buffer. */ if (BufferIdx > 0) { BufferIdx--; } } else if (Byte == 0x1B){ - 2ba8: 8b 31 cpi r24, 0x1B ; 27 - 2baa: 29 f7 brne .-54 ; 0x2b76 + 2c54: 8b 31 cpi r24, 0x1B ; 27 + 2c56: 39 f7 brne .-50 ; 0x2c26 /* Drop buffer on escape */ BufferIdx = 0; - 2bac: 10 92 aa 28 sts 0x28AA, r1 - 2bb0: 10 92 ab 28 sts 0x28AB, r1 - 2bb4: e0 cf rjmp .-64 ; 0x2b76 + 2c58: 10 92 aa 28 sts 0x28AA, r1 + 2c5c: 10 92 ab 28 sts 0x28AB, r1 + 2c60: e2 cf rjmp .-60 ; 0x2c26 BufferIdx = 0; DecodeCommand(); }else if (Byte == '\b') { /* Backspace. Delete last character in buffer. */ if (BufferIdx > 0) { - 2bb6: 80 91 aa 28 lds r24, 0x28AA - 2bba: 90 91 ab 28 lds r25, 0x28AB - 2bbe: 00 97 sbiw r24, 0x00 ; 0 - 2bc0: d1 f2 breq .-76 ; 0x2b76 + 2c62: 80 91 aa 28 lds r24, 0x28AA + 2c66: 90 91 ab 28 lds r25, 0x28AB + 2c6a: 00 97 sbiw r24, 0x00 ; 0 + 2c6c: e1 f2 breq .-72 ; 0x2c26 BufferIdx--; - 2bc2: 01 97 sbiw r24, 0x01 ; 1 - 2bc4: 80 93 aa 28 sts 0x28AA, r24 - 2bc8: 90 93 ab 28 sts 0x28AB, r25 - 2bcc: d4 cf rjmp .-88 ; 0x2b76 + 2c6e: 01 97 sbiw r24, 0x01 ; 1 + 2c70: 80 93 aa 28 sts 0x28AA, r24 + 2c74: 90 93 ab 28 sts 0x28AB, r25 + 2c78: d6 cf rjmp .-84 ; 0x2c26 if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { TerminalBuffer[BufferIdx++] = Byte; } }else if (Byte == '\r') { /* Process on \r. Terminate string and decode. */ TerminalBuffer[BufferIdx] = '\0'; - 2bce: e0 91 aa 28 lds r30, 0x28AA - 2bd2: f0 91 ab 28 lds r31, 0x28AB - 2bd6: e4 5c subi r30, 0xC4 ; 196 - 2bd8: f6 4d sbci r31, 0xD6 ; 214 - 2bda: 10 82 st Z, r1 + 2c7a: e0 91 aa 28 lds r30, 0x28AA + 2c7e: f0 91 ab 28 lds r31, 0x28AB + 2c82: e4 5c subi r30, 0xC4 ; 196 + 2c84: f6 4d sbci r31, 0xD6 ; 214 + 2c86: 10 82 st Z, r1 BufferIdx = 0; - 2bdc: 10 92 aa 28 sts 0x28AA, r1 - 2be0: 10 92 ab 28 sts 0x28AB, r1 + 2c88: 10 92 aa 28 sts 0x28AA, r1 + 2c8c: 10 92 ab 28 sts 0x28AB, r1 bool CommandFound = false; CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; char* pTerminalBuffer = (char*) TerminalBuffer; /* Do some sanity check first */ if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { - 2be4: 80 91 3c 29 lds r24, 0x293C - 2be8: 88 23 and r24, r24 - 2bea: 69 f1 breq .+90 ; 0x2c46 - 2bec: 8f 33 cpi r24, 0x3F ; 63 - 2bee: 59 f1 breq .+86 ; 0x2c46 - 2bf0: 8d 33 cpi r24, 0x3D ; 61 - 2bf2: 49 f1 breq .+82 ; 0x2c46 - 2bf4: ed e3 ldi r30, 0x3D ; 61 - 2bf6: f9 e2 ldi r31, 0x29 ; 41 - 2bf8: 04 c0 rjmp .+8 ; 0x2c02 + 2c90: 80 91 3c 29 lds r24, 0x293C + 2c94: 88 23 and r24, r24 + 2c96: 31 f1 breq .+76 ; 0x2ce4 + 2c98: 8d 7f andi r24, 0xFD ; 253 + 2c9a: 8d 33 cpi r24, 0x3D ; 61 + 2c9c: 19 f1 breq .+70 ; 0x2ce4 + 2c9e: ed e3 ldi r30, 0x3D ; 61 + 2ca0: f9 e2 ldi r31, 0x29 ; 41 + 2ca2: 04 c0 rjmp .+8 ; 0x2cac char* pCommandDelimiter = pTerminalBuffer; char CommandDelimiter = '\0'; /* Search for command delimiter, store it and replace with '\0' */ while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 2bfa: 2f 33 cpi r18, 0x3F ; 63 - 2bfc: 31 f0 breq .+12 ; 0x2c0a - 2bfe: 2d 33 cpi r18, 0x3D ; 61 - 2c00: 21 f0 breq .+8 ; 0x2c0a + 2ca4: 2f 33 cpi r18, 0x3F ; 63 + 2ca6: 31 f0 breq .+12 ; 0x2cb4 + 2ca8: 2d 33 cpi r18, 0x3D ; 61 + 2caa: 21 f0 breq .+8 ; 0x2cb4 pCommandDelimiter++; - 2c02: 7f 01 movw r14, r30 + 2cac: 8f 01 movw r16, r30 if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { char* pCommandDelimiter = pTerminalBuffer; char CommandDelimiter = '\0'; /* Search for command delimiter, store it and replace with '\0' */ while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 2c04: 21 91 ld r18, Z+ - 2c06: 21 11 cpse r18, r1 - 2c08: f8 cf rjmp .-16 ; 0x2bfa + 2cae: 21 91 ld r18, Z+ + 2cb0: 21 11 cpse r18, r1 + 2cb2: f8 cf rjmp .-16 ; 0x2ca4 pCommandDelimiter++; CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; - 2c0a: f7 01 movw r30, r14 - 2c0c: 10 82 st Z, r1 - 2c0e: 00 e0 ldi r16, 0x00 ; 0 - 2c10: 10 e0 ldi r17, 0x00 ; 0 + 2cb4: f8 01 movw r30, r16 + 2cb6: 10 82 st Z, r1 + 2cb8: 83 e0 ldi r24, 0x03 ; 3 + 2cba: e8 2e mov r14, r24 + 2cbc: 88 e0 ldi r24, 0x08 ; 8 + 2cbe: f8 2e mov r15, r24 /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 2c12: 86 e1 ldi r24, 0x16 ; 22 - 2c14: d8 2e mov r13, r24 - 2c16: d0 9e mul r13, r16 - 2c18: 50 01 movw r10, r0 - 2c1a: d1 9e mul r13, r17 - 2c1c: b0 0c add r11, r0 - 2c1e: 11 24 eor r1, r1 - 2c20: 81 e4 ldi r24, 0x41 ; 65 - 2c22: 96 e0 ldi r25, 0x06 ; 6 - 2c24: a8 0e add r10, r24 - 2c26: b9 1e adc r11, r25 - 2c28: b5 01 movw r22, r10 - 2c2a: 8c e3 ldi r24, 0x3C ; 60 - 2c2c: 99 e2 ldi r25, 0x29 ; 41 - 2c2e: 29 83 std Y+1, r18 ; 0x01 - 2c30: 0e 94 d5 2d call 0x5baa ; 0x5baa - 2c34: 29 81 ldd r18, Y+1 ; 0x01 - 2c36: 89 2b or r24, r25 - 2c38: 09 f4 brne .+2 ; 0x2c3c - 2c3a: 3f c0 rjmp .+126 ; 0x2cba - 2c3c: 0f 5f subi r16, 0xFF ; 255 - 2c3e: 1f 4f sbci r17, 0xFF ; 255 + 2cc0: b7 01 movw r22, r14 + 2cc2: 8c e3 ldi r24, 0x3C ; 60 + 2cc4: 99 e2 ldi r25, 0x29 ; 41 + 2cc6: 29 83 std Y+1, r18 ; 0x01 + 2cc8: 0e 94 ff 2b call 0x57fe ; 0x57fe + 2ccc: 29 81 ldd r18, Y+1 ; 0x01 + 2cce: 89 2b or r24, r25 + 2cd0: 09 f4 brne .+2 ; 0x2cd4 + 2cd2: 43 c0 rjmp .+134 ; 0x2d5a + 2cd4: f6 e1 ldi r31, 0x16 ; 22 + 2cd6: ef 0e add r14, r31 + 2cd8: f1 1c adc r15, r1 CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 2c40: 05 31 cpi r16, 0x15 ; 21 - 2c42: 11 05 cpc r17, r1 - 2c44: 41 f7 brne .-48 ; 0x2c16 + 2cda: 81 ed ldi r24, 0xD1 ; 209 + 2cdc: e8 16 cp r14, r24 + 2cde: 89 e0 ldi r24, 0x09 ; 9 + 2ce0: f8 06 cpc r15, r24 + 2ce2: 71 f7 brne .-36 ; 0x2cc0 static void DecodeCommand(void) { uint8_t i; bool CommandFound = false; CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; - 2c46: 88 ec ldi r24, 0xC8 ; 200 + 2ce4: 88 ec ldi r24, 0xC8 ; 200 } static void DecodeCommand(void) { uint8_t i; bool CommandFound = false; - 2c48: 10 e0 ldi r17, 0x00 ; 0 + 2ce6: 10 e0 ldi r17, 0x00 ; 0 static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 2c4a: e5 e1 ldi r30, 0x15 ; 21 - 2c4c: f8 e0 ldi r31, 0x08 ; 8 - 2c4e: e4 91 lpm r30, Z - 2c50: 8e 17 cp r24, r30 - 2c52: 09 f4 brne .+2 ; 0x2c56 - 2c54: 63 c0 rjmp .+198 ; 0x2d1c - 2c56: e6 e3 ldi r30, 0x36 ; 54 - 2c58: f8 e0 ldi r31, 0x08 ; 8 - 2c5a: e4 91 lpm r30, Z - 2c5c: 8e 17 cp r24, r30 - 2c5e: 09 f4 brne .+2 ; 0x2c62 - 2c60: 5a c0 rjmp .+180 ; 0x2d16 - 2c62: e7 e5 ldi r30, 0x57 ; 87 - 2c64: f8 e0 ldi r31, 0x08 ; 8 - 2c66: e4 91 lpm r30, Z - 2c68: 8e 17 cp r24, r30 - 2c6a: 09 f4 brne .+2 ; 0x2c6e - 2c6c: 51 c0 rjmp .+162 ; 0x2d10 - 2c6e: e8 e7 ldi r30, 0x78 ; 120 - 2c70: f8 e0 ldi r31, 0x08 ; 8 - 2c72: e4 91 lpm r30, Z - 2c74: 8e 17 cp r24, r30 - 2c76: 09 f4 brne .+2 ; 0x2c7a - 2c78: 48 c0 rjmp .+144 ; 0x2d0a - 2c7a: e9 e9 ldi r30, 0x99 ; 153 - 2c7c: f8 e0 ldi r31, 0x08 ; 8 - 2c7e: e4 91 lpm r30, Z - 2c80: 8e 17 cp r24, r30 - 2c82: 09 f4 brne .+2 ; 0x2c86 - 2c84: 3f c0 rjmp .+126 ; 0x2d04 - 2c86: ea eb ldi r30, 0xBA ; 186 - 2c88: f8 e0 ldi r31, 0x08 ; 8 - 2c8a: e4 91 lpm r30, Z - 2c8c: 8e 17 cp r24, r30 - 2c8e: 79 f1 breq .+94 ; 0x2cee + 2ce8: ed e3 ldi r30, 0x3D ; 61 + 2cea: f7 e0 ldi r31, 0x07 ; 7 + 2cec: e4 91 lpm r30, Z + 2cee: 8e 17 cp r24, r30 + 2cf0: 09 f4 brne .+2 ; 0x2cf4 + 2cf2: 70 c0 rjmp .+224 ; 0x2dd4 + 2cf4: ee e5 ldi r30, 0x5E ; 94 + 2cf6: f7 e0 ldi r31, 0x07 ; 7 + 2cf8: e4 91 lpm r30, Z + 2cfa: 8e 17 cp r24, r30 + 2cfc: 09 f4 brne .+2 ; 0x2d00 + 2cfe: 67 c0 rjmp .+206 ; 0x2dce + 2d00: ef e7 ldi r30, 0x7F ; 127 + 2d02: f7 e0 ldi r31, 0x07 ; 7 + 2d04: e4 91 lpm r30, Z + 2d06: 8e 17 cp r24, r30 + 2d08: 09 f4 brne .+2 ; 0x2d0c + 2d0a: 5e c0 rjmp .+188 ; 0x2dc8 + 2d0c: e0 ea ldi r30, 0xA0 ; 160 + 2d0e: f7 e0 ldi r31, 0x07 ; 7 + 2d10: e4 91 lpm r30, Z + 2d12: 8e 17 cp r24, r30 + 2d14: 09 f4 brne .+2 ; 0x2d18 + 2d16: 55 c0 rjmp .+170 ; 0x2dc2 + 2d18: e1 ec ldi r30, 0xC1 ; 193 + 2d1a: f7 e0 ldi r31, 0x07 ; 7 + 2d1c: e4 91 lpm r30, Z + 2d1e: 8e 17 cp r24, r30 + 2d20: 09 f4 brne .+2 ; 0x2d24 + 2d22: 4c c0 rjmp .+152 ; 0x2dbc + 2d24: e2 ee ldi r30, 0xE2 ; 226 + 2d26: f7 e0 ldi r31, 0x07 ; 7 + 2d28: e4 91 lpm r30, Z + 2d2a: 8e 17 cp r24, r30 + 2d2c: 09 f4 brne .+2 ; 0x2d30 + 2d2e: 3b c0 rjmp .+118 ; 0x2da6 return StatusTable[i].Message; } return (void*) 0; - 2c90: 80 e0 ldi r24, 0x00 ; 0 - 2c92: 90 e0 ldi r25, 0x00 ; 0 + 2d30: 80 e0 ldi r24, 0x00 ; 0 + 2d32: 90 e0 ldi r25, 0x00 ; 0 } } } /* Send command status message */ TerminalSendStringP(GetStatusMessageP(StatusId)); - 2c94: 76 da rcall .-2836 ; 0x2182 + 2d34: 6f da rcall .-2850 ; 0x2214 TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); - 2c96: 8f e0 ldi r24, 0x0F ; 15 - 2c98: 98 e0 ldi r25, 0x08 ; 8 - 2c9a: 73 da rcall .-2842 ; 0x2182 + 2d36: 8a e3 ldi r24, 0x3A ; 58 + 2d38: 97 e0 ldi r25, 0x07 ; 7 + 2d3a: 6c da rcall .-2856 ; 0x2214 if (CommandFound && (pTerminalBuffer[0] != '\0') ) { - 2c9c: 11 23 and r17, r17 - 2c9e: 09 f4 brne .+2 ; 0x2ca2 - 2ca0: 6a cf rjmp .-300 ; 0x2b76 - 2ca2: 80 91 3c 29 lds r24, 0x293C - 2ca6: 88 23 and r24, r24 - 2ca8: 09 f4 brne .+2 ; 0x2cac - 2caa: 65 cf rjmp .-310 ; 0x2b76 + 2d3c: 11 23 and r17, r17 + 2d3e: 09 f4 brne .+2 ; 0x2d42 + 2d40: 72 cf rjmp .-284 ; 0x2c26 + 2d42: 80 91 3c 29 lds r24, 0x293C + 2d46: 88 23 and r24, r24 + 2d48: 09 f4 brne .+2 ; 0x2d4c + 2d4a: 6d cf rjmp .-294 ; 0x2c26 /* Send optional answer */ TerminalSendString(pTerminalBuffer); - 2cac: 8c e3 ldi r24, 0x3C ; 60 - 2cae: 99 e2 ldi r25, 0x29 ; 41 - 2cb0: 63 da rcall .-2874 ; 0x2178 + 2d4c: 8c e3 ldi r24, 0x3C ; 60 + 2d4e: 99 e2 ldi r25, 0x29 ; 41 + 2d50: 5c da rcall .-2888 ; 0x220a TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); - 2cb2: 82 e1 ldi r24, 0x12 ; 18 - 2cb4: 98 e0 ldi r25, 0x08 ; 8 - 2cb6: 65 da rcall .-2870 ; 0x2182 - 2cb8: 5e cf rjmp .-324 ; 0x2b76 + 2d52: 87 e3 ldi r24, 0x37 ; 55 + 2d54: 97 e0 ldi r25, 0x07 ; 7 + 2d56: 5e da rcall .-2884 ; 0x2214 + 2d58: 66 cf rjmp .-308 ; 0x2c26 for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; - 2cba: 10 92 3c 29 sts 0x293C, r1 + 2d5a: 10 92 3c 29 sts 0x293C, r1 static CommandStatusIdType CallCommandFunc( const CommandEntryType* CommandEntry, char CommandDelimiter, char* pParam) { char* pTerminalBuffer = (char*) TerminalBuffer; /* Call appropriate function depending on CommandDelimiter */ if (CommandDelimiter == CHAR_GET_MODE) { - 2cbe: 2f 33 cpi r18, 0x3F ; 63 - 2cc0: 99 f0 breq .+38 ; 0x2ce8 + 2d5e: 2f 33 cpi r18, 0x3F ; 63 + 2d60: b9 f0 breq .+46 ; 0x2d90 CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); if (GetFunc != NO_FUNCTION) { return GetFunc(pTerminalBuffer); } } else if (CommandDelimiter == CHAR_SET_MODE) { - 2cc2: 2d 33 cpi r18, 0x3D ; 61 - 2cc4: 71 f1 breq .+92 ; 0x2d22 + 2d62: 2d 33 cpi r18, 0x3D ; 61 + 2d64: 09 f4 brne .+2 ; 0x2d68 + 2d66: 39 c0 rjmp .+114 ; 0x2dda CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); if (SetFunc != NO_FUNCTION) { return SetFunc(pParam); } } else if (CommandDelimiter == CHAR_EXEC_MODE){ - 2cc6: 22 23 and r18, r18 - 2cc8: 19 f0 breq .+6 ; 0x2cd0 + 2d68: 22 23 and r18, r18 + 2d6a: 19 f0 breq .+6 ; 0x2d72 } else { /* This should not happen (TM) */ } /* This delimiter has not been registered with this command */ return COMMAND_ERR_INVALID_USAGE_ID; - 2cca: 89 ec ldi r24, 0xC9 ; 201 + 2d6c: 89 ec ldi r24, 0xC9 ; 201 if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 2ccc: 11 e0 ldi r17, 0x01 ; 1 - 2cce: bd cf rjmp .-134 ; 0x2c4a + 2d6e: 11 e0 ldi r17, 0x01 ; 1 + 2d70: bb cf rjmp .-138 ; 0x2ce8 CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); if (SetFunc != NO_FUNCTION) { return SetFunc(pParam); } } else if (CommandDelimiter == CHAR_EXEC_MODE){ CommandExecFuncType ExecFunc = pgm_read_ptr(&CommandEntry->ExecFunc); - 2cd0: f5 01 movw r30, r10 - 2cd2: 70 96 adiw r30, 0x10 ; 16 - 2cd4: 85 91 lpm r24, Z+ - 2cd6: 94 91 lpm r25, Z - 2cd8: fc 01 movw r30, r24 + 2d72: 97 01 movw r18, r14 + 2d74: 20 5f subi r18, 0xF0 ; 240 + 2d76: 3f 4f sbci r19, 0xFF ; 255 + 2d78: f9 01 movw r30, r18 + 2d7a: 45 91 lpm r20, Z+ + 2d7c: 54 91 lpm r21, Z if (ExecFunc != NO_FUNCTION) { - 2cda: 00 97 sbiw r24, 0x00 ; 0 - 2cdc: b1 f3 breq .-20 ; 0x2cca + 2d7e: 41 15 cp r20, r1 + 2d80: 51 05 cpc r21, r1 + 2d82: a1 f3 breq .-24 ; 0x2d6c return ExecFunc(pTerminalBuffer); - 2cde: 8c e3 ldi r24, 0x3C ; 60 - 2ce0: 99 e2 ldi r25, 0x29 ; 41 - 2ce2: 09 95 icall + 2d84: 8c e3 ldi r24, 0x3C ; 60 + 2d86: 99 e2 ldi r25, 0x29 ; 41 + 2d88: fa 01 movw r30, r20 + 2d8a: 09 95 icall if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 2ce4: 11 e0 ldi r17, 0x01 ; 1 - 2ce6: b1 cf rjmp .-158 ; 0x2c4a + 2d8c: 11 e0 ldi r17, 0x01 ; 1 + 2d8e: ac cf rjmp .-168 ; 0x2ce8 const CommandEntryType* CommandEntry, char CommandDelimiter, char* pParam) { char* pTerminalBuffer = (char*) TerminalBuffer; /* Call appropriate function depending on CommandDelimiter */ if (CommandDelimiter == CHAR_GET_MODE) { CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); - 2ce8: f5 01 movw r30, r10 - 2cea: 74 96 adiw r30, 0x14 ; 20 - 2cec: f3 cf rjmp .-26 ; 0x2cd4 + 2d90: 97 01 movw r18, r14 + 2d92: 2c 5e subi r18, 0xEC ; 236 + 2d94: 3f 4f sbci r19, 0xFF ; 255 + 2d96: f9 01 movw r30, r18 + 2d98: 45 91 lpm r20, Z+ + 2d9a: 54 91 lpm r21, Z + if (GetFunc != NO_FUNCTION) { + 2d9c: 41 15 cp r20, r1 + 2d9e: 51 05 cpc r21, r1 + 2da0: 89 f7 brne .-30 ; 0x2d84 + } else { + /* This should not happen (TM) */ + } + + /* This delimiter has not been registered with this command */ + return COMMAND_ERR_INVALID_USAGE_ID; + 2da2: 89 ec ldi r24, 0xC9 ; 201 + 2da4: e4 cf rjmp .-56 ; 0x2d6e static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 2cee: 25 e0 ldi r18, 0x05 ; 5 - 2cf0: 30 e0 ldi r19, 0x00 ; 0 + 2da6: 25 e0 ldi r18, 0x05 ; 5 + 2da8: 30 e0 ldi r19, 0x00 ; 0 return StatusTable[i].Message; - 2cf2: 41 e2 ldi r20, 0x21 ; 33 - 2cf4: 42 9f mul r20, r18 - 2cf6: c0 01 movw r24, r0 - 2cf8: 43 9f mul r20, r19 - 2cfa: 90 0d add r25, r0 - 2cfc: 11 24 eor r1, r1 - 2cfe: 8a 5e subi r24, 0xEA ; 234 - 2d00: 97 4f sbci r25, 0xF7 ; 247 - 2d02: c8 cf rjmp .-112 ; 0x2c94 + 2daa: 41 e2 ldi r20, 0x21 ; 33 + 2dac: 42 9f mul r20, r18 + 2dae: c0 01 movw r24, r0 + 2db0: 43 9f mul r20, r19 + 2db2: 90 0d add r25, r0 + 2db4: 11 24 eor r1, r1 + 2db6: 82 5c subi r24, 0xC2 ; 194 + 2db8: 98 4f sbci r25, 0xF8 ; 248 + 2dba: bc cf rjmp .-136 ; 0x2d34 static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 2d04: 24 e0 ldi r18, 0x04 ; 4 - 2d06: 30 e0 ldi r19, 0x00 ; 0 - 2d08: f4 cf rjmp .-24 ; 0x2cf2 - 2d0a: 23 e0 ldi r18, 0x03 ; 3 - 2d0c: 30 e0 ldi r19, 0x00 ; 0 - 2d0e: f1 cf rjmp .-30 ; 0x2cf2 - 2d10: 22 e0 ldi r18, 0x02 ; 2 - 2d12: 30 e0 ldi r19, 0x00 ; 0 - 2d14: ee cf rjmp .-36 ; 0x2cf2 - 2d16: 21 e0 ldi r18, 0x01 ; 1 - 2d18: 30 e0 ldi r19, 0x00 ; 0 - 2d1a: eb cf rjmp .-42 ; 0x2cf2 - 2d1c: 20 e0 ldi r18, 0x00 ; 0 - 2d1e: 30 e0 ldi r19, 0x00 ; 0 - 2d20: e8 cf rjmp .-48 ; 0x2cf2 + 2dbc: 24 e0 ldi r18, 0x04 ; 4 + 2dbe: 30 e0 ldi r19, 0x00 ; 0 + 2dc0: f4 cf rjmp .-24 ; 0x2daa + 2dc2: 23 e0 ldi r18, 0x03 ; 3 + 2dc4: 30 e0 ldi r19, 0x00 ; 0 + 2dc6: f1 cf rjmp .-30 ; 0x2daa + 2dc8: 22 e0 ldi r18, 0x02 ; 2 + 2dca: 30 e0 ldi r19, 0x00 ; 0 + 2dcc: ee cf rjmp .-36 ; 0x2daa + 2dce: 21 e0 ldi r18, 0x01 ; 1 + 2dd0: 30 e0 ldi r19, 0x00 ; 0 + 2dd2: eb cf rjmp .-42 ; 0x2daa + 2dd4: 20 e0 ldi r18, 0x00 ; 0 + 2dd6: 30 e0 ldi r19, 0x00 ; 0 + 2dd8: e8 cf rjmp .-48 ; 0x2daa CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); if (GetFunc != NO_FUNCTION) { return GetFunc(pTerminalBuffer); } } else if (CommandDelimiter == CHAR_SET_MODE) { CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); - 2d22: f5 01 movw r30, r10 - 2d24: 72 96 adiw r30, 0x12 ; 18 - 2d26: 85 91 lpm r24, Z+ - 2d28: 94 91 lpm r25, Z - 2d2a: fc 01 movw r30, r24 + 2dda: 97 01 movw r18, r14 + 2ddc: 2e 5e subi r18, 0xEE ; 238 + 2dde: 3f 4f sbci r19, 0xFF ; 255 + 2de0: f9 01 movw r30, r18 + 2de2: 45 91 lpm r20, Z+ + 2de4: 54 91 lpm r21, Z if (SetFunc != NO_FUNCTION) { - 2d2c: 00 97 sbiw r24, 0x00 ; 0 - 2d2e: 69 f2 breq .-102 ; 0x2cca + 2de6: 41 15 cp r20, r1 + 2de8: 51 05 cpc r21, r1 + 2dea: 09 f4 brne .+2 ; 0x2dee + 2dec: bf cf rjmp .-130 ; 0x2d6c return SetFunc(pParam); - 2d30: c7 01 movw r24, r14 - 2d32: 01 96 adiw r24, 0x01 ; 1 - 2d34: 09 95 icall + 2dee: c8 01 movw r24, r16 + 2df0: 01 96 adiw r24, 0x01 ; 1 + 2df2: fa 01 movw r30, r20 + 2df4: 09 95 icall if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 2d36: 11 e0 ldi r17, 0x01 ; 1 - 2d38: 88 cf rjmp .-240 ; 0x2c4a + 2df6: 11 e0 ldi r17, 0x01 ; 1 + 2df8: 77 cf rjmp .-274 ; 0x2ce8 -00002d3a : +00002dfa : return true; } void CommandLineTick(void) { - 2d3a: 08 95 ret + 2dfa: 08 95 ret -00002d3c : +00002dfc : INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); } INLINE void CodecSetDemodPower(bool bOnOff) { CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 2d3c: a0 e2 ldi r26, 0x20 ; 32 - 2d3e: b6 e0 ldi r27, 0x06 ; 6 - 2d40: 82 e0 ldi r24, 0x02 ; 2 - 2d42: 11 96 adiw r26, 0x01 ; 1 - 2d44: 8c 93 st X, r24 - 2d46: 11 97 sbiw r26, 0x01 ; 1 + 2dfc: a0 e2 ldi r26, 0x20 ; 32 + 2dfe: b6 e0 ldi r27, 0x06 ; 6 + 2e00: 82 e0 ldi r24, 0x02 ; 2 + 2e02: 11 96 adiw r26, 0x01 ; 1 + 2e04: 8c 93 st X, r24 + 2e06: 11 97 sbiw r26, 0x01 ; 1 if (bOnOff) { CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; - 2d48: 15 96 adiw r26, 0x05 ; 5 - 2d4a: 8c 93 st X, r24 - 2d4c: 15 97 sbiw r26, 0x05 ; 5 + 2e08: 15 96 adiw r26, 0x05 ; 5 + 2e0a: 8c 93 st X, r24 + 2e0c: 15 97 sbiw r26, 0x05 ; 5 static void StartDemod(void) { /* Activate Power for demodulator */ CodecSetDemodPower(true); CodecBufferPtr = CodecBuffer; - 2d4e: 8c e3 ldi r24, 0x3C ; 60 - 2d50: 9a e2 ldi r25, 0x2A ; 42 - 2d52: 80 93 b8 28 sts 0x28B8, r24 - 2d56: 90 93 b9 28 sts 0x28B9, r25 + 2e0e: 8c e3 ldi r24, 0x3C ; 60 + 2e10: 9a e2 ldi r25, 0x2A ; 42 + 2e12: 80 93 b8 28 sts 0x28B8, r24 + 2e16: 90 93 b9 28 sts 0x28B9, r25 ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 2d5a: 8c eb ldi r24, 0xBC ; 188 - 2d5c: 9a e2 ldi r25, 0x2A ; 42 - 2d5e: 80 93 ba 28 sts 0x28BA, r24 - 2d62: 90 93 bb 28 sts 0x28BB, r25 + 2e1a: 8c eb ldi r24, 0xBC ; 188 + 2e1c: 9a e2 ldi r25, 0x2A ; 42 + 2e1e: 80 93 b6 28 sts 0x28B6, r24 + 2e22: 90 93 b7 28 sts 0x28B7, r25 DataRegister = 0; - 2d66: 10 92 b1 28 sts 0x28B1, r1 + 2e26: 10 92 b1 28 sts 0x28B1, r1 SampleRegister = 0; - 2d6a: 10 92 b0 28 sts 0x28B0, r1 + 2e2a: 10 92 b0 28 sts 0x28B0, r1 SamplePosition = 0; - 2d6e: 10 92 ac 28 sts 0x28AC, r1 + 2e2e: 10 92 ac 28 sts 0x28AC, r1 BitCount = 0; - 2d72: 10 92 b4 28 sts 0x28B4, r1 - 2d76: 10 92 b5 28 sts 0x28B5, r1 + 2e32: 10 92 b4 28 sts 0x28B4, r1 + 2e36: 10 92 b5 28 sts 0x28B5, r1 IsParityBit = false; - 2d7a: 10 92 af 28 sts 0x28AF, r1 + 2e3a: 10 92 af 28 sts 0x28AF, r1 /* Configure sampling-timer free running and sync to first modulation-pause. */ CODEC_TIMER_SAMPLING.CNT = 0; - 2d7e: e0 e4 ldi r30, 0x40 ; 64 - 2d80: f8 e0 ldi r31, 0x08 ; 8 - 2d82: 10 a2 std Z+32, r1 ; 0x20 - 2d84: 11 a2 std Z+33, r1 ; 0x21 + 2e3e: e0 e4 ldi r30, 0x40 ; 64 + 2e40: f8 e0 ldi r31, 0x08 ; 8 + 2e42: 10 a2 std Z+32, r1 ; 0x20 + 2e44: 11 a2 std Z+33, r1 ; 0x21 CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; - 2d86: 8d e2 ldi r24, 0x2D ; 45 - 2d88: 91 e0 ldi r25, 0x01 ; 1 - 2d8a: 86 a3 std Z+38, r24 ; 0x26 - 2d8c: 97 a3 std Z+39, r25 ; 0x27 + 2e46: 8d e2 ldi r24, 0x2D ; 45 + 2e48: 91 e0 ldi r25, 0x01 ; 1 + 2e4a: 86 a3 std Z+38, r24 ; 0x26 + 2e4c: 97 a3 std Z+39, r25 ; 0x27 CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ - 2d8e: 8f ef ldi r24, 0xFF ; 255 - 2d90: 9f ef ldi r25, 0xFF ; 255 - 2d92: 80 a7 std Z+40, r24 ; 0x28 - 2d94: 91 a7 std Z+41, r25 ; 0x29 + 2e4e: 8f ef ldi r24, 0xFF ; 255 + 2e50: 9f ef ldi r25, 0xFF ; 255 + 2e52: 80 a7 std Z+40, r24 ; 0x28 + 2e54: 91 a7 std Z+41, r25 ; 0x29 CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; - 2d96: 81 e0 ldi r24, 0x01 ; 1 - 2d98: 80 83 st Z, r24 + 2e56: 81 e0 ldi r24, 0x01 ; 1 + 2e58: 80 83 st Z, r24 CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - 2d9a: 88 e8 ldi r24, 0x88 ; 136 - 2d9c: 83 83 std Z+3, r24 ; 0x03 + 2e5a: 88 e8 ldi r24, 0x88 ; 136 + 2e5c: 83 83 std Z+3, r24 ; 0x03 CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; - 2d9e: 83 e0 ldi r24, 0x03 ; 3 - 2da0: 87 83 std Z+7, r24 ; 0x07 + 2e5e: 83 e0 ldi r24, 0x03 ; 3 + 2e60: 87 83 std Z+7, r24 ; 0x07 /* Start looking out for modulation pause via interrupt. */ CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; - 2da2: 84 e0 ldi r24, 0x04 ; 4 - 2da4: 1a 96 adiw r26, 0x0a ; 10 - 2da6: 8c 93 st X, r24 + 2e62: 84 e0 ldi r24, 0x04 ; 4 + 2e64: 1a 96 adiw r26, 0x0a ; 10 + 2e66: 8c 93 st X, r24 SLEEP.CTRL &= ~SLEEP_SEN_bm; } INLINE void SystemSleepSetMode(uint8_t SleepMode) { SLEEP.CTRL = (SLEEP.CTRL & ~SLEEP_SMODE_gm) | SleepMode; - 2da8: e8 e4 ldi r30, 0x48 ; 72 - 2daa: f0 e0 ldi r31, 0x00 ; 0 - 2dac: 80 81 ld r24, Z - 2dae: 81 7f andi r24, 0xF1 ; 241 - 2db0: 86 60 ori r24, 0x06 ; 6 - 2db2: 80 83 st Z, r24 - 2db4: 08 95 ret + 2e68: e8 e4 ldi r30, 0x48 ; 72 + 2e6a: f0 e0 ldi r31, 0x00 ; 0 + 2e6c: 80 81 ld r24, Z + 2e6e: 81 7f andi r24, 0xF1 ; 241 + 2e70: 86 60 ori r24, 0x06 ; 6 + 2e72: 80 83 st Z, r24 + 2e74: 08 95 ret -00002db6 <__vector_34>: +00002e76 <__vector_34>: SystemSleepSetMode(SYSTEM_SMODE_PSAVE); } ISR(CODEC_DEMOD_IN_INT0_VECT) { - 2db6: 1f 92 push r1 - 2db8: 0f 92 push r0 - 2dba: 0f b6 in r0, 0x3f ; 63 - 2dbc: 0f 92 push r0 - 2dbe: 11 24 eor r1, r1 - 2dc0: 8f 93 push r24 - 2dc2: 9f 93 push r25 - 2dc4: ef 93 push r30 - 2dc6: ff 93 push r31 - 2dc8: e8 e4 ldi r30, 0x48 ; 72 - 2dca: f0 e0 ldi r31, 0x00 ; 0 - 2dcc: 80 81 ld r24, Z - 2dce: 81 7f andi r24, 0xF1 ; 241 - 2dd0: 80 83 st Z, r24 + 2e76: 1f 92 push r1 + 2e78: 0f 92 push r0 + 2e7a: 0f b6 in r0, 0x3f ; 63 + 2e7c: 0f 92 push r0 + 2e7e: 11 24 eor r1, r1 + 2e80: 8f 93 push r24 + 2e82: 9f 93 push r25 + 2e84: ef 93 push r30 + 2e86: ff 93 push r31 + 2e88: e8 e4 ldi r30, 0x48 ; 72 + 2e8a: f0 e0 ldi r31, 0x00 ; 0 + 2e8c: 80 81 ld r24, Z + 2e8e: 81 7f andi r24, 0xF1 ; 241 + 2e90: 80 83 st Z, r24 * XYZBUF mechanism of the xmega to automatically double the sampling rate on the * next overflow. For this we have to temporarily deactivate the automatical alignment * in order to catch next overflow event for updating the BUF registers. * We want to sample the demodulated data stream in the first quarter of the half-bit * where the pulsed miller encoded is located. */ CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; - 2dd2: e0 e4 ldi r30, 0x40 ; 64 - 2dd4: f8 e0 ldi r31, 0x08 ; 8 - 2dd6: 13 82 std Z+3, r1 ; 0x03 + 2e92: e0 e4 ldi r30, 0x40 ; 64 + 2e94: f8 e0 ldi r31, 0x08 ; 8 + 2e96: 13 82 std Z+3, r1 ; 0x03 CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ - 2dd8: 86 e9 ldi r24, 0x96 ; 150 - 2dda: 90 e0 ldi r25, 0x00 ; 0 - 2ddc: 86 ab std Z+54, r24 ; 0x36 - 2dde: 97 ab std Z+55, r25 ; 0x37 + 2e98: 86 e9 ldi r24, 0x96 ; 150 + 2e9a: 90 e0 ldi r25, 0x00 ; 0 + 2e9c: 86 ab std Z+54, r24 ; 0x36 + 2e9e: 97 ab std Z+55, r25 ; 0x37 CODEC_TIMER_SAMPLING.CCABUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 10 - 1; /* Compensate for DIGFILT and ISR prolog */ - 2de0: 8a e1 ldi r24, 0x1A ; 26 - 2de2: 90 e0 ldi r25, 0x00 ; 0 - 2de4: 80 af std Z+56, r24 ; 0x38 - 2de6: 91 af std Z+57, r25 ; 0x39 + 2ea0: 8a e1 ldi r24, 0x1A ; 26 + 2ea2: 90 e0 ldi r25, 0x00 ; 0 + 2ea4: 80 af std Z+56, r24 ; 0x38 + 2ea6: 91 af std Z+57, r25 ; 0x39 /* Setup Frame Delay Timer and wire to EVSYS. Frame delay time is * measured from last change in RF field, therefore we use * the event channel 1 (end of modulation pause) as the restart event. * The preliminary frame delay time chosen here is irrelevant, because * the correct FDT gets set automatically after demodulation. */ CODEC_TIMER_LOADMOD.CNT = 0; - 2de8: e0 e4 ldi r30, 0x40 ; 64 - 2dea: f9 e0 ldi r31, 0x09 ; 9 - 2dec: 10 a2 std Z+32, r1 ; 0x20 - 2dee: 11 a2 std Z+33, r1 ; 0x21 + 2ea8: e0 e4 ldi r30, 0x40 ; 64 + 2eaa: f9 e0 ldi r31, 0x09 ; 9 + 2eac: 10 a2 std Z+32, r1 ; 0x20 + 2eae: 11 a2 std Z+33, r1 ; 0x21 CODEC_TIMER_LOADMOD.PER = 0xFFFF; - 2df0: 8f ef ldi r24, 0xFF ; 255 - 2df2: 9f ef ldi r25, 0xFF ; 255 - 2df4: 86 a3 std Z+38, r24 ; 0x26 - 2df6: 97 a3 std Z+39, r25 ; 0x27 + 2eb0: 8f ef ldi r24, 0xFF ; 255 + 2eb2: 9f ef ldi r25, 0xFF ; 255 + 2eb4: 86 a3 std Z+38, r24 ; 0x26 + 2eb6: 97 a3 std Z+39, r25 ; 0x27 CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; - 2df8: 89 e8 ldi r24, 0x89 ; 137 - 2dfa: 83 83 std Z+3, r24 ; 0x03 + 2eb8: 89 e8 ldi r24, 0x89 ; 137 + 2eba: 83 83 std Z+3, r24 ; 0x03 CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_EVCH6_gc; - 2dfc: 8e e0 ldi r24, 0x0E ; 14 - 2dfe: 80 83 st Z, r24 + 2ebc: 8e e0 ldi r24, 0x0E ; 14 + 2ebe: 80 83 st Z, r24 /* Disable this interrupt */ CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 2e00: e0 e2 ldi r30, 0x20 ; 32 - 2e02: f6 e0 ldi r31, 0x06 ; 6 - 2e04: 12 86 std Z+10, r1 ; 0x0a + 2ec0: e0 e2 ldi r30, 0x20 ; 32 + 2ec2: f6 e0 ldi r31, 0x06 ; 6 + 2ec4: 12 86 std Z+10, r1 ; 0x0a } - 2e06: ff 91 pop r31 - 2e08: ef 91 pop r30 - 2e0a: 9f 91 pop r25 - 2e0c: 8f 91 pop r24 - 2e0e: 0f 90 pop r0 - 2e10: 0f be out 0x3f, r0 ; 63 - 2e12: 0f 90 pop r0 - 2e14: 1f 90 pop r1 - 2e16: 18 95 reti + 2ec6: ff 91 pop r31 + 2ec8: ef 91 pop r30 + 2eca: 9f 91 pop r25 + 2ecc: 8f 91 pop r24 + 2ece: 0f 90 pop r0 + 2ed0: 0f be out 0x3f, r0 ; 63 + 2ed2: 0f 90 pop r0 + 2ed4: 1f 90 pop r1 + 2ed6: 18 95 reti -00002e18 <__vector_22>: +00002ed8 <__vector_22>: ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { - 2e18: 1f 92 push r1 - 2e1a: 0f 92 push r0 - 2e1c: 0f b6 in r0, 0x3f ; 63 - 2e1e: 0f 92 push r0 - 2e20: 11 24 eor r1, r1 - 2e22: 2f 93 push r18 - 2e24: 8f 93 push r24 - 2e26: 9f 93 push r25 - 2e28: ef 93 push r30 - 2e2a: ff 93 push r31 + 2ed8: 1f 92 push r1 + 2eda: 0f 92 push r0 + 2edc: 0f b6 in r0, 0x3f ; 63 + 2ede: 0f 92 push r0 + 2ee0: 11 24 eor r1, r1 + 2ee2: 2f 93 push r18 + 2ee4: 3f 93 push r19 + 2ee6: 4f 93 push r20 + 2ee8: 8f 93 push r24 + 2eea: 9f 93 push r25 + 2eec: ef 93 push r30 + 2eee: ff 93 push r31 /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; - 2e2c: 90 91 28 06 lds r25, 0x0628 + 2ef0: 90 91 28 06 lds r25, 0x0628 uint8_t NewSampleRegister; /* Shift sampled bit into sampling register and hold a local copy for fast access. */ NewSampleRegister = SampleRegister << 1; - 2e30: 80 91 b0 28 lds r24, 0x28B0 + 2ef4: 80 91 b0 28 lds r24, 0x28B0 CODEC_DEMOD_IN_PORT.INT0MASK = 0; } ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; - 2e34: 95 70 andi r25, 0x05 ; 5 + 2ef8: 95 70 andi r25, 0x05 ; 5 uint8_t NewSampleRegister; /* Shift sampled bit into sampling register and hold a local copy for fast access. */ NewSampleRegister = SampleRegister << 1; NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); - 2e36: 21 e0 ldi r18, 0x01 ; 1 - 2e38: 09 f0 breq .+2 ; 0x2e3c <__vector_22+0x24> - 2e3a: 20 e0 ldi r18, 0x00 ; 0 + 2efa: 21 e0 ldi r18, 0x01 ; 1 + 2efc: 09 f0 breq .+2 ; 0x2f00 <__vector_22+0x28> + 2efe: 20 e0 ldi r18, 0x00 ; 0 /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; uint8_t NewSampleRegister; /* Shift sampled bit into sampling register and hold a local copy for fast access. */ NewSampleRegister = SampleRegister << 1; - 2e3c: 88 0f add r24, r24 + 2f00: 88 0f add r24, r24 NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); - 2e3e: 82 2b or r24, r18 + 2f02: 82 2b or r24, r18 SampleRegister = NewSampleRegister; - 2e40: 80 93 b0 28 sts 0x28B0, r24 + 2f04: 80 93 b0 28 sts 0x28B0, r24 if (SamplePosition) { - 2e44: 90 91 ac 28 lds r25, 0x28AC - 2e48: 99 23 and r25, r25 - 2e4a: a1 f1 breq .+104 ; 0x2eb4 <__vector_22+0x9c> + 2f08: 90 91 ac 28 lds r25, 0x28AC + 2f0c: 99 23 and r25, r25 + 2f0e: c1 f1 breq .+112 ; 0x2f80 <__vector_22+0xa8> /* Analyze the sampling register after 2 samples. */ if ((NewSampleRegister & 0x07) == 0x07) { - 2e4c: 98 2f mov r25, r24 - 2e4e: 97 70 andi r25, 0x07 ; 7 - 2e50: 97 30 cpi r25, 0x07 ; 7 - 2e52: 09 f4 brne .+2 ; 0x2e56 <__vector_22+0x3e> - 2e54: 42 c0 rjmp .+132 ; 0x2eda <__vector_22+0xc2> + 2f10: 98 2f mov r25, r24 + 2f12: 97 70 andi r25, 0x07 ; 7 + 2f14: 97 30 cpi r25, 0x07 ; 7 + 2f16: 09 f4 brne .+2 ; 0x2f1a <__vector_22+0x42> + 2f18: 48 c0 rjmp .+144 ; 0x2faa <__vector_22+0xd2> /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; } else { /* Otherwise, we check the two sample bits from the bit before. */ uint8_t BitSample = NewSampleRegister & 0xC; - 2e56: 98 2f mov r25, r24 - 2e58: 9c 70 andi r25, 0x0C ; 12 + 2f1a: 98 2f mov r25, r24 + 2f1c: 9c 70 andi r25, 0x0C ; 12 uint8_t Bit = 0; if (BitSample != (0x0 << 2)) { - 2e5a: 61 f1 breq .+88 ; 0x2eb4 <__vector_22+0x9c> + 2f1e: 81 f1 breq .+96 ; 0x2f80 <__vector_22+0xa8> /* We have a valid bit. decode and process it. */ if (BitSample & (0x1 << 2)) { - 2e5c: 91 e0 ldi r25, 0x01 ; 1 - 2e5e: 82 fd sbrc r24, 2 - 2e60: 6b c0 rjmp .+214 ; 0x2f38 <__vector_22+0x120> + 2f20: 82 fb bst r24, 2 + 2f22: 88 27 eor r24, r24 + 2f24: 80 f9 bld r24, 0 + 2f26: 91 e0 ldi r25, 0x01 ; 1 + 2f28: 89 27 eor r24, r25 } else { /* 10 sequence -> This is a one bit */ Bit = 1; } LastBit = Bit; - 2e62: 90 93 ae 28 sts 0x28AE, r25 + 2f2a: 80 93 ae 28 sts 0x28AE, r24 if (!IsParityBit) { - 2e66: 80 91 af 28 lds r24, 0x28AF - 2e6a: 81 11 cpse r24, r1 - 2e6c: 6d c0 rjmp .+218 ; 0x2f48 <__vector_22+0x130> + 2f2e: 90 91 af 28 lds r25, 0x28AF + 2f32: 91 11 cpse r25, r1 + 2f34: 7f c0 rjmp .+254 ; 0x3034 <__stack+0x35> /* This is a data bit, so shift it into the data register and * hold a local copy of it. */ uint8_t NewDataRegister = DataRegister >> 1; - 2e6e: 80 91 b1 28 lds r24, 0x28B1 - 2e72: 86 95 lsr r24 + 2f36: 90 91 b1 28 lds r25, 0x28B1 + 2f3a: 96 95 lsr r25 NewDataRegister |= (Bit ? 0x80 : 0x00); - 2e74: 99 23 and r25, r25 - 2e76: 09 f4 brne .+2 ; 0x2e7a <__vector_22+0x62> - 2e78: 71 c0 rjmp .+226 ; 0x2f5c <__vector_22+0x144> - 2e7a: 20 e8 ldi r18, 0x80 ; 128 - 2e7c: 28 2b or r18, r24 + 2f3c: 88 23 and r24, r24 + 2f3e: 09 f4 brne .+2 ; 0x2f42 <__vector_22+0x6a> + 2f40: 83 c0 rjmp .+262 ; 0x3048 <__stack+0x49> + 2f42: 20 e8 ldi r18, 0x80 ; 128 + 2f44: 29 2b or r18, r25 DataRegister = NewDataRegister; - 2e7e: 20 93 b1 28 sts 0x28B1, r18 + 2f46: 20 93 b1 28 sts 0x28B1, r18 /* Update bitcount */ uint16_t NewBitCount = ++BitCount; - 2e82: 80 91 b4 28 lds r24, 0x28B4 - 2e86: 90 91 b5 28 lds r25, 0x28B5 - 2e8a: 01 96 adiw r24, 0x01 ; 1 - 2e8c: 80 93 b4 28 sts 0x28B4, r24 - 2e90: 90 93 b5 28 sts 0x28B5, r25 + 2f4a: 80 91 b4 28 lds r24, 0x28B4 + 2f4e: 90 91 b5 28 lds r25, 0x28B5 + 2f52: 01 96 adiw r24, 0x01 ; 1 + 2f54: 80 93 b4 28 sts 0x28B4, r24 + 2f58: 90 93 b5 28 sts 0x28B5, r25 if ((NewBitCount & 0x07) == 0) { - 2e94: 87 70 andi r24, 0x07 ; 7 - 2e96: 99 27 eor r25, r25 - 2e98: 89 2b or r24, r25 - 2e9a: 61 f4 brne .+24 ; 0x2eb4 <__vector_22+0x9c> + 2f5c: 87 70 andi r24, 0x07 ; 7 + 2f5e: 99 27 eor r25, r25 + 2f60: 89 2b or r24, r25 + 2f62: 71 f4 brne .+28 ; 0x2f80 <__vector_22+0xa8> /* We have reached a byte boundary! Store the data register. */ /* TODO: Prevent buffer overflow */ *CodecBufferPtr++ = NewDataRegister; - 2e9c: e0 91 b8 28 lds r30, 0x28B8 - 2ea0: f0 91 b9 28 lds r31, 0x28B9 - 2ea4: 21 93 st Z+, r18 - 2ea6: e0 93 b8 28 sts 0x28B8, r30 - 2eaa: f0 93 b9 28 sts 0x28B9, r31 + 2f64: e0 91 b8 28 lds r30, 0x28B8 + 2f68: f0 91 b9 28 lds r31, 0x28B9 + 2f6c: cf 01 movw r24, r30 + 2f6e: 01 96 adiw r24, 0x01 ; 1 + 2f70: 80 93 b8 28 sts 0x28B8, r24 + 2f74: 90 93 b9 28 sts 0x28B9, r25 + 2f78: 20 83 st Z, r18 /* Store bit for determining FDT at EOC and enable parity * handling on next bit. */ IsParityBit = true; - 2eae: 81 e0 ldi r24, 0x01 ; 1 - 2eb0: 80 93 af 28 sts 0x28AF, r24 + 2f7a: 81 e0 ldi r24, 0x01 ; 1 + 2f7c: 80 93 af 28 sts 0x28AF, r24 } } else { /* On odd sample position just sample. */ } SamplePosition = !SamplePosition; - 2eb4: 80 91 ac 28 lds r24, 0x28AC - 2eb8: 91 e0 ldi r25, 0x01 ; 1 - 2eba: 89 27 eor r24, r25 - 2ebc: 80 93 ac 28 sts 0x28AC, r24 + 2f80: 80 91 ac 28 lds r24, 0x28AC + 2f84: 91 e0 ldi r25, 0x01 ; 1 + 2f86: 89 27 eor r24, r25 + 2f88: 80 93 ac 28 sts 0x28AC, r24 /* Make sure the sampling timer gets automatically aligned to the * modulation pauses by using the RESTART event. * This can be understood as a "poor mans PLL" and makes sure that we are * never too far out the bit-grid while sampling. */ CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - 2ec0: 88 e8 ldi r24, 0x88 ; 136 - 2ec2: 80 93 43 08 sts 0x0843, r24 + 2f8c: 88 e8 ldi r24, 0x88 ; 136 + 2f8e: 80 93 43 08 sts 0x0843, r24 } - 2ec6: ff 91 pop r31 - 2ec8: ef 91 pop r30 - 2eca: 9f 91 pop r25 - 2ecc: 8f 91 pop r24 - 2ece: 2f 91 pop r18 - 2ed0: 0f 90 pop r0 - 2ed2: 0f be out 0x3f, r0 ; 63 - 2ed4: 0f 90 pop r0 - 2ed6: 1f 90 pop r1 - 2ed8: 18 95 reti + 2f92: ff 91 pop r31 + 2f94: ef 91 pop r30 + 2f96: 9f 91 pop r25 + 2f98: 8f 91 pop r24 + 2f9a: 4f 91 pop r20 + 2f9c: 3f 91 pop r19 + 2f9e: 2f 91 pop r18 + 2fa0: 0f 90 pop r0 + 2fa2: 0f be out 0x3f, r0 ; 63 + 2fa4: 0f 90 pop r0 + 2fa6: 1f 90 pop r1 + 2fa8: 18 95 reti if (SamplePosition) { /* Analyze the sampling register after 2 samples. */ if ((NewSampleRegister & 0x07) == 0x07) { /* No carrier modulation for 3 sample points. EOC! */ CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - 2eda: 10 92 40 08 sts 0x0840, r1 + 2faa: 10 92 40 08 sts 0x0840, r1 CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; - 2ede: 80 e1 ldi r24, 0x10 ; 16 - 2ee0: 80 93 4c 08 sts 0x084C, r24 + 2fae: 80 e1 ldi r24, 0x10 ; 16 + 2fb0: 80 93 4c 08 sts 0x084C, r24 /* By this time, the FDT timer is aligned to the last modulation * edge of the reader. So we disable the auto-synchronization and * let it count the frame delay time in the background, and generate * an interrupt once it has reached the FDT. */ CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; - 2ee4: 10 92 43 09 sts 0x0943, r1 + 2fb4: 10 92 43 09 sts 0x0943, r1 if (LastBit) { - 2ee8: 80 91 ae 28 lds r24, 0x28AE - 2eec: 88 23 and r24, r24 - 2eee: 79 f1 breq .+94 ; 0x2f4e <__vector_22+0x136> + 2fb8: 80 91 ae 28 lds r24, 0x28AE + 2fbc: 88 23 and r24, r24 + 2fbe: e9 f1 breq .+122 ; 0x303a <__stack+0x3b> CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; - 2ef0: 8c eb ldi r24, 0xBC ; 188 - 2ef2: 94 e0 ldi r25, 0x04 ; 4 - 2ef4: 80 93 66 09 sts 0x0966, r24 - 2ef8: 90 93 67 09 sts 0x0967, r25 + 2fc0: 8c eb ldi r24, 0xBC ; 188 + 2fc2: 94 e0 ldi r25, 0x04 ; 4 + 2fc4: 80 93 66 09 sts 0x0966, r24 + 2fc8: 90 93 67 09 sts 0x0967, r25 } else { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; } LoadModState = LOADMOD_FDT; - 2efc: 10 92 ad 28 sts 0x28AD, r1 + 2fcc: 10 92 ad 28 sts 0x28AD, r1 CODEC_TIMER_LOADMOD.INTFLAGS = TC1_OVFIF_bm; - 2f00: 81 e0 ldi r24, 0x01 ; 1 - 2f02: 80 93 4c 09 sts 0x094C, r24 + 2fd0: 81 e0 ldi r24, 0x01 ; 1 + 2fd2: 80 93 4c 09 sts 0x094C, r24 CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; - 2f06: 83 e0 ldi r24, 0x03 ; 3 - 2f08: 80 93 46 09 sts 0x0946, r24 + 2fd6: 83 e0 ldi r24, 0x03 ; 3 + 2fd8: 80 93 46 09 sts 0x0946, r24 /* Determine if we did not receive a multiple of 8 bits. * If this is the case, right-align the remaining data and * store it into the buffer. */ uint8_t RemainingBits = BitCount % 8; - 2f0c: 80 91 b4 28 lds r24, 0x28B4 - 2f10: 90 91 b5 28 lds r25, 0x28B5 - 2f14: 87 70 andi r24, 0x07 ; 7 + 2fdc: 80 91 b4 28 lds r24, 0x28B4 + 2fe0: 90 91 b5 28 lds r25, 0x28B5 + 2fe4: 87 70 andi r24, 0x07 ; 7 if (RemainingBits != 0) { - 2f16: 61 f0 breq .+24 ; 0x2f30 <__vector_22+0x118> + 2fe6: 11 f1 breq .+68 ; 0x302c <__stack+0x2d> uint8_t NewDataRegister = DataRegister; - 2f18: 90 91 b1 28 lds r25, 0x28B1 + 2fe8: 90 91 b1 28 lds r25, 0x28B1 while (RemainingBits++ < 8) { - 2f1c: 8f 5f subi r24, 0xFF ; 255 /* Pad with zeroes to right-align. */ NewDataRegister >>= 1; - 2f1e: 96 95 lsr r25 + 2fec: 96 95 lsr r25 * store it into the buffer. */ uint8_t RemainingBits = BitCount % 8; if (RemainingBits != 0) { uint8_t NewDataRegister = DataRegister; while (RemainingBits++ < 8) { - 2f20: 8f 5f subi r24, 0xFF ; 255 - 2f22: 89 30 cpi r24, 0x09 ; 9 - 2f24: e1 f7 brne .-8 ; 0x2f1e <__vector_22+0x106> + 2fee: 22 e0 ldi r18, 0x02 ; 2 + 2ff0: 28 0f add r18, r24 + 2ff2: 87 30 cpi r24, 0x07 ; 7 + 2ff4: b1 f0 breq .+44 ; 0x3022 <__stack+0x23> /* Pad with zeroes to right-align. */ NewDataRegister >>= 1; + 2ff6: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 2ff8: 43 e0 ldi r20, 0x03 ; 3 + 2ffa: 48 0f add r20, r24 + 2ffc: 28 30 cpi r18, 0x08 ; 8 + 2ffe: 88 f4 brcc .+34 ; 0x3022 <__stack+0x23> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 3000: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 3002: 34 e0 ldi r19, 0x04 ; 4 + 3004: 38 0f add r19, r24 + 3006: 48 30 cpi r20, 0x08 ; 8 + 3008: 60 f4 brcc .+24 ; 0x3022 <__stack+0x23> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 300a: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 300c: 25 e0 ldi r18, 0x05 ; 5 + 300e: 28 0f add r18, r24 + 3010: 38 30 cpi r19, 0x08 ; 8 + 3012: 38 f4 brcc .+14 ; 0x3022 <__stack+0x23> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 3014: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 3016: 28 30 cpi r18, 0x08 ; 8 + 3018: 20 f4 brcc .+8 ; 0x3022 <__stack+0x23> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 301a: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 301c: 81 30 cpi r24, 0x01 ; 1 + 301e: 09 f4 brne .+2 ; 0x3022 <__stack+0x23> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 3020: 96 95 lsr r25 } /* TODO: Prevent buffer overflow */ *CodecBufferPtr = NewDataRegister; - 2f26: e0 91 b8 28 lds r30, 0x28B8 - 2f2a: f0 91 b9 28 lds r31, 0x28B9 - 2f2e: 90 83 st Z, r25 + 3022: e0 91 b8 28 lds r30, 0x28B8 + 3026: f0 91 b9 28 lds r31, 0x28B9 + 302a: 90 83 st Z, r25 } /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; - 2f30: 81 e0 ldi r24, 0x01 ; 1 - 2f32: 80 93 b6 28 sts 0x28B6, r24 - 2f36: be cf rjmp .-132 ; 0x2eb4 <__vector_22+0x9c> - uint8_t BitSample = NewSampleRegister & 0xC; - uint8_t Bit = 0; - - if (BitSample != (0x0 << 2)) { - /* We have a valid bit. decode and process it. */ - if (BitSample & (0x1 << 2)) { - 2f38: 90 e0 ldi r25, 0x00 ; 0 - } else { - /* 10 sequence -> This is a one bit */ - Bit = 1; - } - - LastBit = Bit; - 2f3a: 90 93 ae 28 sts 0x28AE, r25 - - if (!IsParityBit) { - 2f3e: 80 91 af 28 lds r24, 0x28AF - 2f42: 88 23 and r24, r24 - 2f44: 09 f4 brne .+2 ; 0x2f48 <__vector_22+0x130> - 2f46: 93 cf rjmp .-218 ; 0x2e6e <__vector_22+0x56> + 302c: 81 e0 ldi r24, 0x01 ; 1 + 302e: 80 93 ba 28 sts 0x28BA, r24 + 3032: a6 cf rjmp .-180 ; 0x2f80 <__vector_22+0xa8> } else { /* This is a parity bit. Store it */ /* TODO: Store parity and prevent overflow */ //*ParityBufferPtr++ = Bit; IsParityBit = false; - 2f48: 10 92 af 28 sts 0x28AF, r1 - 2f4c: b3 cf rjmp .-154 ; 0x2eb4 <__vector_22+0x9c> + 3034: 10 92 af 28 sts 0x28AF, r1 + 3038: a3 cf rjmp .-186 ; 0x2f80 <__vector_22+0xa8> CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; if (LastBit) { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; } else { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; - 2f4e: 8c e7 ldi r24, 0x7C ; 124 - 2f50: 94 e0 ldi r25, 0x04 ; 4 - 2f52: 80 93 66 09 sts 0x0966, r24 - 2f56: 90 93 67 09 sts 0x0967, r25 - 2f5a: d0 cf rjmp .-96 ; 0x2efc <__vector_22+0xe4> + 303a: 8c e7 ldi r24, 0x7C ; 124 + 303c: 94 e0 ldi r25, 0x04 ; 4 + 303e: 80 93 66 09 sts 0x0966, r24 + 3042: 90 93 67 09 sts 0x0967, r25 + 3046: c2 cf rjmp .-124 ; 0x2fcc <__vector_22+0xf4> if (!IsParityBit) { /* This is a data bit, so shift it into the data register and * hold a local copy of it. */ uint8_t NewDataRegister = DataRegister >> 1; NewDataRegister |= (Bit ? 0x80 : 0x00); - 2f5c: 20 e0 ldi r18, 0x00 ; 0 - 2f5e: 8e cf rjmp .-228 ; 0x2e7c <__vector_22+0x64> + 3048: 20 e0 ldi r18, 0x00 ; 0 + 304a: 7c cf rjmp .-264 ; 0x2f44 <__vector_22+0x6c> -00002f60 <__vector_83>: +0000304c <__vector_83>: * This can be understood as a "poor mans PLL" and makes sure that we are * never too far out the bit-grid while sampling. */ CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; } ISR(CODEC_TIMER_OVF_VECT) { - 2f60: 1f 92 push r1 - 2f62: 0f 92 push r0 - 2f64: 0f b6 in r0, 0x3f ; 63 - 2f66: 0f 92 push r0 - 2f68: 11 24 eor r1, r1 - 2f6a: 2f 93 push r18 - 2f6c: 3f 93 push r19 - 2f6e: 8f 93 push r24 - 2f70: 9f 93 push r25 - 2f72: ef 93 push r30 - 2f74: ff 93 push r31 + 304c: 1f 92 push r1 + 304e: 0f 92 push r0 + 3050: 0f b6 in r0, 0x3f ; 63 + 3052: 0f 92 push r0 + 3054: 11 24 eor r1, r1 + 3056: 2f 93 push r18 + 3058: 3f 93 push r19 + 305a: 8f 93 push r24 + 305c: 9f 93 push r25 + 305e: af 93 push r26 + 3060: bf 93 push r27 + 3062: ef 93 push r30 + 3064: ff 93 push r31 /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 2f76: 80 91 ad 28 lds r24, 0x28AD - 2f7a: 85 30 cpi r24, 0x05 ; 5 - 2f7c: 09 f4 brne .+2 ; 0x2f80 <__vector_83+0x20> - 2f7e: 4d c0 rjmp .+154 ; 0x301a <__stack+0x1b> - 2f80: a8 f0 brcs .+42 ; 0x2fac <__vector_83+0x4c> - 2f82: 88 30 cpi r24, 0x08 ; 8 - 2f84: 09 f4 brne .+2 ; 0x2f88 <__vector_83+0x28> - 2f86: 7c c0 rjmp .+248 ; 0x3080 <__stack+0x81> - 2f88: 20 f5 brcc .+72 ; 0x2fd2 <__vector_83+0x72> - 2f8a: 86 30 cpi r24, 0x06 ; 6 - 2f8c: 09 f4 brne .+2 ; 0x2f90 <__vector_83+0x30> - 2f8e: b8 c0 rjmp .+368 ; 0x3100 <__stack+0x101> - 2f90: 87 30 cpi r24, 0x07 ; 7 - 2f92: 09 f4 brne .+2 ; 0x2f96 <__vector_83+0x36> - 2f94: 8a c0 rjmp .+276 ; 0x30aa <__stack+0xab> + 3066: 80 91 ad 28 lds r24, 0x28AD + 306a: 90 e0 ldi r25, 0x00 ; 0 + 306c: 8b 30 cpi r24, 0x0B ; 11 + 306e: 91 05 cpc r25, r1 + 3070: 80 f5 brcc .+96 ; 0x30d2 <__vector_83+0x86> + 3072: fc 01 movw r30, r24 + 3074: e9 5a subi r30, 0xA9 ; 169 + 3076: fe 4f sbci r31, 0xFE ; 254 + 3078: 0c 94 7a 2b jmp 0x56f4 ; 0x56f4 <__tablejump2__> + + LoadModState = LOADMOD_PARITY1; + break; + + case LOADMOD_PARITY1: + if (*ParityBufferPtr) { + 307c: e0 91 b6 28 lds r30, 0x28B6 + 3080: f0 91 b7 28 lds r31, 0x28B7 + 3084: 80 81 ld r24, Z + 3086: 81 11 cpse r24, r1 + 3088: ac c0 rjmp .+344 ; 0x31e2 <__vector_83+0x196> + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 308a: 80 e4 ldi r24, 0x40 ; 64 + 308c: 80 93 45 06 sts 0x0645, r24 + } + + if (BitSent == BitCount) { + 3090: 20 91 b2 28 lds r18, 0x28B2 + 3094: 30 91 b3 28 lds r19, 0x28B3 + 3098: 80 91 b4 28 lds r24, 0x28B4 + 309c: 90 91 b5 28 lds r25, 0x28B5 + 30a0: 28 17 cp r18, r24 + 30a2: 39 07 cpc r19, r25 + 30a4: 09 f4 brne .+2 ; 0x30a8 <__vector_83+0x5c> + 30a6: 6c c0 rjmp .+216 ; 0x3180 <__vector_83+0x134> + /* No data left */ + LoadModState = LOADMOD_STOP_BIT0; + } else { + /* Fetch next data and continue sending bits. */ + ParityBufferPtr++; + 30a8: 31 96 adiw r30, 0x01 ; 1 + 30aa: e0 93 b6 28 sts 0x28B6, r30 + 30ae: f0 93 b7 28 sts 0x28B7, r31 + DataRegister = *++CodecBufferPtr; + 30b2: e0 91 b8 28 lds r30, 0x28B8 + 30b6: f0 91 b9 28 lds r31, 0x28B9 + 30ba: cf 01 movw r24, r30 + 30bc: 01 96 adiw r24, 0x01 ; 1 + 30be: 80 93 b8 28 sts 0x28B8, r24 + 30c2: 90 93 b9 28 sts 0x28B9, r25 + 30c6: 81 81 ldd r24, Z+1 ; 0x01 + 30c8: 80 93 b1 28 sts 0x28B1, r24 + LoadModState = LOADMOD_DATA0; + 30cc: 84 e0 ldi r24, 0x04 ; 4 + 30ce: 80 93 ad 28 sts 0x28AD, r24 break; default: break; } } - 2f96: ff 91 pop r31 - 2f98: ef 91 pop r30 - 2f9a: 9f 91 pop r25 - 2f9c: 8f 91 pop r24 - 2f9e: 3f 91 pop r19 - 2fa0: 2f 91 pop r18 - 2fa2: 0f 90 pop r0 - 2fa4: 0f be out 0x3f, r0 ; 63 - 2fa6: 0f 90 pop r0 - 2fa8: 1f 90 pop r1 - 2faa: 18 95 reti -ISR(CODEC_TIMER_OVF_VECT) { - /* Bit rate timer. Output a half bit on the output. */ - uint8_t Temp8; - uint16_t Temp16; - - switch (LoadModState) { - 2fac: 82 30 cpi r24, 0x02 ; 2 - 2fae: 71 f1 breq .+92 ; 0x300c <__stack+0xd> - 2fb0: f8 f0 brcs .+62 ; 0x2ff0 <__vector_83+0x90> - 2fb2: 83 30 cpi r24, 0x03 ; 3 - 2fb4: 09 f4 brne .+2 ; 0x2fb8 <__vector_83+0x58> - 2fb6: 56 c0 rjmp .+172 ; 0x3064 <__stack+0x65> - 2fb8: 84 30 cpi r24, 0x04 ; 4 - 2fba: 69 f7 brne .-38 ; 0x2f96 <__vector_83+0x36> - /* Fetch first byte */ - DataRegister = *CodecBufferPtr; - break; - - case LOADMOD_DATA0: - if (DataRegister & 1) { - 2fbc: 80 91 b1 28 lds r24, 0x28B1 - 2fc0: 80 fd sbrc r24, 0 - 2fc2: b7 c0 rjmp .+366 ; 0x3132 <__stack+0x133> - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2fc4: 80 e4 ldi r24, 0x40 ; 64 - 2fc6: 80 93 46 06 sts 0x0646, r24 - } - - LoadModState = LOADMOD_DATA1; - 2fca: 85 e0 ldi r24, 0x05 ; 5 - 2fcc: 80 93 ad 28 sts 0x28AD, r24 - break; - 2fd0: e2 cf rjmp .-60 ; 0x2f96 <__vector_83+0x36> -ISR(CODEC_TIMER_OVF_VECT) { - /* Bit rate timer. Output a half bit on the output. */ - uint8_t Temp8; - uint16_t Temp16; - - switch (LoadModState) { - 2fd2: 89 30 cpi r24, 0x09 ; 9 - 2fd4: 09 f4 brne .+2 ; 0x2fd8 <__vector_83+0x78> - 2fd6: 5b c0 rjmp .+182 ; 0x308e <__stack+0x8f> - 2fd8: 8a 30 cpi r24, 0x0A ; 10 - 2fda: e9 f6 brne .-70 ; 0x2f96 <__vector_83+0x36> - - case LOADMOD_FINISHED: - /* We have written all of our bits. Deactivate the loadmod - * timer. Also disable the bit-rate interrupt again. And - * stop the subcarrier divider. */ - CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; - 2fdc: 10 92 40 09 sts 0x0940, r1 - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 2fe0: 10 92 46 09 sts 0x0946, r1 - CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; - 2fe4: 10 92 00 08 sts 0x0800, r1 - - /* Signal application that we have finished loadmod */ - Flags.LoadmodFinished = 1; - 2fe8: 81 e0 ldi r24, 0x01 ; 1 - 2fea: 80 93 b7 28 sts 0x28B7, r24 - break; - 2fee: d3 cf rjmp .-90 ; 0x2f96 <__vector_83+0x36> -ISR(CODEC_TIMER_OVF_VECT) { - /* Bit rate timer. Output a half bit on the output. */ - uint8_t Temp8; - uint16_t Temp16; - - switch (LoadModState) { - 2ff0: 88 23 and r24, r24 - 2ff2: 09 f4 brne .+2 ; 0x2ff6 <__vector_83+0x96> - 2ff4: 53 c0 rjmp .+166 ; 0x309c <__stack+0x9d> - 2ff6: 81 30 cpi r24, 0x01 ; 1 - 2ff8: 71 f6 brne .-100 ; 0x2f96 <__vector_83+0x36> + 30d2: ff 91 pop r31 + 30d4: ef 91 pop r30 + 30d6: bf 91 pop r27 + 30d8: af 91 pop r26 + 30da: 9f 91 pop r25 + 30dc: 8f 91 pop r24 + 30de: 3f 91 pop r19 + 30e0: 2f 91 pop r18 + 30e2: 0f 90 pop r0 + 30e4: 0f be out 0x3f, r0 ; 63 + 30e6: 0f 90 pop r0 + 30e8: 1f 90 pop r1 + 30ea: 18 95 reti break; case LOADMOD_START: /* Application produced data. With this interrupt we are aligned to the bit-grid. * Start subcarrier generation and align to bitrate. */ CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_RATE_CYCLES / 2 - 1; - 2ffa: 8f e3 ldi r24, 0x3F ; 63 - 2ffc: 90 e0 ldi r25, 0x00 ; 0 - 2ffe: 80 93 66 09 sts 0x0966, r24 - 3002: 90 93 67 09 sts 0x0967, r25 + 30ec: 8f e3 ldi r24, 0x3F ; 63 + 30ee: 90 e0 ldi r25, 0x00 ; 0 + 30f0: 80 93 66 09 sts 0x0966, r24 + 30f4: 90 93 67 09 sts 0x0967, r25 CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_EVCH6_gc; - 3006: 8e e0 ldi r24, 0x0E ; 14 - 3008: 80 93 00 08 sts 0x0800, r24 + 30f8: 8e e0 ldi r24, 0x0E ; 14 + 30fa: 80 93 00 08 sts 0x0800, r24 /* Fallthrough to first bit */ case LOADMOD_START_BIT0: CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 300c: 80 e4 ldi r24, 0x40 ; 64 - 300e: 80 93 45 06 sts 0x0645, r24 + 30fe: 80 e4 ldi r24, 0x40 ; 64 + 3100: 80 93 45 06 sts 0x0645, r24 LoadModState = LOADMOD_START_BIT1; - 3012: 83 e0 ldi r24, 0x03 ; 3 - 3014: 80 93 ad 28 sts 0x28AD, r24 + 3104: 83 e0 ldi r24, 0x03 ; 3 + 3106: 80 93 ad 28 sts 0x28AD, r24 break; - 3018: be cf rjmp .-132 ; 0x2f96 <__vector_83+0x36> + 310a: e3 cf rjmp .-58 ; 0x30d2 <__vector_83+0x86> + + case LOADMOD_START_BIT1: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 310c: 80 e4 ldi r24, 0x40 ; 64 + 310e: 80 93 46 06 sts 0x0646, r24 + LoadModState = LOADMOD_DATA0; + 3112: 84 e0 ldi r24, 0x04 ; 4 + 3114: 80 93 ad 28 sts 0x28AD, r24 + + /* Fetch first byte */ + DataRegister = *CodecBufferPtr; + 3118: e0 91 b8 28 lds r30, 0x28B8 + 311c: f0 91 b9 28 lds r31, 0x28B9 + 3120: 80 81 ld r24, Z + 3122: 80 93 b1 28 sts 0x28B1, r24 + break; + 3126: d5 cf rjmp .-86 ; 0x30d2 <__vector_83+0x86> + + case LOADMOD_DATA0: + if (DataRegister & 1) { + 3128: 80 91 b1 28 lds r24, 0x28B1 + 312c: 80 fd sbrc r24, 0 + 312e: 64 c0 rjmp .+200 ; 0x31f8 <__vector_83+0x1ac> + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 3130: 80 e4 ldi r24, 0x40 ; 64 + 3132: 80 93 46 06 sts 0x0646, r24 + } LoadModState = LOADMOD_DATA1; + 3136: 85 e0 ldi r24, 0x05 ; 5 + 3138: 80 93 ad 28 sts 0x28AD, r24 break; + 313c: ca cf rjmp .-108 ; 0x30d2 <__vector_83+0x86> case LOADMOD_DATA1: Temp8 = DataRegister; - 301a: 80 91 b1 28 lds r24, 0x28B1 + 313e: 80 91 b1 28 lds r24, 0x28B1 if (Temp8 & 1) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 301e: 90 e4 ldi r25, 0x40 ; 64 + 3142: 90 e4 ldi r25, 0x40 ; 64 break; case LOADMOD_DATA1: Temp8 = DataRegister; if (Temp8 & 1) { - 3020: 80 fd sbrc r24, 0 - 3022: 84 c0 rjmp .+264 ; 0x312c <__stack+0x12d> + 3144: 80 fd sbrc r24, 0 + 3146: 55 c0 rjmp .+170 ; 0x31f2 <__vector_83+0x1a6> CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 3024: 90 93 45 06 sts 0x0645, r25 + 3148: 90 93 45 06 sts 0x0645, r25 } DataRegister = Temp8 >> 1; - 3028: 86 95 lsr r24 - 302a: 80 93 b1 28 sts 0x28B1, r24 + 314c: 86 95 lsr r24 + 314e: 80 93 b1 28 sts 0x28B1, r24 Temp16 = BitSent; - 302e: 80 91 b2 28 lds r24, 0x28B2 - 3032: 90 91 b3 28 lds r25, 0x28B3 + 3152: 80 91 b2 28 lds r24, 0x28B2 + 3156: 90 91 b3 28 lds r25, 0x28B3 BitSent = ++Temp16; - 3036: 01 96 adiw r24, 0x01 ; 1 - 3038: 80 93 b2 28 sts 0x28B2, r24 - 303c: 90 93 b3 28 sts 0x28B3, r25 + 315a: 01 96 adiw r24, 0x01 ; 1 + 315c: 80 93 b2 28 sts 0x28B2, r24 + 3160: 90 93 b3 28 sts 0x28B3, r25 if ((Temp16 & 0x07) == 0) { - 3040: 9c 01 movw r18, r24 - 3042: 27 70 andi r18, 0x07 ; 7 - 3044: 33 27 eor r19, r19 - 3046: 23 2b or r18, r19 - 3048: 09 f4 brne .+2 ; 0x304c <__stack+0x4d> - 304a: 77 c0 rjmp .+238 ; 0x313a <__stack+0x13b> + 3164: 9c 01 movw r18, r24 + 3166: 27 70 andi r18, 0x07 ; 7 + 3168: 33 27 eor r19, r19 + 316a: 23 2b or r18, r19 + 316c: 09 f4 brne .+2 ; 0x3170 <__vector_83+0x124> + 316e: 48 c0 rjmp .+144 ; 0x3200 <__vector_83+0x1b4> /* Byte boundary. Load parity bit and output it later. */ LoadModState = LOADMOD_PARITY0; break; } if (Temp16 == BitCount) { - 304c: 20 91 b4 28 lds r18, 0x28B4 - 3050: 30 91 b5 28 lds r19, 0x28B5 - 3054: 82 17 cp r24, r18 - 3056: 93 07 cpc r25, r19 - 3058: 09 f0 breq .+2 ; 0x305c <__stack+0x5d> - 305a: 4e c0 rjmp .+156 ; 0x30f8 <__stack+0xf9> + 3170: 20 91 b4 28 lds r18, 0x28B4 + 3174: 30 91 b5 28 lds r19, 0x28B5 + 3178: 82 17 cp r24, r18 + 317a: 93 07 cpc r25, r19 + 317c: 09 f0 breq .+2 ; 0x3180 <__vector_83+0x134> + 317e: a6 cf rjmp .-180 ; 0x30cc <__vector_83+0x80> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } if (BitSent == BitCount) { /* No data left */ LoadModState = LOADMOD_STOP_BIT0; - 305c: 88 e0 ldi r24, 0x08 ; 8 - 305e: 80 93 ad 28 sts 0x28AD, r24 - 3062: 99 cf rjmp .-206 ; 0x2f96 <__vector_83+0x36> - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - LoadModState = LOADMOD_START_BIT1; - break; - - case LOADMOD_START_BIT1: - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 3064: 80 e4 ldi r24, 0x40 ; 64 - 3066: 80 93 46 06 sts 0x0646, r24 + 3180: 88 e0 ldi r24, 0x08 ; 8 + 3182: 80 93 ad 28 sts 0x28AD, r24 + 3186: a5 cf rjmp .-182 ; 0x30d2 <__vector_83+0x86> LoadModState = LOADMOD_DATA0; - 306a: 84 e0 ldi r24, 0x04 ; 4 - 306c: 80 93 ad 28 sts 0x28AD, r24 - /* Fetch first byte */ - DataRegister = *CodecBufferPtr; - 3070: e0 91 b8 28 lds r30, 0x28B8 - 3074: f0 91 b9 28 lds r31, 0x28B9 - 3078: 80 81 ld r24, Z - 307a: 80 93 b1 28 sts 0x28B1, r24 break; - 307e: 8b cf rjmp .-234 ; 0x2f96 <__vector_83+0x36> + + case LOADMOD_PARITY0: + if (*ParityBufferPtr) { + 3188: e0 91 b6 28 lds r30, 0x28B6 + 318c: f0 91 b7 28 lds r31, 0x28B7 + 3190: 80 81 ld r24, Z + 3192: 81 11 cpse r24, r1 + 3194: 2a c0 rjmp .+84 ; 0x31ea <__vector_83+0x19e> + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 3196: 80 e4 ldi r24, 0x40 ; 64 + 3198: 80 93 46 06 sts 0x0646, r24 + } + + LoadModState = LOADMOD_PARITY1; + 319c: 87 e0 ldi r24, 0x07 ; 7 + 319e: 80 93 ad 28 sts 0x28AD, r24 + break; + 31a2: 97 cf rjmp .-210 ; 0x30d2 <__vector_83+0x86> } break; case LOADMOD_STOP_BIT0: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 3080: 80 e4 ldi r24, 0x40 ; 64 - 3082: 80 93 46 06 sts 0x0646, r24 + 31a4: 80 e4 ldi r24, 0x40 ; 64 + 31a6: 80 93 46 06 sts 0x0646, r24 LoadModState = LOADMOD_STOP_BIT1; - 3086: 89 e0 ldi r24, 0x09 ; 9 - 3088: 80 93 ad 28 sts 0x28AD, r24 + 31aa: 89 e0 ldi r24, 0x09 ; 9 + 31ac: 80 93 ad 28 sts 0x28AD, r24 break; - 308c: 84 cf rjmp .-248 ; 0x2f96 <__vector_83+0x36> + 31b0: 90 cf rjmp .-224 ; 0x30d2 <__vector_83+0x86> case LOADMOD_STOP_BIT1: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 308e: 80 e4 ldi r24, 0x40 ; 64 - 3090: 80 93 46 06 sts 0x0646, r24 + 31b2: 80 e4 ldi r24, 0x40 ; 64 + 31b4: 80 93 46 06 sts 0x0646, r24 LoadModState = LOADMOD_FINISHED; - 3094: 8a e0 ldi r24, 0x0A ; 10 - 3096: 80 93 ad 28 sts 0x28AD, r24 + 31b8: 8a e0 ldi r24, 0x0A ; 10 + 31ba: 80 93 ad 28 sts 0x28AD, r24 break; - 309a: 7d cf rjmp .-262 ; 0x2f96 <__vector_83+0x36> + 31be: 89 cf rjmp .-238 ; 0x30d2 <__vector_83+0x86> + + case LOADMOD_FINISHED: + /* We have written all of our bits. Deactivate the loadmod + * timer. Also disable the bit-rate interrupt again. And + * stop the subcarrier divider. */ + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; + 31c0: 10 92 40 09 sts 0x0940, r1 + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + 31c4: 10 92 46 09 sts 0x0946, r1 + CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; + 31c8: 10 92 00 08 sts 0x0800, r1 + + /* Signal application that we have finished loadmod */ + Flags.LoadmodFinished = 1; + 31cc: 81 e0 ldi r24, 0x01 ; 1 + 31ce: 80 93 bb 28 sts 0x28BB, r24 + break; + 31d2: 7f cf rjmp .-258 ; 0x30d2 <__vector_83+0x86> uint16_t Temp16; switch (LoadModState) { case LOADMOD_FDT: /* No data has been produced, but FDT has ended. Switch over to bit-grid aligning. */ CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_GRID_CYCLES - 1; - 309c: 8f e7 ldi r24, 0x7F ; 127 - 309e: 90 e0 ldi r25, 0x00 ; 0 - 30a0: 80 93 66 09 sts 0x0966, r24 - 30a4: 90 93 67 09 sts 0x0967, r25 + 31d4: 8f e7 ldi r24, 0x7F ; 127 + 31d6: 90 e0 ldi r25, 0x00 ; 0 + 31d8: 80 93 66 09 sts 0x0966, r24 + 31dc: 90 93 67 09 sts 0x0967, r25 break; - 30a8: 76 cf rjmp .-276 ; 0x2f96 <__vector_83+0x36> - - LoadModState = LOADMOD_PARITY1; - break; - - case LOADMOD_PARITY1: - if (*ParityBufferPtr) { - 30aa: e0 91 ba 28 lds r30, 0x28BA - 30ae: f0 91 bb 28 lds r31, 0x28BB - 30b2: 80 81 ld r24, Z - 30b4: 81 11 cpse r24, r1 - 30b6: 36 c0 rjmp .+108 ; 0x3124 <__stack+0x125> - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 30b8: 80 e4 ldi r24, 0x40 ; 64 - 30ba: 80 93 45 06 sts 0x0645, r24 - } - - if (BitSent == BitCount) { - 30be: 20 91 b2 28 lds r18, 0x28B2 - 30c2: 30 91 b3 28 lds r19, 0x28B3 - 30c6: 80 91 b4 28 lds r24, 0x28B4 - 30ca: 90 91 b5 28 lds r25, 0x28B5 - 30ce: 28 17 cp r18, r24 - 30d0: 39 07 cpc r19, r25 - 30d2: 21 f2 breq .-120 ; 0x305c <__stack+0x5d> - /* No data left */ - LoadModState = LOADMOD_STOP_BIT0; - } else { - /* Fetch next data and continue sending bits. */ - ParityBufferPtr++; - 30d4: 31 96 adiw r30, 0x01 ; 1 - 30d6: e0 93 ba 28 sts 0x28BA, r30 - 30da: f0 93 bb 28 sts 0x28BB, r31 - DataRegister = *++CodecBufferPtr; - 30de: e0 91 b8 28 lds r30, 0x28B8 - 30e2: f0 91 b9 28 lds r31, 0x28B9 - 30e6: cf 01 movw r24, r30 - 30e8: 01 96 adiw r24, 0x01 ; 1 - 30ea: 80 93 b8 28 sts 0x28B8, r24 - 30ee: 90 93 b9 28 sts 0x28B9, r25 - 30f2: 81 81 ldd r24, Z+1 ; 0x01 - 30f4: 80 93 b1 28 sts 0x28B1, r24 - LoadModState = LOADMOD_DATA0; - 30f8: 84 e0 ldi r24, 0x04 ; 4 - 30fa: 80 93 ad 28 sts 0x28AD, r24 - 30fe: 4b cf rjmp .-362 ; 0x2f96 <__vector_83+0x36> - LoadModState = LOADMOD_DATA0; - - break; - - case LOADMOD_PARITY0: - if (*ParityBufferPtr) { - 3100: e0 91 ba 28 lds r30, 0x28BA - 3104: f0 91 bb 28 lds r31, 0x28BB - 3108: 80 81 ld r24, Z - 310a: 81 11 cpse r24, r1 - 310c: 07 c0 rjmp .+14 ; 0x311c <__stack+0x11d> - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 310e: 80 e4 ldi r24, 0x40 ; 64 - 3110: 80 93 46 06 sts 0x0646, r24 - } - - LoadModState = LOADMOD_PARITY1; - 3114: 87 e0 ldi r24, 0x07 ; 7 - 3116: 80 93 ad 28 sts 0x28AD, r24 - break; - 311a: 3d cf rjmp .-390 ; 0x2f96 <__vector_83+0x36> - - break; - - case LOADMOD_PARITY0: - if (*ParityBufferPtr) { - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 311c: 80 e4 ldi r24, 0x40 ; 64 - 311e: 80 93 45 06 sts 0x0645, r24 - 3122: f8 cf rjmp .-16 ; 0x3114 <__stack+0x115> + 31e0: 78 cf rjmp .-272 ; 0x30d2 <__vector_83+0x86> LoadModState = LOADMOD_PARITY1; break; case LOADMOD_PARITY1: if (*ParityBufferPtr) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 3124: 80 e4 ldi r24, 0x40 ; 64 - 3126: 80 93 46 06 sts 0x0646, r24 - 312a: c9 cf rjmp .-110 ; 0x30be <__stack+0xbf> + 31e2: 80 e4 ldi r24, 0x40 ; 64 + 31e4: 80 93 46 06 sts 0x0646, r24 + 31e8: 53 cf rjmp .-346 ; 0x3090 <__vector_83+0x44> + + break; + + case LOADMOD_PARITY0: + if (*ParityBufferPtr) { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 31ea: 80 e4 ldi r24, 0x40 ; 64 + 31ec: 80 93 45 06 sts 0x0645, r24 + 31f0: d5 cf rjmp .-86 ; 0x319c <__vector_83+0x150> case LOADMOD_DATA1: Temp8 = DataRegister; if (Temp8 & 1) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 312c: 90 93 46 06 sts 0x0646, r25 - 3130: 7b cf rjmp .-266 ; 0x3028 <__stack+0x29> + 31f2: 90 93 46 06 sts 0x0646, r25 + 31f6: aa cf rjmp .-172 ; 0x314c <__vector_83+0x100> DataRegister = *CodecBufferPtr; break; case LOADMOD_DATA0: if (DataRegister & 1) { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 3132: 80 e4 ldi r24, 0x40 ; 64 - 3134: 80 93 45 06 sts 0x0645, r24 - 3138: 48 cf rjmp .-368 ; 0x2fca <__vector_83+0x6a> + 31f8: 80 e4 ldi r24, 0x40 ; 64 + 31fa: 80 93 45 06 sts 0x0645, r24 + 31fe: 9b cf rjmp .-202 ; 0x3136 <__vector_83+0xea> Temp16 = BitSent; BitSent = ++Temp16; if ((Temp16 & 0x07) == 0) { /* Byte boundary. Load parity bit and output it later. */ LoadModState = LOADMOD_PARITY0; - 313a: 86 e0 ldi r24, 0x06 ; 6 - 313c: 80 93 ad 28 sts 0x28AD, r24 + 3200: 86 e0 ldi r24, 0x06 ; 6 + 3202: 80 93 ad 28 sts 0x28AD, r24 break; - 3140: 2a cf rjmp .-428 ; 0x2f96 <__vector_83+0x36> + 3206: 65 cf rjmp .-310 ; 0x30d2 <__vector_83+0x86> -00003142 : +00003208 : default: break; } } void ISO14443ACodecInit(void) { - 3142: cf 93 push r28 - 3144: df 93 push r29 + 3208: cf 93 push r28 + 320a: df 93 push r29 static volatile LoadModStateType LoadModState; static volatile bool SamplePosition; static void Initialize(void) { /* Configure CARRIER input pin and route it to EVSYS */ CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK; - 3146: e0 e4 ldi r30, 0x40 ; 64 - 3148: f6 e0 ldi r31, 0x06 ; 6 - 314a: 84 e0 ldi r24, 0x04 ; 4 - 314c: 82 83 std Z+2, r24 ; 0x02 + 320c: e0 e4 ldi r30, 0x40 ; 64 + 320e: f6 e0 ldi r31, 0x06 ; 6 + 3210: 84 e0 ldi r24, 0x04 ; 4 + 3212: 82 83 std Z+2, r24 ; 0x02 CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc; - 314e: 12 8a std Z+18, r1 ; 0x12 + 3214: 12 8a std Z+18, r1 ; 0x12 EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; - 3150: c0 e8 ldi r28, 0x80 ; 128 - 3152: d1 e0 ldi r29, 0x01 ; 1 - 3154: 82 e6 ldi r24, 0x62 ; 98 - 3156: 8e 83 std Y+6, r24 ; 0x06 + 3216: c0 e8 ldi r28, 0x80 ; 128 + 3218: d1 e0 ldi r29, 0x01 ; 1 + 321a: 82 e6 ldi r24, 0x62 ; 98 + 321c: 8e 83 std Y+6, r24 ; 0x06 /* Configure two DEMOD pins for input. * Configure event channel 0 for rising edge (begin of modulation pause) * Configure event channel 1 for falling edge (end of modulation pause) */ CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK; - 3158: a0 e2 ldi r26, 0x20 ; 32 - 315a: b6 e0 ldi r27, 0x06 ; 6 - 315c: 85 e0 ldi r24, 0x05 ; 5 - 315e: 12 96 adiw r26, 0x02 ; 2 - 3160: 8c 93 st X, r24 - 3162: 12 97 sbiw r26, 0x02 ; 2 + 321e: a0 e2 ldi r26, 0x20 ; 32 + 3220: b6 e0 ldi r27, 0x06 ; 6 + 3222: 85 e0 ldi r24, 0x05 ; 5 + 3224: 12 96 adiw r26, 0x02 ; 2 + 3226: 8c 93 st X, r24 + 3228: 12 97 sbiw r26, 0x02 ; 2 CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; - 3164: 81 e0 ldi r24, 0x01 ; 1 - 3166: 52 96 adiw r26, 0x12 ; 18 - 3168: 8c 93 st X, r24 - 316a: 52 97 sbiw r26, 0x12 ; 18 + 322a: 81 e0 ldi r24, 0x01 ; 1 + 322c: 52 96 adiw r26, 0x12 ; 18 + 322e: 8c 93 st X, r24 + 3230: 52 97 sbiw r26, 0x12 ; 18 CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; - 316c: 82 e0 ldi r24, 0x02 ; 2 - 316e: 50 96 adiw r26, 0x10 ; 16 - 3170: 8c 93 st X, r24 - 3172: 50 97 sbiw r26, 0x10 ; 16 + 3232: 82 e0 ldi r24, 0x02 ; 2 + 3234: 50 96 adiw r26, 0x10 ; 16 + 3236: 8c 93 st X, r24 + 3238: 50 97 sbiw r26, 0x10 ; 16 CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 3174: 1a 96 adiw r26, 0x0a ; 10 - 3176: 1c 92 st X, r1 - 3178: 1a 97 sbiw r26, 0x0a ; 10 + 323a: 1a 96 adiw r26, 0x0a ; 10 + 323c: 1c 92 st X, r1 + 323e: 1a 97 sbiw r26, 0x0a ; 10 CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; - 317a: 83 e0 ldi r24, 0x03 ; 3 - 317c: 19 96 adiw r26, 0x09 ; 9 - 317e: 8c 93 st X, r24 + 3240: 83 e0 ldi r24, 0x03 ; 3 + 3242: 19 96 adiw r26, 0x09 ; 9 + 3244: 8c 93 st X, r24 EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; - 3180: 9a e5 ldi r25, 0x5A ; 90 - 3182: 98 83 st Y, r25 + 3246: 9a e5 ldi r25, 0x5A ; 90 + 3248: 98 83 st Y, r25 EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; - 3184: 98 e5 ldi r25, 0x58 ; 88 - 3186: 99 83 std Y+1, r25 ; 0x01 + 324a: 98 e5 ldi r25, 0x58 ; 88 + 324c: 99 83 std Y+1, r25 ; 0x01 /* Configure LOADMOD and SUBCARRIER output pins. * Disable PSK modulation by setting pin to low. */ CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK; - 3188: 90 e4 ldi r25, 0x40 ; 64 - 318a: 91 83 std Z+1, r25 ; 0x01 + 324e: 90 e4 ldi r25, 0x40 ; 64 + 3250: 91 83 std Z+1, r25 ; 0x01 CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 318c: 96 83 std Z+6, r25 ; 0x06 + 3252: 96 83 std Z+6, r25 ; 0x06 CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK; - 318e: 81 83 std Z+1, r24 ; 0x01 + 3254: 81 83 std Z+1, r24 ; 0x01 CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK; - 3190: 86 83 std Z+6, r24 ; 0x06 + 3256: 86 83 std Z+6, r24 ; 0x06 /* Configure subcarrier generation with 50% DC output using OOK */ CODEC_SUBCARRIER_TIMER.PER = ISO14443A_SUBCARRIER_DIVIDER - 1; - 3192: e0 e0 ldi r30, 0x00 ; 0 - 3194: f8 e0 ldi r31, 0x08 ; 8 - 3196: 8f e0 ldi r24, 0x0F ; 15 - 3198: 90 e0 ldi r25, 0x00 ; 0 - 319a: 86 a3 std Z+38, r24 ; 0x26 - 319c: 97 a3 std Z+39, r25 ; 0x27 + 3258: e0 e0 ldi r30, 0x00 ; 0 + 325a: f8 e0 ldi r31, 0x08 ; 8 + 325c: 8f e0 ldi r24, 0x0F ; 15 + 325e: 90 e0 ldi r25, 0x00 ; 0 + 3260: 86 a3 std Z+38, r24 ; 0x26 + 3262: 97 a3 std Z+39, r25 ; 0x27 CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = ISO14443A_SUBCARRIER_DIVIDER/2; - 319e: 88 e0 ldi r24, 0x08 ; 8 - 31a0: 90 e0 ldi r25, 0x00 ; 0 - 31a2: 82 a7 std Z+42, r24 ; 0x2a - 31a4: 93 a7 std Z+43, r25 ; 0x2b + 3264: 88 e0 ldi r24, 0x08 ; 8 + 3266: 90 e0 ldi r25, 0x00 ; 0 + 3268: 82 a7 std Z+42, r24 ; 0x2a + 326a: 93 a7 std Z+43, r25 ; 0x2b CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; - 31a6: 83 e2 ldi r24, 0x23 ; 35 - 31a8: 81 83 std Z+1, r24 ; 0x01 + 326c: 83 e2 ldi r24, 0x23 ; 35 + 326e: 81 83 std Z+1, r24 ; 0x01 void ISO14443ACodecInit(void) { /* Initialize common peripherals and start listening * for incoming data. */ Initialize(); StartDemod(); } - 31aa: df 91 pop r29 - 31ac: cf 91 pop r28 + 3270: df 91 pop r29 + 3272: cf 91 pop r28 void ISO14443ACodecInit(void) { /* Initialize common peripherals and start listening * for incoming data. */ Initialize(); StartDemod(); - 31ae: c6 cd rjmp .-1140 ; 0x2d3c + 3274: c3 cd rjmp .-1146 ; 0x2dfc -000031b0 : +00003276 : } void ISO14443ACodecTask(void) { - 31b0: 0f 93 push r16 - 31b2: 1f 93 push r17 - 31b4: cf 93 push r28 - 31b6: df 93 push r29 + 3276: 0f 93 push r16 + 3278: 1f 93 push r17 + 327a: cf 93 push r28 + 327c: df 93 push r29 if (Flags.DemodFinished) { - 31b8: 80 91 b6 28 lds r24, 0x28B6 - 31bc: 88 23 and r24, r24 - 31be: c1 f0 breq .+48 ; 0x31f0 + 327e: 80 91 ba 28 lds r24, 0x28BA + 3282: 88 23 and r24, r24 + 3284: c1 f0 breq .+48 ; 0x32b6 Flags.DemodFinished = 0; - 31c0: 10 92 b6 28 sts 0x28B6, r1 + 3286: 10 92 ba 28 sts 0x28BA, r1 INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); } INLINE void CodecSetDemodPower(bool bOnOff) { CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 31c4: 82 e0 ldi r24, 0x02 ; 2 - 31c6: 80 93 21 06 sts 0x0621, r24 + 328a: 82 e0 ldi r24, 0x02 ; 2 + 328c: 80 93 21 06 sts 0x0621, r24 if (bOnOff) { CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; } else { CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK; - 31ca: 80 93 26 06 sts 0x0626, r24 + 3290: 80 93 26 06 sts 0x0626, r24 /* Reception finished. Process the received bytes */ CodecSetDemodPower(false); uint16_t DemodBitCount = BitCount; - 31ce: 00 91 b4 28 lds r16, 0x28B4 - 31d2: 10 91 b5 28 lds r17, 0x28B5 + 3294: 00 91 b4 28 lds r16, 0x28B4 + 3298: 10 91 b5 28 lds r17, 0x28B5 uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; if (DemodBitCount > 0) { - 31d6: 01 15 cp r16, r1 - 31d8: 11 05 cpc r17, r1 - 31da: 99 f4 brne .+38 ; 0x3202 + 329c: 01 15 cp r16, r1 + 329e: 11 05 cpc r17, r1 + 32a0: 99 f4 brne .+38 ; 0x32c8 INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); } INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); - 31dc: e0 91 f9 28 lds r30, 0x28F9 - 31e0: f0 91 fa 28 lds r31, 0x28FA - 31e4: 09 95 icall + 32a2: e0 91 f9 28 lds r30, 0x28F9 + 32a6: f0 91 fa 28 lds r31, 0x28FA + 32aa: 09 95 icall CodecBufferPtr = CodecBuffer; ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; LoadModState = LOADMOD_START; } else { /* No data to be processed. Disable loadmodding and start listening again */ CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; - 31e6: 10 92 40 09 sts 0x0940, r1 + 32ac: 10 92 40 09 sts 0x0940, r1 CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 31ea: 10 92 46 09 sts 0x0946, r1 + 32b0: 10 92 46 09 sts 0x0946, r1 StartDemod(); - 31ee: a6 dd rcall .-1204 ; 0x2d3c + 32b4: a3 dd rcall .-1210 ; 0x2dfc } } if (Flags.LoadmodFinished) { - 31f0: 80 91 b7 28 lds r24, 0x28B7 - 31f4: 81 11 cpse r24, r1 - 31f6: 5a c0 rjmp .+180 ; 0x32ac + 32b6: 80 91 bb 28 lds r24, 0x28BB + 32ba: 81 11 cpse r24, r1 + 32bc: 5a c0 rjmp .+180 ; 0x3372 * for incoming data again. */ StartDemod(); } //SystemSleep(); } - 31f8: df 91 pop r29 - 31fa: cf 91 pop r28 - 31fc: 1f 91 pop r17 - 31fe: 0f 91 pop r16 - 3200: 08 95 ret + 32be: df 91 pop r29 + 32c0: cf 91 pop r28 + 32c2: 1f 91 pop r17 + 32c4: 0f 91 pop r16 + 32c6: 08 95 ret uint16_t DemodBitCount = BitCount; uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; if (DemodBitCount > 0) { LogEntry(LOG_INFO_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); - 3202: a8 01 movw r20, r16 - 3204: 49 5f subi r20, 0xF9 ; 249 - 3206: 5f 4f sbci r21, 0xFF ; 255 - 3208: 56 95 lsr r21 - 320a: 47 95 ror r20 - 320c: 56 95 lsr r21 - 320e: 47 95 ror r20 - 3210: 56 95 lsr r21 - 3212: 47 95 ror r20 + 32c8: a8 01 movw r20, r16 + 32ca: 49 5f subi r20, 0xF9 ; 249 + 32cc: 5f 4f sbci r21, 0xFF ; 255 + 32ce: 56 95 lsr r21 + 32d0: 47 95 ror r20 + 32d2: 56 95 lsr r21 + 32d4: 47 95 ror r20 + 32d6: 56 95 lsr r21 + 32d8: 47 95 ror r20 void LogSetModeById(LogModeEnum Mode); bool LogSetModeByName(const char* Name); void LogGetModeByName(char* Name, uint16_t BufferSize); void LogGetModeList(char* List, uint16_t BufferSize); INLINE void LogEntry(LogEntryEnum Entry, void* Data, uint8_t Length) { LogFunc(Entry, Data, Length); } - 3214: e0 91 07 29 lds r30, 0x2907 - 3218: f0 91 08 29 lds r31, 0x2908 - 321c: 6c e3 ldi r22, 0x3C ; 60 - 321e: 7a e2 ldi r23, 0x2A ; 42 - 3220: 80 e2 ldi r24, 0x20 ; 32 - 3222: 09 95 icall + 32da: e0 91 07 29 lds r30, 0x2907 + 32de: f0 91 08 29 lds r31, 0x2908 + 32e2: 6c e3 ldi r22, 0x3C ; 60 + 32e4: 7a e2 ldi r23, 0x2A ; 42 + 32e6: 80 e2 ldi r24, 0x20 ; 32 + 32e8: 09 95 icall LEDTrigger(LED_CODEC_RX, LED_PULSE); - 3224: 63 e1 ldi r22, 0x13 ; 19 - 3226: 86 e0 ldi r24, 0x06 ; 6 - 3228: 0e 94 af 0f call 0x1f5e ; 0x1f5e + 32ea: 63 e1 ldi r22, 0x13 ; 19 + 32ec: 86 e0 ldi r24, 0x06 ; 6 + 32ee: 0e 94 f1 0f call 0x1fe2 ; 0x1fe2 INLINE void ApplicationTask(void) { ActiveConfiguration.ApplicationTaskFunc(); } INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); - 322c: e0 91 fd 28 lds r30, 0x28FD - 3230: f0 91 fe 28 lds r31, 0x28FE - 3234: b8 01 movw r22, r16 - 3236: 8c e3 ldi r24, 0x3C ; 60 - 3238: 9a e2 ldi r25, 0x2A ; 42 - 323a: 09 95 icall - 323c: 8c 01 movw r16, r24 + 32f2: e0 91 fd 28 lds r30, 0x28FD + 32f6: f0 91 fe 28 lds r31, 0x28FE + 32fa: b8 01 movw r22, r16 + 32fc: 8c e3 ldi r24, 0x3C ; 60 + 32fe: 9a e2 ldi r25, 0x2A ; 42 + 3300: 09 95 icall + 3302: 8c 01 movw r16, r24 /* Call application if we received data */ AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { - 323e: 94 ff sbrs r25, 4 - 3240: 3c c0 rjmp .+120 ; 0x32ba + 3304: 94 ff sbrs r25, 4 + 3306: 3c c0 rjmp .+120 ; 0x3380 /* Application has generated it's own parity bits. * Clear this option bit. */ AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - 3242: 1f 7e andi r17, 0xEF ; 239 + 3308: 1f 7e andi r17, 0xEF ; 239 } } else { ApplicationReset(); } if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { - 3244: 01 15 cp r16, r1 - 3246: 11 05 cpc r17, r1 - 3248: 71 f2 breq .-100 ; 0x31e6 + 330a: 01 15 cp r16, r1 + 330c: 11 05 cpc r17, r1 + 330e: 71 f2 breq .-100 ; 0x32ac LogEntry(LOG_INFO_TX_DATA, CodecBuffer, (AnswerBitCount + 7) / 8); - 324a: a8 01 movw r20, r16 - 324c: 49 5f subi r20, 0xF9 ; 249 - 324e: 5f 4f sbci r21, 0xFF ; 255 - 3250: 56 95 lsr r21 - 3252: 47 95 ror r20 - 3254: 56 95 lsr r21 - 3256: 47 95 ror r20 - 3258: 56 95 lsr r21 - 325a: 47 95 ror r20 - 325c: e0 91 07 29 lds r30, 0x2907 - 3260: f0 91 08 29 lds r31, 0x2908 - 3264: 6c e3 ldi r22, 0x3C ; 60 - 3266: 7a e2 ldi r23, 0x2A ; 42 - 3268: 81 e2 ldi r24, 0x21 ; 33 - 326a: 09 95 icall + 3310: a8 01 movw r20, r16 + 3312: 49 5f subi r20, 0xF9 ; 249 + 3314: 5f 4f sbci r21, 0xFF ; 255 + 3316: 56 95 lsr r21 + 3318: 47 95 ror r20 + 331a: 56 95 lsr r21 + 331c: 47 95 ror r20 + 331e: 56 95 lsr r21 + 3320: 47 95 ror r20 + 3322: e0 91 07 29 lds r30, 0x2907 + 3326: f0 91 08 29 lds r31, 0x2908 + 332a: 6c e3 ldi r22, 0x3C ; 60 + 332c: 7a e2 ldi r23, 0x2A ; 42 + 332e: 81 e2 ldi r24, 0x21 ; 33 + 3330: 09 95 icall LEDTrigger(LED_CODEC_TX, LED_PULSE); - 326c: 63 e1 ldi r22, 0x13 ; 19 - 326e: 87 e0 ldi r24, 0x07 ; 7 - 3270: 0e 94 af 0f call 0x1f5e ; 0x1f5e + 3332: 63 e1 ldi r22, 0x13 ; 19 + 3334: 87 e0 ldi r24, 0x07 ; 7 + 3336: 0e 94 f1 0f call 0x1fe2 ; 0x1fe2 BitCount = AnswerBitCount; - 3274: 00 93 b4 28 sts 0x28B4, r16 - 3278: 10 93 b5 28 sts 0x28B5, r17 + 333a: 00 93 b4 28 sts 0x28B4, r16 + 333e: 10 93 b5 28 sts 0x28B5, r17 BitSent = 0; - 327c: 10 92 b2 28 sts 0x28B2, r1 - 3280: 10 92 b3 28 sts 0x28B3, r1 + 3342: 10 92 b2 28 sts 0x28B2, r1 + 3346: 10 92 b3 28 sts 0x28B3, r1 CodecBufferPtr = CodecBuffer; - 3284: 8c e3 ldi r24, 0x3C ; 60 - 3286: 9a e2 ldi r25, 0x2A ; 42 - 3288: 80 93 b8 28 sts 0x28B8, r24 - 328c: 90 93 b9 28 sts 0x28B9, r25 + 334a: 8c e3 ldi r24, 0x3C ; 60 + 334c: 9a e2 ldi r25, 0x2A ; 42 + 334e: 80 93 b8 28 sts 0x28B8, r24 + 3352: 90 93 b9 28 sts 0x28B9, r25 ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 3290: 8c eb ldi r24, 0xBC ; 188 - 3292: 9a e2 ldi r25, 0x2A ; 42 - 3294: 80 93 ba 28 sts 0x28BA, r24 - 3298: 90 93 bb 28 sts 0x28BB, r25 + 3356: 8c eb ldi r24, 0xBC ; 188 + 3358: 9a e2 ldi r25, 0x2A ; 42 + 335a: 80 93 b6 28 sts 0x28B6, r24 + 335e: 90 93 b7 28 sts 0x28B7, r25 LoadModState = LOADMOD_START; - 329c: 81 e0 ldi r24, 0x01 ; 1 - 329e: 80 93 ad 28 sts 0x28AD, r24 + 3362: 81 e0 ldi r24, 0x01 ; 1 + 3364: 80 93 ad 28 sts 0x28AD, r24 StartDemod(); } } if (Flags.LoadmodFinished) { - 32a2: 80 91 b7 28 lds r24, 0x28B7 - 32a6: 88 23 and r24, r24 - 32a8: 09 f4 brne .+2 ; 0x32ac - 32aa: a6 cf rjmp .-180 ; 0x31f8 + 3368: 80 91 bb 28 lds r24, 0x28BB + 336c: 88 23 and r24, r24 + 336e: 09 f4 brne .+2 ; 0x3372 + 3370: a6 cf rjmp .-180 ; 0x32be Flags.LoadmodFinished = 0; - 32ac: 10 92 b7 28 sts 0x28B7, r1 + 3372: 10 92 bb 28 sts 0x28BB, r1 * for incoming data again. */ StartDemod(); } //SystemSleep(); } - 32b0: df 91 pop r29 - 32b2: cf 91 pop r28 - 32b4: 1f 91 pop r17 - 32b6: 0f 91 pop r16 + 3376: df 91 pop r29 + 3378: cf 91 pop r28 + 337a: 1f 91 pop r17 + 337c: 0f 91 pop r16 if (Flags.LoadmodFinished) { Flags.LoadmodFinished = 0; /* Load modulation has been finished. Stop it and start to listen * for incoming data again. */ StartDemod(); - 32b8: 41 cd rjmp .-1406 ; 0x2d3c + 337e: 3e cd rjmp .-1412 ; 0x2dfc /* Application has generated it's own parity bits. * Clear this option bit. */ AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; } else { /* We have to generate the parity bits ourself */ for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - 32ba: 96 95 lsr r25 - 32bc: 87 95 ror r24 - 32be: 96 95 lsr r25 - 32c0: 87 95 ror r24 - 32c2: 96 95 lsr r25 - 32c4: 87 95 ror r24 - 32c6: 00 97 sbiw r24, 0x00 ; 0 - 32c8: 09 f4 brne .+2 ; 0x32cc - 32ca: bc cf rjmp .-136 ; 0x3244 - 32cc: 40 e0 ldi r20, 0x00 ; 0 - 32ce: 20 e0 ldi r18, 0x00 ; 0 - 32d0: 30 e0 ldi r19, 0x00 ; 0 + 3380: ac 01 movw r20, r24 + 3382: 56 95 lsr r21 + 3384: 47 95 ror r20 + 3386: 56 95 lsr r21 + 3388: 47 95 ror r20 + 338a: 56 95 lsr r21 + 338c: 47 95 ror r20 + 338e: 41 15 cp r20, r1 + 3390: 51 05 cpc r21, r1 + 3392: 09 f4 brne .+2 ; 0x3396 + 3394: ba cf rjmp .-140 ; 0x330a + 3396: 90 e0 ldi r25, 0x00 ; 0 + 3398: 20 e0 ldi r18, 0x00 ; 0 + 339a: 30 e0 ldi r19, 0x00 ; 0 /* For each whole byte, generate a parity bit. */ CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CodecBuffer[i]); - 32d2: f9 01 movw r30, r18 - 32d4: e4 5c subi r30, 0xC4 ; 196 - 32d6: f5 4d sbci r31, 0xD5 ; 213 - 32d8: 20 81 ld r18, Z - 32da: 02 2e mov r0, r18 - 32dc: 22 95 swap r18 - 32de: 20 25 eor r18, r0 - 32e0: 02 2e mov r0, r18 - 32e2: 26 95 lsr r18 - 32e4: 26 95 lsr r18 - 32e6: 20 25 eor r18, r0 + 339c: f9 01 movw r30, r18 + 339e: e4 5c subi r30, 0xC4 ; 196 + 33a0: f5 4d sbci r31, 0xD5 ; 213 + 33a2: 80 81 ld r24, Z + 33a4: 08 2e mov r0, r24 + 33a6: 82 95 swap r24 + 33a8: 80 25 eor r24, r0 + 33aa: 08 2e mov r0, r24 + 33ac: 86 95 lsr r24 + 33ae: 86 95 lsr r24 + 33b0: 80 25 eor r24, r0 AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; } else { /* We have to generate the parity bits ourself */ for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { /* For each whole byte, generate a parity bit. */ CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - 32e8: e0 58 subi r30, 0x80 ; 128 - 32ea: ff 4f sbci r31, 0xFF ; 255 + 33b2: e0 58 subi r30, 0x80 ; 128 + 33b4: ff 4f sbci r31, 0xFF ; 255 ODD_PARITY(CodecBuffer[i]); - 32ec: 30 e0 ldi r19, 0x00 ; 0 - 32ee: 2f 5f subi r18, 0xFF ; 255 - 32f0: 3f 4f sbci r19, 0xFF ; 255 - 32f2: 21 fb bst r18, 1 - 32f4: 55 27 eor r21, r21 - 32f6: 50 f9 bld r21, 0 - 32f8: c5 2f mov r28, r21 - 32fa: 20 e0 ldi r18, 0x00 ; 0 - 32fc: d2 2f mov r29, r18 - 32fe: 51 e0 ldi r21, 0x01 ; 1 - 3300: c5 27 eor r28, r21 - 3302: c0 83 st Z, r28 + 33b6: 8f 5f subi r24, 0xFF ; 255 + 33b8: 86 95 lsr r24 + 33ba: 81 70 andi r24, 0x01 ; 1 + 33bc: c8 2f mov r28, r24 + 33be: 80 e0 ldi r24, 0x00 ; 0 + 33c0: d8 2f mov r29, r24 + 33c2: 81 e0 ldi r24, 0x01 ; 1 + 33c4: c8 27 eor r28, r24 + 33c6: c0 83 st Z, r28 /* Application has generated it's own parity bits. * Clear this option bit. */ AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; } else { /* We have to generate the parity bits ourself */ for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - 3304: 4f 5f subi r20, 0xFF ; 255 - 3306: 24 2f mov r18, r20 - 3308: 30 e0 ldi r19, 0x00 ; 0 - 330a: 28 17 cp r18, r24 - 330c: 39 07 cpc r19, r25 - 330e: 08 f3 brcs .-62 ; 0x32d2 - 3310: 99 cf rjmp .-206 ; 0x3244 + 33c8: 9f 5f subi r25, 0xFF ; 255 + 33ca: 29 2f mov r18, r25 + 33cc: 30 e0 ldi r19, 0x00 ; 0 + 33ce: 24 17 cp r18, r20 + 33d0: 35 07 cpc r19, r21 + 33d2: 20 f3 brcs .-56 ; 0x339c + 33d4: 9d cf rjmp .-198 ; 0x3310 -00003312 : +000033d6 : static uint8_t CompatWritePageAddress; void MifareUltralightAppInit(void) { State = STATE_IDLE; - 3312: 81 e0 ldi r24, 0x01 ; 1 - 3314: 80 93 bc 28 sts 0x28BC, r24 - 3318: 08 95 ret + 33d6: 81 e0 ldi r24, 0x01 ; 1 + 33d8: 80 93 bd 28 sts 0x28BD, r24 + 33dc: 08 95 ret -0000331a : +000033de : } void MifareUltralightAppReset(void) { State = STATE_IDLE; - 331a: 81 e0 ldi r24, 0x01 ; 1 - 331c: 80 93 bc 28 sts 0x28BC, r24 - 3320: 08 95 ret + 33de: 81 e0 ldi r24, 0x01 ; 1 + 33e0: 80 93 bd 28 sts 0x28BD, r24 + 33e4: 08 95 ret -00003322 : +000033e6 : } void MifareUltralightAppTask(void) { - 3322: 08 95 ret + 33e6: 08 95 ret -00003324 : +000033e8 : } uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) { - 3324: ff 92 push r15 - 3326: 0f 93 push r16 - 3328: 1f 93 push r17 - 332a: cf 93 push r28 - 332c: df 93 push r29 - 332e: 00 d0 rcall .+0 ; 0x3330 - 3330: 00 d0 rcall .+0 ; 0x3332 - 3332: cd b7 in r28, 0x3d ; 61 - 3334: de b7 in r29, 0x3e ; 62 - 3336: 8c 01 movw r16, r24 + 33e8: ff 92 push r15 + 33ea: 0f 93 push r16 + 33ec: 1f 93 push r17 + 33ee: cf 93 push r28 + 33f0: df 93 push r29 + 33f2: 00 d0 rcall .+0 ; 0x33f4 + 33f4: 00 d0 rcall .+0 ; 0x33f6 + 33f6: cd b7 in r28, 0x3d ; 61 + 33f8: de b7 in r29, 0x3e ; 62 + 33fa: 8c 01 movw r16, r24 uint8_t Cmd = Buffer[0]; - 3338: fc 01 movw r30, r24 - 333a: 90 81 ld r25, Z + 33fc: fc 01 movw r30, r24 + 33fe: 90 81 ld r25, Z switch(State) { - 333c: 80 91 bc 28 lds r24, 0x28BC - 3340: 82 30 cpi r24, 0x02 ; 2 - 3342: 09 f4 brne .+2 ; 0x3346 - 3344: 5b c0 rjmp .+182 ; 0x33fc - 3346: 80 f4 brcc .+32 ; 0x3368 -INLINE -bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) -{ - uint8_t* DataPtr = (uint8_t*) Buffer; - - if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 3348: 96 32 cpi r25, 0x26 ; 38 - 334a: a9 f1 breq .+106 ; 0x33b6 - 334c: 92 35 cpi r25, 0x52 ; 82 - 334e: 99 f1 breq .+102 ; 0x33b6 - - *BitCount = ISO14443A_SAK_FRAME_SIZE; - return true; - } else { - /* We have not been selected. Don't send anything. */ - *BitCount = 0; - 3350: 20 e0 ldi r18, 0x00 ; 0 - 3352: 30 e0 ldi r19, 0x00 ; 0 - break; - } - - /* No response has been sent, when we reach here */ - return ISO14443A_APP_NO_RESPONSE; -} - 3354: c9 01 movw r24, r18 - 3356: 24 96 adiw r28, 0x04 ; 4 - 3358: cd bf out 0x3d, r28 ; 61 - 335a: de bf out 0x3e, r29 ; 62 - 335c: df 91 pop r29 - 335e: cf 91 pop r28 - 3360: 1f 91 pop r17 - 3362: 0f 91 pop r16 - 3364: ff 90 pop r15 - 3366: 08 95 ret - -uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - uint8_t Cmd = Buffer[0]; - - switch(State) { - 3368: 84 30 cpi r24, 0x04 ; 4 - 336a: 79 f1 breq .+94 ; 0x33ca - 336c: 68 f4 brcc .+26 ; 0x3388 -INLINE -bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) -{ - uint8_t* DataPtr = (uint8_t*) Buffer; - - if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 336e: 96 32 cpi r25, 0x26 ; 38 - 3370: 11 f1 breq .+68 ; 0x33b6 - 3372: 92 35 cpi r25, 0x52 ; 82 - 3374: 01 f1 breq .+64 ; 0x33b6 - - case STATE_READY2: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { - State = STATE_READY1; - return BitCount; - } else if (Cmd == ISO14443A_CMD_SELECT_CL2) { - 3376: 95 39 cpi r25, 0x95 ; 149 - 3378: 09 f4 brne .+2 ; 0x337c - 337a: 90 c0 rjmp .+288 ; 0x349c - Buffer[0] = NAK_INVALID_ARG; - return NAK_FRAME_SIZE; - } - } else { - /* Unknown command. Enter halt state */ - State = STATE_IDLE; - 337c: 81 e0 ldi r24, 0x01 ; 1 - 337e: 80 93 bc 28 sts 0x28BC, r24 - /* Unknown state? Should never happen. */ - break; - } - - /* No response has been sent, when we reach here */ - return ISO14443A_APP_NO_RESPONSE; - 3382: 20 e0 ldi r18, 0x00 ; 0 - 3384: 30 e0 ldi r19, 0x00 ; 0 - } - } else { - /* Unknown command. Enter halt state */ - State = STATE_IDLE; - } - break; - 3386: e6 cf rjmp .-52 ; 0x3354 - -uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - uint8_t Cmd = Buffer[0]; - - switch(State) { - 3388: 85 30 cpi r24, 0x05 ; 5 - 338a: 11 f7 brne .-60 ; 0x3350 + 3400: 80 91 bd 28 lds r24, 0x28BD + 3404: 82 30 cpi r24, 0x02 ; 2 + 3406: 09 f4 brne .+2 ; 0x340a + 3408: 5b c0 rjmp .+182 ; 0x34c0 + 340a: d8 f0 brcs .+54 ; 0x3442 + 340c: 84 30 cpi r24, 0x04 ; 4 + 340e: 09 f4 brne .+2 ; 0x3412 + 3410: 3e c0 rjmp .+124 ; 0x348e + 3412: 30 f1 brcs .+76 ; 0x3460 + 3414: 85 30 cpi r24, 0x05 ; 5 + 3416: c9 f4 brne .+50 ; 0x344a } break; case STATE_COMPAT_WRITE: /* Compatibility write. Receiving 16 bytes of data of which 4 bytes are valid. */ if (ISO14443ACheckCRCA(Buffer, BYTES_PER_COMPAT_WRITE)) { - 338c: 60 e1 ldi r22, 0x10 ; 16 - 338e: 70 e0 ldi r23, 0x00 ; 0 - 3390: c8 01 movw r24, r16 - 3392: e7 d7 rcall .+4046 ; 0x4362 - 3394: 88 23 and r24, r24 - 3396: 09 f4 brne .+2 ; 0x339a - 3398: 6b c0 rjmp .+214 ; 0x3470 + 3418: 60 e1 ldi r22, 0x10 ; 16 + 341a: 70 e0 ldi r23, 0x00 ; 0 + 341c: c8 01 movw r24, r16 + 341e: 3c d7 rcall .+3704 ; 0x4298 + 3420: 88 23 and r24, r24 + 3422: 09 f4 brne .+2 ; 0x3426 + 3424: 86 c0 rjmp .+268 ; 0x3532 /* We don't perform any checks here. You will be able to program the * whole memory. Also there is no OTP behaviour. */ if (!ActiveConfiguration.ReadOnly) { - 339a: 80 91 06 29 lds r24, 0x2906 - 339e: 88 23 and r24, r24 - 33a0: 09 f4 brne .+2 ; 0x33a4 - 33a2: 6f c0 rjmp .+222 ; 0x3482 + 3426: 80 91 06 29 lds r24, 0x2906 + 342a: 88 23 and r24, r24 + 342c: 09 f4 brne .+2 ; 0x3430 + 342e: 8a c0 rjmp .+276 ; 0x3544 } else { /* If we are told to be read only, we silently ignore the write command * and pretend to have written data. */ } State = STATE_ACTIVE; - 33a4: 84 e0 ldi r24, 0x04 ; 4 - 33a6: 80 93 bc 28 sts 0x28BC, r24 + 3430: 84 e0 ldi r24, 0x04 ; 4 + 3432: 80 93 bd 28 sts 0x28BD, r24 Buffer[0] = ACK_VALUE; - 33aa: 8a e0 ldi r24, 0x0A ; 10 - 33ac: f8 01 movw r30, r16 - 33ae: 80 83 st Z, r24 + 3436: 8a e0 ldi r24, 0x0A ; 10 + 3438: f8 01 movw r30, r16 + 343a: 80 83 st Z, r24 return ACK_FRAME_SIZE; - 33b0: 24 e0 ldi r18, 0x04 ; 4 - 33b2: 30 e0 ldi r19, 0x00 ; 0 - 33b4: cf cf rjmp .-98 ; 0x3354 - DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 33b6: 84 e4 ldi r24, 0x44 ; 68 - 33b8: f8 01 movw r30, r16 - 33ba: 80 83 st Z, r24 - DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 33bc: 11 82 std Z+1, r1 ; 0x01 - } - break; - - case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { - State = STATE_READY1; - 33be: 82 e0 ldi r24, 0x02 ; 2 - 33c0: 80 93 bc 28 sts 0x28BC, r24 - - *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 33c4: 20 e1 ldi r18, 0x10 ; 16 - 33c6: 30 e0 ldi r19, 0x00 ; 0 - return BitCount; - 33c8: c5 cf rjmp .-118 ; 0x3354 + 343c: 84 e0 ldi r24, 0x04 ; 4 + 343e: 90 e0 ldi r25, 0x00 ; 0 + 3440: 06 c0 rjmp .+12 ; 0x344e INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) { uint8_t* DataPtr = (uint8_t*) Buffer; if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 33ca: 96 32 cpi r25, 0x26 ; 38 - 33cc: a1 f3 breq .-24 ; 0x33b6 - 33ce: 92 35 cpi r25, 0x52 ; 82 - 33d0: 91 f3 breq .-28 ; 0x33b6 - } else if (Cmd == CMD_READ) { - 33d2: 90 33 cpi r25, 0x30 ; 48 - 33d4: 09 f4 brne .+2 ; 0x33d8 - 33d6: 8e c0 rjmp .+284 ; 0x34f4 - } - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_WRITE) { - 33d8: 92 3a cpi r25, 0xA2 ; 162 - 33da: 09 f4 brne .+2 ; 0x33de - 33dc: ba c0 rjmp .+372 ; 0x3552 - } - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_COMPAT_WRITE) { - 33de: 90 3a cpi r25, 0xA0 ; 160 - 33e0: 09 f4 brne .+2 ; 0x33e4 - 33e2: d4 c0 rjmp .+424 ; 0x358c - } - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_HALT) { - 33e4: 90 35 cpi r25, 0x50 ; 80 - 33e6: 51 f6 brne .-108 ; 0x337c - /* Halts the tag. According to the ISO14443, the second - * byte is supposed to be 0. */ - if (Buffer[1] == 0) { - 33e8: f8 01 movw r30, r16 - 33ea: 81 81 ldd r24, Z+1 ; 0x01 - 33ec: 88 23 and r24, r24 - 33ee: 09 f4 brne .+2 ; 0x33f2 - 33f0: df c0 rjmp .+446 ; 0x35b0 - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else { - Buffer[0] = NAK_INVALID_ARG; - 33f2: f8 01 movw r30, r16 - 33f4: 10 82 st Z, r1 - return NAK_FRAME_SIZE; - 33f6: 24 e0 ldi r18, 0x04 ; 4 - 33f8: 30 e0 ldi r19, 0x00 ; 0 - 33fa: ac cf rjmp .-168 ; 0x3354 - 33fc: 96 32 cpi r25, 0x26 ; 38 - 33fe: d9 f2 breq .-74 ; 0x33b6 - 3400: 92 35 cpi r25, 0x52 ; 82 - 3402: c9 f2 breq .-78 ; 0x33b6 - - case STATE_READY1: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { - State = STATE_READY1; - return BitCount; - } else if (Cmd == ISO14443A_CMD_SELECT_CL1) { - 3404: 93 39 cpi r25, 0x93 ; 147 - 3406: 09 f0 breq .+2 ; 0x340a - 3408: b9 cf rjmp .-142 ; 0x337c - /* Load UID CL1 and perform anticollision. Since - * MF Ultralight use a double-sized UID, the first byte - * of CL1 has to be the cascade-tag byte. */ - uint8_t UidCL1[ISO14443A_CL_UID_SIZE] = { [0] = ISO14443A_UID0_CT }; - 340a: 19 82 std Y+1, r1 ; 0x01 - 340c: 1a 82 std Y+2, r1 ; 0x02 - 340e: 1b 82 std Y+3, r1 ; 0x03 - 3410: 1c 82 std Y+4, r1 ; 0x04 - 3412: 88 e8 ldi r24, 0x88 ; 136 - 3414: 89 83 std Y+1, r24 ; 0x01 - - MemoryReadBlock(&UidCL1[1], UID_CL1_ADDRESS, UID_CL1_SIZE); - 3416: 43 e0 ldi r20, 0x03 ; 3 - 3418: 50 e0 ldi r21, 0x00 ; 0 - 341a: 60 e0 ldi r22, 0x00 ; 0 - 341c: 70 e0 ldi r23, 0x00 ; 0 - 341e: ce 01 movw r24, r28 - 3420: 02 96 adiw r24, 0x02 ; 2 - 3422: 0e 94 de 06 call 0xdbc ; 0xdbc - uint8_t* DataPtr = (uint8_t*) Buffer; - uint8_t NVB = DataPtr[1]; - //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; - //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; - - switch (NVB) { - 3426: f8 01 movw r30, r16 - 3428: 81 81 ldd r24, Z+1 ; 0x01 - 342a: 80 32 cpi r24, 0x20 ; 32 - 342c: 09 f4 brne .+2 ; 0x3430 - 342e: 81 c0 rjmp .+258 ; 0x3532 - 3430: 80 37 cpi r24, 0x70 ; 112 - 3432: 09 f0 breq .+2 ; 0x3436 - 3434: 8d cf rjmp .-230 ; 0x3350 - return false; - - case ISO14443A_NVB_AC_END: - /* End of anticollision procedure. - * Send SAK CLn if we are selected. */ - if ( (DataPtr[2] == UidCL[0]) && - 3436: f8 01 movw r30, r16 - 3438: 92 81 ldd r25, Z+2 ; 0x02 - 343a: 89 81 ldd r24, Y+1 ; 0x01 - 343c: 98 13 cpse r25, r24 - 343e: 88 cf rjmp .-240 ; 0x3350 - 3440: 93 81 ldd r25, Z+3 ; 0x03 - 3442: 8a 81 ldd r24, Y+2 ; 0x02 - 3444: 98 13 cpse r25, r24 - 3446: 84 cf rjmp .-248 ; 0x3350 - (DataPtr[3] == UidCL[1]) && - 3448: 94 81 ldd r25, Z+4 ; 0x04 - 344a: 8b 81 ldd r24, Y+3 ; 0x03 - 344c: 98 13 cpse r25, r24 - 344e: 80 cf rjmp .-256 ; 0x3350 - (DataPtr[4] == UidCL[2]) && - 3450: 95 81 ldd r25, Z+5 ; 0x05 - 3452: 8c 81 ldd r24, Y+4 ; 0x04 - 3454: 98 13 cpse r25, r24 - 3456: 7c cf rjmp .-264 ; 0x3350 - (DataPtr[5] == UidCL[3]) ) { - - DataPtr[0] = SAKValue; - 3458: 84 e0 ldi r24, 0x04 ; 4 - 345a: 80 83 st Z, r24 - ISO14443AAppendCRCA(Buffer, 1); - 345c: 61 e0 ldi r22, 0x01 ; 1 - 345e: 70 e0 ldi r23, 0x00 ; 0 - 3460: c8 01 movw r24, r16 - 3462: 50 d7 rcall .+3744 ; 0x4304 - - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_CL1_VALUE)) { - /* CL1 stage has ended successfully */ - State = STATE_READY2; - 3464: 83 e0 ldi r24, 0x03 ; 3 - 3466: 80 93 bc 28 sts 0x28BC, r24 - - *BitCount = ISO14443A_SAK_FRAME_SIZE; - 346a: 28 e1 ldi r18, 0x18 ; 24 - 346c: 30 e0 ldi r19, 0x00 ; 0 - 346e: 72 cf rjmp .-284 ; 0x3354 - - State = STATE_ACTIVE; - Buffer[0] = ACK_VALUE; - return ACK_FRAME_SIZE; - } else { - State = STATE_ACTIVE; - 3470: 84 e0 ldi r24, 0x04 ; 4 - 3472: 80 93 bc 28 sts 0x28BC, r24 - Buffer[0] = NAK_CRC_ERROR; - 3476: 81 e0 ldi r24, 0x01 ; 1 - 3478: f8 01 movw r30, r16 - 347a: 80 83 st Z, r24 - return NAK_FRAME_SIZE; - 347c: 24 e0 ldi r18, 0x04 ; 4 - 347e: 30 e0 ldi r19, 0x00 ; 0 - 3480: 69 cf rjmp .-302 ; 0x3354 - /* Compatibility write. Receiving 16 bytes of data of which 4 bytes are valid. */ - if (ISO14443ACheckCRCA(Buffer, BYTES_PER_COMPAT_WRITE)) { - /* We don't perform any checks here. You will be able to program the - * whole memory. Also there is no OTP behaviour. */ - if (!ActiveConfiguration.ReadOnly) { - MemoryWriteBlock(Buffer, CompatWritePageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); - 3482: 60 91 bd 28 lds r22, 0x28BD - 3486: 70 e0 ldi r23, 0x00 ; 0 - 3488: 66 0f add r22, r22 - 348a: 77 1f adc r23, r23 - 348c: 66 0f add r22, r22 - 348e: 77 1f adc r23, r23 - 3490: 44 e0 ldi r20, 0x04 ; 4 - 3492: 50 e0 ldi r21, 0x00 ; 0 - 3494: c8 01 movw r24, r16 - 3496: 0e 94 f6 06 call 0xdec ; 0xdec - 349a: 84 cf rjmp .-248 ; 0x33a4 - return BitCount; - } else if (Cmd == ISO14443A_CMD_SELECT_CL2) { - /* Load UID CL2 and perform anticollision */ - uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; - - MemoryReadBlock(UidCL2, UID_CL2_ADDRESS, UID_CL2_SIZE); - 349c: 44 e0 ldi r20, 0x04 ; 4 - 349e: 50 e0 ldi r21, 0x00 ; 0 - 34a0: 64 e0 ldi r22, 0x04 ; 4 - 34a2: 70 e0 ldi r23, 0x00 ; 0 - 34a4: ce 01 movw r24, r28 - 34a6: 01 96 adiw r24, 0x01 ; 1 - 34a8: 0e 94 de 06 call 0xdbc ; 0xdbc - uint8_t* DataPtr = (uint8_t*) Buffer; - uint8_t NVB = DataPtr[1]; - //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; - //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; - - switch (NVB) { - 34ac: f8 01 movw r30, r16 - 34ae: 81 81 ldd r24, Z+1 ; 0x01 - 34b0: 80 32 cpi r24, 0x20 ; 32 - 34b2: 09 f4 brne .+2 ; 0x34b6 - 34b4: 3e c0 rjmp .+124 ; 0x3532 - 34b6: 80 37 cpi r24, 0x70 ; 112 - 34b8: 09 f0 breq .+2 ; 0x34bc - 34ba: 4a cf rjmp .-364 ; 0x3350 - return false; - - case ISO14443A_NVB_AC_END: - /* End of anticollision procedure. - * Send SAK CLn if we are selected. */ - if ( (DataPtr[2] == UidCL[0]) && - 34bc: f8 01 movw r30, r16 - 34be: 92 81 ldd r25, Z+2 ; 0x02 - 34c0: 89 81 ldd r24, Y+1 ; 0x01 - 34c2: 98 13 cpse r25, r24 - 34c4: 45 cf rjmp .-374 ; 0x3350 - 34c6: 93 81 ldd r25, Z+3 ; 0x03 - 34c8: 8a 81 ldd r24, Y+2 ; 0x02 - 34ca: 98 13 cpse r25, r24 - 34cc: 41 cf rjmp .-382 ; 0x3350 - (DataPtr[3] == UidCL[1]) && - 34ce: 94 81 ldd r25, Z+4 ; 0x04 - 34d0: 8b 81 ldd r24, Y+3 ; 0x03 - 34d2: 98 13 cpse r25, r24 - 34d4: 3d cf rjmp .-390 ; 0x3350 - (DataPtr[4] == UidCL[2]) && - 34d6: 95 81 ldd r25, Z+5 ; 0x05 - 34d8: 8c 81 ldd r24, Y+4 ; 0x04 - 34da: 98 13 cpse r25, r24 - 34dc: 39 cf rjmp .-398 ; 0x3350 - (DataPtr[5] == UidCL[3]) ) { - - DataPtr[0] = SAKValue; - 34de: 10 82 st Z, r1 - ISO14443AAppendCRCA(Buffer, 1); - 34e0: 61 e0 ldi r22, 0x01 ; 1 - 34e2: 70 e0 ldi r23, 0x00 ; 0 - 34e4: c8 01 movw r24, r16 - 34e6: 0e d7 rcall .+3612 ; 0x4304 - - if (ISO14443ASelect(Buffer, &BitCount, UidCL2, SAK_CL2_VALUE)) { - /* CL2 stage has ended successfully. This means - * our complete UID has been sent to the reader. */ - State = STATE_ACTIVE; - 34e8: 84 e0 ldi r24, 0x04 ; 4 - 34ea: 80 93 bc 28 sts 0x28BC, r24 - - *BitCount = ISO14443A_SAK_FRAME_SIZE; - 34ee: 28 e1 ldi r18, 0x18 ; 24 - 34f0: 30 e0 ldi r19, 0x00 ; 0 - 34f2: 30 cf rjmp .-416 ; 0x3354 - case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { - State = STATE_READY1; - return BitCount; - } else if (Cmd == CMD_READ) { - uint8_t PageAddress = Buffer[1]; - 34f4: f8 01 movw r30, r16 - 34f6: f1 80 ldd r15, Z+1 ; 0x01 - - if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { - 34f8: 62 e0 ldi r22, 0x02 ; 2 - 34fa: 70 e0 ldi r23, 0x00 ; 0 - 34fc: c8 01 movw r24, r16 - 34fe: 31 d7 rcall .+3682 ; 0x4362 - 3500: 88 23 and r24, r24 - 3502: 09 f4 brne .+2 ; 0x3506 - 3504: b8 cf rjmp .-144 ; 0x3476 - if ( (PageAddress >= PAGE_READ_MIN) - 3506: ff e0 ldi r31, 0x0F ; 15 - 3508: ff 15 cp r31, r15 - 350a: 08 f4 brcc .+2 ; 0x350e - 350c: 72 cf rjmp .-284 ; 0x33f2 - && (PageAddress <= PAGE_READ_MAX) ) { - /* TODO: Missing address wrap around behaviour. - * Implement using a for-loop copying 4 bytes each iteration - * and mask pageaddress */ - MemoryReadBlock(Buffer, PageAddress * BYTES_PER_PAGE, BYTES_PER_READ); - 350e: 6f 2d mov r22, r15 - 3510: 70 e0 ldi r23, 0x00 ; 0 - 3512: 66 0f add r22, r22 - 3514: 77 1f adc r23, r23 - 3516: 66 0f add r22, r22 - 3518: 77 1f adc r23, r23 - 351a: 40 e1 ldi r20, 0x10 ; 16 - 351c: 50 e0 ldi r21, 0x00 ; 0 - 351e: c8 01 movw r24, r16 - 3520: 0e 94 de 06 call 0xdbc ; 0xdbc - ISO14443AAppendCRCA(Buffer, BYTES_PER_READ); - 3524: 60 e1 ldi r22, 0x10 ; 16 - 3526: 70 e0 ldi r23, 0x00 ; 0 - 3528: c8 01 movw r24, r16 - 352a: ec d6 rcall .+3544 ; 0x4304 - return (BYTES_PER_READ + ISO14443A_CRCA_SIZE) * 8; - 352c: 20 e9 ldi r18, 0x90 ; 144 - 352e: 30 e0 ldi r19, 0x00 ; 0 - 3530: 11 cf rjmp .-478 ; 0x3354 - - switch (NVB) { - case ISO14443A_NVB_AC_START: - /* Start of anticollision procedure. - * Send whole UID CLn + BCC */ - DataPtr[0] = UidCL[0]; - 3532: 89 81 ldd r24, Y+1 ; 0x01 - 3534: f8 01 movw r30, r16 - 3536: 80 83 st Z, r24 - DataPtr[1] = UidCL[1]; - 3538: 3a 81 ldd r19, Y+2 ; 0x02 - 353a: 31 83 std Z+1, r19 ; 0x01 - DataPtr[2] = UidCL[2]; - 353c: 2b 81 ldd r18, Y+3 ; 0x03 - 353e: 22 83 std Z+2, r18 ; 0x02 - DataPtr[3] = UidCL[3]; - 3540: 9c 81 ldd r25, Y+4 ; 0x04 - 3542: 93 83 std Z+3, r25 ; 0x03 - DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 3544: 83 27 eor r24, r19 - 3546: 82 27 eor r24, r18 - 3548: 89 27 eor r24, r25 - 354a: 84 83 std Z+4, r24 ; 0x04 - - *BitCount = ISO14443A_CL_FRAME_SIZE; - 354c: 28 e2 ldi r18, 0x28 ; 40 - 354e: 30 e0 ldi r19, 0x00 ; 0 - 3550: 01 cf rjmp .-510 ; 0x3354 - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_WRITE) { - /* This is a write command containing 4 bytes of data that - * should be written to the given page address. */ - uint8_t PageAddress = Buffer[1]; - 3552: f8 01 movw r30, r16 - 3554: f1 80 ldd r15, Z+1 ; 0x01 - if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { - 3556: 66 e0 ldi r22, 0x06 ; 6 - 3558: 70 e0 ldi r23, 0x00 ; 0 - 355a: c8 01 movw r24, r16 - 355c: 02 d7 rcall .+3588 ; 0x4362 - 355e: 88 23 and r24, r24 - 3560: 09 f4 brne .+2 ; 0x3564 - 3562: 89 cf rjmp .-238 ; 0x3476 - /* CRC check passed */ - if ( (PageAddress >= PAGE_WRITE_MIN) - && (PageAddress <= PAGE_WRITE_MAX) ) { - 3564: 8f 2d mov r24, r15 - 3566: 82 50 subi r24, 0x02 ; 2 - /* This is a write command containing 4 bytes of data that - * should be written to the given page address. */ - uint8_t PageAddress = Buffer[1]; - if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { - /* CRC check passed */ - if ( (PageAddress >= PAGE_WRITE_MIN) - 3568: 8e 30 cpi r24, 0x0E ; 14 - 356a: 08 f0 brcs .+2 ; 0x356e - 356c: 42 cf rjmp .-380 ; 0x33f2 - && (PageAddress <= PAGE_WRITE_MAX) ) { - /* PageAddress is within bounds. */ - - if (!ActiveConfiguration.ReadOnly) { - 356e: 80 91 06 29 lds r24, 0x2906 - 3572: 81 11 cpse r24, r1 - 3574: 1a cf rjmp .-460 ; 0x33aa - MemoryWriteBlock(&Buffer[2], PageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); - 3576: f4 e0 ldi r31, 0x04 ; 4 - 3578: ff 9e mul r15, r31 - 357a: b0 01 movw r22, r0 - 357c: 11 24 eor r1, r1 - 357e: 44 e0 ldi r20, 0x04 ; 4 - 3580: 50 e0 ldi r21, 0x00 ; 0 - 3582: c8 01 movw r24, r16 - 3584: 02 96 adiw r24, 0x02 ; 2 - 3586: 0e 94 f6 06 call 0xdec ; 0xdec - 358a: 0f cf rjmp .-482 ; 0x33aa - } - } else if (Cmd == CMD_COMPAT_WRITE) { - /* The Mifare compatbility write command is a 2-frame command. - * The first frame contains the page-address and the second frame - * holds the data. */ - uint8_t PageAddress = Buffer[1]; - 358c: f8 01 movw r30, r16 - 358e: f1 80 ldd r15, Z+1 ; 0x01 - - if (ISO14443ACheckCRCA(Buffer, CMD_COMPAT_WRITE_FRAME_SIZE)) { - 3590: 62 e0 ldi r22, 0x02 ; 2 - 3592: 70 e0 ldi r23, 0x00 ; 0 - 3594: c8 01 movw r24, r16 - 3596: e5 d6 rcall .+3530 ; 0x4362 - 3598: 88 23 and r24, r24 - 359a: 09 f4 brne .+2 ; 0x359e - 359c: 6c cf rjmp .-296 ; 0x3476 - if ( (PageAddress >= PAGE_WRITE_MIN) - && (PageAddress <= PAGE_WRITE_MAX) ) { - 359e: 8f 2d mov r24, r15 - 35a0: 82 50 subi r24, 0x02 ; 2 - * The first frame contains the page-address and the second frame - * holds the data. */ - uint8_t PageAddress = Buffer[1]; - - if (ISO14443ACheckCRCA(Buffer, CMD_COMPAT_WRITE_FRAME_SIZE)) { - if ( (PageAddress >= PAGE_WRITE_MIN) - 35a2: 8e 30 cpi r24, 0x0E ; 14 - 35a4: 08 f0 brcs .+2 ; 0x35a8 - 35a6: 25 cf rjmp .-438 ; 0x33f2 - && (PageAddress <= PAGE_WRITE_MAX) ) { - /* CRC check passed and page-address is within bounds. - * Store address and proceed to receiving the data. */ - CompatWritePageAddress = PageAddress; - 35a8: f0 92 bd 28 sts 0x28BD, r15 - State = STATE_COMPAT_WRITE; - 35ac: 85 e0 ldi r24, 0x05 ; 5 - 35ae: fb ce rjmp .-522 ; 0x33a6 - } - } else if (Cmd == CMD_HALT) { - /* Halts the tag. According to the ISO14443, the second - * byte is supposed to be 0. */ - if (Buffer[1] == 0) { - if (ISO14443ACheckCRCA(Buffer, 2)) { - 35b0: 62 e0 ldi r22, 0x02 ; 2 - 35b2: 70 e0 ldi r23, 0x00 ; 0 - 35b4: c8 01 movw r24, r16 - 35b6: d5 d6 rcall .+3498 ; 0x4362 - 35b8: 88 23 and r24, r24 - 35ba: 09 f4 brne .+2 ; 0x35be - 35bc: 5c cf rjmp .-328 ; 0x3476 - /* According to ISO14443, we must not send anything - * in order to acknowledge the HALT command. */ - State = STATE_HALT; - 35be: 10 92 bc 28 sts 0x28BC, r1 - return ISO14443A_APP_NO_RESPONSE; - 35c2: 20 e0 ldi r18, 0x00 ; 0 - 35c4: 30 e0 ldi r19, 0x00 ; 0 - 35c6: c6 ce rjmp .-628 ; 0x3354 - -000035c8 : - /* No response has been sent, when we reach here */ - return ISO14443A_APP_NO_RESPONSE; -} - -void MifareUltralightGetUid(ConfigurationUidType Uid) -{ - 35c8: cf 93 push r28 - 35ca: df 93 push r29 - 35cc: ec 01 movw r28, r24 - /* Read UID from memory */ - MemoryReadBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); - 35ce: 43 e0 ldi r20, 0x03 ; 3 - 35d0: 50 e0 ldi r21, 0x00 ; 0 - 35d2: 60 e0 ldi r22, 0x00 ; 0 - 35d4: 70 e0 ldi r23, 0x00 ; 0 - 35d6: 0e 94 de 06 call 0xdbc ; 0xdbc - MemoryReadBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); - 35da: 44 e0 ldi r20, 0x04 ; 4 - 35dc: 50 e0 ldi r21, 0x00 ; 0 - 35de: 64 e0 ldi r22, 0x04 ; 4 - 35e0: 70 e0 ldi r23, 0x00 ; 0 - 35e2: ce 01 movw r24, r28 - 35e4: 03 96 adiw r24, 0x03 ; 3 -} - 35e6: df 91 pop r29 - 35e8: cf 91 pop r28 - -void MifareUltralightGetUid(ConfigurationUidType Uid) -{ - /* Read UID from memory */ - MemoryReadBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); - MemoryReadBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); - 35ea: 0c 94 de 06 jmp 0xdbc ; 0xdbc - -000035ee : -} - -void MifareUltralightSetUid(ConfigurationUidType Uid) -{ - 35ee: 0f 93 push r16 - 35f0: 1f 93 push r17 - 35f2: cf 93 push r28 - 35f4: df 93 push r29 - 35f6: 00 d0 rcall .+0 ; 0x35f8 - 35f8: cd b7 in r28, 0x3d ; 61 - 35fa: de b7 in r29, 0x3e ; 62 - 35fc: 8c 01 movw r16, r24 - /* Calculate check bytes and write everything into memory */ - uint8_t BCC1 = ISO14443A_UID0_CT ^ Uid[0] ^ Uid[1] ^ Uid[2]; - 35fe: fc 01 movw r30, r24 - 3600: 80 81 ld r24, Z - 3602: 91 81 ldd r25, Z+1 ; 0x01 - 3604: 89 27 eor r24, r25 - 3606: 98 e8 ldi r25, 0x88 ; 136 - 3608: 89 27 eor r24, r25 - 360a: 92 81 ldd r25, Z+2 ; 0x02 - 360c: 89 27 eor r24, r25 - 360e: 8a 83 std Y+2, r24 ; 0x02 - uint8_t BCC2 = Uid[3] ^ Uid[4] ^ Uid[5] ^ Uid[6]; - 3610: 84 81 ldd r24, Z+4 ; 0x04 - 3612: 93 81 ldd r25, Z+3 ; 0x03 - 3614: 89 27 eor r24, r25 - 3616: 95 81 ldd r25, Z+5 ; 0x05 - 3618: 89 27 eor r24, r25 - 361a: 96 81 ldd r25, Z+6 ; 0x06 - 361c: 89 27 eor r24, r25 - 361e: 89 83 std Y+1, r24 ; 0x01 - - MemoryWriteBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); - 3620: 43 e0 ldi r20, 0x03 ; 3 - 3622: 50 e0 ldi r21, 0x00 ; 0 - 3624: 60 e0 ldi r22, 0x00 ; 0 - 3626: 70 e0 ldi r23, 0x00 ; 0 - 3628: c8 01 movw r24, r16 - 362a: 0e 94 f6 06 call 0xdec ; 0xdec - MemoryWriteBlock(&BCC1, UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); - 362e: 41 e0 ldi r20, 0x01 ; 1 - 3630: 50 e0 ldi r21, 0x00 ; 0 - 3632: 63 e0 ldi r22, 0x03 ; 3 - 3634: 70 e0 ldi r23, 0x00 ; 0 - 3636: ce 01 movw r24, r28 - 3638: 02 96 adiw r24, 0x02 ; 2 - 363a: 0e 94 f6 06 call 0xdec ; 0xdec - MemoryWriteBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); - 363e: 44 e0 ldi r20, 0x04 ; 4 - 3640: 50 e0 ldi r21, 0x00 ; 0 - 3642: 64 e0 ldi r22, 0x04 ; 4 - 3644: 70 e0 ldi r23, 0x00 ; 0 - 3646: c8 01 movw r24, r16 - 3648: 03 96 adiw r24, 0x03 ; 3 - 364a: 0e 94 f6 06 call 0xdec ; 0xdec - MemoryWriteBlock(&BCC2, UID_BCC2_ADDRESS, ISO14443A_CL_BCC_SIZE); - 364e: 41 e0 ldi r20, 0x01 ; 1 - 3650: 50 e0 ldi r21, 0x00 ; 0 - 3652: 68 e0 ldi r22, 0x08 ; 8 - 3654: 70 e0 ldi r23, 0x00 ; 0 - 3656: ce 01 movw r24, r28 - 3658: 01 96 adiw r24, 0x01 ; 1 - 365a: 0e 94 f6 06 call 0xdec ; 0xdec -} - 365e: 0f 90 pop r0 - 3660: 0f 90 pop r0 - 3662: df 91 pop r29 - 3664: cf 91 pop r28 - 3666: 1f 91 pop r17 - 3668: 0f 91 pop r16 - 366a: 08 95 ret - -0000366c : - Block[11] = Block[3]; -} - -void MifareClassicAppInit1K(void) -{ - State = STATE_IDLE; - 366c: 81 e0 ldi r24, 0x01 ; 1 - 366e: 80 93 be 28 sts 0x28BE, r24 - CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; - 3672: 84 e0 ldi r24, 0x04 ; 4 - 3674: 90 e0 ldi r25, 0x00 ; 0 - 3676: 80 93 bf 28 sts 0x28BF, r24 - 367a: 90 93 c0 28 sts 0x28C0, r25 - CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; - 367e: 88 e0 ldi r24, 0x08 ; 8 - 3680: 80 93 c1 28 sts 0x28C1, r24 - _7BUID = 0x00; - 3684: 10 92 c2 28 sts 0x28C2, r1 - 3688: 08 95 ret - -0000368a : -} - -void MifarePlus1kAppInit_7B(void) -{ - State = STATE_IDLE; - 368a: 81 e0 ldi r24, 0x01 ; 1 - 368c: 80 93 be 28 sts 0x28BE, r24 - CardATQAValue = MFPlus_ATQA_VALUE; - 3690: 84 e4 ldi r24, 0x44 ; 68 - 3692: 90 e0 ldi r25, 0x00 ; 0 - 3694: 80 93 bf 28 sts 0x28BF, r24 - 3698: 90 93 c0 28 sts 0x28C0, r25 - CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; - 369c: 88 e0 ldi r24, 0x08 ; 8 - 369e: 80 93 c1 28 sts 0x28C1, r24 - uint8_t UidSize = ActiveConfiguration.UidSize; - _7BUID = (UidSize == 7); - 36a2: 81 e0 ldi r24, 0x01 ; 1 - 36a4: 90 91 05 29 lds r25, 0x2905 - 36a8: 97 30 cpi r25, 0x07 ; 7 - 36aa: 09 f0 breq .+2 ; 0x36ae - 36ac: 80 e0 ldi r24, 0x00 ; 0 - 36ae: 80 93 c2 28 sts 0x28C2, r24 - 36b2: 08 95 ret - -000036b4 : -} - -void MifareClassicAppInit4K(void) -{ - State = STATE_IDLE; - 36b4: 81 e0 ldi r24, 0x01 ; 1 - 36b6: 80 93 be 28 sts 0x28BE, r24 - CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; - 36ba: 82 e0 ldi r24, 0x02 ; 2 - 36bc: 90 e0 ldi r25, 0x00 ; 0 - 36be: 80 93 bf 28 sts 0x28BF, r24 - 36c2: 90 93 c0 28 sts 0x28C0, r25 - CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; - 36c6: 88 e1 ldi r24, 0x18 ; 24 - 36c8: 80 93 c1 28 sts 0x28C1, r24 - _7BUID = 0x00; - 36cc: 10 92 c2 28 sts 0x28C2, r1 - 36d0: 08 95 ret - -000036d2 : -} - -void MifareClassicAppReset(void) -{ - State = STATE_IDLE; - 36d2: 81 e0 ldi r24, 0x01 ; 1 - 36d4: 80 93 be 28 sts 0x28BE, r24 - 36d8: 08 95 ret - -000036da : -} - -void MifareClassicAppTask(void) -{ - 36da: 08 95 ret - -000036dc : - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - 36dc: 6f 92 push r6 - 36de: 7f 92 push r7 - 36e0: 8f 92 push r8 - 36e2: 9f 92 push r9 - 36e4: af 92 push r10 - 36e6: bf 92 push r11 - 36e8: cf 92 push r12 - 36ea: df 92 push r13 - 36ec: ef 92 push r14 - 36ee: ff 92 push r15 - 36f0: 0f 93 push r16 - 36f2: 1f 93 push r17 - 36f4: cf 93 push r28 - 36f6: df 93 push r29 - 36f8: cd b7 in r28, 0x3d ; 61 - 36fa: de b7 in r29, 0x3e ; 62 - 36fc: 2e 97 sbiw r28, 0x0e ; 14 - 36fe: cd bf out 0x3d, r28 ; 61 - 3700: de bf out 0x3e, r29 ; 62 - 3702: 8c 01 movw r16, r24 - switch(State) { - 3704: 80 91 be 28 lds r24, 0x28BE - 3708: 85 30 cpi r24, 0x05 ; 5 - 370a: 09 f4 brne .+2 ; 0x370e - 370c: d1 c0 rjmp .+418 ; 0x38b0 - 370e: f8 f0 brcs .+62 ; 0x374e - 3710: 88 30 cpi r24, 0x08 ; 8 - 3712: 09 f4 brne .+2 ; 0x3716 - 3714: 1b c1 rjmp .+566 ; 0x394c - 3716: b8 f5 brcc .+110 ; 0x3786 - 3718: 86 30 cpi r24, 0x06 ; 6 - 371a: 09 f4 brne .+2 ; 0x371e - 371c: f5 c1 rjmp .+1002 ; 0x3b08 - 371e: 87 30 cpi r24, 0x07 ; 7 - 3720: 09 f4 brne .+2 ; 0x3724 - 3722: c9 c1 rjmp .+914 ; 0x3ab6 + 3442: 96 32 cpi r25, 0x26 ; 38 + 3444: d1 f0 breq .+52 ; 0x347a + 3446: 92 35 cpi r25, 0x52 ; 82 + 3448: c1 f0 breq .+48 ; 0x347a *BitCount = ISO14443A_SAK_FRAME_SIZE; return true; } else { /* We have not been selected. Don't send anything. */ *BitCount = 0; - 3724: 20 e0 ldi r18, 0x00 ; 0 - 3726: 30 e0 ldi r19, 0x00 ; 0 + 344a: 80 e0 ldi r24, 0x00 ; 0 + 344c: 90 e0 ldi r25, 0x00 ; 0 break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; } - 3728: c9 01 movw r24, r18 - 372a: 2e 96 adiw r28, 0x0e ; 14 - 372c: cd bf out 0x3d, r28 ; 61 - 372e: de bf out 0x3e, r29 ; 62 - 3730: df 91 pop r29 - 3732: cf 91 pop r28 - 3734: 1f 91 pop r17 - 3736: 0f 91 pop r16 - 3738: ff 90 pop r15 - 373a: ef 90 pop r14 - 373c: df 90 pop r13 - 373e: cf 90 pop r12 - 3740: bf 90 pop r11 - 3742: af 90 pop r10 - 3744: 9f 90 pop r9 - 3746: 8f 90 pop r8 - 3748: 7f 90 pop r7 - 374a: 6f 90 pop r6 - 374c: 08 95 ret - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 374e: 82 30 cpi r24, 0x02 ; 2 - 3750: 09 f4 brne .+2 ; 0x3754 - 3752: e1 c0 rjmp .+450 ; 0x3916 - 3754: 08 f0 brcs .+2 ; 0x3758 - 3756: 5a c0 rjmp .+180 ; 0x380c - case STATE_IDLE: - case STATE_HALT: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 3758: 20 91 bf 28 lds r18, 0x28BF - 375c: 90 91 c0 28 lds r25, 0x28C0 + 344e: 24 96 adiw r28, 0x04 ; 4 + 3450: cd bf out 0x3d, r28 ; 61 + 3452: de bf out 0x3e, r29 ; 62 + 3454: df 91 pop r29 + 3456: cf 91 pop r28 + 3458: 1f 91 pop r17 + 345a: 0f 91 pop r16 + 345c: ff 90 pop r15 + 345e: 08 95 ret INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) { uint8_t* DataPtr = (uint8_t*) Buffer; if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 3760: d8 01 movw r26, r16 - 3762: 8c 91 ld r24, X - 3764: 86 32 cpi r24, 0x26 ; 38 - 3766: 09 f4 brne .+2 ; 0x376a - 3768: ae c0 rjmp .+348 ; 0x38c6 - 376a: 82 35 cpi r24, 0x52 ; 82 - 376c: 09 f4 brne .+2 ; 0x3770 - 376e: ab c0 rjmp .+342 ; 0x38c6 - State = STATE_READY1; - return BitCount; - } -#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE - else if (Buffer[0] == CMD_CHINESE_UNLOCK) { - 3770: 80 34 cpi r24, 0x40 ; 64 - 3772: c1 f6 brne .-80 ; 0x3724 - State = STATE_CHINESE_IDLE; - 3774: 82 e0 ldi r24, 0x02 ; 2 - 3776: 80 93 be 28 sts 0x28BE, r24 - Buffer[0] = ACK_VALUE; - 377a: 8a e0 ldi r24, 0x0A ; 10 - 377c: d8 01 movw r26, r16 - 377e: 8c 93 st X, r24 - return ACK_NAK_FRAME_SIZE; - 3780: 24 e0 ldi r18, 0x04 ; 4 - 3782: 30 e0 ldi r19, 0x00 ; 0 - 3784: d1 cf rjmp .-94 ; 0x3728 - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 3786: 89 30 cpi r24, 0x09 ; 9 - 3788: 09 f4 brne .+2 ; 0x378c - 378a: a6 c0 rjmp .+332 ; 0x38d8 - 378c: 8d 30 cpi r24, 0x0D ; 13 - 378e: 50 f6 brcc .-108 ; 0x3724 - * decrypt the data and check CRC. Read data from the requested block - * address into the global block buffer and check for integrity. Then - * add or subtract according to issued command if necessary and store - * the block back into the global block buffer. */ - for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) - Buffer[i] ^= Crypto1Byte(); - 3790: d8 01 movw r26, r16 - 3792: fc 90 ld r15, X - 3794: 0e 94 33 24 call 0x4866 ; 0x4866 - 3798: 8f 25 eor r24, r15 - 379a: f8 01 movw r30, r16 - 379c: 80 83 st Z, r24 - 379e: f1 80 ldd r15, Z+1 ; 0x01 - 37a0: 0e 94 33 24 call 0x4866 ; 0x4866 - 37a4: 8f 25 eor r24, r15 - 37a6: d8 01 movw r26, r16 - 37a8: 11 96 adiw r26, 0x01 ; 1 - 37aa: 8c 93 st X, r24 - 37ac: 11 97 sbiw r26, 0x01 ; 1 - 37ae: 12 96 adiw r26, 0x02 ; 2 - 37b0: fc 90 ld r15, X - 37b2: 0e 94 33 24 call 0x4866 ; 0x4866 - 37b6: 8f 25 eor r24, r15 - 37b8: f8 01 movw r30, r16 - 37ba: 82 83 std Z+2, r24 ; 0x02 - 37bc: f3 80 ldd r15, Z+3 ; 0x03 - 37be: 0e 94 33 24 call 0x4866 ; 0x4866 - 37c2: 8f 25 eor r24, r15 - 37c4: d8 01 movw r26, r16 - 37c6: 13 96 adiw r26, 0x03 ; 3 - 37c8: 8c 93 st X, r24 - 37ca: 13 97 sbiw r26, 0x03 ; 3 - 37cc: 14 96 adiw r26, 0x04 ; 4 - 37ce: fc 90 ld r15, X - 37d0: 0e 94 33 24 call 0x4866 ; 0x4866 - 37d4: 8f 25 eor r24, r15 - 37d6: f8 01 movw r30, r16 - 37d8: 84 83 std Z+4, r24 ; 0x04 - 37da: f5 80 ldd r15, Z+5 ; 0x05 - 37dc: 0e 94 33 24 call 0x4866 ; 0x4866 - 37e0: 8f 25 eor r24, r15 - 37e2: d8 01 movw r26, r16 - 37e4: 15 96 adiw r26, 0x05 ; 5 - 37e6: 8c 93 st X, r24 - - if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { - 37e8: 64 e0 ldi r22, 0x04 ; 4 - 37ea: 70 e0 ldi r23, 0x00 ; 0 - 37ec: c8 01 movw r24, r16 - 37ee: b9 d5 rcall .+2930 ; 0x4362 - 37f0: 81 11 cpse r24, r1 - 37f2: 99 c2 rjmp .+1330 ; 0x3d26 - /* Not sure if this is the correct error code.. */ - Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); - } - } else { - /* CRC Error. */ - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 37f4: 0e 94 74 24 call 0x48e8 ; 0x48e8 - 37f8: 91 e0 ldi r25, 0x01 ; 1 - 37fa: 98 27 eor r25, r24 - 37fc: f8 01 movw r30, r16 - 37fe: 90 83 st Z, r25 - } - - State = STATE_AUTHED_IDLE; - 3800: 88 e0 ldi r24, 0x08 ; 8 - 3802: 80 93 be 28 sts 0x28BE, r24 - return ACK_NAK_FRAME_SIZE; - 3806: 24 e0 ldi r18, 0x04 ; 4 - 3808: 30 e0 ldi r19, 0x00 ; 0 - 380a: 8e cf rjmp .-228 ; 0x3728 - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 380c: 83 30 cpi r24, 0x03 ; 3 - 380e: 09 f4 brne .+2 ; 0x3812 - 3810: 42 c1 rjmp .+644 ; 0x3a96 - 3812: 84 30 cpi r24, 0x04 ; 4 - 3814: 09 f0 breq .+2 ; 0x3818 - 3816: 86 cf rjmp .-244 ; 0x3724 - - return ACK_NAK_FRAME_SIZE; -#endif - - case STATE_READY1: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 3818: 20 91 bf 28 lds r18, 0x28BF - 381c: 90 91 c0 28 lds r25, 0x28C0 - 3820: d8 01 movw r26, r16 - 3822: 8c 91 ld r24, X - 3824: 86 32 cpi r24, 0x26 ; 38 - 3826: 09 f4 brne .+2 ; 0x382a - 3828: 4e c0 rjmp .+156 ; 0x38c6 - 382a: 82 35 cpi r24, 0x52 ; 82 - 382c: 09 f4 brne .+2 ; 0x3830 - 382e: 4b c0 rjmp .+150 ; 0x38c6 - State = STATE_READY1; - return BitCount; - } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { - 3830: 83 39 cpi r24, 0x93 ; 147 - 3832: 09 f0 breq .+2 ; 0x3836 - 3834: 95 c1 rjmp .+810 ; 0x3b60 - /* Load UID CL1 and perform anticollision */ - uint8_t UidCL1[ISO14443A_CL_UID_SIZE]; - - if (_7BUID) { - 3836: 80 91 c2 28 lds r24, 0x28C2 - 383a: 88 23 and r24, r24 - 383c: 09 f4 brne .+2 ; 0x3840 - 383e: 34 c3 rjmp .+1640 ; 0x3ea8 - MemoryReadBlock(&UidCL1[1], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); - 3840: 43 e0 ldi r20, 0x03 ; 3 - 3842: 50 e0 ldi r21, 0x00 ; 0 - 3844: 60 e0 ldi r22, 0x00 ; 0 - 3846: 70 e0 ldi r23, 0x00 ; 0 - 3848: ce 01 movw r24, r28 - 384a: 02 96 adiw r24, 0x02 ; 2 - 384c: 0e 94 de 06 call 0xdbc ; 0xdbc - UidCL1[0] = ISO14443A_UID0_CT; - 3850: 88 e8 ldi r24, 0x88 ; 136 - 3852: 89 83 std Y+1, r24 ; 0x01 - uint8_t* DataPtr = (uint8_t*) Buffer; - uint8_t NVB = DataPtr[1]; - //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; - //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; - - switch (NVB) { - 3854: d8 01 movw r26, r16 - 3856: 11 96 adiw r26, 0x01 ; 1 - 3858: 9c 91 ld r25, X - 385a: 90 32 cpi r25, 0x20 ; 32 - 385c: 09 f4 brne .+2 ; 0x3860 - 385e: c2 c4 rjmp .+2436 ; 0x41e4 - 3860: 90 37 cpi r25, 0x70 ; 112 - 3862: 09 f0 breq .+2 ; 0x3866 - 3864: 5f cf rjmp .-322 ; 0x3724 - return false; - - case ISO14443A_NVB_AC_END: - /* End of anticollision procedure. - * Send SAK CLn if we are selected. */ - if ( (DataPtr[2] == UidCL[0]) && - 3866: d8 01 movw r26, r16 - 3868: 12 96 adiw r26, 0x02 ; 2 - 386a: 8c 91 ld r24, X - 386c: 12 97 sbiw r26, 0x02 ; 2 - 386e: 88 38 cpi r24, 0x88 ; 136 - 3870: 09 f0 breq .+2 ; 0x3874 - 3872: 58 cf rjmp .-336 ; 0x3724 - 3874: 13 96 adiw r26, 0x03 ; 3 - 3876: 9c 91 ld r25, X - 3878: 13 97 sbiw r26, 0x03 ; 3 - 387a: 8a 81 ldd r24, Y+2 ; 0x02 - 387c: 98 13 cpse r25, r24 - 387e: 52 cf rjmp .-348 ; 0x3724 - (DataPtr[3] == UidCL[1]) && - 3880: 14 96 adiw r26, 0x04 ; 4 - 3882: 9c 91 ld r25, X - 3884: 14 97 sbiw r26, 0x04 ; 4 - 3886: 8b 81 ldd r24, Y+3 ; 0x03 - 3888: 98 13 cpse r25, r24 - 388a: 4c cf rjmp .-360 ; 0x3724 - (DataPtr[4] == UidCL[2]) && - 388c: 15 96 adiw r26, 0x05 ; 5 - 388e: 9c 91 ld r25, X - 3890: 15 97 sbiw r26, 0x05 ; 5 - 3892: 8c 81 ldd r24, Y+4 ; 0x04 - 3894: 98 13 cpse r25, r24 - 3896: 46 cf rjmp .-372 ; 0x3724 - (DataPtr[5] == UidCL[3]) ) { - - DataPtr[0] = SAKValue; - 3898: 84 e0 ldi r24, 0x04 ; 4 - 389a: 8c 93 st X, r24 - ISO14443AAppendCRCA(Buffer, 1); - 389c: 61 e0 ldi r22, 0x01 ; 1 - 389e: 70 e0 ldi r23, 0x00 ; 0 - 38a0: c8 01 movw r24, r16 - 38a2: 30 d5 rcall .+2656 ; 0x4304 - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_CL1_VALUE)) - State = STATE_READY2; - 38a4: 85 e0 ldi r24, 0x05 ; 5 - 38a6: 80 93 be 28 sts 0x28BE, r24 - - *BitCount = ISO14443A_SAK_FRAME_SIZE; - 38aa: 28 e1 ldi r18, 0x18 ; 24 - 38ac: 30 e0 ldi r19, 0x00 ; 0 - 38ae: 3c cf rjmp .-392 ; 0x3728 - State = STATE_HALT; - } - break; + 3460: 96 32 cpi r25, 0x26 ; 38 + 3462: 59 f0 breq .+22 ; 0x347a + 3464: 92 35 cpi r25, 0x52 ; 82 + 3466: 49 f0 breq .+18 ; 0x347a case STATE_READY2: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 38b0: 20 91 bf 28 lds r18, 0x28BF - 38b4: 90 91 c0 28 lds r25, 0x28C0 -INLINE -bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) -{ - uint8_t* DataPtr = (uint8_t*) Buffer; - - if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 38b8: d8 01 movw r26, r16 - 38ba: 8c 91 ld r24, X - 38bc: 86 32 cpi r24, 0x26 ; 38 - 38be: 19 f0 breq .+6 ; 0x38c6 - 38c0: 82 35 cpi r24, 0x52 ; 82 - 38c2: 09 f0 breq .+2 ; 0x38c6 - 38c4: 4a c1 rjmp .+660 ; 0x3b5a - DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 38c6: f8 01 movw r30, r16 - 38c8: 20 83 st Z, r18 - DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 38ca: 91 83 std Z+1, r25 ; 0x01 - State = STATE_READY1; - 38cc: 84 e0 ldi r24, 0x04 ; 4 - 38ce: 80 93 be 28 sts 0x28BE, r24 - - *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 38d2: 20 e1 ldi r18, 0x10 ; 16 - 38d4: 30 e0 ldi r19, 0x00 ; 0 - return BitCount; - 38d6: 28 cf rjmp .-432 ; 0x3728 - 38d8: 78 01 movw r14, r16 - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 38da: d1 2c mov r13, r1 - * check for CRC. Then write the data when ReadOnly mode is not - * activated. */ - - /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ - for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) - Buffer[i] ^= Crypto1Byte(); - 38dc: d7 01 movw r26, r14 - 38de: cc 90 ld r12, X - 38e0: c2 d7 rcall .+3972 ; 0x4866 - 38e2: 8c 25 eor r24, r12 - 38e4: f7 01 movw r30, r14 - 38e6: 81 93 st Z+, r24 - 38e8: 7f 01 movw r14, r30 - * sending the data to be written. Decrypt the data first and - * check for CRC. Then write the data when ReadOnly mode is not - * activated. */ - - /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ - for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) - 38ea: d3 94 inc r13 - 38ec: f2 e1 ldi r31, 0x12 ; 18 - 38ee: df 12 cpse r13, r31 - 38f0: f5 cf rjmp .-22 ; 0x38dc - Buffer[i] ^= Crypto1Byte(); - - if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - 38f2: 60 e1 ldi r22, 0x10 ; 16 - 38f4: 70 e0 ldi r23, 0x00 ; 0 - 38f6: c8 01 movw r24, r16 - 38f8: 34 d5 rcall .+2664 ; 0x4362 - 38fa: 88 23 and r24, r24 - 38fc: 09 f4 brne .+2 ; 0x3900 - 38fe: 7a cf rjmp .-268 ; 0x37f4 - if (!ActiveConfiguration.ReadOnly) { - 3900: 80 91 06 29 lds r24, 0x2906 - 3904: 88 23 and r24, r24 - 3906: 09 f4 brne .+2 ; 0x390a - 3908: 3e c1 rjmp .+636 ; 0x3b86 - MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - } else { - /* Silently ignore in ReadOnly mode */ - } - - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 390a: ee d7 rcall .+4060 ; 0x48e8 - 390c: 9a e0 ldi r25, 0x0A ; 10 - 390e: 98 27 eor r25, r24 - 3910: d8 01 movw r26, r16 - 3912: 9c 93 st X, r25 - 3914: 75 cf rjmp .-278 ; 0x3800 - break; - -#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE - case STATE_CHINESE_IDLE: - /* Support special china commands that dont require authentication. */ - if (Buffer[0] == CMD_CHINESE_UNLOCK_RW) { - 3916: f8 01 movw r30, r16 - 3918: 80 81 ld r24, Z - 391a: 83 34 cpi r24, 0x43 ; 67 - 391c: 09 f4 brne .+2 ; 0x3920 - 391e: 6d c1 rjmp .+730 ; 0x3bfa - /* Unlock read and write commands */ - Buffer[0] = ACK_VALUE; - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_CHINESE_WIPE) { - 3920: 81 34 cpi r24, 0x41 ; 65 - 3922: 09 f4 brne .+2 ; 0x3926 - 3924: 2b c1 rjmp .+598 ; 0x3b7c - /* Wipe memory */ - Buffer[0] = ACK_VALUE; - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_READ) { - 3926: 80 33 cpi r24, 0x30 ; 48 - 3928: 09 f4 brne .+2 ; 0x392c - 392a: 34 c4 rjmp .+2152 ; 0x4194 - * BITS_PER_BYTE; - } else { - Buffer[0] = NAK_CRC_ERROR; - return ACK_NAK_FRAME_SIZE; - } - } else if (Buffer[0] == CMD_WRITE) { - 392c: 80 3a cpi r24, 0xA0 ; 160 - 392e: 09 f4 brne .+2 ; 0x3932 - 3930: 56 c1 rjmp .+684 ; 0x3bde - return ACK_NAK_FRAME_SIZE; - } else { - Buffer[0] = NAK_CRC_ERROR; - return ACK_NAK_FRAME_SIZE; - } - } else if (Buffer[0] == CMD_HALT) { - 3932: 80 35 cpi r24, 0x50 ; 80 - 3934: 09 f0 breq .+2 ; 0x3938 - 3936: f6 ce rjmp .-532 ; 0x3724 + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { State = STATE_READY1; return BitCount; - } else if (Buffer[0] == CMD_HALT) { - /* Halts the tag. According to the ISO14443, the second - * byte is supposed to be 0. */ - if (Buffer[1] == 0) { - 3938: f8 01 movw r30, r16 - 393a: 81 81 ldd r24, Z+1 ; 0x01 - 393c: 88 23 and r24, r24 - 393e: 09 f4 brne .+2 ; 0x3942 - 3940: 1d c4 rjmp .+2106 ; 0x417c - } else { - Buffer[0] = NAK_CRC_ERROR; - return ACK_NAK_FRAME_SIZE; - } - } else { + } else if (Cmd == ISO14443A_CMD_SELECT_CL2) { + 3468: 95 39 cpi r25, 0x95 ; 149 + 346a: 09 f4 brne .+2 ; 0x346e + 346c: 78 c0 rjmp .+240 ; 0x355e Buffer[0] = NAK_INVALID_ARG; - 3942: f8 01 movw r30, r16 - 3944: 10 82 st Z, r1 - return ACK_NAK_FRAME_SIZE; - 3946: 24 e0 ldi r18, 0x04 ; 4 - 3948: 30 e0 ldi r19, 0x00 ; 0 - 394a: ee ce rjmp .-548 ; 0x3728 - - case STATE_AUTHED_IDLE: - /* In this state, all communication is encrypted. Thus we first have to encrypt - * the incoming data. */ - for (uint8_t i=0; i<4; i++) - Buffer[i] ^= Crypto1Byte(); - 394c: d8 01 movw r26, r16 - 394e: dc 90 ld r13, X - 3950: 8a d7 rcall .+3860 ; 0x4866 - 3952: 8d 25 eor r24, r13 - 3954: f8 01 movw r30, r16 - 3956: 80 83 st Z, r24 - 3958: d1 80 ldd r13, Z+1 ; 0x01 - 395a: 85 d7 rcall .+3850 ; 0x4866 - 395c: 8d 25 eor r24, r13 - 395e: d8 01 movw r26, r16 - 3960: 11 96 adiw r26, 0x01 ; 1 - 3962: 8c 93 st X, r24 - 3964: 11 97 sbiw r26, 0x01 ; 1 - 3966: 12 96 adiw r26, 0x02 ; 2 - 3968: dc 90 ld r13, X - 396a: 7d d7 rcall .+3834 ; 0x4866 - 396c: 8d 25 eor r24, r13 - 396e: f8 01 movw r30, r16 - 3970: 82 83 std Z+2, r24 ; 0x02 - 3972: d3 80 ldd r13, Z+3 ; 0x03 - 3974: 78 d7 rcall .+3824 ; 0x4866 - 3976: 8d 25 eor r24, r13 - 3978: d8 01 movw r26, r16 - 397a: 13 96 adiw r26, 0x03 ; 3 - 397c: 8c 93 st X, r24 - 397e: 13 97 sbiw r26, 0x03 ; 3 - - if (Buffer[0] == CMD_READ) { - 3980: 8c 91 ld r24, X - 3982: 80 33 cpi r24, 0x30 ; 48 - 3984: 09 f4 brne .+2 ; 0x3988 - 3986: fd c1 rjmp .+1018 ; 0x3d82 - * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - return ACK_NAK_FRAME_SIZE; - } - } else if (Buffer[0] == CMD_WRITE) { - 3988: 80 3a cpi r24, 0xA0 ; 160 - 398a: 09 f4 brne .+2 ; 0x398e - 398c: 6f c2 rjmp .+1246 ; 0x3e6c - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_DECREMENT) { - 398e: 80 3c cpi r24, 0xC0 ; 192 - 3990: 09 f4 brne .+2 ; 0x3994 - 3992: af c2 rjmp .+1374 ; 0x3ef2 - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_INCREMENT) { - 3994: 81 3c cpi r24, 0xC1 ; 193 - 3996: 09 f4 brne .+2 ; 0x399a - 3998: 46 c3 rjmp .+1676 ; 0x4026 - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_RESTORE) { - 399a: 82 3c cpi r24, 0xC2 ; 194 - 399c: 09 f4 brne .+2 ; 0x39a0 - 399e: 09 c1 rjmp .+530 ; 0x3bb2 - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - }else if (Buffer[0] == CMD_TRANSFER) { - 39a0: 80 3b cpi r24, 0xB0 ; 176 - 39a2: 09 f4 brne .+2 ; 0x39a6 - 39a4: 57 c3 rjmp .+1710 ; 0x4054 - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - - return ACK_NAK_FRAME_SIZE; - } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { - 39a6: 80 56 subi r24, 0x60 ; 96 - 39a8: 82 30 cpi r24, 0x02 ; 2 - 39aa: 08 f0 brcs .+2 ; 0x39ae - 39ac: a7 c0 rjmp .+334 ; 0x3afc - if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - 39ae: 62 e0 ldi r22, 0x02 ; 2 - 39b0: 70 e0 ldi r23, 0x00 ; 0 - 39b2: c8 01 movw r24, r16 - 39b4: d6 d4 rcall .+2476 ; 0x4362 - 39b6: 88 23 and r24, r24 - 39b8: 09 f4 brne .+2 ; 0x39bc - 39ba: cf c1 rjmp .+926 ; 0x3d5a - /* Nested authentication. */ - uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 39bc: f8 01 movw r30, r16 - 39be: 81 81 ldd r24, Z+1 ; 0x01 - 39c0: 8c 73 andi r24, 0x3C ; 60 - uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 39c2: 90 81 ld r25, Z - 39c4: 90 36 cpi r25, 0x60 ; 96 - 39c6: 09 f4 brne .+2 ; 0x39ca - 39c8: 47 c4 rjmp .+2190 ; 0x4258 - 39ca: 6a e3 ldi r22, 0x3A ; 58 - 39cc: 70 e0 ldi r23, 0x00 ; 0 - uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 39ce: 5b 01 movw r10, r22 - 39d0: f0 e1 ldi r31, 0x10 ; 16 - 39d2: 8f 9f mul r24, r31 - 39d4: a0 0c add r10, r0 - 39d6: b1 1c adc r11, r1 - 39d8: 11 24 eor r1, r1 - uint8_t Key[6]; - uint8_t Uid[4]; - uint8_t CardNonce[4]; - - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - 39da: 6e 01 movw r12, r28 - 39dc: 37 e0 ldi r19, 0x07 ; 7 - 39de: c3 0e add r12, r19 - 39e0: d1 1c adc r13, r1 - 39e2: 64 e0 ldi r22, 0x04 ; 4 - 39e4: c6 01 movw r24, r12 - 39e6: 0e 94 3f 06 call 0xc7e ; 0xc7e - if (_7BUID) - 39ea: 80 91 c2 28 lds r24, 0x28C2 - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 39ee: 7e 01 movw r14, r28 - uint8_t Uid[4]; - uint8_t CardNonce[4]; - - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - if (_7BUID) - 39f0: 88 23 and r24, r24 - 39f2: 09 f4 brne .+2 ; 0x39f6 - 39f4: 15 c4 rjmp .+2090 ; 0x4220 - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 39f6: 8b e0 ldi r24, 0x0B ; 11 - 39f8: e8 0e add r14, r24 - 39fa: f1 1c adc r15, r1 - 39fc: 44 e0 ldi r20, 0x04 ; 4 - 39fe: 50 e0 ldi r21, 0x00 ; 0 - 3a00: 63 e0 ldi r22, 0x03 ; 3 - 3a02: 70 e0 ldi r23, 0x00 ; 0 - 3a04: c7 01 movw r24, r14 - 3a06: 0e 94 de 06 call 0xdbc ; 0xdbc - else - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 3a0a: 46 e0 ldi r20, 0x06 ; 6 - 3a0c: 50 e0 ldi r21, 0x00 ; 0 - 3a0e: b5 01 movw r22, r10 - 3a10: ce 01 movw r24, r28 - 3a12: 01 96 adiw r24, 0x01 ; 1 - 3a14: 0e 94 de 06 call 0xdbc ; 0xdbc - - /* Precalculate the reader response from card-nonce */ - for (uint8_t i=0; i - - /* Precalculate our response from the reader response */ - for (uint8_t i=0; i - - /* Setup crypto1 cipher. */ - Crypto1Setup(Key, Uid, CardNonce); - 3a64: a6 01 movw r20, r12 - 3a66: b7 01 movw r22, r14 - 3a68: ce 01 movw r24, r28 - 3a6a: 01 96 adiw r24, 0x01 ; 1 - 3a6c: 33 d5 rcall .+2662 ; 0x44d4 - - for (uint8_t i=0; i - } - } - break; - - case STATE_CHINESE_WRITE: - if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - 3a96: 60 e1 ldi r22, 0x10 ; 16 - 3a98: 70 e0 ldi r23, 0x00 ; 0 - 3a9a: c8 01 movw r24, r16 - 3a9c: 62 d4 rcall .+2244 ; 0x4362 - 3a9e: 88 23 and r24, r24 - 3aa0: 09 f4 brne .+2 ; 0x3aa4 - 3aa2: 63 c0 rjmp .+198 ; 0x3b6a - /* CRC check passed. Write data into memory and send ACK. */ - if (!ActiveConfiguration.ReadOnly) { - 3aa4: 80 91 06 29 lds r24, 0x2906 - 3aa8: 88 23 and r24, r24 - 3aaa: 09 f4 brne .+2 ; 0x3aae - 3aac: 5e c1 rjmp .+700 ; 0x3d6a - MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - } - - Buffer[0] = ACK_VALUE; - 3aae: 8a e0 ldi r24, 0x0A ; 10 - 3ab0: d8 01 movw r26, r16 - 3ab2: 8c 93 st X, r24 - 3ab4: 5d c0 rjmp .+186 ; 0x3b70 - - case STATE_AUTHING: - /* Reader delivers an encrypted nonce. We use it - * to setup the crypto1 LFSR in nonlinear feedback mode. - * Furthermore it delivers an encrypted answer. Decrypt and check it */ - Crypto1Auth(&Buffer[0]); - 3ab6: c8 01 movw r24, r16 - 3ab8: ad d6 rcall .+3418 ; 0x4814 - - for (uint8_t i=0; i<4; i++) - Buffer[i+4] ^= Crypto1Byte(); - 3aba: f8 01 movw r30, r16 - 3abc: f4 80 ldd r15, Z+4 ; 0x04 - 3abe: d3 d6 rcall .+3494 ; 0x4866 - 3ac0: 8f 25 eor r24, r15 - 3ac2: d8 01 movw r26, r16 - 3ac4: 14 96 adiw r26, 0x04 ; 4 - 3ac6: 8c 93 st X, r24 - 3ac8: 14 97 sbiw r26, 0x04 ; 4 - 3aca: 15 96 adiw r26, 0x05 ; 5 - 3acc: fc 90 ld r15, X - 3ace: cb d6 rcall .+3478 ; 0x4866 - 3ad0: 8f 25 eor r24, r15 - 3ad2: f8 01 movw r30, r16 - 3ad4: 85 83 std Z+5, r24 ; 0x05 - 3ad6: f6 80 ldd r15, Z+6 ; 0x06 - 3ad8: c6 d6 rcall .+3468 ; 0x4866 - 3ada: 8f 25 eor r24, r15 - 3adc: d8 01 movw r26, r16 - 3ade: 16 96 adiw r26, 0x06 ; 6 - 3ae0: 8c 93 st X, r24 - 3ae2: 16 97 sbiw r26, 0x06 ; 6 - 3ae4: 17 96 adiw r26, 0x07 ; 7 - 3ae6: fc 90 ld r15, X - 3ae8: be d6 rcall .+3452 ; 0x4866 - 3aea: 8f 25 eor r24, r15 - 3aec: f8 01 movw r30, r16 - 3aee: 87 83 std Z+7, r24 ; 0x07 - - if ((Buffer[4] == ReaderResponse[0]) && - 3af0: 24 81 ldd r18, Z+4 ; 0x04 - 3af2: 90 91 c4 28 lds r25, 0x28C4 - 3af6: 29 17 cp r18, r25 - 3af8: 09 f4 brne .+2 ; 0x3afc - 3afa: 84 c0 rjmp .+264 ; 0x3c04 - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - return ACK_NAK_FRAME_SIZE; + return NAK_FRAME_SIZE; } } else { - /* Unknown command. Enter HALT state */ + /* Unknown command. Enter halt state */ State = STATE_IDLE; - 3afc: 81 e0 ldi r24, 0x01 ; 1 - 3afe: 80 93 be 28 sts 0x28BE, r24 + 346e: 81 e0 ldi r24, 0x01 ; 1 + 3470: 80 93 bd 28 sts 0x28BD, r24 /* Unknown state? Should never happen. */ break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; - 3b02: 20 e0 ldi r18, 0x00 ; 0 - 3b04: 30 e0 ldi r19, 0x00 ; 0 + 3474: 80 e0 ldi r24, 0x00 ; 0 + 3476: 90 e0 ldi r25, 0x00 ; 0 + } } else { - /* Unknown command. Enter HALT state */ + /* Unknown command. Enter halt state */ State = STATE_IDLE; } - - break; - 3b06: 10 ce rjmp .-992 ; 0x3728 - State = STATE_HALT; - } break; + 3478: ea cf rjmp .-44 ; 0x344e + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + 347a: 84 e4 ldi r24, 0x44 ; 68 + 347c: f8 01 movw r30, r16 + 347e: 80 83 st Z, r24 + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + 3480: 11 82 std Z+1, r1 ; 0x01 + switch(State) { + case STATE_IDLE: + case STATE_HALT: + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { + /* We received a REQA or WUPA command, so wake up. */ + State = STATE_READY1; + 3482: 82 e0 ldi r24, 0x02 ; 2 + 3484: 80 93 bd 28 sts 0x28BD, r24 - case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 3b08: 20 91 bf 28 lds r18, 0x28BF - 3b0c: 90 91 c0 28 lds r25, 0x28C0 + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + 3488: 80 e1 ldi r24, 0x10 ; 16 + 348a: 90 e0 ldi r25, 0x00 ; 0 + return BitCount; + 348c: e0 cf rjmp .-64 ; 0x344e INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) { uint8_t* DataPtr = (uint8_t*) Buffer; if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ - 3b10: f8 01 movw r30, r16 - 3b12: 80 81 ld r24, Z - 3b14: 86 32 cpi r24, 0x26 ; 38 - 3b16: 09 f4 brne .+2 ; 0x3b1a - 3b18: 42 c0 rjmp .+132 ; 0x3b9e - 3b1a: 82 35 cpi r24, 0x52 ; 82 - 3b1c: 09 f4 brne .+2 ; 0x3b20 - 3b1e: 3f c0 rjmp .+126 ; 0x3b9e + 348e: 96 32 cpi r25, 0x26 ; 38 + 3490: a1 f3 breq .-24 ; 0x347a + 3492: 92 35 cpi r25, 0x52 ; 82 + 3494: 91 f3 breq .-28 ; 0x347a + + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { State = STATE_READY1; return BitCount; - } else if (Buffer[0] == CMD_HALT) { - 3b20: 80 35 cpi r24, 0x50 ; 80 - 3b22: 09 f4 brne .+2 ; 0x3b26 - 3b24: 09 cf rjmp .-494 ; 0x3938 + } else if (Cmd == CMD_READ) { + 3496: 90 33 cpi r25, 0x30 ; 48 + 3498: 09 f4 brne .+2 ; 0x349c + 349a: 8d c0 rjmp .+282 ; 0x35b6 + } + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_WRITE) { + 349c: 92 3a cpi r25, 0xA2 ; 162 + 349e: 09 f4 brne .+2 ; 0x34a2 + 34a0: b9 c0 rjmp .+370 ; 0x3614 + } + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_COMPAT_WRITE) { + 34a2: 90 3a cpi r25, 0xA0 ; 160 + 34a4: 09 f4 brne .+2 ; 0x34a8 + 34a6: d3 c0 rjmp .+422 ; 0x364e + } + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_HALT) { + 34a8: 90 35 cpi r25, 0x50 ; 80 + 34aa: 09 f7 brne .-62 ; 0x346e + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + 34ac: f8 01 movw r30, r16 + 34ae: 81 81 ldd r24, Z+1 ; 0x01 + 34b0: 88 23 and r24, r24 + 34b2: 09 f4 brne .+2 ; 0x34b6 + 34b4: de c0 rjmp .+444 ; 0x3672 + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; } } else { Buffer[0] = NAK_INVALID_ARG; - return ACK_NAK_FRAME_SIZE; - } - } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - 3b26: 98 2f mov r25, r24 - 3b28: 90 56 subi r25, 0x60 ; 96 - 3b2a: 92 30 cpi r25, 0x02 ; 2 - 3b2c: 08 f4 brcc .+2 ; 0x3b30 - 3b2e: ab c2 rjmp .+1366 ; 0x4086 - return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - } else { - Buffer[0] = NAK_CRC_ERROR; - return ACK_NAK_FRAME_SIZE; - } - } else if ( (Buffer[0] == CMD_READ) || (Buffer[0] == CMD_WRITE) || (Buffer[0] == CMD_DECREMENT) - 3b30: 80 33 cpi r24, 0x30 ; 48 - 3b32: 51 f0 breq .+20 ; 0x3b48 - 3b34: 80 3a cpi r24, 0xA0 ; 160 - 3b36: 41 f0 breq .+16 ; 0x3b48 - 3b38: 80 3c cpi r24, 0xC0 ; 192 - 3b3a: 31 f0 breq .+12 ; 0x3b48 - || (Buffer[0] == CMD_INCREMENT) || (Buffer[0] == CMD_RESTORE) || (Buffer[0] == CMD_TRANSFER) ) { - 3b3c: 81 3c cpi r24, 0xC1 ; 193 - 3b3e: 21 f0 breq .+8 ; 0x3b48 - 3b40: 82 3c cpi r24, 0xC2 ; 194 - 3b42: 11 f0 breq .+4 ; 0x3b48 - 3b44: 80 3b cpi r24, 0xB0 ; 176 - 3b46: d1 f6 brne .-76 ; 0x3afc - State = STATE_IDLE; - 3b48: 81 e0 ldi r24, 0x01 ; 1 - 3b4a: 80 93 be 28 sts 0x28BE, r24 - Buffer[0] = NAK_NOT_AUTHED; - 3b4e: 84 e0 ldi r24, 0x04 ; 4 - 3b50: d8 01 movw r26, r16 - 3b52: 8c 93 st X, r24 - return ACK_NAK_FRAME_SIZE; - 3b54: 24 e0 ldi r18, 0x04 ; 4 - 3b56: 30 e0 ldi r19, 0x00 ; 0 - 3b58: e7 cd rjmp .-1074 ; 0x3728 + 34b6: f8 01 movw r30, r16 + 34b8: 10 82 st Z, r1 + return NAK_FRAME_SIZE; + 34ba: 84 e0 ldi r24, 0x04 ; 4 + 34bc: 90 e0 ldi r25, 0x00 ; 0 + 34be: c7 cf rjmp .-114 ; 0x344e + 34c0: 96 32 cpi r25, 0x26 ; 38 + 34c2: d9 f2 breq .-74 ; 0x347a + 34c4: 92 35 cpi r25, 0x52 ; 82 + 34c6: c9 f2 breq .-78 ; 0x347a - case STATE_READY2: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - State = STATE_READY1; - return BitCount; - } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL2) { - 3b5a: 85 39 cpi r24, 0x95 ; 149 - 3b5c: 09 f4 brne .+2 ; 0x3b60 - 3b5e: 4f c1 rjmp .+670 ; 0x3dfe + case STATE_READY1: + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { + State = STATE_READY1; + return BitCount; + } else if (Cmd == ISO14443A_CMD_SELECT_CL1) { + 34c8: 93 39 cpi r25, 0x93 ; 147 + 34ca: 89 f6 brne .-94 ; 0x346e + /* Load UID CL1 and perform anticollision. Since + * MF Ultralight use a double-sized UID, the first byte + * of CL1 has to be the cascade-tag byte. */ + uint8_t UidCL1[ISO14443A_CL_UID_SIZE] = { [0] = ISO14443A_UID0_CT }; + 34cc: 19 82 std Y+1, r1 ; 0x01 + 34ce: 1a 82 std Y+2, r1 ; 0x02 + 34d0: 1b 82 std Y+3, r1 ; 0x03 + 34d2: 1c 82 std Y+4, r1 ; 0x04 + 34d4: 88 e8 ldi r24, 0x88 ; 136 + 34d6: 89 83 std Y+1, r24 ; 0x01 + + MemoryReadBlock(&UidCL1[1], UID_CL1_ADDRESS, UID_CL1_SIZE); + 34d8: 43 e0 ldi r20, 0x03 ; 3 + 34da: 50 e0 ldi r21, 0x00 ; 0 + 34dc: 60 e0 ldi r22, 0x00 ; 0 + 34de: 70 e0 ldi r23, 0x00 ; 0 + 34e0: ce 01 movw r24, r28 + 34e2: 02 96 adiw r24, 0x02 ; 2 + 34e4: 0e 94 62 07 call 0xec4 ; 0xec4 + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t NVB = DataPtr[1]; + //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; + //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; + + switch (NVB) { + 34e8: f8 01 movw r30, r16 + 34ea: 81 81 ldd r24, Z+1 ; 0x01 + 34ec: 80 32 cpi r24, 0x20 ; 32 + 34ee: 09 f4 brne .+2 ; 0x34f2 + 34f0: 81 c0 rjmp .+258 ; 0x35f4 + 34f2: 80 37 cpi r24, 0x70 ; 112 + 34f4: 09 f0 breq .+2 ; 0x34f8 + 34f6: a9 cf rjmp .-174 ; 0x344a + return false; + + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + 34f8: f8 01 movw r30, r16 + 34fa: 92 81 ldd r25, Z+2 ; 0x02 + 34fc: 89 81 ldd r24, Y+1 ; 0x01 + 34fe: 98 13 cpse r25, r24 + 3500: a4 cf rjmp .-184 ; 0x344a + 3502: 93 81 ldd r25, Z+3 ; 0x03 + 3504: 8a 81 ldd r24, Y+2 ; 0x02 + 3506: 98 13 cpse r25, r24 + 3508: a0 cf rjmp .-192 ; 0x344a + (DataPtr[3] == UidCL[1]) && + 350a: 94 81 ldd r25, Z+4 ; 0x04 + 350c: 8b 81 ldd r24, Y+3 ; 0x03 + 350e: 98 13 cpse r25, r24 + 3510: 9c cf rjmp .-200 ; 0x344a + (DataPtr[4] == UidCL[2]) && + 3512: 95 81 ldd r25, Z+5 ; 0x05 + 3514: 8c 81 ldd r24, Y+4 ; 0x04 + 3516: 98 13 cpse r25, r24 + 3518: 98 cf rjmp .-208 ; 0x344a + (DataPtr[5] == UidCL[3]) ) { + + DataPtr[0] = SAKValue; + 351a: 84 e0 ldi r24, 0x04 ; 4 + 351c: 80 83 st Z, r24 + ISO14443AAppendCRCA(Buffer, 1); + 351e: 61 e0 ldi r22, 0x01 ; 1 + 3520: 70 e0 ldi r23, 0x00 ; 0 + 3522: c8 01 movw r24, r16 + 3524: 8b d6 rcall .+3350 ; 0x423c + + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_CL1_VALUE)) { + /* CL1 stage has ended successfully */ + State = STATE_READY2; + 3526: 83 e0 ldi r24, 0x03 ; 3 + 3528: 80 93 bd 28 sts 0x28BD, r24 + + *BitCount = ISO14443A_SAK_FRAME_SIZE; + 352c: 88 e1 ldi r24, 0x18 ; 24 + 352e: 90 e0 ldi r25, 0x00 ; 0 + 3530: 8e cf rjmp .-228 ; 0x344e + + State = STATE_ACTIVE; + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } else { + State = STATE_ACTIVE; + 3532: 84 e0 ldi r24, 0x04 ; 4 + 3534: 80 93 bd 28 sts 0x28BD, r24 + Buffer[0] = NAK_CRC_ERROR; + 3538: 81 e0 ldi r24, 0x01 ; 1 + 353a: f8 01 movw r30, r16 + 353c: 80 83 st Z, r24 + return NAK_FRAME_SIZE; + 353e: 84 e0 ldi r24, 0x04 ; 4 + 3540: 90 e0 ldi r25, 0x00 ; 0 + 3542: 85 cf rjmp .-246 ; 0x344e + /* Compatibility write. Receiving 16 bytes of data of which 4 bytes are valid. */ + if (ISO14443ACheckCRCA(Buffer, BYTES_PER_COMPAT_WRITE)) { + /* We don't perform any checks here. You will be able to program the + * whole memory. Also there is no OTP behaviour. */ + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(Buffer, CompatWritePageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); + 3544: 60 91 bc 28 lds r22, 0x28BC + 3548: 70 e0 ldi r23, 0x00 ; 0 + 354a: 66 0f add r22, r22 + 354c: 77 1f adc r23, r23 + 354e: 66 0f add r22, r22 + 3550: 77 1f adc r23, r23 + 3552: 44 e0 ldi r20, 0x04 ; 4 + 3554: 50 e0 ldi r21, 0x00 ; 0 + 3556: c8 01 movw r24, r16 + 3558: 0e 94 7a 07 call 0xef4 ; 0xef4 + 355c: 69 cf rjmp .-302 ; 0x3430 + return BitCount; + } else if (Cmd == ISO14443A_CMD_SELECT_CL2) { + /* Load UID CL2 and perform anticollision */ + uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; + + MemoryReadBlock(UidCL2, UID_CL2_ADDRESS, UID_CL2_SIZE); + 355e: 44 e0 ldi r20, 0x04 ; 4 + 3560: 50 e0 ldi r21, 0x00 ; 0 + 3562: 64 e0 ldi r22, 0x04 ; 4 + 3564: 70 e0 ldi r23, 0x00 ; 0 + 3566: ce 01 movw r24, r28 + 3568: 01 96 adiw r24, 0x01 ; 1 + 356a: 0e 94 62 07 call 0xec4 ; 0xec4 + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t NVB = DataPtr[1]; + //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; + //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; + + switch (NVB) { + 356e: f8 01 movw r30, r16 + 3570: 81 81 ldd r24, Z+1 ; 0x01 + 3572: 80 32 cpi r24, 0x20 ; 32 + 3574: 09 f4 brne .+2 ; 0x3578 + 3576: 3e c0 rjmp .+124 ; 0x35f4 + 3578: 80 37 cpi r24, 0x70 ; 112 + 357a: 09 f0 breq .+2 ; 0x357e + 357c: 66 cf rjmp .-308 ; 0x344a + return false; + + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + 357e: f8 01 movw r30, r16 + 3580: 92 81 ldd r25, Z+2 ; 0x02 + 3582: 89 81 ldd r24, Y+1 ; 0x01 + 3584: 98 13 cpse r25, r24 + 3586: 61 cf rjmp .-318 ; 0x344a + 3588: 93 81 ldd r25, Z+3 ; 0x03 + 358a: 8a 81 ldd r24, Y+2 ; 0x02 + 358c: 98 13 cpse r25, r24 + 358e: 5d cf rjmp .-326 ; 0x344a + (DataPtr[3] == UidCL[1]) && + 3590: 94 81 ldd r25, Z+4 ; 0x04 + 3592: 8b 81 ldd r24, Y+3 ; 0x03 + 3594: 98 13 cpse r25, r24 + 3596: 59 cf rjmp .-334 ; 0x344a + (DataPtr[4] == UidCL[2]) && + 3598: 95 81 ldd r25, Z+5 ; 0x05 + 359a: 8c 81 ldd r24, Y+4 ; 0x04 + 359c: 98 13 cpse r25, r24 + 359e: 55 cf rjmp .-342 ; 0x344a + (DataPtr[5] == UidCL[3]) ) { + + DataPtr[0] = SAKValue; + 35a0: 10 82 st Z, r1 + ISO14443AAppendCRCA(Buffer, 1); + 35a2: 61 e0 ldi r22, 0x01 ; 1 + 35a4: 70 e0 ldi r23, 0x00 ; 0 + 35a6: c8 01 movw r24, r16 + 35a8: 49 d6 rcall .+3218 ; 0x423c + + if (ISO14443ASelect(Buffer, &BitCount, UidCL2, SAK_CL2_VALUE)) { + /* CL2 stage has ended successfully. This means + * our complete UID has been sent to the reader. */ + State = STATE_ACTIVE; + 35aa: 84 e0 ldi r24, 0x04 ; 4 + 35ac: 80 93 bd 28 sts 0x28BD, r24 + + *BitCount = ISO14443A_SAK_FRAME_SIZE; + 35b0: 88 e1 ldi r24, 0x18 ; 24 + 35b2: 90 e0 ldi r25, 0x00 ; 0 + 35b4: 4c cf rjmp .-360 ; 0x344e + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE)) { + State = STATE_READY1; + return BitCount; + } else if (Cmd == CMD_READ) { + uint8_t PageAddress = Buffer[1]; + 35b6: f8 01 movw r30, r16 + 35b8: f1 80 ldd r15, Z+1 ; 0x01 + + if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { + 35ba: 62 e0 ldi r22, 0x02 ; 2 + 35bc: 70 e0 ldi r23, 0x00 ; 0 + 35be: c8 01 movw r24, r16 + 35c0: 6b d6 rcall .+3286 ; 0x4298 + 35c2: 88 23 and r24, r24 + 35c4: 09 f4 brne .+2 ; 0x35c8 + 35c6: b8 cf rjmp .-144 ; 0x3538 + if ( (PageAddress >= PAGE_READ_MIN) + 35c8: ff e0 ldi r31, 0x0F ; 15 + 35ca: ff 15 cp r31, r15 + 35cc: 08 f4 brcc .+2 ; 0x35d0 + 35ce: 73 cf rjmp .-282 ; 0x34b6 + && (PageAddress <= PAGE_READ_MAX) ) { + /* TODO: Missing address wrap around behaviour. + * Implement using a for-loop copying 4 bytes each iteration + * and mask pageaddress */ + MemoryReadBlock(Buffer, PageAddress * BYTES_PER_PAGE, BYTES_PER_READ); + 35d0: 6f 2d mov r22, r15 + 35d2: 70 e0 ldi r23, 0x00 ; 0 + 35d4: 66 0f add r22, r22 + 35d6: 77 1f adc r23, r23 + 35d8: 66 0f add r22, r22 + 35da: 77 1f adc r23, r23 + 35dc: 40 e1 ldi r20, 0x10 ; 16 + 35de: 50 e0 ldi r21, 0x00 ; 0 + 35e0: c8 01 movw r24, r16 + 35e2: 0e 94 62 07 call 0xec4 ; 0xec4 + ISO14443AAppendCRCA(Buffer, BYTES_PER_READ); + 35e6: 60 e1 ldi r22, 0x10 ; 16 + 35e8: 70 e0 ldi r23, 0x00 ; 0 + 35ea: c8 01 movw r24, r16 + 35ec: 27 d6 rcall .+3150 ; 0x423c + return (BYTES_PER_READ + ISO14443A_CRCA_SIZE) * 8; + 35ee: 80 e9 ldi r24, 0x90 ; 144 + 35f0: 90 e0 ldi r25, 0x00 ; 0 + 35f2: 2d cf rjmp .-422 ; 0x344e + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + 35f4: 89 81 ldd r24, Y+1 ; 0x01 + 35f6: f8 01 movw r30, r16 + 35f8: 80 83 st Z, r24 + DataPtr[1] = UidCL[1]; + 35fa: 3a 81 ldd r19, Y+2 ; 0x02 + 35fc: 31 83 std Z+1, r19 ; 0x01 + DataPtr[2] = UidCL[2]; + 35fe: 2b 81 ldd r18, Y+3 ; 0x03 + 3600: 22 83 std Z+2, r18 ; 0x02 + DataPtr[3] = UidCL[3]; + 3602: 9c 81 ldd r25, Y+4 ; 0x04 + 3604: 93 83 std Z+3, r25 ; 0x03 + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + 3606: 83 27 eor r24, r19 + 3608: 82 27 eor r24, r18 + 360a: 89 27 eor r24, r25 + 360c: 84 83 std Z+4, r24 ; 0x04 + + *BitCount = ISO14443A_CL_FRAME_SIZE; + 360e: 88 e2 ldi r24, 0x28 ; 40 + 3610: 90 e0 ldi r25, 0x00 ; 0 + 3612: 1d cf rjmp .-454 ; 0x344e + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_WRITE) { + /* This is a write command containing 4 bytes of data that + * should be written to the given page address. */ + uint8_t PageAddress = Buffer[1]; + 3614: f8 01 movw r30, r16 + 3616: f1 80 ldd r15, Z+1 ; 0x01 + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + 3618: 66 e0 ldi r22, 0x06 ; 6 + 361a: 70 e0 ldi r23, 0x00 ; 0 + 361c: c8 01 movw r24, r16 + 361e: 3c d6 rcall .+3192 ; 0x4298 + 3620: 88 23 and r24, r24 + 3622: 09 f4 brne .+2 ; 0x3626 + 3624: 89 cf rjmp .-238 ; 0x3538 + /* CRC check passed */ + if ( (PageAddress >= PAGE_WRITE_MIN) + && (PageAddress <= PAGE_WRITE_MAX) ) { + 3626: 8e ef ldi r24, 0xFE ; 254 + 3628: 8f 0d add r24, r15 + /* This is a write command containing 4 bytes of data that + * should be written to the given page address. */ + uint8_t PageAddress = Buffer[1]; + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + /* CRC check passed */ + if ( (PageAddress >= PAGE_WRITE_MIN) + 362a: 8e 30 cpi r24, 0x0E ; 14 + 362c: 08 f0 brcs .+2 ; 0x3630 + 362e: 43 cf rjmp .-378 ; 0x34b6 + && (PageAddress <= PAGE_WRITE_MAX) ) { + /* PageAddress is within bounds. */ + + if (!ActiveConfiguration.ReadOnly) { + 3630: 80 91 06 29 lds r24, 0x2906 + 3634: 81 11 cpse r24, r1 + 3636: ff ce rjmp .-514 ; 0x3436 + MemoryWriteBlock(&Buffer[2], PageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); + 3638: f4 e0 ldi r31, 0x04 ; 4 + 363a: ff 9e mul r15, r31 + 363c: b0 01 movw r22, r0 + 363e: 11 24 eor r1, r1 + 3640: 44 e0 ldi r20, 0x04 ; 4 + 3642: 50 e0 ldi r21, 0x00 ; 0 + 3644: c8 01 movw r24, r16 + 3646: 02 96 adiw r24, 0x02 ; 2 + 3648: 0e 94 7a 07 call 0xef4 ; 0xef4 + 364c: f4 ce rjmp .-536 ; 0x3436 + } + } else if (Cmd == CMD_COMPAT_WRITE) { + /* The Mifare compatbility write command is a 2-frame command. + * The first frame contains the page-address and the second frame + * holds the data. */ + uint8_t PageAddress = Buffer[1]; + 364e: f8 01 movw r30, r16 + 3650: f1 80 ldd r15, Z+1 ; 0x01 + + if (ISO14443ACheckCRCA(Buffer, CMD_COMPAT_WRITE_FRAME_SIZE)) { + 3652: 62 e0 ldi r22, 0x02 ; 2 + 3654: 70 e0 ldi r23, 0x00 ; 0 + 3656: c8 01 movw r24, r16 + 3658: 1f d6 rcall .+3134 ; 0x4298 + 365a: 88 23 and r24, r24 + 365c: 09 f4 brne .+2 ; 0x3660 + 365e: 6c cf rjmp .-296 ; 0x3538 + if ( (PageAddress >= PAGE_WRITE_MIN) + && (PageAddress <= PAGE_WRITE_MAX) ) { + 3660: 8e ef ldi r24, 0xFE ; 254 + 3662: 8f 0d add r24, r15 + * The first frame contains the page-address and the second frame + * holds the data. */ + uint8_t PageAddress = Buffer[1]; + + if (ISO14443ACheckCRCA(Buffer, CMD_COMPAT_WRITE_FRAME_SIZE)) { + if ( (PageAddress >= PAGE_WRITE_MIN) + 3664: 8e 30 cpi r24, 0x0E ; 14 + 3666: 08 f0 brcs .+2 ; 0x366a + 3668: 26 cf rjmp .-436 ; 0x34b6 + && (PageAddress <= PAGE_WRITE_MAX) ) { + /* CRC check passed and page-address is within bounds. + * Store address and proceed to receiving the data. */ + CompatWritePageAddress = PageAddress; + 366a: f0 92 bc 28 sts 0x28BC, r15 + State = STATE_COMPAT_WRITE; + 366e: 85 e0 ldi r24, 0x05 ; 5 + 3670: e0 ce rjmp .-576 ; 0x3432 + } + } else if (Cmd == CMD_HALT) { + /* Halts the tag. According to the ISO14443, the second * byte is supposed to be 0. */ if (Buffer[1] == 0) { - if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { + if (ISO14443ACheckCRCA(Buffer, 2)) { + 3672: 62 e0 ldi r22, 0x02 ; 2 + 3674: 70 e0 ldi r23, 0x00 ; 0 + 3676: c8 01 movw r24, r16 + 3678: 0f d6 rcall .+3102 ; 0x4298 + 367a: 88 23 and r24, r24 + 367c: 09 f4 brne .+2 ; 0x3680 + 367e: 5c cf rjmp .-328 ; 0x3538 /* According to ISO14443, we must not send anything * in order to acknowledge the HALT command. */ State = STATE_HALT; - 3b60: 10 92 be 28 sts 0x28BE, r1 + 3680: 10 92 bd 28 sts 0x28BD, r1 return ISO14443A_APP_NO_RESPONSE; - 3b64: 20 e0 ldi r18, 0x00 ; 0 - 3b66: 30 e0 ldi r19, 0x00 ; 0 - 3b68: df cd rjmp .-1090 ; 0x3728 - } + 3684: 80 e0 ldi r24, 0x00 ; 0 + 3686: 90 e0 ldi r25, 0x00 ; 0 + 3688: e2 ce rjmp .-572 ; 0x344e - Buffer[0] = ACK_VALUE; - } else { - /* CRC Error. */ - Buffer[0] = NAK_CRC_ERROR; - 3b6a: 81 e0 ldi r24, 0x01 ; 1 - 3b6c: f8 01 movw r30, r16 - 3b6e: 80 83 st Z, r24 - } +0000368a : + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; +} - State = STATE_CHINESE_IDLE; - 3b70: 82 e0 ldi r24, 0x02 ; 2 - 3b72: 80 93 be 28 sts 0x28BE, r24 - - return ACK_NAK_FRAME_SIZE; - 3b76: 24 e0 ldi r18, 0x04 ; 4 - 3b78: 30 e0 ldi r19, 0x00 ; 0 - 3b7a: d6 cd rjmp .-1108 ; 0x3728 - /* Unlock read and write commands */ - Buffer[0] = ACK_VALUE; - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_CHINESE_WIPE) { - /* Wipe memory */ - Buffer[0] = ACK_VALUE; - 3b7c: 8a e0 ldi r24, 0x0A ; 10 - 3b7e: 80 83 st Z, r24 - return ACK_NAK_FRAME_SIZE; - 3b80: 24 e0 ldi r18, 0x04 ; 4 - 3b82: 30 e0 ldi r19, 0x00 ; 0 - 3b84: d1 cd rjmp .-1118 ; 0x3728 - for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) - Buffer[i] ^= Crypto1Byte(); - - if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - if (!ActiveConfiguration.ReadOnly) { - MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 3b86: 60 91 c3 28 lds r22, 0x28C3 - 3b8a: 30 e1 ldi r19, 0x10 ; 16 - 3b8c: 63 9f mul r22, r19 - 3b8e: b0 01 movw r22, r0 - 3b90: 11 24 eor r1, r1 - 3b92: 40 e1 ldi r20, 0x10 ; 16 - 3b94: 50 e0 ldi r21, 0x00 ; 0 - 3b96: c8 01 movw r24, r16 - 3b98: 0e 94 f6 06 call 0xdec ; 0xdec - 3b9c: b6 ce rjmp .-660 ; 0x390a - DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 3b9e: d8 01 movw r26, r16 - 3ba0: 2c 93 st X, r18 - DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 3ba2: 11 96 adiw r26, 0x01 ; 1 - 3ba4: 9c 93 st X, r25 - } - break; - - case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - State = STATE_READY1; - 3ba6: 84 e0 ldi r24, 0x04 ; 4 - 3ba8: 80 93 be 28 sts 0x28BE, r24 - - *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 3bac: 20 e1 ldi r18, 0x10 ; 16 - 3bae: 30 e0 ldi r19, 0x00 ; 0 - return BitCount; - 3bb0: bb cd rjmp .-1162 ; 0x3728 - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_RESTORE) { - if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - 3bb2: 62 e0 ldi r22, 0x02 ; 2 - 3bb4: 70 e0 ldi r23, 0x00 ; 0 - 3bb6: c8 01 movw r24, r16 - 3bb8: d4 d3 rcall .+1960 ; 0x4362 - 3bba: 88 23 and r24, r24 - 3bbc: 09 f4 brne .+2 ; 0x3bc0 - 3bbe: cd c0 rjmp .+410 ; 0x3d5a - CurrentAddress = Buffer[1]; - 3bc0: f8 01 movw r30, r16 - 3bc2: 81 81 ldd r24, Z+1 ; 0x01 - 3bc4: 80 93 c3 28 sts 0x28C3, r24 - State = STATE_RESTORE; - 3bc8: 8c e0 ldi r24, 0x0C ; 12 - 3bca: 80 93 be 28 sts 0x28BE, r24 - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 3bce: 8c d6 rcall .+3352 ; 0x48e8 - 3bd0: 9a e0 ldi r25, 0x0A ; 10 - 3bd2: 98 27 eor r25, r24 - 3bd4: d8 01 movw r26, r16 - 3bd6: 9c 93 st X, r25 - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - 3bd8: 24 e0 ldi r18, 0x04 ; 4 - 3bda: 30 e0 ldi r19, 0x00 ; 0 - 3bdc: a5 cd rjmp .-1206 ; 0x3728 - } else { - Buffer[0] = NAK_CRC_ERROR; - return ACK_NAK_FRAME_SIZE; - } - } else if (Buffer[0] == CMD_WRITE) { - if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { - 3bde: 62 e0 ldi r22, 0x02 ; 2 - 3be0: 70 e0 ldi r23, 0x00 ; 0 - 3be2: c8 01 movw r24, r16 - 3be4: be d3 rcall .+1916 ; 0x4362 - 3be6: 88 23 and r24, r24 - 3be8: 09 f4 brne .+2 ; 0x3bec - 3bea: ce c2 rjmp .+1436 ; 0x4188 - /* Write command. Store the address and prepare for the upcoming data. - * Respond with ACK. */ - CurrentAddress = Buffer[1]; - 3bec: f8 01 movw r30, r16 - 3bee: 81 81 ldd r24, Z+1 ; 0x01 - 3bf0: 80 93 c3 28 sts 0x28C3, r24 - State = STATE_CHINESE_WRITE; - 3bf4: 83 e0 ldi r24, 0x03 ; 3 - 3bf6: 80 93 be 28 sts 0x28BE, r24 - - Buffer[0] = ACK_VALUE; - 3bfa: 8a e0 ldi r24, 0x0A ; 10 - 3bfc: 80 83 st Z, r24 - return ACK_NAK_FRAME_SIZE; - 3bfe: 24 e0 ldi r18, 0x04 ; 4 - 3c00: 30 e0 ldi r19, 0x00 ; 0 - 3c02: 92 cd rjmp .-1244 ; 0x3728 - Crypto1Auth(&Buffer[0]); - - for (uint8_t i=0; i<4; i++) - Buffer[i+4] ^= Crypto1Byte(); - - if ((Buffer[4] == ReaderResponse[0]) && - 3c04: 25 81 ldd r18, Z+5 ; 0x05 - 3c06: 90 91 c5 28 lds r25, 0x28C5 - 3c0a: 29 13 cpse r18, r25 - 3c0c: 77 cf rjmp .-274 ; 0x3afc - (Buffer[5] == ReaderResponse[1]) && - 3c0e: 26 81 ldd r18, Z+6 ; 0x06 - 3c10: 90 91 c6 28 lds r25, 0x28C6 - 3c14: 29 13 cpse r18, r25 - 3c16: 72 cf rjmp .-284 ; 0x3afc - (Buffer[6] == ReaderResponse[2]) && - 3c18: 90 91 c7 28 lds r25, 0x28C7 - 3c1c: 89 13 cpse r24, r25 - 3c1e: 6e cf rjmp .-292 ; 0x3afc - (Buffer[7] == ReaderResponse[3])) { - /* Reader is authenticated. Encrypt the precalculated card response - * and generate the parity bits. */ - for (uint8_t i=0; i - 3c26: 8f 25 eor r24, r15 - 3c28: d8 01 movw r26, r16 - 3c2a: 8c 93 st X, r24 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 3c2c: f0 90 c8 28 lds r15, 0x28C8 - 3c30: 0f 2c mov r0, r15 - 3c32: f2 94 swap r15 - 3c34: f0 24 eor r15, r0 - 3c36: 0f 2c mov r0, r15 - 3c38: f6 94 lsr r15 - 3c3a: f6 94 lsr r15 - 3c3c: f0 24 eor r15, r0 - 3c3e: 16 d4 rcall .+2092 ; 0x446c - 3c40: f8 01 movw r30, r16 - 3c42: e0 58 subi r30, 0x80 ; 128 - 3c44: ff 4f sbci r31, 0xFF ; 255 - 3c46: 2f 2d mov r18, r15 - 3c48: 30 e0 ldi r19, 0x00 ; 0 - 3c4a: 2f 5f subi r18, 0xFF ; 255 - 3c4c: 3f 4f sbci r19, 0xFF ; 255 - 3c4e: 21 fb bst r18, 1 - 3c50: 88 24 eor r8, r8 - 3c52: 80 f8 bld r8, 0 - 3c54: 91 2c mov r9, r1 - 3c56: b1 e0 ldi r27, 0x01 ; 1 - 3c58: 8b 26 eor r8, r27 - 3c5a: 88 25 eor r24, r8 - 3c5c: 80 83 st Z, r24 - (Buffer[6] == ReaderResponse[2]) && - (Buffer[7] == ReaderResponse[3])) { - /* Reader is authenticated. Encrypt the precalculated card response - * and generate the parity bits. */ - for (uint8_t i=0; i - 3c64: 8f 25 eor r24, r15 - 3c66: f8 01 movw r30, r16 - 3c68: 81 83 std Z+1, r24 ; 0x01 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 3c6a: f0 90 c9 28 lds r15, 0x28C9 - 3c6e: 0f 2c mov r0, r15 - 3c70: f2 94 swap r15 - 3c72: f0 24 eor r15, r0 - 3c74: 0f 2c mov r0, r15 - 3c76: f6 94 lsr r15 - 3c78: f6 94 lsr r15 - 3c7a: f0 24 eor r15, r0 - 3c7c: f7 d3 rcall .+2030 ; 0x446c - 3c7e: f8 01 movw r30, r16 - 3c80: ef 57 subi r30, 0x7F ; 127 - 3c82: ff 4f sbci r31, 0xFF ; 255 - 3c84: 2f 2d mov r18, r15 - 3c86: 30 e0 ldi r19, 0x00 ; 0 - 3c88: 2f 5f subi r18, 0xFF ; 255 - 3c8a: 3f 4f sbci r19, 0xFF ; 255 - 3c8c: 21 fb bst r18, 1 - 3c8e: aa 24 eor r10, r10 - 3c90: a0 f8 bld r10, 0 - 3c92: b1 2c mov r11, r1 - 3c94: 31 e0 ldi r19, 0x01 ; 1 - 3c96: a3 26 eor r10, r19 - 3c98: 8a 25 eor r24, r10 - 3c9a: 80 83 st Z, r24 - (Buffer[6] == ReaderResponse[2]) && - (Buffer[7] == ReaderResponse[3])) { - /* Reader is authenticated. Encrypt the precalculated card response - * and generate the parity bits. */ - for (uint8_t i=0; i - 3ca2: 8f 25 eor r24, r15 - 3ca4: d8 01 movw r26, r16 - 3ca6: 12 96 adiw r26, 0x02 ; 2 - 3ca8: 8c 93 st X, r24 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 3caa: f0 90 ca 28 lds r15, 0x28CA - 3cae: 0f 2c mov r0, r15 - 3cb0: f2 94 swap r15 - 3cb2: f0 24 eor r15, r0 - 3cb4: 0f 2c mov r0, r15 - 3cb6: f6 94 lsr r15 - 3cb8: f6 94 lsr r15 - 3cba: f0 24 eor r15, r0 - 3cbc: d7 d3 rcall .+1966 ; 0x446c - 3cbe: f8 01 movw r30, r16 - 3cc0: ee 57 subi r30, 0x7E ; 126 - 3cc2: ff 4f sbci r31, 0xFF ; 255 - 3cc4: 2f 2d mov r18, r15 - 3cc6: 30 e0 ldi r19, 0x00 ; 0 - 3cc8: 2f 5f subi r18, 0xFF ; 255 - 3cca: 3f 4f sbci r19, 0xFF ; 255 - 3ccc: 21 fb bst r18, 1 - 3cce: cc 24 eor r12, r12 - 3cd0: c0 f8 bld r12, 0 - 3cd2: d1 2c mov r13, r1 - 3cd4: b1 e0 ldi r27, 0x01 ; 1 - 3cd6: cb 26 eor r12, r27 - 3cd8: 8c 25 eor r24, r12 - 3cda: 80 83 st Z, r24 - (Buffer[6] == ReaderResponse[2]) && - (Buffer[7] == ReaderResponse[3])) { - /* Reader is authenticated. Encrypt the precalculated card response - * and generate the parity bits. */ - for (uint8_t i=0; i - 3ce2: 8f 25 eor r24, r15 - 3ce4: f8 01 movw r30, r16 - 3ce6: 83 83 std Z+3, r24 ; 0x03 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 3ce8: f0 90 cb 28 lds r15, 0x28CB - 3cec: 0f 2c mov r0, r15 - 3cee: f2 94 swap r15 - 3cf0: f0 24 eor r15, r0 - 3cf2: 0f 2c mov r0, r15 - 3cf4: f6 94 lsr r15 - 3cf6: f6 94 lsr r15 - 3cf8: f0 24 eor r15, r0 - 3cfa: b8 d3 rcall .+1904 ; 0x446c - 3cfc: f8 01 movw r30, r16 - 3cfe: ed 57 subi r30, 0x7D ; 125 - 3d00: ff 4f sbci r31, 0xFF ; 255 - 3d02: 2f 2d mov r18, r15 - 3d04: 30 e0 ldi r19, 0x00 ; 0 - 3d06: 2f 5f subi r18, 0xFF ; 255 - 3d08: 3f 4f sbci r19, 0xFF ; 255 - 3d0a: 21 fb bst r18, 1 - 3d0c: 66 24 eor r6, r6 - 3d0e: 60 f8 bld r6, 0 - 3d10: 71 2c mov r7, r1 - 3d12: 31 e0 ldi r19, 0x01 ; 1 - 3d14: 63 26 eor r6, r19 - 3d16: 86 25 eor r24, r6 - 3d18: 80 83 st Z, r24 - } - - State = STATE_AUTHED_IDLE; - 3d1a: 88 e0 ldi r24, 0x08 ; 8 - 3d1c: 80 93 be 28 sts 0x28BE, r24 - - return (CMD_AUTH_BA_FRAME_SIZE * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; - 3d20: 20 e2 ldi r18, 0x20 ; 32 - 3d22: 30 e1 ldi r19, 0x10 ; 16 - 3d24: 01 cd rjmp .-1534 ; 0x3728 - * the block back into the global block buffer. */ - for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) - Buffer[i] ^= Crypto1Byte(); - - if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { - MemoryReadBlock(BlockBuffer, (uint16_t) CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 3d26: 60 91 c3 28 lds r22, 0x28C3 - 3d2a: b0 e1 ldi r27, 0x10 ; 16 - 3d2c: 6b 9f mul r22, r27 - 3d2e: b0 01 movw r22, r0 - 3d30: 11 24 eor r1, r1 - 3d32: 40 e1 ldi r20, 0x10 ; 16 - 3d34: 50 e0 ldi r21, 0x00 ; 0 - 3d36: 8c ec ldi r24, 0xCC ; 204 - 3d38: 98 e2 ldi r25, 0x28 ; 40 - 3d3a: 0e 94 de 06 call 0xdbc ; 0xdbc - -INLINE bool CheckValueIntegrity(uint8_t* Block) +void MifareUltralightGetUid(ConfigurationUidType Uid) { - /* Value Blocks contain a value stored three times, with - * the middle portion inverted. */ - if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) - 3d3e: 20 91 cc 28 lds r18, 0x28CC - 3d42: 80 91 d0 28 lds r24, 0x28D0 - 3d46: 80 95 com r24 - 3d48: 28 17 cp r18, r24 - 3d4a: 09 f4 brne .+2 ; 0x3d4e - 3d4c: df c0 rjmp .+446 ; 0x3f0c - State = STATE_AUTHED_IDLE; - /* No ACK response on value commands part 2 */ - return ISO14443A_APP_NO_RESPONSE; - } else { - /* Not sure if this is the correct error code.. */ - Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); - 3d4e: cc d5 rcall .+2968 ; 0x48e8 - 3d50: 96 e0 ldi r25, 0x06 ; 6 - 3d52: 98 27 eor r25, r24 - 3d54: d8 01 movw r26, r16 - 3d56: 9c 93 st X, r25 - 3d58: 53 cd rjmp .-1370 ; 0x3800 - * form the reader in the next frame. */ - State = STATE_AUTHING; + 368a: cf 93 push r28 + 368c: df 93 push r29 + 368e: ec 01 movw r28, r24 + /* Read UID from memory */ + MemoryReadBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); + 3690: 43 e0 ldi r20, 0x03 ; 3 + 3692: 50 e0 ldi r21, 0x00 ; 0 + 3694: 60 e0 ldi r22, 0x00 ; 0 + 3696: 70 e0 ldi r23, 0x00 ; 0 + 3698: 0e 94 62 07 call 0xec4 ; 0xec4 + MemoryReadBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); + 369c: 44 e0 ldi r20, 0x04 ; 4 + 369e: 50 e0 ldi r21, 0x00 ; 0 + 36a0: 64 e0 ldi r22, 0x04 ; 4 + 36a2: 70 e0 ldi r23, 0x00 ; 0 + 36a4: ce 01 movw r24, r28 + 36a6: 03 96 adiw r24, 0x03 ; 3 +} + 36a8: df 91 pop r29 + 36aa: cf 91 pop r28 - return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 3d5a: c6 d5 rcall .+2956 ; 0x48e8 - 3d5c: 91 e0 ldi r25, 0x01 ; 1 - 3d5e: 98 27 eor r25, r24 - 3d60: f8 01 movw r30, r16 - 3d62: 90 83 st Z, r25 - return ACK_NAK_FRAME_SIZE; - 3d64: 24 e0 ldi r18, 0x04 ; 4 - 3d66: 30 e0 ldi r19, 0x00 ; 0 - 3d68: df cc rjmp .-1602 ; 0x3728 +void MifareUltralightGetUid(ConfigurationUidType Uid) +{ + /* Read UID from memory */ + MemoryReadBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); + MemoryReadBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); + 36ac: 0c 94 62 07 jmp 0xec4 ; 0xec4 - case STATE_CHINESE_WRITE: - if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - /* CRC check passed. Write data into memory and send ACK. */ - if (!ActiveConfiguration.ReadOnly) { - MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 3d6a: 60 91 c3 28 lds r22, 0x28C3 - 3d6e: f0 e1 ldi r31, 0x10 ; 16 - 3d70: 6f 9f mul r22, r31 - 3d72: b0 01 movw r22, r0 - 3d74: 11 24 eor r1, r1 - 3d76: 40 e1 ldi r20, 0x10 ; 16 - 3d78: 50 e0 ldi r21, 0x00 ; 0 - 3d7a: c8 01 movw r24, r16 - 3d7c: 0e 94 f6 06 call 0xdec ; 0xdec - 3d80: 96 ce rjmp .-724 ; 0x3aae - * the incoming data. */ - for (uint8_t i=0; i<4; i++) - Buffer[i] ^= Crypto1Byte(); +000036b0 : +} + +void MifareUltralightSetUid(ConfigurationUidType Uid) +{ + 36b0: 0f 93 push r16 + 36b2: 1f 93 push r17 + 36b4: cf 93 push r28 + 36b6: df 93 push r29 + 36b8: 00 d0 rcall .+0 ; 0x36ba + 36ba: cd b7 in r28, 0x3d ; 61 + 36bc: de b7 in r29, 0x3e ; 62 + 36be: 8c 01 movw r16, r24 + /* Calculate check bytes and write everything into memory */ + uint8_t BCC1 = ISO14443A_UID0_CT ^ Uid[0] ^ Uid[1] ^ Uid[2]; + 36c0: fc 01 movw r30, r24 + 36c2: 80 81 ld r24, Z + 36c4: 91 81 ldd r25, Z+1 ; 0x01 + 36c6: 89 27 eor r24, r25 + 36c8: 98 e8 ldi r25, 0x88 ; 136 + 36ca: 89 27 eor r24, r25 + 36cc: 92 81 ldd r25, Z+2 ; 0x02 + 36ce: 89 27 eor r24, r25 + 36d0: 8a 83 std Y+2, r24 ; 0x02 + uint8_t BCC2 = Uid[3] ^ Uid[4] ^ Uid[5] ^ Uid[6]; + 36d2: 84 81 ldd r24, Z+4 ; 0x04 + 36d4: 93 81 ldd r25, Z+3 ; 0x03 + 36d6: 89 27 eor r24, r25 + 36d8: 95 81 ldd r25, Z+5 ; 0x05 + 36da: 89 27 eor r24, r25 + 36dc: 96 81 ldd r25, Z+6 ; 0x06 + 36de: 89 27 eor r24, r25 + 36e0: 89 83 std Y+1, r24 ; 0x01 + + MemoryWriteBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); + 36e2: 43 e0 ldi r20, 0x03 ; 3 + 36e4: 50 e0 ldi r21, 0x00 ; 0 + 36e6: 60 e0 ldi r22, 0x00 ; 0 + 36e8: 70 e0 ldi r23, 0x00 ; 0 + 36ea: c8 01 movw r24, r16 + 36ec: 0e 94 7a 07 call 0xef4 ; 0xef4 + MemoryWriteBlock(&BCC1, UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); + 36f0: 41 e0 ldi r20, 0x01 ; 1 + 36f2: 50 e0 ldi r21, 0x00 ; 0 + 36f4: 63 e0 ldi r22, 0x03 ; 3 + 36f6: 70 e0 ldi r23, 0x00 ; 0 + 36f8: ce 01 movw r24, r28 + 36fa: 02 96 adiw r24, 0x02 ; 2 + 36fc: 0e 94 7a 07 call 0xef4 ; 0xef4 + MemoryWriteBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); + 3700: 44 e0 ldi r20, 0x04 ; 4 + 3702: 50 e0 ldi r21, 0x00 ; 0 + 3704: 64 e0 ldi r22, 0x04 ; 4 + 3706: 70 e0 ldi r23, 0x00 ; 0 + 3708: c8 01 movw r24, r16 + 370a: 03 96 adiw r24, 0x03 ; 3 + 370c: 0e 94 7a 07 call 0xef4 ; 0xef4 + MemoryWriteBlock(&BCC2, UID_BCC2_ADDRESS, ISO14443A_CL_BCC_SIZE); + 3710: 41 e0 ldi r20, 0x01 ; 1 + 3712: 50 e0 ldi r21, 0x00 ; 0 + 3714: 68 e0 ldi r22, 0x08 ; 8 + 3716: 70 e0 ldi r23, 0x00 ; 0 + 3718: ce 01 movw r24, r28 + 371a: 01 96 adiw r24, 0x01 ; 1 + 371c: 0e 94 7a 07 call 0xef4 ; 0xef4 +} + 3720: 0f 90 pop r0 + 3722: 0f 90 pop r0 + 3724: df 91 pop r29 + 3726: cf 91 pop r28 + 3728: 1f 91 pop r17 + 372a: 0f 91 pop r16 + 372c: 08 95 ret + +0000372e : + Block[11] = Block[3]; +} + +void MifareClassicAppInit1K(void) +{ + State = STATE_IDLE; + 372e: 81 e0 ldi r24, 0x01 ; 1 + 3730: 80 93 db 28 sts 0x28DB, r24 + CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; + 3734: 84 e0 ldi r24, 0x04 ; 4 + 3736: 90 e0 ldi r25, 0x00 ; 0 + 3738: 80 93 c0 28 sts 0x28C0, r24 + 373c: 90 93 c1 28 sts 0x28C1, r25 + CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; + 3740: 88 e0 ldi r24, 0x08 ; 8 + 3742: 80 93 bf 28 sts 0x28BF, r24 + _7BUID = 0x00; + 3746: 10 92 be 28 sts 0x28BE, r1 + 374a: 08 95 ret + +0000374c : +} + +void MifarePlus1kAppInit_7B(void) +{ + State = STATE_IDLE; + 374c: 81 e0 ldi r24, 0x01 ; 1 + 374e: 80 93 db 28 sts 0x28DB, r24 + CardATQAValue = MFPlus_ATQA_VALUE; + 3752: 84 e4 ldi r24, 0x44 ; 68 + 3754: 90 e0 ldi r25, 0x00 ; 0 + 3756: 80 93 c0 28 sts 0x28C0, r24 + 375a: 90 93 c1 28 sts 0x28C1, r25 + CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; + 375e: 88 e0 ldi r24, 0x08 ; 8 + 3760: 80 93 bf 28 sts 0x28BF, r24 + uint8_t UidSize = ActiveConfiguration.UidSize; + _7BUID = (UidSize == 7); + 3764: 81 e0 ldi r24, 0x01 ; 1 + 3766: 90 91 05 29 lds r25, 0x2905 + 376a: 97 30 cpi r25, 0x07 ; 7 + 376c: 09 f0 breq .+2 ; 0x3770 + 376e: 80 e0 ldi r24, 0x00 ; 0 + 3770: 80 93 be 28 sts 0x28BE, r24 + 3774: 08 95 ret + +00003776 : +} + +void MifareClassicAppInit4K(void) +{ + State = STATE_IDLE; + 3776: 81 e0 ldi r24, 0x01 ; 1 + 3778: 80 93 db 28 sts 0x28DB, r24 + CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; + 377c: 82 e0 ldi r24, 0x02 ; 2 + 377e: 90 e0 ldi r25, 0x00 ; 0 + 3780: 80 93 c0 28 sts 0x28C0, r24 + 3784: 90 93 c1 28 sts 0x28C1, r25 + CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; + 3788: 88 e1 ldi r24, 0x18 ; 24 + 378a: 80 93 bf 28 sts 0x28BF, r24 + _7BUID = 0x00; + 378e: 10 92 be 28 sts 0x28BE, r1 + 3792: 08 95 ret + +00003794 : +} + +void MifareClassicAppReset(void) +{ + State = STATE_IDLE; + 3794: 81 e0 ldi r24, 0x01 ; 1 + 3796: 80 93 db 28 sts 0x28DB, r24 + 379a: 08 95 ret + +0000379c : +} - if (Buffer[0] == CMD_READ) { - if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { - 3d82: 62 e0 ldi r22, 0x02 ; 2 - 3d84: 70 e0 ldi r23, 0x00 ; 0 - 3d86: c8 01 movw r24, r16 - 3d88: ec d2 rcall .+1496 ; 0x4362 - 3d8a: 88 23 and r24, r24 - 3d8c: 31 f3 breq .-52 ; 0x3d5a - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 3d8e: f8 01 movw r30, r16 - 3d90: 61 81 ldd r22, Z+1 ; 0x01 - 3d92: f0 e1 ldi r31, 0x10 ; 16 - 3d94: 6f 9f mul r22, r31 - 3d96: b0 01 movw r22, r0 - 3d98: 11 24 eor r1, r1 - 3d9a: 40 e1 ldi r20, 0x10 ; 16 - 3d9c: 50 e0 ldi r21, 0x00 ; 0 - 3d9e: c8 01 movw r24, r16 - 3da0: 0e 94 de 06 call 0xdbc ; 0xdbc - ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - 3da4: 60 e1 ldi r22, 0x10 ; 16 - 3da6: 70 e0 ldi r23, 0x00 ; 0 - 3da8: c8 01 movw r24, r16 - 3daa: ac d2 rcall .+1368 ; 0x4304 void MifareClassicAppTask(void) { + 379c: 08 95 ret + +0000379e : } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) - 3dac: 68 01 movw r12, r16 - 3dae: 30 e8 ldi r19, 0x80 ; 128 - 3db0: c3 0e add r12, r19 - 3db2: d1 1c adc r13, r1 - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); +{ + 379e: 7f 92 push r7 + 37a0: 8f 92 push r8 + 37a2: 9f 92 push r9 + 37a4: af 92 push r10 + 37a6: bf 92 push r11 + 37a8: cf 92 push r12 + 37aa: df 92 push r13 + 37ac: ef 92 push r14 + 37ae: ff 92 push r15 + 37b0: 0f 93 push r16 + 37b2: 1f 93 push r17 + 37b4: cf 93 push r28 + 37b6: df 93 push r29 + 37b8: cd b7 in r28, 0x3d ; 61 + 37ba: de b7 in r29, 0x3e ; 62 + 37bc: 2e 97 sbiw r28, 0x0e ; 14 + 37be: cd bf out 0x3d, r28 ; 61 + 37c0: de bf out 0x3e, r29 ; 62 + 37c2: 8c 01 movw r16, r24 + switch(State) { + 37c4: 40 91 db 28 lds r20, 0x28DB + 37c8: 50 e0 ldi r21, 0x00 ; 0 + 37ca: 4d 30 cpi r20, 0x0D ; 13 + 37cc: 51 05 cpc r21, r1 + 37ce: 98 f0 brcs .+38 ; 0x37f6 - /* Encrypt and calculate parity bits. */ - for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { - 3db4: a1 2c mov r10, r1 - uint8_t Plain = Buffer[i]; - 3db6: d8 01 movw r26, r16 - 3db8: bc 90 ld r11, X - Buffer[i] = Plain ^ Crypto1Byte(); - 3dba: 55 d5 rcall .+2730 ; 0x4866 - 3dbc: 8b 25 eor r24, r11 - 3dbe: f8 01 movw r30, r16 - 3dc0: 81 93 st Z+, r24 - 3dc2: 8f 01 movw r16, r30 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); - 3dc4: 0b 2c mov r0, r11 - 3dc6: b2 94 swap r11 - 3dc8: b0 24 eor r11, r0 - 3dca: 0b 2c mov r0, r11 - 3dcc: b6 94 lsr r11 - 3dce: b6 94 lsr r11 - 3dd0: b0 24 eor r11, r0 - 3dd2: 4c d3 rcall .+1688 ; 0x446c - 3dd4: 2b 2d mov r18, r11 - 3dd6: 30 e0 ldi r19, 0x00 ; 0 - 3dd8: 2f 5f subi r18, 0xFF ; 255 - 3dda: 3f 4f sbci r19, 0xFF ; 255 - 3ddc: 21 fb bst r18, 1 - 3dde: ee 24 eor r14, r14 - 3de0: e0 f8 bld r14, 0 - 3de2: f1 2c mov r15, r1 - 3de4: f1 e0 ldi r31, 0x01 ; 1 - 3de6: ef 26 eor r14, r31 - 3de8: 8e 25 eor r24, r14 - 3dea: d6 01 movw r26, r12 - 3dec: 8d 93 st X+, r24 - 3dee: 6d 01 movw r12, r26 - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); + *BitCount = ISO14443A_SAK_FRAME_SIZE; + return true; + } else { + /* We have not been selected. Don't send anything. */ + *BitCount = 0; + 37d0: 80 e0 ldi r24, 0x00 ; 0 + 37d2: 90 e0 ldi r25, 0x00 ; 0 + break; + } - /* Encrypt and calculate parity bits. */ - for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { - 3df0: a3 94 inc r10 - 3df2: b2 e1 ldi r27, 0x12 ; 18 - 3df4: ab 12 cpse r10, r27 - 3df6: df cf rjmp .-66 ; 0x3db6 - uint8_t Plain = Buffer[i]; - Buffer[i] = Plain ^ Crypto1Byte(); - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; +} + 37d4: 2e 96 adiw r28, 0x0e ; 14 + 37d6: cd bf out 0x3d, r28 ; 61 + 37d8: de bf out 0x3e, r29 ; 62 + 37da: df 91 pop r29 + 37dc: cf 91 pop r28 + 37de: 1f 91 pop r17 + 37e0: 0f 91 pop r16 + 37e2: ff 90 pop r15 + 37e4: ef 90 pop r14 + 37e6: df 90 pop r13 + 37e8: cf 90 pop r12 + 37ea: bf 90 pop r11 + 37ec: af 90 pop r10 + 37ee: 9f 90 pop r9 + 37f0: 8f 90 pop r8 + 37f2: 7f 90 pop r7 + 37f4: 08 95 ret + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + 37f6: fa 01 movw r30, r20 + 37f8: ee 59 subi r30, 0x9E ; 158 + 37fa: fe 4f sbci r31, 0xFE ; 254 + 37fc: 0c 94 7a 2b jmp 0x56f4 ; 0x56f4 <__tablejump2__> + 3800: 7c 01 movw r14, r24 + 3802: d1 2c mov r13, r1 + * check for CRC. Then write the data when ReadOnly mode is not + * activated. */ + + /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ + for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) + Buffer[i] ^= Crypto1Byte(); + 3804: f7 01 movw r30, r14 + 3806: c0 80 ld r12, Z + 3808: ef d6 rcall .+3550 ; 0x45e8 + 380a: 8c 25 eor r24, r12 + 380c: d7 01 movw r26, r14 + 380e: 8d 93 st X+, r24 + 3810: 7d 01 movw r14, r26 + * sending the data to be written. Decrypt the data first and + * check for CRC. Then write the data when ReadOnly mode is not + * activated. */ + + /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ + for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) + 3812: d3 94 inc r13 + 3814: b2 e1 ldi r27, 0x12 ; 18 + 3816: db 12 cpse r13, r27 + 3818: f5 cf rjmp .-22 ; 0x3804 + Buffer[i] ^= Crypto1Byte(); + + if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { + 381a: 60 e1 ldi r22, 0x10 ; 16 + 381c: 70 e0 ldi r23, 0x00 ; 0 + 381e: c8 01 movw r24, r16 + 3820: 3b d5 rcall .+2678 ; 0x4298 + 3822: 88 23 and r24, r24 + 3824: 09 f4 brne .+2 ; 0x3828 + 3826: 33 c2 rjmp .+1126 ; 0x3c8e + if (!ActiveConfiguration.ReadOnly) { + 3828: 80 91 06 29 lds r24, 0x2906 + 382c: 88 23 and r24, r24 + 382e: 09 f4 brne .+2 ; 0x3832 + 3830: a8 c1 rjmp .+848 ; 0x3b82 + MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + } else { + /* Silently ignore in ReadOnly mode */ + } + + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 3832: ed d6 rcall .+3546 ; 0x460e + 3834: 9a e0 ldi r25, 0x0A ; 10 + 3836: 98 27 eor r25, r24 + 3838: d8 01 movw r26, r16 + 383a: 9c 93 st X, r25 + 383c: 17 c0 rjmp .+46 ; 0x386c + 383e: 7c 01 movw r14, r24 + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + 3840: 56 e0 ldi r21, 0x06 ; 6 + 3842: d5 2e mov r13, r21 + * decrypt the data and check CRC. Read data from the requested block + * address into the global block buffer and check for integrity. Then + * add or subtract according to issued command if necessary and store + * the block back into the global block buffer. */ + for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) + Buffer[i] ^= Crypto1Byte(); + 3844: d7 01 movw r26, r14 + 3846: cc 90 ld r12, X + 3848: cf d6 rcall .+3486 ; 0x45e8 + 384a: 8c 25 eor r24, r12 + 384c: f7 01 movw r30, r14 + 384e: 81 93 st Z+, r24 + 3850: 7f 01 movw r14, r30 + 3852: da 94 dec r13 + * been issued earlier and the reader is now sending the data. First, + * decrypt the data and check CRC. Read data from the requested block + * address into the global block buffer and check for integrity. Then + * add or subtract according to issued command if necessary and store + * the block back into the global block buffer. */ + for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) + 3854: b9 f7 brne .-18 ; 0x3844 + Buffer[i] ^= Crypto1Byte(); + + if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { + 3856: 64 e0 ldi r22, 0x04 ; 4 + 3858: 70 e0 ldi r23, 0x00 ; 0 + 385a: c8 01 movw r24, r16 + 385c: 1d d5 rcall .+2618 ; 0x4298 + 385e: 81 11 cpse r24, r1 + 3860: fc c1 rjmp .+1016 ; 0x3c5a + /* Not sure if this is the correct error code.. */ + Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); + } + } else { + /* CRC Error. */ + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 3862: d5 d6 rcall .+3498 ; 0x460e + 3864: 91 e0 ldi r25, 0x01 ; 1 + 3866: 98 27 eor r25, r24 + 3868: d8 01 movw r26, r16 + 386a: 9c 93 st X, r25 + } + + State = STATE_AUTHED_IDLE; + 386c: 88 e0 ldi r24, 0x08 ; 8 + 386e: 80 93 db 28 sts 0x28DB, r24 + return ACK_NAK_FRAME_SIZE; + 3872: 84 e0 ldi r24, 0x04 ; 4 + 3874: 90 e0 ldi r25, 0x00 ; 0 + 3876: ae cf rjmp .-164 ; 0x37d4 +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + case STATE_IDLE: + case STATE_HALT: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + 3878: 20 91 c0 28 lds r18, 0x28C0 + 387c: 90 91 c1 28 lds r25, 0x28C1 +INLINE +bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + + if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ + 3880: d8 01 movw r26, r16 + 3882: 8c 91 ld r24, X + 3884: 86 32 cpi r24, 0x26 ; 38 + 3886: 09 f4 brne .+2 ; 0x388a + 3888: 5b c1 rjmp .+694 ; 0x3b40 + 388a: 82 35 cpi r24, 0x52 ; 82 + 388c: 09 f4 brne .+2 ; 0x3890 + 388e: 58 c1 rjmp .+688 ; 0x3b40 + State = STATE_READY1; + return BitCount; + } +#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE + else if (Buffer[0] == CMD_CHINESE_UNLOCK) { + 3890: 80 34 cpi r24, 0x40 ; 64 + 3892: 09 f0 breq .+2 ; 0x3896 + 3894: 9d cf rjmp .-198 ; 0x37d0 + State = STATE_CHINESE_IDLE; + 3896: 82 e0 ldi r24, 0x02 ; 2 + 3898: 80 93 db 28 sts 0x28DB, r24 + Buffer[0] = ACK_VALUE; + 389c: 8a e0 ldi r24, 0x0A ; 10 + 389e: d8 01 movw r26, r16 + 38a0: 8c 93 st X, r24 + return ACK_NAK_FRAME_SIZE; + 38a2: 84 e0 ldi r24, 0x04 ; 4 + 38a4: 90 e0 ldi r25, 0x00 ; 0 + 38a6: 96 cf rjmp .-212 ; 0x37d4 + break; + +#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE + case STATE_CHINESE_IDLE: + /* Support special china commands that dont require authentication. */ + if (Buffer[0] == CMD_CHINESE_UNLOCK_RW) { + 38a8: fc 01 movw r30, r24 + 38aa: 80 81 ld r24, Z + /* Unlock read and write commands */ + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_CHINESE_WIPE) { + 38ac: 98 2f mov r25, r24 + 38ae: 9d 7f andi r25, 0xFD ; 253 + 38b0: 91 34 cpi r25, 0x41 ; 65 + 38b2: 09 f4 brne .+2 ; 0x38b6 + 38b4: 58 c1 rjmp .+688 ; 0x3b66 + /* Wipe memory */ + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_READ) { + 38b6: 80 33 cpi r24, 0x30 ; 48 + 38b8: 09 f4 brne .+2 ; 0x38bc + 38ba: 85 c1 rjmp .+778 ; 0x3bc6 + * BITS_PER_BYTE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else if (Buffer[0] == CMD_WRITE) { + 38bc: 80 3a cpi r24, 0xA0 ; 160 + 38be: 09 f4 brne .+2 ; 0x38c2 + 38c0: 29 c4 rjmp .+2130 ; 0x4114 + return ACK_NAK_FRAME_SIZE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else if (Buffer[0] == CMD_HALT) { + 38c2: 80 35 cpi r24, 0x50 ; 80 + 38c4: 09 f0 breq .+2 ; 0x38c8 + 38c6: 84 cf rjmp .-248 ; 0x37d0 + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + 38c8: f8 01 movw r30, r16 + 38ca: 81 81 ldd r24, Z+1 ; 0x01 + 38cc: 88 23 and r24, r24 + 38ce: 09 f4 brne .+2 ; 0x38d2 + 38d0: 25 c2 rjmp .+1098 ; 0x3d1c + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; } + } else { + Buffer[0] = NAK_INVALID_ARG; + 38d2: d8 01 movw r26, r16 + 38d4: 1c 92 st X, r1 + return ACK_NAK_FRAME_SIZE; + 38d6: 84 e0 ldi r24, 0x04 ; 4 + 38d8: 90 e0 ldi r25, 0x00 ; 0 + 38da: 7c cf rjmp .-264 ; 0x37d4 + State = STATE_HALT; + } + break; - return ( (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) - 3df8: 20 e9 ldi r18, 0x90 ; 144 - 3dfa: 30 e1 ldi r19, 0x10 ; 16 - 3dfc: 95 cc rjmp .-1750 ; 0x3728 + case STATE_READY2: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + 38dc: 20 91 c0 28 lds r18, 0x28C0 + 38e0: 90 91 c1 28 lds r25, 0x28C1 + 38e4: f8 01 movw r30, r16 + 38e6: 80 81 ld r24, Z + 38e8: 86 32 cpi r24, 0x26 ; 38 + 38ea: 09 f4 brne .+2 ; 0x38ee + 38ec: 32 c1 rjmp .+612 ; 0x3b52 + 38ee: 82 35 cpi r24, 0x52 ; 82 + 38f0: 09 f4 brne .+2 ; 0x38f4 + 38f2: 2f c1 rjmp .+606 ; 0x3b52 State = STATE_READY1; return BitCount; } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL2) { + 38f4: 85 39 cpi r24, 0x95 ; 149 + 38f6: 09 f0 breq .+2 ; 0x38fa + 38f8: 1e c1 rjmp .+572 ; 0x3b36 /* Load UID CL2 and perform anticollision */ uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; MemoryReadBlock(UidCL2, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 3dfe: 44 e0 ldi r20, 0x04 ; 4 - 3e00: 50 e0 ldi r21, 0x00 ; 0 - 3e02: 63 e0 ldi r22, 0x03 ; 3 - 3e04: 70 e0 ldi r23, 0x00 ; 0 - 3e06: ce 01 movw r24, r28 - 3e08: 01 96 adiw r24, 0x01 ; 1 - 3e0a: 0e 94 de 06 call 0xdbc ; 0xdbc + 38fa: 44 e0 ldi r20, 0x04 ; 4 + 38fc: 50 e0 ldi r21, 0x00 ; 0 + 38fe: 63 e0 ldi r22, 0x03 ; 3 + 3900: 70 e0 ldi r23, 0x00 ; 0 + 3902: ce 01 movw r24, r28 + 3904: 01 96 adiw r24, 0x01 ; 1 + 3906: 0e 94 62 07 call 0xec4 ; 0xec4 if (ISO14443ASelect(Buffer, &BitCount, UidCL2, CardSAKValue)) { - 3e0e: 90 91 c1 28 lds r25, 0x28C1 + 390a: 90 91 bf 28 lds r25, 0x28BF uint8_t* DataPtr = (uint8_t*) Buffer; uint8_t NVB = DataPtr[1]; //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; switch (NVB) { - 3e12: d8 01 movw r26, r16 - 3e14: 11 96 adiw r26, 0x01 ; 1 - 3e16: 8c 91 ld r24, X - 3e18: 80 32 cpi r24, 0x20 ; 32 - 3e1a: 09 f4 brne .+2 ; 0x3e1e - 3e1c: d3 c1 rjmp .+934 ; 0x41c4 - 3e1e: 80 37 cpi r24, 0x70 ; 112 - 3e20: 09 f0 breq .+2 ; 0x3e24 - 3e22: 80 cc rjmp .-1792 ; 0x3724 + 390e: f8 01 movw r30, r16 + 3910: 81 81 ldd r24, Z+1 ; 0x01 + 3912: 80 32 cpi r24, 0x20 ; 32 + 3914: 09 f4 brne .+2 ; 0x3918 + 3916: d1 c3 rjmp .+1954 ; 0x40ba + 3918: 80 37 cpi r24, 0x70 ; 112 + 391a: 09 f0 breq .+2 ; 0x391e + 391c: 59 cf rjmp .-334 ; 0x37d0 return false; case ISO14443A_NVB_AC_END: /* End of anticollision procedure. * Send SAK CLn if we are selected. */ if ( (DataPtr[2] == UidCL[0]) && - 3e24: d8 01 movw r26, r16 - 3e26: 12 96 adiw r26, 0x02 ; 2 - 3e28: 2c 91 ld r18, X - 3e2a: 12 97 sbiw r26, 0x02 ; 2 - 3e2c: 89 81 ldd r24, Y+1 ; 0x01 - 3e2e: 28 13 cpse r18, r24 - 3e30: 79 cc rjmp .-1806 ; 0x3724 - 3e32: 13 96 adiw r26, 0x03 ; 3 - 3e34: 2c 91 ld r18, X - 3e36: 13 97 sbiw r26, 0x03 ; 3 - 3e38: 8a 81 ldd r24, Y+2 ; 0x02 - 3e3a: 28 13 cpse r18, r24 - 3e3c: 73 cc rjmp .-1818 ; 0x3724 + 391e: f8 01 movw r30, r16 + 3920: 22 81 ldd r18, Z+2 ; 0x02 + 3922: 89 81 ldd r24, Y+1 ; 0x01 + 3924: 28 13 cpse r18, r24 + 3926: 54 cf rjmp .-344 ; 0x37d0 + 3928: 23 81 ldd r18, Z+3 ; 0x03 + 392a: 8a 81 ldd r24, Y+2 ; 0x02 + 392c: 28 13 cpse r18, r24 + 392e: 50 cf rjmp .-352 ; 0x37d0 (DataPtr[3] == UidCL[1]) && - 3e3e: 14 96 adiw r26, 0x04 ; 4 - 3e40: 2c 91 ld r18, X - 3e42: 14 97 sbiw r26, 0x04 ; 4 - 3e44: 8b 81 ldd r24, Y+3 ; 0x03 - 3e46: 28 13 cpse r18, r24 - 3e48: 6d cc rjmp .-1830 ; 0x3724 + 3930: 24 81 ldd r18, Z+4 ; 0x04 + 3932: 8b 81 ldd r24, Y+3 ; 0x03 + 3934: 28 13 cpse r18, r24 + 3936: 4c cf rjmp .-360 ; 0x37d0 (DataPtr[4] == UidCL[2]) && - 3e4a: 15 96 adiw r26, 0x05 ; 5 - 3e4c: 2c 91 ld r18, X - 3e4e: 15 97 sbiw r26, 0x05 ; 5 - 3e50: 8c 81 ldd r24, Y+4 ; 0x04 - 3e52: 28 13 cpse r18, r24 - 3e54: 67 cc rjmp .-1842 ; 0x3724 + 3938: 25 81 ldd r18, Z+5 ; 0x05 + 393a: 8c 81 ldd r24, Y+4 ; 0x04 + 393c: 28 13 cpse r18, r24 + 393e: 48 cf rjmp .-368 ; 0x37d0 (DataPtr[5] == UidCL[3]) ) { DataPtr[0] = SAKValue; - 3e56: 9c 93 st X, r25 + 3940: 90 83 st Z, r25 ISO14443AAppendCRCA(Buffer, 1); - 3e58: 61 e0 ldi r22, 0x01 ; 1 - 3e5a: 70 e0 ldi r23, 0x00 ; 0 - 3e5c: c8 01 movw r24, r16 - 3e5e: 52 d2 rcall .+1188 ; 0x4304 + 3942: 61 e0 ldi r22, 0x01 ; 1 + 3944: 70 e0 ldi r23, 0x00 ; 0 + 3946: c8 01 movw r24, r16 + 3948: 79 d4 rcall .+2290 ; 0x423c State = STATE_ACTIVE; - 3e60: 86 e0 ldi r24, 0x06 ; 6 - 3e62: 80 93 be 28 sts 0x28BE, r24 + 394a: 86 e0 ldi r24, 0x06 ; 6 + 394c: 80 93 db 28 sts 0x28DB, r24 *BitCount = ISO14443A_SAK_FRAME_SIZE; - 3e66: 28 e1 ldi r18, 0x18 ; 24 - 3e68: 30 e0 ldi r19, 0x00 ; 0 - 3e6a: 5e cc rjmp .-1860 ; 0x3728 + 3950: 88 e1 ldi r24, 0x18 ; 24 + 3952: 90 e0 ldi r25, 0x00 ; 0 + 3954: 3f cf rjmp .-386 ; 0x37d4 + } + } + break; + + case STATE_CHINESE_WRITE: + if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { + 3956: 60 e1 ldi r22, 0x10 ; 16 + 3958: 70 e0 ldi r23, 0x00 ; 0 + 395a: 9e d4 rcall .+2364 ; 0x4298 + 395c: 88 23 and r24, r24 + 395e: 09 f4 brne .+2 ; 0x3962 + 3960: 07 c1 rjmp .+526 ; 0x3b70 + /* CRC check passed. Write data into memory and send ACK. */ + if (!ActiveConfiguration.ReadOnly) { + 3962: 80 91 06 29 lds r24, 0x2906 + 3966: 88 23 and r24, r24 + 3968: 09 f4 brne .+2 ; 0x396c + 396a: e0 c1 rjmp .+960 ; 0x3d2c + MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + } + + Buffer[0] = ACK_VALUE; + 396c: 8a e0 ldi r24, 0x0A ; 10 + 396e: f8 01 movw r30, r16 + 3970: 80 83 st Z, r24 + 3972: 01 c1 rjmp .+514 ; 0x3b76 + + case STATE_AUTHING: + /* Reader delivers an encrypted nonce. We use it + * to setup the crypto1 LFSR in nonlinear feedback mode. + * Furthermore it delivers an encrypted answer. Decrypt and check it */ + Crypto1Auth(&Buffer[0]); + 3974: 14 d6 rcall .+3112 ; 0x459e + 3976: 78 01 movw r14, r16 + 3978: b4 e0 ldi r27, 0x04 ; 4 + 397a: eb 0e add r14, r27 + 397c: f1 1c adc r15, r1 + + for (uint8_t i=0; i<4; i++) + 397e: b1 2c mov r11, r1 + Buffer[i+4] ^= Crypto1Byte(); + 3980: f7 01 movw r30, r14 + 3982: a0 80 ld r10, Z + 3984: 31 d6 rcall .+3170 ; 0x45e8 + 3986: 8a 25 eor r24, r10 + 3988: d7 01 movw r26, r14 + 398a: 8d 93 st X+, r24 + 398c: 7d 01 movw r14, r26 + /* Reader delivers an encrypted nonce. We use it + * to setup the crypto1 LFSR in nonlinear feedback mode. + * Furthermore it delivers an encrypted answer. Decrypt and check it */ + Crypto1Auth(&Buffer[0]); + + for (uint8_t i=0; i<4; i++) + 398e: b3 94 inc r11 + 3990: b4 e0 ldi r27, 0x04 ; 4 + 3992: bb 12 cpse r11, r27 + 3994: f5 cf rjmp .-22 ; 0x3980 + Buffer[i+4] ^= Crypto1Byte(); + + if ((Buffer[4] == ReaderResponse[0]) && + 3996: f8 01 movw r30, r16 + 3998: 94 81 ldd r25, Z+4 ; 0x04 + 399a: 80 91 d3 28 lds r24, 0x28D3 + 399e: 98 17 cp r25, r24 + 39a0: 09 f4 brne .+2 ; 0x39a4 + 39a2: 1d c1 rjmp .+570 ; 0x3bde + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + return ACK_NAK_FRAME_SIZE; + } + } else { + /* Unknown command. Enter HALT state */ + State = STATE_IDLE; + 39a4: 81 e0 ldi r24, 0x01 ; 1 + 39a6: 80 93 db 28 sts 0x28DB, r24 + /* Unknown state? Should never happen. */ + break; + } + + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; + 39aa: 80 e0 ldi r24, 0x00 ; 0 + 39ac: 90 e0 ldi r25, 0x00 ; 0 + } else { + /* Unknown command. Enter HALT state */ + State = STATE_IDLE; + } + + break; + 39ae: 12 cf rjmp .-476 ; 0x37d4 + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + 39b0: 6c 01 movw r12, r24 + 39b2: e4 e0 ldi r30, 0x04 ; 4 + 39b4: be 2e mov r11, r30 + + case STATE_AUTHED_IDLE: + /* In this state, all communication is encrypted. Thus we first have to encrypt + * the incoming data. */ + for (uint8_t i=0; i<4; i++) + Buffer[i] ^= Crypto1Byte(); + 39b6: d6 01 movw r26, r12 + 39b8: ac 90 ld r10, X + 39ba: 16 d6 rcall .+3116 ; 0x45e8 + 39bc: 8a 25 eor r24, r10 + 39be: f6 01 movw r30, r12 + 39c0: 81 93 st Z+, r24 + 39c2: 6f 01 movw r12, r30 + 39c4: ba 94 dec r11 + break; + + case STATE_AUTHED_IDLE: + /* In this state, all communication is encrypted. Thus we first have to encrypt + * the incoming data. */ + for (uint8_t i=0; i<4; i++) + 39c6: b9 f7 brne .-18 ; 0x39b6 + Buffer[i] ^= Crypto1Byte(); + + if (Buffer[0] == CMD_READ) { + 39c8: d8 01 movw r26, r16 + 39ca: 8c 91 ld r24, X + 39cc: 80 33 cpi r24, 0x30 ; 48 + 39ce: 09 f4 brne .+2 ; 0x39d2 + 39d0: bc c1 rjmp .+888 ; 0x3d4a + * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); return ACK_NAK_FRAME_SIZE; } } else if (Buffer[0] == CMD_WRITE) { - if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { - 3e6c: 62 e0 ldi r22, 0x02 ; 2 - 3e6e: 70 e0 ldi r23, 0x00 ; 0 - 3e70: c8 01 movw r24, r16 - 3e72: 77 d2 rcall .+1262 ; 0x4362 - 3e74: 88 23 and r24, r24 - 3e76: 81 f0 breq .+32 ; 0x3e98 - /* Write command. Store the address and prepare for the upcoming data. - * Respond with ACK. */ - CurrentAddress = Buffer[1]; - 3e78: d8 01 movw r26, r16 - 3e7a: 11 96 adiw r26, 0x01 ; 1 - 3e7c: 8c 91 ld r24, X - 3e7e: 80 93 c3 28 sts 0x28C3, r24 - State = STATE_WRITE; - 3e82: 89 e0 ldi r24, 0x09 ; 9 - 3e84: 80 93 be 28 sts 0x28BE, r24 - MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); - } else { - /* In read only mode, silently ignore the write */ - } - + 39d2: 80 3a cpi r24, 0xA0 ; 160 + 39d4: 09 f4 brne .+2 ; 0x39d8 + 39d6: f3 c1 rjmp .+998 ; 0x3dbe Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 3e88: 2f d5 rcall .+2654 ; 0x48e8 - 3e8a: 9a e0 ldi r25, 0x0A ; 10 - 3e8c: 98 27 eor r25, r24 - 3e8e: f8 01 movw r30, r16 - 3e90: 90 83 st Z, r25 - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - - return ACK_NAK_FRAME_SIZE; - 3e92: 24 e0 ldi r18, 0x04 ; 4 - 3e94: 30 e0 ldi r19, 0x00 ; 0 - 3e96: 48 cc rjmp .-1904 ; 0x3728 - /* In read only mode, silently ignore the write */ - } - - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 3e98: 27 d5 rcall .+2638 ; 0x48e8 - 3e9a: 91 e0 ldi r25, 0x01 ; 1 - 3e9c: 98 27 eor r25, r24 - 3e9e: d8 01 movw r26, r16 - 3ea0: 9c 93 st X, r25 - } - - return ACK_NAK_FRAME_SIZE; - 3ea2: 24 e0 ldi r18, 0x04 ; 4 - 3ea4: 30 e0 ldi r19, 0x00 ; 0 - 3ea6: 40 cc rjmp .-1920 ; 0x3728 - MemoryReadBlock(&UidCL1[1], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); - UidCL1[0] = ISO14443A_UID0_CT; - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_CL1_VALUE)) - State = STATE_READY2; - } else { - MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 3ea8: 44 e0 ldi r20, 0x04 ; 4 - 3eaa: 50 e0 ldi r21, 0x00 ; 0 - 3eac: 60 e0 ldi r22, 0x00 ; 0 - 3eae: 70 e0 ldi r23, 0x00 ; 0 - 3eb0: ce 01 movw r24, r28 - 3eb2: 01 96 adiw r24, 0x01 ; 1 - 3eb4: 0e 94 de 06 call 0xdbc ; 0xdbc - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) - 3eb8: 90 91 c1 28 lds r25, 0x28C1 - uint8_t* DataPtr = (uint8_t*) Buffer; - uint8_t NVB = DataPtr[1]; - //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; - //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; - - switch (NVB) { - 3ebc: f8 01 movw r30, r16 - 3ebe: 81 81 ldd r24, Z+1 ; 0x01 - 3ec0: 80 32 cpi r24, 0x20 ; 32 - 3ec2: 09 f4 brne .+2 ; 0x3ec6 - 3ec4: 9e c1 rjmp .+828 ; 0x4202 - 3ec6: 80 37 cpi r24, 0x70 ; 112 - 3ec8: 09 f0 breq .+2 ; 0x3ecc - 3eca: 2c cc rjmp .-1960 ; 0x3724 - return false; - - case ISO14443A_NVB_AC_END: - /* End of anticollision procedure. - * Send SAK CLn if we are selected. */ - if ( (DataPtr[2] == UidCL[0]) && - 3ecc: f8 01 movw r30, r16 - 3ece: 22 81 ldd r18, Z+2 ; 0x02 - 3ed0: 89 81 ldd r24, Y+1 ; 0x01 - 3ed2: 28 13 cpse r18, r24 - 3ed4: 27 cc rjmp .-1970 ; 0x3724 - 3ed6: 23 81 ldd r18, Z+3 ; 0x03 - 3ed8: 8a 81 ldd r24, Y+2 ; 0x02 - 3eda: 28 13 cpse r18, r24 - 3edc: 23 cc rjmp .-1978 ; 0x3724 - (DataPtr[3] == UidCL[1]) && - 3ede: 24 81 ldd r18, Z+4 ; 0x04 - 3ee0: 8b 81 ldd r24, Y+3 ; 0x03 - 3ee2: 28 13 cpse r18, r24 - 3ee4: 1f cc rjmp .-1986 ; 0x3724 - (DataPtr[4] == UidCL[2]) && - 3ee6: 25 81 ldd r18, Z+5 ; 0x05 - 3ee8: 8c 81 ldd r24, Y+4 ; 0x04 - 3eea: 28 13 cpse r18, r24 - 3eec: 1b cc rjmp .-1994 ; 0x3724 - (DataPtr[5] == UidCL[3]) ) { - - DataPtr[0] = SAKValue; - 3eee: 90 83 st Z, r25 - 3ef0: b3 cf rjmp .-154 ; 0x3e58 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_DECREMENT) { - if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - 3ef2: 62 e0 ldi r22, 0x02 ; 2 - 3ef4: 70 e0 ldi r23, 0x00 ; 0 - 3ef6: c8 01 movw r24, r16 - 3ef8: 34 d2 rcall .+1128 ; 0x4362 - 3efa: 88 23 and r24, r24 - 3efc: 09 f4 brne .+2 ; 0x3f00 - 3efe: 2d cf rjmp .-422 ; 0x3d5a - CurrentAddress = Buffer[1]; - 3f00: f8 01 movw r30, r16 - 3f02: 81 81 ldd r24, Z+1 ; 0x01 - 3f04: 80 93 c3 28 sts 0x28C3, r24 - State = STATE_DECREMENT; - 3f08: 8b e0 ldi r24, 0x0B ; 11 - 3f0a: 5f ce rjmp .-834 ; 0x3bca - -INLINE bool CheckValueIntegrity(uint8_t* Block) -{ - /* Value Blocks contain a value stored three times, with - * the middle portion inverted. */ - if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) - 3f0c: 80 91 d4 28 lds r24, 0x28D4 - 3f10: 28 13 cpse r18, r24 - 3f12: 1d cf rjmp .-454 ; 0x3d4e - && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) - 3f14: e0 91 cd 28 lds r30, 0x28CD - 3f18: 80 91 d1 28 lds r24, 0x28D1 - 3f1c: 80 95 com r24 - 3f1e: e8 13 cpse r30, r24 - 3f20: 16 cf rjmp .-468 ; 0x3d4e - 3f22: 80 91 d5 28 lds r24, 0x28D5 - 3f26: e8 13 cpse r30, r24 - 3f28: 12 cf rjmp .-476 ; 0x3d4e - && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) - 3f2a: 80 91 ce 28 lds r24, 0x28CE - 3f2e: 90 91 d2 28 lds r25, 0x28D2 - 3f32: 90 95 com r25 - 3f34: 89 13 cpse r24, r25 - 3f36: 0b cf rjmp .-490 ; 0x3d4e - 3f38: 90 91 d6 28 lds r25, 0x28D6 - 3f3c: 89 13 cpse r24, r25 - 3f3e: 07 cf rjmp .-498 ; 0x3d4e - && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) - 3f40: 30 91 cf 28 lds r19, 0x28CF - 3f44: 90 91 d3 28 lds r25, 0x28D3 - 3f48: 90 95 com r25 - 3f4a: 39 13 cpse r19, r25 - 3f4c: 00 cf rjmp .-512 ; 0x3d4e - 3f4e: 90 91 d7 28 lds r25, 0x28D7 - 3f52: 39 13 cpse r19, r25 - 3f54: fc ce rjmp .-520 ; 0x3d4e - && (Block[12] == (uint8_t) ~Block[13]) - 3f56: 40 91 d8 28 lds r20, 0x28D8 - 3f5a: 90 91 d9 28 lds r25, 0x28D9 - 3f5e: 90 95 com r25 - 3f60: 49 13 cpse r20, r25 - 3f62: f5 ce rjmp .-534 ; 0x3d4e - && (Block[12] == Block[14]) - 3f64: 90 91 da 28 lds r25, 0x28DA - 3f68: 49 13 cpse r20, r25 - 3f6a: f1 ce rjmp .-542 ; 0x3d4e - && (Block[14] == (uint8_t) ~Block[15])) { - 3f6c: 90 91 db 28 lds r25, 0x28DB - 3f70: 90 95 com r25 - 3f72: 49 13 cpse r20, r25 - 3f74: ec ce rjmp .-552 ; 0x3d4e -} - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - 3f76: d8 01 movw r26, r16 - 3f78: 9c 91 ld r25, X - *Value |= ((uint32_t) Block[1] << 8); - 3f7a: 11 96 adiw r26, 0x01 ; 1 - 3f7c: fc 91 ld r31, X - 3f7e: 11 97 sbiw r26, 0x01 ; 1 - *Value |= ((uint32_t) Block[2] << 16); - 3f80: 12 96 adiw r26, 0x02 ; 2 - 3f82: 4c 91 ld r20, X - 3f84: 12 97 sbiw r26, 0x02 ; 2 - 3f86: 50 e0 ldi r21, 0x00 ; 0 - 3f88: 60 e0 ldi r22, 0x00 ; 0 - 3f8a: 70 e0 ldi r23, 0x00 ; 0 - 3f8c: ba 01 movw r22, r20 - 3f8e: 55 27 eor r21, r21 - 3f90: 44 27 eor r20, r20 - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - *Value |= ((uint32_t) Block[1] << 8); - 3f92: 5f 2b or r21, r31 - *Value |= ((uint32_t) Block[2] << 16); - 3f94: 49 2b or r20, r25 - *Value |= ((uint32_t) Block[3] << 24); - 3f96: 13 96 adiw r26, 0x03 ; 3 - 3f98: 9c 91 ld r25, X - 3f9a: 79 2b or r23, r25 -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - *Value |= ((uint32_t) Block[1] << 8); - *Value |= ((uint32_t) Block[2] << 16); - 3f9c: 90 e0 ldi r25, 0x00 ; 0 - 3f9e: a0 e0 ldi r26, 0x00 ; 0 - 3fa0: b0 e0 ldi r27, 0x00 ; 0 - 3fa2: dc 01 movw r26, r24 - 3fa4: 99 27 eor r25, r25 - 3fa6: 88 27 eor r24, r24 - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - *Value |= ((uint32_t) Block[1] << 8); - 3fa8: 9e 2b or r25, r30 - *Value |= ((uint32_t) Block[2] << 16); - 3faa: 82 2b or r24, r18 - *Value |= ((uint32_t) Block[3] << 24); - 3fac: b3 2b or r27, r19 - uint32_t BlockValue; - - ValueFromBlock(&ParamValue, Buffer); - ValueFromBlock(&BlockValue, BlockBuffer); - - if (State == STATE_DECREMENT) { - 3fae: 20 91 be 28 lds r18, 0x28BE - 3fb2: 2b 30 cpi r18, 0x0B ; 11 - 3fb4: 09 f4 brne .+2 ; 0x3fb8 - 3fb6: dd c0 rjmp .+442 ; 0x4172 - BlockValue -= ParamValue; - } else if (State == STATE_INCREMENT) { - 3fb8: 2a 30 cpi r18, 0x0A ; 10 - 3fba: 21 f4 brne .+8 ; 0x3fc4 - BlockValue += ParamValue; - 3fbc: 84 0f add r24, r20 - 3fbe: 95 1f adc r25, r21 - 3fc0: a6 1f adc r26, r22 - 3fc2: b7 1f adc r27, r23 - *Value |= ((uint32_t) Block[3] << 24); -} - -INLINE void ValueToBlock(uint8_t* Block, uint32_t Value) -{ - Block[0] = (uint8_t) (Value >> 0); - 3fc4: 80 93 cc 28 sts 0x28CC, r24 - Block[1] = (uint8_t) (Value >> 8); - 3fc8: c9 2e mov r12, r25 - 3fca: da 2e mov r13, r26 - 3fcc: eb 2e mov r14, r27 - 3fce: ff 24 eor r15, r15 - 3fd0: c0 92 cd 28 sts 0x28CD, r12 - Block[2] = (uint8_t) (Value >> 16); - 3fd4: 8d 01 movw r16, r26 - 3fd6: 22 27 eor r18, r18 - 3fd8: 33 27 eor r19, r19 - 3fda: 00 93 ce 28 sts 0x28CE, r16 - Block[3] = (uint8_t) (Value >> 24); - 3fde: 4b 2f mov r20, r27 - 3fe0: 55 27 eor r21, r21 - 3fe2: 66 27 eor r22, r22 - 3fe4: 77 27 eor r23, r23 - 3fe6: 40 93 cf 28 sts 0x28CF, r20 - Block[4] = ~Block[0]; - 3fea: e8 2f mov r30, r24 - 3fec: e0 95 com r30 - 3fee: e0 93 d0 28 sts 0x28D0, r30 - Block[5] = ~Block[1]; - 3ff2: ec 2d mov r30, r12 - 3ff4: e0 95 com r30 - 3ff6: e0 93 d1 28 sts 0x28D1, r30 - Block[6] = ~Block[2]; - 3ffa: e0 2f mov r30, r16 - 3ffc: e0 95 com r30 - 3ffe: e0 93 d2 28 sts 0x28D2, r30 - Block[7] = ~Block[3]; - 4002: e4 2f mov r30, r20 - 4004: e0 95 com r30 - 4006: e0 93 d3 28 sts 0x28D3, r30 - Block[8] = Block[0]; - 400a: 80 93 d4 28 sts 0x28D4, r24 - Block[9] = Block[1]; - 400e: c0 92 d5 28 sts 0x28D5, r12 - Block[10] = Block[2]; - 4012: 00 93 d6 28 sts 0x28D6, r16 - Block[11] = Block[3]; - 4016: 40 93 d7 28 sts 0x28D7, r20 - /* Do nothing */ - } - - ValueToBlock(BlockBuffer, BlockValue); - - State = STATE_AUTHED_IDLE; - 401a: 88 e0 ldi r24, 0x08 ; 8 - 401c: 80 93 be 28 sts 0x28BE, r24 - /* No ACK response on value commands part 2 */ - return ISO14443A_APP_NO_RESPONSE; - 4020: 20 e0 ldi r18, 0x00 ; 0 - 4022: 30 e0 ldi r19, 0x00 ; 0 - 4024: 81 cb rjmp .-2302 ; 0x3728 + 39d8: 80 3c cpi r24, 0xC0 ; 192 + 39da: 09 f4 brne .+2 ; 0x39de + 39dc: 30 c2 rjmp .+1120 ; 0x3e3e + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_INCREMENT) { - if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - 4026: 62 e0 ldi r22, 0x02 ; 2 - 4028: 70 e0 ldi r23, 0x00 ; 0 - 402a: c8 01 movw r24, r16 - 402c: 9a d1 rcall .+820 ; 0x4362 - 402e: 88 23 and r24, r24 - 4030: 09 f4 brne .+2 ; 0x4034 - 4032: 32 cf rjmp .-412 ; 0x3e98 - CurrentAddress = Buffer[1]; - 4034: d8 01 movw r26, r16 - 4036: 11 96 adiw r26, 0x01 ; 1 - 4038: 8c 91 ld r24, X - 403a: 80 93 c3 28 sts 0x28C3, r24 - State = STATE_INCREMENT; - 403e: 5a e0 ldi r21, 0x0A ; 10 - 4040: f5 2e mov r15, r21 - 4042: f0 92 be 28 sts 0x28BE, r15 + 39de: 81 3c cpi r24, 0xC1 ; 193 + 39e0: 09 f4 brne .+2 ; 0x39e4 + 39e2: c7 c2 rjmp .+1422 ; 0x3f72 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 4046: 50 d4 rcall .+2208 ; 0x48e8 - 4048: 8f 25 eor r24, r15 - 404a: f8 01 movw r30, r16 - 404c: 80 83 st Z, r24 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; - 404e: 24 e0 ldi r18, 0x04 ; 4 - 4050: 30 e0 ldi r19, 0x00 ; 0 - 4052: 6a cb rjmp .-2348 ; 0x3728 + } else if (Buffer[0] == CMD_RESTORE) { + 39e4: 82 3c cpi r24, 0xC2 ; 194 + 39e6: 09 f4 brne .+2 ; 0x39ea + 39e8: d8 c0 rjmp .+432 ; 0x3b9a + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; }else if (Buffer[0] == CMD_TRANSFER) { - /* Write back the global block buffer to the desired block address */ - if (ISO14443ACheckCRCA(Buffer, CMD_TRANSFER_FRAME_SIZE)) { - 4054: 62 e0 ldi r22, 0x02 ; 2 - 4056: 70 e0 ldi r23, 0x00 ; 0 - 4058: c8 01 movw r24, r16 - 405a: 83 d1 rcall .+774 ; 0x4362 - 405c: 88 23 and r24, r24 - 405e: 09 f4 brne .+2 ; 0x4062 - 4060: 1b cf rjmp .-458 ; 0x3e98 - if (!ActiveConfiguration.ReadOnly) { - 4062: 80 91 06 29 lds r24, 0x2906 - 4066: 81 11 cpse r24, r1 - 4068: 0f cf rjmp .-482 ; 0x3e88 - MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); - 406a: d8 01 movw r26, r16 - 406c: 11 96 adiw r26, 0x01 ; 1 - 406e: 6c 91 ld r22, X - 4070: b0 e1 ldi r27, 0x10 ; 16 - 4072: 6b 9f mul r22, r27 - 4074: b0 01 movw r22, r0 - 4076: 11 24 eor r1, r1 - 4078: 40 e1 ldi r20, 0x10 ; 16 - 407a: 50 e0 ldi r21, 0x00 ; 0 - 407c: 8c ec ldi r24, 0xCC ; 204 - 407e: 98 e2 ldi r25, 0x28 ; 40 - 4080: 0e 94 f6 06 call 0xdec ; 0xdec - 4084: 01 cf rjmp .-510 ; 0x3e88 + 39ea: 80 3b cpi r24, 0xB0 ; 176 + 39ec: 09 f4 brne .+2 ; 0x39f0 + 39ee: d8 c2 rjmp .+1456 ; 0x3fa0 } else { - Buffer[0] = NAK_INVALID_ARG; - return ACK_NAK_FRAME_SIZE; + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } - } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + + return ACK_NAK_FRAME_SIZE; + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { + 39f0: 80 56 subi r24, 0x60 ; 96 + 39f2: 82 30 cpi r24, 0x02 ; 2 + 39f4: b8 f6 brcc .-82 ; 0x39a4 if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - 4086: 62 e0 ldi r22, 0x02 ; 2 - 4088: 70 e0 ldi r23, 0x00 ; 0 - 408a: c8 01 movw r24, r16 - 408c: 6a d1 rcall .+724 ; 0x4362 - 408e: 88 23 and r24, r24 - 4090: 09 f4 brne .+2 ; 0x4094 - 4092: d1 c0 rjmp .+418 ; 0x4236 + 39f6: 62 e0 ldi r22, 0x02 ; 2 + 39f8: 70 e0 ldi r23, 0x00 ; 0 + 39fa: c8 01 movw r24, r16 + 39fc: 4d d4 rcall .+2202 ; 0x4298 + 39fe: 88 23 and r24, r24 + 3a00: 09 f4 brne .+2 ; 0x3a04 + 3a02: a0 c1 rjmp .+832 ; 0x3d44 + /* Nested authentication. */ uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 4094: d8 01 movw r26, r16 - 4096: 11 96 adiw r26, 0x01 ; 1 - 4098: 2c 91 ld r18, X - 409a: 11 97 sbiw r26, 0x01 ; 1 - 409c: 2c 73 andi r18, 0x3C ; 60 + 3a04: f8 01 movw r30, r16 + 3a06: 81 81 ldd r24, Z+1 ; 0x01 + 3a08: 8c 73 andi r24, 0x3C ; 60 uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 409e: 8c 91 ld r24, X - 40a0: 80 36 cpi r24, 0x60 ; 96 - 40a2: 09 f4 brne .+2 ; 0x40a6 - 40a4: dc c0 rjmp .+440 ; 0x425e - 40a6: 8a e3 ldi r24, 0x3A ; 58 - 40a8: 90 e0 ldi r25, 0x00 ; 0 + 3a0a: 90 81 ld r25, Z + 3a0c: 90 36 cpi r25, 0x60 ; 96 + 3a0e: 09 f4 brne .+2 ; 0x3a12 + 3a10: a1 c3 rjmp .+1858 ; 0x4154 + 3a12: 6a e3 ldi r22, 0x3A ; 58 + 3a14: 70 e0 ldi r23, 0x00 ; 0 uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 40aa: 5c 01 movw r10, r24 - 40ac: b0 e1 ldi r27, 0x10 ; 16 - 40ae: 2b 9f mul r18, r27 - 40b0: a0 0c add r10, r0 - 40b2: b1 1c adc r11, r1 - 40b4: 11 24 eor r1, r1 + 3a16: 7b 01 movw r14, r22 + 3a18: f0 e1 ldi r31, 0x10 ; 16 + 3a1a: 8f 9f mul r24, r31 + 3a1c: e0 0c add r14, r0 + 3a1e: f1 1c adc r15, r1 + 3a20: 11 24 eor r1, r1 uint8_t Key[6]; uint8_t Uid[4]; uint8_t CardNonce[4]; /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); - 40b6: 6e 01 movw r12, r28 - 40b8: e7 e0 ldi r30, 0x07 ; 7 - 40ba: ce 0e add r12, r30 - 40bc: d1 1c adc r13, r1 - 40be: 64 e0 ldi r22, 0x04 ; 4 - 40c0: c6 01 movw r24, r12 - 40c2: 0e 94 3f 06 call 0xc7e ; 0xc7e + 3a22: 4e 01 movw r8, r28 + 3a24: 37 e0 ldi r19, 0x07 ; 7 + 3a26: 83 0e add r8, r19 + 3a28: 91 1c adc r9, r1 + 3a2a: 64 e0 ldi r22, 0x04 ; 4 + 3a2c: c4 01 movw r24, r8 + 3a2e: 0e 94 bd 06 call 0xd7a ; 0xd7a if (_7BUID) - 40c6: 80 91 c2 28 lds r24, 0x28C2 + 3a32: 80 91 be 28 lds r24, 0x28BE MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 40ca: 7e 01 movw r14, r28 + 3a36: 5e 01 movw r10, r28 uint8_t Uid[4]; uint8_t CardNonce[4]; /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); if (_7BUID) - 40cc: 88 23 and r24, r24 - 40ce: 09 f4 brne .+2 ; 0x40d2 - 40d0: b8 c0 rjmp .+368 ; 0x4242 + 3a38: 88 23 and r24, r24 + 3a3a: 09 f4 brne .+2 ; 0x3a3e + 3a3c: 80 c3 rjmp .+1792 ; 0x413e MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 40d2: fb e0 ldi r31, 0x0B ; 11 - 40d4: ef 0e add r14, r31 - 40d6: f1 1c adc r15, r1 - 40d8: 44 e0 ldi r20, 0x04 ; 4 - 40da: 50 e0 ldi r21, 0x00 ; 0 - 40dc: 63 e0 ldi r22, 0x03 ; 3 - 40de: 70 e0 ldi r23, 0x00 ; 0 - 40e0: c7 01 movw r24, r14 - 40e2: 0e 94 de 06 call 0xdbc ; 0xdbc + 3a3e: 8b e0 ldi r24, 0x0B ; 11 + 3a40: a8 0e add r10, r24 + 3a42: b1 1c adc r11, r1 + 3a44: 44 e0 ldi r20, 0x04 ; 4 + 3a46: 50 e0 ldi r21, 0x00 ; 0 + 3a48: 63 e0 ldi r22, 0x03 ; 3 + 3a4a: 70 e0 ldi r23, 0x00 ; 0 + 3a4c: c5 01 movw r24, r10 + 3a4e: 0e 94 62 07 call 0xec4 ; 0xec4 else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 40e6: 46 e0 ldi r20, 0x06 ; 6 - 40e8: 50 e0 ldi r21, 0x00 ; 0 - 40ea: b5 01 movw r22, r10 - 40ec: ce 01 movw r24, r28 - 40ee: 01 96 adiw r24, 0x01 ; 1 - 40f0: 0e 94 de 06 call 0xdbc ; 0xdbc + 3a52: 46 e0 ldi r20, 0x06 ; 6 + 3a54: 50 e0 ldi r21, 0x00 ; 0 + 3a56: b7 01 movw r22, r14 + 3a58: ce 01 movw r24, r28 + 3a5a: 01 96 adiw r24, 0x01 ; 1 + 3a5c: 0e 94 62 07 call 0xec4 ; 0xec4 + 3a60: 8f 81 ldd r24, Y+7 ; 0x07 + 3a62: 98 85 ldd r25, Y+8 ; 0x08 + 3a64: a9 85 ldd r26, Y+9 ; 0x09 + 3a66: ba 85 ldd r27, Y+10 ; 0x0a + 3a68: 80 93 d3 28 sts 0x28D3, r24 + 3a6c: 90 93 d4 28 sts 0x28D4, r25 + 3a70: a0 93 d5 28 sts 0x28D5, r26 + 3a74: b0 93 d6 28 sts 0x28D6, r27 /* Precalculate the reader response from card-nonce */ for (uint8_t i=0; i + 3a78: 60 e4 ldi r22, 0x40 ; 64 + 3a7a: 70 e0 ldi r23, 0x00 ; 0 + 3a7c: 83 ed ldi r24, 0xD3 ; 211 + 3a7e: 98 e2 ldi r25, 0x28 ; 40 + 3a80: d9 d5 rcall .+2994 ; 0x4634 + 3a82: c0 90 d3 28 lds r12, 0x28D3 + 3a86: d0 90 d4 28 lds r13, 0x28D4 + 3a8a: e0 90 d5 28 lds r14, 0x28D5 + 3a8e: f0 90 d6 28 lds r15, 0x28D6 + 3a92: c0 92 d7 28 sts 0x28D7, r12 + 3a96: d0 92 d8 28 sts 0x28D8, r13 + 3a9a: e0 92 d9 28 sts 0x28D9, r14 + 3a9e: f0 92 da 28 sts 0x28DA, r15 /* Precalculate our response from the reader response */ for (uint8_t i=0; i - - /* Respond with the random card nonce and expect further authentication - * form the reader in the next frame. */ - State = STATE_AUTHING; - 4140: 87 e0 ldi r24, 0x07 ; 7 - 4142: 80 93 be 28 sts 0x28BE, r24 + 3aa2: 60 e2 ldi r22, 0x20 ; 32 + 3aa4: 70 e0 ldi r23, 0x00 ; 0 + 3aa6: 87 ed ldi r24, 0xD7 ; 215 + 3aa8: 98 e2 ldi r25, 0x28 ; 40 + 3aaa: c4 d5 rcall .+2952 ; 0x4634 + /* Setup crypto1 cipher. */ + Crypto1Setup(Key, Uid, CardNonce); + 3aac: a4 01 movw r20, r8 + 3aae: b5 01 movw r22, r10 + 3ab0: ce 01 movw r24, r28 + 3ab2: 01 96 adiw r24, 0x01 ; 1 + 3ab4: a7 d4 rcall .+2382 ; 0x4404 + 3ab6: 8f 81 ldd r24, Y+7 ; 0x07 + 3ab8: 98 85 ldd r25, Y+8 ; 0x08 + 3aba: a9 85 ldd r26, Y+9 ; 0x09 + 3abc: ba 85 ldd r27, Y+10 ; 0x0a + 3abe: f8 01 movw r30, r16 + 3ac0: 80 83 st Z, r24 + 3ac2: 91 83 std Z+1, r25 ; 0x01 + 3ac4: a2 83 std Z+2, r26 ; 0x02 + 3ac6: b3 83 std Z+3, r27 ; 0x03 for (uint8_t i=0; i + /* Respond with the encrypted random card nonce and expect further authentication + * form the reader in the next frame. */ + State = STATE_AUTHING; + 3ac8: 87 e0 ldi r24, 0x07 ; 7 + 3aca: 80 93 db 28 sts 0x28DB, r24 return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - 416c: 20 e2 ldi r18, 0x20 ; 32 - 416e: 30 e0 ldi r19, 0x00 ; 0 - 4170: db ca rjmp .-2634 ; 0x3728 + 3ace: 80 e2 ldi r24, 0x20 ; 32 + 3ad0: 90 e0 ldi r25, 0x00 ; 0 + 3ad2: 80 ce rjmp .-768 ; 0x37d4 + State = STATE_HALT; + } + break; - ValueFromBlock(&ParamValue, Buffer); - ValueFromBlock(&BlockValue, BlockBuffer); + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + 3ad4: 20 91 c0 28 lds r18, 0x28C0 + 3ad8: 90 91 c1 28 lds r25, 0x28C1 +INLINE +bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; - if (State == STATE_DECREMENT) { - BlockValue -= ParamValue; - 4172: 84 1b sub r24, r20 - 4174: 95 0b sbc r25, r21 - 4176: a6 0b sbc r26, r22 - 4178: b7 0b sbc r27, r23 - 417a: 24 cf rjmp .-440 ; 0x3fc4 + if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ + 3adc: d8 01 movw r26, r16 + 3ade: 8c 91 ld r24, X + 3ae0: 86 32 cpi r24, 0x26 ; 38 + 3ae2: 71 f1 breq .+92 ; 0x3b40 + 3ae4: 82 35 cpi r24, 0x52 ; 82 + 3ae6: 61 f1 breq .+88 ; 0x3b40 + State = STATE_READY1; return BitCount; } else if (Buffer[0] == CMD_HALT) { - /* Halts the tag. According to the ISO14443, the second - * byte is supposed to be 0. */ - if (Buffer[1] == 0) { - if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { - 417c: 62 e0 ldi r22, 0x02 ; 2 - 417e: 70 e0 ldi r23, 0x00 ; 0 - 4180: c8 01 movw r24, r16 - 4182: ef d0 rcall .+478 ; 0x4362 - 4184: 81 11 cpse r24, r1 - 4186: ec cc rjmp .-1576 ; 0x3b60 - /* According to ISO14443, we must not send anything - * in order to acknowledge the HALT command. */ - State = STATE_HALT; - return ISO14443A_APP_NO_RESPONSE; - } else { - Buffer[0] = NAK_CRC_ERROR; - 4188: 81 e0 ldi r24, 0x01 ; 1 - 418a: d8 01 movw r26, r16 - 418c: 8c 93 st X, r24 - return ACK_NAK_FRAME_SIZE; - 418e: 24 e0 ldi r18, 0x04 ; 4 - 4190: 30 e0 ldi r19, 0x00 ; 0 - 4192: ca ca rjmp .-2668 ; 0x3728 + 3ae8: 80 35 cpi r24, 0x50 ; 80 + 3aea: 09 f4 brne .+2 ; 0x3aee + 3aec: 12 c1 rjmp .+548 ; 0x3d12 + } + } else { + Buffer[0] = NAK_INVALID_ARG; + return ACK_NAK_FRAME_SIZE; + } + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + 3aee: 90 ea ldi r25, 0xA0 ; 160 + 3af0: 98 0f add r25, r24 + 3af2: 92 30 cpi r25, 0x02 ; 2 + 3af4: 08 f4 brcc .+2 ; 0x3af8 + 3af6: 6d c2 rjmp .+1242 ; 0x3fd2 + return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else if ( (Buffer[0] == CMD_READ) || (Buffer[0] == CMD_WRITE) || (Buffer[0] == CMD_DECREMENT) + 3af8: 98 2f mov r25, r24 + 3afa: 9f 77 andi r25, 0x7F ; 127 + 3afc: 90 33 cpi r25, 0x30 ; 48 + 3afe: 31 f0 breq .+12 ; 0x3b0c + 3b00: 80 3a cpi r24, 0xA0 ; 160 + 3b02: 21 f0 breq .+8 ; 0x3b0c + 3b04: 80 5c subi r24, 0xC0 ; 192 + 3b06: 83 30 cpi r24, 0x03 ; 3 + 3b08: 08 f0 brcs .+2 ; 0x3b0c + 3b0a: 4c cf rjmp .-360 ; 0x39a4 + || (Buffer[0] == CMD_INCREMENT) || (Buffer[0] == CMD_RESTORE) || (Buffer[0] == CMD_TRANSFER) ) { + State = STATE_IDLE; + 3b0c: 81 e0 ldi r24, 0x01 ; 1 + 3b0e: 80 93 db 28 sts 0x28DB, r24 + Buffer[0] = NAK_NOT_AUTHED; + 3b12: 84 e0 ldi r24, 0x04 ; 4 + 3b14: d8 01 movw r26, r16 + 3b16: 8c 93 st X, r24 + return ACK_NAK_FRAME_SIZE; + 3b18: 90 e0 ldi r25, 0x00 ; 0 + 3b1a: 5c ce rjmp .-840 ; 0x37d4 + + return ACK_NAK_FRAME_SIZE; +#endif + + case STATE_READY1: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + 3b1c: 20 91 c0 28 lds r18, 0x28C0 + 3b20: 90 91 c1 28 lds r25, 0x28C1 + 3b24: f8 01 movw r30, r16 + 3b26: 80 81 ld r24, Z + 3b28: 86 32 cpi r24, 0x26 ; 38 + 3b2a: 99 f0 breq .+38 ; 0x3b52 + 3b2c: 82 35 cpi r24, 0x52 ; 82 + 3b2e: 89 f0 breq .+34 ; 0x3b52 + State = STATE_READY1; + return BitCount; + } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { + 3b30: 83 39 cpi r24, 0x93 ; 147 + 3b32: 09 f4 brne .+2 ; 0x3b36 + 3b34: b2 c0 rjmp .+356 ; 0x3c9a + } + + return BitCount; + } else { + /* Unknown command. Enter HALT state. */ + State = STATE_HALT; + 3b36: 10 92 db 28 sts 0x28DB, r1 + /* Unknown state? Should never happen. */ + break; + } + + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; + 3b3a: 80 e0 ldi r24, 0x00 ; 0 + 3b3c: 90 e0 ldi r25, 0x00 ; 0 + return BitCount; + } else { + /* Unknown command. Enter HALT state. */ + State = STATE_HALT; + } + break; + 3b3e: 4a ce rjmp .-876 ; 0x37d4 + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + 3b40: f8 01 movw r30, r16 + 3b42: 20 83 st Z, r18 + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + 3b44: 91 83 std Z+1, r25 ; 0x01 + } + break; + + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + State = STATE_READY1; + 3b46: 84 e0 ldi r24, 0x04 ; 4 + 3b48: 80 93 db 28 sts 0x28DB, r24 + + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + 3b4c: 80 e1 ldi r24, 0x10 ; 16 + 3b4e: 90 e0 ldi r25, 0x00 ; 0 + return BitCount; + 3b50: 41 ce rjmp .-894 ; 0x37d4 +bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + + if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + 3b52: d8 01 movw r26, r16 + 3b54: 2c 93 st X, r18 + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + 3b56: 11 96 adiw r26, 0x01 ; 1 + 3b58: 9c 93 st X, r25 + } + break; + + case STATE_READY2: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + State = STATE_READY1; + 3b5a: 84 e0 ldi r24, 0x04 ; 4 + 3b5c: 80 93 db 28 sts 0x28DB, r24 + + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + 3b60: 80 e1 ldi r24, 0x10 ; 16 + 3b62: 90 e0 ldi r25, 0x00 ; 0 + return BitCount; + 3b64: 37 ce rjmp .-914 ; 0x37d4 +#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE + case STATE_CHINESE_IDLE: + /* Support special china commands that dont require authentication. */ + if (Buffer[0] == CMD_CHINESE_UNLOCK_RW) { + /* Unlock read and write commands */ + Buffer[0] = ACK_VALUE; + 3b66: 8a e0 ldi r24, 0x0A ; 10 + 3b68: 80 83 st Z, r24 + return ACK_NAK_FRAME_SIZE; + 3b6a: 84 e0 ldi r24, 0x04 ; 4 + 3b6c: 90 e0 ldi r25, 0x00 ; 0 + 3b6e: 32 ce rjmp .-924 ; 0x37d4 + } + + Buffer[0] = ACK_VALUE; + } else { + /* CRC Error. */ + Buffer[0] = NAK_CRC_ERROR; + 3b70: 81 e0 ldi r24, 0x01 ; 1 + 3b72: d8 01 movw r26, r16 + 3b74: 8c 93 st X, r24 + } + + State = STATE_CHINESE_IDLE; + 3b76: 82 e0 ldi r24, 0x02 ; 2 + 3b78: 80 93 db 28 sts 0x28DB, r24 + + return ACK_NAK_FRAME_SIZE; + 3b7c: 84 e0 ldi r24, 0x04 ; 4 + 3b7e: 90 e0 ldi r25, 0x00 ; 0 + 3b80: 29 ce rjmp .-942 ; 0x37d4 + for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) + Buffer[i] ^= Crypto1Byte(); + + if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + 3b82: 60 91 d2 28 lds r22, 0x28D2 + 3b86: e0 e1 ldi r30, 0x10 ; 16 + 3b88: 6e 9f mul r22, r30 + 3b8a: b0 01 movw r22, r0 + 3b8c: 11 24 eor r1, r1 + 3b8e: 40 e1 ldi r20, 0x10 ; 16 + 3b90: 50 e0 ldi r21, 0x00 ; 0 + 3b92: c8 01 movw r24, r16 + 3b94: 0e 94 7a 07 call 0xef4 ; 0xef4 + 3b98: 4c ce rjmp .-872 ; 0x3832 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_RESTORE) { + if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { + 3b9a: 62 e0 ldi r22, 0x02 ; 2 + 3b9c: 70 e0 ldi r23, 0x00 ; 0 + 3b9e: c8 01 movw r24, r16 + 3ba0: 7b d3 rcall .+1782 ; 0x4298 + 3ba2: 88 23 and r24, r24 + 3ba4: 09 f4 brne .+2 ; 0x3ba8 + 3ba6: ad c0 rjmp .+346 ; 0x3d02 + CurrentAddress = Buffer[1]; + 3ba8: f8 01 movw r30, r16 + 3baa: 81 81 ldd r24, Z+1 ; 0x01 + 3bac: 80 93 d2 28 sts 0x28D2, r24 + State = STATE_RESTORE; + 3bb0: 8c e0 ldi r24, 0x0C ; 12 + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_DECREMENT) { + if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { + CurrentAddress = Buffer[1]; + State = STATE_DECREMENT; + 3bb2: 80 93 db 28 sts 0x28DB, r24 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 3bb6: 2b d5 rcall .+2646 ; 0x460e + 3bb8: 9a e0 ldi r25, 0x0A ; 10 + 3bba: 98 27 eor r25, r24 + 3bbc: d8 01 movw r26, r16 + 3bbe: 9c 93 st X, r25 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + 3bc0: 84 e0 ldi r24, 0x04 ; 4 + 3bc2: 90 e0 ldi r25, 0x00 ; 0 + 3bc4: 07 ce rjmp .-1010 ; 0x37d4 } else if (Buffer[0] == CMD_CHINESE_WIPE) { /* Wipe memory */ Buffer[0] = ACK_VALUE; return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_READ) { if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { - 4194: 62 e0 ldi r22, 0x02 ; 2 - 4196: 70 e0 ldi r23, 0x00 ; 0 - 4198: c8 01 movw r24, r16 - 419a: e3 d0 rcall .+454 ; 0x4362 - 419c: 88 23 and r24, r24 - 419e: a1 f3 breq .-24 ; 0x4188 - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 41a0: f8 01 movw r30, r16 - 41a2: 61 81 ldd r22, Z+1 ; 0x01 - 41a4: f0 e1 ldi r31, 0x10 ; 16 - 41a6: 6f 9f mul r22, r31 - 41a8: b0 01 movw r22, r0 - 41aa: 11 24 eor r1, r1 - 41ac: 40 e1 ldi r20, 0x10 ; 16 - 41ae: 50 e0 ldi r21, 0x00 ; 0 - 41b0: c8 01 movw r24, r16 - 41b2: 0e 94 de 06 call 0xdbc ; 0xdbc + 3bc6: 62 e0 ldi r22, 0x02 ; 2 + 3bc8: 70 e0 ldi r23, 0x00 ; 0 + 3bca: c8 01 movw r24, r16 + 3bcc: 65 d3 rcall .+1738 ; 0x4298 + 3bce: 81 11 cpse r24, r1 + 3bd0: cf c2 rjmp .+1438 ; 0x4170 ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - 41b6: 60 e1 ldi r22, 0x10 ; 16 - 41b8: 70 e0 ldi r23, 0x00 ; 0 - 41ba: c8 01 movw r24, r16 - 41bc: a3 d0 rcall .+326 ; 0x4304 return (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) - 41be: 20 e9 ldi r18, 0x90 ; 144 - 41c0: 30 e0 ldi r19, 0x00 ; 0 - 41c2: b2 ca rjmp .-2716 ; 0x3728 + * BITS_PER_BYTE; + } else { + Buffer[0] = NAK_CRC_ERROR; + 3bd2: 81 e0 ldi r24, 0x01 ; 1 + 3bd4: f8 01 movw r30, r16 + 3bd6: 80 83 st Z, r24 + return ACK_NAK_FRAME_SIZE; + 3bd8: 84 e0 ldi r24, 0x04 ; 4 + 3bda: 90 e0 ldi r25, 0x00 ; 0 + 3bdc: fb cd rjmp .-1034 ; 0x37d4 + Crypto1Auth(&Buffer[0]); + + for (uint8_t i=0; i<4; i++) + Buffer[i+4] ^= Crypto1Byte(); + + if ((Buffer[4] == ReaderResponse[0]) && + 3bde: 95 81 ldd r25, Z+5 ; 0x05 + 3be0: 80 91 d4 28 lds r24, 0x28D4 + 3be4: 98 13 cpse r25, r24 + 3be6: de ce rjmp .-580 ; 0x39a4 + (Buffer[5] == ReaderResponse[1]) && + 3be8: 96 81 ldd r25, Z+6 ; 0x06 + 3bea: 80 91 d5 28 lds r24, 0x28D5 + 3bee: 98 13 cpse r25, r24 + 3bf0: d9 ce rjmp .-590 ; 0x39a4 + (Buffer[6] == ReaderResponse[2]) && + 3bf2: 97 81 ldd r25, Z+7 ; 0x07 + 3bf4: 80 91 d6 28 lds r24, 0x28D6 + 3bf8: 98 13 cpse r25, r24 + 3bfa: d4 ce rjmp .-600 ; 0x39a4 + 3bfc: 78 01 movw r14, r16 + 3bfe: 07 ed ldi r16, 0xD7 ; 215 + 3c00: 18 e2 ldi r17, 0x28 ; 40 + 3c02: 5f 01 movw r10, r30 + 3c04: f0 e8 ldi r31, 0x80 ; 128 + 3c06: af 0e add r10, r31 + 3c08: b1 1c adc r11, r1 + 3c0a: 48 01 movw r8, r16 + (Buffer[7] == ReaderResponse[3])) { + /* Reader is authenticated. Encrypt the precalculated card response + * and generate the parity bits. */ + for (uint8_t i=0; i + 3c14: 87 25 eor r24, r7 + 3c16: f7 01 movw r30, r14 + 3c18: 81 93 st Z+, r24 + 3c1a: 7f 01 movw r14, r30 + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); + 3c1c: d4 01 movw r26, r8 + 3c1e: 9c 90 ld r9, X + 3c20: 09 2c mov r0, r9 + 3c22: 92 94 swap r9 + 3c24: 90 24 eor r9, r0 + 3c26: 09 2c mov r0, r9 + 3c28: 96 94 lsr r9 + 3c2a: 96 94 lsr r9 + 3c2c: 90 24 eor r9, r0 + 3c2e: b8 d3 rcall .+1904 ; 0x43a0 + 3c30: 93 94 inc r9 + 3c32: 91 fa bst r9, 1 + 3c34: cc 24 eor r12, r12 + 3c36: c0 f8 bld r12, 0 + 3c38: d1 2c mov r13, r1 + 3c3a: b1 e0 ldi r27, 0x01 ; 1 + 3c3c: cb 26 eor r12, r27 + 3c3e: 8c 25 eor r24, r12 + 3c40: f5 01 movw r30, r10 + 3c42: 81 93 st Z+, r24 + 3c44: 5f 01 movw r10, r30 + (Buffer[5] == ReaderResponse[1]) && + (Buffer[6] == ReaderResponse[2]) && + (Buffer[7] == ReaderResponse[3])) { + /* Reader is authenticated. Encrypt the precalculated card response + * and generate the parity bits. */ + for (uint8_t i=0; i + Buffer[i] = CardResponse[i] ^ Crypto1Byte(); + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); + } + + State = STATE_AUTHED_IDLE; + 3c4e: 88 e0 ldi r24, 0x08 ; 8 + 3c50: 80 93 db 28 sts 0x28DB, r24 + + return (CMD_AUTH_BA_FRAME_SIZE * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; + 3c54: 80 e2 ldi r24, 0x20 ; 32 + 3c56: 90 e1 ldi r25, 0x10 ; 16 + 3c58: bd cd rjmp .-1158 ; 0x37d4 + * the block back into the global block buffer. */ + for (uint8_t i=0; i<(MEM_VALUE_SIZE + ISO14443A_CRCA_SIZE); i++) + Buffer[i] ^= Crypto1Byte(); + + if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { + MemoryReadBlock(BlockBuffer, (uint16_t) CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + 3c5a: 60 91 d2 28 lds r22, 0x28D2 + 3c5e: f0 e1 ldi r31, 0x10 ; 16 + 3c60: 6f 9f mul r22, r31 + 3c62: b0 01 movw r22, r0 + 3c64: 11 24 eor r1, r1 + 3c66: 40 e1 ldi r20, 0x10 ; 16 + 3c68: 50 e0 ldi r21, 0x00 ; 0 + 3c6a: 82 ec ldi r24, 0xC2 ; 194 + 3c6c: 98 e2 ldi r25, 0x28 ; 40 + 3c6e: 0e 94 62 07 call 0xec4 ; 0xec4 + +INLINE bool CheckValueIntegrity(uint8_t* Block) +{ + /* Value Blocks contain a value stored three times, with + * the middle portion inverted. */ + if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) + 3c72: 20 91 c2 28 lds r18, 0x28C2 + 3c76: 80 91 c6 28 lds r24, 0x28C6 + 3c7a: 80 95 com r24 + 3c7c: 28 17 cp r18, r24 + 3c7e: 09 f4 brne .+2 ; 0x3c82 + 3c80: eb c0 rjmp .+470 ; 0x3e58 + State = STATE_AUTHED_IDLE; + /* No ACK response on value commands part 2 */ + return ISO14443A_APP_NO_RESPONSE; + } else { + /* Not sure if this is the correct error code.. */ + Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); + 3c82: c5 d4 rcall .+2442 ; 0x460e + 3c84: 96 e0 ldi r25, 0x06 ; 6 + 3c86: 98 27 eor r25, r24 + 3c88: f8 01 movw r30, r16 + 3c8a: 90 83 st Z, r25 + 3c8c: ef cd rjmp .-1058 ; 0x386c + /* Silently ignore in ReadOnly mode */ + } + + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 3c8e: bf d4 rcall .+2430 ; 0x460e + 3c90: 91 e0 ldi r25, 0x01 ; 1 + 3c92: 98 27 eor r25, r24 + 3c94: f8 01 movw r30, r16 + 3c96: 90 83 st Z, r25 + 3c98: e9 cd rjmp .-1070 ; 0x386c + return BitCount; + } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { + /* Load UID CL1 and perform anticollision */ + uint8_t UidCL1[ISO14443A_CL_UID_SIZE]; + + if (_7BUID) { + 3c9a: 80 91 be 28 lds r24, 0x28BE + 3c9e: 88 23 and r24, r24 + 3ca0: 09 f4 brne .+2 ; 0x3ca4 + 3ca2: 9f c0 rjmp .+318 ; 0x3de2 + MemoryReadBlock(&UidCL1[1], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); + 3ca4: 43 e0 ldi r20, 0x03 ; 3 + 3ca6: 50 e0 ldi r21, 0x00 ; 0 + 3ca8: 60 e0 ldi r22, 0x00 ; 0 + 3caa: 70 e0 ldi r23, 0x00 ; 0 + 3cac: ce 01 movw r24, r28 + 3cae: 02 96 adiw r24, 0x02 ; 2 + 3cb0: 0e 94 62 07 call 0xec4 ; 0xec4 + UidCL1[0] = ISO14443A_UID0_CT; + 3cb4: 88 e8 ldi r24, 0x88 ; 136 + 3cb6: 89 83 std Y+1, r24 ; 0x01 + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t NVB = DataPtr[1]; + //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; + //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; switch (NVB) { - case ISO14443A_NVB_AC_START: - /* Start of anticollision procedure. - * Send whole UID CLn + BCC */ - DataPtr[0] = UidCL[0]; - 41c4: 89 81 ldd r24, Y+1 ; 0x01 - 41c6: f8 01 movw r30, r16 - 41c8: 80 83 st Z, r24 - DataPtr[1] = UidCL[1]; - 41ca: 3a 81 ldd r19, Y+2 ; 0x02 - 41cc: 31 83 std Z+1, r19 ; 0x01 - DataPtr[2] = UidCL[2]; - 41ce: 2b 81 ldd r18, Y+3 ; 0x03 - 41d0: 22 83 std Z+2, r18 ; 0x02 - DataPtr[3] = UidCL[3]; - 41d2: 9c 81 ldd r25, Y+4 ; 0x04 - 41d4: 93 83 std Z+3, r25 ; 0x03 - DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 41d6: 83 27 eor r24, r19 - 41d8: 82 27 eor r24, r18 - 41da: 89 27 eor r24, r25 - 41dc: 84 83 std Z+4, r24 ; 0x04 + 3cb8: f8 01 movw r30, r16 + 3cba: 91 81 ldd r25, Z+1 ; 0x01 + 3cbc: 90 32 cpi r25, 0x20 ; 32 + 3cbe: 09 f4 brne .+2 ; 0x3cc2 + 3cc0: 1b c2 rjmp .+1078 ; 0x40f8 + 3cc2: 90 37 cpi r25, 0x70 ; 112 + 3cc4: 09 f0 breq .+2 ; 0x3cc8 + 3cc6: 84 cd rjmp .-1272 ; 0x37d0 + return false; - *BitCount = ISO14443A_CL_FRAME_SIZE; - 41de: 28 e2 ldi r18, 0x28 ; 40 - 41e0: 30 e0 ldi r19, 0x00 ; 0 - 41e2: a2 ca rjmp .-2748 ; 0x3728 + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + 3cc8: f8 01 movw r30, r16 + 3cca: 82 81 ldd r24, Z+2 ; 0x02 + 3ccc: 88 38 cpi r24, 0x88 ; 136 + 3cce: 09 f0 breq .+2 ; 0x3cd2 + 3cd0: 7f cd rjmp .-1282 ; 0x37d0 + 3cd2: 93 81 ldd r25, Z+3 ; 0x03 + 3cd4: 8a 81 ldd r24, Y+2 ; 0x02 + 3cd6: 98 13 cpse r25, r24 + 3cd8: 7b cd rjmp .-1290 ; 0x37d0 + (DataPtr[3] == UidCL[1]) && + 3cda: 94 81 ldd r25, Z+4 ; 0x04 + 3cdc: 8b 81 ldd r24, Y+3 ; 0x03 + 3cde: 98 13 cpse r25, r24 + 3ce0: 77 cd rjmp .-1298 ; 0x37d0 + (DataPtr[4] == UidCL[2]) && + 3ce2: 95 81 ldd r25, Z+5 ; 0x05 + 3ce4: 8c 81 ldd r24, Y+4 ; 0x04 + 3ce6: 98 13 cpse r25, r24 + 3ce8: 73 cd rjmp .-1306 ; 0x37d0 + (DataPtr[5] == UidCL[3]) ) { - switch (NVB) { - case ISO14443A_NVB_AC_START: - /* Start of anticollision procedure. - * Send whole UID CLn + BCC */ - DataPtr[0] = UidCL[0]; - 41e4: f8 01 movw r30, r16 - 41e6: 80 83 st Z, r24 - DataPtr[1] = UidCL[1]; - 41e8: 3a 81 ldd r19, Y+2 ; 0x02 - 41ea: 31 83 std Z+1, r19 ; 0x01 - DataPtr[2] = UidCL[2]; - 41ec: 9b 81 ldd r25, Y+3 ; 0x03 - 41ee: 92 83 std Z+2, r25 ; 0x02 - DataPtr[3] = UidCL[3]; - 41f0: 2c 81 ldd r18, Y+4 ; 0x04 - 41f2: 23 83 std Z+3, r18 ; 0x03 - DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 41f4: 93 27 eor r25, r19 - 41f6: 98 27 eor r25, r24 - 41f8: 92 27 eor r25, r18 - 41fa: 94 83 std Z+4, r25 ; 0x04 + DataPtr[0] = SAKValue; + 3cea: 84 e0 ldi r24, 0x04 ; 4 + 3cec: 80 83 st Z, r24 + ISO14443AAppendCRCA(Buffer, 1); + 3cee: 61 e0 ldi r22, 0x01 ; 1 + 3cf0: 70 e0 ldi r23, 0x00 ; 0 + 3cf2: c8 01 movw r24, r16 + 3cf4: a3 d2 rcall .+1350 ; 0x423c + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_CL1_VALUE)) + State = STATE_READY2; + 3cf6: 85 e0 ldi r24, 0x05 ; 5 + 3cf8: 80 93 db 28 sts 0x28DB, r24 - *BitCount = ISO14443A_CL_FRAME_SIZE; - 41fc: 28 e2 ldi r18, 0x28 ; 40 - 41fe: 30 e0 ldi r19, 0x00 ; 0 - 4200: 93 ca rjmp .-2778 ; 0x3728 + *BitCount = ISO14443A_SAK_FRAME_SIZE; + 3cfc: 88 e1 ldi r24, 0x18 ; 24 + 3cfe: 90 e0 ldi r25, 0x00 ; 0 + 3d00: 69 cd rjmp .-1326 ; 0x37d4 + if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { + CurrentAddress = Buffer[1]; + State = STATE_RESTORE; + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 3d02: 85 d4 rcall .+2314 ; 0x460e + 3d04: 91 e0 ldi r25, 0x01 ; 1 + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + /* Write command. Store the address and prepare for the upcoming data. + * Respond with ACK. */ + CurrentAddress = Buffer[1]; + State = STATE_WRITE; + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 3d06: 98 27 eor r25, r24 + 3d08: f8 01 movw r30, r16 + 3d0a: 90 83 st Z, r25 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + 3d0c: 84 e0 ldi r24, 0x04 ; 4 + 3d0e: 90 e0 ldi r25, 0x00 ; 0 + 3d10: 61 cd rjmp .-1342 ; 0x37d4 + State = STATE_READY1; + return BitCount; + } else if (Buffer[0] == CMD_HALT) { + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + 3d12: d8 01 movw r26, r16 + 3d14: 11 96 adiw r26, 0x01 ; 1 + 3d16: 8c 91 ld r24, X + 3d18: 81 11 cpse r24, r1 + 3d1a: db cd rjmp .-1098 ; 0x38d2 + } + } else if (Buffer[0] == CMD_HALT) { + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { + 3d1c: 62 e0 ldi r22, 0x02 ; 2 + 3d1e: 70 e0 ldi r23, 0x00 ; 0 + 3d20: c8 01 movw r24, r16 + 3d22: ba d2 rcall .+1396 ; 0x4298 + 3d24: 88 23 and r24, r24 + 3d26: 09 f4 brne .+2 ; 0x3d2a + 3d28: 54 cf rjmp .-344 ; 0x3bd2 + 3d2a: 05 cf rjmp .-502 ; 0x3b36 - switch (NVB) { - case ISO14443A_NVB_AC_START: - /* Start of anticollision procedure. - * Send whole UID CLn + BCC */ - DataPtr[0] = UidCL[0]; - 4202: 89 81 ldd r24, Y+1 ; 0x01 - 4204: 80 83 st Z, r24 - DataPtr[1] = UidCL[1]; - 4206: 3a 81 ldd r19, Y+2 ; 0x02 - 4208: 31 83 std Z+1, r19 ; 0x01 - DataPtr[2] = UidCL[2]; - 420a: 2b 81 ldd r18, Y+3 ; 0x03 - 420c: 22 83 std Z+2, r18 ; 0x02 - DataPtr[3] = UidCL[3]; - 420e: 9c 81 ldd r25, Y+4 ; 0x04 - 4210: 93 83 std Z+3, r25 ; 0x03 - DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 4212: 83 27 eor r24, r19 - 4214: 82 27 eor r24, r18 - 4216: 89 27 eor r24, r25 - 4218: 84 83 std Z+4, r24 ; 0x04 - - *BitCount = ISO14443A_CL_FRAME_SIZE; - 421a: 28 e2 ldi r18, 0x28 ; 40 - 421c: 30 e0 ldi r19, 0x00 ; 0 - 421e: 84 ca rjmp .-2808 ; 0x3728 - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - if (_7BUID) - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - else - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 4220: 9b e0 ldi r25, 0x0B ; 11 - 4222: e9 0e add r14, r25 - 4224: f1 1c adc r15, r1 - 4226: 44 e0 ldi r20, 0x04 ; 4 - 4228: 50 e0 ldi r21, 0x00 ; 0 - 422a: 60 e0 ldi r22, 0x00 ; 0 - 422c: 70 e0 ldi r23, 0x00 ; 0 - 422e: c7 01 movw r24, r14 - 4230: 0e 94 de 06 call 0xdbc ; 0xdbc - 4234: ea cb rjmp .-2092 ; 0x3a0a - /* Setup crypto1 cipher. Discard in-place encrypted CardNonce. */ - Crypto1Setup(Key, Uid, CardNonce); + case STATE_CHINESE_WRITE: + if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { + /* CRC check passed. Write data into memory and send ACK. */ + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + 3d2c: 60 91 d2 28 lds r22, 0x28D2 + 3d30: b0 e1 ldi r27, 0x10 ; 16 + 3d32: 6b 9f mul r22, r27 + 3d34: b0 01 movw r22, r0 + 3d36: 11 24 eor r1, r1 + 3d38: 40 e1 ldi r20, 0x10 ; 16 + 3d3a: 50 e0 ldi r21, 0x00 ; 0 + 3d3c: c8 01 movw r24, r16 + 3d3e: 0e 94 7a 07 call 0xef4 ; 0xef4 + 3d42: 14 ce rjmp .-984 ; 0x396c + * form the reader in the next frame. */ + State = STATE_AUTHING; return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; } else { - Buffer[0] = NAK_CRC_ERROR; - 4236: 81 e0 ldi r24, 0x01 ; 1 - 4238: f8 01 movw r30, r16 - 423a: 80 83 st Z, r24 + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 3d44: 64 d4 rcall .+2248 ; 0x460e + 3d46: 91 e0 ldi r25, 0x01 ; 1 + 3d48: 38 cf rjmp .-400 ; 0x3bba + * the incoming data. */ + for (uint8_t i=0; i<4; i++) + Buffer[i] ^= Crypto1Byte(); + + if (Buffer[0] == CMD_READ) { + if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { + 3d4a: 62 e0 ldi r22, 0x02 ; 2 + 3d4c: 70 e0 ldi r23, 0x00 ; 0 + 3d4e: c8 01 movw r24, r16 + 3d50: a3 d2 rcall .+1350 ; 0x4298 + 3d52: 88 23 and r24, r24 + 3d54: b1 f2 breq .-84 ; 0x3d02 + /* Read command. Read data from memory and append CRCA. */ + MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + 3d56: f8 01 movw r30, r16 + 3d58: 61 81 ldd r22, Z+1 ; 0x01 + 3d5a: f0 e1 ldi r31, 0x10 ; 16 + 3d5c: 6f 9f mul r22, r31 + 3d5e: b0 01 movw r22, r0 + 3d60: 11 24 eor r1, r1 + 3d62: 40 e1 ldi r20, 0x10 ; 16 + 3d64: 50 e0 ldi r21, 0x00 ; 0 + 3d66: c8 01 movw r24, r16 + 3d68: 0e 94 62 07 call 0xec4 ; 0xec4 + ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); + 3d6c: 60 e1 ldi r22, 0x10 ; 16 + 3d6e: 70 e0 ldi r23, 0x00 ; 0 + 3d70: c8 01 movw r24, r16 + 3d72: 64 d2 rcall .+1224 ; 0x423c + 3d74: 68 01 movw r12, r16 + 3d76: 30 e8 ldi r19, 0x80 ; 128 + 3d78: c3 0e add r12, r19 + 3d7a: d1 1c adc r13, r1 + 3d7c: 72 e1 ldi r23, 0x12 ; 18 + 3d7e: a7 2e mov r10, r23 + + /* Encrypt and calculate parity bits. */ + for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { + uint8_t Plain = Buffer[i]; + 3d80: d8 01 movw r26, r16 + 3d82: bc 90 ld r11, X + Buffer[i] = Plain ^ Crypto1Byte(); + 3d84: 31 d4 rcall .+2146 ; 0x45e8 + 3d86: 8b 25 eor r24, r11 + 3d88: f8 01 movw r30, r16 + 3d8a: 81 93 st Z+, r24 + 3d8c: 8f 01 movw r16, r30 + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); + 3d8e: 0b 2c mov r0, r11 + 3d90: b2 94 swap r11 + 3d92: b0 24 eor r11, r0 + 3d94: 0b 2c mov r0, r11 + 3d96: b6 94 lsr r11 + 3d98: b6 94 lsr r11 + 3d9a: b0 24 eor r11, r0 + 3d9c: 01 d3 rcall .+1538 ; 0x43a0 + 3d9e: b3 94 inc r11 + 3da0: b1 fa bst r11, 1 + 3da2: ee 24 eor r14, r14 + 3da4: e0 f8 bld r14, 0 + 3da6: f1 2c mov r15, r1 + 3da8: f1 e0 ldi r31, 0x01 ; 1 + 3daa: ef 26 eor r14, r31 + 3dac: 8e 25 eor r24, r14 + 3dae: d6 01 movw r26, r12 + 3db0: 8d 93 st X+, r24 + 3db2: 6d 01 movw r12, r26 + 3db4: aa 94 dec r10 + /* Read command. Read data from memory and append CRCA. */ + MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); + + /* Encrypt and calculate parity bits. */ + for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { + 3db6: 21 f7 brne .-56 ; 0x3d80 + uint8_t Plain = Buffer[i]; + Buffer[i] = Plain ^ Crypto1Byte(); + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); + } + + return ( (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) + 3db8: 80 e9 ldi r24, 0x90 ; 144 + 3dba: 90 e1 ldi r25, 0x10 ; 16 + 3dbc: 0b cd rjmp .-1514 ; 0x37d4 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); return ACK_NAK_FRAME_SIZE; - 423c: 24 e0 ldi r18, 0x04 ; 4 - 423e: 30 e0 ldi r19, 0x00 ; 0 - 4240: 73 ca rjmp .-2842 ; 0x3728 + } + } else if (Buffer[0] == CMD_WRITE) { + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + 3dbe: 62 e0 ldi r22, 0x02 ; 2 + 3dc0: 70 e0 ldi r23, 0x00 ; 0 + 3dc2: c8 01 movw r24, r16 + 3dc4: 69 d2 rcall .+1234 ; 0x4298 + 3dc6: 88 23 and r24, r24 + 3dc8: 09 f4 brne .+2 ; 0x3dcc + 3dca: bc cf rjmp .-136 ; 0x3d44 + /* Write command. Store the address and prepare for the upcoming data. + * Respond with ACK. */ + CurrentAddress = Buffer[1]; + 3dcc: d8 01 movw r26, r16 + 3dce: 11 96 adiw r26, 0x01 ; 1 + 3dd0: 8c 91 ld r24, X + 3dd2: 80 93 d2 28 sts 0x28D2, r24 + State = STATE_WRITE; + 3dd6: 89 e0 ldi r24, 0x09 ; 9 + 3dd8: 80 93 db 28 sts 0x28DB, r24 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 3ddc: 18 d4 rcall .+2096 ; 0x460e + 3dde: 9a e0 ldi r25, 0x0A ; 10 + 3de0: 92 cf rjmp .-220 ; 0x3d06 + MemoryReadBlock(&UidCL1[1], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); + UidCL1[0] = ISO14443A_UID0_CT; + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_CL1_VALUE)) + State = STATE_READY2; + } else { + MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 3de2: 44 e0 ldi r20, 0x04 ; 4 + 3de4: 50 e0 ldi r21, 0x00 ; 0 + 3de6: 60 e0 ldi r22, 0x00 ; 0 + 3de8: 70 e0 ldi r23, 0x00 ; 0 + 3dea: ce 01 movw r24, r28 + 3dec: 01 96 adiw r24, 0x01 ; 1 + 3dee: 0e 94 62 07 call 0xec4 ; 0xec4 + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) + 3df2: 90 91 bf 28 lds r25, 0x28BF + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t NVB = DataPtr[1]; + //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; + //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; + + switch (NVB) { + 3df6: d8 01 movw r26, r16 + 3df8: 11 96 adiw r26, 0x01 ; 1 + 3dfa: 8c 91 ld r24, X + 3dfc: 80 32 cpi r24, 0x20 ; 32 + 3dfe: 09 f4 brne .+2 ; 0x3e02 + 3e00: 6b c1 rjmp .+726 ; 0x40d8 + 3e02: 80 37 cpi r24, 0x70 ; 112 + 3e04: 09 f0 breq .+2 ; 0x3e08 + 3e06: e4 cc rjmp .-1592 ; 0x37d0 + return false; + + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + 3e08: d8 01 movw r26, r16 + 3e0a: 12 96 adiw r26, 0x02 ; 2 + 3e0c: 2c 91 ld r18, X + 3e0e: 12 97 sbiw r26, 0x02 ; 2 + 3e10: 89 81 ldd r24, Y+1 ; 0x01 + 3e12: 28 13 cpse r18, r24 + 3e14: dd cc rjmp .-1606 ; 0x37d0 + 3e16: 13 96 adiw r26, 0x03 ; 3 + 3e18: 2c 91 ld r18, X + 3e1a: 13 97 sbiw r26, 0x03 ; 3 + 3e1c: 8a 81 ldd r24, Y+2 ; 0x02 + 3e1e: 28 13 cpse r18, r24 + 3e20: d7 cc rjmp .-1618 ; 0x37d0 + (DataPtr[3] == UidCL[1]) && + 3e22: 14 96 adiw r26, 0x04 ; 4 + 3e24: 2c 91 ld r18, X + 3e26: 14 97 sbiw r26, 0x04 ; 4 + 3e28: 8b 81 ldd r24, Y+3 ; 0x03 + 3e2a: 28 13 cpse r18, r24 + 3e2c: d1 cc rjmp .-1630 ; 0x37d0 + (DataPtr[4] == UidCL[2]) && + 3e2e: 15 96 adiw r26, 0x05 ; 5 + 3e30: 2c 91 ld r18, X + 3e32: 15 97 sbiw r26, 0x05 ; 5 + 3e34: 8c 81 ldd r24, Y+4 ; 0x04 + 3e36: 28 13 cpse r18, r24 + 3e38: cb cc rjmp .-1642 ; 0x37d0 + (DataPtr[5] == UidCL[3]) ) { + + DataPtr[0] = SAKValue; + 3e3a: 9c 93 st X, r25 + 3e3c: 82 cd rjmp .-1276 ; 0x3942 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_DECREMENT) { + if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { + 3e3e: 62 e0 ldi r22, 0x02 ; 2 + 3e40: 70 e0 ldi r23, 0x00 ; 0 + 3e42: c8 01 movw r24, r16 + 3e44: 29 d2 rcall .+1106 ; 0x4298 + 3e46: 88 23 and r24, r24 + 3e48: 09 f4 brne .+2 ; 0x3e4c + 3e4a: 5b cf rjmp .-330 ; 0x3d02 + CurrentAddress = Buffer[1]; + 3e4c: f8 01 movw r30, r16 + 3e4e: 81 81 ldd r24, Z+1 ; 0x01 + 3e50: 80 93 d2 28 sts 0x28D2, r24 + State = STATE_DECREMENT; + 3e54: 8b e0 ldi r24, 0x0B ; 11 + 3e56: ad ce rjmp .-678 ; 0x3bb2 + +INLINE bool CheckValueIntegrity(uint8_t* Block) +{ + /* Value Blocks contain a value stored three times, with + * the middle portion inverted. */ + if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) + 3e58: 80 91 ca 28 lds r24, 0x28CA + 3e5c: 28 13 cpse r18, r24 + 3e5e: 11 cf rjmp .-478 ; 0x3c82 + && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) + 3e60: e0 91 c3 28 lds r30, 0x28C3 + 3e64: 80 91 c7 28 lds r24, 0x28C7 + 3e68: 80 95 com r24 + 3e6a: e8 13 cpse r30, r24 + 3e6c: 0a cf rjmp .-492 ; 0x3c82 + 3e6e: 80 91 cb 28 lds r24, 0x28CB + 3e72: e8 13 cpse r30, r24 + 3e74: 06 cf rjmp .-500 ; 0x3c82 + && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) + 3e76: 80 91 c4 28 lds r24, 0x28C4 + 3e7a: 90 91 c8 28 lds r25, 0x28C8 + 3e7e: 90 95 com r25 + 3e80: 89 13 cpse r24, r25 + 3e82: ff ce rjmp .-514 ; 0x3c82 + 3e84: 90 91 cc 28 lds r25, 0x28CC + 3e88: 89 13 cpse r24, r25 + 3e8a: fb ce rjmp .-522 ; 0x3c82 + && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) + 3e8c: 30 91 c5 28 lds r19, 0x28C5 + 3e90: 90 91 c9 28 lds r25, 0x28C9 + 3e94: 90 95 com r25 + 3e96: 39 13 cpse r19, r25 + 3e98: f4 ce rjmp .-536 ; 0x3c82 + 3e9a: 90 91 cd 28 lds r25, 0x28CD + 3e9e: 39 13 cpse r19, r25 + 3ea0: f0 ce rjmp .-544 ; 0x3c82 + && (Block[12] == (uint8_t) ~Block[13]) + 3ea2: 40 91 ce 28 lds r20, 0x28CE + 3ea6: 90 91 cf 28 lds r25, 0x28CF + 3eaa: 90 95 com r25 + 3eac: 49 13 cpse r20, r25 + 3eae: e9 ce rjmp .-558 ; 0x3c82 + && (Block[12] == Block[14]) + 3eb0: 90 91 d0 28 lds r25, 0x28D0 + 3eb4: 49 13 cpse r20, r25 + 3eb6: e5 ce rjmp .-566 ; 0x3c82 + && (Block[14] == (uint8_t) ~Block[15])) { + 3eb8: 90 91 d1 28 lds r25, 0x28D1 + 3ebc: 90 95 com r25 + 3ebe: 49 13 cpse r20, r25 + 3ec0: e0 ce rjmp .-576 ; 0x3c82 +} + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + 3ec2: d8 01 movw r26, r16 + 3ec4: 9c 91 ld r25, X + *Value |= ((uint32_t) Block[1] << 8); + 3ec6: 11 96 adiw r26, 0x01 ; 1 + 3ec8: fc 91 ld r31, X + 3eca: 11 97 sbiw r26, 0x01 ; 1 + *Value |= ((uint32_t) Block[2] << 16); + 3ecc: 12 96 adiw r26, 0x02 ; 2 + 3ece: 4c 91 ld r20, X + 3ed0: 12 97 sbiw r26, 0x02 ; 2 + 3ed2: 50 e0 ldi r21, 0x00 ; 0 + 3ed4: 60 e0 ldi r22, 0x00 ; 0 + 3ed6: 70 e0 ldi r23, 0x00 ; 0 + 3ed8: ba 01 movw r22, r20 + 3eda: 55 27 eor r21, r21 + 3edc: 44 27 eor r20, r20 + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + *Value |= ((uint32_t) Block[1] << 8); + 3ede: 5f 2b or r21, r31 + *Value |= ((uint32_t) Block[2] << 16); + 3ee0: 49 2b or r20, r25 + *Value |= ((uint32_t) Block[3] << 24); + 3ee2: 13 96 adiw r26, 0x03 ; 3 + 3ee4: 9c 91 ld r25, X + 3ee6: 79 2b or r23, r25 +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + *Value |= ((uint32_t) Block[1] << 8); + *Value |= ((uint32_t) Block[2] << 16); + 3ee8: 90 e0 ldi r25, 0x00 ; 0 + 3eea: a0 e0 ldi r26, 0x00 ; 0 + 3eec: b0 e0 ldi r27, 0x00 ; 0 + 3eee: dc 01 movw r26, r24 + 3ef0: 99 27 eor r25, r25 + 3ef2: 88 27 eor r24, r24 + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + *Value |= ((uint32_t) Block[1] << 8); + 3ef4: 9e 2b or r25, r30 + *Value |= ((uint32_t) Block[2] << 16); + 3ef6: 82 2b or r24, r18 + *Value |= ((uint32_t) Block[3] << 24); + 3ef8: b3 2b or r27, r19 + uint32_t BlockValue; + + ValueFromBlock(&ParamValue, Buffer); + ValueFromBlock(&BlockValue, BlockBuffer); + + if (State == STATE_DECREMENT) { + 3efa: 20 91 db 28 lds r18, 0x28DB + 3efe: 2b 30 cpi r18, 0x0B ; 11 + 3f00: 09 f4 brne .+2 ; 0x3f04 + 3f02: d6 c0 rjmp .+428 ; 0x40b0 + BlockValue -= ParamValue; + } else if (State == STATE_INCREMENT) { + 3f04: 2a 30 cpi r18, 0x0A ; 10 + 3f06: 21 f4 brne .+8 ; 0x3f10 + BlockValue += ParamValue; + 3f08: 84 0f add r24, r20 + 3f0a: 95 1f adc r25, r21 + 3f0c: a6 1f adc r26, r22 + 3f0e: b7 1f adc r27, r23 + *Value |= ((uint32_t) Block[3] << 24); +} + +INLINE void ValueToBlock(uint8_t* Block, uint32_t Value) +{ + Block[0] = (uint8_t) (Value >> 0); + 3f10: 80 93 c2 28 sts 0x28C2, r24 + Block[1] = (uint8_t) (Value >> 8); + 3f14: c9 2e mov r12, r25 + 3f16: da 2e mov r13, r26 + 3f18: eb 2e mov r14, r27 + 3f1a: ff 24 eor r15, r15 + 3f1c: c0 92 c3 28 sts 0x28C3, r12 + Block[2] = (uint8_t) (Value >> 16); + 3f20: 8d 01 movw r16, r26 + 3f22: 22 27 eor r18, r18 + 3f24: 33 27 eor r19, r19 + 3f26: 00 93 c4 28 sts 0x28C4, r16 + Block[3] = (uint8_t) (Value >> 24); + 3f2a: 4b 2f mov r20, r27 + 3f2c: 55 27 eor r21, r21 + 3f2e: 66 27 eor r22, r22 + 3f30: 77 27 eor r23, r23 + 3f32: 40 93 c5 28 sts 0x28C5, r20 + Block[4] = ~Block[0]; + 3f36: e8 2f mov r30, r24 + 3f38: e0 95 com r30 + 3f3a: e0 93 c6 28 sts 0x28C6, r30 + Block[5] = ~Block[1]; + 3f3e: ec 2d mov r30, r12 + 3f40: e0 95 com r30 + 3f42: e0 93 c7 28 sts 0x28C7, r30 + Block[6] = ~Block[2]; + 3f46: e0 2f mov r30, r16 + 3f48: e0 95 com r30 + 3f4a: e0 93 c8 28 sts 0x28C8, r30 + Block[7] = ~Block[3]; + 3f4e: e4 2f mov r30, r20 + 3f50: e0 95 com r30 + 3f52: e0 93 c9 28 sts 0x28C9, r30 + Block[8] = Block[0]; + 3f56: 80 93 ca 28 sts 0x28CA, r24 + Block[9] = Block[1]; + 3f5a: c0 92 cb 28 sts 0x28CB, r12 + Block[10] = Block[2]; + 3f5e: 00 93 cc 28 sts 0x28CC, r16 + Block[11] = Block[3]; + 3f62: 40 93 cd 28 sts 0x28CD, r20 + /* Do nothing */ + } + + ValueToBlock(BlockBuffer, BlockValue); + + State = STATE_AUTHED_IDLE; + 3f66: 88 e0 ldi r24, 0x08 ; 8 + 3f68: 80 93 db 28 sts 0x28DB, r24 + /* No ACK response on value commands part 2 */ + return ISO14443A_APP_NO_RESPONSE; + 3f6c: 80 e0 ldi r24, 0x00 ; 0 + 3f6e: 90 e0 ldi r25, 0x00 ; 0 + 3f70: 31 cc rjmp .-1950 ; 0x37d4 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_INCREMENT) { + if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { + 3f72: 62 e0 ldi r22, 0x02 ; 2 + 3f74: 70 e0 ldi r23, 0x00 ; 0 + 3f76: c8 01 movw r24, r16 + 3f78: 8f d1 rcall .+798 ; 0x4298 + 3f7a: 88 23 and r24, r24 + 3f7c: 09 f4 brne .+2 ; 0x3f80 + 3f7e: e2 ce rjmp .-572 ; 0x3d44 + CurrentAddress = Buffer[1]; + 3f80: d8 01 movw r26, r16 + 3f82: 11 96 adiw r26, 0x01 ; 1 + 3f84: 8c 91 ld r24, X + 3f86: 80 93 d2 28 sts 0x28D2, r24 + State = STATE_INCREMENT; + 3f8a: 6a e0 ldi r22, 0x0A ; 10 + 3f8c: f6 2e mov r15, r22 + 3f8e: f0 92 db 28 sts 0x28DB, r15 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 3f92: 3d d3 rcall .+1658 ; 0x460e + 3f94: 8f 25 eor r24, r15 + 3f96: f8 01 movw r30, r16 + 3f98: 80 83 st Z, r24 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + 3f9a: 84 e0 ldi r24, 0x04 ; 4 + 3f9c: 90 e0 ldi r25, 0x00 ; 0 + 3f9e: 1a cc rjmp .-1996 ; 0x37d4 + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + }else if (Buffer[0] == CMD_TRANSFER) { + /* Write back the global block buffer to the desired block address */ + if (ISO14443ACheckCRCA(Buffer, CMD_TRANSFER_FRAME_SIZE)) { + 3fa0: 62 e0 ldi r22, 0x02 ; 2 + 3fa2: 70 e0 ldi r23, 0x00 ; 0 + 3fa4: c8 01 movw r24, r16 + 3fa6: 78 d1 rcall .+752 ; 0x4298 + 3fa8: 88 23 and r24, r24 + 3faa: 09 f4 brne .+2 ; 0x3fae + 3fac: cb ce rjmp .-618 ; 0x3d44 + if (!ActiveConfiguration.ReadOnly) { + 3fae: 80 91 06 29 lds r24, 0x2906 + 3fb2: 81 11 cpse r24, r1 + 3fb4: 13 cf rjmp .-474 ; 0x3ddc + MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); + 3fb6: d8 01 movw r26, r16 + 3fb8: 11 96 adiw r26, 0x01 ; 1 + 3fba: 6c 91 ld r22, X + 3fbc: b0 e1 ldi r27, 0x10 ; 16 + 3fbe: 6b 9f mul r22, r27 + 3fc0: b0 01 movw r22, r0 + 3fc2: 11 24 eor r1, r1 + 3fc4: 40 e1 ldi r20, 0x10 ; 16 + 3fc6: 50 e0 ldi r21, 0x00 ; 0 + 3fc8: 82 ec ldi r24, 0xC2 ; 194 + 3fca: 98 e2 ldi r25, 0x28 ; 40 + 3fcc: 0e 94 7a 07 call 0xef4 ; 0xef4 + 3fd0: 05 cf rjmp .-502 ; 0x3ddc + } else { + Buffer[0] = NAK_INVALID_ARG; + return ACK_NAK_FRAME_SIZE; + } + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + 3fd2: 62 e0 ldi r22, 0x02 ; 2 + 3fd4: 70 e0 ldi r23, 0x00 ; 0 + 3fd6: c8 01 movw r24, r16 + 3fd8: 5f d1 rcall .+702 ; 0x4298 + 3fda: 88 23 and r24, r24 + 3fdc: 09 f4 brne .+2 ; 0x3fe0 + 3fde: f9 cd rjmp .-1038 ; 0x3bd2 + uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + 3fe0: f8 01 movw r30, r16 + 3fe2: 21 81 ldd r18, Z+1 ; 0x01 + 3fe4: 2c 73 andi r18, 0x3C ; 60 + uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + 3fe6: 80 81 ld r24, Z + 3fe8: 80 36 cpi r24, 0x60 ; 96 + 3fea: 09 f4 brne .+2 ; 0x3fee + 3fec: d4 c0 rjmp .+424 ; 0x4196 + 3fee: 8a e3 ldi r24, 0x3A ; 58 + 3ff0: 90 e0 ldi r25, 0x00 ; 0 + uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; + 3ff2: 7c 01 movw r14, r24 + 3ff4: f0 e1 ldi r31, 0x10 ; 16 + 3ff6: 2f 9f mul r18, r31 + 3ff8: e0 0c add r14, r0 + 3ffa: f1 1c adc r15, r1 + 3ffc: 11 24 eor r1, r1 + uint8_t Key[6]; + uint8_t Uid[4]; + uint8_t CardNonce[4]; + + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + 3ffe: 4e 01 movw r8, r28 + 4000: 37 e0 ldi r19, 0x07 ; 7 + 4002: 83 0e add r8, r19 + 4004: 91 1c adc r9, r1 + 4006: 64 e0 ldi r22, 0x04 ; 4 + 4008: c4 01 movw r24, r8 + 400a: 0e 94 bd 06 call 0xd7a ; 0xd7a + if (_7BUID) + 400e: 80 91 be 28 lds r24, 0x28BE + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + 4012: 5e 01 movw r10, r28 + uint8_t Uid[4]; + uint8_t CardNonce[4]; + + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + if (_7BUID) + 4014: 88 23 and r24, r24 + 4016: 09 f4 brne .+2 ; 0x401a + 4018: a0 c0 rjmp .+320 ; 0x415a + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + 401a: 8b e0 ldi r24, 0x0B ; 11 + 401c: a8 0e add r10, r24 + 401e: b1 1c adc r11, r1 + 4020: 44 e0 ldi r20, 0x04 ; 4 + 4022: 50 e0 ldi r21, 0x00 ; 0 + 4024: 63 e0 ldi r22, 0x03 ; 3 + 4026: 70 e0 ldi r23, 0x00 ; 0 + 4028: c5 01 movw r24, r10 + 402a: 0e 94 62 07 call 0xec4 ; 0xec4 + else + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); + 402e: 46 e0 ldi r20, 0x06 ; 6 + 4030: 50 e0 ldi r21, 0x00 ; 0 + 4032: b7 01 movw r22, r14 + 4034: ce 01 movw r24, r28 + 4036: 01 96 adiw r24, 0x01 ; 1 + 4038: 0e 94 62 07 call 0xec4 ; 0xec4 + 403c: 8f 81 ldd r24, Y+7 ; 0x07 + 403e: 98 85 ldd r25, Y+8 ; 0x08 + 4040: a9 85 ldd r26, Y+9 ; 0x09 + 4042: ba 85 ldd r27, Y+10 ; 0x0a + 4044: 80 93 d3 28 sts 0x28D3, r24 + 4048: 90 93 d4 28 sts 0x28D4, r25 + 404c: a0 93 d5 28 sts 0x28D5, r26 + 4050: b0 93 d6 28 sts 0x28D6, r27 + + /* Precalculate the reader response from card-nonce */ + for (uint8_t i=0; i + 405e: 80 91 d3 28 lds r24, 0x28D3 + 4062: 90 91 d4 28 lds r25, 0x28D4 + 4066: a0 91 d5 28 lds r26, 0x28D5 + 406a: b0 91 d6 28 lds r27, 0x28D6 + 406e: 80 93 d7 28 sts 0x28D7, r24 + 4072: 90 93 d8 28 sts 0x28D8, r25 + 4076: a0 93 d9 28 sts 0x28D9, r26 + 407a: b0 93 da 28 sts 0x28DA, r27 + + /* Precalculate our response from the reader response */ + for (uint8_t i=0; i + + /* Respond with the random card nonce and expect further authentication + * form the reader in the next frame. */ + State = STATE_AUTHING; + 4088: 87 e0 ldi r24, 0x07 ; 7 + 408a: 80 93 db 28 sts 0x28DB, r24 + 408e: 8f 81 ldd r24, Y+7 ; 0x07 + 4090: 98 85 ldd r25, Y+8 ; 0x08 + 4092: a9 85 ldd r26, Y+9 ; 0x09 + 4094: ba 85 ldd r27, Y+10 ; 0x0a + 4096: f8 01 movw r30, r16 + 4098: 80 83 st Z, r24 + 409a: 91 83 std Z+1, r25 ; 0x01 + 409c: a2 83 std Z+2, r26 ; 0x02 + 409e: b3 83 std Z+3, r27 ; 0x03 + + for (uint8_t i=0; i + + return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; + 40aa: 80 e2 ldi r24, 0x20 ; 32 + 40ac: 90 e0 ldi r25, 0x00 ; 0 + 40ae: 92 cb rjmp .-2268 ; 0x37d4 + + ValueFromBlock(&ParamValue, Buffer); + ValueFromBlock(&BlockValue, BlockBuffer); + + if (State == STATE_DECREMENT) { + BlockValue -= ParamValue; + 40b0: 84 1b sub r24, r20 + 40b2: 95 0b sbc r25, r21 + 40b4: a6 0b sbc r26, r22 + 40b6: b7 0b sbc r27, r23 + 40b8: 2b cf rjmp .-426 ; 0x3f10 + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + 40ba: 89 81 ldd r24, Y+1 ; 0x01 + 40bc: 80 83 st Z, r24 + DataPtr[1] = UidCL[1]; + 40be: 3a 81 ldd r19, Y+2 ; 0x02 + 40c0: 31 83 std Z+1, r19 ; 0x01 + DataPtr[2] = UidCL[2]; + 40c2: 2b 81 ldd r18, Y+3 ; 0x03 + 40c4: 22 83 std Z+2, r18 ; 0x02 + DataPtr[3] = UidCL[3]; + 40c6: 9c 81 ldd r25, Y+4 ; 0x04 + 40c8: 93 83 std Z+3, r25 ; 0x03 + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + 40ca: 83 27 eor r24, r19 + 40cc: 82 27 eor r24, r18 + 40ce: 89 27 eor r24, r25 + 40d0: 84 83 std Z+4, r24 ; 0x04 + + *BitCount = ISO14443A_CL_FRAME_SIZE; + 40d2: 88 e2 ldi r24, 0x28 ; 40 + 40d4: 90 e0 ldi r25, 0x00 ; 0 + 40d6: 7e cb rjmp .-2308 ; 0x37d4 + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + 40d8: 89 81 ldd r24, Y+1 ; 0x01 + 40da: f8 01 movw r30, r16 + 40dc: 80 83 st Z, r24 + DataPtr[1] = UidCL[1]; + 40de: 3a 81 ldd r19, Y+2 ; 0x02 + 40e0: 31 83 std Z+1, r19 ; 0x01 + DataPtr[2] = UidCL[2]; + 40e2: 2b 81 ldd r18, Y+3 ; 0x03 + 40e4: 22 83 std Z+2, r18 ; 0x02 + DataPtr[3] = UidCL[3]; + 40e6: 9c 81 ldd r25, Y+4 ; 0x04 + 40e8: 93 83 std Z+3, r25 ; 0x03 + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + 40ea: 83 27 eor r24, r19 + 40ec: 82 27 eor r24, r18 + 40ee: 89 27 eor r24, r25 + 40f0: 84 83 std Z+4, r24 ; 0x04 + + *BitCount = ISO14443A_CL_FRAME_SIZE; + 40f2: 88 e2 ldi r24, 0x28 ; 40 + 40f4: 90 e0 ldi r25, 0x00 ; 0 + 40f6: 6e cb rjmp .-2340 ; 0x37d4 + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + 40f8: 80 83 st Z, r24 + DataPtr[1] = UidCL[1]; + 40fa: 3a 81 ldd r19, Y+2 ; 0x02 + 40fc: 31 83 std Z+1, r19 ; 0x01 + DataPtr[2] = UidCL[2]; + 40fe: 9b 81 ldd r25, Y+3 ; 0x03 + 4100: 92 83 std Z+2, r25 ; 0x02 + DataPtr[3] = UidCL[3]; + 4102: 2c 81 ldd r18, Y+4 ; 0x04 + 4104: 23 83 std Z+3, r18 ; 0x03 + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + 4106: 93 27 eor r25, r19 + 4108: 98 27 eor r25, r24 + 410a: 92 27 eor r25, r18 + 410c: 94 83 std Z+4, r25 ; 0x04 + + *BitCount = ISO14443A_CL_FRAME_SIZE; + 410e: 88 e2 ldi r24, 0x28 ; 40 + 4110: 90 e0 ldi r25, 0x00 ; 0 + 4112: 60 cb rjmp .-2368 ; 0x37d4 + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else if (Buffer[0] == CMD_WRITE) { + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + 4114: 62 e0 ldi r22, 0x02 ; 2 + 4116: 70 e0 ldi r23, 0x00 ; 0 + 4118: c8 01 movw r24, r16 + 411a: be d0 rcall .+380 ; 0x4298 + 411c: 88 23 and r24, r24 + 411e: 09 f4 brne .+2 ; 0x4122 + 4120: 58 cd rjmp .-1360 ; 0x3bd2 + /* Write command. Store the address and prepare for the upcoming data. + * Respond with ACK. */ + CurrentAddress = Buffer[1]; + 4122: d8 01 movw r26, r16 + 4124: 11 96 adiw r26, 0x01 ; 1 + 4126: 8c 91 ld r24, X + 4128: 11 97 sbiw r26, 0x01 ; 1 + 412a: 80 93 d2 28 sts 0x28D2, r24 + State = STATE_CHINESE_WRITE; + 412e: 83 e0 ldi r24, 0x03 ; 3 + 4130: 80 93 db 28 sts 0x28DB, r24 + + Buffer[0] = ACK_VALUE; + 4134: 8a e0 ldi r24, 0x0A ; 10 + 4136: 8c 93 st X, r24 + return ACK_NAK_FRAME_SIZE; + 4138: 84 e0 ldi r24, 0x04 ; 4 + 413a: 90 e0 ldi r25, 0x00 ; 0 + 413c: 4b cb rjmp .-2410 ; 0x37d4 /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); if (_7BUID) MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 4242: 3b e0 ldi r19, 0x0B ; 11 - 4244: e3 0e add r14, r19 - 4246: f1 1c adc r15, r1 - 4248: 44 e0 ldi r20, 0x04 ; 4 - 424a: 50 e0 ldi r21, 0x00 ; 0 - 424c: 60 e0 ldi r22, 0x00 ; 0 - 424e: 70 e0 ldi r23, 0x00 ; 0 - 4250: c7 01 movw r24, r14 - 4252: 0e 94 de 06 call 0xdbc ; 0xdbc - 4256: 47 cf rjmp .-370 ; 0x40e6 + 413e: 9b e0 ldi r25, 0x0B ; 11 + 4140: a9 0e add r10, r25 + 4142: b1 1c adc r11, r1 + 4144: 44 e0 ldi r20, 0x04 ; 4 + 4146: 50 e0 ldi r21, 0x00 ; 0 + 4148: 60 e0 ldi r22, 0x00 ; 0 + 414a: 70 e0 ldi r23, 0x00 ; 0 + 414c: c5 01 movw r24, r10 + 414e: 0e 94 62 07 call 0xec4 ; 0xec4 + 4152: 7f cc rjmp .-1794 ; 0x3a52 return ACK_NAK_FRAME_SIZE; } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { /* Nested authentication. */ uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 4258: 60 e3 ldi r22, 0x30 ; 48 - 425a: 70 e0 ldi r23, 0x00 ; 0 - 425c: b8 cb rjmp .-2192 ; 0x39ce + 4154: 60 e3 ldi r22, 0x30 ; 48 + 4156: 70 e0 ldi r23, 0x00 ; 0 + 4158: 5e cc rjmp .-1860 ; 0x3a16 + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + if (_7BUID) + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + else + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 415a: 9b e0 ldi r25, 0x0B ; 11 + 415c: a9 0e add r10, r25 + 415e: b1 1c adc r11, r1 + 4160: 44 e0 ldi r20, 0x04 ; 4 + 4162: 50 e0 ldi r21, 0x00 ; 0 + 4164: 60 e0 ldi r22, 0x00 ; 0 + 4166: 70 e0 ldi r23, 0x00 ; 0 + 4168: c5 01 movw r24, r10 + 416a: 0e 94 62 07 call 0xec4 ; 0xec4 + 416e: 5f cf rjmp .-322 ; 0x402e + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_READ) { + if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { + /* Read command. Read data from memory and append CRCA. */ + MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + 4170: d8 01 movw r26, r16 + 4172: 11 96 adiw r26, 0x01 ; 1 + 4174: 6c 91 ld r22, X + 4176: b0 e1 ldi r27, 0x10 ; 16 + 4178: 6b 9f mul r22, r27 + 417a: b0 01 movw r22, r0 + 417c: 11 24 eor r1, r1 + 417e: 40 e1 ldi r20, 0x10 ; 16 + 4180: 50 e0 ldi r21, 0x00 ; 0 + 4182: c8 01 movw r24, r16 + 4184: 0e 94 62 07 call 0xec4 ; 0xec4 + ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); + 4188: 60 e1 ldi r22, 0x10 ; 16 + 418a: 70 e0 ldi r23, 0x00 ; 0 + 418c: c8 01 movw r24, r16 + 418e: 56 d0 rcall .+172 ; 0x423c + + return (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) + 4190: 80 e9 ldi r24, 0x90 ; 144 + 4192: 90 e0 ldi r25, 0x00 ; 0 + 4194: 1f cb rjmp .-2498 ; 0x37d4 return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 425e: 80 e3 ldi r24, 0x30 ; 48 - 4260: 90 e0 ldi r25, 0x00 ; 0 - 4262: 23 cf rjmp .-442 ; 0x40aa + 4196: 80 e3 ldi r24, 0x30 ; 48 + 4198: 90 e0 ldi r25, 0x00 ; 0 + 419a: 2b cf rjmp .-426 ; 0x3ff2 -00004264 : +0000419c : /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; } void MifareClassicGetUid(ConfigurationUidType Uid) { - 4264: cf 93 push r28 - 4266: df 93 push r29 - 4268: ec 01 movw r28, r24 + 419c: cf 93 push r28 + 419e: df 93 push r29 + 41a0: ec 01 movw r28, r24 if (_7BUID) { - 426a: 80 91 c2 28 lds r24, 0x28C2 - 426e: 81 11 cpse r24, r1 - 4270: 09 c0 rjmp .+18 ; 0x4284 + 41a2: 80 91 be 28 lds r24, 0x28BE + 41a6: 81 11 cpse r24, r1 + 41a8: 09 c0 rjmp .+18 ; 0x41bc //Uid[0]=0x88; MemoryReadBlock(&Uid[0], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); MemoryReadBlock(&Uid[3], MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); } else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 4272: 44 e0 ldi r20, 0x04 ; 4 - 4274: 50 e0 ldi r21, 0x00 ; 0 - 4276: 60 e0 ldi r22, 0x00 ; 0 - 4278: 70 e0 ldi r23, 0x00 ; 0 - 427a: ce 01 movw r24, r28 + 41aa: 44 e0 ldi r20, 0x04 ; 4 + 41ac: 50 e0 ldi r21, 0x00 ; 0 + 41ae: 60 e0 ldi r22, 0x00 ; 0 + 41b0: 70 e0 ldi r23, 0x00 ; 0 + 41b2: ce 01 movw r24, r28 } - 427c: df 91 pop r29 - 427e: cf 91 pop r28 + 41b4: df 91 pop r29 + 41b6: cf 91 pop r28 //Uid[0]=0x88; MemoryReadBlock(&Uid[0], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); MemoryReadBlock(&Uid[3], MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); } else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 4280: 0c 94 de 06 jmp 0xdbc ; 0xdbc + 41b8: 0c 94 62 07 jmp 0xec4 ; 0xec4 void MifareClassicGetUid(ConfigurationUidType Uid) { if (_7BUID) { //Uid[0]=0x88; MemoryReadBlock(&Uid[0], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); - 4284: 43 e0 ldi r20, 0x03 ; 3 - 4286: 50 e0 ldi r21, 0x00 ; 0 - 4288: 60 e0 ldi r22, 0x00 ; 0 - 428a: 70 e0 ldi r23, 0x00 ; 0 - 428c: ce 01 movw r24, r28 - 428e: 0e 94 de 06 call 0xdbc ; 0xdbc + 41bc: 43 e0 ldi r20, 0x03 ; 3 + 41be: 50 e0 ldi r21, 0x00 ; 0 + 41c0: 60 e0 ldi r22, 0x00 ; 0 + 41c2: 70 e0 ldi r23, 0x00 ; 0 + 41c4: ce 01 movw r24, r28 + 41c6: 0e 94 62 07 call 0xec4 ; 0xec4 MemoryReadBlock(&Uid[3], MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 4292: 44 e0 ldi r20, 0x04 ; 4 - 4294: 50 e0 ldi r21, 0x00 ; 0 - 4296: 63 e0 ldi r22, 0x03 ; 3 - 4298: 70 e0 ldi r23, 0x00 ; 0 - 429a: ce 01 movw r24, r28 - 429c: 03 96 adiw r24, 0x03 ; 3 + 41ca: 44 e0 ldi r20, 0x04 ; 4 + 41cc: 50 e0 ldi r21, 0x00 ; 0 + 41ce: 63 e0 ldi r22, 0x03 ; 3 + 41d0: 70 e0 ldi r23, 0x00 ; 0 + 41d2: ce 01 movw r24, r28 + 41d4: 03 96 adiw r24, 0x03 ; 3 } else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); } - 429e: df 91 pop r29 - 42a0: cf 91 pop r28 + 41d6: df 91 pop r29 + 41d8: cf 91 pop r28 void MifareClassicGetUid(ConfigurationUidType Uid) { if (_7BUID) { //Uid[0]=0x88; MemoryReadBlock(&Uid[0], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); MemoryReadBlock(&Uid[3], MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - 42a2: 0c 94 de 06 jmp 0xdbc ; 0xdbc + 41da: 0c 94 62 07 jmp 0xec4 ; 0xec4 -000042a6 : +000041de : else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); } void MifareClassicSetUid(ConfigurationUidType Uid) { - 42a6: cf 93 push r28 - 42a8: df 93 push r29 - 42aa: 1f 92 push r1 - 42ac: cd b7 in r28, 0x3d ; 61 - 42ae: de b7 in r29, 0x3e ; 62 + 41de: cf 93 push r28 + 41e0: df 93 push r29 + 41e2: 1f 92 push r1 + 41e4: cd b7 in r28, 0x3d ; 61 + 41e6: de b7 in r29, 0x3e ; 62 if (_7BUID) { - 42b0: 20 91 c2 28 lds r18, 0x28C2 - 42b4: 21 11 cpse r18, r1 - 42b6: 1b c0 rjmp .+54 ; 0x42ee + 41e8: 20 91 be 28 lds r18, 0x28BE + 41ec: 21 11 cpse r18, r1 + 41ee: 1b c0 rjmp .+54 ; 0x4226 //Uid[0]=0x88; MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, ActiveConfiguration.UidSize); } else { uint8_t BCC = Uid[0] ^ Uid[1] ^ Uid[2] ^ Uid[3]; - 42b8: fc 01 movw r30, r24 - 42ba: 21 81 ldd r18, Z+1 ; 0x01 - 42bc: 30 81 ld r19, Z - 42be: 23 27 eor r18, r19 - 42c0: 32 81 ldd r19, Z+2 ; 0x02 - 42c2: 23 27 eor r18, r19 - 42c4: 33 81 ldd r19, Z+3 ; 0x03 - 42c6: 23 27 eor r18, r19 - 42c8: 29 83 std Y+1, r18 ; 0x01 + 41f0: fc 01 movw r30, r24 + 41f2: 21 81 ldd r18, Z+1 ; 0x01 + 41f4: 30 81 ld r19, Z + 41f6: 23 27 eor r18, r19 + 41f8: 32 81 ldd r19, Z+2 ; 0x02 + 41fa: 23 27 eor r18, r19 + 41fc: 33 81 ldd r19, Z+3 ; 0x03 + 41fe: 23 27 eor r18, r19 + 4200: 29 83 std Y+1, r18 ; 0x01 MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 42ca: 44 e0 ldi r20, 0x04 ; 4 - 42cc: 50 e0 ldi r21, 0x00 ; 0 - 42ce: 60 e0 ldi r22, 0x00 ; 0 - 42d0: 70 e0 ldi r23, 0x00 ; 0 - 42d2: 0e 94 f6 06 call 0xdec ; 0xdec + 4202: 44 e0 ldi r20, 0x04 ; 4 + 4204: 50 e0 ldi r21, 0x00 ; 0 + 4206: 60 e0 ldi r22, 0x00 ; 0 + 4208: 70 e0 ldi r23, 0x00 ; 0 + 420a: 0e 94 7a 07 call 0xef4 ; 0xef4 MemoryWriteBlock(&BCC, MEM_UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); - 42d6: 41 e0 ldi r20, 0x01 ; 1 - 42d8: 50 e0 ldi r21, 0x00 ; 0 - 42da: 64 e0 ldi r22, 0x04 ; 4 - 42dc: 70 e0 ldi r23, 0x00 ; 0 - 42de: ce 01 movw r24, r28 - 42e0: 01 96 adiw r24, 0x01 ; 1 - 42e2: 0e 94 f6 06 call 0xdec ; 0xdec + 420e: 41 e0 ldi r20, 0x01 ; 1 + 4210: 50 e0 ldi r21, 0x00 ; 0 + 4212: 64 e0 ldi r22, 0x04 ; 4 + 4214: 70 e0 ldi r23, 0x00 ; 0 + 4216: ce 01 movw r24, r28 + 4218: 01 96 adiw r24, 0x01 ; 1 + 421a: 0e 94 7a 07 call 0xef4 ; 0xef4 } } - 42e6: 0f 90 pop r0 - 42e8: df 91 pop r29 - 42ea: cf 91 pop r28 - 42ec: 08 95 ret + 421e: 0f 90 pop r0 + 4220: df 91 pop r29 + 4222: cf 91 pop r28 + 4224: 08 95 ret void MifareClassicSetUid(ConfigurationUidType Uid) { if (_7BUID) { //Uid[0]=0x88; MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, ActiveConfiguration.UidSize); - 42ee: 40 91 05 29 lds r20, 0x2905 - 42f2: 50 e0 ldi r21, 0x00 ; 0 - 42f4: 60 e0 ldi r22, 0x00 ; 0 - 42f6: 70 e0 ldi r23, 0x00 ; 0 - 42f8: 0e 94 f6 06 call 0xdec ; 0xdec + 4226: 40 91 05 29 lds r20, 0x2905 + 422a: 50 e0 ldi r21, 0x00 ; 0 + 422c: 60 e0 ldi r22, 0x00 ; 0 + 422e: 70 e0 ldi r23, 0x00 ; 0 + 4230: 0e 94 7a 07 call 0xef4 ; 0xef4 uint8_t BCC = Uid[0] ^ Uid[1] ^ Uid[2] ^ Uid[3]; MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); MemoryWriteBlock(&BCC, MEM_UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); } } - 42fc: 0f 90 pop r0 - 42fe: df 91 pop r29 - 4300: cf 91 pop r28 - 4302: 08 95 ret + 4234: 0f 90 pop r0 + 4236: df 91 pop r29 + 4238: cf 91 pop r28 + 423a: 08 95 ret -00004304 : - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 4304: 61 15 cp r22, r1 - 4306: 71 05 cpc r23, r1 - 4308: 41 f1 breq .+80 ; 0x435a +0000423c : * Author: skuser */ #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - 430a: 68 0f add r22, r24 - 430c: 79 1f adc r23, r25 + 423c: fc 01 movw r30, r24 uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 430e: fc 01 movw r30, r24 + + while(ByteCount--) { + 423e: 61 15 cp r22, r1 + 4240: 71 05 cpc r23, r1 + 4242: 39 f1 breq .+78 ; 0x4292 + 4244: 68 0f add r22, r24 + 4246: 79 1f adc r23, r25 */ #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 4310: 23 e6 ldi r18, 0x63 ; 99 - 4312: 33 e6 ldi r19, 0x63 ; 99 + 4248: 23 e6 ldi r18, 0x63 ; 99 + 424a: 33 e6 ldi r19, 0x63 ; 99 uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { uint8_t Byte = *DataPtr++; - 4314: 41 91 ld r20, Z+ + 424c: 41 91 ld r20, Z+ Byte ^= (uint8_t) (Checksum & 0x00FF); - 4316: 42 27 eor r20, r18 + 424e: 42 27 eor r20, r18 Byte ^= Byte << 4; - 4318: 50 e1 ldi r21, 0x10 ; 16 - 431a: 45 9f mul r20, r21 - 431c: c0 01 movw r24, r0 - 431e: 11 24 eor r1, r1 - 4320: a4 2f mov r26, r20 - 4322: a8 27 eor r26, r24 + 4250: 50 e1 ldi r21, 0x10 ; 16 + 4252: 45 9f mul r20, r21 + 4254: c0 01 movw r24, r0 + 4256: 11 24 eor r1, r1 + 4258: a4 2f mov r26, r20 + 425a: a8 27 eor r26, r24 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 4324: 8a 2f mov r24, r26 - 4326: 90 e0 ldi r25, 0x00 ; 0 - 4328: 58 2f mov r21, r24 - 432a: 44 27 eor r20, r20 + 425c: 8a 2f mov r24, r26 + 425e: 90 e0 ldi r25, 0x00 ; 0 + 4260: 58 2f mov r21, r24 + 4262: 44 27 eor r20, r20 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 432c: 88 0f add r24, r24 - 432e: 99 1f adc r25, r25 - 4330: 88 0f add r24, r24 - 4332: 99 1f adc r25, r25 - 4334: 88 0f add r24, r24 - 4336: 99 1f adc r25, r25 + 4264: 88 0f add r24, r24 + 4266: 99 1f adc r25, r25 + 4268: 88 0f add r24, r24 + 426a: 99 1f adc r25, r25 + 426c: 88 0f add r24, r24 + 426e: 99 1f adc r25, r25 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 4338: 48 27 eor r20, r24 - 433a: 59 27 eor r21, r25 - 433c: 23 2f mov r18, r19 - 433e: 33 27 eor r19, r19 - 4340: 24 27 eor r18, r20 - 4342: 35 27 eor r19, r21 + 4270: 48 27 eor r20, r24 + 4272: 59 27 eor r21, r25 + 4274: 23 2f mov r18, r19 + 4276: 33 27 eor r19, r19 + 4278: 24 27 eor r18, r20 + 427a: 35 27 eor r19, r21 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 4344: a2 95 swap r26 - 4346: af 70 andi r26, 0x0F ; 15 + 427c: a2 95 swap r26 + 427e: af 70 andi r26, 0x0F ; 15 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 4348: 2a 27 eor r18, r26 + 4280: 2a 27 eor r18, r26 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 434a: e6 17 cp r30, r22 - 434c: f7 07 cpc r31, r23 - 434e: 11 f7 brne .-60 ; 0x4314 - 4350: 92 2f mov r25, r18 - 4352: 83 2f mov r24, r19 + 4282: e6 17 cp r30, r22 + 4284: f7 07 cpc r31, r23 + 4286: 11 f7 brne .-60 ; 0x424c + 4288: 92 2f mov r25, r18 + 428a: 83 2f mov r24, r19 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } *DataPtr++ = (Checksum >> 0) & 0x00FF; - 4354: 90 83 st Z, r25 + 428c: 90 83 st Z, r25 *DataPtr = (Checksum >> 8) & 0x00FF; - 4356: 81 83 std Z+1, r24 ; 0x01 - 4358: 08 95 ret - -#include "ISO14443-3A.h" + 428e: 81 83 std Z+1, r24 ; 0x01 + 4290: 08 95 ret void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 435a: fc 01 movw r30, r24 while(ByteCount--) { - 435c: 83 e6 ldi r24, 0x63 ; 99 - 435e: 93 e6 ldi r25, 0x63 ; 99 - 4360: f9 cf rjmp .-14 ; 0x4354 - -00004362 : -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 4362: 61 15 cp r22, r1 - 4364: 71 05 cpc r23, r1 - 4366: b1 f1 breq .+108 ; 0x43d4 + 4292: 83 e6 ldi r24, 0x63 ; 99 + 4294: 93 e6 ldi r25, 0x63 ; 99 + 4296: fa cf rjmp .-12 ; 0x428c +00004298 : *DataPtr++ = (Checksum >> 0) & 0x00FF; *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) - 4368: 68 0f add r22, r24 - 436a: 79 1f adc r23, r25 { + 4298: fc 01 movw r30, r24 uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 436c: fc 01 movw r30, r24 + + while(ByteCount--) { + 429a: 61 15 cp r22, r1 + 429c: 71 05 cpc r23, r1 + 429e: a9 f1 breq .+106 ; 0x430a + 42a0: 68 0f add r22, r24 + 42a2: 79 1f adc r23, r25 *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 436e: 23 e6 ldi r18, 0x63 ; 99 - 4370: 33 e6 ldi r19, 0x63 ; 99 + 42a4: 23 e6 ldi r18, 0x63 ; 99 + 42a6: 33 e6 ldi r19, 0x63 ; 99 uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { uint8_t Byte = *DataPtr++; - 4372: 41 91 ld r20, Z+ + 42a8: 41 91 ld r20, Z+ Byte ^= (uint8_t) (Checksum & 0x00FF); - 4374: 42 27 eor r20, r18 + 42aa: 42 27 eor r20, r18 Byte ^= Byte << 4; - 4376: 50 e1 ldi r21, 0x10 ; 16 - 4378: 45 9f mul r20, r21 - 437a: c0 01 movw r24, r0 - 437c: 11 24 eor r1, r1 - 437e: a4 2f mov r26, r20 - 4380: a8 27 eor r26, r24 + 42ac: 50 e1 ldi r21, 0x10 ; 16 + 42ae: 45 9f mul r20, r21 + 42b0: c0 01 movw r24, r0 + 42b2: 11 24 eor r1, r1 + 42b4: a4 2f mov r26, r20 + 42b6: a8 27 eor r26, r24 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 4382: 8a 2f mov r24, r26 - 4384: 90 e0 ldi r25, 0x00 ; 0 - 4386: 58 2f mov r21, r24 - 4388: 44 27 eor r20, r20 + 42b8: 8a 2f mov r24, r26 + 42ba: 90 e0 ldi r25, 0x00 ; 0 + 42bc: 58 2f mov r21, r24 + 42be: 44 27 eor r20, r20 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 438a: 88 0f add r24, r24 - 438c: 99 1f adc r25, r25 - 438e: 88 0f add r24, r24 - 4390: 99 1f adc r25, r25 - 4392: 88 0f add r24, r24 - 4394: 99 1f adc r25, r25 + 42c0: 88 0f add r24, r24 + 42c2: 99 1f adc r25, r25 + 42c4: 88 0f add r24, r24 + 42c6: 99 1f adc r25, r25 + 42c8: 88 0f add r24, r24 + 42ca: 99 1f adc r25, r25 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 4396: 48 27 eor r20, r24 - 4398: 59 27 eor r21, r25 - 439a: 23 2f mov r18, r19 - 439c: 33 27 eor r19, r19 - 439e: 24 27 eor r18, r20 - 43a0: 35 27 eor r19, r21 + 42cc: 48 27 eor r20, r24 + 42ce: 59 27 eor r21, r25 + 42d0: 23 2f mov r18, r19 + 42d2: 33 27 eor r19, r19 + 42d4: 24 27 eor r18, r20 + 42d6: 35 27 eor r19, r21 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 43a2: a2 95 swap r26 - 43a4: af 70 andi r26, 0x0F ; 15 + 42d8: a2 95 swap r26 + 42da: af 70 andi r26, 0x0F ; 15 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 43a6: 2a 27 eor r18, r26 + 42dc: 2a 27 eor r18, r26 bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 43a8: e6 17 cp r30, r22 - 43aa: f7 07 cpc r31, r23 - 43ac: 11 f7 brne .-60 ; 0x4372 - 43ae: a9 01 movw r20, r18 - 43b0: 55 27 eor r21, r21 + 42de: e6 17 cp r30, r22 + 42e0: f7 07 cpc r31, r23 + 42e2: 11 f7 brne .-60 ; 0x42a8 + 42e4: a9 01 movw r20, r18 + 42e6: 55 27 eor r21, r21 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); - 43b2: 80 81 ld r24, Z - 43b4: 90 e0 ldi r25, 0x00 ; 0 - 43b6: 84 17 cp r24, r20 - 43b8: 95 07 cpc r25, r21 - 43ba: 11 f0 breq .+4 ; 0x43c0 - 43bc: 80 e0 ldi r24, 0x00 ; 0 + 42e8: 80 81 ld r24, Z + 42ea: 90 e0 ldi r25, 0x00 ; 0 + 42ec: 84 17 cp r24, r20 + 42ee: 95 07 cpc r25, r21 + 42f0: 11 f0 breq .+4 ; 0x42f6 + 42f2: 80 e0 ldi r24, 0x00 ; 0 } - 43be: 08 95 ret + 42f4: 08 95 ret Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); - 43c0: 41 81 ldd r20, Z+1 ; 0x01 - 43c2: 50 e0 ldi r21, 0x00 ; 0 - 43c4: 23 2f mov r18, r19 - 43c6: 33 27 eor r19, r19 - 43c8: 81 e0 ldi r24, 0x01 ; 1 - 43ca: 42 17 cp r20, r18 - 43cc: 53 07 cpc r21, r19 - 43ce: b9 f3 breq .-18 ; 0x43be - 43d0: 80 e0 ldi r24, 0x00 ; 0 - 43d2: f5 cf rjmp .-22 ; 0x43be -} - + 42f6: 41 81 ldd r20, Z+1 ; 0x01 + 42f8: 50 e0 ldi r21, 0x00 ; 0 + 42fa: 23 2f mov r18, r19 + 42fc: 33 27 eor r19, r19 + 42fe: 81 e0 ldi r24, 0x01 ; 1 + 4300: 42 17 cp r20, r18 + 4302: 53 07 cpc r21, r19 + 4304: b9 f3 breq .-18 ; 0x42f4 + 4306: 80 e0 ldi r24, 0x00 ; 0 + 4308: f5 cf rjmp .-22 ; 0x42f4 bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 43d4: fc 01 movw r30, r24 while(ByteCount--) { - 43d6: 43 e6 ldi r20, 0x63 ; 99 - 43d8: 50 e0 ldi r21, 0x00 ; 0 + 430a: 43 e6 ldi r20, 0x63 ; 99 + 430c: 50 e0 ldi r21, 0x00 ; 0 *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 43da: 23 e6 ldi r18, 0x63 ; 99 - 43dc: 33 e6 ldi r19, 0x63 ; 99 - 43de: e9 cf rjmp .-46 ; 0x43b2 + 430e: 23 e6 ldi r18, 0x63 ; 99 + 4310: 33 e6 ldi r19, 0x63 ; 99 + 4312: ea cf rjmp .-44 ; 0x42e8 -000043e0 : +00004314 : /* Split Crypto1 state into even and odd bits to speed up the output filter network */ static uint8_t StateEven[LFSR_SIZE/2] = {0}; static uint8_t StateOdd[LFSR_SIZE/2] = {0}; /* Proceed LFSR by one clock cycle */ static void Crypto1LFSR(uint8_t In) { - 43e0: cf 93 push r28 + 4314: cf 93 push r28 uint8_t Feedback = 0; /* Calculate feedback according to LFSR taps. XOR all 6 state bytes * into a single bit. */ Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); - 43e2: b0 91 df 28 lds r27, 0x28DF + 4316: b0 91 df 28 lds r27, 0x28DF Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 43e6: c0 91 e0 28 lds r28, 0x28E0 + 431a: c0 91 e0 28 lds r28, 0x28E0 Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 43ea: 40 91 e1 28 lds r20, 0x28E1 + 431e: 40 91 e1 28 lds r20, 0x28E1 Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 43ee: a0 91 dc 28 lds r26, 0x28DC + 4322: a0 91 dc 28 lds r26, 0x28DC Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 43f2: f0 91 dd 28 lds r31, 0x28DD + 4326: f0 91 dd 28 lds r31, 0x28DD Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 43f6: e0 91 de 28 lds r30, 0x28DE + 432a: e0 91 de 28 lds r30, 0x28DE uint8_t Feedback = 0; /* Calculate feedback according to LFSR taps. XOR all 6 state bytes * into a single bit. */ Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 43fa: 9c 2f mov r25, r28 - 43fc: 90 71 andi r25, 0x10 ; 16 + 432e: 9c 2f mov r25, r28 + 4330: 90 71 andi r25, 0x10 ; 16 static void Crypto1LFSR(uint8_t In) { uint8_t Feedback = 0; /* Calculate feedback according to LFSR taps. XOR all 6 state bytes * into a single bit. */ Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); - 43fe: 2b 2f mov r18, r27 - 4400: 21 7e andi r18, 0xE1 ; 225 + 4332: 2b 2f mov r18, r27 + 4334: 21 7e andi r18, 0xE1 ; 225 Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 4402: 92 27 eor r25, r18 + 4336: 92 27 eor r25, r18 Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 4404: 24 2f mov r18, r20 - 4406: 20 72 andi r18, 0x20 ; 32 - 4408: 92 27 eor r25, r18 + 4338: 24 2f mov r18, r20 + 433a: 20 72 andi r18, 0x20 ; 32 + 433c: 92 27 eor r25, r18 Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 440a: 2a 2f mov r18, r26 - 440c: 24 79 andi r18, 0x94 ; 148 - 440e: 92 27 eor r25, r18 + 433e: 2a 2f mov r18, r26 + 4340: 24 79 andi r18, 0x94 ; 148 + 4342: 92 27 eor r25, r18 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 4410: 2f 2f mov r18, r31 - 4412: 23 77 andi r18, 0x73 ; 115 - 4414: 92 27 eor r25, r18 + 4344: 2f 2f mov r18, r31 + 4346: 23 77 andi r18, 0x73 ; 115 + 4348: 92 27 eor r25, r18 Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 4416: 2e 2f mov r18, r30 - 4418: 2a 73 andi r18, 0x3A ; 58 - 441a: 92 27 eor r25, r18 + 434a: 2e 2f mov r18, r30 + 434c: 2a 73 andi r18, 0x3A ; 58 + 434e: 92 27 eor r25, r18 Feedback ^= Feedback >> 4; - 441c: 39 2f mov r19, r25 - 441e: 32 95 swap r19 - 4420: 3f 70 andi r19, 0x0F ; 15 - 4422: 39 27 eor r19, r25 + 4350: 39 2f mov r19, r25 + 4352: 32 95 swap r19 + 4354: 3f 70 andi r19, 0x0F ; 15 + 4356: 39 27 eor r19, r25 Feedback ^= Feedback >> 2; - 4424: 23 2f mov r18, r19 - 4426: 26 95 lsr r18 - 4428: 26 95 lsr r18 - 442a: 23 27 eor r18, r19 + 4358: 23 2f mov r18, r19 + 435a: 26 95 lsr r18 + 435c: 26 95 lsr r18 + 435e: 23 27 eor r18, r19 Feedback ^= Feedback >> 1; - 442c: 92 2f mov r25, r18 - 442e: 96 95 lsr r25 + 4360: 92 2f mov r25, r18 + 4362: 96 95 lsr r25 * - the new odd state becomes the old even state right-shifted by 1. * For shifting the even state, we convert it into a 32 bit int first */ uint32_t Temp = 0; Temp |= ((uint32_t) StateEven[0] << 0); Temp |= ((uint32_t) StateEven[1] << 8); Temp |= ((uint32_t) StateEven[2] << 16); - 4430: 50 e0 ldi r21, 0x00 ; 0 - 4432: 60 e0 ldi r22, 0x00 ; 0 - 4434: 70 e0 ldi r23, 0x00 ; 0 - 4436: ba 01 movw r22, r20 - 4438: 55 27 eor r21, r21 - 443a: 44 27 eor r20, r20 + 4364: 50 e0 ldi r21, 0x00 ; 0 + 4366: 60 e0 ldi r22, 0x00 ; 0 + 4368: 70 e0 ldi r23, 0x00 ; 0 + 436a: ba 01 movw r22, r20 + 436c: 55 27 eor r21, r21 + 436e: 44 27 eor r20, r20 * - the new even state becomes the old odd state * - the new odd state becomes the old even state right-shifted by 1. * For shifting the even state, we convert it into a 32 bit int first */ uint32_t Temp = 0; Temp |= ((uint32_t) StateEven[0] << 0); Temp |= ((uint32_t) StateEven[1] << 8); - 443c: 5c 2b or r21, r28 + 4370: 5c 2b or r21, r28 Temp |= ((uint32_t) StateEven[2] << 16); - 443e: 4b 2b or r20, r27 + 4372: 4b 2b or r20, r27 /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ Temp = (Temp >> 1) & 0x00FFFFFF; - 4440: 76 95 lsr r23 - 4442: 67 95 ror r22 - 4444: 57 95 ror r21 - 4446: 47 95 ror r20 + 4374: 76 95 lsr r23 + 4376: 67 95 ror r22 + 4378: 57 95 ror r21 + 437a: 47 95 ror r20 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); Feedback ^= Feedback >> 4; Feedback ^= Feedback >> 2; Feedback ^= Feedback >> 1; - 4448: 92 27 eor r25, r18 + 437c: 92 27 eor r25, r18 /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ Temp = (Temp >> 1) & 0x00FFFFFF; /* Calculate MSBit of even state as input bit to LFSR */ if ( (Feedback & 0x01) ^ In ) { - 444a: 91 70 andi r25, 0x01 ; 1 - 444c: 98 13 cpse r25, r24 + 437e: 91 70 andi r25, 0x01 ; 1 + 4380: 98 13 cpse r25, r24 Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); - 444e: 60 68 ori r22, 0x80 ; 128 + 4382: 60 68 ori r22, 0x80 ; 128 } /* Convert even state back into byte array and swap odd/even state * as explained above. */ StateEven[0] = StateOdd[0]; - 4450: a0 93 df 28 sts 0x28DF, r26 + 4384: a0 93 df 28 sts 0x28DF, r26 StateEven[1] = StateOdd[1]; - 4454: f0 93 e0 28 sts 0x28E0, r31 + 4388: f0 93 e0 28 sts 0x28E0, r31 StateEven[2] = StateOdd[2]; - 4458: e0 93 e1 28 sts 0x28E1, r30 + 438c: e0 93 e1 28 sts 0x28E1, r30 StateOdd[0] = (uint8_t) (Temp >> 0); - 445c: 40 93 dc 28 sts 0x28DC, r20 + 4390: 40 93 dc 28 sts 0x28DC, r20 StateOdd[1] = (uint8_t) (Temp >> 8); - 4460: 50 93 dd 28 sts 0x28DD, r21 + 4394: 50 93 dd 28 sts 0x28DD, r21 StateOdd[2] = (uint8_t) (Temp >> 16); - 4464: 60 93 de 28 sts 0x28DE, r22 + 4398: 60 93 de 28 sts 0x28DE, r22 } - 4468: cf 91 pop r28 - 446a: 08 95 ret + 439c: cf 91 pop r28 + 439e: 08 95 ret -0000446c : +000043a0 : uint8_t Crypto1FilterOutput(void) { - 446c: cf 93 push r28 - 446e: df 93 push r29 + 43a0: cf 93 push r28 + 43a2: df 93 push r29 * 5 bits that are used to lookup the output bit. */ uint8_t Sum = 0; Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; - 4470: c0 91 dd 28 lds r28, 0x28DD - Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 4474: 90 91 de 28 lds r25, 0x28DE - 4478: a9 2f mov r26, r25 - 447a: af 70 andi r26, 0x0F ; 15 - 447c: b0 e0 ldi r27, 0x00 ; 0 - 447e: a0 5e subi r26, 0xE0 ; 224 - 4480: bf 4d sbci r27, 0xDF ; 223 - * 5 bits that are used to lookup the output bit. - */ - uint8_t Sum = 0; - - Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; - Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; - 4482: ec 2f mov r30, r28 - 4484: ef 70 andi r30, 0x0F ; 15 - 4486: f0 e0 ldi r31, 0x00 ; 0 - 4488: e0 5e subi r30, 0xE0 ; 224 - 448a: ff 4d sbci r31, 0xDF ; 223 - 448c: d0 96 adiw r26, 0x30 ; 48 - 448e: 8c 91 ld r24, X - 4490: 20 89 ldd r18, Z+16 ; 0x10 - 4492: 82 2b or r24, r18 + 43a4: a0 91 dd 28 lds r26, 0x28DD + 43a8: ea 2f mov r30, r26 + 43aa: ef 70 andi r30, 0x0F ; 15 + 43ac: f0 e0 ldi r31, 0x00 ; 0 + 43ae: e0 5c subi r30, 0xC0 ; 192 + 43b0: ff 4d sbci r31, 0xDF ; 223 * can simply be ORed together to produce the resulting * 5 bits that are used to lookup the output bit. */ uint8_t Sum = 0; Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; - 4494: e0 91 dc 28 lds r30, 0x28DC - 4498: e2 95 swap r30 - 449a: ef 70 andi r30, 0x0F ; 15 - 449c: f0 e0 ldi r31, 0x00 ; 0 - 449e: e0 5e subi r30, 0xE0 ; 224 - 44a0: ff 4d sbci r31, 0xDF ; 223 + 43b2: c0 91 dc 28 lds r28, 0x28DC + 43b6: c2 95 swap r28 + 43b8: cf 70 andi r28, 0x0F ; 15 + 43ba: d0 e0 ldi r29, 0x00 ; 0 + 43bc: c0 5c subi r28, 0xC0 ; 192 + 43be: df 4d sbci r29, 0xDF ; 223 Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; + 43c0: e0 89 ldd r30, Z+16 ; 0x10 + 43c2: 88 81 ld r24, Y + 43c4: e8 2b or r30, r24 Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - 44a2: 20 81 ld r18, Z - 44a4: 82 2b or r24, r18 - 44a6: c2 95 swap r28 - 44a8: cf 70 andi r28, 0x0F ; 15 - 44aa: d0 e0 ldi r29, 0x00 ; 0 - 44ac: c0 5e subi r28, 0xE0 ; 224 - 44ae: df 4d sbci r29, 0xDF ; 223 + 43c6: a2 95 swap r26 + 43c8: af 70 andi r26, 0x0F ; 15 + 43ca: b0 e0 ldi r27, 0x00 ; 0 + 43cc: a0 5c subi r26, 0xC0 ; 192 + 43ce: bf 4d sbci r27, 0xDF ; 223 + 43d0: 90 96 adiw r26, 0x20 ; 32 + 43d2: 8c 91 ld r24, X + 43d4: e8 2b or r30, r24 Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 44b0: 28 a1 ldd r18, Y+32 ; 0x20 - 44b2: 82 2b or r24, r18 + 43d6: a0 91 de 28 lds r26, 0x28DE + 43da: ca 2f mov r28, r26 + 43dc: cf 70 andi r28, 0x0F ; 15 + 43de: d0 e0 ldi r29, 0x00 ; 0 + 43e0: c0 5c subi r28, 0xC0 ; 192 + 43e2: df 4d sbci r29, 0xDF ; 223 + 43e4: 88 a9 ldd r24, Y+48 ; 0x30 + 43e6: e8 2b or r30, r24 Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; - 44b4: 92 95 swap r25 - 44b6: 9f 70 andi r25, 0x0F ; 15 - 44b8: a9 2f mov r26, r25 - 44ba: b0 e0 ldi r27, 0x00 ; 0 - 44bc: a0 5a subi r26, 0xA0 ; 160 - 44be: bf 4d sbci r27, 0xDF ; 223 - 44c0: 9c 91 ld r25, X - 44c2: 89 2b or r24, r25 + 43e8: a2 95 swap r26 + 43ea: af 70 andi r26, 0x0F ; 15 + 43ec: b0 e0 ldi r27, 0x00 ; 0 + 43ee: a0 58 subi r26, 0x80 ; 128 + 43f0: bf 4d sbci r27, 0xDF ; 223 + 43f2: 8c 91 ld r24, X + 43f4: e8 2b or r30, r24 return TableC[Sum]; - 44c4: e8 2f mov r30, r24 - 44c6: f0 e0 ldi r31, 0x00 ; 0 - 44c8: e0 59 subi r30, 0x90 ; 144 - 44ca: ff 4d sbci r31, 0xDF ; 223 + 43f6: f0 e0 ldi r31, 0x00 ; 0 + 43f8: e0 5e subi r30, 0xE0 ; 224 + 43fa: ff 4d sbci r31, 0xDF ; 223 } - 44cc: 80 81 ld r24, Z - 44ce: df 91 pop r29 - 44d0: cf 91 pop r28 - 44d2: 08 95 ret + 43fc: 80 81 ld r24, Z + 43fe: df 91 pop r29 + 4400: cf 91 pop r28 + 4402: 08 95 ret -000044d4 : +00004404 : void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) { - 44d4: cf 92 push r12 - 44d6: df 92 push r13 - 44d8: ef 92 push r14 - 44da: ff 92 push r15 - 44dc: 0f 93 push r16 - 44de: 1f 93 push r17 - 44e0: cf 93 push r28 - 44e2: df 93 push r29 - 44e4: fc 01 movw r30, r24 - 44e6: db 01 movw r26, r22 - 44e8: ea 01 movw r28, r20 + 4404: af 92 push r10 + 4406: bf 92 push r11 + 4408: cf 92 push r12 + 440a: df 92 push r13 + 440c: ef 92 push r14 + 440e: ff 92 push r15 + 4410: 0f 93 push r16 + 4412: 1f 93 push r17 + 4414: cf 93 push r28 + 4416: df 93 push r29 + 4418: 5b 01 movw r10, r22 + 441a: ea 01 movw r28, r20 + 441c: dc 01 movw r26, r24 + 441e: 11 96 adiw r26, 0x01 ; 1 + 4420: 4f ed ldi r20, 0xDF ; 223 + 4422: 58 e2 ldi r21, 0x28 ; 40 + 4424: 6c ed ldi r22, 0xDC ; 220 + 4426: 78 e2 ldi r23, 0x28 ; 40 + 4428: cd 01 movw r24, r26 + 442a: 01 97 sbiw r24, 0x01 ; 1 * The inner loop generates 8 even and 8 odd bits from 16 key bits and * the outer loop stores them. */ for (i=0; i<(LFSR_SIZE/2); i++) { uint8_t EvenByte = 0; uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 44ea: 91 81 ldd r25, Z+1 ; 0x01 - 44ec: 80 e0 ldi r24, 0x00 ; 0 - 44ee: 20 81 ld r18, Z - 44f0: 82 2b or r24, r18 - 44f2: 80 fd sbrc r24, 0 - 44f4: 8d c1 rjmp .+794 ; 0x4810 - 44f6: 30 e0 ldi r19, 0x00 ; 0 - 44f8: 81 fd sbrc r24, 1 - 44fa: 88 c1 rjmp .+784 ; 0x480c - 44fc: 20 e0 ldi r18, 0x00 ; 0 + 442c: fc 01 movw r30, r24 + 442e: 20 81 ld r18, Z + 4430: 8c 91 ld r24, X + 4432: 30 e0 ldi r19, 0x00 ; 0 + 4434: 38 2b or r19, r24 + 4436: 20 ff sbrs r18, 0 + 4438: b0 c0 rjmp .+352 ; 0x459a + 443a: 00 e4 ldi r16, 0x40 ; 64 + 443c: 21 ff sbrs r18, 1 + 443e: ab c0 rjmp .+342 ; 0x4596 + 4440: 10 e4 ldi r17, 0x40 ; 64 if (KeyWord & (1<<1)) { OddByte |= 0x80; } KeyWord >>= 2; - 44fe: 96 95 lsr r25 - 4500: 87 95 ror r24 - 4502: 96 95 lsr r25 - 4504: 87 95 ror r24 + 4442: c9 01 movw r24, r18 + 4444: 96 95 lsr r25 + 4446: 87 95 ror r24 + 4448: 96 95 lsr r25 + 444a: 87 95 ror r24 for (j=0; j<8; j++) { EvenByte >>= 1; OddByte >>= 1; if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 4506: 43 2f mov r20, r19 - 4508: 40 68 ori r20, 0x80 ; 128 - 450a: 80 fd sbrc r24, 0 - 450c: 34 2f mov r19, r20 + 444c: 30 2f mov r19, r16 + 444e: 30 68 ori r19, 0x80 ; 128 + 4450: 80 ff sbrs r24, 0 + 4452: 30 2f mov r19, r16 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 450e: 42 2f mov r20, r18 - 4510: 40 68 ori r20, 0x80 ; 128 - 4512: 81 fd sbrc r24, 1 - 4514: 24 2f mov r18, r20 + 4454: 21 2f mov r18, r17 + 4456: 20 68 ori r18, 0x80 ; 128 + 4458: 81 ff sbrs r24, 1 + 445a: 21 2f mov r18, r17 } KeyWord >>= 2; - 4516: 96 95 lsr r25 - 4518: 87 95 ror r24 - 451a: 96 95 lsr r25 - 451c: 87 95 ror r24 + 445c: 96 95 lsr r25 + 445e: 87 95 ror r24 + 4460: 96 95 lsr r25 + 4462: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 451e: 36 95 lsr r19 + 4464: 36 95 lsr r19 OddByte >>= 1; - 4520: 26 95 lsr r18 + 4466: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 4522: 43 2f mov r20, r19 - 4524: 40 68 ori r20, 0x80 ; 128 - 4526: 80 fd sbrc r24, 0 - 4528: 34 2f mov r19, r20 + 4468: 13 2f mov r17, r19 + 446a: 10 68 ori r17, 0x80 ; 128 + 446c: 80 fd sbrc r24, 0 + 446e: 31 2f mov r19, r17 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 452a: 42 2f mov r20, r18 - 452c: 40 68 ori r20, 0x80 ; 128 - 452e: 81 fd sbrc r24, 1 - 4530: 24 2f mov r18, r20 + 4470: 12 2f mov r17, r18 + 4472: 10 68 ori r17, 0x80 ; 128 + 4474: 81 fd sbrc r24, 1 + 4476: 21 2f mov r18, r17 } KeyWord >>= 2; - 4532: 96 95 lsr r25 - 4534: 87 95 ror r24 - 4536: 96 95 lsr r25 - 4538: 87 95 ror r24 + 4478: 96 95 lsr r25 + 447a: 87 95 ror r24 + 447c: 96 95 lsr r25 + 447e: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 453a: 36 95 lsr r19 + 4480: 36 95 lsr r19 OddByte >>= 1; - 453c: 26 95 lsr r18 + 4482: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 453e: 43 2f mov r20, r19 - 4540: 40 68 ori r20, 0x80 ; 128 - 4542: 80 fd sbrc r24, 0 - 4544: 34 2f mov r19, r20 + 4484: 13 2f mov r17, r19 + 4486: 10 68 ori r17, 0x80 ; 128 + 4488: 80 fd sbrc r24, 0 + 448a: 31 2f mov r19, r17 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 4546: 42 2f mov r20, r18 - 4548: 40 68 ori r20, 0x80 ; 128 - 454a: 81 fd sbrc r24, 1 - 454c: 24 2f mov r18, r20 + 448c: 12 2f mov r17, r18 + 448e: 10 68 ori r17, 0x80 ; 128 + 4490: 81 fd sbrc r24, 1 + 4492: 21 2f mov r18, r17 } KeyWord >>= 2; - 454e: 96 95 lsr r25 - 4550: 87 95 ror r24 - 4552: 96 95 lsr r25 - 4554: 87 95 ror r24 + 4494: 96 95 lsr r25 + 4496: 87 95 ror r24 + 4498: 96 95 lsr r25 + 449a: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 4556: 36 95 lsr r19 + 449c: 36 95 lsr r19 OddByte >>= 1; - 4558: 26 95 lsr r18 + 449e: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 455a: 43 2f mov r20, r19 - 455c: 40 68 ori r20, 0x80 ; 128 - 455e: 80 fd sbrc r24, 0 - 4560: 34 2f mov r19, r20 + 44a0: 13 2f mov r17, r19 + 44a2: 10 68 ori r17, 0x80 ; 128 + 44a4: 80 fd sbrc r24, 0 + 44a6: 31 2f mov r19, r17 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 4562: 42 2f mov r20, r18 - 4564: 40 68 ori r20, 0x80 ; 128 - 4566: 81 fd sbrc r24, 1 - 4568: 24 2f mov r18, r20 + 44a8: 12 2f mov r17, r18 + 44aa: 10 68 ori r17, 0x80 ; 128 + 44ac: 81 fd sbrc r24, 1 + 44ae: 21 2f mov r18, r17 } KeyWord >>= 2; - 456a: 96 95 lsr r25 - 456c: 87 95 ror r24 - 456e: 96 95 lsr r25 - 4570: 87 95 ror r24 + 44b0: 96 95 lsr r25 + 44b2: 87 95 ror r24 + 44b4: 96 95 lsr r25 + 44b6: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 4572: 36 95 lsr r19 + 44b8: 36 95 lsr r19 OddByte >>= 1; - 4574: 26 95 lsr r18 + 44ba: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 4576: 43 2f mov r20, r19 - 4578: 40 68 ori r20, 0x80 ; 128 - 457a: 80 fd sbrc r24, 0 - 457c: 34 2f mov r19, r20 + 44bc: 13 2f mov r17, r19 + 44be: 10 68 ori r17, 0x80 ; 128 + 44c0: 80 fd sbrc r24, 0 + 44c2: 31 2f mov r19, r17 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 457e: 42 2f mov r20, r18 - 4580: 40 68 ori r20, 0x80 ; 128 - 4582: 81 fd sbrc r24, 1 - 4584: 24 2f mov r18, r20 + 44c4: 12 2f mov r17, r18 + 44c6: 10 68 ori r17, 0x80 ; 128 + 44c8: 81 fd sbrc r24, 1 + 44ca: 21 2f mov r18, r17 } KeyWord >>= 2; - 4586: 96 95 lsr r25 - 4588: 87 95 ror r24 - 458a: 96 95 lsr r25 - 458c: 87 95 ror r24 + 44cc: 96 95 lsr r25 + 44ce: 87 95 ror r24 + 44d0: 96 95 lsr r25 + 44d2: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 458e: 36 95 lsr r19 + 44d4: 36 95 lsr r19 OddByte >>= 1; - 4590: 26 95 lsr r18 + 44d6: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 4592: 43 2f mov r20, r19 - 4594: 40 68 ori r20, 0x80 ; 128 - 4596: 80 fd sbrc r24, 0 - 4598: 34 2f mov r19, r20 + 44d8: 13 2f mov r17, r19 + 44da: 10 68 ori r17, 0x80 ; 128 + 44dc: 80 fd sbrc r24, 0 + 44de: 31 2f mov r19, r17 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 459a: 42 2f mov r20, r18 - 459c: 40 68 ori r20, 0x80 ; 128 - 459e: 81 fd sbrc r24, 1 - 45a0: 24 2f mov r18, r20 + 44e0: 12 2f mov r17, r18 + 44e2: 10 68 ori r17, 0x80 ; 128 + 44e4: 81 fd sbrc r24, 1 + 44e6: 21 2f mov r18, r17 } KeyWord >>= 2; - 45a2: 96 95 lsr r25 - 45a4: 87 95 ror r24 - 45a6: 96 95 lsr r25 - 45a8: 87 95 ror r24 + 44e8: 96 95 lsr r25 + 44ea: 87 95 ror r24 + 44ec: 96 95 lsr r25 + 44ee: 87 95 ror r24 uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; uint8_t j; for (j=0; j<8; j++) { EvenByte >>= 1; - 45aa: 36 95 lsr r19 + 44f0: 36 95 lsr r19 OddByte >>= 1; - 45ac: 26 95 lsr r18 + 44f2: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 45ae: 53 2f mov r21, r19 - 45b0: 50 68 ori r21, 0x80 ; 128 + 44f4: 03 2f mov r16, r19 + 44f6: 00 68 ori r16, 0x80 ; 128 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 45b2: 42 2f mov r20, r18 - 45b4: 40 68 ori r20, 0x80 ; 128 + 44f8: 12 2f mov r17, r18 + 44fa: 10 68 ori r17, 0x80 ; 128 + 44fc: 80 fd sbrc r24, 0 + 44fe: 30 2f mov r19, r16 } KeyWord >>= 2; } StateEven[i] = EvenByte; - 45b6: 80 fd sbrc r24, 0 - 45b8: 35 2f mov r19, r21 - 45ba: 30 93 df 28 sts 0x28DF, r19 + 4500: fa 01 movw r30, r20 + 4502: 31 93 st Z+, r19 + 4504: af 01 movw r20, r30 + 4506: 81 fd sbrc r24, 1 + 4508: 21 2f mov r18, r17 StateOdd[i] = OddByte; - 45be: 81 fd sbrc r24, 1 - 45c0: 24 2f mov r18, r20 - 45c2: 20 93 dc 28 sts 0x28DC, r18 + 450a: fb 01 movw r30, r22 + 450c: 21 93 st Z+, r18 + 450e: bf 01 movw r22, r30 + 4510: 12 96 adiw r26, 0x02 ; 2 + + /* Again, one trade off when splitting up the state into even/odd parts + * is that loading the key into the state becomes a little more difficult. * The inner loop generates 8 even and 8 odd bits from 16 key bits and * the outer loop stores them. */ for (i=0; i<(LFSR_SIZE/2); i++) { - uint8_t EvenByte = 0; - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 45c6: 93 81 ldd r25, Z+3 ; 0x03 - 45c8: 80 e0 ldi r24, 0x00 ; 0 - 45ca: 22 81 ldd r18, Z+2 ; 0x02 - 45cc: 82 2b or r24, r18 - 45ce: 80 fd sbrc r24, 0 - 45d0: 1b c1 rjmp .+566 ; 0x4808 - 45d2: 30 e0 ldi r19, 0x00 ; 0 - 45d4: 81 fd sbrc r24, 1 - 45d6: 16 c1 rjmp .+556 ; 0x4804 - 45d8: 20 e0 ldi r18, 0x00 ; 0 - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - 45da: 96 95 lsr r25 - 45dc: 87 95 ror r24 - 45de: 96 95 lsr r25 - 45e0: 87 95 ror r24 - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 45e2: 43 2f mov r20, r19 - 45e4: 40 68 ori r20, 0x80 ; 128 - 45e6: 80 fd sbrc r24, 0 - 45e8: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 45ea: 42 2f mov r20, r18 - 45ec: 40 68 ori r20, 0x80 ; 128 - 45ee: 81 fd sbrc r24, 1 - 45f0: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 45f2: 96 95 lsr r25 - 45f4: 87 95 ror r24 - 45f6: 96 95 lsr r25 - 45f8: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 45fa: 36 95 lsr r19 - OddByte >>= 1; - 45fc: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 45fe: 43 2f mov r20, r19 - 4600: 40 68 ori r20, 0x80 ; 128 - 4602: 80 fd sbrc r24, 0 - 4604: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 4606: 42 2f mov r20, r18 - 4608: 40 68 ori r20, 0x80 ; 128 - 460a: 81 fd sbrc r24, 1 - 460c: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 460e: 96 95 lsr r25 - 4610: 87 95 ror r24 - 4612: 96 95 lsr r25 - 4614: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 4616: 36 95 lsr r19 - OddByte >>= 1; - 4618: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 461a: 43 2f mov r20, r19 - 461c: 40 68 ori r20, 0x80 ; 128 - 461e: 80 fd sbrc r24, 0 - 4620: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 4622: 42 2f mov r20, r18 - 4624: 40 68 ori r20, 0x80 ; 128 - 4626: 81 fd sbrc r24, 1 - 4628: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 462a: 96 95 lsr r25 - 462c: 87 95 ror r24 - 462e: 96 95 lsr r25 - 4630: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 4632: 36 95 lsr r19 - OddByte >>= 1; - 4634: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 4636: 43 2f mov r20, r19 - 4638: 40 68 ori r20, 0x80 ; 128 - 463a: 80 fd sbrc r24, 0 - 463c: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 463e: 42 2f mov r20, r18 - 4640: 40 68 ori r20, 0x80 ; 128 - 4642: 81 fd sbrc r24, 1 - 4644: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 4646: 96 95 lsr r25 - 4648: 87 95 ror r24 - 464a: 96 95 lsr r25 - 464c: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 464e: 36 95 lsr r19 - OddByte >>= 1; - 4650: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 4652: 43 2f mov r20, r19 - 4654: 40 68 ori r20, 0x80 ; 128 - 4656: 80 fd sbrc r24, 0 - 4658: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 465a: 42 2f mov r20, r18 - 465c: 40 68 ori r20, 0x80 ; 128 - 465e: 81 fd sbrc r24, 1 - 4660: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 4662: 96 95 lsr r25 - 4664: 87 95 ror r24 - 4666: 96 95 lsr r25 - 4668: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 466a: 36 95 lsr r19 - OddByte >>= 1; - 466c: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 466e: 43 2f mov r20, r19 - 4670: 40 68 ori r20, 0x80 ; 128 - 4672: 80 fd sbrc r24, 0 - 4674: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 4676: 42 2f mov r20, r18 - 4678: 40 68 ori r20, 0x80 ; 128 - 467a: 81 fd sbrc r24, 1 - 467c: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 467e: 96 95 lsr r25 - 4680: 87 95 ror r24 - 4682: 96 95 lsr r25 - 4684: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 4686: 36 95 lsr r19 - OddByte >>= 1; - 4688: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 468a: 53 2f mov r21, r19 - 468c: 50 68 ori r21, 0x80 ; 128 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 468e: 42 2f mov r20, r18 - 4690: 40 68 ori r20, 0x80 ; 128 - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - 4692: 80 fd sbrc r24, 0 - 4694: 35 2f mov r19, r21 - 4696: 30 93 e0 28 sts 0x28E0, r19 - StateOdd[i] = OddByte; - 469a: 81 fd sbrc r24, 1 - 469c: 24 2f mov r18, r20 - 469e: 20 93 dd 28 sts 0x28DD, r18 - * The inner loop generates 8 even and 8 odd bits from 16 key bits and - * the outer loop stores them. */ - for (i=0; i<(LFSR_SIZE/2); i++) { - uint8_t EvenByte = 0; - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 46a2: 95 81 ldd r25, Z+5 ; 0x05 - 46a4: 80 e0 ldi r24, 0x00 ; 0 - 46a6: 24 81 ldd r18, Z+4 ; 0x04 - 46a8: 82 2b or r24, r18 - 46aa: 80 fd sbrc r24, 0 - 46ac: a9 c0 rjmp .+338 ; 0x4800 - 46ae: 30 e0 ldi r19, 0x00 ; 0 - 46b0: 81 fd sbrc r24, 1 - 46b2: a4 c0 rjmp .+328 ; 0x47fc - 46b4: 20 e0 ldi r18, 0x00 ; 0 - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - 46b6: 96 95 lsr r25 - 46b8: 87 95 ror r24 - 46ba: 96 95 lsr r25 - 46bc: 87 95 ror r24 - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 46be: 43 2f mov r20, r19 - 46c0: 40 68 ori r20, 0x80 ; 128 - 46c2: 80 fd sbrc r24, 0 - 46c4: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 46c6: 42 2f mov r20, r18 - 46c8: 40 68 ori r20, 0x80 ; 128 - 46ca: 81 fd sbrc r24, 1 - 46cc: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 46ce: 96 95 lsr r25 - 46d0: 87 95 ror r24 - 46d2: 96 95 lsr r25 - 46d4: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 46d6: 36 95 lsr r19 - OddByte >>= 1; - 46d8: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 46da: 43 2f mov r20, r19 - 46dc: 40 68 ori r20, 0x80 ; 128 - 46de: 80 fd sbrc r24, 0 - 46e0: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 46e2: 42 2f mov r20, r18 - 46e4: 40 68 ori r20, 0x80 ; 128 - 46e6: 81 fd sbrc r24, 1 - 46e8: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 46ea: 96 95 lsr r25 - 46ec: 87 95 ror r24 - 46ee: 96 95 lsr r25 - 46f0: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 46f2: 36 95 lsr r19 - OddByte >>= 1; - 46f4: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 46f6: 43 2f mov r20, r19 - 46f8: 40 68 ori r20, 0x80 ; 128 - 46fa: 80 fd sbrc r24, 0 - 46fc: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 46fe: 42 2f mov r20, r18 - 4700: 40 68 ori r20, 0x80 ; 128 - 4702: 81 fd sbrc r24, 1 - 4704: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 4706: 96 95 lsr r25 - 4708: 87 95 ror r24 - 470a: 96 95 lsr r25 - 470c: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 470e: 36 95 lsr r19 - OddByte >>= 1; - 4710: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 4712: 43 2f mov r20, r19 - 4714: 40 68 ori r20, 0x80 ; 128 - 4716: 80 fd sbrc r24, 0 - 4718: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 471a: 42 2f mov r20, r18 - 471c: 40 68 ori r20, 0x80 ; 128 - 471e: 81 fd sbrc r24, 1 - 4720: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 4722: 96 95 lsr r25 - 4724: 87 95 ror r24 - 4726: 96 95 lsr r25 - 4728: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 472a: 36 95 lsr r19 - OddByte >>= 1; - 472c: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 472e: 43 2f mov r20, r19 - 4730: 40 68 ori r20, 0x80 ; 128 - 4732: 80 fd sbrc r24, 0 - 4734: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 4736: 42 2f mov r20, r18 - 4738: 40 68 ori r20, 0x80 ; 128 - 473a: 81 fd sbrc r24, 1 - 473c: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 473e: 96 95 lsr r25 - 4740: 87 95 ror r24 - 4742: 96 95 lsr r25 - 4744: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 4746: 36 95 lsr r19 - OddByte >>= 1; - 4748: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 474a: 43 2f mov r20, r19 - 474c: 40 68 ori r20, 0x80 ; 128 - 474e: 80 fd sbrc r24, 0 - 4750: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 4752: 42 2f mov r20, r18 - 4754: 40 68 ori r20, 0x80 ; 128 - 4756: 81 fd sbrc r24, 1 - 4758: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 475a: 96 95 lsr r25 - 475c: 87 95 ror r24 - 475e: 96 95 lsr r25 - 4760: 87 95 ror r24 - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - 4762: 36 95 lsr r19 - OddByte >>= 1; - 4764: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 4766: 53 2f mov r21, r19 - 4768: 50 68 ori r21, 0x80 ; 128 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 476a: 42 2f mov r20, r18 - 476c: 40 68 ori r20, 0x80 ; 128 - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - 476e: 80 fd sbrc r24, 0 - 4770: 35 2f mov r19, r21 - 4772: 30 93 e1 28 sts 0x28E1, r19 - StateOdd[i] = OddByte; - 4776: 81 fd sbrc r24, 1 - 4778: 24 2f mov r18, r20 - 477a: 20 93 de 28 sts 0x28DE, r18 + 4512: f8 e2 ldi r31, 0x28 ; 40 + 4514: 42 3e cpi r20, 0xE2 ; 226 + 4516: 5f 07 cpc r21, r31 + 4518: 09 f0 breq .+2 ; 0x451c + 451a: 86 cf rjmp .-244 ; 0x4428 /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the * Crypto1 LFSR.*/ uint32_t Temp = 0; Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - 477e: 89 81 ldd r24, Y+1 ; 0x01 - 4780: 11 96 adiw r26, 0x01 ; 1 - 4782: 9c 91 ld r25, X - 4784: 11 97 sbiw r26, 0x01 ; 1 - 4786: 89 27 eor r24, r25 + 451c: f5 01 movw r30, r10 + 451e: 81 81 ldd r24, Z+1 ; 0x01 + 4520: 99 81 ldd r25, Y+1 ; 0x01 + 4522: 89 27 eor r24, r25 Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 4788: ca 80 ldd r12, Y+2 ; 0x02 - 478a: 12 96 adiw r26, 0x02 ; 2 - 478c: 9c 91 ld r25, X - 478e: 12 97 sbiw r26, 0x02 ; 2 - 4790: c9 26 eor r12, r25 - 4792: d1 2c mov r13, r1 - 4794: e1 2c mov r14, r1 - 4796: f1 2c mov r15, r1 - 4798: 76 01 movw r14, r12 - 479a: dd 24 eor r13, r13 - 479c: cc 24 eor r12, r12 + 4524: c2 80 ldd r12, Z+2 ; 0x02 + 4526: 9a 81 ldd r25, Y+2 ; 0x02 + 4528: c9 26 eor r12, r25 + 452a: d1 2c mov r13, r1 + 452c: e1 2c mov r14, r1 + 452e: f1 2c mov r15, r1 + 4530: 76 01 movw r14, r12 + 4532: dd 24 eor r13, r13 + 4534: cc 24 eor r12, r12 /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the * Crypto1 LFSR.*/ uint32_t Temp = 0; Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - 479e: d8 2a or r13, r24 + 4536: d8 2a or r13, r24 /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the * Crypto1 LFSR.*/ uint32_t Temp = 0; Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; - 47a0: 88 81 ld r24, Y - 47a2: 9c 91 ld r25, X - 47a4: 89 27 eor r24, r25 + 4538: 80 81 ld r24, Z + 453a: 98 81 ld r25, Y + 453c: 89 27 eor r24, r25 Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 47a6: c8 2a or r12, r24 + 453e: c8 2a or r12, r24 Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; - 47a8: 8b 81 ldd r24, Y+3 ; 0x03 - 47aa: 13 96 adiw r26, 0x03 ; 3 - 47ac: 9c 91 ld r25, X - 47ae: 89 27 eor r24, r25 - 47b0: f8 2a or r15, r24 - 47b2: 10 e2 ldi r17, 0x20 ; 32 + 4540: 83 81 ldd r24, Z+3 ; 0x03 + 4542: 9b 81 ldd r25, Y+3 ; 0x03 + 4544: 89 27 eor r24, r25 + 4546: f8 2a or r15, r24 + 4548: 10 e2 ldi r17, 0x20 ; 32 for (i=0; i<32; i++) { uint8_t Out = Crypto1FilterOutput(); - 47b4: 5b de rcall .-842 ; 0x446c - 47b6: 08 2f mov r16, r24 + 454a: 2a df rcall .-428 ; 0x43a0 + 454c: 08 2f mov r16, r24 Crypto1LFSR(Temp & 0x01); - 47b8: 8c 2d mov r24, r12 - 47ba: 81 70 andi r24, 0x01 ; 1 - 47bc: 11 de rcall .-990 ; 0x43e0 + 454e: 8c 2d mov r24, r12 + 4550: 81 70 andi r24, 0x01 ; 1 + 4552: e0 de rcall .-576 ; 0x4314 Temp >>= 1; - 47be: f6 94 lsr r15 - 47c0: e7 94 ror r14 - 47c2: d7 94 ror r13 - 47c4: c7 94 ror r12 + 4554: f6 94 lsr r15 + 4556: e7 94 ror r14 + 4558: d7 94 ror r13 + 455a: c7 94 ror r12 /* Store the keystream for later use */ if (Out) { - 47c6: 00 23 and r16, r16 - 47c8: 11 f0 breq .+4 ; 0x47ce + 455c: 00 23 and r16, r16 + 455e: 11 f0 breq .+4 ; 0x4564 Temp |= (uint32_t) 1 << 31; - 47ca: 68 94 set - 47cc: f7 f8 bld r15, 7 - 47ce: 11 50 subi r17, 0x01 ; 1 + 4560: 68 94 set + 4562: f7 f8 bld r15, 7 + 4564: 11 50 subi r17, 0x01 ; 1 Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; for (i=0; i<32; i++) { - 47d0: 89 f7 brne .-30 ; 0x47b4 + 4566: 89 f7 brne .-30 ; 0x454a } /* Crypto1 state register is now set up to be used for authentication. * In case of nested authentication, we need to use the produced keystream * to encrypt the CardNonce. For this case we do the encryption in-place. */ CardNonce[0] ^= (uint8_t) (Temp >> 0); - 47d2: 88 81 ld r24, Y - 47d4: 8c 25 eor r24, r12 - 47d6: 88 83 st Y, r24 + 4568: 88 81 ld r24, Y + 456a: 8c 25 eor r24, r12 + 456c: 88 83 st Y, r24 CardNonce[1] ^= (uint8_t) (Temp >> 8); - 47d8: 89 81 ldd r24, Y+1 ; 0x01 - 47da: 8d 25 eor r24, r13 - 47dc: 89 83 std Y+1, r24 ; 0x01 + 456e: 89 81 ldd r24, Y+1 ; 0x01 + 4570: 8d 25 eor r24, r13 + 4572: 89 83 std Y+1, r24 ; 0x01 CardNonce[2] ^= (uint8_t) (Temp >> 16); - 47de: 8a 81 ldd r24, Y+2 ; 0x02 - 47e0: 8e 25 eor r24, r14 - 47e2: 8a 83 std Y+2, r24 ; 0x02 + 4574: 8a 81 ldd r24, Y+2 ; 0x02 + 4576: 8e 25 eor r24, r14 + 4578: 8a 83 std Y+2, r24 ; 0x02 CardNonce[3] ^= (uint8_t) (Temp >> 24); - 47e4: 8b 81 ldd r24, Y+3 ; 0x03 - 47e6: 8f 25 eor r24, r15 - 47e8: 8b 83 std Y+3, r24 ; 0x03 + 457a: 8b 81 ldd r24, Y+3 ; 0x03 + 457c: 8f 25 eor r24, r15 + 457e: 8b 83 std Y+3, r24 ; 0x03 } - 47ea: df 91 pop r29 - 47ec: cf 91 pop r28 - 47ee: 1f 91 pop r17 - 47f0: 0f 91 pop r16 - 47f2: ff 90 pop r15 - 47f4: ef 90 pop r14 - 47f6: df 90 pop r13 - 47f8: cf 90 pop r12 - 47fa: 08 95 ret - 47fc: 20 e4 ldi r18, 0x40 ; 64 - 47fe: 5b cf rjmp .-330 ; 0x46b6 - 4800: 30 e4 ldi r19, 0x40 ; 64 - 4802: 56 cf rjmp .-340 ; 0x46b0 - 4804: 20 e4 ldi r18, 0x40 ; 64 - 4806: e9 ce rjmp .-558 ; 0x45da - 4808: 30 e4 ldi r19, 0x40 ; 64 - 480a: e4 ce rjmp .-568 ; 0x45d4 - 480c: 20 e4 ldi r18, 0x40 ; 64 - 480e: 77 ce rjmp .-786 ; 0x44fe - 4810: 30 e4 ldi r19, 0x40 ; 64 - 4812: 72 ce rjmp .-796 ; 0x44f8 + 4580: df 91 pop r29 + 4582: cf 91 pop r28 + 4584: 1f 91 pop r17 + 4586: 0f 91 pop r16 + 4588: ff 90 pop r15 + 458a: ef 90 pop r14 + 458c: df 90 pop r13 + 458e: cf 90 pop r12 + 4590: bf 90 pop r11 + 4592: af 90 pop r10 + 4594: 08 95 ret + 4596: 10 e0 ldi r17, 0x00 ; 0 + 4598: 54 cf rjmp .-344 ; 0x4442 + 459a: 00 e0 ldi r16, 0x00 ; 0 + 459c: 4f cf rjmp .-354 ; 0x443c -00004814 : +0000459e : void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) { - 4814: cf 92 push r12 - 4816: df 92 push r13 - 4818: ef 92 push r14 - 481a: ff 92 push r15 - 481c: cf 93 push r28 - 481e: fc 01 movw r30, r24 + 459e: cf 92 push r12 + 45a0: df 92 push r13 + 45a2: ef 92 push r14 + 45a4: ff 92 push r15 + 45a6: cf 93 push r28 + 45a8: fc 01 movw r30, r24 uint32_t Temp = 0; /* For ease of processing, we convert the encrypted reader nonce * into a 32 bit integer */ Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; - 4820: 81 81 ldd r24, Z+1 ; 0x01 + 45aa: 81 81 ldd r24, Z+1 ; 0x01 Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 4822: c2 80 ldd r12, Z+2 ; 0x02 - 4824: d1 2c mov r13, r1 - 4826: e1 2c mov r14, r1 - 4828: f1 2c mov r15, r1 - 482a: 76 01 movw r14, r12 - 482c: dd 24 eor r13, r13 - 482e: cc 24 eor r12, r12 + 45ac: c2 80 ldd r12, Z+2 ; 0x02 + 45ae: d1 2c mov r13, r1 + 45b0: e1 2c mov r14, r1 + 45b2: f1 2c mov r15, r1 + 45b4: 76 01 movw r14, r12 + 45b6: dd 24 eor r13, r13 + 45b8: cc 24 eor r12, r12 uint32_t Temp = 0; /* For ease of processing, we convert the encrypted reader nonce * into a 32 bit integer */ Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; - 4830: d8 2a or r13, r24 + 45ba: d8 2a or r13, r24 { uint32_t Temp = 0; /* For ease of processing, we convert the encrypted reader nonce * into a 32 bit integer */ Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; - 4832: 80 81 ld r24, Z + 45bc: 80 81 ld r24, Z Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 4834: c8 2a or r12, r24 + 45be: c8 2a or r12, r24 Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; - 4836: 83 81 ldd r24, Z+3 ; 0x03 - 4838: f8 2a or r15, r24 - 483a: c0 e2 ldi r28, 0x20 ; 32 + 45c0: 83 81 ldd r24, Z+3 ; 0x03 + 45c2: f8 2a or r15, r24 + 45c4: c0 e2 ldi r28, 0x20 ; 32 uint8_t i; for (i=0; i<32; i++) { /* Decrypt one output bit of the given encrypted nonce using the * filter output as keystream. */ uint8_t Out = Crypto1FilterOutput(); - 483c: 17 de rcall .-978 ; 0x446c + 45c6: ec de rcall .-552 ; 0x43a0 uint8_t Bit = Out ^ (Temp & 0x01); - 483e: b7 01 movw r22, r14 - 4840: a6 01 movw r20, r12 - 4842: 41 70 andi r20, 0x01 ; 1 - 4844: 55 27 eor r21, r21 - 4846: 66 27 eor r22, r22 - 4848: 77 27 eor r23, r23 + 45c8: 9c 2d mov r25, r12 + 45ca: 91 70 andi r25, 0x01 ; 1 /* Feed back the bit to load the LFSR with the (decrypted) nonce */ Crypto1LFSR(Bit); - 484a: 84 27 eor r24, r20 - 484c: c9 dd rcall .-1134 ; 0x43e0 + 45cc: 89 27 eor r24, r25 + 45ce: a2 de rcall .-700 ; 0x4314 Temp >>= 1; - 484e: f6 94 lsr r15 - 4850: e7 94 ror r14 - 4852: d7 94 ror r13 - 4854: c7 94 ror r12 - 4856: c1 50 subi r28, 0x01 ; 1 + 45d0: f6 94 lsr r15 + 45d2: e7 94 ror r14 + 45d4: d7 94 ror r13 + 45d6: c7 94 ror r12 + 45d8: c1 50 subi r28, 0x01 ; 1 Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; uint8_t i; for (i=0; i<32; i++) { - 4858: 89 f7 brne .-30 ; 0x483c + 45da: a9 f7 brne .-22 ; 0x45c6 /* Feed back the bit to load the LFSR with the (decrypted) nonce */ Crypto1LFSR(Bit); Temp >>= 1; } } - 485a: cf 91 pop r28 - 485c: ff 90 pop r15 - 485e: ef 90 pop r14 - 4860: df 90 pop r13 - 4862: cf 90 pop r12 - 4864: 08 95 ret + 45dc: cf 91 pop r28 + 45de: ff 90 pop r15 + 45e0: ef 90 pop r14 + 45e2: df 90 pop r13 + 45e4: cf 90 pop r12 + 45e6: 08 95 ret -00004866 : +000045e8 : uint8_t Crypto1Byte(void) { - 4866: cf 93 push r28 - 4868: df 93 push r29 + 45e8: 1f 93 push r17 + 45ea: cf 93 push r28 + 45ec: df 93 push r29 + 45ee: d8 e0 ldi r29, 0x08 ; 8 + uint8_t KeyStream = 0; + 45f0: c0 e0 ldi r28, 0x00 ; 0 /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 486a: 00 de rcall .-1024 ; 0x446c - 486c: c8 2f mov r28, r24 + 45f2: d6 de rcall .-596 ; 0x43a0 + 45f4: 18 2f mov r17, r24 Crypto1LFSR(0); - 486e: 80 e0 ldi r24, 0x00 ; 0 - 4870: b7 dd rcall .-1170 ; 0x43e0 + 45f6: 80 e0 ldi r24, 0x00 ; 0 + 45f8: 8d de rcall .-742 ; 0x4314 /* Store keystream bit */ KeyStream >>= 1; + 45fa: c6 95 lsr r28 if (Out) { - 4872: cc 23 and r28, r28 - 4874: 09 f4 brne .+2 ; 0x4878 - 4876: 36 c0 rjmp .+108 ; 0x48e4 + 45fc: 11 11 cpse r17, r1 KeyStream |= (1<<7); - 4878: c0 e8 ldi r28, 0x80 ; 128 + 45fe: c0 68 ori r28, 0x80 ; 128 + 4600: d1 50 subi r29, 0x01 ; 1 +{ + uint8_t KeyStream = 0; + uint8_t i; + /* Generate 8 keystream-bits */ for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 487a: f8 dd rcall .-1040 ; 0x446c - 487c: d8 2f mov r29, r24 - Crypto1LFSR(0); - 487e: 80 e0 ldi r24, 0x00 ; 0 - 4880: af dd rcall .-1186 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 4882: c6 95 lsr r28 - - if (Out) { - 4884: d1 11 cpse r29, r1 + 4602: b9 f7 brne .-18 ; 0x45f2 KeyStream |= (1<<7); - 4886: c0 68 ori r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 4888: f1 dd rcall .-1054 ; 0x446c - 488a: d8 2f mov r29, r24 - Crypto1LFSR(0); - 488c: 80 e0 ldi r24, 0x00 ; 0 - 488e: a8 dd rcall .-1200 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 4890: c6 95 lsr r28 - - if (Out) { - 4892: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 4894: c0 68 ori r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 4896: ea dd rcall .-1068 ; 0x446c - 4898: d8 2f mov r29, r24 - Crypto1LFSR(0); - 489a: 80 e0 ldi r24, 0x00 ; 0 - 489c: a1 dd rcall .-1214 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 489e: c6 95 lsr r28 - - if (Out) { - 48a0: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 48a2: c0 68 ori r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 48a4: e3 dd rcall .-1082 ; 0x446c - 48a6: d8 2f mov r29, r24 - Crypto1LFSR(0); - 48a8: 80 e0 ldi r24, 0x00 ; 0 - 48aa: 9a dd rcall .-1228 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 48ac: c6 95 lsr r28 - - if (Out) { - 48ae: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 48b0: c0 68 ori r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 48b2: dc dd rcall .-1096 ; 0x446c - 48b4: d8 2f mov r29, r24 - Crypto1LFSR(0); - 48b6: 80 e0 ldi r24, 0x00 ; 0 - 48b8: 93 dd rcall .-1242 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 48ba: c6 95 lsr r28 - - if (Out) { - 48bc: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 48be: c0 68 ori r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 48c0: d5 dd rcall .-1110 ; 0x446c - 48c2: d8 2f mov r29, r24 - Crypto1LFSR(0); - 48c4: 80 e0 ldi r24, 0x00 ; 0 - 48c6: 8c dd rcall .-1256 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 48c8: c6 95 lsr r28 - - if (Out) { - 48ca: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 48cc: c0 68 ori r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 48ce: ce dd rcall .-1124 ; 0x446c - 48d0: d8 2f mov r29, r24 - Crypto1LFSR(0); - 48d2: 80 e0 ldi r24, 0x00 ; 0 - 48d4: 85 dd rcall .-1270 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 48d6: 8c 2f mov r24, r28 - 48d8: 86 95 lsr r24 - - if (Out) { - 48da: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 48dc: 80 68 ori r24, 0x80 ; 128 } } return KeyStream; } - 48de: df 91 pop r29 - 48e0: cf 91 pop r28 - 48e2: 08 95 ret - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); + 4604: 8c 2f mov r24, r28 + 4606: df 91 pop r29 + 4608: cf 91 pop r28 + 460a: 1f 91 pop r17 + 460c: 08 95 ret - /* Store keystream bit */ - KeyStream >>= 1; - 48e4: c0 e0 ldi r28, 0x00 ; 0 - 48e6: c9 cf rjmp .-110 ; 0x487a - -000048e8 : - - return KeyStream; -} +0000460e : uint8_t Crypto1Nibble(void) { - 48e8: cf 93 push r28 - 48ea: df 93 push r29 + 460e: 1f 93 push r17 + 4610: cf 93 push r28 + 4612: df 93 push r29 + 4614: d4 e0 ldi r29, 0x04 ; 4 + uint8_t KeyStream = 0; + 4616: c0 e0 ldi r28, 0x00 ; 0 /* Generate 4 keystream-bits */ for (i=0; i<4; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); - 48ec: bf dd rcall .-1154 ; 0x446c - 48ee: c8 2f mov r28, r24 + 4618: c3 de rcall .-634 ; 0x43a0 + 461a: 18 2f mov r17, r24 Crypto1LFSR(0); - 48f0: 80 e0 ldi r24, 0x00 ; 0 - 48f2: 76 dd rcall .-1300 ; 0x43e0 + 461c: 80 e0 ldi r24, 0x00 ; 0 + 461e: 7a de rcall .-780 ; 0x4314 /* Store keystream bit */ KeyStream >>= 1; + 4620: c6 95 lsr r28 if (Out) { - 48f4: cc 23 and r28, r28 - 48f6: d1 f0 breq .+52 ; 0x492c + 4622: 11 11 cpse r17, r1 KeyStream |= (1<<3); - 48f8: c8 e0 ldi r28, 0x08 ; 8 + 4624: c8 60 ori r28, 0x08 ; 8 + 4626: d1 50 subi r29, 0x01 ; 1 +{ + uint8_t KeyStream = 0; + uint8_t i; + /* Generate 4 keystream-bits */ for (i=0; i<4; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 48fa: b8 dd rcall .-1168 ; 0x446c - 48fc: d8 2f mov r29, r24 - Crypto1LFSR(0); - 48fe: 80 e0 ldi r24, 0x00 ; 0 - 4900: 6f dd rcall .-1314 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 4902: c6 95 lsr r28 - - if (Out) { - 4904: d1 11 cpse r29, r1 + 4628: b9 f7 brne .-18 ; 0x4618 KeyStream |= (1<<3); - 4906: c8 60 ori r28, 0x08 ; 8 - /* Generate 4 keystream-bits */ - for (i=0; i<4; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 4908: b1 dd rcall .-1182 ; 0x446c - 490a: d8 2f mov r29, r24 - Crypto1LFSR(0); - 490c: 80 e0 ldi r24, 0x00 ; 0 - 490e: 68 dd rcall .-1328 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 4910: c6 95 lsr r28 - - if (Out) { - 4912: d1 11 cpse r29, r1 - KeyStream |= (1<<3); - 4914: c8 60 ori r28, 0x08 ; 8 - /* Generate 4 keystream-bits */ - for (i=0; i<4; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 4916: aa dd rcall .-1196 ; 0x446c - 4918: d8 2f mov r29, r24 - Crypto1LFSR(0); - 491a: 80 e0 ldi r24, 0x00 ; 0 - 491c: 61 dd rcall .-1342 ; 0x43e0 - - /* Store keystream bit */ - KeyStream >>= 1; - 491e: 8c 2f mov r24, r28 - 4920: 86 95 lsr r24 - - if (Out) { - 4922: d1 11 cpse r29, r1 - KeyStream |= (1<<3); - 4924: 88 60 ori r24, 0x08 ; 8 } } return KeyStream; } - 4926: df 91 pop r29 - 4928: cf 91 pop r28 - 492a: 08 95 ret - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); + 462a: 8c 2f mov r24, r28 + 462c: df 91 pop r29 + 462e: cf 91 pop r28 + 4630: 1f 91 pop r17 + 4632: 08 95 ret - /* Store keystream bit */ - KeyStream >>= 1; - 492c: c0 e0 ldi r28, 0x00 ; 0 - 492e: e5 cf rjmp .-54 ; 0x48fa - -00004930 : - - return KeyStream; -} +00004634 : void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) { - 4930: 6f 92 push r6 - 4932: 7f 92 push r7 - 4934: 8f 92 push r8 - 4936: 9f 92 push r9 - 4938: af 92 push r10 - 493a: bf 92 push r11 - 493c: cf 92 push r12 - 493e: df 92 push r13 - 4940: ef 92 push r14 - 4942: ff 92 push r15 - 4944: 0f 93 push r16 - 4946: 1f 93 push r17 - 4948: cf 93 push r28 - 494a: df 93 push r29 - 494c: 3c 01 movw r6, r24 + 4634: 8f 92 push r8 + 4636: 9f 92 push r9 + 4638: af 92 push r10 + 463a: bf 92 push r11 + 463c: cf 92 push r12 + 463e: df 92 push r13 + 4640: ef 92 push r14 + 4642: ff 92 push r15 + 4644: 0f 93 push r16 + 4646: 1f 93 push r17 + 4648: fc 01 movw r30, r24 while(ClockCount--) { - 494e: cb 01 movw r24, r22 - 4950: 01 97 sbiw r24, 0x01 ; 1 - 4952: 67 2b or r22, r23 - 4954: c9 f1 breq .+114 ; 0x49c8 - 4956: f3 01 movw r30, r6 - 4958: a2 81 ldd r26, Z+2 ; 0x02 - 495a: c0 81 ld r28, Z - 495c: b1 81 ldd r27, Z+1 ; 0x01 - 495e: d3 81 ldd r29, Z+3 ; 0x03 + 464a: cb 01 movw r24, r22 + 464c: 01 97 sbiw r24, 0x01 ; 1 + 464e: 67 2b or r22, r23 + 4650: b1 f1 breq .+108 ; 0x46be + 4652: b2 81 ldd r27, Z+2 ; 0x02 + 4654: a0 81 ld r26, Z + 4656: 81 80 ldd r8, Z+1 ; 0x01 + 4658: 03 81 ldd r16, Z+3 ; 0x03 + 465a: 02 c0 rjmp .+4 ; 0x4660 + 465c: a4 2f mov r26, r20 + 465e: bc 2d mov r27, r12 * XOR all tapped bits to a single feedback bit. */ uint8_t Feedback = 0; Feedback ^= State[0] & (uint8_t) (PRNG_MASK >> 0); Feedback ^= State[1] & (uint8_t) (PRNG_MASK >> 8); Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); - 4960: 2a 2f mov r18, r26 - 4962: 2d 72 andi r18, 0x2D ; 45 + 4660: 2b 2f mov r18, r27 + 4662: 2d 72 andi r18, 0x2D ; 45 Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); Feedback ^= Feedback >> 4; - 4964: 32 2f mov r19, r18 - 4966: 32 95 swap r19 - 4968: 3f 70 andi r19, 0x0F ; 15 - 496a: 32 27 eor r19, r18 + 4664: 32 2f mov r19, r18 + 4666: 32 95 swap r19 + 4668: 3f 70 andi r19, 0x0F ; 15 + 466a: 32 27 eor r19, r18 Feedback ^= Feedback >> 2; - 496c: 23 2f mov r18, r19 - 496e: 26 95 lsr r18 - 4970: 26 95 lsr r18 - 4972: 23 27 eor r18, r19 + 466c: 23 2f mov r18, r19 + 466e: 26 95 lsr r18 + 4670: 26 95 lsr r18 + 4672: 23 27 eor r18, r19 Feedback ^= Feedback >> 1; - 4974: 32 2f mov r19, r18 - 4976: 36 95 lsr r19 + 4674: 32 2f mov r19, r18 + 4676: 36 95 lsr r19 uint32_t Temp = 0; Temp |= (uint32_t) State[0] << 0; Temp |= (uint32_t) State[1] << 8; Temp |= (uint32_t) State[2] << 16; Temp |= (uint32_t) State[3] << 24; - 4978: 4d 2f mov r20, r29 - 497a: 50 e0 ldi r21, 0x00 ; 0 - 497c: 60 e0 ldi r22, 0x00 ; 0 - 497e: 70 e0 ldi r23, 0x00 ; 0 - 4980: 74 2f mov r23, r20 - 4982: 66 27 eor r22, r22 - 4984: 55 27 eor r21, r21 - 4986: 44 27 eor r20, r20 + 4678: 40 2f mov r20, r16 + 467a: 50 e0 ldi r21, 0x00 ; 0 + 467c: 60 e0 ldi r22, 0x00 ; 0 + 467e: 70 e0 ldi r23, 0x00 ; 0 + 4680: 74 2f mov r23, r20 + 4682: 66 27 eor r22, r22 + 4684: 55 27 eor r21, r21 + 4686: 44 27 eor r20, r20 /* For ease of processing convert the state into a 32 bit integer first */ uint32_t Temp = 0; Temp |= (uint32_t) State[0] << 0; Temp |= (uint32_t) State[1] << 8; - 4988: 5b 2b or r21, r27 + 4688: 58 29 or r21, r8 Temp |= (uint32_t) State[2] << 16; - 498a: 4c 2b or r20, r28 + 468a: 4a 2b or r20, r26 Temp |= (uint32_t) State[3] << 24; - 498c: 6a 2b or r22, r26 + 468c: 6b 2b or r22, r27 /* Cycle LFSR and feed back. */ Temp >>= 1; - 498e: 76 95 lsr r23 - 4990: 67 95 ror r22 - 4992: 57 95 ror r21 - 4994: 47 95 ror r20 + 468e: 76 95 lsr r23 + 4690: 67 95 ror r22 + 4692: 57 95 ror r21 + 4694: 47 95 ror r20 Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); Feedback ^= Feedback >> 4; Feedback ^= Feedback >> 2; Feedback ^= Feedback >> 1; - 4996: 32 27 eor r19, r18 + 4696: 32 27 eor r19, r18 Temp |= (uint32_t) State[3] << 24; /* Cycle LFSR and feed back. */ Temp >>= 1; if (Feedback & 0x01) { - 4998: 30 fd sbrc r19, 0 + 4698: 30 fd sbrc r19, 0 Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); - 499a: 70 68 ori r23, 0x80 ; 128 + 469a: 70 68 ori r23, 0x80 ; 128 } /* Store back state */ State[0] = (uint8_t) (Temp >> 0); - 499c: c4 2f mov r28, r20 State[1] = (uint8_t) (Temp >> 8); - 499e: 85 2e mov r8, r21 - 49a0: 96 2e mov r9, r22 - 49a2: a7 2e mov r10, r23 - 49a4: bb 24 eor r11, r11 - 49a6: b8 2d mov r27, r8 + 469c: 85 2e mov r8, r21 + 469e: 96 2e mov r9, r22 + 46a0: a7 2e mov r10, r23 + 46a2: bb 24 eor r11, r11 State[2] = (uint8_t) (Temp >> 16); - 49a8: 6b 01 movw r12, r22 - 49aa: ee 24 eor r14, r14 - 49ac: ff 24 eor r15, r15 - 49ae: ac 2d mov r26, r12 + 46a4: 6b 01 movw r12, r22 + 46a6: ee 24 eor r14, r14 + 46a8: ff 24 eor r15, r15 State[3] = (uint8_t) (Temp >> 24); - 49b0: 07 2f mov r16, r23 - 49b2: 11 27 eor r17, r17 - 49b4: 22 27 eor r18, r18 - 49b6: 33 27 eor r19, r19 - 49b8: d0 2f mov r29, r16 + 46aa: 07 2f mov r16, r23 + 46ac: 11 27 eor r17, r17 + 46ae: 22 27 eor r18, r18 + 46b0: 33 27 eor r19, r19 return KeyStream; } void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) { while(ClockCount--) { - 49ba: 01 97 sbiw r24, 0x01 ; 1 - 49bc: 88 f6 brcc .-94 ; 0x4960 - 49be: f3 01 movw r30, r6 - 49c0: 40 83 st Z, r20 - 49c2: 81 82 std Z+1, r8 ; 0x01 - 49c4: c2 82 std Z+2, r12 ; 0x02 - 49c6: 03 83 std Z+3, r16 ; 0x03 + 46b2: 01 97 sbiw r24, 0x01 ; 1 + 46b4: 98 f6 brcc .-90 ; 0x465c + 46b6: 40 83 st Z, r20 + 46b8: 81 82 std Z+1, r8 ; 0x01 + 46ba: c2 82 std Z+2, r12 ; 0x02 + 46bc: 03 83 std Z+3, r16 ; 0x03 State[2] = (uint8_t) (Temp >> 16); State[3] = (uint8_t) (Temp >> 24); } } - 49c8: df 91 pop r29 - 49ca: cf 91 pop r28 - 49cc: 1f 91 pop r17 - 49ce: 0f 91 pop r16 - 49d0: ff 90 pop r15 - 49d2: ef 90 pop r14 - 49d4: df 90 pop r13 - 49d6: cf 90 pop r12 - 49d8: bf 90 pop r11 - 49da: af 90 pop r10 - 49dc: 9f 90 pop r9 - 49de: 8f 90 pop r8 - 49e0: 7f 90 pop r7 - 49e2: 6f 90 pop r6 - 49e4: 08 95 ret + 46be: 1f 91 pop r17 + 46c0: 0f 91 pop r16 + 46c2: ff 90 pop r15 + 46c4: ef 90 pop r14 + 46c6: df 90 pop r13 + 46c8: cf 90 pop r12 + 46ca: bf 90 pop r11 + 46cc: af 90 pop r10 + 46ce: 9f 90 pop r9 + 46d0: 8f 90 pop r8 + 46d2: 08 95 ret -000049e6 : +000046d4 : #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) { - 49e6: 0f 93 push r16 - 49e8: 1f 93 push r17 - 49ea: cf 93 push r28 - 49ec: df 93 push r29 - 49ee: cd b7 in r28, 0x3d ; 61 - 49f0: de b7 in r29, 0x3e ; 62 - 49f2: ec 97 sbiw r28, 0x3c ; 60 - 49f4: cd bf out 0x3d, r28 ; 61 - 49f6: de bf out 0x3e, r29 ; 62 + 46d4: 0f 93 push r16 + 46d6: 1f 93 push r17 + 46d8: cf 93 push r28 + 46da: df 93 push r29 + 46dc: cd b7 in r28, 0x3d ; 61 + 46de: de b7 in r29, 0x3e ; 62 + 46e0: ea 97 sbiw r28, 0x3a ; 58 + 46e2: cd bf out 0x3d, r28 ; 61 + 46e4: de bf out 0x3e, r29 ; 62 + 46e6: 01 e4 ldi r16, 0x41 ; 65 + 46e8: 1b e2 ldi r17, 0x2B ; 43 USB_ControlRequest.wLength = Endpoint_Read_16_LE(); #else uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) *(RequestHeader++) = Endpoint_Read_8(); - 49f8: 2b d3 rcall .+1622 ; 0x5050 - 49fa: 80 93 41 2b sts 0x2B41, r24 - 49fe: 28 d3 rcall .+1616 ; 0x5050 - 4a00: 80 93 42 2b sts 0x2B42, r24 - 4a04: 25 d3 rcall .+1610 ; 0x5050 - 4a06: 80 93 43 2b sts 0x2B43, r24 - 4a0a: 22 d3 rcall .+1604 ; 0x5050 - 4a0c: 80 93 44 2b sts 0x2B44, r24 - 4a10: 1f d3 rcall .+1598 ; 0x5050 - 4a12: 80 93 45 2b sts 0x2B45, r24 - 4a16: 1c d3 rcall .+1592 ; 0x5050 - 4a18: 80 93 46 2b sts 0x2B46, r24 - 4a1c: 19 d3 rcall .+1586 ; 0x5050 - 4a1e: 80 93 47 2b sts 0x2B47, r24 - 4a22: 16 d3 rcall .+1580 ; 0x5050 - 4a24: 80 93 48 2b sts 0x2B48, r24 + 46ea: f7 d2 rcall .+1518 ; 0x4cda + 46ec: f8 01 movw r30, r16 + 46ee: 81 93 st Z+, r24 + 46f0: 8f 01 movw r16, r30 + 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++) + 46f2: fb e2 ldi r31, 0x2B ; 43 + 46f4: 09 34 cpi r16, 0x49 ; 73 + 46f6: 1f 07 cpc r17, r31 + 46f8: c1 f7 brne .-16 ; 0x46ea + *(RequestHeader++) = Endpoint_Read_8(); #endif EVENT_USB_Device_ControlRequest(); - 4a28: 0e 94 4b 11 call 0x2296 ; 0x2296 + 46fa: 0e 94 95 11 call 0x232a ; 0x232a if (Endpoint_IsSETUPReceived()) - 4a2c: b0 d3 rcall .+1888 ; 0x518e - 4a2e: 88 23 and r24, r24 - 4a30: 89 f0 breq .+34 ; 0x4a54 + 46fe: 6b d3 rcall .+1750 ; 0x4dd6 + 4700: 88 23 and r24, r24 + 4702: 49 f0 breq .+18 ; 0x4716 { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 4a32: 90 91 41 2b lds r25, 0x2B41 + 4704: 30 91 41 2b lds r19, 0x2B41 switch (USB_ControlRequest.bRequest) - 4a36: 80 91 42 2b lds r24, 0x2B42 - 4a3a: 85 30 cpi r24, 0x05 ; 5 - 4a3c: 09 f4 brne .+2 ; 0x4a40 - 4a3e: 52 c0 rjmp .+164 ; 0x4ae4 - 4a40: b0 f0 brcs .+44 ; 0x4a6e - 4a42: 88 30 cpi r24, 0x08 ; 8 - 4a44: 09 f4 brne .+2 ; 0x4a48 - 4a46: b3 c0 rjmp .+358 ; 0x4bae - 4a48: 89 30 cpi r24, 0x09 ; 9 - 4a4a: 09 f4 brne .+2 ; 0x4a4e - 4a4c: 98 c0 rjmp .+304 ; 0x4b7e - 4a4e: 86 30 cpi r24, 0x06 ; 6 - 4a50: 09 f4 brne .+2 ; 0x4a54 - 4a52: 5a c0 rjmp .+180 ; 0x4b08 + 4708: 20 91 42 2b lds r18, 0x2B42 + 470c: 82 2f mov r24, r18 + 470e: 90 e0 ldi r25, 0x00 ; 0 + 4710: 8a 30 cpi r24, 0x0A ; 10 + 4712: 91 05 cpc r25, r1 + 4714: 68 f0 brcs .+26 ; 0x4730 default: break; } } if (Endpoint_IsSETUPReceived()) - 4a54: 9c d3 rcall .+1848 ; 0x518e - 4a56: 88 23 and r24, r24 - 4a58: 11 f0 breq .+4 ; 0x4a5e + 4716: 5f d3 rcall .+1726 ; 0x4dd6 + 4718: 88 23 and r24, r24 + 471a: 11 f0 breq .+4 ; 0x4720 { Endpoint_ClearSETUP(); - 4a5a: 6d d3 rcall .+1754 ; 0x5136 + 471c: 75 d3 rcall .+1770 ; 0x4e08 Endpoint_StallTransaction(); - 4a5c: 50 d3 rcall .+1696 ; 0x50fe + 471e: a0 d3 rcall .+1856 ; 0x4e60 } } - 4a5e: ec 96 adiw r28, 0x3c ; 60 - 4a60: cd bf out 0x3d, r28 ; 61 - 4a62: de bf out 0x3e, r29 ; 62 - 4a64: df 91 pop r29 - 4a66: cf 91 pop r28 - 4a68: 1f 91 pop r17 - 4a6a: 0f 91 pop r16 - 4a6c: 08 95 ret + 4720: ea 96 adiw r28, 0x3a ; 58 + 4722: cd bf out 0x3d, r28 ; 61 + 4724: de bf out 0x3e, r29 ; 62 + 4726: df 91 pop r29 + 4728: cf 91 pop r28 + 472a: 1f 91 pop r17 + 472c: 0f 91 pop r16 + 472e: 08 95 ret if (Endpoint_IsSETUPReceived()) { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; switch (USB_ControlRequest.bRequest) - 4a6e: 81 30 cpi r24, 0x01 ; 1 - 4a70: 21 f0 breq .+8 ; 0x4a7a - 4a72: 08 f4 brcc .+2 ; 0x4a76 - 4a74: 68 c0 rjmp .+208 ; 0x4b46 - 4a76: 83 30 cpi r24, 0x03 ; 3 - 4a78: 69 f7 brne .-38 ; 0x4a54 - } - - break; - case REQ_ClearFeature: - case REQ_SetFeature: - if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 4a7a: 99 23 and r25, r25 - 4a7c: 09 f4 brne .+2 ; 0x4a80 - 4a7e: a1 c0 rjmp .+322 ; 0x4bc2 - 4a80: 92 30 cpi r25, 0x02 ; 2 - 4a82: 41 f7 brne .-48 ; 0x4a54 - - break; - #endif - #if !defined(CONTROL_ONLY_DEVICE) - case REQREC_ENDPOINT: - if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 4a84: 80 91 43 2b lds r24, 0x2B43 - 4a88: 81 11 cpse r24, r1 - 4a8a: 27 c0 rjmp .+78 ; 0x4ada - { - uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 4a8c: 00 91 45 2b lds r16, 0x2B45 - 4a90: 10 91 46 2b lds r17, 0x2B46 - 4a94: 0f 70 andi r16, 0x0F ; 15 - 4a96: 11 27 eor r17, r17 - - if (EndpointIndex == ENDPOINT_CONTROLEP) - 4a98: 01 15 cp r16, r1 - 4a9a: 11 05 cpc r17, r1 - 4a9c: d9 f2 breq .-74 ; 0x4a54 - return; - - Endpoint_SelectEndpoint(EndpointIndex); - 4a9e: 80 2f mov r24, r16 - 4aa0: f5 d2 rcall .+1514 ; 0x508c - - if (Endpoint_IsEnabled()) - { - if (USB_ControlRequest.bRequest == REQ_SetFeature) - 4aa2: 80 91 42 2b lds r24, 0x2B42 - 4aa6: 83 30 cpi r24, 0x03 ; 3 - 4aa8: 09 f4 brne .+2 ; 0x4aac - 4aaa: e6 c0 rjmp .+460 ; 0x4c78 - * \ingroup Group_EndpointPacketManagement_XMEGA - */ - static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; - static inline void Endpoint_ClearStall(void) - { - USB_Endpoint_SelectedHandle->CTRL &= ~USB_EP_STALL_bm; - 4aac: e0 91 4b 2b lds r30, 0x2B4B - 4ab0: f0 91 4c 2b lds r31, 0x2B4C - 4ab4: 81 81 ldd r24, Z+1 ; 0x01 - 4ab6: 8b 7f andi r24, 0xFB ; 251 - 4ab8: 81 83 std Z+1, r24 ; 0x01 - static inline void Endpoint_ResetEndpoint(const uint8_t Address) - { - if (Address & ENDPOINT_DIR_IN) - USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].IN.Position = 0; - else - USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].OUT.Position = 0; - 4aba: 84 e8 ldi r24, 0x84 ; 132 - 4abc: 80 9f mul r24, r16 - 4abe: f0 01 movw r30, r0 - 4ac0: 81 9f mul r24, r17 - 4ac2: f0 0d add r31, r0 - 4ac4: 11 24 eor r1, r1 - 4ac6: e1 57 subi r30, 0x71 ; 113 - 4ac8: f4 4d sbci r31, 0xD4 ; 212 - 4aca: 10 82 st Z, r1 - - /** Resets the data toggle of the currently selected endpoint. */ - static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE; - static inline void Endpoint_ResetDataToggle(void) - { - USB_Endpoint_SelectedHandle->STATUS &= ~USB_EP_TOGGLE_bm; - 4acc: e0 91 4b 2b lds r30, 0x2B4B - 4ad0: f0 91 4c 2b lds r31, 0x2B4C - 4ad4: 80 81 ld r24, Z - 4ad6: 8e 7f andi r24, 0xFE ; 254 - 4ad8: 80 83 st Z, r24 - #endif - default: - return; - } - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 4ada: 80 e0 ldi r24, 0x00 ; 0 - 4adc: d7 d2 rcall .+1454 ; 0x508c - - Endpoint_ClearSETUP(); - 4ade: 2b d3 rcall .+1622 ; 0x5136 - - Endpoint_ClearStatusStage(); - 4ae0: 8f d4 rcall .+2334 ; 0x5400 - 4ae2: b8 cf rjmp .-144 ; 0x4a54 - USB_Device_ClearSetFeature(); - } - - break; - case REQ_SetAddress: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 4ae4: 91 11 cpse r25, r1 - 4ae6: b6 cf rjmp .-148 ; 0x4a54 - } -} - -static void USB_Device_SetAddress(void) -{ - uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 4ae8: 10 91 43 2b lds r17, 0x2B43 - 4aec: 1f 77 andi r17, 0x7F ; 127 - - USB_Device_SetDeviceAddress(DeviceAddress); - - Endpoint_ClearSETUP(); - 4aee: 23 d3 rcall .+1606 ; 0x5136 - - Endpoint_ClearStatusStage(); - 4af0: 87 d4 rcall .+2318 ; 0x5400 - - while (!(Endpoint_IsINReady())); - 4af2: 7f d3 rcall .+1790 ; 0x51f2 - 4af4: 88 23 and r24, r24 - 4af6: e9 f3 breq .-6 ; 0x4af2 - } - - static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; - static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) - { - USB.ADDR = Address; - 4af8: 10 93 c3 04 sts 0x04C3, r17 - - USB_Device_EnableDeviceAddress(DeviceAddress); - - USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 4afc: 11 11 cpse r17, r1 - 4afe: 76 c0 rjmp .+236 ; 0x4bec - 4b00: 82 e0 ldi r24, 0x02 ; 2 - 4b02: 80 93 40 2b sts 0x2B40, r24 - 4b06: a6 cf rjmp .-180 ; 0x4a54 - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - USB_Device_SetAddress(); - - break; - case REQ_GetDescriptor: - if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 4b08: 90 58 subi r25, 0x80 ; 128 - 4b0a: 92 30 cpi r25, 0x02 ; 2 - 4b0c: 08 f0 brcs .+2 ; 0x4b10 - 4b0e: a2 cf rjmp .-188 ; 0x4a54 - !(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)) - 4b10: 80 91 43 2b lds r24, 0x2B43 - 4b14: 90 91 44 2b lds r25, 0x2B44 - 4b18: 8c 3d cpi r24, 0xDC ; 220 - 4b1a: 23 e0 ldi r18, 0x03 ; 3 - 4b1c: 92 07 cpc r25, r18 - 4b1e: 09 f4 brne .+2 ; 0x4b22 - 4b20: 67 c0 rjmp .+206 ; 0x4bf0 - USB_Device_GetInternalSerialDescriptor(); - return; - } - #endif - - if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 4b22: ae 01 movw r20, r28 - 4b24: 45 5c subi r20, 0xC5 ; 197 - 4b26: 5f 4f sbci r21, 0xFF ; 255 - 4b28: 60 91 45 2b lds r22, 0x2B45 - 4b2c: 0e 94 d1 04 call 0x9a2 ; 0x9a2 - 4b30: 8c 01 movw r16, r24 - 4b32: 00 97 sbiw r24, 0x00 ; 0 - 4b34: 09 f4 brne .+2 ; 0x4b38 - 4b36: 8e cf rjmp .-228 ; 0x4a54 - )) == NO_DESCRIPTOR) - { - return; - } - - Endpoint_ClearSETUP(); - 4b38: fe d2 rcall .+1532 ; 0x5136 - #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); - 4b3a: b8 01 movw r22, r16 - 4b3c: 8b ad ldd r24, Y+59 ; 0x3b - 4b3e: 9c ad ldd r25, Y+60 ; 0x3c - 4b40: c0 d1 rcall .+896 ; 0x4ec2 - Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); - else - Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); - #endif - - Endpoint_ClearOUT(); - 4b42: 77 d2 rcall .+1262 ; 0x5032 - 4b44: 87 cf rjmp .-242 ; 0x4a54 - uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - - switch (USB_ControlRequest.bRequest) - { - case REQ_GetStatus: - if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 4b46: 90 38 cpi r25, 0x80 ; 128 - 4b48: 09 f4 brne .+2 ; 0x4b4c - 4b4a: 47 c0 rjmp .+142 ; 0x4bda - 4b4c: 92 38 cpi r25, 0x82 ; 130 - 4b4e: 09 f0 breq .+2 ; 0x4b52 - 4b50: 81 cf rjmp .-254 ; 0x4a54 - CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - #endif - break; - case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): - #if !defined(CONTROL_ONLY_DEVICE) - Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 4b52: 80 91 45 2b lds r24, 0x2B45 - 4b56: 8f 70 andi r24, 0x0F ; 15 - 4b58: 99 d2 rcall .+1330 ; 0x508c - * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. - */ - static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline bool Endpoint_IsStalled(void) - { - return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); - 4b5a: e0 91 4b 2b lds r30, 0x2B4B - 4b5e: f0 91 4c 2b lds r31, 0x2B4C - 4b62: 11 81 ldd r17, Z+1 ; 0x01 - 4b64: 12 fb bst r17, 2 - 4b66: 11 27 eor r17, r17 - 4b68: 10 f9 bld r17, 0 - - CurrentStatus = Endpoint_IsStalled(); - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 4b6a: 80 e0 ldi r24, 0x00 ; 0 - 4b6c: 8f d2 rcall .+1310 ; 0x508c - break; - default: - return; - } - - Endpoint_ClearSETUP(); - 4b6e: e3 d2 rcall .+1478 ; 0x5136 - * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. - */ - static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; - static inline void Endpoint_Write_16_LE(const uint16_t Data) - { - Endpoint_Write_8(Data & 0xFF); - 4b70: 81 2f mov r24, r17 - 4b72: 7d d2 rcall .+1274 ; 0x506e - Endpoint_Write_8(Data >> 8); - 4b74: 80 e0 ldi r24, 0x00 ; 0 - 4b76: 7b d2 rcall .+1270 ; 0x506e - - Endpoint_Write_16_LE(CurrentStatus); - Endpoint_ClearIN(); - 4b78: 43 d2 rcall .+1158 ; 0x5000 - - Endpoint_ClearStatusStage(); - 4b7a: 42 d4 rcall .+2180 ; 0x5400 - 4b7c: 6b cf rjmp .-298 ; 0x4a54 + 4730: fc 01 movw r30, r24 + 4732: e1 59 subi r30, 0x91 ; 145 + 4734: fe 4f sbci r31, 0xFE ; 254 + 4736: de c7 rjmp .+4028 ; 0x56f4 <__tablejump2__> if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_GetConfiguration(); break; case REQ_SetConfiguration: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 4b7e: 91 11 cpse r25, r1 - 4b80: 69 cf rjmp .-302 ; 0x4a54 + 4738: 31 11 cpse r19, r1 + 473a: ed cf rjmp .-38 ; 0x4716 } static void USB_Device_SetConfiguration(void) { #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 4b82: 80 91 43 2b lds r24, 0x2B43 - 4b86: 82 30 cpi r24, 0x02 ; 2 - 4b88: 08 f0 brcs .+2 ; 0x4b8c - 4b8a: 64 cf rjmp .-312 ; 0x4a54 + 473c: 80 91 43 2b lds r24, 0x2B43 + 4740: 82 30 cpi r24, 0x02 ; 2 + 4742: 48 f7 brcc .-46 ; 0x4716 if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) return; #endif #endif Endpoint_ClearSETUP(); - 4b8c: d4 d2 rcall .+1448 ; 0x5136 + 4744: 61 d3 rcall .+1730 ; 0x4e08 USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 4b8e: 80 91 43 2b lds r24, 0x2B43 - 4b92: 80 93 3c 2b sts 0x2B3C, r24 + 4746: 80 91 43 2b lds r24, 0x2B43 + 474a: 80 93 3c 2b sts 0x2B3C, r24 Endpoint_ClearStatusStage(); - 4b96: 34 d4 rcall .+2152 ; 0x5400 + 474e: 93 d4 rcall .+2342 ; 0x5076 if (USB_Device_ConfigurationNumber) - 4b98: 80 91 3c 2b lds r24, 0x2B3C - 4b9c: 88 23 and r24, r24 - 4b9e: 09 f4 brne .+2 ; 0x4ba2 - 4ba0: 61 c0 rjmp .+194 ; 0x4c64 + 4750: 80 91 3c 2b lds r24, 0x2B3C + 4754: 88 23 and r24, r24 + 4756: 09 f4 brne .+2 ; 0x475a + 4758: d1 c0 rjmp .+418 ; 0x48fc USB_DeviceState = DEVICE_STATE_Configured; - 4ba2: 84 e0 ldi r24, 0x04 ; 4 - 4ba4: 80 93 40 2b sts 0x2B40, r24 + 475a: 84 e0 ldi r24, 0x04 ; 4 + 475c: 80 93 40 2b sts 0x2B40, r24 else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; EVENT_USB_Device_ConfigurationChanged(); - 4ba8: 0e 94 47 11 call 0x228e ; 0x228e - 4bac: 53 cf rjmp .-346 ; 0x4a54 + 4760: 0e 94 91 11 call 0x2322 ; 0x2322 + 4764: d8 cf rjmp .-80 ; 0x4716 USB_Device_GetDescriptor(); } break; case REQ_GetConfiguration: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 4bae: 90 38 cpi r25, 0x80 ; 128 - 4bb0: 09 f0 breq .+2 ; 0x4bb4 - 4bb2: 50 cf rjmp .-352 ; 0x4a54 + 4766: 30 38 cpi r19, 0x80 ; 128 + 4768: b1 f6 brne .-84 ; 0x4716 EVENT_USB_Device_ConfigurationChanged(); } static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); - 4bb4: c0 d2 rcall .+1408 ; 0x5136 + 476a: 4e d3 rcall .+1692 ; 0x4e08 Endpoint_Write_8(USB_Device_ConfigurationNumber); - 4bb6: 80 91 3c 2b lds r24, 0x2B3C - 4bba: 59 d2 rcall .+1202 ; 0x506e + 476c: 80 91 3c 2b lds r24, 0x2B3C + 4770: c4 d2 rcall .+1416 ; 0x4cfa Endpoint_ClearIN(); - 4bbc: 21 d2 rcall .+1090 ; 0x5000 + 4772: 8b d2 rcall .+1302 ; 0x4c8a Endpoint_ClearStatusStage(); - 4bbe: 20 d4 rcall .+2112 ; 0x5400 - 4bc0: 49 cf rjmp .-366 ; 0x4a54 + 4774: 80 d4 rcall .+2304 ; 0x5076 + 4776: cf cf rjmp .-98 ; 0x4716 + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + USB_Device_SetAddress(); + + break; + case REQ_GetDescriptor: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + 4778: 30 58 subi r19, 0x80 ; 128 + 477a: 32 30 cpi r19, 0x02 ; 2 + 477c: 60 f6 brcc .-104 ; 0x4716 + !(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)) + 477e: 80 91 43 2b lds r24, 0x2B43 + 4782: 90 91 44 2b lds r25, 0x2B44 + 4786: 8c 3d cpi r24, 0xDC ; 220 + 4788: e3 e0 ldi r30, 0x03 ; 3 + 478a: 9e 07 cpc r25, r30 + 478c: 09 f4 brne .+2 ; 0x4790 + 478e: 88 c0 rjmp .+272 ; 0x48a0 + USB_Device_GetInternalSerialDescriptor(); + return; + } + #endif + + if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, + 4790: ae 01 movw r20, r28 + 4792: 4f 5f subi r20, 0xFF ; 255 + 4794: 5f 4f sbci r21, 0xFF ; 255 + 4796: 60 91 45 2b lds r22, 0x2B45 + 479a: 0e 94 4c 05 call 0xa98 ; 0xa98 + 479e: 8c 01 movw r16, r24 + 47a0: 00 97 sbiw r24, 0x00 ; 0 + 47a2: 09 f4 brne .+2 ; 0x47a6 + 47a4: b8 cf rjmp .-144 ; 0x4716 + )) == NO_DESCRIPTOR) + { + return; + } + + Endpoint_ClearSETUP(); + 47a6: 30 d3 rcall .+1632 ; 0x4e08 + #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); + 47a8: b8 01 movw r22, r16 + 47aa: 89 81 ldd r24, Y+1 ; 0x01 + 47ac: 9a 81 ldd r25, Y+2 ; 0x02 + 47ae: c1 d1 rcall .+898 ; 0x4b32 + Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); + else + Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); + #endif + + Endpoint_ClearOUT(); + 47b0: 85 d2 rcall .+1290 ; 0x4cbc + 47b2: b1 cf rjmp .-158 ; 0x4716 + USB_Device_ClearSetFeature(); + } + + break; + case REQ_SetAddress: + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + 47b4: 31 11 cpse r19, r1 + 47b6: af cf rjmp .-162 ; 0x4716 + } +} + +static void USB_Device_SetAddress(void) +{ + uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); + 47b8: 10 91 43 2b lds r17, 0x2B43 + 47bc: 1f 77 andi r17, 0x7F ; 127 + + USB_Device_SetDeviceAddress(DeviceAddress); + + Endpoint_ClearSETUP(); + 47be: 24 d3 rcall .+1608 ; 0x4e08 + + Endpoint_ClearStatusStage(); + 47c0: 5a d4 rcall .+2228 ; 0x5076 + + while (!(Endpoint_IsINReady())); + 47c2: e4 d2 rcall .+1480 ; 0x4d8c + 47c4: 88 23 and r24, r24 + 47c6: e9 f3 breq .-6 ; 0x47c2 + } + + static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; + static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) + { + USB.ADDR = Address; + 47c8: 10 93 c3 04 sts 0x04C3, r17 + + USB_Device_EnableDeviceAddress(DeviceAddress); + + USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; + 47cc: 11 11 cpse r17, r1 + 47ce: 66 c0 rjmp .+204 ; 0x489c + 47d0: 82 e0 ldi r24, 0x02 ; 2 + 47d2: 80 93 40 2b sts 0x2B40, r24 + 47d6: 9f cf rjmp .-194 ; 0x4716 + } + + break; + case REQ_ClearFeature: + case REQ_SetFeature: + if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || + 47d8: 33 23 and r19, r19 + 47da: 09 f4 brne .+2 ; 0x47de + 47dc: 4b c0 rjmp .+150 ; 0x4874 + 47de: 32 30 cpi r19, 0x02 ; 2 + 47e0: 09 f0 breq .+2 ; 0x47e4 + 47e2: 99 cf rjmp .-206 ; 0x4716 + + break; + #endif + #if !defined(CONTROL_ONLY_DEVICE) + case REQREC_ENDPOINT: + if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) + 47e4: 80 91 43 2b lds r24, 0x2B43 + 47e8: 81 11 cpse r24, r1 + 47ea: 24 c0 rjmp .+72 ; 0x4834 + { + uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + 47ec: 10 91 45 2b lds r17, 0x2B45 + 47f0: 1f 70 andi r17, 0x0F ; 15 + + if (EndpointIndex == ENDPOINT_CONTROLEP) + 47f2: 09 f4 brne .+2 ; 0x47f6 + 47f4: 90 cf rjmp .-224 ; 0x4716 + return; + + Endpoint_SelectEndpoint(EndpointIndex); + 47f6: 81 2f mov r24, r17 + 47f8: 90 d2 rcall .+1312 ; 0x4d1a + + if (Endpoint_IsEnabled()) + { + if (USB_ControlRequest.bRequest == REQ_SetFeature) + 47fa: 80 91 42 2b lds r24, 0x2B42 + 47fe: 83 30 cpi r24, 0x03 ; 3 + 4800: 09 f4 brne .+2 ; 0x4804 + 4802: 86 c0 rjmp .+268 ; 0x4910 + * \ingroup Group_EndpointPacketManagement_XMEGA + */ + static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; + static inline void Endpoint_ClearStall(void) + { + USB_Endpoint_SelectedHandle->CTRL &= ~USB_EP_STALL_bm; + 4804: a0 91 4b 2b lds r26, 0x2B4B + 4808: b0 91 4c 2b lds r27, 0x2B4C + 480c: 11 96 adiw r26, 0x01 ; 1 + 480e: 8c 91 ld r24, X + 4810: 11 97 sbiw r26, 0x01 ; 1 + 4812: 8b 7f andi r24, 0xFB ; 251 + 4814: 11 96 adiw r26, 0x01 ; 1 + 4816: 8c 93 st X, r24 + static inline void Endpoint_ResetEndpoint(const uint8_t Address) + { + if (Address & ENDPOINT_DIR_IN) + USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].IN.Position = 0; + else + USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].OUT.Position = 0; + 4818: 24 e8 ldi r18, 0x84 ; 132 + 481a: 12 9f mul r17, r18 + 481c: f0 01 movw r30, r0 + 481e: 11 24 eor r1, r1 + 4820: e1 57 subi r30, 0x71 ; 113 + 4822: f4 4d sbci r31, 0xD4 ; 212 + 4824: 10 82 st Z, r1 + + /** Resets the data toggle of the currently selected endpoint. */ + static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE; + static inline void Endpoint_ResetDataToggle(void) + { + USB_Endpoint_SelectedHandle->STATUS &= ~USB_EP_TOGGLE_bm; + 4826: e0 91 4b 2b lds r30, 0x2B4B + 482a: f0 91 4c 2b lds r31, 0x2B4C + 482e: 80 81 ld r24, Z + 4830: 8e 7f andi r24, 0xFE ; 254 + 4832: 80 83 st Z, r24 + #endif + default: + return; + } + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + 4834: 80 e0 ldi r24, 0x00 ; 0 + 4836: 71 d2 rcall .+1250 ; 0x4d1a + + Endpoint_ClearSETUP(); + 4838: e7 d2 rcall .+1486 ; 0x4e08 + + Endpoint_ClearStatusStage(); + 483a: 1d d4 rcall .+2106 ; 0x5076 + 483c: 6c cf rjmp .-296 ; 0x4716 + uint8_t bmRequestType = USB_ControlRequest.bmRequestType; + + switch (USB_ControlRequest.bRequest) + { + case REQ_GetStatus: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + 483e: 30 38 cpi r19, 0x80 ; 128 + 4840: 29 f1 breq .+74 ; 0x488c + 4842: 32 38 cpi r19, 0x82 ; 130 + 4844: 09 f0 breq .+2 ; 0x4848 + 4846: 67 cf rjmp .-306 ; 0x4716 + CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; + #endif + break; + case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): + #if !defined(CONTROL_ONLY_DEVICE) + Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + 4848: 80 91 45 2b lds r24, 0x2B45 + 484c: 8f 70 andi r24, 0x0F ; 15 + 484e: 65 d2 rcall .+1226 ; 0x4d1a + * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. + */ + static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Endpoint_IsStalled(void) + { + return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); + 4850: e0 91 4b 2b lds r30, 0x2B4B + 4854: f0 91 4c 2b lds r31, 0x2B4C + 4858: 11 81 ldd r17, Z+1 ; 0x01 + 485a: 12 fb bst r17, 2 + 485c: 11 27 eor r17, r17 + 485e: 10 f9 bld r17, 0 + + CurrentStatus = Endpoint_IsStalled(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + 4860: 80 e0 ldi r24, 0x00 ; 0 + 4862: 5b d2 rcall .+1206 ; 0x4d1a + break; + default: + return; + } + + Endpoint_ClearSETUP(); + 4864: d1 d2 rcall .+1442 ; 0x4e08 + * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. + */ + static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; + static inline void Endpoint_Write_16_LE(const uint16_t Data) + { + Endpoint_Write_8(Data & 0xFF); + 4866: 81 2f mov r24, r17 + 4868: 48 d2 rcall .+1168 ; 0x4cfa + Endpoint_Write_8(Data >> 8); + 486a: 80 e0 ldi r24, 0x00 ; 0 + 486c: 46 d2 rcall .+1164 ; 0x4cfa + + Endpoint_Write_16_LE(CurrentStatus); + Endpoint_ClearIN(); + 486e: 0d d2 rcall .+1050 ; 0x4c8a + + Endpoint_ClearStatusStage(); + 4870: 02 d4 rcall .+2052 ; 0x5076 + 4872: 51 cf rjmp .-350 ; 0x4716 { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) { #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) - 4bc2: 90 91 43 2b lds r25, 0x2B43 - 4bc6: 91 30 cpi r25, 0x01 ; 1 - 4bc8: 09 f0 breq .+2 ; 0x4bcc - 4bca: 44 cf rjmp .-376 ; 0x4a54 + 4874: 80 91 43 2b lds r24, 0x2B43 + 4878: 81 30 cpi r24, 0x01 ; 1 + 487a: 09 f0 breq .+2 ; 0x487e + 487c: 4c cf rjmp .-360 ; 0x4716 USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 4bcc: 91 e0 ldi r25, 0x01 ; 1 - 4bce: 83 30 cpi r24, 0x03 ; 3 - 4bd0: 09 f0 breq .+2 ; 0x4bd4 - 4bd2: 90 e0 ldi r25, 0x00 ; 0 - 4bd4: 90 93 3e 2b sts 0x2B3E, r25 - 4bd8: 80 cf rjmp .-256 ; 0x4ada + 487e: 81 e0 ldi r24, 0x01 ; 1 + 4880: 23 30 cpi r18, 0x03 ; 3 + 4882: 09 f0 breq .+2 ; 0x4886 + 4884: 80 e0 ldi r24, 0x00 ; 0 + 4886: 80 93 3e 2b sts 0x2B3E, r24 + 488a: d4 cf rjmp .-88 ; 0x4834 Endpoint_ClearOUT(); } static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; - 4bda: 10 91 3d 2b lds r17, 0x2B3D + 488c: 10 91 3d 2b lds r17, 0x2B3D if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; #endif #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_Device_RemoteWakeupEnabled) - 4bde: 80 91 3e 2b lds r24, 0x2B3E - 4be2: 88 23 and r24, r24 - 4be4: 09 f4 brne .+2 ; 0x4be8 - 4be6: c3 cf rjmp .-122 ; 0x4b6e + 4890: 80 91 3e 2b lds r24, 0x2B3E + 4894: 88 23 and r24, r24 + 4896: 31 f3 breq .-52 ; 0x4864 CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 4be8: 12 60 ori r17, 0x02 ; 2 - 4bea: c1 cf rjmp .-126 ; 0x4b6e + 4898: 12 60 ori r17, 0x02 ; 2 + 489a: e4 cf rjmp .-56 ; 0x4864 while (!(Endpoint_IsINReady())); USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 4bec: 83 e0 ldi r24, 0x03 ; 3 - 4bee: 89 cf rjmp .-238 ; 0x4b02 + 489c: 83 e0 ldi r24, 0x03 ; 3 + 489e: 99 cf rjmp .-206 ; 0x47d2 { USB_Descriptor_Header_t Header; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; - 4bf0: 83 e0 ldi r24, 0x03 ; 3 - 4bf2: 8a 83 std Y+2, r24 ; 0x02 + 48a0: 83 e0 ldi r24, 0x03 ; 3 + 48a2: 8a 83 std Y+2, r24 ; 0x02 SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 4bf4: 8a e3 ldi r24, 0x3A ; 58 - 4bf6: 89 83 std Y+1, r24 ; 0x01 + 48a4: 8a e3 ldi r24, 0x3A ; 58 + 48a6: 89 83 std Y+1, r24 ; 0x01 #if (ARCH == ARCH_AVR8) return SREG; #elif (ARCH == ARCH_UC3) return __builtin_mfsr(AVR32_SR); #elif (ARCH == ARCH_XMEGA) return SREG; - 4bf8: 5f b7 in r21, 0x3f ; 63 + 48a8: 5f b7 in r21, 0x3f ; 63 #if (ARCH == ARCH_AVR8) cli(); #elif (ARCH == ARCH_UC3) __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); - 4bfa: f8 94 cli + 48aa: f8 94 cli + #endif - for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) - { - uint8_t SerialByte; - - NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 4bfc: 82 e0 ldi r24, 0x02 ; 2 - 4bfe: 80 93 ca 01 sts 0x01CA, r24 - SerialByte = pgm_read_byte(SigReadAddress); - 4c02: e8 e0 ldi r30, 0x08 ; 8 - 4c04: f0 e0 ldi r31, 0x00 ; 0 - 4c06: e4 91 lpm r30, Z - NVM.CMD = 0; - 4c08: 10 92 ca 01 sts 0x01CA, r1 - - USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); - 4c0c: de 01 movw r26, r28 - 4c0e: 13 96 adiw r26, 0x03 ; 3 + GCC_MEMORY_BARRIER(); + 48ac: de 01 movw r26, r28 + 48ae: 13 96 adiw r26, 0x03 ; 3 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++) - 4c10: 20 e0 ldi r18, 0x00 ; 0 + 48b0: 20 e0 ldi r18, 0x00 ; 0 static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) { uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; - 4c12: 38 e0 ldi r19, 0x08 ; 8 + 48b2: 38 e0 ldi r19, 0x08 ; 8 for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 4c14: 42 e0 ldi r20, 0x02 ; 2 - { - SerialByte >>= 4; + 48b4: 42 e0 ldi r20, 0x02 ; 2 + 48b6: 07 c0 rjmp .+14 ; 0x48c6 SigReadAddress++; } SerialByte &= 0x0F; - 4c16: ef 70 andi r30, 0x0F ; 15 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 4c18: 8e 2f mov r24, r30 - 4c1a: 90 e0 ldi r25, 0x00 ; 0 - 4c1c: ea 30 cpi r30, 0x0A ; 10 - 4c1e: b8 f0 brcs .+46 ; 0x4c4e - 4c20: c7 96 adiw r24, 0x37 ; 55 - 4c22: 8d 93 st X+, r24 - 4c24: 9d 93 st X+, r25 + 48b8: 90 e0 ldi r25, 0x00 ; 0 + 48ba: c7 96 adiw r24, 0x37 ; 55 + 48bc: 8d 93 st X+, r24 + 48be: 9d 93 st X+, r25 uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) - 4c26: 2f 5f subi r18, 0xFF ; 255 - 4c28: 2c 31 cpi r18, 0x1C ; 28 - 4c2a: 99 f0 breq .+38 ; 0x4c52 + 48c0: 2f 5f subi r18, 0xFF ; 255 + 48c2: 2c 31 cpi r18, 0x1C ; 28 + 48c4: 91 f0 breq .+36 ; 0x48ea { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 4c2c: 40 93 ca 01 sts 0x01CA, r20 + 48c6: 40 93 ca 01 sts 0x01CA, r20 SerialByte = pgm_read_byte(SigReadAddress); - 4c30: e3 2f mov r30, r19 - 4c32: f0 e0 ldi r31, 0x00 ; 0 - 4c34: e4 91 lpm r30, Z + 48ca: e3 2f mov r30, r19 + 48cc: f0 e0 ldi r31, 0x00 ; 0 + 48ce: 84 91 lpm r24, Z NVM.CMD = 0; - 4c36: 10 92 ca 01 sts 0x01CA, r1 + 48d0: 10 92 ca 01 sts 0x01CA, r1 if (SerialCharNum & 0x01) - 4c3a: 20 ff sbrs r18, 0 - 4c3c: ec cf rjmp .-40 ; 0x4c16 + 48d4: 20 ff sbrs r18, 0 + 48d6: 03 c0 rjmp .+6 ; 0x48de { SerialByte >>= 4; - 4c3e: e2 95 swap r30 - 4c40: ef 70 andi r30, 0x0F ; 15 + 48d8: 82 95 swap r24 + 48da: 8f 70 andi r24, 0x0F ; 15 SigReadAddress++; - 4c42: 3f 5f subi r19, 0xFF ; 255 + 48dc: 3f 5f subi r19, 0xFF ; 255 } SerialByte &= 0x0F; - 4c44: ef 70 andi r30, 0x0F ; 15 + 48de: 8f 70 andi r24, 0x0F ; 15 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 4c46: 8e 2f mov r24, r30 - 4c48: 90 e0 ldi r25, 0x00 ; 0 - 4c4a: ea 30 cpi r30, 0x0A ; 10 - 4c4c: 48 f7 brcc .-46 ; 0x4c20 - 4c4e: c0 96 adiw r24, 0x30 ; 48 - 4c50: e8 cf rjmp .-48 ; 0x4c22 + 48e0: 8a 30 cpi r24, 0x0A ; 10 + 48e2: 50 f7 brcc .-44 ; 0x48b8 + 48e4: 90 e0 ldi r25, 0x00 ; 0 + 48e6: c0 96 adiw r24, 0x30 ; 48 + 48e8: e9 cf rjmp .-46 ; 0x48bc if (GlobalIntState & AVR32_SR_GM) __builtin_ssrf(AVR32_SR_GM_OFFSET); else __builtin_csrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) SREG = GlobalIntState; - 4c52: 5f bf out 0x3f, r21 ; 63 + 48ea: 5f bf out 0x3f, r21 ; 63 + + USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); Endpoint_ClearSETUP(); - 4c54: 70 d2 rcall .+1248 ; 0x5136 + 48ec: 8d d2 rcall .+1306 ; 0x4e08 Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); - 4c56: 6a e3 ldi r22, 0x3A ; 58 - 4c58: 70 e0 ldi r23, 0x00 ; 0 - 4c5a: ce 01 movw r24, r28 - 4c5c: 01 96 adiw r24, 0x01 ; 1 - 4c5e: 90 d0 rcall .+288 ; 0x4d80 + 48ee: 6a e3 ldi r22, 0x3A ; 58 + 48f0: 70 e0 ldi r23, 0x00 ; 0 + 48f2: ce 01 movw r24, r28 + 48f4: 01 96 adiw r24, 0x01 ; 1 + 48f6: 88 d0 rcall .+272 ; 0x4a08 Endpoint_ClearOUT(); - 4c60: e8 d1 rcall .+976 ; 0x5032 - 4c62: f8 ce rjmp .-528 ; 0x4a54 + 48f8: e1 d1 rcall .+962 ; 0x4cbc + 48fa: 0d cf rjmp .-486 ; 0x4716 } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return ((USB.ADDR != 0) ? true : false); - 4c64: 80 91 c3 04 lds r24, 0x04C3 + 48fc: 80 91 c3 04 lds r24, 0x04C3 Endpoint_ClearStatusStage(); if (USB_Device_ConfigurationNumber) USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - 4c68: 88 23 and r24, r24 - 4c6a: 21 f0 breq .+8 ; 0x4c74 - 4c6c: 84 e0 ldi r24, 0x04 ; 4 - 4c6e: 80 93 40 2b sts 0x2B40, r24 - 4c72: 9a cf rjmp .-204 ; 0x4ba8 - 4c74: 81 e0 ldi r24, 0x01 ; 1 - 4c76: fb cf rjmp .-10 ; 0x4c6e + 4900: 88 23 and r24, r24 + 4902: 21 f0 breq .+8 ; 0x490c + 4904: 84 e0 ldi r24, 0x04 ; 4 + 4906: 80 93 40 2b sts 0x2B40, r24 + 490a: 2a cf rjmp .-428 ; 0x4760 + 490c: 81 e0 ldi r24, 0x01 ; 1 + 490e: fb cf rjmp .-10 ; 0x4906 if (Endpoint_IsEnabled()) { if (USB_ControlRequest.bRequest == REQ_SetFeature) { Endpoint_StallTransaction(); - 4c78: 42 d2 rcall .+1156 ; 0x50fe - 4c7a: 2f cf rjmp .-418 ; 0x4ada + 4910: a7 d2 rcall .+1358 ; 0x4e60 + 4912: 90 cf rjmp .-224 ; 0x4834 -00004c7c : +00004914 : #define __INCLUDE_FROM_EVENTS_C #define __INCLUDE_FROM_USB_DRIVER #include "Events.h" void USB_Event_Stub(void) { - 4c7c: 08 95 ret + 4914: 08 95 ret -00004c7e : +00004916 : #if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) volatile uint8_t USB_DeviceState; #endif void USB_USBTask(void) { - 4c7e: cf 93 push r28 + 4916: cf 93 push r28 } #if defined(USB_CAN_BE_DEVICE) static void USB_DeviceTask(void) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 4c80: 80 91 40 2b lds r24, 0x2B40 - 4c84: 81 11 cpse r24, r1 - 4c86: 02 c0 rjmp .+4 ; 0x4c8c + 4918: 80 91 40 2b lds r24, 0x2B40 + 491c: 81 11 cpse r24, r1 + 491e: 02 c0 rjmp .+4 ; 0x4924 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 4c88: cf 91 pop r28 - 4c8a: 08 95 ret + 4920: cf 91 pop r28 + 4922: 08 95 ret * \return Index of the currently selected endpoint. */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { return USB_Endpoint_SelectedEndpoint; - 4c8c: c0 91 4d 2b lds r28, 0x2B4D + 4924: c0 91 4d 2b lds r28, 0x2B4D if (USB_DeviceState == DEVICE_STATE_Unattached) return; uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 4c90: 80 e0 ldi r24, 0x00 ; 0 - 4c92: fc d1 rcall .+1016 ; 0x508c + 4928: 80 e0 ldi r24, 0x00 ; 0 + 492a: f7 d1 rcall .+1006 ; 0x4d1a if (Endpoint_IsSETUPReceived()) - 4c94: 7c d2 rcall .+1272 ; 0x518e - 4c96: 81 11 cpse r24, r1 - 4c98: 03 c0 rjmp .+6 ; 0x4ca0 + 492c: 54 d2 rcall .+1192 ; 0x4dd6 + 492e: 81 11 cpse r24, r1 + 4930: 03 c0 rjmp .+6 ; 0x4938 USB_Device_ProcessControlRequest(); Endpoint_SelectEndpoint(PrevEndpoint); - 4c9a: 8c 2f mov r24, r28 + 4932: 8c 2f mov r24, r28 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 4c9c: cf 91 pop r28 + 4934: cf 91 pop r28 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); if (Endpoint_IsSETUPReceived()) USB_Device_ProcessControlRequest(); Endpoint_SelectEndpoint(PrevEndpoint); - 4c9e: f6 c1 rjmp .+1004 ; 0x508c + 4936: f1 c1 rjmp .+994 ; 0x4d1a uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); if (Endpoint_IsSETUPReceived()) USB_Device_ProcessControlRequest(); - 4ca0: a2 de rcall .-700 ; 0x49e6 + 4938: cd de rcall .-614 ; 0x46d4 Endpoint_SelectEndpoint(PrevEndpoint); - 4ca2: 8c 2f mov r24, r28 + 493a: 8c 2f mov r24, r28 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 4ca4: cf 91 pop r28 + 493c: cf 91 pop r28 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); if (Endpoint_IsSETUPReceived()) USB_Device_ProcessControlRequest(); Endpoint_SelectEndpoint(PrevEndpoint); - 4ca6: f2 c1 rjmp .+996 ; 0x508c + 493e: ed c1 rjmp .+986 ; 0x4d1a -00004ca8 : - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - } - - return ENDPOINT_RWCSTREAM_NoError; - 4ca8: af 92 push r10 - 4caa: bf 92 push r11 - 4cac: df 92 push r13 - 4cae: ef 92 push r14 - 4cb0: ff 92 push r15 - 4cb2: 0f 93 push r16 - 4cb4: 1f 93 push r17 - 4cb6: cf 93 push r28 - 4cb8: df 93 push r29 - 4cba: 8c 01 movw r16, r24 - 4cbc: eb 01 movw r28, r22 - 4cbe: 7a 01 movw r14, r20 - 4cc0: b5 d3 rcall .+1898 ; 0x542c - 4cc2: d8 2e mov r13, r24 - 4cc4: 81 11 cpse r24, r1 - 4cc6: 27 c0 rjmp .+78 ; 0x4d16 - 4cc8: e1 14 cp r14, r1 - 4cca: f1 04 cpc r15, r1 - 4ccc: a1 f1 breq .+104 ; 0x4d36 - 4cce: f7 01 movw r30, r14 - 4cd0: 20 81 ld r18, Z - 4cd2: 31 81 ldd r19, Z+1 ; 0x01 - 4cd4: c2 1b sub r28, r18 - 4cd6: d3 0b sbc r29, r19 - 4cd8: 02 0f add r16, r18 - 4cda: 13 1f adc r17, r19 - 4cdc: 20 97 sbiw r28, 0x00 ; 0 - 4cde: d9 f0 breq .+54 ; 0x4d16 - 4ce0: a1 2c mov r10, r1 - 4ce2: b1 2c mov r11, r1 - 4ce4: 80 91 49 2b lds r24, 0x2B49 - 4ce8: 90 91 4a 2b lds r25, 0x2B4A - 4cec: fc 01 movw r30, r24 - 4cee: ef 5b subi r30, 0xBF ; 191 - 4cf0: ff 4f sbci r31, 0xFF ; 255 - 4cf2: 20 81 ld r18, Z - 4cf4: fc 01 movw r30, r24 - 4cf6: e0 5c subi r30, 0xC0 ; 192 - 4cf8: ff 4f sbci r31, 0xFF ; 255 - 4cfa: 80 81 ld r24, Z - 4cfc: 28 17 cp r18, r24 - 4cfe: 90 f1 brcs .+100 ; 0x4d64 - 4d00: 7f d1 rcall .+766 ; 0x5000 - 4d02: bd df rcall .-134 ; 0x4c7e - 4d04: f7 01 movw r30, r14 - 4d06: 80 81 ld r24, Z - 4d08: 91 81 ldd r25, Z+1 ; 0x01 - 4d0a: 8a 0d add r24, r10 - 4d0c: 9b 1d adc r25, r11 - 4d0e: 80 83 st Z, r24 - 4d10: 91 83 std Z+1, r25 ; 0x01 - 4d12: 25 e0 ldi r18, 0x05 ; 5 - 4d14: d2 2e mov r13, r18 - 4d16: 8d 2d mov r24, r13 - 4d18: df 91 pop r29 - 4d1a: cf 91 pop r28 - 4d1c: 1f 91 pop r17 - 4d1e: 0f 91 pop r16 - 4d20: ff 90 pop r15 - 4d22: ef 90 pop r14 - 4d24: df 90 pop r13 - 4d26: bf 90 pop r11 - 4d28: af 90 pop r10 - 4d2a: 08 95 ret - 4d2c: 69 d1 rcall .+722 ; 0x5000 - 4d2e: a7 df rcall .-178 ; 0x4c7e - 4d30: 7d d3 rcall .+1786 ; 0x542c - 4d32: 81 11 cpse r24, r1 - 4d34: 23 c0 rjmp .+70 ; 0x4d7c - 4d36: 20 97 sbiw r28, 0x00 ; 0 - 4d38: 71 f3 breq .-36 ; 0x4d16 - 4d3a: 20 91 49 2b lds r18, 0x2B49 - 4d3e: 30 91 4a 2b lds r19, 0x2B4A - 4d42: f9 01 movw r30, r18 - 4d44: ef 5b subi r30, 0xBF ; 191 - 4d46: ff 4f sbci r31, 0xFF ; 255 - 4d48: 90 81 ld r25, Z - 4d4a: f9 01 movw r30, r18 - 4d4c: e0 5c subi r30, 0xC0 ; 192 - 4d4e: ff 4f sbci r31, 0xFF ; 255 - 4d50: 80 81 ld r24, Z - 4d52: 98 17 cp r25, r24 - 4d54: 58 f7 brcc .-42 ; 0x4d2c - 4d56: f8 01 movw r30, r16 - 4d58: 81 91 ld r24, Z+ - 4d5a: 8f 01 movw r16, r30 - 4d5c: 88 d1 rcall .+784 ; 0x506e - 4d5e: 21 97 sbiw r28, 0x01 ; 1 - 4d60: 61 f7 brne .-40 ; 0x4d3a - 4d62: d9 cf rjmp .-78 ; 0x4d16 - 4d64: f8 01 movw r30, r16 - 4d66: 81 91 ld r24, Z+ - 4d68: 8f 01 movw r16, r30 - 4d6a: 81 d1 rcall .+770 ; 0x506e - 4d6c: ff ef ldi r31, 0xFF ; 255 - 4d6e: af 1a sub r10, r31 - 4d70: bf 0a sbc r11, r31 - 4d72: ca 15 cp r28, r10 - 4d74: db 05 cpc r29, r11 - 4d76: 09 f0 breq .+2 ; 0x4d7a - 4d78: b5 cf rjmp .-150 ; 0x4ce4 - 4d7a: cd cf rjmp .-102 ; 0x4d16 - 4d7c: d8 2e mov r13, r24 - 4d7e: cb cf rjmp .-106 ; 0x4d16 - -00004d80 : - 4d80: cf 92 push r12 - 4d82: df 92 push r13 - 4d84: ef 92 push r14 - 4d86: ff 92 push r15 - 4d88: 0f 93 push r16 - 4d8a: 1f 93 push r17 - 4d8c: cf 93 push r28 - 4d8e: df 93 push r29 - 4d90: 6c 01 movw r12, r24 - 4d92: eb 01 movw r28, r22 - 4d94: 80 91 4d 2b lds r24, 0x2B4D - 4d98: 80 68 ori r24, 0x80 ; 128 - 4d9a: 78 d1 rcall .+752 ; 0x508c - 4d9c: 00 91 47 2b lds r16, 0x2B47 - 4da0: 10 91 48 2b lds r17, 0x2B48 - 4da4: 0c 17 cp r16, r28 - 4da6: 1d 07 cpc r17, r29 - 4da8: 20 f0 brcs .+8 ; 0x4db2 - 4daa: 20 97 sbiw r28, 0x00 ; 0 - 4dac: 09 f4 brne .+2 ; 0x4db0 - 4dae: 83 c0 rjmp .+262 ; 0x4eb6 - 4db0: 8e 01 movw r16, r28 - 4db2: c0 e0 ldi r28, 0x00 ; 0 - 4db4: 01 15 cp r16, r1 - 4db6: 11 05 cpc r17, r1 - 4db8: 09 f0 breq .+2 ; 0x4dbc - 4dba: 4a c0 rjmp .+148 ; 0x4e50 - 4dbc: cc 23 and r28, r28 - 4dbe: 09 f4 brne .+2 ; 0x4dc2 - 4dc0: 5c c0 rjmp .+184 ; 0x4e7a - 4dc2: 80 91 40 2b lds r24, 0x2B40 - 4dc6: 88 23 and r24, r24 - 4dc8: 09 f4 brne .+2 ; 0x4dcc - 4dca: 55 c0 rjmp .+170 ; 0x4e76 - 4dcc: 85 30 cpi r24, 0x05 ; 5 - 4dce: 09 f4 brne .+2 ; 0x4dd2 - 4dd0: 5d c0 rjmp .+186 ; 0x4e8c - 4dd2: dd d1 rcall .+954 ; 0x518e - 4dd4: 81 11 cpse r24, r1 - 4dd6: 6d c0 rjmp .+218 ; 0x4eb2 - 4dd8: f3 d1 rcall .+998 ; 0x51c0 - 4dda: 81 11 cpse r24, r1 - 4ddc: 4e c0 rjmp .+156 ; 0x4e7a - 4dde: 09 d2 rcall .+1042 ; 0x51f2 - 4de0: 88 23 and r24, r24 - 4de2: 79 f3 breq .-34 ; 0x4dc2 - 4de4: 80 91 4d 2b lds r24, 0x2B4D - 4de8: 87 fd sbrc r24, 7 - 4dea: 5a c0 rjmp .+180 ; 0x4ea0 - 4dec: 20 91 49 2b lds r18, 0x2B49 - 4df0: 30 91 4a 2b lds r19, 0x2B4A - 4df4: f9 01 movw r30, r18 - 4df6: e0 5c subi r30, 0xC0 ; 192 - 4df8: ff 4f sbci r31, 0xFF ; 255 - 4dfa: e0 80 ld r14, Z - 4dfc: f9 01 movw r30, r18 - 4dfe: ef 5b subi r30, 0xBF ; 191 - 4e00: ff 4f sbci r31, 0xFF ; 255 - 4e02: 80 81 ld r24, Z - 4e04: f1 2c mov r15, r1 - 4e06: e8 1a sub r14, r24 - 4e08: f1 08 sbc r15, r1 - 4e0a: 01 15 cp r16, r1 - 4e0c: 11 05 cpc r17, r1 - 4e0e: a9 f0 breq .+42 ; 0x4e3a - 4e10: 88 e0 ldi r24, 0x08 ; 8 - 4e12: e8 16 cp r14, r24 - 4e14: f1 04 cpc r15, r1 - 4e16: 88 f4 brcc .+34 ; 0x4e3a - 4e18: e6 01 movw r28, r12 - 4e1a: 04 c0 rjmp .+8 ; 0x4e24 - 4e1c: 88 e0 ldi r24, 0x08 ; 8 - 4e1e: e8 16 cp r14, r24 - 4e20: f1 04 cpc r15, r1 - 4e22: 59 f0 breq .+22 ; 0x4e3a - 4e24: 89 91 ld r24, Y+ - 4e26: 23 d1 rcall .+582 ; 0x506e - 4e28: 6e 01 movw r12, r28 - 4e2a: 01 50 subi r16, 0x01 ; 1 - 4e2c: 11 09 sbc r17, r1 - 4e2e: 8f ef ldi r24, 0xFF ; 255 - 4e30: e8 1a sub r14, r24 - 4e32: f8 0a sbc r15, r24 - 4e34: 01 15 cp r16, r1 - 4e36: 11 05 cpc r17, r1 - 4e38: 89 f7 brne .-30 ; 0x4e1c - 4e3a: c1 e0 ldi r28, 0x01 ; 1 - 4e3c: 88 e0 ldi r24, 0x08 ; 8 - 4e3e: e8 16 cp r14, r24 - 4e40: f1 04 cpc r15, r1 - 4e42: 09 f0 breq .+2 ; 0x4e46 - 4e44: c0 e0 ldi r28, 0x00 ; 0 - 4e46: dc d0 rcall .+440 ; 0x5000 - 4e48: 01 15 cp r16, r1 - 4e4a: 11 05 cpc r17, r1 - 4e4c: 09 f4 brne .+2 ; 0x4e50 - 4e4e: b6 cf rjmp .-148 ; 0x4dbc - 4e50: 80 91 40 2b lds r24, 0x2B40 - 4e54: 88 23 and r24, r24 - 4e56: 79 f0 breq .+30 ; 0x4e76 - 4e58: 85 30 cpi r24, 0x05 ; 5 - 4e5a: c1 f0 breq .+48 ; 0x4e8c - 4e5c: 98 d1 rcall .+816 ; 0x518e - 4e5e: 81 11 cpse r24, r1 - 4e60: 28 c0 rjmp .+80 ; 0x4eb2 - 4e62: ae d1 rcall .+860 ; 0x51c0 - 4e64: 81 11 cpse r24, r1 - 4e66: 09 c0 rjmp .+18 ; 0x4e7a - 4e68: c4 d1 rcall .+904 ; 0x51f2 - 4e6a: 81 11 cpse r24, r1 - 4e6c: bb cf rjmp .-138 ; 0x4de4 - 4e6e: 80 91 40 2b lds r24, 0x2B40 - 4e72: 81 11 cpse r24, r1 - 4e74: f1 cf rjmp .-30 ; 0x4e58 - 4e76: 82 e0 ldi r24, 0x02 ; 2 - 4e78: 0a c0 rjmp .+20 ; 0x4e8e - 4e7a: a2 d1 rcall .+836 ; 0x51c0 - 4e7c: 81 11 cpse r24, r1 - 4e7e: 1f c0 rjmp .+62 ; 0x4ebe - 4e80: 80 91 40 2b lds r24, 0x2B40 - 4e84: 88 23 and r24, r24 - 4e86: b9 f3 breq .-18 ; 0x4e76 - 4e88: 85 30 cpi r24, 0x05 ; 5 - 4e8a: b9 f7 brne .-18 ; 0x4e7a - 4e8c: 83 e0 ldi r24, 0x03 ; 3 - 4e8e: df 91 pop r29 - 4e90: cf 91 pop r28 - 4e92: 1f 91 pop r17 - 4e94: 0f 91 pop r16 - 4e96: ff 90 pop r15 - 4e98: ef 90 pop r14 - 4e9a: df 90 pop r13 - 4e9c: cf 90 pop r12 - 4e9e: 08 95 ret - 4ea0: e0 91 49 2b lds r30, 0x2B49 - 4ea4: f0 91 4a 2b lds r31, 0x2B4A - 4ea8: ef 5b subi r30, 0xBF ; 191 - 4eaa: ff 4f sbci r31, 0xFF ; 255 - 4eac: e0 80 ld r14, Z - 4eae: f1 2c mov r15, r1 - 4eb0: ac cf rjmp .-168 ; 0x4e0a - 4eb2: 81 e0 ldi r24, 0x01 ; 1 - 4eb4: ec cf rjmp .-40 ; 0x4e8e - 4eb6: a4 d0 rcall .+328 ; 0x5000 - 4eb8: 00 e0 ldi r16, 0x00 ; 0 - 4eba: 10 e0 ldi r17, 0x00 ; 0 - 4ebc: 7a cf rjmp .-268 ; 0x4db2 - 4ebe: 80 e0 ldi r24, 0x00 ; 0 - 4ec0: e6 cf rjmp .-52 ; 0x4e8e - -00004ec2 : - -#if defined(TEMPLATE_FUNC_NAME) - -uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, - uint16_t Length) -{ - 4ec2: cf 92 push r12 - 4ec4: df 92 push r13 - 4ec6: ef 92 push r14 - 4ec8: ff 92 push r15 - 4eca: 0f 93 push r16 - 4ecc: 1f 93 push r17 - 4ece: cf 93 push r28 - 4ed0: df 93 push r29 - 4ed2: d8 2e mov r13, r24 - 4ed4: c9 2e mov r12, r25 - 4ed6: 8b 01 movw r16, r22 - uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - bool LastPacketFull = false; - - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 4ed8: 80 91 4d 2b lds r24, 0x2B4D - 4edc: 80 68 ori r24, 0x80 ; 128 - 4ede: d6 d0 rcall .+428 ; 0x508c - - if (Length > USB_ControlRequest.wLength) - 4ee0: c0 91 47 2b lds r28, 0x2B47 - 4ee4: d0 91 48 2b lds r29, 0x2B48 - 4ee8: c0 17 cp r28, r16 - 4eea: d1 07 cpc r29, r17 - 4eec: 28 f0 brcs .+10 ; 0x4ef8 - Length = USB_ControlRequest.wLength; - else if (!(Length)) - 4eee: 01 15 cp r16, r1 - 4ef0: 11 05 cpc r17, r1 - 4ef2: 09 f4 brne .+2 ; 0x4ef6 - 4ef4: 7f c0 rjmp .+254 ; 0x4ff4 - 4ef6: e8 01 movw r28, r16 - 4ef8: ed 2c mov r14, r13 - 4efa: fc 2c mov r15, r12 - 4efc: d1 2c mov r13, r1 - 4efe: 20 97 sbiw r28, 0x00 ; 0 - 4f00: 09 f0 breq .+2 ; 0x4f04 - 4f02: 45 c0 rjmp .+138 ; 0x4f8e - 4f04: dd 20 and r13, r13 - 4f06: 09 f4 brne .+2 ; 0x4f0a - 4f08: 57 c0 rjmp .+174 ; 0x4fb8 - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4f0a: 80 91 40 2b lds r24, 0x2B40 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4f0e: 88 23 and r24, r24 - 4f10: 09 f4 brne .+2 ; 0x4f14 - 4f12: 50 c0 rjmp .+160 ; 0x4fb4 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 4f14: 85 30 cpi r24, 0x05 ; 5 - 4f16: 09 f4 brne .+2 ; 0x4f1a - 4f18: 58 c0 rjmp .+176 ; 0x4fca - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 4f1a: 39 d1 rcall .+626 ; 0x518e - 4f1c: 81 11 cpse r24, r1 - 4f1e: 68 c0 rjmp .+208 ; 0x4ff0 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 4f20: 4f d1 rcall .+670 ; 0x51c0 - 4f22: 81 11 cpse r24, r1 - 4f24: 49 c0 rjmp .+146 ; 0x4fb8 - break; - - if (Endpoint_IsINReady()) - 4f26: 65 d1 rcall .+714 ; 0x51f2 - 4f28: 88 23 and r24, r24 - 4f2a: 79 f3 breq .-34 ; 0x4f0a - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4f2c: 80 91 4d 2b lds r24, 0x2B4D - 4f30: 87 fd sbrc r24, 7 - 4f32: 55 c0 rjmp .+170 ; 0x4fde - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 4f34: 80 91 49 2b lds r24, 0x2B49 - 4f38: 90 91 4a 2b lds r25, 0x2B4A - 4f3c: fc 01 movw r30, r24 - 4f3e: e0 5c subi r30, 0xC0 ; 192 - 4f40: ff 4f sbci r31, 0xFF ; 255 - 4f42: 00 81 ld r16, Z - 4f44: fc 01 movw r30, r24 - 4f46: ef 5b subi r30, 0xBF ; 191 - 4f48: ff 4f sbci r31, 0xFF ; 255 - 4f4a: 80 81 ld r24, Z - 4f4c: 10 e0 ldi r17, 0x00 ; 0 - 4f4e: 08 1b sub r16, r24 - 4f50: 11 09 sbc r17, r1 - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 4f52: 20 97 sbiw r28, 0x00 ; 0 - 4f54: 91 f0 breq .+36 ; 0x4f7a - 4f56: 08 30 cpi r16, 0x08 ; 8 - 4f58: 11 05 cpc r17, r1 - 4f5a: 20 f0 brcs .+8 ; 0x4f64 - 4f5c: 0e c0 rjmp .+28 ; 0x4f7a - 4f5e: 08 30 cpi r16, 0x08 ; 8 - 4f60: 11 05 cpc r17, r1 - 4f62: 59 f0 breq .+22 ; 0x4f7a - { - TEMPLATE_TRANSFER_BYTE(DataStream); - 4f64: f7 01 movw r30, r14 - 4f66: 84 91 lpm r24, Z - 4f68: 82 d0 rcall .+260 ; 0x506e - TEMPLATE_BUFFER_MOVE(DataStream, 1); - 4f6a: ff ef ldi r31, 0xFF ; 255 - 4f6c: ef 1a sub r14, r31 - 4f6e: ff 0a sbc r15, r31 - Length--; - 4f70: 21 97 sbiw r28, 0x01 ; 1 - BytesInEndpoint++; - 4f72: 0f 5f subi r16, 0xFF ; 255 - 4f74: 1f 4f sbci r17, 0xFF ; 255 - - if (Endpoint_IsINReady()) - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 4f76: 20 97 sbiw r28, 0x00 ; 0 - 4f78: 91 f7 brne .-28 ; 0x4f5e - TEMPLATE_BUFFER_MOVE(DataStream, 1); - Length--; - BytesInEndpoint++; - } - - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 4f7a: dd 24 eor r13, r13 - 4f7c: d3 94 inc r13 - 4f7e: 08 30 cpi r16, 0x08 ; 8 - 4f80: 11 05 cpc r17, r1 - 4f82: 09 f0 breq .+2 ; 0x4f86 - 4f84: d1 2c mov r13, r1 - Endpoint_ClearIN(); - 4f86: 3c d0 rcall .+120 ; 0x5000 - 4f88: 20 97 sbiw r28, 0x00 ; 0 - 4f8a: 09 f4 brne .+2 ; 0x4f8e - 4f8c: bb cf rjmp .-138 ; 0x4f04 - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4f8e: 80 91 40 2b lds r24, 0x2B40 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4f92: 88 23 and r24, r24 - 4f94: 79 f0 breq .+30 ; 0x4fb4 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 4f96: 85 30 cpi r24, 0x05 ; 5 - 4f98: c1 f0 breq .+48 ; 0x4fca - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 4f9a: f9 d0 rcall .+498 ; 0x518e - 4f9c: 81 11 cpse r24, r1 - 4f9e: 28 c0 rjmp .+80 ; 0x4ff0 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 4fa0: 0f d1 rcall .+542 ; 0x51c0 - 4fa2: 81 11 cpse r24, r1 - 4fa4: 09 c0 rjmp .+18 ; 0x4fb8 - break; - - if (Endpoint_IsINReady()) - 4fa6: 25 d1 rcall .+586 ; 0x51f2 - 4fa8: 81 11 cpse r24, r1 - 4faa: c0 cf rjmp .-128 ; 0x4f2c - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4fac: 80 91 40 2b lds r24, 0x2B40 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4fb0: 81 11 cpse r24, r1 - 4fb2: f1 cf rjmp .-30 ; 0x4f96 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 4fb4: 82 e0 ldi r24, 0x02 ; 2 - 4fb6: 0a c0 rjmp .+20 ; 0x4fcc - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - Endpoint_ClearIN(); - } - } - - while (!(Endpoint_IsOUTReceived())) - 4fb8: 03 d1 rcall .+518 ; 0x51c0 - 4fba: 81 11 cpse r24, r1 - 4fbc: 1f c0 rjmp .+62 ; 0x4ffc - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4fbe: 80 91 40 2b lds r24, 0x2B40 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4fc2: 88 23 and r24, r24 - 4fc4: b9 f3 breq .-18 ; 0x4fb4 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 4fc6: 85 30 cpi r24, 0x05 ; 5 - 4fc8: b9 f7 brne .-18 ; 0x4fb8 - 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; - 4fca: 83 e0 ldi r24, 0x03 ; 3 +00004940 : else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; } + 4940: cf 92 push r12 + 4942: df 92 push r13 + 4944: ef 92 push r14 + 4946: ff 92 push r15 + 4948: 0f 93 push r16 + 494a: 1f 93 push r17 + 494c: cf 93 push r28 + 494e: df 93 push r29 + 4950: 8c 01 movw r16, r24 + 4952: eb 01 movw r28, r22 + 4954: 7a 01 movw r14, r20 + 4956: a5 d3 rcall .+1866 ; 0x50a2 + 4958: 81 11 cpse r24, r1 + 495a: 25 c0 rjmp .+74 ; 0x49a6 + 495c: e1 14 cp r14, r1 + 495e: f1 04 cpc r15, r1 + 4960: 81 f1 breq .+96 ; 0x49c2 + 4962: f7 01 movw r30, r14 + 4964: 80 81 ld r24, Z + 4966: 91 81 ldd r25, Z+1 ; 0x01 + 4968: c8 1b sub r28, r24 + 496a: d9 0b sbc r29, r25 + 496c: 08 0f add r16, r24 + 496e: 19 1f adc r17, r25 + 4970: 20 97 sbiw r28, 0x00 ; 0 + 4972: 09 f4 brne .+2 ; 0x4976 + 4974: 3b c0 rjmp .+118 ; 0x49ec + 4976: c1 2c mov r12, r1 + 4978: d1 2c mov r13, r1 + 497a: 20 91 49 2b lds r18, 0x2B49 + 497e: 30 91 4a 2b lds r19, 0x2B4A + 4982: f9 01 movw r30, r18 + 4984: ef 5b subi r30, 0xBF ; 191 + 4986: ff 4f sbci r31, 0xFF ; 255 + 4988: 90 81 ld r25, Z + 498a: 31 97 sbiw r30, 0x01 ; 1 + 498c: 80 81 ld r24, Z + 498e: 98 17 cp r25, r24 + 4990: 78 f1 brcs .+94 ; 0x49f0 + 4992: 7b d1 rcall .+758 ; 0x4c8a + 4994: c0 df rcall .-128 ; 0x4916 + 4996: f7 01 movw r30, r14 + 4998: 80 81 ld r24, Z + 499a: 91 81 ldd r25, Z+1 ; 0x01 + 499c: 8c 0d add r24, r12 + 499e: 9d 1d adc r25, r13 + 49a0: 80 83 st Z, r24 + 49a2: 91 83 std Z+1, r25 ; 0x01 + 49a4: 85 e0 ldi r24, 0x05 ; 5 + 49a6: df 91 pop r29 + 49a8: cf 91 pop r28 + 49aa: 1f 91 pop r17 + 49ac: 0f 91 pop r16 + 49ae: ff 90 pop r15 + 49b0: ef 90 pop r14 + 49b2: df 90 pop r13 + 49b4: cf 90 pop r12 + 49b6: 08 95 ret + 49b8: 68 d1 rcall .+720 ; 0x4c8a + 49ba: ad df rcall .-166 ; 0x4916 + 49bc: 72 d3 rcall .+1764 ; 0x50a2 + 49be: 81 11 cpse r24, r1 + 49c0: f2 cf rjmp .-28 ; 0x49a6 + 49c2: 20 97 sbiw r28, 0x00 ; 0 + 49c4: 99 f0 breq .+38 ; 0x49ec + 49c6: 20 91 49 2b lds r18, 0x2B49 + 49ca: 30 91 4a 2b lds r19, 0x2B4A + 49ce: f9 01 movw r30, r18 + 49d0: ef 5b subi r30, 0xBF ; 191 + 49d2: ff 4f sbci r31, 0xFF ; 255 + 49d4: 90 81 ld r25, Z + 49d6: 31 97 sbiw r30, 0x01 ; 1 + 49d8: 80 81 ld r24, Z + 49da: 98 17 cp r25, r24 + 49dc: 68 f7 brcc .-38 ; 0x49b8 + 49de: f8 01 movw r30, r16 + 49e0: 81 91 ld r24, Z+ + 49e2: 8f 01 movw r16, r30 + 49e4: 8a d1 rcall .+788 ; 0x4cfa + 49e6: 21 97 sbiw r28, 0x01 ; 1 + 49e8: 20 97 sbiw r28, 0x00 ; 0 + 49ea: 69 f7 brne .-38 ; 0x49c6 + 49ec: 80 e0 ldi r24, 0x00 ; 0 + 49ee: db cf rjmp .-74 ; 0x49a6 + 49f0: f8 01 movw r30, r16 + 49f2: 81 91 ld r24, Z+ + 49f4: 8f 01 movw r16, r30 + 49f6: 81 d1 rcall .+770 ; 0x4cfa + 49f8: ff ef ldi r31, 0xFF ; 255 + 49fa: cf 1a sub r12, r31 + 49fc: df 0a sbc r13, r31 + 49fe: cc 15 cp r28, r12 + 4a00: dd 05 cpc r29, r13 + 4a02: 09 f0 breq .+2 ; 0x4a06 + 4a04: ba cf rjmp .-140 ; 0x497a + 4a06: f2 cf rjmp .-28 ; 0x49ec + +00004a08 : + 4a08: cf 92 push r12 + 4a0a: df 92 push r13 + 4a0c: ef 92 push r14 + 4a0e: ff 92 push r15 + 4a10: 0f 93 push r16 + 4a12: 1f 93 push r17 + 4a14: cf 93 push r28 + 4a16: df 93 push r29 + 4a18: 6c 01 movw r12, r24 + 4a1a: 8b 01 movw r16, r22 + 4a1c: 80 91 4d 2b lds r24, 0x2B4D + 4a20: 80 68 ori r24, 0x80 ; 128 + 4a22: 7b d1 rcall .+758 ; 0x4d1a + 4a24: c0 91 47 2b lds r28, 0x2B47 + 4a28: d0 91 48 2b lds r29, 0x2B48 + 4a2c: c0 17 cp r28, r16 + 4a2e: d1 07 cpc r29, r17 + 4a30: 28 f0 brcs .+10 ; 0x4a3c + 4a32: 01 15 cp r16, r1 + 4a34: 11 05 cpc r17, r1 + 4a36: 09 f4 brne .+2 ; 0x4a3a + 4a38: 6f c0 rjmp .+222 ; 0x4b18 + 4a3a: e8 01 movw r28, r16 + 4a3c: 10 e0 ldi r17, 0x00 ; 0 + 4a3e: 20 97 sbiw r28, 0x00 ; 0 + 4a40: 39 f5 brne .+78 ; 0x4a90 + 4a42: 11 11 cpse r17, r1 + 4a44: 0c c0 rjmp .+24 ; 0x4a5e + 4a46: 2f c0 rjmp .+94 ; 0x4aa6 + 4a48: 85 30 cpi r24, 0x05 ; 5 + 4a4a: 91 f1 breq .+100 ; 0x4ab0 + 4a4c: c4 d1 rcall .+904 ; 0x4dd6 + 4a4e: 81 11 cpse r24, r1 + 4a50: 31 c0 rjmp .+98 ; 0x4ab4 + 4a52: a8 d1 rcall .+848 ; 0x4da4 + 4a54: 81 11 cpse r24, r1 + 4a56: 27 c0 rjmp .+78 ; 0x4aa6 + 4a58: 99 d1 rcall .+818 ; 0x4d8c + 4a5a: 81 11 cpse r24, r1 + 4a5c: 2d c0 rjmp .+90 ; 0x4ab8 + 4a5e: 80 91 40 2b lds r24, 0x2B40 + 4a62: 81 11 cpse r24, r1 + 4a64: f1 cf rjmp .-30 ; 0x4a48 + 4a66: 82 e0 ldi r24, 0x02 ; 2 + 4a68: df 91 pop r29 + 4a6a: cf 91 pop r28 + 4a6c: 1f 91 pop r17 + 4a6e: 0f 91 pop r16 + 4a70: ff 90 pop r15 + 4a72: ef 90 pop r14 + 4a74: df 90 pop r13 + 4a76: cf 90 pop r12 + 4a78: 08 95 ret + 4a7a: 85 30 cpi r24, 0x05 ; 5 + 4a7c: c9 f0 breq .+50 ; 0x4ab0 + 4a7e: ab d1 rcall .+854 ; 0x4dd6 + 4a80: 81 11 cpse r24, r1 + 4a82: 18 c0 rjmp .+48 ; 0x4ab4 + 4a84: 8f d1 rcall .+798 ; 0x4da4 + 4a86: 81 11 cpse r24, r1 + 4a88: 0e c0 rjmp .+28 ; 0x4aa6 + 4a8a: 80 d1 rcall .+768 ; 0x4d8c + 4a8c: 81 11 cpse r24, r1 + 4a8e: 14 c0 rjmp .+40 ; 0x4ab8 + 4a90: 80 91 40 2b lds r24, 0x2B40 + 4a94: 81 11 cpse r24, r1 + 4a96: f1 cf rjmp .-30 ; 0x4a7a + 4a98: e6 cf rjmp .-52 ; 0x4a66 + 4a9a: 80 91 40 2b lds r24, 0x2B40 + 4a9e: 88 23 and r24, r24 + 4aa0: 11 f3 breq .-60 ; 0x4a66 + 4aa2: 85 30 cpi r24, 0x05 ; 5 + 4aa4: 29 f0 breq .+10 ; 0x4ab0 + 4aa6: 7e d1 rcall .+764 ; 0x4da4 + 4aa8: 88 23 and r24, r24 + 4aaa: b9 f3 breq .-18 ; 0x4a9a + 4aac: 80 e0 ldi r24, 0x00 ; 0 + 4aae: dc cf rjmp .-72 ; 0x4a68 + 4ab0: 83 e0 ldi r24, 0x03 ; 3 + 4ab2: da cf rjmp .-76 ; 0x4a68 + 4ab4: 81 e0 ldi r24, 0x01 ; 1 + 4ab6: d8 cf rjmp .-80 ; 0x4a68 + 4ab8: 80 91 4d 2b lds r24, 0x2B4D + 4abc: 87 fd sbrc r24, 7 + 4abe: 30 c0 rjmp .+96 ; 0x4b20 + 4ac0: 20 91 49 2b lds r18, 0x2B49 + 4ac4: 30 91 4a 2b lds r19, 0x2B4A + 4ac8: f9 01 movw r30, r18 + 4aca: e0 5c subi r30, 0xC0 ; 192 + 4acc: ff 4f sbci r31, 0xFF ; 255 + 4ace: e0 80 ld r14, Z + 4ad0: 31 96 adiw r30, 0x01 ; 1 + 4ad2: 80 81 ld r24, Z + 4ad4: f1 2c mov r15, r1 + 4ad6: e8 1a sub r14, r24 + 4ad8: f1 08 sbc r15, r1 + 4ada: 20 97 sbiw r28, 0x00 ; 0 + 4adc: a9 f0 breq .+42 ; 0x4b08 + 4ade: 88 e0 ldi r24, 0x08 ; 8 + 4ae0: e8 16 cp r14, r24 + 4ae2: f1 04 cpc r15, r1 + 4ae4: 88 f4 brcc .+34 ; 0x4b08 + 4ae6: 86 01 movw r16, r12 + 4ae8: 04 c0 rjmp .+8 ; 0x4af2 + 4aea: 88 e0 ldi r24, 0x08 ; 8 + 4aec: e8 16 cp r14, r24 + 4aee: f1 04 cpc r15, r1 + 4af0: 59 f0 breq .+22 ; 0x4b08 + 4af2: f8 01 movw r30, r16 + 4af4: 81 91 ld r24, Z+ + 4af6: 8f 01 movw r16, r30 + 4af8: 00 d1 rcall .+512 ; 0x4cfa + 4afa: 68 01 movw r12, r16 + 4afc: 21 97 sbiw r28, 0x01 ; 1 + 4afe: ff ef ldi r31, 0xFF ; 255 + 4b00: ef 1a sub r14, r31 + 4b02: ff 0a sbc r15, r31 + 4b04: 20 97 sbiw r28, 0x00 ; 0 + 4b06: 89 f7 brne .-30 ; 0x4aea + 4b08: 11 e0 ldi r17, 0x01 ; 1 + 4b0a: e8 e0 ldi r30, 0x08 ; 8 + 4b0c: ee 16 cp r14, r30 + 4b0e: f1 04 cpc r15, r1 + 4b10: 09 f0 breq .+2 ; 0x4b14 + 4b12: 10 e0 ldi r17, 0x00 ; 0 + 4b14: ba d0 rcall .+372 ; 0x4c8a + 4b16: 93 cf rjmp .-218 ; 0x4a3e + 4b18: b8 d0 rcall .+368 ; 0x4c8a + 4b1a: c0 e0 ldi r28, 0x00 ; 0 + 4b1c: d0 e0 ldi r29, 0x00 ; 0 + 4b1e: 8e cf rjmp .-228 ; 0x4a3c + 4b20: e0 91 49 2b lds r30, 0x2B49 + 4b24: f0 91 4a 2b lds r31, 0x2B4A + 4b28: ef 5b subi r30, 0xBF ; 191 + 4b2a: ff 4f sbci r31, 0xFF ; 255 + 4b2c: e0 80 ld r14, Z + 4b2e: f1 2c mov r15, r1 + 4b30: d4 cf rjmp .-88 ; 0x4ada + +00004b32 : + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, + uint16_t Length) +{ + 4b32: df 92 push r13 + 4b34: ef 92 push r14 + 4b36: ff 92 push r15 + 4b38: 0f 93 push r16 + 4b3a: 1f 93 push r17 + 4b3c: cf 93 push r28 + 4b3e: df 93 push r29 + 4b40: f8 2e mov r15, r24 + 4b42: e9 2e mov r14, r25 + 4b44: 8b 01 movw r16, r22 + uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + bool LastPacketFull = false; + + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 4b46: 80 91 4d 2b lds r24, 0x2B4D + 4b4a: 80 68 ori r24, 0x80 ; 128 + 4b4c: e6 d0 rcall .+460 ; 0x4d1a + + if (Length > USB_ControlRequest.wLength) + 4b4e: c0 91 47 2b lds r28, 0x2B47 + 4b52: d0 91 48 2b lds r29, 0x2B48 + 4b56: c0 17 cp r28, r16 + 4b58: d1 07 cpc r29, r17 + 4b5a: 28 f0 brcs .+10 ; 0x4b66 + Length = USB_ControlRequest.wLength; + else if (!(Length)) + 4b5c: 01 15 cp r16, r1 + 4b5e: 11 05 cpc r17, r1 + 4b60: 09 f4 brne .+2 ; 0x4b64 + 4b62: 86 c0 rjmp .+268 ; 0x4c70 + 4b64: e8 01 movw r28, r16 + 4b66: 0f 2d mov r16, r15 + 4b68: 1e 2d mov r17, r14 + 4b6a: d1 2c mov r13, r1 + 4b6c: 20 97 sbiw r28, 0x00 ; 0 + 4b6e: 39 f5 brne .+78 ; 0x4bbe + 4b70: d1 10 cpse r13, r1 + 4b72: 0d c0 rjmp .+26 ; 0x4b8e + 4b74: 2f c0 rjmp .+94 ; 0x4bd4 + { + 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) + 4b76: 85 30 cpi r24, 0x05 ; 5 + 4b78: 09 f4 brne .+2 ; 0x4b7c + 4b7a: 38 c0 rjmp .+112 ; 0x4bec + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 4b7c: 2c d1 rcall .+600 ; 0x4dd6 + 4b7e: 81 11 cpse r24, r1 + 4b80: 3e c0 rjmp .+124 ; 0x4bfe + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 4b82: 10 d1 rcall .+544 ; 0x4da4 + 4b84: 81 11 cpse r24, r1 + 4b86: 26 c0 rjmp .+76 ; 0x4bd4 + break; + + if (Endpoint_IsINReady()) + 4b88: 01 d1 rcall .+514 ; 0x4d8c + 4b8a: 81 11 cpse r24, r1 + 4b8c: 41 c0 rjmp .+130 ; 0x4c10 + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 4b8e: 80 91 40 2b lds r24, 0x2B40 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 4b92: 81 11 cpse r24, r1 + 4b94: f0 cf rjmp .-32 ; 0x4b76 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + 4b96: 82 e0 ldi r24, 0x02 ; 2 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 4b98: df 91 pop r29 + 4b9a: cf 91 pop r28 + 4b9c: 1f 91 pop r17 + 4b9e: 0f 91 pop r16 + 4ba0: ff 90 pop r15 + 4ba2: ef 90 pop r14 + 4ba4: df 90 pop r13 + 4ba6: 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) + 4ba8: 85 30 cpi r24, 0x05 ; 5 + 4baa: 01 f1 breq .+64 ; 0x4bec + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 4bac: 14 d1 rcall .+552 ; 0x4dd6 + 4bae: 81 11 cpse r24, r1 + 4bb0: 26 c0 rjmp .+76 ; 0x4bfe + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 4bb2: f8 d0 rcall .+496 ; 0x4da4 + 4bb4: 81 11 cpse r24, r1 + 4bb6: 0e c0 rjmp .+28 ; 0x4bd4 + break; + + if (Endpoint_IsINReady()) + 4bb8: e9 d0 rcall .+466 ; 0x4d8c + 4bba: 81 11 cpse r24, r1 + 4bbc: 29 c0 rjmp .+82 ; 0x4c10 + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 4bbe: 80 91 40 2b lds r24, 0x2B40 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 4bc2: 81 11 cpse r24, r1 + 4bc4: f1 cf rjmp .-30 ; 0x4ba8 + 4bc6: e7 cf rjmp .-50 ; 0x4b96 + } + } + + while (!(Endpoint_IsOUTReceived())) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 4bc8: 80 91 40 2b lds r24, 0x2B40 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 4bcc: 88 23 and r24, r24 + 4bce: 19 f3 breq .-58 ; 0x4b96 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 4bd0: 85 30 cpi r24, 0x05 ; 5 + 4bd2: 61 f0 breq .+24 ; 0x4bec + LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); + Endpoint_ClearIN(); + } + } + + while (!(Endpoint_IsOUTReceived())) + 4bd4: e7 d0 rcall .+462 ; 0x4da4 + 4bd6: 88 23 and r24, r24 + 4bd8: b9 f3 breq .-18 ; 0x4bc8 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; + 4bda: 80 e0 ldi r24, 0x00 ; 0 +} + 4bdc: df 91 pop r29 + 4bde: cf 91 pop r28 + 4be0: 1f 91 pop r17 + 4be2: 0f 91 pop r16 + 4be4: ff 90 pop r15 + 4be6: ef 90 pop r14 + 4be8: df 90 pop r13 + 4bea: 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; + 4bec: 83 e0 ldi r24, 0x03 ; 3 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 4bee: df 91 pop r29 + 4bf0: cf 91 pop r28 + 4bf2: 1f 91 pop r17 + 4bf4: 0f 91 pop r16 + 4bf6: ff 90 pop r15 + 4bf8: ef 90 pop r14 + 4bfa: df 90 pop r13 + 4bfc: 08 95 ret + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + return ENDPOINT_RWCSTREAM_HostAborted; + 4bfe: 81 e0 ldi r24, 0x01 ; 1 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 4c00: df 91 pop r29 + 4c02: cf 91 pop r28 + 4c04: 1f 91 pop r17 + 4c06: 0f 91 pop r16 + 4c08: ff 90 pop r15 + 4c0a: ef 90 pop r14 + 4c0c: df 90 pop r13 + 4c0e: 08 95 ret + * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. + */ + static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Endpoint_BytesInEndpoint(void) + { + if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) + 4c10: 80 91 4d 2b lds r24, 0x2B4D + 4c14: 87 fd sbrc r24, 7 + 4c16: 30 c0 rjmp .+96 ; 0x4c78 + return USB_Endpoint_SelectedFIFO->Position; + else + return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); + 4c18: 80 91 49 2b lds r24, 0x2B49 + 4c1c: 90 91 4a 2b lds r25, 0x2B4A + 4c20: fc 01 movw r30, r24 + 4c22: e0 5c subi r30, 0xC0 ; 192 + 4c24: ff 4f sbci r31, 0xFF ; 255 + 4c26: e0 80 ld r14, Z + 4c28: 31 96 adiw r30, 0x01 ; 1 + 4c2a: 80 81 ld r24, Z + 4c2c: f1 2c mov r15, r1 + 4c2e: e8 1a sub r14, r24 + 4c30: f1 08 sbc r15, r1 + + if (Endpoint_IsINReady()) + { + uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + + while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) + 4c32: 20 97 sbiw r28, 0x00 ; 0 + 4c34: a1 f0 breq .+40 ; 0x4c5e + 4c36: 88 e0 ldi r24, 0x08 ; 8 + 4c38: e8 16 cp r14, r24 + 4c3a: f1 04 cpc r15, r1 + 4c3c: 28 f0 brcs .+10 ; 0x4c48 + 4c3e: 0f c0 rjmp .+30 ; 0x4c5e + 4c40: 88 e0 ldi r24, 0x08 ; 8 + 4c42: e8 16 cp r14, r24 + 4c44: f1 04 cpc r15, r1 + 4c46: 59 f0 breq .+22 ; 0x4c5e + { + TEMPLATE_TRANSFER_BYTE(DataStream); + 4c48: f8 01 movw r30, r16 + 4c4a: 84 91 lpm r24, Z + 4c4c: 56 d0 rcall .+172 ; 0x4cfa + TEMPLATE_BUFFER_MOVE(DataStream, 1); + 4c4e: 0f 5f subi r16, 0xFF ; 255 + 4c50: 1f 4f sbci r17, 0xFF ; 255 + Length--; + 4c52: 21 97 sbiw r28, 0x01 ; 1 + BytesInEndpoint++; + 4c54: ff ef ldi r31, 0xFF ; 255 + 4c56: ef 1a sub r14, r31 + 4c58: ff 0a sbc r15, r31 + + if (Endpoint_IsINReady()) + { + uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + + while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) + 4c5a: 20 97 sbiw r28, 0x00 ; 0 + 4c5c: 89 f7 brne .-30 ; 0x4c40 + TEMPLATE_BUFFER_MOVE(DataStream, 1); + Length--; + BytesInEndpoint++; + } + + LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); + 4c5e: dd 24 eor r13, r13 + 4c60: d3 94 inc r13 + 4c62: e8 e0 ldi r30, 0x08 ; 8 + 4c64: ee 16 cp r14, r30 + 4c66: f1 04 cpc r15, r1 + 4c68: 09 f0 breq .+2 ; 0x4c6c + 4c6a: d1 2c mov r13, r1 + Endpoint_ClearIN(); + 4c6c: 0e d0 rcall .+28 ; 0x4c8a + 4c6e: 7e cf rjmp .-260 ; 0x4b6c + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + + if (Length > USB_ControlRequest.wLength) + Length = USB_ControlRequest.wLength; + else if (!(Length)) + Endpoint_ClearIN(); + 4c70: 0c d0 rcall .+24 ; 0x4c8a + 4c72: c0 e0 ldi r28, 0x00 ; 0 + 4c74: d0 e0 ldi r29, 0x00 ; 0 + 4c76: 77 cf rjmp .-274 ; 0x4b66 + */ + static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Endpoint_BytesInEndpoint(void) + { + if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) + return USB_Endpoint_SelectedFIFO->Position; + 4c78: e0 91 49 2b lds r30, 0x2B49 + 4c7c: f0 91 4a 2b lds r31, 0x2B4A + 4c80: ef 5b subi r30, 0xBF ; 191 + 4c82: ff 4f sbci r31, 0xFF ; 255 + 4c84: e0 80 ld r14, Z + 4c86: f1 2c mov r15, r1 + 4c88: d4 cf rjmp .-88 ; 0x4c32 + +00004c8a : + USB_Endpoint_SelectedFIFO->Position = 0; +} + +void Endpoint_ClearIN(void) +{ + USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; + 4c8a: e0 91 4b 2b lds r30, 0x2B4B + 4c8e: f0 91 4c 2b lds r31, 0x2B4C + 4c92: a0 91 49 2b lds r26, 0x2B49 + 4c96: b0 91 4a 2b lds r27, 0x2B4A + 4c9a: af 5b subi r26, 0xBF ; 191 + 4c9c: bf 4f sbci r27, 0xFF ; 255 + 4c9e: 8c 91 ld r24, X + 4ca0: 90 e0 ldi r25, 0x00 ; 0 + 4ca2: 82 83 std Z+2, r24 ; 0x02 + 4ca4: 93 83 std Z+3, r25 ; 0x03 + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 4ca6: 80 81 ld r24, Z + 4ca8: 8d 79 andi r24, 0x9D ; 157 + 4caa: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 4cac: e0 91 49 2b lds r30, 0x2B49 + 4cb0: f0 91 4a 2b lds r31, 0x2B4A + 4cb4: ef 5b subi r30, 0xBF ; 191 + 4cb6: ff 4f sbci r31, 0xFF ; 255 + 4cb8: 10 82 st Z, r1 + 4cba: 08 95 ret + +00004cbc : +} + +void Endpoint_ClearOUT(void) +{ + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 4cbc: e0 91 4b 2b lds r30, 0x2B4B + 4cc0: f0 91 4c 2b lds r31, 0x2B4C + 4cc4: 80 81 ld r24, Z + 4cc6: 8d 79 andi r24, 0x9D ; 157 + 4cc8: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 4cca: e0 91 49 2b lds r30, 0x2B49 + 4cce: f0 91 4a 2b lds r31, 0x2B4A + 4cd2: ef 5b subi r30, 0xBF ; 191 + 4cd4: ff 4f sbci r31, 0xFF ; 255 + 4cd6: 10 82 st Z, r1 + 4cd8: 08 95 ret + +00004cda : + } +} + +uint8_t Endpoint_Read_8(void) +{ + return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; + 4cda: 80 91 49 2b lds r24, 0x2B49 + 4cde: 90 91 4a 2b lds r25, 0x2B4A + 4ce2: fc 01 movw r30, r24 + 4ce4: ef 5b subi r30, 0xBF ; 191 + 4ce6: ff 4f sbci r31, 0xFF ; 255 + 4ce8: 20 81 ld r18, Z + 4cea: 31 e0 ldi r19, 0x01 ; 1 + 4cec: 32 0f add r19, r18 + 4cee: 30 83 st Z, r19 + 4cf0: fc 01 movw r30, r24 + 4cf2: e2 0f add r30, r18 + 4cf4: f1 1d adc r31, r1 + 4cf6: 80 81 ld r24, Z +} + 4cf8: 08 95 ret + +00004cfa : + +void Endpoint_Write_8(const uint8_t Data) +{ + USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; + 4cfa: 20 91 49 2b lds r18, 0x2B49 + 4cfe: 30 91 4a 2b lds r19, 0x2B4A + 4d02: f9 01 movw r30, r18 + 4d04: ef 5b subi r30, 0xBF ; 191 + 4d06: ff 4f sbci r31, 0xFF ; 255 + 4d08: 90 81 ld r25, Z + 4d0a: 41 e0 ldi r20, 0x01 ; 1 + 4d0c: 49 0f add r20, r25 + 4d0e: 40 83 st Z, r20 + 4d10: f9 01 movw r30, r18 + 4d12: e9 0f add r30, r25 + 4d14: f1 1d adc r31, r1 + 4d16: 80 83 st Z, r24 + 4d18: 08 95 ret + +00004d1a : + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ + uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + + USB_Endpoint_SelectedEndpoint = Address; + 4d1a: 80 93 4d 2b sts 0x2B4D, r24 + USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; +} + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ + uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + 4d1e: 28 2f mov r18, r24 + 4d20: 2f 70 andi r18, 0x0F ; 15 + + USB_Endpoint_SelectedEndpoint = Address; + + Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; + 4d22: 62 2f mov r22, r18 + 4d24: 70 e0 ldi r23, 0x00 ; 0 + 4d26: 94 e8 ldi r25, 0x84 ; 132 + 4d28: 29 9f mul r18, r25 + 4d2a: 90 01 movw r18, r0 + 4d2c: 11 24 eor r1, r1 + 4d2e: 22 5b subi r18, 0xB2 ; 178 + 4d30: 34 4d sbci r19, 0xD4 ; 212 + USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; + 4d32: 40 91 c6 04 lds r20, 0x04C6 + 4d36: 50 91 c7 04 lds r21, 0x04C7 + + if (Address & ENDPOINT_DIR_IN) + 4d3a: 87 fd sbrc r24, 7 + 4d3c: 12 c0 rjmp .+36 ; 0x4d62 + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; + } + else + { + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; + 4d3e: 20 93 49 2b sts 0x2B49, r18 + 4d42: 30 93 4a 2b sts 0x2B4A, r19 + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; + 4d46: cb 01 movw r24, r22 + 4d48: 82 95 swap r24 + 4d4a: 92 95 swap r25 + 4d4c: 90 7f andi r25, 0xF0 ; 240 + 4d4e: 98 27 eor r25, r24 + 4d50: 80 7f andi r24, 0xF0 ; 240 + 4d52: 98 27 eor r25, r24 + 4d54: 84 0f add r24, r20 + 4d56: 95 1f adc r25, r21 + 4d58: 80 93 4b 2b sts 0x2B4B, r24 + 4d5c: 90 93 4c 2b sts 0x2B4C, r25 + 4d60: 08 95 ret + Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; + USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; + + if (Address & ENDPOINT_DIR_IN) + { + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; + 4d62: 2e 5b subi r18, 0xBE ; 190 + 4d64: 3f 4f sbci r19, 0xFF ; 255 + 4d66: 20 93 49 2b sts 0x2B49, r18 + 4d6a: 30 93 4a 2b sts 0x2B4A, r19 + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; + 4d6e: 62 95 swap r22 + 4d70: 72 95 swap r23 + 4d72: 70 7f andi r23, 0xF0 ; 240 + 4d74: 76 27 eor r23, r22 + 4d76: 60 7f andi r22, 0xF0 ; 240 + 4d78: 76 27 eor r23, r22 + 4d7a: 68 5f subi r22, 0xF8 ; 248 + 4d7c: 7f 4f sbci r23, 0xFF ; 255 + 4d7e: 64 0f add r22, r20 + 4d80: 75 1f adc r23, r21 + 4d82: 60 93 4b 2b sts 0x2B4B, r22 + 4d86: 70 93 4c 2b sts 0x2B4C, r23 + 4d8a: 08 95 ret + +00004d8c : +volatile USB_EP_t* USB_Endpoint_SelectedHandle; +volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; + +bool Endpoint_IsINReady(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 4d8c: 80 91 4d 2b lds r24, 0x2B4D + 4d90: 80 68 ori r24, 0x80 ; 128 + 4d92: c3 df rcall .-122 ; 0x4d1a + + return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); + 4d94: e0 91 4b 2b lds r30, 0x2B4B + 4d98: f0 91 4c 2b lds r31, 0x2B4C + 4d9c: 80 81 ld r24, Z +} + 4d9e: 86 95 lsr r24 + 4da0: 81 70 andi r24, 0x01 ; 1 + 4da2: 08 95 ret + +00004da4 : + +bool Endpoint_IsOUTReceived(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 4da4: 80 91 4d 2b lds r24, 0x2B4D + 4da8: 8f 77 andi r24, 0x7F ; 127 + 4daa: b7 df rcall .-146 ; 0x4d1a + + if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) + 4dac: e0 91 4b 2b lds r30, 0x2B4B + 4db0: f0 91 4c 2b lds r31, 0x2B4C + 4db4: 80 81 ld r24, Z + 4db6: 85 ff sbrs r24, 5 + 4db8: 0c c0 rjmp .+24 ; 0x4dd2 + { + USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; + 4dba: 20 91 49 2b lds r18, 0x2B49 + 4dbe: 30 91 4a 2b lds r19, 0x2B4A + 4dc2: 82 81 ldd r24, Z+2 ; 0x02 + 4dc4: 93 81 ldd r25, Z+3 ; 0x03 + 4dc6: f9 01 movw r30, r18 + 4dc8: e0 5c subi r30, 0xC0 ; 192 + 4dca: ff 4f sbci r31, 0xFF ; 255 + 4dcc: 80 83 st Z, r24 + return true; + 4dce: 81 e0 ldi r24, 0x01 ; 1 + 4dd0: 08 95 ret + } + + return false; + 4dd2: 80 e0 ldi r24, 0x00 ; 0 +} + 4dd4: 08 95 ret + +00004dd6 : + +bool Endpoint_IsSETUPReceived(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 4dd6: 80 91 4d 2b lds r24, 0x2B4D + 4dda: 8f 77 andi r24, 0x7F ; 127 + 4ddc: 9e df rcall .-196 ; 0x4d1a + + if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) + 4dde: e0 91 4b 2b lds r30, 0x2B4B + 4de2: f0 91 4c 2b lds r31, 0x2B4C + 4de6: 80 81 ld r24, Z + 4de8: 84 ff sbrs r24, 4 + 4dea: 0c c0 rjmp .+24 ; 0x4e04 + { + USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; + 4dec: 20 91 49 2b lds r18, 0x2B49 + 4df0: 30 91 4a 2b lds r19, 0x2B4A + 4df4: 82 81 ldd r24, Z+2 ; 0x02 + 4df6: 93 81 ldd r25, Z+3 ; 0x03 + 4df8: f9 01 movw r30, r18 + 4dfa: e0 5c subi r30, 0xC0 ; 192 + 4dfc: ff 4f sbci r31, 0xFF ; 255 + 4dfe: 80 83 st Z, r24 + return true; + 4e00: 81 e0 ldi r24, 0x01 ; 1 + 4e02: 08 95 ret + } + + return false; + 4e04: 80 e0 ldi r24, 0x00 ; 0 +} + 4e06: 08 95 ret + +00004e08 : + +void Endpoint_ClearSETUP(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 4e08: 80 91 4d 2b lds r24, 0x2B4D + 4e0c: 8f 77 andi r24, 0x7F ; 127 + 4e0e: 85 df rcall .-246 ; 0x4d1a + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 4e10: e0 91 4b 2b lds r30, 0x2B4B + 4e14: f0 91 4c 2b lds r31, 0x2B4C + 4e18: 80 81 ld r24, Z + 4e1a: 8d 78 andi r24, 0x8D ; 141 + 4e1c: 80 83 st Z, r24 + USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; + 4e1e: e0 91 4b 2b lds r30, 0x2B4B + 4e22: f0 91 4c 2b lds r31, 0x2B4C + 4e26: 80 81 ld r24, Z + 4e28: 81 60 ori r24, 0x01 ; 1 + 4e2a: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 4e2c: e0 91 49 2b lds r30, 0x2B49 + 4e30: f0 91 4a 2b lds r31, 0x2B4A + 4e34: ef 5b subi r30, 0xBF ; 191 + 4e36: ff 4f sbci r31, 0xFF ; 255 + 4e38: 10 82 st Z, r1 + + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 4e3a: 80 91 4d 2b lds r24, 0x2B4D + 4e3e: 80 68 ori r24, 0x80 ; 128 + 4e40: 6c df rcall .-296 ; 0x4d1a + USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; + 4e42: e0 91 4b 2b lds r30, 0x2B4B + 4e46: f0 91 4c 2b lds r31, 0x2B4C + 4e4a: 80 81 ld r24, Z + 4e4c: 81 60 ori r24, 0x01 ; 1 + 4e4e: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 4e50: e0 91 49 2b lds r30, 0x2B49 + 4e54: f0 91 4a 2b lds r31, 0x2B4A + 4e58: ef 5b subi r30, 0xBF ; 191 + 4e5a: ff 4f sbci r31, 0xFF ; 255 + 4e5c: 10 82 st Z, r1 + 4e5e: 08 95 ret + +00004e60 : + USB_Endpoint_SelectedFIFO->Position = 0; +} + +void Endpoint_StallTransaction(void) +{ + USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + 4e60: e0 91 4b 2b lds r30, 0x2B4B + 4e64: f0 91 4c 2b lds r31, 0x2B4C + 4e68: 81 81 ldd r24, Z+1 ; 0x01 + 4e6a: 84 60 ori r24, 0x04 ; 4 + 4e6c: 81 83 std Z+1, r24 ; 0x01 + + if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) + 4e6e: e0 91 4b 2b lds r30, 0x2B4B + 4e72: f0 91 4c 2b lds r31, 0x2B4C + 4e76: 81 81 ldd r24, Z+1 ; 0x01 + 4e78: 80 7c andi r24, 0xC0 ; 192 + 4e7a: 80 34 cpi r24, 0x40 ; 64 + 4e7c: 09 f0 breq .+2 ; 0x4e80 + 4e7e: 08 95 ret + { + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); + 4e80: 80 91 4d 2b lds r24, 0x2B4D + 4e84: 80 58 subi r24, 0x80 ; 128 + 4e86: 49 df rcall .-366 ; 0x4d1a + USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + 4e88: e0 91 4b 2b lds r30, 0x2B4B + 4e8c: f0 91 4c 2b lds r31, 0x2B4C + 4e90: 81 81 ldd r24, Z+1 ; 0x01 + 4e92: 84 60 ori r24, 0x04 ; 4 + 4e94: 81 83 std Z+1, r24 ; 0x01 + 4e96: 08 95 ret + +00004e98 : +} + +bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, + const uint8_t Config, + const uint8_t Size) +{ + 4e98: 1f 93 push r17 + 4e9a: cf 93 push r28 + 4e9c: df 93 push r29 + 4e9e: 00 d0 rcall .+0 ; 0x4ea0 + 4ea0: cd b7 in r28, 0x3d ; 61 + 4ea2: de b7 in r29, 0x3e ; 62 + 4ea4: 18 2f mov r17, r24 + Endpoint_SelectEndpoint(Address); + 4ea6: 4a 83 std Y+2, r20 ; 0x02 + 4ea8: 69 83 std Y+1, r22 ; 0x01 + 4eaa: 37 df rcall .-402 ; 0x4d1a + + USB_Endpoint_SelectedHandle->CTRL = 0; + 4eac: e0 91 4b 2b lds r30, 0x2B4B + 4eb0: f0 91 4c 2b lds r31, 0x2B4C + 4eb4: 11 82 std Z+1, r1 ; 0x01 + USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; + 4eb6: e0 91 4b 2b lds r30, 0x2B4B + 4eba: f0 91 4c 2b lds r31, 0x2B4C + 4ebe: 4a 81 ldd r20, Y+2 ; 0x02 + 4ec0: 69 81 ldd r22, Y+1 ; 0x01 + 4ec2: 17 fd sbrc r17, 7 + 4ec4: 20 c0 rjmp .+64 ; 0x4f06 + 4ec6: 10 82 st Z, r1 + USB_Endpoint_SelectedHandle->CTRL = Config; + 4ec8: e0 91 4b 2b lds r30, 0x2B4B + 4ecc: f0 91 4c 2b lds r31, 0x2B4C + 4ed0: 61 83 std Z+1, r22 ; 0x01 + USB_Endpoint_SelectedHandle->CNT = 0; + 4ed2: e0 91 4b 2b lds r30, 0x2B4B + 4ed6: f0 91 4c 2b lds r31, 0x2B4C + 4eda: 12 82 std Z+2, r1 ; 0x02 + 4edc: 13 82 std Z+3, r1 ; 0x03 + USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + 4ede: 80 91 49 2b lds r24, 0x2B49 + 4ee2: 90 91 4a 2b lds r25, 0x2B4A + 4ee6: 84 83 std Z+4, r24 ; 0x04 + 4ee8: 95 83 std Z+5, r25 ; 0x05 + + USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; + 4eea: 40 e0 ldi r20, 0x00 ; 0 + 4eec: fc 01 movw r30, r24 + 4eee: e0 5c subi r30, 0xC0 ; 192 + 4ef0: ff 4f sbci r31, 0xFF ; 255 + 4ef2: 40 83 st Z, r20 + USB_Endpoint_SelectedFIFO->Position = 0; + 4ef4: 31 96 adiw r30, 0x01 ; 1 + 4ef6: 10 82 st Z, r1 + + return true; +} + 4ef8: 81 e0 ldi r24, 0x01 ; 1 + 4efa: 0f 90 pop r0 + 4efc: 0f 90 pop r0 + 4efe: df 91 pop r29 + 4f00: cf 91 pop r28 + 4f02: 1f 91 pop r17 + 4f04: 08 95 ret + const uint8_t Size) +{ + Endpoint_SelectEndpoint(Address); + + USB_Endpoint_SelectedHandle->CTRL = 0; + USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; + 4f06: 82 e0 ldi r24, 0x02 ; 2 + 4f08: 80 83 st Z, r24 + USB_Endpoint_SelectedHandle->CTRL = Config; + 4f0a: e0 91 4b 2b lds r30, 0x2B4B + 4f0e: f0 91 4c 2b lds r31, 0x2B4C + 4f12: 61 83 std Z+1, r22 ; 0x01 + USB_Endpoint_SelectedHandle->CNT = 0; + 4f14: e0 91 4b 2b lds r30, 0x2B4B + 4f18: f0 91 4c 2b lds r31, 0x2B4C + 4f1c: 12 82 std Z+2, r1 ; 0x02 + 4f1e: 13 82 std Z+3, r1 ; 0x03 + USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + 4f20: 80 91 49 2b lds r24, 0x2B49 + 4f24: 90 91 4a 2b lds r25, 0x2B4A + 4f28: 84 83 std Z+4, r24 ; 0x04 + 4f2a: 95 83 std Z+5, r25 ; 0x05 + 4f2c: df cf rjmp .-66 ; 0x4eec + +00004f2e : + } +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + const uint8_t Entries) +{ + 4f2e: cf 92 push r12 + 4f30: df 92 push r13 + 4f32: ef 92 push r14 + 4f34: ff 92 push r15 + 4f36: 0f 93 push r16 + 4f38: 1f 93 push r17 + 4f3a: cf 93 push r28 + 4f3c: df 93 push r29 + 4f3e: 1f 92 push r1 + 4f40: cd b7 in r28, 0x3d ; 61 + 4f42: de b7 in r29, 0x3e ; 62 + 4f44: f6 2e mov r15, r22 + for (uint8_t i = 0; i < Entries; i++) + 4f46: 66 23 and r22, r22 + 4f48: 09 f4 brne .+2 ; 0x4f4c + 4f4a: 3e c0 rjmp .+124 ; 0x4fc8 + 4f4c: 6c 01 movw r12, r24 + 4f4e: 00 e0 ldi r16, 0x00 ; 0 + { + if (!(Table[i].Address)) + 4f50: d6 01 movw r26, r12 + 4f52: 1c 91 ld r17, X + 4f54: 11 23 and r17, r17 + 4f56: 91 f1 breq .+100 ; 0x4fbc + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + 4f58: d6 01 movw r26, r12 + 4f5a: 11 96 adiw r26, 0x01 ; 1 + 4f5c: ed 91 ld r30, X+ + 4f5e: fc 91 ld r31, X + 4f60: 12 97 sbiw r26, 0x02 ; 2 + 4f62: 13 96 adiw r26, 0x03 ; 3 + 4f64: 8c 91 ld r24, X + 4f66: 13 97 sbiw r26, 0x03 ; 3 + static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, + const uint8_t Type, + const uint16_t Size, + const uint8_t Banks) + { + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + 4f68: 14 96 adiw r26, 0x04 ; 4 + 4f6a: 9c 91 ld r25, X + 4f6c: 92 30 cpi r25, 0x02 ; 2 + 4f6e: 08 f4 brcc .+2 ; 0x4f72 + 4f70: 45 c0 rjmp .+138 ; 0x4ffc + 4f72: 98 e1 ldi r25, 0x18 ; 24 + 4f74: 48 e1 ldi r20, 0x18 ; 24 + static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) + { + uint8_t MaskVal = 0; + uint16_t CheckBytes = 8; + + while (CheckBytes < Bytes) + 4f76: e9 30 cpi r30, 0x09 ; 9 + 4f78: f1 05 cpc r31, r1 + 4f7a: 50 f0 brcs .+20 ; 0x4f90 + 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; + 4f7c: 28 e0 ldi r18, 0x08 ; 8 + 4f7e: 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; + 4f80: 90 e0 ldi r25, 0x00 ; 0 + uint16_t CheckBytes = 8; + + while (CheckBytes < Bytes) + { + MaskVal++; + 4f82: 9f 5f subi r25, 0xFF ; 255 + CheckBytes <<= 1; + 4f84: 22 0f add r18, r18 + 4f86: 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) + 4f88: 2e 17 cp r18, r30 + 4f8a: 3f 07 cpc r19, r31 + 4f8c: d0 f3 brcs .-12 ; 0x4f82 + 4f8e: 94 2b or r25, r20 + const uint16_t Size, + const uint8_t Banks) + { + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + + if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) + 4f90: 21 2f mov r18, r17 + 4f92: 2f 70 andi r18, 0x0F ; 15 + 4f94: 30 e0 ldi r19, 0x00 ; 0 + 4f96: 26 30 cpi r18, 0x06 ; 6 + 4f98: 31 05 cpc r19, r1 + 4f9a: 9c f5 brge .+102 ; 0x5002 + return false; + + // TODO - Fix once limitations are lifted + EPConfigMask &= ~USB_EP_PINGPONG_bm; + 4f9c: 9f 7e andi r25, 0xEF ; 239 + if (Size > 64) + 4f9e: e1 34 cpi r30, 0x41 ; 65 + 4fa0: f1 05 cpc r31, r1 + 4fa2: 78 f5 brcc .+94 ; 0x5002 + return false; + + switch (Type) + 4fa4: 88 23 and r24, r24 + 4fa6: 01 f1 breq .+64 ; 0x4fe8 + 4fa8: 81 30 cpi r24, 0x01 ; 1 + 4faa: c9 f4 brne .+50 ; 0x4fde + { + case EP_TYPE_CONTROL: + EPConfigMask |= USB_EP_TYPE_CONTROL_gc; + break; + case EP_TYPE_ISOCHRONOUS: + EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; + 4fac: 90 6c ori r25, 0xC0 ; 192 + 4fae: ee 2e mov r14, r30 + } + + if (Type == EP_TYPE_CONTROL) + Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + + return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); + 4fb0: 4e 2d mov r20, r14 + 4fb2: 69 2f mov r22, r25 + 4fb4: 81 2f mov r24, r17 + 4fb6: 70 df rcall .-288 ; 0x4e98 + 4fb8: 88 23 and r24, r24 + 4fba: 19 f1 breq .+70 ; 0x5002 +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + const uint8_t Entries) +{ + for (uint8_t i = 0; i < Entries; i++) + 4fbc: 0f 5f subi r16, 0xFF ; 255 + 4fbe: b5 e0 ldi r27, 0x05 ; 5 + 4fc0: cb 0e add r12, r27 + 4fc2: d1 1c adc r13, r1 + 4fc4: 0f 11 cpse r16, r15 + 4fc6: c4 cf rjmp .-120 ; 0x4f50 + { + return false; + } + } + + return true; + 4fc8: 81 e0 ldi r24, 0x01 ; 1 +} + 4fca: 0f 90 pop r0 4fcc: df 91 pop r29 4fce: cf 91 pop r28 4fd0: 1f 91 pop r17 @@ -16714,3385 +16317,2701 @@ uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, 4fd8: df 90 pop r13 4fda: cf 90 pop r12 4fdc: 08 95 ret - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - return USB_Endpoint_SelectedFIFO->Position; - 4fde: e0 91 49 2b lds r30, 0x2B49 - 4fe2: f0 91 4a 2b lds r31, 0x2B4A - 4fe6: ef 5b subi r30, 0xBF ; 191 - 4fe8: ff 4f sbci r31, 0xFF ; 255 - 4fea: 00 81 ld r16, Z - 4fec: 10 e0 ldi r17, 0x00 ; 0 - 4fee: b1 cf rjmp .-158 ; 0x4f52 - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - return ENDPOINT_RWCSTREAM_HostAborted; - 4ff0: 81 e0 ldi r24, 0x01 ; 1 - 4ff2: ec cf rjmp .-40 ; 0x4fcc - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - - if (Length > USB_ControlRequest.wLength) - Length = USB_ControlRequest.wLength; - else if (!(Length)) - Endpoint_ClearIN(); - 4ff4: 05 d0 rcall .+10 ; 0x5000 - 4ff6: c0 e0 ldi r28, 0x00 ; 0 - 4ff8: d0 e0 ldi r29, 0x00 ; 0 - 4ffa: 7e cf rjmp .-260 ; 0x4ef8 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - } - - return ENDPOINT_RWCSTREAM_NoError; - 4ffc: 80 e0 ldi r24, 0x00 ; 0 - 4ffe: e6 cf rjmp .-52 ; 0x4fcc - -00005000 : - USB_Endpoint_SelectedFIFO->Position = 0; -} - -void Endpoint_ClearIN(void) -{ - USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; - 5000: e0 91 4b 2b lds r30, 0x2B4B - 5004: f0 91 4c 2b lds r31, 0x2B4C - 5008: a0 91 49 2b lds r26, 0x2B49 - 500c: b0 91 4a 2b lds r27, 0x2B4A - 5010: af 5b subi r26, 0xBF ; 191 - 5012: bf 4f sbci r27, 0xFF ; 255 - 5014: 8c 91 ld r24, X - 5016: 90 e0 ldi r25, 0x00 ; 0 - 5018: 82 83 std Z+2, r24 ; 0x02 - 501a: 93 83 std Z+3, r25 ; 0x03 - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 501c: 80 81 ld r24, Z - 501e: 8d 79 andi r24, 0x9D ; 157 - 5020: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 5022: e0 91 49 2b lds r30, 0x2B49 - 5026: f0 91 4a 2b lds r31, 0x2B4A - 502a: ef 5b subi r30, 0xBF ; 191 - 502c: ff 4f sbci r31, 0xFF ; 255 - 502e: 10 82 st Z, r1 - 5030: 08 95 ret - -00005032 : -} - -void Endpoint_ClearOUT(void) -{ - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 5032: e0 91 4b 2b lds r30, 0x2B4B - 5036: f0 91 4c 2b lds r31, 0x2B4C - 503a: 80 81 ld r24, Z - 503c: 8d 79 andi r24, 0x9D ; 157 - 503e: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 5040: e0 91 49 2b lds r30, 0x2B49 - 5044: f0 91 4a 2b lds r31, 0x2B4A - 5048: ef 5b subi r30, 0xBF ; 191 - 504a: ff 4f sbci r31, 0xFF ; 255 - 504c: 10 82 st Z, r1 - 504e: 08 95 ret - -00005050 : - } -} - -uint8_t Endpoint_Read_8(void) -{ - return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; - 5050: 80 91 49 2b lds r24, 0x2B49 - 5054: 90 91 4a 2b lds r25, 0x2B4A - 5058: fc 01 movw r30, r24 - 505a: ef 5b subi r30, 0xBF ; 191 - 505c: ff 4f sbci r31, 0xFF ; 255 - 505e: 20 81 ld r18, Z - 5060: dc 01 movw r26, r24 - 5062: a2 0f add r26, r18 - 5064: b1 1d adc r27, r1 - 5066: 8c 91 ld r24, X - 5068: 2f 5f subi r18, 0xFF ; 255 - 506a: 20 83 st Z, r18 -} - 506c: 08 95 ret - -0000506e : - -void Endpoint_Write_8(const uint8_t Data) -{ - USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; - 506e: 20 91 49 2b lds r18, 0x2B49 - 5072: 30 91 4a 2b lds r19, 0x2B4A - 5076: f9 01 movw r30, r18 - 5078: ef 5b subi r30, 0xBF ; 191 - 507a: ff 4f sbci r31, 0xFF ; 255 - 507c: 90 81 ld r25, Z - 507e: d9 01 movw r26, r18 - 5080: a9 0f add r26, r25 - 5082: b1 1d adc r27, r1 - 5084: 8c 93 st X, r24 - 5086: 9f 5f subi r25, 0xFF ; 255 - 5088: 90 83 st Z, r25 - 508a: 08 95 ret - -0000508c : - -void Endpoint_SelectEndpoint(const uint8_t Address) -{ - uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); - - USB_Endpoint_SelectedEndpoint = Address; - 508c: 80 93 4d 2b sts 0x2B4D, r24 - USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; -} - -void Endpoint_SelectEndpoint(const uint8_t Address) -{ - uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); - 5090: 28 2f mov r18, r24 - 5092: 2f 70 andi r18, 0x0F ; 15 - - USB_Endpoint_SelectedEndpoint = Address; - - Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; - 5094: 62 2f mov r22, r18 - 5096: 70 e0 ldi r23, 0x00 ; 0 - 5098: 94 e8 ldi r25, 0x84 ; 132 - 509a: 29 9f mul r18, r25 - 509c: 90 01 movw r18, r0 - 509e: 11 24 eor r1, r1 - 50a0: 22 5b subi r18, 0xB2 ; 178 - 50a2: 34 4d sbci r19, 0xD4 ; 212 - USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; - 50a4: 40 91 c6 04 lds r20, 0x04C6 - 50a8: 50 91 c7 04 lds r21, 0x04C7 - - if (Address & ENDPOINT_DIR_IN) - 50ac: 87 fd sbrc r24, 7 - 50ae: 12 c0 rjmp .+36 ; 0x50d4 - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - } - else - { - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; - 50b0: 20 93 49 2b sts 0x2B49, r18 - 50b4: 30 93 4a 2b sts 0x2B4A, r19 - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; - 50b8: cb 01 movw r24, r22 - 50ba: 82 95 swap r24 - 50bc: 92 95 swap r25 - 50be: 90 7f andi r25, 0xF0 ; 240 - 50c0: 98 27 eor r25, r24 - 50c2: 80 7f andi r24, 0xF0 ; 240 - 50c4: 98 27 eor r25, r24 - 50c6: 84 0f add r24, r20 - 50c8: 95 1f adc r25, r21 - 50ca: 80 93 4b 2b sts 0x2B4B, r24 - 50ce: 90 93 4c 2b sts 0x2B4C, r25 - 50d2: 08 95 ret - Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; - USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; - - if (Address & ENDPOINT_DIR_IN) - { - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; - 50d4: 2e 5b subi r18, 0xBE ; 190 - 50d6: 3f 4f sbci r19, 0xFF ; 255 - 50d8: 20 93 49 2b sts 0x2B49, r18 - 50dc: 30 93 4a 2b sts 0x2B4A, r19 - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - 50e0: 62 95 swap r22 - 50e2: 72 95 swap r23 - 50e4: 70 7f andi r23, 0xF0 ; 240 - 50e6: 76 27 eor r23, r22 - 50e8: 60 7f andi r22, 0xF0 ; 240 - 50ea: 76 27 eor r23, r22 - 50ec: 68 5f subi r22, 0xF8 ; 248 - 50ee: 7f 4f sbci r23, 0xFF ; 255 - 50f0: 64 0f add r22, r20 - 50f2: 75 1f adc r23, r21 - 50f4: 60 93 4b 2b sts 0x2B4B, r22 - 50f8: 70 93 4c 2b sts 0x2B4C, r23 - 50fc: 08 95 ret - -000050fe : - USB_Endpoint_SelectedFIFO->Position = 0; -} - -void Endpoint_StallTransaction(void) -{ - USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 50fe: e0 91 4b 2b lds r30, 0x2B4B - 5102: f0 91 4c 2b lds r31, 0x2B4C - 5106: 81 81 ldd r24, Z+1 ; 0x01 - 5108: 84 60 ori r24, 0x04 ; 4 - 510a: 81 83 std Z+1, r24 ; 0x01 - - if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) - 510c: e0 91 4b 2b lds r30, 0x2B4B - 5110: f0 91 4c 2b lds r31, 0x2B4C - 5114: 81 81 ldd r24, Z+1 ; 0x01 - 5116: 80 7c andi r24, 0xC0 ; 192 - 5118: 80 34 cpi r24, 0x40 ; 64 - 511a: 09 f0 breq .+2 ; 0x511e - 511c: 08 95 ret - { - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); - 511e: 80 91 4d 2b lds r24, 0x2B4D - 5122: 80 58 subi r24, 0x80 ; 128 - 5124: b3 df rcall .-154 ; 0x508c - USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 5126: e0 91 4b 2b lds r30, 0x2B4B - 512a: f0 91 4c 2b lds r31, 0x2B4C - 512e: 81 81 ldd r24, Z+1 ; 0x01 - 5130: 84 60 ori r24, 0x04 ; 4 - 5132: 81 83 std Z+1, r24 ; 0x01 - 5134: 08 95 ret - -00005136 : - return false; -} - -void Endpoint_ClearSETUP(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 5136: 80 91 4d 2b lds r24, 0x2B4D - 513a: 8f 77 andi r24, 0x7F ; 127 - 513c: a7 df rcall .-178 ; 0x508c - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 513e: e0 91 4b 2b lds r30, 0x2B4B - 5142: f0 91 4c 2b lds r31, 0x2B4C - 5146: 80 81 ld r24, Z - 5148: 8d 78 andi r24, 0x8D ; 141 - 514a: 80 83 st Z, r24 - USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 514c: e0 91 4b 2b lds r30, 0x2B4B - 5150: f0 91 4c 2b lds r31, 0x2B4C - 5154: 80 81 ld r24, Z - 5156: 81 60 ori r24, 0x01 ; 1 - 5158: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 515a: e0 91 49 2b lds r30, 0x2B49 - 515e: f0 91 4a 2b lds r31, 0x2B4A - 5162: ef 5b subi r30, 0xBF ; 191 - 5164: ff 4f sbci r31, 0xFF ; 255 - 5166: 10 82 st Z, r1 - - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 5168: 80 91 4d 2b lds r24, 0x2B4D - 516c: 80 68 ori r24, 0x80 ; 128 - 516e: 8e df rcall .-228 ; 0x508c - USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 5170: e0 91 4b 2b lds r30, 0x2B4B - 5174: f0 91 4c 2b lds r31, 0x2B4C - 5178: 80 81 ld r24, Z - 517a: 81 60 ori r24, 0x01 ; 1 - 517c: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 517e: e0 91 49 2b lds r30, 0x2B49 - 5182: f0 91 4a 2b lds r31, 0x2B4A - 5186: ef 5b subi r30, 0xBF ; 191 - 5188: ff 4f sbci r31, 0xFF ; 255 - 518a: 10 82 st Z, r1 - 518c: 08 95 ret - -0000518e : - return false; -} - -bool Endpoint_IsSETUPReceived(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 518e: 80 91 4d 2b lds r24, 0x2B4D - 5192: 8f 77 andi r24, 0x7F ; 127 - 5194: 7b df rcall .-266 ; 0x508c - - if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) - 5196: e0 91 4b 2b lds r30, 0x2B4B - 519a: f0 91 4c 2b lds r31, 0x2B4C - 519e: 80 81 ld r24, Z - 51a0: 84 ff sbrs r24, 4 - 51a2: 0c c0 rjmp .+24 ; 0x51bc - { - USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 51a4: 20 91 49 2b lds r18, 0x2B49 - 51a8: 30 91 4a 2b lds r19, 0x2B4A - 51ac: 82 81 ldd r24, Z+2 ; 0x02 - 51ae: 93 81 ldd r25, Z+3 ; 0x03 - 51b0: f9 01 movw r30, r18 - 51b2: e0 5c subi r30, 0xC0 ; 192 - 51b4: ff 4f sbci r31, 0xFF ; 255 - 51b6: 80 83 st Z, r24 - return true; - 51b8: 81 e0 ldi r24, 0x01 ; 1 - 51ba: 08 95 ret - } - - return false; - 51bc: 80 e0 ldi r24, 0x00 ; 0 -} - 51be: 08 95 ret - -000051c0 : - return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); -} - -bool Endpoint_IsOUTReceived(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 51c0: 80 91 4d 2b lds r24, 0x2B4D - 51c4: 8f 77 andi r24, 0x7F ; 127 - 51c6: 62 df rcall .-316 ; 0x508c - - if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) - 51c8: e0 91 4b 2b lds r30, 0x2B4B - 51cc: f0 91 4c 2b lds r31, 0x2B4C - 51d0: 80 81 ld r24, Z - 51d2: 85 ff sbrs r24, 5 - 51d4: 0c c0 rjmp .+24 ; 0x51ee - { - USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 51d6: 20 91 49 2b lds r18, 0x2B49 - 51da: 30 91 4a 2b lds r19, 0x2B4A - 51de: 82 81 ldd r24, Z+2 ; 0x02 - 51e0: 93 81 ldd r25, Z+3 ; 0x03 - 51e2: f9 01 movw r30, r18 - 51e4: e0 5c subi r30, 0xC0 ; 192 - 51e6: ff 4f sbci r31, 0xFF ; 255 - 51e8: 80 83 st Z, r24 - return true; - 51ea: 81 e0 ldi r24, 0x01 ; 1 - 51ec: 08 95 ret - } - - return false; - 51ee: 80 e0 ldi r24, 0x00 ; 0 -} - 51f0: 08 95 ret - -000051f2 : -volatile USB_EP_t* USB_Endpoint_SelectedHandle; -volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; - -bool Endpoint_IsINReady(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 51f2: 80 91 4d 2b lds r24, 0x2B4D - 51f6: 80 68 ori r24, 0x80 ; 128 - 51f8: 49 df rcall .-366 ; 0x508c - - return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); - 51fa: e0 91 4b 2b lds r30, 0x2B4B - 51fe: f0 91 4c 2b lds r31, 0x2B4C - 5202: 80 81 ld r24, Z -} - 5204: 86 95 lsr r24 - 5206: 81 70 andi r24, 0x01 ; 1 - 5208: 08 95 ret - -0000520a : -} - -bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, - const uint8_t Config, - const uint8_t Size) -{ - 520a: 1f 93 push r17 - 520c: cf 93 push r28 - 520e: df 93 push r29 - 5210: 00 d0 rcall .+0 ; 0x5212 - 5212: cd b7 in r28, 0x3d ; 61 - 5214: de b7 in r29, 0x3e ; 62 - 5216: 18 2f mov r17, r24 - Endpoint_SelectEndpoint(Address); - 5218: 4a 83 std Y+2, r20 ; 0x02 - 521a: 69 83 std Y+1, r22 ; 0x01 - 521c: 37 df rcall .-402 ; 0x508c - - USB_Endpoint_SelectedHandle->CTRL = 0; - 521e: e0 91 4b 2b lds r30, 0x2B4B - 5222: f0 91 4c 2b lds r31, 0x2B4C - 5226: 11 82 std Z+1, r1 ; 0x01 - USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 5228: e0 91 4b 2b lds r30, 0x2B4B - 522c: f0 91 4c 2b lds r31, 0x2B4C - 5230: 4a 81 ldd r20, Y+2 ; 0x02 - 5232: 69 81 ldd r22, Y+1 ; 0x01 - 5234: 17 fd sbrc r17, 7 - 5236: 22 c0 rjmp .+68 ; 0x527c - 5238: 10 82 st Z, r1 - USB_Endpoint_SelectedHandle->CTRL = Config; - 523a: e0 91 4b 2b lds r30, 0x2B4B - 523e: f0 91 4c 2b lds r31, 0x2B4C - 5242: 61 83 std Z+1, r22 ; 0x01 - USB_Endpoint_SelectedHandle->CNT = 0; - 5244: e0 91 4b 2b lds r30, 0x2B4B - 5248: f0 91 4c 2b lds r31, 0x2B4C - 524c: 12 82 std Z+2, r1 ; 0x02 - 524e: 13 82 std Z+3, r1 ; 0x03 - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 5250: 80 91 49 2b lds r24, 0x2B49 - 5254: 90 91 4a 2b lds r25, 0x2B4A - 5258: 84 83 std Z+4, r24 ; 0x04 - 525a: 95 83 std Z+5, r25 ; 0x05 - - USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; - 525c: 40 e0 ldi r20, 0x00 ; 0 - 525e: fc 01 movw r30, r24 - 5260: e0 5c subi r30, 0xC0 ; 192 - 5262: ff 4f sbci r31, 0xFF ; 255 - 5264: 40 83 st Z, r20 - USB_Endpoint_SelectedFIFO->Position = 0; - 5266: fc 01 movw r30, r24 - 5268: ef 5b subi r30, 0xBF ; 191 - 526a: ff 4f sbci r31, 0xFF ; 255 - 526c: 10 82 st Z, r1 - - return true; -} - 526e: 81 e0 ldi r24, 0x01 ; 1 - 5270: 0f 90 pop r0 - 5272: 0f 90 pop r0 - 5274: df 91 pop r29 - 5276: cf 91 pop r28 - 5278: 1f 91 pop r17 - 527a: 08 95 ret - const uint8_t Size) -{ - Endpoint_SelectEndpoint(Address); - - USB_Endpoint_SelectedHandle->CTRL = 0; - USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 527c: 82 e0 ldi r24, 0x02 ; 2 - 527e: 80 83 st Z, r24 - USB_Endpoint_SelectedHandle->CTRL = Config; - 5280: e0 91 4b 2b lds r30, 0x2B4B - 5284: f0 91 4c 2b lds r31, 0x2B4C - 5288: 61 83 std Z+1, r22 ; 0x01 - USB_Endpoint_SelectedHandle->CNT = 0; - 528a: e0 91 4b 2b lds r30, 0x2B4B - 528e: f0 91 4c 2b lds r31, 0x2B4C - 5292: 12 82 std Z+2, r1 ; 0x02 - 5294: 13 82 std Z+3, r1 ; 0x03 - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 5296: 80 91 49 2b lds r24, 0x2B49 - 529a: 90 91 4a 2b lds r25, 0x2B4A - 529e: 84 83 std Z+4, r24 ; 0x04 - 52a0: 95 83 std Z+5, r25 ; 0x05 - 52a2: dd cf rjmp .-70 ; 0x525e - -000052a4 : - } -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - const uint8_t Entries) -{ - 52a4: af 92 push r10 - 52a6: bf 92 push r11 - 52a8: df 92 push r13 - 52aa: ef 92 push r14 - 52ac: ff 92 push r15 - 52ae: 0f 93 push r16 - 52b0: 1f 93 push r17 - 52b2: cf 93 push r28 - 52b4: df 93 push r29 - 52b6: 00 d0 rcall .+0 ; 0x52b8 - 52b8: cd b7 in r28, 0x3d ; 61 - 52ba: de b7 in r29, 0x3e ; 62 - 52bc: e6 2e mov r14, r22 - for (uint8_t i = 0; i < Entries; i++) - 52be: 66 23 and r22, r22 - 52c0: 09 f4 brne .+2 ; 0x52c4 - 52c2: 4a c0 rjmp .+148 ; 0x5358 - 52c4: 5c 01 movw r10, r24 - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; - } -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - 52c6: 8c 01 movw r16, r24 - 52c8: 0c 5f subi r16, 0xFC ; 252 - 52ca: 1f 4f sbci r17, 0xFF ; 255 - const uint8_t Entries) -{ - for (uint8_t i = 0; i < Entries; i++) - 52cc: f1 2c mov r15, r1 - { - if (!(Table[i].Address)) - 52ce: d5 01 movw r26, r10 - 52d0: 5c 91 ld r21, X - 52d2: 55 23 and r21, r21 - 52d4: c9 f1 breq .+114 ; 0x5348 - continue; - - if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 52d6: d5 01 movw r26, r10 - 52d8: 11 96 adiw r26, 0x01 ; 1 - 52da: ed 91 ld r30, X+ - 52dc: fc 91 ld r31, X - 52de: 12 97 sbiw r26, 0x02 ; 2 - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; - } -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - 52e0: d8 01 movw r26, r16 - 52e2: 11 97 sbiw r26, 0x01 ; 1 - for (uint8_t i = 0; i < Entries; i++) - { - if (!(Table[i].Address)) - continue; - - if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 52e4: 4c 91 ld r20, X - static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, - const uint8_t Type, - const uint16_t Size, - const uint8_t Banks) - { - uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - 52e6: d8 01 movw r26, r16 - 52e8: 8c 91 ld r24, X - 52ea: 82 30 cpi r24, 0x02 ; 2 - 52ec: 08 f4 brcc .+2 ; 0x52f0 - 52ee: 43 c0 rjmp .+134 ; 0x5376 - 52f0: 98 e1 ldi r25, 0x18 ; 24 - 52f2: 88 e1 ldi r24, 0x18 ; 24 - static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) - { - uint8_t MaskVal = 0; - uint16_t CheckBytes = 8; - - while (CheckBytes < Bytes) - 52f4: e9 30 cpi r30, 0x09 ; 9 - 52f6: f1 05 cpc r31, r1 - 52f8: 50 f0 brcs .+20 ; 0x530e - 52fa: 28 e0 ldi r18, 0x08 ; 8 - 52fc: 30 e0 ldi r19, 0x00 ; 0 - 52fe: 90 e0 ldi r25, 0x00 ; 0 - { - MaskVal++; - 5300: 9f 5f subi r25, 0xFF ; 255 - CheckBytes <<= 1; - 5302: 22 0f add r18, r18 - 5304: 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) - 5306: 2e 17 cp r18, r30 - 5308: 3f 07 cpc r19, r31 - 530a: d0 f3 brcs .-12 ; 0x5300 - 530c: 98 2b or r25, r24 - const uint16_t Size, - const uint8_t Banks) - { - uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - - if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) - 530e: 25 2f mov r18, r21 - 5310: 2f 70 andi r18, 0x0F ; 15 - 5312: 30 e0 ldi r19, 0x00 ; 0 - 5314: 26 30 cpi r18, 0x06 ; 6 - 5316: 31 05 cpc r19, r1 - 5318: 64 f5 brge .+88 ; 0x5372 - return false; - - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - if (Size > 64) - 531a: e1 34 cpi r30, 0x41 ; 65 - 531c: f1 05 cpc r31, r1 - 531e: 48 f5 brcc .+82 ; 0x5372 - - if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) - return false; - - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - 5320: 9f 7e andi r25, 0xEF ; 239 - if (Size > 64) - return false; - - switch (Type) - 5322: 41 11 cpse r20, r1 - 5324: 2b c0 rjmp .+86 ; 0x537c - { - case EP_TYPE_CONTROL: - EPConfigMask |= USB_EP_TYPE_CONTROL_gc; - 5326: 90 64 ori r25, 0x40 ; 64 - EPConfigMask |= USB_EP_TYPE_BULK_gc; - break; - } - - if (Type == EP_TYPE_CONTROL) - Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 5328: de 2e mov r13, r30 - 532a: 4e 2f mov r20, r30 - 532c: 69 2f mov r22, r25 - 532e: 85 2f mov r24, r21 - 5330: 80 58 subi r24, 0x80 ; 128 - 5332: 59 83 std Y+1, r21 ; 0x01 - 5334: 9a 83 std Y+2, r25 ; 0x02 - 5336: 69 df rcall .-302 ; 0x520a - 5338: 9a 81 ldd r25, Y+2 ; 0x02 - 533a: 59 81 ldd r21, Y+1 ; 0x01 - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 533c: 4d 2d mov r20, r13 - 533e: 69 2f mov r22, r25 - 5340: 85 2f mov r24, r21 - 5342: 63 df rcall .-314 ; 0x520a - 5344: 88 23 and r24, r24 - 5346: a9 f0 breq .+42 ; 0x5372 -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - const uint8_t Entries) -{ - for (uint8_t i = 0; i < Entries; i++) - 5348: f3 94 inc r15 - 534a: b5 e0 ldi r27, 0x05 ; 5 - 534c: ab 0e add r10, r27 - 534e: b1 1c adc r11, r1 - 5350: 0b 5f subi r16, 0xFB ; 251 - 5352: 1f 4f sbci r17, 0xFF ; 255 - 5354: fe 10 cpse r15, r14 - 5356: bb cf rjmp .-138 ; 0x52ce - { - return false; - } - } - - return true; - 5358: 81 e0 ldi r24, 0x01 ; 1 -} - 535a: 0f 90 pop r0 - 535c: 0f 90 pop r0 - 535e: df 91 pop r29 - 5360: cf 91 pop r28 - 5362: 1f 91 pop r17 - 5364: 0f 91 pop r16 - 5366: ff 90 pop r15 - 5368: ef 90 pop r14 - 536a: df 90 pop r13 - 536c: bf 90 pop r11 - 536e: af 90 pop r10 - 5370: 08 95 ret - if (!(Table[i].Address)) - continue; - - if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - { - return false; - 5372: 80 e0 ldi r24, 0x00 ; 0 - 5374: f2 cf rjmp .-28 ; 0x535a - static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, - const uint8_t Type, - const uint16_t Size, - const uint8_t Banks) - { - uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - 5376: 98 e0 ldi r25, 0x08 ; 8 - 5378: 88 e0 ldi r24, 0x08 ; 8 - 537a: bc cf rjmp .-136 ; 0x52f4 - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - if (Size > 64) - return false; - - switch (Type) - 537c: 41 30 cpi r20, 0x01 ; 1 - 537e: 29 f0 breq .+10 ; 0x538a break; case EP_TYPE_ISOCHRONOUS: EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; break; default: EPConfigMask |= USB_EP_TYPE_BULK_gc; - 5380: 90 68 ori r25, 0x80 ; 128 + 4fde: 90 68 ori r25, 0x80 ; 128 break; } if (Type == EP_TYPE_CONTROL) - 5382: 44 23 and r20, r20 - 5384: 89 f2 breq .-94 ; 0x5328 - 5386: de 2e mov r13, r30 - 5388: d9 cf rjmp .-78 ; 0x533c + 4fe0: 88 23 and r24, r24 + 4fe2: 19 f0 breq .+6 ; 0x4fea + 4fe4: ee 2e mov r14, r30 + 4fe6: e4 cf rjmp .-56 ; 0x4fb0 + return false; + + switch (Type) { case EP_TYPE_CONTROL: EPConfigMask |= USB_EP_TYPE_CONTROL_gc; + 4fe8: 90 64 ori r25, 0x40 ; 64 + EPConfigMask |= USB_EP_TYPE_BULK_gc; break; - case EP_TYPE_ISOCHRONOUS: - EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; - 538a: 90 6c ori r25, 0xC0 ; 192 - 538c: de 2e mov r13, r30 - 538e: d6 cf rjmp .-84 ; 0x533c + } -00005390 : + if (Type == EP_TYPE_CONTROL) + Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + 4fea: ee 2e mov r14, r30 + 4fec: 4e 2f mov r20, r30 + 4fee: 69 2f mov r22, r25 + 4ff0: 80 e8 ldi r24, 0x80 ; 128 + 4ff2: 81 0f add r24, r17 + 4ff4: 99 83 std Y+1, r25 ; 0x01 + 4ff6: 50 df rcall .-352 ; 0x4e98 + 4ff8: 99 81 ldd r25, Y+1 ; 0x01 + 4ffa: da cf rjmp .-76 ; 0x4fb0 + static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, + const uint8_t Type, + const uint16_t Size, + const uint8_t Banks) + { + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + 4ffc: 98 e0 ldi r25, 0x08 ; 8 + 4ffe: 48 e0 ldi r20, 0x08 ; 8 + 5000: ba cf rjmp .-140 ; 0x4f76 + if (!(Table[i].Address)) + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + { + return false; + 5002: 80 e0 ldi r24, 0x00 ; 0 + 5004: e2 cf rjmp .-60 ; 0x4fca + +00005006 : void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 5390: e0 ec ldi r30, 0xC0 ; 192 - 5392: f4 e0 ldi r31, 0x04 ; 4 - 5394: a6 81 ldd r26, Z+6 ; 0x06 - 5396: b7 81 ldd r27, Z+7 ; 0x07 - 5398: 19 96 adiw r26, 0x09 ; 9 - 539a: 1c 92 st X, r1 + 5006: e0 ec ldi r30, 0xC0 ; 192 + 5008: f4 e0 ldi r31, 0x04 ; 4 + 500a: a6 81 ldd r26, Z+6 ; 0x06 + 500c: b7 81 ldd r27, Z+7 ; 0x07 + 500e: 19 96 adiw r26, 0x09 ; 9 + 5010: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 539c: a6 81 ldd r26, Z+6 ; 0x06 - 539e: b7 81 ldd r27, Z+7 ; 0x07 - 53a0: 11 96 adiw r26, 0x01 ; 1 - 53a2: 1c 92 st X, r1 + 5012: a6 81 ldd r26, Z+6 ; 0x06 + 5014: b7 81 ldd r27, Z+7 ; 0x07 + 5016: 11 96 adiw r26, 0x01 ; 1 + 5018: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 53a4: a6 81 ldd r26, Z+6 ; 0x06 - 53a6: b7 81 ldd r27, Z+7 ; 0x07 - 53a8: 59 96 adiw r26, 0x19 ; 25 - 53aa: 1c 92 st X, r1 + 501a: a6 81 ldd r26, Z+6 ; 0x06 + 501c: b7 81 ldd r27, Z+7 ; 0x07 + 501e: 59 96 adiw r26, 0x19 ; 25 + 5020: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 53ac: a6 81 ldd r26, Z+6 ; 0x06 - 53ae: b7 81 ldd r27, Z+7 ; 0x07 - 53b0: 51 96 adiw r26, 0x11 ; 17 - 53b2: 1c 92 st X, r1 + 5022: a6 81 ldd r26, Z+6 ; 0x06 + 5024: b7 81 ldd r27, Z+7 ; 0x07 + 5026: 51 96 adiw r26, 0x11 ; 17 + 5028: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 53b4: a6 81 ldd r26, Z+6 ; 0x06 - 53b6: b7 81 ldd r27, Z+7 ; 0x07 - 53b8: 99 96 adiw r26, 0x29 ; 41 - 53ba: 1c 92 st X, r1 + 502a: a6 81 ldd r26, Z+6 ; 0x06 + 502c: b7 81 ldd r27, Z+7 ; 0x07 + 502e: 99 96 adiw r26, 0x29 ; 41 + 5030: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 53bc: a6 81 ldd r26, Z+6 ; 0x06 - 53be: b7 81 ldd r27, Z+7 ; 0x07 - 53c0: 91 96 adiw r26, 0x21 ; 33 - 53c2: 1c 92 st X, r1 + 5032: a6 81 ldd r26, Z+6 ; 0x06 + 5034: b7 81 ldd r27, Z+7 ; 0x07 + 5036: 91 96 adiw r26, 0x21 ; 33 + 5038: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 53c4: a6 81 ldd r26, Z+6 ; 0x06 - 53c6: b7 81 ldd r27, Z+7 ; 0x07 - 53c8: d9 96 adiw r26, 0x39 ; 57 - 53ca: 1c 92 st X, r1 + 503a: a6 81 ldd r26, Z+6 ; 0x06 + 503c: b7 81 ldd r27, Z+7 ; 0x07 + 503e: d9 96 adiw r26, 0x39 ; 57 + 5040: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 53cc: a6 81 ldd r26, Z+6 ; 0x06 - 53ce: b7 81 ldd r27, Z+7 ; 0x07 - 53d0: d1 96 adiw r26, 0x31 ; 49 - 53d2: 1c 92 st X, r1 + 5042: a6 81 ldd r26, Z+6 ; 0x06 + 5044: b7 81 ldd r27, Z+7 ; 0x07 + 5046: d1 96 adiw r26, 0x31 ; 49 + 5048: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 53d4: a6 81 ldd r26, Z+6 ; 0x06 - 53d6: b7 81 ldd r27, Z+7 ; 0x07 - 53d8: a7 5b subi r26, 0xB7 ; 183 - 53da: bf 4f sbci r27, 0xFF ; 255 - 53dc: 1c 92 st X, r1 + 504a: a6 81 ldd r26, Z+6 ; 0x06 + 504c: b7 81 ldd r27, Z+7 ; 0x07 + 504e: a7 5b subi r26, 0xB7 ; 183 + 5050: bf 4f sbci r27, 0xFF ; 255 + 5052: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 53de: a6 81 ldd r26, Z+6 ; 0x06 - 53e0: b7 81 ldd r27, Z+7 ; 0x07 - 53e2: af 5b subi r26, 0xBF ; 191 - 53e4: bf 4f sbci r27, 0xFF ; 255 - 53e6: 1c 92 st X, r1 + 5054: a6 81 ldd r26, Z+6 ; 0x06 + 5056: b7 81 ldd r27, Z+7 ; 0x07 + 5058: af 5b subi r26, 0xBF ; 191 + 505a: bf 4f sbci r27, 0xFF ; 255 + 505c: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 53e8: a6 81 ldd r26, Z+6 ; 0x06 - 53ea: b7 81 ldd r27, Z+7 ; 0x07 - 53ec: a7 5a subi r26, 0xA7 ; 167 - 53ee: bf 4f sbci r27, 0xFF ; 255 - 53f0: 1c 92 st X, r1 + 505e: a6 81 ldd r26, Z+6 ; 0x06 + 5060: b7 81 ldd r27, Z+7 ; 0x07 + 5062: a7 5a subi r26, 0xA7 ; 167 + 5064: bf 4f sbci r27, 0xFF ; 255 + 5066: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 53f2: 06 80 ldd r0, Z+6 ; 0x06 - 53f4: f7 81 ldd r31, Z+7 ; 0x07 - 53f6: e0 2d mov r30, r0 - 53f8: ef 5a subi r30, 0xAF ; 175 - 53fa: ff 4f sbci r31, 0xFF ; 255 - 53fc: 10 82 st Z, r1 - 53fe: 08 95 ret + 5068: 06 80 ldd r0, Z+6 ; 0x06 + 506a: f7 81 ldd r31, Z+7 ; 0x07 + 506c: e0 2d mov r30, r0 + 506e: ef 5a subi r30, 0xAF ; 175 + 5070: ff 4f sbci r31, 0xFF ; 255 + 5072: 10 82 st Z, r1 + 5074: 08 95 ret -00005400 : +00005076 : } } void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - 5400: 80 91 41 2b lds r24, 0x2B41 - 5404: 87 fd sbrc r24, 7 - 5406: 08 c0 rjmp .+16 ; 0x5418 + 5076: 80 91 41 2b lds r24, 0x2B41 + 507a: 87 ff sbrs r24, 7 + 507c: 05 c0 rjmp .+10 ; 0x5088 + 507e: 0c c0 rjmp .+24 ; 0x5098 + } + else + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 5080: 80 91 40 2b lds r24, 0x2B40 + 5084: 88 23 and r24, r24 + 5086: 61 f0 breq .+24 ; 0x50a0 Endpoint_ClearOUT(); } else { while (!(Endpoint_IsINReady())) - 5408: f4 de rcall .-536 ; 0x51f2 - 540a: 81 11 cpse r24, r1 - 540c: 0d c0 rjmp .+26 ; 0x5428 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 540e: 80 91 40 2b lds r24, 0x2B40 - 5412: 81 11 cpse r24, r1 - 5414: f9 cf rjmp .-14 ; 0x5408 - 5416: 08 95 ret - -void Endpoint_ClearStatusStage(void) -{ - if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - { - while (!(Endpoint_IsOUTReceived())) - 5418: d3 de rcall .-602 ; 0x51c0 - 541a: 81 11 cpse r24, r1 - 541c: 06 c0 rjmp .+12 ; 0x542a - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 541e: 80 91 40 2b lds r24, 0x2B40 - 5422: 81 11 cpse r24, r1 - 5424: f9 cf rjmp .-14 ; 0x5418 - 5426: 08 95 ret + 5088: 81 de rcall .-766 ; 0x4d8c + 508a: 88 23 and r24, r24 + 508c: c9 f3 breq .-14 ; 0x5080 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearIN(); - 5428: eb cd rjmp .-1066 ; 0x5000 + 508e: fd cd rjmp .-1030 ; 0x4c8a +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + { + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 5090: 80 91 40 2b lds r24, 0x2B40 + 5094: 88 23 and r24, r24 + 5096: 21 f0 breq .+8 ; 0x50a0 + +void Endpoint_ClearStatusStage(void) +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + { + while (!(Endpoint_IsOUTReceived())) + 5098: 85 de rcall .-758 ; 0x4da4 + 509a: 88 23 and r24, r24 + 509c: c9 f3 breq .-14 ; 0x5090 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearOUT(); - 542a: 03 ce rjmp .-1018 ; 0x5032 + 509e: 0e ce rjmp .-996 ; 0x4cbc + 50a0: 08 95 ret -0000542c : +000050a2 : } } #if !defined(CONTROL_ONLY_DEVICE) uint8_t Endpoint_WaitUntilReady(void) { - 542c: 1f 93 push r17 - 542e: cf 93 push r28 - 5430: df 93 push r29 + 50a2: 1f 93 push r17 + 50a4: cf 93 push r28 + 50a6: df 93 push r29 * \return Current USB frame number from the USB controller. */ static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline uint16_t USB_Device_GetFrameNumber(void) { return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum; - 5432: e0 91 c6 04 lds r30, 0x04C6 - 5436: f0 91 c7 04 lds r31, 0x04C7 - 543a: e0 5a subi r30, 0xA0 ; 160 - 543c: ff 4f sbci r31, 0xFF ; 255 - 543e: c0 81 ld r28, Z - 5440: d1 81 ldd r29, Z+1 ; 0x01 + 50a8: e0 91 c6 04 lds r30, 0x04C6 + 50ac: f0 91 c7 04 lds r31, 0x04C7 + 50b0: e0 5a subi r30, 0xA0 ; 160 + 50b2: ff 4f sbci r31, 0xFF ; 255 + 50b4: c0 81 ld r28, Z + 50b6: d1 81 ldd r29, Z+1 ; 0x01 #if (USB_STREAM_TIMEOUT_MS < 0xFF) uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; - 5442: 14 e6 ldi r17, 0x64 ; 100 + 50b8: 14 e6 ldi r17, 0x64 ; 100 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); - 5444: 80 91 4d 2b lds r24, 0x2B4D - 5448: 80 78 andi r24, 0x80 ; 128 + 50ba: 80 91 4d 2b lds r24, 0x2B4D + 50be: 80 78 andi r24, 0x80 ; 128 uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 544a: 80 38 cpi r24, 0x80 ; 128 - 544c: 31 f1 breq .+76 ; 0x549a + 50c0: 80 38 cpi r24, 0x80 ; 128 + 50c2: 31 f1 breq .+76 ; 0x5110 if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) - 544e: b8 de rcall .-656 ; 0x51c0 - 5450: 81 11 cpse r24, r1 - 5452: 26 c0 rjmp .+76 ; 0x54a0 + 50c4: 6f de rcall .-802 ; 0x4da4 + 50c6: 81 11 cpse r24, r1 + 50c8: 26 c0 rjmp .+76 ; 0x5116 return ENDPOINT_READYWAIT_NoError; } uint8_t USB_DeviceState_LCL = USB_DeviceState; - 5454: 80 91 40 2b lds r24, 0x2B40 + 50ca: 80 91 40 2b lds r24, 0x2B40 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 5458: 88 23 and r24, r24 - 545a: 39 f1 breq .+78 ; 0x54aa + 50ce: 88 23 and r24, r24 + 50d0: 39 f1 breq .+78 ; 0x5120 return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 545c: 85 30 cpi r24, 0x05 ; 5 - 545e: 51 f1 breq .+84 ; 0x54b4 + 50d2: 85 30 cpi r24, 0x05 ; 5 + 50d4: 51 f1 breq .+84 ; 0x512a * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. */ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) { return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); - 5460: e0 91 4b 2b lds r30, 0x2B4B - 5464: f0 91 4c 2b lds r31, 0x2B4C - 5468: 81 81 ldd r24, Z+1 ; 0x01 + 50d6: e0 91 4b 2b lds r30, 0x2B4B + 50da: f0 91 4c 2b lds r31, 0x2B4C + 50de: 81 81 ldd r24, Z+1 ; 0x01 return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) - 546a: 82 fd sbrc r24, 2 - 546c: 28 c0 rjmp .+80 ; 0x54be - 546e: e0 91 c6 04 lds r30, 0x04C6 - 5472: f0 91 c7 04 lds r31, 0x04C7 - 5476: e0 5a subi r30, 0xA0 ; 160 - 5478: ff 4f sbci r31, 0xFF ; 255 - 547a: 80 81 ld r24, Z - 547c: 91 81 ldd r25, Z+1 ; 0x01 + 50e0: 82 fd sbrc r24, 2 + 50e2: 28 c0 rjmp .+80 ; 0x5134 + 50e4: e0 91 c6 04 lds r30, 0x04C6 + 50e8: f0 91 c7 04 lds r31, 0x04C7 + 50ec: e0 5a subi r30, 0xA0 ; 160 + 50ee: ff 4f sbci r31, 0xFF ; 255 + 50f0: 80 81 ld r24, Z + 50f2: 91 81 ldd r25, Z+1 ; 0x01 return ENDPOINT_READYWAIT_EndpointStalled; uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); if (CurrentFrameNumber != PreviousFrameNumber) - 547e: c8 17 cp r28, r24 - 5480: d9 07 cpc r29, r25 - 5482: 01 f3 breq .-64 ; 0x5444 + 50f4: c8 17 cp r28, r24 + 50f6: d9 07 cpc r29, r25 + 50f8: 01 f3 breq .-64 ; 0x50ba { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) - 5484: 21 2f mov r18, r17 - 5486: 21 50 subi r18, 0x01 ; 1 - 5488: 11 23 and r17, r17 - 548a: f1 f0 breq .+60 ; 0x54c8 - 548c: ec 01 movw r28, r24 - 548e: 12 2f mov r17, r18 + 50fa: 2f ef ldi r18, 0xFF ; 255 + 50fc: 21 0f add r18, r17 + 50fe: 11 23 and r17, r17 + 5100: f1 f0 breq .+60 ; 0x513e + 5102: ec 01 movw r28, r24 + 5104: 12 2f mov r17, r18 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); - 5490: 80 91 4d 2b lds r24, 0x2B4D - 5494: 80 78 andi r24, 0x80 ; 128 + 5106: 80 91 4d 2b lds r24, 0x2B4D + 510a: 80 78 andi r24, 0x80 ; 128 uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 5496: 80 38 cpi r24, 0x80 ; 128 - 5498: d1 f6 brne .-76 ; 0x544e + 510c: 80 38 cpi r24, 0x80 ; 128 + 510e: d1 f6 brne .-76 ; 0x50c4 { if (Endpoint_IsINReady()) - 549a: ab de rcall .-682 ; 0x51f2 - 549c: 88 23 and r24, r24 - 549e: d1 f2 breq .-76 ; 0x5454 + 5110: 3d de rcall .-902 ; 0x4d8c + 5112: 88 23 and r24, r24 + 5114: d1 f2 breq .-76 ; 0x50ca return ENDPOINT_READYWAIT_NoError; - 54a0: 80 e0 ldi r24, 0x00 ; 0 + 5116: 80 e0 ldi r24, 0x00 ; 0 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 54a2: df 91 pop r29 - 54a4: cf 91 pop r28 - 54a6: 1f 91 pop r17 - 54a8: 08 95 ret + 5118: df 91 pop r29 + 511a: cf 91 pop r28 + 511c: 1f 91 pop r17 + 511e: 08 95 ret } uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; - 54aa: 82 e0 ldi r24, 0x02 ; 2 + 5120: 82 e0 ldi r24, 0x02 ; 2 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 54ac: df 91 pop r29 - 54ae: cf 91 pop r28 - 54b0: 1f 91 pop r17 - 54b2: 08 95 ret + 5122: df 91 pop r29 + 5124: cf 91 pop r28 + 5126: 1f 91 pop r17 + 5128: 08 95 ret uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; - 54b4: 83 e0 ldi r24, 0x03 ; 3 + 512a: 83 e0 ldi r24, 0x03 ; 3 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 54b6: df 91 pop r29 - 54b8: cf 91 pop r28 - 54ba: 1f 91 pop r17 - 54bc: 08 95 ret + 512c: df 91 pop r29 + 512e: cf 91 pop r28 + 5130: 1f 91 pop r17 + 5132: 08 95 ret if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) return ENDPOINT_READYWAIT_EndpointStalled; - 54be: 81 e0 ldi r24, 0x01 ; 1 + 5134: 81 e0 ldi r24, 0x01 ; 1 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 54c0: df 91 pop r29 - 54c2: cf 91 pop r28 - 54c4: 1f 91 pop r17 - 54c6: 08 95 ret + 5136: df 91 pop r29 + 5138: cf 91 pop r28 + 513a: 1f 91 pop r17 + 513c: 08 95 ret if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; - 54c8: 84 e0 ldi r24, 0x04 ; 4 + 513e: 84 e0 ldi r24, 0x04 ; 4 } } } - 54ca: df 91 pop r29 - 54cc: cf 91 pop r28 - 54ce: 1f 91 pop r17 - 54d0: 08 95 ret + 5140: df 91 pop r29 + 5142: cf 91 pop r28 + 5144: 1f 91 pop r17 + 5146: 08 95 ret -000054d2 : +00005148 : USB_ResetInterface(); } void USB_Disable(void) { USB_INT_DisableAllInterrupts(); - 54d2: 63 d0 rcall .+198 ; 0x559a + 5148: 62 d0 rcall .+196 ; 0x520e USB_INT_ClearAllInterrupts(); - 54d4: 69 d0 rcall .+210 ; 0x55a8 + 514a: 68 d0 rcall .+208 ; 0x521c * enumerating the device once attached until \ref USB_Attach() is called. */ static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; static inline void USB_Detach(void) { USB.CTRLB &= ~USB_ATTACH_bm; - 54d6: e0 ec ldi r30, 0xC0 ; 192 - 54d8: f4 e0 ldi r31, 0x04 ; 4 - 54da: 81 81 ldd r24, Z+1 ; 0x01 - 54dc: 8e 7f andi r24, 0xFE ; 254 - 54de: 81 83 std Z+1, r24 ; 0x01 + 514c: e0 ec ldi r30, 0xC0 ; 192 + 514e: f4 e0 ldi r31, 0x04 ; 4 + 5150: 81 81 ldd r24, Z+1 ; 0x01 + 5152: 8e 7f andi r24, 0xFE ; 254 + 5154: 81 83 std Z+1, r24 ; 0x01 } static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Disable(void) { USB.CTRLA &= ~USB_ENABLE_bm; - 54e0: 80 81 ld r24, Z - 54e2: 8f 77 andi r24, 0x7F ; 127 - 54e4: 80 83 st Z, r24 + 5156: 80 81 ld r24, Z + 5158: 8f 77 andi r24, 0x7F ; 127 + 515a: 80 83 st Z, r24 USB_Detach(); USB_Controller_Disable(); USB_IsInitialized = false; - 54e6: 10 92 3f 2b sts 0x2B3F, r1 - 54ea: 08 95 ret + 515c: 10 92 3f 2b sts 0x2B3F, r1 + 5160: 08 95 ret -000054ec : +00005162 : } void USB_ResetInterface(void) { - 54ec: cf 93 push r28 - 54ee: df 93 push r29 + 5162: cf 93 push r28 + 5164: df 93 push r29 #if defined(USB_DEVICE_OPT_FULLSPEED) if (USB_Options & USB_DEVICE_OPT_LOWSPEED) CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); else CLK.USBCTRL = (((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp); - 54f0: e0 e4 ldi r30, 0x40 ; 64 - 54f2: f0 e0 ldi r31, 0x00 ; 0 - 54f4: 14 82 std Z+4, r1 ; 0x04 + 5166: e0 e4 ldi r30, 0x40 ; 64 + 5168: f0 e0 ldi r31, 0x00 ; 0 + 516a: 14 82 std Z+4, r1 ; 0x04 #else CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); #endif if (USB_Options & USB_OPT_PLLCLKSRC) CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm); - 54f6: 84 81 ldd r24, Z+4 ; 0x04 - 54f8: 81 60 ori r24, 0x01 ; 1 - 54fa: 84 83 std Z+4, r24 ; 0x04 + 516c: 84 81 ldd r24, Z+4 ; 0x04 + 516e: 81 60 ori r24, 0x01 ; 1 + 5170: 84 83 std Z+4, r24 ; 0x04 else CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); USB_Device_SetDeviceAddress(0); USB_INT_DisableAllInterrupts(); - 54fc: 4e d0 rcall .+156 ; 0x559a + 5172: 4d d0 rcall .+154 ; 0x520e USB_INT_ClearAllInterrupts(); - 54fe: 54 d0 rcall .+168 ; 0x55a8 + 5174: 53 d0 rcall .+166 ; 0x521c } static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Reset(void) { USB.CTRLA &= ~USB_ENABLE_bm; - 5500: c0 ec ldi r28, 0xC0 ; 192 - 5502: d4 e0 ldi r29, 0x04 ; 4 - 5504: 88 81 ld r24, Y - 5506: 8f 77 andi r24, 0x7F ; 127 - 5508: 88 83 st Y, r24 + 5176: c0 ec ldi r28, 0xC0 ; 192 + 5178: d4 e0 ldi r29, 0x04 ; 4 + 517a: 88 81 ld r24, Y + 517c: 8f 77 andi r24, 0x7F ; 127 + 517e: 88 83 st Y, r24 USB.CTRLA |= USB_ENABLE_bm; - 550a: 88 81 ld r24, Y - 550c: 80 68 ori r24, 0x80 ; 128 - 550e: 88 83 st Y, r24 + 5180: 88 81 ld r24, Y + 5182: 80 68 ori r24, 0x80 ; 128 + 5184: 88 83 st Y, r24 } #if defined(USB_CAN_BE_DEVICE) static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; - 5510: 10 92 40 2b sts 0x2B40, r1 + 5186: 10 92 40 2b sts 0x2B40, r1 USB_Device_ConfigurationNumber = 0; - 5514: 10 92 3c 2b sts 0x2B3C, r1 + 518a: 10 92 3c 2b sts 0x2B3C, r1 #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; - 5518: 10 92 3e 2b sts 0x2B3E, r1 + 518e: 10 92 3e 2b sts 0x2B3E, r1 #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; - 551c: 10 92 3d 2b sts 0x2B3D, r1 + 5192: 10 92 3d 2b sts 0x2B3D, r1 } static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetFullSpeed(void) { USB.CTRLA |= USB_SPEED_bm; - 5520: 88 81 ld r24, Y - 5522: 80 64 ori r24, 0x40 ; 64 - 5524: 88 83 st Y, r24 + 5196: 88 81 ld r24, Y + 5198: 80 64 ori r24, 0x40 ; 64 + 519a: 88 83 st Y, r24 EPConfigMask |= USB_EP_TYPE_BULK_gc; break; } if (Type == EP_TYPE_CONTROL) Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 5526: 48 e0 ldi r20, 0x08 ; 8 - 5528: 68 e4 ldi r22, 0x48 ; 72 - 552a: 80 e8 ldi r24, 0x80 ; 128 - 552c: 6e de rcall .-804 ; 0x520a + 519c: 48 e0 ldi r20, 0x08 ; 8 + 519e: 68 e4 ldi r22, 0x48 ; 72 + 51a0: 80 e8 ldi r24, 0x80 ; 128 + 51a2: 7a de rcall .-780 ; 0x4e98 return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 552e: 48 e0 ldi r20, 0x08 ; 8 - 5530: 68 e4 ldi r22, 0x48 ; 72 - 5532: 80 e0 ldi r24, 0x00 ; 0 - 5534: 6a de rcall .-812 ; 0x520a + 51a4: 48 e0 ldi r20, 0x08 ; 8 + 51a6: 68 e4 ldi r22, 0x48 ; 72 + 51a8: 80 e0 ldi r24, 0x00 ; 0 + 51aa: 76 de rcall .-788 ; 0x4e98 static inline void USB_INT_Enable(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI: USB.INTCTRLA |= USB_BUSEVIE_bm; - 5536: 88 85 ldd r24, Y+8 ; 0x08 - 5538: 80 64 ori r24, 0x40 ; 64 - 553a: 88 87 std Y+8, r24 ; 0x08 + 51ac: 88 85 ldd r24, Y+8 ; 0x08 + 51ae: 80 64 ori r24, 0x40 ; 64 + 51b0: 88 87 std Y+8, r24 ; 0x08 * register and despite the datasheet making no mention of its requirement in host mode. */ static inline void USB_Attach(void) ATTR_ALWAYS_INLINE; static inline void USB_Attach(void) { USB.CTRLB |= USB_ATTACH_bm; - 553c: 89 81 ldd r24, Y+1 ; 0x01 - 553e: 81 60 ori r24, 0x01 ; 1 - 5540: 89 83 std Y+1, r24 ; 0x01 + 51b2: 89 81 ldd r24, Y+1 ; 0x01 + 51b4: 81 60 ori r24, 0x01 ; 1 + 51b6: 89 83 std Y+1, r24 ; 0x01 USB_INT_DisableAllInterrupts(); USB_INT_ClearAllInterrupts(); USB_Controller_Reset(); USB_Init_Device(); } - 5542: df 91 pop r29 - 5544: cf 91 pop r28 - 5546: 08 95 ret + 51b8: df 91 pop r29 + 51ba: cf 91 pop r28 + 51bc: 08 95 ret -00005548 : - - #if !defined(USE_STATIC_OPTIONS) - const uint8_t Options - #endif - ) -{ - 5548: cf 93 push r28 - 554a: df 93 push r29 +000051be : #if (ARCH == ARCH_AVR8) return SREG; #elif (ARCH == ARCH_UC3) return __builtin_mfsr(AVR32_SR); #elif (ARCH == ARCH_XMEGA) return SREG; - 554c: 3f b7 in r19, 0x3f ; 63 + 51be: 2f b7 in r18, 0x3f ; 63 #if (ARCH == ARCH_AVR8) cli(); #elif (ARCH == ARCH_UC3) __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); - 554e: f8 94 cli + 51c0: f8 94 cli #endif uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 5550: c0 ec ldi r28, 0xC0 ; 192 - 5552: d1 e0 ldi r29, 0x01 ; 1 - 5554: 22 e0 ldi r18, 0x02 ; 2 - 5556: 2a 87 std Y+10, r18 ; 0x0a + 51c2: 82 e0 ldi r24, 0x02 ; 2 + 51c4: e0 ec ldi r30, 0xC0 ; 192 + 51c6: f1 e0 ldi r31, 0x01 ; 1 + 51c8: 82 87 std Z+10, r24 ; 0x0a USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); - 5558: ea e1 ldi r30, 0x1A ; 26 - 555a: f0 e0 ldi r31, 0x00 ; 0 - 555c: e4 91 lpm r30, Z - 555e: a0 ec ldi r26, 0xC0 ; 192 - 5560: b4 e0 ldi r27, 0x04 ; 4 - 5562: da 96 adiw r26, 0x3a ; 58 - 5564: ec 93 st X, r30 - 5566: da 97 sbiw r26, 0x3a ; 58 + 51ca: ea e1 ldi r30, 0x1A ; 26 + 51cc: f0 e0 ldi r31, 0x00 ; 0 + 51ce: e4 91 lpm r30, Z + 51d0: a0 ec ldi r26, 0xC0 ; 192 + 51d2: b4 e0 ldi r27, 0x04 ; 4 + 51d4: da 96 adiw r26, 0x3a ; 58 + 51d6: ec 93 st X, r30 + 51d8: da 97 sbiw r26, 0x3a ; 58 USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); - 5568: eb e1 ldi r30, 0x1B ; 27 - 556a: f0 e0 ldi r31, 0x00 ; 0 - 556c: e4 91 lpm r30, Z - 556e: db 96 adiw r26, 0x3b ; 59 - 5570: ec 93 st X, r30 - 5572: db 97 sbiw r26, 0x3b ; 59 + 51da: eb e1 ldi r30, 0x1B ; 27 + 51dc: f0 e0 ldi r31, 0x00 ; 0 + 51de: e4 91 lpm r30, Z + 51e0: db 96 adiw r26, 0x3b ; 59 + 51e2: ec 93 st X, r30 + 51e4: db 97 sbiw r26, 0x3b ; 59 NVM.CMD = NVM_CMD_NO_OPERATION_gc; - 5574: 1a 86 std Y+10, r1 ; 0x0a + 51e6: e0 ec ldi r30, 0xC0 ; 192 + 51e8: f1 e0 ldi r31, 0x01 ; 1 + 51ea: 12 86 std Z+10, r1 ; 0x0a /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0)); - 5576: 87 e6 ldi r24, 0x67 ; 103 - 5578: 9e e2 ldi r25, 0x2E ; 46 - 557a: 8e 7f andi r24, 0xFE ; 254 - 557c: 16 96 adiw r26, 0x06 ; 6 - 557e: 8d 93 st X+, r24 - 5580: 9c 93 st X, r25 - 5582: 17 97 sbiw r26, 0x07 ; 7 + 51ec: 87 e6 ldi r24, 0x67 ; 103 + 51ee: 9e e2 ldi r25, 0x2E ; 46 + 51f0: 8e 7f andi r24, 0xFE ; 254 + 51f2: 16 96 adiw r26, 0x06 ; 6 + 51f4: 8d 93 st X+, r24 + 51f6: 9c 93 st X, r25 + 51f8: 17 97 sbiw r26, 0x07 ; 7 USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); - 5584: 85 e1 ldi r24, 0x15 ; 21 - 5586: 8c 93 st X, r24 + 51fa: 85 e1 ldi r24, 0x15 ; 21 + 51fc: 8c 93 st X, r24 if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH) USB.INTCTRLA = (3 << USB_INTLVL_gp); else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED) USB.INTCTRLA = (2 << USB_INTLVL_gp); - 5588: 18 96 adiw r26, 0x08 ; 8 - 558a: 2c 93 st X, r18 + 51fe: 82 e0 ldi r24, 0x02 ; 2 + 5200: 18 96 adiw r26, 0x08 ; 8 + 5202: 8c 93 st X, r24 if (GlobalIntState & AVR32_SR_GM) __builtin_ssrf(AVR32_SR_GM_OFFSET); else __builtin_csrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) SREG = GlobalIntState; - 558c: 3f bf out 0x3f, r19 ; 63 + 5204: 2f bf out 0x3f, r18 ; 63 #if defined(USB_CAN_BE_BOTH) USB_CurrentMode = Mode; #endif USB_IsInitialized = true; - 558e: 81 e0 ldi r24, 0x01 ; 1 - 5590: 80 93 3f 2b sts 0x2B3F, r24 + 5206: 81 e0 ldi r24, 0x01 ; 1 + 5208: 80 93 3f 2b sts 0x2B3F, r24 USB_ResetInterface(); -} - 5594: df 91 pop r29 - 5596: cf 91 pop r28 - USB_CurrentMode = Mode; - #endif + 520c: aa cf rjmp .-172 ; 0x5162 - USB_IsInitialized = true; - - USB_ResetInterface(); - 5598: a9 cf rjmp .-174 ; 0x54ec - -0000559a : +0000520e : #define __INCLUDE_FROM_USB_DRIVER #include "../USBInterrupt.h" void USB_INT_DisableAllInterrupts(void) { USB.INTCTRLA &= USB_INTLVL_gm; - 559a: e0 ec ldi r30, 0xC0 ; 192 - 559c: f4 e0 ldi r31, 0x04 ; 4 - 559e: 80 85 ldd r24, Z+8 ; 0x08 - 55a0: 83 70 andi r24, 0x03 ; 3 - 55a2: 80 87 std Z+8, r24 ; 0x08 + 520e: e0 ec ldi r30, 0xC0 ; 192 + 5210: f4 e0 ldi r31, 0x04 ; 4 + 5212: 80 85 ldd r24, Z+8 ; 0x08 + 5214: 83 70 andi r24, 0x03 ; 3 + 5216: 80 87 std Z+8, r24 ; 0x08 USB.INTCTRLB = 0; - 55a4: 11 86 std Z+9, r1 ; 0x09 - 55a6: 08 95 ret + 5218: 11 86 std Z+9, r1 ; 0x09 + 521a: 08 95 ret -000055a8 : +0000521c : } void USB_INT_ClearAllInterrupts(void) { USB.INTFLAGSACLR = 0xFF; - 55a8: e0 ec ldi r30, 0xC0 ; 192 - 55aa: f4 e0 ldi r31, 0x04 ; 4 - 55ac: 8f ef ldi r24, 0xFF ; 255 - 55ae: 82 87 std Z+10, r24 ; 0x0a + 521c: e0 ec ldi r30, 0xC0 ; 192 + 521e: f4 e0 ldi r31, 0x04 ; 4 + 5220: 8f ef ldi r24, 0xFF ; 255 + 5222: 82 87 std Z+10, r24 ; 0x0a USB.INTFLAGSBCLR = 0xFF; - 55b0: 84 87 std Z+12, r24 ; 0x0c - 55b2: 08 95 ret + 5224: 84 87 std Z+12, r24 ; 0x0c + 5226: 08 95 ret -000055b4 <__vector_125>: +00005228 <__vector_125>: } ISR(USB_BUSEVENT_vect) { - 55b4: 1f 92 push r1 - 55b6: 0f 92 push r0 - 55b8: 0f b6 in r0, 0x3f ; 63 - 55ba: 0f 92 push r0 - 55bc: 11 24 eor r1, r1 - 55be: 2f 93 push r18 - 55c0: 3f 93 push r19 - 55c2: 4f 93 push r20 - 55c4: 5f 93 push r21 - 55c6: 6f 93 push r22 - 55c8: 7f 93 push r23 - 55ca: 8f 93 push r24 - 55cc: 9f 93 push r25 - 55ce: af 93 push r26 - 55d0: bf 93 push r27 - 55d2: ef 93 push r30 - 55d4: ff 93 push r31 + 5228: 1f 92 push r1 + 522a: 0f 92 push r0 + 522c: 0f b6 in r0, 0x3f ; 63 + 522e: 0f 92 push r0 + 5230: 11 24 eor r1, r1 + 5232: 2f 93 push r18 + 5234: 3f 93 push r19 + 5236: 4f 93 push r20 + 5238: 5f 93 push r21 + 523a: 6f 93 push r22 + 523c: 7f 93 push r23 + 523e: 8f 93 push r24 + 5240: 9f 93 push r25 + 5242: af 93 push r26 + 5244: bf 93 push r27 + 5246: ef 93 push r30 + 5248: ff 93 push r31 case USB_INT_BUSEVENTI_Resume: return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); case USB_INT_BUSEVENTI_Reset: return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); case USB_INT_SOFI: return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false); - 55d6: 80 91 ca 04 lds r24, 0x04CA + 524a: 80 91 ca 04 lds r24, 0x04CA #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 55da: 87 fd sbrc r24, 7 - 55dc: 4d c0 rjmp .+154 ; 0x5678 <__vector_125+0xc4> + 524e: 87 fd sbrc r24, 7 + 5250: 4d c0 rjmp .+154 ; 0x52ec <__vector_125+0xc4> static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI_Suspend: return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); - 55de: 80 91 ca 04 lds r24, 0x04CA + 5252: 80 91 ca 04 lds r24, 0x04CA EVENT_USB_Device_StartOfFrame(); } #endif if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) - 55e2: 86 fd sbrc r24, 6 - 55e4: 41 c0 rjmp .+130 ; 0x5668 <__vector_125+0xb4> + 5256: 86 fd sbrc r24, 6 + 5258: 41 c0 rjmp .+130 ; 0x52dc <__vector_125+0xb4> case USB_INT_BUSEVENTI_Resume: return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); - 55e6: 80 91 ca 04 lds r24, 0x04CA + 525a: 80 91 ca 04 lds r24, 0x04CA USB_DeviceState = DEVICE_STATE_Suspended; EVENT_USB_Device_Suspend(); #endif } if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Resume)) - 55ea: 85 ff sbrs r24, 5 - 55ec: 0c c0 rjmp .+24 ; 0x5606 <__vector_125+0x52> + 525e: 85 ff sbrs r24, 5 + 5260: 0c c0 rjmp .+24 ; 0x527a <__vector_125+0x52> { case USB_INT_BUSEVENTI_Suspend: USB.INTFLAGSACLR = USB_SUSPENDIF_bm; break; case USB_INT_BUSEVENTI_Resume: USB.INTFLAGSACLR = USB_RESUMEIF_bm; - 55ee: 80 e2 ldi r24, 0x20 ; 32 - 55f0: 80 93 ca 04 sts 0x04CA, r24 + 5262: 80 e2 ldi r24, 0x20 ; 32 + 5264: 80 93 ca 04 sts 0x04CA, r24 { USB_INT_Clear(USB_INT_BUSEVENTI_Resume); if (USB_Device_ConfigurationNumber) - 55f4: 80 91 3c 2b lds r24, 0x2B3C - 55f8: 88 23 and r24, r24 - 55fa: 71 f1 breq .+92 ; 0x5658 <__vector_125+0xa4> + 5268: 80 91 3c 2b lds r24, 0x2B3C + 526c: 88 23 and r24, r24 + 526e: 71 f1 breq .+92 ; 0x52cc <__vector_125+0xa4> USB_DeviceState = DEVICE_STATE_Configured; - 55fc: 84 e0 ldi r24, 0x04 ; 4 - 55fe: 80 93 40 2b sts 0x2B40, r24 + 5270: 84 e0 ldi r24, 0x04 ; 4 + 5272: 80 93 40 2b sts 0x2B40, r24 else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; #if !defined(NO_LIMITED_CONTROLLER_CONNECT) EVENT_USB_Device_Connect(); - 5602: 0e 94 41 11 call 0x2282 ; 0x2282 + 5276: 0e 94 8b 11 call 0x2316 ; 0x2316 case USB_INT_BUSEVENTI_Suspend: return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); case USB_INT_BUSEVENTI_Resume: return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); case USB_INT_BUSEVENTI_Reset: return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); - 5606: 80 91 ca 04 lds r24, 0x04CA + 527a: 80 91 ca 04 lds r24, 0x04CA #else EVENT_USB_Device_WakeUp(); #endif } if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) - 560a: 84 ff sbrs r24, 4 - 560c: 14 c0 rjmp .+40 ; 0x5636 <__vector_125+0x82> + 527e: 84 ff sbrs r24, 4 + 5280: 14 c0 rjmp .+40 ; 0x52aa <__vector_125+0x82> break; case USB_INT_BUSEVENTI_Resume: USB.INTFLAGSACLR = USB_RESUMEIF_bm; break; case USB_INT_BUSEVENTI_Reset: USB.INTFLAGSACLR = USB_RSTIF_bm; - 560e: 80 e1 ldi r24, 0x10 ; 16 - 5610: 80 93 ca 04 sts 0x04CA, r24 + 5282: 80 e1 ldi r24, 0x10 ; 16 + 5284: 80 93 ca 04 sts 0x04CA, r24 { USB_INT_Clear(USB_INT_BUSEVENTI_Reset); USB_DeviceState = DEVICE_STATE_Default; - 5614: 82 e0 ldi r24, 0x02 ; 2 - 5616: 80 93 40 2b sts 0x2B40, r24 + 5288: 82 e0 ldi r24, 0x02 ; 2 + 528a: 80 93 40 2b sts 0x2B40, r24 USB_Device_ConfigurationNumber = 0; - 561a: 10 92 3c 2b sts 0x2B3C, r1 + 528e: 10 92 3c 2b sts 0x2B3C, r1 } static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) { USB.ADDR = Address; - 561e: 10 92 c3 04 sts 0x04C3, r1 + 5292: 10 92 c3 04 sts 0x04C3, r1 USB_Device_EnableDeviceAddress(0); Endpoint_ClearEndpoints(); - 5622: b6 de rcall .-660 ; 0x5390 + 5296: b7 de rcall .-658 ; 0x5006 EPConfigMask |= USB_EP_TYPE_BULK_gc; break; } if (Type == EP_TYPE_CONTROL) Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 5624: 48 e0 ldi r20, 0x08 ; 8 - 5626: 68 e4 ldi r22, 0x48 ; 72 - 5628: 80 e8 ldi r24, 0x80 ; 128 - 562a: ef dd rcall .-1058 ; 0x520a + 5298: 48 e0 ldi r20, 0x08 ; 8 + 529a: 68 e4 ldi r22, 0x48 ; 72 + 529c: 80 e8 ldi r24, 0x80 ; 128 + 529e: fc dd rcall .-1032 ; 0x4e98 return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 562c: 48 e0 ldi r20, 0x08 ; 8 - 562e: 68 e4 ldi r22, 0x48 ; 72 - 5630: 80 e0 ldi r24, 0x00 ; 0 - 5632: eb dd rcall .-1066 ; 0x520a + 52a0: 48 e0 ldi r20, 0x08 ; 8 + 52a2: 68 e4 ldi r22, 0x48 ; 72 + 52a4: 80 e0 ldi r24, 0x00 ; 0 + 52a6: f8 dd rcall .-1040 ; 0x4e98 Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, USB_Device_ControlEndpointSize, 1); EVENT_USB_Device_Reset(); - 5634: 23 db rcall .-2490 ; 0x4c7c + 52a8: 35 db rcall .-2454 ; 0x4914 } } - 5636: ff 91 pop r31 - 5638: ef 91 pop r30 - 563a: bf 91 pop r27 - 563c: af 91 pop r26 - 563e: 9f 91 pop r25 - 5640: 8f 91 pop r24 - 5642: 7f 91 pop r23 - 5644: 6f 91 pop r22 - 5646: 5f 91 pop r21 - 5648: 4f 91 pop r20 - 564a: 3f 91 pop r19 - 564c: 2f 91 pop r18 - 564e: 0f 90 pop r0 - 5650: 0f be out 0x3f, r0 ; 63 - 5652: 0f 90 pop r0 - 5654: 1f 90 pop r1 - 5656: 18 95 reti + 52aa: ff 91 pop r31 + 52ac: ef 91 pop r30 + 52ae: bf 91 pop r27 + 52b0: af 91 pop r26 + 52b2: 9f 91 pop r25 + 52b4: 8f 91 pop r24 + 52b6: 7f 91 pop r23 + 52b8: 6f 91 pop r22 + 52ba: 5f 91 pop r21 + 52bc: 4f 91 pop r20 + 52be: 3f 91 pop r19 + 52c0: 2f 91 pop r18 + 52c2: 0f 90 pop r0 + 52c4: 0f be out 0x3f, r0 ; 63 + 52c6: 0f 90 pop r0 + 52c8: 1f 90 pop r1 + 52ca: 18 95 reti } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return ((USB.ADDR != 0) ? true : false); - 5658: 80 91 c3 04 lds r24, 0x04C3 + 52cc: 80 91 c3 04 lds r24, 0x04C3 USB_INT_Clear(USB_INT_BUSEVENTI_Resume); if (USB_Device_ConfigurationNumber) USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; - 565c: 81 11 cpse r24, r1 - 565e: 15 c0 rjmp .+42 ; 0x568a <__vector_125+0xd6> - 5660: 81 e0 ldi r24, 0x01 ; 1 - 5662: 80 93 40 2b sts 0x2B40, r24 - 5666: cd cf rjmp .-102 ; 0x5602 <__vector_125+0x4e> + 52d0: 81 11 cpse r24, r1 + 52d2: 15 c0 rjmp .+42 ; 0x52fe <__vector_125+0xd6> + 52d4: 81 e0 ldi r24, 0x01 ; 1 + 52d6: 80 93 40 2b sts 0x2B40, r24 + 52da: cd cf rjmp .-102 ; 0x5276 <__vector_125+0x4e> static inline void USB_INT_Clear(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI_Suspend: USB.INTFLAGSACLR = USB_SUSPENDIF_bm; - 5668: 80 e4 ldi r24, 0x40 ; 64 - 566a: 80 93 ca 04 sts 0x04CA, r24 + 52dc: 80 e4 ldi r24, 0x40 ; 64 + 52de: 80 93 ca 04 sts 0x04CA, r24 if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) { USB_INT_Clear(USB_INT_BUSEVENTI_Suspend); #if !defined(NO_LIMITED_CONTROLLER_CONNECT) USB_DeviceState = DEVICE_STATE_Unattached; - 566e: 10 92 40 2b sts 0x2B40, r1 + 52e2: 10 92 40 2b sts 0x2B40, r1 EVENT_USB_Device_Disconnect(); - 5672: 0e 94 44 11 call 0x2288 ; 0x2288 - 5676: b7 cf rjmp .-146 ; 0x55e6 <__vector_125+0x32> + 52e6: 0e 94 8e 11 call 0x231c ; 0x231c + 52ea: b7 cf rjmp .-146 ; 0x525a <__vector_125+0x32> switch (Interrupt) { case USB_INT_BUSEVENTI: return ((USB.INTCTRLA & USB_BUSEVIE_bm) ? true : false); case USB_INT_SOFI: return ((USB.INTCTRLA & USB_SOFIE_bm) ? true : false); - 5678: 80 91 c8 04 lds r24, 0x04C8 + 52ec: 80 91 c8 04 lds r24, 0x04C8 } ISR(USB_BUSEVENT_vect) { #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 567c: 87 ff sbrs r24, 7 - 567e: af cf rjmp .-162 ; 0x55de <__vector_125+0x2a> + 52f0: 87 ff sbrs r24, 7 + 52f2: af cf rjmp .-162 ; 0x5252 <__vector_125+0x2a> break; case USB_INT_BUSEVENTI_Reset: USB.INTFLAGSACLR = USB_RSTIF_bm; break; case USB_INT_SOFI: USB.INTFLAGSACLR = USB_SOFIF_bm; - 5680: 80 e8 ldi r24, 0x80 ; 128 - 5682: 80 93 ca 04 sts 0x04CA, r24 + 52f4: 80 e8 ldi r24, 0x80 ; 128 + 52f6: 80 93 ca 04 sts 0x04CA, r24 { USB_INT_Clear(USB_INT_SOFI); EVENT_USB_Device_StartOfFrame(); - 5686: fa da rcall .-2572 ; 0x4c7c - 5688: aa cf rjmp .-172 ; 0x55de <__vector_125+0x2a> + 52fa: 0c db rcall .-2536 ; 0x4914 + 52fc: aa cf rjmp .-172 ; 0x5252 <__vector_125+0x2a> USB_INT_Clear(USB_INT_BUSEVENTI_Resume); if (USB_Device_ConfigurationNumber) USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; - 568a: 83 e0 ldi r24, 0x03 ; 3 - 568c: ea cf rjmp .-44 ; 0x5662 <__vector_125+0xae> + 52fe: 83 e0 ldi r24, 0x03 ; 3 + 5300: ea cf rjmp .-44 ; 0x52d6 <__vector_125+0xae> -0000568e : +00005302 : void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, FILE* const Stream) { *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW); fdev_set_udata(Stream, CDCInterfaceInfo); - 568e: cf 93 push r28 - 5690: df 93 push r29 - 5692: ec 01 movw r28, r24 - 5694: 40 96 adiw r24, 0x10 ; 16 - 5696: fc 01 movw r30, r24 - 5698: 8b e0 ldi r24, 0x0B ; 11 - 569a: df 01 movw r26, r30 - 569c: 1d 92 st X+, r1 - 569e: 8a 95 dec r24 - 56a0: e9 f7 brne .-6 ; 0x569c - 56a2: 82 e0 ldi r24, 0x02 ; 2 - 56a4: 8c 83 std Y+4, r24 ; 0x04 - 56a6: 89 87 std Y+9, r24 ; 0x09 - 56a8: 83 e0 ldi r24, 0x03 ; 3 - 56aa: 8e 87 std Y+14, r24 ; 0x0e - 56ac: 61 e0 ldi r22, 0x01 ; 1 - 56ae: ce 01 movw r24, r28 - 56b0: 01 96 adiw r24, 0x01 ; 1 - 56b2: f8 dd rcall .-1040 ; 0x52a4 - 56b4: 81 11 cpse r24, r1 - 56b6: 04 c0 rjmp .+8 ; 0x56c0 - 56b8: 80 e0 ldi r24, 0x00 ; 0 - 56ba: df 91 pop r29 - 56bc: cf 91 pop r28 - 56be: 08 95 ret - 56c0: 61 e0 ldi r22, 0x01 ; 1 - 56c2: ce 01 movw r24, r28 - 56c4: 06 96 adiw r24, 0x06 ; 6 - 56c6: ee dd rcall .-1060 ; 0x52a4 - 56c8: 88 23 and r24, r24 - 56ca: b1 f3 breq .-20 ; 0x56b8 - 56cc: 61 e0 ldi r22, 0x01 ; 1 - 56ce: ce 01 movw r24, r28 - 56d0: 0b 96 adiw r24, 0x0b ; 11 - 56d2: df 91 pop r29 - 56d4: cf 91 pop r28 - 56d6: e6 cd rjmp .-1076 ; 0x52a4 + 5302: cf 93 push r28 + 5304: df 93 push r29 + 5306: ec 01 movw r28, r24 + 5308: fc 01 movw r30, r24 + 530a: 70 96 adiw r30, 0x10 ; 16 + 530c: 8b e0 ldi r24, 0x0B ; 11 + 530e: df 01 movw r26, r30 + 5310: 1d 92 st X+, r1 + 5312: 8a 95 dec r24 + 5314: e9 f7 brne .-6 ; 0x5310 + 5316: 82 e0 ldi r24, 0x02 ; 2 + 5318: 8c 83 std Y+4, r24 ; 0x04 + 531a: 89 87 std Y+9, r24 ; 0x09 + 531c: 83 e0 ldi r24, 0x03 ; 3 + 531e: 8e 87 std Y+14, r24 ; 0x0e + 5320: 61 e0 ldi r22, 0x01 ; 1 + 5322: ce 01 movw r24, r28 + 5324: 01 96 adiw r24, 0x01 ; 1 + 5326: 03 de rcall .-1018 ; 0x4f2e + 5328: 81 11 cpse r24, r1 + 532a: 04 c0 rjmp .+8 ; 0x5334 + 532c: 80 e0 ldi r24, 0x00 ; 0 + 532e: df 91 pop r29 + 5330: cf 91 pop r28 + 5332: 08 95 ret + 5334: 61 e0 ldi r22, 0x01 ; 1 + 5336: ce 01 movw r24, r28 + 5338: 06 96 adiw r24, 0x06 ; 6 + 533a: f9 dd rcall .-1038 ; 0x4f2e + 533c: 88 23 and r24, r24 + 533e: b1 f3 breq .-20 ; 0x532c + 5340: 61 e0 ldi r22, 0x01 ; 1 + 5342: ce 01 movw r24, r28 + 5344: 0b 96 adiw r24, 0x0b ; 11 + 5346: df 91 pop r29 + 5348: cf 91 pop r28 + 534a: f1 cd rjmp .-1054 ; 0x4f2e -000056d8 : - 56d8: cf 93 push r28 - 56da: df 93 push r29 - 56dc: d6 2f mov r29, r22 - 56de: c7 2f mov r28, r23 - 56e0: 20 91 40 2b lds r18, 0x2B40 - 56e4: 24 30 cpi r18, 0x04 ; 4 - 56e6: 21 f0 breq .+8 ; 0x56f0 - 56e8: 82 e0 ldi r24, 0x02 ; 2 - 56ea: df 91 pop r29 - 56ec: cf 91 pop r28 - 56ee: 08 95 ret - 56f0: fc 01 movw r30, r24 - 56f2: 44 89 ldd r20, Z+20 ; 0x14 - 56f4: 55 89 ldd r21, Z+21 ; 0x15 - 56f6: 66 89 ldd r22, Z+22 ; 0x16 - 56f8: 77 89 ldd r23, Z+23 ; 0x17 - 56fa: 45 2b or r20, r21 - 56fc: 46 2b or r20, r22 - 56fe: 47 2b or r20, r23 - 5700: 99 f3 breq .-26 ; 0x56e8 - 5702: 81 81 ldd r24, Z+1 ; 0x01 - 5704: c3 dc rcall .-1658 ; 0x508c - 5706: ad 2f mov r26, r29 - 5708: bc 2f mov r27, r28 - 570a: fd 01 movw r30, r26 - 570c: 01 90 ld r0, Z+ - 570e: 00 20 and r0, r0 - 5710: e9 f7 brne .-6 ; 0x570c - 5712: bf 01 movw r22, r30 - 5714: 61 50 subi r22, 0x01 ; 1 - 5716: 71 09 sbc r23, r1 - 5718: 6a 1b sub r22, r26 - 571a: 7b 0b sbc r23, r27 - 571c: 40 e0 ldi r20, 0x00 ; 0 - 571e: 50 e0 ldi r21, 0x00 ; 0 - 5720: 8d 2f mov r24, r29 - 5722: 9c 2f mov r25, r28 - 5724: df 91 pop r29 - 5726: cf 91 pop r28 - 5728: bf ca rjmp .-2690 ; 0x4ca8 +0000534c : + 534c: cf 93 push r28 + 534e: df 93 push r29 + 5350: eb 01 movw r28, r22 + 5352: 20 91 40 2b lds r18, 0x2B40 + 5356: 24 30 cpi r18, 0x04 ; 4 + 5358: 21 f0 breq .+8 ; 0x5362 + 535a: 82 e0 ldi r24, 0x02 ; 2 + 535c: df 91 pop r29 + 535e: cf 91 pop r28 + 5360: 08 95 ret + 5362: fc 01 movw r30, r24 + 5364: 44 89 ldd r20, Z+20 ; 0x14 + 5366: 55 89 ldd r21, Z+21 ; 0x15 + 5368: 66 89 ldd r22, Z+22 ; 0x16 + 536a: 77 89 ldd r23, Z+23 ; 0x17 + 536c: 45 2b or r20, r21 + 536e: 46 2b or r20, r22 + 5370: 47 2b or r20, r23 + 5372: 99 f3 breq .-26 ; 0x535a + 5374: 81 81 ldd r24, Z+1 ; 0x01 + 5376: d1 dc rcall .-1630 ; 0x4d1a + 5378: fe 01 movw r30, r28 + 537a: 01 90 ld r0, Z+ + 537c: 00 20 and r0, r0 + 537e: e9 f7 brne .-6 ; 0x537a + 5380: bf 01 movw r22, r30 + 5382: 61 50 subi r22, 0x01 ; 1 + 5384: 71 09 sbc r23, r1 + 5386: 6c 1b sub r22, r28 + 5388: 7d 0b sbc r23, r29 + 538a: 40 e0 ldi r20, 0x00 ; 0 + 538c: 50 e0 ldi r21, 0x00 ; 0 + 538e: ce 01 movw r24, r28 + 5390: df 91 pop r29 + 5392: cf 91 pop r28 + 5394: d5 ca rjmp .-2646 ; 0x4940 -0000572a : - 572a: ef 92 push r14 - 572c: ff 92 push r15 - 572e: 0f 93 push r16 - 5730: 1f 93 push r17 - 5732: cf 93 push r28 - 5734: df 93 push r29 - 5736: eb 01 movw r28, r22 - 5738: 7a 01 movw r14, r20 - 573a: 20 91 40 2b lds r18, 0x2B40 - 573e: 24 30 cpi r18, 0x04 ; 4 - 5740: 41 f0 breq .+16 ; 0x5752 - 5742: 82 e0 ldi r24, 0x02 ; 2 - 5744: df 91 pop r29 - 5746: cf 91 pop r28 - 5748: 1f 91 pop r17 - 574a: 0f 91 pop r16 - 574c: ff 90 pop r15 - 574e: ef 90 pop r14 - 5750: 08 95 ret - 5752: fc 01 movw r30, r24 - 5754: 04 89 ldd r16, Z+20 ; 0x14 - 5756: 15 89 ldd r17, Z+21 ; 0x15 - 5758: 26 89 ldd r18, Z+22 ; 0x16 - 575a: 37 89 ldd r19, Z+23 ; 0x17 - 575c: 01 2b or r16, r17 - 575e: 02 2b or r16, r18 - 5760: 03 2b or r16, r19 - 5762: 79 f3 breq .-34 ; 0x5742 - 5764: 81 81 ldd r24, Z+1 ; 0x01 - 5766: 92 dc rcall .-1756 ; 0x508c - 5768: 40 e0 ldi r20, 0x00 ; 0 - 576a: 50 e0 ldi r21, 0x00 ; 0 - 576c: b7 01 movw r22, r14 - 576e: ce 01 movw r24, r28 - 5770: df 91 pop r29 - 5772: cf 91 pop r28 - 5774: 1f 91 pop r17 - 5776: 0f 91 pop r16 - 5778: ff 90 pop r15 - 577a: ef 90 pop r14 - 577c: 95 ca rjmp .-2774 ; 0x4ca8 +00005396 : + 5396: ef 92 push r14 + 5398: ff 92 push r15 + 539a: 0f 93 push r16 + 539c: 1f 93 push r17 + 539e: cf 93 push r28 + 53a0: df 93 push r29 + 53a2: eb 01 movw r28, r22 + 53a4: 7a 01 movw r14, r20 + 53a6: 20 91 40 2b lds r18, 0x2B40 + 53aa: 24 30 cpi r18, 0x04 ; 4 + 53ac: 41 f0 breq .+16 ; 0x53be + 53ae: 82 e0 ldi r24, 0x02 ; 2 + 53b0: df 91 pop r29 + 53b2: cf 91 pop r28 + 53b4: 1f 91 pop r17 + 53b6: 0f 91 pop r16 + 53b8: ff 90 pop r15 + 53ba: ef 90 pop r14 + 53bc: 08 95 ret + 53be: fc 01 movw r30, r24 + 53c0: 04 89 ldd r16, Z+20 ; 0x14 + 53c2: 15 89 ldd r17, Z+21 ; 0x15 + 53c4: 26 89 ldd r18, Z+22 ; 0x16 + 53c6: 37 89 ldd r19, Z+23 ; 0x17 + 53c8: 01 2b or r16, r17 + 53ca: 02 2b or r16, r18 + 53cc: 03 2b or r16, r19 + 53ce: 79 f3 breq .-34 ; 0x53ae + 53d0: 81 81 ldd r24, Z+1 ; 0x01 + 53d2: a3 dc rcall .-1722 ; 0x4d1a + 53d4: 40 e0 ldi r20, 0x00 ; 0 + 53d6: 50 e0 ldi r21, 0x00 ; 0 + 53d8: b7 01 movw r22, r14 + 53da: ce 01 movw r24, r28 + 53dc: df 91 pop r29 + 53de: cf 91 pop r28 + 53e0: 1f 91 pop r17 + 53e2: 0f 91 pop r16 + 53e4: ff 90 pop r15 + 53e6: ef 90 pop r14 + 53e8: ab ca rjmp .-2730 ; 0x4940 -0000577e : - 577e: 0f 93 push r16 - 5780: 1f 93 push r17 - 5782: cf 93 push r28 - 5784: df 93 push r29 - 5786: 1f 92 push r1 - 5788: cd b7 in r28, 0x3d ; 61 - 578a: de b7 in r29, 0x3e ; 62 - 578c: 20 91 40 2b lds r18, 0x2B40 - 5790: 24 30 cpi r18, 0x04 ; 4 - 5792: 39 f0 breq .+14 ; 0x57a2 - 5794: 82 e0 ldi r24, 0x02 ; 2 - 5796: 0f 90 pop r0 - 5798: df 91 pop r29 - 579a: cf 91 pop r28 - 579c: 1f 91 pop r17 - 579e: 0f 91 pop r16 - 57a0: 08 95 ret - 57a2: fc 01 movw r30, r24 - 57a4: 04 89 ldd r16, Z+20 ; 0x14 - 57a6: 15 89 ldd r17, Z+21 ; 0x15 - 57a8: 26 89 ldd r18, Z+22 ; 0x16 - 57aa: 37 89 ldd r19, Z+23 ; 0x17 - 57ac: 01 2b or r16, r17 - 57ae: 02 2b or r16, r18 - 57b0: 03 2b or r16, r19 - 57b2: 81 f3 breq .-32 ; 0x5794 - 57b4: 81 81 ldd r24, Z+1 ; 0x01 - 57b6: 69 83 std Y+1, r22 ; 0x01 - 57b8: 69 dc rcall .-1838 ; 0x508c - 57ba: 20 91 49 2b lds r18, 0x2B49 - 57be: 30 91 4a 2b lds r19, 0x2B4A - 57c2: f9 01 movw r30, r18 - 57c4: ef 5b subi r30, 0xBF ; 191 - 57c6: ff 4f sbci r31, 0xFF ; 255 - 57c8: 90 81 ld r25, Z - 57ca: f9 01 movw r30, r18 - 57cc: e0 5c subi r30, 0xC0 ; 192 - 57ce: ff 4f sbci r31, 0xFF ; 255 - 57d0: 80 81 ld r24, Z - 57d2: 69 81 ldd r22, Y+1 ; 0x01 - 57d4: 98 17 cp r25, r24 - 57d6: 30 f0 brcs .+12 ; 0x57e4 - 57d8: 69 83 std Y+1, r22 ; 0x01 - 57da: 12 dc rcall .-2012 ; 0x5000 - 57dc: 27 de rcall .-946 ; 0x542c - 57de: 69 81 ldd r22, Y+1 ; 0x01 - 57e0: 81 11 cpse r24, r1 - 57e2: d9 cf rjmp .-78 ; 0x5796 - 57e4: 86 2f mov r24, r22 - 57e6: 43 dc rcall .-1914 ; 0x506e - 57e8: 80 e0 ldi r24, 0x00 ; 0 - 57ea: d5 cf rjmp .-86 ; 0x5796 +000053ea : + 53ea: 0f 93 push r16 + 53ec: 1f 93 push r17 + 53ee: cf 93 push r28 + 53f0: df 93 push r29 + 53f2: 1f 92 push r1 + 53f4: cd b7 in r28, 0x3d ; 61 + 53f6: de b7 in r29, 0x3e ; 62 + 53f8: 20 91 40 2b lds r18, 0x2B40 + 53fc: 24 30 cpi r18, 0x04 ; 4 + 53fe: 39 f0 breq .+14 ; 0x540e + 5400: 82 e0 ldi r24, 0x02 ; 2 + 5402: 0f 90 pop r0 + 5404: df 91 pop r29 + 5406: cf 91 pop r28 + 5408: 1f 91 pop r17 + 540a: 0f 91 pop r16 + 540c: 08 95 ret + 540e: fc 01 movw r30, r24 + 5410: 04 89 ldd r16, Z+20 ; 0x14 + 5412: 15 89 ldd r17, Z+21 ; 0x15 + 5414: 26 89 ldd r18, Z+22 ; 0x16 + 5416: 37 89 ldd r19, Z+23 ; 0x17 + 5418: 01 2b or r16, r17 + 541a: 02 2b or r16, r18 + 541c: 03 2b or r16, r19 + 541e: 81 f3 breq .-32 ; 0x5400 + 5420: 81 81 ldd r24, Z+1 ; 0x01 + 5422: 69 83 std Y+1, r22 ; 0x01 + 5424: 7a dc rcall .-1804 ; 0x4d1a + 5426: 20 91 49 2b lds r18, 0x2B49 + 542a: 30 91 4a 2b lds r19, 0x2B4A + 542e: f9 01 movw r30, r18 + 5430: ef 5b subi r30, 0xBF ; 191 + 5432: ff 4f sbci r31, 0xFF ; 255 + 5434: 90 81 ld r25, Z + 5436: 31 97 sbiw r30, 0x01 ; 1 + 5438: 80 81 ld r24, Z + 543a: 69 81 ldd r22, Y+1 ; 0x01 + 543c: 98 17 cp r25, r24 + 543e: 30 f0 brcs .+12 ; 0x544c + 5440: 69 83 std Y+1, r22 ; 0x01 + 5442: 23 dc rcall .-1978 ; 0x4c8a + 5444: 2e de rcall .-932 ; 0x50a2 + 5446: 69 81 ldd r22, Y+1 ; 0x01 + 5448: 81 11 cpse r24, r1 + 544a: db cf rjmp .-74 ; 0x5402 + 544c: 86 2f mov r24, r22 + 544e: 55 dc rcall .-1878 ; 0x4cfa + 5450: 80 e0 ldi r24, 0x00 ; 0 + 5452: d7 cf rjmp .-82 ; 0x5402 -000057ec : - 57ec: 0f 93 push r16 - 57ee: 1f 93 push r17 - 57f0: cf 93 push r28 - 57f2: df 93 push r29 - 57f4: 1f 92 push r1 - 57f6: cd b7 in r28, 0x3d ; 61 - 57f8: de b7 in r29, 0x3e ; 62 - 57fa: 20 91 40 2b lds r18, 0x2B40 - 57fe: 24 30 cpi r18, 0x04 ; 4 - 5800: 39 f0 breq .+14 ; 0x5810 - 5802: 82 e0 ldi r24, 0x02 ; 2 - 5804: 0f 90 pop r0 - 5806: df 91 pop r29 - 5808: cf 91 pop r28 - 580a: 1f 91 pop r17 - 580c: 0f 91 pop r16 - 580e: 08 95 ret - 5810: fc 01 movw r30, r24 - 5812: 44 89 ldd r20, Z+20 ; 0x14 - 5814: 55 89 ldd r21, Z+21 ; 0x15 - 5816: 66 89 ldd r22, Z+22 ; 0x16 - 5818: 77 89 ldd r23, Z+23 ; 0x17 - 581a: 45 2b or r20, r21 - 581c: 46 2b or r20, r22 - 581e: 47 2b or r20, r23 - 5820: 81 f3 breq .-32 ; 0x5802 - 5822: 81 81 ldd r24, Z+1 ; 0x01 - 5824: 33 dc rcall .-1946 ; 0x508c - 5826: 80 91 4d 2b lds r24, 0x2B4D - 582a: 20 91 49 2b lds r18, 0x2B49 - 582e: 30 91 4a 2b lds r19, 0x2B4A - 5832: f9 01 movw r30, r18 - 5834: 87 fd sbrc r24, 7 - 5836: 1d c0 rjmp .+58 ; 0x5872 - 5838: e0 5c subi r30, 0xC0 ; 192 - 583a: ff 4f sbci r31, 0xFF ; 255 - 583c: 80 81 ld r24, Z - 583e: f9 01 movw r30, r18 - 5840: ef 5b subi r30, 0xBF ; 191 - 5842: ff 4f sbci r31, 0xFF ; 255 - 5844: 40 81 ld r20, Z - 5846: 90 e0 ldi r25, 0x00 ; 0 - 5848: 84 1b sub r24, r20 - 584a: 91 09 sbc r25, r1 - 584c: 89 2b or r24, r25 - 584e: 11 f4 brne .+4 ; 0x5854 - 5850: 80 e0 ldi r24, 0x00 ; 0 - 5852: d8 cf rjmp .-80 ; 0x5804 - 5854: 00 81 ld r16, Z - 5856: f9 01 movw r30, r18 - 5858: e0 5c subi r30, 0xC0 ; 192 - 585a: ff 4f sbci r31, 0xFF ; 255 - 585c: 10 81 ld r17, Z - 585e: d0 db rcall .-2144 ; 0x5000 - 5860: 01 17 cp r16, r17 - 5862: b0 f3 brcs .-20 ; 0x5850 - 5864: e3 dd rcall .-1082 ; 0x542c - 5866: 81 11 cpse r24, r1 - 5868: cd cf rjmp .-102 ; 0x5804 - 586a: 89 83 std Y+1, r24 ; 0x01 - 586c: c9 db rcall .-2158 ; 0x5000 - 586e: 89 81 ldd r24, Y+1 ; 0x01 - 5870: c9 cf rjmp .-110 ; 0x5804 - 5872: ef 5b subi r30, 0xBF ; 191 - 5874: ff 4f sbci r31, 0xFF ; 255 - 5876: 80 81 ld r24, Z - 5878: 90 e0 ldi r25, 0x00 ; 0 - 587a: e8 cf rjmp .-48 ; 0x584c +00005454 : + 5454: cf 93 push r28 + 5456: df 93 push r29 + 5458: 20 91 40 2b lds r18, 0x2B40 + 545c: 24 30 cpi r18, 0x04 ; 4 + 545e: 21 f0 breq .+8 ; 0x5468 + 5460: 82 e0 ldi r24, 0x02 ; 2 + 5462: df 91 pop r29 + 5464: cf 91 pop r28 + 5466: 08 95 ret + 5468: fc 01 movw r30, r24 + 546a: 44 89 ldd r20, Z+20 ; 0x14 + 546c: 55 89 ldd r21, Z+21 ; 0x15 + 546e: 66 89 ldd r22, Z+22 ; 0x16 + 5470: 77 89 ldd r23, Z+23 ; 0x17 + 5472: 45 2b or r20, r21 + 5474: 46 2b or r20, r22 + 5476: 47 2b or r20, r23 + 5478: 99 f3 breq .-26 ; 0x5460 + 547a: 81 81 ldd r24, Z+1 ; 0x01 + 547c: 4e dc rcall .-1892 ; 0x4d1a + 547e: 80 91 4d 2b lds r24, 0x2B4D + 5482: 20 91 49 2b lds r18, 0x2B49 + 5486: 30 91 4a 2b lds r19, 0x2B4A + 548a: f9 01 movw r30, r18 + 548c: 87 fd sbrc r24, 7 + 548e: 1b c0 rjmp .+54 ; 0x54c6 + 5490: e0 5c subi r30, 0xC0 ; 192 + 5492: ff 4f sbci r31, 0xFF ; 255 + 5494: 80 81 ld r24, Z + 5496: 31 96 adiw r30, 0x01 ; 1 + 5498: 40 81 ld r20, Z + 549a: 90 e0 ldi r25, 0x00 ; 0 + 549c: 84 1b sub r24, r20 + 549e: 91 09 sbc r25, r1 + 54a0: 89 2b or r24, r25 + 54a2: 11 f4 brne .+4 ; 0x54a8 + 54a4: 80 e0 ldi r24, 0x00 ; 0 + 54a6: dd cf rjmp .-70 ; 0x5462 + 54a8: f9 01 movw r30, r18 + 54aa: ef 5b subi r30, 0xBF ; 191 + 54ac: ff 4f sbci r31, 0xFF ; 255 + 54ae: d0 81 ld r29, Z + 54b0: 31 97 sbiw r30, 0x01 ; 1 + 54b2: c0 81 ld r28, Z + 54b4: ea db rcall .-2092 ; 0x4c8a + 54b6: dc 17 cp r29, r28 + 54b8: a8 f3 brcs .-22 ; 0x54a4 + 54ba: f3 dd rcall .-1050 ; 0x50a2 + 54bc: 81 11 cpse r24, r1 + 54be: d1 cf rjmp .-94 ; 0x5462 + 54c0: e4 db rcall .-2104 ; 0x4c8a + 54c2: 80 e0 ldi r24, 0x00 ; 0 + 54c4: ce cf rjmp .-100 ; 0x5462 + 54c6: ef 5b subi r30, 0xBF ; 191 + 54c8: ff 4f sbci r31, 0xFF ; 255 + 54ca: 80 81 ld r24, Z + 54cc: 90 e0 ldi r25, 0x00 ; 0 + 54ce: e8 cf rjmp .-48 ; 0x54a0 -0000587c : - 587c: cf 93 push r28 - 587e: df 93 push r29 - 5880: ec 01 movw r28, r24 - 5882: 80 91 40 2b lds r24, 0x2B40 - 5886: 84 30 cpi r24, 0x04 ; 4 - 5888: 19 f0 breq .+6 ; 0x5890 - 588a: df 91 pop r29 - 588c: cf 91 pop r28 - 588e: 08 95 ret - 5890: 4c 89 ldd r20, Y+20 ; 0x14 - 5892: 5d 89 ldd r21, Y+21 ; 0x15 - 5894: 6e 89 ldd r22, Y+22 ; 0x16 - 5896: 7f 89 ldd r23, Y+23 ; 0x17 - 5898: 45 2b or r20, r21 - 589a: 46 2b or r20, r22 - 589c: 47 2b or r20, r23 - 589e: a9 f3 breq .-22 ; 0x588a - 58a0: 89 81 ldd r24, Y+1 ; 0x01 - 58a2: f4 db rcall .-2072 ; 0x508c - 58a4: a6 dc rcall .-1716 ; 0x51f2 - 58a6: 88 23 and r24, r24 - 58a8: 81 f3 breq .-32 ; 0x588a - 58aa: ce 01 movw r24, r28 - 58ac: df 91 pop r29 - 58ae: cf 91 pop r28 - 58b0: 9d cf rjmp .-198 ; 0x57ec +000054d0 : + 54d0: cf 93 push r28 + 54d2: df 93 push r29 + 54d4: ec 01 movw r28, r24 + 54d6: 80 91 40 2b lds r24, 0x2B40 + 54da: 84 30 cpi r24, 0x04 ; 4 + 54dc: 19 f0 breq .+6 ; 0x54e4 + 54de: df 91 pop r29 + 54e0: cf 91 pop r28 + 54e2: 08 95 ret + 54e4: 4c 89 ldd r20, Y+20 ; 0x14 + 54e6: 5d 89 ldd r21, Y+21 ; 0x15 + 54e8: 6e 89 ldd r22, Y+22 ; 0x16 + 54ea: 7f 89 ldd r23, Y+23 ; 0x17 + 54ec: 45 2b or r20, r21 + 54ee: 46 2b or r20, r22 + 54f0: 47 2b or r20, r23 + 54f2: a9 f3 breq .-22 ; 0x54de + 54f4: 89 81 ldd r24, Y+1 ; 0x01 + 54f6: 11 dc rcall .-2014 ; 0x4d1a + 54f8: 49 dc rcall .-1902 ; 0x4d8c + 54fa: 88 23 and r24, r24 + 54fc: 81 f3 breq .-32 ; 0x54de + 54fe: ce 01 movw r24, r28 + 5500: df 91 pop r29 + 5502: cf 91 pop r28 + 5504: a7 cf rjmp .-178 ; 0x5454 -000058b2 : - 58b2: cf 93 push r28 - 58b4: df 93 push r29 - 58b6: 20 91 40 2b lds r18, 0x2B40 - 58ba: 24 30 cpi r18, 0x04 ; 4 - 58bc: c1 f5 brne .+112 ; 0x592e - 58be: fc 01 movw r30, r24 - 58c0: 44 89 ldd r20, Z+20 ; 0x14 - 58c2: 55 89 ldd r21, Z+21 ; 0x15 - 58c4: 66 89 ldd r22, Z+22 ; 0x16 - 58c6: 77 89 ldd r23, Z+23 ; 0x17 - 58c8: 45 2b or r20, r21 - 58ca: 46 2b or r20, r22 - 58cc: 47 2b or r20, r23 - 58ce: 79 f1 breq .+94 ; 0x592e - 58d0: 86 81 ldd r24, Z+6 ; 0x06 - 58d2: dc db rcall .-2120 ; 0x508c - 58d4: 75 dc rcall .-1814 ; 0x51c0 - 58d6: 88 23 and r24, r24 - 58d8: 51 f1 breq .+84 ; 0x592e - 58da: 80 91 4d 2b lds r24, 0x2B4D - 58de: 87 fd sbrc r24, 7 - 58e0: 3d c0 rjmp .+122 ; 0x595c - 58e2: 80 91 49 2b lds r24, 0x2B49 - 58e6: 90 91 4a 2b lds r25, 0x2B4A - 58ea: fc 01 movw r30, r24 - 58ec: e0 5c subi r30, 0xC0 ; 192 - 58ee: ff 4f sbci r31, 0xFF ; 255 - 58f0: 20 81 ld r18, Z - 58f2: fc 01 movw r30, r24 - 58f4: ef 5b subi r30, 0xBF ; 191 - 58f6: ff 4f sbci r31, 0xFF ; 255 - 58f8: 40 81 ld r20, Z - 58fa: 30 e0 ldi r19, 0x00 ; 0 - 58fc: 24 1b sub r18, r20 - 58fe: 31 09 sbc r19, r1 - 5900: 23 2b or r18, r19 - 5902: d9 f4 brne .+54 ; 0x593a - 5904: cf ef ldi r28, 0xFF ; 255 - 5906: df ef ldi r29, 0xFF ; 255 - 5908: 20 91 4d 2b lds r18, 0x2B4D - 590c: 27 fd sbrc r18, 7 - 590e: 23 c0 rjmp .+70 ; 0x5956 - 5910: dc 01 movw r26, r24 - 5912: a0 5c subi r26, 0xC0 ; 192 - 5914: bf 4f sbci r27, 0xFF ; 255 - 5916: 8c 91 ld r24, X - 5918: 20 81 ld r18, Z - 591a: 90 e0 ldi r25, 0x00 ; 0 - 591c: 82 1b sub r24, r18 - 591e: 91 09 sbc r25, r1 - 5920: 89 2b or r24, r25 - 5922: 39 f4 brne .+14 ; 0x5932 - 5924: 86 db rcall .-2292 ; 0x5032 - 5926: ce 01 movw r24, r28 - 5928: df 91 pop r29 - 592a: cf 91 pop r28 - 592c: 08 95 ret - 592e: cf ef ldi r28, 0xFF ; 255 - 5930: df ef ldi r29, 0xFF ; 255 - 5932: ce 01 movw r24, r28 - 5934: df 91 pop r29 - 5936: cf 91 pop r28 - 5938: 08 95 ret - 593a: 8a db rcall .-2284 ; 0x5050 - 593c: c8 2f mov r28, r24 - 593e: d0 e0 ldi r29, 0x00 ; 0 - 5940: 80 91 49 2b lds r24, 0x2B49 - 5944: 90 91 4a 2b lds r25, 0x2B4A - 5948: fc 01 movw r30, r24 - 594a: ef 5b subi r30, 0xBF ; 191 - 594c: ff 4f sbci r31, 0xFF ; 255 - 594e: 20 91 4d 2b lds r18, 0x2B4D - 5952: 27 ff sbrs r18, 7 - 5954: dd cf rjmp .-70 ; 0x5910 - 5956: 80 81 ld r24, Z - 5958: 90 e0 ldi r25, 0x00 ; 0 - 595a: e2 cf rjmp .-60 ; 0x5920 - 595c: 80 91 49 2b lds r24, 0x2B49 - 5960: 90 91 4a 2b lds r25, 0x2B4A - 5964: fc 01 movw r30, r24 - 5966: ef 5b subi r30, 0xBF ; 191 - 5968: ff 4f sbci r31, 0xFF ; 255 - 596a: 20 81 ld r18, Z - 596c: 30 e0 ldi r19, 0x00 ; 0 - 596e: c8 cf rjmp .-112 ; 0x5900 +00005506 : + 5506: cf 93 push r28 + 5508: df 93 push r29 + 550a: 20 91 40 2b lds r18, 0x2B40 + 550e: 24 30 cpi r18, 0x04 ; 4 + 5510: a9 f5 brne .+106 ; 0x557c + 5512: fc 01 movw r30, r24 + 5514: 44 89 ldd r20, Z+20 ; 0x14 + 5516: 55 89 ldd r21, Z+21 ; 0x15 + 5518: 66 89 ldd r22, Z+22 ; 0x16 + 551a: 77 89 ldd r23, Z+23 ; 0x17 + 551c: 45 2b or r20, r21 + 551e: 46 2b or r20, r22 + 5520: 47 2b or r20, r23 + 5522: 61 f1 breq .+88 ; 0x557c + 5524: 86 81 ldd r24, Z+6 ; 0x06 + 5526: f9 db rcall .-2062 ; 0x4d1a + 5528: 3d dc rcall .-1926 ; 0x4da4 + 552a: 88 23 and r24, r24 + 552c: 39 f1 breq .+78 ; 0x557c + 552e: 80 91 4d 2b lds r24, 0x2B4D + 5532: 40 91 49 2b lds r20, 0x2B49 + 5536: 50 91 4a 2b lds r21, 0x2B4A + 553a: fa 01 movw r30, r20 + 553c: 87 fd sbrc r24, 7 + 553e: 3a c0 rjmp .+116 ; 0x55b4 + 5540: e0 5c subi r30, 0xC0 ; 192 + 5542: ff 4f sbci r31, 0xFF ; 255 + 5544: 80 81 ld r24, Z + 5546: 31 96 adiw r30, 0x01 ; 1 + 5548: 20 81 ld r18, Z + 554a: 90 e0 ldi r25, 0x00 ; 0 + 554c: 82 1b sub r24, r18 + 554e: 91 09 sbc r25, r1 + 5550: 89 2b or r24, r25 + 5552: c9 f4 brne .+50 ; 0x5586 + 5554: cf ef ldi r28, 0xFF ; 255 + 5556: df ef ldi r29, 0xFF ; 255 + 5558: 80 91 4d 2b lds r24, 0x2B4D + 555c: fa 01 movw r30, r20 + 555e: 87 fd sbrc r24, 7 + 5560: 1e c0 rjmp .+60 ; 0x559e + 5562: e0 5c subi r30, 0xC0 ; 192 + 5564: ff 4f sbci r31, 0xFF ; 255 + 5566: 20 81 ld r18, Z + 5568: 31 96 adiw r30, 0x01 ; 1 + 556a: 80 81 ld r24, Z + 556c: 30 e0 ldi r19, 0x00 ; 0 + 556e: 28 1b sub r18, r24 + 5570: 31 09 sbc r19, r1 + 5572: d9 f0 breq .+54 ; 0x55aa + 5574: ce 01 movw r24, r28 + 5576: df 91 pop r29 + 5578: cf 91 pop r28 + 557a: 08 95 ret + 557c: 8f ef ldi r24, 0xFF ; 255 + 557e: 9f ef ldi r25, 0xFF ; 255 + 5580: df 91 pop r29 + 5582: cf 91 pop r28 + 5584: 08 95 ret + 5586: a9 db rcall .-2222 ; 0x4cda + 5588: c8 2f mov r28, r24 + 558a: d0 e0 ldi r29, 0x00 ; 0 + 558c: 40 91 49 2b lds r20, 0x2B49 + 5590: 50 91 4a 2b lds r21, 0x2B4A + 5594: 80 91 4d 2b lds r24, 0x2B4D + 5598: fa 01 movw r30, r20 + 559a: 87 ff sbrs r24, 7 + 559c: e2 cf rjmp .-60 ; 0x5562 + 559e: ef 5b subi r30, 0xBF ; 191 + 55a0: ff 4f sbci r31, 0xFF ; 255 + 55a2: 20 81 ld r18, Z + 55a4: 30 e0 ldi r19, 0x00 ; 0 + 55a6: 23 2b or r18, r19 + 55a8: 29 f7 brne .-54 ; 0x5574 + 55aa: 88 db rcall .-2288 ; 0x4cbc + 55ac: ce 01 movw r24, r28 + 55ae: df 91 pop r29 + 55b0: cf 91 pop r28 + 55b2: 08 95 ret + 55b4: ef 5b subi r30, 0xBF ; 191 + 55b6: ff 4f sbci r31, 0xFF ; 255 + 55b8: 80 81 ld r24, Z + 55ba: 90 e0 ldi r25, 0x00 ; 0 + 55bc: c9 cf rjmp .-110 ; 0x5550 -00005970 : +000055be : return ReceivedByte; } #endif void CDC_Device_Event_Stub(void) { - 5970: 08 95 ret + 55be: 08 95 ret -00005972 : +000055c0 : #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) { - 5972: ff 92 push r15 - 5974: 0f 93 push r16 - 5976: 1f 93 push r17 - 5978: cf 93 push r28 - 597a: df 93 push r29 - 597c: ec 01 movw r28, r24 + 55c0: ff 92 push r15 + 55c2: 0f 93 push r16 + 55c4: 1f 93 push r17 + 55c6: cf 93 push r28 + 55c8: df 93 push r29 + 55ca: ec 01 movw r28, r24 if (!(Endpoint_IsSETUPReceived())) - 597e: 07 dc rcall .-2034 ; 0x518e - 5980: 88 23 and r24, r24 - 5982: 49 f0 breq .+18 ; 0x5996 + 55cc: 04 dc rcall .-2040 ; 0x4dd6 + 55ce: 88 23 and r24, r24 + 55d0: 49 f0 breq .+18 ; 0x55e4 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 5984: 88 81 ld r24, Y - 5986: 90 e0 ldi r25, 0x00 ; 0 - 5988: 20 91 45 2b lds r18, 0x2B45 - 598c: 30 91 46 2b lds r19, 0x2B46 - 5990: 28 17 cp r18, r24 - 5992: 39 07 cpc r19, r25 - 5994: 31 f0 breq .+12 ; 0x59a2 + 55d2: 88 81 ld r24, Y + 55d4: 90 e0 ldi r25, 0x00 ; 0 + 55d6: 20 91 45 2b lds r18, 0x2B45 + 55da: 30 91 46 2b lds r19, 0x2B46 + 55de: 28 17 cp r18, r24 + 55e0: 39 07 cpc r19, r25 + 55e2: 31 f0 breq .+12 ; 0x55f0 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); } break; } } - 5996: df 91 pop r29 - 5998: cf 91 pop r28 - 599a: 1f 91 pop r17 - 599c: 0f 91 pop r16 - 599e: ff 90 pop r15 - 59a0: 08 95 ret + 55e4: df 91 pop r29 + 55e6: cf 91 pop r28 + 55e8: 1f 91 pop r17 + 55ea: 0f 91 pop r16 + 55ec: ff 90 pop r15 + 55ee: 08 95 ret return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) return; switch (USB_ControlRequest.bRequest) - 59a2: 80 91 42 2b lds r24, 0x2B42 - 59a6: 81 32 cpi r24, 0x21 ; 33 - 59a8: 09 f4 brne .+2 ; 0x59ac - 59aa: 4b c0 rjmp .+150 ; 0x5a42 - 59ac: 08 f0 brcs .+2 ; 0x59b0 - 59ae: 33 c0 rjmp .+102 ; 0x5a16 - 59b0: 80 32 cpi r24, 0x20 ; 32 - 59b2: 89 f7 brne .-30 ; 0x5996 - Endpoint_ClearStatusStage(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 59b4: 80 91 41 2b lds r24, 0x2B41 - 59b8: 81 32 cpi r24, 0x21 ; 33 - 59ba: 69 f7 brne .-38 ; 0x5996 - { - Endpoint_ClearSETUP(); - 59bc: bc db rcall .-2184 ; 0x5136 - - while (!(Endpoint_IsOUTReceived())) - 59be: 04 c0 rjmp .+8 ; 0x59c8 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 59c0: 80 91 40 2b lds r24, 0x2B40 - 59c4: 88 23 and r24, r24 - 59c6: 39 f3 breq .-50 ; 0x5996 - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - while (!(Endpoint_IsOUTReceived())) - 59c8: fb db rcall .-2058 ; 0x51c0 - 59ca: 88 23 and r24, r24 - 59cc: c9 f3 breq .-14 ; 0x59c0 - * \return Next four bytes in the currently selected endpoint's FIFO buffer. - */ - static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint32_t Endpoint_Read_32_LE(void) - { - uint32_t Byte0 = Endpoint_Read_8(); - 59ce: 40 db rcall .-2432 ; 0x5050 - 59d0: 08 2f mov r16, r24 - uint32_t Byte1 = Endpoint_Read_8(); - 59d2: 3e db rcall .-2436 ; 0x5050 - 59d4: 18 2f mov r17, r24 - uint32_t Byte2 = Endpoint_Read_8(); - 59d6: 3c db rcall .-2440 ; 0x5050 - 59d8: f8 2e mov r15, r24 - uint32_t Byte3 = Endpoint_Read_8(); - 59da: 3a db rcall .-2444 ; 0x5050 - static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint32_t Endpoint_Read_32_LE(void) - { - uint32_t Byte0 = Endpoint_Read_8(); - uint32_t Byte1 = Endpoint_Read_8(); - uint32_t Byte2 = Endpoint_Read_8(); - 59dc: 4f 2d mov r20, r15 - 59de: 50 e0 ldi r21, 0x00 ; 0 - 59e0: 60 e0 ldi r22, 0x00 ; 0 - 59e2: 70 e0 ldi r23, 0x00 ; 0 - uint32_t Byte3 = Endpoint_Read_8(); - - return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 59e4: ba 01 movw r22, r20 - 59e6: 55 27 eor r21, r21 - 59e8: 44 27 eor r20, r20 - 59ea: 78 2b or r23, r24 - 59ec: 40 2b or r20, r16 - 59ee: 51 2b or r21, r17 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 59f0: 4c 8b std Y+20, r20 ; 0x14 - 59f2: 5d 8b std Y+21, r21 ; 0x15 - 59f4: 6e 8b std Y+22, r22 ; 0x16 - 59f6: 7f 8b std Y+23, r23 ; 0x17 - CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 59f8: 2b db rcall .-2474 ; 0x5050 - 59fa: 88 8f std Y+24, r24 ; 0x18 - CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 59fc: 29 db rcall .-2478 ; 0x5050 - 59fe: 89 8f std Y+25, r24 ; 0x19 - CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 5a00: 27 db rcall .-2482 ; 0x5050 - 5a02: 8a 8f std Y+26, r24 ; 0x1a - - Endpoint_ClearOUT(); - 5a04: 16 db rcall .-2516 ; 0x5032 - Endpoint_ClearStatusStage(); - 5a06: fc dc rcall .-1544 ; 0x5400 - - EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 5a08: ce 01 movw r24, r28 - EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - } - - break; - } -} - 5a0a: df 91 pop r29 - 5a0c: cf 91 pop r28 - 5a0e: 1f 91 pop r17 - 5a10: 0f 91 pop r16 - 5a12: ff 90 pop r15 - CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - - Endpoint_ClearOUT(); - Endpoint_ClearStatusStage(); - - EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 5a14: ad cf rjmp .-166 ; 0x5970 - return; - - if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - return; - - switch (USB_ControlRequest.bRequest) - 5a16: 82 32 cpi r24, 0x22 ; 34 - 5a18: 09 f4 brne .+2 ; 0x5a1c - 5a1a: 34 c0 rjmp .+104 ; 0x5a84 - 5a1c: 83 32 cpi r24, 0x23 ; 35 - 5a1e: 09 f0 breq .+2 ; 0x5a22 - 5a20: ba cf rjmp .-140 ; 0x5996 + 55f0: 80 91 42 2b lds r24, 0x2B42 + 55f4: 81 32 cpi r24, 0x21 ; 33 + 55f6: 09 f4 brne .+2 ; 0x55fa + 55f8: 48 c0 rjmp .+144 ; 0x568a + 55fa: a0 f0 brcs .+40 ; 0x5624 + 55fc: 82 32 cpi r24, 0x22 ; 34 + 55fe: 09 f4 brne .+2 ; 0x5602 + 5600: 65 c0 rjmp .+202 ; 0x56cc + 5602: 83 32 cpi r24, 0x23 ; 35 + 5604: 79 f7 brne .-34 ; 0x55e4 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); } break; case CDC_REQ_SendBreak: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 5a22: 80 91 41 2b lds r24, 0x2B41 - 5a26: 81 32 cpi r24, 0x21 ; 33 - 5a28: 09 f0 breq .+2 ; 0x5a2c - 5a2a: b5 cf rjmp .-150 ; 0x5996 + 5606: 80 91 41 2b lds r24, 0x2B41 + 560a: 81 32 cpi r24, 0x21 ; 33 + 560c: 59 f7 brne .-42 ; 0x55e4 { Endpoint_ClearSETUP(); - 5a2c: 84 db rcall .-2296 ; 0x5136 + 560e: fc db rcall .-2056 ; 0x4e08 Endpoint_ClearStatusStage(); - 5a2e: e8 dc rcall .-1584 ; 0x5400 + 5610: 32 dd rcall .-1436 ; 0x5076 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 5a30: 60 91 43 2b lds r22, 0x2B43 - 5a34: ce 01 movw r24, r28 + 5612: 60 91 43 2b lds r22, 0x2B43 + 5616: ce 01 movw r24, r28 } break; } } - 5a36: df 91 pop r29 - 5a38: cf 91 pop r28 - 5a3a: 1f 91 pop r17 - 5a3c: 0f 91 pop r16 - 5a3e: ff 90 pop r15 + 5618: df 91 pop r29 + 561a: cf 91 pop r28 + 561c: 1f 91 pop r17 + 561e: 0f 91 pop r16 + 5620: ff 90 pop r15 if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 5a40: 97 cf rjmp .-210 ; 0x5970 + 5622: cd cf rjmp .-102 ; 0x55be + return; + + if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + 5624: 80 32 cpi r24, 0x20 ; 32 + 5626: f1 f6 brne .-68 ; 0x55e4 + Endpoint_ClearStatusStage(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + 5628: 80 91 41 2b lds r24, 0x2B41 + 562c: 81 32 cpi r24, 0x21 ; 33 + 562e: d1 f6 brne .-76 ; 0x55e4 + { + Endpoint_ClearSETUP(); + 5630: eb db rcall .-2090 ; 0x4e08 + + while (!(Endpoint_IsOUTReceived())) + 5632: 04 c0 rjmp .+8 ; 0x563c + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 5634: 80 91 40 2b lds r24, 0x2B40 + 5638: 88 23 and r24, r24 + 563a: a1 f2 breq .-88 ; 0x55e4 + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + while (!(Endpoint_IsOUTReceived())) + 563c: b3 db rcall .-2202 ; 0x4da4 + 563e: 88 23 and r24, r24 + 5640: c9 f3 breq .-14 ; 0x5634 + * \return Next four bytes in the currently selected endpoint's FIFO buffer. + */ + static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint32_t Endpoint_Read_32_LE(void) + { + uint32_t Byte0 = Endpoint_Read_8(); + 5642: 4b db rcall .-2410 ; 0x4cda + 5644: 08 2f mov r16, r24 + uint32_t Byte1 = Endpoint_Read_8(); + 5646: 49 db rcall .-2414 ; 0x4cda + 5648: 18 2f mov r17, r24 + uint32_t Byte2 = Endpoint_Read_8(); + 564a: 47 db rcall .-2418 ; 0x4cda + 564c: f8 2e mov r15, r24 + uint32_t Byte3 = Endpoint_Read_8(); + 564e: 45 db rcall .-2422 ; 0x4cda + static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint32_t Endpoint_Read_32_LE(void) + { + uint32_t Byte0 = Endpoint_Read_8(); + uint32_t Byte1 = Endpoint_Read_8(); + uint32_t Byte2 = Endpoint_Read_8(); + 5650: 4f 2d mov r20, r15 + 5652: 50 e0 ldi r21, 0x00 ; 0 + 5654: 60 e0 ldi r22, 0x00 ; 0 + 5656: 70 e0 ldi r23, 0x00 ; 0 + uint32_t Byte3 = Endpoint_Read_8(); + + return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); + 5658: ba 01 movw r22, r20 + 565a: 55 27 eor r21, r21 + 565c: 44 27 eor r20, r20 + 565e: 78 2b or r23, r24 + 5660: 40 2b or r20, r16 + 5662: 51 2b or r21, r17 + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); + 5664: 4c 8b std Y+20, r20 ; 0x14 + 5666: 5d 8b std Y+21, r21 ; 0x15 + 5668: 6e 8b std Y+22, r22 ; 0x16 + 566a: 7f 8b std Y+23, r23 ; 0x17 + CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); + 566c: 36 db rcall .-2452 ; 0x4cda + 566e: 88 8f std Y+24, r24 ; 0x18 + CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); + 5670: 34 db rcall .-2456 ; 0x4cda + 5672: 89 8f std Y+25, r24 ; 0x19 + CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); + 5674: 32 db rcall .-2460 ; 0x4cda + 5676: 8a 8f std Y+26, r24 ; 0x1a + + Endpoint_ClearOUT(); + 5678: 21 db rcall .-2494 ; 0x4cbc + Endpoint_ClearStatusStage(); + 567a: fd dc rcall .-1542 ; 0x5076 + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + 567c: ce 01 movw r24, r28 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 567e: df 91 pop r29 + 5680: cf 91 pop r28 + 5682: 1f 91 pop r17 + 5684: 0f 91 pop r16 + 5686: ff 90 pop r15 + CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); + + Endpoint_ClearOUT(); + Endpoint_ClearStatusStage(); + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + 5688: 9a cf rjmp .-204 ; 0x55be return; switch (USB_ControlRequest.bRequest) { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 5a42: 80 91 41 2b lds r24, 0x2B41 - 5a46: 81 3a cpi r24, 0xA1 ; 161 - 5a48: 09 f0 breq .+2 ; 0x5a4c - 5a4a: a5 cf rjmp .-182 ; 0x5996 + 568a: 80 91 41 2b lds r24, 0x2B41 + 568e: 81 3a cpi r24, 0xA1 ; 161 + 5690: 09 f0 breq .+2 ; 0x5694 + 5692: a8 cf rjmp .-176 ; 0x55e4 { Endpoint_ClearSETUP(); - 5a4c: 74 db rcall .-2328 ; 0x5136 + 5694: b9 db rcall .-2190 ; 0x4e08 while (!(Endpoint_IsINReady())); - 5a4e: d1 db rcall .-2142 ; 0x51f2 - 5a50: 88 23 and r24, r24 - 5a52: e9 f3 breq .-6 ; 0x5a4e + 5696: 7a db rcall .-2316 ; 0x4d8c + 5698: 88 23 and r24, r24 + 569a: e9 f3 breq .-6 ; 0x5696 Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 5a54: 8c 89 ldd r24, Y+20 ; 0x14 - 5a56: fd 88 ldd r15, Y+21 ; 0x15 - 5a58: 0e 89 ldd r16, Y+22 ; 0x16 - 5a5a: 1f 89 ldd r17, Y+23 ; 0x17 + 569c: 8c 89 ldd r24, Y+20 ; 0x14 + 569e: fd 88 ldd r15, Y+21 ; 0x15 + 56a0: 0e 89 ldd r16, Y+22 ; 0x16 + 56a2: 1f 89 ldd r17, Y+23 ; 0x17 * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_32_LE(const uint32_t Data) { Endpoint_Write_8(Data & 0xFF); - 5a5c: 08 db rcall .-2544 ; 0x506e + 56a4: 2a db rcall .-2476 ; 0x4cfa Endpoint_Write_8(Data >> 8); - 5a5e: 8f 2d mov r24, r15 - 5a60: 06 db rcall .-2548 ; 0x506e + 56a6: 8f 2d mov r24, r15 + 56a8: 28 db rcall .-2480 ; 0x4cfa Endpoint_Write_8(Data >> 16); - 5a62: 80 2f mov r24, r16 - 5a64: 04 db rcall .-2552 ; 0x506e + 56aa: 80 2f mov r24, r16 + 56ac: 26 db rcall .-2484 ; 0x4cfa Endpoint_Write_8(Data >> 24); - 5a66: 81 2f mov r24, r17 - 5a68: 02 db rcall .-2556 ; 0x506e + 56ae: 81 2f mov r24, r17 + 56b0: 24 db rcall .-2488 ; 0x4cfa Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 5a6a: 88 8d ldd r24, Y+24 ; 0x18 - 5a6c: 00 db rcall .-2560 ; 0x506e + 56b2: 88 8d ldd r24, Y+24 ; 0x18 + 56b4: 22 db rcall .-2492 ; 0x4cfa Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 5a6e: 89 8d ldd r24, Y+25 ; 0x19 - 5a70: fe da rcall .-2564 ; 0x506e + 56b6: 89 8d ldd r24, Y+25 ; 0x19 + 56b8: 20 db rcall .-2496 ; 0x4cfa Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 5a72: 8a 8d ldd r24, Y+26 ; 0x1a - 5a74: fc da rcall .-2568 ; 0x506e + 56ba: 8a 8d ldd r24, Y+26 ; 0x1a + 56bc: 1e db rcall .-2500 ; 0x4cfa Endpoint_ClearIN(); - 5a76: c4 da rcall .-2680 ; 0x5000 + 56be: e5 da rcall .-2614 ; 0x4c8a EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); } break; } } - 5a78: df 91 pop r29 - 5a7a: cf 91 pop r28 - 5a7c: 1f 91 pop r17 - 5a7e: 0f 91 pop r16 - 5a80: ff 90 pop r15 + 56c0: df 91 pop r29 + 56c2: cf 91 pop r28 + 56c4: 1f 91 pop r17 + 56c6: 0f 91 pop r16 + 56c8: ff 90 pop r15 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 5a82: be cc rjmp .-1668 ; 0x5400 + 56ca: d5 cc rjmp .-1622 ; 0x5076 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); } break; case CDC_REQ_SetControlLineState: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 5a84: 80 91 41 2b lds r24, 0x2B41 - 5a88: 81 32 cpi r24, 0x21 ; 33 - 5a8a: 09 f0 breq .+2 ; 0x5a8e - 5a8c: 84 cf rjmp .-248 ; 0x5996 + 56cc: 80 91 41 2b lds r24, 0x2B41 + 56d0: 81 32 cpi r24, 0x21 ; 33 + 56d2: 09 f0 breq .+2 ; 0x56d6 + 56d4: 87 cf rjmp .-242 ; 0x55e4 { Endpoint_ClearSETUP(); - 5a8e: 53 db rcall .-2394 ; 0x5136 + 56d6: 98 db rcall .-2256 ; 0x4e08 Endpoint_ClearStatusStage(); - 5a90: b7 dc rcall .-1682 ; 0x5400 + 56d8: ce dc rcall .-1636 ; 0x5076 CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 5a92: 80 91 43 2b lds r24, 0x2B43 - 5a96: 90 91 44 2b lds r25, 0x2B44 - 5a9a: 88 8b std Y+16, r24 ; 0x10 - 5a9c: 99 8b std Y+17, r25 ; 0x11 + 56da: 80 91 43 2b lds r24, 0x2B43 + 56de: 90 91 44 2b lds r25, 0x2B44 + 56e2: 88 8b std Y+16, r24 ; 0x10 + 56e4: 99 8b std Y+17, r25 ; 0x11 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 5a9e: ce 01 movw r24, r28 + 56e6: ce 01 movw r24, r28 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); } break; } } - 5aa0: df 91 pop r29 - 5aa2: cf 91 pop r28 - 5aa4: 1f 91 pop r17 - 5aa6: 0f 91 pop r16 - 5aa8: ff 90 pop r15 + 56e8: df 91 pop r29 + 56ea: cf 91 pop r28 + 56ec: 1f 91 pop r17 + 56ee: 0f 91 pop r16 + 56f0: ff 90 pop r15 Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 5aaa: 62 cf rjmp .-316 ; 0x5970 + 56f2: 65 cf rjmp .-310 ; 0x55be -00005aac <__mulshisi3>: - 5aac: b7 ff sbrs r27, 7 - 5aae: 04 c0 rjmp .+8 ; 0x5ab8 <__muluhisi3> +000056f4 <__tablejump2__>: + 56f4: ee 0f add r30, r30 + 56f6: ff 1f adc r31, r31 -00005ab0 <__mulohisi3>: - 5ab0: 03 d0 rcall .+6 ; 0x5ab8 <__muluhisi3> - 5ab2: 82 1b sub r24, r18 - 5ab4: 93 0b sbc r25, r19 - 5ab6: 08 95 ret +000056f8 <__tablejump__>: + 56f8: 05 90 lpm r0, Z+ + 56fa: f4 91 lpm r31, Z + 56fc: e0 2d mov r30, r0 + 56fe: 09 94 ijmp -00005ab8 <__muluhisi3>: - 5ab8: 09 d0 rcall .+18 ; 0x5acc <__umulhisi3> - 5aba: a5 9f mul r26, r21 - 5abc: 90 0d add r25, r0 - 5abe: b4 9f mul r27, r20 - 5ac0: 90 0d add r25, r0 - 5ac2: a4 9f mul r26, r20 - 5ac4: 80 0d add r24, r0 - 5ac6: 91 1d adc r25, r1 - 5ac8: 11 24 eor r1, r1 - 5aca: 08 95 ret +00005700 <__mulshisi3>: + 5700: b7 ff sbrs r27, 7 + 5702: 04 c0 rjmp .+8 ; 0x570c <__muluhisi3> -00005acc <__umulhisi3>: - 5acc: a2 9f mul r26, r18 - 5ace: b0 01 movw r22, r0 - 5ad0: b3 9f mul r27, r19 - 5ad2: c0 01 movw r24, r0 - 5ad4: a3 9f mul r26, r19 - 5ad6: 01 d0 rcall .+2 ; 0x5ada <__umulhisi3+0xe> - 5ad8: b2 9f mul r27, r18 - 5ada: 70 0d add r23, r0 - 5adc: 81 1d adc r24, r1 - 5ade: 11 24 eor r1, r1 - 5ae0: 91 1d adc r25, r1 - 5ae2: 08 95 ret +00005704 <__mulohisi3>: + 5704: 03 d0 rcall .+6 ; 0x570c <__muluhisi3> + 5706: 82 1b sub r24, r18 + 5708: 93 0b sbc r25, r19 + 570a: 08 95 ret -00005ae4 : - 5ae4: 8f 92 push r8 - 5ae6: 9f 92 push r9 - 5ae8: af 92 push r10 - 5aea: bf 92 push r11 - 5aec: cf 92 push r12 - 5aee: df 92 push r13 - 5af0: ef 92 push r14 - 5af2: ff 92 push r15 - 5af4: cf 93 push r28 - 5af6: df 93 push r29 - 5af8: ec 01 movw r28, r24 - 5afa: 68 81 ld r22, Y - 5afc: 79 81 ldd r23, Y+1 ; 0x01 - 5afe: 8a 81 ldd r24, Y+2 ; 0x02 - 5b00: 9b 81 ldd r25, Y+3 ; 0x03 - 5b02: 61 15 cp r22, r1 - 5b04: 71 05 cpc r23, r1 - 5b06: 81 05 cpc r24, r1 - 5b08: 91 05 cpc r25, r1 - 5b0a: 21 f4 brne .+8 ; 0x5b14 - 5b0c: 64 e2 ldi r22, 0x24 ; 36 - 5b0e: 79 ed ldi r23, 0xD9 ; 217 - 5b10: 8b e5 ldi r24, 0x5B ; 91 - 5b12: 97 e0 ldi r25, 0x07 ; 7 - 5b14: 2d e1 ldi r18, 0x1D ; 29 - 5b16: 33 ef ldi r19, 0xF3 ; 243 - 5b18: 41 e0 ldi r20, 0x01 ; 1 - 5b1a: 50 e0 ldi r21, 0x00 ; 0 - 5b1c: 48 d3 rcall .+1680 ; 0x61ae <__divmodsi4> - 5b1e: 49 01 movw r8, r18 - 5b20: 5a 01 movw r10, r20 - 5b22: 9b 01 movw r18, r22 - 5b24: ac 01 movw r20, r24 - 5b26: a7 ea ldi r26, 0xA7 ; 167 - 5b28: b1 e4 ldi r27, 0x41 ; 65 - 5b2a: c6 df rcall .-116 ; 0x5ab8 <__muluhisi3> - 5b2c: 6b 01 movw r12, r22 - 5b2e: 7c 01 movw r14, r24 - 5b30: ac ee ldi r26, 0xEC ; 236 - 5b32: b4 ef ldi r27, 0xF4 ; 244 - 5b34: a5 01 movw r20, r10 - 5b36: 94 01 movw r18, r8 - 5b38: bb df rcall .-138 ; 0x5ab0 <__mulohisi3> - 5b3a: c6 0e add r12, r22 - 5b3c: d7 1e adc r13, r23 - 5b3e: e8 1e adc r14, r24 - 5b40: f9 1e adc r15, r25 - 5b42: f7 fe sbrs r15, 7 - 5b44: 06 c0 rjmp .+12 ; 0x5b52 - 5b46: 81 e0 ldi r24, 0x01 ; 1 - 5b48: c8 1a sub r12, r24 - 5b4a: d1 08 sbc r13, r1 - 5b4c: e1 08 sbc r14, r1 - 5b4e: 80 e8 ldi r24, 0x80 ; 128 - 5b50: f8 0a sbc r15, r24 - 5b52: c8 82 st Y, r12 - 5b54: d9 82 std Y+1, r13 ; 0x01 - 5b56: ea 82 std Y+2, r14 ; 0x02 - 5b58: fb 82 std Y+3, r15 ; 0x03 - 5b5a: e8 94 clt - 5b5c: d7 f8 bld r13, 7 - 5b5e: ee 24 eor r14, r14 - 5b60: ff 24 eor r15, r15 - 5b62: c6 01 movw r24, r12 - 5b64: df 91 pop r29 - 5b66: cf 91 pop r28 - 5b68: ff 90 pop r15 - 5b6a: ef 90 pop r14 - 5b6c: df 90 pop r13 - 5b6e: cf 90 pop r12 - 5b70: bf 90 pop r11 - 5b72: af 90 pop r10 - 5b74: 9f 90 pop r9 - 5b76: 8f 90 pop r8 - 5b78: 08 95 ret +0000570c <__muluhisi3>: + 570c: 09 d0 rcall .+18 ; 0x5720 <__umulhisi3> + 570e: a5 9f mul r26, r21 + 5710: 90 0d add r25, r0 + 5712: b4 9f mul r27, r20 + 5714: 90 0d add r25, r0 + 5716: a4 9f mul r26, r20 + 5718: 80 0d add r24, r0 + 571a: 91 1d adc r25, r1 + 571c: 11 24 eor r1, r1 + 571e: 08 95 ret -00005b7a : - 5b7a: b4 cf rjmp .-152 ; 0x5ae4 +00005720 <__umulhisi3>: + 5720: a2 9f mul r26, r18 + 5722: b0 01 movw r22, r0 + 5724: b3 9f mul r27, r19 + 5726: c0 01 movw r24, r0 + 5728: a3 9f mul r26, r19 + 572a: 70 0d add r23, r0 + 572c: 81 1d adc r24, r1 + 572e: 11 24 eor r1, r1 + 5730: 91 1d adc r25, r1 + 5732: b2 9f mul r27, r18 + 5734: 70 0d add r23, r0 + 5736: 81 1d adc r24, r1 + 5738: 11 24 eor r1, r1 + 573a: 91 1d adc r25, r1 + 573c: 08 95 ret -00005b7c : - 5b7c: 8c e1 ldi r24, 0x1C ; 28 - 5b7e: 90 e2 ldi r25, 0x20 ; 32 - 5b80: b1 cf rjmp .-158 ; 0x5ae4 +0000573e : + 573e: 8f 92 push r8 + 5740: 9f 92 push r9 + 5742: af 92 push r10 + 5744: bf 92 push r11 + 5746: cf 92 push r12 + 5748: df 92 push r13 + 574a: ef 92 push r14 + 574c: ff 92 push r15 + 574e: cf 93 push r28 + 5750: df 93 push r29 + 5752: ec 01 movw r28, r24 + 5754: 68 81 ld r22, Y + 5756: 79 81 ldd r23, Y+1 ; 0x01 + 5758: 8a 81 ldd r24, Y+2 ; 0x02 + 575a: 9b 81 ldd r25, Y+3 ; 0x03 + 575c: 61 15 cp r22, r1 + 575e: 71 05 cpc r23, r1 + 5760: 81 05 cpc r24, r1 + 5762: 91 05 cpc r25, r1 + 5764: 21 f4 brne .+8 ; 0x576e + 5766: 64 e2 ldi r22, 0x24 ; 36 + 5768: 79 ed ldi r23, 0xD9 ; 217 + 576a: 8b e5 ldi r24, 0x5B ; 91 + 576c: 97 e0 ldi r25, 0x07 ; 7 + 576e: 2d e1 ldi r18, 0x1D ; 29 + 5770: 33 ef ldi r19, 0xF3 ; 243 + 5772: 41 e0 ldi r20, 0x01 ; 1 + 5774: 50 e0 ldi r21, 0x00 ; 0 + 5776: 48 d3 rcall .+1680 ; 0x5e08 <__divmodsi4> + 5778: 49 01 movw r8, r18 + 577a: 5a 01 movw r10, r20 + 577c: 9b 01 movw r18, r22 + 577e: ac 01 movw r20, r24 + 5780: a7 ea ldi r26, 0xA7 ; 167 + 5782: b1 e4 ldi r27, 0x41 ; 65 + 5784: c3 df rcall .-122 ; 0x570c <__muluhisi3> + 5786: 6b 01 movw r12, r22 + 5788: 7c 01 movw r14, r24 + 578a: ac ee ldi r26, 0xEC ; 236 + 578c: b4 ef ldi r27, 0xF4 ; 244 + 578e: a5 01 movw r20, r10 + 5790: 94 01 movw r18, r8 + 5792: b8 df rcall .-144 ; 0x5704 <__mulohisi3> + 5794: c6 0e add r12, r22 + 5796: d7 1e adc r13, r23 + 5798: e8 1e adc r14, r24 + 579a: f9 1e adc r15, r25 + 579c: f7 fe sbrs r15, 7 + 579e: 06 c0 rjmp .+12 ; 0x57ac + 57a0: 81 e0 ldi r24, 0x01 ; 1 + 57a2: c8 1a sub r12, r24 + 57a4: d1 08 sbc r13, r1 + 57a6: e1 08 sbc r14, r1 + 57a8: 80 e8 ldi r24, 0x80 ; 128 + 57aa: f8 0a sbc r15, r24 + 57ac: c8 82 st Y, r12 + 57ae: d9 82 std Y+1, r13 ; 0x01 + 57b0: ea 82 std Y+2, r14 ; 0x02 + 57b2: fb 82 std Y+3, r15 ; 0x03 + 57b4: c6 01 movw r24, r12 + 57b6: 9f 77 andi r25, 0x7F ; 127 + 57b8: df 91 pop r29 + 57ba: cf 91 pop r28 + 57bc: ff 90 pop r15 + 57be: ef 90 pop r14 + 57c0: df 90 pop r13 + 57c2: cf 90 pop r12 + 57c4: bf 90 pop r11 + 57c6: af 90 pop r10 + 57c8: 9f 90 pop r9 + 57ca: 8f 90 pop r8 + 57cc: 08 95 ret -00005b82 : - 5b82: a0 e0 ldi r26, 0x00 ; 0 - 5b84: b0 e0 ldi r27, 0x00 ; 0 - 5b86: 80 93 1c 20 sts 0x201C, r24 - 5b8a: 90 93 1d 20 sts 0x201D, r25 - 5b8e: a0 93 1e 20 sts 0x201E, r26 - 5b92: b0 93 1f 20 sts 0x201F, r27 - 5b96: 08 95 ret +000057ce : + 57ce: b7 cf rjmp .-146 ; 0x573e -00005b98 : - 5b98: fb 01 movw r30, r22 - 5b9a: dc 01 movw r26, r24 - 5b9c: 02 c0 rjmp .+4 ; 0x5ba2 - 5b9e: 05 90 lpm r0, Z+ - 5ba0: 0d 92 st X+, r0 - 5ba2: 41 50 subi r20, 0x01 ; 1 - 5ba4: 50 40 sbci r21, 0x00 ; 0 - 5ba6: d8 f7 brcc .-10 ; 0x5b9e - 5ba8: 08 95 ret +000057d0 : + 57d0: 8c e1 ldi r24, 0x1C ; 28 + 57d2: 90 e2 ldi r25, 0x20 ; 32 + 57d4: b4 cf rjmp .-152 ; 0x573e -00005baa : - 5baa: fb 01 movw r30, r22 - 5bac: dc 01 movw r26, r24 - 5bae: 8d 91 ld r24, X+ - 5bb0: 05 90 lpm r0, Z+ - 5bb2: 80 19 sub r24, r0 - 5bb4: 01 10 cpse r0, r1 - 5bb6: d9 f3 breq .-10 ; 0x5bae - 5bb8: 99 0b sbc r25, r25 - 5bba: 08 95 ret +000057d6 : + 57d6: a0 e0 ldi r26, 0x00 ; 0 + 57d8: b0 e0 ldi r27, 0x00 ; 0 + 57da: 80 93 1c 20 sts 0x201C, r24 + 57de: 90 93 1d 20 sts 0x201D, r25 + 57e2: a0 93 1e 20 sts 0x201E, r26 + 57e6: b0 93 1f 20 sts 0x201F, r27 + 57ea: 08 95 ret -00005bbc : - 5bbc: fb 01 movw r30, r22 - 5bbe: dc 01 movw r26, r24 - 5bc0: 0d 90 ld r0, X+ - 5bc2: 00 20 and r0, r0 - 5bc4: e9 f7 brne .-6 ; 0x5bc0 - 5bc6: 11 97 sbiw r26, 0x01 ; 1 - 5bc8: 41 50 subi r20, 0x01 ; 1 - 5bca: 50 40 sbci r21, 0x00 ; 0 - 5bcc: 28 f0 brcs .+10 ; 0x5bd8 - 5bce: 05 90 lpm r0, Z+ - 5bd0: 00 20 and r0, r0 - 5bd2: 0d 92 st X+, r0 - 5bd4: c9 f7 brne .-14 ; 0x5bc8 - 5bd6: 08 95 ret - 5bd8: 1c 92 st X, r1 - 5bda: 08 95 ret +000057ec : + 57ec: fb 01 movw r30, r22 + 57ee: dc 01 movw r26, r24 + 57f0: 02 c0 rjmp .+4 ; 0x57f6 + 57f2: 05 90 lpm r0, Z+ + 57f4: 0d 92 st X+, r0 + 57f6: 41 50 subi r20, 0x01 ; 1 + 57f8: 50 40 sbci r21, 0x00 ; 0 + 57fa: d8 f7 brcc .-10 ; 0x57f2 + 57fc: 08 95 ret -00005bdc : - 5bdc: fb 01 movw r30, r22 - 5bde: dc 01 movw r26, r24 - 5be0: 41 50 subi r20, 0x01 ; 1 - 5be2: 50 40 sbci r21, 0x00 ; 0 - 5be4: 48 f0 brcs .+18 ; 0x5bf8 - 5be6: 05 90 lpm r0, Z+ - 5be8: 0d 92 st X+, r0 - 5bea: 00 20 and r0, r0 - 5bec: c9 f7 brne .-14 ; 0x5be0 - 5bee: 01 c0 rjmp .+2 ; 0x5bf2 - 5bf0: 1d 92 st X+, r1 - 5bf2: 41 50 subi r20, 0x01 ; 1 - 5bf4: 50 40 sbci r21, 0x00 ; 0 - 5bf6: e0 f7 brcc .-8 ; 0x5bf0 - 5bf8: 08 95 ret +000057fe : + 57fe: fb 01 movw r30, r22 + 5800: dc 01 movw r26, r24 + 5802: 8d 91 ld r24, X+ + 5804: 05 90 lpm r0, Z+ + 5806: 80 19 sub r24, r0 + 5808: 01 10 cpse r0, r1 + 580a: d9 f3 breq .-10 ; 0x5802 + 580c: 99 0b sbc r25, r25 + 580e: 08 95 ret -00005bfa : - 5bfa: fb 01 movw r30, r22 - 5bfc: dc 01 movw r26, r24 - 5bfe: 02 c0 rjmp .+4 ; 0x5c04 - 5c00: 01 90 ld r0, Z+ - 5c02: 0d 92 st X+, r0 - 5c04: 41 50 subi r20, 0x01 ; 1 - 5c06: 50 40 sbci r21, 0x00 ; 0 - 5c08: d8 f7 brcc .-10 ; 0x5c00 - 5c0a: 08 95 ret +00005810 : + 5810: fb 01 movw r30, r22 + 5812: dc 01 movw r26, r24 + 5814: 0d 90 ld r0, X+ + 5816: 00 20 and r0, r0 + 5818: e9 f7 brne .-6 ; 0x5814 + 581a: 11 97 sbiw r26, 0x01 ; 1 + 581c: 41 50 subi r20, 0x01 ; 1 + 581e: 50 40 sbci r21, 0x00 ; 0 + 5820: 28 f0 brcs .+10 ; 0x582c + 5822: 05 90 lpm r0, Z+ + 5824: 00 20 and r0, r0 + 5826: 0d 92 st X+, r0 + 5828: c9 f7 brne .-14 ; 0x581c + 582a: 08 95 ret + 582c: 1c 92 st X, r1 + 582e: 08 95 ret -00005c0c : - 5c0c: ae e0 ldi r26, 0x0E ; 14 - 5c0e: b0 e0 ldi r27, 0x00 ; 0 - 5c10: eb e0 ldi r30, 0x0B ; 11 - 5c12: fe e2 ldi r31, 0x2E ; 46 - 5c14: f5 c2 rjmp .+1514 ; 0x6200 <__prologue_saves__+0x1c> - 5c16: 0d 89 ldd r16, Y+21 ; 0x15 - 5c18: 1e 89 ldd r17, Y+22 ; 0x16 - 5c1a: 8f 89 ldd r24, Y+23 ; 0x17 - 5c1c: 98 8d ldd r25, Y+24 ; 0x18 - 5c1e: 2e e0 ldi r18, 0x0E ; 14 - 5c20: 2c 83 std Y+4, r18 ; 0x04 - 5c22: 09 83 std Y+1, r16 ; 0x01 - 5c24: 1a 83 std Y+2, r17 ; 0x02 - 5c26: 97 ff sbrs r25, 7 - 5c28: 02 c0 rjmp .+4 ; 0x5c2e - 5c2a: 80 e0 ldi r24, 0x00 ; 0 - 5c2c: 90 e8 ldi r25, 0x80 ; 128 - 5c2e: 01 97 sbiw r24, 0x01 ; 1 - 5c30: 8d 83 std Y+5, r24 ; 0x05 - 5c32: 9e 83 std Y+6, r25 ; 0x06 - 5c34: ce 01 movw r24, r28 - 5c36: 4b 96 adiw r24, 0x1b ; 27 - 5c38: ac 01 movw r20, r24 - 5c3a: 69 8d ldd r22, Y+25 ; 0x19 - 5c3c: 7a 8d ldd r23, Y+26 ; 0x1a - 5c3e: ce 01 movw r24, r28 - 5c40: 01 96 adiw r24, 0x01 ; 1 - 5c42: 11 d0 rcall .+34 ; 0x5c66 - 5c44: 4d 81 ldd r20, Y+5 ; 0x05 - 5c46: 5e 81 ldd r21, Y+6 ; 0x06 - 5c48: 57 fd sbrc r21, 7 - 5c4a: 0a c0 rjmp .+20 ; 0x5c60 - 5c4c: 2f 81 ldd r18, Y+7 ; 0x07 - 5c4e: 38 85 ldd r19, Y+8 ; 0x08 - 5c50: 42 17 cp r20, r18 - 5c52: 53 07 cpc r21, r19 - 5c54: 0c f4 brge .+2 ; 0x5c58 - 5c56: 9a 01 movw r18, r20 - 5c58: f8 01 movw r30, r16 - 5c5a: e2 0f add r30, r18 - 5c5c: f3 1f adc r31, r19 - 5c5e: 10 82 st Z, r1 - 5c60: 2e 96 adiw r28, 0x0e ; 14 - 5c62: e4 e0 ldi r30, 0x04 ; 4 - 5c64: e6 c2 rjmp .+1484 ; 0x6232 <__epilogue_restores__+0x1c> +00005830 : + 5830: fb 01 movw r30, r22 + 5832: dc 01 movw r26, r24 + 5834: 41 50 subi r20, 0x01 ; 1 + 5836: 50 40 sbci r21, 0x00 ; 0 + 5838: 48 f0 brcs .+18 ; 0x584c + 583a: 05 90 lpm r0, Z+ + 583c: 0d 92 st X+, r0 + 583e: 00 20 and r0, r0 + 5840: c9 f7 brne .-14 ; 0x5834 + 5842: 01 c0 rjmp .+2 ; 0x5846 + 5844: 1d 92 st X+, r1 + 5846: 41 50 subi r20, 0x01 ; 1 + 5848: 50 40 sbci r21, 0x00 ; 0 + 584a: e0 f7 brcc .-8 ; 0x5844 + 584c: 08 95 ret -00005c66 : - 5c66: ac e0 ldi r26, 0x0C ; 12 - 5c68: b0 e0 ldi r27, 0x00 ; 0 - 5c6a: e8 e3 ldi r30, 0x38 ; 56 - 5c6c: fe e2 ldi r31, 0x2E ; 46 - 5c6e: ba c2 rjmp .+1396 ; 0x61e4 <__prologue_saves__> - 5c70: 7c 01 movw r14, r24 - 5c72: 6b 01 movw r12, r22 - 5c74: 8a 01 movw r16, r20 - 5c76: fc 01 movw r30, r24 - 5c78: 16 82 std Z+6, r1 ; 0x06 - 5c7a: 17 82 std Z+7, r1 ; 0x07 - 5c7c: 83 81 ldd r24, Z+3 ; 0x03 - 5c7e: 81 ff sbrs r24, 1 - 5c80: b9 c1 rjmp .+882 ; 0x5ff4 - 5c82: 88 24 eor r8, r8 - 5c84: 83 94 inc r8 - 5c86: 91 2c mov r9, r1 - 5c88: 8c 0e add r8, r28 - 5c8a: 9d 1e adc r9, r29 - 5c8c: f7 01 movw r30, r14 - 5c8e: 93 81 ldd r25, Z+3 ; 0x03 - 5c90: f6 01 movw r30, r12 - 5c92: 93 fd sbrc r25, 3 - 5c94: 85 91 lpm r24, Z+ - 5c96: 93 ff sbrs r25, 3 - 5c98: 81 91 ld r24, Z+ - 5c9a: 6f 01 movw r12, r30 - 5c9c: 88 23 and r24, r24 - 5c9e: 09 f4 brne .+2 ; 0x5ca2 - 5ca0: a5 c1 rjmp .+842 ; 0x5fec - 5ca2: 85 32 cpi r24, 0x25 ; 37 - 5ca4: 39 f4 brne .+14 ; 0x5cb4 - 5ca6: 93 fd sbrc r25, 3 - 5ca8: 85 91 lpm r24, Z+ - 5caa: 93 ff sbrs r25, 3 - 5cac: 81 91 ld r24, Z+ - 5cae: 6f 01 movw r12, r30 - 5cb0: 85 32 cpi r24, 0x25 ; 37 - 5cb2: 21 f4 brne .+8 ; 0x5cbc - 5cb4: b7 01 movw r22, r14 - 5cb6: 90 e0 ldi r25, 0x00 ; 0 - 5cb8: f0 d1 rcall .+992 ; 0x609a - 5cba: e8 cf rjmp .-48 ; 0x5c8c - 5cbc: 51 2c mov r5, r1 - 5cbe: 31 2c mov r3, r1 - 5cc0: 20 e0 ldi r18, 0x00 ; 0 - 5cc2: 20 32 cpi r18, 0x20 ; 32 - 5cc4: a8 f4 brcc .+42 ; 0x5cf0 - 5cc6: 8b 32 cpi r24, 0x2B ; 43 - 5cc8: 61 f0 breq .+24 ; 0x5ce2 - 5cca: 28 f4 brcc .+10 ; 0x5cd6 - 5ccc: 80 32 cpi r24, 0x20 ; 32 - 5cce: 51 f0 breq .+20 ; 0x5ce4 - 5cd0: 83 32 cpi r24, 0x23 ; 35 - 5cd2: 71 f4 brne .+28 ; 0x5cf0 - 5cd4: 0b c0 rjmp .+22 ; 0x5cec - 5cd6: 8d 32 cpi r24, 0x2D ; 45 - 5cd8: 39 f0 breq .+14 ; 0x5ce8 - 5cda: 80 33 cpi r24, 0x30 ; 48 - 5cdc: 49 f4 brne .+18 ; 0x5cf0 - 5cde: 21 60 ori r18, 0x01 ; 1 - 5ce0: 28 c0 rjmp .+80 ; 0x5d32 - 5ce2: 22 60 ori r18, 0x02 ; 2 - 5ce4: 24 60 ori r18, 0x04 ; 4 - 5ce6: 25 c0 rjmp .+74 ; 0x5d32 - 5ce8: 28 60 ori r18, 0x08 ; 8 - 5cea: 23 c0 rjmp .+70 ; 0x5d32 - 5cec: 20 61 ori r18, 0x10 ; 16 - 5cee: 21 c0 rjmp .+66 ; 0x5d32 - 5cf0: 27 fd sbrc r18, 7 - 5cf2: 27 c0 rjmp .+78 ; 0x5d42 - 5cf4: 38 2f mov r19, r24 - 5cf6: 30 53 subi r19, 0x30 ; 48 - 5cf8: 3a 30 cpi r19, 0x0A ; 10 - 5cfa: 78 f4 brcc .+30 ; 0x5d1a - 5cfc: 26 ff sbrs r18, 6 - 5cfe: 06 c0 rjmp .+12 ; 0x5d0c - 5d00: fa e0 ldi r31, 0x0A ; 10 - 5d02: 5f 9e mul r5, r31 - 5d04: 30 0d add r19, r0 - 5d06: 11 24 eor r1, r1 - 5d08: 53 2e mov r5, r19 - 5d0a: 13 c0 rjmp .+38 ; 0x5d32 - 5d0c: 8a e0 ldi r24, 0x0A ; 10 - 5d0e: 38 9e mul r3, r24 - 5d10: 30 0d add r19, r0 - 5d12: 11 24 eor r1, r1 - 5d14: 33 2e mov r3, r19 - 5d16: 20 62 ori r18, 0x20 ; 32 - 5d18: 0c c0 rjmp .+24 ; 0x5d32 - 5d1a: 8e 32 cpi r24, 0x2E ; 46 - 5d1c: 21 f4 brne .+8 ; 0x5d26 - 5d1e: 26 fd sbrc r18, 6 - 5d20: 65 c1 rjmp .+714 ; 0x5fec - 5d22: 20 64 ori r18, 0x40 ; 64 - 5d24: 06 c0 rjmp .+12 ; 0x5d32 - 5d26: 8c 36 cpi r24, 0x6C ; 108 - 5d28: 11 f4 brne .+4 ; 0x5d2e - 5d2a: 20 68 ori r18, 0x80 ; 128 - 5d2c: 02 c0 rjmp .+4 ; 0x5d32 - 5d2e: 88 36 cpi r24, 0x68 ; 104 - 5d30: 41 f4 brne .+16 ; 0x5d42 - 5d32: f6 01 movw r30, r12 - 5d34: 93 fd sbrc r25, 3 - 5d36: 85 91 lpm r24, Z+ - 5d38: 93 ff sbrs r25, 3 - 5d3a: 81 91 ld r24, Z+ - 5d3c: 6f 01 movw r12, r30 - 5d3e: 81 11 cpse r24, r1 - 5d40: c0 cf rjmp .-128 ; 0x5cc2 - 5d42: 98 2f mov r25, r24 - 5d44: 95 54 subi r25, 0x45 ; 69 - 5d46: 93 30 cpi r25, 0x03 ; 3 - 5d48: 18 f0 brcs .+6 ; 0x5d50 - 5d4a: 90 52 subi r25, 0x20 ; 32 - 5d4c: 93 30 cpi r25, 0x03 ; 3 - 5d4e: 28 f4 brcc .+10 ; 0x5d5a - 5d50: 0c 5f subi r16, 0xFC ; 252 - 5d52: 1f 4f sbci r17, 0xFF ; 255 - 5d54: ff e3 ldi r31, 0x3F ; 63 - 5d56: f9 83 std Y+1, r31 ; 0x01 - 5d58: 0d c0 rjmp .+26 ; 0x5d74 - 5d5a: 83 36 cpi r24, 0x63 ; 99 - 5d5c: 31 f0 breq .+12 ; 0x5d6a - 5d5e: 83 37 cpi r24, 0x73 ; 115 - 5d60: 71 f0 breq .+28 ; 0x5d7e - 5d62: 83 35 cpi r24, 0x53 ; 83 - 5d64: 09 f0 breq .+2 ; 0x5d68 - 5d66: 5a c0 rjmp .+180 ; 0x5e1c - 5d68: 22 c0 rjmp .+68 ; 0x5dae - 5d6a: f8 01 movw r30, r16 - 5d6c: 80 81 ld r24, Z - 5d6e: 89 83 std Y+1, r24 ; 0x01 - 5d70: 0e 5f subi r16, 0xFE ; 254 - 5d72: 1f 4f sbci r17, 0xFF ; 255 - 5d74: 44 24 eor r4, r4 - 5d76: 43 94 inc r4 - 5d78: 51 2c mov r5, r1 - 5d7a: 54 01 movw r10, r8 - 5d7c: 14 c0 rjmp .+40 ; 0x5da6 - 5d7e: 38 01 movw r6, r16 - 5d80: f2 e0 ldi r31, 0x02 ; 2 - 5d82: 6f 0e add r6, r31 - 5d84: 71 1c adc r7, r1 - 5d86: f8 01 movw r30, r16 - 5d88: a0 80 ld r10, Z - 5d8a: b1 80 ldd r11, Z+1 ; 0x01 - 5d8c: 26 ff sbrs r18, 6 - 5d8e: 03 c0 rjmp .+6 ; 0x5d96 - 5d90: 65 2d mov r22, r5 - 5d92: 70 e0 ldi r23, 0x00 ; 0 - 5d94: 02 c0 rjmp .+4 ; 0x5d9a - 5d96: 6f ef ldi r22, 0xFF ; 255 - 5d98: 7f ef ldi r23, 0xFF ; 255 - 5d9a: c5 01 movw r24, r10 - 5d9c: 2c 87 std Y+12, r18 ; 0x0c - 5d9e: 72 d1 rcall .+740 ; 0x6084 - 5da0: 2c 01 movw r4, r24 - 5da2: 83 01 movw r16, r6 - 5da4: 2c 85 ldd r18, Y+12 ; 0x0c - 5da6: 6f e7 ldi r22, 0x7F ; 127 - 5da8: 26 2e mov r2, r22 - 5daa: 22 22 and r2, r18 - 5dac: 17 c0 rjmp .+46 ; 0x5ddc - 5dae: 38 01 movw r6, r16 - 5db0: f2 e0 ldi r31, 0x02 ; 2 - 5db2: 6f 0e add r6, r31 - 5db4: 71 1c adc r7, r1 - 5db6: f8 01 movw r30, r16 - 5db8: a0 80 ld r10, Z - 5dba: b1 80 ldd r11, Z+1 ; 0x01 - 5dbc: 26 ff sbrs r18, 6 - 5dbe: 03 c0 rjmp .+6 ; 0x5dc6 - 5dc0: 65 2d mov r22, r5 - 5dc2: 70 e0 ldi r23, 0x00 ; 0 - 5dc4: 02 c0 rjmp .+4 ; 0x5dca - 5dc6: 6f ef ldi r22, 0xFF ; 255 - 5dc8: 7f ef ldi r23, 0xFF ; 255 - 5dca: c5 01 movw r24, r10 - 5dcc: 2c 87 std Y+12, r18 ; 0x0c - 5dce: 4f d1 rcall .+670 ; 0x606e - 5dd0: 2c 01 movw r4, r24 - 5dd2: 2c 85 ldd r18, Y+12 ; 0x0c - 5dd4: 50 e8 ldi r21, 0x80 ; 128 - 5dd6: 25 2e mov r2, r21 - 5dd8: 22 2a or r2, r18 - 5dda: 83 01 movw r16, r6 - 5ddc: 23 fc sbrc r2, 3 - 5dde: 1a c0 rjmp .+52 ; 0x5e14 - 5de0: 05 c0 rjmp .+10 ; 0x5dec - 5de2: b7 01 movw r22, r14 - 5de4: 80 e2 ldi r24, 0x20 ; 32 - 5de6: 90 e0 ldi r25, 0x00 ; 0 - 5de8: 58 d1 rcall .+688 ; 0x609a - 5dea: 3a 94 dec r3 - 5dec: 83 2d mov r24, r3 - 5dee: 90 e0 ldi r25, 0x00 ; 0 - 5df0: 48 16 cp r4, r24 - 5df2: 59 06 cpc r5, r25 - 5df4: b0 f3 brcs .-20 ; 0x5de2 - 5df6: 0e c0 rjmp .+28 ; 0x5e14 - 5df8: f5 01 movw r30, r10 - 5dfa: 27 fc sbrc r2, 7 - 5dfc: 85 91 lpm r24, Z+ - 5dfe: 27 fe sbrs r2, 7 - 5e00: 81 91 ld r24, Z+ - 5e02: 5f 01 movw r10, r30 - 5e04: b7 01 movw r22, r14 - 5e06: 90 e0 ldi r25, 0x00 ; 0 - 5e08: 48 d1 rcall .+656 ; 0x609a - 5e0a: 31 10 cpse r3, r1 - 5e0c: 3a 94 dec r3 - 5e0e: f1 e0 ldi r31, 0x01 ; 1 - 5e10: 4f 1a sub r4, r31 - 5e12: 51 08 sbc r5, r1 - 5e14: 41 14 cp r4, r1 - 5e16: 51 04 cpc r5, r1 - 5e18: 79 f7 brne .-34 ; 0x5df8 - 5e1a: e5 c0 rjmp .+458 ; 0x5fe6 - 5e1c: 84 36 cpi r24, 0x64 ; 100 - 5e1e: 11 f0 breq .+4 ; 0x5e24 - 5e20: 89 36 cpi r24, 0x69 ; 105 - 5e22: 39 f5 brne .+78 ; 0x5e72 - 5e24: f8 01 movw r30, r16 - 5e26: 27 ff sbrs r18, 7 - 5e28: 07 c0 rjmp .+14 ; 0x5e38 - 5e2a: 60 81 ld r22, Z - 5e2c: 71 81 ldd r23, Z+1 ; 0x01 - 5e2e: 82 81 ldd r24, Z+2 ; 0x02 - 5e30: 93 81 ldd r25, Z+3 ; 0x03 - 5e32: 0c 5f subi r16, 0xFC ; 252 - 5e34: 1f 4f sbci r17, 0xFF ; 255 - 5e36: 08 c0 rjmp .+16 ; 0x5e48 - 5e38: 60 81 ld r22, Z - 5e3a: 71 81 ldd r23, Z+1 ; 0x01 - 5e3c: 88 27 eor r24, r24 - 5e3e: 77 fd sbrc r23, 7 - 5e40: 80 95 com r24 - 5e42: 98 2f mov r25, r24 - 5e44: 0e 5f subi r16, 0xFE ; 254 - 5e46: 1f 4f sbci r17, 0xFF ; 255 - 5e48: 4f e6 ldi r20, 0x6F ; 111 - 5e4a: b4 2e mov r11, r20 - 5e4c: b2 22 and r11, r18 - 5e4e: 97 ff sbrs r25, 7 - 5e50: 09 c0 rjmp .+18 ; 0x5e64 - 5e52: 90 95 com r25 - 5e54: 80 95 com r24 - 5e56: 70 95 com r23 - 5e58: 61 95 neg r22 - 5e5a: 7f 4f sbci r23, 0xFF ; 255 - 5e5c: 8f 4f sbci r24, 0xFF ; 255 - 5e5e: 9f 4f sbci r25, 0xFF ; 255 - 5e60: f0 e8 ldi r31, 0x80 ; 128 - 5e62: bf 2a or r11, r31 - 5e64: 2a e0 ldi r18, 0x0A ; 10 - 5e66: 30 e0 ldi r19, 0x00 ; 0 - 5e68: a4 01 movw r20, r8 - 5e6a: 43 d1 rcall .+646 ; 0x60f2 <__ultoa_invert> - 5e6c: a8 2e mov r10, r24 - 5e6e: a8 18 sub r10, r8 - 5e70: 42 c0 rjmp .+132 ; 0x5ef6 - 5e72: 85 37 cpi r24, 0x75 ; 117 - 5e74: 31 f4 brne .+12 ; 0x5e82 - 5e76: 3f ee ldi r19, 0xEF ; 239 - 5e78: b3 2e mov r11, r19 - 5e7a: b2 22 and r11, r18 - 5e7c: 2a e0 ldi r18, 0x0A ; 10 - 5e7e: 30 e0 ldi r19, 0x00 ; 0 - 5e80: 24 c0 rjmp .+72 ; 0x5eca - 5e82: 99 ef ldi r25, 0xF9 ; 249 - 5e84: b9 2e mov r11, r25 - 5e86: b2 22 and r11, r18 - 5e88: 8f 36 cpi r24, 0x6F ; 111 - 5e8a: b9 f0 breq .+46 ; 0x5eba - 5e8c: 20 f4 brcc .+8 ; 0x5e96 - 5e8e: 88 35 cpi r24, 0x58 ; 88 - 5e90: 09 f0 breq .+2 ; 0x5e94 - 5e92: ac c0 rjmp .+344 ; 0x5fec - 5e94: 0d c0 rjmp .+26 ; 0x5eb0 - 5e96: 80 37 cpi r24, 0x70 ; 112 - 5e98: 21 f0 breq .+8 ; 0x5ea2 - 5e9a: 88 37 cpi r24, 0x78 ; 120 - 5e9c: 09 f0 breq .+2 ; 0x5ea0 - 5e9e: a6 c0 rjmp .+332 ; 0x5fec - 5ea0: 02 c0 rjmp .+4 ; 0x5ea6 - 5ea2: 20 e1 ldi r18, 0x10 ; 16 - 5ea4: b2 2a or r11, r18 - 5ea6: b4 fe sbrs r11, 4 - 5ea8: 0b c0 rjmp .+22 ; 0x5ec0 - 5eaa: 84 e0 ldi r24, 0x04 ; 4 - 5eac: b8 2a or r11, r24 - 5eae: 08 c0 rjmp .+16 ; 0x5ec0 - 5eb0: 24 ff sbrs r18, 4 - 5eb2: 09 c0 rjmp .+18 ; 0x5ec6 - 5eb4: e6 e0 ldi r30, 0x06 ; 6 - 5eb6: be 2a or r11, r30 - 5eb8: 06 c0 rjmp .+12 ; 0x5ec6 - 5eba: 28 e0 ldi r18, 0x08 ; 8 - 5ebc: 30 e0 ldi r19, 0x00 ; 0 - 5ebe: 05 c0 rjmp .+10 ; 0x5eca - 5ec0: 20 e1 ldi r18, 0x10 ; 16 - 5ec2: 30 e0 ldi r19, 0x00 ; 0 - 5ec4: 02 c0 rjmp .+4 ; 0x5eca - 5ec6: 20 e1 ldi r18, 0x10 ; 16 - 5ec8: 32 e0 ldi r19, 0x02 ; 2 - 5eca: f8 01 movw r30, r16 - 5ecc: b7 fe sbrs r11, 7 - 5ece: 07 c0 rjmp .+14 ; 0x5ede - 5ed0: 60 81 ld r22, Z - 5ed2: 71 81 ldd r23, Z+1 ; 0x01 - 5ed4: 82 81 ldd r24, Z+2 ; 0x02 - 5ed6: 93 81 ldd r25, Z+3 ; 0x03 - 5ed8: 0c 5f subi r16, 0xFC ; 252 - 5eda: 1f 4f sbci r17, 0xFF ; 255 - 5edc: 06 c0 rjmp .+12 ; 0x5eea - 5ede: 60 81 ld r22, Z - 5ee0: 71 81 ldd r23, Z+1 ; 0x01 - 5ee2: 80 e0 ldi r24, 0x00 ; 0 - 5ee4: 90 e0 ldi r25, 0x00 ; 0 - 5ee6: 0e 5f subi r16, 0xFE ; 254 - 5ee8: 1f 4f sbci r17, 0xFF ; 255 - 5eea: a4 01 movw r20, r8 - 5eec: 02 d1 rcall .+516 ; 0x60f2 <__ultoa_invert> - 5eee: a8 2e mov r10, r24 - 5ef0: a8 18 sub r10, r8 - 5ef2: ff e7 ldi r31, 0x7F ; 127 - 5ef4: bf 22 and r11, r31 - 5ef6: b6 fe sbrs r11, 6 - 5ef8: 0b c0 rjmp .+22 ; 0x5f10 - 5efa: 2b 2d mov r18, r11 - 5efc: 2e 7f andi r18, 0xFE ; 254 - 5efe: a5 14 cp r10, r5 - 5f00: 50 f4 brcc .+20 ; 0x5f16 - 5f02: b4 fe sbrs r11, 4 - 5f04: 0a c0 rjmp .+20 ; 0x5f1a - 5f06: b2 fc sbrc r11, 2 - 5f08: 08 c0 rjmp .+16 ; 0x5f1a - 5f0a: 2b 2d mov r18, r11 - 5f0c: 2e 7e andi r18, 0xEE ; 238 - 5f0e: 05 c0 rjmp .+10 ; 0x5f1a - 5f10: 7a 2c mov r7, r10 - 5f12: 2b 2d mov r18, r11 - 5f14: 03 c0 rjmp .+6 ; 0x5f1c - 5f16: 7a 2c mov r7, r10 - 5f18: 01 c0 rjmp .+2 ; 0x5f1c - 5f1a: 75 2c mov r7, r5 - 5f1c: 24 ff sbrs r18, 4 - 5f1e: 0d c0 rjmp .+26 ; 0x5f3a - 5f20: fe 01 movw r30, r28 - 5f22: ea 0d add r30, r10 - 5f24: f1 1d adc r31, r1 - 5f26: 80 81 ld r24, Z - 5f28: 80 33 cpi r24, 0x30 ; 48 - 5f2a: 11 f4 brne .+4 ; 0x5f30 - 5f2c: 29 7e andi r18, 0xE9 ; 233 - 5f2e: 09 c0 rjmp .+18 ; 0x5f42 - 5f30: 22 ff sbrs r18, 2 - 5f32: 06 c0 rjmp .+12 ; 0x5f40 - 5f34: 73 94 inc r7 - 5f36: 73 94 inc r7 - 5f38: 04 c0 rjmp .+8 ; 0x5f42 - 5f3a: 82 2f mov r24, r18 - 5f3c: 86 78 andi r24, 0x86 ; 134 - 5f3e: 09 f0 breq .+2 ; 0x5f42 - 5f40: 73 94 inc r7 - 5f42: 23 fd sbrc r18, 3 - 5f44: 13 c0 rjmp .+38 ; 0x5f6c - 5f46: 20 ff sbrs r18, 0 - 5f48: 0e c0 rjmp .+28 ; 0x5f66 - 5f4a: 5a 2c mov r5, r10 - 5f4c: 73 14 cp r7, r3 - 5f4e: 58 f4 brcc .+22 ; 0x5f66 - 5f50: 53 0c add r5, r3 - 5f52: 57 18 sub r5, r7 - 5f54: 73 2c mov r7, r3 - 5f56: 07 c0 rjmp .+14 ; 0x5f66 - 5f58: b7 01 movw r22, r14 - 5f5a: 80 e2 ldi r24, 0x20 ; 32 - 5f5c: 90 e0 ldi r25, 0x00 ; 0 - 5f5e: 2c 87 std Y+12, r18 ; 0x0c - 5f60: 9c d0 rcall .+312 ; 0x609a - 5f62: 73 94 inc r7 - 5f64: 2c 85 ldd r18, Y+12 ; 0x0c - 5f66: 73 14 cp r7, r3 - 5f68: b8 f3 brcs .-18 ; 0x5f58 - 5f6a: 04 c0 rjmp .+8 ; 0x5f74 - 5f6c: 73 14 cp r7, r3 - 5f6e: 10 f4 brcc .+4 ; 0x5f74 - 5f70: 37 18 sub r3, r7 - 5f72: 01 c0 rjmp .+2 ; 0x5f76 - 5f74: 31 2c mov r3, r1 - 5f76: 24 ff sbrs r18, 4 - 5f78: 11 c0 rjmp .+34 ; 0x5f9c - 5f7a: b7 01 movw r22, r14 - 5f7c: 80 e3 ldi r24, 0x30 ; 48 - 5f7e: 90 e0 ldi r25, 0x00 ; 0 - 5f80: 2c 87 std Y+12, r18 ; 0x0c - 5f82: 8b d0 rcall .+278 ; 0x609a - 5f84: 2c 85 ldd r18, Y+12 ; 0x0c - 5f86: 22 ff sbrs r18, 2 - 5f88: 1c c0 rjmp .+56 ; 0x5fc2 - 5f8a: 21 ff sbrs r18, 1 - 5f8c: 03 c0 rjmp .+6 ; 0x5f94 - 5f8e: 88 e5 ldi r24, 0x58 ; 88 - 5f90: 90 e0 ldi r25, 0x00 ; 0 - 5f92: 02 c0 rjmp .+4 ; 0x5f98 - 5f94: 88 e7 ldi r24, 0x78 ; 120 - 5f96: 90 e0 ldi r25, 0x00 ; 0 - 5f98: b7 01 movw r22, r14 - 5f9a: 0c c0 rjmp .+24 ; 0x5fb4 - 5f9c: 82 2f mov r24, r18 - 5f9e: 86 78 andi r24, 0x86 ; 134 - 5fa0: 81 f0 breq .+32 ; 0x5fc2 - 5fa2: 21 fd sbrc r18, 1 - 5fa4: 02 c0 rjmp .+4 ; 0x5faa - 5fa6: 80 e2 ldi r24, 0x20 ; 32 - 5fa8: 01 c0 rjmp .+2 ; 0x5fac - 5faa: 8b e2 ldi r24, 0x2B ; 43 - 5fac: 27 fd sbrc r18, 7 - 5fae: 8d e2 ldi r24, 0x2D ; 45 - 5fb0: b7 01 movw r22, r14 - 5fb2: 90 e0 ldi r25, 0x00 ; 0 - 5fb4: 72 d0 rcall .+228 ; 0x609a - 5fb6: 05 c0 rjmp .+10 ; 0x5fc2 - 5fb8: b7 01 movw r22, r14 - 5fba: 80 e3 ldi r24, 0x30 ; 48 - 5fbc: 90 e0 ldi r25, 0x00 ; 0 - 5fbe: 6d d0 rcall .+218 ; 0x609a - 5fc0: 5a 94 dec r5 - 5fc2: a5 14 cp r10, r5 - 5fc4: c8 f3 brcs .-14 ; 0x5fb8 - 5fc6: aa 94 dec r10 - 5fc8: f4 01 movw r30, r8 - 5fca: ea 0d add r30, r10 - 5fcc: f1 1d adc r31, r1 - 5fce: b7 01 movw r22, r14 - 5fd0: 80 81 ld r24, Z - 5fd2: 90 e0 ldi r25, 0x00 ; 0 - 5fd4: 62 d0 rcall .+196 ; 0x609a - 5fd6: a1 10 cpse r10, r1 - 5fd8: f6 cf rjmp .-20 ; 0x5fc6 - 5fda: 05 c0 rjmp .+10 ; 0x5fe6 - 5fdc: b7 01 movw r22, r14 - 5fde: 80 e2 ldi r24, 0x20 ; 32 - 5fe0: 90 e0 ldi r25, 0x00 ; 0 - 5fe2: 5b d0 rcall .+182 ; 0x609a - 5fe4: 3a 94 dec r3 - 5fe6: 31 10 cpse r3, r1 - 5fe8: f9 cf rjmp .-14 ; 0x5fdc - 5fea: 50 ce rjmp .-864 ; 0x5c8c - 5fec: f7 01 movw r30, r14 - 5fee: 26 81 ldd r18, Z+6 ; 0x06 - 5ff0: 37 81 ldd r19, Z+7 ; 0x07 - 5ff2: 02 c0 rjmp .+4 ; 0x5ff8 - 5ff4: 2f ef ldi r18, 0xFF ; 255 - 5ff6: 3f ef ldi r19, 0xFF ; 255 - 5ff8: c9 01 movw r24, r18 - 5ffa: 2c 96 adiw r28, 0x0c ; 12 - 5ffc: e2 e1 ldi r30, 0x12 ; 18 - 5ffe: 0b c1 rjmp .+534 ; 0x6216 <__epilogue_restores__> +0000584e : + 584e: fb 01 movw r30, r22 + 5850: dc 01 movw r26, r24 + 5852: 02 c0 rjmp .+4 ; 0x5858 + 5854: 01 90 ld r0, Z+ + 5856: 0d 92 st X+, r0 + 5858: 41 50 subi r20, 0x01 ; 1 + 585a: 50 40 sbci r21, 0x00 ; 0 + 585c: d8 f7 brcc .-10 ; 0x5854 + 585e: 08 95 ret -00006000 <__eerd_block_x32a4u>: - 6000: e0 ec ldi r30, 0xC0 ; 192 - 6002: f1 e0 ldi r31, 0x01 ; 1 - 6004: a7 85 ldd r26, Z+15 ; 0x0f - 6006: a7 fd sbrc r26, 7 - 6008: fd cf rjmp .-6 ; 0x6004 <__eerd_block_x32a4u+0x4> - 600a: a4 85 ldd r26, Z+12 ; 0x0c - 600c: a8 60 ori r26, 0x08 ; 8 - 600e: a4 87 std Z+12, r26 ; 0x0c - 6010: 60 50 subi r22, 0x00 ; 0 - 6012: 70 4f sbci r23, 0xF0 ; 240 - 6014: f2 cd rjmp .-1052 ; 0x5bfa +00005860 : + 5860: dc 01 movw r26, r24 + 5862: 01 c0 rjmp .+2 ; 0x5866 + 5864: 6d 93 st X+, r22 + 5866: 41 50 subi r20, 0x01 ; 1 + 5868: 50 40 sbci r21, 0x00 ; 0 + 586a: e0 f7 brcc .-8 ; 0x5864 + 586c: 08 95 ret -00006016 <__eewr_block_x32a4u>: - 6016: dc 01 movw r26, r24 - 6018: cb 01 movw r24, r22 - 601a: 02 c0 rjmp .+4 ; 0x6020 <__eewr_block_x32a4u+0xa> - 601c: 2d 91 ld r18, X+ - 601e: 05 d0 rcall .+10 ; 0x602a <__eewr_r18_x32a4u> - 6020: 41 50 subi r20, 0x01 ; 1 - 6022: 50 40 sbci r21, 0x00 ; 0 - 6024: d8 f7 brcc .-10 ; 0x601c <__eewr_block_x32a4u+0x6> - 6026: 08 95 ret +0000586e : + 586e: ae e0 ldi r26, 0x0E ; 14 + 5870: b0 e0 ldi r27, 0x00 ; 0 + 5872: ec e3 ldi r30, 0x3C ; 60 + 5874: fc e2 ldi r31, 0x2C ; 44 + 5876: f2 c2 rjmp .+1508 ; 0x5e5c <__prologue_saves__+0x1c> + 5878: 0d 89 ldd r16, Y+21 ; 0x15 + 587a: 1e 89 ldd r17, Y+22 ; 0x16 + 587c: 8f 89 ldd r24, Y+23 ; 0x17 + 587e: 98 8d ldd r25, Y+24 ; 0x18 + 5880: 2e e0 ldi r18, 0x0E ; 14 + 5882: 2c 83 std Y+4, r18 ; 0x04 + 5884: 09 83 std Y+1, r16 ; 0x01 + 5886: 1a 83 std Y+2, r17 ; 0x02 + 5888: 97 ff sbrs r25, 7 + 588a: 02 c0 rjmp .+4 ; 0x5890 + 588c: 80 e0 ldi r24, 0x00 ; 0 + 588e: 90 e8 ldi r25, 0x80 ; 128 + 5890: 01 97 sbiw r24, 0x01 ; 1 + 5892: 8d 83 std Y+5, r24 ; 0x05 + 5894: 9e 83 std Y+6, r25 ; 0x06 + 5896: ae 01 movw r20, r28 + 5898: 45 5e subi r20, 0xE5 ; 229 + 589a: 5f 4f sbci r21, 0xFF ; 255 + 589c: 69 8d ldd r22, Y+25 ; 0x19 + 589e: 7a 8d ldd r23, Y+26 ; 0x1a + 58a0: ce 01 movw r24, r28 + 58a2: 01 96 adiw r24, 0x01 ; 1 + 58a4: 11 d0 rcall .+34 ; 0x58c8 + 58a6: 4d 81 ldd r20, Y+5 ; 0x05 + 58a8: 5e 81 ldd r21, Y+6 ; 0x06 + 58aa: 57 fd sbrc r21, 7 + 58ac: 0a c0 rjmp .+20 ; 0x58c2 + 58ae: 2f 81 ldd r18, Y+7 ; 0x07 + 58b0: 38 85 ldd r19, Y+8 ; 0x08 + 58b2: 42 17 cp r20, r18 + 58b4: 53 07 cpc r21, r19 + 58b6: 0c f4 brge .+2 ; 0x58ba + 58b8: 9a 01 movw r18, r20 + 58ba: f8 01 movw r30, r16 + 58bc: e2 0f add r30, r18 + 58be: f3 1f adc r31, r19 + 58c0: 10 82 st Z, r1 + 58c2: 2e 96 adiw r28, 0x0e ; 14 + 58c4: e4 e0 ldi r30, 0x04 ; 4 + 58c6: e3 c2 rjmp .+1478 ; 0x5e8e <__epilogue_restores__+0x1c> -00006028 <__eewr_byte_x32a4u>: - 6028: 26 2f mov r18, r22 +000058c8 : + 58c8: ac e0 ldi r26, 0x0C ; 12 + 58ca: b0 e0 ldi r27, 0x00 ; 0 + 58cc: e9 e6 ldi r30, 0x69 ; 105 + 58ce: fc e2 ldi r31, 0x2C ; 44 + 58d0: b7 c2 rjmp .+1390 ; 0x5e40 <__prologue_saves__> + 58d2: 7c 01 movw r14, r24 + 58d4: 6b 01 movw r12, r22 + 58d6: 8a 01 movw r16, r20 + 58d8: fc 01 movw r30, r24 + 58da: 16 82 std Z+6, r1 ; 0x06 + 58dc: 17 82 std Z+7, r1 ; 0x07 + 58de: 83 81 ldd r24, Z+3 ; 0x03 + 58e0: 81 ff sbrs r24, 1 + 58e2: b0 c1 rjmp .+864 ; 0x5c44 + 58e4: ce 01 movw r24, r28 + 58e6: 01 96 adiw r24, 0x01 ; 1 + 58e8: 4c 01 movw r8, r24 + 58ea: f7 01 movw r30, r14 + 58ec: 93 81 ldd r25, Z+3 ; 0x03 + 58ee: f6 01 movw r30, r12 + 58f0: 93 fd sbrc r25, 3 + 58f2: 85 91 lpm r24, Z+ + 58f4: 93 ff sbrs r25, 3 + 58f6: 81 91 ld r24, Z+ + 58f8: 6f 01 movw r12, r30 + 58fa: 88 23 and r24, r24 + 58fc: 09 f4 brne .+2 ; 0x5900 + 58fe: 9e c1 rjmp .+828 ; 0x5c3c + 5900: 85 32 cpi r24, 0x25 ; 37 + 5902: 39 f4 brne .+14 ; 0x5912 + 5904: 93 fd sbrc r25, 3 + 5906: 85 91 lpm r24, Z+ + 5908: 93 ff sbrs r25, 3 + 590a: 81 91 ld r24, Z+ + 590c: 6f 01 movw r12, r30 + 590e: 85 32 cpi r24, 0x25 ; 37 + 5910: 21 f4 brne .+8 ; 0x591a + 5912: b7 01 movw r22, r14 + 5914: 90 e0 ldi r25, 0x00 ; 0 + 5916: e8 d1 rcall .+976 ; 0x5ce8 + 5918: e8 cf rjmp .-48 ; 0x58ea + 591a: 51 2c mov r5, r1 + 591c: 31 2c mov r3, r1 + 591e: 20 e0 ldi r18, 0x00 ; 0 + 5920: 20 32 cpi r18, 0x20 ; 32 + 5922: a0 f4 brcc .+40 ; 0x594c + 5924: 8b 32 cpi r24, 0x2B ; 43 + 5926: 69 f0 breq .+26 ; 0x5942 + 5928: 30 f4 brcc .+12 ; 0x5936 + 592a: 80 32 cpi r24, 0x20 ; 32 + 592c: 59 f0 breq .+22 ; 0x5944 + 592e: 83 32 cpi r24, 0x23 ; 35 + 5930: 69 f4 brne .+26 ; 0x594c + 5932: 20 61 ori r18, 0x10 ; 16 + 5934: 2c c0 rjmp .+88 ; 0x598e + 5936: 8d 32 cpi r24, 0x2D ; 45 + 5938: 39 f0 breq .+14 ; 0x5948 + 593a: 80 33 cpi r24, 0x30 ; 48 + 593c: 39 f4 brne .+14 ; 0x594c + 593e: 21 60 ori r18, 0x01 ; 1 + 5940: 26 c0 rjmp .+76 ; 0x598e + 5942: 22 60 ori r18, 0x02 ; 2 + 5944: 24 60 ori r18, 0x04 ; 4 + 5946: 23 c0 rjmp .+70 ; 0x598e + 5948: 28 60 ori r18, 0x08 ; 8 + 594a: 21 c0 rjmp .+66 ; 0x598e + 594c: 27 fd sbrc r18, 7 + 594e: 27 c0 rjmp .+78 ; 0x599e + 5950: 30 ed ldi r19, 0xD0 ; 208 + 5952: 38 0f add r19, r24 + 5954: 3a 30 cpi r19, 0x0A ; 10 + 5956: 78 f4 brcc .+30 ; 0x5976 + 5958: 26 ff sbrs r18, 6 + 595a: 06 c0 rjmp .+12 ; 0x5968 + 595c: fa e0 ldi r31, 0x0A ; 10 + 595e: 5f 9e mul r5, r31 + 5960: 30 0d add r19, r0 + 5962: 11 24 eor r1, r1 + 5964: 53 2e mov r5, r19 + 5966: 13 c0 rjmp .+38 ; 0x598e + 5968: 8a e0 ldi r24, 0x0A ; 10 + 596a: 38 9e mul r3, r24 + 596c: 30 0d add r19, r0 + 596e: 11 24 eor r1, r1 + 5970: 33 2e mov r3, r19 + 5972: 20 62 ori r18, 0x20 ; 32 + 5974: 0c c0 rjmp .+24 ; 0x598e + 5976: 8e 32 cpi r24, 0x2E ; 46 + 5978: 21 f4 brne .+8 ; 0x5982 + 597a: 26 fd sbrc r18, 6 + 597c: 5f c1 rjmp .+702 ; 0x5c3c + 597e: 20 64 ori r18, 0x40 ; 64 + 5980: 06 c0 rjmp .+12 ; 0x598e + 5982: 8c 36 cpi r24, 0x6C ; 108 + 5984: 11 f4 brne .+4 ; 0x598a + 5986: 20 68 ori r18, 0x80 ; 128 + 5988: 02 c0 rjmp .+4 ; 0x598e + 598a: 88 36 cpi r24, 0x68 ; 104 + 598c: 41 f4 brne .+16 ; 0x599e + 598e: f6 01 movw r30, r12 + 5990: 93 fd sbrc r25, 3 + 5992: 85 91 lpm r24, Z+ + 5994: 93 ff sbrs r25, 3 + 5996: 81 91 ld r24, Z+ + 5998: 6f 01 movw r12, r30 + 599a: 81 11 cpse r24, r1 + 599c: c1 cf rjmp .-126 ; 0x5920 + 599e: 98 2f mov r25, r24 + 59a0: 9f 7d andi r25, 0xDF ; 223 + 59a2: 95 54 subi r25, 0x45 ; 69 + 59a4: 93 30 cpi r25, 0x03 ; 3 + 59a6: 28 f4 brcc .+10 ; 0x59b2 + 59a8: 0c 5f subi r16, 0xFC ; 252 + 59aa: 1f 4f sbci r17, 0xFF ; 255 + 59ac: ff e3 ldi r31, 0x3F ; 63 + 59ae: f9 83 std Y+1, r31 ; 0x01 + 59b0: 0d c0 rjmp .+26 ; 0x59cc + 59b2: 83 36 cpi r24, 0x63 ; 99 + 59b4: 31 f0 breq .+12 ; 0x59c2 + 59b6: 83 37 cpi r24, 0x73 ; 115 + 59b8: 71 f0 breq .+28 ; 0x59d6 + 59ba: 83 35 cpi r24, 0x53 ; 83 + 59bc: 09 f0 breq .+2 ; 0x59c0 + 59be: 57 c0 rjmp .+174 ; 0x5a6e + 59c0: 21 c0 rjmp .+66 ; 0x5a04 + 59c2: f8 01 movw r30, r16 + 59c4: 80 81 ld r24, Z + 59c6: 89 83 std Y+1, r24 ; 0x01 + 59c8: 0e 5f subi r16, 0xFE ; 254 + 59ca: 1f 4f sbci r17, 0xFF ; 255 + 59cc: 44 24 eor r4, r4 + 59ce: 43 94 inc r4 + 59d0: 51 2c mov r5, r1 + 59d2: 54 01 movw r10, r8 + 59d4: 14 c0 rjmp .+40 ; 0x59fe + 59d6: 38 01 movw r6, r16 + 59d8: f2 e0 ldi r31, 0x02 ; 2 + 59da: 6f 0e add r6, r31 + 59dc: 71 1c adc r7, r1 + 59de: f8 01 movw r30, r16 + 59e0: a0 80 ld r10, Z + 59e2: b1 80 ldd r11, Z+1 ; 0x01 + 59e4: 26 ff sbrs r18, 6 + 59e6: 03 c0 rjmp .+6 ; 0x59ee + 59e8: 65 2d mov r22, r5 + 59ea: 70 e0 ldi r23, 0x00 ; 0 + 59ec: 02 c0 rjmp .+4 ; 0x59f2 + 59ee: 6f ef ldi r22, 0xFF ; 255 + 59f0: 7f ef ldi r23, 0xFF ; 255 + 59f2: c5 01 movw r24, r10 + 59f4: 2c 87 std Y+12, r18 ; 0x0c + 59f6: 6d d1 rcall .+730 ; 0x5cd2 + 59f8: 2c 01 movw r4, r24 + 59fa: 83 01 movw r16, r6 + 59fc: 2c 85 ldd r18, Y+12 ; 0x0c + 59fe: 2f 77 andi r18, 0x7F ; 127 + 5a00: 22 2e mov r2, r18 + 5a02: 16 c0 rjmp .+44 ; 0x5a30 + 5a04: 38 01 movw r6, r16 + 5a06: f2 e0 ldi r31, 0x02 ; 2 + 5a08: 6f 0e add r6, r31 + 5a0a: 71 1c adc r7, r1 + 5a0c: f8 01 movw r30, r16 + 5a0e: a0 80 ld r10, Z + 5a10: b1 80 ldd r11, Z+1 ; 0x01 + 5a12: 26 ff sbrs r18, 6 + 5a14: 03 c0 rjmp .+6 ; 0x5a1c + 5a16: 65 2d mov r22, r5 + 5a18: 70 e0 ldi r23, 0x00 ; 0 + 5a1a: 02 c0 rjmp .+4 ; 0x5a20 + 5a1c: 6f ef ldi r22, 0xFF ; 255 + 5a1e: 7f ef ldi r23, 0xFF ; 255 + 5a20: c5 01 movw r24, r10 + 5a22: 2c 87 std Y+12, r18 ; 0x0c + 5a24: 4b d1 rcall .+662 ; 0x5cbc + 5a26: 2c 01 movw r4, r24 + 5a28: 2c 85 ldd r18, Y+12 ; 0x0c + 5a2a: 20 68 ori r18, 0x80 ; 128 + 5a2c: 22 2e mov r2, r18 + 5a2e: 83 01 movw r16, r6 + 5a30: 23 fc sbrc r2, 3 + 5a32: 19 c0 rjmp .+50 ; 0x5a66 + 5a34: 83 2d mov r24, r3 + 5a36: 90 e0 ldi r25, 0x00 ; 0 + 5a38: 48 16 cp r4, r24 + 5a3a: 59 06 cpc r5, r25 + 5a3c: a0 f4 brcc .+40 ; 0x5a66 + 5a3e: b7 01 movw r22, r14 + 5a40: 80 e2 ldi r24, 0x20 ; 32 + 5a42: 90 e0 ldi r25, 0x00 ; 0 + 5a44: 51 d1 rcall .+674 ; 0x5ce8 + 5a46: 3a 94 dec r3 + 5a48: f5 cf rjmp .-22 ; 0x5a34 + 5a4a: f5 01 movw r30, r10 + 5a4c: 27 fc sbrc r2, 7 + 5a4e: 85 91 lpm r24, Z+ + 5a50: 27 fe sbrs r2, 7 + 5a52: 81 91 ld r24, Z+ + 5a54: 5f 01 movw r10, r30 + 5a56: b7 01 movw r22, r14 + 5a58: 90 e0 ldi r25, 0x00 ; 0 + 5a5a: 46 d1 rcall .+652 ; 0x5ce8 + 5a5c: 31 10 cpse r3, r1 + 5a5e: 3a 94 dec r3 + 5a60: f1 e0 ldi r31, 0x01 ; 1 + 5a62: 4f 1a sub r4, r31 + 5a64: 51 08 sbc r5, r1 + 5a66: 41 14 cp r4, r1 + 5a68: 51 04 cpc r5, r1 + 5a6a: 79 f7 brne .-34 ; 0x5a4a + 5a6c: de c0 rjmp .+444 ; 0x5c2a + 5a6e: 84 36 cpi r24, 0x64 ; 100 + 5a70: 11 f0 breq .+4 ; 0x5a76 + 5a72: 89 36 cpi r24, 0x69 ; 105 + 5a74: 31 f5 brne .+76 ; 0x5ac2 + 5a76: f8 01 movw r30, r16 + 5a78: 27 ff sbrs r18, 7 + 5a7a: 07 c0 rjmp .+14 ; 0x5a8a + 5a7c: 60 81 ld r22, Z + 5a7e: 71 81 ldd r23, Z+1 ; 0x01 + 5a80: 82 81 ldd r24, Z+2 ; 0x02 + 5a82: 93 81 ldd r25, Z+3 ; 0x03 + 5a84: 0c 5f subi r16, 0xFC ; 252 + 5a86: 1f 4f sbci r17, 0xFF ; 255 + 5a88: 08 c0 rjmp .+16 ; 0x5a9a + 5a8a: 60 81 ld r22, Z + 5a8c: 71 81 ldd r23, Z+1 ; 0x01 + 5a8e: 88 27 eor r24, r24 + 5a90: 77 fd sbrc r23, 7 + 5a92: 80 95 com r24 + 5a94: 98 2f mov r25, r24 + 5a96: 0e 5f subi r16, 0xFE ; 254 + 5a98: 1f 4f sbci r17, 0xFF ; 255 + 5a9a: 2f 76 andi r18, 0x6F ; 111 + 5a9c: b2 2e mov r11, r18 + 5a9e: 97 ff sbrs r25, 7 + 5aa0: 09 c0 rjmp .+18 ; 0x5ab4 + 5aa2: 90 95 com r25 + 5aa4: 80 95 com r24 + 5aa6: 70 95 com r23 + 5aa8: 61 95 neg r22 + 5aaa: 7f 4f sbci r23, 0xFF ; 255 + 5aac: 8f 4f sbci r24, 0xFF ; 255 + 5aae: 9f 4f sbci r25, 0xFF ; 255 + 5ab0: 20 68 ori r18, 0x80 ; 128 + 5ab2: b2 2e mov r11, r18 + 5ab4: 2a e0 ldi r18, 0x0A ; 10 + 5ab6: 30 e0 ldi r19, 0x00 ; 0 + 5ab8: a4 01 movw r20, r8 + 5aba: 48 d1 rcall .+656 ; 0x5d4c <__ultoa_invert> + 5abc: a8 2e mov r10, r24 + 5abe: a8 18 sub r10, r8 + 5ac0: 43 c0 rjmp .+134 ; 0x5b48 + 5ac2: 85 37 cpi r24, 0x75 ; 117 + 5ac4: 29 f4 brne .+10 ; 0x5ad0 + 5ac6: 2f 7e andi r18, 0xEF ; 239 + 5ac8: b2 2e mov r11, r18 + 5aca: 2a e0 ldi r18, 0x0A ; 10 + 5acc: 30 e0 ldi r19, 0x00 ; 0 + 5ace: 25 c0 rjmp .+74 ; 0x5b1a + 5ad0: f2 2f mov r31, r18 + 5ad2: f9 7f andi r31, 0xF9 ; 249 + 5ad4: bf 2e mov r11, r31 + 5ad6: 8f 36 cpi r24, 0x6F ; 111 + 5ad8: c1 f0 breq .+48 ; 0x5b0a + 5ada: 18 f4 brcc .+6 ; 0x5ae2 + 5adc: 88 35 cpi r24, 0x58 ; 88 + 5ade: 79 f0 breq .+30 ; 0x5afe + 5ae0: ad c0 rjmp .+346 ; 0x5c3c + 5ae2: 80 37 cpi r24, 0x70 ; 112 + 5ae4: 19 f0 breq .+6 ; 0x5aec + 5ae6: 88 37 cpi r24, 0x78 ; 120 + 5ae8: 21 f0 breq .+8 ; 0x5af2 + 5aea: a8 c0 rjmp .+336 ; 0x5c3c + 5aec: 2f 2f mov r18, r31 + 5aee: 20 61 ori r18, 0x10 ; 16 + 5af0: b2 2e mov r11, r18 + 5af2: b4 fe sbrs r11, 4 + 5af4: 0d c0 rjmp .+26 ; 0x5b10 + 5af6: 8b 2d mov r24, r11 + 5af8: 84 60 ori r24, 0x04 ; 4 + 5afa: b8 2e mov r11, r24 + 5afc: 09 c0 rjmp .+18 ; 0x5b10 + 5afe: 24 ff sbrs r18, 4 + 5b00: 0a c0 rjmp .+20 ; 0x5b16 + 5b02: 9f 2f mov r25, r31 + 5b04: 96 60 ori r25, 0x06 ; 6 + 5b06: b9 2e mov r11, r25 + 5b08: 06 c0 rjmp .+12 ; 0x5b16 + 5b0a: 28 e0 ldi r18, 0x08 ; 8 + 5b0c: 30 e0 ldi r19, 0x00 ; 0 + 5b0e: 05 c0 rjmp .+10 ; 0x5b1a + 5b10: 20 e1 ldi r18, 0x10 ; 16 + 5b12: 30 e0 ldi r19, 0x00 ; 0 + 5b14: 02 c0 rjmp .+4 ; 0x5b1a + 5b16: 20 e1 ldi r18, 0x10 ; 16 + 5b18: 32 e0 ldi r19, 0x02 ; 2 + 5b1a: f8 01 movw r30, r16 + 5b1c: b7 fe sbrs r11, 7 + 5b1e: 07 c0 rjmp .+14 ; 0x5b2e + 5b20: 60 81 ld r22, Z + 5b22: 71 81 ldd r23, Z+1 ; 0x01 + 5b24: 82 81 ldd r24, Z+2 ; 0x02 + 5b26: 93 81 ldd r25, Z+3 ; 0x03 + 5b28: 0c 5f subi r16, 0xFC ; 252 + 5b2a: 1f 4f sbci r17, 0xFF ; 255 + 5b2c: 06 c0 rjmp .+12 ; 0x5b3a + 5b2e: 60 81 ld r22, Z + 5b30: 71 81 ldd r23, Z+1 ; 0x01 + 5b32: 80 e0 ldi r24, 0x00 ; 0 + 5b34: 90 e0 ldi r25, 0x00 ; 0 + 5b36: 0e 5f subi r16, 0xFE ; 254 + 5b38: 1f 4f sbci r17, 0xFF ; 255 + 5b3a: a4 01 movw r20, r8 + 5b3c: 07 d1 rcall .+526 ; 0x5d4c <__ultoa_invert> + 5b3e: a8 2e mov r10, r24 + 5b40: a8 18 sub r10, r8 + 5b42: fb 2d mov r31, r11 + 5b44: ff 77 andi r31, 0x7F ; 127 + 5b46: bf 2e mov r11, r31 + 5b48: b6 fe sbrs r11, 6 + 5b4a: 0b c0 rjmp .+22 ; 0x5b62 + 5b4c: 2b 2d mov r18, r11 + 5b4e: 2e 7f andi r18, 0xFE ; 254 + 5b50: a5 14 cp r10, r5 + 5b52: 50 f4 brcc .+20 ; 0x5b68 + 5b54: b4 fe sbrs r11, 4 + 5b56: 0a c0 rjmp .+20 ; 0x5b6c + 5b58: b2 fc sbrc r11, 2 + 5b5a: 08 c0 rjmp .+16 ; 0x5b6c + 5b5c: 2b 2d mov r18, r11 + 5b5e: 2e 7e andi r18, 0xEE ; 238 + 5b60: 05 c0 rjmp .+10 ; 0x5b6c + 5b62: 7a 2c mov r7, r10 + 5b64: 2b 2d mov r18, r11 + 5b66: 03 c0 rjmp .+6 ; 0x5b6e + 5b68: 7a 2c mov r7, r10 + 5b6a: 01 c0 rjmp .+2 ; 0x5b6e + 5b6c: 75 2c mov r7, r5 + 5b6e: 24 ff sbrs r18, 4 + 5b70: 0d c0 rjmp .+26 ; 0x5b8c + 5b72: fe 01 movw r30, r28 + 5b74: ea 0d add r30, r10 + 5b76: f1 1d adc r31, r1 + 5b78: 80 81 ld r24, Z + 5b7a: 80 33 cpi r24, 0x30 ; 48 + 5b7c: 11 f4 brne .+4 ; 0x5b82 + 5b7e: 29 7e andi r18, 0xE9 ; 233 + 5b80: 09 c0 rjmp .+18 ; 0x5b94 + 5b82: 22 ff sbrs r18, 2 + 5b84: 06 c0 rjmp .+12 ; 0x5b92 + 5b86: 73 94 inc r7 + 5b88: 73 94 inc r7 + 5b8a: 04 c0 rjmp .+8 ; 0x5b94 + 5b8c: 82 2f mov r24, r18 + 5b8e: 86 78 andi r24, 0x86 ; 134 + 5b90: 09 f0 breq .+2 ; 0x5b94 + 5b92: 73 94 inc r7 + 5b94: 23 fd sbrc r18, 3 + 5b96: 12 c0 rjmp .+36 ; 0x5bbc + 5b98: 20 ff sbrs r18, 0 + 5b9a: 06 c0 rjmp .+12 ; 0x5ba8 + 5b9c: 5a 2c mov r5, r10 + 5b9e: 73 14 cp r7, r3 + 5ba0: 18 f4 brcc .+6 ; 0x5ba8 + 5ba2: 53 0c add r5, r3 + 5ba4: 57 18 sub r5, r7 + 5ba6: 73 2c mov r7, r3 + 5ba8: 73 14 cp r7, r3 + 5baa: 60 f4 brcc .+24 ; 0x5bc4 + 5bac: b7 01 movw r22, r14 + 5bae: 80 e2 ldi r24, 0x20 ; 32 + 5bb0: 90 e0 ldi r25, 0x00 ; 0 + 5bb2: 2c 87 std Y+12, r18 ; 0x0c + 5bb4: 99 d0 rcall .+306 ; 0x5ce8 + 5bb6: 73 94 inc r7 + 5bb8: 2c 85 ldd r18, Y+12 ; 0x0c + 5bba: f6 cf rjmp .-20 ; 0x5ba8 + 5bbc: 73 14 cp r7, r3 + 5bbe: 10 f4 brcc .+4 ; 0x5bc4 + 5bc0: 37 18 sub r3, r7 + 5bc2: 01 c0 rjmp .+2 ; 0x5bc6 + 5bc4: 31 2c mov r3, r1 + 5bc6: 24 ff sbrs r18, 4 + 5bc8: 11 c0 rjmp .+34 ; 0x5bec + 5bca: b7 01 movw r22, r14 + 5bcc: 80 e3 ldi r24, 0x30 ; 48 + 5bce: 90 e0 ldi r25, 0x00 ; 0 + 5bd0: 2c 87 std Y+12, r18 ; 0x0c + 5bd2: 8a d0 rcall .+276 ; 0x5ce8 + 5bd4: 2c 85 ldd r18, Y+12 ; 0x0c + 5bd6: 22 ff sbrs r18, 2 + 5bd8: 16 c0 rjmp .+44 ; 0x5c06 + 5bda: 21 ff sbrs r18, 1 + 5bdc: 03 c0 rjmp .+6 ; 0x5be4 + 5bde: 88 e5 ldi r24, 0x58 ; 88 + 5be0: 90 e0 ldi r25, 0x00 ; 0 + 5be2: 02 c0 rjmp .+4 ; 0x5be8 + 5be4: 88 e7 ldi r24, 0x78 ; 120 + 5be6: 90 e0 ldi r25, 0x00 ; 0 + 5be8: b7 01 movw r22, r14 + 5bea: 0c c0 rjmp .+24 ; 0x5c04 + 5bec: 82 2f mov r24, r18 + 5bee: 86 78 andi r24, 0x86 ; 134 + 5bf0: 51 f0 breq .+20 ; 0x5c06 + 5bf2: 21 fd sbrc r18, 1 + 5bf4: 02 c0 rjmp .+4 ; 0x5bfa + 5bf6: 80 e2 ldi r24, 0x20 ; 32 + 5bf8: 01 c0 rjmp .+2 ; 0x5bfc + 5bfa: 8b e2 ldi r24, 0x2B ; 43 + 5bfc: 27 fd sbrc r18, 7 + 5bfe: 8d e2 ldi r24, 0x2D ; 45 + 5c00: b7 01 movw r22, r14 + 5c02: 90 e0 ldi r25, 0x00 ; 0 + 5c04: 71 d0 rcall .+226 ; 0x5ce8 + 5c06: a5 14 cp r10, r5 + 5c08: 30 f4 brcc .+12 ; 0x5c16 + 5c0a: b7 01 movw r22, r14 + 5c0c: 80 e3 ldi r24, 0x30 ; 48 + 5c0e: 90 e0 ldi r25, 0x00 ; 0 + 5c10: 6b d0 rcall .+214 ; 0x5ce8 + 5c12: 5a 94 dec r5 + 5c14: f8 cf rjmp .-16 ; 0x5c06 + 5c16: aa 94 dec r10 + 5c18: f4 01 movw r30, r8 + 5c1a: ea 0d add r30, r10 + 5c1c: f1 1d adc r31, r1 + 5c1e: 80 81 ld r24, Z + 5c20: b7 01 movw r22, r14 + 5c22: 90 e0 ldi r25, 0x00 ; 0 + 5c24: 61 d0 rcall .+194 ; 0x5ce8 + 5c26: a1 10 cpse r10, r1 + 5c28: f6 cf rjmp .-20 ; 0x5c16 + 5c2a: 33 20 and r3, r3 + 5c2c: 09 f4 brne .+2 ; 0x5c30 + 5c2e: 5d ce rjmp .-838 ; 0x58ea + 5c30: b7 01 movw r22, r14 + 5c32: 80 e2 ldi r24, 0x20 ; 32 + 5c34: 90 e0 ldi r25, 0x00 ; 0 + 5c36: 58 d0 rcall .+176 ; 0x5ce8 + 5c38: 3a 94 dec r3 + 5c3a: f7 cf rjmp .-18 ; 0x5c2a + 5c3c: f7 01 movw r30, r14 + 5c3e: 86 81 ldd r24, Z+6 ; 0x06 + 5c40: 97 81 ldd r25, Z+7 ; 0x07 + 5c42: 02 c0 rjmp .+4 ; 0x5c48 + 5c44: 8f ef ldi r24, 0xFF ; 255 + 5c46: 9f ef ldi r25, 0xFF ; 255 + 5c48: 2c 96 adiw r28, 0x0c ; 12 + 5c4a: e2 e1 ldi r30, 0x12 ; 18 + 5c4c: 12 c1 rjmp .+548 ; 0x5e72 <__epilogue_restores__> -0000602a <__eewr_r18_x32a4u>: - 602a: e0 ec ldi r30, 0xC0 ; 192 - 602c: f1 e0 ldi r31, 0x01 ; 1 - 602e: 37 85 ldd r19, Z+15 ; 0x0f - 6030: 37 fd sbrc r19, 7 - 6032: fd cf rjmp .-6 ; 0x602e <__eewr_r18_x32a4u+0x4> - 6034: 34 85 ldd r19, Z+12 ; 0x0c - 6036: 37 7f andi r19, 0xF7 ; 247 - 6038: 34 87 std Z+12, r19 ; 0x0c - 603a: 37 85 ldd r19, Z+15 ; 0x0f - 603c: 31 ff sbrs r19, 1 - 603e: 09 c0 rjmp .+18 ; 0x6052 <__eewr_r18_x32a4u+0x28> - 6040: 36 e3 ldi r19, 0x36 ; 54 - 6042: 32 87 std Z+10, r19 ; 0x0a - 6044: 38 ed ldi r19, 0xD8 ; 216 - 6046: 34 bf out 0x34, r19 ; 52 - 6048: 31 e0 ldi r19, 0x01 ; 1 - 604a: 33 87 std Z+11, r19 ; 0x0b - 604c: 37 85 ldd r19, Z+15 ; 0x0f - 604e: 37 fd sbrc r19, 7 - 6050: fd cf rjmp .-6 ; 0x604c <__eewr_r18_x32a4u+0x22> - 6052: 33 e3 ldi r19, 0x33 ; 51 - 6054: 32 87 std Z+10, r19 ; 0x0a - 6056: 80 83 st Z, r24 - 6058: 91 83 std Z+1, r25 ; 0x01 - 605a: 12 82 std Z+2, r1 ; 0x02 - 605c: 24 83 std Z+4, r18 ; 0x04 - 605e: 25 e3 ldi r18, 0x35 ; 53 - 6060: 22 87 std Z+10, r18 ; 0x0a - 6062: 28 ed ldi r18, 0xD8 ; 216 - 6064: 31 e0 ldi r19, 0x01 ; 1 - 6066: 24 bf out 0x34, r18 ; 52 - 6068: 33 87 std Z+11, r19 ; 0x0b - 606a: 01 96 adiw r24, 0x01 ; 1 - 606c: 08 95 ret +00005c4e <__eerd_block_x32a4u>: + 5c4e: e0 ec ldi r30, 0xC0 ; 192 + 5c50: f1 e0 ldi r31, 0x01 ; 1 + 5c52: a7 85 ldd r26, Z+15 ; 0x0f + 5c54: a7 fd sbrc r26, 7 + 5c56: fd cf rjmp .-6 ; 0x5c52 <__eerd_block_x32a4u+0x4> + 5c58: a4 85 ldd r26, Z+12 ; 0x0c + 5c5a: a8 60 ori r26, 0x08 ; 8 + 5c5c: a4 87 std Z+12, r26 ; 0x0c + 5c5e: 60 50 subi r22, 0x00 ; 0 + 5c60: 70 4f sbci r23, 0xF0 ; 240 + 5c62: f5 cd rjmp .-1046 ; 0x584e -0000606e : - 606e: fc 01 movw r30, r24 - 6070: 05 90 lpm r0, Z+ - 6072: 61 50 subi r22, 0x01 ; 1 - 6074: 70 40 sbci r23, 0x00 ; 0 - 6076: 01 10 cpse r0, r1 - 6078: d8 f7 brcc .-10 ; 0x6070 - 607a: 80 95 com r24 - 607c: 90 95 com r25 - 607e: 8e 0f add r24, r30 - 6080: 9f 1f adc r25, r31 - 6082: 08 95 ret +00005c64 <__eewr_block_x32a4u>: + 5c64: dc 01 movw r26, r24 + 5c66: cb 01 movw r24, r22 + 5c68: 02 c0 rjmp .+4 ; 0x5c6e <__eewr_block_x32a4u+0xa> + 5c6a: 2d 91 ld r18, X+ + 5c6c: 05 d0 rcall .+10 ; 0x5c78 <__eewr_r18_x32a4u> + 5c6e: 41 50 subi r20, 0x01 ; 1 + 5c70: 50 40 sbci r21, 0x00 ; 0 + 5c72: d8 f7 brcc .-10 ; 0x5c6a <__eewr_block_x32a4u+0x6> + 5c74: 08 95 ret -00006084 : - 6084: fc 01 movw r30, r24 - 6086: 61 50 subi r22, 0x01 ; 1 - 6088: 70 40 sbci r23, 0x00 ; 0 - 608a: 01 90 ld r0, Z+ - 608c: 01 10 cpse r0, r1 - 608e: d8 f7 brcc .-10 ; 0x6086 - 6090: 80 95 com r24 - 6092: 90 95 com r25 - 6094: 8e 0f add r24, r30 - 6096: 9f 1f adc r25, r31 - 6098: 08 95 ret +00005c76 <__eewr_byte_x32a4u>: + 5c76: 26 2f mov r18, r22 -0000609a : - 609a: 0f 93 push r16 - 609c: 1f 93 push r17 - 609e: cf 93 push r28 - 60a0: df 93 push r29 - 60a2: 8c 01 movw r16, r24 - 60a4: eb 01 movw r28, r22 - 60a6: 8b 81 ldd r24, Y+3 ; 0x03 - 60a8: 81 fd sbrc r24, 1 - 60aa: 03 c0 rjmp .+6 ; 0x60b2 - 60ac: 0f ef ldi r16, 0xFF ; 255 - 60ae: 1f ef ldi r17, 0xFF ; 255 - 60b0: 1a c0 rjmp .+52 ; 0x60e6 - 60b2: 82 ff sbrs r24, 2 - 60b4: 0d c0 rjmp .+26 ; 0x60d0 - 60b6: 2e 81 ldd r18, Y+6 ; 0x06 - 60b8: 3f 81 ldd r19, Y+7 ; 0x07 - 60ba: 8c 81 ldd r24, Y+4 ; 0x04 - 60bc: 9d 81 ldd r25, Y+5 ; 0x05 - 60be: 28 17 cp r18, r24 - 60c0: 39 07 cpc r19, r25 - 60c2: 64 f4 brge .+24 ; 0x60dc - 60c4: e8 81 ld r30, Y - 60c6: f9 81 ldd r31, Y+1 ; 0x01 - 60c8: 01 93 st Z+, r16 - 60ca: e8 83 st Y, r30 - 60cc: f9 83 std Y+1, r31 ; 0x01 - 60ce: 06 c0 rjmp .+12 ; 0x60dc - 60d0: e8 85 ldd r30, Y+8 ; 0x08 - 60d2: f9 85 ldd r31, Y+9 ; 0x09 - 60d4: 80 2f mov r24, r16 - 60d6: 09 95 icall - 60d8: 89 2b or r24, r25 - 60da: 41 f7 brne .-48 ; 0x60ac - 60dc: 8e 81 ldd r24, Y+6 ; 0x06 - 60de: 9f 81 ldd r25, Y+7 ; 0x07 - 60e0: 01 96 adiw r24, 0x01 ; 1 - 60e2: 8e 83 std Y+6, r24 ; 0x06 - 60e4: 9f 83 std Y+7, r25 ; 0x07 - 60e6: c8 01 movw r24, r16 - 60e8: df 91 pop r29 - 60ea: cf 91 pop r28 - 60ec: 1f 91 pop r17 - 60ee: 0f 91 pop r16 - 60f0: 08 95 ret +00005c78 <__eewr_r18_x32a4u>: + 5c78: e0 ec ldi r30, 0xC0 ; 192 + 5c7a: f1 e0 ldi r31, 0x01 ; 1 + 5c7c: 37 85 ldd r19, Z+15 ; 0x0f + 5c7e: 37 fd sbrc r19, 7 + 5c80: fd cf rjmp .-6 ; 0x5c7c <__eewr_r18_x32a4u+0x4> + 5c82: 34 85 ldd r19, Z+12 ; 0x0c + 5c84: 37 7f andi r19, 0xF7 ; 247 + 5c86: 34 87 std Z+12, r19 ; 0x0c + 5c88: 37 85 ldd r19, Z+15 ; 0x0f + 5c8a: 31 ff sbrs r19, 1 + 5c8c: 09 c0 rjmp .+18 ; 0x5ca0 <__eewr_r18_x32a4u+0x28> + 5c8e: 36 e3 ldi r19, 0x36 ; 54 + 5c90: 32 87 std Z+10, r19 ; 0x0a + 5c92: 38 ed ldi r19, 0xD8 ; 216 + 5c94: 34 bf out 0x34, r19 ; 52 + 5c96: 31 e0 ldi r19, 0x01 ; 1 + 5c98: 33 87 std Z+11, r19 ; 0x0b + 5c9a: 37 85 ldd r19, Z+15 ; 0x0f + 5c9c: 37 fd sbrc r19, 7 + 5c9e: fd cf rjmp .-6 ; 0x5c9a <__eewr_r18_x32a4u+0x22> + 5ca0: 33 e3 ldi r19, 0x33 ; 51 + 5ca2: 32 87 std Z+10, r19 ; 0x0a + 5ca4: 80 83 st Z, r24 + 5ca6: 91 83 std Z+1, r25 ; 0x01 + 5ca8: 12 82 std Z+2, r1 ; 0x02 + 5caa: 24 83 std Z+4, r18 ; 0x04 + 5cac: 25 e3 ldi r18, 0x35 ; 53 + 5cae: 22 87 std Z+10, r18 ; 0x0a + 5cb0: 28 ed ldi r18, 0xD8 ; 216 + 5cb2: 31 e0 ldi r19, 0x01 ; 1 + 5cb4: 24 bf out 0x34, r18 ; 52 + 5cb6: 33 87 std Z+11, r19 ; 0x0b + 5cb8: 01 96 adiw r24, 0x01 ; 1 + 5cba: 08 95 ret -000060f2 <__ultoa_invert>: - 60f2: fa 01 movw r30, r20 - 60f4: aa 27 eor r26, r26 - 60f6: 28 30 cpi r18, 0x08 ; 8 - 60f8: 51 f1 breq .+84 ; 0x614e <__ultoa_invert+0x5c> - 60fa: 20 31 cpi r18, 0x10 ; 16 - 60fc: 81 f1 breq .+96 ; 0x615e <__ultoa_invert+0x6c> - 60fe: e8 94 clt - 6100: 6f 93 push r22 - 6102: 6e 7f andi r22, 0xFE ; 254 - 6104: 6e 5f subi r22, 0xFE ; 254 - 6106: 7f 4f sbci r23, 0xFF ; 255 - 6108: 8f 4f sbci r24, 0xFF ; 255 - 610a: 9f 4f sbci r25, 0xFF ; 255 - 610c: af 4f sbci r26, 0xFF ; 255 - 610e: b1 e0 ldi r27, 0x01 ; 1 - 6110: 3e d0 rcall .+124 ; 0x618e <__ultoa_invert+0x9c> - 6112: b4 e0 ldi r27, 0x04 ; 4 - 6114: 3c d0 rcall .+120 ; 0x618e <__ultoa_invert+0x9c> - 6116: 67 0f add r22, r23 - 6118: 78 1f adc r23, r24 - 611a: 89 1f adc r24, r25 - 611c: 9a 1f adc r25, r26 - 611e: a1 1d adc r26, r1 - 6120: 68 0f add r22, r24 - 6122: 79 1f adc r23, r25 - 6124: 8a 1f adc r24, r26 - 6126: 91 1d adc r25, r1 - 6128: a1 1d adc r26, r1 - 612a: 6a 0f add r22, r26 - 612c: 71 1d adc r23, r1 - 612e: 81 1d adc r24, r1 - 6130: 91 1d adc r25, r1 - 6132: a1 1d adc r26, r1 - 6134: 20 d0 rcall .+64 ; 0x6176 <__ultoa_invert+0x84> - 6136: 09 f4 brne .+2 ; 0x613a <__ultoa_invert+0x48> - 6138: 68 94 set - 613a: 3f 91 pop r19 - 613c: 2a e0 ldi r18, 0x0A ; 10 - 613e: 26 9f mul r18, r22 - 6140: 11 24 eor r1, r1 - 6142: 30 19 sub r19, r0 - 6144: 30 5d subi r19, 0xD0 ; 208 - 6146: 31 93 st Z+, r19 - 6148: de f6 brtc .-74 ; 0x6100 <__ultoa_invert+0xe> - 614a: cf 01 movw r24, r30 - 614c: 08 95 ret - 614e: 46 2f mov r20, r22 - 6150: 47 70 andi r20, 0x07 ; 7 - 6152: 40 5d subi r20, 0xD0 ; 208 - 6154: 41 93 st Z+, r20 - 6156: b3 e0 ldi r27, 0x03 ; 3 - 6158: 0f d0 rcall .+30 ; 0x6178 <__ultoa_invert+0x86> - 615a: c9 f7 brne .-14 ; 0x614e <__ultoa_invert+0x5c> - 615c: f6 cf rjmp .-20 ; 0x614a <__ultoa_invert+0x58> - 615e: 46 2f mov r20, r22 - 6160: 4f 70 andi r20, 0x0F ; 15 - 6162: 40 5d subi r20, 0xD0 ; 208 - 6164: 4a 33 cpi r20, 0x3A ; 58 - 6166: 18 f0 brcs .+6 ; 0x616e <__ultoa_invert+0x7c> - 6168: 49 5d subi r20, 0xD9 ; 217 - 616a: 31 fd sbrc r19, 1 - 616c: 40 52 subi r20, 0x20 ; 32 - 616e: 41 93 st Z+, r20 - 6170: 02 d0 rcall .+4 ; 0x6176 <__ultoa_invert+0x84> - 6172: a9 f7 brne .-22 ; 0x615e <__ultoa_invert+0x6c> - 6174: ea cf rjmp .-44 ; 0x614a <__ultoa_invert+0x58> - 6176: b4 e0 ldi r27, 0x04 ; 4 - 6178: a6 95 lsr r26 - 617a: 97 95 ror r25 - 617c: 87 95 ror r24 - 617e: 77 95 ror r23 - 6180: 67 95 ror r22 - 6182: ba 95 dec r27 - 6184: c9 f7 brne .-14 ; 0x6178 <__ultoa_invert+0x86> - 6186: 00 97 sbiw r24, 0x00 ; 0 - 6188: 61 05 cpc r22, r1 - 618a: 71 05 cpc r23, r1 - 618c: 08 95 ret - 618e: 9b 01 movw r18, r22 - 6190: ac 01 movw r20, r24 - 6192: 0a 2e mov r0, r26 - 6194: 06 94 lsr r0 - 6196: 57 95 ror r21 - 6198: 47 95 ror r20 - 619a: 37 95 ror r19 - 619c: 27 95 ror r18 - 619e: ba 95 dec r27 - 61a0: c9 f7 brne .-14 ; 0x6194 <__ultoa_invert+0xa2> - 61a2: 62 0f add r22, r18 - 61a4: 73 1f adc r23, r19 - 61a6: 84 1f adc r24, r20 - 61a8: 95 1f adc r25, r21 - 61aa: a0 1d adc r26, r0 - 61ac: 08 95 ret +00005cbc : + 5cbc: fc 01 movw r30, r24 + 5cbe: 05 90 lpm r0, Z+ + 5cc0: 61 50 subi r22, 0x01 ; 1 + 5cc2: 70 40 sbci r23, 0x00 ; 0 + 5cc4: 01 10 cpse r0, r1 + 5cc6: d8 f7 brcc .-10 ; 0x5cbe + 5cc8: 80 95 com r24 + 5cca: 90 95 com r25 + 5ccc: 8e 0f add r24, r30 + 5cce: 9f 1f adc r25, r31 + 5cd0: 08 95 ret -000061ae <__divmodsi4>: - 61ae: 05 2e mov r0, r21 - 61b0: 97 fb bst r25, 7 - 61b2: 16 f4 brtc .+4 ; 0x61b8 <__divmodsi4+0xa> - 61b4: 00 94 com r0 - 61b6: 06 d0 rcall .+12 ; 0x61c4 <__divmodsi4_neg1> - 61b8: 57 fd sbrc r21, 7 - 61ba: 0c d0 rcall .+24 ; 0x61d4 <__divmodsi4_neg2> - 61bc: 44 d0 rcall .+136 ; 0x6246 <__udivmodsi4> - 61be: 07 fc sbrc r0, 7 - 61c0: 09 d0 rcall .+18 ; 0x61d4 <__divmodsi4_neg2> - 61c2: 7e f4 brtc .+30 ; 0x61e2 <__divmodsi4_exit> +00005cd2 : + 5cd2: fc 01 movw r30, r24 + 5cd4: 61 50 subi r22, 0x01 ; 1 + 5cd6: 70 40 sbci r23, 0x00 ; 0 + 5cd8: 01 90 ld r0, Z+ + 5cda: 01 10 cpse r0, r1 + 5cdc: d8 f7 brcc .-10 ; 0x5cd4 + 5cde: 80 95 com r24 + 5ce0: 90 95 com r25 + 5ce2: 8e 0f add r24, r30 + 5ce4: 9f 1f adc r25, r31 + 5ce6: 08 95 ret -000061c4 <__divmodsi4_neg1>: - 61c4: 90 95 com r25 - 61c6: 80 95 com r24 - 61c8: 70 95 com r23 - 61ca: 61 95 neg r22 - 61cc: 7f 4f sbci r23, 0xFF ; 255 - 61ce: 8f 4f sbci r24, 0xFF ; 255 - 61d0: 9f 4f sbci r25, 0xFF ; 255 - 61d2: 08 95 ret +00005ce8 : + 5ce8: 0f 93 push r16 + 5cea: 1f 93 push r17 + 5cec: cf 93 push r28 + 5cee: df 93 push r29 + 5cf0: 18 2f mov r17, r24 + 5cf2: 09 2f mov r16, r25 + 5cf4: eb 01 movw r28, r22 + 5cf6: 8b 81 ldd r24, Y+3 ; 0x03 + 5cf8: 81 fd sbrc r24, 1 + 5cfa: 03 c0 rjmp .+6 ; 0x5d02 + 5cfc: 8f ef ldi r24, 0xFF ; 255 + 5cfe: 9f ef ldi r25, 0xFF ; 255 + 5d00: 20 c0 rjmp .+64 ; 0x5d42 + 5d02: 82 ff sbrs r24, 2 + 5d04: 10 c0 rjmp .+32 ; 0x5d26 + 5d06: 4e 81 ldd r20, Y+6 ; 0x06 + 5d08: 5f 81 ldd r21, Y+7 ; 0x07 + 5d0a: 2c 81 ldd r18, Y+4 ; 0x04 + 5d0c: 3d 81 ldd r19, Y+5 ; 0x05 + 5d0e: 42 17 cp r20, r18 + 5d10: 53 07 cpc r21, r19 + 5d12: 7c f4 brge .+30 ; 0x5d32 + 5d14: e8 81 ld r30, Y + 5d16: f9 81 ldd r31, Y+1 ; 0x01 + 5d18: 9f 01 movw r18, r30 + 5d1a: 2f 5f subi r18, 0xFF ; 255 + 5d1c: 3f 4f sbci r19, 0xFF ; 255 + 5d1e: 28 83 st Y, r18 + 5d20: 39 83 std Y+1, r19 ; 0x01 + 5d22: 10 83 st Z, r17 + 5d24: 06 c0 rjmp .+12 ; 0x5d32 + 5d26: e8 85 ldd r30, Y+8 ; 0x08 + 5d28: f9 85 ldd r31, Y+9 ; 0x09 + 5d2a: 81 2f mov r24, r17 + 5d2c: 09 95 icall + 5d2e: 89 2b or r24, r25 + 5d30: 29 f7 brne .-54 ; 0x5cfc + 5d32: 2e 81 ldd r18, Y+6 ; 0x06 + 5d34: 3f 81 ldd r19, Y+7 ; 0x07 + 5d36: 2f 5f subi r18, 0xFF ; 255 + 5d38: 3f 4f sbci r19, 0xFF ; 255 + 5d3a: 2e 83 std Y+6, r18 ; 0x06 + 5d3c: 3f 83 std Y+7, r19 ; 0x07 + 5d3e: 81 2f mov r24, r17 + 5d40: 90 2f mov r25, r16 + 5d42: df 91 pop r29 + 5d44: cf 91 pop r28 + 5d46: 1f 91 pop r17 + 5d48: 0f 91 pop r16 + 5d4a: 08 95 ret -000061d4 <__divmodsi4_neg2>: - 61d4: 50 95 com r21 - 61d6: 40 95 com r20 - 61d8: 30 95 com r19 - 61da: 21 95 neg r18 - 61dc: 3f 4f sbci r19, 0xFF ; 255 - 61de: 4f 4f sbci r20, 0xFF ; 255 - 61e0: 5f 4f sbci r21, 0xFF ; 255 +00005d4c <__ultoa_invert>: + 5d4c: fa 01 movw r30, r20 + 5d4e: aa 27 eor r26, r26 + 5d50: 28 30 cpi r18, 0x08 ; 8 + 5d52: 51 f1 breq .+84 ; 0x5da8 <__ultoa_invert+0x5c> + 5d54: 20 31 cpi r18, 0x10 ; 16 + 5d56: 81 f1 breq .+96 ; 0x5db8 <__ultoa_invert+0x6c> + 5d58: e8 94 clt + 5d5a: 6f 93 push r22 + 5d5c: 6e 7f andi r22, 0xFE ; 254 + 5d5e: 6e 5f subi r22, 0xFE ; 254 + 5d60: 7f 4f sbci r23, 0xFF ; 255 + 5d62: 8f 4f sbci r24, 0xFF ; 255 + 5d64: 9f 4f sbci r25, 0xFF ; 255 + 5d66: af 4f sbci r26, 0xFF ; 255 + 5d68: b1 e0 ldi r27, 0x01 ; 1 + 5d6a: 3e d0 rcall .+124 ; 0x5de8 <__ultoa_invert+0x9c> + 5d6c: b4 e0 ldi r27, 0x04 ; 4 + 5d6e: 3c d0 rcall .+120 ; 0x5de8 <__ultoa_invert+0x9c> + 5d70: 67 0f add r22, r23 + 5d72: 78 1f adc r23, r24 + 5d74: 89 1f adc r24, r25 + 5d76: 9a 1f adc r25, r26 + 5d78: a1 1d adc r26, r1 + 5d7a: 68 0f add r22, r24 + 5d7c: 79 1f adc r23, r25 + 5d7e: 8a 1f adc r24, r26 + 5d80: 91 1d adc r25, r1 + 5d82: a1 1d adc r26, r1 + 5d84: 6a 0f add r22, r26 + 5d86: 71 1d adc r23, r1 + 5d88: 81 1d adc r24, r1 + 5d8a: 91 1d adc r25, r1 + 5d8c: a1 1d adc r26, r1 + 5d8e: 20 d0 rcall .+64 ; 0x5dd0 <__ultoa_invert+0x84> + 5d90: 09 f4 brne .+2 ; 0x5d94 <__ultoa_invert+0x48> + 5d92: 68 94 set + 5d94: 3f 91 pop r19 + 5d96: 2a e0 ldi r18, 0x0A ; 10 + 5d98: 26 9f mul r18, r22 + 5d9a: 11 24 eor r1, r1 + 5d9c: 30 19 sub r19, r0 + 5d9e: 30 5d subi r19, 0xD0 ; 208 + 5da0: 31 93 st Z+, r19 + 5da2: de f6 brtc .-74 ; 0x5d5a <__ultoa_invert+0xe> + 5da4: cf 01 movw r24, r30 + 5da6: 08 95 ret + 5da8: 46 2f mov r20, r22 + 5daa: 47 70 andi r20, 0x07 ; 7 + 5dac: 40 5d subi r20, 0xD0 ; 208 + 5dae: 41 93 st Z+, r20 + 5db0: b3 e0 ldi r27, 0x03 ; 3 + 5db2: 0f d0 rcall .+30 ; 0x5dd2 <__ultoa_invert+0x86> + 5db4: c9 f7 brne .-14 ; 0x5da8 <__ultoa_invert+0x5c> + 5db6: f6 cf rjmp .-20 ; 0x5da4 <__ultoa_invert+0x58> + 5db8: 46 2f mov r20, r22 + 5dba: 4f 70 andi r20, 0x0F ; 15 + 5dbc: 40 5d subi r20, 0xD0 ; 208 + 5dbe: 4a 33 cpi r20, 0x3A ; 58 + 5dc0: 18 f0 brcs .+6 ; 0x5dc8 <__ultoa_invert+0x7c> + 5dc2: 49 5d subi r20, 0xD9 ; 217 + 5dc4: 31 fd sbrc r19, 1 + 5dc6: 40 52 subi r20, 0x20 ; 32 + 5dc8: 41 93 st Z+, r20 + 5dca: 02 d0 rcall .+4 ; 0x5dd0 <__ultoa_invert+0x84> + 5dcc: a9 f7 brne .-22 ; 0x5db8 <__ultoa_invert+0x6c> + 5dce: ea cf rjmp .-44 ; 0x5da4 <__ultoa_invert+0x58> + 5dd0: b4 e0 ldi r27, 0x04 ; 4 + 5dd2: a6 95 lsr r26 + 5dd4: 97 95 ror r25 + 5dd6: 87 95 ror r24 + 5dd8: 77 95 ror r23 + 5dda: 67 95 ror r22 + 5ddc: ba 95 dec r27 + 5dde: c9 f7 brne .-14 ; 0x5dd2 <__ultoa_invert+0x86> + 5de0: 00 97 sbiw r24, 0x00 ; 0 + 5de2: 61 05 cpc r22, r1 + 5de4: 71 05 cpc r23, r1 + 5de6: 08 95 ret + 5de8: 9b 01 movw r18, r22 + 5dea: ac 01 movw r20, r24 + 5dec: 0a 2e mov r0, r26 + 5dee: 06 94 lsr r0 + 5df0: 57 95 ror r21 + 5df2: 47 95 ror r20 + 5df4: 37 95 ror r19 + 5df6: 27 95 ror r18 + 5df8: ba 95 dec r27 + 5dfa: c9 f7 brne .-14 ; 0x5dee <__ultoa_invert+0xa2> + 5dfc: 62 0f add r22, r18 + 5dfe: 73 1f adc r23, r19 + 5e00: 84 1f adc r24, r20 + 5e02: 95 1f adc r25, r21 + 5e04: a0 1d adc r26, r0 + 5e06: 08 95 ret -000061e2 <__divmodsi4_exit>: - 61e2: 08 95 ret +00005e08 <__divmodsi4>: + 5e08: 05 2e mov r0, r21 + 5e0a: 97 fb bst r25, 7 + 5e0c: 16 f4 brtc .+4 ; 0x5e12 <__divmodsi4+0xa> + 5e0e: 00 94 com r0 + 5e10: 0f d0 rcall .+30 ; 0x5e30 <__negsi2> + 5e12: 57 fd sbrc r21, 7 + 5e14: 05 d0 rcall .+10 ; 0x5e20 <__divmodsi4_neg2> + 5e16: 45 d0 rcall .+138 ; 0x5ea2 <__udivmodsi4> + 5e18: 07 fc sbrc r0, 7 + 5e1a: 02 d0 rcall .+4 ; 0x5e20 <__divmodsi4_neg2> + 5e1c: 46 f4 brtc .+16 ; 0x5e2e <__divmodsi4_exit> + 5e1e: 08 c0 rjmp .+16 ; 0x5e30 <__negsi2> -000061e4 <__prologue_saves__>: - 61e4: 2f 92 push r2 - 61e6: 3f 92 push r3 - 61e8: 4f 92 push r4 - 61ea: 5f 92 push r5 - 61ec: 6f 92 push r6 - 61ee: 7f 92 push r7 - 61f0: 8f 92 push r8 - 61f2: 9f 92 push r9 - 61f4: af 92 push r10 - 61f6: bf 92 push r11 - 61f8: cf 92 push r12 - 61fa: df 92 push r13 - 61fc: ef 92 push r14 - 61fe: ff 92 push r15 - 6200: 0f 93 push r16 - 6202: 1f 93 push r17 - 6204: cf 93 push r28 - 6206: df 93 push r29 - 6208: cd b7 in r28, 0x3d ; 61 - 620a: de b7 in r29, 0x3e ; 62 - 620c: ca 1b sub r28, r26 - 620e: db 0b sbc r29, r27 - 6210: cd bf out 0x3d, r28 ; 61 - 6212: de bf out 0x3e, r29 ; 62 - 6214: 09 94 ijmp +00005e20 <__divmodsi4_neg2>: + 5e20: 50 95 com r21 + 5e22: 40 95 com r20 + 5e24: 30 95 com r19 + 5e26: 21 95 neg r18 + 5e28: 3f 4f sbci r19, 0xFF ; 255 + 5e2a: 4f 4f sbci r20, 0xFF ; 255 + 5e2c: 5f 4f sbci r21, 0xFF ; 255 -00006216 <__epilogue_restores__>: - 6216: 2a 88 ldd r2, Y+18 ; 0x12 - 6218: 39 88 ldd r3, Y+17 ; 0x11 - 621a: 48 88 ldd r4, Y+16 ; 0x10 - 621c: 5f 84 ldd r5, Y+15 ; 0x0f - 621e: 6e 84 ldd r6, Y+14 ; 0x0e - 6220: 7d 84 ldd r7, Y+13 ; 0x0d - 6222: 8c 84 ldd r8, Y+12 ; 0x0c - 6224: 9b 84 ldd r9, Y+11 ; 0x0b - 6226: aa 84 ldd r10, Y+10 ; 0x0a - 6228: b9 84 ldd r11, Y+9 ; 0x09 - 622a: c8 84 ldd r12, Y+8 ; 0x08 - 622c: df 80 ldd r13, Y+7 ; 0x07 - 622e: ee 80 ldd r14, Y+6 ; 0x06 - 6230: fd 80 ldd r15, Y+5 ; 0x05 - 6232: 0c 81 ldd r16, Y+4 ; 0x04 - 6234: 1b 81 ldd r17, Y+3 ; 0x03 - 6236: aa 81 ldd r26, Y+2 ; 0x02 - 6238: b9 81 ldd r27, Y+1 ; 0x01 - 623a: ce 0f add r28, r30 - 623c: d1 1d adc r29, r1 - 623e: cd bf out 0x3d, r28 ; 61 - 6240: de bf out 0x3e, r29 ; 62 - 6242: ed 01 movw r28, r26 - 6244: 08 95 ret +00005e2e <__divmodsi4_exit>: + 5e2e: 08 95 ret -00006246 <__udivmodsi4>: - 6246: a1 e2 ldi r26, 0x21 ; 33 - 6248: 1a 2e mov r1, r26 - 624a: aa 1b sub r26, r26 - 624c: bb 1b sub r27, r27 - 624e: fd 01 movw r30, r26 - 6250: 0d c0 rjmp .+26 ; 0x626c <__udivmodsi4_ep> +00005e30 <__negsi2>: + 5e30: 90 95 com r25 + 5e32: 80 95 com r24 + 5e34: 70 95 com r23 + 5e36: 61 95 neg r22 + 5e38: 7f 4f sbci r23, 0xFF ; 255 + 5e3a: 8f 4f sbci r24, 0xFF ; 255 + 5e3c: 9f 4f sbci r25, 0xFF ; 255 + 5e3e: 08 95 ret -00006252 <__udivmodsi4_loop>: - 6252: aa 1f adc r26, r26 - 6254: bb 1f adc r27, r27 - 6256: ee 1f adc r30, r30 - 6258: ff 1f adc r31, r31 - 625a: a2 17 cp r26, r18 - 625c: b3 07 cpc r27, r19 - 625e: e4 07 cpc r30, r20 - 6260: f5 07 cpc r31, r21 - 6262: 20 f0 brcs .+8 ; 0x626c <__udivmodsi4_ep> - 6264: a2 1b sub r26, r18 - 6266: b3 0b sbc r27, r19 - 6268: e4 0b sbc r30, r20 - 626a: f5 0b sbc r31, r21 +00005e40 <__prologue_saves__>: + 5e40: 2f 92 push r2 + 5e42: 3f 92 push r3 + 5e44: 4f 92 push r4 + 5e46: 5f 92 push r5 + 5e48: 6f 92 push r6 + 5e4a: 7f 92 push r7 + 5e4c: 8f 92 push r8 + 5e4e: 9f 92 push r9 + 5e50: af 92 push r10 + 5e52: bf 92 push r11 + 5e54: cf 92 push r12 + 5e56: df 92 push r13 + 5e58: ef 92 push r14 + 5e5a: ff 92 push r15 + 5e5c: 0f 93 push r16 + 5e5e: 1f 93 push r17 + 5e60: cf 93 push r28 + 5e62: df 93 push r29 + 5e64: cd b7 in r28, 0x3d ; 61 + 5e66: de b7 in r29, 0x3e ; 62 + 5e68: ca 1b sub r28, r26 + 5e6a: db 0b sbc r29, r27 + 5e6c: cd bf out 0x3d, r28 ; 61 + 5e6e: de bf out 0x3e, r29 ; 62 + 5e70: 09 94 ijmp -0000626c <__udivmodsi4_ep>: - 626c: 66 1f adc r22, r22 - 626e: 77 1f adc r23, r23 - 6270: 88 1f adc r24, r24 - 6272: 99 1f adc r25, r25 - 6274: 1a 94 dec r1 - 6276: 69 f7 brne .-38 ; 0x6252 <__udivmodsi4_loop> - 6278: 60 95 com r22 - 627a: 70 95 com r23 - 627c: 80 95 com r24 - 627e: 90 95 com r25 - 6280: 9b 01 movw r18, r22 - 6282: ac 01 movw r20, r24 - 6284: bd 01 movw r22, r26 - 6286: cf 01 movw r24, r30 - 6288: 08 95 ret +00005e72 <__epilogue_restores__>: + 5e72: 2a 88 ldd r2, Y+18 ; 0x12 + 5e74: 39 88 ldd r3, Y+17 ; 0x11 + 5e76: 48 88 ldd r4, Y+16 ; 0x10 + 5e78: 5f 84 ldd r5, Y+15 ; 0x0f + 5e7a: 6e 84 ldd r6, Y+14 ; 0x0e + 5e7c: 7d 84 ldd r7, Y+13 ; 0x0d + 5e7e: 8c 84 ldd r8, Y+12 ; 0x0c + 5e80: 9b 84 ldd r9, Y+11 ; 0x0b + 5e82: aa 84 ldd r10, Y+10 ; 0x0a + 5e84: b9 84 ldd r11, Y+9 ; 0x09 + 5e86: c8 84 ldd r12, Y+8 ; 0x08 + 5e88: df 80 ldd r13, Y+7 ; 0x07 + 5e8a: ee 80 ldd r14, Y+6 ; 0x06 + 5e8c: fd 80 ldd r15, Y+5 ; 0x05 + 5e8e: 0c 81 ldd r16, Y+4 ; 0x04 + 5e90: 1b 81 ldd r17, Y+3 ; 0x03 + 5e92: aa 81 ldd r26, Y+2 ; 0x02 + 5e94: b9 81 ldd r27, Y+1 ; 0x01 + 5e96: ce 0f add r28, r30 + 5e98: d1 1d adc r29, r1 + 5e9a: cd bf out 0x3d, r28 ; 61 + 5e9c: de bf out 0x3e, r29 ; 62 + 5e9e: ed 01 movw r28, r26 + 5ea0: 08 95 ret -0000628a <_exit>: - 628a: f8 94 cli +00005ea2 <__udivmodsi4>: + 5ea2: a1 e2 ldi r26, 0x21 ; 33 + 5ea4: 1a 2e mov r1, r26 + 5ea6: aa 1b sub r26, r26 + 5ea8: bb 1b sub r27, r27 + 5eaa: fd 01 movw r30, r26 + 5eac: 0d c0 rjmp .+26 ; 0x5ec8 <__udivmodsi4_ep> -0000628c <__stop_program>: - 628c: ff cf rjmp .-2 ; 0x628c <__stop_program> +00005eae <__udivmodsi4_loop>: + 5eae: aa 1f adc r26, r26 + 5eb0: bb 1f adc r27, r27 + 5eb2: ee 1f adc r30, r30 + 5eb4: ff 1f adc r31, r31 + 5eb6: a2 17 cp r26, r18 + 5eb8: b3 07 cpc r27, r19 + 5eba: e4 07 cpc r30, r20 + 5ebc: f5 07 cpc r31, r21 + 5ebe: 20 f0 brcs .+8 ; 0x5ec8 <__udivmodsi4_ep> + 5ec0: a2 1b sub r26, r18 + 5ec2: b3 0b sbc r27, r19 + 5ec4: e4 0b sbc r30, r20 + 5ec6: f5 0b sbc r31, r21 + +00005ec8 <__udivmodsi4_ep>: + 5ec8: 66 1f adc r22, r22 + 5eca: 77 1f adc r23, r23 + 5ecc: 88 1f adc r24, r24 + 5ece: 99 1f adc r25, r25 + 5ed0: 1a 94 dec r1 + 5ed2: 69 f7 brne .-38 ; 0x5eae <__udivmodsi4_loop> + 5ed4: 60 95 com r22 + 5ed6: 70 95 com r23 + 5ed8: 80 95 com r24 + 5eda: 90 95 com r25 + 5edc: 9b 01 movw r18, r22 + 5ede: ac 01 movw r20, r24 + 5ee0: bd 01 movw r22, r26 + 5ee2: cf 01 movw r24, r30 + 5ee4: 08 95 ret + +00005ee6 <_exit>: + 5ee6: f8 94 cli + +00005ee8 <__stop_program>: + 5ee8: ff cf rjmp .-2 ; 0x5ee8 <__stop_program> diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.map b/Firmware/Chameleon-Mini/Chameleon-Mini.map index b6d89ab..42a154c 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.map +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.map @@ -1,65 +1,67 @@ Archive member included because of file (symbol) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - Bin/HIDParser.o (__tablejump2__) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + Bin/LED.o (__tablejump2__) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) Bin/Terminal.o (__do_copy_data) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) Bin/Configuration.o (__do_clear_bss) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) Bin/Commands.o (__mulshisi3) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) (__muluhisi3) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) (__umulhisi3) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) (__muluhisi3) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) (__umulhisi3) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) Bin/Random.o (rand) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) Bin/Configuration.o (memcpy_P) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) Bin/Button.o (strcmp_P) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) Bin/Log.o (strncat_P) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) Bin/Button.o (strncpy_P) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) Bin/HIDClassDevice.o (memcmp) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) Bin/HIDClassDevice.o (memcpy) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - Bin/HIDClassDevice.o (memset) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memset.o) + Bin/Log.o (memset) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) Bin/Commands.o (snprintf_P) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (vfprintf) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (vfprintf) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) Bin/Settings.o (__eerd_block_x32a4u) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o (__eerd_byte_x32a4u) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o (__eeupd_byte_x32a4u) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) Bin/Settings.o (__eewr_block_x32a4u) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) (__eewr_r18_x32a4u) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen_P) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (fputc) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (__ultoa_invert) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) (__divmodsi4) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__prologue_saves__) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__epilogue_restores__) -c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) (__udivmodsi4) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) (__eewr_r18_x32a4u) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen_P) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (fputc) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (__ultoa_invert) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) (__divmodsi4) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) (__negsi2) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__prologue_saves__) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__epilogue_restores__) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) (__udivmodsi4) Allocating common symbols Common symbol size file @@ -90,127 +92,222 @@ USB_Device_RemoteWakeupEnabled Discarded input sections - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o .text 0x00000000 0x0 Bin/Chameleon-Mini.o + .data 0x00000000 0x0 Bin/Chameleon-Mini.o .bss 0x00000000 0x0 Bin/Chameleon-Mini.o .text 0x00000000 0x0 Bin/LUFADescriptors.o + .data 0x00000000 0x0 Bin/LUFADescriptors.o .bss 0x00000000 0x0 Bin/LUFADescriptors.o .text 0x00000000 0x0 Bin/System.o + .data 0x00000000 0x0 Bin/System.o .bss 0x00000000 0x0 Bin/System.o .text 0x00000000 0x0 Bin/Configuration.o + .data 0x00000000 0x0 Bin/Configuration.o .bss 0x00000000 0x0 Bin/Configuration.o .text 0x00000000 0x0 Bin/Random.o + .data 0x00000000 0x0 Bin/Random.o .bss 0x00000000 0x0 Bin/Random.o .text 0x00000000 0x0 Bin/Common.o + .data 0x00000000 0x0 Bin/Common.o .bss 0x00000000 0x0 Bin/Common.o .text 0x00000000 0x0 Bin/Memory.o + .data 0x00000000 0x0 Bin/Memory.o .text 0x00000000 0x0 Bin/Button.o + .data 0x00000000 0x0 Bin/Button.o .text 0x00000000 0x0 Bin/Log.o + .data 0x00000000 0x0 Bin/Log.o .text 0x00000000 0x0 Bin/Settings.o + .data 0x00000000 0x0 Bin/Settings.o .bss 0x00000000 0x0 Bin/Settings.o + .text.SettingsGetActiveById + 0x00000000 0x8 Bin/Settings.o .text 0x00000000 0x0 Bin/LED.o + .data 0x00000000 0x0 Bin/LED.o .text 0x00000000 0x0 Bin/Terminal.o .text 0x00000000 0x0 Bin/Commands.o + .data 0x00000000 0x0 Bin/Commands.o .bss 0x00000000 0x0 Bin/Commands.o .text 0x00000000 0x0 Bin/XModem.o + .data 0x00000000 0x0 Bin/XModem.o .text 0x00000000 0x0 Bin/CommandLine.o + .data 0x00000000 0x0 Bin/CommandLine.o .text.CommandLineInit 0x00000000 0xa Bin/CommandLine.o .text 0x00000000 0x0 Bin/Codec.o + .data 0x00000000 0x0 Bin/Codec.o .bss 0x00000000 0x0 Bin/Codec.o .text 0x00000000 0x0 Bin/ISO14443-2A.o + .data 0x00000000 0x0 Bin/ISO14443-2A.o .text 0x00000000 0x0 Bin/MifareUltralight.o + .data 0x00000000 0x0 Bin/MifareUltralight.o .text 0x00000000 0x0 Bin/MifareClassic.o + .data 0x00000000 0x0 Bin/MifareClassic.o .text 0x00000000 0x0 Bin/ISO14443-3A.o + .data 0x00000000 0x0 Bin/ISO14443-3A.o .bss 0x00000000 0x0 Bin/ISO14443-3A.o .text 0x00000000 0x0 Bin/Crypto1.o + .data 0x00000000 0x0 Bin/Crypto1.o .text 0x00000000 0x0 Bin/HIDParser.o + .data 0x00000000 0x0 Bin/HIDParser.o .bss 0x00000000 0x0 Bin/HIDParser.o .text.USB_ProcessHIDReport - 0x00000000 0x850 Bin/HIDParser.o + 0x00000000 0x99a Bin/HIDParser.o .progmem.gcc_sw_table.USB_ProcessHIDReport 0x00000000 0x17a Bin/HIDParser.o .text.USB_GetHIDReportItemInfo 0x00000000 0xc6 Bin/HIDParser.o .text.USB_SetHIDReportItemInfo - 0x00000000 0xee Bin/HIDParser.o + 0x00000000 0x110 Bin/HIDParser.o .text.USB_GetHIDReportSize - 0x00000000 0x158 Bin/HIDParser.o + 0x00000000 0x11c Bin/HIDParser.o + .debug_info 0x00000000 0x73c Bin/HIDParser.o + .debug_abbrev 0x00000000 0x22d Bin/HIDParser.o + .debug_loc 0x00000000 0xf2d Bin/HIDParser.o + .debug_aranges + 0x00000000 0x38 Bin/HIDParser.o + .debug_ranges 0x00000000 0x108 Bin/HIDParser.o + .debug_line 0x00000000 0x6ec Bin/HIDParser.o + .debug_str 0x00000000 0x6da Bin/HIDParser.o + .comment 0x00000000 0x31 Bin/HIDParser.o + .debug_frame 0x00000000 0x11c Bin/HIDParser.o .text 0x00000000 0x0 Bin/ConfigDescriptors.o + .data 0x00000000 0x0 Bin/ConfigDescriptors.o .bss 0x00000000 0x0 Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorOfType - 0x00000000 0x50 Bin/ConfigDescriptors.o + 0x00000000 0x52 Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorOfTypeBefore - 0x00000000 0x6c Bin/ConfigDescriptors.o + 0x00000000 0x7c Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorOfTypeAfter 0x00000000 0x3e Bin/ConfigDescriptors.o .text.USB_GetNextDescriptorComp 0x00000000 0x8e Bin/ConfigDescriptors.o + .debug_info 0x00000000 0x5ed Bin/ConfigDescriptors.o + .debug_abbrev 0x00000000 0x248 Bin/ConfigDescriptors.o + .debug_loc 0x00000000 0x592 Bin/ConfigDescriptors.o + .debug_aranges + 0x00000000 0x38 Bin/ConfigDescriptors.o + .debug_ranges 0x00000000 0x40 Bin/ConfigDescriptors.o + .debug_line 0x00000000 0x2bf Bin/ConfigDescriptors.o + .debug_str 0x00000000 0x518 Bin/ConfigDescriptors.o + .comment 0x00000000 0x31 Bin/ConfigDescriptors.o + .debug_frame 0x00000000 0xd0 Bin/ConfigDescriptors.o .text 0x00000000 0x0 Bin/DeviceStandardReq.o + .data 0x00000000 0x0 Bin/DeviceStandardReq.o .bss 0x00000000 0x0 Bin/DeviceStandardReq.o .text 0x00000000 0x0 Bin/Events.o + .data 0x00000000 0x0 Bin/Events.o .bss 0x00000000 0x0 Bin/Events.o .text 0x00000000 0x0 Bin/HostStandardReq.o + .data 0x00000000 0x0 Bin/HostStandardReq.o .bss 0x00000000 0x0 Bin/HostStandardReq.o + .debug_info 0x00000000 0x5d Bin/HostStandardReq.o + .debug_abbrev 0x00000000 0x26 Bin/HostStandardReq.o + .debug_aranges + 0x00000000 0x18 Bin/HostStandardReq.o + .debug_line 0x00000000 0x1a Bin/HostStandardReq.o + .debug_str 0x00000000 0x1bf Bin/HostStandardReq.o + .comment 0x00000000 0x31 Bin/HostStandardReq.o .text 0x00000000 0x0 Bin/USBTask.o + .data 0x00000000 0x0 Bin/USBTask.o .bss 0x00000000 0x0 Bin/USBTask.o .text 0x00000000 0x0 Bin/Device_XMEGA.o + .data 0x00000000 0x0 Bin/Device_XMEGA.o .bss 0x00000000 0x0 Bin/Device_XMEGA.o .text.USB_Device_SendRemoteWakeup 0x00000000 0xc Bin/Device_XMEGA.o + .debug_info 0x00000000 0x670 Bin/Device_XMEGA.o + .debug_abbrev 0x00000000 0x11e Bin/Device_XMEGA.o + .debug_aranges + 0x00000000 0x20 Bin/Device_XMEGA.o + .debug_ranges 0x00000000 0x10 Bin/Device_XMEGA.o + .debug_line 0x00000000 0x167 Bin/Device_XMEGA.o + .debug_str 0x00000000 0x605 Bin/Device_XMEGA.o + .comment 0x00000000 0x31 Bin/Device_XMEGA.o + .debug_frame 0x00000000 0x24 Bin/Device_XMEGA.o .text 0x00000000 0x0 Bin/EndpointStream_XMEGA.o + .data 0x00000000 0x0 Bin/EndpointStream_XMEGA.o .bss 0x00000000 0x0 Bin/EndpointStream_XMEGA.o .text.Endpoint_Discard_Stream - 0x00000000 0xc4 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Null_Stream 0x00000000 0xc8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Null_Stream + 0x00000000 0xc2 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Stream_BE - 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Stream_LE 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Stream_LE + 0x00000000 0xd8 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Stream_BE - 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o + 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_PStream_LE - 0x00000000 0xec Bin/EndpointStream_XMEGA.o + 0x00000000 0xe0 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_PStream_BE - 0x00000000 0xf6 Bin/EndpointStream_XMEGA.o + 0x00000000 0xea Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_EStream_LE - 0x00000000 0xf0 Bin/EndpointStream_XMEGA.o + 0x00000000 0xe0 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_EStream_BE - 0x00000000 0xfa Bin/EndpointStream_XMEGA.o + 0x00000000 0xea Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_EStream_LE - 0x00000000 0xfe Bin/EndpointStream_XMEGA.o + 0x00000000 0xee Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_EStream_BE - 0x00000000 0x108 Bin/EndpointStream_XMEGA.o + 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_Stream_BE 0x00000000 0x170 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_Stream_LE - 0x00000000 0xf0 Bin/EndpointStream_XMEGA.o + 0x00000000 0xe2 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_Stream_BE - 0x00000000 0xde Bin/EndpointStream_XMEGA.o + 0x00000000 0xd4 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_PStream_BE 0x00000000 0x170 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_EStream_LE - 0x00000000 0x156 Bin/EndpointStream_XMEGA.o + 0x00000000 0x170 Bin/EndpointStream_XMEGA.o .text.Endpoint_Write_Control_EStream_BE 0x00000000 0x172 Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_EStream_LE - 0x00000000 0xf6 Bin/EndpointStream_XMEGA.o + 0x00000000 0xec Bin/EndpointStream_XMEGA.o .text.Endpoint_Read_Control_EStream_BE - 0x00000000 0xe2 Bin/EndpointStream_XMEGA.o + 0x00000000 0xd8 Bin/EndpointStream_XMEGA.o .text 0x00000000 0x0 Bin/Endpoint_XMEGA.o + .data 0x00000000 0x0 Bin/Endpoint_XMEGA.o .bss 0x00000000 0x0 Bin/Endpoint_XMEGA.o .text 0x00000000 0x0 Bin/Host_XMEGA.o + .data 0x00000000 0x0 Bin/Host_XMEGA.o .bss 0x00000000 0x0 Bin/Host_XMEGA.o + .debug_info 0x00000000 0x5d Bin/Host_XMEGA.o + .debug_abbrev 0x00000000 0x26 Bin/Host_XMEGA.o + .debug_aranges + 0x00000000 0x18 Bin/Host_XMEGA.o + .debug_line 0x00000000 0x1a Bin/Host_XMEGA.o + .debug_str 0x00000000 0x1c0 Bin/Host_XMEGA.o + .comment 0x00000000 0x31 Bin/Host_XMEGA.o .text 0x00000000 0x0 Bin/PipeStream_XMEGA.o + .data 0x00000000 0x0 Bin/PipeStream_XMEGA.o .bss 0x00000000 0x0 Bin/PipeStream_XMEGA.o + .debug_info 0x00000000 0x5d Bin/PipeStream_XMEGA.o + .debug_abbrev 0x00000000 0x26 Bin/PipeStream_XMEGA.o + .debug_aranges + 0x00000000 0x18 Bin/PipeStream_XMEGA.o + .debug_line 0x00000000 0x1a Bin/PipeStream_XMEGA.o + .debug_str 0x00000000 0x1c6 Bin/PipeStream_XMEGA.o + .comment 0x00000000 0x31 Bin/PipeStream_XMEGA.o .text 0x00000000 0x0 Bin/Pipe_XMEGA.o + .data 0x00000000 0x0 Bin/Pipe_XMEGA.o .bss 0x00000000 0x0 Bin/Pipe_XMEGA.o + .debug_info 0x00000000 0x5d Bin/Pipe_XMEGA.o + .debug_abbrev 0x00000000 0x26 Bin/Pipe_XMEGA.o + .debug_aranges + 0x00000000 0x18 Bin/Pipe_XMEGA.o + .debug_line 0x00000000 0x1a Bin/Pipe_XMEGA.o + .debug_str 0x00000000 0x1c0 Bin/Pipe_XMEGA.o + .comment 0x00000000 0x31 Bin/Pipe_XMEGA.o .text 0x00000000 0x0 Bin/USBController_XMEGA.o + .data 0x00000000 0x0 Bin/USBController_XMEGA.o .bss 0x00000000 0x0 Bin/USBController_XMEGA.o .text 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o + .data 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o .bss 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o .text 0x00000000 0x0 Bin/AudioClassDevice.o + .data 0x00000000 0x0 Bin/AudioClassDevice.o .bss 0x00000000 0x0 Bin/AudioClassDevice.o .text.Audio_Device_ConfigureEndpoints 0x00000000 0x32 Bin/AudioClassDevice.o @@ -218,16 +315,27 @@ Discarded input sections 0x00000000 0x2 Bin/AudioClassDevice.o .text.Audio_Device_ProcessControlRequest 0x00000000 0x29e Bin/AudioClassDevice.o + .debug_info 0x00000000 0xab1 Bin/AudioClassDevice.o + .debug_abbrev 0x00000000 0x280 Bin/AudioClassDevice.o + .debug_loc 0x00000000 0x37f Bin/AudioClassDevice.o + .debug_aranges + 0x00000000 0x30 Bin/AudioClassDevice.o + .debug_ranges 0x00000000 0x38 Bin/AudioClassDevice.o + .debug_line 0x00000000 0x437 Bin/AudioClassDevice.o + .debug_str 0x00000000 0x7ec Bin/AudioClassDevice.o + .comment 0x00000000 0x31 Bin/AudioClassDevice.o + .debug_frame 0x00000000 0xa4 Bin/AudioClassDevice.o .text 0x00000000 0x0 Bin/CDCClassDevice.o + .data 0x00000000 0x0 Bin/CDCClassDevice.o .bss 0x00000000 0x0 Bin/CDCClassDevice.o .text.CDC_Device_putchar - 0x00000000 0x1e Bin/CDCClassDevice.o + 0x00000000 0x22 Bin/CDCClassDevice.o .text.CDC_Device_BytesReceived - 0x00000000 0x8a Bin/CDCClassDevice.o - .text.CDC_Device_getchar_Blocking - 0x00000000 0x3e Bin/CDCClassDevice.o + 0x00000000 0xa4 Bin/CDCClassDevice.o .text.CDC_Device_getchar - 0x00000000 0x1a Bin/CDCClassDevice.o + 0x00000000 0x14 Bin/CDCClassDevice.o + .text.CDC_Device_getchar_Blocking + 0x00000000 0x38 Bin/CDCClassDevice.o .rodata 0x00000000 0x8 Bin/CDCClassDevice.o .text.CDC_Device_SendControlLineStateChange 0x00000000 0x7c Bin/CDCClassDevice.o @@ -236,57 +344,91 @@ Discarded input sections .text.CDC_Device_CreateBlockingStream 0x00000000 0x26 Bin/CDCClassDevice.o .text 0x00000000 0x0 Bin/HIDClassDevice.o + .data 0x00000000 0x0 Bin/HIDClassDevice.o .bss 0x00000000 0x0 Bin/HIDClassDevice.o .text.HID_Device_ProcessControlRequest - 0x00000000 0x254 Bin/HIDClassDevice.o + 0x00000000 0x240 Bin/HIDClassDevice.o .text.HID_Device_ConfigureEndpoints - 0x00000000 0x2c Bin/HIDClassDevice.o + 0x00000000 0x28 Bin/HIDClassDevice.o .text.HID_Device_USBTask - 0x00000000 0x1b2 Bin/HIDClassDevice.o + 0x00000000 0x1a8 Bin/HIDClassDevice.o + .debug_info 0x00000000 0xf94 Bin/HIDClassDevice.o + .debug_abbrev 0x00000000 0x2d1 Bin/HIDClassDevice.o + .debug_loc 0x00000000 0x3e7 Bin/HIDClassDevice.o + .debug_aranges + 0x00000000 0x30 Bin/HIDClassDevice.o + .debug_ranges 0x00000000 0x20 Bin/HIDClassDevice.o + .debug_line 0x00000000 0x589 Bin/HIDClassDevice.o + .debug_str 0x00000000 0xb5c Bin/HIDClassDevice.o + .comment 0x00000000 0x31 Bin/HIDClassDevice.o + .debug_frame 0x00000000 0xf0 Bin/HIDClassDevice.o .text 0x00000000 0x0 Bin/MassStorageClassDevice.o + .data 0x00000000 0x0 Bin/MassStorageClassDevice.o .bss 0x00000000 0x0 Bin/MassStorageClassDevice.o .text.MS_Device_ProcessControlRequest 0x00000000 0x70 Bin/MassStorageClassDevice.o .text.MS_Device_ConfigureEndpoints 0x00000000 0x3e Bin/MassStorageClassDevice.o .text.MS_Device_USBTask - 0x00000000 0x2ca Bin/MassStorageClassDevice.o + 0x00000000 0x2c2 Bin/MassStorageClassDevice.o + .debug_info 0x00000000 0xa9e Bin/MassStorageClassDevice.o + .debug_abbrev 0x00000000 0x338 Bin/MassStorageClassDevice.o + .debug_loc 0x00000000 0x29f Bin/MassStorageClassDevice.o + .debug_aranges + 0x00000000 0x30 Bin/MassStorageClassDevice.o + .debug_ranges 0x00000000 0x80 Bin/MassStorageClassDevice.o + .debug_line 0x00000000 0x4eb Bin/MassStorageClassDevice.o + .debug_str 0x00000000 0x93f Bin/MassStorageClassDevice.o + .comment 0x00000000 0x31 Bin/MassStorageClassDevice.o + .debug_frame 0x00000000 0x80 Bin/MassStorageClassDevice.o .text 0x00000000 0x0 Bin/MIDIClassDevice.o + .data 0x00000000 0x0 Bin/MIDIClassDevice.o .bss 0x00000000 0x0 Bin/MIDIClassDevice.o .text.MIDI_Device_ConfigureEndpoints 0x00000000 0x32 Bin/MIDIClassDevice.o .text.MIDI_Device_SendEventPacket - 0x00000000 0x66 Bin/MIDIClassDevice.o + 0x00000000 0x54 Bin/MIDIClassDevice.o .text.MIDI_Device_Flush - 0x00000000 0x5c Bin/MIDIClassDevice.o + 0x00000000 0x58 Bin/MIDIClassDevice.o .text.MIDI_Device_USBTask 0x00000000 0x2c Bin/MIDIClassDevice.o .text.MIDI_Device_ReceiveEventPacket - 0x00000000 0x70 Bin/MIDIClassDevice.o + 0x00000000 0x68 Bin/MIDIClassDevice.o + .debug_info 0x00000000 0x7c4 Bin/MIDIClassDevice.o + .debug_abbrev 0x00000000 0x285 Bin/MIDIClassDevice.o + .debug_loc 0x00000000 0x33c Bin/MIDIClassDevice.o + .debug_aranges + 0x00000000 0x40 Bin/MIDIClassDevice.o + .debug_ranges 0x00000000 0x48 Bin/MIDIClassDevice.o + .debug_line 0x00000000 0x3f0 Bin/MIDIClassDevice.o + .debug_str 0x00000000 0x796 Bin/MIDIClassDevice.o + .comment 0x00000000 0x31 Bin/MIDIClassDevice.o + .debug_frame 0x00000000 0x94 Bin/MIDIClassDevice.o .text 0x00000000 0x0 Bin/PrinterClassDevice.o + .data 0x00000000 0x0 Bin/PrinterClassDevice.o .bss 0x00000000 0x0 Bin/PrinterClassDevice.o .text.PRNT_Device_ConfigureEndpoints 0x00000000 0x38 Bin/PrinterClassDevice.o .text.PRNT_Device_SendString - 0x00000000 0x46 Bin/PrinterClassDevice.o + 0x00000000 0x3e Bin/PrinterClassDevice.o .text.PRNT_Device_SendData 0x00000000 0x3c Bin/PrinterClassDevice.o .text.PRNT_Device_SendByte - 0x00000000 0x5e Bin/PrinterClassDevice.o + 0x00000000 0x5a Bin/PrinterClassDevice.o .text.PRNT_Device_putchar - 0x00000000 0x1e Bin/PrinterClassDevice.o + 0x00000000 0x22 Bin/PrinterClassDevice.o .text.PRNT_Device_Flush - 0x00000000 0x88 Bin/PrinterClassDevice.o + 0x00000000 0x74 Bin/PrinterClassDevice.o .text.PRNT_Device_USBTask 0x00000000 0xcc Bin/PrinterClassDevice.o .text.PRNT_Device_BytesReceived - 0x00000000 0x7a Bin/PrinterClassDevice.o + 0x00000000 0x94 Bin/PrinterClassDevice.o .text.PRNT_Device_ReceiveByte - 0x00000000 0xb6 Bin/PrinterClassDevice.o - .text.PRNT_Device_getchar_Blocking - 0x00000000 0x3e Bin/PrinterClassDevice.o + 0x00000000 0xb0 Bin/PrinterClassDevice.o .text.PRNT_Device_getchar - 0x00000000 0x1a Bin/PrinterClassDevice.o + 0x00000000 0x14 Bin/PrinterClassDevice.o + .text.PRNT_Device_getchar_Blocking + 0x00000000 0x38 Bin/PrinterClassDevice.o .text.PRNT_Device_CreateStream 0x00000000 0x26 Bin/PrinterClassDevice.o .text.PRNT_Device_CreateBlockingStream @@ -294,11 +436,22 @@ Discarded input sections .text.PRNT_Device_Event_Stub 0x00000000 0x2 Bin/PrinterClassDevice.o .text.PRNT_Device_ProcessControlRequest - 0x00000000 0xe2 Bin/PrinterClassDevice.o + 0x00000000 0xda Bin/PrinterClassDevice.o + .debug_info 0x00000000 0xded Bin/PrinterClassDevice.o + .debug_abbrev 0x00000000 0x3c7 Bin/PrinterClassDevice.o + .debug_loc 0x00000000 0x8cd Bin/PrinterClassDevice.o + .debug_aranges + 0x00000000 0x90 Bin/PrinterClassDevice.o + .debug_ranges 0x00000000 0x128 Bin/PrinterClassDevice.o + .debug_line 0x00000000 0x799 Bin/PrinterClassDevice.o + .debug_str 0x00000000 0xa6a Bin/PrinterClassDevice.o + .comment 0x00000000 0x31 Bin/PrinterClassDevice.o + .debug_frame 0x00000000 0x194 Bin/PrinterClassDevice.o .text 0x00000000 0x0 Bin/RNDISClassDevice.o + .data 0x00000000 0x0 Bin/RNDISClassDevice.o .bss 0x00000000 0x0 Bin/RNDISClassDevice.o .text.RNDIS_Device_ProcessControlRequest - 0x00000000 0x53c Bin/RNDISClassDevice.o + 0x00000000 0x52e Bin/RNDISClassDevice.o .text.RNDIS_Device_ConfigureEndpoints 0x00000000 0x50 Bin/RNDISClassDevice.o .rodata 0x00000000 0x8 Bin/RNDISClassDevice.o @@ -311,199 +464,343 @@ Discarded input sections .text.RNDIS_Device_SendPacket 0x00000000 0xca Bin/RNDISClassDevice.o .progmem.data 0x00000000 0x6c Bin/RNDISClassDevice.o + .debug_info 0x00000000 0x1317 Bin/RNDISClassDevice.o + .debug_abbrev 0x00000000 0x396 Bin/RNDISClassDevice.o + .debug_loc 0x00000000 0xc59 Bin/RNDISClassDevice.o + .debug_aranges + 0x00000000 0x48 Bin/RNDISClassDevice.o + .debug_ranges 0x00000000 0x98 Bin/RNDISClassDevice.o + .debug_line 0x00000000 0x71d Bin/RNDISClassDevice.o + .debug_str 0x00000000 0xe9f Bin/RNDISClassDevice.o + .comment 0x00000000 0x31 Bin/RNDISClassDevice.o + .debug_frame 0x00000000 0x104 Bin/RNDISClassDevice.o .text 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o + .data 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o .bss 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o + .debug_info 0x00000000 0x5d Bin/AndroidAccessoryClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/AndroidAccessoryClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/AndroidAccessoryClassHost.o + .debug_line 0x00000000 0x1a Bin/AndroidAccessoryClassHost.o + .debug_str 0x00000000 0x1cf Bin/AndroidAccessoryClassHost.o + .comment 0x00000000 0x31 Bin/AndroidAccessoryClassHost.o .text 0x00000000 0x0 Bin/AudioClassHost.o + .data 0x00000000 0x0 Bin/AudioClassHost.o .bss 0x00000000 0x0 Bin/AudioClassHost.o + .debug_info 0x00000000 0x5d Bin/AudioClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/AudioClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/AudioClassHost.o + .debug_line 0x00000000 0x1a Bin/AudioClassHost.o + .debug_str 0x00000000 0x1c4 Bin/AudioClassHost.o + .comment 0x00000000 0x31 Bin/AudioClassHost.o .text 0x00000000 0x0 Bin/CDCClassHost.o + .data 0x00000000 0x0 Bin/CDCClassHost.o .bss 0x00000000 0x0 Bin/CDCClassHost.o + .debug_info 0x00000000 0x5d Bin/CDCClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/CDCClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/CDCClassHost.o + .debug_line 0x00000000 0x1a Bin/CDCClassHost.o + .debug_str 0x00000000 0x1c2 Bin/CDCClassHost.o + .comment 0x00000000 0x31 Bin/CDCClassHost.o .text 0x00000000 0x0 Bin/HIDClassHost.o + .data 0x00000000 0x0 Bin/HIDClassHost.o .bss 0x00000000 0x0 Bin/HIDClassHost.o + .debug_info 0x00000000 0x5d Bin/HIDClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/HIDClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/HIDClassHost.o + .debug_line 0x00000000 0x1a Bin/HIDClassHost.o + .debug_str 0x00000000 0x1c2 Bin/HIDClassHost.o + .comment 0x00000000 0x31 Bin/HIDClassHost.o .text 0x00000000 0x0 Bin/MassStorageClassHost.o + .data 0x00000000 0x0 Bin/MassStorageClassHost.o .bss 0x00000000 0x0 Bin/MassStorageClassHost.o + .debug_info 0x00000000 0x5d Bin/MassStorageClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/MassStorageClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/MassStorageClassHost.o + .debug_line 0x00000000 0x1a Bin/MassStorageClassHost.o + .debug_str 0x00000000 0x1ca Bin/MassStorageClassHost.o + .comment 0x00000000 0x31 Bin/MassStorageClassHost.o .text 0x00000000 0x0 Bin/MIDIClassHost.o + .data 0x00000000 0x0 Bin/MIDIClassHost.o .bss 0x00000000 0x0 Bin/MIDIClassHost.o + .debug_info 0x00000000 0x5d Bin/MIDIClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/MIDIClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/MIDIClassHost.o + .debug_line 0x00000000 0x1a Bin/MIDIClassHost.o + .debug_str 0x00000000 0x1c3 Bin/MIDIClassHost.o + .comment 0x00000000 0x31 Bin/MIDIClassHost.o .text 0x00000000 0x0 Bin/PrinterClassHost.o + .data 0x00000000 0x0 Bin/PrinterClassHost.o .bss 0x00000000 0x0 Bin/PrinterClassHost.o + .debug_info 0x00000000 0x5d Bin/PrinterClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/PrinterClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/PrinterClassHost.o + .debug_line 0x00000000 0x1a Bin/PrinterClassHost.o + .debug_str 0x00000000 0x1c6 Bin/PrinterClassHost.o + .comment 0x00000000 0x31 Bin/PrinterClassHost.o .text 0x00000000 0x0 Bin/RNDISClassHost.o + .data 0x00000000 0x0 Bin/RNDISClassHost.o .bss 0x00000000 0x0 Bin/RNDISClassHost.o + .debug_info 0x00000000 0x5d Bin/RNDISClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/RNDISClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/RNDISClassHost.o + .debug_line 0x00000000 0x1a Bin/RNDISClassHost.o + .debug_str 0x00000000 0x1c4 Bin/RNDISClassHost.o + .comment 0x00000000 0x31 Bin/RNDISClassHost.o .text 0x00000000 0x0 Bin/StillImageClassHost.o + .data 0x00000000 0x0 Bin/StillImageClassHost.o .bss 0x00000000 0x0 Bin/StillImageClassHost.o - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .debug_info 0x00000000 0x5d Bin/StillImageClassHost.o + .debug_abbrev 0x00000000 0x26 Bin/StillImageClassHost.o + .debug_aranges + 0x00000000 0x18 Bin/StillImageClassHost.o + .debug_line 0x00000000 0x1a Bin/StillImageClassHost.o + .debug_str 0x00000000 0x1c9 Bin/StillImageClassHost.o + .comment 0x00000000 0x31 Bin/StillImageClassHost.o + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc 0x00000000 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) .text.avr-libc - 0x00000000 0x1a c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) + 0x00000000 0x1a c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memset.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) .text.avr-libc - 0x00000000 0xe c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + 0x00000000 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) .text.avr-libc - 0x00000000 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .text.avr-libc - 0x00000000 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00000000 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.div - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc.mul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) .text.libgcc.prologue - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) .text.libgcc.builtins - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) .text.libgcc.fmul - 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) Memory Configuration @@ -519,7 +816,7 @@ user_signatures 0x00850000 0x00000400 rw !x Linker script and memory map -LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o LOAD Bin/Chameleon-Mini.o LOAD Bin/LUFADescriptors.o LOAD Bin/System.o @@ -571,10 +868,12 @@ LOAD Bin/MIDIClassHost.o LOAD Bin/PrinterClassHost.o LOAD Bin/RNDISClassHost.o LOAD Bin/StillImageClassHost.o -LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libm.a -LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a -LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a -LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libm.a +START GROUP +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libm.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a +END GROUP .hash *(.hash) @@ -666,61 +965,72 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr .rela.plt *(.rela.plt) -.text 0x00000000 0x628e +.text 0x00000000 0x5eea *(.vectors) - .vectors 0x00000000 0x1fc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .vectors 0x00000000 0x1fc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o 0x00000000 __vectors *(.vectors) *(.progmem.gcc*) - *(.progmem*) - .progmem.data 0x000001fc 0x8c Bin/LUFADescriptors.o - 0x000001fc ProductString - 0x0000021a ManufacturerString - 0x00000234 LanguageString - 0x00000238 ConfigurationDescriptor - 0x00000276 DeviceDescriptor - .progmem.data 0x00000288 0xde Bin/Configuration.o - .progmem.data 0x00000366 0x120 Bin/Button.o - .progmem.data 0x00000486 0x32 Bin/Log.o - .progmem.data 0x000004b8 0x100 Bin/LED.o - .progmem.data 0x000005b8 0x89 Bin/Commands.o - .progmem.data 0x00000641 0x29a Bin/CommandLine.o - 0x00000641 CommandTable - 0x000008dc . = ALIGN (0x2) - *fill* 0x000008db 0x1 - 0x000008dc __trampolines_start = . + .progmem.gcc_sw_table.LEDTick + 0x000001fc 0xa0 Bin/LED.o + .progmem.gcc_sw_table.XModemProcessByte + 0x0000029c 0x12 Bin/XModem.o + .progmem.gcc_sw_table.__vector_83 + 0x000002ae 0x16 Bin/ISO14443-2A.o + .progmem.gcc_sw_table.MifareClassicAppProcess + 0x000002c4 0x1a Bin/MifareClassic.o + .progmem.gcc_sw_table.USB_Device_ProcessControlRequest + 0x000002de 0x14 Bin/DeviceStandardReq.o + 0x000002f2 . = ALIGN (0x2) + 0x000002f2 __trampolines_start = . *(.trampolines) - .trampolines 0x000008dc 0x0 linker stubs + .trampolines 0x000002f2 0x0 linker stubs *(.trampolines*) - 0x000008dc __trampolines_end = . + 0x000002f2 __trampolines_end = . + *(.progmem*) + .progmem.data 0x000002f2 0x8c Bin/LUFADescriptors.o + 0x000002f2 ProductString + 0x00000310 ManufacturerString + 0x0000032a LanguageString + 0x0000032e ConfigurationDescriptor + 0x0000036c DeviceDescriptor + .progmem.data 0x0000037e 0xde Bin/Configuration.o + .progmem.data 0x0000045c 0x120 Bin/Button.o + .progmem.data 0x0000057c 0x32 Bin/Log.o + .progmem.data 0x000005ae 0x100 Bin/LED.o + .progmem.data 0x000006ae 0x89 Bin/Commands.o + .progmem.data 0x00000737 0x29a Bin/CommandLine.o + 0x00000803 CommandTable + 0x000009d2 . = ALIGN (0x2) + *fill* 0x000009d1 0x1 *(.jumptables) *(.jumptables*) *(.lowtext) *(.lowtext*) - 0x000008dc __ctors_start = . + 0x000009d2 __ctors_start = . *(.ctors) - 0x000008dc __ctors_end = . - 0x000008dc __dtors_start = . + 0x000009d2 __ctors_end = . + 0x000009d2 __dtors_start = . *(.dtors) - 0x000008dc __dtors_end = . + 0x000009d2 __dtors_end = . SORT(*)(.ctors) SORT(*)(.dtors) *(.init0) - .init0 0x000008dc 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x000008dc __init + .init0 0x000009d2 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x000009d2 __init *(.init0) *(.init1) *(.init1) *(.init2) - .init2 0x000008dc 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init2 0x000009d2 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o *(.init2) *(.init3) *(.init3) *(.init4) - .init4 0x000008e8 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - 0x000008e8 __do_copy_data - .init4 0x000008fe 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - 0x000008fe __do_clear_bss + .init4 0x000009de 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + 0x000009de __do_copy_data + .init4 0x000009f4 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + 0x000009f4 __do_clear_bss *(.init4) *(.init5) *(.init5) @@ -731,763 +1041,767 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr *(.init8) *(.init8) *(.init9) - .init9 0x0000090e 0x6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init9 0x00000a04 0x6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o *(.init9) *(.text) - .text 0x00000914 0x2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x00000914 __vector_38 - 0x00000914 __vector_104 - 0x00000914 __vector_63 - 0x00000914 __vector_28 - 0x00000914 __vector_67 - 0x00000914 __vector_1 - 0x00000914 __vector_119 - 0x00000914 __vector_32 - 0x00000914 __vector_75 - 0x00000914 __vector_71 - 0x00000914 __vector_91 - 0x00000914 __vector_62 - 0x00000914 __vector_77 - 0x00000914 __vector_102 - 0x00000914 __vector_24 - 0x00000914 __vector_12 - 0x00000914 __vector_55 - 0x00000914 __vector_69 - 0x00000914 __vector_81 - 0x00000914 __vector_90 - 0x00000914 __vector_46 - 0x00000914 __bad_interrupt - 0x00000914 __vector_122 - 0x00000914 __vector_72 - 0x00000914 __vector_114 - 0x00000914 __vector_6 - 0x00000914 __vector_110 - 0x00000914 __vector_31 - 0x00000914 __vector_92 - 0x00000914 __vector_35 - 0x00000914 __vector_78 - 0x00000914 __vector_74 - 0x00000914 __vector_117 - 0x00000914 __vector_39 - 0x00000914 __vector_107 - 0x00000914 __vector_3 - 0x00000914 __vector_105 - 0x00000914 __vector_98 - 0x00000914 __vector_23 - 0x00000914 __vector_68 - 0x00000914 __vector_30 - 0x00000914 __vector_73 - 0x00000914 __vector_45 - 0x00000914 __vector_25 - 0x00000914 __vector_93 - 0x00000914 __vector_61 - 0x00000914 __vector_11 - 0x00000914 __vector_54 - 0x00000914 __vector_99 - 0x00000914 __vector_13 - 0x00000914 __vector_17 - 0x00000914 __vector_19 - 0x00000914 __vector_56 - 0x00000914 __vector_7 - 0x00000914 __vector_49 - 0x00000914 __vector_123 - 0x00000914 __vector_41 - 0x00000914 __vector_86 - 0x00000914 __vector_100 - 0x00000914 __vector_101 - 0x00000914 __vector_64 - 0x00000914 __vector_88 - 0x00000914 __vector_109 - 0x00000914 __vector_43 - 0x00000914 __vector_27 - 0x00000914 __vector_5 - 0x00000914 __vector_113 - 0x00000914 __vector_33 - 0x00000914 __vector_76 - 0x00000914 __vector_115 - 0x00000914 __vector_47 - 0x00000914 __vector_52 - 0x00000914 __vector_37 - 0x00000914 __vector_95 - 0x00000914 __vector_103 - 0x00000914 __vector_96 - 0x00000914 __vector_89 - 0x00000914 __vector_108 - 0x00000914 __vector_4 - 0x00000914 __vector_44 - 0x00000914 __vector_82 - 0x00000914 __vector_106 - 0x00000914 __vector_118 - 0x00000914 __vector_51 - 0x00000914 __vector_9 - 0x00000914 __vector_2 - 0x00000914 __vector_21 - 0x00000914 __vector_15 - 0x00000914 __vector_66 - 0x00000914 __vector_36 - 0x00000914 __vector_79 - 0x00000914 __vector_58 - 0x00000914 __vector_70 - 0x00000914 __vector_29 - 0x00000914 __vector_60 - 0x00000914 __vector_121 - 0x00000914 __vector_40 - 0x00000914 __vector_85 - 0x00000914 __vector_94 - 0x00000914 __vector_126 - 0x00000914 __vector_8 - 0x00000914 __vector_26 - 0x00000914 __vector_48 - 0x00000914 __vector_124 - 0x00000914 __vector_116 - 0x00000914 __vector_112 - 0x00000914 __vector_111 - 0x00000914 __vector_80 - 0x00000914 __vector_14 - 0x00000914 __vector_84 - 0x00000914 __vector_57 - 0x00000914 __vector_53 - 0x00000914 __vector_50 - 0x00000914 __vector_16 - 0x00000914 __vector_59 - 0x00000914 __vector_18 - 0x00000914 __vector_97 - 0x00000914 __vector_20 - 0x00000914 __vector_42 - 0x00000914 __vector_87 - 0x00000914 __vector_65 - 0x00000914 __vector_120 - 0x00000916 . = ALIGN (0x2) + .text 0x00000a0a 0x2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000a0a __vector_38 + 0x00000a0a __vector_104 + 0x00000a0a __vector_63 + 0x00000a0a __vector_28 + 0x00000a0a __vector_67 + 0x00000a0a __vector_1 + 0x00000a0a __vector_119 + 0x00000a0a __vector_32 + 0x00000a0a __vector_75 + 0x00000a0a __vector_71 + 0x00000a0a __vector_91 + 0x00000a0a __vector_62 + 0x00000a0a __vector_77 + 0x00000a0a __vector_102 + 0x00000a0a __vector_24 + 0x00000a0a __vector_12 + 0x00000a0a __vector_55 + 0x00000a0a __vector_69 + 0x00000a0a __vector_81 + 0x00000a0a __vector_90 + 0x00000a0a __vector_46 + 0x00000a0a __bad_interrupt + 0x00000a0a __vector_122 + 0x00000a0a __vector_72 + 0x00000a0a __vector_114 + 0x00000a0a __vector_6 + 0x00000a0a __vector_110 + 0x00000a0a __vector_31 + 0x00000a0a __vector_92 + 0x00000a0a __vector_35 + 0x00000a0a __vector_78 + 0x00000a0a __vector_74 + 0x00000a0a __vector_117 + 0x00000a0a __vector_39 + 0x00000a0a __vector_107 + 0x00000a0a __vector_3 + 0x00000a0a __vector_105 + 0x00000a0a __vector_98 + 0x00000a0a __vector_23 + 0x00000a0a __vector_68 + 0x00000a0a __vector_30 + 0x00000a0a __vector_73 + 0x00000a0a __vector_45 + 0x00000a0a __vector_25 + 0x00000a0a __vector_93 + 0x00000a0a __vector_61 + 0x00000a0a __vector_11 + 0x00000a0a __vector_54 + 0x00000a0a __vector_99 + 0x00000a0a __vector_13 + 0x00000a0a __vector_17 + 0x00000a0a __vector_19 + 0x00000a0a __vector_56 + 0x00000a0a __vector_7 + 0x00000a0a __vector_49 + 0x00000a0a __vector_123 + 0x00000a0a __vector_41 + 0x00000a0a __vector_86 + 0x00000a0a __vector_100 + 0x00000a0a __vector_101 + 0x00000a0a __vector_64 + 0x00000a0a __vector_88 + 0x00000a0a __vector_109 + 0x00000a0a __vector_43 + 0x00000a0a __vector_27 + 0x00000a0a __vector_5 + 0x00000a0a __vector_113 + 0x00000a0a __vector_33 + 0x00000a0a __vector_76 + 0x00000a0a __vector_115 + 0x00000a0a __vector_47 + 0x00000a0a __vector_52 + 0x00000a0a __vector_37 + 0x00000a0a __vector_95 + 0x00000a0a __vector_103 + 0x00000a0a __vector_96 + 0x00000a0a __vector_89 + 0x00000a0a __vector_108 + 0x00000a0a __vector_4 + 0x00000a0a __vector_44 + 0x00000a0a __vector_82 + 0x00000a0a __vector_106 + 0x00000a0a __vector_118 + 0x00000a0a __vector_51 + 0x00000a0a __vector_9 + 0x00000a0a __vector_2 + 0x00000a0a __vector_21 + 0x00000a0a __vector_15 + 0x00000a0a __vector_66 + 0x00000a0a __vector_36 + 0x00000a0a __vector_79 + 0x00000a0a __vector_58 + 0x00000a0a __vector_70 + 0x00000a0a __vector_29 + 0x00000a0a __vector_60 + 0x00000a0a __vector_121 + 0x00000a0a __vector_40 + 0x00000a0a __vector_85 + 0x00000a0a __vector_94 + 0x00000a0a __vector_126 + 0x00000a0a __vector_8 + 0x00000a0a __vector_26 + 0x00000a0a __vector_48 + 0x00000a0a __vector_124 + 0x00000a0a __vector_116 + 0x00000a0a __vector_112 + 0x00000a0a __vector_111 + 0x00000a0a __vector_80 + 0x00000a0a __vector_14 + 0x00000a0a __vector_84 + 0x00000a0a __vector_57 + 0x00000a0a __vector_53 + 0x00000a0a __vector_50 + 0x00000a0a __vector_16 + 0x00000a0a __vector_59 + 0x00000a0a __vector_18 + 0x00000a0a __vector_97 + 0x00000a0a __vector_20 + 0x00000a0a __vector_42 + 0x00000a0a __vector_87 + 0x00000a0a __vector_65 + 0x00000a0a __vector_120 + 0x00000a0c . = ALIGN (0x2) *(.text.*) .text.startup.main - 0x00000916 0x8c Bin/Chameleon-Mini.o - 0x00000916 main + 0x00000a0c 0x8c Bin/Chameleon-Mini.o + 0x00000a0c main .text.CALLBACK_USB_GetDescriptor - 0x000009a2 0x82 Bin/LUFADescriptors.o - 0x000009a2 CALLBACK_USB_GetDescriptor + 0x00000a98 0x7c Bin/LUFADescriptors.o + 0x00000a98 CALLBACK_USB_GetDescriptor .text.__vector_default - 0x00000a24 0xc Bin/System.o - 0x00000a24 __vector_default + 0x00000b14 0xc Bin/System.o + 0x00000b14 __vector_default .text.__vector_10 - 0x00000a30 0x2 Bin/System.o - 0x00000a30 __vector_10 + 0x00000b20 0x2 Bin/System.o + 0x00000b20 __vector_10 .text.SystemInit - 0x00000a32 0x86 Bin/System.o - 0x00000a32 SystemInit + 0x00000b22 0x86 Bin/System.o + 0x00000b22 SystemInit .text.SystemReset - 0x00000ab8 0xe Bin/System.o - 0x00000ab8 SystemReset + 0x00000ba8 0xe Bin/System.o + 0x00000ba8 SystemReset .text.SystemEnterBootloader - 0x00000ac6 0xc Bin/System.o - 0x00000ac6 SystemEnterBootloader + 0x00000bb6 0xc Bin/System.o + 0x00000bb6 SystemEnterBootloader .text.SystemStartUSBClock - 0x00000ad2 0x3c Bin/System.o - 0x00000ad2 SystemStartUSBClock + 0x00000bc2 0x3c Bin/System.o + 0x00000bc2 SystemStartUSBClock .text.SystemStopUSBClock - 0x00000b0e 0x26 Bin/System.o - 0x00000b0e SystemStopUSBClock + 0x00000bfe 0x26 Bin/System.o + 0x00000bfe SystemStopUSBClock .text.SystemInterruptInit - 0x00000b34 0xc Bin/System.o - 0x00000b34 SystemInterruptInit + 0x00000c24 0xc Bin/System.o + 0x00000c24 SystemInterruptInit .text.CodecInitDummy - 0x00000b40 0x2 Bin/Configuration.o + 0x00000c30 0x2 Bin/Configuration.o .text.CodecTaskDummy - 0x00000b42 0x2 Bin/Configuration.o + 0x00000c32 0x2 Bin/Configuration.o .text.ApplicationInitDummy - 0x00000b44 0x2 Bin/Configuration.o + 0x00000c34 0x2 Bin/Configuration.o .text.ApplicationResetDummy - 0x00000b46 0x2 Bin/Configuration.o + 0x00000c36 0x2 Bin/Configuration.o .text.ApplicationTaskDummy - 0x00000b48 0x2 Bin/Configuration.o + 0x00000c38 0x2 Bin/Configuration.o .text.ApplicationProcessDummy - 0x00000b4a 0x6 Bin/Configuration.o + 0x00000c3a 0x6 Bin/Configuration.o .text.ApplicationGetUidDummy - 0x00000b50 0x2 Bin/Configuration.o + 0x00000c40 0x2 Bin/Configuration.o .text.ApplicationSetUidDummy - 0x00000b52 0x2 Bin/Configuration.o + 0x00000c42 0x2 Bin/Configuration.o .text.ConfigurationSetById - 0x00000b54 0x36 Bin/Configuration.o - 0x00000b54 ConfigurationSetById + 0x00000c44 0x36 Bin/Configuration.o + 0x00000c44 ConfigurationSetById .text.ConfigurationInit - 0x00000b8a 0xc Bin/Configuration.o - 0x00000b8a ConfigurationInit + 0x00000c7a 0xc Bin/Configuration.o + 0x00000c7a ConfigurationInit .text.ConfigurationSetByName - 0x00000b96 0x82 Bin/Configuration.o - 0x00000b96 ConfigurationSetByName + 0x00000c86 0x7a Bin/Configuration.o + 0x00000c86 ConfigurationSetByName .text.ConfigurationGetList - 0x00000c18 0x5e Bin/Configuration.o - 0x00000c18 ConfigurationGetList + 0x00000d00 0x72 Bin/Configuration.o + 0x00000d00 ConfigurationGetList .text.RandomInit - 0x00000c76 0x2 Bin/Random.o - 0x00000c76 RandomInit + 0x00000d72 0x2 Bin/Random.o + 0x00000d72 RandomInit .text.RandomGetByte - 0x00000c78 0x6 Bin/Random.o - 0x00000c78 RandomGetByte + 0x00000d74 0x6 Bin/Random.o + 0x00000d74 RandomGetByte .text.RandomGetBuffer - 0x00000c7e 0x1e Bin/Random.o - 0x00000c7e RandomGetBuffer + 0x00000d7a 0x20 Bin/Random.o + 0x00000d7a RandomGetBuffer .text.RandomTick - 0x00000c9c 0x10 Bin/Random.o - 0x00000c9c RandomTick + 0x00000d9a 0x10 Bin/Random.o + 0x00000d9a RandomTick .text.BufferToHexString - 0x00000cac 0x84 Bin/Common.o - 0x00000cac BufferToHexString + 0x00000daa 0x86 Bin/Common.o + 0x00000daa BufferToHexString .text.HexStringToBuffer - 0x00000d30 0x8c Bin/Common.o - 0x00000d30 HexStringToBuffer + 0x00000e30 0x94 Bin/Common.o + 0x00000e30 HexStringToBuffer .text.MemoryReadBlock - 0x00000dbc 0x30 Bin/Memory.o - 0x00000dbc MemoryReadBlock + 0x00000ec4 0x30 Bin/Memory.o + 0x00000ec4 MemoryReadBlock .text.MemoryWriteBlock - 0x00000dec 0x38 Bin/Memory.o - 0x00000dec MemoryWriteBlock + 0x00000ef4 0x34 Bin/Memory.o + 0x00000ef4 MemoryWriteBlock .text.MemoryClear - 0x00000e24 0x10 Bin/Memory.o - 0x00000e24 MemoryClear + 0x00000f28 0x16 Bin/Memory.o + 0x00000f28 MemoryClear .text.MemoryRecall - 0x00000e34 0xec Bin/Memory.o - 0x00000e34 MemoryRecall + 0x00000f3e 0xec Bin/Memory.o + 0x00000f3e MemoryRecall .text.MemoryInit - 0x00000f20 0xfe Bin/Memory.o - 0x00000f20 MemoryInit + 0x0000102a 0xfe Bin/Memory.o + 0x0000102a MemoryInit .text.MemoryStore - 0x0000101e 0x28e Bin/Memory.o - 0x0000101e MemoryStore + 0x00001128 0x284 Bin/Memory.o + 0x00001128 MemoryStore .text.MemoryUploadBlock - 0x000012ac 0x38a Bin/Memory.o - 0x000012ac MemoryUploadBlock + 0x000013ac 0x336 Bin/Memory.o + 0x000013ac MemoryUploadBlock .text.MemoryDownloadBlock - 0x00001636 0x7a Bin/Memory.o - 0x00001636 MemoryDownloadBlock + 0x000016e2 0x7a Bin/Memory.o + 0x000016e2 MemoryDownloadBlock .text.ExecuteButtonAction - 0x000016b0 0x1aa Bin/Button.o + 0x0000175c 0x19a Bin/Button.o .text.ButtonInit - 0x0000185a 0xe Bin/Button.o - 0x0000185a ButtonInit + 0x000018f6 0xe Bin/Button.o + 0x000018f6 ButtonInit .text.ButtonTick - 0x00001868 0x4a Bin/Button.o - 0x00001868 ButtonTick + 0x00001904 0x4a Bin/Button.o + 0x00001904 ButtonTick .text.ButtonGetActionList - 0x000018b2 0x64 Bin/Button.o - 0x000018b2 ButtonGetActionList + 0x0000194e 0x72 Bin/Button.o + 0x0000194e ButtonGetActionList .text.ButtonSetActionById - 0x00001916 0x4e Bin/Button.o - 0x00001916 ButtonSetActionById + 0x000019c0 0x4e Bin/Button.o + 0x000019c0 ButtonSetActionById .text.ButtonGetActionByName - 0x00001964 0x38 Bin/Button.o - 0x00001964 ButtonGetActionByName + 0x00001a0e 0x38 Bin/Button.o + 0x00001a0e ButtonGetActionByName .text.ButtonSetActionByName - 0x0000199c 0xc4 Bin/Button.o - 0x0000199c ButtonSetActionByName + 0x00001a46 0xc4 Bin/Button.o + 0x00001a46 ButtonSetActionByName .text.LogFuncOff - 0x00001a60 0x2 Bin/Log.o + 0x00001b0a 0x2 Bin/Log.o .text.LogFuncTerminal - 0x00001a62 0x2c Bin/Log.o - .text.LogTick 0x00001a8e 0x2 Bin/Log.o - 0x00001a8e LogTick - .text.LogTask 0x00001a90 0x2 Bin/Log.o - 0x00001a90 LogTask + 0x00001b0c 0x2c Bin/Log.o + .text.LogTick 0x00001b38 0x2 Bin/Log.o + 0x00001b38 LogTick + .text.LogTask 0x00001b3a 0x2 Bin/Log.o + 0x00001b3a LogTask .text.LogMemLoadBlock - 0x00001a92 0x30 Bin/Log.o - 0x00001a92 LogMemLoadBlock + 0x00001b3c 0x30 Bin/Log.o + 0x00001b3c LogMemLoadBlock .text.LogMemClear - 0x00001ac2 0x2a Bin/Log.o - 0x00001ac2 LogMemClear + 0x00001b6c 0x2a Bin/Log.o + 0x00001b6c LogMemClear .text.LogMemFree - 0x00001aec 0xa Bin/Log.o - 0x00001aec LogMemFree + 0x00001b96 0xa Bin/Log.o + 0x00001b96 LogMemFree .text.LogSetModeById - 0x00001af6 0x40 Bin/Log.o - 0x00001af6 LogSetModeById + 0x00001ba0 0x40 Bin/Log.o + 0x00001ba0 LogSetModeById + .text.LogInit 0x00001be0 0xe Bin/Log.o + 0x00001be0 LogInit .text.LogFuncMemory - 0x00001b36 0x6e Bin/Log.o - .text.LogInit 0x00001ba4 0xe Bin/Log.o - 0x00001ba4 LogInit + 0x00001bee 0x6e Bin/Log.o .text.LogSetModeByName - 0x00001bb2 0x4a Bin/Log.o - 0x00001bb2 LogSetModeByName + 0x00001c5c 0x4a Bin/Log.o + 0x00001c5c LogSetModeByName .text.LogGetModeByName - 0x00001bfc 0x1c Bin/Log.o - 0x00001bfc LogGetModeByName + 0x00001ca6 0x1c Bin/Log.o + 0x00001ca6 LogGetModeByName .text.LogGetModeList - 0x00001c18 0x50 Bin/Log.o - 0x00001c18 LogGetModeList + 0x00001cc2 0x50 Bin/Log.o + 0x00001cc2 LogGetModeList .text.SettingsLoad - 0x00001c68 0x10 Bin/Settings.o - 0x00001c68 SettingsLoad + 0x00001d12 0x10 Bin/Settings.o + 0x00001d12 SettingsLoad .text.SettingsSave - 0x00001c78 0x10 Bin/Settings.o - 0x00001c78 SettingsSave + 0x00001d22 0x10 Bin/Settings.o + 0x00001d22 SettingsSave .text.SettingsSetActiveById - 0x00001c88 0x64 Bin/Settings.o - 0x00001c88 SettingsSetActiveById + 0x00001d32 0x64 Bin/Settings.o + 0x00001d32 SettingsSetActiveById .text.SettingsCycle - 0x00001cec 0x120 Bin/Settings.o - 0x00001cec SettingsCycle - .text.SettingsGetActiveById - 0x00001e0c 0x8 Bin/Settings.o - 0x00001e0c SettingsGetActiveById + 0x00001d96 0x120 Bin/Settings.o + 0x00001d96 SettingsCycle .text.SettingsGetActiveByName - 0x00001e14 0x14 Bin/Settings.o - 0x00001e14 SettingsGetActiveByName + 0x00001eb6 0xe Bin/Settings.o + 0x00001eb6 SettingsGetActiveByName .text.SettingsSetActiveByName - 0x00001e28 0x12 Bin/Settings.o - 0x00001e28 SettingsSetActiveByName - .text.LEDInit 0x00001e3a 0xa Bin/LED.o - 0x00001e3a LEDInit - .text.LEDTick 0x00001e44 0x11a Bin/LED.o - 0x00001e44 LEDTick + 0x00001ec4 0x12 Bin/Settings.o + 0x00001ec4 SettingsSetActiveByName + .text.LEDInit 0x00001ed6 0xa Bin/LED.o + 0x00001ed6 LEDInit + .text.LEDTick 0x00001ee0 0x102 Bin/LED.o + 0x00001ee0 LEDTick .text.LEDTrigger - 0x00001f5e 0x20 Bin/LED.o - 0x00001f5e LEDTrigger + 0x00001fe2 0x20 Bin/LED.o + 0x00001fe2 LEDTrigger .text.LEDGetFuncList - 0x00001f7e 0x64 Bin/LED.o - 0x00001f7e LEDGetFuncList + 0x00002002 0x72 Bin/LED.o + 0x00002002 LEDGetFuncList .text.LEDSetFuncById - 0x00001fe2 0xac Bin/LED.o - 0x00001fe2 LEDSetFuncById + 0x00002074 0xac Bin/LED.o + 0x00002074 LEDSetFuncById .text.LEDGetFuncByName - 0x0000208e 0x3a Bin/LED.o - 0x0000208e LEDGetFuncByName + 0x00002120 0x3a Bin/LED.o + 0x00002120 LEDGetFuncByName .text.LEDSetFuncByName - 0x000020c8 0xb0 Bin/LED.o - 0x000020c8 LEDSetFuncByName + 0x0000215a 0xb0 Bin/LED.o + 0x0000215a LEDSetFuncByName .text.TerminalSendString - 0x00002178 0xa Bin/Terminal.o - 0x00002178 TerminalSendString + 0x0000220a 0xa Bin/Terminal.o + 0x0000220a TerminalSendString .text.TerminalSendStringP - 0x00002182 0x28 Bin/Terminal.o - 0x00002182 TerminalSendStringP + 0x00002214 0x28 Bin/Terminal.o + 0x00002214 TerminalSendStringP .text.TerminalSendBlock - 0x000021aa 0xc Bin/Terminal.o - 0x000021aa TerminalSendBlock + 0x0000223c 0xc Bin/Terminal.o + 0x0000223c TerminalSendBlock .text.TerminalInit - 0x000021b6 0xa Bin/Terminal.o - 0x000021b6 TerminalInit + 0x00002248 0xa Bin/Terminal.o + 0x00002248 TerminalInit .text.TerminalTask - 0x000021c0 0x42 Bin/Terminal.o - 0x000021c0 TerminalTask + 0x00002252 0x42 Bin/Terminal.o + 0x00002252 TerminalTask .text.TerminalTick - 0x00002202 0x80 Bin/Terminal.o - 0x00002202 TerminalTick + 0x00002294 0x82 Bin/Terminal.o + 0x00002294 TerminalTick .text.EVENT_USB_Device_Connect - 0x00002282 0x6 Bin/Terminal.o - 0x00002282 EVENT_USB_Device_Connect + 0x00002316 0x6 Bin/Terminal.o + 0x00002316 EVENT_USB_Device_Connect .text.EVENT_USB_Device_Disconnect - 0x00002288 0x6 Bin/Terminal.o - 0x00002288 EVENT_USB_Device_Disconnect + 0x0000231c 0x6 Bin/Terminal.o + 0x0000231c EVENT_USB_Device_Disconnect .text.EVENT_USB_Device_ConfigurationChanged - 0x0000228e 0x8 Bin/Terminal.o - 0x0000228e EVENT_USB_Device_ConfigurationChanged + 0x00002322 0x8 Bin/Terminal.o + 0x00002322 EVENT_USB_Device_ConfigurationChanged .text.EVENT_USB_Device_ControlRequest - 0x00002296 0x8 Bin/Terminal.o - 0x00002296 EVENT_USB_Device_ControlRequest + 0x0000232a 0x8 Bin/Terminal.o + 0x0000232a EVENT_USB_Device_ControlRequest .text.CommandGetVersion - 0x0000229e 0x3c Bin/Commands.o - 0x0000229e CommandGetVersion + 0x00002332 0x3c Bin/Commands.o + 0x00002332 CommandGetVersion .text.CommandGetConfig - 0x000022da 0x2c Bin/Commands.o - 0x000022da CommandGetConfig + 0x0000236e 0x2c Bin/Commands.o + 0x0000236e CommandGetConfig .text.CommandSetConfig - 0x00002306 0x12 Bin/Commands.o - 0x00002306 CommandSetConfig + 0x0000239a 0x12 Bin/Commands.o + 0x0000239a CommandSetConfig .text.CommandExecConfig - 0x00002318 0xc Bin/Commands.o - 0x00002318 CommandExecConfig + 0x000023ac 0xc Bin/Commands.o + 0x000023ac CommandExecConfig .text.CommandGetUid - 0x00002324 0x4e Bin/Commands.o - 0x00002324 CommandGetUid + 0x000023b8 0x54 Bin/Commands.o + 0x000023b8 CommandGetUid .text.CommandSetUid - 0x00002372 0xb2 Bin/Commands.o - 0x00002372 CommandSetUid + 0x0000240c 0xa4 Bin/Commands.o + 0x0000240c CommandSetUid .text.CommandGetReadOnly - 0x00002424 0x24 Bin/Commands.o - 0x00002424 CommandGetReadOnly + 0x000024b0 0x24 Bin/Commands.o + 0x000024b0 CommandGetReadOnly .text.CommandSetReadOnly - 0x00002448 0x28 Bin/Commands.o - 0x00002448 CommandSetReadOnly + 0x000024d4 0x28 Bin/Commands.o + 0x000024d4 CommandSetReadOnly .text.CommandExecUpload - 0x00002470 0xa Bin/Commands.o - 0x00002470 CommandExecUpload + 0x000024fc 0xa Bin/Commands.o + 0x000024fc CommandExecUpload .text.CommandExecDownload - 0x0000247a 0xa Bin/Commands.o - 0x0000247a CommandExecDownload + 0x00002506 0xa Bin/Commands.o + 0x00002506 CommandExecDownload .text.CommandExecReset - 0x00002484 0x16 Bin/Commands.o - 0x00002484 CommandExecReset + 0x00002510 0x16 Bin/Commands.o + 0x00002510 CommandExecReset .text.CommandExecUpgrade - 0x0000249a 0x16 Bin/Commands.o - 0x0000249a CommandExecUpgrade + 0x00002526 0x16 Bin/Commands.o + 0x00002526 CommandExecUpgrade .text.CommandGetMemSize - 0x000024b0 0x30 Bin/Commands.o - 0x000024b0 CommandGetMemSize + 0x0000253c 0x30 Bin/Commands.o + 0x0000253c CommandGetMemSize .text.CommandGetUidSize - 0x000024e0 0x2c Bin/Commands.o - 0x000024e0 CommandGetUidSize + 0x0000256c 0x2c Bin/Commands.o + 0x0000256c CommandGetUidSize .text.CommandExecButton - 0x0000250c 0xa Bin/Commands.o - 0x0000250c CommandExecButton + 0x00002598 0xa Bin/Commands.o + 0x00002598 CommandExecButton .text.CommandGetButton - 0x00002516 0xe Bin/Commands.o - 0x00002516 CommandGetButton + 0x000025a2 0xe Bin/Commands.o + 0x000025a2 CommandGetButton .text.CommandSetButton - 0x00002524 0x14 Bin/Commands.o - 0x00002524 CommandSetButton + 0x000025b0 0x14 Bin/Commands.o + 0x000025b0 CommandSetButton .text.CommandExecButtonLong - 0x00002538 0xa Bin/Commands.o - 0x00002538 CommandExecButtonLong + 0x000025c4 0xa Bin/Commands.o + 0x000025c4 CommandExecButtonLong .text.CommandGetButtonLong - 0x00002542 0xe Bin/Commands.o - 0x00002542 CommandGetButtonLong + 0x000025ce 0xe Bin/Commands.o + 0x000025ce CommandGetButtonLong .text.CommandSetButtonLong - 0x00002550 0x14 Bin/Commands.o - 0x00002550 CommandSetButtonLong + 0x000025dc 0x14 Bin/Commands.o + 0x000025dc CommandSetButtonLong .text.CommandExecLedGreen - 0x00002564 0xa Bin/Commands.o - 0x00002564 CommandExecLedGreen + 0x000025f0 0xa Bin/Commands.o + 0x000025f0 CommandExecLedGreen .text.CommandGetLedGreen - 0x0000256e 0xe Bin/Commands.o - 0x0000256e CommandGetLedGreen + 0x000025fa 0xe Bin/Commands.o + 0x000025fa CommandGetLedGreen .text.CommandSetLedGreen - 0x0000257c 0x14 Bin/Commands.o - 0x0000257c CommandSetLedGreen + 0x00002608 0x14 Bin/Commands.o + 0x00002608 CommandSetLedGreen .text.CommandExecLedRed - 0x00002590 0xa Bin/Commands.o - 0x00002590 CommandExecLedRed + 0x0000261c 0xa Bin/Commands.o + 0x0000261c CommandExecLedRed .text.CommandGetLedRed - 0x0000259a 0xe Bin/Commands.o - 0x0000259a CommandGetLedRed + 0x00002626 0xe Bin/Commands.o + 0x00002626 CommandGetLedRed .text.CommandSetLedRed - 0x000025a8 0x14 Bin/Commands.o - 0x000025a8 CommandSetLedRed + 0x00002634 0x14 Bin/Commands.o + 0x00002634 CommandSetLedRed .text.CommandExecLogMode - 0x000025bc 0xa Bin/Commands.o - 0x000025bc CommandExecLogMode + 0x00002648 0xa Bin/Commands.o + 0x00002648 CommandExecLogMode .text.CommandGetLogMode - 0x000025c6 0xa Bin/Commands.o - 0x000025c6 CommandGetLogMode + 0x00002652 0xa Bin/Commands.o + 0x00002652 CommandGetLogMode .text.CommandSetLogMode - 0x000025d0 0x10 Bin/Commands.o - 0x000025d0 CommandSetLogMode + 0x0000265c 0x10 Bin/Commands.o + 0x0000265c CommandSetLogMode .text.CommandExecLogMem - 0x000025e0 0x34 Bin/Commands.o - 0x000025e0 CommandExecLogMem + 0x0000266c 0x34 Bin/Commands.o + 0x0000266c CommandExecLogMem .text.CommandGetLogMem - 0x00002614 0x34 Bin/Commands.o - 0x00002614 CommandGetLogMem + 0x000026a0 0x34 Bin/Commands.o + 0x000026a0 CommandGetLogMem .text.CommandSetLogMem - 0x00002648 0x40 Bin/Commands.o - 0x00002648 CommandSetLogMem + 0x000026d4 0x40 Bin/Commands.o + 0x000026d4 CommandSetLogMem .text.CommandGetSetting - 0x00002688 0xa Bin/Commands.o - 0x00002688 CommandGetSetting + 0x00002714 0xa Bin/Commands.o + 0x00002714 CommandGetSetting .text.CommandSetSetting - 0x00002692 0x10 Bin/Commands.o - 0x00002692 CommandSetSetting + 0x0000271e 0x10 Bin/Commands.o + 0x0000271e CommandSetSetting .text.CommandExecClear - 0x000026a2 0x8 Bin/Commands.o - 0x000026a2 CommandExecClear + 0x0000272e 0x8 Bin/Commands.o + 0x0000272e CommandExecClear .text.CommandExecHelp - 0x000026aa 0x98 Bin/Commands.o - 0x000026aa CommandExecHelp + 0x00002736 0x94 Bin/Commands.o + 0x00002736 CommandExecHelp .text.CommandGetRssi - 0x00002742 0x68 Bin/Commands.o - 0x00002742 CommandGetRssi - .text.CalcChecksum.constprop.0 - 0x000027aa 0x14 Bin/XModem.o + 0x000027ca 0x68 Bin/Commands.o + 0x000027ca CommandGetRssi .text.XModemReceive - 0x000027be 0x36 Bin/XModem.o - 0x000027be XModemReceive + 0x00002832 0x36 Bin/XModem.o + 0x00002832 XModemReceive .text.XModemSend - 0x000027f4 0x2c Bin/XModem.o - 0x000027f4 XModemSend + 0x00002868 0x2c Bin/XModem.o + 0x00002868 XModemSend .text.XModemProcessByte - 0x00002820 0x296 Bin/XModem.o - 0x00002820 XModemProcessByte + 0x00002894 0x2d4 Bin/XModem.o + 0x00002894 XModemProcessByte .text.XModemTick - 0x00002ab6 0x76 Bin/XModem.o - 0x00002ab6 XModemTick + 0x00002b68 0x76 Bin/XModem.o + 0x00002b68 XModemTick .text.CommandLineProcessByte - 0x00002b2c 0x20e Bin/CommandLine.o - 0x00002b2c CommandLineProcessByte + 0x00002bde 0x21c Bin/CommandLine.o + 0x00002bde CommandLineProcessByte .text.CommandLineTick - 0x00002d3a 0x2 Bin/CommandLine.o - 0x00002d3a CommandLineTick + 0x00002dfa 0x2 Bin/CommandLine.o + 0x00002dfa CommandLineTick .text.StartDemod - 0x00002d3c 0x7a Bin/ISO14443-2A.o + 0x00002dfc 0x7a Bin/ISO14443-2A.o .text.__vector_34 - 0x00002db6 0x62 Bin/ISO14443-2A.o - 0x00002db6 __vector_34 + 0x00002e76 0x62 Bin/ISO14443-2A.o + 0x00002e76 __vector_34 .text.__vector_22 - 0x00002e18 0x148 Bin/ISO14443-2A.o - 0x00002e18 __vector_22 + 0x00002ed8 0x174 Bin/ISO14443-2A.o + 0x00002ed8 __vector_22 .text.__vector_83 - 0x00002f60 0x1e2 Bin/ISO14443-2A.o - 0x00002f60 __vector_83 + 0x0000304c 0x1bc Bin/ISO14443-2A.o + 0x0000304c __vector_83 .text.ISO14443ACodecInit - 0x00003142 0x6e Bin/ISO14443-2A.o - 0x00003142 ISO14443ACodecInit + 0x00003208 0x6e Bin/ISO14443-2A.o + 0x00003208 ISO14443ACodecInit .text.ISO14443ACodecTask - 0x000031b0 0x162 Bin/ISO14443-2A.o - 0x000031b0 ISO14443ACodecTask + 0x00003276 0x160 Bin/ISO14443-2A.o + 0x00003276 ISO14443ACodecTask .text.MifareUltralightAppInit - 0x00003312 0x8 Bin/MifareUltralight.o - 0x00003312 MifareUltralightAppInit + 0x000033d6 0x8 Bin/MifareUltralight.o + 0x000033d6 MifareUltralightAppInit .text.MifareUltralightAppReset - 0x0000331a 0x8 Bin/MifareUltralight.o - 0x0000331a MifareUltralightAppReset + 0x000033de 0x8 Bin/MifareUltralight.o + 0x000033de MifareUltralightAppReset .text.MifareUltralightAppTask - 0x00003322 0x2 Bin/MifareUltralight.o - 0x00003322 MifareUltralightAppTask + 0x000033e6 0x2 Bin/MifareUltralight.o + 0x000033e6 MifareUltralightAppTask .text.MifareUltralightAppProcess - 0x00003324 0x2a4 Bin/MifareUltralight.o - 0x00003324 MifareUltralightAppProcess + 0x000033e8 0x2a2 Bin/MifareUltralight.o + 0x000033e8 MifareUltralightAppProcess .text.MifareUltralightGetUid - 0x000035c8 0x26 Bin/MifareUltralight.o - 0x000035c8 MifareUltralightGetUid + 0x0000368a 0x26 Bin/MifareUltralight.o + 0x0000368a MifareUltralightGetUid .text.MifareUltralightSetUid - 0x000035ee 0x7e Bin/MifareUltralight.o - 0x000035ee MifareUltralightSetUid + 0x000036b0 0x7e Bin/MifareUltralight.o + 0x000036b0 MifareUltralightSetUid .text.MifareClassicAppInit1K - 0x0000366c 0x1e Bin/MifareClassic.o - 0x0000366c MifareClassicAppInit1K + 0x0000372e 0x1e Bin/MifareClassic.o + 0x0000372e MifareClassicAppInit1K .text.MifarePlus1kAppInit_7B - 0x0000368a 0x2a Bin/MifareClassic.o - 0x0000368a MifarePlus1kAppInit_7B + 0x0000374c 0x2a Bin/MifareClassic.o + 0x0000374c MifarePlus1kAppInit_7B .text.MifareClassicAppInit4K - 0x000036b4 0x1e Bin/MifareClassic.o - 0x000036b4 MifareClassicAppInit4K + 0x00003776 0x1e Bin/MifareClassic.o + 0x00003776 MifareClassicAppInit4K .text.MifareClassicAppReset - 0x000036d2 0x8 Bin/MifareClassic.o - 0x000036d2 MifareClassicAppReset + 0x00003794 0x8 Bin/MifareClassic.o + 0x00003794 MifareClassicAppReset .text.MifareClassicAppTask - 0x000036da 0x2 Bin/MifareClassic.o - 0x000036da MifareClassicAppTask + 0x0000379c 0x2 Bin/MifareClassic.o + 0x0000379c MifareClassicAppTask .text.MifareClassicAppProcess - 0x000036dc 0xb88 Bin/MifareClassic.o - 0x000036dc MifareClassicAppProcess + 0x0000379e 0x9fe Bin/MifareClassic.o + 0x0000379e MifareClassicAppProcess .text.MifareClassicGetUid - 0x00004264 0x42 Bin/MifareClassic.o - 0x00004264 MifareClassicGetUid + 0x0000419c 0x42 Bin/MifareClassic.o + 0x0000419c MifareClassicGetUid .text.MifareClassicSetUid - 0x000042a6 0x5e Bin/MifareClassic.o - 0x000042a6 MifareClassicSetUid + 0x000041de 0x5e Bin/MifareClassic.o + 0x000041de MifareClassicSetUid .text.ISO14443AAppendCRCA - 0x00004304 0x5e Bin/ISO14443-3A.o - 0x00004304 ISO14443AAppendCRCA + 0x0000423c 0x5c Bin/ISO14443-3A.o + 0x0000423c ISO14443AAppendCRCA .text.ISO14443ACheckCRCA - 0x00004362 0x7e Bin/ISO14443-3A.o - 0x00004362 ISO14443ACheckCRCA + 0x00004298 0x7c Bin/ISO14443-3A.o + 0x00004298 ISO14443ACheckCRCA .text.Crypto1LFSR - 0x000043e0 0x8c Bin/Crypto1.o + 0x00004314 0x8c Bin/Crypto1.o .text.Crypto1FilterOutput - 0x0000446c 0x68 Bin/Crypto1.o - 0x0000446c Crypto1FilterOutput + 0x000043a0 0x64 Bin/Crypto1.o + 0x000043a0 Crypto1FilterOutput .text.Crypto1Setup - 0x000044d4 0x340 Bin/Crypto1.o - 0x000044d4 Crypto1Setup + 0x00004404 0x19a Bin/Crypto1.o + 0x00004404 Crypto1Setup .text.Crypto1Auth - 0x00004814 0x52 Bin/Crypto1.o - 0x00004814 Crypto1Auth + 0x0000459e 0x4a Bin/Crypto1.o + 0x0000459e Crypto1Auth .text.Crypto1Byte - 0x00004866 0x82 Bin/Crypto1.o - 0x00004866 Crypto1Byte + 0x000045e8 0x26 Bin/Crypto1.o + 0x000045e8 Crypto1Byte .text.Crypto1Nibble - 0x000048e8 0x48 Bin/Crypto1.o - 0x000048e8 Crypto1Nibble + 0x0000460e 0x26 Bin/Crypto1.o + 0x0000460e Crypto1Nibble .text.Crypto1PRNG - 0x00004930 0xb6 Bin/Crypto1.o - 0x00004930 Crypto1PRNG + 0x00004634 0xa0 Bin/Crypto1.o + 0x00004634 Crypto1PRNG .text.USB_Device_ProcessControlRequest - 0x000049e6 0x296 Bin/DeviceStandardReq.o - 0x000049e6 USB_Device_ProcessControlRequest + 0x000046d4 0x240 Bin/DeviceStandardReq.o + 0x000046d4 USB_Device_ProcessControlRequest .text.USB_Event_Stub - 0x00004c7c 0x2 Bin/Events.o - 0x00004c7c USB_Event_Stub - 0x00004c7c EVENT_USB_Device_Suspend - 0x00004c7c EVENT_USB_Device_StartOfFrame - 0x00004c7c EVENT_USB_Device_Reset - 0x00004c7c EVENT_USB_Device_WakeUp + 0x00004914 0x2 Bin/Events.o + 0x00004914 USB_Event_Stub + 0x00004914 EVENT_USB_Device_Suspend + 0x00004914 EVENT_USB_Device_StartOfFrame + 0x00004914 EVENT_USB_Device_Reset + 0x00004914 EVENT_USB_Device_WakeUp .text.USB_USBTask - 0x00004c7e 0x2a Bin/USBTask.o - 0x00004c7e USB_USBTask + 0x00004916 0x2a Bin/USBTask.o + 0x00004916 USB_USBTask .text.Endpoint_Write_Stream_LE - 0x00004ca8 0xd8 Bin/EndpointStream_XMEGA.o - 0x00004ca8 Endpoint_Write_Stream_LE + 0x00004940 0xc8 Bin/EndpointStream_XMEGA.o + 0x00004940 Endpoint_Write_Stream_LE .text.Endpoint_Write_Control_Stream_LE - 0x00004d80 0x142 Bin/EndpointStream_XMEGA.o - 0x00004d80 Endpoint_Write_Control_Stream_LE + 0x00004a08 0x12a Bin/EndpointStream_XMEGA.o + 0x00004a08 Endpoint_Write_Control_Stream_LE .text.Endpoint_Write_Control_PStream_LE - 0x00004ec2 0x13e Bin/EndpointStream_XMEGA.o - 0x00004ec2 Endpoint_Write_Control_PStream_LE + 0x00004b32 0x158 Bin/EndpointStream_XMEGA.o + 0x00004b32 Endpoint_Write_Control_PStream_LE .text.Endpoint_ClearIN - 0x00005000 0x32 Bin/Endpoint_XMEGA.o - 0x00005000 Endpoint_ClearIN + 0x00004c8a 0x32 Bin/Endpoint_XMEGA.o + 0x00004c8a Endpoint_ClearIN .text.Endpoint_ClearOUT - 0x00005032 0x1e Bin/Endpoint_XMEGA.o - 0x00005032 Endpoint_ClearOUT + 0x00004cbc 0x1e Bin/Endpoint_XMEGA.o + 0x00004cbc Endpoint_ClearOUT .text.Endpoint_Read_8 - 0x00005050 0x1e Bin/Endpoint_XMEGA.o - 0x00005050 Endpoint_Read_8 + 0x00004cda 0x20 Bin/Endpoint_XMEGA.o + 0x00004cda Endpoint_Read_8 .text.Endpoint_Write_8 - 0x0000506e 0x1e Bin/Endpoint_XMEGA.o - 0x0000506e Endpoint_Write_8 + 0x00004cfa 0x20 Bin/Endpoint_XMEGA.o + 0x00004cfa Endpoint_Write_8 .text.Endpoint_SelectEndpoint - 0x0000508c 0x72 Bin/Endpoint_XMEGA.o - 0x0000508c Endpoint_SelectEndpoint - .text.Endpoint_StallTransaction - 0x000050fe 0x38 Bin/Endpoint_XMEGA.o - 0x000050fe Endpoint_StallTransaction - .text.Endpoint_ClearSETUP - 0x00005136 0x58 Bin/Endpoint_XMEGA.o - 0x00005136 Endpoint_ClearSETUP - .text.Endpoint_IsSETUPReceived - 0x0000518e 0x32 Bin/Endpoint_XMEGA.o - 0x0000518e Endpoint_IsSETUPReceived - .text.Endpoint_IsOUTReceived - 0x000051c0 0x32 Bin/Endpoint_XMEGA.o - 0x000051c0 Endpoint_IsOUTReceived + 0x00004d1a 0x72 Bin/Endpoint_XMEGA.o + 0x00004d1a Endpoint_SelectEndpoint .text.Endpoint_IsINReady - 0x000051f2 0x18 Bin/Endpoint_XMEGA.o - 0x000051f2 Endpoint_IsINReady + 0x00004d8c 0x18 Bin/Endpoint_XMEGA.o + 0x00004d8c Endpoint_IsINReady + .text.Endpoint_IsOUTReceived + 0x00004da4 0x32 Bin/Endpoint_XMEGA.o + 0x00004da4 Endpoint_IsOUTReceived + .text.Endpoint_IsSETUPReceived + 0x00004dd6 0x32 Bin/Endpoint_XMEGA.o + 0x00004dd6 Endpoint_IsSETUPReceived + .text.Endpoint_ClearSETUP + 0x00004e08 0x58 Bin/Endpoint_XMEGA.o + 0x00004e08 Endpoint_ClearSETUP + .text.Endpoint_StallTransaction + 0x00004e60 0x38 Bin/Endpoint_XMEGA.o + 0x00004e60 Endpoint_StallTransaction .text.Endpoint_ConfigureEndpoint_PRV - 0x0000520a 0x9a Bin/Endpoint_XMEGA.o - 0x0000520a Endpoint_ConfigureEndpoint_PRV + 0x00004e98 0x96 Bin/Endpoint_XMEGA.o + 0x00004e98 Endpoint_ConfigureEndpoint_PRV .text.Endpoint_ConfigureEndpointTable - 0x000052a4 0xec Bin/Endpoint_XMEGA.o - 0x000052a4 Endpoint_ConfigureEndpointTable + 0x00004f2e 0xd8 Bin/Endpoint_XMEGA.o + 0x00004f2e Endpoint_ConfigureEndpointTable .text.Endpoint_ClearEndpoints - 0x00005390 0x70 Bin/Endpoint_XMEGA.o - 0x00005390 Endpoint_ClearEndpoints + 0x00005006 0x70 Bin/Endpoint_XMEGA.o + 0x00005006 Endpoint_ClearEndpoints .text.Endpoint_ClearStatusStage - 0x00005400 0x2c Bin/Endpoint_XMEGA.o - 0x00005400 Endpoint_ClearStatusStage + 0x00005076 0x2c Bin/Endpoint_XMEGA.o + 0x00005076 Endpoint_ClearStatusStage .text.Endpoint_WaitUntilReady - 0x0000542c 0xa6 Bin/Endpoint_XMEGA.o - 0x0000542c Endpoint_WaitUntilReady + 0x000050a2 0xa6 Bin/Endpoint_XMEGA.o + 0x000050a2 Endpoint_WaitUntilReady .text.USB_Disable - 0x000054d2 0x1a Bin/USBController_XMEGA.o - 0x000054d2 USB_Disable + 0x00005148 0x1a Bin/USBController_XMEGA.o + 0x00005148 USB_Disable .text.USB_ResetInterface - 0x000054ec 0x5c Bin/USBController_XMEGA.o - 0x000054ec USB_ResetInterface + 0x00005162 0x5c Bin/USBController_XMEGA.o + 0x00005162 USB_ResetInterface .text.USB_Init - 0x00005548 0x52 Bin/USBController_XMEGA.o - 0x00005548 USB_Init + 0x000051be 0x50 Bin/USBController_XMEGA.o + 0x000051be USB_Init .text.USB_INT_DisableAllInterrupts - 0x0000559a 0xe Bin/USBInterrupt_XMEGA.o - 0x0000559a USB_INT_DisableAllInterrupts + 0x0000520e 0xe Bin/USBInterrupt_XMEGA.o + 0x0000520e USB_INT_DisableAllInterrupts .text.USB_INT_ClearAllInterrupts - 0x000055a8 0xc Bin/USBInterrupt_XMEGA.o - 0x000055a8 USB_INT_ClearAllInterrupts + 0x0000521c 0xc Bin/USBInterrupt_XMEGA.o + 0x0000521c USB_INT_ClearAllInterrupts .text.__vector_125 - 0x000055b4 0xda Bin/USBInterrupt_XMEGA.o - 0x000055b4 __vector_125 + 0x00005228 0xda Bin/USBInterrupt_XMEGA.o + 0x00005228 __vector_125 .text.CDC_Device_ConfigureEndpoints - 0x0000568e 0x4a Bin/CDCClassDevice.o - 0x0000568e CDC_Device_ConfigureEndpoints + 0x00005302 0x4a Bin/CDCClassDevice.o + 0x00005302 CDC_Device_ConfigureEndpoints .text.CDC_Device_SendString - 0x000056d8 0x52 Bin/CDCClassDevice.o - 0x000056d8 CDC_Device_SendString + 0x0000534c 0x4a Bin/CDCClassDevice.o + 0x0000534c CDC_Device_SendString .text.CDC_Device_SendData - 0x0000572a 0x54 Bin/CDCClassDevice.o - 0x0000572a CDC_Device_SendData + 0x00005396 0x54 Bin/CDCClassDevice.o + 0x00005396 CDC_Device_SendData .text.CDC_Device_SendByte - 0x0000577e 0x6e Bin/CDCClassDevice.o - 0x0000577e CDC_Device_SendByte + 0x000053ea 0x6a Bin/CDCClassDevice.o + 0x000053ea CDC_Device_SendByte .text.CDC_Device_Flush - 0x000057ec 0x90 Bin/CDCClassDevice.o - 0x000057ec CDC_Device_Flush + 0x00005454 0x7c Bin/CDCClassDevice.o + 0x00005454 CDC_Device_Flush .text.CDC_Device_USBTask - 0x0000587c 0x36 Bin/CDCClassDevice.o - 0x0000587c CDC_Device_USBTask + 0x000054d0 0x36 Bin/CDCClassDevice.o + 0x000054d0 CDC_Device_USBTask .text.CDC_Device_ReceiveByte - 0x000058b2 0xbe Bin/CDCClassDevice.o - 0x000058b2 CDC_Device_ReceiveByte + 0x00005506 0xb8 Bin/CDCClassDevice.o + 0x00005506 CDC_Device_ReceiveByte .text.CDC_Device_Event_Stub - 0x00005970 0x2 Bin/CDCClassDevice.o - 0x00005970 EVENT_CDC_Device_ControLineStateChanged - 0x00005970 EVENT_CDC_Device_BreakSent - 0x00005970 CDC_Device_Event_Stub - 0x00005970 EVENT_CDC_Device_LineEncodingChanged + 0x000055be 0x2 Bin/CDCClassDevice.o + 0x000055be EVENT_CDC_Device_ControLineStateChanged + 0x000055be EVENT_CDC_Device_BreakSent + 0x000055be CDC_Device_Event_Stub + 0x000055be EVENT_CDC_Device_LineEncodingChanged .text.CDC_Device_ProcessControlRequest - 0x00005972 0x13a Bin/CDCClassDevice.o - 0x00005972 CDC_Device_ProcessControlRequest + 0x000055c0 0x134 Bin/CDCClassDevice.o + 0x000055c0 CDC_Device_ProcessControlRequest + .text.libgcc 0x000056f4 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + 0x000056f4 __tablejump2__ + 0x000056f8 __tablejump__ .text.libgcc.mul - 0x00005aac 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - 0x00005aac __mulshisi3 - 0x00005ab0 __mulohisi3 + 0x00005700 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + 0x00005700 __mulshisi3 + 0x00005704 __mulohisi3 .text.libgcc.mul - 0x00005ab8 0x14 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - 0x00005ab8 __muluhisi3 + 0x0000570c 0x14 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + 0x0000570c __muluhisi3 .text.libgcc.mul - 0x00005acc 0x18 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - 0x00005acc __umulhisi3 + 0x00005720 0x1e c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + 0x00005720 __umulhisi3 .text.avr-libc - 0x00005ae4 0xb4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0x00005b7a rand_r - 0x00005b7c rand - 0x00005b82 srand + 0x0000573e 0xae c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) + 0x000057ce rand_r + 0x000057d0 rand + 0x000057d6 srand .text.avr-libc - 0x00005b98 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - 0x00005b98 memcpy_P + 0x000057ec 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + 0x000057ec memcpy_P .text.avr-libc - 0x00005baa 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - 0x00005baa strcmp_P + 0x000057fe 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + 0x000057fe strcmp_P .text.avr-libc - 0x00005bbc 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) - 0x00005bbc strncat_P + 0x00005810 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) + 0x00005810 strncat_P .text.avr-libc - 0x00005bdc 0x1e c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - 0x00005bdc strncpy_P + 0x00005830 0x1e c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + 0x00005830 strncpy_P .text.avr-libc - 0x00005bfa 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - 0x00005bfa memcpy + 0x0000584e 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + 0x0000584e memcpy .text.avr-libc - 0x00005c0c 0x5a c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x00005c0c snprintf_P + 0x00005860 0xe c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memset.o) + 0x00005860 memset .text.avr-libc - 0x00005c66 0x39a c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x00005c66 vfprintf + 0x0000586e 0x5a c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + 0x0000586e snprintf_P .text.avr-libc - 0x00006000 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - 0x00006000 __eerd_block_x32a4u + 0x000058c8 0x386 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + 0x000058c8 vfprintf .text.avr-libc - 0x00006016 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - 0x00006016 __eewr_block_x32a4u + 0x00005c4e 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + 0x00005c4e __eerd_block_x32a4u .text.avr-libc - 0x00006028 0x46 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - 0x00006028 __eewr_byte_x32a4u - 0x0000602a __eewr_r18_x32a4u + 0x00005c64 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + 0x00005c64 __eewr_block_x32a4u .text.avr-libc - 0x0000606e 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - 0x0000606e strnlen_P + 0x00005c76 0x46 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + 0x00005c76 __eewr_byte_x32a4u + 0x00005c78 __eewr_r18_x32a4u .text.avr-libc - 0x00006084 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - 0x00006084 strnlen + 0x00005cbc 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + 0x00005cbc strnlen_P .text.avr-libc - 0x0000609a 0x58 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0x0000609a fputc + 0x00005cd2 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + 0x00005cd2 strnlen .text.avr-libc - 0x000060f2 0xbc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - 0x000060f2 __ultoa_invert + 0x00005ce8 0x64 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + 0x00005ce8 fputc + .text.avr-libc + 0x00005d4c 0xbc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + 0x00005d4c __ultoa_invert .text.libgcc.div - 0x000061ae 0x36 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - 0x000061ae __divmodsi4 - .text.libgcc.prologue - 0x000061e4 0x32 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - 0x000061e4 __prologue_saves__ - .text.libgcc.prologue - 0x00006216 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - 0x00006216 __epilogue_restores__ + 0x00005e08 0x28 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + 0x00005e08 __divmodsi4 .text.libgcc.div - 0x00006246 0x44 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - 0x00006246 __udivmodsi4 - 0x0000628a . = ALIGN (0x2) + 0x00005e30 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + 0x00005e30 __negsi2 + .text.libgcc.prologue + 0x00005e40 0x32 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + 0x00005e40 __prologue_saves__ + .text.libgcc.prologue + 0x00005e72 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + 0x00005e72 __epilogue_restores__ + .text.libgcc.div + 0x00005ea2 0x44 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00005ea2 __udivmodsi4 + 0x00005ee6 . = ALIGN (0x2) *(.fini9) - .fini9 0x0000628a 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - 0x0000628a _exit - 0x0000628a exit + .fini9 0x00005ee6 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + 0x00005ee6 _exit + 0x00005ee6 exit *(.fini9) *(.fini8) *(.fini8) @@ -1506,96 +1820,16 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr *(.fini1) *(.fini1) *(.fini0) - .fini0 0x0000628a 0x4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) + .fini0 0x00005ee6 0x4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) *(.fini0) - 0x0000628e _etext = . + 0x00005eea _etext = . -.data 0x00802000 0x92 load address 0x0000628e +.data 0x00802000 0x92 load address 0x00005eea 0x00802000 PROVIDE (__data_start, .) *(.data) - .data 0x00802000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - .data 0x00802000 0x0 Bin/Chameleon-Mini.o - .data 0x00802000 0x0 Bin/LUFADescriptors.o - .data 0x00802000 0x0 Bin/System.o - .data 0x00802000 0x0 Bin/Configuration.o - .data 0x00802000 0x0 Bin/Random.o - .data 0x00802000 0x0 Bin/Common.o - .data 0x00802000 0x0 Bin/Memory.o - .data 0x00802000 0x0 Bin/Button.o - .data 0x00802000 0x0 Bin/Log.o - .data 0x00802000 0x0 Bin/Settings.o - .data 0x00802000 0x0 Bin/LED.o .data 0x00802000 0x1c Bin/Terminal.o - 0x00802000 TerminalHandle - .data 0x0080201c 0x0 Bin/Commands.o - .data 0x0080201c 0x0 Bin/XModem.o - .data 0x0080201c 0x0 Bin/CommandLine.o - .data 0x0080201c 0x0 Bin/Codec.o - .data 0x0080201c 0x0 Bin/ISO14443-2A.o - .data 0x0080201c 0x0 Bin/MifareUltralight.o - .data 0x0080201c 0x0 Bin/MifareClassic.o - .data 0x0080201c 0x0 Bin/ISO14443-3A.o - .data 0x0080201c 0x0 Bin/Crypto1.o - .data 0x0080201c 0x0 Bin/HIDParser.o - .data 0x0080201c 0x0 Bin/ConfigDescriptors.o - .data 0x0080201c 0x0 Bin/DeviceStandardReq.o - .data 0x0080201c 0x0 Bin/Events.o - .data 0x0080201c 0x0 Bin/HostStandardReq.o - .data 0x0080201c 0x0 Bin/USBTask.o - .data 0x0080201c 0x0 Bin/Device_XMEGA.o - .data 0x0080201c 0x0 Bin/EndpointStream_XMEGA.o - .data 0x0080201c 0x0 Bin/Endpoint_XMEGA.o - .data 0x0080201c 0x0 Bin/Host_XMEGA.o - .data 0x0080201c 0x0 Bin/PipeStream_XMEGA.o - .data 0x0080201c 0x0 Bin/Pipe_XMEGA.o - .data 0x0080201c 0x0 Bin/USBController_XMEGA.o - .data 0x0080201c 0x0 Bin/USBInterrupt_XMEGA.o - .data 0x0080201c 0x0 Bin/AudioClassDevice.o - .data 0x0080201c 0x0 Bin/CDCClassDevice.o - .data 0x0080201c 0x0 Bin/HIDClassDevice.o - .data 0x0080201c 0x0 Bin/MassStorageClassDevice.o - .data 0x0080201c 0x0 Bin/MIDIClassDevice.o - .data 0x0080201c 0x0 Bin/PrinterClassDevice.o - .data 0x0080201c 0x0 Bin/RNDISClassDevice.o - .data 0x0080201c 0x0 Bin/AndroidAccessoryClassHost.o - .data 0x0080201c 0x0 Bin/AudioClassHost.o - .data 0x0080201c 0x0 Bin/CDCClassHost.o - .data 0x0080201c 0x0 Bin/HIDClassHost.o - .data 0x0080201c 0x0 Bin/MassStorageClassHost.o - .data 0x0080201c 0x0 Bin/MIDIClassHost.o - .data 0x0080201c 0x0 Bin/PrinterClassHost.o - .data 0x0080201c 0x0 Bin/RNDISClassHost.o - .data 0x0080201c 0x0 Bin/StillImageClassHost.o - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .data 0x0080201c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .data 0x0080201c 0x4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .data 0x00802020 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00802001 TerminalHandle + .data 0x0080201c 0x4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) *(.data*) *(.rodata) .rodata 0x00802020 0x70 Bin/Crypto1.o @@ -1653,8 +1887,8 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr COMMON 0x00802e66 0x63 Bin/USBController_XMEGA.o 0x00802e66 USB_EndpointTable 0x00802ec9 PROVIDE (__bss_end, .) - 0x0000628e __data_load_start = LOADADDR (.data) - 0x00006320 __data_load_end = (__data_load_start + SIZEOF (.data)) + 0x00005eea __data_load_start = LOADADDR (.data) + 0x00005f7c __data_load_end = (__data_load_start + SIZEOF (.data)) .noinit 0x00802ec9 0x0 0x00802ec9 PROVIDE (__noinit_start, .) @@ -1684,43 +1918,11 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr .user_signatures *(.user_signatures*) -.stab 0x00000000 0x15a8 +.stab *(.stab) - .stab 0x00000000 0x6cc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - .stab 0x000006cc 0x84 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - 0x90 (size before relaxing) - .stab 0x00000750 0x84 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - 0x90 (size before relaxing) - .stab 0x000007d4 0xd8 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) - 0xe4 (size before relaxing) - .stab 0x000008ac 0xcc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - 0xd8 (size before relaxing) - .stab 0x00000978 0xb4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - 0xc0 (size before relaxing) - .stab 0x00000a2c 0x84 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - 0x90 (size before relaxing) - .stab 0x00000ab0 0x6c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - 0x78 (size before relaxing) - .stab 0x00000b1c 0xb4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - 0xc0 (size before relaxing) - .stab 0x00000bd0 0xfc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - 0x108 (size before relaxing) - .stab 0x00000ccc 0xa8 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - 0xb4 (size before relaxing) - .stab 0x00000d74 0x9c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - 0xa8 (size before relaxing) - .stab 0x00000e10 0x1e0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - 0x1ec (size before relaxing) - .stab 0x00000ff0 0x9c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - 0xa8 (size before relaxing) - .stab 0x0000108c 0x9c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - 0xa8 (size before relaxing) - .stab 0x00001128 0x480 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - 0x48c (size before relaxing) -.stabstr 0x00000000 0x788 +.stabstr *(.stabstr) - .stabstr 0x00000000 0x788 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o .stab.excl *(.stab.excl) @@ -1734,64 +1936,47 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr .stab.indexstr *(.stab.indexstr) -.comment 0x00000000 0x2f +.comment 0x00000000 0x8b *(.comment) .comment 0x00000000 0x2f Bin/Chameleon-Mini.o 0x30 (size before relaxing) - .comment 0x00000000 0x30 Bin/LUFADescriptors.o - .comment 0x00000000 0x30 Bin/System.o - .comment 0x00000000 0x30 Bin/Configuration.o - .comment 0x00000000 0x30 Bin/Random.o - .comment 0x00000000 0x30 Bin/Common.o - .comment 0x00000000 0x30 Bin/Memory.o - .comment 0x00000000 0x30 Bin/Button.o - .comment 0x00000000 0x30 Bin/Log.o - .comment 0x00000000 0x30 Bin/Settings.o - .comment 0x00000000 0x30 Bin/LED.o - .comment 0x00000000 0x30 Bin/Terminal.o - .comment 0x00000000 0x30 Bin/Commands.o - .comment 0x00000000 0x30 Bin/XModem.o - .comment 0x00000000 0x30 Bin/CommandLine.o - .comment 0x00000000 0x30 Bin/Codec.o - .comment 0x00000000 0x30 Bin/ISO14443-2A.o - .comment 0x00000000 0x30 Bin/MifareUltralight.o - .comment 0x00000000 0x30 Bin/MifareClassic.o - .comment 0x00000000 0x30 Bin/ISO14443-3A.o - .comment 0x00000000 0x30 Bin/Crypto1.o - .comment 0x00000000 0x30 Bin/HIDParser.o - .comment 0x00000000 0x30 Bin/ConfigDescriptors.o - .comment 0x00000000 0x30 Bin/DeviceStandardReq.o - .comment 0x00000000 0x30 Bin/Events.o - .comment 0x00000000 0x30 Bin/HostStandardReq.o - .comment 0x00000000 0x30 Bin/USBTask.o - .comment 0x00000000 0x30 Bin/Device_XMEGA.o - .comment 0x00000000 0x30 Bin/EndpointStream_XMEGA.o - .comment 0x00000000 0x30 Bin/Endpoint_XMEGA.o - .comment 0x00000000 0x30 Bin/Host_XMEGA.o - .comment 0x00000000 0x30 Bin/PipeStream_XMEGA.o - .comment 0x00000000 0x30 Bin/Pipe_XMEGA.o - .comment 0x00000000 0x30 Bin/USBController_XMEGA.o - .comment 0x00000000 0x30 Bin/USBInterrupt_XMEGA.o - .comment 0x00000000 0x30 Bin/AudioClassDevice.o - .comment 0x00000000 0x30 Bin/CDCClassDevice.o - .comment 0x00000000 0x30 Bin/HIDClassDevice.o - .comment 0x00000000 0x30 Bin/MassStorageClassDevice.o - .comment 0x00000000 0x30 Bin/MIDIClassDevice.o - .comment 0x00000000 0x30 Bin/PrinterClassDevice.o - .comment 0x00000000 0x30 Bin/RNDISClassDevice.o - .comment 0x00000000 0x30 Bin/AndroidAccessoryClassHost.o - .comment 0x00000000 0x30 Bin/AudioClassHost.o - .comment 0x00000000 0x30 Bin/CDCClassHost.o - .comment 0x00000000 0x30 Bin/HIDClassHost.o - .comment 0x00000000 0x30 Bin/MassStorageClassHost.o - .comment 0x00000000 0x30 Bin/MIDIClassHost.o - .comment 0x00000000 0x30 Bin/PrinterClassHost.o - .comment 0x00000000 0x30 Bin/RNDISClassHost.o - .comment 0x00000000 0x30 Bin/StillImageClassHost.o - .comment 0x00000000 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .comment 0x00000000 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .comment 0x00000000 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .comment 0x00000000 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .comment 0x0000002f 0x30 Bin/LUFADescriptors.o + 0x31 (size before relaxing) + .comment 0x00000000 0x31 Bin/System.o + .comment 0x00000000 0x31 Bin/Configuration.o + .comment 0x00000000 0x31 Bin/Random.o + .comment 0x00000000 0x31 Bin/Common.o + .comment 0x00000000 0x31 Bin/Memory.o + .comment 0x00000000 0x31 Bin/Button.o + .comment 0x00000000 0x31 Bin/Log.o + .comment 0x00000000 0x31 Bin/Settings.o + .comment 0x00000000 0x31 Bin/LED.o + .comment 0x00000000 0x31 Bin/Terminal.o + .comment 0x00000000 0x31 Bin/Commands.o + .comment 0x00000000 0x31 Bin/XModem.o + .comment 0x00000000 0x31 Bin/CommandLine.o + .comment 0x00000000 0x31 Bin/Codec.o + .comment 0x00000000 0x31 Bin/ISO14443-2A.o + .comment 0x00000000 0x31 Bin/MifareUltralight.o + .comment 0x00000000 0x31 Bin/MifareClassic.o + .comment 0x00000000 0x31 Bin/ISO14443-3A.o + .comment 0x00000000 0x31 Bin/Crypto1.o + .comment 0x00000000 0x31 Bin/DeviceStandardReq.o + .comment 0x00000000 0x31 Bin/Events.o + .comment 0x00000000 0x31 Bin/USBTask.o + .comment 0x00000000 0x31 Bin/EndpointStream_XMEGA.o + .comment 0x00000000 0x31 Bin/Endpoint_XMEGA.o + .comment 0x00000000 0x31 Bin/USBController_XMEGA.o + .comment 0x00000000 0x31 Bin/USBInterrupt_XMEGA.o + .comment 0x00000000 0x31 Bin/CDCClassDevice.o + .comment 0x00000000 0x31 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .comment 0x00000000 0x31 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .comment 0x0000005f 0x2c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + 0x2d (size before relaxing) + .comment 0x00000000 0x31 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + +.note.gnu.build-id + *(.note.gnu.build-id) .debug *(.debug) @@ -1805,7 +1990,7 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr .debug_sfnames *(.debug_sfnames) -.debug_aranges 0x00000000 0xd80 +.debug_aranges 0x00000000 0x970 *(.debug_aranges) .debug_aranges 0x00000000 0x20 Bin/Chameleon-Mini.o @@ -1834,515 +2019,306 @@ LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr .debug_aranges 0x000003a0 0x140 Bin/Commands.o .debug_aranges - 0x000004e0 0x40 Bin/XModem.o + 0x000004e0 0x38 Bin/XModem.o .debug_aranges - 0x00000520 0x30 Bin/CommandLine.o + 0x00000518 0x30 Bin/CommandLine.o .debug_aranges - 0x00000550 0x18 Bin/Codec.o + 0x00000548 0x18 Bin/Codec.o .debug_aranges - 0x00000568 0x48 Bin/ISO14443-2A.o + 0x00000560 0x48 Bin/ISO14443-2A.o .debug_aranges - 0x000005b0 0x48 Bin/MifareUltralight.o + 0x000005a8 0x48 Bin/MifareUltralight.o .debug_aranges - 0x000005f8 0x58 Bin/MifareClassic.o + 0x000005f0 0x58 Bin/MifareClassic.o .debug_aranges - 0x00000650 0x28 Bin/ISO14443-3A.o + 0x00000648 0x28 Bin/ISO14443-3A.o .debug_aranges - 0x00000678 0x50 Bin/Crypto1.o + 0x00000670 0x50 Bin/Crypto1.o .debug_aranges - 0x000006c8 0x38 Bin/HIDParser.o + 0x000006c0 0x20 Bin/DeviceStandardReq.o .debug_aranges - 0x00000700 0x38 Bin/ConfigDescriptors.o + 0x000006e0 0x20 Bin/Events.o .debug_aranges - 0x00000738 0x20 Bin/DeviceStandardReq.o + 0x00000700 0x20 Bin/USBTask.o .debug_aranges - 0x00000758 0x20 Bin/Events.o + 0x00000720 0xc8 Bin/EndpointStream_XMEGA.o .debug_aranges - 0x00000778 0x18 Bin/HostStandardReq.o + 0x000007e8 0x90 Bin/Endpoint_XMEGA.o .debug_aranges - 0x00000790 0x20 Bin/USBTask.o + 0x00000878 0x30 Bin/USBController_XMEGA.o .debug_aranges - 0x000007b0 0x20 Bin/Device_XMEGA.o + 0x000008a8 0x30 Bin/USBInterrupt_XMEGA.o .debug_aranges - 0x000007d0 0xc8 Bin/EndpointStream_XMEGA.o - .debug_aranges - 0x00000898 0x90 Bin/Endpoint_XMEGA.o - .debug_aranges - 0x00000928 0x18 Bin/Host_XMEGA.o - .debug_aranges - 0x00000940 0x18 Bin/PipeStream_XMEGA.o - .debug_aranges - 0x00000958 0x18 Bin/Pipe_XMEGA.o - .debug_aranges - 0x00000970 0x30 Bin/USBController_XMEGA.o - .debug_aranges - 0x000009a0 0x30 Bin/USBInterrupt_XMEGA.o - .debug_aranges - 0x000009d0 0x30 Bin/AudioClassDevice.o - .debug_aranges - 0x00000a00 0x98 Bin/CDCClassDevice.o - .debug_aranges - 0x00000a98 0x30 Bin/HIDClassDevice.o - .debug_aranges - 0x00000ac8 0x30 Bin/MassStorageClassDevice.o - .debug_aranges - 0x00000af8 0x40 Bin/MIDIClassDevice.o - .debug_aranges - 0x00000b38 0x90 Bin/PrinterClassDevice.o - .debug_aranges - 0x00000bc8 0x48 Bin/RNDISClassDevice.o - .debug_aranges - 0x00000c10 0x18 Bin/AndroidAccessoryClassHost.o - .debug_aranges - 0x00000c28 0x18 Bin/AudioClassHost.o - .debug_aranges - 0x00000c40 0x18 Bin/CDCClassHost.o - .debug_aranges - 0x00000c58 0x18 Bin/HIDClassHost.o - .debug_aranges - 0x00000c70 0x18 Bin/MassStorageClassHost.o - .debug_aranges - 0x00000c88 0x18 Bin/MIDIClassHost.o - .debug_aranges - 0x00000ca0 0x18 Bin/PrinterClassHost.o - .debug_aranges - 0x00000cb8 0x18 Bin/RNDISClassHost.o - .debug_aranges - 0x00000cd0 0x18 Bin/StillImageClassHost.o - .debug_aranges - 0x00000ce8 0x38 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_aranges - 0x00000d20 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_aranges - 0x00000d40 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_aranges - 0x00000d60 0x20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + 0x000008d8 0x98 Bin/CDCClassDevice.o .debug_pubnames *(.debug_pubnames) -.debug_info 0x00000000 0x1c598 - *(.debug_info) +.debug_info 0x00000000 0x153c4 + *(.debug_info .gnu.linkonce.wi.*) .debug_info 0x00000000 0xe9a Bin/Chameleon-Mini.o .debug_info 0x00000e9a 0x962 Bin/LUFADescriptors.o .debug_info 0x000017fc 0xf3a Bin/System.o - .debug_info 0x00002736 0x78d Bin/Configuration.o - .debug_info 0x00002ec3 0x161 Bin/Random.o - .debug_info 0x00003024 0x1b3 Bin/Common.o - .debug_info 0x000031d7 0x144f Bin/Memory.o - .debug_info 0x00004626 0xc37 Bin/Button.o - .debug_info 0x0000525d 0xdd0 Bin/Log.o - .debug_info 0x0000602d 0x70e Bin/Settings.o - .debug_info 0x0000673b 0xa62 Bin/LED.o - .debug_info 0x0000719d 0xbc1 Bin/Terminal.o - .debug_info 0x00007d5e 0x1e54 Bin/Commands.o - .debug_info 0x00009bb2 0x99e Bin/XModem.o - .debug_info 0x0000a550 0x9bc Bin/CommandLine.o - .debug_info 0x0000af0c 0x203 Bin/Codec.o - .debug_info 0x0000b10f 0x1b56 Bin/ISO14443-2A.o - .debug_info 0x0000cc65 0x9dc Bin/MifareUltralight.o - .debug_info 0x0000d641 0x1423 Bin/MifareClassic.o - .debug_info 0x0000ea64 0x179 Bin/ISO14443-3A.o - .debug_info 0x0000ebdd 0x530 Bin/Crypto1.o - .debug_info 0x0000f10d 0x72e Bin/HIDParser.o - .debug_info 0x0000f83b 0x5ed Bin/ConfigDescriptors.o - .debug_info 0x0000fe28 0x11d6 Bin/DeviceStandardReq.o - .debug_info 0x00010ffe 0x7f Bin/Events.o - .debug_info 0x0001107d 0x5d Bin/HostStandardReq.o - .debug_info 0x000110da 0x435 Bin/USBTask.o - .debug_info 0x0001150f 0x670 Bin/Device_XMEGA.o - .debug_info 0x00011b7f 0x19be Bin/EndpointStream_XMEGA.o - .debug_info 0x0001353d 0xcff Bin/Endpoint_XMEGA.o - .debug_info 0x0001423c 0x5d Bin/Host_XMEGA.o - .debug_info 0x00014299 0x5d Bin/PipeStream_XMEGA.o - .debug_info 0x000142f6 0x5d Bin/Pipe_XMEGA.o - .debug_info 0x00014353 0xd40 Bin/USBController_XMEGA.o - .debug_info 0x00015093 0xa7b Bin/USBInterrupt_XMEGA.o - .debug_info 0x00015b0e 0xa9d Bin/AudioClassDevice.o - .debug_info 0x000165ab 0xf93 Bin/CDCClassDevice.o - .debug_info 0x0001753e 0xf91 Bin/HIDClassDevice.o - .debug_info 0x000184cf 0xaa0 Bin/MassStorageClassDevice.o - .debug_info 0x00018f6f 0x7c6 Bin/MIDIClassDevice.o - .debug_info 0x00019735 0xddd Bin/PrinterClassDevice.o - .debug_info 0x0001a512 0x1311 Bin/RNDISClassDevice.o - .debug_info 0x0001b823 0x5d Bin/AndroidAccessoryClassHost.o - .debug_info 0x0001b880 0x5d Bin/AudioClassHost.o - .debug_info 0x0001b8dd 0x5d Bin/CDCClassHost.o - .debug_info 0x0001b93a 0x5d Bin/HIDClassHost.o - .debug_info 0x0001b997 0x5d Bin/MassStorageClassHost.o - .debug_info 0x0001b9f4 0x5d Bin/MIDIClassHost.o - .debug_info 0x0001ba51 0x5d Bin/PrinterClassHost.o - .debug_info 0x0001baae 0x5d Bin/RNDISClassHost.o - .debug_info 0x0001bb0b 0x5d Bin/StillImageClassHost.o - .debug_info 0x0001bb68 0x157 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_info 0x0001bcbf 0x21c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_info 0x0001bedb 0x549 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_info 0x0001c424 0x174 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - *(.gnu.linkonce.wi.*) + .debug_info 0x00002736 0x78e Bin/Configuration.o + .debug_info 0x00002ec4 0x177 Bin/Random.o + .debug_info 0x0000303b 0x1b3 Bin/Common.o + .debug_info 0x000031ee 0x1441 Bin/Memory.o + .debug_info 0x0000462f 0xc16 Bin/Button.o + .debug_info 0x00005245 0xe26 Bin/Log.o + .debug_info 0x0000606b 0x70d Bin/Settings.o + .debug_info 0x00006778 0xa63 Bin/LED.o + .debug_info 0x000071db 0xbc1 Bin/Terminal.o + .debug_info 0x00007d9c 0x1e67 Bin/Commands.o + .debug_info 0x00009c03 0xa26 Bin/XModem.o + .debug_info 0x0000a629 0x9c9 Bin/CommandLine.o + .debug_info 0x0000aff2 0x203 Bin/Codec.o + .debug_info 0x0000b1f5 0x1b56 Bin/ISO14443-2A.o + .debug_info 0x0000cd4b 0x9d8 Bin/MifareUltralight.o + .debug_info 0x0000d723 0x12cb Bin/MifareClassic.o + .debug_info 0x0000e9ee 0x179 Bin/ISO14443-3A.o + .debug_info 0x0000eb67 0x420 Bin/Crypto1.o + .debug_info 0x0000ef87 0x119b Bin/DeviceStandardReq.o + .debug_info 0x00010122 0x7f Bin/Events.o + .debug_info 0x000101a1 0x433 Bin/USBTask.o + .debug_info 0x000105d4 0x198f Bin/EndpointStream_XMEGA.o + .debug_info 0x00011f63 0xd09 Bin/Endpoint_XMEGA.o + .debug_info 0x00012c6c 0xd3e Bin/USBController_XMEGA.o + .debug_info 0x000139aa 0xa7b Bin/USBInterrupt_XMEGA.o + .debug_info 0x00014425 0xf9f Bin/CDCClassDevice.o -.debug_abbrev 0x00000000 0x6309 +.debug_abbrev 0x00000000 0x4448 *(.debug_abbrev) .debug_abbrev 0x00000000 0x1d9 Bin/Chameleon-Mini.o .debug_abbrev 0x000001d9 0x1bb Bin/LUFADescriptors.o .debug_abbrev 0x00000394 0x16b Bin/System.o - .debug_abbrev 0x000004ff 0x26e Bin/Configuration.o - .debug_abbrev 0x0000076d 0xfb Bin/Random.o - .debug_abbrev 0x00000868 0xb2 Bin/Common.o - .debug_abbrev 0x0000091a 0x348 Bin/Memory.o - .debug_abbrev 0x00000c62 0x2f9 Bin/Button.o - .debug_abbrev 0x00000f5b 0x373 Bin/Log.o - .debug_abbrev 0x000012ce 0x21b Bin/Settings.o - .debug_abbrev 0x000014e9 0x2c1 Bin/LED.o - .debug_abbrev 0x000017aa 0x322 Bin/Terminal.o - .debug_abbrev 0x00001acc 0x38e Bin/Commands.o - .debug_abbrev 0x00001e5a 0x2bd Bin/XModem.o - .debug_abbrev 0x00002117 0x2ce Bin/CommandLine.o - .debug_abbrev 0x000023e5 0xc4 Bin/Codec.o - .debug_abbrev 0x000024a9 0x328 Bin/ISO14443-2A.o - .debug_abbrev 0x000027d1 0x260 Bin/MifareUltralight.o - .debug_abbrev 0x00002a31 0x2f5 Bin/MifareClassic.o - .debug_abbrev 0x00002d26 0xa6 Bin/ISO14443-3A.o - .debug_abbrev 0x00002dcc 0x1bd Bin/Crypto1.o - .debug_abbrev 0x00002f89 0x20a Bin/HIDParser.o - .debug_abbrev 0x00003193 0x248 Bin/ConfigDescriptors.o - .debug_abbrev 0x000033db 0x37e Bin/DeviceStandardReq.o - .debug_abbrev 0x00003759 0x44 Bin/Events.o - .debug_abbrev 0x0000379d 0x26 Bin/HostStandardReq.o - .debug_abbrev 0x000037c3 0x21d Bin/USBTask.o - .debug_abbrev 0x000039e0 0x11e Bin/Device_XMEGA.o - .debug_abbrev 0x00003afe 0x252 Bin/EndpointStream_XMEGA.o - .debug_abbrev 0x00003d50 0x300 Bin/Endpoint_XMEGA.o - .debug_abbrev 0x00004050 0x26 Bin/Host_XMEGA.o - .debug_abbrev 0x00004076 0x26 Bin/PipeStream_XMEGA.o - .debug_abbrev 0x0000409c 0x26 Bin/Pipe_XMEGA.o - .debug_abbrev 0x000040c2 0x306 Bin/USBController_XMEGA.o - .debug_abbrev 0x000043c8 0x266 Bin/USBInterrupt_XMEGA.o - .debug_abbrev 0x0000462e 0x28b Bin/AudioClassDevice.o - .debug_abbrev 0x000048b9 0x439 Bin/CDCClassDevice.o - .debug_abbrev 0x00004cf2 0x2de Bin/HIDClassDevice.o - .debug_abbrev 0x00004fd0 0x338 Bin/MassStorageClassDevice.o - .debug_abbrev 0x00005308 0x287 Bin/MIDIClassDevice.o - .debug_abbrev 0x0000558f 0x3e1 Bin/PrinterClassDevice.o - .debug_abbrev 0x00005970 0x36d Bin/RNDISClassDevice.o - .debug_abbrev 0x00005cdd 0x26 Bin/AndroidAccessoryClassHost.o - .debug_abbrev 0x00005d03 0x26 Bin/AudioClassHost.o - .debug_abbrev 0x00005d29 0x26 Bin/CDCClassHost.o - .debug_abbrev 0x00005d4f 0x26 Bin/HIDClassHost.o - .debug_abbrev 0x00005d75 0x26 Bin/MassStorageClassHost.o - .debug_abbrev 0x00005d9b 0x26 Bin/MIDIClassHost.o - .debug_abbrev 0x00005dc1 0x26 Bin/PrinterClassHost.o - .debug_abbrev 0x00005de7 0x26 Bin/RNDISClassHost.o - .debug_abbrev 0x00005e0d 0x26 Bin/StillImageClassHost.o - .debug_abbrev 0x00005e33 0xd6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_abbrev 0x00005f09 0x139 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_abbrev 0x00006042 0x1d6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_abbrev 0x00006218 0xf1 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_abbrev 0x000004ff 0x25f Bin/Configuration.o + .debug_abbrev 0x0000075e 0x113 Bin/Random.o + .debug_abbrev 0x00000871 0xb2 Bin/Common.o + .debug_abbrev 0x00000923 0x351 Bin/Memory.o + .debug_abbrev 0x00000c74 0x2f5 Bin/Button.o + .debug_abbrev 0x00000f69 0x39c Bin/Log.o + .debug_abbrev 0x00001305 0x217 Bin/Settings.o + .debug_abbrev 0x0000151c 0x2b2 Bin/LED.o + .debug_abbrev 0x000017ce 0x322 Bin/Terminal.o + .debug_abbrev 0x00001af0 0x397 Bin/Commands.o + .debug_abbrev 0x00001e87 0x2b4 Bin/XModem.o + .debug_abbrev 0x0000213b 0x2c5 Bin/CommandLine.o + .debug_abbrev 0x00002400 0xc4 Bin/Codec.o + .debug_abbrev 0x000024c4 0x328 Bin/ISO14443-2A.o + .debug_abbrev 0x000027ec 0x260 Bin/MifareUltralight.o + .debug_abbrev 0x00002a4c 0x2f5 Bin/MifareClassic.o + .debug_abbrev 0x00002d41 0xa6 Bin/ISO14443-3A.o + .debug_abbrev 0x00002de7 0x1a9 Bin/Crypto1.o + .debug_abbrev 0x00002f90 0x38d Bin/DeviceStandardReq.o + .debug_abbrev 0x0000331d 0x44 Bin/Events.o + .debug_abbrev 0x00003361 0x21b Bin/USBTask.o + .debug_abbrev 0x0000357c 0x252 Bin/EndpointStream_XMEGA.o + .debug_abbrev 0x000037ce 0x300 Bin/Endpoint_XMEGA.o + .debug_abbrev 0x00003ace 0x2f7 Bin/USBController_XMEGA.o + .debug_abbrev 0x00003dc5 0x266 Bin/USBInterrupt_XMEGA.o + .debug_abbrev 0x0000402b 0x41d Bin/CDCClassDevice.o -.debug_line 0x00000000 0xd67b - *(.debug_line) +.debug_line 0x00000000 0x8de3 + *(.debug_line .debug_line.* .debug_line_end) .debug_line 0x00000000 0x41a Bin/Chameleon-Mini.o - .debug_line 0x0000041a 0x39a Bin/LUFADescriptors.o - .debug_line 0x000007b4 0x2ee Bin/System.o - .debug_line 0x00000aa2 0x448 Bin/Configuration.o - .debug_line 0x00000eea 0x144 Bin/Random.o - .debug_line 0x0000102e 0x246 Bin/Common.o - .debug_line 0x00001274 0xaa3 Bin/Memory.o - .debug_line 0x00001d17 0x535 Bin/Button.o - .debug_line 0x0000224c 0x5a5 Bin/Log.o - .debug_line 0x000027f1 0x3a7 Bin/Settings.o - .debug_line 0x00002b98 0x4e9 Bin/LED.o - .debug_line 0x00003081 0x498 Bin/Terminal.o - .debug_line 0x00003519 0xab5 Bin/Commands.o - .debug_line 0x00003fce 0x588 Bin/XModem.o - .debug_line 0x00004556 0x42e Bin/CommandLine.o - .debug_line 0x00004984 0xdf Bin/Codec.o - .debug_line 0x00004a63 0x70e Bin/ISO14443-2A.o - .debug_line 0x00005171 0x3fa Bin/MifareUltralight.o - .debug_line 0x0000556b 0x98b Bin/MifareClassic.o - .debug_line 0x00005ef6 0x1d7 Bin/ISO14443-3A.o - .debug_line 0x000060cd 0x75c Bin/Crypto1.o - .debug_line 0x00006829 0x668 Bin/HIDParser.o - .debug_line 0x00006e91 0x325 Bin/ConfigDescriptors.o - .debug_line 0x000071b6 0x532 Bin/DeviceStandardReq.o - .debug_line 0x000076e8 0x4f Bin/Events.o - .debug_line 0x00007737 0x1a Bin/HostStandardReq.o - .debug_line 0x00007751 0x269 Bin/USBTask.o - .debug_line 0x000079ba 0x1e5 Bin/Device_XMEGA.o - .debug_line 0x00007b9f 0x16b5 Bin/EndpointStream_XMEGA.o - .debug_line 0x00009254 0x75d Bin/Endpoint_XMEGA.o - .debug_line 0x000099b1 0x1a Bin/Host_XMEGA.o - .debug_line 0x000099cb 0x1a Bin/PipeStream_XMEGA.o - .debug_line 0x000099e5 0x1a Bin/Pipe_XMEGA.o - .debug_line 0x000099ff 0x411 Bin/USBController_XMEGA.o - .debug_line 0x00009e10 0x410 Bin/USBInterrupt_XMEGA.o - .debug_line 0x0000a220 0x4b3 Bin/AudioClassDevice.o - .debug_line 0x0000a6d3 0x892 Bin/CDCClassDevice.o - .debug_line 0x0000af65 0x628 Bin/HIDClassDevice.o - .debug_line 0x0000b58d 0x56f Bin/MassStorageClassDevice.o - .debug_line 0x0000bafc 0x462 Bin/MIDIClassDevice.o - .debug_line 0x0000bf5e 0x7d5 Bin/PrinterClassDevice.o - .debug_line 0x0000c733 0x7ba Bin/RNDISClassDevice.o - .debug_line 0x0000ceed 0x1a Bin/AndroidAccessoryClassHost.o - .debug_line 0x0000cf07 0x1a Bin/AudioClassHost.o - .debug_line 0x0000cf21 0x1a Bin/CDCClassHost.o - .debug_line 0x0000cf3b 0x1a Bin/HIDClassHost.o - .debug_line 0x0000cf55 0x1a Bin/MassStorageClassHost.o - .debug_line 0x0000cf6f 0x1a Bin/MIDIClassHost.o - .debug_line 0x0000cf89 0x1a Bin/PrinterClassHost.o - .debug_line 0x0000cfa3 0x1a Bin/RNDISClassHost.o - .debug_line 0x0000cfbd 0x1a Bin/StillImageClassHost.o - .debug_line 0x0000cfd7 0xa1 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_line 0x0000d078 0x1a6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_line 0x0000d21e 0x359 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_line 0x0000d577 0x104 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_line 0x0000041a 0x2fb Bin/LUFADescriptors.o + .debug_line 0x00000715 0x271 Bin/System.o + .debug_line 0x00000986 0x3a3 Bin/Configuration.o + .debug_line 0x00000d29 0x105 Bin/Random.o + .debug_line 0x00000e2e 0x213 Bin/Common.o + .debug_line 0x00001041 0x9a7 Bin/Memory.o + .debug_line 0x000019e8 0x496 Bin/Button.o + .debug_line 0x00001e7e 0x4da Bin/Log.o + .debug_line 0x00002358 0x302 Bin/Settings.o + .debug_line 0x0000265a 0x43e Bin/LED.o + .debug_line 0x00002a98 0x41a Bin/Terminal.o + .debug_line 0x00002eb2 0xa13 Bin/Commands.o + .debug_line 0x000038c5 0x501 Bin/XModem.o + .debug_line 0x00003dc6 0x39c Bin/CommandLine.o + .debug_line 0x00004162 0xa0 Bin/Codec.o + .debug_line 0x00004202 0x6a4 Bin/ISO14443-2A.o + .debug_line 0x000048a6 0x3af Bin/MifareUltralight.o + .debug_line 0x00004c55 0x92f Bin/MifareClassic.o + .debug_line 0x00005584 0x16c Bin/ISO14443-3A.o + .debug_line 0x000056f0 0x45f Bin/Crypto1.o + .debug_line 0x00005b4f 0x49f Bin/DeviceStandardReq.o + .debug_line 0x00005fee 0x4f Bin/Events.o + .debug_line 0x0000603d 0x1eb Bin/USBTask.o + .debug_line 0x00006228 0x1570 Bin/EndpointStream_XMEGA.o + .debug_line 0x00007798 0x6d0 Bin/Endpoint_XMEGA.o + .debug_line 0x00007e68 0x38d Bin/USBController_XMEGA.o + .debug_line 0x000081f5 0x392 Bin/USBInterrupt_XMEGA.o + .debug_line 0x00008587 0x85c Bin/CDCClassDevice.o -.debug_frame 0x00000000 0x2304 +.debug_frame 0x00000000 0x19fc *(.debug_frame) .debug_frame 0x00000000 0x24 Bin/Chameleon-Mini.o .debug_frame 0x00000024 0x24 Bin/LUFADescriptors.o .debug_frame 0x00000048 0xa0 Bin/System.o - .debug_frame 0x000000e8 0xf4 Bin/Configuration.o - .debug_frame 0x000001dc 0x64 Bin/Random.o - .debug_frame 0x00000240 0x40 Bin/Common.o - .debug_frame 0x00000280 0x174 Bin/Memory.o - .debug_frame 0x000003f4 0xc0 Bin/Button.o - .debug_frame 0x000004b4 0x114 Bin/Log.o - .debug_frame 0x000005c8 0xa8 Bin/Settings.o - .debug_frame 0x00000670 0xa0 Bin/LED.o - .debug_frame 0x00000710 0xcc Bin/Terminal.o - .debug_frame 0x000007dc 0x3d4 Bin/Commands.o - .debug_frame 0x00000bb0 0x6c Bin/XModem.o - .debug_frame 0x00000c1c 0x78 Bin/CommandLine.o - .debug_frame 0x00000c94 0x100 Bin/ISO14443-2A.o - .debug_frame 0x00000d94 0xbc Bin/MifareUltralight.o - .debug_frame 0x00000e50 0xfc Bin/MifareClassic.o - .debug_frame 0x00000f4c 0x34 Bin/ISO14443-3A.o - .debug_frame 0x00000f80 0x13c Bin/Crypto1.o - .debug_frame 0x000010bc 0x11c Bin/HIDParser.o - .debug_frame 0x000011d8 0xd0 Bin/ConfigDescriptors.o - .debug_frame 0x000012a8 0x40 Bin/DeviceStandardReq.o - .debug_frame 0x000012e8 0x24 Bin/Events.o - .debug_frame 0x0000130c 0x2c Bin/USBTask.o - .debug_frame 0x00001338 0x24 Bin/Device_XMEGA.o - .debug_frame 0x0000135c 0x4f8 Bin/EndpointStream_XMEGA.o - .debug_frame 0x00001854 0x160 Bin/Endpoint_XMEGA.o - .debug_frame 0x000019b4 0x5c Bin/USBController_XMEGA.o - .debug_frame 0x00001a10 0x8c Bin/USBInterrupt_XMEGA.o - .debug_frame 0x00001a9c 0xa4 Bin/AudioClassDevice.o - .debug_frame 0x00001b40 0x1e0 Bin/CDCClassDevice.o - .debug_frame 0x00001d20 0xf0 Bin/HIDClassDevice.o - .debug_frame 0x00001e10 0x80 Bin/MassStorageClassDevice.o - .debug_frame 0x00001e90 0xa4 Bin/MIDIClassDevice.o - .debug_frame 0x00001f34 0x194 Bin/PrinterClassDevice.o - .debug_frame 0x000020c8 0x100 Bin/RNDISClassDevice.o - .debug_frame 0x000021c8 0x88 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_frame 0x00002250 0x30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_frame 0x00002280 0x4c c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_frame 0x000022cc 0x38 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_frame 0x000000e8 0xfc Bin/Configuration.o + .debug_frame 0x000001e4 0x64 Bin/Random.o + .debug_frame 0x00000248 0x40 Bin/Common.o + .debug_frame 0x00000288 0x170 Bin/Memory.o + .debug_frame 0x000003f8 0xc8 Bin/Button.o + .debug_frame 0x000004c0 0x114 Bin/Log.o + .debug_frame 0x000005d4 0x9c Bin/Settings.o + .debug_frame 0x00000670 0xa8 Bin/LED.o + .debug_frame 0x00000718 0xcc Bin/Terminal.o + .debug_frame 0x000007e4 0x3d0 Bin/Commands.o + .debug_frame 0x00000bb4 0x5c Bin/XModem.o + .debug_frame 0x00000c10 0x68 Bin/CommandLine.o + .debug_frame 0x00000c78 0x118 Bin/ISO14443-2A.o + .debug_frame 0x00000d90 0xbc Bin/MifareUltralight.o + .debug_frame 0x00000e4c 0xf8 Bin/MifareClassic.o + .debug_frame 0x00000f44 0x34 Bin/ISO14443-3A.o + .debug_frame 0x00000f78 0x13c Bin/Crypto1.o + .debug_frame 0x000010b4 0x40 Bin/DeviceStandardReq.o + .debug_frame 0x000010f4 0x24 Bin/Events.o + .debug_frame 0x00001118 0x2c Bin/USBTask.o + .debug_frame 0x00001144 0x4a0 Bin/EndpointStream_XMEGA.o + .debug_frame 0x000015e4 0x15c Bin/Endpoint_XMEGA.o + .debug_frame 0x00001740 0x50 Bin/USBController_XMEGA.o + .debug_frame 0x00001790 0x8c Bin/USBInterrupt_XMEGA.o + .debug_frame 0x0000181c 0x1e0 Bin/CDCClassDevice.o -.debug_str 0x00000000 0x7fb5 +.debug_str 0x00000000 0x63bb *(.debug_str) - .debug_str 0x00000000 0xb76 Bin/Chameleon-Mini.o - 0xc3b (size before relaxing) - .debug_str 0x00000b76 0x8cc Bin/LUFADescriptors.o - 0xb22 (size before relaxing) - .debug_str 0x00001442 0x9d2 Bin/System.o - 0xc3b (size before relaxing) - .debug_str 0x00001e14 0x402 Bin/Configuration.o - 0x783 (size before relaxing) - .debug_str 0x00002216 0x27 Bin/Random.o - 0x11c (size before relaxing) - .debug_str 0x0000223d 0x56 Bin/Common.o - 0x13f (size before relaxing) - .debug_str 0x00002293 0x37b Bin/Memory.o - 0x9f5 (size before relaxing) - .debug_str 0x0000260e 0x1fa Bin/Button.o - 0x90f (size before relaxing) - .debug_str 0x00002808 0x101 Bin/Log.o - 0x9a7 (size before relaxing) - .debug_str 0x00002909 0xc0 Bin/Settings.o - 0x7ba (size before relaxing) - .debug_str 0x000029c9 0x8f Bin/LED.o - 0x851 (size before relaxing) - .debug_str 0x00002a58 0x253 Bin/Terminal.o - 0x861 (size before relaxing) - .debug_str 0x00002cab 0x509 Bin/Commands.o - 0xf89 (size before relaxing) - .debug_str 0x000031b4 0x130 Bin/XModem.o - 0x538 (size before relaxing) - .debug_str 0x000032e4 0xc1 Bin/CommandLine.o - 0x515 (size before relaxing) - .debug_str 0x000033a5 0x1a Bin/Codec.o - 0x27d (size before relaxing) - .debug_str 0x000033bf 0x12f9 Bin/ISO14443-2A.o - 0x1d48 (size before relaxing) - .debug_str 0x000046b8 0x17d Bin/MifareUltralight.o - 0x4f7 (size before relaxing) - .debug_str 0x00004835 0x272 Bin/MifareClassic.o - 0x69d (size before relaxing) - .debug_str 0x00004aa7 0x1a Bin/ISO14443-3A.o - 0x136 (size before relaxing) - .debug_str 0x00004ac1 0x95 Bin/Crypto1.o - 0x1c4 (size before relaxing) - .debug_str 0x00004b56 0x492 Bin/HIDParser.o - 0x5f8 (size before relaxing) - .debug_str 0x00004fe8 0x22e Bin/ConfigDescriptors.o - 0x436 (size before relaxing) - .debug_str 0x00005216 0xa04 Bin/DeviceStandardReq.o - 0x1134 (size before relaxing) - .debug_str 0x00005c1a 0x31 Bin/Events.o - 0xe3 (size before relaxing) - .debug_str 0x00005c4b 0x2b Bin/HostStandardReq.o - 0xdd (size before relaxing) - .debug_str 0x00005c76 0x6d Bin/USBTask.o - 0x3af (size before relaxing) - .debug_str 0x00005ce3 0x4a Bin/Device_XMEGA.o - 0x523 (size before relaxing) - .debug_str 0x00005d2d 0x4d9 Bin/EndpointStream_XMEGA.o - 0x8c7 (size before relaxing) - .debug_str 0x00006206 0x2aa Bin/Endpoint_XMEGA.o - 0xa35 (size before relaxing) - .debug_str 0x000064b0 0x2c Bin/Host_XMEGA.o - 0xde (size before relaxing) - .debug_str 0x000064dc 0x32 Bin/PipeStream_XMEGA.o - 0xe4 (size before relaxing) - .debug_str 0x0000650e 0x2c Bin/Pipe_XMEGA.o - 0xde (size before relaxing) - .debug_str 0x0000653a 0x1bb Bin/USBController_XMEGA.o - 0xdc5 (size before relaxing) - .debug_str 0x000066f5 0xaa Bin/USBInterrupt_XMEGA.o - 0x896 (size before relaxing) - .debug_str 0x0000679f 0x280 Bin/AudioClassDevice.o - 0x70a (size before relaxing) - .debug_str 0x00006a1f 0x286 Bin/CDCClassDevice.o - 0xa5f (size before relaxing) - .debug_str 0x00006ca5 0x248 Bin/HIDClassDevice.o - 0xa7a (size before relaxing) - .debug_str 0x00006eed 0x261 Bin/MassStorageClassDevice.o - 0x85d (size before relaxing) - .debug_str 0x0000714e 0x115 Bin/MIDIClassDevice.o - 0x6b4 (size before relaxing) - .debug_str 0x00007263 0x269 Bin/PrinterClassDevice.o - 0x988 (size before relaxing) - .debug_str 0x000074cc 0x6e5 Bin/RNDISClassDevice.o - 0xdbd (size before relaxing) - .debug_str 0x00007bb1 0x3b Bin/AndroidAccessoryClassHost.o - 0xed (size before relaxing) - .debug_str 0x00007bec 0x30 Bin/AudioClassHost.o - 0xe2 (size before relaxing) - .debug_str 0x00007c1c 0x2e Bin/CDCClassHost.o - 0xe0 (size before relaxing) - .debug_str 0x00007c4a 0x2e Bin/HIDClassHost.o - 0xe0 (size before relaxing) - .debug_str 0x00007c78 0x36 Bin/MassStorageClassHost.o - 0xe8 (size before relaxing) - .debug_str 0x00007cae 0x2f Bin/MIDIClassHost.o - 0xe1 (size before relaxing) - .debug_str 0x00007cdd 0x32 Bin/PrinterClassHost.o - 0xe4 (size before relaxing) - .debug_str 0x00007d0f 0x30 Bin/RNDISClassHost.o - 0xe2 (size before relaxing) - .debug_str 0x00007d3f 0x35 Bin/StillImageClassHost.o - 0xe7 (size before relaxing) - .debug_str 0x00007d74 0x81 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0xba (size before relaxing) - .debug_str 0x00007df5 0x91 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x149 (size before relaxing) - .debug_str 0x00007e86 0xcd c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x1ad (size before relaxing) - .debug_str 0x00007f53 0x62 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0x10d (size before relaxing) + .debug_str 0x00000000 0xb9a Bin/Chameleon-Mini.o + 0xc5f (size before relaxing) + .debug_str 0x00000b9a 0x996 Bin/LUFADescriptors.o + 0xc04 (size before relaxing) + .debug_str 0x00001530 0x9d2 Bin/System.o + 0xd1d (size before relaxing) + .debug_str 0x00001f02 0x402 Bin/Configuration.o + 0x865 (size before relaxing) + .debug_str 0x00002304 0x2c Bin/Random.o + 0x1fe (size before relaxing) + .debug_str 0x00002330 0x56 Bin/Common.o + 0x221 (size before relaxing) + .debug_str 0x00002386 0x37b Bin/Memory.o + 0xad7 (size before relaxing) + .debug_str 0x00002701 0x205 Bin/Button.o + 0x9f1 (size before relaxing) + .debug_str 0x00002906 0x112 Bin/Log.o + 0xaa1 (size before relaxing) + .debug_str 0x00002a18 0xc0 Bin/Settings.o + 0x89c (size before relaxing) + .debug_str 0x00002ad8 0x8f Bin/LED.o + 0x933 (size before relaxing) + .debug_str 0x00002b67 0x253 Bin/Terminal.o + 0x943 (size before relaxing) + .debug_str 0x00002dba 0x510 Bin/Commands.o + 0x106b (size before relaxing) + .debug_str 0x000032ca 0x130 Bin/XModem.o + 0x61a (size before relaxing) + .debug_str 0x000033fa 0xc1 Bin/CommandLine.o + 0x5f7 (size before relaxing) + .debug_str 0x000034bb 0x1a Bin/Codec.o + 0x35f (size before relaxing) + .debug_str 0x000034d5 0x12ff Bin/ISO14443-2A.o + 0x1e2a (size before relaxing) + .debug_str 0x000047d4 0x17d Bin/MifareUltralight.o + 0x5d9 (size before relaxing) + .debug_str 0x00004951 0x272 Bin/MifareClassic.o + 0x77f (size before relaxing) + .debug_str 0x00004bc3 0x1a Bin/ISO14443-3A.o + 0x218 (size before relaxing) + .debug_str 0x00004bdd 0x95 Bin/Crypto1.o + 0x2a6 (size before relaxing) + .debug_str 0x00004c72 0xa21 Bin/DeviceStandardReq.o + 0x1216 (size before relaxing) + .debug_str 0x00005693 0x31 Bin/Events.o + 0x1c5 (size before relaxing) + .debug_str 0x000056c4 0x6d Bin/USBTask.o + 0x491 (size before relaxing) + .debug_str 0x00005731 0x4e3 Bin/EndpointStream_XMEGA.o + 0x9a9 (size before relaxing) + .debug_str 0x00005c14 0x2bc Bin/Endpoint_XMEGA.o + 0xb17 (size before relaxing) + .debug_str 0x00005ed0 0x1bb Bin/USBController_XMEGA.o + 0xea7 (size before relaxing) + .debug_str 0x0000608b 0xaa Bin/USBInterrupt_XMEGA.o + 0x978 (size before relaxing) + .debug_str 0x00006135 0x286 Bin/CDCClassDevice.o + 0xb41 (size before relaxing) -.debug_loc 0x00000000 0xeb2a +.debug_loc 0x00000000 0xad30 *(.debug_loc) - .debug_loc 0x00000000 0x277 Bin/LUFADescriptors.o - .debug_loc 0x00000277 0x2f Bin/System.o - .debug_loc 0x000002a6 0x3cf Bin/Configuration.o - .debug_loc 0x00000675 0xaa Bin/Random.o - .debug_loc 0x0000071f 0x319 Bin/Common.o - .debug_loc 0x00000a38 0xc2f Bin/Memory.o - .debug_loc 0x00001667 0x75a Bin/Button.o - .debug_loc 0x00001dc1 0x5d9 Bin/Log.o - .debug_loc 0x0000239a 0x2bb Bin/Settings.o - .debug_loc 0x00002655 0x555 Bin/LED.o - .debug_loc 0x00002baa 0x1c9 Bin/Terminal.o - .debug_loc 0x00002d73 0xe44 Bin/Commands.o - .debug_loc 0x00003bb7 0x2e3 Bin/XModem.o - .debug_loc 0x00003e9a 0x4f4 Bin/CommandLine.o - .debug_loc 0x0000438e 0x515 Bin/ISO14443-2A.o - .debug_loc 0x000048a3 0x679 Bin/MifareUltralight.o - .debug_loc 0x00004f1c 0x101d Bin/MifareClassic.o - .debug_loc 0x00005f39 0x231 Bin/ISO14443-3A.o - .debug_loc 0x0000616a 0xa3a Bin/Crypto1.o - .debug_loc 0x00006ba4 0xc34 Bin/HIDParser.o - .debug_loc 0x000077d8 0x536 Bin/ConfigDescriptors.o - .debug_loc 0x00007d0e 0x2d9 Bin/DeviceStandardReq.o - .debug_loc 0x00007fe7 0x22 Bin/USBTask.o - .debug_loc 0x00008009 0x2bf0 Bin/EndpointStream_XMEGA.o - .debug_loc 0x0000abf9 0x581 Bin/Endpoint_XMEGA.o - .debug_loc 0x0000b17a 0xa3 Bin/USBController_XMEGA.o - .debug_loc 0x0000b21d 0x200 Bin/USBInterrupt_XMEGA.o - .debug_loc 0x0000b41d 0x3ad Bin/AudioClassDevice.o - .debug_loc 0x0000b7ca 0x9f6 Bin/CDCClassDevice.o - .debug_loc 0x0000c1c0 0x473 Bin/HIDClassDevice.o - .debug_loc 0x0000c633 0x303 Bin/MassStorageClassDevice.o - .debug_loc 0x0000c936 0x35f Bin/MIDIClassDevice.o - .debug_loc 0x0000cc95 0x8b8 Bin/PrinterClassDevice.o - .debug_loc 0x0000d54d 0xd71 Bin/RNDISClassDevice.o - .debug_loc 0x0000e2be 0x1e8 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_loc 0x0000e4a6 0x74 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_loc 0x0000e51a 0x51d c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_loc 0x0000ea37 0xf3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_loc 0x00000000 0x253 Bin/LUFADescriptors.o + .debug_loc 0x00000253 0x2f Bin/System.o + .debug_loc 0x00000282 0x4a7 Bin/Configuration.o + .debug_loc 0x00000729 0xde Bin/Random.o + .debug_loc 0x00000807 0x34b Bin/Common.o + .debug_loc 0x00000b52 0xedd Bin/Memory.o + .debug_loc 0x00001a2f 0x80b Bin/Button.o + .debug_loc 0x0000223a 0x675 Bin/Log.o + .debug_loc 0x000028af 0x205 Bin/Settings.o + .debug_loc 0x00002ab4 0x5d8 Bin/LED.o + .debug_loc 0x0000308c 0x1e4 Bin/Terminal.o + .debug_loc 0x00003270 0xee7 Bin/Commands.o + .debug_loc 0x00004157 0x34b Bin/XModem.o + .debug_loc 0x000044a2 0x4df Bin/CommandLine.o + .debug_loc 0x00004981 0x523 Bin/ISO14443-2A.o + .debug_loc 0x00004ea4 0x663 Bin/MifareUltralight.o + .debug_loc 0x00005507 0xd8a Bin/MifareClassic.o + .debug_loc 0x00006291 0x317 Bin/ISO14443-3A.o + .debug_loc 0x000065a8 0x7ad Bin/Crypto1.o + .debug_loc 0x00006d55 0x2d8 Bin/DeviceStandardReq.o + .debug_loc 0x0000702d 0x22 Bin/USBTask.o + .debug_loc 0x0000704f 0x2acb Bin/EndpointStream_XMEGA.o + .debug_loc 0x00009b1a 0x58b Bin/Endpoint_XMEGA.o + .debug_loc 0x0000a0a5 0x80 Bin/USBController_XMEGA.o + .debug_loc 0x0000a125 0x200 Bin/USBInterrupt_XMEGA.o + .debug_loc 0x0000a325 0xa0b Bin/CDCClassDevice.o .debug_macinfo *(.debug_macinfo) +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + .debug_pubtypes *(.debug_pubtypes) -.debug_ranges 0x00000000 0x1de0 +.debug_ranges 0x00000000 0x1568 *(.debug_ranges) .debug_ranges 0x00000000 0x28 Bin/Chameleon-Mini.o .debug_ranges 0x00000028 0x10 Bin/LUFADescriptors.o .debug_ranges 0x00000038 0x48 Bin/System.o - .debug_ranges 0x00000080 0xb0 Bin/Configuration.o - .debug_ranges 0x00000130 0x28 Bin/Random.o - .debug_ranges 0x00000158 0x48 Bin/Common.o - .debug_ranges 0x000001a0 0x320 Bin/Memory.o - .debug_ranges 0x000004c0 0xe8 Bin/Button.o - .debug_ranges 0x000005a8 0x88 Bin/Log.o - .debug_ranges 0x00000630 0x40 Bin/Settings.o - .debug_ranges 0x00000670 0x138 Bin/LED.o - .debug_ranges 0x000007a8 0xc0 Bin/Terminal.o - .debug_ranges 0x00000868 0x190 Bin/Commands.o - .debug_ranges 0x000009f8 0x48 Bin/XModem.o - .debug_ranges 0x00000a40 0x120 Bin/CommandLine.o - .debug_ranges 0x00000b60 0xc0 Bin/ISO14443-2A.o - .debug_ranges 0x00000c20 0xc8 Bin/MifareUltralight.o - .debug_ranges 0x00000ce8 0x230 Bin/MifareClassic.o - .debug_ranges 0x00000f18 0x18 Bin/ISO14443-3A.o - .debug_ranges 0x00000f30 0x70 Bin/Crypto1.o - .debug_ranges 0x00000fa0 0x150 Bin/HIDParser.o - .debug_ranges 0x000010f0 0x40 Bin/ConfigDescriptors.o - .debug_ranges 0x00001130 0x138 Bin/DeviceStandardReq.o - .debug_ranges 0x00001268 0x10 Bin/Events.o - .debug_ranges 0x00001278 0x60 Bin/USBTask.o - .debug_ranges 0x000012d8 0x10 Bin/Device_XMEGA.o - .debug_ranges 0x000012e8 0x4a8 Bin/EndpointStream_XMEGA.o - .debug_ranges 0x00001790 0x188 Bin/Endpoint_XMEGA.o - .debug_ranges 0x00001918 0x20 Bin/USBController_XMEGA.o - .debug_ranges 0x00001938 0x20 Bin/USBInterrupt_XMEGA.o - .debug_ranges 0x00001958 0x38 Bin/AudioClassDevice.o - .debug_ranges 0x00001990 0x100 Bin/CDCClassDevice.o - .debug_ranges 0x00001a90 0x20 Bin/HIDClassDevice.o - .debug_ranges 0x00001ab0 0xa0 Bin/MassStorageClassDevice.o - .debug_ranges 0x00001b50 0x48 Bin/MIDIClassDevice.o - .debug_ranges 0x00001b98 0x128 Bin/PrinterClassDevice.o - .debug_ranges 0x00001cc0 0xc8 Bin/RNDISClassDevice.o - .debug_ranges 0x00001d88 0x28 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_ranges 0x00001db0 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_ranges 0x00001dc0 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_ranges 0x00001dd0 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_ranges 0x00000080 0xb8 Bin/Configuration.o + .debug_ranges 0x00000138 0x28 Bin/Random.o + .debug_ranges 0x00000160 0x48 Bin/Common.o + .debug_ranges 0x000001a8 0x298 Bin/Memory.o + .debug_ranges 0x00000440 0x90 Bin/Button.o + .debug_ranges 0x000004d0 0x70 Bin/Log.o + .debug_ranges 0x00000540 0x40 Bin/Settings.o + .debug_ranges 0x00000580 0xe8 Bin/LED.o + .debug_ranges 0x00000668 0xa0 Bin/Terminal.o + .debug_ranges 0x00000708 0x168 Bin/Commands.o + .debug_ranges 0x00000870 0x40 Bin/XModem.o + .debug_ranges 0x000008b0 0xc8 Bin/CommandLine.o + .debug_ranges 0x00000978 0xc0 Bin/ISO14443-2A.o + .debug_ranges 0x00000a38 0xb8 Bin/MifareUltralight.o + .debug_ranges 0x00000af0 0x1c0 Bin/MifareClassic.o + .debug_ranges 0x00000cb0 0x18 Bin/ISO14443-3A.o + .debug_ranges 0x00000cc8 0x40 Bin/Crypto1.o + .debug_ranges 0x00000d08 0xf0 Bin/DeviceStandardReq.o + .debug_ranges 0x00000df8 0x10 Bin/Events.o + .debug_ranges 0x00000e08 0x38 Bin/USBTask.o + .debug_ranges 0x00000e40 0x4f0 Bin/EndpointStream_XMEGA.o + .debug_ranges 0x00001330 0xf8 Bin/Endpoint_XMEGA.o + .debug_ranges 0x00001428 0x20 Bin/USBController_XMEGA.o + .debug_ranges 0x00001448 0x20 Bin/USBInterrupt_XMEGA.o + .debug_ranges 0x00001468 0x100 Bin/CDCClassDevice.o .debug_macro *(.debug_macro) @@ -2352,12 +2328,12 @@ LOAD linker stubs Cross Reference Table Symbol File -ActiveConfiguration Bin/MifareClassic.o +ActiveConfiguration Bin/Configuration.o + Bin/MifareClassic.o Bin/MifareUltralight.o Bin/ISO14443-2A.o Bin/Commands.o Bin/Button.o - Bin/Configuration.o Bin/Chameleon-Mini.o Audio_Device_ConfigureEndpoints Bin/AudioClassDevice.o Audio_Device_Event_Stub Bin/AudioClassDevice.o @@ -2405,8 +2381,8 @@ CDC_Device_SendString Bin/CDCClassDevice.o Bin/Terminal.o CDC_Device_USBTask Bin/CDCClassDevice.o Bin/Terminal.o -CodecBuffer Bin/ISO14443-2A.o - Bin/Codec.o +CodecBuffer Bin/Codec.o + Bin/ISO14443-2A.o CommandExecButton Bin/Commands.o Bin/CommandLine.o CommandExecButtonLong Bin/Commands.o @@ -2674,8 +2650,8 @@ Endpoint_Write_Stream_LE Bin/EndpointStream_XMEGA.o Bin/MassStorageClassDevice.o Bin/HIDClassDevice.o Bin/CDCClassDevice.o -GlobalSettings Bin/LED.o - Bin/Settings.o +GlobalSettings Bin/Settings.o + Bin/LED.o Bin/Log.o Bin/Button.o Bin/Memory.o @@ -2714,8 +2690,8 @@ LEDTrigger Bin/LED.o Bin/Settings.o Bin/Memory.o LanguageString Bin/LUFADescriptors.o -LogFunc Bin/ISO14443-2A.o - Bin/Log.o +LogFunc Bin/Log.o + Bin/ISO14443-2A.o LogGetModeByName Bin/Log.o Bin/Commands.o LogGetModeList Bin/Log.o @@ -2846,9 +2822,9 @@ SystemStartUSBClock Bin/System.o Bin/Terminal.o SystemStopUSBClock Bin/System.o Bin/Terminal.o -TerminalBuffer Bin/CommandLine.o +TerminalBuffer Bin/Terminal.o + Bin/CommandLine.o Bin/XModem.o - Bin/Terminal.o TerminalHandle Bin/Terminal.o Bin/XModem.o Bin/Log.o @@ -2866,7 +2842,8 @@ TerminalTask Bin/Terminal.o Bin/Chameleon-Mini.o TerminalTick Bin/Terminal.o Bin/Chameleon-Mini.o -USB_ControlRequest Bin/RNDISClassDevice.o +USB_ControlRequest Bin/USBTask.o + Bin/RNDISClassDevice.o Bin/PrinterClassDevice.o Bin/MassStorageClassDevice.o Bin/HIDClassDevice.o @@ -2874,9 +2851,9 @@ USB_ControlRequest Bin/RNDISClassDevice.o Bin/AudioClassDevice.o Bin/Endpoint_XMEGA.o Bin/EndpointStream_XMEGA.o - Bin/USBTask.o Bin/DeviceStandardReq.o -USB_DeviceState Bin/RNDISClassDevice.o +USB_DeviceState Bin/USBTask.o + Bin/RNDISClassDevice.o Bin/PrinterClassDevice.o Bin/MIDIClassDevice.o Bin/MassStorageClassDevice.o @@ -2886,41 +2863,40 @@ USB_DeviceState Bin/RNDISClassDevice.o Bin/USBController_XMEGA.o Bin/Endpoint_XMEGA.o Bin/EndpointStream_XMEGA.o - Bin/USBTask.o Bin/DeviceStandardReq.o -USB_Device_ConfigurationNumber Bin/USBInterrupt_XMEGA.o +USB_Device_ConfigurationNumber Bin/DeviceStandardReq.o + Bin/USBInterrupt_XMEGA.o + Bin/USBController_XMEGA.o +USB_Device_CurrentlySelfPowered Bin/DeviceStandardReq.o Bin/USBController_XMEGA.o - Bin/DeviceStandardReq.o -USB_Device_CurrentlySelfPowered Bin/USBController_XMEGA.o - Bin/DeviceStandardReq.o USB_Device_ProcessControlRequest Bin/DeviceStandardReq.o Bin/USBTask.o -USB_Device_RemoteWakeupEnabled Bin/USBController_XMEGA.o - Bin/DeviceStandardReq.o +USB_Device_RemoteWakeupEnabled Bin/DeviceStandardReq.o + Bin/USBController_XMEGA.o USB_Device_SendRemoteWakeup Bin/Device_XMEGA.o USB_Disable Bin/USBController_XMEGA.o Bin/Commands.o Bin/Terminal.o USB_EndpointTable Bin/USBController_XMEGA.o -USB_Endpoint_FIFOs Bin/PrinterClassDevice.o +USB_Endpoint_FIFOs Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o Bin/MassStorageClassDevice.o - Bin/Endpoint_XMEGA.o Bin/DeviceStandardReq.o -USB_Endpoint_SelectedEndpoint Bin/PrinterClassDevice.o +USB_Endpoint_SelectedEndpoint Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o Bin/MIDIClassDevice.o Bin/CDCClassDevice.o - Bin/Endpoint_XMEGA.o Bin/EndpointStream_XMEGA.o Bin/USBTask.o -USB_Endpoint_SelectedFIFO Bin/PrinterClassDevice.o +USB_Endpoint_SelectedFIFO Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o Bin/MIDIClassDevice.o Bin/HIDClassDevice.o Bin/CDCClassDevice.o - Bin/Endpoint_XMEGA.o Bin/EndpointStream_XMEGA.o -USB_Endpoint_SelectedHandle Bin/PrinterClassDevice.o +USB_Endpoint_SelectedHandle Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o Bin/MassStorageClassDevice.o - Bin/Endpoint_XMEGA.o Bin/DeviceStandardReq.o USB_Event_Stub Bin/Events.o USB_GetHIDReportItemInfo Bin/HIDParser.o @@ -2935,8 +2911,8 @@ USB_INT_DisableAllInterrupts Bin/USBInterrupt_XMEGA.o Bin/USBController_XMEGA.o USB_Init Bin/USBController_XMEGA.o Bin/Terminal.o -USB_IsInitialized Bin/USBController_XMEGA.o - Bin/USBTask.o +USB_IsInitialized Bin/USBTask.o + Bin/USBController_XMEGA.o USB_ProcessHIDReport Bin/HIDParser.o USB_ResetInterface Bin/USBController_XMEGA.o USB_SetHIDReportItemInfo Bin/HIDParser.o @@ -2954,15 +2930,15 @@ XModemSend Bin/XModem.o Bin/Commands.o XModemTick Bin/XModem.o Bin/Terminal.o -__bad_interrupt c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__bss_end c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) -__bss_start c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) -__data_end c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) -__data_load_start c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) -__data_start c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) -__divmodsi4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -__do_clear_bss c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) +__bad_interrupt c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__bss_end c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) +__bss_start c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) +__data_end c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) +__data_load_start c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) +__data_start c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) +__divmodsi4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) +__do_clear_bss c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) Bin/USBController_XMEGA.o Bin/Endpoint_XMEGA.o Bin/USBTask.o @@ -2981,226 +2957,234 @@ __do_clear_bss c:/program files (x86)/atmel/a Bin/Button.o Bin/Memory.o Bin/Configuration.o -__do_copy_data c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) +__do_copy_data c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) Bin/RNDISClassDevice.o Bin/CDCClassDevice.o Bin/Crypto1.o Bin/Commands.o Bin/Terminal.o -__eerd_block_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) +__eerd_block_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) Bin/Settings.o -__eerd_byte_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) +__eerd_byte_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o -__eeupd_byte_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +__eeupd_byte_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) Bin/EndpointStream_XMEGA.o -__eeupd_r18_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -__eewr_block_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) +__eeupd_r18_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +__eewr_block_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) Bin/Settings.o -__eewr_byte_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) -__eewr_r18_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -__epilogue_restores__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) -__heap_end c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__init c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__mulohisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -__mulshisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) +__eewr_byte_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) +__eewr_r18_x32a4u c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +__epilogue_restores__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_epilogue.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +__heap_end c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__init c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__mulohisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) +__mulshisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) Bin/Commands.o -__muluhisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) -__prologue_saves__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) -__stack c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__tablejump2__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) +__muluhisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_mulshisi3.o) +__negsi2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_negsi2.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) +__prologue_saves__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_prologue.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +__stack c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__tablejump2__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + Bin/DeviceStandardReq.o Bin/HIDParser.o -__tablejump__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) -__udivmodsi4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) -__ultoa_invert c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -__umulhisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) -__vector_1 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + Bin/MifareClassic.o + Bin/ISO14443-2A.o + Bin/XModem.o + Bin/LED.o +__tablejump__ c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) +__udivmodsi4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodsi4.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_divmodsi4.o) +__ultoa_invert c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) +__umulhisi3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_umulhisi3.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_muluhisi3.o) +__vector_1 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_10 Bin/System.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_100 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_101 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_102 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_103 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_104 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_105 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_106 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_107 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_108 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_109 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_11 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_110 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_111 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_112 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_113 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_114 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_115 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_116 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_117 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_118 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_119 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_120 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_121 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_122 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_123 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_124 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_100 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_101 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_102 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_103 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_104 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_105 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_106 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_107 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_108 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_109 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_11 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_110 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_111 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_112 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_113 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_114 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_115 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_116 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_117 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_118 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_119 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_120 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_121 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_122 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_123 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_124 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_125 Bin/USBInterrupt_XMEGA.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_126 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_13 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_14 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_15 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_17 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_18 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_19 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_21 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_126 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_13 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_14 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_15 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_17 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_18 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_19 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_20 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_21 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_22 Bin/ISO14443-2A.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_23 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_24 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_25 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_26 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_27 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_28 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_29 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_31 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_32 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_33 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_23 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_24 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_25 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_26 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_27 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_28 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_29 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_3 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_30 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_31 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_32 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_33 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_34 Bin/ISO14443-2A.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_35 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_36 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_37 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_38 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_39 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_40 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_41 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_42 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_43 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_44 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_45 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_46 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_47 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_48 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_49 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_5 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_50 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_51 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_52 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_53 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_54 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_55 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_56 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_57 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_58 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_59 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_60 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_61 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_62 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_63 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_64 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_65 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_66 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_67 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_68 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_69 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_7 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_70 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_71 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_72 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_73 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_74 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_75 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_76 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_77 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_78 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_79 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_8 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_80 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_81 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_82 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_35 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_36 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_37 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_38 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_39 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_40 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_41 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_42 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_43 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_44 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_45 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_46 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_47 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_48 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_49 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_5 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_50 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_51 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_52 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_53 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_54 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_55 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_56 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_57 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_58 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_59 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_60 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_61 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_62 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_63 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_64 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_65 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_66 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_67 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_68 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_69 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_7 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_70 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_71 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_72 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_73 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_74 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_75 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_76 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_77 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_78 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_79 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_8 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_80 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_81 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_82 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_83 Bin/ISO14443-2A.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_84 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_85 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_86 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_87 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_88 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_89 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_9 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_90 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_91 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_92 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_93 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_94 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_95 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_96 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_97 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_98 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_99 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_84 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_85 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_86 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_87 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_88 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_89 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_9 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_90 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_91 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_92 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_93 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_94 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_95 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_96 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_97 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_98 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_99 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o __vector_default Bin/System.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vectors c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -_exit c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) -eeprom_mapen c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -exit c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -fputc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vectors c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +_exit c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) +eeprom_mapen c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) +exit c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +fputc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) main Bin/Chameleon-Mini.o - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -memcmp c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +memcmp c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) Bin/HIDClassDevice.o -memcpy c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) +memcpy c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) Bin/RNDISClassDevice.o Bin/HIDClassDevice.o -memcpy_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) +memcpy_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) Bin/RNDISClassDevice.o Bin/Configuration.o -memset c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) +memset c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memset.o) Bin/HIDClassDevice.o -rand c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + Bin/Log.o +rand c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) Bin/Random.o -rand_r c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -snprintf_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +rand_r c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) +snprintf_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) Bin/Commands.o -srand c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -strcmp_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) +srand c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(rand.o) +strcmp_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) Bin/CommandLine.o Bin/Commands.o Bin/LED.o Bin/Log.o Bin/Button.o -strncat_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) +strncat_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncat_P.o) Bin/Log.o -strncpy_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) +strncpy_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) Bin/LED.o Bin/Log.o Bin/Button.o -strnlen c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -strnlen_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -vfprintf c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.2.1002/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +strnlen c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) +strnlen_P c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) +vfprintf c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.5/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.sym b/Firmware/Chameleon-Mini/Chameleon-Mini.sym index 47e8088..092b39c 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.sym +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.sym @@ -38,28 +38,6 @@ 00000000 a __tmp_reg__ 00000000 a __tmp_reg__ 00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 a __tmp_reg__ 00000000 T __vectors 00000001 a __zero_reg__ 00000001 a __zero_reg__ @@ -94,50 +72,6 @@ 00000001 a __zero_reg__ 00000001 a __zero_reg__ 00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000001 a __zero_reg__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ 00000034 a __CCP__ 00000034 a __CCP__ 00000034 a __CCP__ @@ -204,50 +138,6 @@ 0000003d a __SP_L__ 0000003d a __SP_L__ 0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003d a __SP_L__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ 0000003e a __SP_H__ 0000003e a __SP_H__ 0000003e a __SP_H__ @@ -314,452 +204,431 @@ 0000003f a __SREG__ 0000003f a __SREG__ 0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -0000003f a __SREG__ -000001fc T ProductString -0000021a T ManufacturerString -00000234 T LanguageString -00000238 T ConfigurationDescriptor -00000276 T DeviceDescriptor -00000288 t ConfigurationTable -00000366 t ButtonActionTable -00000486 t LogModeTable -000004b6 t __c.6349 -000004b8 t LEDFuncTable -000005b8 t __c.6462 -000005f1 t __c.6464 -000005f8 t __c.6466 -000005ff t __c.6468 -00000605 t __c.6473 -00000608 t __c.6491 -0000060f t __c.6518 -00000612 t __c.6523 -00000615 t __c.6573 -0000061b t __c.6575 -00000623 t __c.6577 -00000629 t __c.6582 -0000062c t __c.6587 -00000634 t __c.6589 -0000063a t __c.6619 -00000641 T CommandTable -0000080f t __c.6126 -00000812 t __c.6128 -00000815 t StatusTable -000008dc T __ctors_end -000008dc T __ctors_start -000008dc T __dtors_end -000008dc T __dtors_start -000008dc W __init -000008dc T __trampolines_end -000008dc T __trampolines_start -000008e8 T __do_copy_data -000008fe T __do_clear_bss -00000906 t .do_clear_bss_loop -00000908 t .do_clear_bss_start -00000914 T __bad_interrupt -00000914 W __vector_1 -00000914 W __vector_100 -00000914 W __vector_101 -00000914 W __vector_102 -00000914 W __vector_103 -00000914 W __vector_104 -00000914 W __vector_105 -00000914 W __vector_106 -00000914 W __vector_107 -00000914 W __vector_108 -00000914 W __vector_109 -00000914 W __vector_11 -00000914 W __vector_110 -00000914 W __vector_111 -00000914 W __vector_112 -00000914 W __vector_113 -00000914 W __vector_114 -00000914 W __vector_115 -00000914 W __vector_116 -00000914 W __vector_117 -00000914 W __vector_118 -00000914 W __vector_119 -00000914 W __vector_12 -00000914 W __vector_120 -00000914 W __vector_121 -00000914 W __vector_122 -00000914 W __vector_123 -00000914 W __vector_124 -00000914 W __vector_126 -00000914 W __vector_13 -00000914 W __vector_14 -00000914 W __vector_15 -00000914 W __vector_16 -00000914 W __vector_17 -00000914 W __vector_18 -00000914 W __vector_19 -00000914 W __vector_2 -00000914 W __vector_20 -00000914 W __vector_21 -00000914 W __vector_23 -00000914 W __vector_24 -00000914 W __vector_25 -00000914 W __vector_26 -00000914 W __vector_27 -00000914 W __vector_28 -00000914 W __vector_29 -00000914 W __vector_3 -00000914 W __vector_30 -00000914 W __vector_31 -00000914 W __vector_32 -00000914 W __vector_33 -00000914 W __vector_35 -00000914 W __vector_36 -00000914 W __vector_37 -00000914 W __vector_38 -00000914 W __vector_39 -00000914 W __vector_4 -00000914 W __vector_40 -00000914 W __vector_41 -00000914 W __vector_42 -00000914 W __vector_43 -00000914 W __vector_44 -00000914 W __vector_45 -00000914 W __vector_46 -00000914 W __vector_47 -00000914 W __vector_48 -00000914 W __vector_49 -00000914 W __vector_5 -00000914 W __vector_50 -00000914 W __vector_51 -00000914 W __vector_52 -00000914 W __vector_53 -00000914 W __vector_54 -00000914 W __vector_55 -00000914 W __vector_56 -00000914 W __vector_57 -00000914 W __vector_58 -00000914 W __vector_59 -00000914 W __vector_6 -00000914 W __vector_60 -00000914 W __vector_61 -00000914 W __vector_62 -00000914 W __vector_63 -00000914 W __vector_64 -00000914 W __vector_65 -00000914 W __vector_66 -00000914 W __vector_67 -00000914 W __vector_68 -00000914 W __vector_69 -00000914 W __vector_7 -00000914 W __vector_70 -00000914 W __vector_71 -00000914 W __vector_72 -00000914 W __vector_73 -00000914 W __vector_74 -00000914 W __vector_75 -00000914 W __vector_76 -00000914 W __vector_77 -00000914 W __vector_78 -00000914 W __vector_79 -00000914 W __vector_8 -00000914 W __vector_80 -00000914 W __vector_81 -00000914 W __vector_82 -00000914 W __vector_84 -00000914 W __vector_85 -00000914 W __vector_86 -00000914 W __vector_87 -00000914 W __vector_88 -00000914 W __vector_89 -00000914 W __vector_9 -00000914 W __vector_90 -00000914 W __vector_91 -00000914 W __vector_92 -00000914 W __vector_93 -00000914 W __vector_94 -00000914 W __vector_95 -00000914 W __vector_96 -00000914 W __vector_97 -00000914 W __vector_98 -00000914 W __vector_99 -00000916 T main -000009a2 T CALLBACK_USB_GetDescriptor -00000a24 T __vector_default -00000a30 T __vector_10 -00000a32 T SystemInit -00000ab8 T SystemReset -00000ac6 T SystemEnterBootloader -00000ad2 T SystemStartUSBClock -00000b0e T SystemStopUSBClock -00000b34 T SystemInterruptInit -00000b40 t CodecInitDummy -00000b42 t CodecTaskDummy -00000b44 t ApplicationInitDummy -00000b46 t ApplicationResetDummy -00000b48 t ApplicationTaskDummy -00000b4a t ApplicationProcessDummy -00000b50 t ApplicationGetUidDummy -00000b52 t ApplicationSetUidDummy -00000b54 T ConfigurationSetById -00000b8a T ConfigurationInit -00000b96 T ConfigurationSetByName -00000c18 T ConfigurationGetList -00000c76 T RandomInit -00000c78 T RandomGetByte -00000c7e T RandomGetBuffer -00000c9c T RandomTick -00000cac T BufferToHexString -00000d30 T HexStringToBuffer -00000dbc T MemoryReadBlock -00000dec T MemoryWriteBlock -00000e24 T MemoryClear -00000e34 T MemoryRecall -00000f20 T MemoryInit -0000101e T MemoryStore -000012ac T MemoryUploadBlock -00001636 T MemoryDownloadBlock -000016b0 t ExecuteButtonAction -0000185a T ButtonInit -00001868 T ButtonTick -000018b2 T ButtonGetActionList -00001916 T ButtonSetActionById -00001964 T ButtonGetActionByName -0000199c T ButtonSetActionByName -00001a60 t LogFuncOff -00001a62 t LogFuncTerminal -00001a8e T LogTick -00001a90 T LogTask -00001a92 T LogMemLoadBlock -00001ac2 T LogMemClear -00001aec T LogMemFree -00001af6 T LogSetModeById -00001b36 t LogFuncMemory -00001ba4 T LogInit -00001bb2 T LogSetModeByName -00001bfc T LogGetModeByName -00001c18 T LogGetModeList -00001c68 T SettingsLoad -00001c78 T SettingsSave -00001c88 T SettingsSetActiveById -00001cec T SettingsCycle -00001e0c T SettingsGetActiveById -00001e14 T SettingsGetActiveByName -00001e28 T SettingsSetActiveByName -00001e3a T LEDInit -00001e44 T LEDTick -00001f5e T LEDTrigger -00001f7e T LEDGetFuncList -00001fe2 T LEDSetFuncById -0000208e T LEDGetFuncByName -000020c8 T LEDSetFuncByName -00002178 T TerminalSendString -00002182 T TerminalSendStringP -000021aa T TerminalSendBlock -000021b6 T TerminalInit -000021c0 T TerminalTask -00002202 T TerminalTick -00002282 T EVENT_USB_Device_Connect -00002288 T EVENT_USB_Device_Disconnect -0000228e T EVENT_USB_Device_ConfigurationChanged -00002296 T EVENT_USB_Device_ControlRequest -0000229e T CommandGetVersion -000022da T CommandGetConfig -00002306 T CommandSetConfig -00002318 T CommandExecConfig -00002324 T CommandGetUid -00002372 T CommandSetUid -00002424 T CommandGetReadOnly -00002448 T CommandSetReadOnly -00002470 T CommandExecUpload -0000247a T CommandExecDownload -00002484 T CommandExecReset -0000249a T CommandExecUpgrade -000024b0 T CommandGetMemSize -000024e0 T CommandGetUidSize -0000250c T CommandExecButton -00002516 T CommandGetButton -00002524 T CommandSetButton -00002538 T CommandExecButtonLong -00002542 T CommandGetButtonLong -00002550 T CommandSetButtonLong -00002564 T CommandExecLedGreen -0000256e T CommandGetLedGreen -0000257c T CommandSetLedGreen -00002590 T CommandExecLedRed -0000259a T CommandGetLedRed -000025a8 T CommandSetLedRed -000025bc T CommandExecLogMode -000025c6 T CommandGetLogMode -000025d0 T CommandSetLogMode -000025e0 T CommandExecLogMem -00002614 T CommandGetLogMem -00002648 T CommandSetLogMem -00002688 T CommandGetSetting -00002692 T CommandSetSetting -000026a2 T CommandExecClear -000026aa T CommandExecHelp -00002742 T CommandGetRssi -000027aa t CalcChecksum.constprop.0 -000027be T XModemReceive -000027f4 T XModemSend -00002820 T XModemProcessByte -00002ab6 T XModemTick -00002b2c T CommandLineProcessByte -00002d3a T CommandLineTick -00002d3c t StartDemod -00002db6 T __vector_34 -00002e18 T __vector_22 -00002f60 T __vector_83 +000002f2 T __trampolines_end +000002f2 T __trampolines_start +000002f2 T ProductString +00000310 T ManufacturerString +0000032a T LanguageString +0000032e T ConfigurationDescriptor +0000036c T DeviceDescriptor +0000037e t ConfigurationTable +0000045c t ButtonActionTable +0000057c t __c.6448 +0000057e t LogModeTable +000005ae t LEDFuncTable +000006ae t __c.6718 +000006b5 t __c.6688 +000006bb t __c.6686 +000006c3 t __c.6681 +000006c6 t __c.6672 +000006cc t __c.6674 +000006d4 t __c.6676 +000006da t __c.6622 +000006dd t __c.6617 +000006e0 t __c.6590 +000006e7 t __c.6572 +000006ea t __c.6561 +00000723 t __c.6563 +0000072a t __c.6565 +00000731 t __c.6567 +00000737 t __c.6227 +0000073a t __c.6225 +0000073d t StatusTable +00000803 T CommandTable +000009d2 T __ctors_end +000009d2 T __ctors_start +000009d2 T __dtors_end +000009d2 T __dtors_start +000009d2 W __init +000009de T __do_copy_data +000009f4 T __do_clear_bss +000009fc t .do_clear_bss_loop +000009fe t .do_clear_bss_start +00000a0a T __bad_interrupt +00000a0a W __vector_1 +00000a0a W __vector_100 +00000a0a W __vector_101 +00000a0a W __vector_102 +00000a0a W __vector_103 +00000a0a W __vector_104 +00000a0a W __vector_105 +00000a0a W __vector_106 +00000a0a W __vector_107 +00000a0a W __vector_108 +00000a0a W __vector_109 +00000a0a W __vector_11 +00000a0a W __vector_110 +00000a0a W __vector_111 +00000a0a W __vector_112 +00000a0a W __vector_113 +00000a0a W __vector_114 +00000a0a W __vector_115 +00000a0a W __vector_116 +00000a0a W __vector_117 +00000a0a W __vector_118 +00000a0a W __vector_119 +00000a0a W __vector_12 +00000a0a W __vector_120 +00000a0a W __vector_121 +00000a0a W __vector_122 +00000a0a W __vector_123 +00000a0a W __vector_124 +00000a0a W __vector_126 +00000a0a W __vector_13 +00000a0a W __vector_14 +00000a0a W __vector_15 +00000a0a W __vector_16 +00000a0a W __vector_17 +00000a0a W __vector_18 +00000a0a W __vector_19 +00000a0a W __vector_2 +00000a0a W __vector_20 +00000a0a W __vector_21 +00000a0a W __vector_23 +00000a0a W __vector_24 +00000a0a W __vector_25 +00000a0a W __vector_26 +00000a0a W __vector_27 +00000a0a W __vector_28 +00000a0a W __vector_29 +00000a0a W __vector_3 +00000a0a W __vector_30 +00000a0a W __vector_31 +00000a0a W __vector_32 +00000a0a W __vector_33 +00000a0a W __vector_35 +00000a0a W __vector_36 +00000a0a W __vector_37 +00000a0a W __vector_38 +00000a0a W __vector_39 +00000a0a W __vector_4 +00000a0a W __vector_40 +00000a0a W __vector_41 +00000a0a W __vector_42 +00000a0a W __vector_43 +00000a0a W __vector_44 +00000a0a W __vector_45 +00000a0a W __vector_46 +00000a0a W __vector_47 +00000a0a W __vector_48 +00000a0a W __vector_49 +00000a0a W __vector_5 +00000a0a W __vector_50 +00000a0a W __vector_51 +00000a0a W __vector_52 +00000a0a W __vector_53 +00000a0a W __vector_54 +00000a0a W __vector_55 +00000a0a W __vector_56 +00000a0a W __vector_57 +00000a0a W __vector_58 +00000a0a W __vector_59 +00000a0a W __vector_6 +00000a0a W __vector_60 +00000a0a W __vector_61 +00000a0a W __vector_62 +00000a0a W __vector_63 +00000a0a W __vector_64 +00000a0a W __vector_65 +00000a0a W __vector_66 +00000a0a W __vector_67 +00000a0a W __vector_68 +00000a0a W __vector_69 +00000a0a W __vector_7 +00000a0a W __vector_70 +00000a0a W __vector_71 +00000a0a W __vector_72 +00000a0a W __vector_73 +00000a0a W __vector_74 +00000a0a W __vector_75 +00000a0a W __vector_76 +00000a0a W __vector_77 +00000a0a W __vector_78 +00000a0a W __vector_79 +00000a0a W __vector_8 +00000a0a W __vector_80 +00000a0a W __vector_81 +00000a0a W __vector_82 +00000a0a W __vector_84 +00000a0a W __vector_85 +00000a0a W __vector_86 +00000a0a W __vector_87 +00000a0a W __vector_88 +00000a0a W __vector_89 +00000a0a W __vector_9 +00000a0a W __vector_90 +00000a0a W __vector_91 +00000a0a W __vector_92 +00000a0a W __vector_93 +00000a0a W __vector_94 +00000a0a W __vector_95 +00000a0a W __vector_96 +00000a0a W __vector_97 +00000a0a W __vector_98 +00000a0a W __vector_99 +00000a0c T main +00000a98 T CALLBACK_USB_GetDescriptor +00000b14 T __vector_default +00000b20 T __vector_10 +00000b22 T SystemInit +00000ba8 T SystemReset +00000bb6 T SystemEnterBootloader +00000bc2 T SystemStartUSBClock +00000bfe T SystemStopUSBClock +00000c24 T SystemInterruptInit +00000c30 t CodecInitDummy +00000c32 t CodecTaskDummy +00000c34 t ApplicationInitDummy +00000c36 t ApplicationResetDummy +00000c38 t ApplicationTaskDummy +00000c3a t ApplicationProcessDummy +00000c40 t ApplicationGetUidDummy +00000c42 t ApplicationSetUidDummy +00000c44 T ConfigurationSetById +00000c7a T ConfigurationInit +00000c86 T ConfigurationSetByName +00000d00 T ConfigurationGetList +00000d72 T RandomInit +00000d74 T RandomGetByte +00000d7a T RandomGetBuffer +00000d9a T RandomTick +00000daa T BufferToHexString +00000e30 T HexStringToBuffer +00000ec4 T MemoryReadBlock +00000ef4 T MemoryWriteBlock +00000f28 T MemoryClear +00000f3e T MemoryRecall +0000102a T MemoryInit +00001128 T MemoryStore +000013ac T MemoryUploadBlock +000016e2 T MemoryDownloadBlock +0000175c t ExecuteButtonAction +000018f6 T ButtonInit +00001904 T ButtonTick +0000194e T ButtonGetActionList +000019c0 T ButtonSetActionById +00001a0e T ButtonGetActionByName +00001a46 T ButtonSetActionByName +00001b0a t LogFuncOff +00001b0c t LogFuncTerminal +00001b38 T LogTick +00001b3a T LogTask +00001b3c T LogMemLoadBlock +00001b6c T LogMemClear +00001b96 T LogMemFree +00001ba0 T LogSetModeById +00001be0 T LogInit +00001bee t LogFuncMemory +00001c5c T LogSetModeByName +00001ca6 T LogGetModeByName +00001cc2 T LogGetModeList +00001d12 T SettingsLoad +00001d22 T SettingsSave +00001d32 T SettingsSetActiveById +00001d96 T SettingsCycle +00001eb6 T SettingsGetActiveByName +00001ec4 T SettingsSetActiveByName +00001ed6 T LEDInit +00001ee0 T LEDTick +00001fe2 T LEDTrigger +00002002 T LEDGetFuncList +00002074 T LEDSetFuncById +00002120 T LEDGetFuncByName +0000215a T LEDSetFuncByName +0000220a T TerminalSendString +00002214 T TerminalSendStringP +0000223c T TerminalSendBlock +00002248 T TerminalInit +00002252 T TerminalTask +00002294 T TerminalTick +00002316 T EVENT_USB_Device_Connect +0000231c T EVENT_USB_Device_Disconnect +00002322 T EVENT_USB_Device_ConfigurationChanged +0000232a T EVENT_USB_Device_ControlRequest +00002332 T CommandGetVersion +0000236e T CommandGetConfig +0000239a T CommandSetConfig +000023ac T CommandExecConfig +000023b8 T CommandGetUid +0000240c T CommandSetUid +000024b0 T CommandGetReadOnly +000024d4 T CommandSetReadOnly +000024fc T CommandExecUpload +00002506 T CommandExecDownload +00002510 T CommandExecReset +00002526 T CommandExecUpgrade +0000253c T CommandGetMemSize +0000256c T CommandGetUidSize +00002598 T CommandExecButton +000025a2 T CommandGetButton +000025b0 T CommandSetButton +000025c4 T CommandExecButtonLong +000025ce T CommandGetButtonLong +000025dc T CommandSetButtonLong +000025f0 T CommandExecLedGreen +000025fa T CommandGetLedGreen +00002608 T CommandSetLedGreen +0000261c T CommandExecLedRed +00002626 T CommandGetLedRed +00002634 T CommandSetLedRed +00002648 T CommandExecLogMode +00002652 T CommandGetLogMode +0000265c T CommandSetLogMode +0000266c T CommandExecLogMem +000026a0 T CommandGetLogMem +000026d4 T CommandSetLogMem +00002714 T CommandGetSetting +0000271e T CommandSetSetting +0000272e T CommandExecClear +00002736 T CommandExecHelp +000027ca T CommandGetRssi +00002832 T XModemReceive +00002868 T XModemSend +00002894 T XModemProcessByte +00002b68 T XModemTick +00002bde T CommandLineProcessByte +00002dfa T CommandLineTick +00002dfc t StartDemod +00002e76 T __vector_34 +00002ed8 T __vector_22 00002fff W __stack -00003142 T ISO14443ACodecInit -000031b0 T ISO14443ACodecTask -00003312 T MifareUltralightAppInit -0000331a T MifareUltralightAppReset -00003322 T MifareUltralightAppTask -00003324 T MifareUltralightAppProcess -000035c8 T MifareUltralightGetUid -000035ee T MifareUltralightSetUid -0000366c T MifareClassicAppInit1K -0000368a T MifarePlus1kAppInit_7B -000036b4 T MifareClassicAppInit4K -000036d2 T MifareClassicAppReset -000036da T MifareClassicAppTask -000036dc T MifareClassicAppProcess -00004264 T MifareClassicGetUid -000042a6 T MifareClassicSetUid -00004304 T ISO14443AAppendCRCA -00004362 T ISO14443ACheckCRCA -000043e0 t Crypto1LFSR -0000446c T Crypto1FilterOutput -000044d4 T Crypto1Setup -00004814 T Crypto1Auth -00004866 T Crypto1Byte -000048e8 T Crypto1Nibble -00004930 T Crypto1PRNG -000049e6 T USB_Device_ProcessControlRequest -00004c7c W EVENT_USB_Device_Reset -00004c7c W EVENT_USB_Device_StartOfFrame -00004c7c W EVENT_USB_Device_Suspend -00004c7c W EVENT_USB_Device_WakeUp -00004c7c T USB_Event_Stub -00004c7e T USB_USBTask -00004ca8 T Endpoint_Write_Stream_LE -00004d80 T Endpoint_Write_Control_Stream_LE -00004ec2 T Endpoint_Write_Control_PStream_LE -00005000 T Endpoint_ClearIN -00005032 T Endpoint_ClearOUT -00005050 T Endpoint_Read_8 -0000506e T Endpoint_Write_8 -0000508c T Endpoint_SelectEndpoint -000050fe T Endpoint_StallTransaction -00005136 T Endpoint_ClearSETUP -0000518e T Endpoint_IsSETUPReceived -000051c0 T Endpoint_IsOUTReceived -000051f2 T Endpoint_IsINReady -0000520a T Endpoint_ConfigureEndpoint_PRV -000052a4 T Endpoint_ConfigureEndpointTable -00005390 T Endpoint_ClearEndpoints -00005400 T Endpoint_ClearStatusStage -0000542c T Endpoint_WaitUntilReady -000054d2 T USB_Disable -000054ec T USB_ResetInterface -00005548 T USB_Init -0000559a T USB_INT_DisableAllInterrupts -000055a8 T USB_INT_ClearAllInterrupts -000055b4 T __vector_125 -0000568e T CDC_Device_ConfigureEndpoints -000056d8 T CDC_Device_SendString -0000572a T CDC_Device_SendData -0000577e T CDC_Device_SendByte -000057ec T CDC_Device_Flush -0000587c T CDC_Device_USBTask -000058b2 T CDC_Device_ReceiveByte -00005970 T CDC_Device_Event_Stub -00005970 W EVENT_CDC_Device_BreakSent -00005970 W EVENT_CDC_Device_ControLineStateChanged -00005970 W EVENT_CDC_Device_LineEncodingChanged -00005972 T CDC_Device_ProcessControlRequest -00005aac T __mulshisi3 -00005ab0 T __mulohisi3 -00005ab8 T __muluhisi3 -00005acc T __umulhisi3 -00005ae4 t do_rand -00005b7a T rand_r -00005b7c T rand -00005b82 T srand -00005b98 T memcpy_P -00005baa T strcmp_P -00005bbc T strncat_P -00005bdc T strncpy_P -00005bfa T memcpy -00005c0c T snprintf_P -00005c66 T vfprintf -00006000 T __eerd_block_x32a4u -00006016 T __eewr_block_x32a4u -00006028 T __eewr_byte_x32a4u -0000602a T __eewr_r18_x32a4u -0000606e T strnlen_P -00006084 T strnlen -0000609a T fputc -000060f2 T __ultoa_invert -000061ae T __divmodsi4 -000061c4 t __divmodsi4_neg1 -000061d4 t __divmodsi4_neg2 -000061e2 t __divmodsi4_exit -000061e4 T __prologue_saves__ -00006216 T __epilogue_restores__ -00006246 T __udivmodsi4 -00006252 t __udivmodsi4_loop -0000626c t __udivmodsi4_ep -0000628a T _exit -0000628a W exit -0000628c t __stop_program -0000628e A __data_load_start -0000628e T _etext -00006320 A __data_load_end +0000304c T __vector_83 +00003208 T ISO14443ACodecInit +00003276 T ISO14443ACodecTask +000033d6 T MifareUltralightAppInit +000033de T MifareUltralightAppReset +000033e6 T MifareUltralightAppTask +000033e8 T MifareUltralightAppProcess +0000368a T MifareUltralightGetUid +000036b0 T MifareUltralightSetUid +0000372e T MifareClassicAppInit1K +0000374c T MifarePlus1kAppInit_7B +00003776 T MifareClassicAppInit4K +00003794 T MifareClassicAppReset +0000379c T MifareClassicAppTask +0000379e T MifareClassicAppProcess +0000419c T MifareClassicGetUid +000041de T MifareClassicSetUid +0000423c T ISO14443AAppendCRCA +00004298 T ISO14443ACheckCRCA +00004314 t Crypto1LFSR +000043a0 T Crypto1FilterOutput +00004404 T Crypto1Setup +0000459e T Crypto1Auth +000045e8 T Crypto1Byte +0000460e T Crypto1Nibble +00004634 T Crypto1PRNG +000046d4 T USB_Device_ProcessControlRequest +00004914 W EVENT_USB_Device_Reset +00004914 W EVENT_USB_Device_StartOfFrame +00004914 W EVENT_USB_Device_Suspend +00004914 W EVENT_USB_Device_WakeUp +00004914 T USB_Event_Stub +00004916 T USB_USBTask +00004940 T Endpoint_Write_Stream_LE +00004a08 T Endpoint_Write_Control_Stream_LE +00004b32 T Endpoint_Write_Control_PStream_LE +00004c8a T Endpoint_ClearIN +00004cbc T Endpoint_ClearOUT +00004cda T Endpoint_Read_8 +00004cfa T Endpoint_Write_8 +00004d1a T Endpoint_SelectEndpoint +00004d8c T Endpoint_IsINReady +00004da4 T Endpoint_IsOUTReceived +00004dd6 T Endpoint_IsSETUPReceived +00004e08 T Endpoint_ClearSETUP +00004e60 T Endpoint_StallTransaction +00004e98 T Endpoint_ConfigureEndpoint_PRV +00004f2e T Endpoint_ConfigureEndpointTable +00005006 T Endpoint_ClearEndpoints +00005076 T Endpoint_ClearStatusStage +000050a2 T Endpoint_WaitUntilReady +00005148 T USB_Disable +00005162 T USB_ResetInterface +000051be T USB_Init +0000520e T USB_INT_DisableAllInterrupts +0000521c T USB_INT_ClearAllInterrupts +00005228 T __vector_125 +00005302 T CDC_Device_ConfigureEndpoints +0000534c T CDC_Device_SendString +00005396 T CDC_Device_SendData +000053ea T CDC_Device_SendByte +00005454 T CDC_Device_Flush +000054d0 T CDC_Device_USBTask +00005506 T CDC_Device_ReceiveByte +000055be T CDC_Device_Event_Stub +000055be W EVENT_CDC_Device_BreakSent +000055be W EVENT_CDC_Device_ControLineStateChanged +000055be W EVENT_CDC_Device_LineEncodingChanged +000055c0 T CDC_Device_ProcessControlRequest +000056f4 T __tablejump2__ +000056f8 T __tablejump__ +00005700 T __mulshisi3 +00005704 T __mulohisi3 +0000570c T __muluhisi3 +00005720 T __umulhisi3 +0000573e t do_rand +000057ce T rand_r +000057d0 T rand +000057d6 T srand +000057ec T memcpy_P +000057fe T strcmp_P +00005810 T strncat_P +00005830 T strncpy_P +0000584e T memcpy +00005860 T memset +0000586e T snprintf_P +000058c8 T vfprintf +00005c4e T __eerd_block_x32a4u +00005c64 T __eewr_block_x32a4u +00005c76 T __eewr_byte_x32a4u +00005c78 T __eewr_r18_x32a4u +00005cbc T strnlen_P +00005cd2 T strnlen +00005ce8 T fputc +00005d4c T __ultoa_invert +00005e08 T __divmodsi4 +00005e20 t __divmodsi4_neg2 +00005e2e t __divmodsi4_exit +00005e30 T __negsi2 +00005e40 T __prologue_saves__ +00005e72 T __epilogue_restores__ +00005ea2 T __udivmodsi4 +00005eae t __udivmodsi4_loop +00005ec8 t __udivmodsi4_ep +00005ee6 T _exit +00005ee6 W exit +00005ee8 t __stop_program +00005eea A __data_load_start +00005eea T _etext +00005f7c A __data_load_end 00802000 D __data_start -00802000 D TerminalHandle -0080201b d TerminalInitDelay +00802000 d TerminalInitDelay +00802001 D TerminalHandle 0080201c d next -00802020 d TableAB -00802070 d TableC +00802020 d TableC +00802040 d TableAB 00802092 B __bss_start 00802092 D __data_end 00802092 D _edata 00802092 b Memory -00802492 b PressTickCounter.4306 -00802493 b LogMem -00802893 b LogMemPtr -00802895 b LogMemLeft +00802492 b PressTickCounter.4405 +00802493 b LogMemLeft +00802495 b LogMemPtr +00802497 b LogMem 00802897 B LEDRedAction 00802898 B LEDGreenAction -00802899 b BlinkPrescaler.4245 +00802899 b BlinkPrescaler.4344 0080289a B TerminalState -0080289b b State -0080289c b CurrentFrameNumber -0080289d b RetryCount -0080289e b RetryTimeout -008028a0 b BlockAddress -008028a4 b CallbackFunc -008028a6 b BufferIdx -008028a8 b Checksum -008028a9 b ReceivedFrameNumber +0080289b b CallbackFunc +0080289d b BlockAddress +008028a1 b BufferIdx +008028a3 b RetryTimeout +008028a5 b RetryCount +008028a6 b Checksum +008028a7 b ReceivedFrameNumber +008028a8 b CurrentFrameNumber +008028a9 b State 008028aa b BufferIdx 008028ac b SamplePosition 008028ad b LoadModState @@ -769,19 +638,19 @@ 008028b1 b DataRegister 008028b2 b BitSent 008028b4 b BitCount -008028b6 b Flags +008028b6 b ParityBufferPtr 008028b8 b CodecBufferPtr -008028ba b ParityBufferPtr -008028bc b State -008028bd b CompatWritePageAddress -008028be b State -008028bf b CardATQAValue -008028c1 b CardSAKValue -008028c2 b _7BUID -008028c3 b CurrentAddress -008028c4 b ReaderResponse -008028c8 b CardResponse -008028cc b BlockBuffer +008028ba b Flags +008028bc b CompatWritePageAddress +008028bd b State +008028be b _7BUID +008028bf b CardSAKValue +008028c0 b CardATQAValue +008028c2 b BlockBuffer +008028d2 b CurrentAddress +008028d3 b ReaderResponse +008028d7 b CardResponse +008028db b State 008028dc b StateOdd 008028df b StateEven 008028e2 B ActiveConfiguration diff --git a/Firmware/Chameleon-Mini/LUFADescriptors.c b/Firmware/Chameleon-Mini/LUFADescriptors.c index a463a03..3b2d752 100644 --- a/Firmware/Chameleon-Mini/LUFADescriptors.c +++ b/Firmware/Chameleon-Mini/LUFADescriptors.c @@ -54,8 +54,8 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - .VendorID = 0x03EB, - .ProductID = 0x2044, + .VendorID = 0x16D0, // MCS Electronics (http://www.mcselec.com) + .ProductID = 0x04B2, // darksimpson's PID #2 granted to Chameleon-Mini .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x01,