From 7b5573ef0f0d4a130a7e6534b67aebd70bb8245c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20K=C3=BCppers?= Date: Wed, 24 Sep 2014 19:47:47 +0200 Subject: [PATCH 1/2] It looks like Atmel changed the naming of some defines in the avr-libc --- Firmware/Chameleon-Mini/System.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/System.c b/Firmware/Chameleon-Mini/System.c index 7c6fe83..b94d960 100644 --- a/Firmware/Chameleon-Mini/System.c +++ b/Firmware/Chameleon-Mini/System.c @@ -110,7 +110,7 @@ void SystemEnterBootloader(void) { /* Use Watchdog timer to reset into bootloader. */ CCP = CCP_IOREG_gc; - WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; + WDT.CTRL = WDT_PER_512CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; } From 8f789654b40f05356775e968b29f4121161b7db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20K=C3=BCppers?= Date: Wed, 24 Sep 2014 19:51:49 +0200 Subject: [PATCH 2/2] This removes the warning of implicit declarations in Settings.c --- Firmware/Chameleon-Mini/Chameleon-Mini.bin | Bin 21268 -> 20268 bytes Firmware/Chameleon-Mini/Chameleon-Mini.elf | Bin 325187 -> 303485 bytes Firmware/Chameleon-Mini/Chameleon-Mini.hex | 2599 +- Firmware/Chameleon-Mini/Chameleon-Mini.lss | 32299 +++++++++---------- Firmware/Chameleon-Mini/Chameleon-Mini.map | 5871 ++-- Firmware/Chameleon-Mini/Chameleon-Mini.sym | 1463 +- Firmware/Chameleon-Mini/Settings.c | 1 + 7 files changed, 20410 insertions(+), 21823 deletions(-) mode change 100644 => 100755 Firmware/Chameleon-Mini/Chameleon-Mini.bin mode change 100644 => 100755 Firmware/Chameleon-Mini/Chameleon-Mini.elf diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.bin b/Firmware/Chameleon-Mini/Chameleon-Mini.bin old mode 100644 new mode 100755 index 4861d33b27a7e76e3984ebb80c8057bd9d80d88b..edb7101e667951fbbbd61b84b75ec89ae74c21ab GIT binary patch delta 13088 zcmbQTjB(98#+d5E3=C5bGcZg(%)l`5FatyXVFrfY!wd}FhZz_;4>K^dA7)@^J}q0ifk3$Cwx@+vhY1&W|3N9K@kZNd67oZM$xIF0b&kddRTf{`dB8iOk!bRU|?kQb&GfQ zaSRUjbdERlW?*1&7O4{XD#9-+EGi=UT;i<+0}BfS6Otkmm?9=oBt-%&41WH8u9F#= z#U=|dvn>{9W)xF3Emg=3V^A#xp&&;;7k^&{)#AxwEVcrcMkWk~#s-!Kh72Zp7J7!0 zZ?T@O4|5F)_Vo8-Kn5bb&i;OGp6&>-Kwb}CBi>L?7laU))yNyp8|3Qf;_v4Z2^Iho zPkAr%h6ecfJ0dCn$qSNl@elVy7XK#>77lU^b`1f^LoqYoWI-`CYQ*fYu% z#DrtX$quZd^@e;-p&=p2j(6t^iNc?BWc9D)RfzzdyVG{-b;Q1s*MUu;J0Gm;atj z-p8gO?X6yUpzZ?SlndMqj~ga4vOT%Pdy#L-Jf8N83nu?$Q)EAT;ot+lDT^m7vMbh? zUgVo{h^PKq!^Fud4U^f}1SU;Zd3;_|-&kGAz>rn*qq2b^>&y>|28OJT9~vG^c%bmW z;K46Og=WKMj;T!#Cp=JlV+7~VRBtqx$U5^wlfgvRjUPI-Ex$i`@##U!#0d}PGd?}v z_jtksjTZ>jubzE+&>{quyng=86PUt_n{TpiyY;K3fo{P=qRS&Y9Jk4!u$$baAsqei2WvfxMgc<pLl+v{6zkV z98>Qw{+ak+x%2aR;rHinGqN7|JMq7A;O7s*FV5@7+xx#|{K?2Nkx}r=d5uOz!F%T$ z^;g_)MAFSaS$^{Q$@eEG1{897*1rvUAoB=hG0Q{-<-m`LhJ~yOU(^mH7#6Z7ez?QP zIPDE1&t#CXAmtE)Kc4^mz}YCC-SCS<6T(sF7#XKYG=o%uoUHu7!z74(=C?PDZ_mGB ze14u|D$kVb${bT6R;MXjet5$urq4H}{c%e=#Zs7;>uco63XYPyE1z*gKQY7x?H0Jn%9IWM%n!AXaeNnaP6F zg{CD16ml|6dnEpu{p1J3X&~JzJ{)Mgqkn1Y{Q_V8fO?3A&o^UG4ETI9=Kgt*(K3@j z4g&@GFUE$(4rR_Sjt3?-&Q!kn5tL{WMGILMelb4KG_|3AqKU!RDf*q-z2ML?ng&vB z_z|R5^J9{DF+1Z&hqoU5UIq#u{9k+UyBS>g;_%j!zaAtI|2mRC%wWQoMw1(#Kt?r$ zPc*skX?ifSVU2>f&YxuDm8iLSK)!l12t)LZYS|zc8)Kz7(wCW z`QZ-ZdB!IG$?}R5btk_N|H*#yJIB=9jO)VoqpH_~YHG$&(fMv?j0MvtTTk{E#nL4rK5=M!hh5-@pk0lNN9WOjyVn z_79>VV8Y}eeiz1u$rJg6ahZ02--eNS@?U=W$#Mc(^;*-U`8`k($c2jB7hrXVa{v)lGYvPKexOdByUZh2u;8LCr?1Mo`Fden~p`Q0KqO=P3^! z*6DqJdtdLt6F(ol4-e1lJ%4Mb_xWkO-jf%3dY@nD>uI)Iwfi>5HRm^1wC`l>)SIQZ zT5q?Ch5m9z59vV86!B7ajxVbj4@^p9Gnj-3F^9>F{KEAP&~Pi5l**?5|JnJ>_NsP} zN>ET`wpO*m!WSeCQ#)bO0#00V4S3`PFy)lmVTOVn05Y^-QX1O@qMez5X(Zf4EY=Yv zXD}JVdp>ZDj-r9A6F>Z5oW-cXZz!KQF=6ro&V-2zIn)0CIS=wm!o&rfph95cck(=> zfX74B3U`M|3*Eq(1?0pO=~8Y`-_b!1<;4K&t`gm%amS2Ap5k9%wh<{E~K{!+`Tk>g1Cm(%iETeAMY<e9&*t`C-C?{`iJw!)bl`4bn~G6F%Rb%r7d=YWP4gAY*dA zs5<^^BK=3bqOn-&ot^An&2El9mnEnpIi~N}Wpag7A zJ;+$YkLiyfTo8}*WBL;W@8JhXYXVf8z#Q7p3~3{9Ol^Gd^?cKV&*z&Td_3Rs;Qjg5 z2XD`}J$QY-{lUxg9S@$LcYYY~AmKs5gWmU39`Q{1uZqg&QakTB`Tk`2NoTj;+umWI z@PU5tVjoFb(+jMM*e9%y*jFd5XSWM%8okGj;MEcpRqSdTu4esH*9;uMue z1H+FeJ~SCberPtZ{L(OyL7_3AVKRe4hqC9#g_lc?HcZT5YyJD{e9J?SX!C=H$x~FO zUe17s|9=M+Z+y@&xqgaD=jE8A2qPK=@1N(J62rnb<(xtjSmX8cd{ZVX@J%UY5tuYZ z<-+-fM-Lu+d(hgK!Uud)KC*yJdOzv^Bv|GIrIrQIO8miu-zpz<9!&hIV(?+&Hx*E> z-Q`}iwpDmaMs`Wtu4=brApOI2iOnF`c&0C&d4~kr5nfY;} z4#9HpM)IX zHH_!qUwFV?|5Efp&!Zc9I~W^YPIv?X(zv3XB3<+ zGpY3%azxz+S16CpPj-_vsn1tlrM_Ez{^b72>d??=e9%8xe$xNR@3Djis6F@ayy63e z$%|AJCNES`d8jaXo{H)Ng~@YO1SU;a5tuYXMPSlQ6@f{!R2n8vRhck(nhM8Mb+CGs zXINC#BPlyS*@ZrFN9{uwZIi@}e`0vj%B~w{p;sTWk6Bnvz zigSLsd%)m9r~ZTojMFv5E!jE0C>+dq2+Cxj;znT7B9((sy{(3vUjhzv7;=7LI|!;U zH4lPBW*mUX*KW{K^4wZX%u8T08$7_ za&uKUrXrHdxATxb{QTE5_-7eve3<_dL?8Il5Tr11v5LXOB`W&%hO7}^R)ULbhsldo z0wym}`3X&ikVc05M2@Kw-p=5kWuWo7-_%_4^9=pD^>dAXe(E(?`JuzW@_?36qzo+?rgeD9^IsKyUrz1&VU@=`Tyc z=?qeaaegs7nEMJQ48`PM2eKccio83JSpOJR z=+S}nC#WLV4&**X6*+Yv`8le{z5|&rP(?N!$bX3{vg|H@#C}S5EkP{ z&;Z1VTYYb)JUDvmj56n!f9Dz|3aECdDRX}Lc@9)OY`xX}X3B%@w?3T%jZ!#1a+-gD z(Ruy^UO|<{#iUiYclgT3d~pO`(^bzbqY*@NxpwI7;2*m7R=f!TwN z=k?#2K3I2N^R4NF)#sJpm_Ar>UiX#hgQe%yUz$ExG}%%mnRUI&gvlEwFI359wx8@j znOjx8{@}+M`qK-h8*qN{I50zhPC?_xrr#av4L>J7=u~f*yj*3%#1$$N1?vw?n7B%1 z+Eh>p+I&Fag{HQ`zW z&j^y+s4`*lCKZKdP)WT)rD5Vy6^Q9eRXQfGROMy%pJ+dMtEwX7%gNVO)$0X6LhMp{ zpuyj6u<^sRsm>2P_%#eVzD%2H^1y=M!yw_yw5h5OH25tHEWS*es$rn;W!h9w}1lmDwsZkV`CWx|7QgNdvSU;i+^jQAISFiUtpfGW*iowKn zDxeyb^TV?99S<5NFH>219@$M=P&3-Wa?{U4Oazs<%Ty*nd0k++&hrA395@9gxp4|i zV&DKp$`+OS^Zm~e?yZ2T4+havlU>=ao}Vz;jcpZ(JK2?O_IXg1yi6r^vZh9^;Q6zl z?nlGK%_<$r2R{f*+B|u=hBoWQyA2b!Ounw+S`SWhDj;i?sWeR7qSB$f@sq%$Eh?av zRo&S&jA2vVr@}BO11Mu&+PRUkvNGe86GlUEBX)^kk##rQ4`k|1grFY0_} zJkT)nYLDu5#@@-bjF+cudU#vt>-mI-1rJUzKD`XeEpHAsO#Gt)V!b^${pzd-Gt_S| z&Y28~Xow4sov&dGdvI0nI^&rMC0Bb?zcV&Yu4lY8W#{*l2Ov`pU2YWIaIos?M3ByU z#yOK8omZH+O=ZHw?J74IdnUFSNq%TD<@~Vl{0~Nj=84Uq3i_f-!@~&=W}&I8{M=-k z`MKGW^ULXj0+TMPfQrP9^I}&s7`Hq)&392|qs}+R1r5emyHu|+_D;@a+&pE=gWW=3 z&;MYY(%3NZq{<9&&M)etCT;>v6$@YQ_%_`{zI4`6we;uaffM93%TQzA5^wE)O6*`g4rj)A*)bVRd^D z@L)S5sC)(S`Wt7ou58`a+A#T~%7n?MR2ED=t+HYA8I^=51rIvkOnLO|3dm0rCZ1AR zF!8j?hKXlX8YZ7rnK1dB%7V$~RW?k%ppx*Y;6d-3DUU8*S;y!ZAMd}9F*Uxv-XCPa zhRZPHe=s&QPi$V)ytx_F5Wc9=@Myw=`{zI%{x+kFADT=LerPb|{5av&4E{+579VHm z&o7@~Z1|zUO7TNOOtS&Uhe&u@y}{TsdBTH(=UN_sSc21JCLyA7+c{9EbSQJye-S?P zgHfOfl(g5Jg9O}`OQ6KXd*}wE;540yg41=1dnPuRaefIr)b)76gBr#S549nIM}@Gf zhXkG{(Sc`j1rjcp;e`~a;4o#s3<^7^b5k1|CZ1B6A$<1Sw8n;sr&VSMpEx(Yv0>sF zl^Mc^>(6B{^1cyy6wmnK#d^MtG9HXK7;7i=GTy%2uKJC!adJN66~;LeICUmXnV`a{ zGi}PWDHBvyUYa~*;;(lq4}N^q+4$hKTA%7y#>UC4FNcQ#4?13hCcUn(Doos=(lBw4N`1pr4ROvd9S62up7vmd`VYnl&2r~9 zTn6P$5L*Ilz=MZ*a05V{{x_`b=jMUcfO0-4>MopxMBR;xje-^jCxGQZ`ayDs&LR>v zBRFACn7CC16uCVU8|sZXzl0oYFz5WR_UsKtp=ml3g{F5lY6veoD?CkSqVV*tMh)Qw zXGNyzOca^k-KZfv>#XQBor$8;dm1%_r<|QLIT4)I@-Kqwpo=OU4<|h6hB{^PMNleQ za~^8ZVssZ5x-Pi4Z?PT{2U6DA%~=@gDTZ!mGU z%7lsgRVGZe6b?T>Vd7yGOX1-24ik^4Oqh67Wx`ZXVW0C8CLUAq6!thjVd8O>2`p1R zg`FoS8d}$1RM9Zt{E~k_-9YgRXtWtLGtw}5hssI4TY9hc{;M3Av{R**QAyoconi7W z6>t4e^)&Tzb%)8jRbJ>nnEGJy9+fw`AbPLL12BJ|$`dfXU!`I40hI%j4yrIrKBVF> z`LGH!eLR@(;Px3vI6S`4;ib&^<&3f<* znqiNCRop!XsuvmsO(!QB3CBPZ+8b8&^DWX-xtDQo=bi*LZ`p-LLGH7S;8FpUJ|>;{ z!I;>HoJc`w>>%7Gsj zbv`~guLi5KR!vd--tcn5!??-wjihBe9!+@QcP8O+!2^-A4UZ>0SO-sxJX5YrzHX$h z_J-B*LBIo0)dVUC`KG*Kg$#m%Mma&F{gxjy_$%cns~CF;H9wpD?AQ4}j3D8aFky$u zhm6%You36fP=03o?A7GY#uF13OuVe}O8agqH;1If@x zls;yCh76EH8vYvS|6(+pyq*!{q~DB+llLo6=O=4eXw<*CH%E73L8tnnd*7x!pK^W5@hJxbR(?M}5i$P)>2}|E zaNxnUdlLE$4|?w%n<^-HAmd`d&hL=nXHd5qqUy?n0}l>^RaJpiok&1c)jw(er1g{b zPdYydIx1K{S$^^##?y?9)6=y#e%#c!ps}%mxsmC>68$~8+WNXhM*2om?F)?5mG#x8 zs!df^H_|to>Yxv4Hk9b6sfVh&s7GjeX=iJfO--K~KGl7yk-EX(f{a$ZX?n}`cB^DF zzEkZ^aV&gZz%MB9+)Q?>1zSMB#{CR^2BZGu*AdM3yN~rhPK7KHd9aNJ+2dF1Xs`E{` z!ra5iFrD+uj`IeWcQAsc=?-3Oy|nSXq2T)S0u#m6<;ztrM_qYxsYChYXMxFwSp)^s z4%CC1DI)6g&l@Xqe(^qFWWf1hCfKEof+`0DCQ7Qy7jS-=aK2H0!lj0ZV(QHXoL|}w zESM;-zG0$*y5O{)iGtI+>jkIvOjdazH2(vmpvv3GAHD)j4<^d1f0(GC-q6@r-_YFf zpzzZ3OR`sT&Kp>0el)V+{E&XWVWOmZe?e;fC74pdMxoz=>HhwJ2@j4>>zzDzvVOdd;lvLPlTR@|*8lLpwPm8f zq*IIv|CtXoP3j>1G)b%Tj=>OUFZNB{Sq&}cZlp>c+I#mDN4 z2kt}k^zhD=1vOY(Coi-UuFtr*_I}ajM!`?#6{gSpfL(XS_aBUn6Z;vvE-Fq}n4bB) z;lXWC^*^znvGL;n_vfYVbDa^r%gXs-*ZEK9;rSA}RwswCo3UY{qIyF{^~D1drPVJ? zlu?We#p)B~h)j;z@ z-Ng>&ou3;X+&SO;;MV!Z2RF`xoYVf--~ht24`TlNKWH$V*3kG-=Y`Zq4u$C}KXg2J zA@-4_<4YSO%K->G@&hCo80s%(Fe*;}|Ngzye=ddTo!>~^32Z0B>E=)eZ zgDi2Bv4H<{;!^)3_#awu*4WsR(AYd##z~J+VY0WAK9k|J$qi0s_4hII17v#nn_ikS=NG#JIgAVs zt})6?6jYx0@fxGxw6_!gOca_fJgsM<@N|)Bb0$tQ;P~QtV8%m_hoC8)fDalE3?58) zFh5?2-&kHx+@Afy=PBBX`uYV157Z0{S?7G6U-!`DBWuOi4rRuVjRq&9zD&q@r{|}e zso$tyaKA%Y@*{uzR&Yn3U+~EJ#s`pQ8zPoLizOyxfaZqZ={-3=A?2N(pMIu(!;41# znau(BXExqCKjVSNgI(tv9z2@7*ttyoKkES=a5CypPW;e#uS5Cd=f7tmiAnK8E11uB zj$`U%2NxyA{K?5KrsDeV75N2~KYn<_D5MV#`-%pOi{ES~uXizLPP&jW`K60Gv+srA z$-=I>>Q(nV9%MXecu;n)qqQNWqrJ1SF`=^=lrA}@>TmxsrRl+gHy}U_g2%;PGfw{ErXqjw&Ob)R2@DD^ zzwZaH3(S$O<#u=w@ZcOHNa@wdw(hp#i|>F$Kw}snF<8{Bo;=ar+NA0ZdV&U(?wO4< z#0@@VHY?xJyO-J6D0usPn||n>h6mTd?gd%w>30Vd)(Fk*f29wAGG;@g;WUTF2@hJN zCvtXb3w~*MaQ8f<;<(UgIQ>B5tJ`S0(fc*pZjhjQa* zh_jc2tx=dLqOM}F^6MW)m(I}6w9fKQS8X?KckRTFZH+%~+urF=w)_ZkgTq8w^?-?T z>c1G<|60M_pwKwsK@->wC%>G3fB!v5B}j!FScO6(sAM*HpdoF@dGo`$2ykd|OznR^ z|2-&-IHs<=eM0}j1DMfJ&Ho>r2W5JNMuP{++M3@xZbO{QF%=}*&^Y12$@3gj5!3i@ z7+EGy_S6pdII!SDlM&~a)C0{%mERjCimEpnMSlNt+vsk>L~(V98IV{xd%nTw<2Q(k zi{D<~W`X8}g`YOx2IU0r+Z_6yw90k0MvVtlTWhcM!a*;K>?8z9#IGb?|@=G~U}OBtsy?wIWB zt*Cg6aeg_-Vo3dRegddhFn>b-1dgfO&-Xl>@Mz2AsowdlPab}G^l37uk38EtM%TD_ z|H*njS}KnZt$DEF!NVtC9&JBV!E8qKA@4HctHKH`T>Kt7W|Xn_-HW3PZsr+=QwzNhW`B8 zsUedce5IJf4=7HK^)=4x>)1LWYuFGo$h!$pg*0 z6CQYoMY1jUvYin$S`~QFYRcF1Um4Z^v`$q2*Elhr5#&m@i-rPLQ$9ZMmkQ)?6bWRh z{C@91i<#huPBX*F;(n_2`emE+rvK+WFkx!L)PkvrQ|tZv{pb5DWNgyYdSLKi38Tlw z6?!WqoDZ~`YktwMgNUjg_@w`{e!pJ7*})GIUph=HKde2_U@rNg!(8#hiUa!k3W=Na zw*2Eg(5>5&utSgYfXaWa1M~H#CG6B=I{>OUSPv*XG*0Mm7kxQ&;f=2YzLxribW*81oMPT6zdd=BtX5X(?0V;@f4lbZ|5f`_=~Z3UC?P& z`Y$%Q)?d6n@Pp!CrUMO+7!PzmQvcig2;~353rj@|Kw2M9c#wS|YRZrEtEPNme8mf@ zmqGH07ZwV9J8!JO`6c!oBpf3ySWWqU{ySq^UGwsnsp@X23eR=Ehzkkm! zX^!2i$LJB+6pnGWbqWWC@xSu~(ANJ5`e|21QGW8+_DuwI1&P5%WB_%+5i z>NMImf)*Ipe0kCMvvEFniGfD5WwSst+kqFYKU*91Ij44NYkt>jv~L70KhSHoZ*J6| zpg;Lez&Sns3*moRFSuS{|HE{_?F+|&fT<2s4W=qiwfFb;kN4-8iW+^B2(GA7WtWJ;cD! zeTadf^AH0=`ymE~)F2A(NTl!`%S z_%O{)N?}Q5Nn=T8$zaK3$zjQ5VPIfjWb}25clL1%4)%18H}qy;U=S7Y5jiFDMC66Y zOOZ6m97zTi76v9HMJ6ys*O3(ourT=f`?*ej$R<8Hfthu2Iy2+sIu@IHQ$s@rLt_I= z149NAJ##%H2GwGQAV)tJe_saGQZOi5O!(~hEct?6 zLqa_Lz@Cu->1JSH@aA*lbM|p{41)4ORPf{tY@#yZd?0pEaIhzcM#hWzCI>Q$O+L+X zMw~%VMSkD;_xB&&+kbYyz@r5ZHavRt;?vW~eC!I+_L?;Z8ZYoo+0EVXxM4CQ+s#V? z7x|{N^E6-FIN6h3k^RDjgAe$o^h_>fSFA6%$Twv*&xC6Y6DO-QOlD&fm^4}C@p(;s zV|671LsrX=$_9q4D?cb27_xePPNJm`3gq+Vj`tA{Y@E9c+5{|Hrj zZnH9n7$bjpt-tG|fCn9Kr##}Da!qxz2d73o$Q7cG)-d|V$NMws3(fz)C_MiIub|5F z@W1{k6B7mb54>T_XiQUP{HPyq?+l{-JD3%@^q zi;?v}?Zk5Bz|UpEFU}iId&>wi;oJF)#zesf=Nt5w+;2qEd4BT!$#3cz69Wo4LBU}9 z$mfy8{11$laO+hjDk(R9NHi>D&G>MSk@-M^VIiyI2i?hU84ag_bg4{K6#RM~6f}xo zB$_}@;+X0=86?9v?bdmYsXS9osB%n|pA51{Og~Lo^TQj)ulGAA3kE#=4pJ>Ykz;B- z-;@)oFbvWFQhW#OC`D02)|nrZ3<_BrKK^1<;Ww363^3$$co6VF{J@3SJCn~B^yp7` zz%~8Pmjkha)6Ps5oGvsiDWH(kFFxM?k@#o!ogWORfppLKaG>#y{-vq+3wpuoc|PBa zf$OfH&hz(PA zs1G#J_!^<_s_i=&6e&j2K&mytsue#bi5Ii~{LrG`5Zq-T@u4xW&EUe9RxnTD!&Lo= zA=3;dd~q~+@Cjs&LwJ3l$&F9p!N^8A3f?{sN{t}vK=g0McVYj17d+VVV43uG?pcgW z#J93@e3{D#3LnQ0di?hCcNiNd_D%-*`Q~?yska%|h3)r!@ZigXXVTxfXE8nz|H{ts zWjA zXCdOO=kg*%FZe~Oo~M44eztzOdaK^#96k?5hslk6!i)_dlBq;*vYddF= z{K0bb81=&JeL==LPIQ>OfYV{(LQc2;f6iZ+w2;$b;^a;IE|a(Li9mES7EEsB)1K@l zAjHIYe)0ohg~{)Hwd(bzpWT0N|4&9oQI!Wl?1`*}tQ;Sf9b}mJS4H3fC}dVWVBi;& zSCTiDUp4jOcNTt8c{O=+`GY!J9^BS@sPj?hh}2cCXI$U8{23SOY}Dy(n%A_xX-C@$ zk((^9Sbno`e3^c5ZR5U1f$5xIst-QY`LFVM%7cgV^uE8nulL}|I=v6|56|m8e_N;b z`Dwo1lNWt@pI_|P<7}2{)^4_GUfaH}-LpNaJ-fZ8-Lo;OF}ty*kyT$zUtQl=-BJH# z<95b8=|ax6t@~P+iEn4;__CMrz@#*`f=LTF112uy4Ez7*{DMgfIRhpx;1s|jHepgK zTloL_XXioIfHWpdS^zc-rWqs-GXNB}Ad9fc1?V$OhUiq7xR6ur{~xf4Ae{Yk?ZTu5oG?WTCMWU>*Takexm5i>!l4aNhr(3D97@PKP$+TmQAf0*34vK*dlQ0|scLOK}KqewN5H1%mc>$+yYaHD1zU^^v zIgqE3CY_@9lZjNaNX>`@*{IKPm zXKPezc56-REpVov!`Rz6ud$1Nw){^ z%4B{KWmgtyQEoMEb8b*};SrT()nm11-SELLEZ+B^$VC><54RXk@ZFUA!`M5qaq=6{ zzpOXEH$DJWI{zoUpKyP|`3W3TGZ-r;my0C2h8$=y;QUg4pw)o$%d`V+2Ap5E9%wh< z{E~H`!+`Tk=79y%K$#g-wnFrCOl_F>Tctyp^ULA`A9eZ|`QzpNJ0{DD+Nz&pWSXWJ z(8NDcR`G$7vgHSZM#TsA_M9IS9@xhlG#gHPA^wwn=J)H98O5X-Jtj{TRp;D#p6Sl? z^E|hwPG%Gn*Hr?UdHx3@syT*Wa|{I)9vB9|Oj-E7e=?((EMvoDc`?=c-1BEH_@9Tk zB>g<75_$u!gg`Z;&7(hz@A&`AKbrb!>WBJ&>JRGwslN>P>kq9Tjo|g85w`lV!(bvS zqJFf5){ocDKbZJW<-^4PDh@}&zWu@5 z^BoUfpLc#3@F3wq!GqrSQy%e5`K6A^XVo}A`GkIlfxw6J6FH{-mA`dh@?RBDecr)8 zQ@$Z!wr|7ae<~9u|5sUciPP~_a{TNc&PAA@sxwGlU3d@PXEh! zpy6S|WKf%vm90lV>r#iZl2{iLWemy91k>%jWjXLjC9#8qG^M>!Q9K!>F2Ygc)Cc8^Jt0F{? zGxAM|VeJu}%lh$C*PF-Z5i-{%FO~MKZ+JN4!H)}l&p4(wzMuJk`yz<-;LVo@jg5Wv zjm?lK(_#U64PDd_Ec){Omq&_?`jZtJ^(X5Q5o8Jzf2+t((x0sO91^_lQoJFMC_n@& zC=?#w0Rz%qPOF0-~gnmk_c)sDmgNI)qO`O=t zKlRZA%b)BQzjI7ge4sFSs*1woX(}oY6(&ztQGK8=d4`I>q?sxLlV+(1Oq#7CFlmlT z!{oUt6DH47;h3rpRJoqr(fb)yjfrPIL6Bns8Oq`~o zAmGi@f^KDS|t>;tW;Q%VQK;8qH0V)BfsW?oWsS+@8mP&oX z#MvqZ6X&Qrm^fGE!^C+i3NH-6j^UgNYCGf~Am{@m56r*wSR zDjO!wQE7;n@4w!EzkkEznJN<|&r(@1dA7=i`pI)t8Xtt8zj3cec*S{`tMECh@gpeS z`{NrXPg5bvipg_S(jHWw7nn3(MPSkb6@f_$RX{~HC_KKLt51Q)P$x9tUY*N;2i%== z5X;ifH%y$W(r8flq1}M<1E_5^LuH2k#DEEtXQ(s^em@UNXy~GE&Nob)4plW>rBRUW z07w-mrOi;`m|#HQ);@ z&OzN_g~^Lm3??s8fsHkAOr0My%fRAuzp3Wueq+hcy~doMdkt28=rFMS&~2FbU0~8; z6@f`hRGy!2n7CMF!o(#i4AVJ3Gfr=q%)VGDDD%lreA-zmz~ zXFo3iCj>}w#QDYOVB$+u5w(NquTVv#4(7f_72!LW{1#P&>0stNRFQ87^53J1ygHCt z|F9Ir`g;emAEAm|I*|ATRpi)#^rxsIyAI?&Lls$fAo&HV$f5(8FHuFN9ms!Gk1Eu4 zAoUHZNYH_fHwPX(eE0RilZk!eoL>wMJbLgA%62^P_z{e4ap1`l2)ps)(`OKtw(Rg36K~I^P_8 zF#Ej2v_Fik6Q@l4!^kjw<7bfRoKp`z=s)j-Bp&z~RQH3#o6oyUdwyQ;fx&|d=XD<# zJUDw^=Yhe4Q|GlG7(6(BUh9FugCplP9~f9XICx&;fx&})=hYt=JlK6+?Sa9A9p_aa z7(Cc|Ugd$ogH7j^9~eAXe_rWQ;_&^;)ABY*#{;}UarzGafM2wVD5p2iK|rFrp{F6{8D&8 z;f02_!sJyd4HMU@OqjS%1ymlcRhck(ol1MbO!ZFf#4isfZdCa&ag&PTCs(hHd zNoDd6RfWkiY6^^%lWo=1>k~grn7B%%KYrTO{`gLVhu>iuCNzVJ%JnMy&QEv%vmR6? zPChR%X@$z>^F7a}JZPAl#yMefI_HJ+3J?0u%TMB;#J`PylAwzIWc$heljl!@gNe-L> zliWB3CNXe;9KJ#2@_CSRgAX(s6n>kWr7p+4?>xwm2~QgSwoE>%t}a=AKw;uq6@!WE zRGP#=^`PH@jt32sm#NI0+^H@d-+dlp6{uWXrqTlCb%9mXp6`D?0q*;<^A9F&R{1b- zi%LUdqo5hsiLPu46IZJkOk4wx8c_AD_{nhEgUOp!K1|*+Szlez*&9VCJ6NY1TRYee zTd<9;Y(K!X8{5hA6DGT{RfBo1Y#!i>ZkdYKs30G4}K7sw0<(P zrZ(%AyA2aJOg7eZtp_JE6;QA&Q)!sEL8U`^<0pYh8&p7TqQ{aIlb+I41yv?JwW(@T6;vNY{P#C_04j(Tf0wHl{5-C&@Zgeu;e+Gq z2b%Na)$|P>sEC`gb9~--9%SQIl@{{{pupOuGGX#|6;KfGPyu!B8YXX5X+oBH*f1F( z!!ea(>f|533eaJ?9>#`=TU9_~0ACJpe6a?P0PH=$@gd>B55@}(hSz&lZ!q>u7Mylx zg7)=Z)gO$F&6gU~z@kFadL|1^7oK)!f*e?;xw)aS!I<;QnnMj%oL}S*H`s7~u{zvn z!};ab;U*i-FV7D*SaW{)c(@^~$$;a_l=_1ZPk?f4@_{A;&MylNaC|8|@Po0TvCW9{ zOa8$oQ_e3r2OCT|zmy!Dp+6yPk^#q;X9pXM13xraIeuucG5pYIqxhl8M({&}^~rA# z(^?+w4TW+4+9vUuW~l#Q zoX`x)G+R|bmY!ss9H*sFpFe?Ps=~x=DibDdSGmF1GZEyUj|V{hd3ONh-+SjP7=s>O z)w|AkWen9g6Ee(Iqcy1hKYZ`LoJUEF1$AD!3^~qjB_UM zK96ql5wOVz4>VhHeo;6iFllSO3doW*=T9)oT)V*t@{8j&Pym4ZVgvV!=yb7Zez<%0^p&bKMwrhHIgz4C(*l(_YE zVadBgrQyd!9m5CBY8|Q|E&EhHT!qEVhY9=8^gq4)gYkX%e}9DjRVoX9Y}DEKV6|Eo zSpR;N3s*s2Y-;{6VShcE_G6cSFup_4en#cMkBd5n4-TvKfVCe`*$B2C6#E}096-~* z?D7xBwTGTFm8Pqb~s-p1F;K8eNEe{}B zNM;g3^!~XYjE#+;SgtwrgHfOflz6V5O9CgaSC>HI-wuFO^b}8MoM6WJrFHUaZOM9O zR+k5mp_y}x+|&4`EMj$g5b$6-BdB5p@%kGZCht_~Xl}7?s|^!(sx(aAtI{xWmrBFreJTwTcdIl^-mlUyagR#FI9?&?)E>@v)o3Fsi4p78j zI17pRrx!bvCw>NnSI$Ian?Sl2u_ipM2bB#=E@m)3cyW&JqRc{_8;pA<_+IG-70Z+R z8M$>fP1&Hrt+Q>)wkaD_TrO$DbK5(W2R}aQe0=a;txxqDWAEf##>G=MJzOnx|GdIW zgNGB(B2pD2I8{xUxI+cxjGl=NMx0;t4>p){ewcgqMm?j@G@Xe;(>ohAgr}Vqo~AQV zczRc(hVX>5kn*CtQA4=vETpvPY19yIIXh=^A~;EVT?BQFwyJ16GhN&-v4bL}BJgxFVSoeIx#3L#bCZ154 zFtt-y?fis^XH+_cmChSXJgPEb;z^YWQ!Rz1&rg_mR>e|S{Jg`&b1D<0CZ1QBFx697 z;QWM%7gRijdCpImco8hZKKZ-8b^TTq4Fk?Exd+q@6u-3aPnBOLzg@mz@*$Ozdbjjm z>-|?bFzK*LFQbyWu{y)#BP!ndq3UVsc z`lL$3)b&`?@dQhkR!Z&3XEB^#gtBGSOXllsuV+Mbv{2#{2YDQine;AveO@8+CJV;_ALc(G4AtN>J zKa9@L0v;$oGk*4R@<*eI^#>+iR+%vIipom;^#vOqEQs6h`$qqL!G{MA;{N+ynAS5< zp|eT*!Nf}{kEX&z6&jng4^2H^aN)s$xcj~u3!AhjO`Tt`Qh&pP1yTEb=S=L>exd*2 z!Gp;Ez735K7oMMVf71I&|0lr)JO41=W_-msv9aNSLVaVCcEjJ^g9Z;8|8^Wycra~h z`&1Bi)_2Hg_-mr?r0b7I&%S5H&l5%yd?{@_IQ-8HE1E~`v!YrmfaQR!?HoHl2o;Pg)QQw>7X=1dftep2nC4ruPMjPb6@ z8I>Da9gTA)cB-Gy>TVRC24elt5_lASk3+vlx3NHQvZ1N16vtGBC(-8(o`juOc=Ga` z!ILNF6rPlyGk8*TZgP#OM!opG?TpJ99Sa~uT8sM0yWgffpK^W5@hJxbI=`Qvh?sZ; zb*LEbozQQ1u>CG*T*BS6`sTTzgWPAkkRzP{Lz`TV}-eWLt7L<1f z%$t1oSUp(dRWP>)DtQjfYrWf}-!}E4U_%BZ?;dz?@;t~1`|pCBP^2HA)9_#?C z%?Il|k+2cW%YgD$fq98gb2<`W<~%*0KdF9F|D^eo)=!$uI*!+4sJaeBJ;$&a5I z7d0Me+}L=zQERfjnRtM&KBU!FqMxQ7s_vp5t?i?orCl~PeQNkr_o+te27e1Oj_9}Q zP19Shw_9b0ZZ_jPmH#ShblLR<)j`$81%1Zp9p64PIy5&n9cp53p8P;qrk-Oeto#8@ zw!8sPwrF2&m@KNUak*i#n7ZoahRNdUN|zfZOQ_3VZkQ~oE_1nIvXr{y<%Y@9>SC80 zCd;VvP5H^Q;WB78V8TRE^@fRJ>Yx#YpaUDgBMO@jfQA8Pfcu0|2j*PvP!{}kGVws z^-J29`>*UcKT&Yod4Y-I>hk5vm)oz@U+z$T`B`A{VHQEbvIC%IwTSw%^AjQ_8E|}9 zbRJ~!gozUBJ+{gZCb4sVNk6cT(KROCKVhPzI^UEv%sq?@(>cHNo&R@f2V?izIcpDG zEWgx#eu4$(7xx2`EI27-Z3h zfb$0~fn*~uDPB^z;(30;L~-?r2Am&U&QE;MY{2;eG&Cfn-f+HNV4|RU!$cvlF^A6! zB^*58{GjuE^MkJDuE(9t@!Nk)0r~zEcXF0_w_srLAOVA_lG@%sxdWj!uX zdH|}PCtP@O@yEG_iHBJ_lodZf{4(o&9T*q`UxCUGcPW`UwgSxQ2Btu^uo^y6J^y6>L<#n{{$O5q46iw*csvx-+wSRPV8sw zxTrWi@%v3sQ*vTIW8=mD@7GK1=Q<^No0ap!*7Il2-_SdK9=*oTVSLTlFi}yxA*13V z!$fIyfr&EeJmRwK3Lg}vbAD+)(8qY-0Vt_+e(*YQM!BBzOU!|Wi6Y=g3h&^!k zB52I<^TkF%zXP0?I+QCvgA8o{8+8EeX0Ve%A@HC9;`D~bk2)`;K5~GJUHPHo!3(jE zEFE8-F|r(hup>WoPE@{_$H*8U$l3q?h13r&kjl>Q2Oo6QgB5drIPl=k1&|=;mu=@E z&Z+#+YH;wwjEjwe8VA;0Y!u`?aO7g6;BK&Nqu|H$O%J#ZEV|ezC=Yf1&d;p|JHI!> zmm)#}9<-k1!9-d04-@6oL6P^M;iJx)^NkPQoL_PQG(%fob-v-jGmJpIp?6ZR8ybw) zE*zLBt$tymjQRobi|iU7AkM5m@PhHJ&L5qNIttS{Ke!&as{op9gE$>DDF!O6A`Vzy zY!u8m;D51E(DOj*MMOx39)PB)dUZ%*VrYaUu7*Z|2OQFZoC?z?e&8?=WL5aUcK}33 ze)!JVGO_8x|M%~u{&Oi#2d!;Um_G6QU6spIK=Pa)F6!7^0L3sQggTTV;rH_bDE#=r z;ir1BQSbmt_%UB}B{cvU8U-GJ2KnBcXT5OX!G#BPpzxcVZj-2ahj9`AM%kW;`tb_Q zpfM&{b%TkB#C?--B}jJi{P+ozzuJ^ewzE@{+zBnzEDGkCtP1cW82img2^RzdMru@1ezwluu~FncmN4f zhh|8SPQGGiR)6>W`bqoI+QtkQK(*5|y)!y#Gg?tBf%dLzPc{yvisz z?d`-r6NRSVU=*D0GZ8dg1{xo9J}~29$HSKfA6WxFfF=PZJeVJ^#BVIGCvMMv;qwe_ zRek*eg9mB`hO8-HADVn*_4qo!zRpol`@n>hdwPEQnfk5z4H1#evzjyS&uWZp^wkB4 zB;W5)Uisnkl&ud|^KF#jj+giUC$Rf`;{*N)kj@9FHiIN-NLkYG;M4gT4>}&~Iqzto z`C&qai*o0udwMs|Psq8ackMiAalo?1?TwPtWF~>=$zSYK)&FuF_;RmNkQba`8U=rz z=a_o=9%zydlxiXT*Jqi}O>S^dV%#x#v4g3&qP}8)pz_BLZy1I2K@rhV(O_}$+v>^h z9n6`NFJw;EbW~^dyAU!t*ilzI@1Dnlj3*5bvhH=XHl%d4cQ!UAbT)&EK@RZR8vE@( zrW|;4@qy9P&nANEX^n5Hw?em`iqR9GFPbLHgM zj@eAFc_v3V$p~+QSn%TgU5G`m?@iU0cJq={zGw`VTHT~oI zlMS3zR1e=-tG`G8FC*gw28Ea3_k$O2Wl2|agBJGo>dyhM!r4E$*x8nG(&UZKqKs1~ zA9uDk$-ILoCqab{qG-=-oFQ)TA+uTNj{3dK#zw)L=iBt1?=(EPdVcZ=XSH~j&d|=Z z&hk!IZ8vRq?Z(fIjmCFC;f^q_{jcl+P|@4a2q}6U8Yetxk)FuesV(@W;lYjb4A5Fc zpz*?OM)3`wAKz^hJbS*g`Q+`+#*>p5yBOAgxxMU8hjQcRbKq6UbHRb6Fi}KZ#o*xA zKa8j@sQlR0c;|NMoet%|k05un|Fwk`T+nh0R2hQ2=+FpRUZAXf^UL}7_unf_R8&|0 zt9;-NZHVO@Q$b2$?5^7<^e;SsmW!~u7G%u-yXPAk zCp>s`9!;*%;K7OW98(dU-8YQvlUKWH8+sq$_+WgX!Km|l!$eW_Mx)H{dv3FUQ+%kGJCsj;cDT)$bZZ+G^q-|p%cyZz@5#9felxAuIK z5$6|^1IlFm=Q=cdKPcww@DyNj&FWlzQ^#@UQ(7?;1=_~h9AY{nYKHSe~(U&=Uzarfjx zcSZFVQ?CC2HQ$ec;~r9+oSy(HQ07nQpTIG7%lV#%6CQ1xyxBdU_349ekG@V;_mF2h z$LKw64dY}V4=vkght@pU@ZizoZ;y5zs$tA#>|*@GDApw2)ZEzkf9JstmF6iEb$a;b z%6(^?-1v=g^552plm9nP%x46(G?z|Z?;-B+;o^()fjWjd3J(;FR($C;O8lVlrNJoh zL$gug7w!YSMwTBMj6J_7CTJW`N>E8qJ)n`Gd_W;l@qqeY^#d0A2EmhAJT(|oC+m93 zYaTd1Lw{<>WCMv06M`liXnX;c-v1x}Z00@CY-aeO*}U*Wvnl6?r~^uq3q4Kwi!SOg zHZ$t9=08`{Q&JM2-0GVHv(QKvQFg{q#CRx_jWAE^VZ2evadJeu$z;-b}*X59%7 zJj5c|Hhktg@Rd>hPwPbWe~lC48MiY|c;Io-P{3-+#|QpWfgFw^fh?8ZpB`v26a3I= zW;t2aOSRtr*%rM`O4I*y9+)t-VQRtD#HscE{r>a)KfKtl1)4=(!svW)h29DYrvt6# zhF|R8ZPweQ1QJ&{F!TLRy-iB}W;;J9eCaUd{IKQ#?|}w$#Sb0koFA4QU^<}iaFf=S zf7}OJ9_-NKIH2;M^T4wQ`?S~&fNCPv1E67jrUMF-k9(Wz*4)v@~`I3MRt5*zl-Lik^v3oaMf|8QQY`+^!%98&|PI!rZ~syNl&-`_ue@>}1vlV|%$ Vvx+b>FfdHMJflWMqH=CWc@J7|#SG7{J2tjDdl{gh7FUg+YTskbw^@zXc=*#k2ev7(ken zfq{XEfdMS<=g+{vpwIvopTxkx0K#lgIgt4e{23S~DKvmF$QW)e1_pF_28Kok5Ef=& zU;ts5eDz@lhN*`c7$zTPV3>HAfua8}14Hj&28Qm#3=Exz85r6RGcdFsW?*PO%)roi zn1P}GFatyFVFm_}zRJT44CRLz7)lQ_FccqVU?@Dyz>t5Kfg$%W0|U>L)k2wv85q(J zGccqcW?)D@%)pR%n1LbwFatyEVFrfi!wd|OhZz{c4>K@?g4L%B1s-N#@ITDJ;Cq;X z!TT@+gXdue2KU1Z46cV67@Q9?FgPA&V6Z>Tz+iirfx-GP1B2yZ1_txP3=F1+85oQY zGcXt)W?;}i%)p>~n1Mn2Fav|;VFm{E!wd|nhZz`@4>K?*9%f*WKg_@&dzgVi`Y;27 z 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 z z!OmbP&CDw?HUgO!66E9N>=VS`?Cj(LB77KJJcB?2Ah)3epcy2l5aA!3S`wO>0*(PB ziws<0sn7#zBPgC=Vz9t~ADRW0%*oG7R{#^GdBvIOd8sK1nRy`3g3`YS11L!cgn-=W z405Bh4{GR#Bqrsg#+RTaq5w}nV^C;1dl&_|27~m04D(@t@O>~<8-P?p!Zak`Bfq!= z)fQMBdnD$i@2ckUvLfm{D-GdndT!TPS0SZo( zs0Js;U}r}^24@e$AlG0_2N@cIT;%B&VgN1;0{nwQKr!a;=jQ1i@9P%t?Bf_5?CBhD z=nd2B=@$?h;_L6?8t>xi<_6M@R8+Ymq6=JD1;m$tQlcry_nlmWRd4Q#ZT!a06LPI?L z{o*a0JVQXC0}2(C`~=QU&R|VGpi~0W2`|SSLD~XbgM45azyqWVoc*CW!UyE;lA`<^ zaCS;dOiuMH%}q)zg4GWUsAaoeGAtUAQjZCi)B`SnL1mbyA1tQ8-a<*h<{;-mk0|2$;?YH_Q_97ftiDv3&Y(V zJ^esI1@b>i0D`L+cfU{tX9W{I3q3;x-Q3*dQrpCmirm!nL}Q~wlTroU+@jQ+#0mx7 z^px_%qBLD21>JNb1zmq*1>NG36x;N?QcFt(-L&G2{Gt+FP_z{*=%(f6>t^QVWag#n z7Uw4B;-K-oRS*#MM(J^jqVp$76bO2rBa3LjS&aPTAL=AhK# zR77o#5>A#NEzW)+J`CU@5aM`5TF6Y!29;wbVCx|DBRD;{fnp!kdc!b~Q4leB1~oK- z=FsBIs??Iof>Z{_ypq(syhNYWveX=~J3)SeTI=j#04fMTW}rCI5L|u05-3;~NDWd! z;N$8R0=Em)@&P*-QawPbBWO5*q7gGKdHRL82KhPqfP4V2B|$L+DIuXJMa09ZDNx&i z!7;fcvn&-Q2Y?MmDTlzB5ad=A|A0#;n0KIc9;n&?FBkXBOUsXUc5#k}l(wK+37pkE z7(jxc!oW2zIX@*cFC8w0(ttEDMXp^8%u#q2C_GCPo+Ap+35Dl^!gGUWb8wc;P0Y*# zd)(P09+5kPJ^kE$TwVQKTwOqc3Mt|}7$7t(M&QW=94i5dMVTd);8FzAj$jB5aSREC zRNg3|YGewo;4#7#(%eL9FBuvjyW0?@-ZeyNXd9w*8w^pp4TdNoYG{UHCQA4kqJ*!Z zB`EJ0gOehpnF>z2$nHZ4WkY8alTpIl&=p0_4OIISx#bt-CYCTjvW*9F*D0VVKRLCy z7+Tnaa+ME5kgFTmDJV(S71VKnG?IM4Eo=YK5O}pz?wOa8S^-XXF2SKrA&~*D@y@~U z`Y=8uH7B(oBR?-SC^IiTwFp#Ure&r>D}I;M;^d;tf|C3qumR4&&H?d`&c4B=Ny(tI z>p({)l%y8H4TDy$D2@v*DT25lK0YxerO40>Y!b**pb|GRCq6VUGd~Y32sYl?#Titw zg0m5WZ(?3)T4HiZX;ErXF!;C?aApQ&B81c85r#QB`^H0>rAX57JctkjCs0@r8Gu_y zU^B4=kfXCNit8XQ11nD~N%YKv8N(1zl%GC z3T$>eI|g`yEyo&lzNI-Ona&xBd3mWh3@*@^MX?Iu<9M*MVG$QllwXpcoSze40@VlC z1u+H^WDMnDi8-aI3?ca?i8-i|3TjV+`~r?LzkE=P!OUcck1t9sF3l+cI~=SaEHy7B zzbLpMH90daGa0VXF{dQ8C@--j71~H(@CkKuL^!z^)EvVVGN5Bdp^Y7=7myM)*k+_) zhDV{ZXFNQyf>RR0ws;f|#+N{R4GWiIu#sTTIEH|>-X!Lw!2N+7W`U)NIhkph_#)LY z#24yh|B{Tej`FWvv znXsevso(&{ z8h$Wc5NE@^4hxd~FvK~2CK1J3!Sc_l@a zkk%QrLV(37B*{P`!#@orN{i8h6dc%~jvgfW$0Iojmd@dY9$YP~==O9$HxBM_m}ZnP z!j=W#sQ?tr&@>FU2pq`_K8bnhrHSdOkm$!9Q4q@^@_0%vP-O;-9jsyN3MyvuQcJ*N zq)v{`-tnNwa!)Nm1P%k-iHPbeu^=%iGbghoGqso@C^aWFu^85S23H7h9mNcg>H^8M z;MAhb#2mlUT)1hWd6~)iDR3`?M;9DRN{TX*N=s59u?Wh|2s4n19Y{FDmoS98gv1B9 z2F071IQw{mnxy{0&hbIc#zwx*L9TA`5&pr>#ztU?pb)I1n;`XWL4iSze(tXEmLdL- z#wMy_f5^a)kH53GlV?aU1IScxn=2^98BBu=0SSVJQzJqgec}zxyrJ$vHOa*@3^FDN zbGM<91ulh#21bw`g>$^Kk2lC@aC;hL7u>-HCL#XdK5>AL57;G;25E3fegWu&yqx^x zY=#iHeizR$uwszqC7=P1fFMsaX-E?sp~W@K*#qnfkRDJ#gWZ5C4<6Nk$s3wM{R46* zYM9^*67Zm%ql-(B5d%nbFx0z2&PKkVC`H)j;u!{33o;wlx%Bal4+?P(4swnU0STuk zGk_?V&8`t4AS2V0QA`GV0;DX!#|NYn%y)6~@j*&aMy4>IfTFO3A>7js9Ks;u5b4ec z<|)50P&*SO33W}VPXNgAAX{LL0b3K`>*8RUlho!5!cO?kGc2kSpjQ5~uw9lAL^S zdlY0k%p2eojtCxSM;}K}IfByZF)(BR~N7P;{N`K4%r9Wn11|GCCLh_o6XBfDv z4YC~?RUlKrslwSg05U%UN_kN4fL!S2=;_1Y?C%?3045E=q!Bn#AfnCK2;}qhWavCY z5NIR?xhH1e43*J?Bqy+~;1VS?*eTc_JWdQU0UFncR0eV>LNSO1E_{&G204S&q$k6R zE<;!n0x5z;23#j7vat1%QR5XnnhHvS(11Y5!b=L6Qj<&a zi{evK(-OfActmysr)E$rc=`vqx`T9rVggh~n817lO36@@5H12GXK*nD3I}+sLb5uj zhy_O#JSBr|L1+e*0MK#~WOZ-=BrPCZ1u6s}(_Wz9gvJjz%pszXBw;1MJCw zV6c@i$Cw(z(kQ}g7tb(oVGK&%pkZF$05pSOB|J!h4+FTUfrdXQu;GDf6ygsaAp{A6 zy#P+yU{@e419=2ILWk14(o1G=3JnSI_ltLQ1`pN;hxiA%#{0VZqKOB&Iy?IKV37#* zbcqKI?8UpdItRJ>x`HN0z=LkkK3_md5d&yk5i~u8m^lNFu^@7sX_J}d;lKQN<IMxoWL!*&|t@)ka%bCtfg;ofG4P6amz_8&VXr!Oz|;*Rl~X`5V6n# zP=yYbfEo)r-!zpWATd1^;y|!L5XEpOAzSDf!nIowLn++S&N5OkpeLvU(gX=+|_ zDkv1dRzu(99G_s$mGp$Sj7a4gmN0A?)DP5{QXTm0&Y5L_Jdw=7#u(xPq%g=ft9-N+c5@ z_QP_bb7gW)Dv~T{kSZO?c}}6h-mb2omPC3obWXw@%^BcnEs$3NLVbK({KLW1g~cUB z$+-onr4*!4V<;{u%7c_(aGlUV02u%Z2#7C1c@tHIqaS#x149t54^c-!stI%#L&|mV z1S-T1Z~=}8G>}1|;JyMRZ1s{6a*z}coiK%lL0Kv^Dqz70jUo(jy<`S(=1zergq8dt zPeR4~ieQ4pNXB@kAVd?(QW@goQ&Y=};*&rbDZT=i74FhdKNPp-=jJBn zrGN$^!82q&t}el;CH`q?3=yEgJ;*8{*i1LN&p^ckcq9olN)4I?2aUJ5WEO+g;V@wM z*Cn$!IX^EiHMs=tJbl>2B5Vj85^B(95OhreEP#+a4hmM#SUlKrP$dg>EmR}eT`;3T zY9Ub&0Jj$*hU_JnFECv040U#JYF=?_m{Vyn1E?Z|1{;c<7|8)S4nYoeNzF;DM79)O z48lg>P5GS6s)GS6sa zhBD{vo(fuYhFH9aGGl0D3F;pkfCyAGP-X^=P-X^=P-X^=++g8|Xca*N*0mxv8B&)* z1%gvcKvkN5UJj^X3{JD|sU<3J^{JEx!O84O0Xy!=X02 zrY* z%5!ksfrgi0W`kS;Zo?xBz?x8CF9ZcJfKw!>#RClpm|AGf3n?5y#Ry!YB(bEl*fRwj zh~U8YfJwO{+yg2gOJL$4hd`RH$Rd#X5+0dONa-mU9&xZ$g-)QT1}!}R^~U^M;z30_ zgL7$7QEFa^TTx;zY$O{=Nw}kD2za%EYkZKav#V#AYrI>Kqpz!9sIL)2P-;n0Wk_aj zYJO=6c#0hq1Yki(2LQ<&SN{+ONF&QLr2<}N=|e&WR7;0Ah9IoKVk>Cv8V-jTGK6HL z!U`~O1VSu^IT-9sXpT?8^ryd@8{9#lI0DxP&WSn6&Kar6*~O)~Xx0V<`8&G?2Qw5v z6Oc=4PG)Xq324p|8mkN-$3SJl?t!ww$%Fw^IhPhgk~=7}!J44?6rLMERV=6mfWE4$^F=A|$czzPaT;4-+Rf+iH8_AwMdQaVfxtS|u?4yr>zYZamTz@1%vFbQg? zILC*(gZox4!6E+Oh8b82q8Jp*u3^EE!ST)>zM&EEA}XR=zoVKvsu4dl>nKMlc|o15)Me0Unt_ zu@E{AjI0zfaA;^|YyloR^6__c@%49!cXJ5=4Yaz3IXZ{L2ZV!Kz$iNX!6Q_jeqei$ zWkQ^t4PYKd76-Y-5xhJdWLAiCylWU};^L18Ds*oILK@l zkPh%TC$db4vkOQExQUJ|4$|QS(gF5#2s}!I!Clf2XT$gs2EWvDNIbwhVdy5ff=mDp zy`#v$7TU%`=5mnbpgsUcGQw7HGagwP$a!E7fd}M~WkQ_Y4C7scz0g!c9!9M;0 zuAs1iMPh(skY`9FXfnVMw%Qjoe&_7y=@$Y@gC5|a0c7JHU7Vfbojt$2W)N^MbR^oiB>9@bES8QN>P&FHbM}Dj1wpaZKPUtoFyMGZN)On>9a`3d z0w>-x*g4+K(Z|Qr4?Ld+*Nd%c_YVpI2PQb~(d`FkGH_s`%YcI!BWj>23~Po3r!cVF zL!3bclP9EZ!Qv)xTL@Z8fZYx%2cYVLLxTLBTrpA*I6-2hAW+*MG-dAr-TH#m-U5Xa zICL?52d;XdwxjzR><6%~;qG#F3;<_XWTjvupcw&H%ms&lhFZ}oIjE2!185V2Z+;4> zg_;WK&mg%KT$DrO7u6aU16Uo8Vhu|0fJ4*S8CE~}hq*yR-WRg?8rei>nFLO8&K|~~ zL<KC+H>>6iNS}5O7q3U5G3L zEqkz*ZQxXlk-nh~P;j^)n*?$iIAwt28CeEY147%?;OK`G&lsr=WB}N2;Kc5iS`HdF z!`U_jXC!bafb@a0F1ScQwiqM>PI_Rwzzr0ASm~x~xyZN}xSO zW+tFjuE@C@>?Nc?1DB#8jbIN4d4d|Ipo#`mN@phKfEEEGTLI1d5TO!K;fYAbkTePM z1-LVWlJ=qL861-?sk!+na9=xnn1WI_cmf|R12Pm=Z-Y}8s99)ehGHBdZGugNI0w>y z1Nj9UMG(Etpso!xpMm|3tQK56V9C!2ZP(tN>gxLgT^N!vK^XoIMOd({w17L7Ri%f&!)G3r&@X z<^#0tifjiWPK}Ms&0tM#_`pDX2-sL;9pK~w4tr3w7vu`5IMS2h%_vZV*#MMWo#7oc zXi@I$VGi;HvS|qWEetKOBpqjX4T4=4I3=J+!5R$UgpMo&PS(&eA6Xofs=$c=OA!q2 zb%TQdoC)1B^D>JwQlV3Uus$W!cc3~lH$Mfg2H6g9BMe%|fz-k3Qj~}UIRu=Az@9=x zn@ey!*a^r6g4BXD57smd&LrS8jjRXSV8xQ%Tns=h9#8>?tR6Hp0(CRGu(L0CzzA6w zoD8ALkunE#G6dD5@CGYnu@bT|hy(#y*az|`xDfVn4ReL8+yf6If|likxiUB>7NrEG z78m5_6{j+QM&VP7;9TF#w8SFFji#B&knv-%`d~+I$o3A%5Tb{pPY45wTE~I{P(g3# z&EQ;ASx}O1=vZ2k0b~1RCMD&hGI*y}`lqE8rXCpTKX-&x z;K5I@O;BmKOwh&@|I(6z(h>%+EI6P*3!c+K+uIm|!OP@ell)-GkbKA#KCHrbgsfzT z1s8OrwJ60gB+wD8fdNdq73JqbG@^u!V?jX>c$H#kW{R^9!l~hj*{PugP_H|NhIoLc z(ZKq_rh%dZ<|?pGL#Wd5AkPq22JjFmL?I-wKqk1l#Cy81I+8ya%KsU@Wa7@-dyra?{zut3r^2DOTuK@-i87Lk8S3OJ;^Q!B&si&8-Tfm~RF zym&|-Y8hxO9dx#Xe@Y4ic#PSZ!L=+k4{QLqi4NkyBEZKjIEVq%SYU9?O9mz9)D%cQ zfuvHfen%$;x75@W(BvR^j2|>o5tNz>x+6S3z%eM;HQqC?xHK&-GdVLguf#b&2Xv@K zW`15kVo63ZSQV-mSSTp9Ait=@vm`Y)9GlYU>uY5D}d=o1eK*~WK zjF7~128bF+_<)v#fK7#{18t}%Eh>Vj@N@y~I)y3+HDb{cHT#!9TR)e_lB@C_=1^IcP#;sE(XoekBn!o~p!6!dGGdVE_5;`#Fm!#(U zl_JNBho?($Nn&!ge_3i#T26jBL^)_J2FQ0{8zB)04rGuxTqVe_5ILA3p?N7#Q+yJO z(o>5|Anpg51WFO0Y*d_D1P)<{3@E0+lS|-K2Tn>LMHp!W><)w)=nfTV*#r+KuqxDq z1lliNlvwzFiJcVo+3r z_veE;-|hrr33N6~WkD*)29U+bDFd{)1iTvrvUUSvM=>}sQu9ijGD{c&GAfI~F$mI% z(^Vy@xe#5b9tURxx17XuX!Zcb978B*8$QG)PZvnO14k<;H#qwEfH%0n6Jk81Fo%aO z$oJp?0&Vq*F99hY{4Hl4_aoUPvBuFJzb1~iGmtO*z0EK6D29V=H)m$;CcEaish9K9#c+m0%Xvqy* zL=z8gR)7*l@U`2|{? z11h1ROOzlRxIivuaB&Uubasu0G#y~}q^5uq3dB6n`Y*%|bjYqh2GDK?XJ40i*C5AW z*LcT(fcOAMckrwc$oo)@L8-a$^$J!25o=?B{1mrc~oUc5(s8M zekN!i4#IWdg+9TqA)x`_hyin9RWaNPp2c7lut|TgO87z+SQMg!IgS z!6tx~2SRs)f?N(=aTX7aPiV~r4R&Y+22}%9f)b&i#lJ|25f+S~wt75>lb(#4E?l7d zPe5{@Soiaf_YZIlas+QdNKZy{cWAI{P<*hbdwh^TWM&(7)CZ`67jFSq4eqjod;@hi zk{@9fL6R3ZAYkbW7SNC#$1ooB7!ep3EzbNyLl7dK#la3KWPI(B7JO(EdeGcNS(E#Cs40D4v8VfJmVSC`=Zj z9hCWytb+(boq--`@t(z=exPWmM2+Ckyu=dFA~MvB51tPME#QQvP~?MNU)&!5j2DvUz7?u z!3Ay-IE#AvftFW6wj+ScgQC)c5^!S+7LeeW!xhS)@P(EwsOCb-=-?92A~&Qo18NMU z=9T1t_D-jPr&5uVnrAU2PU~u{Go>~HTNNN#0WKaqym?u!pcMA;$7x?8qsd?!o z8OVtPzWxhV-X-Ni9RO~Z1ZSp$(jY9^z>I}>3pH;cg)2rO3awJXQ3_5TNl;6`4WHCJ zgvStJ4e=su=`WJ$p2bk-1gDn30~(x8Ar8WlOu@wncsE2M_(UlNH&@4y&>+wXHy=;~ zt^ibjcqHb4woy2NYEk4>)G$wjlO8B2!4m{9QAkig6F9*3 z0}y!|{T!HE-^I-rNVfcm+x ziV0jyfTI(fJ5N=0OrI8my{;qZs~!J4n%F|ftsMO;t3J!pgaRx%h@O5=})Q5x;^iE^QzynkWw8#-9^j!U10{lJwLgItM zor6PyTpfMm{qn&LYlJ5tNf(h~VP1h&Gf)Z8^fsnpPNl_&G>y=hm{}5w)k6|W5-2x5Vw0A%)oA z0kRk2GFSq{rV18cU`HTXj?fMDmuFsbK4^7mNh&-!q51$@FoRr_Sd;>7DKTI=93>fp zRt5wlCTD|IzUSm1A`21#SfUe@o=Xc-;**dPG~7`TUD#X&_AAUdsGpr&!6UH{9=g@A zuqT+rKngHI4z`*b$@j1r0Tp+SN%=)3pa_FS1**eAM#5yk4u?1~9$6d~%oYfT`<3S8 zz=Iv8-?JEG0@!@VoSgjf)D%b&0qs~}Isz6*NC7}(fq_y;x(3994-G?Fg9)DP0A~r% z*>2fki8#;MEC}SMl)OkK;s6W z<>R1ZXAp4%n$`iWm5+z2MoP4BDVXu-c^uu*5W7o@Qehh61A@X3aRjcNVN%6N;^5&l zByEt9UMz0Jm!sWN;itht&bk5}b_6O`VX@&93OU;bECx*?V4FZK2zV-ndm6p^0&O(` z9T<#oH#j;&@?8T!BXZyn2N?}6i`GY4Tk%i&iY?wOF zV1MKt!UR$(DDS~jDFL+snFXK|g;Eo9NznmU3v#t1xE~5`uYsBcPNBizU2dL`fim1J zB5;)pYEeP+Voquiin*wULE8jyYrsj&F$Z!iF{l$%3_h_2blgagGh{OX$Z;r!Ks4uN zmOu{`1@mFa6r4c7B1rB*?skBTg7gF#z#SNnrC{~ou?VmbxK9JJ7Rd;(ELa`LfM9<& zPdEo9s7iBFArhbwERfk~?PJjBPian0a6xKn3bI$B$IyUI*?@W;d_o0i&;sNVkfl&x zpoSJWl8`rzf|m&Sr-9Ql#3gjOp25AZrF$oR?klW!A3113oXk-dE6w#x` za0F^-fg>3-5tNvl3K}TKnwUYyXhIvX`i`Y3nfc(O03n$Zv|=pO#nV3?+9iSZ^cfuC zg6^p$ke%*e*MYTy=hVO^LDLE7WDR5uL8-<0Ii=ub`k*sAz|$ot>cM>($VetANdy$- z7o--IR3cd$47V0M9R=->Bb)`^lnA#4#c*hy22EnnE)ts2nR%JHrMZxF3UUGJ&>K`M zk{*zQ!CQ+MP^`iz=8F+VLb5^%sv*9K6<~`I9zpbHKpWpOL4g2@BXCNAxGXIn$qZ1q zK+V7xw6IKz2w9M!u;@bSk3qZxj#g+$fwC2f^FUWpfC3BB{D7S{2yz>=)&rIP2H^ID zA(%7*lg8k!w&*6q90qCo8XJMe&`R^tK_e7M$5Mi|LQ-fvl4C*Jkf8|`wCf6Xz%jCF zPy2V4rroc`Ci-K%}j3GB0NF0<3kz&rX*f+7b7<}Req}C^x#bD|a(;UN7Pk>IaTE6zPDB#Nt%QXdJ>ppuVwZ z9f>Mh!Q%Y08qYcIkzMd|gkh%>r@Buoa7bFCY z7FaR^D}#zbgB@HULNq~4fl5QFGmwpjU~yDuqLu^5#+HCp!=pJhF9nwkI6P>?5ab%{ z8WiU0g1re0O4qOkD9B=PaRhNRXhg9Lv@RnfixC^xS7b#J}GE|VCizmEH!xEi=rKv@g@&1`944{(^Am<9jLk|>SfM^C=g5Cl{ zjYNn-h(ka(!y#J=Epb6YV9P*Lx!~4-zrPbG@jz<|P(=m0w;?k>57O#@ilZ0}_Z4(y zHmD@4WB?s@<>&)CUIM;E8)`OmB{is<2Pr|^z-!AGf?Y$veg-)z-XpOn1#~SPB*DZx z=j4Ny!$Ca{b~30AE67PL0bTh8agTRuYJp=;W?3q-6j&|DOAL-~pmlX%UqaMFTE;Nv zIhG}6=73hyFhE@8n3I{F2Rb_3EfI8DDB)rSY$!NhAYrbT%n%sr8Waf{V}UGLM~Y3D ztxz99bim32h)Iw+4Af{xco8ZNDzYIb!eEOUq-X|Bz=F+1%Ll1N5buJb8k-TITm(_U z;G3A0Uj#d;1#A|$Vg#wc*4_uLa{%>r93d-gGV{`*IUU(bXkx$?=MdGffC9%G#39(6 z3EEZ-8oP&<+bQ7cAOsQg5a%K$-;k3CL=IFO;p%@u0~OP>EDE&_lFJ!<6DvZX=MjR#9jpXa0wHF4A*mL!a228?G%qtRvm_I|X)Xntw&6}l zg_}?Ul>+6<|P1;j{@N5G46A-07jLvJDSE6s%#D6To+BmP0hw?q2NAY&OE zQxXeGQj3C13qZ~J)D(YD7f}8OuVMh33^o|1%-7KwnoglkLv|G?C4z47geivHSpb_l z2aRll4Fo3uXh6opy@>BjGvCydOz;p;8u)q~crgnN08ohtH4o}4aA}4Sj3D=wASXSr zGNhP;BvvGSkb((jHt1dk@XS|nKxz>z;u(A$o#UZl5?{jLpInk!QVewlBr3q;ClI5N zihG!$xT{Oh*tfo8UP@7ZW{M+t8E}44CAi=O$>`x&>I-hcffOJOAcDAr)x&!I#Hoh$ zy@^we)GHvt2k;gsah4!AEQr$qPLCuwD7YjuC&x1v)@g%UvVxs~VIMmK0~(PAR6Rqm>h`x0V>DB!N9-+4he`pWPgCnL^T@{57^Cy$broM0W}*$ zgMtVae;_u5L<);;u#Pv0d^Eb4#ZY~%7JK5RKW~|Irtkp0|Uqc zP-sELgg6)&Kw6Q6Kswbp7#NrtCMht17#dIxGl*dT<*+~vV36TtU{K&hq!SQZi4#4Y zsBtndxNtHsFfwF-D0fbfFZvikbPR^#3{D1yEKaBkK#UwHhZ)4kgK}6vi~=Z!6~uT1 z<*>or1~O;-yrUzSKO#!1-Mi>_)vBMKC$RIv0 zM5Y39%eZ~>_TX=h|e15qGF%nWVy^FfRvu#t`R^FfRf2&Zm7 zh*1XN)X#@m2Ga|RYJ~P4MzD5}4mJizx`1iw<6>Z#05)lo0uzWa3CdvxF+{i_$rE1Y zgOqPV@(_s4!3|2TkmLzs^MLsf4};hsL)aJ~^2pZC0Gk6zULZC^9fXgpZVOl)B#(pG zAUi+-m@*&40@=XE0Fec;L8d@tk6NP#FHu#T?!3T_65CNSGzK8Wss zC;?GjNV-AnDG(_T1#%M;Lsvb_4IqD<04s;2eGvN$m=EzAhw;m z;Rjd&=XJP?RzU@kGs+oW28L_AAkD^bbs#Z_<{m~AL6Aabh91WGAjS=_@qLW*K@5;` zSYm{^0pun&KB!+n3=SxV8N}d%a#%nN9w>(u#NdN+*gy;cD2E-y5Q1_zKnxKmhZDpQ zgL1e)3<)TQ8^n-;a(F-t87PMr#E^q>_&^K=D2E@!P=aygR(P z3-}orcp3T_6nYqxm?4Q1B(#Melqh=``WR%Oq9Bo7n2KR;fSJY2(8o9*WCBPndNhIj z*8ue+6Nu3S^%h|vb+u!0yJP!1c2(FNtOgBU$f4hM+Q2jy^r7!#lzE)Zi9 zl*0{TOo4KEK#XZn4ljr?1Ipn8F=jzI{2<00C`SOqm+93c>65tJhgVl0Dl zL_mxc0-%K7BLboYM8Ir0SlEGrWd}I2ASD`z{X!TK&tSF)C>4OlSJ*@t7(gblF`%Xb zkSQL5plE}Xc#v8XBm&X_YGkC$2eCkUd7!Nph#F*f@CbtJh17N+HdsG&>|&lU1H&?5 z1_lm>iP=+_S{P*D=CLuvOlFKlq{ux23=ANh>YDu|In1SJ(FarY@!)L}6Xo3atF9l;)tO6+q% zRU(I$7gP)>qSN3)@Q7}L3L)zR6(T|+pun1>zyxB5Ksn4Hh8UE?0%Ax&IjkUt6qLgT zV#q)_>>x%Llml;9fUJlT0hLCOOafw;z)L|8s|HCH#0D7wD(5obAptVOM+B77kjq4n z2uMFjZOVKQ3#1c!nFumL18fhZOa!q#!2B3+i3ehX%!9=yhz)WnGebi?*ys)<#UM7w zDv-rVa7Sv1FfiDOFfhPNLJ$XJE)TSXhu91f0htb02I7Dm&jBiA!DT9lR{{1eq-ua@ z1c_83n-5E&AQM4ug|*T_>=+RS20>7(ybIKnO_6~%%R#~^=u)6EQwHu0kaIvLAeX@) zK1eGwLl@(G5CdcetlU-lMB!XJQ3eKo z1h-0*fuS40-6zVxuphxaB+9^W7{NUz%D`|P!DSL-U=S9Ao9rgWz~GMHdWkVGfLsZ6 z2F#&5L>L%Au481#gt?57Ars~*Mutq7ix?R)VXk3h$b`9sks%Z23Py%Zmh%DfDDE?0c0=4GK2Xb+5l`oJVL1fJa>tR zF)&Dhld|D_5N!muAlXcefdOO*QavUC7fOQJ19A~a6*I%cD7c9Mq6`c%qM*!SI3GkO zfGy7iQCU!75DoGckKg7l_>i=0h5-Aoe^kA5yV_*bBgXNM8-a z-U8-B^{VmKX!WK5&31z?2}3lY>kJ`5rb--b1D>Ae--lT?Yvf5c`1` ztV0BI3rN)kuquduL2QspSYs5#hUrR!X9JMPBWM&dff!Gq9A*$>fjA^Vz(=7$%HM)5 zfj9-k&JqVjHYD;u>>P2J(?F~`Bv}x<0WJ$-fh<5D7=I?l!0-tgL10=Ol1rJy85jh> zY@_)gS`N%Mo)4mRz-*KGAleGdHk}WmJ-}?U`5-zB%r>77qCqZWVz8JGqVvGw2J=Dg zX#ukh=Y!}DFxzN8i0%Qijpu{t31GI#d=Nba%r>15qGy2FX7fSx95CB_K8ObS5o8xE zqCoaliGvGB5CyUpxl}wL&cJX88tzOW#t|ro8N@gS<*|o*`MhHY4 zL`A^FL5w_zIEX5OiGvs&5OEOI0}}@^7D2>8)H0Yjh_MGE4x$dg#6gTJ5OG+DK9OKx zcp(8wg^*MUV*dp5A!C;y_CE<&s)XqRsrmpmwIg6Yi17t%Y6gh=_c2Uiw# z58{E$K$@`!8z+gdl0}k%fgQ|;_TSQ8`}7}CI&K>Q41SAqGE zV6Bm4U}!?(!@QIt$-q!12`Y>n=7ZFL3}#|*fS08jQVa}wQqb51F$|y_W)Q;+%3%R9 zET9}#5W^12VFNK7pd5A(!wt&e05LqE98M6!2g>0BG5nw$ZV)2?%HaVqf}k8;5F-J~ z;R7*Jpd2Qc??A2(l|rOw5F4Zjk`iF5Kq6T%tsq7Yl*0^S6hS#GAVvw4!wOfH?!i*aYP;gBV+&92O8`8mh#FN3hPVg3cVP#5Gd=qMaQ{0m~Y!2JtiflPpnLcmN>lV)IO0PBK` zRv^?t_%L-w(hLkB6G1~fAUZ}GR9r^SlV)H584D7IDFyL&fsKTe9U%4|FdtIYfY>L% ze26@VeG1Hn$ivJ5iCqDUL)3xTpTK-nbs({CU~z~#5c?0@<1o`eA`CL1h=!;Fvt`he z1Dgy30}qla5L*UA6-Y!0Nfn4~grN!~VkHAjLLi16l*0^SxIj59Ach;1!wO<}K{;$7 zh7Xj(4r2I0IUFEH0F=WCV#Gl?Tp&gglmjmZKrRVJaxaJtQiNI#fJ8E2T0x8~D2Exu zD1dTUK#U?NhZV#qgL2qFj0z}+9mJ@DayUSY8YqVo#OQ)@xIm0PC3+zVoZ z6rs8oBr+LE6^K0pBNjj+bCFbm*o!b!fkYM~sRFS#VWc zDpZqYU?9d8P;e{(hu0(pCJ>$QAD2D^Y z*a78mf*8l394-*!0+a*KlOUJWfx`t-euCJ$!F)(Kf!L>HVdW`^1u_EWUs$+w$ucnX z$uckqF?1cO6LL^75EF4w(biyO5EGsc5}zas8eHyTK$8L)cMiK0%w#n=1_li|NOEQZ zF!XQdO z0j3_ra#H}C52B{PB|xlM5D5^q3N8U+?SM#tr~_~b5bKHp$bDw>LG%N-42bmvq6I{O z0u{9sPLpF`D3Akb^?$dG4X$dd<6tucdyr!Xqa2XRZm0R!)O7 zaw$v@S#a+pC3 zFDQov#F(H0Q3fBE0qKoV1gC5e)c|33DKaqZfiOYT8AVt|0I{AyBtR6%IMg)Cqr|`< zrvyr)2J=C*0hnz#A4EHW*+%n0bO@MjJRd}-f!QYWL39O}Z8{%BcY)bv^Fj0+Fxz}S zh+YR~Tg(U12f%F0`5^idm~Ay5L_Yzut>=U2Z(z2~d=Sl{404<8d=M=KX4}mN(K=wZ z{rn5c3=CJGY%>)G1{)QSdb{}`+6m0Ioe!ctz-*iOAleViww@27L%?jS`5-z9%(k2l zq7%Sui}@fr4a_#552ACxY_s_wx(LiRoe!cbz-*KGAi56BHl7cnTfl6i`5?Lr%r=}4 zqCqhMO3Sb`_DGR|!2s+JgZUsDG%0|UrNMurR!^-LL*x;RhFe+9AvoYXi^%x6-KosjfuU z3vw}%Q$WT&Q3iz|q%jDJfOklI5c?N6P?`$B;lQPWPz++rg2SaLZ$2no)Q}`WY>;Kl z3{5%kQs|2^0|Ur7*gzP}Wgu%naioZjpu{t3^3bdK8OZc!o*-Y zACw0cfW-~wgEGMmFxzxKh~5Wgo6HB%N5E|3`5^ifm~Av4M1xWjDBr={<)F;K-~^5@ zNFw)9W?=9`;zuYmFhn8olav`4QjqvL$_xy7NPL*NX37i}L4*D^BX!3;g8!oY9=oL(j=Fo77Cpd4lp z;}(>|0%F{Oa#%r(dr%G=i17f*VFxk7R6&`25@_2R#1fD|1XPd-#E61&m_dvrD2D~a zNP%)#L5wsghYiHYfO6PDj4UXJ1H{OIayUVZJSc|?#5kn}aS1oX9SjUbstgPjs-Q+v zCxfZfd=Rrs6;uww>-;iR28IT(iVg-tmHADo3=B)aDl$OS8n6uWN|go%4K)S^JvETt z44CONR2dlNfK_xb*htL>F_(e$W`Zb?UM>c(-YJYWQt<2t(zQYrR52OM2hkV6S~51N zF)-|an14)-fdS+dq&b3JstgQAzzQ=#)ITsY384_~pIfR74EIz)#RH`K0b>6EyODV< zQZq3{je#KxVjGAm00&$L<9raK3M`%kqFTVr6cE)1W+sEEDPU$2h?)h_$TlCuSODR$ z!@UYJdKFkP+XOQY#_!RD2E-yxCiBM zfEW*;98M795tPFPVmyIzxIv6I4M;-afkov3bq0nr>fqQd&|qLF(*QGJvNzNj82+gv z0<}(qfuTVI!3VKhG(gFWc{NfXgKX)5+QbB6bU``HAjTIc2R@eo68HucWCAgMKsn4H z#w$&Tli|w6G#MCFH9?Mm%!1fyGB9`}@nMb!sZ-O0q&JWnA1FIWlYt=%tR9k5VCq>k z85j(pYC!6HpzLXy3=AMgAU9M%^4RPIsoen82ckjx7#Y%GRvgo0U^t@*3gR>nbph

mX-lX7NQ!& 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 D^ZmpU literal 325187 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̑!mumk`uCZ5Bs!C6fF1yu^D#l){J1_s7jQIv2j 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
@*(4Ykl++s- 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 diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Chameleon-Mini.hex index 0dd7362..0aa0a07 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.hex @@ -1,1332 +1,1269 @@ -:1000000053C300006DC300006BC3000069C3000050 -:1000100067C3000065C3000063C3000061C3000044 -:100020005FC300005DC300005BC3000059C3000054 -:1000300057C3000055C3000053C3000051C3000064 -:100040004FC300004DC300004BC3000049C3000074 -:1000500047C3000045C300000C94801241C3000058 -:100060003FC300003DC300003BC3000039C3000094 -:1000700037C3000035C3000033C3000031C30000A4 -:100080002FC300002DC300000C943C1229C30000B4 -:1000900027C3000025C3000023C3000021C30000C4 -:1000A0001FC300001DC300001BC3000019C30000D4 -:1000B00017C3000015C3000013C3000011C30000E4 -:1000C0000FC300000DC300000BC3000009C30000F4 -:1000D00007C3000005C3000003C3000001C3000004 -:1000E000FFC20000FDC20000FBC20000F9C2000018 -:1000F000F7C20000F5C20000F3C20000F1C2000028 -:10010000EFC20000EDC20000EBC20000E9C2000037 -:10011000E7C20000E5C20000E3C20000E1C2000047 -:10012000DFC20000DDC20000DBC20000D9C2000057 -:10013000D7C20000D5C20000D3C20000D1C2000067 -:10014000CFC20000CDC20000CBC200000C9424132B -:10015000C7C20000C5C20000C3C20000C1C2000087 -:10016000BFC20000BDC20000BBC20000B9C2000097 -:10017000B7C20000B5C20000B3C20000B1C20000A7 -:10018000AFC20000ADC20000ABC20000A9C20000B7 -:10019000A7C20000A5C20000A3C20000A1C20000C7 -:1001A0009FC200009DC200009BC2000099C20000D7 -:1001B00097C2000095C2000093C2000091C20000E7 -:1001C0008FC200008DC200008BC2000089C20000F7 -:1001D00087C2000085C2000083C2000081C2000007 -:1001E0007FC200007DC200007BC2000079C2000017 -:1001F00077C200000C94E42273C200001C034C0080 -:100200005500460041002000430044004300200008 -:10021000440065006D006F00000018034400650095 -:1002200061006E002000430061006D0065007200F7 -:10023000610000000403090409023E00020100C03D -:10024000320904000001020201000524001001042B -:100250002402060524060001070582030800FF09A1 -:10026000040100020A00000007050402100005074F -:100270000583021000051201100102000008EB03C3 -:10028000442001000102DC01004E4F4E45000000F9 -:1002900000000000000000000064046504660467BC -:1002A00004680469046C046D0400000001014D46FB -:1002B0005F434C41535349435F314B0000001514D9 -:1002C0004C14CA14E414E814E91466196C190004F7 -:1002D0000400024D465F434C41535349435F344B46 -:1002E00000000015144C14D714E414E814E9146643 -:1002F000196C19001004004E4F4E4500000000001C -:1003000000000000000000000000000000000000ED -:10031000000000000000005549445F52414E444F28 -:100320004D00000000000000000000000000000080 -:10033000000000000000005549445F4C4546545FF2 -:10034000494E4352454D454E540000000000000008 -:10035000000000000000005549445F5249474854DE -:100360005F494E4352454D454E5400000000000089 -:10037000000000000000005549445F4C4546545FB2 -:1003800044454352454D454E5400000000000000D6 -:10039000000000000000005549445F52494748549E -:1003A0005F44454352454D454E5400000000000057 -:1003B000000000000000004359434C455F53455482 -:1003C00054494E47530000000000000000000000A8 -:1003D0000000000000000053544F52455F4D454D52 -:1003E000000000000000000000000000000000000D -:1003F00000000000000000524543414C4C5F4D4559 -:100400004D0000000000000000000000000000009F -:10041000000000000000004368616D656C656F6E50 -:100420002D4D696E69202553207573696E67204CC8 -:1004300055464120255320636F6D70696C656420BB -:1004400077697468204156522D4743432025530055 -:100450003134303531310031333039303100342EE0 -:10046000372E320025730052414E444F4D00257502 -:1004700000257500253575206D56005645525349A7 -:100480004F4E00000000000000000000000000FDD2 -:100490000C434F4E4649470000000000000000009A -:1004A000003A0D310D1B0D554944000000000000BD -:1004B000000000000000000000670D400D524541A3 -:1004C000444F4E4C5900000000000000000000D2D4 -:1004D0000DC00D55504C4F4144000000000000007D -:1004E000000000E60D00000000444F574E4C4F4105 -:1004F000440000000000000000EB0D00000000526E -:10050000455345540000000000000000000000F0CA -:100510000D000000005550475241444500000000C6 -:100520000000000000FB0D000000004D454D534948 -:100530005A45000000000000000000000000000616 -:100540000E55494453495A45000000000000000080 -:1005500000000000001E0E425554544F4E00000093 -:1005600000000000000000340E3E0E390E534554CA -:1005700054494E4700000000000000000000004BFE -:100580000E460E434C4541520000000000000000A2 -:10059000000000530E0000000048454C50000000D1 -:1005A000000000000000000000570E000000005294 -:1005B000535349000000000000000000000000004C -:1005C000000000A30E00000000000000000000007A -:1005D00000000000000000000000000D0A000D0AED -:1005E00000643130303A4F4B000000000000000042 -:1005F00000000000000000000000000000000000FB -:100600000000653130313A4F4B205749544820544F -:1006100045585400000000000000000000000000E9 -:100620000000006E3131303A57414954494E47205D -:10063000464F5220584D4F44454D000000000000E9 -:1006400000000000C83230303A554E4B4E4F574EE6 -:1006500020434F4D4D414E4400000000000000007B -:100660000000000000C93230313A494E56414C4931 -:100670004420434F4D4D414E442055534147450082 -:10068000000000000000CA3230323A494E56414C58 -:10069000494420504152414D45544552000000000C -:1006A000000000000000000011241FBECFEFDFE2B9 -:1006B000DEBFCDBF10E2A0E0B0E2E2E8F2E502C0AA -:1006C00005900D92A239B107D9F72AE2A2E9B0E26A -:1006D00001C01D92AD39B207E1F703D00C943F2958 -:1006E0007CC081D00E94BB0B80E380930106D9D2ED -:1006F00010D10E94870C83D1B1D681E08093000293 -:100700001092010292E09093020293E0909304020F -:100710008093200288E380932102D0D0C1E00E9420 -:100720008C0CE091EB24F091EC240995E091F124FC -:10073000F091F224099580910C0A80FFF0CFC093CC -:100740000C0A70D10E94AB0C90D6809193248093B8 -:10075000060610929324E3CF292F33272230310548 -:1007600039F123303105A9F02130310549F020E07D -:1007700030E080E090E0FA0180839183C901089520 -:1007800022E130E086E792E0FA0180839183C9019B -:100790000895992781309105A1F082309105B9F033 -:1007A000892B29F7E4E3F2E0249130E0CF01E3CF95 -:1007B0002EE330E088E392E0FA0180839183C9015F -:1007C0000895EAE1F2E0249130E0CF01D4CFECEFDC -:1007D000F1E0249130E0CF01CECF1F920F920FB6FF -:1007E0000F921124FFCF8091780083FF0AC088E028 -:1007F0008093780088ED84BF81E080938000FD9530 -:10080000FEC080915000866080935000809151001E -:1008100081FFFCCF8091510082FFFCCF10925600E7 -:1008200021E02093600088ED84BF2093400083ED99 -:1008300090E38093260A9093270A86E08093000A2B -:1008400020934300209300048091CC018860809322 -:10085000CC01089588ED84BF81E0E8E7F0E0818372 -:10086000089588ED84BF8BE18093800008958BEC20 -:100870008093520080915000886080935000809156 -:10088000510083FFFCCF84EC809355008091500091 -:100890008061809350008091510084FFFCCF0895C7 -:1008A000E0E4F0E084818E7F8483E0E5F0E0808105 -:1008B0008F7E80838081877F8083089587E0E0EA50 -:1008C000F0E0828378940895089508950895089536 -:1008D000089580E090E0089508950895E091FE2441 -:1008E000F091FF24818395E2899FB001112468571C -:1008F0007D4F45E250E088ED94E20E94D625E091DC -:10090000ED24F091EE240995E091E924F091EA2498 -:100910000994E091FE24F091FF248181DFCF0F93B1 -:100920001F93CF93DF9320E030E015E2AC014F5FDF -:100930005F4F022F129FF001139FF00D1124E75714 -:10094000FD4F649161110FC0EC016881662301F1D4 -:100950002F5F3F4F2330310561F780E0DF91CF916A -:100960001F910F910895DC017C91772389F3671320 -:10097000EFCFDA0105C07D91772351F37613E8CFED -:100980003196ED0164916111F6CF68816111E0CF7C -:10099000802FA4DF81E0DF91CF911F910F91089507 -:1009A000CF93DF93EC016150710980E090E035E274 -:1009B0004CE2389FF001399FF00D1124E757FD4FAD -:1009C0002491222381F06131710568F0DE0103C0BA -:1009D0006031710541F02D93ED013196615071093F -:1009E00024912111F5CF8230910521F41882DF91F5 -:1009F000CF9108954993615071090196DACF089516 -:100A00000C94C82508951F93CF93DF93162F662368 -:100A100029F0EC01F5DF89931150E1F7DF91CF91D7 -:100A20001F9108950E94C8250E94C8250E94C825CC -:100A30000C94C825CF93DF93DC0161507109211517 -:100A4000310599F16230710580F1FA01240F351FEB -:100A50002150310940E050E017C0D05DDC93CF70E9 -:100A60008C2F90E00A97FCF4C05D1196CC931197FF -:100A70001296625071094E5F5F4FE217F307B9F0AB -:100A800031966230710598F0C081DC2FD295DF700D -:100A90008D2F90E00A970CF3D95CDC93CF708C2FEC -:100AA00090E00A970CF3C95CE0CF40E050E01C9264 -:100AB000CA01DF91CF910895FA0140814423F1F1F9 -:100AC00051815523D9F161157105C1F1DC0120E097 -:100AD00030E013C04295407F513428F5582F452B04 -:100AE0004D932F5F3F4F32964081442329F151812E -:100AF000552321F162177307F9F0842F80538A3050 -:100B000018F081518630D0F4852F80538A3020F040 -:100B1000952F9154963090F44134E0F24295407F05 -:100B200040575134D8F25753452B4D932F5F3F4FC9 -:100B3000329640814111DBCFC901089520E030E0B9 -:100B4000C9010895FB01EE56FF4DA0E0B4E0A61BDD -:100B5000B70B9A01A417B50708F49D0121153105BB -:100B600041F02E0F3F1FDC0181918D93E217F307B7 -:100B7000D9F70895DB01AE56BF4DE0E0F4E0E61B87 -:100B8000F70B9A01E417F50708F49F0121153105C9 -:100B900049F0FC01C9018E0F9F1F21912D93E81789 -:100BA000F907D9F70895E2E9F0E2119284E2E23917 -:100BB000F807D9F708958091FD2490E0A0E0B0E017 -:100BC0004AE0880F991FAA1FBB1F4A95D1F740E141 -:100BD00057ED30E4409366065093A0092091A10997 -:100BE00026FFFCCF3093A1092091A0091092A00903 -:100BF0002091A10926FFFCCF3093A1092091A009E3 -:100C00004093650627FFE6CF20E12093660623E0A8 -:100C10002093A0092091A10926FFFCCF20E4209376 -:100C2000A1092091A009AD01662777274093A0096B -:100C30002091A10926FFFCCF20E42093A109209157 -:100C4000A009892F9A2FAB2FBB278093A0098091F1 -:100C5000A10986FFFCCF80E48093A1098091A009BF -:100C60001092A0098091A10986FFFCCF80E48093B7 -:100C7000A1098091A009E2E9F0E290E41092A009B4 -:100C80008091A10986FFFCCF9093A1098091A009D2 -:100C9000819384E2E239F80789F780E18093650661 -:100CA0000895CF93DF9300D000D0CDB7DEB780E1B9 -:100CB0008093650692E09093660698E090936506AF -:100CC0009AE1909361061092A6091092A70990EC00 -:100CD0009093A50998E19093A4098093660687ED07 -:100CE0008093A0098091A10986FFFCCF80E48093C6 -:100CF000A1098091A0091092A0098091A10986FF05 -:100D0000FCCF80E48093A1098091A00990E19093A9 -:100D1000650680FD3EC08DE389838AE28A8380E890 -:100D20008B8386EA8C8320E137ED90E4209366067E -:100D30003093A0098091A10986FFFCCF9093A1096F -:100D40008091A0091092A0098091A10986FFFCCF93 -:100D50009093A1098091A0092093650687FFE6CFB3 -:100D600080E180936606FE013196CE01059630E45F -:100D700021912093A0092091A10926FFFCCF309357 -:100D8000A1092091A009E817F90791F780E1809364 -:100D900065062496CDBFDEBFDF91CF910CCF4F9279 -:100DA0005F926F927F928F929F92AF92BF92CF92FB -:100DB000DF92EF92FF920F931F93CF93DF93809177 -:100DC000FD2490E0A0E0B0E06AE0880F991FAA1F20 -:100DD000BB1F6A95D1F700E014E0E12CFF24F394E7 -:100DE000E0E1CE2EF7EDBF2EC0E4DC2ED0E1AD2E3B -:100DF00027ED922E33E5432E44E8542E53E8652E1A -:100E0000492F5A2F6B2F7727852E382FE701C81BC4 -:100E1000D1090C171D0708F4E801A092660690920C -:100E2000A0092091A10926FFFCCFD092A109209111 -:100E3000A0091092A0092091A10926FFFCCFD09211 -:100E4000A1092091A009C092650627FFE6CFA092D4 -:100E500066064092A0092091A10926FFFCCFD092FE -:100E6000A1092091A0098092A0092091A10926FF43 -:100E7000FCCFD092A1092091A009742E4093A00923 -:100E80002091A10926FFFCCFD092A1092091A009B1 -:100E90001092A0092091A10926FFFCCFD092A109B0 -:100EA0002091A009C0926506C0926606B092A00982 -:100EB0002091A10926FFFCCFD092A1092091A00981 -:100EC0001092A0092091A10926FFFCCFD092A10980 -:100ED0002091A009C092650627FFE6CFA092660682 -:100EE0005092A0092091A10926FFFCCFD092A10920 -:100EF0002091A0091092A0092091A10926FFFCCF02 -:100F0000D092A1092091A0091092A0092091A109D5 -:100F100026FFFCCFD092A1092091A0093093A0090F -:100F20002091A10926FFFCCFD092A1092091A00910 -:100F3000209799F09E012E563F4DE2E9F0E2419153 -:100F40004093A0094091A10946FFFCCFD092A1098E -:100F50004091A009E217F30791F7C0926506C0928D -:100F60006606B092A0092091A10926FFFCCFD0927D -:100F7000A1092091A0091092A0092091A10926FFA2 -:100F8000FCCFD092A1092091A009C092650627FF4D -:100F9000E6CFA09266066092A0092091A10926FFE3 -:100FA000FCCFD092A1092091A0098092A0092091A4 -:100FB000A10926FFFCCFD092A1092091A00970922F -:100FC000A0092091A10926FFFCCFD092A109209170 -:100FD000A0091092A0092091A10926FFFCCFD09270 -:100FE000A1092091A009C09265060C1B1D0B8C0F56 -:100FF0009D1FA11DB11D0115110509F001CFDF9144 -:10100000CF911F910F91FF90EF90DF90CF90BF9005 -:10101000AF909F908F907F906F905F904F900895CA -:101020002F923F924F925F926F927F928F929F92F8 -:10103000AF92BF92CF92DF92EF92FF920F931F93E6 -:10104000CF93DF93CDB7DEB72E97CDBFDEBFF901CB -:10105000411524E052076105710508F0A6C1009111 -:10106000FD2410E020E030E0AAE0000F111F221F55 -:10107000331FAA95D1F7040F151F261F371FC12C48 -:10108000B4E0DB2EE12CF12CC41AD50AE60AF70AEB -:101090004F01A12CB12C8D829E82AF82B886C814DC -:1010A000D904EA04FB0408F497C1AD81BE8110970E -:1010B00009F47BC1E12CFF24F394E0E19E2EF7EDCF -:1010C000DF2EE0E4AE2EF0E1CF2EE7ED7E2EF3E54D -:1010D0006F2EE4E88E2EF3E8BF2E09831A832B834C -:1010E0003C83AD87BE8749875A876B877C87498158 -:1010F0005A816B817C81052F162F272F3327412F93 -:10110000E981B7016E1B7109AD85BE85A617B707CA -:1011100008F4BD01C09266067092A0095091A10921 -:1011200056FFFCCFA092A1095091A0091092A009EE -:101130005091A10956FFFCCFA092A1095091A0099E -:101140009092650657FFE6CFAD87BE87C0926606D0 -:101150006092A009AD85BE855091A10956FFFCCFD4 -:10116000AD87BE87A092A1095091A0094093A00924 -:10117000AD85BE855091A10956FFFCCFAD87BE87D6 -:10118000A092A1095091A009502F0093A009AD850C -:10119000BE852091A10926FFFCCFAD87BE87A09216 -:1011A000A1092091A0091092A009AD85BE852091CA -:1011B000A10926FFFCCFAD87BE87A092A10920918F -:1011C000A00990926506AD85BE8590926606D09284 -:1011D000A0092091A10926FFFCCFA092A10920918E -:1011E000A0091092A0092091A10926FFFCCFA0928E -:1011F000A1092091A0099092650627FFE6CFAD874F -:10120000BE87C09266068092A009AD85BE852091FA -:10121000A10926FFFCCFAD87BE87A092A10920912E -:10122000A0091092A009AD85BE852091A10926FFD5 -:10123000FCCFAD87BE87A092A1092091A009109292 -:10124000A009AD85BE852091A10926FFFCCFAD8701 -:10125000BE87A092A1092091A009E093A009ED8585 -:10126000FE852091A10926FFFCCFED87FE87A09285 -:10127000A1092091A00961157105B1F09C01260F0B -:10128000371FFC010D851E85A191A093A009A09197 -:10129000A109A6FFFCCFA092A109A091A009E21785 -:1012A000F30791F70D871E8790926506ED85FE8501 -:1012B00090926606D092A0092091A10926FFFCCF4A -:1012C000A092A1092091A0091092A0092091A10942 -:1012D00026FFFCCFA092A1092091A009909265065B -:1012E00027FFE6CFED87FE87C0926606B092A00981 -:1012F000ED85FE852091A10926FFFCCFED87FE87B5 -:10130000A092A1092091A0094093A009ED85FE8536 -:101310002091A10926FFFCCFED87FE87A092A109AD -:101320002091A0095093A0094D855E852091A109C7 -:1013300026FFFCCF4D875E87A092A1092091A009CE -:101340001092A0094D855E852091A10926FFFCCF52 -:10135000A092A1092091A00990926506461B570B07 -:101360004D875E8729813A814B815C81260F371F2B -:10137000411D511D29833A834B835C834D855E85D6 -:10138000452B09F0B4CE49855A856B857C85DA01F9 -:10139000AE56BF4D9C018D819E818A0F9B1FF90126 -:1013A00021912D93A817B907D9F781E02E96CDBFCB -:1013B000DEBFDF91CF911F910F91FF90EF90DF90F3 -:1013C000CF90BF90AF909F908F907F906F905F90E5 -:1013D0004F903F902F900895CD82DE82EF82F88665 -:1013E00064CECF92DF92EF92FF920F931F93690129 -:1013F000411524E052076105710540F500E014E055 -:1014000020E030E0041B150B260B370BE12CF12CF0 -:101410000C151D052E053F05B0F04E565F4DC1144D -:10142000D10449F0DA01C80ED91EFC018D918193D7 -:10143000EC15FD05D9F781E01F910F91FF90EF901A -:10144000DF90CF90089568017901E7CF80E01F9188 -:101450000F91FF90EF90DF90CF900895E0E0F6E0DD -:1014600080E4828388E1868B0895FF920F931F9317 -:10147000CF93DF93CDB7DEB7A097CDBFDEBF80910E -:1014800008068095909192249827809392248074E6 -:101490008923D9F0E091FE24F091FF2480818130EE -:1014A000E9F08230A9F1833009F454C0843009F4A2 -:1014B00077C0853009F496C0863009F4B5C087300E -:1014C00009F46AC0883009F469C0A096CDBFDEBFB8 -:1014D000DF91CF911F910F91FF9008958091FB2490 -:1014E000882309F4A3C0F12C8E010F5F1F4F88DA07 -:1014F000F801EF0DF11D8083F3948091FB24F81621 -:10150000B0F3E091F724F091F824C8010995DDCFFC -:10151000E091F524F091F6248E010F5F1F4FC80172 -:1015200009952091FB24222361F3F801CE01029654 -:101530002150820F911D21E0222339F0308121E0DA -:101540003F3F09F020E03F5F30833196E817F9070D -:1015500099F7D7CFE091F524F091F6248E010F5F33 -:101560001F4FC80109952091FB2431E0215048F21A -:101570003323E1F3822F90E0F801E80FF91F408157 -:1015800031E04F3F09F030E0F801E80FF91F4F5FFD -:101590004083215068F7B5CF02DC97CF0CDB95CFA5 -:1015A000E091F524F091F6248E010F5F1F4FC801E2 -:1015B00009952091FB24222309F4A3CFF801CE0141 -:1015C00002962150820F911D21E0222331F03081BB -:1015D00021E0311120E0315030833196E817F907CE -:1015E000A1F78FCFE091F524F091F6248E010F5FE3 -:1015F0001F4FC80109952091FB2431E0215008F4C8 -:1016000080CF3323D9F3822F90E0F801E80FF91F40 -:10161000408131E0411130E0F801E80FF91F4150FD -:101620004083215070F76DCFCCD04FCF8E010F5F2C -:101630001F4F67CFCF93DF93EC016150710980E0BA -:1016400090E03CE2FC01EE0FFF1FE295F295F07F87 -:10165000FE27E07FFE27E950FD4F2491222381F0F1 -:101660006132710568F0DE0103C06032710541F03E -:101670002D93ED0131966150710924912111F5CF1F -:101680008830910521F41882DF91CF910895399324 -:10169000615071090196D6CFE091FE24F091FF24AC -:1016A00080830895AB01E091FE24F091FF246081D6 -:1016B00020E2629FB001112469507D4F0C94E8250F -:1016C000CF93DF93EC0167EF72E00E94DF25892B57 -:1016D000E1F167E173E0CE010E94DF25892BD9F1AA -:1016E00067E373E0CE010E94DF25892BB1F167E546 -:1016F00073E0CE010E94DF25892B89F167E773E053 -:10170000CE010E94DF25892B61F167E973E0CE01EC -:101710000E94DF25892B39F167EB73E0CE010E942F -:10172000DF25892B11F167ED73E0CE010E94DF25E3 -:10173000892BE9F067EF73E0CE010E94DF25892B4A -:10174000C1F080E0DF91CF91089580E0A5DF81E0D6 -:10175000DF91CF91089581E0F9CF82E0F7CF83E068 -:10176000F5CF84E0F3CF85E0F1CF86E0EFCF87E0DF -:10177000EDCF88E0EBCF43E150E060E070E08DEF2B -:1017800094E20C94FA2743E150E060E070E08DEFC2 -:1017900094E20C940528CF93C82F883010F0CF9195 -:1017A0000895FDDAC093FD248C2F90E0880F991FD7 -:1017B00080509B4D8093FE249093FF24AAD8CF9114 -:1017C000FAC92091FD2430E02F5F3F4F2770332767 -:1017D000822FF901EE0FFF1FEF5FFA4D90819111FB -:1017E0005CC02F5F3F4F27703327822FF901EE0F28 -:1017F000FF1FEF5FFA4D908191114FC02F5F3F4F58 -:1018000027703327822FF901EE0FFF1FEF5FFA4D8C -:101810009081911142C02F5F3F4F27703327822F55 -:10182000F901EE0FFF1FEF5FFA4D9081911135C066 -:101830002F5F3F4F27703327822FF901EE0FFF1FD5 -:10184000EF5FFA4D9081911128C02F5F3F4F2770B5 -:101850003327822FF901EE0FFF1FEF5FFA4D9081C2 -:1018600091111BC02F5F3F4F27703327822FF90143 -:10187000EE0FFF1FEF5FFA4D908191110EC02F5FA9 -:101880003F4F27703327822FF901EE0FFF1FEF5FC5 -:10189000FA4D9081911101C008957DCF8091FD2472 -:1018A0000895CF93DF93EC01F9DF805D888319827F -:1018B000DF91CF910895FC0180819181911103C046 -:1018C0008053883010F080E0089565DF81E008954E -:1018D000BC0180E090E20C947623CF93DF93EC017F -:1018E0002196FC016491662349F080E090E20E9419 -:1018F000C923FE01219664916111F7CFDF91CF9149 -:101900000895AB01BC0180E090E20C949F2380E23B -:10191000E0E6F6E082830895CF93DF9380E090E2E3 -:101920000E9448240E94491E80E090E20E946324A5 -:10193000EC0197FD09C080E1809393248093050614 -:101940008C2F6AD2882319F0DF91CF9108958C2FC4 -:10195000DF91CF91D1C380919424813009F130F08F -:10196000823069F1833071F099D367C58091680640 -:1019700085FFFACF84E180931B2081E0809394243B -:101980008DD35BC580911B20815080931B208111DA -:10199000EBCF0E9473220E94500410929424E4CF53 -:1019A00080911B20815080931B208111DDCF0E94EC -:1019B00037040E94AE2282E080939424D5CF809198 -:1019C000680685FDD1CF84E180931B2083E080935E -:1019D000942464D332C580E2E0E0F6E08583089584 -:1019E00080E2E0E0F6E08683089580E090E20C94E7 -:1019F000512380E090E20C94C3242EE534E03F9321 -:101A00002F9327E534E03F932F9320E534E03F9375 -:101A10002F9327E134E03F932F9321E02F931F92E0 -:101A20009F938F930E9400268DB79EB70C968DBF13 -:101A30009EBF85E6089529ED34E23F932F9324E677 -:101A400034E03F932F9321E02F931F929F938F9326 -:101A50000E9400268DB79EB708968DBF9EBF85E673 -:101A600008950E948F04811102C08AEC08958BDED4 -:101A700084E6089560E071E00E94D00485E6089550 -:101A80000F931F93CF93DF93CDB7DEB7A197CDBF51 -:101A9000DEBF8C012091FB24E091F524F091F62427 -:101AA000CE01019629A3099529A130E0AE014F5F2F -:101AB0005F4F60E071E0C8010E941A0585E6A196BB -:101AC000CDBFDEBFDF91CF911F910F910895BF92DF -:101AD000CF92DF92EF92FF920F931F93CF93DF93FA -:101AE000CDB7DEB7A097CDBFDEBF8C01C090FB2481 -:101AF000D12C67E674E00E94DF25892B59F5C114CB -:101B0000D104C1F1B12CEE24E394F12CEC0EFD1EB6 -:101B100000E010E00E940005F701E00FF11F808354 -:101B2000B3940B2D10E00C151D05A0F3E091F724E4 -:101B3000F091F824C701099584E6A096CDBFDEBFD9 -:101B4000DF91CF911F910F91FF90EF90DF90CF9099 -:101B5000BF900895A80160E270E0EE24E394F12CB8 -:101B6000EC0EFD1EC7010E945C058C159D05F1F26F -:101B70008AECE3CFEE24E394F12CEC0EFD1ED6CFDD -:101B80002091FC24211107C020E3FC012083FC01EB -:101B9000118285E6089521E3FC012083FC01118276 -:101BA00085E60895FC012181211105C080818133E2 -:101BB00041F0803311F08AEC08951092FC2484E601 -:101BC000089581E08093FC2484E6089580E198E004 -:101BD000F8D08EE6089581EF99E00BD18EE6089556 -:101BE000E0ECF4E081818E7F81830E9473220E9469 -:101BF0002A0484E60895E0ECF4E081818E7F8183FD -:101C00000E9473220E94310484E60895E9EFF4E211 -:101C100021812F9320812F932EE634E03F932F9341 -:101C200021E02F931F929F938F930E9400268DB7E0 -:101C30009EB708968DBF9EBF85E608952091FB2430 -:101C40001F922F9321E734E03F932F9321E02F93AE -:101C50001F929F938F930E9400268DB79EB7089680 -:101C60008DBF9EBF85E6089560E071E0E3DC85E608 -:101C7000089560E071E016DD85E6089521DD8111AB -:101C800002C08AEC08957FDD84E6089560E071E08B -:101C900008DE85E608950FDE811102C08AEC089502 -:101CA00072DD84E608950E94D30584E60895BF920C -:101CB000CF92DF92EF92FF920F931F93CF93DF9318 -:101CC0007C01CFEFD0E03BE7C32E34E0D32E4CE2D3 -:101CD000B42E8601B60180E990E20E94DF25892BAF -:101CE00021F1F6018491882389F0C132D10570F089 -:101CF000D70103C0C032D10549F08D937D010F5F3C -:101D00001F4F2197F80184918111F4CFF701B1920F -:101D10007F012197F6E1CF0ED11C8601B60180E943 -:101D200090E20E94DF25892BE1F6F70131971082BE -:101D300085E6DF91CF911F910F91FF90EF90DF909B -:101D4000CF90BF900895FC0120912002206820933D -:101D500020022091230220FFFCCF81E08093230208 -:101D6000A0911002B0911102AE5BB109B7FD1CC089 -:101D700029E637E54BE050E00E946025AA27BB2703 -:101D80009F938F9324E734E03F932F9381E08F93C9 -:101D90001F92FF93EF930E9400268DB79EB708967F -:101DA0008DBF9EBF85E60895A0E0B0E0E1CF80E062 -:101DB000E0E1F5E29191890F95E2E039F907D1F779 -:101DC000089521E0209395242093962424E12093E4 -:101DD000972425E0209398241092992410929A2415 -:101DE00010929B2410929C2480939D2490939E2477 -:101DF000089527E02093952424E6209398241092B8 -:101E0000992410929A2410929B2410929C248093DF -:101E10009D2490939E240895CF93C82F909195244C -:101E2000953009F47FC0E0F0973009F44AC060F5BE -:101E30002091A22480919624281709F4DFC030E075 -:101E400090E001972817390709F407C168E180E09D -:101E500090E20E94C9231092952481E0CF910895C9 -:101E6000933009F457C0B8F090E04091A2242FEFCE -:101E700030E0241B31098217930709F06AC085E01E -:101E80008093952481E0EACF9830F1F09930A1F069 -:101E900080E0CF9108959130D8F3813009F4DFC00C -:101EA000843029F0883141F081E0CF91089566E0D7 -:101EB00080E090E20E94C9231092952481E0CF91A6 -:101EC0000895853109F450C0C83189F3C63009F44A -:101ED000E1C0C53149F761E080E090E20E94C9238A -:101EE0006091962480E090E20E94C923609196243C -:101EF000609580E090E20E94C92360E870E080E194 -:101F000095E2FFDC54DF682F80E090E20E94C92355 -:101F100081E0A4CF8093A22484E08093952481E083 -:101F2000CF91089520919F243091A024F901E05F82 -:101F3000FA4D8083C901019680939F249093A02439 -:101F40008038910509F0B0CF86E08093952481E038 -:101F500085CF65E180E090E20E94C92382E0809312 -:101F6000952481E0CF91089581E08093962440915B -:101F7000992450919A2460919B2470919C24E09123 -:101F80009D24F0919E2420E830E080E195E20995BF -:101F9000882309F46FC061E080E090E20E94C923C9 -:101FA0006091962480E090E20E94C923609196247B -:101FB000609580E090E20E94C92360E870E080E1D3 -:101FC00095E29FDCF4DE682F80E090E20E94C92356 -:101FD0008091992490919A24A0919B24B0919C2463 -:101FE00080589F4FAF4FBF4F8093992490939A246E -:101FF000A0939B24B0939C2481E057CFD8DE8C1310 -:10200000A8CF4091992450919A2460919B2470917B -:102010009C24E0919D24F0919E2420E830E080E112 -:1020200095E20995882381F1809196248F5F8093B2 -:1020300096248091992490919A24A0919B24B09108 -:102040009C2480589F4FAF4FBF4F8093992490930B -:102050009A24A0939B24B0939C2466E07BCF10929B -:102060009F241092A0241092A12483E080939524B1 -:1020700081E0F4CE64E080E090E20E94C92389E030 -:102080008093952481E0EACE68E180E090E20E94AE -:10209000C923DCCE809196248F5F67CF80919524F1 -:1020A000813071F0873009F0089580919824982F3D -:1020B0009150909398248111F7CF10929524089510 -:1020C00080919824982F9150909398248111ECCF6F -:1020D00080919724982F915090939724811106C056 -:1020E0001092952485E080939824089565E180E01E -:1020F00090E20E94C923F6CF1F93CF93DF93982FCE -:1021000091549A3120F090529A31B8F48052209133 -:10211000A3243091A4242F3F310550F4F901E05F4E -:10212000FA4D80832F5F3F4F2093A3243093A42444 -:1021300081E0DF91CF911F9108959F5C9A3038F331 -:102140008F3529F38F3319F38D3309F38D30A9F0CF -:10215000883039F08B3161F71092A3241092A424B7 -:10216000E7CF8091A3249091A424009709F30197CD -:102170008093A3249093A424DBCFE091A324F09137 -:10218000A424E05FFA4D10821092A3241092A4249C -:1021900080911025882309F4A2C08F3309F49FC0D1 -:1021A0008D3309F49CC0E1E1F5E204C01F3331F046 -:1021B0001D3321F0EF0111911111F8CF18826BE757 -:1021C00074E080E195E20E94DF25892B09F432C199 -:1021D00061E974E080E195E20E94DF25892B09F432 -:1021E00026C167EA74E080E195E20E94DF25892B31 -:1021F00009F41AC16DEB74E080E195E20E94DF25DD -:10220000892B09F40EC163ED74E080E195E20E9430 -:10221000DF25892B09F402C169EE74E080E195E2C3 -:102220000E94DF25892B09F4F6C06FEF74E080E18E -:1022300095E20E94DF25892B09F4EAC065E175E08B -:1022400080E195E20E94DF25892B09F4DEC06BE274 -:1022500075E080E195E20E94DF25892B09F4D2C068 -:1022600061E475E080E195E20E94DF25892B09F4A5 -:10227000C6C067E575E080E195E20E94DF25892B05 -:1022800009F4BAC06DE675E080E195E20E94DF25B1 -:10229000892B09F4AEC063E875E080E195E20E9405 -:1022A000DF25892B09F4A2C069E975E080E195E298 -:1022B0000E94DF25892B09F496C06FEA75E080E162 -:1022C00095E20E94DF25892B09F48AC065EC75E050 -:1022D00080E195E20E94DF25892B09F452C088EC49 -:1022E000C0E0E1EEF5E0E4918E1709F430C0E2E0E1 -:1022F000F6E0E4918E1709F441C0E3E2F6E0E491E0 -:102300008E1709F438C0E4E4F6E0E4918E1781F109 -:10231000E5E6F6E0E4918E1741F1E6E8F6E0E491B7 -:102320008E1701F180E090E0D8DA8BED95E0D5DAF8 -:10233000CC2309F4FDCE80911025882309F4F8CE32 -:1023400080E195E2C5DA8EED95E0C7DAF1CE20E0C6 -:1023500030E041E2429FC001439F900D11248E5115 -:102360009A4FE2CF25E030E0F4CF24E030E0F1CF27 -:1023700023E030E0EECF22E030E0EBCF21E030E0B0 -:10238000E8CF2FE030E01092102546E1429FC001D7 -:10239000439F900D112485589B4F1F33F9F01D3337 -:1023A00089F0112319F089ECC1E09BCF4096FC0124 -:1023B00085919491FC010097B1F380E195E2099534 -:1023C000C1E08FCF4296FC0185919491FC0100976A -:1023D00051F3CE0101960995C1E083CF4496E7CF32 -:1023E0002EE030E0D0CF2DE030E0CDCF2CE030E05B -:1023F000CACF2BE030E0C7CF2AE030E0C4CF29E0DD -:1024000030E0C1CF28E030E0BECF27E030E0BBCFE6 -:1024100026E030E0B8CF25E030E0B5CF24E030E072 -:10242000B2CF23E030E0AFCF22E030E0ACCF21E00C -:1024300030E0A9CF20E030E0A6CF0895A0E2B6E0DA -:1024400082E011968C93119715968C931597E0E482 -:10245000F8E010A211A28DE291E086A397A38FEF7E -:102460009FEF80A791A781E0808398E8938393E012 -:1024700097831A968C9308951F920F920FB60F921E -:1024800011248F939F93EF93FF9380E196E28093C3 -:10249000B1249093B22480E996E28093B324909380 -:1024A000B4241092AA241092A9241092A524109268 -:1024B000AD241092AE241092A824E0E4F8E0138238 -:1024C00086E990E086AB97AB8AE190E080AF91AF70 -:1024D000E0E4F9E010A211A28FEF9FEF86A397A38B -:1024E00089E883838EE08083E0E2F6E01286FF9144 -:1024F000EF919F918F910F900FBE0F901F901895A5 -:102500001F920F920FB60F9211242F938F939F93C8 -:10251000EF93FF93909128068091A924957021E074 -:1025200009F020E0880F822B8093A9249091A524A4 -:102530009923A1F1982F9770973009F442C0982FF2 -:102540009C7061F191E082FD6BC09093A724809113 -:10255000A82481116DC08091AA248695992309F43D -:1025600071C020E8282B2093AA248091AD2490915B -:10257000AE2401968093AD249093AE248770992762 -:10258000892B61F4E091B124F091B2242193E0937E -:10259000B124F093B22481E08093A8248091A524F3 -:1025A00091E089278093A52488E880934308FF91D0 -:1025B000EF919F918F912F910F900FBE0F901F90D1 -:1025C00018951092400880E180934C0810924309BE -:1025D0008091A724882379F18CEB94E0809366099D -:1025E000909367091092A62481E080934C0983E0C0 -:1025F000809346098091AD249091AE24877061F05C -:102600009091AA248F5F96958F5F8930E1F7E091D2 -:10261000B124F091B224908381E08093AF24BECFA7 -:1026200090E09093A7248091A824882309F493CF65 -:102630001092A824B3CF8CE794E08093660990931E -:102640006709D0CF20E08ECF1F920F920FB60F9266 -:1026500011242F933F938F939F93EF93FF93809138 -:10266000A624853009F44DC0A8F0883009F47CC058 -:1026700020F5863009F4B8C0873009F48AC0FF918C -:10268000EF919F918F913F912F910F900FBE0F90DF -:102690001F901895823071F1F8F0833009F456C01C -:1026A000843069F78091AA2480FDB7C080E48093CC -:1026B000460685E08093A624E2CF893009F45BC00A -:1026C0008A30E9F6109240091092460910920008EB -:1026D00081E08093B024D3CF882309F453C08130A4 -:1026E00071F68FE390E080936609909367098EE01E -:1026F0008093000880E48093450683E08093A624BD -:10270000BECF8091AA2490E480FD84C090934506BA -:1027100086958093AA248091AB249091AC24019655 -:102720008093AB249093AC249C0127703327232BF8 -:1027300009F477C02091AD243091AE24821793071D -:1027400009F04EC088E08093A62499CF80E480935E -:10275000460684E08093A624E091B124F091B2244F -:1027600080818093AA248BCF80E48093460689E001 -:102770008093A62484CF80E4809346068AE08093E9 -:10278000A6247DCF8FE790E0809366099093670938 -:1027900076CFE091B324F091B4248081811136C0CA -:1027A00080E4809345062091AB243091AC24809145 -:1027B000AD249091AE242817390721F23196E09389 -:1027C000B324F093B424E091B124F091B224CF016A -:1027D00001968093B1249093B22481818093AA249E -:1027E00084E08093A6244BCFE091B324F091B424ED -:1027F0008081811107C080E48093460687E0809342 -:10280000A6243DCF80E480934506F8CF80E48093F2 -:102810004606C9CF909346067BCF80E48093450659 -:1028200048CF86E08093A6242ACFCF93DF93E0E4BD -:10283000F6E084E08283128AC0E8D1E082E68E83EB -:10284000A0E2B6E085E012968C93129781E0509654 -:102850008C93509782E052968C9352971A961C92C2 -:102860001A9783E019968C9398E598839AE5998353 -:1028700090E49183968381838683E0E0F8E08FE0A3 -:1028800090E086A397A388E090E082A793A783E2D5 -:102890008183DF91CF91D2CDCF93DF938091AF240D -:1028A0008823C1F01092AF2482E0809321068093A8 -:1028B00026066091AD247091AE246115710589F4EE -:1028C000E091EF24F091F0240995109240091092C4 -:1028D0004609B4DD8091B02481112AC0DF91CF91E7 -:1028E0000895E091F324F091F42480E196E20995B3 -:1028F00094FF23C09F7E009741F38093AD24909373 -:10290000AE241092AB241092AC2480E196E2809326 -:10291000B1249093B22480E996E28093B3249093FB -:10292000B42481E08093A6248091B0248823B1F25E -:102930001092B024DF91CF9181CDAC01569547958F -:10294000569547955695479541155105A1F260E07A -:1029500020E030E0F901E05FF94D2081022E229560 -:102960002025022E269526952025E058FF4F30E0A1 -:102970002F5F3F4F21FB772770F9C72F20E0D22F21 -:1029800071E0C727C0836F5F262F30E0241735071B -:1029900008F3B1CF81E08093B52484E090E0809388 -:1029A000B6249093B72488E08093B824089581E0FA -:1029B0008093B52482E090E08093B6249093B7246E -:1029C00088E18093B824089581E08093B524089528 -:1029D00008956F927F928F929F92AF92BF92CF9203 -:1029E000DF92EF92FF920F931F93CF93DF93CDB7B8 -:1029F000DEB72E97CDBFDEBF8C018091B524843029 -:102A000009F4F4C008F43BC0863009F4BDC008F0F6 -:102A100060C0F801D08031D78D25D8018C931196F4 -:102A2000DC902BD78D25F8018183D28026D78D2588 -:102A3000D80112968C9312971396DC901ED78D2591 -:102A4000F80183838081803309F4ACC2803A09F4B1 -:102A50001FC3803C09F43AC3813C09F4DAC3823CC9 -:102A600009F4E7C3803B09F4F1C38056823008F4CF -:102A700094C181E08093B52420E030E063C08230CF -:102A800009F4A0C008F471C0F8018081863209F40D -:102A90006FC1823509F46CC1803509F474C1982F77 -:102AA0009056923008F4E6C1803351F0803A41F0FC -:102AB000803C31F0813C21F0823C11F0803BC9F632 -:102AC00081E08093B52484E0F801808324E030E045 -:102AD00039C08A3008F055C0D801FC90CED68F2579 -:102AE000F8018083F180C9D68F25D80111968C9387 -:102AF00011971296FC90C1D68F25F8018283F3803E -:102B0000BCD68F25D80113968C9313971496FC90FE -:102B1000B4D68F25F8018483F580AFD68F25D801F0 -:102B200015968C9364E070E0C80125D481110CC225 -:102B3000E5D691E09827F801908385E08093B5244D -:102B400024E030E0C9012E96CDBFDEBFDF91CF91EA -:102B50001F910F91FF90EF90DF90CF90BF90AF90BB -:102B60009F908F907F906F9008952091B6249091C0 -:102B7000B724D8018C91863209F4F1C0823509F46A -:102B8000EEC020E030E0DECF780152E1D52ED70153 -:102B9000CC9073D68C25F70181937F01DA94B9F735 -:102BA00060E170E0C801E7D3882309F4C1CF8091C8 -:102BB000FC24882309F4E2C1A1D69AE09827D80121 -:102BC0009C93BBCF2091B6249091B724D8018C91CF -:102BD000863209F4C4C0823509F4C1C0833909F4CE -:102BE00020C21092B52420E030E0ACCFC8011CD642 -:102BF000D8011496FC9041D68F25F8018483F58086 -:102C00003CD68F25D80115968C9315971696FC9077 -:102C100034D68F25F8018683F7802FD68F25D801EB -:102C200017968C93179714962C9114979091B9241A -:102C300029131FCF15962C9115979091BA2429131B -:102C400018CF16962C919091BB24291312CF9091F6 -:102C5000BC2489130ECFF090BD240FD68F25F80128 -:102C60008083F090BD240F2CF294F0240F2CF69466 -:102C7000F694F02405D4F801E058FF4F2F2D30E0F2 -:102C80002F5F3F4F21FB882480F8912C31E0832671 -:102C900088258083F090BE24F0D58F25D801119629 -:102CA0008C93F090BE240F2CF294F0240F2CF69409 -:102CB000F694F024E5D3F801EF57FF4F2F2D30E0C5 -:102CC0002F5F3F4F21FBAA24A0F8B12CB1E0AB2627 -:102CD0008A258083F090BF24D0D58F25F801828388 -:102CE000F090BF240F2CF294F0240F2CF694F6945D -:102CF000F024C6D3F801EE57FF4F2F2D30E02F5FA1 -:102D00003F4F21FBCC24C0F8D12C31E0C3268C25C9 -:102D10008083F090C024B1D58F25D80113968C9371 -:102D2000F090C0240F2CF294F0240F2CF694F6941B -:102D3000F024A6D3F801ED57FF4F2F2D30E02F5F81 -:102D40003F4F21FB662460F8712CB1E06B2686258D -:102D5000808385E08093B52420E230E1F3CEF80152 -:102D60002083918382E08093B52420E130E0EACE95 -:102D700084E0D8018C9311961C9282E08093B52454 -:102D800020E130E0DFCEF8018181882309F47CC2A4 -:102D9000F801108224E030E0D5CE62E070E0C80196 -:102DA000EAD2882309F4F6C0F80181818C739081FE -:102DB000903609F485C26AE370E07B01F0E18F9FF1 -:102DC000E00CF11C112464E0CE0107960E9403057B -:102DD00044E050E060E070E0CE010B960E94A20556 -:102DE00046E050E0B701CE0101960E94A2058F8116 -:102DF0008093B92488858093BA2489858093BB24E5 -:102E00008A858093BC2460E470E089EB94E29AD5D3 -:102E10008091B9248093BD248091BA248093BE24EC -:102E20008091BB248093BF248091BC248093C024D4 -:102E300060E270E08DEB94E285D5AE01495F5F4FB3 -:102E4000BE01655F7F4FCE0101964ED38F81D801C1 -:102E50008C93888511968C931197898512968C9303 -:102E600012978A8513968C9384E08093B52420E290 -:102E700030E068CE62E070E0C8017DD2882309F4BA -:102E800009C2D80111962C9111972C738C91803620 -:102E900009F419C28AE390E07C01B0E12B9FE00CB9 -:102EA000F11C112464E0CE0107960E94030544E062 -:102EB00050E060E070E0CE010B960E94A20546E073 -:102EC00050E0B701CE0101960E94A2058F81809348 -:102ED000B92488858093BA2489858093BB248A8508 -:102EE0008093BC2460E470E089EB94E22BD5809160 -:102EF000B9248093BD248091BA248093BE2480910C -:102F0000BB248093BF248091BC248093C02460E2C2 -:102F100070E08DEB94E216D584E08093B5248F8128 -:102F2000F801808388858183898582838A8583836C -:102F3000AE01495F5F4FBE01655F7F4FCE010196D5 -:102F4000D3D220E230E0FECD6091C124B0E16B9F8E -:102F5000B001112440E150E082EC94E20E94A2050D -:102F60002091C2248091C6248095281709F4C4C0FA -:102F7000C5D496E09827D8019C93DFCD6091C124F9 -:102F8000F0E16F9FB001112440E150E0C8010E94C0 -:102F9000BA0512CEB3D491E09827F801908324E0CB -:102FA00030E0D0CD62E070E0C801E5D1882391F334 -:102FB000D80111966C91B0E16B9FB001112440E1F2 -:102FC00050E0C8010E94A20560E170E0C801A4D1F0 -:102FD0006801E0E8CE0ED11CA12CD801BC904DD4E4 -:102FE0008B25F80181938F010B2CB294B0240B2C0C -:102FF000B694B694B02444D22B2D30E02F5F3F4FCF -:1030000021FBEE24E0F8F12CF1E0EF268E25D6012D -:103010008D936D01A394B2E1AB12DFCF20E930E1D3 -:1030200091CD44E050E060E070E0CE0101960E9456 -:10303000A2059091B824D80111968C91803209F4A0 -:103040002FC1803709F09DCDD80112962C9112978F -:103050008981281396CD13962C9113978A81281372 -:1030600090CD14962C9114978B8128138ACD1596A8 -:103070002C9115978C81281384CD9C9361E070E08E -:10308000C8014AD183E08093B52428E130E05ACDCD -:1030900062E070E0C8016FD1882381F0D8011196F9 -:1030A0008C918093C12486E08093B52427D49AE044 -:1030B0009827F801908324E030E044CD1FD491E0BC -:1030C0009827D8019C9324E030E03CCD62E070E08A -:1030D000C80151D1882309F45DCFF8018181809323 -:1030E000C12488E08093B52409D49AE09827D801B8 -:1030F0009C9324E030E026CD8091CA24281338CF59 -:10310000E091C3248091C7248095E81331CF80914A -:10311000CB24E8132DCF8091C4249091C82490959E -:10312000891326CF9091CC24891322CF3091C524C6 -:103130009091C924909539131BCF9091CD243913C8 -:1031400017CF4091CE249091CF249095491310CF62 -:103150009091D02449130CCF9091D124909549138C -:1031600007CFD8019C911196FC91119712964C9122 -:10317000129750E060E070E0BA01552744275F2BBA -:10318000492B13969C91792B90E0A0E0B0E0DC01F4 -:10319000992788279E2B822BB32B2091B52428308A -:1031A00009F46DC0273021F4840F951FA61FB71FA7 -:1031B0008093C224C92EDA2EEB2EFF24C092C324A2 -:1031C0008D01222733270093C4244B2F55276627D0 -:1031D00077274093C524E82FE095E093C624EC2D93 -:1031E000E095E093C724E02FE095E093C824E42F16 -:1031F000E095E093C9248093CA24C092CB24009325 -:10320000CC244093CD2485E08093B52420E030E0A9 -:1032100099CC62E070E0C801AED0882309F44ECFAB -:10322000D80111968C918093C12487E08093B524B6 -:103230003DCF62E070E0C8019ED0882309F4AACE99 -:10324000F80181818093C12489E04CCF62E070E075 -:10325000C80191D0882309F431CF8091FC248111D9 -:1032600025CFD80111966C91B0E16B9FB00111246C -:1032700040E150E082EC94E20E94BA0517CF841B33 -:10328000950BA60BB70B94CF62E070E0C80173D02A -:103290008111A7CC81E0D8018C9324E030E052CC9E -:1032A0008981F80180833A8131832B8122839C813B -:1032B0009383832782278927848328E230E042CCC6 -:1032C00060E370E07ACD80E390E0E6CD44E050E04A -:1032D00060E070E00C94A205CF93DF931F92CDB70E -:1032E000DEB7FC01218130812327328123273381FE -:1032F0002327298344E050E060E070E00E94BA0593 -:1033000041E050E064E070E0CE0101960E94BA0511 -:103310000F90DF91CF9108956115710541F1680F0C -:10332000791FFC0123E633E64191422750E1459F96 -:10333000C0011124A42FA8278A2F90E0582F4427DA -:10334000880F991F880F991F880F991F48275927A1 -:10335000232F332724273527A295AF702A27E61776 -:10336000F70711F7922F832F908381830895FC0133 -:1033700083E693E6F9CF61157105B1F1680F791F06 -:10338000FC0123E633E64191422750E1459FC0010D -:103390001124A42FA8278A2F90E0582F4427880FA4 -:1033A000991F880F991F880F991F48275927232F86 -:1033B000332724273527A295AF702A27E617F7076A -:1033C00011F7A9015527808190E08417950711F026 -:1033D00080E00895418150E0232F332781E0421798 -:1033E0005307B9F380E0F5CFFC0143E650E023E654 -:1033F00033E6E9CFCF93B091D524C091D624409144 -:10340000D724A091D224F091D324E091D4249C2FEE -:1034100090712B2F217E9227242F207292272A2F02 -:10342000247992272F2F237792272E2F2A739227E2 -:10343000392F32953F703927232F2695269523273C -:10344000922F969550E060E070E0BA01552744272E -:103450005C2B4B2B769567955795479592279170E6 -:1034600098136068A093D524F093D624E093D724D2 -:103470004093D2245093D3246093D424CF910895C1 -:10348000CF93DF93C091D3249091D424A92FAF7010 -:10349000B0E0A05EBF4DEC2FEF70F0E0E05EFF4DBE -:1034A000D0968C912089822BE091D224E295EF7006 -:1034B000F0E0E05EFF4D2081822BC295CF70D0E01E -:1034C000C05EDF4D28A1822B92959F70A92FB0E09E -:1034D000A05ABF4D9C91892BE82FF0E0E059FF4D99 -:1034E0008081DF91CF910895CF92DF92EF92FF928A -:1034F0000F931F93CF93DF93FC01DB01EA019181CE -:1035000080E02081822B80FD8DC130E081FD88C16B -:1035100020E09695879596958795432F406880FD86 -:10352000342F422F406881FD242F969587959695DC -:10353000879536952695432F406880FD342F422F7E -:10354000406881FD242F96958795969587953695A9 -:103550002695432F406880FD342F422F406881FD1F -:10356000242F969587959695879536952695432F82 -:10357000406880FD342F422F406881FD242F9695AE -:1035800087959695879536952695432F406880FDBB -:10359000342F422F406881FD242F9695879596956C -:1035A000879536952695432F406880FD342F422F0E -:1035B000406881FD242F9695879596958795369539 -:1035C0002695532F5068422F406880FD352F309349 -:1035D000D52481FD242F2093D224938180E0228161 -:1035E000822B80FD1BC130E081FD16C120E0969545 -:1035F000879596958795432F406880FD342F422FFD -:10360000406881FD242F96958795969587953695E8 -:103610002695432F406880FD342F422F406881FD5E -:10362000242F969587959695879536952695432FC1 -:10363000406880FD342F422F406881FD242F9695ED -:1036400087959695879536952695432F406880FDFA -:10365000342F422F406881FD242F969587959695AB -:10366000879536952695432F406880FD342F422F4D -:10367000406881FD242F9695879596958795369578 -:103680002695432F406880FD342F422F406881FDEE -:10369000242F969587959695879536952695532F41 -:1036A0005068422F406880FD352F3093D62481FD2D -:1036B000242F2093D324958180E02481822B80FDC8 -:1036C000A9C030E081FDA4C020E09695879596952D -:1036D0008795432F406880FD342F422F406881FD3D -:1036E000242F969587959695879536952695432F01 -:1036F000406880FD342F422F406881FD242F96952D -:1037000087959695879536952695432F406880FD39 -:10371000342F422F406881FD242F969587959695EA -:10372000879536952695432F406880FD342F422F8C -:10373000406881FD242F96958795969587953695B7 -:103740002695432F406880FD342F422F406881FD2D -:10375000242F969587959695879536952695432F90 -:10376000406880FD342F422F406881FD242F9695BC -:1037700087959695879536952695532F5068422FB5 -:10378000406880FD352F3093D72481FD242F20936E -:10379000D424898111969C9111978927CA80129609 -:1037A0009C911297C926D12CE12CF12C7601DD24B5 -:1037B000CC24D82A88819C918927C82A8B8113968A -:1037C0009C918927F82A10E25BDE082F8C2D8170EE -:1037D00011DEF694E794D794C794002311F068940F -:1037E000F7F8115089F788818C25888389818D2588 -:1037F00089838A818E258A838B818F258B83DF91B4 -:10380000CF911F910F91FF90EF90DF90CF9008958F -:1038100020E45BCF30E456CF20E4E9CE30E4E4CEC0 -:1038200020E477CE30E472CECF92DF92EF92FF9217 -:10383000CF93FC018181C280D12CE12CF12C760147 -:10384000DD24CC24D82A8081C82A8381F82AC0E2CA -:1038500017DEB701A6014170552766277727842711 -:10386000C9DDF694E794D794C794C15089F7CF91F6 -:10387000FF90EF90DF90CF900895CF93DF9300DE1D -:10388000C82F80E0B7DDCC2309F436C0C0E8F8DDEE -:10389000D82F80E0AFDDC695D111C068F1DDD82FFB -:1038A00080E0A8DDC695D111C068EADDD82F80E0A0 -:1038B000A1DDC695D111C068E3DDD82F80E09ADD87 -:1038C000C695D111C068DCDDD82F80E093DDC695A8 -:1038D000D111C068D5DDD82F80E08CDDC695D1111F -:1038E000C068CEDDD82F80E085DD8C2F8695D11184 -:1038F0008068DF91CF910895C0E0C9CFCF93DF9367 -:10390000BFDDC82F80E076DDCC23D1F0C8E0B8DD84 -:10391000D82F80E06FDDC695D111C860B1DDD82FFA -:1039200080E068DDC695D111C860AADDD82F80E09F -:1039300061DD8C2F8695D1118860DF91CF9108953C -:10394000C0E0E5CF6F927F928F929F92AF92BF922D -:10395000CF92DF92EF92FF920F931F93CF93DF935B -:103960003C01CB010197672BC9F1F301A281C08112 -:10397000B181D3812A2F2D72322F32953F70322799 -:10398000232F269526952327322F36954D2F50E04D -:1039900060E070E0742F6627552744275B2B4C2B83 -:1039A0006A2B7695679557954795322730FD706855 -:1039B000C42F852E962EA72EBB24B82D6B01EE2486 -:1039C000FF24AC2D072F112722273327D02F019753 -:1039D00088F6F30140838182C2820383DF91CF9115 -:1039E0001F910F91FF90EF90DF90CF90BF90AF901D -:1039F0009F908F907F906F9008950F931F93CF9318 -:103A0000DF93CDB7DEB7EC97CDBFDEBF2BD380936E -:103A1000152728D38093162725D38093172722D3E1 -:103A2000809318271FD3809319271CD380931A27BC -:103A300019D380931B2716D380931C270E94F90C5F -:103A4000B0D3882389F0909115278091162785306F -:103A500009F452C0B0F0883009F4B3C0893009F4D9 -:103A600098C0863009F45AC09CD3882311F06DD3D6 -:103A700050D3EC96CDBFDEBFDF91CF911F910F9158 -:103A80000895813021F008F468C0833069F79923E4 -:103A900009F4A1C0923041F780911727811127C006 -:103AA0000091192710911A270F7011270115110580 -:103AB000D9F2802FF5D280911627833009F4E6C021 -:103AC000E0911F27F091202781818B7F818384E8FB -:103AD000809FF001819FF00D1124ED59F84D108267 -:103AE000E0911F27F091202780818E7F808380E0E6 -:103AF000D7D22BD38FD4B8CF9111B6CF109117272F -:103B00001F7723D387D47FD38823E9F31093C3048B -:103B1000111176C082E080931427A6CF905892307E -:103B200008F0A2CF80911727909118278C3D23E0B1 -:103B3000920709F467C0AE01455C5F4F6091192799 -:103B40000E94AC038C01009709F48ECFFED2B8011D -:103B50008BAD9CADC0D177D287CF903809F447C0E8 -:103B6000923809F081CF809119278F7099D2E09116 -:103B70001F27F0912027118112FB112710F980E0F7 -:103B80008FD2E3D2812F7DD280E07BD243D242D448 -:103B90006BCF911169CF80911727823008F064CFE5 -:103BA000D4D2809117278093102734D48091102786 -:103BB000882309F461C084E0809314270E94F50CE7 -:103BC00053CF903809F050CFC0D28091102759D2EE -:103BD00021D220D449CF90911727913009F044CFBA -:103BE00091E0833009F090E09093122780CF1091FC -:103BF000112780911227882309F4C3CF1260C1CF07 -:103C000083E089CF83E08A838AE389835FB7F8946E -:103C100082E08093CA01E8E0F0E0E4911092CA01EA -:103C2000DE01139620E038E042E0EF708E2F90E046 -:103C3000EA30B8F0C7968D939D932F5F2C3199F0A1 -:103C40004093CA01E32FF0E0E4911092CA0120FFF3 -:103C5000ECCFE295EF703F5FEF708E2F90E0EA308F -:103C600048F7C096E8CF5FBF70D26AE370E0CE013C -:103C7000019690D0E8D1F8CE8091C304882321F03A -:103C800084E0809314279ACF81E0FBCF42D22FCFDC -:103C90000895CF9380911427811102C0CF91089588 -:103CA000C091212780E0FCD17CD2811103C08C2FF0 -:103CB000CF91F6C1A2DE8C2FCF91F2C1AF92BF920D -:103CC000DF92EF92FF920F931F93CF93DF938C01BC -:103CD000EB017A01B5D3D82E811127C0E114F1048C -:103CE000A1F1F70120813181C21BD30B020F131FF9 -:103CF0002097D9F0A12CB12C80911D2790911E27DF -:103D0000FC01EF5BFF4F2081FC01E05CFF4F8081F5 -:103D1000281790F17FD1BDDFF701808191818A0D55 -:103D20009B1D8083918325E0D22E8D2DDF91CF9135 -:103D30001F910F91FF90EF90DF90BF90AF9008958B -:103D400069D1A7DF7DD3811123C0209771F3209122 -:103D50001D2730911E27F901EF5BFF4F9081F9017C -:103D6000E05CFF4F8081981758F7F80181918F012F -:103D700088D1219761F7D9CFF80181918F0181D145 -:103D8000FFEFAF1ABF0ACA15DB0509F0B5CFCDCFDB -:103D9000D82ECBCFCF92DF92EF92FF920F931F934B -:103DA000CF93DF936C01EB0180912127806878D15C -:103DB00000911B2710911C270C171D0720F020973E -:103DC00009F483C08E01C0E00115110509F04AC055 -:103DD000CC2309F45CC080911427882309F455C0D2 -:103DE000853009F45DC0DDD181116DC0F3D1811141 -:103DF0004EC009D2882379F38091212787FD5AC0CC -:103E000020911D2730911E27F901E05CFF4FE080D3 -:103E1000F901EF5BFF4F8081F12CE81AF1080115E1 -:103E20001105A9F088E0E816F10488F4E60104C061 -:103E300088E0E816F10459F0899123D16E01015010 -:103E400011098FEFE81AF80A0115110589F7C1E089 -:103E500088E0E816F10409F0C0E0DCD00115110596 -:103E600009F4B6CF80911427882379F08530C1F00A -:103E700098D1811128C0AED1811109C0C4D181115E -:103E8000BBCF809114278111F1CF82E00AC0A2D16B -:103E900081111FC0809114278823B9F38530B9F7A9 -:103EA00083E0DF91CF911F910F91FF90EF90DF9012 -:103EB000CF900895E0911D27F0911E27EF5BFF4FF3 -:103EC000E080F12CACCF81E0ECCFA4D000E010E09A -:103ED0007ACF80E0E6CFCF92DF92EF92FF920F93FE -:103EE0001F93CF93DF93D82EC92E8B01809121276A -:103EF0008068D6D0C0911B27D0911C27C017D1074E -:103F000028F00115110509F47FC0E801ED2CFC2C07 -:103F1000D12C209709F045C0DD2009F457C08091CD -:103F20001427882309F450C0853009F458C039D1CA -:103F3000811168C04FD1811149C065D1882379F3BF -:103F40008091212787FD55C080911D2790911E27C4 -:103F5000FC01E05CFF4F0081FC01EF5BFF4F8081C3 -:103F600010E0081B1109209791F00830110520F08E -:103F70000EC00830110559F0F701849182D0FFEF8F -:103F8000EF1AFF0A21970F5F1F4F209791F7DD244B -:103F9000D3940830110509F0D12C3CD0209709F4B6 -:103FA000BBCF80911427882379F08530C1F0F9D0F8 -:103FB000811128C00FD1811109C025D18111C0CF35 -:103FC000809114278111F1CF82E00AC003D18111C1 -:103FD0001FC0809114278823B9F38530B9F783E097 -:103FE000DF91CF911F910F91FF90EF90DF90CF90D5 -:103FF0000895E0911D27F0911E27EF5BFF4F008190 -:1040000010E0B1CF81E0ECCF05D0C0E0D0E07ECFB2 -:1040100080E0E6CFE0911F27F0912027A0911D2797 -:10402000B0911E27AF5BBF4F8C9190E0828393834A -:1040300080818D798083E0911D27F0911E27EF5BB1 -:10404000FF4F10820895E0911F27F0912027808173 -:104050008D798083E0911D27F0911E27EF5BFF4F44 -:104060001082089580911D2790911E27FC01EF5B1F -:10407000FF4F2081DC01A20FB11D8C912F5F2083A7 -:10408000089520911D2730911E27F901EF5BFF4F06 -:104090009081D901A90FB11D8C939F5F90830895E2 -:1040A00080932127282F2F70622F70E094E8299F9A -:1040B000900111242E5D384D4091C6045091C704E3 -:1040C00087FD12C020931D2730931E27CB018295B8 -:1040D0009295907F9827807F9827840F951F8093D3 -:1040E0001F279093202708952E5B3F4F20931D2775 -:1040F00030931E2762957295707F7627607F7627B2 -:10410000685F7F4F640F751F60931F277093202790 -:104110000895E0911F27F091202781818460818399 -:10412000E0911F27F09120278181807C803409F065 -:104130000895809121278058B3DFE0911F27F091E7 -:1041400020278181846081830895809121278F7742 -:10415000A7DFE0911F27F091202780818D78808351 -:10416000E0911F27F0912027808181608083E0917A -:104170001D27F0911E27EF5BFF4F108280912127B2 -:1041800080688EDFE0911F27F09120278081816079 -:104190008083E0911D27F0911E27EF5BFF4F108277 -:1041A0000895809121278F777BDFE0911F27F09181 -:1041B0002027808184FF0CC020911D2730911E276D -:1041C00082819381F901E05CFF4F808381E0089553 -:1041D00080E00895809121278F7762DFE0911F278B -:1041E000F0912027808185FF0CC020911D27309100 -:1041F0001E2782819381F901E05CFF4F808381E07B -:10420000089580E0089580912127806849DFE0913A -:104210001F27F091202780818695817008951F9334 -:10422000CF93DF9300D0CDB7DEB7182F4A836983D1 -:1042300037DFE0911F27F09120271182E0911F279F -:10424000F09120274A81698117FD22C01082E091F8 -:104250001F27F09120276183E0911F27F0912027ED -:104260001282138280911D2790911E27848395834B -:1042700040E0FC01E05CFF4F4083FC01EF5BFF4F3F -:10428000108281E00F900F90DF91CF911F910895E0 -:1042900082E08083E0911F27F09120276183E091E5 -:1042A0001F27F09120271282138280911D27909161 -:1042B0001E2784839583DDCFAF92BF92DF92EF926A -:1042C000FF920F931F93CF93DF9300D0CDB7DEB74C -:1042D000E62E662309F44AC05C018C010C5F1F4F77 -:1042E000F12CD5015C915523C9F1D5011196ED91C1 -:1042F000FC911297D80111974C91D8018C91823082 -:1043000008F443C098E188E1E930F10550F028E075 -:1043100030E090E09F5F220F331F2E173F07D0F34E -:10432000982B252F2F7030E02630310564F5E134CD -:10433000F10548F59F7E41112BC09064DE2E4E2F73 -:10434000692F852F805859839A8369DF9A81598113 -:104350004D2D692F852F63DF8823A9F0F394B5E0F5 -:10436000AB0EB11C0B5F1F4FFE10BBCF81E00F9057 -:104370000F90DF91CF911F910F91FF90EF90DF9001 -:10438000BF90AF90089580E0F2CF98E088E0BCCF76 -:10439000413029F09068442389F2DE2ED9CF906C09 -:1043A000DE2ED6CFE0ECF4E0A681B78119961C9200 -:1043B000A681B78111961C92A681B78159961C924D -:1043C000A681B78151961C92A681B78199961C92BD -:1043D000A681B78191961C92A681B781D9961C922D -:1043E000A681B781D1961C92A681B781A75BBF4FEA -:1043F0001C92A681B781AF5BBF4F1C92A681B7818B -:10440000A75ABF4F1C920680F781E02DEF5AFF4F4D -:10441000108208958091152787FD08C0F4DE811170 -:104420000DC0809114278111F9CF0895D3DE811139 -:1044300006C0809114278111F9CF0895EBCD03CEEA -:104440001F93CF93DF93E091C604F091C704E05A25 -:10445000FF4FC081D18114E6809121278078803878 -:1044600031F1B8DE811126C080911427882339F1FB -:10447000853051F1E0911F27F0912027818182FD45 -:1044800028C0E091C604F091C704E05AFF4F808134 -:104490009181C817D90701F3212F21501123F1F081 -:1044A000EC01122F8091212780788038D1F6ABDE85 -:1044B0008823D1F280E0DF91CF911F91089582E0AF -:1044C000DF91CF911F91089583E0DF91CF911F91EC -:1044D000089581E0DF91CF911F91089584E0DF91ED -:1044E000CF911F91089563D069D0E0ECF4E0818111 -:1044F0008E7F818380818F77808310921327089528 -:10450000CF93DF93E0E4F0E01482848181608483C0 -:104510004ED054D0C0ECD4E088818F7788838881D6 -:104520008068888310921427109210271092122707 -:104530001092112788818064888348E068E480E8CD -:104540006EDE48E068E480E06ADE88858064888703 -:10455000898181608983DF91CF910895CF93DF9323 -:104560003FB7F894C0ECD1E022E02A87EAE1F0E01E -:10457000E491A0ECB4E0DA96EC93DA97EBE1F0E0AA -:10458000E491DB96EC93DB971A868BE39AE28E7FBD -:1045900016968D939C93179785E18C9318962C9380 -:1045A0003FBF81E080931327DF91CF91A9CFE0EC4B -:1045B000F4E080858370808711860895E0ECF4E054 -:1045C0008FEF8287848708951F920F920FB60F9204 -:1045D00011242F933F934F935F936F937F938F9308 -:1045E0009F93AF93BF93EF93FF938091CA0487FD8E -:1045F0004DC08091CA0486FD41C08091CA0485FFE8 -:104600000CC080E28093CA0480911027882371F146 -:1046100084E0809314270E94EB0C8091CA0484FFED -:1046200014C080E18093CA0482E080931427109222 -:1046300010271092C304B6DE48E068E480E8EFDD9E -:1046400048E068E480E0EBDD23DBFF91EF91BF9170 -:10465000AF919F918F917F916F915F914F913F911A -:104660002F910F900FBE0F901F9018958091C3044B -:10467000811115C081E080931427CDCF80E4809311 -:10468000CA04109214270E94F00CB7CF8091C8047E -:1046900087FFAFCF80E88093CA04FADAAACF83E01D -:1046A000EACFCF93DF93EC014096FC018BE0DF0172 -:1046B0001D928A95E9F782E08C83898783E08E8753 -:1046C00061E0CE010196F8DD811104C080E0DF9148 -:1046D000CF91089561E0CE010696EEDD8823B1F317 -:1046E00061E0CE010B96DF91CF91E6CDCF93DF93C2 -:1046F000D62FC72F20911427243021F082E0DF919C -:10470000CF910895FC014489558966897789452BA5 -:10471000462B472B99F38181C3DCAD2FBC2FFD01C4 -:1047200001900020E9F7BF01615071096A1B7B0B02 -:1047300040E050E08D2F9C2FDF91CF91BFCAEF92C8 -:10474000FF920F931F93CF93DF93EB017A01209198 -:104750001427243041F082E0DF91CF911F910F9117 -:10476000FF90EF900895FC01048915892689378907 -:10477000012B022B032B79F3818192DC40E050E086 -:10478000B701CE01DF91CF911F910F91FF90EF9074 -:1047900095CA0F931F93CF93DF931F92CDB7DEB7C8 -:1047A00020911427243039F082E00F90DF91CF91CF -:1047B0001F910F910895FC01048915892689378975 -:1047C000012B022B032B81F38181698369DC20910A -:1047D0001D2730911E27F901EF5BFF4F9081F901F2 -:1047E000E05CFF4F80816981981730F0698312DCAB -:1047F00027DE69818111D9CF862F43DC80E0D5CFB8 -:104800000F931F93CF93DF931F92CDB7DEB7209105 -:104810001427243039F082E00F90DF91CF911F915F -:104820000F910895FC014489558966897789452B44 -:10483000462B472B81F3818133DC80912127209106 -:104840001D2730911E27F90187FD1DC0E05CFF4F39 -:104850008081F901EF5BFF4F408190E0841B91095B -:10486000892B11F480E0D8CF0081F901E05CFF4F83 -:104870001081D0DB0117B0F3E3DD8111CDCF898347 -:10488000C9DB8981C9CFEF5BFF4F808190E0E8CF22 -:10489000CF93DF93EC0180911427843019F0DF91DE -:1048A000CF9108954C895D896E897F89452B462B70 -:1048B000472BA9F38981F4DBA6DC882381F3CE01A1 -:1048C000DF91CF919DCFCF93DF9320911427243098 -:1048D000C1F5FC014489558966897789452B462BAA -:1048E000472B79F18681DCDB75DC882351F18091DF -:1048F000212787FD3DC080911D2790911E27FC0137 -:10490000E05CFF4F2081FC01EF5BFF4F408130E016 -:10491000241B3109232BD9F4CFEFDFEF209121277E -:1049200027FD23C0DC01A05CBF4F8C91208190E06B -:10493000821B9109892B39F486DBCE01DF91CF915F -:104940000895CFEFDFEFCE01DF91CF9108958ADB9D -:10495000C82FD0E080911D2790911E27FC01EF5BAE -:10496000FF4F2091212727FFDDCF808190E0E2CF0C -:1049700080911D2790911E27FC01EF5BFF4F208146 -:1049800030E0C8CF0895FF920F931F93CF93DF932A -:10499000EC0107DC882349F0888190E020911927F9 -:1049A00030911A272817390731F0DF91CF911F91E5 -:1049B0000F91FF90089580911627813209F44BC022 -:1049C00008F033C0803289F780911527813269F76A -:1049D000BCDB04C080911427882339F3FBDB8823D8 -:1049E000C9F340DB082F3EDB182F3CDBF82E3ADB07 -:1049F0004F2D50E060E070E0BA0155274427782B36 -:104A0000402B512B4C8B5D8B6E8B7F8B2BDB888FE0 -:104A100029DB898F27DB8A8F16DBFCDCCE01DF9157 -:104A2000CF911F910F91FF90ADCF823209F434C026 -:104A3000833209F0BACF80911527813209F0B5CFC2 -:104A400084DBE8DC60911727CE01DF91CF911F91C5 -:104A50000F91FF9097CF80911527813A09F0A5CF4C -:104A600074DBD1DB8823E9F38C89FD880E891F89EB -:104A700008DB8F2D06DB802F04DB812F02DB888D86 -:104A800000DB898DFEDA8A8DFCDAC4DADF91CF9102 -:104A90001F910F91FF90BECC80911527813209F0B4 -:104AA00084CF53DBB7DC8091172790911827888B30 -:104AB000998BCE01DF91CF911F910F91FF9062CF23 -:104AC000B7FF04C003D0821B930B089509D0A59FA4 -:104AD000900DB49F900DA49F800D911D11240895F9 -:104AE000A29FB001B39FC001A39F01D0B29F700DE0 -:104AF000811D1124911D08958F929F92AF92BF92B4 -:104B0000CF92DF92EF92FF92CF93DF93EC01688117 -:104B100079818A819B81611571058105910521F457 -:104B200064E279ED8BE597E02DE133EF41E050E071 -:104B300038D349015A019B01AC01A7EAB1E4C6DFB1 -:104B40006B017C01ACEEB4EFA5019401BBDFC60E96 -:104B5000D71EE81EF91EF7FE06C081E0C81AD1086C -:104B6000E10880E8F80AC882D982EA82FB82E894E8 -:104B7000D7F8EE24FF24C601DF91CF91FF90EF908C -:104B8000DF90CF90BF90AF909F908F900895B4CF5B -:104B90008CE190E2B1CFA0E0B0E080931C20909334 -:104BA0001D20A0931E20B0931F200895FB01DC015F -:104BB00002C005900D9241505040D8F70895FB0176 -:104BC000DC018D91059080190110D9F3990B08959E -:104BD000FB01DC014150504048F005900D9200204F -:104BE000C9F701C01D9241505040E0F70895FB0104 -:104BF000DC0102C001900D9241505040D8F7089559 -:104C0000AEE0B0E0E5E0F6E2F5C20D891E898F89DD -:104C1000988D2EE02C8309831A8397FF02C080E0D1 -:104C200090E801978D839E83CE014B96AC01698DF0 -:104C30007A8DCE01019611D04D815E8157FD0AC05B -:104C40002F813885421753070CF49A01F801E20FBF -:104C5000F31F10822E96E4E0E6C2ACE0B0E0E2E39F -:104C6000F6E2BAC27C016B018A01FC01168217824E -:104C7000838181FFB9C188248394912C8C0E9D1E61 -:104C8000F7019381F60193FD859193FF81916F0167 -:104C9000882309F4A5C1853239F493FD859193FFEA -:104CA00081916F01853221F4B70190E0F0D1E8CF16 -:104CB000512C312C20E02032A8F48B3261F028F402 -:104CC000803251F0833271F40BC08D3239F0803371 -:104CD00049F4216028C02260246025C0286023C0D8 -:104CE000206121C027FD27C0382F30533A3078F497 -:104CF00026FF06C0FAE05F9E300D1124532E13C02C -:104D00008AE0389E300D1124332E20620CC08E3282 -:104D100021F426FD65C1206406C08C3611F420689C -:104D200002C0883641F4F60193FD859193FF81918D -:104D30006F018111C0CF982F9554933018F0905285 -:104D4000933028F40C5F1F4FFFE3F9830DC08336C7 -:104D500031F0833771F0833509F05AC022C0F80171 -:104D6000808189830E5F1F4F44244394512C54014A -:104D700014C03801F2E06F0E711CF801A080B18000 -:104D800026FF03C0652D70E002C06FEF7FEFC50105 -:104D90002C8772D12C0183012C856FE7262E2222CD -:104DA00017C03801F2E06F0E711CF801A080B180CD -:104DB00026FF03C0652D70E002C06FEF7FEFC501D5 -:104DC0002C874FD12C012C8550E8252E222A8301D7 -:104DD00023FC1AC005C0B70180E290E058D13A9494 -:104DE000832D90E048165906B0F30EC0F50127FC5C -:104DF000859127FE81915F01B70190E048D1311084 -:104E00003A94F1E04F1A51084114510479F7E5C082 -:104E1000843611F0893639F5F80127FF07C0608123 -:104E20007181828193810C5F1F4F08C06081718105 -:104E3000882777FD8095982F0E5F1F4F4FE6B42E81 -:104E4000B22297FF09C090958095709561957F4F2C -:104E50008F4F9F4FF0E8BF2A2AE030E0A40143D1F2 -:104E6000A82EA81842C0853731F43FEEB32EB222E7 -:104E70002AE030E024C099EFB92EB2228F36B9F083 -:104E800020F4883509F0ACC00DC0803721F0883798 -:104E900009F0A6C002C020E1B22AB4FE0BC084E033 -:104EA000B82A08C024FF09C0E6E0BE2A06C028E0F0 -:104EB00030E005C020E130E002C020E132E0F8013E -:104EC000B7FE07C060817181828193810C5F1F4FA3 -:104ED00006C06081718180E090E00E5F1F4FA401E9 -:104EE00002D1A82EA818FFE7BF22B6FE0BC02B2DBB -:104EF0002E7FA51450F4B4FE0AC0B2FC08C02B2DBE -:104F00002E7E05C07A2C2B2D03C07A2C01C0752C67 -:104F100024FF0DC0FE01EA0DF11D8081803311F4E4 -:104F2000297E09C022FF06C07394739404C0822FA7 -:104F3000867809F0739423FD13C020FF0EC05A2C0D -:104F4000731458F4530C5718732C07C0B70180E240 -:104F500090E02C879CD073942C857314B8F304C014 -:104F6000731410F4371801C0312C24FF11C0B7019D -:104F700080E390E02C878BD02C8522FF1CC021FF82 -:104F800003C088E590E002C088E790E0B7010CC05C -:104F9000822F867881F021FD02C080E201C08BE281 -:104FA00027FD8DE2B70190E072D005C0B70180E324 -:104FB00090E06DD05A94A514C8F3AA94F401EA0DB8 -:104FC000F11DB701808190E062D0A110F6CF05C03D -:104FD000B70180E290E05BD03A943110F9CF50CE27 -:104FE000F7012681378102C02FEF3FEFC9012C96D0 -:104FF000E2E10BC1E0ECF1E0A785A7FDFDCFA485C0 -:10500000A860A4876050704FF2CDDC01CB0102C0D4 -:105010002D9105D041505040D8F70895262FE0EC4F -:10502000F1E0378537FDFDCF3485377F348737850D -:1050300031FF09C036E3328738ED34BF31E03387C2 -:10504000378537FDFDCF33E332878083918312822A -:10505000248325E3228728ED31E024BF338701969E -:105060000895FC010590615070400110D8F78095BB -:1050700090958E0F9F1F0895FC0161507040019024 -:105080000110D8F7809590958E0F9F1F08950F936C -:105090001F93CF93DF938C01EB018B8181FD03C0C4 -:1050A0000FEF1FEF1AC082FF0DC02E813F818C8150 -:1050B0009D812817390764F4E881F9810193E88319 -:1050C000F98306C0E885F985802F0995892B41F77A -:1050D0008E819F8101968E839F83C801DF91CF913E -:1050E0001F910F910895FA01AA27283051F120311C -:1050F00081F1E8946F936E7F6E5F7F4F8F4F9F4F6C -:10510000AF4FB1E03ED0B4E03CD0670F781F891FAD -:105110009A1FA11D680F791F8A1F911DA11D6A0F7B -:10512000711D811D911DA11D20D009F468943F912E -:105130002AE0269F11243019305D3193DEF6CF012D -:105140000895462F4770405D4193B3E00FD0C9F7F3 -:10515000F6CF462F4F70405D4A3318F0495D31FD60 -:105160004052419302D0A9F7EACFB4E0A6959795B3 -:10517000879577956795BA95C9F700976105710589 -:1051800008959B01AC010A2E0694579547953795D3 -:105190002795BA95C9F7620F731F841F951FA01D2D -:1051A0000895052E97FB16F4009406D057FD0CD0F9 -:1051B00044D007FC09D07EF4909580957095619558 -:1051C0007F4F8F4F9F4F0895509540953095219573 -:1051D0003F4F4F4F5F4F08952F923F924F925F92F4 -:1051E0006F927F928F929F92AF92BF92CF92DF92F7 -:1051F000EF92FF920F931F93CF93DF93CDB7DEB75C -:10520000CA1BDB0BCDBFDEBF09942A8839884888CA -:105210005F846E847D848C849B84AA84B984C884D2 -:10522000DF80EE80FD800C811B81AA81B981CE0FC9 -:10523000D11DCDBFDEBFED010895A1E21A2EAA1B3C -:10524000BB1BFD010DC0AA1FBB1FEE1FFF1FA21736 -:10525000B307E407F50720F0A21BB30BE40BF50B33 -:10526000661F771F881F991F1A9469F760957095BC -:10527000809590959B01AC01BD01CF010895F894F4 -:02528000FFCF5E -:1052820000831000000104100000018208000001E8 -:1052920000000000000000000000001401000000F7 -:1052A20000010101000000010000010001010001F4 -:1052B20000000002020000020002020202000002DC -:1052C20000000004040000040004040404000004BC -:1052D200000808080000000800000800080800088C -:1052E200000000101000001000101010100000103C -:1052F20000010001000000000000000100010101A6 -:105302000101010001000100000001010001010191 -:02531200000099 +:100000007BC3000095C3000093C3000091C30000B0 +:100010008FC300008DC300008BC3000089C30000A4 +:1000200087C3000085C3000083C3000081C30000B4 +:100030007FC300007DC300007BC3000079C30000C4 +:1000400077C3000075C3000073C3000071C30000D4 +:100050006FC300006DC300000C94AB1269C30000B5 +:1000600067C3000065C3000063C3000061C30000F4 +:100070005FC300005DC300005BC3000059C3000004 +:1000800057C3000055C300000C94671251C3000011 +:100090004FC300004DC300004BC3000049C3000024 +:1000A00047C3000045C3000043C3000041C3000034 +:1000B0003FC300003DC300003BC3000039C3000044 +:1000C00037C3000035C3000033C3000031C3000054 +:1000D0002FC300002DC300002BC3000029C3000064 +:1000E00027C3000025C3000023C3000021C3000074 +:1000F0001FC300001DC300001BC3000019C3000084 +:1001000017C3000015C3000013C3000011C3000093 +:100110000FC300000DC300000BC3000009C30000A3 +:1001200007C3000005C3000003C3000001C30000B3 +:10013000FFC20000FDC20000FBC20000F9C20000C7 +:10014000F7C20000F5C20000F3C200000C94651372 +:10015000EFC20000EDC20000EBC20000E9C20000E7 +:10016000E7C20000E5C20000E3C20000E1C20000F7 +:10017000DFC20000DDC20000DBC20000D9C2000007 +:10018000D7C20000D5C20000D3C20000D1C2000017 +:10019000CFC20000CDC20000CBC20000C9C2000027 +:1001A000C7C20000C5C20000C3C20000C1C2000037 +:1001B000BFC20000BDC20000BBC20000B9C2000047 +:1001C000B7C20000B5C20000B3C20000B1C2000057 +:1001D000AFC20000ADC20000ABC20000A9C2000067 +:1001E000A7C20000A5C20000A3C20000A1C2000077 +:1001F0009FC200000C9403219BC20000660F660F93 +:100200004E0F570F700F240F3E0F410F380F291458 +:10021000B513BE13C513D313DE1303147D131114CA +:1002200018141F148115811595155016A715C5159D +:1002300045156915691569150E1CDB1B7A1BDB1B3F +:100240007A1BC91BAB1B7A1BA21B8B1B1C034C000C +:1002500055004600410020004300440043002000B8 +:10026000440065006D006F00000018034400650045 +:1002700061006E002000430061006D0065007200A7 +:10028000610000000403090409023E00020100C0ED +:1002900032090400000102020100052400100104DB +:1002A0002402060524060001070582030800FF0951 +:1002B000040100020A0000000705040210000507FF +:1002C0000583021000051201100102000008EB0373 +:1002D000442001000102DC01004E4F4E45000000A9 +:1002E00000000000000000000089048A048B048CD8 +:1002F000048D048E049104920400000001014D4617 +:100300005F434C41535349435F314B00000043145A +:100310007A14F5140F1513151415E718ED180004C9 +:100320000400024D465F434C41535349435F344BF5 +:1003300000000043147A1402150F1513151415E765 +:1003400018ED18001004004E4F4E4500000000004C +:10035000000000000000000000000000000000009D +:10036000000000000000005549445F52414E444FD8 +:100370004D00000000000000000000000000000030 +:10038000000000000000005549445F4C4546545FA2 +:10039000494E4352454D454E5400000000000000B8 +:1003A000000000000000005549445F52494748548E +:1003B0005F494E4352454D454E5400000000000039 +:1003C000000000000000005549445F4C4546545F62 +:1003D00044454352454D454E540000000000000086 +:1003E000000000000000005549445F52494748544E +:1003F0005F44454352454D454E5400000000000007 +:10040000000000000000004359434C455F53455431 +:1004100054494E4753000000000000000000000057 +:100420000000000000000053544F52455F4D454D01 +:1004300000000000000000000000000000000000BC +:1004400000000000000000524543414C4C5F4D4508 +:100450004D0000000000000000000000000000004F +:1004600000000000000000253575206D5600257540 +:100470000025750052414E444F4D002573004368DE +:10048000616D656C656F6E2D4D696E692025532019 +:100490007573696E67204C55464120255320636F64 +:1004A0006D70696C65642077697468204156522DBF +:1004B000474343202553003134303932340031333F +:1004C0003039303100342E382E31000D0A000D0A3B +:1004D00000643130303A4F4B000000000000000053 +:1004E000000000000000000000000000000000000C +:1004F0000000653130313A4F4B2057495448205461 +:1005000045585400000000000000000000000000FA +:100510000000006E3131303A57414954494E47206E +:10052000464F5220584D4F44454D000000000000FA +:1005300000000000C83230303A554E4B4E4F574EF7 +:1005400020434F4D4D414E4400000000000000008C +:100550000000000000C93230313A494E56414C4942 +:100560004420434F4D4D414E442055534147450093 +:10057000000000000000CA3230323A494E56414C69 +:10058000494420504152414D45544552000000001D +:100590000000000000000056455253494F4E000035 +:1005A0000000000000000000000000140D434F4E4A +:1005B00046494700000000000000000000510D48BF +:1005C0000D320D55494400000000000000000000FD +:1005D0000000000000810D570D524541444F4E4C24 +:1005E0005900000000000000000000E50DD30D558B +:1005F000504C4F414400000000000000000000F992 +:100600000D00000000444F574E4C4F414400000085 +:100610000000000000FE0D0000000052455345544C +:100620000000000000000000000000030E000000B9 +:1006300000555047524144450000000000000000B2 +:10064000000E0E000000004D454D53495A45000074 +:100650000000000000000000000000190E55494491 +:1006600053495A450000000000000000000000004F +:1006700000310E425554544F4E000000000000005F +:10068000000000470E510E4C0E53455454494E473E +:1006900000000000000000000000005E0E590E4344 +:1006A0004C454152000000000000000000000066C0 +:1006B0000E0000000048454C500000000000000003 +:1006C00000000000006A0E00000000525353490071 +:1006D000000000000000000000000000000000B466 +:1006E0000E000000000000000000000000000000FC +:1006F000000000000000000011241FBECFEFCDBF9E +:10070000DFE2DEBF10E2A0E0B0E2EAE9FEE402C010 +:1007100005900D92A239B107D9F72AE2A2E9B0E219 +:1007200001C01D92AD39B207E1F703D00C944B27FD +:1007300079C07ED00E94D00B80E380930106E4D282 +:100740000DD10E949E0C87D1A0D681E0809300023B +:100750001092010292E09093020293E090930402BF +:100760008093200288E380932102CDD0C1E00E94D3 +:10077000A30CE091EB24F091EC240995E091F12495 +:10078000F091F224099580910C0A80FFF0CFC0937C +:100790000C0A75D10E94C20C7FD68091932480935D +:1007A000060610929324E3CF292F332722303105F8 +:1007B00029F12330310599F02130310541F080E0F5 +:1007C00090E020E030E0FA0120833183089582E157 +:1007D00090E026EC32E0FA012083318308959927D6 +:1007E0008130910599F082309105B1F0892B39F76C +:1007F000E4E8F2E0849190E09F01E5CF8EE390E0A1 +:1008000028E832E0FA01208331830895EAE6F2E035 +:10081000849190E09F01D7CFECE4F2E0849190E0E6 +:100820009F01D1CF1F920F920FB60F921124FFCFCD +:100830008091780083FF0AC088E08093780088ED7B +:1008400084BF81E080938000FD95FEC080915000C0 +:100850008660809350008091510081FFFCCF809191 +:10086000510082FFFCCF1092560021E020936000DF +:1008700088ED84BF2093400083ED90E38093260AA7 +:100880009093270A86E08093000A209343002093E8 +:1008900000048091CC0188608093CC01089588ED9C +:1008A00084BF81E0E8E7F0E08183089588ED84BFAC +:1008B0008BE18093800008958BEC809352008091AF +:1008C00050008860809350008091510083FFFCCFDE +:1008D00084EC80935500809150008061809350009B +:1008E0008091510084FFFCCF0895E0E4F0E0848122 +:1008F0008E7F8483E0E5F0E080818F7E808380813D +:10090000877F8083089587E0E0EAF0E0828378942F +:1009100008950895089508950895089580E090E059 +:10092000089508950895E091FE24F091FF248183B5 +:1009300095E2899FB001112468527D4F45E250E055 +:1009400088ED94E20E94E523E091ED24F091EE24FD +:100950000995E091E924F091EA240994E091FE24BC +:10096000F091FF248181DFCF0F931F93CF93DF930B +:1009700049ED52E010E0BC016F5F7F4F9A01FA0130 +:10098000C491C1110FC0EC012881222311F11F5F16 +:100990004B5D5F4F133091F780E0DF91CF911F9156 +:1009A0000F910895DC01FC91FF2389F3CF13EFCF62 +:1009B000DB0105C0FD91FF2351F3F013E8CF2F5F5A +:1009C0003F4FED01F90104910111F4CF288121116C +:1009D000DECF812FA8DF81E0DF91CF911F910F91B2 +:1009E00008950F931F93CF93DF936150710949EDE1 +:1009F00052E01CE29A01FA010491002351F16131A5 +:100A0000710520F426C06031710561F0DC010196AA +:100A1000EC010C932F5F3F4F61507109F901049174 +:100A20000111F1CFF3E043325F0731F41882DF9117 +:100A3000CF911F910F910895CE01019618836150B7 +:100A400071094B5D5F4F23E04834520799F6EC0182 +:100A5000EDCFEC01E7CF08950C94D72308951F93B1 +:100A6000CF93DF93662339F0EC01162F0E94D72332 +:100A700089931150D9F7DF91CF911F9108950E946A +:100A8000D7230E94D7230E94D7230C94D723CF9338 +:100A9000DF93DC016150710921153105A9F1623044 +:100AA000710590F1FA0121503109240F351F80E0C2 +:100AB00090E017C0D05DDC93CF704C2F50E04A30EF +:100AC000510504F5C05D1196CC93119712966250B2 +:100AD00071090296E217F307C9F031966230710589 +:100AE000A8F0C081DC2FD295DF704D2F50E04A3046 +:100AF000510504F3D95CDC93CF704C2F50E04A30A1 +:100B0000510504F3C95CDFCF80E090E01C92DF91D7 +:100B1000CF910895DC01FA018081882309F441C056 +:100B200091819923D9F120E030E061157105A1F49C +:100B300033C08295807F913430F5942F892B8D932B +:100B40002F5F3F4F32968081882331F19181992325 +:100B500029F16217730701F140ED480F4A3020F088 +:100B60004FEB480F4630D0F440ED490F4A3020F0AB +:100B70005FEB590F563090F48134D8F28295807F24 +:100B800080579134D0F29753892B8D932F5F3F4F2D +:100B9000329680818111DACFC901089580E090E01A +:100BA000089520E030E0F8CFFB01EE56FF4D20E045 +:100BB00034E0261B370B4217530708F49A0121151E +:100BC000310549F0DC01CF01820F931F21912D9354 +:100BD000E817F907D9F70895DB01AE56BF4D20E0BD +:100BE00034E0261B370B4217530708F49A012115EE +:100BF000310541F0FC01820F931F21912D93E817DD +:100C0000F907D9F7089580E094E0E2E9F0E2DF0126 +:100C10009C011D9221503040E1F708958091FD2400 +:100C200090E0A0E0B0E04AE0880F991FAA1FBB1F28 +:100C30004A95D1F740E157ED30E440936606509372 +:100C4000A0092091A10926FFFCCF3093A109209192 +:100C5000A0091092A0092091A10926FFFCCF309392 +:100C6000A1092091A0094093650627FFE6CF20E166 +:100C70002093660623E02093A0092091A10926FF76 +:100C8000FCCF20E42093A1092091A009AD016627A3 +:100C900077274093A0092091A10926FFFCCF20E4EB +:100CA0002093A1092091A009892F9A2FAB2FBB2750 +:100CB0008093A0098091A10986FFFCCF80E48093F6 +:100CC000A1098091A0091092A0098091A10986FF35 +:100CD000FCCF80E48093A1098091A009E2E9F0E2D1 +:100CE00090E41092A0098091A10986FFFCCF909317 +:100CF000A1098091A009819384E2E239F80789F77C +:100D000080E1809365060895CF93DF9300D000D0F3 +:100D1000CDB7DEB780E18093650692E090936606DA +:100D200098E0909365069AE1909361061092A60967 +:100D30001092A70990EC9093A50998E19093A409CB +:100D40008093660687ED8093A0098091A10986FFB4 +:100D5000FCCF80E48093A1098091A0091092A009A2 +:100D60008091A10986FFFCCF80E48093A109809146 +:100D7000A00990E19093650680FD3EC08DE38983D4 +:100D80008AE28A8380E88B8386EA8C8320E137EDD0 +:100D900090E4209366063093A0098091A10986FF14 +:100DA000FCCF9093A1098091A0091092A009809195 +:100DB000A10986FFFCCF9093A1098091A0092093FF +:100DC000650687FFE6CF80E180936606FE013196D7 +:100DD000CE01059630E421912093A0092091A1092C +:100DE00026FFFCCF3093A1092091A009E817F9074D +:100DF00091F780E1809365062496CDBFDEBFDF9139 +:100E0000CF910CCF5F926F927F928F929F92AF9211 +:100E1000BF92CF92DF92EF92FF920F931F93CF93E7 +:100E2000DF938091FD2490E0A0E0B0E06AE0880FBD +:100E3000991FAA1FBB1F6A95D1F700E014E0E12CAF +:100E4000FF24F394E0E1CE2EF7EDBF2EC0E4DC2EBC +:100E5000D0E1AD2E27ED922E33E5632E44E8742EBB +:100E600053E8852E492F5A2F6B2F7727382FE7010C +:100E7000C81BD1090C171D0708F4E801A0926606EB +:100E80009092A0092091A10926FFFCCFD092A10940 +:100E90002091A0091092A0092091A10926FFFCCF62 +:100EA000D092A1092091A009C092650627FFE6CF44 +:100EB000A09266066092A0092091A10926FFFCCFAE +:100EC000D092A1092091A0095093A0092091A109D5 +:100ED00026FFFCCFD092A1092091A0094093A00940 +:100EE0002091A10926FFFCCFD092A1092091A00951 +:100EF0001092A0092091A10926FFFCCFD092A10950 +:100F00002091A009C0926506C0926606B092A00921 +:100F10002091A10926FFFCCFD092A1092091A00920 +:100F20001092A0092091A10926FFFCCFD092A1091F +:100F30002091A009C092650627FFE6CFA092660621 +:100F40007092A0092091A10926FFFCCFD092A1099F +:100F50002091A0091092A0092091A10926FFFCCFA1 +:100F6000D092A1092091A0091092A0092091A10975 +:100F700026FFFCCFD092A1092091A0093093A009AF +:100F80002091A10926FFFCCFD092A1092091A009B0 +:100F9000209799F0E2E9F0E29E012E563F4D5190E4 +:100FA0005092A0095090A10956FEFCCFD092A10901 +:100FB0005090A009E217F30791F7C0926506C0921E +:100FC0006606B092A0092091A10926FFFCCFD0921D +:100FD000A1092091A0091092A0092091A10926FF42 +:100FE000FCCFD092A1092091A009C092650627FFED +:100FF000E6CFA09266068092A0092091A10926FF63 +:10100000FCCFD092A1092091A0095093A009209172 +:10101000A10926FFFCCFD092A1092091A0094093FD +:10102000A0092091A10926FFFCCFD092A10920910F +:10103000A0091092A0092091A10926FFFCCFD0920F +:10104000A1092091A009C09265060C1B1D0B8C0FF5 +:101050009D1FA11DB11D0115110509F003CFDF91E1 +:10106000CF911F910F91FF90EF90DF90CF90BF90A5 +:10107000AF909F908F907F906F905F9008952F9288 +:101080003F924F925F926F927F928F929F92AF9218 +:10109000BF92CF92DF92EF92FF920F931F93CF9365 +:1010A000DF93CDB7DEB72A97CDBFDEBF8C014115E8 +:1010B00084E058076105710508F08EC18091FD2418 +:1010C00090E0A0E0B0E0EAE0880F991FAA1FBB1FE4 +:1010D000EA95D1F7840F951FA61FB71F812CF4E066 +:1010E0009F2EA12CB12C6901E12CF12C841A950AB8 +:1010F000A60AB70A89829A82AB82BC82C814D90434 +:10110000EA04FB0408F47FC129813A8121153105E5 +:1011100009F462C1E12CFF24F394E0E17E2EF7EDA7 +:10112000DF2EE0E44E2EF0E1CF2EE7ED3E2EF3E58C +:101130005F2EE4E86E2EF3E82F2E29873A874D8341 +:101140005E836F837887B901892E9A2EAB2EBB24DC +:10115000382FA701481B51096417750708F4AB0124 +:10116000C09266063092A0092091A10926FFFCCF0B +:101170004092A1092091A0091092A0092091A109F3 +:1011800026FFFCCF4092A1092091A009709265062C +:1011900027FFE6CF69877A87C09266065092A0093A +:1011A00069857A852091A10926FFFCCF69877A8716 +:1011B0004092A1092091A0099092A00969857A85A1 +:1011C0002091A10926FFFCCF69877A874092A10967 +:1011D0002091A0098092A00969857A852091A109B2 +:1011E00026FFFCCF69877A874092A1092091A00948 +:1011F0001092A00969857A852091A10926FFFCCF6C +:1012000069877A874092A1092091A00970926506AA +:1012100069857A8570926606D092A0092091A1090D +:1012200026FFFCCF4092A1092091A0091092A009AD +:101230002091A10926FFFCCF4092A1092091A0098D +:101240007092650627FFE6CF69877A87C0926606A7 +:101250006092A00969857A852091A10926FFFCCFBB +:1012600069877A874092A1092091A0091092A0096C +:1012700069857A852091A10926FFFCCF69877A8745 +:101280004092A1092091A0091092A00969857A8550 +:101290002091A10926FFFCCF69877A874092A10996 +:1012A0002091A0093093A00969857A852091A10930 +:1012B00026FFFCCF69877A874092A1092091A00977 +:1012C0004115510591F0F8019A01200F311F6191EC +:1012D0006093A0096091A10966FFFCCF4092A1092B +:1012E0006091A009E217F30791F77092650669858E +:1012F0007A8570926606D092A0092091A10926FFF6 +:10130000FCCF4092A1092091A0091092A009209140 +:10131000A10926FFFCCF4092A1092091A00970925B +:10132000650627FFE6CF69877A87C0926606209216 +:10133000A00969857A852091A10926FFFCCF6987DC +:101340007A874092A1092091A0099092A00969850D +:101350007A852091A10926FFFCCF69877A87409280 +:10136000A1092091A0098092A00969857A85209120 +:10137000A10926FFFCCF69877A874092A1092091B5 +:10138000A0091092A00969857A852091A10926FFFC +:10139000FCCF4092A1092091A00970926506641BC0 +:1013A000750B69877A87840F951FA11DB11D611583 +:1013B000710509F0C9CE4D815E816F817885DA01B2 +:1013C000AE56BF4D89819A818A0F9B1FF8012191EA +:1013D0002D93A817B907D9F781E02A96CDBFDEBFB4 +:1013E000DF91CF911F910F91FF90EF90DF90CF9001 +:1013F000BF90AF909F908F907F906F905F904F9035 +:101400003F902F900895C982DA82EB82FC827CCED5 +:10141000CF92DF92EF92FF920F931F9369014115D4 +:1014200024E052076105710540F500E014E020E07A +:1014300030E0E12CF12C041B150B260B370BC016EA +:10144000D106E206F306B0F04E565F4D01151105C8 +:1014500049F0DA01FC01080F191F8D918193E01703 +:10146000F107D9F781E01F910F91FF90EF90DF9086 +:10147000CF90089597018601E7CF80E01F910F91EB +:10148000FF90EF90DF90CF900895E0E0F6E080E4E9 +:10149000828388E1868B0895FF920F931F93CF93E9 +:1014A000DF93CDB7DEB7A097CDBFDEBF8091080632 +:1014B0008095909192249827809392248074892318 +:1014C000D9F0E091FE24F091FF2480818130E9F091 +:1014D0008230A9F1833009F450C0843009F473C01C +:1014E000853009F48EC0863009F4ADC0873009F428 +:1014F00066C0883009F465C0A096CDBFDEBFDF911D +:10150000CF911F910F91FF9008958091FB24882324 +:1015100009F49BC0F12C8E010F5F1F4F9DDAF8017B +:10152000EF0DF11D8083F3948091FB24F816B0F346 +:10153000E091F724F091F824C8010995DDCFE091FE +:10154000F524F091F6248E010F5F1F4FC801099515 +:101550002091FB24222361F3F80191E0992339F0D3 +:10156000808191E08F3F09F090E08F5F808331961A +:101570008E2F801B821790F3DBCFE091F524F09142 +:10158000F6248E010F5F1F4FC80109952091FB249F +:1015900031E0215068F23323E1F3822F90E0F8012B +:1015A000E80FF91F408131E04F3F09F030E0F801CA +:1015B000E80FF91F4F5F4083215068F7B9CF22DC55 +:1015C0009BCF2CDB99CFE091F524F091F6248E018E +:1015D0000F5F1F4FC80109952091FB24222309F4B6 +:1015E000A7CFF80191E0992331F0808191E081113A +:1015F00090E08150808331968E2F801B821798F364 +:1016000097CFE091F524F091F6248E010F5F1F4FE4 +:10161000C80109952091FB2431E0215008F488CFBE +:101620003323D9F3822F90E0F801E80FF91F4081AE +:1016300031E0411130E0F801E80FF91F41504083DB +:10164000215070F775CFDAD057CF8E010F5F1F4F43 +:101650006FCF0F931F93CF93DF936150710947E4CE +:1016600053E01CE29A01FA010491002349F161322E +:10167000710520F425C06032710561F0DC0101962E +:10168000EC010C932F5F3F4F61507109F9010491F8 +:101690000111F1CFF4E047345F0761F0CE0101960C +:1016A000188361507109405E5F4F24E0473652074E +:1016B000C9F6EC011882DF91CF911F910F91089527 +:1016C000EC01E8CFAB01E091FE24F091FF246081B2 +:1016D00020E2629FB0011124695B7C4F0C94F723D8 +:1016E000CF93DF93EC0167E473E00E94EE23892B34 +:1016F000E9F167E673E0CE010E94EE23892B09F43D +:101700003FC067E873E0CE010E94EE23892BD1F140 +:1017100067EA73E0CE010E94EE23892BA9F167EC02 +:1017200073E0CE010E94EE23892B81F167EE73E016 +:10173000CE010E94EE23892B59F167E074E0CE01BF +:101740000E94EE23892B31F167E274E0CE010E9402 +:10175000EE23892B09F167E474E0CE010E94EE23A9 +:10176000892BE1F080E0DF91CF91089580E0E09156 +:10177000FE24F091FF24808381E0DF91CF910895D2 +:1017800081E0F5CF82E0F3CF83E0F1CF84E0EFCFCB +:1017900085E0EDCF86E0EBCF87E0E9CF88E0E7CFCB +:1017A00043E150E060E070E08DEF94E20C94FF259F +:1017B00043E150E060E070E08DEF94E20C940A2683 +:1017C000CF93DF931F92CDB7DEB7883020F00F9014 +:1017D000DF91CF910895898315DB89818093FD2462 +:1017E00090E0880F991F80509B4D8093FE2490932A +:1017F000FF24B4D80F90DF91CF9110CA2091FD241F +:1018000030E02F5F3F4F27703327822FF901EE0F13 +:10181000FF1FEF5FFA4D908191115CC02F5F3F4F2A +:1018200027703327822FF901EE0FFF1FEF5FFA4D6C +:10183000908191114FC02F5F3F4F27703327822F28 +:10184000F901EE0FFF1FEF5FFA4D9081911142C039 +:101850002F5F3F4F27703327822FF901EE0FFF1FB5 +:10186000EF5FFA4D9081911135C02F5F3F4F277088 +:101870003327822FF901EE0FFF1FEF5FFA4D9081A2 +:10188000911128C02F5F3F4F27703327822FF90116 +:10189000EE0FFF1FEF5FFA4D908191111BC02F5F7C +:1018A0003F4F27703327822FF901EE0FFF1FEF5FA5 +:1018B000FA4D908191110EC02F5F3F4F2770332753 +:1018C000822FF901EE0FFF1FEF5FFA4D908191110A +:1018D00001C0089575CF2091FD24205DFC01208377 +:1018E00011820895FC0180819181911103C0805380 +:1018F000883010F080E0089563DF81E00895BC0136 +:1019000081E090E20C949521CF93DF93EC01219636 +:10191000FC016491662349F081E090E20E94E42199 +:10192000FE01649121966111F7CFDF91CF91089567 +:10193000AB01BC0181E090E20C94BA2180E2E0E6C8 +:10194000F6E082830895CF93DF9381E090E20E94D6 +:1019500057220E947A1C81E090E20E947222EC01E0 +:1019600097FD09C080E180939324809305068C2F16 +:101970005AD2882319F0DF91CF9108958C2FDF91EF +:10198000CF91E0C380919424813031F1C8F082304E +:1019900059F0833039F480910020815080930020E9 +:1019A000882349F1A1D374C58091680685FDFACFDB +:1019B00084E18093002083E08093942495D368C5CC +:1019C0008091680685FFEECF84E18093002081E05E +:1019D0008093942489D35CC58091002081508093AA +:1019E00000208111DFCF0E945C040E94CE2082E0A3 +:1019F00080939424D7CF0E9493200E947504109264 +:101A00009424D0CF80E2E0E0F6E08583089580E280 +:101A1000E0E0F6E08683089581E090E20C94702186 +:101A200081E090E20C94CF2225EC34E03F932F9399 +:101A30002EEB34E03F932F9327EB34E03F932F932B +:101A40002EE734E03F932F9321E02F931F929F9333 +:101A50008F930E940F248DB79EB70C968DBF9EBFAB +:101A600085E6089529ED34E23F932F932BE734E088 +:101A70003F932F9321E02F931F929F938F930E9468 +:101A80000F248DB79EB708968DBF9EBF85E608953B +:101A90000E94B404811102C08AEC089589DE84E6B4 +:101AA000089560E071E00E94F10485E60895EF92E8 +:101AB000FF920F931F93CF93DF93CDB7DEB7A0971D +:101AC000CDBFDEBF8C01E090FB24F12CE091F5242A +:101AD000F091F624CE01019609959701AE014F5F72 +:101AE0005F4F60E071E0C8010E94470585E6A0965F +:101AF000CDBFDEBFDF91CF911F910F91FF90EF908F +:101B00000895BF92CF92DF92EF92FF920F931F93AF +:101B1000CF93DF93CDB7DEB7A097CDBFDEBF8C01EB +:101B2000C090FB24D12C64E774E00E94EE23892B43 +:101B300049F5C114D10499F1B12CCE0101967C0173 +:101B400000E010E00E942C05F701E00FF11F8083F8 +:101B5000B3940B2D10E00C151D05A0F3E091F724B4 +:101B6000F091F824C701099584E6A096CDBFDEBFA9 +:101B7000DF91CF911F910F91FF90EF90DF90CF9069 +:101B8000BF900895A80160E270E0CE0101967C014B +:101B90000E948A058C159D0509F38AECE6CFCE01DB +:101BA00001967C01DBCF2091FC24211107C020E3AA +:101BB000FC012083FC01118285E6089521E3FC01EC +:101BC0002083FC01118285E60895FC012181211109 +:101BD00005C08081813341F0803311F08AEC089593 +:101BE0001092FC2484E6089581E08093FC2484E62E +:101BF00008958FE398E0ECD08EE6089588E09AE0AF +:101C0000FFD08EE60895E0ECF4E081818E7F818341 +:101C10000E9493200E944F0484E60895E0ECF4E0D3 +:101C200081818E7F81830E9493200E94560484E6E6 +:101C30000895E9EFF4E221812F9320812F9321E78A +:101C400034E03F932F9321E02F931F929F938F9324 +:101C50000E940F248DB79EB708968DBF9EBF85E664 +:101C600008952091FB241F922F932EE634E03F939A +:101C70002F9321E02F931F929F938F930E940F2405 +:101C80008DB79EB708968DBF9EBF85E6089560E02C +:101C900071E0DFDC85E6089560E071E013DD85E644 +:101CA00008951EDD811102C08AEC089581DD84E66D +:101CB000089560E071E00FDE85E6089513DE81117E +:101CC00002C08AEC089574DD84E608950E9403063C +:101CD00084E60895DF92EF92FF920F931F93CF93C4 +:101CE000DF937C01CFEFD0E007E915E08CE2D82E3E +:101CF000B80180E990E20E94EE23892B39F1F801C6 +:101D00004491442379F1C132D10560F1D701F80142 +:101D100004C0C032D10551F0DC01CD0101969C0117 +:101D20004C933196219744914111F3CF79018FEF74 +:101D3000E81AF80AF901D08221970A5E1F4FB8010C +:101D400080E990E20E94EE23892BC9F6D701119712 +:101D50001C9285E6DF91CF911F910F91FF90EF903C +:101D6000DF9008959701E2CFFC01209120022068C6 +:101D7000209320022091230220FFFCCF81E080935A +:101D80002302A0911002B0911102AE5BB109B7FD20 +:101D90001CC029E637E54BE050E00E946F23AA27DC +:101DA000BB279F938F9327E634E03F932F9381E0E7 +:101DB0008F931F92FF93EF930E940F248DB79EB7CE +:101DC00008968DBF9EBF85E60895A0E0B0E0E1CF04 +:101DD00021E02093A2242093A12424E120939E2497 +:101DE00025E020939D24109297241092982410921D +:101DF000992410929A248093952490939624089580 +:101E000027E02093A22424E620939D241092972477 +:101E1000109298241092992410929A2480939524D9 +:101E2000909396240895CF934091A22450E0FA0114 +:101E30003197E930F10520F0C0E08C2FCF91089563 +:101E4000E250FF4F0C9469232091A0249091A1248B +:101E5000291709F4DDC030E0892F90E00197281799 +:101E6000390709F420C168E181E090E20E94E42191 +:101E70001092A224C1E08C2FCF910895853109F4EE +:101E800050C0883109F406C1863009F429C1853172 +:101E900009F498C0C1E08C2FCF9108958093A024BD +:101EA00084E08093A224C1E08C2FCF91089590E02C +:101EB0004091A0242FEF30E0241B310982179307B3 +:101EC00031F585E08093A224C1E0B7CF813009F4D9 +:101ED000ECC0843009F4DEC0883151F2C1E0DBCFC0 +:101EE00040919B2450919C249A012F5F3F4F209357 +:101EF0009B2430939C24FA01E05FFA4D80832038C4 +:101F0000310541F686E08093A224C1E096CF65E1D9 +:101F100081E090E20E94E42182E08093A224C1E06B +:101F20008CCF81E08093A1244091972450919824F4 +:101F30006091992470919A24E0919524F0919624CF +:101F400020E830E080E195E20995C82F882309F464 +:101F5000B7C061E081E090E20E94E4216091A12499 +:101F600081E090E20E94E4216091A124609581E0EB +:101F700090E20E94E42160E870E080E195E2D8DC24 +:101F8000E0E1F5E260E08191680F85E2E039F80771 +:101F9000D1F781E090E20E94E42140919724509192 +:101FA00098246091992470919A2440585F4F6F4F04 +:101FB0007F4F409397245093982460939924709373 +:101FC0009A243BCF61E081E090E20E94E42160919D +:101FD000A12481E090E20E94E4216091A124609517 +:101FE00081E090E20E94E42160E870E080E195E207 +:101FF0009FDCE0E1F5E260E08191680F25E2E039E5 +:10200000F207D1F781E090E20E94E421C1E043CFE2 +:10201000E0E1F5E290E02191920F25E2E039F2074C +:10202000D1F7891374CF40919724509198246091EF +:10203000992470919A24E0919524F091962420E8B7 +:1020400030E080E195E20995C82F882309F442C069 +:102050008091A1248F5F8093A12440919724509177 +:1020600098246091992470919A2440585F4F6F4F43 +:102070007F4F4093972450939824609399247093B2 +:102080009A2466E081E090E20E94E42182E080935D +:10209000A224D3CE66E081E090E20E94E421109277 +:1020A000A224C1E0CACE66E033CF10929B241092E6 +:1020B0009C2410929F2483E08093A224C1E0BDCE93 +:1020C00064E081E090E20E94E42189E08093A22410 +:1020D000C1E0B3CE68E181E090E20E94E421C3CE8A +:1020E0008091A1248F5F1ECF8091A224813071F056 +:1020F000873059F480919D249FEF980F90939D24F1 +:10210000811102C01092A2240895089580919D2407 +:102110009FEF980F90939D248111F6CF80919E247C +:102120009FEF980F90939E24811106C01092A224D5 +:1021300085E080939D24089565E181E090E20E940E +:10214000E421F6CF1F93CF93DF939FEB980F9A3143 +:1021500028F09FE9980F9A31C0F480522091A3246F +:102160003091A4242F3F310558F4A9014F5F5F4FF0 +:102170004093A3245093A424F901E05FFA4D808397 +:1021800081E0DF91CF911F91089590ED980F9A30E3 +:1021900028F38F3519F3982F9D7F9D33F9F28D30F9 +:1021A000A9F0883039F08B3159F71092A32410929E +:1021B000A424E6CF8091A3249091A424009701F356 +:1021C00001978093A3249093A424DACFE091A324D1 +:1021D000F091A424E05FFA4D10821092A324109293 +:1021E000A42480911025882309F4A0C08D7F8D330D +:1021F00009F49CC0E1E1F5E204C01F3331F01D3366 +:1022000021F0EF0111911111F8CF188267E975E003 +:1022100080E195E20E94EE23892B09F436C16DEA34 +:1022200075E080E195E20E94EE23892B09F42AC132 +:1022300063EC75E080E195E20E94EE23892B09F4BE +:102240001EC169ED75E080E195E20E94EE23892BC5 +:1022500009F412C16FEE75E080E195E20E94EE2371 +:10226000892B09F406C165E076E080E195E20E94E1 +:10227000EE23892B09F4FAC06BE176E080E195E268 +:102280000E94EE23892B09F4EEC061E376E080E141 +:1022900095E20E94EE23892B09F4E2C067E476E020 +:1022A00080E195E20E94EE23892B09F4D6C06DE50A +:1022B00076E080E195E20E94EE23892B09F4CAC002 +:1022C00063E776E080E195E20E94EE23892B09F432 +:1022D000BEC069E876E080E195E20E94EE23892B9A +:1022E00009F4B2C06FE976E080E195E20E94EE2346 +:1022F000892B09F4A6C065EB76E080E195E20E94A7 +:10230000EE23892B09F49AC06BEC76E080E195E22C +:102310000E94EE23892B09F48EC061EE76E080E105 +:1023200095E20E94EE23892B09F452C088ECC0E0AC +:10233000E1EDF4E0E4918E1709F430C0E2EFF4E04F +:10234000E4918E1709F441C0E3E1F5E0E4918E17C2 +:1023500009F438C0E4E3F5E0E4918E1781F1E5E596 +:10236000F5E0E4918E1741F1E6E7F5E0E4918E1790 +:1023700001F180E090E0C8DA8EEC94E0C5DACC237D +:1023800009F4FECE80911025882309F4F9CE80E16E +:1023900095E2B5DA8BEC94E0B7DAF2CE20E030E0EB +:1023A00041E2429FC001439F900D11248E529B4FEA +:1023B000E2CF25E030E0F4CF24E030E0F1CF23E0BD +:1023C00030E0EECF22E030E0EBCF21E030E0E8CFAC +:1023D00021EE36E0109210251F3319F11D3399F0CC +:1023E000112319F089ECC1E0A3CF205F3F4FF90121 +:1023F0004591549141155105A9F380E195E2FA0107 +:102400000995C1E095CF2E5E3F4FF901459154915A +:102410004115510539F3CE010196FA010995C1E044 +:1024200087CF2C5E3F4FF9014591549141155105DD +:1024300021F789ECD8CF2BEC36E0CCCF25EB36E07A +:10244000C9CF2FE936E0C6CF29E836E0C3CF23E76E +:1024500036E0C0CF2DE536E0BDCF27E436E0BACF79 +:1024600021E336E0B7CF2BE136E0B4CF25E036E00C +:10247000B1CF2FEE35E0AECF29ED35E0ABCF23EC79 +:1024800035E0A8CF2DEA35E0A5CF27E935E0A2CF8A +:102490000895A0E2B6E082E011968C93119715960C +:1024A0008C931597E0E4F8E010A211A28DE291E080 +:1024B00086A397A38FEF9FEF80A791A781E08083EA +:1024C00098E8938393E097831A968C9308951F92CC +:1024D0000F920FB60F9211248F939F93EF93FF9358 +:1024E00080E196E28093B1249093B22480E996E251 +:1024F0008093AF249093B0241092AA241092A92420 +:102500001092A5241092AD241092AE241092A8240B +:10251000E0E4F8E0138286E990E086AB97AB8AE1CD +:1025200090E080AF91AFE0E4F9E010A211A28FEF4C +:102530009FEF86A397A389E883838EE08083E0E200 +:10254000F6E01286FF91EF919F918F910F900FBE51 +:102550000F901F9018951F920F920FB60F92112493 +:102560002F933F934F938F939F93EF93FF9390916C +:1025700028068091A924957021E009F020E0880FB9 +:10258000822B8093A9249091A5249923C1F1982F9F +:102590009770973009F448C0982F9C7081F182FBA6 +:1025A000882780F991E089278093A7249091A82417 +:1025B00091117FC09091AA249695882309F483C035 +:1025C00020E8292B2093AA248091AD249091AE2459 +:1025D00001968093AD249093AE2487709927892B20 +:1025E00071F4E091B124F091B224CF01019680936F +:1025F000B1249093B224208381E08093A824809119 +:10260000A52491E089278093A52488E88093430836 +:10261000FF91EF919F918F914F913F912F910F904B +:102620000FBE0F901F9018951092400880E1809384 +:102630004C08109243098091A7248823E9F18CEB80 +:1026400094E080936609909367091092A62481E034 +:1026500080934C0983E0809346098091AD2490914A +:10266000AE24877011F19091AA24969522E0280F4C +:102670008730B1F0969543E0480F283088F496955E +:1026800034E0380F483060F4969525E0280F383054 +:1026900038F49695283020F49695813009F4969573 +:1026A000E091B124F091B224908381E08093B3242F +:1026B000A6CF1092A824A3CF8CE794E0809366095C +:1026C00090936709C2CF20E07CCF1F920F920FB684 +:1026D0000F9211242F933F938F939F93AF93BF93A8 +:1026E000EF93FF938091A62490E08B30910580F5C5 +:1026F000FC01E95FFE4F0C946923E091AF24F09157 +:10270000B02480818111ACC080E480934506209183 +:10271000AB243091AC248091AD249091AE24281745 +:10272000390709F46CC03196E093AF24F093B024DC +:10273000E091B124F091B224CF0101968093B124AD +:102740009093B22481818093AA2484E08093A6246C +:10275000FF91EF91BF91AF919F918F913F912F91F9 +:102760000F900FBE0F901F9018958FE390E080930D +:102770006609909367098EE08093000880E4809357 +:10278000450683E08093A624E3CF80E48093460649 +:1027900084E08093A624E091B124F091B22480815A +:1027A0008093AA24D5CF8091AA2480FD64C080E4C0 +:1027B0008093460685E08093A624CACF8091AA2400 +:1027C00090E480FD55C09093450686958093AA2499 +:1027D0008091AB249091AC2401968093AB2490938C +:1027E000AC249C0127703327232B09F448C0209187 +:1027F000AD243091AE248217930709F0A6CF88E06C +:102800008093A624A5CFE091AF24F091B0248081DD +:1028100081112AC080E48093460687E08093A62435 +:1028200097CF80E48093460689E08093A62490CFDA +:1028300080E4809346068AE08093A62489CF109294 +:102840004009109246091092000881E08093B42458 +:102850007FCF8FE790E0809366099093670978CFE8 +:1028600080E48093460653CF80E480934506D5CF1D +:1028700090934606AACF80E4809345069BCF86E0DE +:102880008093A62465CFCF93DF93E0E4F6E084E065 +:102890008283128AC0E8D1E082E68E83A0E2B6E0AD +:1028A00085E012968C93129781E050968C93509706 +:1028B00082E052968C9352971A961C921A9783E054 +:1028C00019968C9398E598839AE5998390E491837F +:1028D000968381838683E0E0F8E08FE090E086A332 +:1028E00097A388E090E082A793A783E28183DF919A +:1028F000CF91CFCDCF93DF938091B3248823C1F0C4 +:102900001092B32482E08093210680932606609182 +:10291000AD247091AE246115710589F4E091EF2426 +:10292000F091F02409951092400910924609B1DD0A +:102930008091B42481112AC0DF91CF910895E09154 +:10294000F324F091F42480E196E2099594FF23C0EA +:102950009F7E009741F38093AD249093AE24109214 +:10296000AB241092AC2480E196E28093B124909342 +:10297000B22480E996E28093AF249093B02481E062 +:102980008093A6248091B4248823B1F21092B424B9 +:10299000DF91CF917ECDAC015695479556954795E1 +:1029A0005695479541155105A1F270E020E030E0C1 +:1029B000F901E05FF94D6081062E62956025062ED3 +:1029C000669566956025E058FF4F6F5F669561706C +:1029D000C62F20E0D22F21E0C227C0837F5F272FA0 +:1029E00030E02417350720F3B6CF81E08093D1245F +:1029F00084E090E08093B6249093B72488E080939D +:102A0000B524089581E08093D12482E090E0809302 +:102A1000B6249093B72488E18093B524089581E08B +:102A20008093D124089508957F928F929F92AF92C0 +:102A3000BF92CF92DF92EF92FF920F931F93CF93AB +:102A4000DF93CDB7DEB72E97CDBFDEBF8C014091AF +:102A5000D12450E04A30510598F080E090E02E9665 +:102A6000CDBFDEBFDF91CF911F910F91FF90EF900F +:102A7000DF90CF90BF90AF909F908F907F90089500 +:102A8000FA01EE5EFE4F0C9469237C01D12CF70114 +:102A9000C08099D58C25D7018D937D01D394B2E167 +:102AA000DB12F5CF60E170E0C801E5D3882309F4BB +:102AB000ECC18091FC24882309F4EDC197D59AE0FC +:102AC0009827D8019C9385E08093D12484E090E0FE +:102AD000C6CF7C0156E0D52ED701CC9074D58C257D +:102AE000F70181937F01DA94B9F764E070E0C801DF +:102AF000C2D38111B0C17AD591E09827D8019C93B7 +:102B0000E2CF2091B6249091B724D8018C918632DF +:102B100019F0823509F0A1CFF8012083918382E07A +:102B20008093D12480E190E09ACF2091B6249091B7 +:102B3000B724D8018C91863279F3823569F38339D1 +:102B400009F4CBC11092D12480E090E088CF16D553 +:102B50006801B4E0CB0ED11CB12CF601A08033D5B6 +:102B60008A25D6018D936D01B394B4E0BB12F5CFE5 +:102B7000F80194818091C924981709F42EC181E04D +:102B80008093D12480E090E06ACF7C0174E0B72E7E +:102B9000D701AC9018D58A25F70181937F01BA94AB +:102BA000B9F7D8018C91803309F489C1803A09F4CE +:102BB000CBC1803C09F4DAC1813C09F475C2823C86 +:102BC00009F480C2803B09F48EC280568230B8F688 +:102BD00062E070E0C8014FD3882309F468C1F801AE +:102BE00081818C739081903609F4EBC26AE370E0C6 +:102BF0007B01F0E18F9FE00CF11C112464E0CE0119 +:102C000007960E942F0544E050E060E070E0CE019E +:102C10000B960E94D40546E050E0B701CE01019624 +:102C20000E94D4058F819885A985BA858093C9248F +:102C30009093CA24A093CB24B093CC2460E470E09A +:102C400089EC94E2E6D48091C9249091CA24A091A1 +:102C5000CB24B091CC248093CD249093CE24A09308 +:102C6000CF24B093D02460E270E08DEC94E2D1D414 +:102C7000AE01495F5F4FBE01655F7F4FCE01019698 +:102C8000B0D38F819885A985BA85F8018083918317 +:102C9000A283B38384E08093D12480E290E0DFCEEE +:102CA000FC0180818632D1F08235C1F0803509F196 +:102CB00090EA980F923038F1982F9F77903331F047 +:102CC000803A21F0805C833008F059CF81E0809316 +:102CD000D12484E0D8018C9390E0C1CE84E0D80167 +:102CE0008C9311961C9282E08093D12480E190E035 +:102CF000B6CEF8018181882309F413C2F80110824D +:102D000084E090E0ACCE62E070E0C801B4D28823E9 +:102D100009F40DC2D80111962C9111972C738C9146 +:102D2000803609F451C28AE390E07C01B0E12B9F28 +:102D3000E00CF11C112464E0CE0107960E942F05DF +:102D400044E050E060E070E0CE010B960E94D405B4 +:102D500046E050E0B701CE0101960E94D4058F8174 +:102D60009885A985BA858093C9249093CA24A09395 +:102D7000CB24B093CC2460E470E089EC94E249D495 +:102D80008091C9249091CA24A091CB24B091CC24E5 +:102D90008093CD249093CE24A093CF24B093D024BD +:102DA00060E270E08DEC94E234D484E08093D1242E +:102DB0008F819885A985BA85F80180839183A28344 +:102DC000B383AE01495F5F4FBE01655F7F4FCE01A8 +:102DD000019607D380E290E042CE95818091CA248B +:102DE0009813CDCE96818091CB249813C8CE97812D +:102DF0008091CC249813C3CE68010DEC14E25F01DE +:102E0000F0E8AF0EB11C4801D8017D908D01DBD3F5 +:102E10008725F60181936F01D4019C90092C92942F +:102E20009024092C969496949024A9D2939491FA84 +:102E3000EE24E0F8F12CB1E0EB268E25F50181932C +:102E40005F01F4E2013D1F07F1F685E08093D12494 +:102E500080E290E104CE6091C824F0E16F9FB00160 +:102E6000112440E150E088EB94E20E94D4052091C7 +:102E7000B8248091BC248095281709F488C0B6D363 +:102E800096E09827F80190831ECEB0D391E0982762 +:102E9000F801908318CE6091C824E0E16E9FB001E4 +:102EA000112440E150E0C8010E94EC0507CE9ED3FA +:102EB00091E09827D8019C9384E090E0D0CD62E027 +:102EC00070E0C801D8D1811138C190D391E0982722 +:102ED000F801908384E090E0C2CD44E050E060E0EF +:102EE00070E0CE0101960E94D4059091B524D801DE +:102EF00011968C91803209F454C1803709F0ADCD20 +:102F0000D80112962C91129789812813A6CD139679 +:102F10002C9113978A812813A0CD14962C91149785 +:102F20008B8128139ACD15962C9115978C81281397 +:102F300094CD9C9361E070E0C8016FD183E08093F1 +:102F4000D12488E190E08BCD62E070E0C80193D19C +:102F5000882309F4ACCFD80111968C918093C824B2 +:102F600086E08093D12442D39AE0B1CF62E070E052 +:102F7000C80181D1882309F4A8CFF8018181809309 +:102F8000C82488E08093D12431D39AE092CF8091F5 +:102F9000C024281374CFE091B9248091BD2480957A +:102FA000E8136DCF8091C124E81369CF8091BA24D2 +:102FB0009091BE249095891362CF9091C224891379 +:102FC0005ECF3091BB249091BF249095391357CF99 +:102FD0009091C324391353CF4091C4249091C524B8 +:102FE000909549134CCF9091C624491348CF9091A6 +:102FF000C7249095491343CFD8019C911196FC9119 +:10300000119712964C91129750E060E070E0BA016F +:10301000552744275F2B492B13969C91792B90E0E1 +:10302000A0E0B0E0DC01992788279E2B822BB32BF0 +:103030002091D124283009F46FC0273021F4840F67 +:10304000951FA61FB71F8093B824C92EDA2EEB2E2A +:10305000FF24C092B9248D01222733270093BA247C +:103060004B2F5527662777274093BB24E82FE09501 +:10307000E093BC24EC2DE095E093BD24E02FE09597 +:10308000E093BE24E42FE095E093BF248093C02416 +:10309000C092C1240093C2244093C32485E080934E +:1030A000D12480E090E0DBCC62E070E0C801E3D0A6 +:1030B000882309F4FCCED80111968C918093C82402 +:1030C00087E04FCF62E070E0C801D5D0882309F4D3 +:1030D000FCCEF80181818093C82489E08093D124BB +:1030E00085D29AE0E6CE62E070E0C801C4D08823C1 +:1030F00009F4DDCE8091FC24811135CFD8011196E1 +:103100006C91B0E16B9FB001112440E150E088EB7D +:1031100094E20E94EC0527CF841B950BA60BB70BFE +:1031200092CF62E070E0C801A6D081110BCD81E0A2 +:10313000D8018C9384E090E092CCF8016181F0E1B9 +:103140006F9FB001112440E150E0C8010E94D405F6 +:1031500060E170E0C80161D0780130E8E30EF11C55 +:1031600062E1A62ED801BC902ED28B25F801819366 +:103170008F010B2CB294B0240B2CB694B694B024CF +:10318000FED0B394B1FACC24C0F8D12CF1E0CF2614 +:103190008C25D7018D937D01AA9421F780E990E1D8 +:1031A0005ECC8981F80180833A8131832B8122832F +:1031B0009C819383832782278927848388E290E0F8 +:1031C0004ECC60E370E014CD80E390E0AECD44E0FF +:1031D00050E060E070E00C94D405CF93DF931F9231 +:1031E000CDB7DEB7FC01218130812327328123272F +:1031F00033812327298344E050E060E070E00E949F +:10320000EC0541E050E064E070E0CE0101960E94E0 +:10321000EC050F90DF91CF910895FC0161157105C8 +:1032200039F1680F791F23E633E64191422750E1D7 +:10323000459FC0011124A42FA8278A2F90E0582F62 +:103240004427880F991F880F991F880F991F4827B7 +:103250005927232F332724273527A295AF702A27F4 +:10326000E617F70711F7922F832F90838183089534 +:1032700083E693E6FACFFC0161157105A9F1680FA9 +:10328000791F23E633E64191422750E1459FC00173 +:103290001124A42FA8278A2F90E0582F4427880FA5 +:1032A000991F880F991F880F991F48275927232F87 +:1032B000332724273527A295AF702A27E617F7076B +:1032C00011F7A9015527808190E08417950711F027 +:1032D00080E00895418150E0232F332781E0421799 +:1032E0005307B9F380E0F5CF43E650E023E633E639 +:1032F000EACFCF93B091D524C091D6244091D72462 +:10330000A091D224F091D324E091D4249C2F9071E9 +:103310002B2F217E9227242F207292272A2F247967 +:1033200092272F2F237792272E2F2A739227392F18 +:1033300032953F703927232F269526952327922FE4 +:10334000969550E060E070E0BA01552744275C2B69 +:103350004B2B7695679557954795922791709813C3 +:103360006068A093D524F093D624E093D7244093AB +:10337000D2245093D3246093D424CF910895CF9333 +:10338000DF93A091D324EA2FEF70F0E0E05CFF4DD3 +:10339000C091D224C295CF70D0E0C05CDF4DE089EF +:1033A0008881E82BA295AF70B0E0A05CBF4D9096ED +:1033B0008C91E82BA091D424CA2FCF70D0E0C05CB0 +:1033C000DF4D88A9E82BA295AF70B0E0A058BF4DA3 +:1033D0008C91E82BF0E0E05EFF4D8081DF91CF9192 +:1033E0000895AF92BF92CF92DF92EF92FF920F9328 +:1033F0001F93CF93DF935B01EA01DC01119645ED4A +:1034000054E262ED74E2CD010197FC0120818C91C0 +:1034100030E0382B20FFB0C000E421FFABC010E447 +:10342000C9019695879596958795302F306880FFCE +:10343000302F212F206881FF212F96958795969513 +:10344000879536952695132F106880FD312F122F02 +:10345000106881FD212F96958795969587953695CD +:103460002695132F106880FD312F122F106881FDD3 +:10347000212F969587959695879536952695132FA6 +:10348000106880FD312F122F106881FD212F969535 +:1034900087959695879536952695132F106880FD0C +:1034A000312F122F106881FD212F969587959695C3 +:1034B000879536952695132F106880FD312F122F92 +:1034C000106881FD212F969587959695879536955D +:1034D0002695032F0068122F106880FD302FFA0107 +:1034E0003193AF0181FD212FFB012193BF01129682 +:1034F000F4E2483D5F0709F086CFF50181819981AB +:103500008927C2809A81C926D12CE12CF12C760121 +:10351000DD24CC24D82A808198818927C82A8381F8 +:103520009B818927F82A10E22ADF082F8C2D8170D1 +:10353000E0DEF694E794D794C794002311F06894E2 +:10354000F7F8115089F788818C25888389818D252A +:1035500089838A818E258A838B818F258B83DF9156 +:10356000CF911F910F91FF90EF90DF90CF90BF9080 +:10357000AF90089510E054CF00E04FCFCF92DF928C +:10358000EF92FF92CF93FC018181C280D12CE12C7C +:10359000F12C7601DD24CC24D82A8081C82A8381AD +:1035A000F82AC0E2ECDE9C2D91708927A2DEF69409 +:1035B000E794D794C794C150A9F7CF91FF90EF90AB +:1035C000DF90CF9008951F93CF93DF93D8E0C0E0B2 +:1035D000D6DE182F80E08DDEC6951111C068D1505F +:1035E000B9F78C2FDF91CF911F9108951F93CF933F +:1035F000DF93D4E0C0E0C3DE182F80E07ADEC6950A +:103600001111C860D150B9F78C2FDF91CF911F9164 +:1036100008958F929F92AF92BF92CF92DF92EF92D6 +:10362000FF920F931F93FC01CB010197672BB1F120 +:10363000B281A0818180038102C0A42FBC2D2B2FD9 +:103640002D72322F32953F703227232F26952695E3 +:103650002327322F3695402F50E060E070E0742F22 +:1036600066275527442758294A2B6B2B7695679553 +:1036700057954795322730FD7068852E962EA72ED8 +:10368000BB246B01EE24FF24072F112722273327A9 +:10369000019798F640838182C28203831F910F9124 +:1036A000FF90EF90DF90CF90BF90AF909F908F9062 +:1036B00008950F931F93CF93DF93CDB7DEB7EA97AB +:1036C000CDBFDEBF05E117E2F7D2F80181938F018C +:1036D000F7E20D311F07C1F70E94100D6BD388234D +:1036E00049F03091152720911627822F90E08A30DB +:1036F000910568F05FD3882311F075D3A0D3EA96C3 +:10370000CDBFDEBFDF91CF911F910F910895FC01D6 +:10371000E45EFE4FDEC73111EDCF80911727823076 +:1037200048F761D3809117278093102793D4809115 +:103730001027882309F4D1C084E0809314270E94C5 +:103740000C0DD8CF3038B1F64ED380911027C4D2AB +:103750008BD280D4CFCF3058323060F6809117278B +:10376000909118278C3DE3E09E0709F488C0AE01D4 +:103770004F5F5F4F609119270E94D4038C0100971F +:1037800009F4B8CF30D3B80189819A81C1D185D2EB +:10379000B1CF3111AFCF109117271F7724D35AD44F +:1037A000E4D28823E9F31093C304111166C082E0C8 +:1037B000809314279FCF332309F44BC0323009F094 +:1037C00099CF80911727811124C0109119271F705C +:1037D00009F490CF812F90D280911627833009F47D +:1037E00086C0A0911F27B091202711968C91119728 +:1037F0008B7F11968C9324E8129FF0011124ED59D0 +:10380000F84D1082E0911F27F091202780818E7F54 +:10381000808380E071D2E7D21DD46CCF303829F19B +:10382000323809F067CF809119278F7065D2E09107 +:103830001F27F0912027118112FB112710F980E03A +:103840005BD2D1D2812F48D280E046D20DD202D4B1 +:1038500051CF80911727813009F04CCF81E0233080 +:1038600009F080E080931227D4CF10911127809126 +:103870001227882331F31260E4CF83E099CF83E0ED +:103880008A838AE389835FB7F894DE01139620E088 +:1038900038E042E007C090E0C7968D939D932F5F7C +:1038A0002C3191F04093CA01E32FF0E08491109203 +:1038B000CA0120FF03C082958F703F5F8F708A30EE +:1038C00050F790E0C096E9CF5FBF8DD26AE370E019 +:1038D000CE01019688D0E1D10DCF8091C304882319 +:1038E00021F084E0809314272ACF81E0FBCFA7D278 +:1038F00090CF0895CF9380911427811102C0CF916A +:103900000895C091212780E0F7D154D2811103C0DE +:103910008C2FCF91F1C1CDDE8C2FCF91EDC1CF9205 +:10392000DF92EF92FF920F931F93CF93DF938C015F +:10393000EB017A01A5D3811125C0E114F10481F1D5 +:10394000F70180819181C81BD90B080F191F20979F +:1039500009F43BC0C12CD12C20911D2730911E278A +:10396000F901EF5BFF4F908131978081981778F1D3 +:103970007BD1C0DFF701808191818C0D9D1D8083FB +:10398000918385E0DF91CF911F910F91FF90EF9090 +:10399000DF90CF90089568D1ADDF72D38111F2CF5F +:1039A000209799F020911D2730911E27F901EF5B98 +:1039B000FF4F908131978081981768F7F8018191C6 +:1039C0008F018AD12197209769F780E0DBCFF8013A +:1039D00081918F0181D1FFEFCF1ADF0ACC15DD0570 +:1039E00009F0BACFF2CFCF92DF92EF92FF920F930E +:1039F0001F93CF93DF936C018B0180912127806807 +:103A00007BD1C0911B27D0911C27C017D10728F06C +:103A10000115110509F46FC0E80110E0209739F590 +:103A200011110CC02FC0853091F1C4D1811131C06A +:103A3000A8D1811127C099D181112DC0809114275F +:103A40008111F1CF82E0DF91CF911F910F91FF9013 +:103A5000EF90DF90CF9008958530C9F0ABD1811100 +:103A600018C08FD181110EC080D1811114C08091F6 +:103A700014278111F1CFE6CF80911427882311F309 +:103A8000853029F07ED18823B9F380E0DCCF83E054 +:103A9000DACF81E0D8CF8091212787FD30C02091F7 +:103AA0001D2730911E27F901E05CFF4FE080319621 +:103AB0008081F12CE81AF1082097A9F088E0E81637 +:103AC000F10488F4860104C088E0E816F10459F096 +:103AD000F80181918F0100D168012197FFEFEF1A62 +:103AE000FF0A209789F711E0E8E0EE16F10409F0EB +:103AF00010E0BAD093CFB8D0C0E0D0E08ECFE09144 +:103B00001D27F0911E27EF5BFF4FE080F12CD4CFF3 +:103B1000DF92EF92FF920F931F93CF93DF93F82ED4 +:103B2000E92E8B01809121278068E6D0C0911B2768 +:103B3000D0911C27C017D10728F00115110509F4F1 +:103B400086C0E8010F2D1E2DD12C209739F5D110FC +:103B50000DC02FC0853009F438C02CD181113EC072 +:103B600010D1811126C001D1811141C0809114274B +:103B70008111F0CF82E0DF91CF911F910F91FF90E3 +:103B8000EF90DF900895853001F114D1811126C0A6 +:103B9000F8D081110EC0E9D0811129C0809114277D +:103BA0008111F1CFE7CF80911427882319F3853055 +:103BB00061F0E7D08823B9F380E0DF91CF911F91C6 +:103BC0000F91FF90EF90DF90089583E0DF91CF9108 +:103BD0001F910F91FF90EF90DF90089581E0DF91AA +:103BE000CF911F910F91FF90EF90DF9008958091FA +:103BF000212787FD30C080911D2790911E27FC0151 +:103C0000E05CFF4FE08031968081F12CE81AF108EA +:103C10002097A1F088E0E816F10428F00FC088E0B2 +:103C2000E816F10459F0F801849156D00F5F1F4F48 +:103C30002197FFEFEF1AFF0A209789F7DD24D3942D +:103C4000E8E0EE16F10409F0D12C0ED07ECF0CD0B6 +:103C5000C0E0D0E077CFE0911D27F0911E27EF5B09 +:103C6000FF4FE080F12CD4CFE0911F27F091202767 +:103C7000A0911D27B0911E27AF5BBF4F8C9190E0A4 +:103C80008283938380818D798083E0911D27F091D9 +:103C90001E27EF5BFF4F10820895E0911F27F091E0 +:103CA000202780818D798083E0911D27F0911E2748 +:103CB000EF5BFF4F1082089580911D2790911E2782 +:103CC000FC01EF5BFF4F208131E0320F3083FC01BC +:103CD000E20FF11D8081089520911D2730911E274C +:103CE000F901EF5BFF4F908141E0490F4083F901FB +:103CF000E90FF11D8083089580932127282F2F70CD +:103D0000622F70E094E8299F900111242E5D384DB8 +:103D10004091C6045091C70487FD12C020931D270F +:103D200030931E27CB0182959295907F9827807FB4 +:103D30009827840F951F80931F279093202708951D +:103D40002E5B3F4F20931D2730931E27629572955F +:103D5000707F7627607F7627685F7F4F640F751FBF +:103D600060931F27709320270895809121278068F2 +:103D7000C3DFE0911F27F091202780818695817015 +:103D80000895809121278F77B7DFE0911F27F09169 +:103D90002027808185FF0CC020911D2730911E2790 +:103DA00082819381F901E05CFF4F808381E0089577 +:103DB00080E00895809121278F779EDFE0911F2773 +:103DC000F0912027808184FF0CC020911D27309125 +:103DD0001E2782819381F901E05CFF4F808381E09F +:103DE000089580E00895809121278F7785DFE09105 +:103DF0001F27F091202780818D788083E0911F27F5 +:103E0000F0912027808181608083E0911D27F091CF +:103E10001E27EF5BFF4F10828091212780686CDFA7 +:103E2000E0911F27F0912027808181608083E091BD +:103E30001D27F0911E27EF5BFF4F10820895E09140 +:103E40001F27F0912027818184608183E0911F27C3 +:103E5000F09120278181807C803409F00895809141 +:103E60002127805849DFE0911F27F0912027818189 +:103E70008460818308951F93CF93DF9300D0CDB7E3 +:103E8000DEB7182F4A83698337DFE0911F27F0914F +:103E900020271182E0911F27F09120274A81698114 +:103EA00017FD20C01082E0911F27F0912027618329 +:103EB000E0911F27F09120271282138280911D2705 +:103EC00090911E278483958340E0FC01E05CFF4FC6 +:103ED00040833196108281E00F900F90DF91CF9157 +:103EE0001F91089582E08083E0911F27F0912027A1 +:103EF0006183E0911F27F091202712821382809125 +:103F00001D2790911E2784839583DFCFCF92DF9268 +:103F1000EF92FF920F931F93CF93DF931F92CDB732 +:103F2000DEB7F62E662309F43EC06C0100E0D60130 +:103F30001C91112391F1D6011196ED91FC911297EC +:103F400013968C91139714969C91923008F445C067 +:103F500098E148E1E930F10550F028E030E090E0E8 +:103F60009F5F220F331F2E173F07D0F3942B212F73 +:103F70002F7030E0263031059CF59F7EE134F1054D +:103F800078F5882301F18130C9F4906CEE2E4E2D26 +:103F9000692F812F70DF882319F10F5FB5E0CB0EF9 +:103FA000D11C0F11C4CF81E00F90DF91CF911F91F1 +:103FB0000F91FF90EF90DF90CF9008959068882345 +:103FC00019F0EE2EE4CF9064EE2E4E2F692F80E88C +:103FD000810F998350DF9981DACF98E048E0BACF1A +:103FE00080E0E2CFE0ECF4E0A681B78119961C9264 +:103FF000A681B78111961C92A681B78159961C9211 +:10400000A681B78151961C92A681B78199961C9280 +:10401000A681B78191961C92A681B781D9961C92F0 +:10402000A681B781D1961C92A681B781A75BBF4FAD +:104030001C92A681B781AF5BBF4F1C92A681B7814E +:10404000A75ABF4F1C920680F781E02DEF5AFF4F11 +:10405000108208958091152787FF05C00CC08091BC +:104060001427882361F081DE8823C9F3FDCD809178 +:104070001427882321F085DE8823C9F30ECE089506 +:104080001F93CF93DF93E091C604F091C704E05AE9 +:10409000FF4FC081D18114E680912127807880383C +:1040A00031F16FDE811126C080911427882339F108 +:1040B000853051F1E0911F27F0912027818182FD09 +:1040C00028C0E091C604F091C704E05AFF4F8081F8 +:1040D0009181C817D90701F32FEF210F1123F1F0B8 +:1040E000EC01122F8091212780788038D1F63DDEB7 +:1040F0008823D1F280E0DF91CF911F91089582E073 +:10410000DF91CF911F91089583E0DF91CF911F91AF +:10411000089581E0DF91CF911F91089584E0DF91B0 +:10412000CF911F91089562D068D0E0ECF4E08181D6 +:104130008E7F818380818F778083109213270895EB +:10414000CF93DF93E0E4F0E0148284818160848384 +:104150004DD053D0C0ECD4E088818F77888388819C +:1041600080688883109214271092102710921227CB +:104170001092112788818064888348E068E480E891 +:104180007ADE48E068E480E076DE888580648887AF +:10419000898181608983DF91CF9108952FB7F89449 +:1041A00082E0E0ECF1E08287EAE1F0E0E491A0EC6B +:1041B000B4E0DA96EC93DA97EBE1F0E0E491DB9689 +:1041C000EC93DB97E0ECF1E012868BE39AE28E7FD2 +:1041D00016968D939C93179785E18C9382E01896A1 +:1041E0008C932FBF81E080931327AACFE0ECF4E0FB +:1041F00080858370808711860895E0ECF4E08FEF6E +:104200008287848708951F920F920FB60F92112410 +:104210002F933F934F935F936F937F938F939F93CE +:10422000AF93BF93EF93FF938091CA0487FD4DC076 +:104230008091CA0486FD41C08091CA0485FF0CC0EC +:1042400080E28093CA0480911027882371F184E072 +:10425000809314270E94020D8091CA0484FF14C029 +:1042600080E18093CA0482E0809314271092102783 +:104270001092C304B7DE48E068E480E8FCDD48E063 +:1042800068E480E0F8DD35DBFF91EF91BF91AF91FD +:104290009F918F917F916F915F914F913F912F915E +:1042A0000F900FBE0F901F9018958091C30481113D +:1042B00015C081E080931427CDCF80E48093CA0499 +:1042C000109214270E94070DB7CF8091C80487FF72 +:1042D000AFCF80E88093CA040CDBAACF83E0EACF9B +:1042E000CF93DF93EC01FC0170968BE0DF011D9210 +:1042F0008A95E9F782E08C83898783E08E8761E085 +:10430000CE01019603DE811104C080E0DF91CF91E0 +:10431000089561E0CE010696F9DD8823B1F361E0EE +:10432000CE010B96DF91CF91F1CDCF93DF93EB01CF +:1043300020911427243021F082E0DF91CF9108955D +:10434000FC014489558966897789452B462B472B83 +:1043500099F38181D1DCFE0101900020E9F7BF01D2 +:10436000615071096C1B7D0B40E050E0CE01DF9184 +:10437000CF91D5CAEF92FF920F931F93CF93DF9304 +:10438000EB017A0120911427243041F082E0DF9183 +:10439000CF911F910F91FF90EF900895FC01048938 +:1043A000158926893789012B022B032B79F381810B +:1043B000A3DC40E050E0B701CE01DF91CF911F9127 +:1043C0000F91FF90EF90ABCA0F931F93CF93DF93A2 +:1043D0001F92CDB7DEB720911427243039F082E048 +:1043E0000F90DF91CF911F910F910895FC010489E7 +:1043F000158926893789012B022B032B81F38181B3 +:1044000069837ADC20911D2730911E27F901EF5B2B +:10441000FF4F9081319780816981981730F06983CF +:1044200023DC2EDE69818111DBCF862F55DC80E015 +:10443000D7CFCF93DF9320911427243021F082E04F +:10444000DF91CF910895FC01448955896689778968 +:10445000452B462B472B99F381814EDC80912127F8 +:1044600020911D2730911E27F90187FD1BC0E05CBC +:10447000FF4F80813196408190E0841B9109892B08 +:1044800011F480E0DDCFF901EF5BFF4FD081319770 +:10449000C081EADBDC17A8F3F3DD8111D1CFE4DBC7 +:1044A00080E0CECFEF5BFF4F808190E0E8CFCF93ED +:1044B000DF93EC0180911427843019F0DF91CF91C4 +:1044C00008954C895D896E897F89452B462B472B42 +:1044D000A9F3898111DC49DC882381F3CE01DF91C6 +:1044E000CF91A7CFCF93DF93209114272430A9F544 +:1044F000FC014489558966897789452B462B472BD2 +:1045000061F18681F9DB3DDC882339F18091212737 +:1045100040911D2750911E27FA0187FD3AC0E05CAB +:10452000FF4F80813196208190E0821B9109892B79 +:10453000C9F4CFEFDFEF80912127FA0187FD1EC07C +:10454000E05CFF4F20813196808130E0281B3109EB +:10455000D9F0CE01DF91CF9108958FEF9FEFDF91DA +:10456000CF910895A9DBC82FD0E040911D2750912D +:104570001E2780912127FA0187FFE2CFEF5BFF4FD3 +:10458000208130E0232B29F788DBCE01DF91CF910A +:104590000895EF5BFF4F808190E0C9CF0895FF92AF +:1045A0000F931F93CF93DF93EC0104DC882349F032 +:1045B000888190E02091192730911A272817390710 +:1045C00031F0DF91CF911F910F91FF90089580916D +:1045D0001627813209F448C0A0F0823209F465C080 +:1045E000833279F780911527813259F7FCDB32DD70 +:1045F00060911727CE01DF91CF911F910F91FF900E +:10460000CDCF8032F1F6809115278132D1F6EBDBE8 +:1046100004C0809114278823A1F2B3DB8823C9F357 +:104620004BDB082F49DB182F47DBF82E45DB4F2DDE +:1046300050E060E070E0BA0155274427782B402B0A +:10464000512B4C8B5D8B6E8B7F8B36DB888F34DBF5 +:10465000898F32DB8A8F21DBFDDCCE01DF91CF91A8 +:104660001F910F91FF909ACF80911527813A09F001 +:10467000A8CFB9DB7ADB8823E9F38C89FD880E8922 +:104680001F892ADB8F2D28DB802F26DB812F24DB5F +:10469000888D22DB898D20DB8A8D1EDBE5DADF91B8 +:1046A000CF911F910F91FF90D5CC8091152781322A +:1046B00009F087CF98DBCEDC8091172790911827DF +:1046C000888B998BCE01DF91CF911F910F91FF9035 +:1046D00065CFEE0FFF1F0590F491E02D0994B7FF11 +:1046E00004C003D0821B930B089509D0A59F900DA1 +:1046F000B49F900DA49F800D911D11240895A29F39 +:10470000B001B39FC001A39F700D811D1124911DA5 +:10471000B29F700D811D1124911D08958F929F925B +:10472000AF92BF92CF92DF92EF92FF92CF93DF933F +:10473000EC01688179818A819B8161157105810510 +:10474000910521F464E279ED8BE597E02DE133EFFB +:1047500041E050E031D349015A019B01AC01A7EA85 +:10476000B1E4C3DF6B017C01ACEEB4EFA5019401B1 +:10477000B8DFC60ED71EE81EF91EF7FE06C081E0A0 +:10478000C81AD108E10880E8F80AC882D982EA820A +:10479000FB82C6019F77DF91CF91FF90EF90DF9072 +:1047A000CF90BF90AF909F908F900895B7CF8CE13E +:1047B00090E2B4CFA0E0B0E080931C2090931D2045 +:1047C000A0931E20B0931F200895FB01DC0102C0BE +:1047D00005900D9241505040D8F70895FB01DC013F +:1047E0008D91059080190110D9F3990B0895FB0163 +:1047F000DC014150504048F005900D920020C9F76F +:1048000001C01D9241505040E0F70895FB01DC01CA +:1048100002C001900D9241505040D8F70895AEE08B +:10482000B0E0E4E1F4E2F2C20D891E898F89988D2F +:104830002EE02C8309831A8397FF02C080E090E862 +:1048400001978D839E83AE01455E5F4F698D7A8DA2 +:10485000CE01019611D04D815E8157FD0AC02F8196 +:104860003885421753070CF49A01F801E20FF31F41 +:1048700010822E96E4E0E3C2ACE0B0E0E1E4F4E2C2 +:10488000B7C27C016B018A01FC0116821782838109 +:1048900081FFB0C1CE0101964C01F7019381F60171 +:1048A00093FD859193FF81916F01882309F49EC147 +:1048B000853239F493FD859193FF81916F018532A3 +:1048C00021F4B70190E0E8D1E8CF512C312C20E061 +:1048D0002032A0F48B3269F030F4803259F0833208 +:1048E00069F420612CC08D3239F0803339F42160B5 +:1048F00026C02260246023C0286021C027FD27C075 +:1049000030ED380F3A3078F426FF06C0FAE05F9EAB +:10491000300D1124532E13C08AE0389E300D11241F +:10492000332E20620CC08E3221F426FD5FC120643C +:1049300006C08C3611F4206802C0883641F4F601B6 +:1049400093FD859193FF81916F018111C1CF982FC4 +:104950009F7D9554933028F40C5F1F4FFFE3F9833C +:104960000DC0833631F0833771F0833509F057C0BD +:1049700021C0F801808189830E5F1F4F4424439436 +:10498000512C540114C03801F2E06F0E711CF80173 +:10499000A080B18026FF03C0652D70E002C06FEFDC +:1049A0007FEFC5012C876DD12C0183012C852F77DA +:1049B000222E16C03801F2E06F0E711CF801A080A3 +:1049C000B18026FF03C0652D70E002C06FEF7FEF5E +:1049D000C5012C874BD12C012C852068222E830108 +:1049E00023FC19C0832D90E048165906A0F4B701A6 +:1049F00080E290E051D13A94F5CFF50127FC859102 +:104A000027FE81915F01B70190E046D131103A94C1 +:104A1000F1E04F1A51084114510479F7DEC0843691 +:104A200011F0893631F5F80127FF07C060817181E7 +:104A3000828193810C5F1F4F08C06081718188273C +:104A400077FD8095982F0E5F1F4F2F76B22E97FF20 +:104A500009C090958095709561957F4F8F4F9F4FBE +:104A60002068B22E2AE030E0A40148D1A82EA81870 +:104A700043C0853729F42F7EB22E2AE030E025C0CE +:104A8000F22FF97FBF2E8F36C1F018F4883579F0F8 +:104A9000ADC0803719F0883721F0A8C02F2F2061D2 +:104AA000B22EB4FE0DC08B2D8460B82E09C024FF39 +:104AB0000AC09F2F9660B92E06C028E030E005C0DE +:104AC00020E130E002C020E132E0F801B7FE07C08B +:104AD00060817181828193810C5F1F4F06C060816C +:104AE000718180E090E00E5F1F4FA40107D1A82ED6 +:104AF000A818FB2DFF77BF2EB6FE0BC02B2D2E7FE7 +:104B0000A51450F4B4FE0AC0B2FC08C02B2D2E7EB2 +:104B100005C07A2C2B2D03C07A2C01C0752C24FFE4 +:104B20000DC0FE01EA0DF11D8081803311F4297E54 +:104B300009C022FF06C07394739404C0822F867844 +:104B400009F0739423FD12C020FF06C05A2C731481 +:104B500018F4530C5718732C731460F4B70180E2E7 +:104B600090E02C8799D073942C85F6CF731410F4B1 +:104B7000371801C0312C24FF11C0B70180E390E049 +:104B80002C878AD02C8522FF16C021FF03C088E520 +:104B900090E002C088E790E0B7010CC0822F8678D1 +:104BA00051F021FD02C080E201C08BE227FD8DE2C1 +:104BB000B70190E071D0A51430F4B70180E390E024 +:104BC0006BD05A94F8CFAA94F401EA0DF11D8081BC +:104BD000B70190E061D0A110F6CF332009F45DCE8B +:104BE000B70180E290E058D03A94F7CFF701868180 +:104BF000978102C08FEF9FEF2C96E2E112C1E0ECAB +:104C0000F1E0A785A7FDFDCFA485A860A48760502B +:104C1000704FFCCDDC01CB0102C02D9105D041507D +:104C20005040D8F70895262FE0ECF1E0378537FDA6 +:104C3000FDCF3485377F3487378531FF09C036E3B0 +:104C4000328738ED34BF31E03387378537FDFDCF0C +:104C500033E33287808391831282248325E3228782 +:104C600028ED31E024BF338701960895FC010590BB +:104C7000615070400110D8F7809590958E0F9F1F5E +:104C80000895FC016150704001900110D8F78095A3 +:104C900090958E0F9F1F08950F931F93CF93DF93CF +:104CA000182F092FEB018B8181FD03C08FEF9FEF40 +:104CB00020C082FF10C04E815F812C813D81421750 +:104CC00053077CF4E881F9819F012F5F3F4F2883D0 +:104CD0003983108306C0E885F985812F0995892BD2 +:104CE00029F72E813F812F5F3F4F2E833F83812FF6 +:104CF000902FDF91CF911F910F910895FA01AA276C +:104D0000283051F1203181F1E8946F936E7F6E5F0E +:104D10007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0BC +:104D2000670F781F891F9A1FA11D680F791F8A1F9F +:104D3000911DA11D6A0F711D811D911DA11D20D006 +:104D400009F468943F912AE0269F11243019305DC0 +:104D50003193DEF6CF010895462F4770405D4193B1 +:104D6000B3E00FD0C9F7F6CF462F4F70405D4A33FE +:104D700018F0495D31FD4052419302D0A9F7EACFC6 +:104D8000B4E0A6959795879577956795BA95C9F7F5 +:104D900000976105710508959B01AC010A2E0694E8 +:104DA0005795479537952795BA95C9F7620F731FA1 +:104DB000841F951FA01D0895052E97FB16F40094DF +:104DC0000FD057FD05D045D007FC02D046F408C0EF +:104DD00050954095309521953F4F4F4F5F4F089527 +:104DE00090958095709561957F4F8F4F9F4F089557 +:104DF0002F923F924F925F926F927F928F929F92EB +:104E0000AF92BF92CF92DF92EF92FF920F931F93D8 +:104E1000CF93DF93CDB7DEB7CA1BDB0BCDBFDEBFB1 +:104E200009942A88398848885F846E847D848C84BC +:104E30009B84AA84B984C884DF80EE80FD800C81C5 +:104E40001B81AA81B981CE0FD11DCDBFDEBFED017F +:104E50000895A1E21A2EAA1BBB1BFD010DC0AA1FBB +:104E6000BB1FEE1FFF1FA217B307E407F50720F0D3 +:104E7000A21BB30BE40BF50B661F771F881F991F4E +:104E80001A9469F760957095809590959B01AC0197 +:0A4E9000BD01CF010895F894FFCF93 +:104E9A0014008310000001041000000182080000C1 +:104EAA0001000000000000000000000001000000F6 +:104EBA0000010001000000000000000100010101E2 +:104ECA0001010100010001000000010100010101CE +:104EDA0000010101000000010000010001010001C0 +:104EEA0000000002020000020002020202000002A8 +:104EFA000000000404000004000404040400000488 +:104F0A000008080800000008000008000808000857 +:104F1A000000001010000010001010101000001007 +:024F2A00000085 :00000001FF diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.lss b/Firmware/Chameleon-Mini/Chameleon-Mini.lss index bb79353..40fcbce 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.lss +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.lss @@ -1,16825 +1,15474 @@ - -Chameleon-Mini.elf: file format elf32-avr - -Sections: -Idx Name Size VMA LMA File off Algn - 0 .text 00005282 00000000 00000000 000000b4 2**1 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 00000092 00802000 00005282 00005336 2**0 - CONTENTS, ALLOC, LOAD, DATA - 2 .bss 00000a0b 00802092 00802092 000053c8 2**0 - ALLOC - 3 .eeprom 00000013 00810000 00810000 000053c8 2**0 - CONTENTS, ALLOC, LOAD, DATA - 4 .stab 000014d0 00000000 00000000 000053dc 2**2 - CONTENTS, READONLY, DEBUGGING - 5 .stabstr 0000070f 00000000 00000000 000068ac 2**0 - CONTENTS, READONLY, DEBUGGING - 6 .comment 0000002f 00000000 00000000 00006fbb 2**0 - CONTENTS, READONLY - 7 .debug_aranges 00000bf0 00000000 00000000 00006fea 2**0 - CONTENTS, READONLY, DEBUGGING - 8 .debug_info 00019536 00000000 00000000 00007bda 2**0 - CONTENTS, READONLY, DEBUGGING - 9 .debug_abbrev 00005a36 00000000 00000000 00021110 2**0 - CONTENTS, READONLY, DEBUGGING - 10 .debug_line 0000b5c9 00000000 00000000 00026b46 2**0 - CONTENTS, READONLY, DEBUGGING - 11 .debug_frame 00001ed0 00000000 00000000 00032110 2**2 - CONTENTS, READONLY, DEBUGGING - 12 .debug_str 00007842 00000000 00000000 00033fe0 2**0 - CONTENTS, READONLY, DEBUGGING - 13 .debug_loc 0000d068 00000000 00000000 0003b822 2**0 - CONTENTS, READONLY, DEBUGGING - 14 .debug_ranges 00001ae0 00000000 00000000 0004888a 2**0 - CONTENTS, READONLY, DEBUGGING - -Disassembly of section .text: - -00000000 <__vectors>: - 0: 53 c3 rjmp .+1702 ; 0x6a8 <__ctors_end> - 2: 00 00 nop - 4: 6d c3 rjmp .+1754 ; 0x6e0 <__bad_interrupt> - 6: 00 00 nop - 8: 6b c3 rjmp .+1750 ; 0x6e0 <__bad_interrupt> - a: 00 00 nop - c: 69 c3 rjmp .+1746 ; 0x6e0 <__bad_interrupt> - e: 00 00 nop - 10: 67 c3 rjmp .+1742 ; 0x6e0 <__bad_interrupt> - 12: 00 00 nop - 14: 65 c3 rjmp .+1738 ; 0x6e0 <__bad_interrupt> - 16: 00 00 nop - 18: 63 c3 rjmp .+1734 ; 0x6e0 <__bad_interrupt> - 1a: 00 00 nop - 1c: 61 c3 rjmp .+1730 ; 0x6e0 <__bad_interrupt> - 1e: 00 00 nop - 20: 5f c3 rjmp .+1726 ; 0x6e0 <__bad_interrupt> - 22: 00 00 nop - 24: 5d c3 rjmp .+1722 ; 0x6e0 <__bad_interrupt> - 26: 00 00 nop - 28: 5b c3 rjmp .+1718 ; 0x6e0 <__bad_interrupt> - 2a: 00 00 nop - 2c: 59 c3 rjmp .+1714 ; 0x6e0 <__bad_interrupt> - 2e: 00 00 nop - 30: 57 c3 rjmp .+1710 ; 0x6e0 <__bad_interrupt> - 32: 00 00 nop - 34: 55 c3 rjmp .+1706 ; 0x6e0 <__bad_interrupt> - 36: 00 00 nop - 38: 53 c3 rjmp .+1702 ; 0x6e0 <__bad_interrupt> - 3a: 00 00 nop - 3c: 51 c3 rjmp .+1698 ; 0x6e0 <__bad_interrupt> - 3e: 00 00 nop - 40: 4f c3 rjmp .+1694 ; 0x6e0 <__bad_interrupt> - 42: 00 00 nop - 44: 4d c3 rjmp .+1690 ; 0x6e0 <__bad_interrupt> - 46: 00 00 nop - 48: 4b c3 rjmp .+1686 ; 0x6e0 <__bad_interrupt> - 4a: 00 00 nop - 4c: 49 c3 rjmp .+1682 ; 0x6e0 <__bad_interrupt> - 4e: 00 00 nop - 50: 47 c3 rjmp .+1678 ; 0x6e0 <__bad_interrupt> - 52: 00 00 nop - 54: 45 c3 rjmp .+1674 ; 0x6e0 <__bad_interrupt> - 56: 00 00 nop - 58: 0c 94 80 12 jmp 0x2500 ; 0x2500 <__vector_22> - 5c: 41 c3 rjmp .+1666 ; 0x6e0 <__bad_interrupt> - 5e: 00 00 nop - 60: 3f c3 rjmp .+1662 ; 0x6e0 <__bad_interrupt> - 62: 00 00 nop - 64: 3d c3 rjmp .+1658 ; 0x6e0 <__bad_interrupt> - 66: 00 00 nop - 68: 3b c3 rjmp .+1654 ; 0x6e0 <__bad_interrupt> - 6a: 00 00 nop - 6c: 39 c3 rjmp .+1650 ; 0x6e0 <__bad_interrupt> - 6e: 00 00 nop - 70: 37 c3 rjmp .+1646 ; 0x6e0 <__bad_interrupt> - 72: 00 00 nop - 74: 35 c3 rjmp .+1642 ; 0x6e0 <__bad_interrupt> - 76: 00 00 nop - 78: 33 c3 rjmp .+1638 ; 0x6e0 <__bad_interrupt> - 7a: 00 00 nop - 7c: 31 c3 rjmp .+1634 ; 0x6e0 <__bad_interrupt> - 7e: 00 00 nop - 80: 2f c3 rjmp .+1630 ; 0x6e0 <__bad_interrupt> - 82: 00 00 nop - 84: 2d c3 rjmp .+1626 ; 0x6e0 <__bad_interrupt> - 86: 00 00 nop - 88: 0c 94 3c 12 jmp 0x2478 ; 0x2478 <__vector_34> - 8c: 29 c3 rjmp .+1618 ; 0x6e0 <__bad_interrupt> - 8e: 00 00 nop - 90: 27 c3 rjmp .+1614 ; 0x6e0 <__bad_interrupt> - 92: 00 00 nop - 94: 25 c3 rjmp .+1610 ; 0x6e0 <__bad_interrupt> - 96: 00 00 nop - 98: 23 c3 rjmp .+1606 ; 0x6e0 <__bad_interrupt> - 9a: 00 00 nop - 9c: 21 c3 rjmp .+1602 ; 0x6e0 <__bad_interrupt> - 9e: 00 00 nop - a0: 1f c3 rjmp .+1598 ; 0x6e0 <__bad_interrupt> - a2: 00 00 nop - a4: 1d c3 rjmp .+1594 ; 0x6e0 <__bad_interrupt> - a6: 00 00 nop - a8: 1b c3 rjmp .+1590 ; 0x6e0 <__bad_interrupt> - aa: 00 00 nop - ac: 19 c3 rjmp .+1586 ; 0x6e0 <__bad_interrupt> - ae: 00 00 nop - b0: 17 c3 rjmp .+1582 ; 0x6e0 <__bad_interrupt> - b2: 00 00 nop - b4: 15 c3 rjmp .+1578 ; 0x6e0 <__bad_interrupt> - b6: 00 00 nop - b8: 13 c3 rjmp .+1574 ; 0x6e0 <__bad_interrupt> - ba: 00 00 nop - bc: 11 c3 rjmp .+1570 ; 0x6e0 <__bad_interrupt> - be: 00 00 nop - c0: 0f c3 rjmp .+1566 ; 0x6e0 <__bad_interrupt> - c2: 00 00 nop - c4: 0d c3 rjmp .+1562 ; 0x6e0 <__bad_interrupt> - c6: 00 00 nop - c8: 0b c3 rjmp .+1558 ; 0x6e0 <__bad_interrupt> - ca: 00 00 nop - cc: 09 c3 rjmp .+1554 ; 0x6e0 <__bad_interrupt> - ce: 00 00 nop - d0: 07 c3 rjmp .+1550 ; 0x6e0 <__bad_interrupt> - d2: 00 00 nop - d4: 05 c3 rjmp .+1546 ; 0x6e0 <__bad_interrupt> - d6: 00 00 nop - d8: 03 c3 rjmp .+1542 ; 0x6e0 <__bad_interrupt> - da: 00 00 nop - dc: 01 c3 rjmp .+1538 ; 0x6e0 <__bad_interrupt> - de: 00 00 nop - e0: ff c2 rjmp .+1534 ; 0x6e0 <__bad_interrupt> - e2: 00 00 nop - e4: fd c2 rjmp .+1530 ; 0x6e0 <__bad_interrupt> - e6: 00 00 nop - e8: fb c2 rjmp .+1526 ; 0x6e0 <__bad_interrupt> - ea: 00 00 nop - ec: f9 c2 rjmp .+1522 ; 0x6e0 <__bad_interrupt> - ee: 00 00 nop - f0: f7 c2 rjmp .+1518 ; 0x6e0 <__bad_interrupt> - f2: 00 00 nop - f4: f5 c2 rjmp .+1514 ; 0x6e0 <__bad_interrupt> - f6: 00 00 nop - f8: f3 c2 rjmp .+1510 ; 0x6e0 <__bad_interrupt> - fa: 00 00 nop - fc: f1 c2 rjmp .+1506 ; 0x6e0 <__bad_interrupt> - fe: 00 00 nop - 100: ef c2 rjmp .+1502 ; 0x6e0 <__bad_interrupt> - 102: 00 00 nop - 104: ed c2 rjmp .+1498 ; 0x6e0 <__bad_interrupt> - 106: 00 00 nop - 108: eb c2 rjmp .+1494 ; 0x6e0 <__bad_interrupt> - 10a: 00 00 nop - 10c: e9 c2 rjmp .+1490 ; 0x6e0 <__bad_interrupt> - 10e: 00 00 nop - 110: e7 c2 rjmp .+1486 ; 0x6e0 <__bad_interrupt> - 112: 00 00 nop - 114: e5 c2 rjmp .+1482 ; 0x6e0 <__bad_interrupt> - 116: 00 00 nop - 118: e3 c2 rjmp .+1478 ; 0x6e0 <__bad_interrupt> - 11a: 00 00 nop - 11c: e1 c2 rjmp .+1474 ; 0x6e0 <__bad_interrupt> - 11e: 00 00 nop - 120: df c2 rjmp .+1470 ; 0x6e0 <__bad_interrupt> - 122: 00 00 nop - 124: dd c2 rjmp .+1466 ; 0x6e0 <__bad_interrupt> - 126: 00 00 nop - 128: db c2 rjmp .+1462 ; 0x6e0 <__bad_interrupt> - 12a: 00 00 nop - 12c: d9 c2 rjmp .+1458 ; 0x6e0 <__bad_interrupt> - 12e: 00 00 nop - 130: d7 c2 rjmp .+1454 ; 0x6e0 <__bad_interrupt> - 132: 00 00 nop - 134: d5 c2 rjmp .+1450 ; 0x6e0 <__bad_interrupt> - 136: 00 00 nop - 138: d3 c2 rjmp .+1446 ; 0x6e0 <__bad_interrupt> - 13a: 00 00 nop - 13c: d1 c2 rjmp .+1442 ; 0x6e0 <__bad_interrupt> - 13e: 00 00 nop - 140: cf c2 rjmp .+1438 ; 0x6e0 <__bad_interrupt> - 142: 00 00 nop - 144: cd c2 rjmp .+1434 ; 0x6e0 <__bad_interrupt> - 146: 00 00 nop - 148: cb c2 rjmp .+1430 ; 0x6e0 <__bad_interrupt> - 14a: 00 00 nop - 14c: 0c 94 24 13 jmp 0x2648 ; 0x2648 <__vector_83> - 150: c7 c2 rjmp .+1422 ; 0x6e0 <__bad_interrupt> - 152: 00 00 nop - 154: c5 c2 rjmp .+1418 ; 0x6e0 <__bad_interrupt> - 156: 00 00 nop - 158: c3 c2 rjmp .+1414 ; 0x6e0 <__bad_interrupt> - 15a: 00 00 nop - 15c: c1 c2 rjmp .+1410 ; 0x6e0 <__bad_interrupt> - 15e: 00 00 nop - 160: bf c2 rjmp .+1406 ; 0x6e0 <__bad_interrupt> - 162: 00 00 nop - 164: bd c2 rjmp .+1402 ; 0x6e0 <__bad_interrupt> - 166: 00 00 nop - 168: bb c2 rjmp .+1398 ; 0x6e0 <__bad_interrupt> - 16a: 00 00 nop - 16c: b9 c2 rjmp .+1394 ; 0x6e0 <__bad_interrupt> - 16e: 00 00 nop - 170: b7 c2 rjmp .+1390 ; 0x6e0 <__bad_interrupt> - 172: 00 00 nop - 174: b5 c2 rjmp .+1386 ; 0x6e0 <__bad_interrupt> - 176: 00 00 nop - 178: b3 c2 rjmp .+1382 ; 0x6e0 <__bad_interrupt> - 17a: 00 00 nop - 17c: b1 c2 rjmp .+1378 ; 0x6e0 <__bad_interrupt> - 17e: 00 00 nop - 180: af c2 rjmp .+1374 ; 0x6e0 <__bad_interrupt> - 182: 00 00 nop - 184: ad c2 rjmp .+1370 ; 0x6e0 <__bad_interrupt> - 186: 00 00 nop - 188: ab c2 rjmp .+1366 ; 0x6e0 <__bad_interrupt> - 18a: 00 00 nop - 18c: a9 c2 rjmp .+1362 ; 0x6e0 <__bad_interrupt> - 18e: 00 00 nop - 190: a7 c2 rjmp .+1358 ; 0x6e0 <__bad_interrupt> - 192: 00 00 nop - 194: a5 c2 rjmp .+1354 ; 0x6e0 <__bad_interrupt> - 196: 00 00 nop - 198: a3 c2 rjmp .+1350 ; 0x6e0 <__bad_interrupt> - 19a: 00 00 nop - 19c: a1 c2 rjmp .+1346 ; 0x6e0 <__bad_interrupt> - 19e: 00 00 nop - 1a0: 9f c2 rjmp .+1342 ; 0x6e0 <__bad_interrupt> - 1a2: 00 00 nop - 1a4: 9d c2 rjmp .+1338 ; 0x6e0 <__bad_interrupt> - 1a6: 00 00 nop - 1a8: 9b c2 rjmp .+1334 ; 0x6e0 <__bad_interrupt> - 1aa: 00 00 nop - 1ac: 99 c2 rjmp .+1330 ; 0x6e0 <__bad_interrupt> - 1ae: 00 00 nop - 1b0: 97 c2 rjmp .+1326 ; 0x6e0 <__bad_interrupt> - 1b2: 00 00 nop - 1b4: 95 c2 rjmp .+1322 ; 0x6e0 <__bad_interrupt> - 1b6: 00 00 nop - 1b8: 93 c2 rjmp .+1318 ; 0x6e0 <__bad_interrupt> - 1ba: 00 00 nop - 1bc: 91 c2 rjmp .+1314 ; 0x6e0 <__bad_interrupt> - 1be: 00 00 nop - 1c0: 8f c2 rjmp .+1310 ; 0x6e0 <__bad_interrupt> - 1c2: 00 00 nop - 1c4: 8d c2 rjmp .+1306 ; 0x6e0 <__bad_interrupt> - 1c6: 00 00 nop - 1c8: 8b c2 rjmp .+1302 ; 0x6e0 <__bad_interrupt> - 1ca: 00 00 nop - 1cc: 89 c2 rjmp .+1298 ; 0x6e0 <__bad_interrupt> - 1ce: 00 00 nop - 1d0: 87 c2 rjmp .+1294 ; 0x6e0 <__bad_interrupt> - 1d2: 00 00 nop - 1d4: 85 c2 rjmp .+1290 ; 0x6e0 <__bad_interrupt> - 1d6: 00 00 nop - 1d8: 83 c2 rjmp .+1286 ; 0x6e0 <__bad_interrupt> - 1da: 00 00 nop - 1dc: 81 c2 rjmp .+1282 ; 0x6e0 <__bad_interrupt> - 1de: 00 00 nop - 1e0: 7f c2 rjmp .+1278 ; 0x6e0 <__bad_interrupt> - 1e2: 00 00 nop - 1e4: 7d c2 rjmp .+1274 ; 0x6e0 <__bad_interrupt> - 1e6: 00 00 nop - 1e8: 7b c2 rjmp .+1270 ; 0x6e0 <__bad_interrupt> - 1ea: 00 00 nop - 1ec: 79 c2 rjmp .+1266 ; 0x6e0 <__bad_interrupt> - 1ee: 00 00 nop - 1f0: 77 c2 rjmp .+1262 ; 0x6e0 <__bad_interrupt> - 1f2: 00 00 nop - 1f4: 0c 94 e4 22 jmp 0x45c8 ; 0x45c8 <__vector_125> - 1f8: 73 c2 rjmp .+1254 ; 0x6e0 <__bad_interrupt> - 1fa: 00 00 nop - -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... - -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... - -00000234 : - 234: 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 .............. - -00000276 : - 276: 12 01 10 01 02 00 00 08 eb 03 44 20 01 00 01 02 ..........D .... - 286: dc 01 .. - -00000288 : - 288: 00 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 .NONE........... - 298: 00 64 04 65 04 66 04 67 04 68 04 69 04 6c 04 6d .d.e.f.g.h.i.l.m - 2a8: 04 00 00 00 01 01 4d 46 5f 43 4c 41 53 53 49 43 ......MF_CLASSIC - 2b8: 5f 31 4b 00 00 00 15 14 4c 14 ca 14 e4 14 e8 14 _1K.....L....... - 2c8: e9 14 66 19 6c 19 00 04 04 00 02 4d 46 5f 43 4c ..f.l......MF_CL - 2d8: 41 53 53 49 43 5f 34 4b 00 00 00 15 14 4c 14 d7 ASSIC_4K.....L.. - 2e8: 14 e4 14 e8 14 e9 14 66 19 6c 19 00 10 04 00 .......f.l..... - -000002f7 : - 2f7: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ - 307: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 317: 55 49 44 5f 52 41 4e 44 4f 4d 00 00 00 00 00 00 UID_RANDOM...... - 327: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 337: 55 49 44 5f 4c 45 46 54 5f 49 4e 43 52 45 4d 45 UID_LEFT_INCREME - 347: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. - 357: 55 49 44 5f 52 49 47 48 54 5f 49 4e 43 52 45 4d UID_RIGHT_INCREM - 367: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. - 377: 55 49 44 5f 4c 45 46 54 5f 44 45 43 52 45 4d 45 UID_LEFT_DECREME - 387: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. - 397: 55 49 44 5f 52 49 47 48 54 5f 44 45 43 52 45 4d UID_RIGHT_DECREM - 3a7: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. - 3b7: 43 59 43 4c 45 5f 53 45 54 54 49 4e 47 53 00 00 CYCLE_SETTINGS.. - 3c7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 3d7: 53 54 4f 52 45 5f 4d 45 4d 00 00 00 00 00 00 00 STORE_MEM....... - 3e7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 3f7: 52 45 43 41 4c 4c 5f 4d 45 4d 00 00 00 00 00 00 RECALL_MEM...... - 407: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - -00000417 <__c.6293>: - 417: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % - 427: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S - 437: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV - 447: 52 2d 47 43 43 20 25 53 00 R-GCC %S. - -00000450 <__c.6295>: - 450: 31 34 30 35 31 31 00 140511. - -00000457 <__c.6297>: - 457: 31 33 30 39 30 31 00 130901. - -0000045e <__c.6299>: - 45e: 34 2e 37 2e 32 00 4.7.2. - -00000464 <__c.6304>: - 464: 25 73 00 %s. - -00000467 <__c.6322>: - 467: 52 41 4e 44 4f 4d 00 RANDOM. - -0000046e <__c.6349>: - 46e: 25 75 00 %u. - -00000471 <__c.6354>: - 471: 25 75 00 %u. - -00000474 <__c.6393>: - 474: 25 35 75 20 6d 56 00 %5u mV. - -0000047b : - 47b: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... - 48b: 00 00 00 00 fd 0c 43 4f 4e 46 49 47 00 00 00 00 ......CONFIG.... - 49b: 00 00 00 00 00 00 3a 0d 31 0d 1b 0d 55 49 44 00 ......:.1...UID. - 4ab: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 0d ..............g. - 4bb: 40 0d 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 @.READONLY...... - 4cb: 00 00 00 00 d2 0d c0 0d 55 50 4c 4f 41 44 00 00 ........UPLOAD.. - 4db: 00 00 00 00 00 00 00 00 e6 0d 00 00 00 00 44 4f ..............DO - 4eb: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 eb 0d WNLOAD.......... - 4fb: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... - 50b: 00 00 00 00 f0 0d 00 00 00 00 55 50 47 52 41 44 ..........UPGRAD - 51b: 45 00 00 00 00 00 00 00 00 00 fb 0d 00 00 00 00 E............... - 52b: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... - 53b: 00 00 00 00 06 0e 55 49 44 53 49 5a 45 00 00 00 ......UIDSIZE... - 54b: 00 00 00 00 00 00 00 00 00 00 1e 0e 42 55 54 54 ............BUTT - 55b: 4f 4e 00 00 00 00 00 00 00 00 00 00 34 0e 3e 0e ON..........4.>. - 56b: 39 0e 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 9.SETTING....... - 57b: 00 00 00 00 4b 0e 46 0e 43 4c 45 41 52 00 00 00 ....K.F.CLEAR... - 58b: 00 00 00 00 00 00 00 00 53 0e 00 00 00 00 48 45 ........S.....HE - 59b: 4c 50 00 00 00 00 00 00 00 00 00 00 00 00 57 0e LP............W. - 5ab: 00 00 00 00 52 53 53 49 00 00 00 00 00 00 00 00 ....RSSI........ - 5bb: 00 00 00 00 00 00 00 00 a3 0e 00 00 00 00 00 00 ................ - 5cb: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - -000005db <__c.6083>: - 5db: 0d 0a 00 ... - -000005de <__c.6085>: - 5de: 0d 0a 00 ... - -000005e1 : - 5e1: 64 31 30 30 3a 4f 4b 00 00 00 00 00 00 00 00 00 d100:OK......... - 5f1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 601: 00 65 31 30 31 3a 4f 4b 20 57 49 54 48 20 54 45 .e101:OK WITH TE - 611: 58 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XT.............. - 621: 00 00 6e 31 31 30 3a 57 41 49 54 49 4e 47 20 46 ..n110:WAITING F - 631: 4f 52 20 58 4d 4f 44 45 4d 00 00 00 00 00 00 00 OR XMODEM....... - 641: 00 00 00 c8 32 30 30 3a 55 4e 4b 4e 4f 57 4e 20 ....200:UNKNOWN - 651: 43 4f 4d 4d 41 4e 44 00 00 00 00 00 00 00 00 00 COMMAND......... - 661: 00 00 00 00 c9 32 30 31 3a 49 4e 56 41 4c 49 44 .....201:INVALID - 671: 20 43 4f 4d 4d 41 4e 44 20 55 53 41 47 45 00 00 COMMAND USAGE.. - 681: 00 00 00 00 00 ca 32 30 32 3a 49 4e 56 41 4c 49 ......202:INVALI - 691: 44 20 50 41 52 41 4d 45 54 45 52 00 00 00 00 00 D PARAMETER..... - 6a1: 00 00 00 00 00 00 00 ....... - -000006a8 <__ctors_end>: - 6a8: 11 24 eor r1, r1 - 6aa: 1f be out 0x3f, r1 ; 63 - 6ac: cf ef ldi r28, 0xFF ; 255 - 6ae: df e2 ldi r29, 0x2F ; 47 - 6b0: de bf out 0x3e, r29 ; 62 - 6b2: cd bf out 0x3d, r28 ; 61 - -000006b4 <__do_copy_data>: - 6b4: 10 e2 ldi r17, 0x20 ; 32 - 6b6: a0 e0 ldi r26, 0x00 ; 0 - 6b8: b0 e2 ldi r27, 0x20 ; 32 - 6ba: e2 e8 ldi r30, 0x82 ; 130 - 6bc: f2 e5 ldi r31, 0x52 ; 82 - 6be: 02 c0 rjmp .+4 ; 0x6c4 <__do_copy_data+0x10> - 6c0: 05 90 lpm r0, Z+ - 6c2: 0d 92 st X+, r0 - 6c4: a2 39 cpi r26, 0x92 ; 146 - 6c6: b1 07 cpc r27, r17 - 6c8: d9 f7 brne .-10 ; 0x6c0 <__do_copy_data+0xc> - -000006ca <__do_clear_bss>: - 6ca: 2a e2 ldi r18, 0x2A ; 42 - 6cc: a2 e9 ldi r26, 0x92 ; 146 - 6ce: b0 e2 ldi r27, 0x20 ; 32 - 6d0: 01 c0 rjmp .+2 ; 0x6d4 <.do_clear_bss_start> - -000006d2 <.do_clear_bss_loop>: - 6d2: 1d 92 st X+, r1 - -000006d4 <.do_clear_bss_start>: - 6d4: ad 39 cpi r26, 0x9D ; 157 - 6d6: b2 07 cpc r27, r18 - 6d8: e1 f7 brne .-8 ; 0x6d2 <.do_clear_bss_loop> - 6da: 03 d0 rcall .+6 ; 0x6e2

- 6dc: 0c 94 3f 29 jmp 0x527e ; 0x527e <_exit> - -000006e0 <__bad_interrupt>: - 6e0: 7c c0 rjmp .+248 ; 0x7da <__vector_default> - -000006e2
: - -#include "Chameleon-Mini.h" - -int main(void) -{ - SystemInit(); - 6e2: 81 d0 rcall .+258 ; 0x7e6 - SettingsLoad(); - 6e4: 0e 94 bb 0b call 0x1776 ; 0x1776 - -extern uint8_t LEDPulseMask; - -static inline -void LEDInit(void) { - LED_PORT.DIRSET = LED_MASK; - 6e8: 80 e3 ldi r24, 0x30 ; 48 - 6ea: 80 93 01 06 sts 0x0601, r24 - LEDInit(); - MemoryInit(); - 6ee: d9 d2 rcall .+1458 ; 0xca2 - ConfigurationInit(); - 6f0: 10 d1 rcall .+544 ; 0x912 - TerminalInit(); - 6f2: 0e 94 87 0c call 0x190e ; 0x190e - RandomInit(); - 6f6: 83 d1 rcall .+774 ; 0x9fe - ButtonInit(); - 6f8: b1 d6 rcall .+3426 ; 0x145c -#define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE) - -static inline -void AntennaLevelInit(void) -{ - ADCA.CTRLA = ADC_ENABLE_bm; - 6fa: 81 e0 ldi r24, 0x01 ; 1 - 6fc: 80 93 00 02 sts 0x0200, r24 - ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; - 700: 10 92 01 02 sts 0x0201, r1 - ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; - 704: 92 e0 ldi r25, 0x02 ; 2 - 706: 90 93 02 02 sts 0x0202, r25 - ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; - 70a: 93 e0 ldi r25, 0x03 ; 3 - 70c: 90 93 04 02 sts 0x0204, r25 - ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; - 710: 80 93 20 02 sts 0x0220, r24 - ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc; - 714: 88 e3 ldi r24, 0x38 ; 56 - 716: 80 93 21 02 sts 0x0221, r24 - AntennaLevelInit(); - - SystemInterruptInit(); - 71a: d0 d0 rcall .+416 ; 0x8bc -} - -INLINE bool SystemTick100ms(void) -{ - if (TCE0.INTFLAGS & TC0_OVFIF_bm) { - TCE0.INTFLAGS = TC0_OVFIF_bm; - 71c: c1 e0 ldi r28, 0x01 ; 1 - - while(1) { - TerminalTask(); - 71e: 0e 94 8c 0c call 0x1918 ; 0x1918 -INLINE void CodecInit(void) { - ActiveConfiguration.CodecInitFunc(); -} - -INLINE void CodecTask(void) { - ActiveConfiguration.CodecTaskFunc(); - 722: e0 91 eb 24 lds r30, 0x24EB - 726: f0 91 ec 24 lds r31, 0x24EC - 72a: 09 95 icall -INLINE void ApplicationInit(void) { - ActiveConfiguration.ApplicationInitFunc(); -} - -INLINE void ApplicationTask(void) { - ActiveConfiguration.ApplicationTaskFunc(); - 72c: e0 91 f1 24 lds r30, 0x24F1 - 730: f0 91 f2 24 lds r31, 0x24F2 - 734: 09 95 icall - return RTC.CNT; -} - -INLINE bool SystemTick100ms(void) -{ - if (TCE0.INTFLAGS & TC0_OVFIF_bm) { - 736: 80 91 0c 0a lds r24, 0x0A0C - 73a: 80 ff sbrs r24, 0 - 73c: f0 cf rjmp .-32 ; 0x71e - TCE0.INTFLAGS = TC0_OVFIF_bm; - 73e: c0 93 0c 0a sts 0x0A0C, r28 - CodecTask(); - ApplicationTask(); - - if (SystemTick100ms()) { - RandomTick(); - 742: 70 d1 rcall .+736 ; 0xa24 - TerminalTick(); - 744: 0e 94 ab 0c call 0x1956 ; 0x1956 - ButtonTick(); - 748: 90 d6 rcall .+3360 ; 0x146a - LED_PORT.OUTSET = Mask; -} - -static inline -void LEDTick(void) { - LED_PORT.OUTCLR = LEDPulseMask; - 74a: 80 91 93 24 lds r24, 0x2493 - 74e: 80 93 06 06 sts 0x0606, r24 - LEDPulseMask = 0; - 752: 10 92 93 24 sts 0x2493, r1 - 756: e3 cf rjmp .-58 ; 0x71e - -00000758 : - break; - } - - *DescriptorAddress = Address; - return Size; -} - 758: 29 2f mov r18, r25 - 75a: 33 27 eor r19, r19 - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - 75c: 22 30 cpi r18, 0x02 ; 2 - 75e: 31 05 cpc r19, r1 - 760: 39 f1 breq .+78 ; 0x7b0 - 762: 23 30 cpi r18, 0x03 ; 3 - 764: 31 05 cpc r19, r1 - 766: a9 f0 breq .+42 ; 0x792 - 768: 21 30 cpi r18, 0x01 ; 1 - 76a: 31 05 cpc r19, r1 - 76c: 49 f0 breq .+18 ; 0x780 -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - 76e: 20 e0 ldi r18, 0x00 ; 0 - 770: 30 e0 ldi r19, 0x00 ; 0 - const void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - 772: 80 e0 ldi r24, 0x00 ; 0 - 774: 90 e0 ldi r25, 0x00 ; 0 - } - - break; - } - - *DescriptorAddress = Address; - 776: fa 01 movw r30, r20 - 778: 80 83 st Z, r24 - 77a: 91 83 std Z+1, r25 ; 0x01 - return Size; -} - 77c: c9 01 movw r24, r18 - 77e: 08 95 ret - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - 780: 22 e1 ldi r18, 0x12 ; 18 - 782: 30 e0 ldi r19, 0x00 ; 0 - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - 784: 86 e7 ldi r24, 0x76 ; 118 - 786: 92 e0 ldi r25, 0x02 ; 2 - } - - break; - } - - *DescriptorAddress = Address; - 788: fa 01 movw r30, r20 - 78a: 80 83 st Z, r24 - 78c: 91 83 std Z+1, r25 ; 0x01 - return Size; -} - 78e: c9 01 movw r24, r18 - 790: 08 95 ret - 792: 99 27 eor r25, r25 - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - switch (DescriptorNumber) - 794: 81 30 cpi r24, 0x01 ; 1 - 796: 91 05 cpc r25, r1 - 798: a1 f0 breq .+40 ; 0x7c2 - 79a: 82 30 cpi r24, 0x02 ; 2 - 79c: 91 05 cpc r25, r1 - 79e: b9 f0 breq .+46 ; 0x7ce - 7a0: 89 2b or r24, r25 - 7a2: 29 f7 brne .-54 ; 0x76e - { - case 0x00: - Address = &LanguageString; - Size = pgm_read_byte(&LanguageString.Header.Size); - 7a4: e4 e3 ldi r30, 0x34 ; 52 - 7a6: f2 e0 ldi r31, 0x02 ; 2 - 7a8: 24 91 lpm r18, Z - 7aa: 30 e0 ldi r19, 0x00 ; 0 - break; - case DTYPE_String: - switch (DescriptorNumber) - { - case 0x00: - Address = &LanguageString; - 7ac: cf 01 movw r24, r30 - Size = pgm_read_byte(&LanguageString.Header.Size); - break; - 7ae: e3 cf rjmp .-58 ; 0x776 - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - 7b0: 2e e3 ldi r18, 0x3E ; 62 - 7b2: 30 e0 ldi r19, 0x00 ; 0 - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - 7b4: 88 e3 ldi r24, 0x38 ; 56 - 7b6: 92 e0 ldi r25, 0x02 ; 2 - } - - break; - } - - *DescriptorAddress = Address; - 7b8: fa 01 movw r30, r20 - 7ba: 80 83 st Z, r24 - 7bc: 91 83 std Z+1, r25 ; 0x01 - return Size; -} - 7be: c9 01 movw r24, r18 - 7c0: 08 95 ret - Address = &LanguageString; - Size = pgm_read_byte(&LanguageString.Header.Size); - break; - case 0x01: - Address = &ManufacturerString; - Size = pgm_read_byte(&ManufacturerString.Header.Size); - 7c2: ea e1 ldi r30, 0x1A ; 26 - 7c4: f2 e0 ldi r31, 0x02 ; 2 - 7c6: 24 91 lpm r18, Z - 7c8: 30 e0 ldi r19, 0x00 ; 0 - case 0x00: - Address = &LanguageString; - Size = pgm_read_byte(&LanguageString.Header.Size); - break; - case 0x01: - Address = &ManufacturerString; - 7ca: cf 01 movw r24, r30 - Size = pgm_read_byte(&ManufacturerString.Header.Size); - break; - 7cc: d4 cf rjmp .-88 ; 0x776 - case 0x02: - Address = &ProductString; - Size = pgm_read_byte(&ProductString.Header.Size); - 7ce: ec ef ldi r30, 0xFC ; 252 - 7d0: f1 e0 ldi r31, 0x01 ; 1 - 7d2: 24 91 lpm r18, Z - 7d4: 30 e0 ldi r19, 0x00 ; 0 - case 0x01: - Address = &ManufacturerString; - Size = pgm_read_byte(&ManufacturerString.Header.Size); - break; - case 0x02: - Address = &ProductString; - 7d6: cf 01 movw r24, r30 - Size = pgm_read_byte(&ProductString.Header.Size); - break; - 7d8: ce cf rjmp .-100 ; 0x776 - -000007da <__vector_default>: - -#include "System.h" -#include "LED.h" - -ISR(BADISR_vect) -{ - 7da: 1f 92 push r1 - 7dc: 0f 92 push r0 - 7de: 0f b6 in r0, 0x3f ; 63 - 7e0: 0f 92 push r0 - 7e2: 11 24 eor r1, r1 - 7e4: ff cf rjmp .-2 ; 0x7e4 <__vector_default+0xa> - -000007e6 : - while(1); -} - -void SystemInit(void) -{ - if (RST.STATUS & RST_WDRF_bm) { - 7e6: 80 91 78 00 lds r24, 0x0078 - 7ea: 83 ff sbrs r24, 3 - 7ec: 0a c0 rjmp .+20 ; 0x802 - /* On Watchdog reset clear WDRF bit, disable watchdog - * and jump into bootloader */ - RST.STATUS = RST_WDRF_bm; - 7ee: 88 e0 ldi r24, 0x08 ; 8 - 7f0: 80 93 78 00 sts 0x0078, r24 - - CCP = CCP_IOREG_gc; - 7f4: 88 ed ldi r24, 0xD8 ; 216 - 7f6: 84 bf out 0x34, r24 ; 52 - WDT.CTRL = WDT_CEN_bm; - 7f8: 81 e0 ldi r24, 0x01 ; 1 - 7fa: 80 93 80 00 sts 0x0080, r24 - - asm volatile ("jmp %0"::"i" (BOOT_SECTION_START + 0x1FC)); - 7fe: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f2ee8> - } - - /* 32MHz system clock using internal RC and 32K DFLL*/ - OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm; - 802: 80 91 50 00 lds r24, 0x0050 - 806: 86 60 ori r24, 0x06 ; 6 - 808: 80 93 50 00 sts 0x0050, r24 - while(!(OSC.STATUS & OSC_RC32MRDY_bm)) - 80c: 80 91 51 00 lds r24, 0x0051 - 810: 81 ff sbrs r24, 1 - 812: fc cf rjmp .-8 ; 0x80c - ; - while(!(OSC.STATUS & OSC_RC32KRDY_bm)) - 814: 80 91 51 00 lds r24, 0x0051 - 818: 82 ff sbrs r24, 2 - 81a: fc cf rjmp .-8 ; 0x814 - ; - - OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; - 81c: 10 92 56 00 sts 0x0056, r1 - DFLLRC32M.CTRL = DFLL_ENABLE_bm; - 820: 21 e0 ldi r18, 0x01 ; 1 - 822: 20 93 60 00 sts 0x0060, r18 - - CCP = CCP_IOREG_gc; - 826: 88 ed ldi r24, 0xD8 ; 216 - 828: 84 bf out 0x34, r24 ; 52 - CLK.CTRL = CLK_SCLKSEL_RC32M_gc; - 82a: 20 93 40 00 sts 0x0040, r18 - - /* Use TCE0 as system tick */ - TCE0.PER = F_CPU / 256 / SYSTEM_TICK_FREQ - 1; - 82e: 83 ed ldi r24, 0xD3 ; 211 - 830: 90 e3 ldi r25, 0x30 ; 48 - 832: 80 93 26 0a sts 0x0A26, r24 - 836: 90 93 27 0a sts 0x0A27, r25 - TCE0.CTRLA = TC_CLKSEL_DIV256_gc; - 83a: 86 e0 ldi r24, 0x06 ; 6 - 83c: 80 93 00 0a sts 0x0A00, r24 - - /* Enable RTC with roughly 1kHz clock */ - CLK.RTCCTRL = CLK_RTCSRC_ULP_gc | CLK_RTCEN_bm; - 840: 20 93 43 00 sts 0x0043, r18 - RTC.CTRL = RTC_PRESCALER_DIV1_gc; - 844: 20 93 00 04 sts 0x0400, r18 - - /* Enable EEPROM data memory mapping */ - NVM.CTRLB |= NVM_EEMAPEN_bm; - 848: 80 91 cc 01 lds r24, 0x01CC - 84c: 88 60 ori r24, 0x08 ; 8 - 84e: 80 93 cc 01 sts 0x01CC, r24 - 852: 08 95 ret - -00000854 : -} - -void SystemReset(void) -{ - CCP = CCP_IOREG_gc; - 854: 88 ed ldi r24, 0xD8 ; 216 - 856: 84 bf out 0x34, r24 ; 52 - RST.CTRL = RST_SWRST_bm; - 858: 81 e0 ldi r24, 0x01 ; 1 - 85a: e8 e7 ldi r30, 0x78 ; 120 - 85c: f0 e0 ldi r31, 0x00 ; 0 - 85e: 81 83 std Z+1, r24 ; 0x01 - 860: 08 95 ret - -00000862 : -} - -void SystemEnterBootloader(void) -{ - /* Use Watchdog timer to reset into bootloader. */ - CCP = CCP_IOREG_gc; - 862: 88 ed ldi r24, 0xD8 ; 216 - 864: 84 bf out 0x34, r24 ; 52 - WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; - 866: 8b e1 ldi r24, 0x1B ; 27 - 868: 80 93 80 00 sts 0x0080, r24 - 86c: 08 95 ret - -0000086e : - - -void SystemStartUSBClock(void) -{ - /* 48MHz USB Clock using 12MHz XTAL */ - OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; - 86e: 8b ec ldi r24, 0xCB ; 203 - 870: 80 93 52 00 sts 0x0052, r24 - OSC.CTRL |= OSC_XOSCEN_bm; - 874: 80 91 50 00 lds r24, 0x0050 - 878: 88 60 ori r24, 0x08 ; 8 - 87a: 80 93 50 00 sts 0x0050, r24 - while(!(OSC.STATUS & OSC_XOSCRDY_bm)) - 87e: 80 91 51 00 lds r24, 0x0051 - 882: 83 ff sbrs r24, 3 - 884: fc cf rjmp .-8 ; 0x87e - ; - - OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (4 << OSC_PLLFAC_gp); - 886: 84 ec ldi r24, 0xC4 ; 196 - 888: 80 93 55 00 sts 0x0055, r24 - - OSC.CTRL |= OSC_PLLEN_bm; - 88c: 80 91 50 00 lds r24, 0x0050 - 890: 80 61 ori r24, 0x10 ; 16 - 892: 80 93 50 00 sts 0x0050, r24 - while(!(OSC.STATUS & OSC_PLLRDY_bm)) - 896: 80 91 51 00 lds r24, 0x0051 - 89a: 84 ff sbrs r24, 4 - 89c: fc cf rjmp .-8 ; 0x896 - ; -} - 89e: 08 95 ret - -000008a0 : - -void SystemStopUSBClock(void) -{ - /* Disable USB Clock to minimize power consumption */ - CLK.USBCTRL &= ~CLK_USBSEN_bm; - 8a0: e0 e4 ldi r30, 0x40 ; 64 - 8a2: f0 e0 ldi r31, 0x00 ; 0 - 8a4: 84 81 ldd r24, Z+4 ; 0x04 - 8a6: 8e 7f andi r24, 0xFE ; 254 - 8a8: 84 83 std Z+4, r24 ; 0x04 - OSC.CTRL &= ~OSC_PLLEN_bm; - 8aa: e0 e5 ldi r30, 0x50 ; 80 - 8ac: f0 e0 ldi r31, 0x00 ; 0 - 8ae: 80 81 ld r24, Z - 8b0: 8f 7e andi r24, 0xEF ; 239 - 8b2: 80 83 st Z, r24 - OSC.CTRL &= ~OSC_XOSCEN_bm; - 8b4: 80 81 ld r24, Z - 8b6: 87 7f andi r24, 0xF7 ; 247 - 8b8: 80 83 st Z, r24 - 8ba: 08 95 ret - -000008bc : -} - -void SystemInterruptInit(void) -{ - /* Enable all interrupt levels */ - PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; - 8bc: 87 e0 ldi r24, 0x07 ; 7 - 8be: e0 ea ldi r30, 0xA0 ; 160 - 8c0: f0 e0 ldi r31, 0x00 ; 0 - 8c2: 82 83 std Z+2, r24 ; 0x02 - sei(); - 8c4: 78 94 sei - 8c6: 08 95 ret - -000008c8 : - -/* Include all Codecs and Applications */ -#include "Codec/Codec.h" -#include "Application/Application.h" - -static void CodecInitDummy(void) { } - 8c8: 08 95 ret - -000008ca : -static void CodecTaskDummy(void) { } - 8ca: 08 95 ret - -000008cc : -static void ApplicationInitDummy(void) {} - 8cc: 08 95 ret - -000008ce : -static void ApplicationResetDummy(void) {} - 8ce: 08 95 ret - -000008d0 : -static void ApplicationTaskDummy(void) {} - 8d0: 08 95 ret - -000008d2 : -static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } - 8d2: 80 e0 ldi r24, 0x00 ; 0 - 8d4: 90 e0 ldi r25, 0x00 ; 0 - 8d6: 08 95 ret - -000008d8 : -static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } - 8d8: 08 95 ret - -000008da : -static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } - 8da: 08 95 ret - -000008dc : - ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); -} - -void ConfigurationSetById( ConfigurationEnum Configuration ) -{ - GlobalSettings.ActiveSettingPtr->Configuration = Configuration; - 8dc: e0 91 fe 24 lds r30, 0x24FE - 8e0: f0 91 ff 24 lds r31, 0x24FF - 8e4: 81 83 std Z+1, r24 ; 0x01 - - /* Copy struct from PROGMEM to RAM */ - memcpy_P(&ActiveConfiguration, - &ConfigurationTable[Configuration], sizeof(ConfigurationType)); - 8e6: 95 e2 ldi r25, 0x25 ; 37 - 8e8: 89 9f mul r24, r25 - 8ea: b0 01 movw r22, r0 - 8ec: 11 24 eor r1, r1 - 8ee: 68 57 subi r22, 0x78 ; 120 - 8f0: 7d 4f sbci r23, 0xFD ; 253 -void ConfigurationSetById( ConfigurationEnum Configuration ) -{ - GlobalSettings.ActiveSettingPtr->Configuration = Configuration; - - /* Copy struct from PROGMEM to RAM */ - memcpy_P(&ActiveConfiguration, - 8f2: 45 e2 ldi r20, 0x25 ; 37 - 8f4: 50 e0 ldi r21, 0x00 ; 0 - 8f6: 88 ed ldi r24, 0xD8 ; 216 - 8f8: 94 e2 ldi r25, 0x24 ; 36 - 8fa: 0e 94 d6 25 call 0x4bac ; 0x4bac -/* Applications */ -#include "MifareClassic.h" - -/* Function wrappers */ -INLINE void ApplicationInit(void) { - ActiveConfiguration.ApplicationInitFunc(); - 8fe: e0 91 ed 24 lds r30, 0x24ED - 902: f0 91 ee 24 lds r31, 0x24EE - 906: 09 95 icall -#define CODEC_CARRIER_FREQ 13560000 - -extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; - -INLINE void CodecInit(void) { - ActiveConfiguration.CodecInitFunc(); - 908: e0 91 e9 24 lds r30, 0x24E9 - 90c: f0 91 ea 24 lds r31, 0x24EA - 910: 09 94 ijmp - -00000912 : - -ConfigurationType ActiveConfiguration; - -void ConfigurationInit(void) -{ - ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); - 912: e0 91 fe 24 lds r30, 0x24FE - 916: f0 91 ff 24 lds r31, 0x24FF - 91a: 81 81 ldd r24, Z+1 ; 0x01 - 91c: df cf rjmp .-66 ; 0x8dc - -0000091e : - ApplicationInit(); - CodecInit(); -} - -bool ConfigurationSetByName(const char* ConfigurationName) -{ - 91e: 0f 93 push r16 - 920: 1f 93 push r17 - 922: cf 93 push r28 - 924: df 93 push r29 - 926: 20 e0 ldi r18, 0x00 ; 0 - 928: 30 e0 ldi r19, 0x00 ; 0 - uint8_t i; - - /* Loop through table trying to find the configuration */ - for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { - const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; - 92a: 15 e2 ldi r17, 0x25 ; 37 - - ApplicationInit(); - CodecInit(); -} - -bool ConfigurationSetByName(const char* ConfigurationName) - 92c: ac 01 movw r20, r24 - 92e: 4f 5f subi r20, 0xFF ; 255 - 930: 5f 4f sbci r21, 0xFF ; 255 - 932: 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; - 934: 12 9f mul r17, r18 - 936: f0 01 movw r30, r0 - 938: 13 9f mul r17, r19 - 93a: f0 0d add r31, r0 - 93c: 11 24 eor r1, r1 - 93e: e7 57 subi r30, 0x77 ; 119 - 940: fd 4f sbci r31, 0xFD ; 253 - const char* pRequestedConfigName = ConfigurationName; - bool StringMismatch = false; - char c = pgm_read_byte(pTableConfigName); - 942: 64 91 lpm r22, Z - - /* Try to keep running until both strings end at the same point */ - while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - 944: 61 11 cpse r22, r1 - 946: 0f c0 rjmp .+30 ; 0x966 - 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; - 948: 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') ) { - 94a: 68 81 ld r22, Y - 94c: 66 23 and r22, r22 - 94e: 01 f1 breq .+64 ; 0x990 - 950: 2f 5f subi r18, 0xFF ; 255 - 952: 3f 4f sbci r19, 0xFF ; 255 -bool ConfigurationSetByName(const char* ConfigurationName) -{ - uint8_t i; - - /* Loop through table trying to find the configuration */ - for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { - 954: 23 30 cpi r18, 0x03 ; 3 - 956: 31 05 cpc r19, r1 - 958: 61 f7 brne .-40 ; 0x932 - ConfigurationSetById(i); - return true; - } - } - - return false; - 95a: 80 e0 ldi r24, 0x00 ; 0 -} - 95c: df 91 pop r29 - 95e: cf 91 pop r28 - 960: 1f 91 pop r17 - 962: 0f 91 pop r16 - 964: 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') ) { - 966: dc 01 movw r26, r24 - 968: 7c 91 ld r23, X - 96a: 77 23 and r23, r23 - 96c: 89 f3 breq .-30 ; 0x950 - /* One String ended before the other did -> unequal length */ - StringMismatch = true; - break; - } - - if (c != *pRequestedConfigName) { - 96e: 67 13 cpse r22, r23 - 970: ef cf rjmp .-34 ; 0x950 - - ApplicationInit(); - CodecInit(); -} - -bool ConfigurationSetByName(const char* ConfigurationName) - 972: da 01 movw r26, r20 - 974: 05 c0 rjmp .+10 ; 0x980 - 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') ) { - 976: 7d 91 ld r23, X+ - 978: 77 23 and r23, r23 - 97a: 51 f3 breq .-44 ; 0x950 - /* One String ended before the other did -> unequal length */ - StringMismatch = true; - break; - } - - if (c != *pRequestedConfigName) { - 97c: 76 13 cpse r23, r22 - 97e: e8 cf rjmp .-48 ; 0x950 - StringMismatch = true; - break; - } - - /* Proceed to next character */ - pTableConfigName++; - 980: 31 96 adiw r30, 0x01 ; 1 - pRequestedConfigName++; - 982: ed 01 movw r28, r26 - - c = pgm_read_byte(pTableConfigName); - 984: 64 91 lpm r22, Z - const char* pRequestedConfigName = ConfigurationName; - bool StringMismatch = false; - char c = pgm_read_byte(pTableConfigName); - - /* Try to keep running until both strings end at the same point */ - while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { - 986: 61 11 cpse r22, r1 - 988: f6 cf rjmp .-20 ; 0x976 - 98a: 68 81 ld r22, Y - 98c: 61 11 cpse r22, r1 - 98e: e0 cf rjmp .-64 ; 0x950 - c = pgm_read_byte(pTableConfigName); - } - - if (!StringMismatch) { - /* Configuration found */ - ConfigurationSetById(i); - 990: 80 2f mov r24, r16 - 992: a4 df rcall .-184 ; 0x8dc - return true; - 994: 81 e0 ldi r24, 0x01 ; 1 - } - } - - return false; -} - 996: df 91 pop r29 - 998: cf 91 pop r28 - 99a: 1f 91 pop r17 - 99c: 0f 91 pop r16 - 99e: 08 95 ret - -000009a0 : - -void ConfigurationGetList(char* ConfigListOut, uint16_t ByteCount) -{ - 9a0: cf 93 push r28 - 9a2: df 93 push r29 - 9a4: ec 01 movw r28, r24 - uint8_t i; - - /* Account for '\0' */ - ByteCount--; - 9a6: 61 50 subi r22, 0x01 ; 1 - 9a8: 71 09 sbc r23, r1 - 9aa: 80 e0 ldi r24, 0x00 ; 0 - 9ac: 90 e0 ldi r25, 0x00 ; 0 - - for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - 9c0: 24 91 lpm r18, Z - 9c2: 22 23 and r18, r18 - 9c4: 81 f0 breq .+32 ; 0x9e6 - 9c6: 61 31 cpi r22, 0x11 ; 17 - 9c8: 71 05 cpc r23, r1 - 9ca: 68 f0 brcs .+26 ; 0x9e6 - 9cc: de 01 movw r26, r28 - 9ce: 03 c0 rjmp .+6 ; 0x9d6 - 9d0: 60 31 cpi r22, 0x10 ; 16 - 9d2: 71 05 cpc r23, r1 - 9d4: 41 f0 breq .+16 ; 0x9e6 - /* While not end-of-string and enough buffer to - * put a complete configuration name */ - *ConfigListOut++ = c; - 9d6: 2d 93 st X+, r18 - 9d8: ed 01 movw r28, r26 - ConfigName++; - 9da: 31 96 adiw r30, 0x01 ; 1 - ByteCount--; - 9dc: 61 50 subi r22, 0x01 ; 1 - 9de: 71 09 sbc r23, r1 - - for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - 9e0: 24 91 lpm r18, Z - 9e2: 21 11 cpse r18, r1 - 9e4: f5 cf rjmp .-22 ; 0x9d0 - *ConfigListOut++ = c; - ConfigName++; - ByteCount--; - } - - if ( i < (CONFIG_COUNT - 1) ) { - 9e6: 82 30 cpi r24, 0x02 ; 2 - 9e8: 91 05 cpc r25, r1 - 9ea: 21 f4 brne .+8 ; 0x9f4 - *ConfigListOut++ = ','; - ByteCount--; - } - } - - *ConfigListOut = '\0'; - 9ec: 18 82 st Y, r1 -} - 9ee: df 91 pop r29 - 9f0: cf 91 pop r28 - 9f2: 08 95 ret - ByteCount--; - } - - if ( i < (CONFIG_COUNT - 1) ) { - /* No comma on last configuration */ - *ConfigListOut++ = ','; - 9f4: 49 93 st Y+, r20 - ByteCount--; - 9f6: 61 50 subi r22, 0x01 ; 1 - 9f8: 71 09 sbc r23, r1 - 9fa: 01 96 adiw r24, 0x01 ; 1 - 9fc: da cf rjmp .-76 ; 0x9b2 - -000009fe : -#include "Random.h" - -#include - -void RandomInit(void) -{ - 9fe: 08 95 ret - -00000a00 : - -} - -uint8_t RandomGetByte(void) -{ - return rand() & 0xFF; - a00: 0c 94 c8 25 jmp 0x4b90 ; 0x4b90 -} - a04: 08 95 ret - -00000a06 : - -void RandomGetBuffer(void* Buffer, uint8_t ByteCount) -{ - a06: 1f 93 push r17 - a08: cf 93 push r28 - a0a: df 93 push r29 - a0c: 16 2f mov r17, r22 - uint8_t* BufferPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - a0e: 66 23 and r22, r22 - a10: 29 f0 breq .+10 ; 0xa1c - a12: ec 01 movw r28, r24 - *BufferPtr++ = RandomGetByte(); - a14: f5 df rcall .-22 ; 0xa00 - a16: 89 93 st Y+, r24 - a18: 11 50 subi r17, 0x01 ; 1 - -void RandomGetBuffer(void* Buffer, uint8_t ByteCount) -{ - uint8_t* BufferPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - a1a: e1 f7 brne .-8 ; 0xa14 - *BufferPtr++ = RandomGetByte(); - } -} - a1c: df 91 pop r29 - a1e: cf 91 pop r28 - a20: 1f 91 pop r17 - a22: 08 95 ret - -00000a24 : - -void RandomTick(void) -{ - rand(); - a24: 0e 94 c8 25 call 0x4b90 ; 0x4b90 - rand(); - a28: 0e 94 c8 25 call 0x4b90 ; 0x4b90 - rand(); - a2c: 0e 94 c8 25 call 0x4b90 ; 0x4b90 - rand(); - a30: 0c 94 c8 25 jmp 0x4b90 ; 0x4b90 - -00000a34 : - */ - -#include "Common.h" - -uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) -{ - a34: cf 93 push r28 - a36: df 93 push r29 - a38: dc 01 movw r26, r24 - uint8_t* ByteBuffer = (uint8_t*) Buffer; - uint16_t CharCount = 0; - - /* Account for '\0' at the end */ - MaxChars--; - a3a: 61 50 subi r22, 0x01 ; 1 - a3c: 71 09 sbc r23, r1 - - while( (ByteCount > 0) && (MaxChars >= 2) ) { - a3e: 21 15 cp r18, r1 - a40: 31 05 cpc r19, r1 - a42: 99 f1 breq .+102 ; 0xaaa - a44: 62 30 cpi r22, 0x02 ; 2 - a46: 71 05 cpc r23, r1 - a48: 80 f1 brcs .+96 ; 0xaaa - a4a: fa 01 movw r30, r20 - * policies, either expressed or implied, of the ORIGINAL AUTHORS. - */ - -#include "Common.h" - -uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) - a4c: 24 0f add r18, r20 - a4e: 35 1f adc r19, r21 - a50: 21 50 subi r18, 0x01 ; 1 - a52: 31 09 sbc r19, r1 -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - uint16_t CharCount = 0; - a54: 40 e0 ldi r20, 0x00 ; 0 - a56: 50 e0 ldi r21, 0x00 ; 0 - a58: 17 c0 rjmp .+46 ; 0xa88 - MaxChars--; - - while( (ByteCount > 0) && (MaxChars >= 2) ) { - uint8_t Byte = *ByteBuffer; - - HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - a5a: d0 5d subi r29, 0xD0 ; 208 - a5c: dc 93 st X, r29 - HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - a5e: cf 70 andi r28, 0x0F ; 15 - a60: 8c 2f mov r24, r28 - a62: 90 e0 ldi r25, 0x00 ; 0 - a64: 0a 97 sbiw r24, 0x0a ; 10 - a66: fc f4 brge .+62 ; 0xaa6 - a68: c0 5d subi r28, 0xD0 ; 208 - a6a: 11 96 adiw r26, 0x01 ; 1 - a6c: cc 93 st X, r28 - a6e: 11 97 sbiw r26, 0x01 ; 1 - - HexOut += 2; - a70: 12 96 adiw r26, 0x02 ; 2 - MaxChars -= 2; - a72: 62 50 subi r22, 0x02 ; 2 - a74: 71 09 sbc r23, r1 - CharCount += 2; - a76: 4e 5f subi r20, 0xFE ; 254 - a78: 5f 4f sbci r21, 0xFF ; 255 - uint16_t CharCount = 0; - - /* Account for '\0' at the end */ - MaxChars--; - - while( (ByteCount > 0) && (MaxChars >= 2) ) { - a7a: e2 17 cp r30, r18 - a7c: f3 07 cpc r31, r19 - a7e: b9 f0 breq .+46 ; 0xaae - a80: 31 96 adiw r30, 0x01 ; 1 - a82: 62 30 cpi r22, 0x02 ; 2 - a84: 71 05 cpc r23, r1 - a86: 98 f0 brcs .+38 ; 0xaae - uint8_t Byte = *ByteBuffer; - a88: c0 81 ld r28, Z - - HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - a8a: dc 2f mov r29, r28 - a8c: d2 95 swap r29 - a8e: df 70 andi r29, 0x0F ; 15 - a90: 8d 2f mov r24, r29 - a92: 90 e0 ldi r25, 0x00 ; 0 - a94: 0a 97 sbiw r24, 0x0a ; 10 - a96: 0c f3 brlt .-62 ; 0xa5a - a98: d9 5c subi r29, 0xC9 ; 201 - a9a: dc 93 st X, r29 - HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - a9c: cf 70 andi r28, 0x0F ; 15 - a9e: 8c 2f mov r24, r28 - aa0: 90 e0 ldi r25, 0x00 ; 0 - aa2: 0a 97 sbiw r24, 0x0a ; 10 - aa4: 0c f3 brlt .-62 ; 0xa68 - aa6: c9 5c subi r28, 0xC9 ; 201 - aa8: e0 cf rjmp .-64 ; 0xa6a -#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; - aaa: 40 e0 ldi r20, 0x00 ; 0 - aac: 50 e0 ldi r21, 0x00 ; 0 - CharCount += 2; - ByteBuffer++; - ByteCount -= 1; - } - - *HexOut = '\0'; - aae: 1c 92 st X, r1 - - return CharCount; -} - ab0: ca 01 movw r24, r20 - ab2: df 91 pop r29 - ab4: cf 91 pop r28 - ab6: 08 95 ret - -00000ab8 : - -uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) -{ - ab8: fa 01 movw r30, r20 - uint8_t* ByteBuffer = (uint8_t*) Buffer; - uint16_t ByteCount = 0; - - while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - aba: 40 81 ld r20, Z - abc: 44 23 and r20, r20 - abe: f1 f1 breq .+124 ; 0xb3c - ac0: 51 81 ldd r21, Z+1 ; 0x01 - ac2: 55 23 and r21, r21 - ac4: d9 f1 breq .+118 ; 0xb3c - ac6: 61 15 cp r22, r1 - ac8: 71 05 cpc r23, r1 - aca: c1 f1 breq .+112 ; 0xb3c - acc: dc 01 movw r26, r24 - ace: 20 e0 ldi r18, 0x00 ; 0 - ad0: 30 e0 ldi r19, 0x00 ; 0 - ad2: 13 c0 rjmp .+38 ; 0xafa - if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { - uint8_t Byte = 0; - - Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - ad4: 42 95 swap r20 - ad6: 40 7f andi r20, 0xF0 ; 240 - Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - ad8: 51 34 cpi r21, 0x41 ; 65 - ada: 28 f5 brcc .+74 ; 0xb26 - adc: 58 2f mov r21, r24 - ade: 45 2b or r20, r21 - - *ByteBuffer = Byte; - ae0: 4d 93 st X+, r20 - - ByteBuffer++; - MaxBytes--; - ByteCount++; - ae2: 2f 5f subi r18, 0xFF ; 255 - ae4: 3f 4f sbci r19, 0xFF ; 255 - HexIn += 2; - ae6: 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) ) { - ae8: 40 81 ld r20, Z - aea: 44 23 and r20, r20 - aec: 29 f1 breq .+74 ; 0xb38 - aee: 51 81 ldd r21, Z+1 ; 0x01 - af0: 55 23 and r21, r21 - af2: 21 f1 breq .+72 ; 0xb3c - af4: 62 17 cp r22, r18 - af6: 73 07 cpc r23, r19 - af8: f9 f0 breq .+62 ; 0xb38 - if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { - afa: 84 2f mov r24, r20 - afc: 80 53 subi r24, 0x30 ; 48 - afe: 8a 30 cpi r24, 0x0A ; 10 - b00: 18 f0 brcs .+6 ; 0xb08 - b02: 81 51 subi r24, 0x11 ; 17 - b04: 86 30 cpi r24, 0x06 ; 6 - b06: d0 f4 brcc .+52 ; 0xb3c - b08: 85 2f mov r24, r21 - b0a: 80 53 subi r24, 0x30 ; 48 - b0c: 8a 30 cpi r24, 0x0A ; 10 - b0e: 20 f0 brcs .+8 ; 0xb18 - b10: 95 2f mov r25, r21 - b12: 91 54 subi r25, 0x41 ; 65 - b14: 96 30 cpi r25, 0x06 ; 6 - b16: 90 f4 brcc .+36 ; 0xb3c - uint8_t Byte = 0; - - Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - b18: 41 34 cpi r20, 0x41 ; 65 - b1a: e0 f2 brcs .-72 ; 0xad4 - b1c: 42 95 swap r20 - b1e: 40 7f andi r20, 0xF0 ; 240 - b20: 40 57 subi r20, 0x70 ; 112 - Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - b22: 51 34 cpi r21, 0x41 ; 65 - b24: d8 f2 brcs .-74 ; 0xadc - b26: 57 53 subi r21, 0x37 ; 55 - b28: 45 2b or r20, r21 - - *ByteBuffer = Byte; - b2a: 4d 93 st X+, r20 - - ByteBuffer++; - MaxBytes--; - ByteCount++; - b2c: 2f 5f subi r18, 0xFF ; 255 - b2e: 3f 4f sbci r19, 0xFF ; 255 - HexIn += 2; - b30: 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) ) { - b32: 40 81 ld r20, Z - b34: 41 11 cpse r20, r1 - b36: db cf rjmp .-74 ; 0xaee - /* Odd number of characters */ - return 0; - } - - return ByteCount; -} - b38: c9 01 movw r24, r18 - b3a: 08 95 ret - } - } - - if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { - /* Odd number of characters */ - return 0; - b3c: 20 e0 ldi r18, 0x00 ; 0 - b3e: 30 e0 ldi r19, 0x00 ; 0 - } - - return ByteCount; -} - b40: c9 01 movw r24, r18 - b42: 08 95 ret - -00000b44 : - MemoryRecall(); -} - -void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) -{ - uint8_t* SrcPtr = &Memory[Address]; - b44: fb 01 movw r30, r22 - b46: ee 56 subi r30, 0x6E ; 110 - b48: ff 4d sbci r31, 0xDF ; 223 - uint8_t* DstPtr = (uint8_t*) Buffer; - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - b4a: a0 e0 ldi r26, 0x00 ; 0 - b4c: b4 e0 ldi r27, 0x04 ; 4 - b4e: a6 1b sub r26, r22 - b50: b7 0b sbc r27, r23 - b52: 9a 01 movw r18, r20 - b54: a4 17 cp r26, r20 - b56: b5 07 cpc r27, r21 - b58: 08 f4 brcc .+2 ; 0xb5c - b5a: 9d 01 movw r18, r26 - - while(ByteCount--) { - b5c: 21 15 cp r18, r1 - b5e: 31 05 cpc r19, r1 - b60: 41 f0 breq .+16 ; 0xb72 - - /* Load permanent flash contents to memory at startup */ - MemoryRecall(); -} - -void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) - b62: 2e 0f add r18, r30 - b64: 3f 1f adc r19, r31 -{ - uint8_t* SrcPtr = &Memory[Address]; - uint8_t* DstPtr = (uint8_t*) Buffer; - b66: dc 01 movw r26, r24 - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - - while(ByteCount--) { - *DstPtr++ = *SrcPtr++; - b68: 81 91 ld r24, Z+ - b6a: 8d 93 st X+, r24 - uint8_t* DstPtr = (uint8_t*) Buffer; - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - - while(ByteCount--) { - b6c: e2 17 cp r30, r18 - b6e: f3 07 cpc r31, r19 - b70: d9 f7 brne .-10 ; 0xb68 - b72: 08 95 ret - -00000b74 : -} - -void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) -{ - uint8_t* SrcPtr = (uint8_t*) Buffer; - uint8_t* DstPtr = &Memory[Address]; - b74: db 01 movw r26, r22 - b76: ae 56 subi r26, 0x6E ; 110 - b78: bf 4d sbci r27, 0xDF ; 223 - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - b7a: e0 e0 ldi r30, 0x00 ; 0 - b7c: f4 e0 ldi r31, 0x04 ; 4 - b7e: e6 1b sub r30, r22 - b80: f7 0b sbc r31, r23 - b82: 9a 01 movw r18, r20 - b84: e4 17 cp r30, r20 - b86: f5 07 cpc r31, r21 - b88: 08 f4 brcc .+2 ; 0xb8c - b8a: 9f 01 movw r18, r30 - - while(ByteCount--) { - b8c: 21 15 cp r18, r1 - b8e: 31 05 cpc r19, r1 - b90: 49 f0 breq .+18 ; 0xba4 - b92: fc 01 movw r30, r24 - while(ByteCount--) { - *DstPtr++ = *SrcPtr++; - } -} - -void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) - b94: c9 01 movw r24, r18 - b96: 8e 0f add r24, r30 - b98: 9f 1f adc r25, r31 - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - - while(ByteCount--) { - *DstPtr++ = *SrcPtr++; - b9a: 21 91 ld r18, Z+ - b9c: 2d 93 st X+, r18 - uint8_t* DstPtr = &Memory[Address]; - - /* Prevent Buf Ovfs */ - ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); - - while(ByteCount--) { - b9e: e8 17 cp r30, r24 - ba0: f9 07 cpc r31, r25 - ba2: d9 f7 brne .-10 ; 0xb9a - ba4: 08 95 ret - -00000ba6 : - *DstPtr++ = *SrcPtr++; - } -} - -void MemoryClear(void) -{ - ba6: e2 e9 ldi r30, 0x92 ; 146 - ba8: f0 e2 ldi r31, 0x20 ; 32 - for (uint16_t i=0; i - Memory[i] = 0; - } -} - bb4: 08 95 ret - -00000bb6 : - -void MemoryRecall(void) -{ - /* Recall memory from permanent flash */ - FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); - bb6: 80 91 fd 24 lds r24, 0x24FD - bba: 90 e0 ldi r25, 0x00 ; 0 - bbc: a0 e0 ldi r26, 0x00 ; 0 - bbe: b0 e0 ldi r27, 0x00 ; 0 - bc0: 4a e0 ldi r20, 0x0A ; 10 - bc2: 88 0f add r24, r24 - bc4: 99 1f adc r25, r25 - bc6: aa 1f adc r26, r26 - bc8: bb 1f adc r27, r27 - bca: 4a 95 dec r20 - bcc: d1 f7 brne .-12 ; 0xbc2 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bce: 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; - bd0: 57 ed ldi r21, 0xD7 ; 215 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - bd2: 30 e4 ldi r19, 0x40 ; 64 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bd4: 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; - bd8: 50 93 a0 09 sts 0x09A0, r21 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bdc: 20 91 a1 09 lds r18, 0x09A1 - be0: 26 ff sbrs r18, 6 - be2: fc cf rjmp .-8 ; 0xbdc - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - be4: 30 93 a1 09 sts 0x09A1, r19 - - return MEMORY_FLASH_USART.DATA; - be8: 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; - bec: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bf0: 20 91 a1 09 lds r18, 0x09A1 - bf4: 26 ff sbrs r18, 6 - bf6: fc cf rjmp .-8 ; 0xbf0 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - bf8: 30 93 a1 09 sts 0x09A1, r19 - - return MEMORY_FLASH_USART.DATA; - bfc: 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; - c00: 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()); - c04: 27 ff sbrs r18, 7 - c06: e6 cf rjmp .-52 ; 0xbd4 - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - c08: 20 e1 ldi r18, 0x10 ; 16 - c0a: 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; - c0e: 23 e0 ldi r18, 0x03 ; 3 - c10: 20 93 a0 09 sts 0x09A0, r18 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c14: 20 91 a1 09 lds r18, 0x09A1 - c18: 26 ff sbrs r18, 6 - c1a: fc cf rjmp .-8 ; 0xc14 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c1c: 20 e4 ldi r18, 0x40 ; 64 - c1e: 20 93 a1 09 sts 0x09A1, r18 - - return MEMORY_FLASH_USART.DATA; - c22: 20 91 a0 09 lds r18, 0x09A0 -{ - while(FlashIsBusy()); - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - SPITransferByte(0x03); - SPITransferByte( (Address >> 16) & 0xFF ); - c26: ad 01 movw r20, r26 - c28: 66 27 eor r22, r22 - c2a: 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; - c2c: 40 93 a0 09 sts 0x09A0, r20 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c30: 20 91 a1 09 lds r18, 0x09A1 - c34: 26 ff sbrs r18, 6 - c36: fc cf rjmp .-8 ; 0xc30 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c38: 20 e4 ldi r18, 0x40 ; 64 - c3a: 20 93 a1 09 sts 0x09A1, r18 - - return MEMORY_FLASH_USART.DATA; - c3e: 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 ); - c42: 89 2f mov r24, r25 - c44: 9a 2f mov r25, r26 - c46: ab 2f mov r26, r27 - c48: 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; - c4a: 80 93 a0 09 sts 0x09A0, r24 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c4e: 80 91 a1 09 lds r24, 0x09A1 - c52: 86 ff sbrs r24, 6 - c54: fc cf rjmp .-8 ; 0xc4e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c56: 80 e4 ldi r24, 0x40 ; 64 - c58: 80 93 a1 09 sts 0x09A1, r24 - - return MEMORY_FLASH_USART.DATA; - c5c: 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; - c60: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c64: 80 91 a1 09 lds r24, 0x09A1 - c68: 86 ff sbrs r24, 6 - c6a: fc cf rjmp .-8 ; 0xc64 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c6c: 80 e4 ldi r24, 0x40 ; 64 - c6e: 80 93 a1 09 sts 0x09A1, r24 - - return MEMORY_FLASH_USART.DATA; - c72: 80 91 a0 09 lds r24, 0x09A0 -} - -INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - c76: e2 e9 ldi r30, 0x92 ; 146 - c78: 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; - c7a: 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; - c7c: 10 92 a0 09 sts 0x09A0, r1 - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c80: 80 91 a1 09 lds r24, 0x09A1 - c84: 86 ff sbrs r24, 6 - c86: fc cf rjmp .-8 ; 0xc80 - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c88: 90 93 a1 09 sts 0x09A1, r25 - *ByteBuffer++ = MEMORY_FLASH_USART.DATA; - c8c: 80 91 a0 09 lds r24, 0x09A0 - c90: 81 93 st Z+, r24 - -INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - - while(ByteCount-- > 0) { - c92: 84 e2 ldi r24, 0x24 ; 36 - c94: e2 39 cpi r30, 0x92 ; 146 - c96: f8 07 cpc r31, r24 - c98: 89 f7 brne .-30 ; 0xc7c - SPITransferByte(0x03); - SPITransferByte( (Address >> 16) & 0xFF ); - SPITransferByte( (Address >> 8) & 0xFF ); - SPITransferByte( (Address >> 0) & 0xFF ); - SPIReadBlock(Buffer, ByteCount); - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - c9a: 80 e1 ldi r24, 0x10 ; 16 - c9c: 80 93 65 06 sts 0x0665, r24 - ca0: 08 95 ret - -00000ca2 : - SPITransferByte( 0 ); - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -void MemoryInit(void) -{ - ca2: cf 93 push r28 - ca4: df 93 push r29 - ca6: 00 d0 rcall .+0 ; 0xca8 - ca8: 00 d0 rcall .+0 ; 0xcaa - caa: cd b7 in r28, 0x3d ; 61 - cac: 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; - cae: 80 e1 ldi r24, 0x10 ; 16 - cb0: 80 93 65 06 sts 0x0665, r24 - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_SCK; - cb4: 92 e0 ldi r25, 0x02 ; 2 - cb6: 90 93 66 06 sts 0x0666, r25 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_MOSI; - cba: 98 e0 ldi r25, 0x08 ; 8 - cbc: 90 93 65 06 sts 0x0665, r25 - - MEMORY_FLASH_PORT.DIRSET = MEMORY_FLASH_SCK | MEMORY_FLASH_MOSI | MEMORY_FLASH_CS; - cc0: 9a e1 ldi r25, 0x1A ; 26 - cc2: 90 93 61 06 sts 0x0661, r25 - - MEMORY_FLASH_USART.BAUDCTRLA = 0; - cc6: 10 92 a6 09 sts 0x09A6, r1 - MEMORY_FLASH_USART.BAUDCTRLB = 0; - cca: 10 92 a7 09 sts 0x09A7, r1 - MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; - cce: 90 ec ldi r25, 0xC0 ; 192 - cd0: 90 93 a5 09 sts 0x09A5, r25 - MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; - cd4: 98 e1 ldi r25, 0x18 ; 24 - cd6: 90 93 a4 09 sts 0x09A4, r25 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - cda: 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; - cde: 87 ed ldi r24, 0xD7 ; 215 - ce0: 80 93 a0 09 sts 0x09A0, r24 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ce4: 80 91 a1 09 lds r24, 0x09A1 - ce8: 86 ff sbrs r24, 6 - cea: fc cf rjmp .-8 ; 0xce4 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - cec: 80 e4 ldi r24, 0x40 ; 64 - cee: 80 93 a1 09 sts 0x09A1, r24 - - return MEMORY_FLASH_USART.DATA; - cf2: 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; - cf6: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - cfa: 80 91 a1 09 lds r24, 0x09A1 - cfe: 86 ff sbrs r24, 6 - d00: fc cf rjmp .-8 ; 0xcfa - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d02: 80 e4 ldi r24, 0x40 ; 64 - d04: 80 93 a1 09 sts 0x09A1, r24 - - return MEMORY_FLASH_USART.DATA; - d08: 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; - d0c: 90 e1 ldi r25, 0x10 ; 16 - d0e: 90 93 65 06 sts 0x0665, r25 - MEMORY_FLASH_USART.BAUDCTRLB = 0; - MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; - MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; - - - if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { - d12: 80 fd sbrc r24, 0 - d14: 3e c0 rjmp .+124 ; 0xd92 - return !(FlashReadStatusRegister() & FLASH_STATUS_REG_READY_BIT); -} - -INLINE void FlashConfigurePageSize(void) -{ - uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; - d16: 8d e3 ldi r24, 0x3D ; 61 - d18: 89 83 std Y+1, r24 ; 0x01 - d1a: 8a e2 ldi r24, 0x2A ; 42 - d1c: 8a 83 std Y+2, r24 ; 0x02 - d1e: 80 e8 ldi r24, 0x80 ; 128 - d20: 8b 83 std Y+3, r24 ; 0x03 - d22: 86 ea ldi r24, 0xA6 ; 166 - d24: 8c 83 std Y+4, r24 ; 0x04 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - d26: 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; - d28: 37 ed ldi r19, 0xD7 ; 215 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d2a: 90 e4 ldi r25, 0x40 ; 64 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - d2c: 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; - d30: 30 93 a0 09 sts 0x09A0, r19 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d34: 80 91 a1 09 lds r24, 0x09A1 - d38: 86 ff sbrs r24, 6 - d3a: fc cf rjmp .-8 ; 0xd34 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d3c: 90 93 a1 09 sts 0x09A1, r25 - - return MEMORY_FLASH_USART.DATA; - d40: 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; - d44: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d48: 80 91 a1 09 lds r24, 0x09A1 - d4c: 86 ff sbrs r24, 6 - d4e: fc cf rjmp .-8 ; 0xd48 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d50: 90 93 a1 09 sts 0x09A1, r25 - - return MEMORY_FLASH_USART.DATA; - d54: 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; - d58: 20 93 65 06 sts 0x0665, r18 - -INLINE void FlashConfigurePageSize(void) -{ - uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; - - while(FlashIsBusy()); - d5c: 87 ff sbrs r24, 7 - d5e: e6 cf rjmp .-52 ; 0xd2c - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - d60: 80 e1 ldi r24, 0x10 ; 16 - d62: 80 93 66 06 sts 0x0666, r24 - } -} - -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - d66: fe 01 movw r30, r28 - d68: 31 96 adiw r30, 0x01 ; 1 - d6a: ce 01 movw r24, r28 - d6c: 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; - d6e: 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++; - d70: 21 91 ld r18, Z+ - d72: 20 93 a0 09 sts 0x09A0, r18 - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d76: 20 91 a1 09 lds r18, 0x09A1 - d7a: 26 ff sbrs r18, 6 - d7c: fc cf rjmp .-8 ; 0xd76 - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d7e: 30 93 a1 09 sts 0x09A1, r19 - MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - d82: 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) { - d86: e8 17 cp r30, r24 - d88: f9 07 cpc r31, r25 - d8a: 91 f7 brne .-28 ; 0xd70 - - while(FlashIsBusy()); - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - SPIWriteBlock(Sequence, sizeof(Sequence)); - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - d8c: 80 e1 ldi r24, 0x10 ; 16 - d8e: 80 93 65 06 sts 0x0665, r24 - FlashConfigurePageSize(); - } - - /* Load permanent flash contents to memory at startup */ - MemoryRecall(); -} - d92: 24 96 adiw r28, 0x04 ; 4 - d94: cd bf out 0x3d, r28 ; 61 - d96: de bf out 0x3e, r29 ; 62 - d98: df 91 pop r29 - d9a: cf 91 pop r28 - /* Configure for 256 byte Dataflash if not already done. */ - FlashConfigurePageSize(); - } - - /* Load permanent flash contents to memory at startup */ - MemoryRecall(); - d9c: 0c cf rjmp .-488 ; 0xbb6 - -00000d9e : - /* Recall memory from permanent flash */ - FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - -void MemoryStore(void) -{ - d9e: 4f 92 push r4 - da0: 5f 92 push r5 - da2: 6f 92 push r6 - da4: 7f 92 push r7 - da6: 8f 92 push r8 - da8: 9f 92 push r9 - daa: af 92 push r10 - dac: bf 92 push r11 - dae: cf 92 push r12 - db0: df 92 push r13 - db2: ef 92 push r14 - db4: ff 92 push r15 - db6: 0f 93 push r16 - db8: 1f 93 push r17 - dba: cf 93 push r28 - dbc: df 93 push r29 - /* Store current memory into permanent flash */ - FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); - dbe: 80 91 fd 24 lds r24, 0x24FD - dc2: 90 e0 ldi r25, 0x00 ; 0 - dc4: a0 e0 ldi r26, 0x00 ; 0 - dc6: b0 e0 ldi r27, 0x00 ; 0 - dc8: 6a e0 ldi r22, 0x0A ; 10 - dca: 88 0f add r24, r24 - dcc: 99 1f adc r25, r25 - dce: aa 1f adc r26, r26 - dd0: bb 1f adc r27, r27 - dd2: 6a 95 dec r22 - dd4: d1 f7 brne .-12 ; 0xdca - dd6: 00 e0 ldi r16, 0x00 ; 0 - dd8: 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); - dda: e1 2c mov r14, r1 - ddc: ff 24 eor r15, r15 - dde: f3 94 inc r15 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - de0: e0 e1 ldi r30, 0x10 ; 16 - de2: 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; - de4: f7 ed ldi r31, 0xD7 ; 215 - de6: bf 2e mov r11, r31 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - de8: c0 e4 ldi r28, 0x40 ; 64 - dea: dc 2e mov r13, r28 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - dec: d0 e1 ldi r29, 0x10 ; 16 - dee: 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; - df0: 27 ed ldi r18, 0xD7 ; 215 - df2: 92 2e mov r9, r18 - df4: 33 e5 ldi r19, 0x53 ; 83 - df6: 43 2e mov r4, r19 - df8: 44 e8 ldi r20, 0x84 ; 132 - dfa: 54 2e mov r5, r20 - dfc: 53 e8 ldi r21, 0x83 ; 131 - dfe: 65 2e mov r6, r21 -} - -INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) -{ - while(ByteCount > 0) { - uint16_t PageAddress = Address / FLASH_PAGE_SIZE; - e00: 49 2f mov r20, r25 - e02: 5a 2f mov r21, r26 - e04: 6b 2f mov r22, r27 - e06: 77 27 eor r23, r23 - e08: 85 2e mov r8, r21 - uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; - e0a: 38 2f mov r19, r24 - uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - e0c: e7 01 movw r28, r14 - e0e: c8 1b sub r28, r24 - e10: d1 09 sbc r29, r1 - e12: 0c 17 cp r16, r28 - e14: 1d 07 cpc r17, r29 - e16: 08 f4 brcc .+2 ; 0xe1a - e18: e8 01 movw r28, r16 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e1a: 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; - e1e: 90 92 a0 09 sts 0x09A0, r9 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e22: 20 91 a1 09 lds r18, 0x09A1 - e26: 26 ff sbrs r18, 6 - e28: fc cf rjmp .-8 ; 0xe22 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e2a: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - e2e: 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; - e32: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e36: 20 91 a1 09 lds r18, 0x09A1 - e3a: 26 ff sbrs r18, 6 - e3c: fc cf rjmp .-8 ; 0xe36 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e3e: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - e42: 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; - e46: c0 92 65 06 sts 0x0665, r12 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -INLINE void FlashMemoryToBuffer(uint16_t PageAddress) -{ - while(FlashIsBusy()); - e4a: 27 ff sbrs r18, 7 - e4c: e6 cf rjmp .-52 ; 0xe1a - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e4e: 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; - e52: 40 92 a0 09 sts 0x09A0, r4 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e56: 20 91 a1 09 lds r18, 0x09A1 - e5a: 26 ff sbrs r18, 6 - e5c: fc cf rjmp .-8 ; 0xe56 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e5e: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - e62: 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; - e66: 80 92 a0 09 sts 0x09A0, r8 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e6a: 20 91 a1 09 lds r18, 0x09A1 - e6e: 26 ff sbrs r18, 6 - e70: fc cf rjmp .-8 ; 0xe6a - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e72: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - e76: 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 ); - e7a: 74 2e mov r7, r20 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - e7c: 40 93 a0 09 sts 0x09A0, r20 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e80: 20 91 a1 09 lds r18, 0x09A1 - e84: 26 ff sbrs r18, 6 - e86: fc cf rjmp .-8 ; 0xe80 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e88: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - e8c: 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; - e90: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e94: 20 91 a1 09 lds r18, 0x09A1 - e98: 26 ff sbrs r18, 6 - e9a: fc cf rjmp .-8 ; 0xe94 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e9c: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - ea0: 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; - ea4: c0 92 65 06 sts 0x0665, r12 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - ea8: 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; - eac: b0 92 a0 09 sts 0x09A0, r11 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - eb0: 20 91 a1 09 lds r18, 0x09A1 - eb4: 26 ff sbrs r18, 6 - eb6: fc cf rjmp .-8 ; 0xeb0 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - eb8: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - ebc: 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; - ec0: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ec4: 20 91 a1 09 lds r18, 0x09A1 - ec8: 26 ff sbrs r18, 6 - eca: fc cf rjmp .-8 ; 0xec4 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ecc: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - ed0: 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; - ed4: 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()); - ed8: 27 ff sbrs r18, 7 - eda: e6 cf rjmp .-52 ; 0xea8 - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - edc: 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; - ee0: 50 92 a0 09 sts 0x09A0, r5 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ee4: 20 91 a1 09 lds r18, 0x09A1 - ee8: 26 ff sbrs r18, 6 - eea: fc cf rjmp .-8 ; 0xee4 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - eec: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - ef0: 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; - ef4: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ef8: 20 91 a1 09 lds r18, 0x09A1 - efc: 26 ff sbrs r18, 6 - efe: fc cf rjmp .-8 ; 0xef8 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f00: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - f04: 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; - f08: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f0c: 20 91 a1 09 lds r18, 0x09A1 - f10: 26 ff sbrs r18, 6 - f12: fc cf rjmp .-8 ; 0xf0c - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f14: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - f18: 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; - f1c: 30 93 a0 09 sts 0x09A0, r19 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f20: 20 91 a1 09 lds r18, 0x09A1 - f24: 26 ff sbrs r18, 6 - f26: fc cf rjmp .-8 ; 0xf20 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f28: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - f2c: 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) { - f30: 20 97 sbiw r28, 0x00 ; 0 - f32: 99 f0 breq .+38 ; 0xf5a -{ - /* Recall memory from permanent flash */ - FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - -void MemoryStore(void) - f34: 9e 01 movw r18, r28 - f36: 2e 56 subi r18, 0x6E ; 110 - f38: 3f 4d sbci r19, 0xDF ; 223 - } -} - -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - f3a: e2 e9 ldi r30, 0x92 ; 146 - f3c: f0 e2 ldi r31, 0x20 ; 32 - - while(ByteCount-- > 0) { - MEMORY_FLASH_USART.DATA = *ByteBuffer++; - f3e: 41 91 ld r20, Z+ - f40: 40 93 a0 09 sts 0x09A0, r20 - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f44: 40 91 a1 09 lds r20, 0x09A1 - f48: 46 ff sbrs r20, 6 - f4a: fc cf rjmp .-8 ; 0xf44 - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f4c: d0 92 a1 09 sts 0x09A1, r13 - MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - f50: 40 91 a0 09 lds r20, 0x09A0 - -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - - while(ByteCount-- > 0) { - f54: e2 17 cp r30, r18 - f56: f3 07 cpc r31, r19 - f58: 91 f7 brne .-28 ; 0xf3e - SPITransferByte(FLASH_CMD_BUF1_WRITE); - SPITransferByte( 0 ); - SPITransferByte( 0 ); - SPITransferByte( Address ); - SPIWriteBlock(Buffer, ByteCount); - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f5a: c0 92 65 06 sts 0x0665, r12 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f5e: 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; - f62: b0 92 a0 09 sts 0x09A0, r11 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f66: 20 91 a1 09 lds r18, 0x09A1 - f6a: 26 ff sbrs r18, 6 - f6c: fc cf rjmp .-8 ; 0xf66 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f6e: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - f72: 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; - f76: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f7a: 20 91 a1 09 lds r18, 0x09A1 - f7e: 26 ff sbrs r18, 6 - f80: fc cf rjmp .-8 ; 0xf7a - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f82: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - f86: 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; - f8a: c0 92 65 06 sts 0x0665, r12 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -INLINE void FlashBufferToMemory(uint16_t PageAddress) -{ - while(FlashIsBusy()); - f8e: 27 ff sbrs r18, 7 - f90: e6 cf rjmp .-52 ; 0xf5e - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f92: 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; - f96: 60 92 a0 09 sts 0x09A0, r6 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f9a: 20 91 a1 09 lds r18, 0x09A1 - f9e: 26 ff sbrs r18, 6 - fa0: fc cf rjmp .-8 ; 0xf9a - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fa2: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - fa6: 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; - faa: 80 92 a0 09 sts 0x09A0, r8 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fae: 20 91 a1 09 lds r18, 0x09A1 - fb2: 26 ff sbrs r18, 6 - fb4: fc cf rjmp .-8 ; 0xfae - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fb6: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - fba: 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; - fbe: 70 92 a0 09 sts 0x09A0, r7 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fc2: 20 91 a1 09 lds r18, 0x09A1 - fc6: 26 ff sbrs r18, 6 - fc8: fc cf rjmp .-8 ; 0xfc2 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fca: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - fce: 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; - fd2: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fd6: 20 91 a1 09 lds r18, 0x09A1 - fda: 26 ff sbrs r18, 6 - fdc: fc cf rjmp .-8 ; 0xfd6 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fde: d0 92 a1 09 sts 0x09A1, r13 - - return MEMORY_FLASH_USART.DATA; - fe2: 20 91 a0 09 lds r18, 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; - fe6: c0 92 65 06 sts 0x0665, r12 - - FlashMemoryToBuffer(PageAddress); - FlashWriteBuffer(Buffer, ByteAddress, PageBytes); - FlashBufferToMemory(PageAddress); - - ByteCount -= PageBytes; - fea: 0c 1b sub r16, r28 - fec: 1d 0b sbc r17, r29 - Address += PageBytes; - fee: 8c 0f add r24, r28 - ff0: 9d 1f adc r25, r29 - ff2: a1 1d adc r26, r1 - ff4: 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) { - ff6: 01 15 cp r16, r1 - ff8: 11 05 cpc r17, r1 - ffa: 09 f0 breq .+2 ; 0xffe - ffc: 01 cf rjmp .-510 ; 0xe00 - -void MemoryStore(void) -{ - /* Store current memory into permanent flash */ - FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - ffe: df 91 pop r29 - 1000: cf 91 pop r28 - 1002: 1f 91 pop r17 - 1004: 0f 91 pop r16 - 1006: ff 90 pop r15 - 1008: ef 90 pop r14 - 100a: df 90 pop r13 - 100c: cf 90 pop r12 - 100e: bf 90 pop r11 - 1010: af 90 pop r10 - 1012: 9f 90 pop r9 - 1014: 8f 90 pop r8 - 1016: 7f 90 pop r7 - 1018: 6f 90 pop r6 - 101a: 5f 90 pop r5 - 101c: 4f 90 pop r4 - 101e: 08 95 ret - -00001020 : - -bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) -{ - 1020: 2f 92 push r2 - 1022: 3f 92 push r3 - 1024: 4f 92 push r4 - 1026: 5f 92 push r5 - 1028: 6f 92 push r6 - 102a: 7f 92 push r7 - 102c: 8f 92 push r8 - 102e: 9f 92 push r9 - 1030: af 92 push r10 - 1032: bf 92 push r11 - 1034: cf 92 push r12 - 1036: df 92 push r13 - 1038: ef 92 push r14 - 103a: ff 92 push r15 - 103c: 0f 93 push r16 - 103e: 1f 93 push r17 - 1040: cf 93 push r28 - 1042: df 93 push r29 - 1044: cd b7 in r28, 0x3d ; 61 - 1046: de b7 in r29, 0x3e ; 62 - 1048: 2e 97 sbiw r28, 0x0e ; 14 - 104a: cd bf out 0x3d, r28 ; 61 - 104c: de bf out 0x3e, r29 ; 62 - 104e: f9 01 movw r30, r18 - if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 1050: 41 15 cp r20, r1 - 1052: 24 e0 ldi r18, 0x04 ; 4 - 1054: 52 07 cpc r21, r18 - 1056: 61 05 cpc r22, r1 - 1058: 71 05 cpc r23, r1 - 105a: 08 f0 brcs .+2 ; 0x105e - 105c: a6 c1 rjmp .+844 ; 0x13aa - /* 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.ActiveSetting * MEMORY_SIZE_PER_SETTING; - 105e: 00 91 fd 24 lds r16, 0x24FD - 1062: 10 e0 ldi r17, 0x00 ; 0 - 1064: 20 e0 ldi r18, 0x00 ; 0 - 1066: 30 e0 ldi r19, 0x00 ; 0 - 1068: aa e0 ldi r26, 0x0A ; 10 - 106a: 00 0f add r16, r16 - 106c: 11 1f adc r17, r17 - 106e: 22 1f adc r18, r18 - 1070: 33 1f adc r19, r19 - 1072: aa 95 dec r26 - 1074: d1 f7 brne .-12 ; 0x106a - 1076: 04 0f add r16, r20 - 1078: 15 1f adc r17, r21 - 107a: 26 1f adc r18, r22 - 107c: 37 1f adc r19, 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; - 107e: c1 2c mov r12, r1 - 1080: b4 e0 ldi r27, 0x04 ; 4 - 1082: db 2e mov r13, r27 - 1084: e1 2c mov r14, r1 - 1086: f1 2c mov r15, r1 - 1088: c4 1a sub r12, r20 - 108a: d5 0a sbc r13, r21 - 108c: e6 0a sbc r14, r22 - 108e: f7 0a sbc r15, r23 - uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - ByteCount = MIN(ByteCount, BytesLeft); - 1090: 4f 01 movw r8, r30 - 1092: a1 2c mov r10, r1 - 1094: b1 2c mov r11, r1 - 1096: 8d 82 std Y+5, r8 ; 0x05 - 1098: 9e 82 std Y+6, r9 ; 0x06 - 109a: af 82 std Y+7, r10 ; 0x07 - 109c: b8 86 std Y+8, r11 ; 0x08 - 109e: c8 14 cp r12, r8 - 10a0: d9 04 cpc r13, r9 - 10a2: ea 04 cpc r14, r10 - 10a4: fb 04 cpc r15, r11 - 10a6: 08 f4 brcc .+2 ; 0x10aa - 10a8: 97 c1 rjmp .+814 ; 0x13d8 - 10aa: ad 81 ldd r26, Y+5 ; 0x05 - 10ac: be 81 ldd r27, 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) { - 10ae: 10 97 sbiw r26, 0x00 ; 0 - 10b0: 09 f4 brne .+2 ; 0x10b4 - 10b2: 7b c1 rjmp .+758 ; 0x13aa - uint16_t PageAddress = Address / FLASH_PAGE_SIZE; - uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; - uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - 10b4: e1 2c mov r14, r1 - 10b6: ff 24 eor r15, r15 - 10b8: f3 94 inc r15 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 10ba: e0 e1 ldi r30, 0x10 ; 16 - 10bc: 9e 2e mov r9, r30 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 10be: f7 ed ldi r31, 0xD7 ; 215 - 10c0: df 2e mov r13, r31 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10c2: e0 e4 ldi r30, 0x40 ; 64 - 10c4: ae 2e mov r10, r30 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 10c6: f0 e1 ldi r31, 0x10 ; 16 - 10c8: cf 2e mov r12, r31 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 10ca: e7 ed ldi r30, 0xD7 ; 215 - 10cc: 7e 2e mov r7, r30 - 10ce: f3 e5 ldi r31, 0x53 ; 83 - 10d0: 6f 2e mov r6, r31 - 10d2: e4 e8 ldi r30, 0x84 ; 132 - 10d4: 8e 2e mov r8, r30 - 10d6: f3 e8 ldi r31, 0x83 ; 131 - 10d8: bf 2e mov r11, r31 - 10da: 09 83 std Y+1, r16 ; 0x01 - 10dc: 1a 83 std Y+2, r17 ; 0x02 - 10de: 2b 83 std Y+3, r18 ; 0x03 - 10e0: 3c 83 std Y+4, r19 ; 0x04 - 10e2: ad 87 std Y+13, r26 ; 0x0d - 10e4: be 87 std Y+14, r27 ; 0x0e - 10e6: 49 87 std Y+9, r20 ; 0x09 - 10e8: 5a 87 std Y+10, r21 ; 0x0a - 10ea: 6b 87 std Y+11, r22 ; 0x0b - 10ec: 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; - 10ee: 49 81 ldd r20, Y+1 ; 0x01 - 10f0: 5a 81 ldd r21, Y+2 ; 0x02 - 10f2: 6b 81 ldd r22, Y+3 ; 0x03 - 10f4: 7c 81 ldd r23, Y+4 ; 0x04 - 10f6: 05 2f mov r16, r21 - 10f8: 16 2f mov r17, r22 - 10fa: 27 2f mov r18, r23 - 10fc: 33 27 eor r19, r19 - 10fe: 41 2f mov r20, r17 - uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; - 1100: e9 81 ldd r30, Y+1 ; 0x01 - uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); - 1102: b7 01 movw r22, r14 - 1104: 6e 1b sub r22, r30 - 1106: 71 09 sbc r23, r1 - 1108: ad 85 ldd r26, Y+13 ; 0x0d - 110a: be 85 ldd r27, Y+14 ; 0x0e - 110c: a6 17 cp r26, r22 - 110e: b7 07 cpc r27, r23 - 1110: 08 f4 brcc .+2 ; 0x1114 - 1112: bd 01 movw r22, r26 - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1114: 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; - 1118: 70 92 a0 09 sts 0x09A0, r7 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 111c: 50 91 a1 09 lds r21, 0x09A1 - 1120: 56 ff sbrs r21, 6 - 1122: fc cf rjmp .-8 ; 0x111c - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1124: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1128: 50 91 a0 09 lds r21, 0x09A0 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 112c: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1130: 50 91 a1 09 lds r21, 0x09A1 - 1134: 56 ff sbrs r21, 6 - 1136: fc cf rjmp .-8 ; 0x1130 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1138: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 113c: 50 91 a0 09 lds r21, 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; - 1140: 90 92 65 06 sts 0x0665, r9 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -INLINE void FlashMemoryToBuffer(uint16_t PageAddress) -{ - while(FlashIsBusy()); - 1144: 57 ff sbrs r21, 7 - 1146: e6 cf rjmp .-52 ; 0x1114 - 1148: ad 87 std Y+13, r26 ; 0x0d - 114a: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 114c: 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; - 1150: 60 92 a0 09 sts 0x09A0, r6 - 1154: ad 85 ldd r26, Y+13 ; 0x0d - 1156: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1158: 50 91 a1 09 lds r21, 0x09A1 - 115c: 56 ff sbrs r21, 6 - 115e: fc cf rjmp .-8 ; 0x1158 - 1160: ad 87 std Y+13, r26 ; 0x0d - 1162: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1164: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1168: 50 91 a0 09 lds r21, 0x09A0 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 116c: 40 93 a0 09 sts 0x09A0, r20 - 1170: ad 85 ldd r26, Y+13 ; 0x0d - 1172: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1174: 50 91 a1 09 lds r21, 0x09A1 - 1178: 56 ff sbrs r21, 6 - 117a: fc cf rjmp .-8 ; 0x1174 - 117c: ad 87 std Y+13, r26 ; 0x0d - 117e: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1180: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1184: 50 91 a0 09 lds r21, 0x09A0 - while(FlashIsBusy()); - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - SPITransferByte(FLASH_CMD_MEM_TO_BUF1); - SPITransferByte( (PageAddress >> 8) & 0xFF ); - SPITransferByte( (PageAddress >> 0) & 0xFF ); - 1188: 50 2f mov r21, r16 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 118a: 00 93 a0 09 sts 0x09A0, r16 - 118e: ad 85 ldd r26, Y+13 ; 0x0d - 1190: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1192: 20 91 a1 09 lds r18, 0x09A1 - 1196: 26 ff sbrs r18, 6 - 1198: fc cf rjmp .-8 ; 0x1192 - 119a: ad 87 std Y+13, r26 ; 0x0d - 119c: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 119e: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 11a2: 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; - 11a6: 10 92 a0 09 sts 0x09A0, r1 - 11aa: ad 85 ldd r26, Y+13 ; 0x0d - 11ac: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11ae: 20 91 a1 09 lds r18, 0x09A1 - 11b2: 26 ff sbrs r18, 6 - 11b4: fc cf rjmp .-8 ; 0x11ae - 11b6: ad 87 std Y+13, r26 ; 0x0d - 11b8: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 11ba: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 11be: 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; - 11c2: 90 92 65 06 sts 0x0665, r9 - 11c6: ad 85 ldd r26, Y+13 ; 0x0d - 11c8: be 85 ldd r27, Y+14 ; 0x0e - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 11ca: 90 92 66 06 sts 0x0666, r9 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 11ce: d0 92 a0 09 sts 0x09A0, r13 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11d2: 20 91 a1 09 lds r18, 0x09A1 - 11d6: 26 ff sbrs r18, 6 - 11d8: fc cf rjmp .-8 ; 0x11d2 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 11da: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 11de: 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; - 11e2: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 11e6: 20 91 a1 09 lds r18, 0x09A1 - 11ea: 26 ff sbrs r18, 6 - 11ec: fc cf rjmp .-8 ; 0x11e6 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 11ee: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 11f2: 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; - 11f6: 90 92 65 06 sts 0x0665, r9 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -INLINE void FlashWriteBuffer(const void* Buffer, uint8_t Address, uint16_t ByteCount) -{ - while(FlashIsBusy()); - 11fa: 27 ff sbrs r18, 7 - 11fc: e6 cf rjmp .-52 ; 0x11ca - 11fe: ad 87 std Y+13, r26 ; 0x0d - 1200: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1202: 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; - 1206: 80 92 a0 09 sts 0x09A0, r8 - 120a: ad 85 ldd r26, Y+13 ; 0x0d - 120c: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 120e: 20 91 a1 09 lds r18, 0x09A1 - 1212: 26 ff sbrs r18, 6 - 1214: fc cf rjmp .-8 ; 0x120e - 1216: ad 87 std Y+13, r26 ; 0x0d - 1218: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 121a: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 121e: 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; - 1222: 10 92 a0 09 sts 0x09A0, r1 - 1226: ad 85 ldd r26, Y+13 ; 0x0d - 1228: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 122a: 20 91 a1 09 lds r18, 0x09A1 - 122e: 26 ff sbrs r18, 6 - 1230: fc cf rjmp .-8 ; 0x122a - 1232: ad 87 std Y+13, r26 ; 0x0d - 1234: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1236: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 123a: 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; - 123e: 10 92 a0 09 sts 0x09A0, r1 - 1242: ad 85 ldd r26, Y+13 ; 0x0d - 1244: be 85 ldd r27, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1246: 20 91 a1 09 lds r18, 0x09A1 - 124a: 26 ff sbrs r18, 6 - 124c: fc cf rjmp .-8 ; 0x1246 - 124e: ad 87 std Y+13, r26 ; 0x0d - 1250: be 87 std Y+14, r27 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1252: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1256: 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; - 125a: e0 93 a0 09 sts 0x09A0, r30 - 125e: ed 85 ldd r30, Y+13 ; 0x0d - 1260: fe 85 ldd r31, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1262: 20 91 a1 09 lds r18, 0x09A1 - 1266: 26 ff sbrs r18, 6 - 1268: fc cf rjmp .-8 ; 0x1262 - 126a: ed 87 std Y+13, r30 ; 0x0d - 126c: fe 87 std Y+14, r31 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 126e: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1272: 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) { - 1276: 61 15 cp r22, r1 - 1278: 71 05 cpc r23, r1 - 127a: b1 f0 breq .+44 ; 0x12a8 -{ - /* Store current memory into permanent flash */ - FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - -bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 127c: 9c 01 movw r18, r24 - 127e: 26 0f add r18, r22 - 1280: 37 1f adc r19, r23 - } -} - -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - 1282: fc 01 movw r30, r24 - 1284: 0d 85 ldd r16, Y+13 ; 0x0d - 1286: 1e 85 ldd r17, Y+14 ; 0x0e - - while(ByteCount-- > 0) { - MEMORY_FLASH_USART.DATA = *ByteBuffer++; - 1288: a1 91 ld r26, Z+ - 128a: a0 93 a0 09 sts 0x09A0, r26 - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 128e: a0 91 a1 09 lds r26, 0x09A1 - 1292: a6 ff sbrs r26, 6 - 1294: fc cf rjmp .-8 ; 0x128e - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1296: a0 92 a1 09 sts 0x09A1, r10 - MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - 129a: a0 91 a0 09 lds r26, 0x09A0 - -INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) -{ - uint8_t* ByteBuffer = (uint8_t*) Buffer; - - while(ByteCount-- > 0) { - 129e: e2 17 cp r30, r18 - 12a0: f3 07 cpc r31, r19 - 12a2: 91 f7 brne .-28 ; 0x1288 - 12a4: 0d 87 std Y+13, r16 ; 0x0d - 12a6: 1e 87 std Y+14, r17 ; 0x0e - SPITransferByte(FLASH_CMD_BUF1_WRITE); - SPITransferByte( 0 ); - SPITransferByte( 0 ); - SPITransferByte( Address ); - SPIWriteBlock(Buffer, ByteCount); - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 12a8: 90 92 65 06 sts 0x0665, r9 - 12ac: ed 85 ldd r30, Y+13 ; 0x0d - 12ae: fe 85 ldd r31, Y+14 ; 0x0e - -INLINE uint8_t FlashReadStatusRegister(void) -{ - uint8_t Register; - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 12b0: 90 92 66 06 sts 0x0666, r9 - -static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - 12b4: d0 92 a0 09 sts 0x09A0, r13 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 12b8: 20 91 a1 09 lds r18, 0x09A1 - 12bc: 26 ff sbrs r18, 6 - 12be: fc cf rjmp .-8 ; 0x12b8 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 12c0: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 12c4: 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; - 12c8: 10 92 a0 09 sts 0x09A0, r1 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 12cc: 20 91 a1 09 lds r18, 0x09A1 - 12d0: 26 ff sbrs r18, 6 - 12d2: fc cf rjmp .-8 ; 0x12cc - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 12d4: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 12d8: 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; - 12dc: 90 92 65 06 sts 0x0665, r9 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -INLINE void FlashBufferToMemory(uint16_t PageAddress) -{ - while(FlashIsBusy()); - 12e0: 27 ff sbrs r18, 7 - 12e2: e6 cf rjmp .-52 ; 0x12b0 - 12e4: ed 87 std Y+13, r30 ; 0x0d - 12e6: fe 87 std Y+14, r31 ; 0x0e - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 12e8: 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; - 12ec: b0 92 a0 09 sts 0x09A0, r11 - 12f0: ed 85 ldd r30, Y+13 ; 0x0d - 12f2: fe 85 ldd r31, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 12f4: 20 91 a1 09 lds r18, 0x09A1 - 12f8: 26 ff sbrs r18, 6 - 12fa: fc cf rjmp .-8 ; 0x12f4 - 12fc: ed 87 std Y+13, r30 ; 0x0d - 12fe: fe 87 std Y+14, r31 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1300: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1304: 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; - 1308: 40 93 a0 09 sts 0x09A0, r20 - 130c: ed 85 ldd r30, Y+13 ; 0x0d - 130e: fe 85 ldd r31, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1310: 20 91 a1 09 lds r18, 0x09A1 - 1314: 26 ff sbrs r18, 6 - 1316: fc cf rjmp .-8 ; 0x1310 - 1318: ed 87 std Y+13, r30 ; 0x0d - 131a: fe 87 std Y+14, r31 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 131c: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1320: 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; - 1324: 50 93 a0 09 sts 0x09A0, r21 - 1328: 4d 85 ldd r20, Y+13 ; 0x0d - 132a: 5e 85 ldd r21, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 132c: 20 91 a1 09 lds r18, 0x09A1 - 1330: 26 ff sbrs r18, 6 - 1332: fc cf rjmp .-8 ; 0x132c - 1334: 4d 87 std Y+13, r20 ; 0x0d - 1336: 5e 87 std Y+14, r21 ; 0x0e - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1338: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 133c: 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; - 1340: 10 92 a0 09 sts 0x09A0, r1 - 1344: 4d 85 ldd r20, Y+13 ; 0x0d - 1346: 5e 85 ldd r21, Y+14 ; 0x0e - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1348: 20 91 a1 09 lds r18, 0x09A1 - 134c: 26 ff sbrs r18, 6 - 134e: fc cf rjmp .-8 ; 0x1348 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1350: a0 92 a1 09 sts 0x09A1, r10 - - return MEMORY_FLASH_USART.DATA; - 1354: 20 91 a0 09 lds r18, 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; - 1358: 90 92 65 06 sts 0x0665, r9 - - FlashMemoryToBuffer(PageAddress); - FlashWriteBuffer(Buffer, ByteAddress, PageBytes); - FlashBufferToMemory(PageAddress); - - ByteCount -= PageBytes; - 135c: 46 1b sub r20, r22 - 135e: 57 0b sbc r21, r23 - 1360: 4d 87 std Y+13, r20 ; 0x0d - 1362: 5e 87 std Y+14, r21 ; 0x0e - Address += PageBytes; - 1364: 29 81 ldd r18, Y+1 ; 0x01 - 1366: 3a 81 ldd r19, Y+2 ; 0x02 - 1368: 4b 81 ldd r20, Y+3 ; 0x03 - 136a: 5c 81 ldd r21, Y+4 ; 0x04 - 136c: 26 0f add r18, r22 - 136e: 37 1f adc r19, r23 - 1370: 41 1d adc r20, r1 - 1372: 51 1d adc r21, r1 - 1374: 29 83 std Y+1, r18 ; 0x01 - 1376: 3a 83 std Y+2, r19 ; 0x02 - 1378: 4b 83 std Y+3, r20 ; 0x03 - 137a: 5c 83 std Y+4, r21 ; 0x04 - MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; -} - -INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) -{ - while(ByteCount > 0) { - 137c: 4d 85 ldd r20, Y+13 ; 0x0d - 137e: 5e 85 ldd r21, Y+14 ; 0x0e - 1380: 45 2b or r20, r21 - 1382: 09 f0 breq .+2 ; 0x1386 - 1384: b4 ce rjmp .-664 ; 0x10ee - 1386: 49 85 ldd r20, Y+9 ; 0x09 - 1388: 5a 85 ldd r21, Y+10 ; 0x0a - 138a: 6b 85 ldd r22, Y+11 ; 0x0b - 138c: 7c 85 ldd r23, Y+12 ; 0x0c - - /* Store into flash */ - FlashWrite(Buffer, FlashAddress, ByteCount); - - /* Store to local memory */ - uint8_t* DstPtr = &Memory[BlockAddress]; - 138e: da 01 movw r26, r20 - 1390: ae 56 subi r26, 0x6E ; 110 - 1392: bf 4d sbci r27, 0xDF ; 223 - 1394: 9c 01 movw r18, r24 -{ - /* Store current memory into permanent flash */ - FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); -} - -bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 1396: 8d 81 ldd r24, Y+5 ; 0x05 - 1398: 9e 81 ldd r25, Y+6 ; 0x06 - 139a: 8a 0f add r24, r26 - 139c: 9b 1f adc r25, r27 - 139e: f9 01 movw r30, r18 - /* Store to local memory */ - uint8_t* DstPtr = &Memory[BlockAddress]; - uint8_t* SrcPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - *DstPtr++ = *SrcPtr++; - 13a0: 21 91 ld r18, Z+ - 13a2: 2d 93 st X+, r18 - - /* Store to local memory */ - uint8_t* DstPtr = &Memory[BlockAddress]; - uint8_t* SrcPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 13a4: a8 17 cp r26, r24 - 13a6: b9 07 cpc r27, r25 - 13a8: d9 f7 brne .-10 ; 0x13a0 - } - - return true; - } - -} - 13aa: 81 e0 ldi r24, 0x01 ; 1 - 13ac: 2e 96 adiw r28, 0x0e ; 14 - 13ae: cd bf out 0x3d, r28 ; 61 - 13b0: de bf out 0x3e, r29 ; 62 - 13b2: df 91 pop r29 - 13b4: cf 91 pop r28 - 13b6: 1f 91 pop r17 - 13b8: 0f 91 pop r16 - 13ba: ff 90 pop r15 - 13bc: ef 90 pop r14 - 13be: df 90 pop r13 - 13c0: cf 90 pop r12 - 13c2: bf 90 pop r11 - 13c4: af 90 pop r10 - 13c6: 9f 90 pop r9 - 13c8: 8f 90 pop r8 - 13ca: 7f 90 pop r7 - 13cc: 6f 90 pop r6 - 13ce: 5f 90 pop r5 - 13d0: 4f 90 pop r4 - 13d2: 3f 90 pop r3 - 13d4: 2f 90 pop r2 - 13d6: 08 95 ret - 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.ActiveSetting * MEMORY_SIZE_PER_SETTING; - ByteCount = MIN(ByteCount, BytesLeft); - 13d8: cd 82 std Y+5, r12 ; 0x05 - 13da: de 82 std Y+6, r13 ; 0x06 - 13dc: ef 82 std Y+7, r14 ; 0x07 - 13de: f8 86 std Y+8, r15 ; 0x08 - 13e0: 64 ce rjmp .-824 ; 0x10aa - -000013e2 : - } - -} - -bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) -{ - 13e2: cf 92 push r12 - 13e4: df 92 push r13 - 13e6: ef 92 push r14 - 13e8: ff 92 push r15 - 13ea: 0f 93 push r16 - 13ec: 1f 93 push r17 - 13ee: 69 01 movw r12, r18 - if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 13f0: 41 15 cp r20, r1 - 13f2: 24 e0 ldi r18, 0x04 ; 4 - 13f4: 52 07 cpc r21, r18 - 13f6: 61 05 cpc r22, r1 - 13f8: 71 05 cpc r23, r1 - 13fa: 40 f5 brcc .+80 ; 0x144c - /* 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; - 13fc: 00 e0 ldi r16, 0x00 ; 0 - 13fe: 14 e0 ldi r17, 0x04 ; 4 - 1400: 20 e0 ldi r18, 0x00 ; 0 - 1402: 30 e0 ldi r19, 0x00 ; 0 - 1404: 04 1b sub r16, r20 - 1406: 15 0b sbc r17, r21 - 1408: 26 0b sbc r18, r22 - 140a: 37 0b sbc r19, r23 - //uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - ByteCount = MIN(ByteCount, BytesLeft); - 140c: e1 2c mov r14, r1 - 140e: f1 2c mov r15, r1 - 1410: 0c 15 cp r16, r12 - 1412: 1d 05 cpc r17, r13 - 1414: 2e 05 cpc r18, r14 - 1416: 3f 05 cpc r19, r15 - 1418: b0 f0 brcs .+44 ; 0x1446 - - /* Output local memory contents */ - uint8_t* DstPtr = (uint8_t*) Buffer; - uint8_t* SrcPtr = &Memory[BlockAddress]; - 141a: 4e 56 subi r20, 0x6E ; 110 - 141c: 5f 4d sbci r21, 0xDF ; 223 - - while(ByteCount--) { - 141e: c1 14 cp r12, r1 - 1420: d1 04 cpc r13, r1 - 1422: 49 f0 breq .+18 ; 0x1436 - 1424: da 01 movw r26, r20 - return true; - } - -} - -bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) - 1426: c8 0e add r12, r24 - 1428: 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; - 142a: fc 01 movw r30, r24 - uint8_t* SrcPtr = &Memory[BlockAddress]; - - while(ByteCount--) { - *DstPtr++ = *SrcPtr++; - 142c: 8d 91 ld r24, X+ - 142e: 81 93 st Z+, r24 - - /* Output local memory contents */ - uint8_t* DstPtr = (uint8_t*) Buffer; - uint8_t* SrcPtr = &Memory[BlockAddress]; - - while(ByteCount--) { - 1430: ec 15 cp r30, r12 - 1432: fd 05 cpc r31, r13 - 1434: d9 f7 brne .-10 ; 0x142c - *DstPtr++ = *SrcPtr++; - } - - return true; - 1436: 81 e0 ldi r24, 0x01 ; 1 - } - 1438: 1f 91 pop r17 - 143a: 0f 91 pop r16 - 143c: ff 90 pop r15 - 143e: ef 90 pop r14 - 1440: df 90 pop r13 - 1442: cf 90 pop r12 - 1444: 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); - 1446: 68 01 movw r12, r16 - 1448: 79 01 movw r14, r18 - 144a: e7 cf rjmp .-50 ; 0x141a - -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; - 144c: 80 e0 ldi r24, 0x00 ; 0 - *DstPtr++ = *SrcPtr++; - } - - return true; - } - 144e: 1f 91 pop r17 - 1450: 0f 91 pop r16 - 1452: ff 90 pop r15 - 1454: ef 90 pop r14 - 1456: df 90 pop r13 - 1458: cf 90 pop r12 - 145a: 08 95 ret - -0000145c : - [BUTTON_ACTION_RECALL_MEM] = "RECALL_MEM", -}; - -void ButtonInit(void) -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - 145c: e0 e0 ldi r30, 0x00 ; 0 - 145e: f6 e0 ldi r31, 0x06 ; 6 - 1460: 80 e4 ldi r24, 0x40 ; 64 - 1462: 82 83 std Z+2, r24 ; 0x02 - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; - 1464: 88 e1 ldi r24, 0x18 ; 24 - 1466: 86 8b std Z+22, r24 ; 0x16 - 1468: 08 95 ret - -0000146a : -} - -void ButtonTick(void) -{ - 146a: ff 92 push r15 - 146c: 0f 93 push r16 - 146e: 1f 93 push r17 - 1470: cf 93 push r28 - 1472: df 93 push r29 - 1474: cd b7 in r28, 0x3d ; 61 - 1476: de b7 in r29, 0x3e ; 62 - 1478: a0 97 sbiw r28, 0x20 ; 32 - 147a: cd bf out 0x3d, r28 ; 61 - 147c: de bf out 0x3e, r29 ; 62 - static uint8_t LastButtonState = 0; - uint8_t ThisButtonState = ~BUTTON_PORT.IN; - 147e: 80 91 08 06 lds r24, 0x0608 - 1482: 80 95 com r24 - uint8_t ThisButtonChange = ThisButtonState ^ LastButtonState; - 1484: 90 91 92 24 lds r25, 0x2492 - 1488: 98 27 eor r25, r24 - uint8_t ThisButtonPress = ThisButtonChange & ThisButtonState; - LastButtonState = ThisButtonState; - 148a: 80 93 92 24 sts 0x2492, r24 -void ButtonTick(void) -{ - static uint8_t LastButtonState = 0; - uint8_t ThisButtonState = ~BUTTON_PORT.IN; - uint8_t ThisButtonChange = ThisButtonState ^ LastButtonState; - uint8_t ThisButtonPress = ThisButtonChange & ThisButtonState; - 148e: 80 74 andi r24, 0x40 ; 64 - LastButtonState = ThisButtonState; - - if ( ThisButtonPress & BUTTON_MASK ) { - 1490: 89 23 and r24, r25 - 1492: d9 f0 breq .+54 ; 0x14ca - uint8_t UidBuffer[32]; - ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; - 1494: e0 91 fe 24 lds r30, 0x24FE - 1498: f0 91 ff 24 lds r31, 0x24FF - 149c: 80 81 ld r24, Z - - if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { - 149e: 81 30 cpi r24, 0x01 ; 1 - 14a0: e9 f0 breq .+58 ; 0x14dc - for (uint8_t i=0; i - UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - } - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { - 14a6: 83 30 cpi r24, 0x03 ; 3 - 14a8: 09 f4 brne .+2 ; 0x14ac - 14aa: 54 c0 rjmp .+168 ; 0x1554 - UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - } - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - 14ac: 84 30 cpi r24, 0x04 ; 4 - 14ae: 09 f4 brne .+2 ; 0x14b2 - 14b0: 77 c0 rjmp .+238 ; 0x15a0 - UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - } - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - 14b2: 85 30 cpi r24, 0x05 ; 5 - 14b4: 09 f4 brne .+2 ; 0x14b8 - 14b6: 96 c0 rjmp .+300 ; 0x15e4 - UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - } - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { - 14b8: 86 30 cpi r24, 0x06 ; 6 - 14ba: 09 f4 brne .+2 ; 0x14be - 14bc: b5 c0 rjmp .+362 ; 0x1628 - SettingsCycle(); - } else if (ButtonAction == BUTTON_ACTION_STORE_MEM) { - 14be: 87 30 cpi r24, 0x07 ; 7 - 14c0: 09 f4 brne .+2 ; 0x14c4 - 14c2: 6a c0 rjmp .+212 ; 0x1598 - MemoryStore(); - } else if (ButtonAction == BUTTON_ACTION_RECALL_MEM) { - 14c4: 88 30 cpi r24, 0x08 ; 8 - 14c6: 09 f4 brne .+2 ; 0x14ca - 14c8: 69 c0 rjmp .+210 ; 0x159c - MemoryRecall(); - } - } -} - 14ca: a0 96 adiw r28, 0x20 ; 32 - 14cc: cd bf out 0x3d, r28 ; 61 - 14ce: de bf out 0x3e, r29 ; 62 - 14d0: df 91 pop r29 - 14d2: cf 91 pop r28 - 14d4: 1f 91 pop r17 - 14d6: 0f 91 pop r16 - 14d8: ff 90 pop r15 - 14da: 08 95 ret - if ( ThisButtonPress & BUTTON_MASK ) { - uint8_t UidBuffer[32]; - ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; - - if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { - for (uint8_t i=0; i - 14e4: a3 c0 rjmp .+326 ; 0x162c - 14e6: f1 2c mov r15, r1 - 14e8: 8e 01 movw r16, r28 - 14ea: 0f 5f subi r16, 0xFF ; 255 - 14ec: 1f 4f sbci r17, 0xFF ; 255 - UidBuffer[i] = RandomGetByte(); - 14ee: 88 da rcall .-2800 ; 0xa00 - 14f0: f8 01 movw r30, r16 - 14f2: ef 0d add r30, r15 - 14f4: f1 1d adc r31, r1 - 14f6: 80 83 st Z, r24 - if ( ThisButtonPress & BUTTON_MASK ) { - uint8_t UidBuffer[32]; - ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; - - if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { - for (uint8_t i=0; i -INLINE void ApplicationGetUid(ConfigurationUidType Uid) { - ActiveConfiguration.ApplicationGetUidFunc(Uid); -} - -INLINE void ApplicationSetUid(ConfigurationUidType Uid) { - ActiveConfiguration.ApplicationSetUidFunc(Uid); - 1502: e0 91 f7 24 lds r30, 0x24F7 - 1506: f0 91 f8 24 lds r31, 0x24F8 - 150a: c8 01 movw r24, r16 - 150c: 09 95 icall - 150e: dd cf rjmp .-70 ; 0x14ca -INLINE void ApplicationReset(void) { - ActiveConfiguration.ApplicationResetFunc(); -} - -INLINE void ApplicationGetUid(ConfigurationUidType Uid) { - ActiveConfiguration.ApplicationGetUidFunc(Uid); - 1510: e0 91 f5 24 lds r30, 0x24F5 - 1514: f0 91 f6 24 lds r31, 0x24F6 - 1518: 8e 01 movw r16, r28 - 151a: 0f 5f subi r16, 0xFF ; 255 - 151c: 1f 4f sbci r17, 0xFF ; 255 - 151e: c8 01 movw r24, r16 - 1520: 09 95 icall - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i; - - for (i=0; i - 152a: f8 01 movw r30, r16 -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; -} - -void ButtonTick(void) - 152c: ce 01 movw r24, r28 - 152e: 02 96 adiw r24, 0x02 ; 2 - 1530: 21 50 subi r18, 0x01 ; 1 - 1532: 82 0f add r24, r18 - 1534: 91 1d adc r25, r1 - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - 1536: 21 e0 ldi r18, 0x01 ; 1 - uint8_t i; - - for (i=0; i - if (UidBuffer[i] == 0xFF) { - 153c: 30 81 ld r19, Z - 153e: 21 e0 ldi r18, 0x01 ; 1 - 1540: 3f 3f cpi r19, 0xFF ; 255 - 1542: 09 f0 breq .+2 ; 0x1546 - 1544: 20 e0 ldi r18, 0x00 ; 0 - Carry = 1; - } else { - Carry = 0; - } - - UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 1546: 3f 5f subi r19, 0xFF ; 255 - 1548: 30 83 st Z, r19 - 154a: 31 96 adiw r30, 0x01 ; 1 - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i; - - for (i=0; i - 1552: d7 cf rjmp .-82 ; 0x1502 - 1554: e0 91 f5 24 lds r30, 0x24F5 - 1558: f0 91 f6 24 lds r31, 0x24F6 - 155c: 8e 01 movw r16, r28 - 155e: 0f 5f subi r16, 0xFF ; 255 - 1560: 1f 4f sbci r17, 0xFF ; 255 - 1562: c8 01 movw r24, r16 - 1564: 09 95 icall - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i = ActiveConfiguration.UidSize; - 1566: 20 91 fb 24 lds r18, 0x24FB - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - 156a: 31 e0 ldi r19, 0x01 ; 1 - uint8_t i = ActiveConfiguration.UidSize; - - while(i-- > 0) { - 156c: 21 50 subi r18, 0x01 ; 1 - 156e: 48 f2 brcs .-110 ; 0x1502 - if (Carry) { - 1570: 33 23 and r19, r19 - 1572: e1 f3 breq .-8 ; 0x156c - if (UidBuffer[i] == 0xFF) { - 1574: 82 2f mov r24, r18 - 1576: 90 e0 ldi r25, 0x00 ; 0 - 1578: f8 01 movw r30, r16 - 157a: e8 0f add r30, r24 - 157c: f9 1f adc r31, r25 - 157e: 40 81 ld r20, Z - 1580: 31 e0 ldi r19, 0x01 ; 1 - 1582: 4f 3f cpi r20, 0xFF ; 255 - 1584: 09 f0 breq .+2 ; 0x1588 - 1586: 30 e0 ldi r19, 0x00 ; 0 - Carry = 1; - } else { - Carry = 0; - } - - UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 1588: f8 01 movw r30, r16 - 158a: e8 0f add r30, r24 - 158c: f9 1f adc r31, r25 - 158e: 4f 5f subi r20, 0xFF ; 255 - 1590: 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) { - 1592: 21 50 subi r18, 0x01 ; 1 - 1594: 68 f7 brcc .-38 ; 0x1570 - 1596: b5 cf rjmp .-150 ; 0x1502 - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { - SettingsCycle(); - } else if (ButtonAction == BUTTON_ACTION_STORE_MEM) { - MemoryStore(); - 1598: 02 dc rcall .-2044 ; 0xd9e - 159a: 97 cf rjmp .-210 ; 0x14ca - } else if (ButtonAction == BUTTON_ACTION_RECALL_MEM) { - MemoryRecall(); - 159c: 0c db rcall .-2536 ; 0xbb6 - 159e: 95 cf rjmp .-214 ; 0x14ca - 15a0: e0 91 f5 24 lds r30, 0x24F5 - 15a4: f0 91 f6 24 lds r31, 0x24F6 - 15a8: 8e 01 movw r16, r28 - 15aa: 0f 5f subi r16, 0xFF ; 255 - 15ac: 1f 4f sbci r17, 0xFF ; 255 - 15ae: c8 01 movw r24, r16 - 15b0: 09 95 icall - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i; - - for (i=0; i - 15ba: a3 cf rjmp .-186 ; 0x1502 - 15bc: f8 01 movw r30, r16 -{ - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; -} - -void ButtonTick(void) - 15be: ce 01 movw r24, r28 - 15c0: 02 96 adiw r24, 0x02 ; 2 - 15c2: 21 50 subi r18, 0x01 ; 1 - 15c4: 82 0f add r24, r18 - 15c6: 91 1d adc r25, r1 - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - 15c8: 21 e0 ldi r18, 0x01 ; 1 - uint8_t i; - - for (i=0; i - if (UidBuffer[i] == 0x00) { - 15ce: 30 81 ld r19, Z - 15d0: 21 e0 ldi r18, 0x01 ; 1 - 15d2: 31 11 cpse r19, r1 - 15d4: 20 e0 ldi r18, 0x00 ; 0 - Carry = 1; - } else { - Carry = 0; - } - - UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - 15d6: 31 50 subi r19, 0x01 ; 1 - 15d8: 30 83 st Z, r19 - 15da: 31 96 adiw r30, 0x01 ; 1 - } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i; - - for (i=0; i - 15e2: 8f cf rjmp .-226 ; 0x1502 - 15e4: e0 91 f5 24 lds r30, 0x24F5 - 15e8: f0 91 f6 24 lds r31, 0x24F6 - 15ec: 8e 01 movw r16, r28 - 15ee: 0f 5f subi r16, 0xFF ; 255 - 15f0: 1f 4f sbci r17, 0xFF ; 255 - 15f2: c8 01 movw r24, r16 - 15f4: 09 95 icall - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - uint8_t i = ActiveConfiguration.UidSize; - 15f6: 20 91 fb 24 lds r18, 0x24FB - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - ApplicationGetUid(UidBuffer); - bool Carry = 1; - 15fa: 31 e0 ldi r19, 0x01 ; 1 - uint8_t i = ActiveConfiguration.UidSize; - - while(i-- > 0) { - 15fc: 21 50 subi r18, 0x01 ; 1 - 15fe: 08 f4 brcc .+2 ; 0x1602 - 1600: 80 cf rjmp .-256 ; 0x1502 - if (Carry) { - 1602: 33 23 and r19, r19 - 1604: d9 f3 breq .-10 ; 0x15fc - if (UidBuffer[i] == 0x00) { - 1606: 82 2f mov r24, r18 - 1608: 90 e0 ldi r25, 0x00 ; 0 - 160a: f8 01 movw r30, r16 - 160c: e8 0f add r30, r24 - 160e: f9 1f adc r31, r25 - 1610: 40 81 ld r20, Z - 1612: 31 e0 ldi r19, 0x01 ; 1 - 1614: 41 11 cpse r20, r1 - 1616: 30 e0 ldi r19, 0x00 ; 0 - Carry = 1; - } else { - Carry = 0; - } - - UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - 1618: f8 01 movw r30, r16 - 161a: e8 0f add r30, r24 - 161c: f9 1f adc r31, r25 - 161e: 41 50 subi r20, 0x01 ; 1 - 1620: 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) { - 1622: 21 50 subi r18, 0x01 ; 1 - 1624: 70 f7 brcc .-36 ; 0x1602 - 1626: 6d cf rjmp .-294 ; 0x1502 - } - } - - ApplicationSetUid(UidBuffer); - } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { - SettingsCycle(); - 1628: cc d0 rcall .+408 ; 0x17c2 - 162a: 4f cf rjmp .-354 ; 0x14ca - 162c: 8e 01 movw r16, r28 - 162e: 0f 5f subi r16, 0xFF ; 255 - 1630: 1f 4f sbci r17, 0xFF ; 255 - 1632: 67 cf rjmp .-306 ; 0x1502 - -00001634 : - } - } -} - -void ButtonGetActionList(char* ListOut, uint16_t BufferSize) -{ - 1634: cf 93 push r28 - 1636: df 93 push r29 - 1638: ec 01 movw r28, r24 - uint8_t i; - - /* Account for '\0' */ - BufferSize--; - 163a: 61 50 subi r22, 0x01 ; 1 - 163c: 71 09 sbc r23, r1 - 163e: 80 e0 ldi r24, 0x00 ; 0 - 1640: 90 e0 ldi r25, 0x00 ; 0 - BufferSize--; - } - - if ( i < (BUTTON_ACTION_COUNT - 1) ) { - /* No comma on last configuration */ - *ListOut++ = ','; - 1642: 3c e2 ldi r19, 0x2C ; 44 - - /* Account for '\0' */ - BufferSize--; - - for (i=0; i sizeof(ButtonActionTable[i]) ) { - 165a: 24 91 lpm r18, Z - 165c: 22 23 and r18, r18 - 165e: 81 f0 breq .+32 ; 0x1680 - 1660: 61 32 cpi r22, 0x21 ; 33 - 1662: 71 05 cpc r23, r1 - 1664: 68 f0 brcs .+26 ; 0x1680 - 1666: de 01 movw r26, r28 - 1668: 03 c0 rjmp .+6 ; 0x1670 - 166a: 60 32 cpi r22, 0x20 ; 32 - 166c: 71 05 cpc r23, r1 - 166e: 41 f0 breq .+16 ; 0x1680 - /* While not end-of-string and enough buffer to - * put a complete configuration name */ - *ListOut++ = c; - 1670: 2d 93 st X+, r18 - 1672: ed 01 movw r28, r26 - ActionName++; - 1674: 31 96 adiw r30, 0x01 ; 1 - BufferSize--; - 1676: 61 50 subi r22, 0x01 ; 1 - 1678: 71 09 sbc r23, r1 - - for (i=0; i sizeof(ButtonActionTable[i]) ) { - 167a: 24 91 lpm r18, Z - 167c: 21 11 cpse r18, r1 - 167e: f5 cf rjmp .-22 ; 0x166a - *ListOut++ = c; - ActionName++; - BufferSize--; - } - - if ( i < (BUTTON_ACTION_COUNT - 1) ) { - 1680: 88 30 cpi r24, 0x08 ; 8 - 1682: 91 05 cpc r25, r1 - 1684: 21 f4 brne .+8 ; 0x168e - *ListOut++ = ','; - BufferSize--; - } - } - - *ListOut = '\0'; - 1686: 18 82 st Y, r1 -} - 1688: df 91 pop r29 - 168a: cf 91 pop r28 - 168c: 08 95 ret - BufferSize--; - } - - if ( i < (BUTTON_ACTION_COUNT - 1) ) { - /* No comma on last configuration */ - *ListOut++ = ','; - 168e: 39 93 st Y+, r19 - BufferSize--; - 1690: 61 50 subi r22, 0x01 ; 1 - 1692: 71 09 sbc r23, r1 - 1694: 01 96 adiw r24, 0x01 ; 1 - 1696: d6 cf rjmp .-84 ; 0x1644 - -00001698 : -} - -void ButtonSetActionById(ButtonActionEnum Action) -{ -#ifndef BUTTON_SETTING_GLOBAL - GlobalSettings.ActiveSettingPtr->ButtonAction = Action; - 1698: e0 91 fe 24 lds r30, 0x24FE - 169c: f0 91 ff 24 lds r31, 0x24FF - 16a0: 80 83 st Z, r24 - 16a2: 08 95 ret - -000016a4 : - } -#endif -} - -void ButtonGetActionByName(char* ActionOut, uint16_t BufferSize) -{ - 16a4: ab 01 movw r20, r22 - strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonAction], BufferSize); - 16a6: e0 91 fe 24 lds r30, 0x24FE - 16aa: f0 91 ff 24 lds r31, 0x24FF - 16ae: 60 81 ld r22, Z - 16b0: 20 e2 ldi r18, 0x20 ; 32 - 16b2: 62 9f mul r22, r18 - 16b4: b0 01 movw r22, r0 - 16b6: 11 24 eor r1, r1 - 16b8: 69 50 subi r22, 0x09 ; 9 - 16ba: 7d 4f sbci r23, 0xFD ; 253 - 16bc: 0c 94 e8 25 jmp 0x4bd0 ; 0x4bd0 - -000016c0 : -} - -bool ButtonSetActionByName(const char* Action) -{ - 16c0: cf 93 push r28 - 16c2: df 93 push r29 - 16c4: ec 01 movw r28, r24 - uint8_t i; - - for (i=0; i - 16ce: 89 2b or r24, r25 - 16d0: e1 f1 breq .+120 ; 0x174a - 16d2: 67 e1 ldi r22, 0x17 ; 23 - 16d4: 73 e0 ldi r23, 0x03 ; 3 - 16d6: ce 01 movw r24, r28 - 16d8: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 16dc: 89 2b or r24, r25 - 16de: d9 f1 breq .+118 ; 0x1756 - 16e0: 67 e3 ldi r22, 0x37 ; 55 - 16e2: 73 e0 ldi r23, 0x03 ; 3 - 16e4: ce 01 movw r24, r28 - 16e6: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 16ea: 89 2b or r24, r25 - 16ec: b1 f1 breq .+108 ; 0x175a - 16ee: 67 e5 ldi r22, 0x57 ; 87 - 16f0: 73 e0 ldi r23, 0x03 ; 3 - 16f2: ce 01 movw r24, r28 - 16f4: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 16f8: 89 2b or r24, r25 - 16fa: 89 f1 breq .+98 ; 0x175e - 16fc: 67 e7 ldi r22, 0x77 ; 119 - 16fe: 73 e0 ldi r23, 0x03 ; 3 - 1700: ce 01 movw r24, r28 - 1702: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1706: 89 2b or r24, r25 - 1708: 61 f1 breq .+88 ; 0x1762 - 170a: 67 e9 ldi r22, 0x97 ; 151 - 170c: 73 e0 ldi r23, 0x03 ; 3 - 170e: ce 01 movw r24, r28 - 1710: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1714: 89 2b or r24, r25 - 1716: 39 f1 breq .+78 ; 0x1766 - 1718: 67 eb ldi r22, 0xB7 ; 183 - 171a: 73 e0 ldi r23, 0x03 ; 3 - 171c: ce 01 movw r24, r28 - 171e: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1722: 89 2b or r24, r25 - 1724: 11 f1 breq .+68 ; 0x176a - 1726: 67 ed ldi r22, 0xD7 ; 215 - 1728: 73 e0 ldi r23, 0x03 ; 3 - 172a: ce 01 movw r24, r28 - 172c: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1730: 89 2b or r24, r25 - 1732: e9 f0 breq .+58 ; 0x176e - 1734: 67 ef ldi r22, 0xF7 ; 247 - 1736: 73 e0 ldi r23, 0x03 ; 3 - 1738: ce 01 movw r24, r28 - 173a: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 173e: 89 2b or r24, r25 - 1740: c1 f0 breq .+48 ; 0x1772 - return true; - } - } - - /* Button action not found */ - return false; - 1742: 80 e0 ldi r24, 0x00 ; 0 -} - 1744: df 91 pop r29 - 1746: cf 91 pop r28 - 1748: 08 95 ret - -bool ButtonSetActionByName(const char* Action) -{ - uint8_t i; - - for (i=0; i - return true; - 174e: 81 e0 ldi r24, 0x01 ; 1 - } - } - - /* Button action not found */ - return false; -} - 1750: df 91 pop r29 - 1752: cf 91 pop r28 - 1754: 08 95 ret - -bool ButtonSetActionByName(const char* Action) -{ - uint8_t i; - - for (i=0; i - 175a: 82 e0 ldi r24, 0x02 ; 2 - 175c: f7 cf rjmp .-18 ; 0x174c - 175e: 83 e0 ldi r24, 0x03 ; 3 - 1760: f5 cf rjmp .-22 ; 0x174c - 1762: 84 e0 ldi r24, 0x04 ; 4 - 1764: f3 cf rjmp .-26 ; 0x174c - 1766: 85 e0 ldi r24, 0x05 ; 5 - 1768: f1 cf rjmp .-30 ; 0x174c - 176a: 86 e0 ldi r24, 0x06 ; 6 - 176c: ef cf rjmp .-34 ; 0x174c - 176e: 87 e0 ldi r24, 0x07 ; 7 - 1770: ed cf rjmp .-38 ; 0x174c - if (strcmp_P(Action, ButtonActionTable[i]) == 0) { - 1772: 88 e0 ldi r24, 0x08 ; 8 - 1774: eb cf rjmp .-42 ; 0x174c - -00001776 : - .ButtonAction = DEFAULT_BUTTON_ACTION, - } } -}; - -void SettingsLoad(void) { - eeprom_read_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 1776: 43 e1 ldi r20, 0x13 ; 19 - 1778: 50 e0 ldi r21, 0x00 ; 0 - 177a: 60 e0 ldi r22, 0x00 ; 0 - 177c: 70 e0 ldi r23, 0x00 ; 0 - 177e: 8d ef ldi r24, 0xFD ; 253 - 1780: 94 e2 ldi r25, 0x24 ; 36 - 1782: 0c 94 fa 27 jmp 0x4ff4 ; 0x4ff4 <__eerd_block_x32a4u> - -00001786 : -} - -void SettingsSave(void) { -#if ENABLE_EEPROM_SETTINGS - eeprom_write_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 1786: 43 e1 ldi r20, 0x13 ; 19 - 1788: 50 e0 ldi r21, 0x00 ; 0 - 178a: 60 e0 ldi r22, 0x00 ; 0 - 178c: 70 e0 ldi r23, 0x00 ; 0 - 178e: 8d ef ldi r24, 0xFD ; 253 - 1790: 94 e2 ldi r25, 0x24 ; 36 - 1792: 0c 94 05 28 jmp 0x500a ; 0x500a <__eewr_block_x32a4u> - -00001796 : - break; - } - } -} - -void SettingsSetActiveById(uint8_t Setting) { - 1796: cf 93 push r28 - 1798: c8 2f mov r28, r24 - if (Setting < SETTINGS_COUNT) { - 179a: 88 30 cpi r24, 0x08 ; 8 - 179c: 10 f0 brcs .+4 ; 0x17a2 - ConfigurationInit(); - - /* Recall new memory contents */ - MemoryRecall(); - } -} - 179e: cf 91 pop r28 - 17a0: 08 95 ret -} - -void SettingsSetActiveById(uint8_t Setting) { - if (Setting < SETTINGS_COUNT) { - /* Store current memory contents permanently */ - MemoryStore(); - 17a2: fd da rcall .-2566 ; 0xd9e - - GlobalSettings.ActiveSetting = Setting; - 17a4: c0 93 fd 24 sts 0x24FD, r28 - GlobalSettings.ActiveSettingPtr = - &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; - 17a8: 8c 2f mov r24, r28 - 17aa: 90 e0 ldi r25, 0x00 ; 0 - 17ac: 88 0f add r24, r24 - 17ae: 99 1f adc r25, r25 - 17b0: 80 50 subi r24, 0x00 ; 0 - 17b2: 9b 4d sbci r25, 0xDB ; 219 - if (Setting < SETTINGS_COUNT) { - /* Store current memory contents permanently */ - MemoryStore(); - - GlobalSettings.ActiveSetting = Setting; - GlobalSettings.ActiveSettingPtr = - 17b4: 80 93 fe 24 sts 0x24FE, r24 - 17b8: 90 93 ff 24 sts 0x24FF, r25 - &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; - - /* Settings have changed. Progress changes through system */ - ConfigurationInit(); - 17bc: aa d8 rcall .-3756 ; 0x912 - - /* Recall new memory contents */ - MemoryRecall(); - } -} - 17be: cf 91 pop r28 - - /* Settings have changed. Progress changes through system */ - ConfigurationInit(); - - /* Recall new memory contents */ - MemoryRecall(); - 17c0: fa c9 rjmp .-3084 ; 0xbb6 - -000017c2 : -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 17c2: 20 91 fd 24 lds r18, 0x24FD - 17c6: 30 e0 ldi r19, 0x00 ; 0 - 17c8: 2f 5f subi r18, 0xFF ; 255 - 17ca: 3f 4f sbci r19, 0xFF ; 255 - 17cc: 27 70 andi r18, 0x07 ; 7 - 17ce: 33 27 eor r19, r19 - 17d0: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 17d2: f9 01 movw r30, r18 - 17d4: ee 0f add r30, r30 - 17d6: ff 1f adc r31, r31 - 17d8: ef 5f subi r30, 0xFF ; 255 - 17da: fa 4d sbci r31, 0xDA ; 218 - 17dc: 90 81 ld r25, Z - 17de: 91 11 cpse r25, r1 - 17e0: 5c c0 rjmp .+184 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 17e2: 2f 5f subi r18, 0xFF ; 255 - 17e4: 3f 4f sbci r19, 0xFF ; 255 - 17e6: 27 70 andi r18, 0x07 ; 7 - 17e8: 33 27 eor r19, r19 - 17ea: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 17ec: f9 01 movw r30, r18 - 17ee: ee 0f add r30, r30 - 17f0: ff 1f adc r31, r31 - 17f2: ef 5f subi r30, 0xFF ; 255 - 17f4: fa 4d sbci r31, 0xDA ; 218 - 17f6: 90 81 ld r25, Z - 17f8: 91 11 cpse r25, r1 - 17fa: 4f c0 rjmp .+158 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 17fc: 2f 5f subi r18, 0xFF ; 255 - 17fe: 3f 4f sbci r19, 0xFF ; 255 - 1800: 27 70 andi r18, 0x07 ; 7 - 1802: 33 27 eor r19, r19 - 1804: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1806: f9 01 movw r30, r18 - 1808: ee 0f add r30, r30 - 180a: ff 1f adc r31, r31 - 180c: ef 5f subi r30, 0xFF ; 255 - 180e: fa 4d sbci r31, 0xDA ; 218 - 1810: 90 81 ld r25, Z - 1812: 91 11 cpse r25, r1 - 1814: 42 c0 rjmp .+132 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 1816: 2f 5f subi r18, 0xFF ; 255 - 1818: 3f 4f sbci r19, 0xFF ; 255 - 181a: 27 70 andi r18, 0x07 ; 7 - 181c: 33 27 eor r19, r19 - 181e: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1820: f9 01 movw r30, r18 - 1822: ee 0f add r30, r30 - 1824: ff 1f adc r31, r31 - 1826: ef 5f subi r30, 0xFF ; 255 - 1828: fa 4d sbci r31, 0xDA ; 218 - 182a: 90 81 ld r25, Z - 182c: 91 11 cpse r25, r1 - 182e: 35 c0 rjmp .+106 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 1830: 2f 5f subi r18, 0xFF ; 255 - 1832: 3f 4f sbci r19, 0xFF ; 255 - 1834: 27 70 andi r18, 0x07 ; 7 - 1836: 33 27 eor r19, r19 - 1838: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 183a: f9 01 movw r30, r18 - 183c: ee 0f add r30, r30 - 183e: ff 1f adc r31, r31 - 1840: ef 5f subi r30, 0xFF ; 255 - 1842: fa 4d sbci r31, 0xDA ; 218 - 1844: 90 81 ld r25, Z - 1846: 91 11 cpse r25, r1 - 1848: 28 c0 rjmp .+80 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 184a: 2f 5f subi r18, 0xFF ; 255 - 184c: 3f 4f sbci r19, 0xFF ; 255 - 184e: 27 70 andi r18, 0x07 ; 7 - 1850: 33 27 eor r19, r19 - 1852: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1854: f9 01 movw r30, r18 - 1856: ee 0f add r30, r30 - 1858: ff 1f adc r31, r31 - 185a: ef 5f subi r30, 0xFF ; 255 - 185c: fa 4d sbci r31, 0xDA ; 218 - 185e: 90 81 ld r25, Z - 1860: 91 11 cpse r25, r1 - 1862: 1b c0 rjmp .+54 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 1864: 2f 5f subi r18, 0xFF ; 255 - 1866: 3f 4f sbci r19, 0xFF ; 255 - 1868: 27 70 andi r18, 0x07 ; 7 - 186a: 33 27 eor r19, r19 - 186c: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 186e: f9 01 movw r30, r18 - 1870: ee 0f add r30, r30 - 1872: ff 1f adc r31, r31 - 1874: ef 5f subi r30, 0xFF ; 255 - 1876: fa 4d sbci r31, 0xDA ; 218 - 1878: 90 81 ld r25, Z - 187a: 91 11 cpse r25, r1 - 187c: 0e c0 rjmp .+28 ; 0x189a -void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t Setting = GlobalSettings.ActiveSetting; - - while (i-- > 0) { - Setting = (Setting + 1) % SETTINGS_COUNT; - 187e: 2f 5f subi r18, 0xFF ; 255 - 1880: 3f 4f sbci r19, 0xFF ; 255 - 1882: 27 70 andi r18, 0x07 ; 7 - 1884: 33 27 eor r19, r19 - 1886: 82 2f mov r24, r18 - - if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1888: f9 01 movw r30, r18 - 188a: ee 0f add r30, r30 - 188c: ff 1f adc r31, r31 - 188e: ef 5f subi r30, 0xFF ; 255 - 1890: fa 4d sbci r31, 0xDA ; 218 - 1892: 90 81 ld r25, Z - 1894: 91 11 cpse r25, r1 - 1896: 01 c0 rjmp .+2 ; 0x189a - 1898: 08 95 ret - SettingsSetActiveById(Setting); - 189a: 7d cf rjmp .-262 ; 0x1796 - -0000189c : - } -} - -uint8_t SettingsGetActiveById(void) { - return GlobalSettings.ActiveSetting; -} - 189c: 80 91 fd 24 lds r24, 0x24FD - 18a0: 08 95 ret - -000018a2 : - -void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { - 18a2: cf 93 push r28 - 18a4: df 93 push r29 - 18a6: ec 01 movw r28, r24 - SettingOut[0] = SettingsGetActiveById() + '0'; - 18a8: f9 df rcall .-14 ; 0x189c - 18aa: 80 5d subi r24, 0xD0 ; 208 - 18ac: 88 83 st Y, r24 - SettingOut[1] = '\0'; - 18ae: 19 82 std Y+1, r1 ; 0x01 -} - 18b0: df 91 pop r29 - 18b2: cf 91 pop r28 - 18b4: 08 95 ret - -000018b6 : - -bool SettingsSetActiveByName(const char* Setting) { - 18b6: fc 01 movw r30, r24 - uint8_t SettingNr = Setting[0] - '0'; - 18b8: 80 81 ld r24, Z - - if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - 18ba: 91 81 ldd r25, Z+1 ; 0x01 - 18bc: 91 11 cpse r25, r1 - 18be: 03 c0 rjmp .+6 ; 0x18c6 - SettingOut[0] = SettingsGetActiveById() + '0'; - SettingOut[1] = '\0'; -} - -bool SettingsSetActiveByName(const char* Setting) { - uint8_t SettingNr = Setting[0] - '0'; - 18c0: 80 53 subi r24, 0x30 ; 48 - - if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - 18c2: 88 30 cpi r24, 0x08 ; 8 - 18c4: 10 f0 brcs .+4 ; 0x18ca - SettingsSetActiveById(SettingNr); - return true; - } else { - return false; - 18c6: 80 e0 ldi r24, 0x00 ; 0 - } -} - 18c8: 08 95 ret - -bool SettingsSetActiveByName(const char* Setting) { - uint8_t SettingNr = Setting[0] - '0'; - - if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - SettingsSetActiveById(SettingNr); - 18ca: 65 df rcall .-310 ; 0x1796 - return true; - 18cc: 81 e0 ldi r24, 0x01 ; 1 - 18ce: 08 95 ret - -000018d0 : -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); - 18d0: bc 01 movw r22, r24 - 18d2: 80 e0 ldi r24, 0x00 ; 0 - 18d4: 90 e2 ldi r25, 0x20 ; 32 - 18d6: 0c 94 76 23 jmp 0x46ec ; 0x46ec - -000018da : -} - -void TerminalSendStringP(const char* s) { - 18da: cf 93 push r28 - 18dc: df 93 push r29 - char c; - - while( (c = pgm_read_byte(s++)) != '\0' ) { - 18de: ec 01 movw r28, r24 - 18e0: 21 96 adiw r28, 0x01 ; 1 - 18e2: fc 01 movw r30, r24 - 18e4: 64 91 lpm r22, Z - 18e6: 66 23 and r22, r22 - 18e8: 49 f0 breq .+18 ; 0x18fc -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); } - 18ea: 80 e0 ldi r24, 0x00 ; 0 - 18ec: 90 e2 ldi r25, 0x20 ; 32 - 18ee: 0e 94 c9 23 call 0x4792 ; 0x4792 - 18f2: fe 01 movw r30, r28 - 18f4: 21 96 adiw r28, 0x01 ; 1 - 18f6: 64 91 lpm r22, Z - 18f8: 61 11 cpse r22, r1 - 18fa: f7 cf rjmp .-18 ; 0x18ea - TerminalSendChar(c); - } -} - 18fc: df 91 pop r29 - 18fe: cf 91 pop r28 - 1900: 08 95 ret - -00001902 : -#endif - - - -void TerminalSendBlock(void* Buffer, uint16_t ByteCount) -{ - 1902: ab 01 movw r20, r22 - CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); - 1904: bc 01 movw r22, r24 - 1906: 80 e0 ldi r24, 0x00 ; 0 - 1908: 90 e2 ldi r25, 0x20 ; 32 - 190a: 0c 94 9f 23 jmp 0x473e ; 0x473e - -0000190e : - } -} - -void TerminalInit(void) -{ - TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK; - 190e: 80 e2 ldi r24, 0x20 ; 32 - 1910: e0 e6 ldi r30, 0x60 ; 96 - 1912: f6 e0 ldi r31, 0x06 ; 6 - 1914: 82 83 std Z+2, r24 ; 0x02 - 1916: 08 95 ret - -00001918 : -} - -void TerminalTask(void) -{ - 1918: cf 93 push r28 - 191a: df 93 push r29 - CDC_Device_USBTask(&TerminalHandle); - 191c: 80 e0 ldi r24, 0x00 ; 0 - 191e: 90 e2 ldi r25, 0x20 ; 32 - 1920: 0e 94 48 24 call 0x4890 ; 0x4890 - USB_USBTask(); - 1924: 0e 94 49 1e call 0x3c92 ; 0x3c92 - CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); -} - - -static void ProcessByte(void) { - int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle); - 1928: 80 e0 ldi r24, 0x00 ; 0 - 192a: 90 e2 ldi r25, 0x20 ; 32 - 192c: 0e 94 63 24 call 0x48c6 ; 0x48c6 - 1930: ec 01 movw r28, r24 - - if (Byte >= 0) { - 1932: 97 fd sbrc r25, 7 - 1934: 09 c0 rjmp .+18 ; 0x1948 - LED_PORT.OUTTGL = Mask; -} - -static inline -void LEDPulse(uint8_t Mask) { - LEDPulseMask = Mask; - 1936: 80 e1 ldi r24, 0x10 ; 16 - 1938: 80 93 93 24 sts 0x2493, r24 - LED_PORT.OUTSET = Mask; - 193c: 80 93 05 06 sts 0x0605, r24 - /* Byte received */ - LEDPulse(LED_RED); - - if (XModemProcessByte(Byte)) { - 1940: 8c 2f mov r24, r28 - 1942: 6a d2 rcall .+1236 ; 0x1e18 - 1944: 88 23 and r24, r24 - 1946: 19 f0 breq .+6 ; 0x194e -{ - CDC_Device_USBTask(&TerminalHandle); - USB_USBTask(); - - ProcessByte(); -} - 1948: df 91 pop r29 - 194a: cf 91 pop r28 - 194c: 08 95 ret - /* Byte received */ - LEDPulse(LED_RED); - - if (XModemProcessByte(Byte)) { - /* XModem handled the byte */ - } else if (CommandLineProcessByte(Byte)) { - 194e: 8c 2f mov r24, r28 -{ - CDC_Device_USBTask(&TerminalHandle); - USB_USBTask(); - - ProcessByte(); -} - 1950: df 91 pop r29 - 1952: cf 91 pop r28 - /* Byte received */ - LEDPulse(LED_RED); - - if (XModemProcessByte(Byte)) { - /* XModem handled the byte */ - } else if (CommandLineProcessByte(Byte)) { - 1954: d1 c3 rjmp .+1954 ; 0x20f8 - -00001956 : - } -} - -static void SenseVBus(void) -{ - switch(TerminalState) { - 1956: 80 91 94 24 lds r24, 0x2494 - 195a: 81 30 cpi r24, 0x01 ; 1 - 195c: 09 f1 breq .+66 ; 0x19a0 - 195e: 30 f0 brcs .+12 ; 0x196c - 1960: 82 30 cpi r24, 0x02 ; 2 - 1962: 69 f1 breq .+90 ; 0x19be - 1964: 83 30 cpi r24, 0x03 ; 3 - 1966: 71 f0 breq .+28 ; 0x1984 - -void TerminalTick(void) -{ - SenseVBus(); - - XModemTick(); - 1968: 99 d3 rcall .+1842 ; 0x209c - CommandLineTick(); - 196a: 67 c5 rjmp .+2766 ; 0x243a - -static void SenseVBus(void) -{ - switch(TerminalState) { - case TERMINAL_UNINITIALIZED: - if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { - 196c: 80 91 68 06 lds r24, 0x0668 - 1970: 85 ff sbrs r24, 5 - 1972: fa cf rjmp .-12 ; 0x1968 - /* Not initialized and VBUS sense high */ - TerminalInitDelay = INIT_DELAY; - 1974: 84 e1 ldi r24, 0x14 ; 20 - 1976: 80 93 1b 20 sts 0x201B, r24 - TerminalState = TERMINAL_INITIALIZING; - 197a: 81 e0 ldi r24, 0x01 ; 1 - 197c: 80 93 94 24 sts 0x2494, r24 - -void TerminalTick(void) -{ - SenseVBus(); - - XModemTick(); - 1980: 8d d3 rcall .+1818 ; 0x209c - CommandLineTick(); - 1982: 5b c5 rjmp .+2742 ; 0x243a - TerminalState = TERMINAL_UNITIALIZING; - } - break; - - case TERMINAL_UNITIALIZING: - if (--TerminalInitDelay == 0) { - 1984: 80 91 1b 20 lds r24, 0x201B - 1988: 81 50 subi r24, 0x01 ; 1 - 198a: 80 93 1b 20 sts 0x201B, r24 - 198e: 81 11 cpse r24, r1 - 1990: eb cf rjmp .-42 ; 0x1968 - USB_Disable(); - 1992: 0e 94 73 22 call 0x44e6 ; 0x44e6 - SystemStopUSBClock(); - 1996: 0e 94 50 04 call 0x8a0 ; 0x8a0 - TerminalState = TERMINAL_UNINITIALIZED; - 199a: 10 92 94 24 sts 0x2494, r1 - 199e: e4 cf rjmp .-56 ; 0x1968 - TerminalState = TERMINAL_INITIALIZING; - } - break; - - case TERMINAL_INITIALIZING: - if (--TerminalInitDelay == 0) { - 19a0: 80 91 1b 20 lds r24, 0x201B - 19a4: 81 50 subi r24, 0x01 ; 1 - 19a6: 80 93 1b 20 sts 0x201B, r24 - 19aa: 81 11 cpse r24, r1 - 19ac: dd cf rjmp .-70 ; 0x1968 - SystemStartUSBClock(); - 19ae: 0e 94 37 04 call 0x86e ; 0x86e - USB_Init(); - 19b2: 0e 94 ae 22 call 0x455c ; 0x455c - TerminalState = TERMINAL_INITIALIZED; - 19b6: 82 e0 ldi r24, 0x02 ; 2 - 19b8: 80 93 94 24 sts 0x2494, r24 - 19bc: d5 cf rjmp .-86 ; 0x1968 - } - break; - - case TERMINAL_INITIALIZED: - if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { - 19be: 80 91 68 06 lds r24, 0x0668 - 19c2: 85 fd sbrc r24, 5 - 19c4: d1 cf rjmp .-94 ; 0x1968 - /* Initialized and VBUS sense low */ - TerminalInitDelay = INIT_DELAY; - 19c6: 84 e1 ldi r24, 0x14 ; 20 - 19c8: 80 93 1b 20 sts 0x201B, r24 - TerminalState = TERMINAL_UNITIALIZING; - 19cc: 83 e0 ldi r24, 0x03 ; 3 - 19ce: 80 93 94 24 sts 0x2494, r24 - -void TerminalTick(void) -{ - SenseVBus(); - - XModemTick(); - 19d2: 64 d3 rcall .+1736 ; 0x209c - CommandLineTick(); - 19d4: 32 c5 rjmp .+2660 ; 0x243a - -000019d6 : - LED_PORT.DIRSET = LED_MASK; -} - -static inline -void LEDSetOn(uint8_t Mask) { - LED_PORT.OUTSET = Mask; - 19d6: 80 e2 ldi r24, 0x20 ; 32 - 19d8: e0 e0 ldi r30, 0x00 ; 0 - 19da: f6 e0 ldi r31, 0x06 ; 6 - 19dc: 85 83 std Z+5, r24 ; 0x05 - 19de: 08 95 ret - -000019e0 : -} - -static inline -void LEDSetOff(uint8_t Mask) { - LED_PORT.OUTCLR = Mask; - 19e0: 80 e2 ldi r24, 0x20 ; 32 - 19e2: e0 e0 ldi r30, 0x00 ; 0 - 19e4: f6 e0 ldi r31, 0x06 ; 6 - 19e6: 86 83 std Z+6, r24 ; 0x06 - 19e8: 08 95 ret - -000019ea : - - -/** Event handler for the library USB Configuration Changed event. */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - CDC_Device_ConfigureEndpoints(&TerminalHandle); - 19ea: 80 e0 ldi r24, 0x00 ; 0 - 19ec: 90 e2 ldi r25, 0x20 ; 32 - 19ee: 0c 94 51 23 jmp 0x46a2 ; 0x46a2 - -000019f2 : -} - -/** Event handler for the library USB Control Request reception event. */ -void EVENT_USB_Device_ControlRequest(void) -{ - CDC_Device_ProcessControlRequest(&TerminalHandle); - 19f2: 80 e0 ldi r24, 0x00 ; 0 - 19f4: 90 e2 ldi r25, 0x20 ; 32 - 19f6: 0c 94 c3 24 jmp 0x4986 ; 0x4986 - -000019fa : - -extern const PROGMEM CommandEntryType CommandTable[]; - -CommandStatusIdType CommandGetVersion(char* OutParam) -{ - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR( - 19fa: 2e e5 ldi r18, 0x5E ; 94 - 19fc: 34 e0 ldi r19, 0x04 ; 4 - 19fe: 3f 93 push r19 - 1a00: 2f 93 push r18 - 1a02: 27 e5 ldi r18, 0x57 ; 87 - 1a04: 34 e0 ldi r19, 0x04 ; 4 - 1a06: 3f 93 push r19 - 1a08: 2f 93 push r18 - 1a0a: 20 e5 ldi r18, 0x50 ; 80 - 1a0c: 34 e0 ldi r19, 0x04 ; 4 - 1a0e: 3f 93 push r19 - 1a10: 2f 93 push r18 - 1a12: 27 e1 ldi r18, 0x17 ; 23 - 1a14: 34 e0 ldi r19, 0x04 ; 4 - 1a16: 3f 93 push r19 - 1a18: 2f 93 push r18 - 1a1a: 21 e0 ldi r18, 0x01 ; 1 - 1a1c: 2f 93 push r18 - 1a1e: 1f 92 push r1 - 1a20: 9f 93 push r25 - 1a22: 8f 93 push r24 - 1a24: 0e 94 00 26 call 0x4c00 ; 0x4c00 - "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; - 1a28: 8d b7 in r24, 0x3d ; 61 - 1a2a: 9e b7 in r25, 0x3e ; 62 - 1a2c: 0c 96 adiw r24, 0x0c ; 12 - 1a2e: 8d bf out 0x3d, r24 ; 61 - 1a30: 9e bf out 0x3e, r25 ; 62 -} - 1a32: 85 e6 ldi r24, 0x65 ; 101 - 1a34: 08 95 ret - -00001a36 : - -CommandStatusIdType CommandGetConfig(char* OutParam) -{ - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 1a36: 29 ed ldi r18, 0xD9 ; 217 - 1a38: 34 e2 ldi r19, 0x24 ; 36 - 1a3a: 3f 93 push r19 - 1a3c: 2f 93 push r18 - 1a3e: 24 e6 ldi r18, 0x64 ; 100 - 1a40: 34 e0 ldi r19, 0x04 ; 4 - 1a42: 3f 93 push r19 - 1a44: 2f 93 push r18 - 1a46: 21 e0 ldi r18, 0x01 ; 1 - 1a48: 2f 93 push r18 - 1a4a: 1f 92 push r1 - 1a4c: 9f 93 push r25 - 1a4e: 8f 93 push r24 - 1a50: 0e 94 00 26 call 0x4c00 ; 0x4c00 - PSTR("%s"), ActiveConfiguration.ConfigurationName); - - return COMMAND_INFO_OK_WITH_TEXT_ID; - 1a54: 8d b7 in r24, 0x3d ; 61 - 1a56: 9e b7 in r25, 0x3e ; 62 - 1a58: 08 96 adiw r24, 0x08 ; 8 - 1a5a: 8d bf out 0x3d, r24 ; 61 - 1a5c: 9e bf out 0x3e, r25 ; 62 - -} - 1a5e: 85 e6 ldi r24, 0x65 ; 101 - 1a60: 08 95 ret - -00001a62 : - -CommandStatusIdType CommandSetConfig(const char* InParam) -{ - if (ConfigurationSetByName(InParam)) { - 1a62: 0e 94 8f 04 call 0x91e ; 0x91e - 1a66: 81 11 cpse r24, r1 - 1a68: 02 c0 rjmp .+4 ; 0x1a6e - SettingsSave(); - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - 1a6a: 8a ec ldi r24, 0xCA ; 202 - } -} - 1a6c: 08 95 ret -} - -CommandStatusIdType CommandSetConfig(const char* InParam) -{ - if (ConfigurationSetByName(InParam)) { - SettingsSave(); - 1a6e: 8b de rcall .-746 ; 0x1786 - return COMMAND_INFO_OK_ID; - 1a70: 84 e6 ldi r24, 0x64 ; 100 - 1a72: 08 95 ret - -00001a74 : - } -} - -CommandStatusIdType CommandExecConfig(char* OutMessage) -{ - ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); - 1a74: 60 e0 ldi r22, 0x00 ; 0 - 1a76: 71 e0 ldi r23, 0x01 ; 1 - 1a78: 0e 94 d0 04 call 0x9a0 ; 0x9a0 - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1a7c: 85 e6 ldi r24, 0x65 ; 101 - 1a7e: 08 95 ret - -00001a80 : - -CommandStatusIdType CommandGetUid(char* OutParam) -{ - 1a80: 0f 93 push r16 - 1a82: 1f 93 push r17 - 1a84: cf 93 push r28 - 1a86: df 93 push r29 - 1a88: cd b7 in r28, 0x3d ; 61 - 1a8a: de b7 in r29, 0x3e ; 62 - 1a8c: a1 97 sbiw r28, 0x21 ; 33 - 1a8e: cd bf out 0x3d, r28 ; 61 - 1a90: de bf out 0x3e, r29 ; 62 - 1a92: 8c 01 movw r16, r24 - uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; - uint16_t UidSize = ActiveConfiguration.UidSize; - 1a94: 20 91 fb 24 lds r18, 0x24FB -INLINE void ApplicationReset(void) { - ActiveConfiguration.ApplicationResetFunc(); -} - -INLINE void ApplicationGetUid(ConfigurationUidType Uid) { - ActiveConfiguration.ApplicationGetUidFunc(Uid); - 1a98: e0 91 f5 24 lds r30, 0x24F5 - 1a9c: f0 91 f6 24 lds r31, 0x24F6 - 1aa0: ce 01 movw r24, r28 - 1aa2: 01 96 adiw r24, 0x01 ; 1 - 1aa4: 29 a3 std Y+33, r18 ; 0x21 - 1aa6: 09 95 icall - - ApplicationGetUid(UidBuffer); - - BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE, - 1aa8: 29 a1 ldd r18, Y+33 ; 0x21 - 1aaa: 30 e0 ldi r19, 0x00 ; 0 - 1aac: ae 01 movw r20, r28 - 1aae: 4f 5f subi r20, 0xFF ; 255 - 1ab0: 5f 4f sbci r21, 0xFF ; 255 - 1ab2: 60 e0 ldi r22, 0x00 ; 0 - 1ab4: 71 e0 ldi r23, 0x01 ; 1 - 1ab6: c8 01 movw r24, r16 - 1ab8: 0e 94 1a 05 call 0xa34 ; 0xa34 - UidBuffer, UidSize); - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1abc: 85 e6 ldi r24, 0x65 ; 101 - 1abe: a1 96 adiw r28, 0x21 ; 33 - 1ac0: cd bf out 0x3d, r28 ; 61 - 1ac2: de bf out 0x3e, r29 ; 62 - 1ac4: df 91 pop r29 - 1ac6: cf 91 pop r28 - 1ac8: 1f 91 pop r17 - 1aca: 0f 91 pop r16 - 1acc: 08 95 ret - -00001ace : - -CommandStatusIdType CommandSetUid(const char* InParam) -{ - 1ace: bf 92 push r11 - 1ad0: cf 92 push r12 - 1ad2: df 92 push r13 - 1ad4: ef 92 push r14 - 1ad6: ff 92 push r15 - 1ad8: 0f 93 push r16 - 1ada: 1f 93 push r17 - 1adc: cf 93 push r28 - 1ade: df 93 push r29 - 1ae0: cd b7 in r28, 0x3d ; 61 - 1ae2: de b7 in r29, 0x3e ; 62 - 1ae4: a0 97 sbiw r28, 0x20 ; 32 - 1ae6: cd bf out 0x3d, r28 ; 61 - 1ae8: de bf out 0x3e, r29 ; 62 - 1aea: 8c 01 movw r16, r24 - uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; - uint16_t UidSize = ActiveConfiguration.UidSize; - 1aec: c0 90 fb 24 lds r12, 0x24FB - 1af0: d1 2c mov r13, r1 - - if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { - 1af2: 67 e6 ldi r22, 0x67 ; 103 - 1af4: 74 e0 ldi r23, 0x04 ; 4 - 1af6: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1afa: 89 2b or r24, r25 - 1afc: 59 f5 brne .+86 ; 0x1b54 - /* Load with random bytes */ - for (uint8_t i=0; i - 1b04: b1 2c mov r11, r1 - 1b06: ee 24 eor r14, r14 - 1b08: e3 94 inc r14 - 1b0a: f1 2c mov r15, r1 - 1b0c: ec 0e add r14, r28 - 1b0e: fd 1e adc r15, r29 - 1b10: 00 e0 ldi r16, 0x00 ; 0 - 1b12: 10 e0 ldi r17, 0x00 ; 0 - UidBuffer[i] = RandomGetByte(); - 1b14: 0e 94 00 05 call 0xa00 ; 0xa00 - 1b18: f7 01 movw r30, r14 - 1b1a: e0 0f add r30, r16 - 1b1c: f1 1f adc r31, r17 - 1b1e: 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 -} - -INLINE void ApplicationSetUid(ConfigurationUidType Uid) { - ActiveConfiguration.ApplicationSetUidFunc(Uid); - 1b2c: e0 91 f7 24 lds r30, 0x24F7 - 1b30: f0 91 f8 24 lds r31, 0x24F8 - 1b34: c7 01 movw r24, r14 - 1b36: 09 95 icall - } - } - - ApplicationSetUid(UidBuffer); - - return COMMAND_INFO_OK_ID; - 1b38: 84 e6 ldi r24, 0x64 ; 100 -} - 1b3a: a0 96 adiw r28, 0x20 ; 32 - 1b3c: cd bf out 0x3d, r28 ; 61 - 1b3e: de bf out 0x3e, r29 ; 62 - 1b40: df 91 pop r29 - 1b42: cf 91 pop r28 - 1b44: 1f 91 pop r17 - 1b46: 0f 91 pop r16 - 1b48: ff 90 pop r15 - 1b4a: ef 90 pop r14 - 1b4c: df 90 pop r13 - 1b4e: cf 90 pop r12 - 1b50: bf 90 pop r11 - 1b52: 08 95 ret - for (uint8_t i=0; i - 1b6a: 8c 15 cp r24, r12 - 1b6c: 9d 05 cpc r25, r13 - 1b6e: f1 f2 breq .-68 ; 0x1b2c - /* Malformed input. Abort */ - return COMMAND_ERR_INVALID_PARAM_ID; - 1b70: 8a ec ldi r24, 0xCA ; 202 - 1b72: e3 cf rjmp .-58 ; 0x1b3a - 1b74: ee 24 eor r14, r14 - 1b76: e3 94 inc r14 - 1b78: f1 2c mov r15, r1 - 1b7a: ec 0e add r14, r28 - 1b7c: fd 1e adc r15, r29 - 1b7e: d6 cf rjmp .-84 ; 0x1b2c - -00001b80 : - return COMMAND_INFO_OK_ID; -} - -CommandStatusIdType CommandGetReadOnly(char* OutParam) -{ - if (ActiveConfiguration.ReadOnly) { - 1b80: 20 91 fc 24 lds r18, 0x24FC - 1b84: 21 11 cpse r18, r1 - 1b86: 07 c0 rjmp .+14 ; 0x1b96 - OutParam[0] = COMMAND_CHAR_TRUE; - } else { - OutParam[0] = COMMAND_CHAR_FALSE; - 1b88: 20 e3 ldi r18, 0x30 ; 48 - 1b8a: fc 01 movw r30, r24 - 1b8c: 20 83 st Z, r18 - } - - OutParam[1] = '\0'; - 1b8e: fc 01 movw r30, r24 - 1b90: 11 82 std Z+1, r1 ; 0x01 - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1b92: 85 e6 ldi r24, 0x65 ; 101 - 1b94: 08 95 ret -} - -CommandStatusIdType CommandGetReadOnly(char* OutParam) -{ - if (ActiveConfiguration.ReadOnly) { - OutParam[0] = COMMAND_CHAR_TRUE; - 1b96: 21 e3 ldi r18, 0x31 ; 49 - 1b98: fc 01 movw r30, r24 - 1b9a: 20 83 st Z, r18 - } else { - OutParam[0] = COMMAND_CHAR_FALSE; - } - - OutParam[1] = '\0'; - 1b9c: fc 01 movw r30, r24 - 1b9e: 11 82 std Z+1, r1 ; 0x01 - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1ba0: 85 e6 ldi r24, 0x65 ; 101 - 1ba2: 08 95 ret - -00001ba4 : - -CommandStatusIdType CommandSetReadOnly(const char* InParam) -{ - if (InParam[1] == '\0') { - 1ba4: fc 01 movw r30, r24 - 1ba6: 21 81 ldd r18, Z+1 ; 0x01 - 1ba8: 21 11 cpse r18, r1 - 1baa: 05 c0 rjmp .+10 ; 0x1bb6 - if (InParam[0] == COMMAND_CHAR_TRUE) { - 1bac: 80 81 ld r24, Z - 1bae: 81 33 cpi r24, 0x31 ; 49 - 1bb0: 41 f0 breq .+16 ; 0x1bc2 - ActiveConfiguration.ReadOnly = true; - return COMMAND_INFO_OK_ID; - } else if (InParam[0] == COMMAND_CHAR_FALSE) { - 1bb2: 80 33 cpi r24, 0x30 ; 48 - 1bb4: 11 f0 breq .+4 ; 0x1bba - ActiveConfiguration.ReadOnly = false; - return COMMAND_INFO_OK_ID; - } - } - - return COMMAND_ERR_INVALID_PARAM_ID; - 1bb6: 8a ec ldi r24, 0xCA ; 202 -} - 1bb8: 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; - 1bba: 10 92 fc 24 sts 0x24FC, r1 - return COMMAND_INFO_OK_ID; - 1bbe: 84 e6 ldi r24, 0x64 ; 100 - 1bc0: 08 95 ret - -CommandStatusIdType CommandSetReadOnly(const char* InParam) -{ - if (InParam[1] == '\0') { - if (InParam[0] == COMMAND_CHAR_TRUE) { - ActiveConfiguration.ReadOnly = true; - 1bc2: 81 e0 ldi r24, 0x01 ; 1 - 1bc4: 80 93 fc 24 sts 0x24FC, r24 - return COMMAND_INFO_OK_ID; - 1bc8: 84 e6 ldi r24, 0x64 ; 100 - 1bca: 08 95 ret - -00001bcc : - return COMMAND_ERR_INVALID_PARAM_ID; -} - -CommandStatusIdType CommandExecUpload(char* OutMessage) -{ - XModemReceive(MemoryUploadBlock); - 1bcc: 80 e1 ldi r24, 0x10 ; 16 - 1bce: 98 e0 ldi r25, 0x08 ; 8 - 1bd0: f8 d0 rcall .+496 ; 0x1dc2 - return COMMAND_INFO_XMODEM_WAIT_ID; -} - 1bd2: 8e e6 ldi r24, 0x6E ; 110 - 1bd4: 08 95 ret - -00001bd6 : - -CommandStatusIdType CommandExecDownload(char* OutMessage) -{ - XModemSend(MemoryDownloadBlock); - 1bd6: 81 ef ldi r24, 0xF1 ; 241 - 1bd8: 99 e0 ldi r25, 0x09 ; 9 - 1bda: 0b d1 rcall .+534 ; 0x1df2 - return COMMAND_INFO_XMODEM_WAIT_ID; -} - 1bdc: 8e e6 ldi r24, 0x6E ; 110 - 1bde: 08 95 ret - -00001be0 : - * 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; - 1be0: e0 ec ldi r30, 0xC0 ; 192 - 1be2: f4 e0 ldi r31, 0x04 ; 4 - 1be4: 81 81 ldd r24, Z+1 ; 0x01 - 1be6: 8e 7f andi r24, 0xFE ; 254 - 1be8: 81 83 std Z+1, r24 ; 0x01 - -CommandStatusIdType CommandExecReset(char* OutMessage) -{ - USB_Detach(); - USB_Disable(); - 1bea: 0e 94 73 22 call 0x44e6 ; 0x44e6 - - SystemReset(); - 1bee: 0e 94 2a 04 call 0x854 ; 0x854 - - return COMMAND_INFO_OK_ID; -} - 1bf2: 84 e6 ldi r24, 0x64 ; 100 - 1bf4: 08 95 ret - -00001bf6 : - 1bf6: e0 ec ldi r30, 0xC0 ; 192 - 1bf8: f4 e0 ldi r31, 0x04 ; 4 - 1bfa: 81 81 ldd r24, Z+1 ; 0x01 - 1bfc: 8e 7f andi r24, 0xFE ; 254 - 1bfe: 81 83 std Z+1, r24 ; 0x01 - -#ifdef SUPPORT_FIRMWARE_UPGRADE -CommandStatusIdType CommandExecUpgrade(char* OutMessage) -{ - USB_Detach(); - USB_Disable(); - 1c00: 0e 94 73 22 call 0x44e6 ; 0x44e6 - - SystemEnterBootloader(); - 1c04: 0e 94 31 04 call 0x862 ; 0x862 - - return COMMAND_INFO_OK_ID; -} - 1c08: 84 e6 ldi r24, 0x64 ; 100 - 1c0a: 08 95 ret - -00001c0c : -#endif - -CommandStatusIdType CommandGetMemSize(char* OutParam) -{ - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.MemorySize); - 1c0c: e9 ef ldi r30, 0xF9 ; 249 - 1c0e: f4 e2 ldi r31, 0x24 ; 36 - 1c10: 21 81 ldd r18, Z+1 ; 0x01 - 1c12: 2f 93 push r18 - 1c14: 20 81 ld r18, Z - 1c16: 2f 93 push r18 - 1c18: 2e e6 ldi r18, 0x6E ; 110 - 1c1a: 34 e0 ldi r19, 0x04 ; 4 - 1c1c: 3f 93 push r19 - 1c1e: 2f 93 push r18 - 1c20: 21 e0 ldi r18, 0x01 ; 1 - 1c22: 2f 93 push r18 - 1c24: 1f 92 push r1 - 1c26: 9f 93 push r25 - 1c28: 8f 93 push r24 - 1c2a: 0e 94 00 26 call 0x4c00 ; 0x4c00 - - return COMMAND_INFO_OK_WITH_TEXT_ID; - 1c2e: 8d b7 in r24, 0x3d ; 61 - 1c30: 9e b7 in r25, 0x3e ; 62 - 1c32: 08 96 adiw r24, 0x08 ; 8 - 1c34: 8d bf out 0x3d, r24 ; 61 - 1c36: 9e bf out 0x3e, r25 ; 62 -} - 1c38: 85 e6 ldi r24, 0x65 ; 101 - 1c3a: 08 95 ret - -00001c3c : - -CommandStatusIdType CommandGetUidSize(char* OutParam) -{ - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.UidSize); - 1c3c: 20 91 fb 24 lds r18, 0x24FB - 1c40: 1f 92 push r1 - 1c42: 2f 93 push r18 - 1c44: 21 e7 ldi r18, 0x71 ; 113 - 1c46: 34 e0 ldi r19, 0x04 ; 4 - 1c48: 3f 93 push r19 - 1c4a: 2f 93 push r18 - 1c4c: 21 e0 ldi r18, 0x01 ; 1 - 1c4e: 2f 93 push r18 - 1c50: 1f 92 push r1 - 1c52: 9f 93 push r25 - 1c54: 8f 93 push r24 - 1c56: 0e 94 00 26 call 0x4c00 ; 0x4c00 - - return COMMAND_INFO_OK_WITH_TEXT_ID; - 1c5a: 8d b7 in r24, 0x3d ; 61 - 1c5c: 9e b7 in r25, 0x3e ; 62 - 1c5e: 08 96 adiw r24, 0x08 ; 8 - 1c60: 8d bf out 0x3d, r24 ; 61 - 1c62: 9e bf out 0x3e, r25 ; 62 -} - 1c64: 85 e6 ldi r24, 0x65 ; 101 - 1c66: 08 95 ret - -00001c68 : - -CommandStatusIdType CommandExecButton(char* OutMessage) -{ - ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - 1c68: 60 e0 ldi r22, 0x00 ; 0 - 1c6a: 71 e0 ldi r23, 0x01 ; 1 - 1c6c: e3 dc rcall .-1594 ; 0x1634 - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1c6e: 85 e6 ldi r24, 0x65 ; 101 - 1c70: 08 95 ret - -00001c72 : - -CommandStatusIdType CommandGetButton(char* OutParam) -{ - ButtonGetActionByName(OutParam, TERMINAL_BUFFER_SIZE); - 1c72: 60 e0 ldi r22, 0x00 ; 0 - 1c74: 71 e0 ldi r23, 0x01 ; 1 - 1c76: 16 dd rcall .-1492 ; 0x16a4 - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1c78: 85 e6 ldi r24, 0x65 ; 101 - 1c7a: 08 95 ret - -00001c7c : - -CommandStatusIdType CommandSetButton(const char* InParam) -{ - if (ButtonSetActionByName(InParam)) { - 1c7c: 21 dd rcall .-1470 ; 0x16c0 - 1c7e: 81 11 cpse r24, r1 - 1c80: 02 c0 rjmp .+4 ; 0x1c86 - SettingsSave(); - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - 1c82: 8a ec ldi r24, 0xCA ; 202 - } -} - 1c84: 08 95 ret -} - -CommandStatusIdType CommandSetButton(const char* InParam) -{ - if (ButtonSetActionByName(InParam)) { - SettingsSave(); - 1c86: 7f dd rcall .-1282 ; 0x1786 - return COMMAND_INFO_OK_ID; - 1c88: 84 e6 ldi r24, 0x64 ; 100 - 1c8a: 08 95 ret - -00001c8c : - } -} - -CommandStatusIdType CommandGetSetting(char* OutParam) -{ - SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); - 1c8c: 60 e0 ldi r22, 0x00 ; 0 - 1c8e: 71 e0 ldi r23, 0x01 ; 1 - 1c90: 08 de rcall .-1008 ; 0x18a2 - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1c92: 85 e6 ldi r24, 0x65 ; 101 - 1c94: 08 95 ret - -00001c96 : - -CommandStatusIdType CommandSetSetting(const char* InParam) -{ - if (SettingsSetActiveByName(InParam)) { - 1c96: 0f de rcall .-994 ; 0x18b6 - 1c98: 81 11 cpse r24, r1 - 1c9a: 02 c0 rjmp .+4 ; 0x1ca0 - SettingsSave(); - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - 1c9c: 8a ec ldi r24, 0xCA ; 202 - } -} - 1c9e: 08 95 ret -} - -CommandStatusIdType CommandSetSetting(const char* InParam) -{ - if (SettingsSetActiveByName(InParam)) { - SettingsSave(); - 1ca0: 72 dd rcall .-1308 ; 0x1786 - return COMMAND_INFO_OK_ID; - 1ca2: 84 e6 ldi r24, 0x64 ; 100 - 1ca4: 08 95 ret - -00001ca6 : - } -} - -CommandStatusIdType CommandExecClear(char* OutParam) -{ - MemoryClear(); - 1ca6: 0e 94 d3 05 call 0xba6 ; 0xba6 - return COMMAND_INFO_OK_ID; -} - 1caa: 84 e6 ldi r24, 0x64 ; 100 - 1cac: 08 95 ret - -00001cae : - -CommandStatusIdType CommandExecHelp(char* OutMessage) -{ - 1cae: bf 92 push r11 - 1cb0: cf 92 push r12 - 1cb2: df 92 push r13 - 1cb4: ef 92 push r14 - 1cb6: ff 92 push r15 - 1cb8: 0f 93 push r16 - 1cba: 1f 93 push r17 - 1cbc: cf 93 push r28 - 1cbe: df 93 push r29 - 1cc0: 7c 01 movw r14, r24 - const CommandEntryType* EntryPtr = CommandTable; - uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ - 1cc2: cf ef ldi r28, 0xFF ; 255 - 1cc4: d0 e0 ldi r29, 0x00 ; 0 - return COMMAND_INFO_OK_ID; -} - -CommandStatusIdType CommandExecHelp(char* OutMessage) -{ - const CommandEntryType* EntryPtr = CommandTable; - 1cc6: 3b e7 ldi r19, 0x7B ; 123 - 1cc8: c3 2e mov r12, r19 - 1cca: 34 e0 ldi r19, 0x04 ; 4 - 1ccc: d3 2e mov r13, r19 - *OutMessage++ = c; - CommandName++; - ByteCount--; - } - - *OutMessage++ = ','; - 1cce: 4c e2 ldi r20, 0x2C ; 44 - 1cd0: b4 2e mov r11, r20 -CommandStatusIdType CommandExecHelp(char* OutMessage) -{ - const CommandEntryType* EntryPtr = CommandTable; - uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ - - while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { - 1cd2: 86 01 movw r16, r12 - 1cd4: b6 01 movw r22, r12 - 1cd6: 80 e9 ldi r24, 0x90 ; 144 - 1cd8: 90 e2 ldi r25, 0x20 ; 32 - 1cda: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1cde: 89 2b or r24, r25 - 1ce0: 21 f1 breq .+72 ; 0x1d2a - const char* CommandName = EntryPtr->Command; - char c; - - while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { - 1ce2: f6 01 movw r30, r12 - 1ce4: 84 91 lpm r24, Z - 1ce6: 88 23 and r24, r24 - 1ce8: 89 f0 breq .+34 ; 0x1d0c - 1cea: c1 32 cpi r28, 0x21 ; 33 - 1cec: d1 05 cpc r29, r1 - 1cee: 70 f0 brcs .+28 ; 0x1d0c - 1cf0: d7 01 movw r26, r14 - 1cf2: 03 c0 rjmp .+6 ; 0x1cfa - 1cf4: c0 32 cpi r28, 0x20 ; 32 - 1cf6: d1 05 cpc r29, r1 - 1cf8: 49 f0 breq .+18 ; 0x1d0c - *OutMessage++ = c; - 1cfa: 8d 93 st X+, r24 - 1cfc: 7d 01 movw r14, r26 - CommandName++; - 1cfe: 0f 5f subi r16, 0xFF ; 255 - 1d00: 1f 4f sbci r17, 0xFF ; 255 - ByteCount--; - 1d02: 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) { - 1d04: f8 01 movw r30, r16 - 1d06: 84 91 lpm r24, Z - 1d08: 81 11 cpse r24, r1 - 1d0a: f4 cf rjmp .-24 ; 0x1cf4 - *OutMessage++ = c; - CommandName++; - ByteCount--; - } - - *OutMessage++ = ','; - 1d0c: f7 01 movw r30, r14 - 1d0e: b1 92 st Z+, r11 - 1d10: 7f 01 movw r14, r30 - ByteCount--; - 1d12: 21 97 sbiw r28, 0x01 ; 1 - - EntryPtr++; - 1d14: f6 e1 ldi r31, 0x16 ; 22 - 1d16: cf 0e add r12, r31 - 1d18: d1 1c adc r13, r1 -CommandStatusIdType CommandExecHelp(char* OutMessage) -{ - const CommandEntryType* EntryPtr = CommandTable; - uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ - - while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) { - 1d1a: 86 01 movw r16, r12 - 1d1c: b6 01 movw r22, r12 - 1d1e: 80 e9 ldi r24, 0x90 ; 144 - 1d20: 90 e2 ldi r25, 0x20 ; 32 - 1d22: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 1d26: 89 2b or r24, r25 - 1d28: e1 f6 brne .-72 ; 0x1ce2 - ByteCount--; - - EntryPtr++; - } - - *--OutMessage = '\0'; - 1d2a: f7 01 movw r30, r14 - 1d2c: 31 97 sbiw r30, 0x01 ; 1 - 1d2e: 10 82 st Z, r1 - - return COMMAND_INFO_OK_WITH_TEXT_ID; -} - 1d30: 85 e6 ldi r24, 0x65 ; 101 - 1d32: df 91 pop r29 - 1d34: cf 91 pop r28 - 1d36: 1f 91 pop r17 - 1d38: 0f 91 pop r16 - 1d3a: ff 90 pop r15 - 1d3c: ef 90 pop r14 - 1d3e: df 90 pop r13 - 1d40: cf 90 pop r12 - 1d42: bf 90 pop r11 - 1d44: 08 95 ret - -00001d46 : - -CommandStatusIdType CommandGetRssi(char* OutParam) -{ - 1d46: fc 01 movw r30, r24 -} - -static inline -uint16_t AntennaLevelGet(void) -{ - ADCA.CH0.CTRL |= ADC_CH_START_bm; - 1d48: 20 91 20 02 lds r18, 0x0220 - 1d4c: 20 68 ori r18, 0x80 ; 128 - 1d4e: 20 93 20 02 sts 0x0220, r18 - while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); - 1d52: 20 91 23 02 lds r18, 0x0223 - 1d56: 20 ff sbrs r18, 0 - 1d58: fc cf rjmp .-8 ; 0x1d52 - - ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; - 1d5a: 81 e0 ldi r24, 0x01 ; 1 - 1d5c: 80 93 23 02 sts 0x0223, r24 - - int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; - 1d60: a0 91 10 02 lds r26, 0x0210 - 1d64: b0 91 11 02 lds r27, 0x0211 - if (Result < 0) Result = 0; - - return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); - 1d68: ae 5b subi r26, 0xBE ; 190 - 1d6a: b1 09 sbc r27, r1 - 1d6c: b7 fd sbrc r27, 7 - 1d6e: 1c c0 rjmp .+56 ; 0x1da8 - 1d70: 29 e6 ldi r18, 0x69 ; 105 - 1d72: 37 e5 ldi r19, 0x57 ; 87 - 1d74: 4b e0 ldi r20, 0x0B ; 11 - 1d76: 50 e0 ldi r21, 0x00 ; 0 - 1d78: 0e 94 60 25 call 0x4ac0 ; 0x4ac0 <__mulshisi3> - 1d7c: aa 27 eor r26, r26 - 1d7e: bb 27 eor r27, r27 - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 1d80: 9f 93 push r25 - 1d82: 8f 93 push r24 - 1d84: 24 e7 ldi r18, 0x74 ; 116 - 1d86: 34 e0 ldi r19, 0x04 ; 4 - 1d88: 3f 93 push r19 - 1d8a: 2f 93 push r18 - 1d8c: 81 e0 ldi r24, 0x01 ; 1 - 1d8e: 8f 93 push r24 - 1d90: 1f 92 push r1 - 1d92: ff 93 push r31 - 1d94: ef 93 push r30 - 1d96: 0e 94 00 26 call 0x4c00 ; 0x4c00 - PSTR("%5u mV"), AntennaLevelGet()); - - - return COMMAND_INFO_OK_WITH_TEXT_ID; - 1d9a: 8d b7 in r24, 0x3d ; 61 - 1d9c: 9e b7 in r25, 0x3e ; 62 - 1d9e: 08 96 adiw r24, 0x08 ; 8 - 1da0: 8d bf out 0x3d, r24 ; 61 - 1da2: 9e bf out 0x3e, r25 ; 62 -} - 1da4: 85 e6 ldi r24, 0x65 ; 101 - 1da6: 08 95 ret - 1da8: a0 e0 ldi r26, 0x00 ; 0 - 1daa: b0 e0 ldi r27, 0x00 ; 0 - 1dac: e1 cf rjmp .-62 ; 0x1d70 - -00001dae : -static uint32_t BlockAddress; - -static XModemCallbackType CallbackFunc; - -static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { - uint8_t Checksum = CHECKSUM_INIT_VALUE; - 1dae: 80 e0 ldi r24, 0x00 ; 0 - uint8_t* DataPtr = (uint8_t*) Buffer; - 1db0: e0 e1 ldi r30, 0x10 ; 16 - 1db2: f5 e2 ldi r31, 0x25 ; 37 - - while(ByteCount--) { - Checksum += *DataPtr++; - 1db4: 91 91 ld r25, Z+ - 1db6: 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--) { - 1db8: 95 e2 ldi r25, 0x25 ; 37 - 1dba: e0 39 cpi r30, 0x90 ; 144 - 1dbc: f9 07 cpc r31, r25 - 1dbe: d1 f7 brne .-12 ; 0x1db4 - Checksum += *DataPtr++; - } - - return Checksum; -} - 1dc0: 08 95 ret - -00001dc2 : - -void XModemReceive(XModemCallbackType TheCallbackFunc) -{ - State = STATE_RECEIVE_INIT; - 1dc2: 21 e0 ldi r18, 0x01 ; 1 - 1dc4: 20 93 95 24 sts 0x2495, r18 - CurrentFrameNumber = FIRST_FRAME_NUMBER; - 1dc8: 20 93 96 24 sts 0x2496, r18 - RetryCount = RECV_INIT_COUNT; - 1dcc: 24 e1 ldi r18, 0x14 ; 20 - 1dce: 20 93 97 24 sts 0x2497, r18 - RetryTimeout = RECV_INIT_TIMEOUT; - 1dd2: 25 e0 ldi r18, 0x05 ; 5 - 1dd4: 20 93 98 24 sts 0x2498, r18 - BlockAddress = 0; - 1dd8: 10 92 99 24 sts 0x2499, r1 - 1ddc: 10 92 9a 24 sts 0x249A, r1 - 1de0: 10 92 9b 24 sts 0x249B, r1 - 1de4: 10 92 9c 24 sts 0x249C, r1 - - CallbackFunc = TheCallbackFunc; - 1de8: 80 93 9d 24 sts 0x249D, r24 - 1dec: 90 93 9e 24 sts 0x249E, r25 - 1df0: 08 95 ret - -00001df2 : -} - -void XModemSend(XModemCallbackType TheCallbackFunc) -{ - State = STATE_SEND_INIT; - 1df2: 27 e0 ldi r18, 0x07 ; 7 - 1df4: 20 93 95 24 sts 0x2495, r18 - RetryTimeout = SEND_INIT_TIMEOUT; - 1df8: 24 e6 ldi r18, 0x64 ; 100 - 1dfa: 20 93 98 24 sts 0x2498, r18 - BlockAddress = 0; - 1dfe: 10 92 99 24 sts 0x2499, r1 - 1e02: 10 92 9a 24 sts 0x249A, r1 - 1e06: 10 92 9b 24 sts 0x249B, r1 - 1e0a: 10 92 9c 24 sts 0x249C, r1 - - CallbackFunc = TheCallbackFunc; - 1e0e: 80 93 9d 24 sts 0x249D, r24 - 1e12: 90 93 9e 24 sts 0x249E, r25 - 1e16: 08 95 ret - -00001e18 : -} - -bool XModemProcessByte(uint8_t Byte) -{ - 1e18: cf 93 push r28 - 1e1a: c8 2f mov r28, r24 - switch(State) { - 1e1c: 90 91 95 24 lds r25, 0x2495 - 1e20: 95 30 cpi r25, 0x05 ; 5 - 1e22: 09 f4 brne .+2 ; 0x1e26 - 1e24: 7f c0 rjmp .+254 ; 0x1f24 - 1e26: e0 f0 brcs .+56 ; 0x1e60 - 1e28: 97 30 cpi r25, 0x07 ; 7 - 1e2a: 09 f4 brne .+2 ; 0x1e2e - 1e2c: 4a c0 rjmp .+148 ; 0x1ec2 - 1e2e: 60 f5 brcc .+88 ; 0x1e88 - } - - break; - - case STATE_RECEIVE_PROCESS: - if (ReceivedFrameNumber == CurrentFrameNumber) { - 1e30: 20 91 a2 24 lds r18, 0x24A2 - 1e34: 80 91 96 24 lds r24, 0x2496 - 1e38: 28 17 cp r18, r24 - 1e3a: 09 f4 brne .+2 ; 0x1e3e - 1e3c: df c0 rjmp .+446 ; 0x1ffc - } else { - /* Data seems to be damaged */ - TerminalSendByte(BYTE_NAK); - State = STATE_RECEIVE_WAIT; - } - } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { - 1e3e: 30 e0 ldi r19, 0x00 ; 0 - 1e40: 90 e0 ldi r25, 0x00 ; 0 - 1e42: 01 97 sbiw r24, 0x01 ; 1 - 1e44: 28 17 cp r18, r24 - 1e46: 39 07 cpc r19, r25 - 1e48: 09 f4 brne .+2 ; 0x1e4c - 1e4a: 07 c1 rjmp .+526 ; 0x205a -INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } - 1e4c: 68 e1 ldi r22, 0x18 ; 24 - 1e4e: 80 e0 ldi r24, 0x00 ; 0 - 1e50: 90 e2 ldi r25, 0x20 ; 32 - 1e52: 0e 94 c9 23 call 0x4792 ; 0x4792 - TerminalSendByte(BYTE_ACK); - State = STATE_RECEIVE_WAIT; - } else { - /* This frame is completely out of order. Just cancel */ - TerminalSendByte(BYTE_CAN); - State = STATE_OFF; - 1e56: 10 92 95 24 sts 0x2495, r1 - default: - return false; - break; - } - - return true; - 1e5a: 81 e0 ldi r24, 0x01 ; 1 -} - 1e5c: cf 91 pop r28 - 1e5e: 08 95 ret - CallbackFunc = TheCallbackFunc; -} - -bool XModemProcessByte(uint8_t Byte) -{ - switch(State) { - 1e60: 93 30 cpi r25, 0x03 ; 3 - 1e62: 09 f4 brne .+2 ; 0x1e66 - 1e64: 57 c0 rjmp .+174 ; 0x1f14 - 1e66: b8 f0 brcs .+46 ; 0x1e96 - ReceivedFrameNumber = Byte; - State = STATE_RECEIVE_FRAMENUM2; - break; - - case STATE_RECEIVE_FRAMENUM2: - if (Byte == (255 - ReceivedFrameNumber)) { - 1e68: 90 e0 ldi r25, 0x00 ; 0 - 1e6a: 40 91 a2 24 lds r20, 0x24A2 - 1e6e: 2f ef ldi r18, 0xFF ; 255 - 1e70: 30 e0 ldi r19, 0x00 ; 0 - 1e72: 24 1b sub r18, r20 - 1e74: 31 09 sbc r19, r1 - 1e76: 82 17 cp r24, r18 - 1e78: 93 07 cpc r25, r19 - 1e7a: 09 f0 breq .+2 ; 0x1e7e - 1e7c: 6a c0 rjmp .+212 ; 0x1f52 - /* frame-number check passed. */ - State = STATE_RECEIVE_DATA; - 1e7e: 85 e0 ldi r24, 0x05 ; 5 - 1e80: 80 93 95 24 sts 0x2495, r24 - default: - return false; - break; - } - - return true; - 1e84: 81 e0 ldi r24, 0x01 ; 1 - 1e86: ea cf rjmp .-44 ; 0x1e5c - CallbackFunc = TheCallbackFunc; -} - -bool XModemProcessByte(uint8_t Byte) -{ - switch(State) { - 1e88: 98 30 cpi r25, 0x08 ; 8 - 1e8a: f1 f0 breq .+60 ; 0x1ec8 - 1e8c: 99 30 cpi r25, 0x09 ; 9 - 1e8e: a1 f0 breq .+40 ; 0x1eb8 - /* Receive Ack */ - State = STATE_OFF; - break; - - default: - return false; - 1e90: 80 e0 ldi r24, 0x00 ; 0 - break; - } - - return true; -} - 1e92: cf 91 pop r28 - 1e94: 08 95 ret - CallbackFunc = TheCallbackFunc; -} - -bool XModemProcessByte(uint8_t Byte) -{ - switch(State) { - 1e96: 91 30 cpi r25, 0x01 ; 1 - 1e98: d8 f3 brcs .-10 ; 0x1e90 - case STATE_RECEIVE_INIT: - case STATE_RECEIVE_WAIT: - if (Byte == BYTE_SOH) { - 1e9a: 81 30 cpi r24, 0x01 ; 1 - 1e9c: 09 f4 brne .+2 ; 0x1ea0 - 1e9e: df c0 rjmp .+446 ; 0x205e - /* Next frame incoming */ - BufferIdx = 0; - Checksum = CHECKSUM_INIT_VALUE; - State = STATE_RECEIVE_FRAMENUM1; - } else if (Byte == BYTE_EOT) { - 1ea0: 84 30 cpi r24, 0x04 ; 4 - 1ea2: 29 f0 breq .+10 ; 0x1eae - /* Transmission finished */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - } else if (Byte == BYTE_CAN) { - 1ea4: 88 31 cpi r24, 0x18 ; 24 - 1ea6: 41 f0 breq .+16 ; 0x1eb8 - default: - return false; - break; - } - - return true; - 1ea8: 81 e0 ldi r24, 0x01 ; 1 -} - 1eaa: cf 91 pop r28 - 1eac: 08 95 ret - 1eae: 66 e0 ldi r22, 0x06 ; 6 - 1eb0: 80 e0 ldi r24, 0x00 ; 0 - 1eb2: 90 e2 ldi r25, 0x20 ; 32 - 1eb4: 0e 94 c9 23 call 0x4792 ; 0x4792 - - case STATE_SEND_WAIT: - if (Byte == BYTE_CAN) { - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - 1eb8: 10 92 95 24 sts 0x2495, r1 - default: - return false; - break; - } - - return true; - 1ebc: 81 e0 ldi r24, 0x01 ; 1 -} - 1ebe: cf 91 pop r28 - 1ec0: 08 95 ret - - break; - - case STATE_SEND_INIT: - /* Start sending on NAK */ - if (Byte == BYTE_NAK) { - 1ec2: 85 31 cpi r24, 0x15 ; 21 - 1ec4: 09 f4 brne .+2 ; 0x1ec8 - 1ec6: 50 c0 rjmp .+160 ; 0x1f68 - } - - /* Fallthrough */ - - case STATE_SEND_WAIT: - if (Byte == BYTE_CAN) { - 1ec8: c8 31 cpi r28, 0x18 ; 24 - 1eca: 89 f3 breq .-30 ; 0x1eae - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - } else if (Byte == BYTE_ACK) { - 1ecc: c6 30 cpi r28, 0x06 ; 6 - 1ece: 09 f4 brne .+2 ; 0x1ed2 - 1ed0: e1 c0 rjmp .+450 ; 0x2094 - BlockAddress += XMODEM_BLOCK_SIZE; - } else { - TerminalSendByte(BYTE_EOT); - State = STATE_SEND_EOT; - } - } else if (Byte == BYTE_NAK){ - 1ed2: c5 31 cpi r28, 0x15 ; 21 - 1ed4: 49 f7 brne .-46 ; 0x1ea8 - 1ed6: 61 e0 ldi r22, 0x01 ; 1 - 1ed8: 80 e0 ldi r24, 0x00 ; 0 - 1eda: 90 e2 ldi r25, 0x20 ; 32 - 1edc: 0e 94 c9 23 call 0x4792 ; 0x4792 - 1ee0: 60 91 96 24 lds r22, 0x2496 - 1ee4: 80 e0 ldi r24, 0x00 ; 0 - 1ee6: 90 e2 ldi r25, 0x20 ; 32 - 1ee8: 0e 94 c9 23 call 0x4792 ; 0x4792 - /* Resend frame */ - TerminalSendByte(BYTE_SOH); - TerminalSendByte(CurrentFrameNumber); - TerminalSendByte(255 - CurrentFrameNumber); - 1eec: 60 91 96 24 lds r22, 0x2496 - 1ef0: 60 95 com r22 - 1ef2: 80 e0 ldi r24, 0x00 ; 0 - 1ef4: 90 e2 ldi r25, 0x20 ; 32 - 1ef6: 0e 94 c9 23 call 0x4792 ; 0x4792 - TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 1efa: 60 e8 ldi r22, 0x80 ; 128 - 1efc: 70 e0 ldi r23, 0x00 ; 0 - 1efe: 80 e1 ldi r24, 0x10 ; 16 - 1f00: 95 e2 ldi r25, 0x25 ; 37 - 1f02: ff dc rcall .-1538 ; 0x1902 - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 1f04: 54 df rcall .-344 ; 0x1dae - 1f06: 68 2f mov r22, r24 - 1f08: 80 e0 ldi r24, 0x00 ; 0 - 1f0a: 90 e2 ldi r25, 0x20 ; 32 - 1f0c: 0e 94 c9 23 call 0x4792 ; 0x4792 - default: - return false; - break; - } - - return true; - 1f10: 81 e0 ldi r24, 0x01 ; 1 - 1f12: a4 cf rjmp .-184 ; 0x1e5c - - break; - - case STATE_RECEIVE_FRAMENUM1: - /* Store frame number */ - ReceivedFrameNumber = Byte; - 1f14: 80 93 a2 24 sts 0x24A2, r24 - State = STATE_RECEIVE_FRAMENUM2; - 1f18: 84 e0 ldi r24, 0x04 ; 4 - 1f1a: 80 93 95 24 sts 0x2495, r24 - default: - return false; - break; - } - - return true; - 1f1e: 81 e0 ldi r24, 0x01 ; 1 -} - 1f20: cf 91 pop r28 - 1f22: 08 95 ret - - break; - - case STATE_RECEIVE_DATA: - /* Process byte and update checksum */ - TerminalBuffer[BufferIdx++] = Byte; - 1f24: 20 91 9f 24 lds r18, 0x249F - 1f28: 30 91 a0 24 lds r19, 0x24A0 - 1f2c: f9 01 movw r30, r18 - 1f2e: e0 5f subi r30, 0xF0 ; 240 - 1f30: fa 4d sbci r31, 0xDA ; 218 - 1f32: 80 83 st Z, r24 - 1f34: c9 01 movw r24, r18 - 1f36: 01 96 adiw r24, 0x01 ; 1 - 1f38: 80 93 9f 24 sts 0x249F, r24 - 1f3c: 90 93 a0 24 sts 0x24A0, r25 - - if (BufferIdx == XMODEM_BLOCK_SIZE) { - 1f40: 80 38 cpi r24, 0x80 ; 128 - 1f42: 91 05 cpc r25, r1 - 1f44: 09 f0 breq .+2 ; 0x1f48 - 1f46: b0 cf rjmp .-160 ; 0x1ea8 - /* Block full */ - State = STATE_RECEIVE_PROCESS; - 1f48: 86 e0 ldi r24, 0x06 ; 6 - 1f4a: 80 93 95 24 sts 0x2495, r24 - default: - return false; - break; - } - - return true; - 1f4e: 81 e0 ldi r24, 0x01 ; 1 - 1f50: 85 cf rjmp .-246 ; 0x1e5c - 1f52: 65 e1 ldi r22, 0x15 ; 21 - 1f54: 80 e0 ldi r24, 0x00 ; 0 - 1f56: 90 e2 ldi r25, 0x20 ; 32 - 1f58: 0e 94 c9 23 call 0x4792 ; 0x4792 - State = STATE_RECEIVE_WAIT; - } - } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { - /* This is a retransmission */ - TerminalSendByte(BYTE_ACK); - State = STATE_RECEIVE_WAIT; - 1f5c: 82 e0 ldi r24, 0x02 ; 2 - 1f5e: 80 93 95 24 sts 0x2495, r24 - default: - return false; - break; - } - - return true; - 1f62: 81 e0 ldi r24, 0x01 ; 1 -} - 1f64: cf 91 pop r28 - 1f66: 08 95 ret - - break; - - case STATE_SEND_INIT: - /* Start sending on NAK */ - if (Byte == BYTE_NAK) { - 1f68: 81 e0 ldi r24, 0x01 ; 1 - /* Cancel */ - TerminalSendByte(BYTE_ACK); - State = STATE_OFF; - } else if (Byte == BYTE_ACK) { - /* Acknowledge. Proceed to next frame, get data and calc checksum */ - CurrentFrameNumber++; - 1f6a: 80 93 96 24 sts 0x2496, r24 - - if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 1f6e: 40 91 99 24 lds r20, 0x2499 - 1f72: 50 91 9a 24 lds r21, 0x249A - 1f76: 60 91 9b 24 lds r22, 0x249B - 1f7a: 70 91 9c 24 lds r23, 0x249C - 1f7e: e0 91 9d 24 lds r30, 0x249D - 1f82: f0 91 9e 24 lds r31, 0x249E - 1f86: 20 e8 ldi r18, 0x80 ; 128 - 1f88: 30 e0 ldi r19, 0x00 ; 0 - 1f8a: 80 e1 ldi r24, 0x10 ; 16 - 1f8c: 95 e2 ldi r25, 0x25 ; 37 - 1f8e: 09 95 icall - 1f90: 88 23 and r24, r24 - 1f92: 09 f4 brne .+2 ; 0x1f96 - 1f94: 6f c0 rjmp .+222 ; 0x2074 - 1f96: 61 e0 ldi r22, 0x01 ; 1 - 1f98: 80 e0 ldi r24, 0x00 ; 0 - 1f9a: 90 e2 ldi r25, 0x20 ; 32 - 1f9c: 0e 94 c9 23 call 0x4792 ; 0x4792 - 1fa0: 60 91 96 24 lds r22, 0x2496 - 1fa4: 80 e0 ldi r24, 0x00 ; 0 - 1fa6: 90 e2 ldi r25, 0x20 ; 32 - 1fa8: 0e 94 c9 23 call 0x4792 ; 0x4792 - TerminalSendByte(BYTE_SOH); - TerminalSendByte(CurrentFrameNumber); - TerminalSendByte(255 - CurrentFrameNumber); - 1fac: 60 91 96 24 lds r22, 0x2496 - 1fb0: 60 95 com r22 - 1fb2: 80 e0 ldi r24, 0x00 ; 0 - 1fb4: 90 e2 ldi r25, 0x20 ; 32 - 1fb6: 0e 94 c9 23 call 0x4792 ; 0x4792 - TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 1fba: 60 e8 ldi r22, 0x80 ; 128 - 1fbc: 70 e0 ldi r23, 0x00 ; 0 - 1fbe: 80 e1 ldi r24, 0x10 ; 16 - 1fc0: 95 e2 ldi r25, 0x25 ; 37 - 1fc2: 9f dc rcall .-1730 ; 0x1902 - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 1fc4: f4 de rcall .-536 ; 0x1dae - 1fc6: 68 2f mov r22, r24 - 1fc8: 80 e0 ldi r24, 0x00 ; 0 - 1fca: 90 e2 ldi r25, 0x20 ; 32 - 1fcc: 0e 94 c9 23 call 0x4792 ; 0x4792 - - BlockAddress += XMODEM_BLOCK_SIZE; - 1fd0: 80 91 99 24 lds r24, 0x2499 - 1fd4: 90 91 9a 24 lds r25, 0x249A - 1fd8: a0 91 9b 24 lds r26, 0x249B - 1fdc: b0 91 9c 24 lds r27, 0x249C - 1fe0: 80 58 subi r24, 0x80 ; 128 - 1fe2: 9f 4f sbci r25, 0xFF ; 255 - 1fe4: af 4f sbci r26, 0xFF ; 255 - 1fe6: bf 4f sbci r27, 0xFF ; 255 - 1fe8: 80 93 99 24 sts 0x2499, r24 - 1fec: 90 93 9a 24 sts 0x249A, r25 - 1ff0: a0 93 9b 24 sts 0x249B, r26 - 1ff4: b0 93 9c 24 sts 0x249C, r27 - default: - return false; - break; - } - - return true; - 1ff8: 81 e0 ldi r24, 0x01 ; 1 - 1ffa: 57 cf rjmp .-338 ; 0x1eaa - - case STATE_RECEIVE_PROCESS: - if (ReceivedFrameNumber == CurrentFrameNumber) { - /* This is the expected frame. Calculate and verify checksum */ - - if (CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE) == Byte) { - 1ffc: d8 de rcall .-592 ; 0x1dae - 1ffe: 8c 13 cpse r24, r28 - 2000: a8 cf rjmp .-176 ; 0x1f52 - /* Checksum is valid. Pass received data to callback function */ - if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 2002: 40 91 99 24 lds r20, 0x2499 - 2006: 50 91 9a 24 lds r21, 0x249A - 200a: 60 91 9b 24 lds r22, 0x249B - 200e: 70 91 9c 24 lds r23, 0x249C - 2012: e0 91 9d 24 lds r30, 0x249D - 2016: f0 91 9e 24 lds r31, 0x249E - 201a: 20 e8 ldi r18, 0x80 ; 128 - 201c: 30 e0 ldi r19, 0x00 ; 0 - 201e: 80 e1 ldi r24, 0x10 ; 16 - 2020: 95 e2 ldi r25, 0x25 ; 37 - 2022: 09 95 icall - 2024: 88 23 and r24, r24 - 2026: 81 f1 breq .+96 ; 0x2088 - /* Proceed to next frame and send ACK */ - CurrentFrameNumber++; - 2028: 80 91 96 24 lds r24, 0x2496 - 202c: 8f 5f subi r24, 0xFF ; 255 - 202e: 80 93 96 24 sts 0x2496, r24 - BlockAddress += XMODEM_BLOCK_SIZE; - 2032: 80 91 99 24 lds r24, 0x2499 - 2036: 90 91 9a 24 lds r25, 0x249A - 203a: a0 91 9b 24 lds r26, 0x249B - 203e: b0 91 9c 24 lds r27, 0x249C - 2042: 80 58 subi r24, 0x80 ; 128 - 2044: 9f 4f sbci r25, 0xFF ; 255 - 2046: af 4f sbci r26, 0xFF ; 255 - 2048: bf 4f sbci r27, 0xFF ; 255 - 204a: 80 93 99 24 sts 0x2499, r24 - 204e: 90 93 9a 24 sts 0x249A, r25 - 2052: a0 93 9b 24 sts 0x249B, r26 - 2056: b0 93 9c 24 sts 0x249C, r27 - 205a: 66 e0 ldi r22, 0x06 ; 6 - 205c: 7b cf rjmp .-266 ; 0x1f54 - switch(State) { - case STATE_RECEIVE_INIT: - case STATE_RECEIVE_WAIT: - if (Byte == BYTE_SOH) { - /* Next frame incoming */ - BufferIdx = 0; - 205e: 10 92 9f 24 sts 0x249F, r1 - 2062: 10 92 a0 24 sts 0x24A0, r1 - Checksum = CHECKSUM_INIT_VALUE; - 2066: 10 92 a1 24 sts 0x24A1, r1 - State = STATE_RECEIVE_FRAMENUM1; - 206a: 83 e0 ldi r24, 0x03 ; 3 - 206c: 80 93 95 24 sts 0x2495, r24 - default: - return false; - break; - } - - return true; - 2070: 81 e0 ldi r24, 0x01 ; 1 - 2072: f4 ce rjmp .-536 ; 0x1e5c - 2074: 64 e0 ldi r22, 0x04 ; 4 - 2076: 80 e0 ldi r24, 0x00 ; 0 - 2078: 90 e2 ldi r25, 0x20 ; 32 - 207a: 0e 94 c9 23 call 0x4792 ; 0x4792 - TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - - BlockAddress += XMODEM_BLOCK_SIZE; - } else { - TerminalSendByte(BYTE_EOT); - State = STATE_SEND_EOT; - 207e: 89 e0 ldi r24, 0x09 ; 9 - 2080: 80 93 95 24 sts 0x2495, r24 - default: - return false; - break; - } - - return true; - 2084: 81 e0 ldi r24, 0x01 ; 1 - 2086: ea ce rjmp .-556 ; 0x1e5c - 2088: 68 e1 ldi r22, 0x18 ; 24 - 208a: 80 e0 ldi r24, 0x00 ; 0 - 208c: 90 e2 ldi r25, 0x20 ; 32 - 208e: 0e 94 c9 23 call 0x4792 ; 0x4792 - 2092: dc ce rjmp .-584 ; 0x1e4c - 2094: 80 91 96 24 lds r24, 0x2496 - 2098: 8f 5f subi r24, 0xFF ; 255 - 209a: 67 cf rjmp .-306 ; 0x1f6a - -0000209c : -} - -void XModemTick(void) -{ - /* Timeouts go here */ - switch(State) { - 209c: 80 91 95 24 lds r24, 0x2495 - 20a0: 81 30 cpi r24, 0x01 ; 1 - 20a2: 71 f0 breq .+28 ; 0x20c0 - 20a4: 87 30 cpi r24, 0x07 ; 7 - 20a6: 09 f0 breq .+2 ; 0x20aa - 20a8: 08 95 ret - RetryTimeout = RECV_INIT_TIMEOUT; - } - break; - - case STATE_SEND_INIT: - if (RetryTimeout-- == 0) { - 20aa: 80 91 98 24 lds r24, 0x2498 - 20ae: 98 2f mov r25, r24 - 20b0: 91 50 subi r25, 0x01 ; 1 - 20b2: 90 93 98 24 sts 0x2498, r25 - 20b6: 81 11 cpse r24, r1 - 20b8: f7 cf rjmp .-18 ; 0x20a8 - /* Abort */ - State = STATE_OFF; - 20ba: 10 92 95 24 sts 0x2495, r1 - 20be: 08 95 ret -void XModemTick(void) -{ - /* Timeouts go here */ - switch(State) { - case STATE_RECEIVE_INIT: - if (RetryTimeout-- == 0) { - 20c0: 80 91 98 24 lds r24, 0x2498 - 20c4: 98 2f mov r25, r24 - 20c6: 91 50 subi r25, 0x01 ; 1 - 20c8: 90 93 98 24 sts 0x2498, r25 - 20cc: 81 11 cpse r24, r1 - 20ce: ec cf rjmp .-40 ; 0x20a8 - if (RetryCount-- > 0) { - 20d0: 80 91 97 24 lds r24, 0x2497 - 20d4: 98 2f mov r25, r24 - 20d6: 91 50 subi r25, 0x01 ; 1 - 20d8: 90 93 97 24 sts 0x2497, r25 - 20dc: 81 11 cpse r24, r1 - 20de: 06 c0 rjmp .+12 ; 0x20ec - /* Put out communication request */ - TerminalSendChar(BYTE_NAK); - } else { - /* Just shut off after some time. */ - State = STATE_OFF; - 20e0: 10 92 95 24 sts 0x2495, r1 - } - - RetryTimeout = RECV_INIT_TIMEOUT; - 20e4: 85 e0 ldi r24, 0x05 ; 5 - 20e6: 80 93 98 24 sts 0x2498, r24 - 20ea: 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); } - 20ec: 65 e1 ldi r22, 0x15 ; 21 - 20ee: 80 e0 ldi r24, 0x00 ; 0 - 20f0: 90 e2 ldi r25, 0x20 ; 32 - 20f2: 0e 94 c9 23 call 0x4792 ; 0x4792 - 20f6: f6 cf rjmp .-20 ; 0x20e4 - -000020f8 : -void CommandLineInit(void) -{ - BufferIdx = 0; -} - -bool CommandLineProcessByte(uint8_t Byte) { - 20f8: 1f 93 push r17 - 20fa: cf 93 push r28 - 20fc: df 93 push r29 - if (IS_CHARACTER(Byte)){ - 20fe: 98 2f mov r25, r24 - 2100: 91 54 subi r25, 0x41 ; 65 - 2102: 9a 31 cpi r25, 0x1A ; 26 - 2104: 20 f0 brcs .+8 ; 0x210e - 2106: 90 52 subi r25, 0x20 ; 32 - 2108: 9a 31 cpi r25, 0x1A ; 26 - 210a: b8 f4 brcc .+46 ; 0x213a - /* Store uppercase character */ - if (IS_LOWERCASE(Byte)) { - Byte = TO_UPPERCASE(Byte); - 210c: 80 52 subi r24, 0x20 ; 32 - } - - /* Prevent buffer overflow and account for '\0' */ - if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { - 210e: 20 91 a3 24 lds r18, 0x24A3 - 2112: 30 91 a4 24 lds r19, 0x24A4 - 2116: 2f 3f cpi r18, 0xFF ; 255 - 2118: 31 05 cpc r19, r1 - 211a: 50 f4 brcc .+20 ; 0x2130 - TerminalBuffer[BufferIdx++] = Byte; - 211c: f9 01 movw r30, r18 - 211e: e0 5f subi r30, 0xF0 ; 240 - 2120: fa 4d sbci r31, 0xDA ; 218 - 2122: 80 83 st Z, r24 - 2124: 2f 5f subi r18, 0xFF ; 255 - 2126: 3f 4f sbci r19, 0xFF ; 255 - 2128: 20 93 a3 24 sts 0x24A3, r18 - 212c: 30 93 a4 24 sts 0x24A4, r19 - } else { - /* Ignore other chars */ - } - - return true; -} - 2130: 81 e0 ldi r24, 0x01 ; 1 - 2132: df 91 pop r29 - 2134: cf 91 pop r28 - 2136: 1f 91 pop r17 - 2138: 08 95 ret -{ - BufferIdx = 0; -} - -bool CommandLineProcessByte(uint8_t Byte) { - if (IS_CHARACTER(Byte)){ - 213a: 9f 5c subi r25, 0xCF ; 207 - 213c: 9a 30 cpi r25, 0x0A ; 10 - 213e: 38 f3 brcs .-50 ; 0x210e - 2140: 8f 35 cpi r24, 0x5F ; 95 - 2142: 29 f3 breq .-54 ; 0x210e - 2144: 8f 33 cpi r24, 0x3F ; 63 - 2146: 19 f3 breq .-58 ; 0x210e - 2148: 8d 33 cpi r24, 0x3D ; 61 - 214a: 09 f3 breq .-62 ; 0x210e - - /* Prevent buffer overflow and account for '\0' */ - if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { - TerminalBuffer[BufferIdx++] = Byte; - } - }else if (Byte == '\r') { - 214c: 8d 30 cpi r24, 0x0D ; 13 - 214e: a9 f0 breq .+42 ; 0x217a - /* Process on \r. Terminate string and decode. */ - TerminalBuffer[BufferIdx] = '\0'; - BufferIdx = 0; - - DecodeCommand(); - }else if (Byte == '\b') { - 2150: 88 30 cpi r24, 0x08 ; 8 - 2152: 39 f0 breq .+14 ; 0x2162 - /* Backspace. Delete last character in buffer. */ - if (BufferIdx > 0) { - BufferIdx--; - } - } else if (Byte == 0x1B){ - 2154: 8b 31 cpi r24, 0x1B ; 27 - 2156: 61 f7 brne .-40 ; 0x2130 - /* Drop buffer on escape */ - BufferIdx = 0; - 2158: 10 92 a3 24 sts 0x24A3, r1 - 215c: 10 92 a4 24 sts 0x24A4, r1 - 2160: e7 cf rjmp .-50 ; 0x2130 - BufferIdx = 0; - - DecodeCommand(); - }else if (Byte == '\b') { - /* Backspace. Delete last character in buffer. */ - if (BufferIdx > 0) { - 2162: 80 91 a3 24 lds r24, 0x24A3 - 2166: 90 91 a4 24 lds r25, 0x24A4 - 216a: 00 97 sbiw r24, 0x00 ; 0 - 216c: 09 f3 breq .-62 ; 0x2130 - BufferIdx--; - 216e: 01 97 sbiw r24, 0x01 ; 1 - 2170: 80 93 a3 24 sts 0x24A3, r24 - 2174: 90 93 a4 24 sts 0x24A4, r25 - 2178: db cf rjmp .-74 ; 0x2130 - if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { - TerminalBuffer[BufferIdx++] = Byte; - } - }else if (Byte == '\r') { - /* Process on \r. Terminate string and decode. */ - TerminalBuffer[BufferIdx] = '\0'; - 217a: e0 91 a3 24 lds r30, 0x24A3 - 217e: f0 91 a4 24 lds r31, 0x24A4 - 2182: e0 5f subi r30, 0xF0 ; 240 - 2184: fa 4d sbci r31, 0xDA ; 218 - 2186: 10 82 st Z, r1 - BufferIdx = 0; - 2188: 10 92 a3 24 sts 0x24A3, r1 - 218c: 10 92 a4 24 sts 0x24A4, 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])) { - 2190: 80 91 10 25 lds r24, 0x2510 - 2194: 88 23 and r24, r24 - 2196: 09 f4 brne .+2 ; 0x219a - 2198: a2 c0 rjmp .+324 ; 0x22de - 219a: 8f 33 cpi r24, 0x3F ; 63 - 219c: 09 f4 brne .+2 ; 0x21a0 - 219e: 9f c0 rjmp .+318 ; 0x22de - 21a0: 8d 33 cpi r24, 0x3D ; 61 - 21a2: 09 f4 brne .+2 ; 0x21a6 - 21a4: 9c c0 rjmp .+312 ; 0x22de - 21a6: e1 e1 ldi r30, 0x11 ; 17 - 21a8: f5 e2 ldi r31, 0x25 ; 37 - 21aa: 04 c0 rjmp .+8 ; 0x21b4 - char* pCommandDelimiter = pTerminalBuffer; - char CommandDelimiter = '\0'; - - /* Search for command delimiter, store it and replace with '\0' */ - while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 21ac: 1f 33 cpi r17, 0x3F ; 63 - 21ae: 31 f0 breq .+12 ; 0x21bc - 21b0: 1d 33 cpi r17, 0x3D ; 61 - 21b2: 21 f0 breq .+8 ; 0x21bc - pCommandDelimiter++; - 21b4: ef 01 movw r28, r30 - if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { - char* pCommandDelimiter = pTerminalBuffer; - char CommandDelimiter = '\0'; - - /* Search for command delimiter, store it and replace with '\0' */ - while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 21b6: 11 91 ld r17, Z+ - 21b8: 11 11 cpse r17, r1 - 21ba: f8 cf rjmp .-16 ; 0x21ac - pCommandDelimiter++; - - CommandDelimiter = *pCommandDelimiter; - *pCommandDelimiter = '\0'; - 21bc: 18 82 st Y, r1 - - /* Search in command table */ - for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 21be: 6b e7 ldi r22, 0x7B ; 123 - 21c0: 74 e0 ldi r23, 0x04 ; 4 - 21c2: 80 e1 ldi r24, 0x10 ; 16 - 21c4: 95 e2 ldi r25, 0x25 ; 37 - 21c6: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 21ca: 89 2b or r24, r25 - 21cc: 09 f4 brne .+2 ; 0x21d0 - 21ce: 32 c1 rjmp .+612 ; 0x2434 - 21d0: 61 e9 ldi r22, 0x91 ; 145 - 21d2: 74 e0 ldi r23, 0x04 ; 4 - 21d4: 80 e1 ldi r24, 0x10 ; 16 - 21d6: 95 e2 ldi r25, 0x25 ; 37 - 21d8: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 21dc: 89 2b or r24, r25 - 21de: 09 f4 brne .+2 ; 0x21e2 - 21e0: 26 c1 rjmp .+588 ; 0x242e - 21e2: 67 ea ldi r22, 0xA7 ; 167 - 21e4: 74 e0 ldi r23, 0x04 ; 4 - 21e6: 80 e1 ldi r24, 0x10 ; 16 - 21e8: 95 e2 ldi r25, 0x25 ; 37 - 21ea: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 21ee: 89 2b or r24, r25 - 21f0: 09 f4 brne .+2 ; 0x21f4 - 21f2: 1a c1 rjmp .+564 ; 0x2428 - 21f4: 6d eb ldi r22, 0xBD ; 189 - 21f6: 74 e0 ldi r23, 0x04 ; 4 - 21f8: 80 e1 ldi r24, 0x10 ; 16 - 21fa: 95 e2 ldi r25, 0x25 ; 37 - 21fc: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 2200: 89 2b or r24, r25 - 2202: 09 f4 brne .+2 ; 0x2206 - 2204: 0e c1 rjmp .+540 ; 0x2422 - 2206: 63 ed ldi r22, 0xD3 ; 211 - 2208: 74 e0 ldi r23, 0x04 ; 4 - 220a: 80 e1 ldi r24, 0x10 ; 16 - 220c: 95 e2 ldi r25, 0x25 ; 37 - 220e: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 2212: 89 2b or r24, r25 - 2214: 09 f4 brne .+2 ; 0x2218 - 2216: 02 c1 rjmp .+516 ; 0x241c - 2218: 69 ee ldi r22, 0xE9 ; 233 - 221a: 74 e0 ldi r23, 0x04 ; 4 - 221c: 80 e1 ldi r24, 0x10 ; 16 - 221e: 95 e2 ldi r25, 0x25 ; 37 - 2220: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 2224: 89 2b or r24, r25 - 2226: 09 f4 brne .+2 ; 0x222a - 2228: f6 c0 rjmp .+492 ; 0x2416 - 222a: 6f ef ldi r22, 0xFF ; 255 - 222c: 74 e0 ldi r23, 0x04 ; 4 - 222e: 80 e1 ldi r24, 0x10 ; 16 - 2230: 95 e2 ldi r25, 0x25 ; 37 - 2232: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 2236: 89 2b or r24, r25 - 2238: 09 f4 brne .+2 ; 0x223c - 223a: ea c0 rjmp .+468 ; 0x2410 - 223c: 65 e1 ldi r22, 0x15 ; 21 - 223e: 75 e0 ldi r23, 0x05 ; 5 - 2240: 80 e1 ldi r24, 0x10 ; 16 - 2242: 95 e2 ldi r25, 0x25 ; 37 - 2244: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 2248: 89 2b or r24, r25 - 224a: 09 f4 brne .+2 ; 0x224e - 224c: de c0 rjmp .+444 ; 0x240a - 224e: 6b e2 ldi r22, 0x2B ; 43 - 2250: 75 e0 ldi r23, 0x05 ; 5 - 2252: 80 e1 ldi r24, 0x10 ; 16 - 2254: 95 e2 ldi r25, 0x25 ; 37 - 2256: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 225a: 89 2b or r24, r25 - 225c: 09 f4 brne .+2 ; 0x2260 - 225e: d2 c0 rjmp .+420 ; 0x2404 - 2260: 61 e4 ldi r22, 0x41 ; 65 - 2262: 75 e0 ldi r23, 0x05 ; 5 - 2264: 80 e1 ldi r24, 0x10 ; 16 - 2266: 95 e2 ldi r25, 0x25 ; 37 - 2268: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 226c: 89 2b or r24, r25 - 226e: 09 f4 brne .+2 ; 0x2272 - 2270: c6 c0 rjmp .+396 ; 0x23fe - 2272: 67 e5 ldi r22, 0x57 ; 87 - 2274: 75 e0 ldi r23, 0x05 ; 5 - 2276: 80 e1 ldi r24, 0x10 ; 16 - 2278: 95 e2 ldi r25, 0x25 ; 37 - 227a: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 227e: 89 2b or r24, r25 - 2280: 09 f4 brne .+2 ; 0x2284 - 2282: ba c0 rjmp .+372 ; 0x23f8 - 2284: 6d e6 ldi r22, 0x6D ; 109 - 2286: 75 e0 ldi r23, 0x05 ; 5 - 2288: 80 e1 ldi r24, 0x10 ; 16 - 228a: 95 e2 ldi r25, 0x25 ; 37 - 228c: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 2290: 89 2b or r24, r25 - 2292: 09 f4 brne .+2 ; 0x2296 - 2294: ae c0 rjmp .+348 ; 0x23f2 - 2296: 63 e8 ldi r22, 0x83 ; 131 - 2298: 75 e0 ldi r23, 0x05 ; 5 - 229a: 80 e1 ldi r24, 0x10 ; 16 - 229c: 95 e2 ldi r25, 0x25 ; 37 - 229e: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 22a2: 89 2b or r24, r25 - 22a4: 09 f4 brne .+2 ; 0x22a8 - 22a6: a2 c0 rjmp .+324 ; 0x23ec - 22a8: 69 e9 ldi r22, 0x99 ; 153 - 22aa: 75 e0 ldi r23, 0x05 ; 5 - 22ac: 80 e1 ldi r24, 0x10 ; 16 - 22ae: 95 e2 ldi r25, 0x25 ; 37 - 22b0: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 22b4: 89 2b or r24, r25 - 22b6: 09 f4 brne .+2 ; 0x22ba - 22b8: 96 c0 rjmp .+300 ; 0x23e6 - 22ba: 6f ea ldi r22, 0xAF ; 175 - 22bc: 75 e0 ldi r23, 0x05 ; 5 - 22be: 80 e1 ldi r24, 0x10 ; 16 - 22c0: 95 e2 ldi r25, 0x25 ; 37 - 22c2: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 22c6: 89 2b or r24, r25 - 22c8: 09 f4 brne .+2 ; 0x22cc - 22ca: 8a c0 rjmp .+276 ; 0x23e0 - 22cc: 65 ec ldi r22, 0xC5 ; 197 - 22ce: 75 e0 ldi r23, 0x05 ; 5 - 22d0: 80 e1 ldi r24, 0x10 ; 16 - 22d2: 95 e2 ldi r25, 0x25 ; 37 - 22d4: 0e 94 df 25 call 0x4bbe ; 0x4bbe - 22d8: 89 2b or r24, r25 - 22da: 09 f4 brne .+2 ; 0x22de - 22dc: 52 c0 rjmp .+164 ; 0x2382 - -static void DecodeCommand(void) -{ - uint8_t i; - bool CommandFound = false; - CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; - 22de: 88 ec ldi r24, 0xC8 ; 200 -} - -static void DecodeCommand(void) -{ - uint8_t i; - bool CommandFound = false; - 22e0: c0 e0 ldi r28, 0x00 ; 0 -static const char* GetStatusMessageP(CommandStatusIdType StatusId) -{ - uint8_t i; - - for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { - if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 22e2: e1 ee ldi r30, 0xE1 ; 225 - 22e4: f5 e0 ldi r31, 0x05 ; 5 - 22e6: e4 91 lpm r30, Z - 22e8: 8e 17 cp r24, r30 - 22ea: 09 f4 brne .+2 ; 0x22ee - 22ec: 30 c0 rjmp .+96 ; 0x234e - 22ee: e2 e0 ldi r30, 0x02 ; 2 - 22f0: f6 e0 ldi r31, 0x06 ; 6 - 22f2: e4 91 lpm r30, Z - 22f4: 8e 17 cp r24, r30 - 22f6: 09 f4 brne .+2 ; 0x22fa - 22f8: 41 c0 rjmp .+130 ; 0x237c - 22fa: e3 e2 ldi r30, 0x23 ; 35 - 22fc: f6 e0 ldi r31, 0x06 ; 6 - 22fe: e4 91 lpm r30, Z - 2300: 8e 17 cp r24, r30 - 2302: 09 f4 brne .+2 ; 0x2306 - 2304: 38 c0 rjmp .+112 ; 0x2376 - 2306: e4 e4 ldi r30, 0x44 ; 68 - 2308: f6 e0 ldi r31, 0x06 ; 6 - 230a: e4 91 lpm r30, Z - 230c: 8e 17 cp r24, r30 - 230e: 81 f1 breq .+96 ; 0x2370 - 2310: e5 e6 ldi r30, 0x65 ; 101 - 2312: f6 e0 ldi r31, 0x06 ; 6 - 2314: e4 91 lpm r30, Z - 2316: 8e 17 cp r24, r30 - 2318: 41 f1 breq .+80 ; 0x236a - 231a: e6 e8 ldi r30, 0x86 ; 134 - 231c: f6 e0 ldi r31, 0x06 ; 6 - 231e: e4 91 lpm r30, Z - 2320: 8e 17 cp r24, r30 - 2322: 01 f1 breq .+64 ; 0x2364 - return StatusTable[i].Message; - } - - return (void*) 0; - 2324: 80 e0 ldi r24, 0x00 ; 0 - 2326: 90 e0 ldi r25, 0x00 ; 0 - } - } - } - - /* Send command status message */ - TerminalSendStringP(GetStatusMessageP(StatusId)); - 2328: d8 da rcall .-2640 ; 0x18da - TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); - 232a: 8b ed ldi r24, 0xDB ; 219 - 232c: 95 e0 ldi r25, 0x05 ; 5 - 232e: d5 da rcall .-2646 ; 0x18da - - if (CommandFound && (pTerminalBuffer[0] != '\0') ) { - 2330: cc 23 and r28, r28 - 2332: 09 f4 brne .+2 ; 0x2336 - 2334: fd ce rjmp .-518 ; 0x2130 - 2336: 80 91 10 25 lds r24, 0x2510 - 233a: 88 23 and r24, r24 - 233c: 09 f4 brne .+2 ; 0x2340 - 233e: f8 ce rjmp .-528 ; 0x2130 - /* Send optional answer */ - TerminalSendString(pTerminalBuffer); - 2340: 80 e1 ldi r24, 0x10 ; 16 - 2342: 95 e2 ldi r25, 0x25 ; 37 - 2344: c5 da rcall .-2678 ; 0x18d0 - TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); - 2346: 8e ed ldi r24, 0xDE ; 222 - 2348: 95 e0 ldi r25, 0x05 ; 5 - 234a: c7 da rcall .-2674 ; 0x18da - 234c: f1 ce rjmp .-542 ; 0x2130 -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) - 234e: 20 e0 ldi r18, 0x00 ; 0 - 2350: 30 e0 ldi r19, 0x00 ; 0 - return StatusTable[i].Message; - 2352: 41 e2 ldi r20, 0x21 ; 33 - 2354: 42 9f mul r20, r18 - 2356: c0 01 movw r24, r0 - 2358: 43 9f mul r20, r19 - 235a: 90 0d add r25, r0 - 235c: 11 24 eor r1, r1 - 235e: 8e 51 subi r24, 0x1E ; 30 - 2360: 9a 4f sbci r25, 0xFA ; 250 - 2362: e2 cf rjmp .-60 ; 0x2328 -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) - 2364: 25 e0 ldi r18, 0x05 ; 5 - 2366: 30 e0 ldi r19, 0x00 ; 0 - 2368: f4 cf rjmp .-24 ; 0x2352 - 236a: 24 e0 ldi r18, 0x04 ; 4 - 236c: 30 e0 ldi r19, 0x00 ; 0 - 236e: f1 cf rjmp .-30 ; 0x2352 - 2370: 23 e0 ldi r18, 0x03 ; 3 - 2372: 30 e0 ldi r19, 0x00 ; 0 - 2374: ee cf rjmp .-36 ; 0x2352 - 2376: 22 e0 ldi r18, 0x02 ; 2 - 2378: 30 e0 ldi r19, 0x00 ; 0 - 237a: eb cf rjmp .-42 ; 0x2352 - 237c: 21 e0 ldi r18, 0x01 ; 1 - 237e: 30 e0 ldi r19, 0x00 ; 0 - 2380: e8 cf rjmp .-48 ; 0x2352 - CommandDelimiter = *pCommandDelimiter; - *pCommandDelimiter = '\0'; - - /* Search in command table */ - for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 2382: 2f e0 ldi r18, 0x0F ; 15 - 2384: 30 e0 ldi r19, 0x00 ; 0 - /* Command found. Clear buffer, and call appropriate function */ - char* pParam = ++pCommandDelimiter; - - pTerminalBuffer[0] = '\0'; - 2386: 10 92 10 25 sts 0x2510, r1 - CommandFound = true; - - StatusId = CallCommandFunc(&CommandTable[i], CommandDelimiter, pParam); - 238a: 46 e1 ldi r20, 0x16 ; 22 - 238c: 42 9f mul r20, r18 - 238e: c0 01 movw r24, r0 - 2390: 43 9f mul r20, r19 - 2392: 90 0d add r25, r0 - 2394: 11 24 eor r1, r1 - 2396: 85 58 subi r24, 0x85 ; 133 - 2398: 9b 4f sbci r25, 0xFB ; 251 -static CommandStatusIdType CallCommandFunc( - const CommandEntryType* CommandEntry, char CommandDelimiter, char* pParam) { - char* pTerminalBuffer = (char*) TerminalBuffer; - - /* Call appropriate function depending on CommandDelimiter */ - if (CommandDelimiter == CHAR_GET_MODE) { - 239a: 1f 33 cpi r17, 0x3F ; 63 - 239c: f9 f0 breq .+62 ; 0x23dc - CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); - if (GetFunc != NO_FUNCTION) { - return GetFunc(pTerminalBuffer); - } - } else if (CommandDelimiter == CHAR_SET_MODE) { - 239e: 1d 33 cpi r17, 0x3D ; 61 - 23a0: 89 f0 breq .+34 ; 0x23c4 - CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); - if (SetFunc != NO_FUNCTION) { - return SetFunc(pParam); - } - } else if (CommandDelimiter == CHAR_EXEC_MODE){ - 23a2: 11 23 and r17, r17 - 23a4: 19 f0 breq .+6 ; 0x23ac - } else { - /* This should not happen (TM) */ - } - - /* This delimiter has not been registered with this command */ - return COMMAND_ERR_INVALID_USAGE_ID; - 23a6: 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; - 23a8: c1 e0 ldi r28, 0x01 ; 1 - 23aa: 9b cf rjmp .-202 ; 0x22e2 - 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); - 23ac: 40 96 adiw r24, 0x10 ; 16 - 23ae: fc 01 movw r30, r24 - 23b0: 85 91 lpm r24, Z+ - 23b2: 94 91 lpm r25, Z - 23b4: fc 01 movw r30, r24 - if (ExecFunc != NO_FUNCTION) { - 23b6: 00 97 sbiw r24, 0x00 ; 0 - 23b8: b1 f3 breq .-20 ; 0x23a6 - return ExecFunc(pTerminalBuffer); - 23ba: 80 e1 ldi r24, 0x10 ; 16 - 23bc: 95 e2 ldi r25, 0x25 ; 37 - 23be: 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; - 23c0: c1 e0 ldi r28, 0x01 ; 1 - 23c2: 8f cf rjmp .-226 ; 0x22e2 - 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); - 23c4: 42 96 adiw r24, 0x12 ; 18 - 23c6: fc 01 movw r30, r24 - 23c8: 85 91 lpm r24, Z+ - 23ca: 94 91 lpm r25, Z - 23cc: fc 01 movw r30, r24 - if (SetFunc != NO_FUNCTION) { - 23ce: 00 97 sbiw r24, 0x00 ; 0 - 23d0: 51 f3 breq .-44 ; 0x23a6 - return SetFunc(pParam); - 23d2: ce 01 movw r24, r28 - 23d4: 01 96 adiw r24, 0x01 ; 1 - 23d6: 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; - 23d8: c1 e0 ldi r28, 0x01 ; 1 - 23da: 83 cf rjmp .-250 ; 0x22e2 - 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); - 23dc: 44 96 adiw r24, 0x14 ; 20 - 23de: e7 cf rjmp .-50 ; 0x23ae - CommandDelimiter = *pCommandDelimiter; - *pCommandDelimiter = '\0'; - - /* Search in command table */ - for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 23e0: 2e e0 ldi r18, 0x0E ; 14 - 23e2: 30 e0 ldi r19, 0x00 ; 0 - 23e4: d0 cf rjmp .-96 ; 0x2386 - 23e6: 2d e0 ldi r18, 0x0D ; 13 - 23e8: 30 e0 ldi r19, 0x00 ; 0 - 23ea: cd cf rjmp .-102 ; 0x2386 - 23ec: 2c e0 ldi r18, 0x0C ; 12 - 23ee: 30 e0 ldi r19, 0x00 ; 0 - 23f0: ca cf rjmp .-108 ; 0x2386 - 23f2: 2b e0 ldi r18, 0x0B ; 11 - 23f4: 30 e0 ldi r19, 0x00 ; 0 - 23f6: c7 cf rjmp .-114 ; 0x2386 - 23f8: 2a e0 ldi r18, 0x0A ; 10 - 23fa: 30 e0 ldi r19, 0x00 ; 0 - 23fc: c4 cf rjmp .-120 ; 0x2386 - 23fe: 29 e0 ldi r18, 0x09 ; 9 - 2400: 30 e0 ldi r19, 0x00 ; 0 - 2402: c1 cf rjmp .-126 ; 0x2386 - 2404: 28 e0 ldi r18, 0x08 ; 8 - 2406: 30 e0 ldi r19, 0x00 ; 0 - 2408: be cf rjmp .-132 ; 0x2386 - 240a: 27 e0 ldi r18, 0x07 ; 7 - 240c: 30 e0 ldi r19, 0x00 ; 0 - 240e: bb cf rjmp .-138 ; 0x2386 - 2410: 26 e0 ldi r18, 0x06 ; 6 - 2412: 30 e0 ldi r19, 0x00 ; 0 - 2414: b8 cf rjmp .-144 ; 0x2386 - 2416: 25 e0 ldi r18, 0x05 ; 5 - 2418: 30 e0 ldi r19, 0x00 ; 0 - 241a: b5 cf rjmp .-150 ; 0x2386 - 241c: 24 e0 ldi r18, 0x04 ; 4 - 241e: 30 e0 ldi r19, 0x00 ; 0 - 2420: b2 cf rjmp .-156 ; 0x2386 - 2422: 23 e0 ldi r18, 0x03 ; 3 - 2424: 30 e0 ldi r19, 0x00 ; 0 - 2426: af cf rjmp .-162 ; 0x2386 - 2428: 22 e0 ldi r18, 0x02 ; 2 - 242a: 30 e0 ldi r19, 0x00 ; 0 - 242c: ac cf rjmp .-168 ; 0x2386 - 242e: 21 e0 ldi r18, 0x01 ; 1 - 2430: 30 e0 ldi r19, 0x00 ; 0 - 2432: a9 cf rjmp .-174 ; 0x2386 - 2434: 20 e0 ldi r18, 0x00 ; 0 - 2436: 30 e0 ldi r19, 0x00 ; 0 - 2438: a6 cf rjmp .-180 ; 0x2386 - -0000243a : - - return true; -} - -void CommandLineTick(void) -{ - 243a: 08 95 ret - -0000243c : -INLINE void CodecTask(void) { - ActiveConfiguration.CodecTaskFunc(); -} - -INLINE void CodecSetDemodPower(bool bOnOff) { - CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 243c: a0 e2 ldi r26, 0x20 ; 32 - 243e: b6 e0 ldi r27, 0x06 ; 6 - 2440: 82 e0 ldi r24, 0x02 ; 2 - 2442: 11 96 adiw r26, 0x01 ; 1 - 2444: 8c 93 st X, r24 - 2446: 11 97 sbiw r26, 0x01 ; 1 - - if (bOnOff) { - CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; - 2448: 15 96 adiw r26, 0x05 ; 5 - 244a: 8c 93 st X, r24 - 244c: 15 97 sbiw r26, 0x05 ; 5 -static void StartDemod(void) { - /* Activate Power for demodulator */ - CodecSetDemodPower(true); - - /* Configure sampling-timer free running and sync to first modulation-pause. */ - CODEC_TIMER_SAMPLING.CNT = 0; - 244e: e0 e4 ldi r30, 0x40 ; 64 - 2450: f8 e0 ldi r31, 0x08 ; 8 - 2452: 10 a2 std Z+32, r1 ; 0x20 - 2454: 11 a2 std Z+33, r1 ; 0x21 - CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; - 2456: 8d e2 ldi r24, 0x2D ; 45 - 2458: 91 e0 ldi r25, 0x01 ; 1 - 245a: 86 a3 std Z+38, r24 ; 0x26 - 245c: 97 a3 std Z+39, r25 ; 0x27 - CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ - 245e: 8f ef ldi r24, 0xFF ; 255 - 2460: 9f ef ldi r25, 0xFF ; 255 - 2462: 80 a7 std Z+40, r24 ; 0x28 - 2464: 91 a7 std Z+41, r25 ; 0x29 - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; - 2466: 81 e0 ldi r24, 0x01 ; 1 - 2468: 80 83 st Z, r24 - CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - 246a: 98 e8 ldi r25, 0x88 ; 136 - 246c: 93 83 std Z+3, r25 ; 0x03 - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; - 246e: 93 e0 ldi r25, 0x03 ; 3 - 2470: 97 83 std Z+7, r25 ; 0x07 - - /* Start looking out for modulation pause via interrupt. */ - CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; - 2472: 1a 96 adiw r26, 0x0a ; 10 - 2474: 8c 93 st X, r24 - 2476: 08 95 ret - -00002478 <__vector_34>: -} - -ISR(CODEC_DEMOD_IN_INT0_VECT) { - 2478: 1f 92 push r1 - 247a: 0f 92 push r0 - 247c: 0f b6 in r0, 0x3f ; 63 - 247e: 0f 92 push r0 - 2480: 11 24 eor r1, r1 - 2482: 8f 93 push r24 - 2484: 9f 93 push r25 - 2486: ef 93 push r30 - 2488: ff 93 push r31 - /* This is the first edge of the first modulation-pause after StartDemod. - * Now we have time to prepare our timers and variables to start - * demodulating beginning from one bit-width after this edge. */ - CodecBufferPtr = CodecBuffer; - 248a: 80 e1 ldi r24, 0x10 ; 16 - 248c: 96 e2 ldi r25, 0x26 ; 38 - 248e: 80 93 b1 24 sts 0x24B1, r24 - 2492: 90 93 b2 24 sts 0x24B2, r25 - ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 2496: 80 e9 ldi r24, 0x90 ; 144 - 2498: 96 e2 ldi r25, 0x26 ; 38 - 249a: 80 93 b3 24 sts 0x24B3, r24 - 249e: 90 93 b4 24 sts 0x24B4, r25 - DataRegister = 0; - 24a2: 10 92 aa 24 sts 0x24AA, r1 - SampleRegister = 0; - 24a6: 10 92 a9 24 sts 0x24A9, r1 - SamplePosition = 0; - 24aa: 10 92 a5 24 sts 0x24A5, r1 - BitCount = 0; - 24ae: 10 92 ad 24 sts 0x24AD, r1 - 24b2: 10 92 ae 24 sts 0x24AE, r1 - IsParityBit = false; - 24b6: 10 92 a8 24 sts 0x24A8, r1 - * XYZBUF mechanism of the xmega to automatically double the sampling rate on the - * next overflow. For this we have to temporarily deactivate the automatical alignment - * in order to catch next overflow event for updating the BUF registers. - * We want to sample the demodulated data stream in the first quarter of the half-bit - * where the pulsed miller encoded is located. */ - CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; - 24ba: e0 e4 ldi r30, 0x40 ; 64 - 24bc: f8 e0 ldi r31, 0x08 ; 8 - 24be: 13 82 std Z+3, r1 ; 0x03 - CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ - 24c0: 86 e9 ldi r24, 0x96 ; 150 - 24c2: 90 e0 ldi r25, 0x00 ; 0 - 24c4: 86 ab std Z+54, r24 ; 0x36 - 24c6: 97 ab std Z+55, r25 ; 0x37 - CODEC_TIMER_SAMPLING.CCABUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 10 - 1; /* Compensate for DIGFILT and ISR prolog */ - 24c8: 8a e1 ldi r24, 0x1A ; 26 - 24ca: 90 e0 ldi r25, 0x00 ; 0 - 24cc: 80 af std Z+56, r24 ; 0x38 - 24ce: 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; - 24d0: e0 e4 ldi r30, 0x40 ; 64 - 24d2: f9 e0 ldi r31, 0x09 ; 9 - 24d4: 10 a2 std Z+32, r1 ; 0x20 - 24d6: 11 a2 std Z+33, r1 ; 0x21 - CODEC_TIMER_LOADMOD.PER = 0xFFFF; - 24d8: 8f ef ldi r24, 0xFF ; 255 - 24da: 9f ef ldi r25, 0xFF ; 255 - 24dc: 86 a3 std Z+38, r24 ; 0x26 - 24de: 97 a3 std Z+39, r25 ; 0x27 - CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; - 24e0: 89 e8 ldi r24, 0x89 ; 137 - 24e2: 83 83 std Z+3, r24 ; 0x03 - CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_EVCH6_gc; - 24e4: 8e e0 ldi r24, 0x0E ; 14 - 24e6: 80 83 st Z, r24 - - /* Disable this interrupt */ - CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 24e8: e0 e2 ldi r30, 0x20 ; 32 - 24ea: f6 e0 ldi r31, 0x06 ; 6 - 24ec: 12 86 std Z+10, r1 ; 0x0a -} - 24ee: ff 91 pop r31 - 24f0: ef 91 pop r30 - 24f2: 9f 91 pop r25 - 24f4: 8f 91 pop r24 - 24f6: 0f 90 pop r0 - 24f8: 0f be out 0x3f, r0 ; 63 - 24fa: 0f 90 pop r0 - 24fc: 1f 90 pop r1 - 24fe: 18 95 reti - -00002500 <__vector_22>: - -ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { - 2500: 1f 92 push r1 - 2502: 0f 92 push r0 - 2504: 0f b6 in r0, 0x3f ; 63 - 2506: 0f 92 push r0 - 2508: 11 24 eor r1, r1 - 250a: 2f 93 push r18 - 250c: 8f 93 push r24 - 250e: 9f 93 push r25 - 2510: ef 93 push r30 - 2512: 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; - 2514: 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; - 2518: 80 91 a9 24 lds r24, 0x24A9 - 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; - 251c: 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); - 251e: 21 e0 ldi r18, 0x01 ; 1 - 2520: 09 f0 breq .+2 ; 0x2524 <__vector_22+0x24> - 2522: 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; - 2524: 88 0f add r24, r24 - NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); - 2526: 82 2b or r24, r18 - SampleRegister = NewSampleRegister; - 2528: 80 93 a9 24 sts 0x24A9, r24 - - if (SamplePosition) { - 252c: 90 91 a5 24 lds r25, 0x24A5 - 2530: 99 23 and r25, r25 - 2532: a1 f1 breq .+104 ; 0x259c <__vector_22+0x9c> - /* Analyze the sampling register after 2 samples. */ - if ((NewSampleRegister & 0x07) == 0x07) { - 2534: 98 2f mov r25, r24 - 2536: 97 70 andi r25, 0x07 ; 7 - 2538: 97 30 cpi r25, 0x07 ; 7 - 253a: 09 f4 brne .+2 ; 0x253e <__vector_22+0x3e> - 253c: 42 c0 rjmp .+132 ; 0x25c2 <__vector_22+0xc2> - - /* Signal, that we have finished sampling */ - Flags.DemodFinished = 1; - } else { - /* Otherwise, we check the two sample bits from the bit before. */ - uint8_t BitSample = NewSampleRegister & 0xC; - 253e: 98 2f mov r25, r24 - 2540: 9c 70 andi r25, 0x0C ; 12 - uint8_t Bit = 0; - - if (BitSample != (0x0 << 2)) { - 2542: 61 f1 breq .+88 ; 0x259c <__vector_22+0x9c> - /* We have a valid bit. decode and process it. */ - if (BitSample & (0x1 << 2)) { - 2544: 91 e0 ldi r25, 0x01 ; 1 - 2546: 82 fd sbrc r24, 2 - 2548: 6b c0 rjmp .+214 ; 0x2620 <__vector_22+0x120> - } else { - /* 10 sequence -> This is a one bit */ - Bit = 1; - } - - LastBit = Bit; - 254a: 90 93 a7 24 sts 0x24A7, r25 - - if (!IsParityBit) { - 254e: 80 91 a8 24 lds r24, 0x24A8 - 2552: 81 11 cpse r24, r1 - 2554: 6d c0 rjmp .+218 ; 0x2630 <__vector_22+0x130> - /* This is a data bit, so shift it into the data register and - * hold a local copy of it. */ - uint8_t NewDataRegister = DataRegister >> 1; - 2556: 80 91 aa 24 lds r24, 0x24AA - 255a: 86 95 lsr r24 - NewDataRegister |= (Bit ? 0x80 : 0x00); - 255c: 99 23 and r25, r25 - 255e: 09 f4 brne .+2 ; 0x2562 <__vector_22+0x62> - 2560: 71 c0 rjmp .+226 ; 0x2644 <__vector_22+0x144> - 2562: 20 e8 ldi r18, 0x80 ; 128 - 2564: 28 2b or r18, r24 - DataRegister = NewDataRegister; - 2566: 20 93 aa 24 sts 0x24AA, r18 - - /* Update bitcount */ - uint16_t NewBitCount = ++BitCount; - 256a: 80 91 ad 24 lds r24, 0x24AD - 256e: 90 91 ae 24 lds r25, 0x24AE - 2572: 01 96 adiw r24, 0x01 ; 1 - 2574: 80 93 ad 24 sts 0x24AD, r24 - 2578: 90 93 ae 24 sts 0x24AE, r25 - if ((NewBitCount & 0x07) == 0) { - 257c: 87 70 andi r24, 0x07 ; 7 - 257e: 99 27 eor r25, r25 - 2580: 89 2b or r24, r25 - 2582: 61 f4 brne .+24 ; 0x259c <__vector_22+0x9c> - /* We have reached a byte boundary! Store the data register. */ - /* TODO: Prevent buffer overflow */ - *CodecBufferPtr++ = NewDataRegister; - 2584: e0 91 b1 24 lds r30, 0x24B1 - 2588: f0 91 b2 24 lds r31, 0x24B2 - 258c: 21 93 st Z+, r18 - 258e: e0 93 b1 24 sts 0x24B1, r30 - 2592: f0 93 b2 24 sts 0x24B2, r31 - - /* Store bit for determining FDT at EOC and enable parity - * handling on next bit. */ - IsParityBit = true; - 2596: 81 e0 ldi r24, 0x01 ; 1 - 2598: 80 93 a8 24 sts 0x24A8, r24 - } - } else { - /* On odd sample position just sample. */ - } - - SamplePosition = !SamplePosition; - 259c: 80 91 a5 24 lds r24, 0x24A5 - 25a0: 91 e0 ldi r25, 0x01 ; 1 - 25a2: 89 27 eor r24, r25 - 25a4: 80 93 a5 24 sts 0x24A5, 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; - 25a8: 88 e8 ldi r24, 0x88 ; 136 - 25aa: 80 93 43 08 sts 0x0843, r24 -} - 25ae: ff 91 pop r31 - 25b0: ef 91 pop r30 - 25b2: 9f 91 pop r25 - 25b4: 8f 91 pop r24 - 25b6: 2f 91 pop r18 - 25b8: 0f 90 pop r0 - 25ba: 0f be out 0x3f, r0 ; 63 - 25bc: 0f 90 pop r0 - 25be: 1f 90 pop r1 - 25c0: 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; - 25c2: 10 92 40 08 sts 0x0840, r1 - CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; - 25c6: 80 e1 ldi r24, 0x10 ; 16 - 25c8: 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; - 25cc: 10 92 43 09 sts 0x0943, r1 - - if (LastBit) { - 25d0: 80 91 a7 24 lds r24, 0x24A7 - 25d4: 88 23 and r24, r24 - 25d6: 79 f1 breq .+94 ; 0x2636 <__vector_22+0x136> - CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; - 25d8: 8c eb ldi r24, 0xBC ; 188 - 25da: 94 e0 ldi r25, 0x04 ; 4 - 25dc: 80 93 66 09 sts 0x0966, r24 - 25e0: 90 93 67 09 sts 0x0967, r25 - } else { - CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; - } - - LoadModState = LOADMOD_FDT; - 25e4: 10 92 a6 24 sts 0x24A6, r1 - - CODEC_TIMER_LOADMOD.INTFLAGS = TC1_OVFIF_bm; - 25e8: 81 e0 ldi r24, 0x01 ; 1 - 25ea: 80 93 4c 09 sts 0x094C, r24 - CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; - 25ee: 83 e0 ldi r24, 0x03 ; 3 - 25f0: 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; - 25f4: 80 91 ad 24 lds r24, 0x24AD - 25f8: 90 91 ae 24 lds r25, 0x24AE - 25fc: 87 70 andi r24, 0x07 ; 7 - if (RemainingBits != 0) { - 25fe: 61 f0 breq .+24 ; 0x2618 <__vector_22+0x118> - uint8_t NewDataRegister = DataRegister; - 2600: 90 91 aa 24 lds r25, 0x24AA - - while (RemainingBits++ < 8) { - 2604: 8f 5f subi r24, 0xFF ; 255 - /* Pad with zeroes to right-align. */ - NewDataRegister >>= 1; - 2606: 96 95 lsr r25 - * store it into the buffer. */ - uint8_t RemainingBits = BitCount % 8; - if (RemainingBits != 0) { - uint8_t NewDataRegister = DataRegister; - - while (RemainingBits++ < 8) { - 2608: 8f 5f subi r24, 0xFF ; 255 - 260a: 89 30 cpi r24, 0x09 ; 9 - 260c: e1 f7 brne .-8 ; 0x2606 <__vector_22+0x106> - /* Pad with zeroes to right-align. */ - NewDataRegister >>= 1; - } - - /* TODO: Prevent buffer overflow */ - *CodecBufferPtr = NewDataRegister; - 260e: e0 91 b1 24 lds r30, 0x24B1 - 2612: f0 91 b2 24 lds r31, 0x24B2 - 2616: 90 83 st Z, r25 - } - - /* Signal, that we have finished sampling */ - Flags.DemodFinished = 1; - 2618: 81 e0 ldi r24, 0x01 ; 1 - 261a: 80 93 af 24 sts 0x24AF, r24 - 261e: be cf rjmp .-132 ; 0x259c <__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)) { - 2620: 90 e0 ldi r25, 0x00 ; 0 - } else { - /* 10 sequence -> This is a one bit */ - Bit = 1; - } - - LastBit = Bit; - 2622: 90 93 a7 24 sts 0x24A7, r25 - - if (!IsParityBit) { - 2626: 80 91 a8 24 lds r24, 0x24A8 - 262a: 88 23 and r24, r24 - 262c: 09 f4 brne .+2 ; 0x2630 <__vector_22+0x130> - 262e: 93 cf rjmp .-218 ; 0x2556 <__vector_22+0x56> - - } else { - /* This is a parity bit. Store it */ - /* TODO: Store parity and prevent overflow */ - //*ParityBufferPtr++ = Bit; - IsParityBit = false; - 2630: 10 92 a8 24 sts 0x24A8, r1 - 2634: b3 cf rjmp .-154 ; 0x259c <__vector_22+0x9c> - CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; - - if (LastBit) { - CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; - } else { - CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; - 2636: 8c e7 ldi r24, 0x7C ; 124 - 2638: 94 e0 ldi r25, 0x04 ; 4 - 263a: 80 93 66 09 sts 0x0966, r24 - 263e: 90 93 67 09 sts 0x0967, r25 - 2642: d0 cf rjmp .-96 ; 0x25e4 <__vector_22+0xe4> - - if (!IsParityBit) { - /* This is a data bit, so shift it into the data register and - * hold a local copy of it. */ - uint8_t NewDataRegister = DataRegister >> 1; - NewDataRegister |= (Bit ? 0x80 : 0x00); - 2644: 20 e0 ldi r18, 0x00 ; 0 - 2646: 8e cf rjmp .-228 ; 0x2564 <__vector_22+0x64> - -00002648 <__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) { - 2648: 1f 92 push r1 - 264a: 0f 92 push r0 - 264c: 0f b6 in r0, 0x3f ; 63 - 264e: 0f 92 push r0 - 2650: 11 24 eor r1, r1 - 2652: 2f 93 push r18 - 2654: 3f 93 push r19 - 2656: 8f 93 push r24 - 2658: 9f 93 push r25 - 265a: ef 93 push r30 - 265c: ff 93 push r31 - /* Bit rate timer. Output a half bit on the output. */ - uint8_t Temp8; - uint16_t Temp16; - - switch (LoadModState) { - 265e: 80 91 a6 24 lds r24, 0x24A6 - 2662: 85 30 cpi r24, 0x05 ; 5 - 2664: 09 f4 brne .+2 ; 0x2668 <__vector_83+0x20> - 2666: 4d c0 rjmp .+154 ; 0x2702 <__vector_83+0xba> - 2668: a8 f0 brcs .+42 ; 0x2694 <__vector_83+0x4c> - 266a: 88 30 cpi r24, 0x08 ; 8 - 266c: 09 f4 brne .+2 ; 0x2670 <__vector_83+0x28> - 266e: 7c c0 rjmp .+248 ; 0x2768 <__vector_83+0x120> - 2670: 20 f5 brcc .+72 ; 0x26ba <__vector_83+0x72> - 2672: 86 30 cpi r24, 0x06 ; 6 - 2674: 09 f4 brne .+2 ; 0x2678 <__vector_83+0x30> - 2676: b8 c0 rjmp .+368 ; 0x27e8 <__vector_83+0x1a0> - 2678: 87 30 cpi r24, 0x07 ; 7 - 267a: 09 f4 brne .+2 ; 0x267e <__vector_83+0x36> - 267c: 8a c0 rjmp .+276 ; 0x2792 <__vector_83+0x14a> - break; - - default: - break; - } -} - 267e: ff 91 pop r31 - 2680: ef 91 pop r30 - 2682: 9f 91 pop r25 - 2684: 8f 91 pop r24 - 2686: 3f 91 pop r19 - 2688: 2f 91 pop r18 - 268a: 0f 90 pop r0 - 268c: 0f be out 0x3f, r0 ; 63 - 268e: 0f 90 pop r0 - 2690: 1f 90 pop r1 - 2692: 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) { - 2694: 82 30 cpi r24, 0x02 ; 2 - 2696: 71 f1 breq .+92 ; 0x26f4 <__vector_83+0xac> - 2698: f8 f0 brcs .+62 ; 0x26d8 <__vector_83+0x90> - 269a: 83 30 cpi r24, 0x03 ; 3 - 269c: 09 f4 brne .+2 ; 0x26a0 <__vector_83+0x58> - 269e: 56 c0 rjmp .+172 ; 0x274c <__vector_83+0x104> - 26a0: 84 30 cpi r24, 0x04 ; 4 - 26a2: 69 f7 brne .-38 ; 0x267e <__vector_83+0x36> - /* Fetch first byte */ - DataRegister = *CodecBufferPtr; - break; - - case LOADMOD_DATA0: - if (DataRegister & 1) { - 26a4: 80 91 aa 24 lds r24, 0x24AA - 26a8: 80 fd sbrc r24, 0 - 26aa: b7 c0 rjmp .+366 ; 0x281a <__vector_83+0x1d2> - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 26ac: 80 e4 ldi r24, 0x40 ; 64 - 26ae: 80 93 46 06 sts 0x0646, r24 - } - - LoadModState = LOADMOD_DATA1; - 26b2: 85 e0 ldi r24, 0x05 ; 5 - 26b4: 80 93 a6 24 sts 0x24A6, r24 - break; - 26b8: e2 cf rjmp .-60 ; 0x267e <__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) { - 26ba: 89 30 cpi r24, 0x09 ; 9 - 26bc: 09 f4 brne .+2 ; 0x26c0 <__vector_83+0x78> - 26be: 5b c0 rjmp .+182 ; 0x2776 <__vector_83+0x12e> - 26c0: 8a 30 cpi r24, 0x0A ; 10 - 26c2: e9 f6 brne .-70 ; 0x267e <__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; - 26c4: 10 92 40 09 sts 0x0940, r1 - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 26c8: 10 92 46 09 sts 0x0946, r1 - CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; - 26cc: 10 92 00 08 sts 0x0800, r1 - - /* Signal application that we have finished loadmod */ - Flags.LoadmodFinished = 1; - 26d0: 81 e0 ldi r24, 0x01 ; 1 - 26d2: 80 93 b0 24 sts 0x24B0, r24 - break; - 26d6: d3 cf rjmp .-90 ; 0x267e <__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) { - 26d8: 88 23 and r24, r24 - 26da: 09 f4 brne .+2 ; 0x26de <__vector_83+0x96> - 26dc: 53 c0 rjmp .+166 ; 0x2784 <__vector_83+0x13c> - 26de: 81 30 cpi r24, 0x01 ; 1 - 26e0: 71 f6 brne .-100 ; 0x267e <__vector_83+0x36> - break; - - case LOADMOD_START: - /* Application produced data. With this interrupt we are aligned to the bit-grid. - * Start subcarrier generation and align to bitrate. */ - CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_RATE_CYCLES / 2 - 1; - 26e2: 8f e3 ldi r24, 0x3F ; 63 - 26e4: 90 e0 ldi r25, 0x00 ; 0 - 26e6: 80 93 66 09 sts 0x0966, r24 - 26ea: 90 93 67 09 sts 0x0967, r25 - CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_EVCH6_gc; - 26ee: 8e e0 ldi r24, 0x0E ; 14 - 26f0: 80 93 00 08 sts 0x0800, r24 - - /* Fallthrough to first bit */ - - case LOADMOD_START_BIT0: - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 26f4: 80 e4 ldi r24, 0x40 ; 64 - 26f6: 80 93 45 06 sts 0x0645, r24 - LoadModState = LOADMOD_START_BIT1; - 26fa: 83 e0 ldi r24, 0x03 ; 3 - 26fc: 80 93 a6 24 sts 0x24A6, r24 - break; - 2700: be cf rjmp .-132 ; 0x267e <__vector_83+0x36> - - LoadModState = LOADMOD_DATA1; - break; - - case LOADMOD_DATA1: - Temp8 = DataRegister; - 2702: 80 91 aa 24 lds r24, 0x24AA - - if (Temp8 & 1) { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2706: 90 e4 ldi r25, 0x40 ; 64 - break; - - case LOADMOD_DATA1: - Temp8 = DataRegister; - - if (Temp8 & 1) { - 2708: 80 fd sbrc r24, 0 - 270a: 84 c0 rjmp .+264 ; 0x2814 <__vector_83+0x1cc> - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 270c: 90 93 45 06 sts 0x0645, r25 - } - - DataRegister = Temp8 >> 1; - 2710: 86 95 lsr r24 - 2712: 80 93 aa 24 sts 0x24AA, r24 - - Temp16 = BitSent; - 2716: 80 91 ab 24 lds r24, 0x24AB - 271a: 90 91 ac 24 lds r25, 0x24AC - BitSent = ++Temp16; - 271e: 01 96 adiw r24, 0x01 ; 1 - 2720: 80 93 ab 24 sts 0x24AB, r24 - 2724: 90 93 ac 24 sts 0x24AC, r25 - - if ((Temp16 & 0x07) == 0) { - 2728: 9c 01 movw r18, r24 - 272a: 27 70 andi r18, 0x07 ; 7 - 272c: 33 27 eor r19, r19 - 272e: 23 2b or r18, r19 - 2730: 09 f4 brne .+2 ; 0x2734 <__vector_83+0xec> - 2732: 77 c0 rjmp .+238 ; 0x2822 <__vector_83+0x1da> - /* Byte boundary. Load parity bit and output it later. */ - LoadModState = LOADMOD_PARITY0; - break; - } - - if (Temp16 == BitCount) { - 2734: 20 91 ad 24 lds r18, 0x24AD - 2738: 30 91 ae 24 lds r19, 0x24AE - 273c: 82 17 cp r24, r18 - 273e: 93 07 cpc r25, r19 - 2740: 09 f0 breq .+2 ; 0x2744 <__vector_83+0xfc> - 2742: 4e c0 rjmp .+156 ; 0x27e0 <__vector_83+0x198> - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - } - - if (BitSent == BitCount) { - /* No data left */ - LoadModState = LOADMOD_STOP_BIT0; - 2744: 88 e0 ldi r24, 0x08 ; 8 - 2746: 80 93 a6 24 sts 0x24A6, r24 - 274a: 99 cf rjmp .-206 ; 0x267e <__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; - 274c: 80 e4 ldi r24, 0x40 ; 64 - 274e: 80 93 46 06 sts 0x0646, r24 - LoadModState = LOADMOD_DATA0; - 2752: 84 e0 ldi r24, 0x04 ; 4 - 2754: 80 93 a6 24 sts 0x24A6, r24 - - /* Fetch first byte */ - DataRegister = *CodecBufferPtr; - 2758: e0 91 b1 24 lds r30, 0x24B1 - 275c: f0 91 b2 24 lds r31, 0x24B2 - 2760: 80 81 ld r24, Z - 2762: 80 93 aa 24 sts 0x24AA, r24 - break; - 2766: 8b cf rjmp .-234 ; 0x267e <__vector_83+0x36> - } - - break; - - case LOADMOD_STOP_BIT0: - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2768: 80 e4 ldi r24, 0x40 ; 64 - 276a: 80 93 46 06 sts 0x0646, r24 - LoadModState = LOADMOD_STOP_BIT1; - 276e: 89 e0 ldi r24, 0x09 ; 9 - 2770: 80 93 a6 24 sts 0x24A6, r24 - break; - 2774: 84 cf rjmp .-248 ; 0x267e <__vector_83+0x36> - - case LOADMOD_STOP_BIT1: - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2776: 80 e4 ldi r24, 0x40 ; 64 - 2778: 80 93 46 06 sts 0x0646, r24 - LoadModState = LOADMOD_FINISHED; - 277c: 8a e0 ldi r24, 0x0A ; 10 - 277e: 80 93 a6 24 sts 0x24A6, r24 - break; - 2782: 7d cf rjmp .-262 ; 0x267e <__vector_83+0x36> - uint16_t Temp16; - - switch (LoadModState) { - case LOADMOD_FDT: - /* No data has been produced, but FDT has ended. Switch over to bit-grid aligning. */ - CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_GRID_CYCLES - 1; - 2784: 8f e7 ldi r24, 0x7F ; 127 - 2786: 90 e0 ldi r25, 0x00 ; 0 - 2788: 80 93 66 09 sts 0x0966, r24 - 278c: 90 93 67 09 sts 0x0967, r25 - break; - 2790: 76 cf rjmp .-276 ; 0x267e <__vector_83+0x36> - - LoadModState = LOADMOD_PARITY1; - break; - - case LOADMOD_PARITY1: - if (*ParityBufferPtr) { - 2792: e0 91 b3 24 lds r30, 0x24B3 - 2796: f0 91 b4 24 lds r31, 0x24B4 - 279a: 80 81 ld r24, Z - 279c: 81 11 cpse r24, r1 - 279e: 36 c0 rjmp .+108 ; 0x280c <__vector_83+0x1c4> - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 27a0: 80 e4 ldi r24, 0x40 ; 64 - 27a2: 80 93 45 06 sts 0x0645, r24 - } - - if (BitSent == BitCount) { - 27a6: 20 91 ab 24 lds r18, 0x24AB - 27aa: 30 91 ac 24 lds r19, 0x24AC - 27ae: 80 91 ad 24 lds r24, 0x24AD - 27b2: 90 91 ae 24 lds r25, 0x24AE - 27b6: 28 17 cp r18, r24 - 27b8: 39 07 cpc r19, r25 - 27ba: 21 f2 breq .-120 ; 0x2744 <__vector_83+0xfc> - /* No data left */ - LoadModState = LOADMOD_STOP_BIT0; - } else { - /* Fetch next data and continue sending bits. */ - ParityBufferPtr++; - 27bc: 31 96 adiw r30, 0x01 ; 1 - 27be: e0 93 b3 24 sts 0x24B3, r30 - 27c2: f0 93 b4 24 sts 0x24B4, r31 - DataRegister = *++CodecBufferPtr; - 27c6: e0 91 b1 24 lds r30, 0x24B1 - 27ca: f0 91 b2 24 lds r31, 0x24B2 - 27ce: cf 01 movw r24, r30 - 27d0: 01 96 adiw r24, 0x01 ; 1 - 27d2: 80 93 b1 24 sts 0x24B1, r24 - 27d6: 90 93 b2 24 sts 0x24B2, r25 - 27da: 81 81 ldd r24, Z+1 ; 0x01 - 27dc: 80 93 aa 24 sts 0x24AA, r24 - LoadModState = LOADMOD_DATA0; - 27e0: 84 e0 ldi r24, 0x04 ; 4 - 27e2: 80 93 a6 24 sts 0x24A6, r24 - 27e6: 4b cf rjmp .-362 ; 0x267e <__vector_83+0x36> - LoadModState = LOADMOD_DATA0; - - break; - - case LOADMOD_PARITY0: - if (*ParityBufferPtr) { - 27e8: e0 91 b3 24 lds r30, 0x24B3 - 27ec: f0 91 b4 24 lds r31, 0x24B4 - 27f0: 80 81 ld r24, Z - 27f2: 81 11 cpse r24, r1 - 27f4: 07 c0 rjmp .+14 ; 0x2804 <__vector_83+0x1bc> - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - } else { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 27f6: 80 e4 ldi r24, 0x40 ; 64 - 27f8: 80 93 46 06 sts 0x0646, r24 - } - - LoadModState = LOADMOD_PARITY1; - 27fc: 87 e0 ldi r24, 0x07 ; 7 - 27fe: 80 93 a6 24 sts 0x24A6, r24 - break; - 2802: 3d cf rjmp .-390 ; 0x267e <__vector_83+0x36> - - break; - - case LOADMOD_PARITY0: - if (*ParityBufferPtr) { - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 2804: 80 e4 ldi r24, 0x40 ; 64 - 2806: 80 93 45 06 sts 0x0645, r24 - 280a: f8 cf rjmp .-16 ; 0x27fc <__vector_83+0x1b4> - LoadModState = LOADMOD_PARITY1; - break; - - case LOADMOD_PARITY1: - if (*ParityBufferPtr) { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 280c: 80 e4 ldi r24, 0x40 ; 64 - 280e: 80 93 46 06 sts 0x0646, r24 - 2812: c9 cf rjmp .-110 ; 0x27a6 <__vector_83+0x15e> - - case LOADMOD_DATA1: - Temp8 = DataRegister; - - if (Temp8 & 1) { - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2814: 90 93 46 06 sts 0x0646, r25 - 2818: 7b cf rjmp .-266 ; 0x2710 <__vector_83+0xc8> - DataRegister = *CodecBufferPtr; - break; - - case LOADMOD_DATA0: - if (DataRegister & 1) { - CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 281a: 80 e4 ldi r24, 0x40 ; 64 - 281c: 80 93 45 06 sts 0x0645, r24 - 2820: 48 cf rjmp .-368 ; 0x26b2 <__vector_83+0x6a> - Temp16 = BitSent; - BitSent = ++Temp16; - - if ((Temp16 & 0x07) == 0) { - /* Byte boundary. Load parity bit and output it later. */ - LoadModState = LOADMOD_PARITY0; - 2822: 86 e0 ldi r24, 0x06 ; 6 - 2824: 80 93 a6 24 sts 0x24A6, r24 - break; - 2828: 2a cf rjmp .-428 ; 0x267e <__vector_83+0x36> - -0000282a : - default: - break; - } -} - -void ISO14443ACodecInit(void) { - 282a: cf 93 push r28 - 282c: 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; - 282e: e0 e4 ldi r30, 0x40 ; 64 - 2830: f6 e0 ldi r31, 0x06 ; 6 - 2832: 84 e0 ldi r24, 0x04 ; 4 - 2834: 82 83 std Z+2, r24 ; 0x02 - CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc; - 2836: 12 8a std Z+18, r1 ; 0x12 - EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; - 2838: c0 e8 ldi r28, 0x80 ; 128 - 283a: d1 e0 ldi r29, 0x01 ; 1 - 283c: 82 e6 ldi r24, 0x62 ; 98 - 283e: 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; - 2840: a0 e2 ldi r26, 0x20 ; 32 - 2842: b6 e0 ldi r27, 0x06 ; 6 - 2844: 85 e0 ldi r24, 0x05 ; 5 - 2846: 12 96 adiw r26, 0x02 ; 2 - 2848: 8c 93 st X, r24 - 284a: 12 97 sbiw r26, 0x02 ; 2 - CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; - 284c: 81 e0 ldi r24, 0x01 ; 1 - 284e: 50 96 adiw r26, 0x10 ; 16 - 2850: 8c 93 st X, r24 - 2852: 50 97 sbiw r26, 0x10 ; 16 - CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; - 2854: 82 e0 ldi r24, 0x02 ; 2 - 2856: 52 96 adiw r26, 0x12 ; 18 - 2858: 8c 93 st X, r24 - 285a: 52 97 sbiw r26, 0x12 ; 18 - CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 285c: 1a 96 adiw r26, 0x0a ; 10 - 285e: 1c 92 st X, r1 - 2860: 1a 97 sbiw r26, 0x0a ; 10 - CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; - 2862: 83 e0 ldi r24, 0x03 ; 3 - 2864: 19 96 adiw r26, 0x09 ; 9 - 2866: 8c 93 st X, r24 - EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; - 2868: 98 e5 ldi r25, 0x58 ; 88 - 286a: 98 83 st Y, r25 - EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; - 286c: 9a e5 ldi r25, 0x5A ; 90 - 286e: 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; - 2870: 90 e4 ldi r25, 0x40 ; 64 - 2872: 91 83 std Z+1, r25 ; 0x01 - CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2874: 96 83 std Z+6, r25 ; 0x06 - CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK; - 2876: 81 83 std Z+1, r24 ; 0x01 - CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK; - 2878: 86 83 std Z+6, r24 ; 0x06 - - /* Configure subcarrier generation with 50% DC output using OOK */ - CODEC_SUBCARRIER_TIMER.PER = ISO14443A_SUBCARRIER_DIVIDER - 1; - 287a: e0 e0 ldi r30, 0x00 ; 0 - 287c: f8 e0 ldi r31, 0x08 ; 8 - 287e: 8f e0 ldi r24, 0x0F ; 15 - 2880: 90 e0 ldi r25, 0x00 ; 0 - 2882: 86 a3 std Z+38, r24 ; 0x26 - 2884: 97 a3 std Z+39, r25 ; 0x27 - CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = ISO14443A_SUBCARRIER_DIVIDER/2; - 2886: 88 e0 ldi r24, 0x08 ; 8 - 2888: 90 e0 ldi r25, 0x00 ; 0 - 288a: 82 a7 std Z+42, r24 ; 0x2a - 288c: 93 a7 std Z+43, r25 ; 0x2b - CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; - 288e: 83 e2 ldi r24, 0x23 ; 35 - 2890: 81 83 std Z+1, r24 ; 0x01 -void ISO14443ACodecInit(void) { - /* Initialize common peripherals and start listening - * for incoming data. */ - Initialize(); - StartDemod(); -} - 2892: df 91 pop r29 - 2894: cf 91 pop r28 - -void ISO14443ACodecInit(void) { - /* Initialize common peripherals and start listening - * for incoming data. */ - Initialize(); - StartDemod(); - 2896: d2 cd rjmp .-1116 ; 0x243c - -00002898 : -} - -void ISO14443ACodecTask(void) { - 2898: cf 93 push r28 - 289a: df 93 push r29 - if (Flags.DemodFinished) { - 289c: 80 91 af 24 lds r24, 0x24AF - 28a0: 88 23 and r24, r24 - 28a2: c1 f0 breq .+48 ; 0x28d4 - Flags.DemodFinished = 0; - 28a4: 10 92 af 24 sts 0x24AF, r1 -INLINE void CodecTask(void) { - ActiveConfiguration.CodecTaskFunc(); -} - -INLINE void CodecSetDemodPower(bool bOnOff) { - CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 28a8: 82 e0 ldi r24, 0x02 ; 2 - 28aa: 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; - 28ae: 80 93 26 06 sts 0x0626, r24 - /* Reception finished. Process the received bytes */ - CodecSetDemodPower(false); - - uint16_t DemodBitCount = BitCount; - 28b2: 60 91 ad 24 lds r22, 0x24AD - 28b6: 70 91 ae 24 lds r23, 0x24AE - uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; - - if (DemodBitCount > 0) { - 28ba: 61 15 cp r22, r1 - 28bc: 71 05 cpc r23, r1 - 28be: 89 f4 brne .+34 ; 0x28e2 -INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { - return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); -} - -INLINE void ApplicationReset(void) { - ActiveConfiguration.ApplicationResetFunc(); - 28c0: e0 91 ef 24 lds r30, 0x24EF - 28c4: f0 91 f0 24 lds r31, 0x24F0 - 28c8: 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; - 28ca: 10 92 40 09 sts 0x0940, r1 - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 28ce: 10 92 46 09 sts 0x0946, r1 - - StartDemod(); - 28d2: b4 dd rcall .-1176 ; 0x243c - } - } - - if (Flags.LoadmodFinished) { - 28d4: 80 91 b0 24 lds r24, 0x24B0 - 28d8: 81 11 cpse r24, r1 - 28da: 2a c0 rjmp .+84 ; 0x2930 - Flags.LoadmodFinished = 0; - /* Load modulation has been finished. Stop it and start to listen - * for incoming data again. */ - StartDemod(); - } -} - 28dc: df 91 pop r29 - 28de: cf 91 pop r28 - 28e0: 08 95 ret -INLINE void ApplicationTask(void) { - ActiveConfiguration.ApplicationTaskFunc(); -} - -INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { - return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); - 28e2: e0 91 f3 24 lds r30, 0x24F3 - 28e6: f0 91 f4 24 lds r31, 0x24F4 - 28ea: 80 e1 ldi r24, 0x10 ; 16 - 28ec: 96 e2 ldi r25, 0x26 ; 38 - 28ee: 09 95 icall - - if (DemodBitCount > 0) { - /* Call application if we received data */ - AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); - - if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { - 28f0: 94 ff sbrs r25, 4 - 28f2: 23 c0 rjmp .+70 ; 0x293a - /* Application has generated it's own parity bits. - * Clear this option bit. */ - AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - 28f4: 9f 7e andi r25, 0xEF ; 239 - } - } else { - ApplicationReset(); - } - - if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { - 28f6: 00 97 sbiw r24, 0x00 ; 0 - 28f8: 41 f3 breq .-48 ; 0x28ca - BitCount = AnswerBitCount; - 28fa: 80 93 ad 24 sts 0x24AD, r24 - 28fe: 90 93 ae 24 sts 0x24AE, r25 - BitSent = 0; - 2902: 10 92 ab 24 sts 0x24AB, r1 - 2906: 10 92 ac 24 sts 0x24AC, r1 - CodecBufferPtr = CodecBuffer; - 290a: 80 e1 ldi r24, 0x10 ; 16 - 290c: 96 e2 ldi r25, 0x26 ; 38 - 290e: 80 93 b1 24 sts 0x24B1, r24 - 2912: 90 93 b2 24 sts 0x24B2, r25 - ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 2916: 80 e9 ldi r24, 0x90 ; 144 - 2918: 96 e2 ldi r25, 0x26 ; 38 - 291a: 80 93 b3 24 sts 0x24B3, r24 - 291e: 90 93 b4 24 sts 0x24B4, r25 - LoadModState = LOADMOD_START; - 2922: 81 e0 ldi r24, 0x01 ; 1 - 2924: 80 93 a6 24 sts 0x24A6, r24 - - StartDemod(); - } - } - - if (Flags.LoadmodFinished) { - 2928: 80 91 b0 24 lds r24, 0x24B0 - 292c: 88 23 and r24, r24 - 292e: b1 f2 breq .-84 ; 0x28dc - Flags.LoadmodFinished = 0; - 2930: 10 92 b0 24 sts 0x24B0, r1 - /* Load modulation has been finished. Stop it and start to listen - * for incoming data again. */ - StartDemod(); - } -} - 2934: df 91 pop r29 - 2936: cf 91 pop r28 - - if (Flags.LoadmodFinished) { - Flags.LoadmodFinished = 0; - /* Load modulation has been finished. Stop it and start to listen - * for incoming data again. */ - StartDemod(); - 2938: 81 cd rjmp .-1278 ; 0x243c - /* 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++) { - 293a: ac 01 movw r20, r24 - 293c: 56 95 lsr r21 - 293e: 47 95 ror r20 - 2940: 56 95 lsr r21 - 2942: 47 95 ror r20 - 2944: 56 95 lsr r21 - 2946: 47 95 ror r20 - 2948: 41 15 cp r20, r1 - 294a: 51 05 cpc r21, r1 - 294c: a1 f2 breq .-88 ; 0x28f6 - 294e: 60 e0 ldi r22, 0x00 ; 0 - 2950: 20 e0 ldi r18, 0x00 ; 0 - 2952: 30 e0 ldi r19, 0x00 ; 0 - /* For each whole byte, generate a parity bit. */ - CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - ODD_PARITY(CodecBuffer[i]); - 2954: f9 01 movw r30, r18 - 2956: e0 5f subi r30, 0xF0 ; 240 - 2958: f9 4d sbci r31, 0xD9 ; 217 - 295a: 20 81 ld r18, Z - 295c: 02 2e mov r0, r18 - 295e: 22 95 swap r18 - 2960: 20 25 eor r18, r0 - 2962: 02 2e mov r0, r18 - 2964: 26 95 lsr r18 - 2966: 26 95 lsr r18 - 2968: 20 25 eor r18, r0 - AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - } else { - /* We have to generate the parity bits ourself */ - for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - /* For each whole byte, generate a parity bit. */ - CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - 296a: e0 58 subi r30, 0x80 ; 128 - 296c: ff 4f sbci r31, 0xFF ; 255 - ODD_PARITY(CodecBuffer[i]); - 296e: 30 e0 ldi r19, 0x00 ; 0 - 2970: 2f 5f subi r18, 0xFF ; 255 - 2972: 3f 4f sbci r19, 0xFF ; 255 - 2974: 21 fb bst r18, 1 - 2976: 77 27 eor r23, r23 - 2978: 70 f9 bld r23, 0 - 297a: c7 2f mov r28, r23 - 297c: 20 e0 ldi r18, 0x00 ; 0 - 297e: d2 2f mov r29, r18 - 2980: 71 e0 ldi r23, 0x01 ; 1 - 2982: c7 27 eor r28, r23 - 2984: 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++) { - 2986: 6f 5f subi r22, 0xFF ; 255 - 2988: 26 2f mov r18, r22 - 298a: 30 e0 ldi r19, 0x00 ; 0 - 298c: 24 17 cp r18, r20 - 298e: 35 07 cpc r19, r21 - 2990: 08 f3 brcs .-62 ; 0x2954 - 2992: b1 cf rjmp .-158 ; 0x28f6 - -00002994 : - Block[11] = Block[3]; -} - -void MifareClassicAppInit1K(void) -{ - State = STATE_IDLE; - 2994: 81 e0 ldi r24, 0x01 ; 1 - 2996: 80 93 b5 24 sts 0x24B5, r24 - CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; - 299a: 84 e0 ldi r24, 0x04 ; 4 - 299c: 90 e0 ldi r25, 0x00 ; 0 - 299e: 80 93 b6 24 sts 0x24B6, r24 - 29a2: 90 93 b7 24 sts 0x24B7, r25 - CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; - 29a6: 88 e0 ldi r24, 0x08 ; 8 - 29a8: 80 93 b8 24 sts 0x24B8, r24 - 29ac: 08 95 ret - -000029ae : -} - -void MifareClassicAppInit4K(void) -{ - State = STATE_IDLE; - 29ae: 81 e0 ldi r24, 0x01 ; 1 - 29b0: 80 93 b5 24 sts 0x24B5, r24 - CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; - 29b4: 82 e0 ldi r24, 0x02 ; 2 - 29b6: 90 e0 ldi r25, 0x00 ; 0 - 29b8: 80 93 b6 24 sts 0x24B6, r24 - 29bc: 90 93 b7 24 sts 0x24B7, r25 - CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; - 29c0: 88 e1 ldi r24, 0x18 ; 24 - 29c2: 80 93 b8 24 sts 0x24B8, r24 - 29c6: 08 95 ret - -000029c8 : -} - -void MifareClassicAppReset(void) -{ - State = STATE_IDLE; - 29c8: 81 e0 ldi r24, 0x01 ; 1 - 29ca: 80 93 b5 24 sts 0x24B5, r24 - 29ce: 08 95 ret - -000029d0 : -} - -void MifareClassicAppTask(void) -{ - 29d0: 08 95 ret - -000029d2 : - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - 29d2: 6f 92 push r6 - 29d4: 7f 92 push r7 - 29d6: 8f 92 push r8 - 29d8: 9f 92 push r9 - 29da: af 92 push r10 - 29dc: bf 92 push r11 - 29de: cf 92 push r12 - 29e0: df 92 push r13 - 29e2: ef 92 push r14 - 29e4: ff 92 push r15 - 29e6: 0f 93 push r16 - 29e8: 1f 93 push r17 - 29ea: cf 93 push r28 - 29ec: df 93 push r29 - 29ee: cd b7 in r28, 0x3d ; 61 - 29f0: de b7 in r29, 0x3e ; 62 - 29f2: 2e 97 sbiw r28, 0x0e ; 14 - 29f4: cd bf out 0x3d, r28 ; 61 - 29f6: de bf out 0x3e, r29 ; 62 - 29f8: 8c 01 movw r16, r24 - switch(State) { - 29fa: 80 91 b5 24 lds r24, 0x24B5 - 29fe: 84 30 cpi r24, 0x04 ; 4 - 2a00: 09 f4 brne .+2 ; 0x2a04 - 2a02: f4 c0 rjmp .+488 ; 0x2bec - 2a04: 08 f4 brcc .+2 ; 0x2a08 - 2a06: 3b c0 rjmp .+118 ; 0x2a7e - 2a08: 86 30 cpi r24, 0x06 ; 6 - 2a0a: 09 f4 brne .+2 ; 0x2a0e - 2a0c: bd c0 rjmp .+378 ; 0x2b88 - 2a0e: 08 f0 brcs .+2 ; 0x2a12 - 2a10: 60 c0 rjmp .+192 ; 0x2ad2 - - 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(); - 2a12: f8 01 movw r30, r16 - 2a14: d0 80 ld r13, Z - 2a16: 31 d7 rcall .+3682 ; 0x387a - 2a18: 8d 25 eor r24, r13 - 2a1a: d8 01 movw r26, r16 - 2a1c: 8c 93 st X, r24 - 2a1e: 11 96 adiw r26, 0x01 ; 1 - 2a20: dc 90 ld r13, X - 2a22: 2b d7 rcall .+3670 ; 0x387a - 2a24: 8d 25 eor r24, r13 - 2a26: f8 01 movw r30, r16 - 2a28: 81 83 std Z+1, r24 ; 0x01 - 2a2a: d2 80 ldd r13, Z+2 ; 0x02 - 2a2c: 26 d7 rcall .+3660 ; 0x387a - 2a2e: 8d 25 eor r24, r13 - 2a30: d8 01 movw r26, r16 - 2a32: 12 96 adiw r26, 0x02 ; 2 - 2a34: 8c 93 st X, r24 - 2a36: 12 97 sbiw r26, 0x02 ; 2 - 2a38: 13 96 adiw r26, 0x03 ; 3 - 2a3a: dc 90 ld r13, X - 2a3c: 1e d7 rcall .+3644 ; 0x387a - 2a3e: 8d 25 eor r24, r13 - 2a40: f8 01 movw r30, r16 - 2a42: 83 83 std Z+3, r24 ; 0x03 - - if (Buffer[0] == CMD_READ) { - 2a44: 80 81 ld r24, Z - 2a46: 80 33 cpi r24, 0x30 ; 48 - 2a48: 09 f4 brne .+2 ; 0x2a4c - 2a4a: ac c2 rjmp .+1368 ; 0x2fa4 - * 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) { - 2a4c: 80 3a cpi r24, 0xA0 ; 160 - 2a4e: 09 f4 brne .+2 ; 0x2a52 - 2a50: 1f c3 rjmp .+1598 ; 0x3090 <__stack+0x91> - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_DECREMENT) { - 2a52: 80 3c cpi r24, 0xC0 ; 192 - 2a54: 09 f4 brne .+2 ; 0x2a58 - 2a56: 3a c3 rjmp .+1652 ; 0x30cc <__stack+0xcd> - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_INCREMENT) { - 2a58: 81 3c cpi r24, 0xC1 ; 193 - 2a5a: 09 f4 brne .+2 ; 0x2a5e - 2a5c: da c3 rjmp .+1972 ; 0x3212 <__stack+0x213> - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_RESTORE) { - 2a5e: 82 3c cpi r24, 0xC2 ; 194 - 2a60: 09 f4 brne .+2 ; 0x2a64 - 2a62: e7 c3 rjmp .+1998 ; 0x3232 <__stack+0x233> - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - }else if (Buffer[0] == CMD_TRANSFER) { - 2a64: 80 3b cpi r24, 0xB0 ; 176 - 2a66: 09 f4 brne .+2 ; 0x2a6a - 2a68: f1 c3 rjmp .+2018 ; 0x324c <__stack+0x24d> - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - - return ACK_NAK_FRAME_SIZE; - } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { - 2a6a: 80 56 subi r24, 0x60 ; 96 - 2a6c: 82 30 cpi r24, 0x02 ; 2 - 2a6e: 08 f4 brcc .+2 ; 0x2a72 - 2a70: 94 c1 rjmp .+808 ; 0x2d9a - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - return ACK_NAK_FRAME_SIZE; - } - } else { - /* Unknown command. Enter HALT state */ - State = STATE_IDLE; - 2a72: 81 e0 ldi r24, 0x01 ; 1 - 2a74: 80 93 b5 24 sts 0x24B5, r24 - /* Unknown state? Should never happen. */ - break; - } - - /* No response has been sent, when we reach here */ - return ISO14443A_APP_NO_RESPONSE; - 2a78: 20 e0 ldi r18, 0x00 ; 0 - 2a7a: 30 e0 ldi r19, 0x00 ; 0 - } else { - /* Unknown command. Enter HALT state */ - State = STATE_IDLE; - } - - break; - 2a7c: 63 c0 rjmp .+198 ; 0x2b44 - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 2a7e: 82 30 cpi r24, 0x02 ; 2 - 2a80: 09 f4 brne .+2 ; 0x2a84 - 2a82: a0 c0 rjmp .+320 ; 0x2bc4 - 2a84: 08 f4 brcc .+2 ; 0x2a88 - 2a86: 71 c0 rjmp .+226 ; 0x2b6a -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) ){ - 2a88: f8 01 movw r30, r16 - 2a8a: 80 81 ld r24, Z - 2a8c: 86 32 cpi r24, 0x26 ; 38 - 2a8e: 09 f4 brne .+2 ; 0x2a92 - 2a90: 6f c1 rjmp .+734 ; 0x2d70 - 2a92: 82 35 cpi r24, 0x52 ; 82 - 2a94: 09 f4 brne .+2 ; 0x2a98 - 2a96: 6c c1 rjmp .+728 ; 0x2d70 - - case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { - State = STATE_READY; - return BitCount; - } else if (Buffer[0] == CMD_HALT) { - 2a98: 80 35 cpi r24, 0x50 ; 80 - 2a9a: 09 f4 brne .+2 ; 0x2a9e - 2a9c: 74 c1 rjmp .+744 ; 0x2d86 - } - } else { - Buffer[0] = NAK_INVALID_ARG; - return ACK_NAK_FRAME_SIZE; - } - } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - 2a9e: 98 2f mov r25, r24 - 2aa0: 90 56 subi r25, 0x60 ; 96 - 2aa2: 92 30 cpi r25, 0x02 ; 2 - 2aa4: 08 f4 brcc .+2 ; 0x2aa8 - 2aa6: e6 c1 rjmp .+972 ; 0x2e74 - 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) - 2aa8: 80 33 cpi r24, 0x30 ; 48 - 2aaa: 51 f0 breq .+20 ; 0x2ac0 - 2aac: 80 3a cpi r24, 0xA0 ; 160 - 2aae: 41 f0 breq .+16 ; 0x2ac0 - 2ab0: 80 3c cpi r24, 0xC0 ; 192 - 2ab2: 31 f0 breq .+12 ; 0x2ac0 - || (Buffer[0] == CMD_INCREMENT) || (Buffer[0] == CMD_RESTORE) || (Buffer[0] == CMD_TRANSFER) ) { - 2ab4: 81 3c cpi r24, 0xC1 ; 193 - 2ab6: 21 f0 breq .+8 ; 0x2ac0 - 2ab8: 82 3c cpi r24, 0xC2 ; 194 - 2aba: 11 f0 breq .+4 ; 0x2ac0 - 2abc: 80 3b cpi r24, 0xB0 ; 176 - 2abe: c9 f6 brne .-78 ; 0x2a72 - State = STATE_IDLE; - 2ac0: 81 e0 ldi r24, 0x01 ; 1 - 2ac2: 80 93 b5 24 sts 0x24B5, r24 - Buffer[0] = NAK_NOT_AUTHED; - 2ac6: 84 e0 ldi r24, 0x04 ; 4 - 2ac8: f8 01 movw r30, r16 - 2aca: 80 83 st Z, r24 - return ACK_NAK_FRAME_SIZE; - 2acc: 24 e0 ldi r18, 0x04 ; 4 - 2ace: 30 e0 ldi r19, 0x00 ; 0 - 2ad0: 39 c0 rjmp .+114 ; 0x2b44 - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 2ad2: 8a 30 cpi r24, 0x0A ; 10 - 2ad4: 08 f0 brcs .+2 ; 0x2ad8 - 2ad6: 55 c0 rjmp .+170 ; 0x2b82 - * 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(); - 2ad8: d8 01 movw r26, r16 - 2ada: fc 90 ld r15, X - 2adc: ce d6 rcall .+3484 ; 0x387a - 2ade: 8f 25 eor r24, r15 - 2ae0: f8 01 movw r30, r16 - 2ae2: 80 83 st Z, r24 - 2ae4: f1 80 ldd r15, Z+1 ; 0x01 - 2ae6: c9 d6 rcall .+3474 ; 0x387a - 2ae8: 8f 25 eor r24, r15 - 2aea: d8 01 movw r26, r16 - 2aec: 11 96 adiw r26, 0x01 ; 1 - 2aee: 8c 93 st X, r24 - 2af0: 11 97 sbiw r26, 0x01 ; 1 - 2af2: 12 96 adiw r26, 0x02 ; 2 - 2af4: fc 90 ld r15, X - 2af6: c1 d6 rcall .+3458 ; 0x387a - 2af8: 8f 25 eor r24, r15 - 2afa: f8 01 movw r30, r16 - 2afc: 82 83 std Z+2, r24 ; 0x02 - 2afe: f3 80 ldd r15, Z+3 ; 0x03 - 2b00: bc d6 rcall .+3448 ; 0x387a - 2b02: 8f 25 eor r24, r15 - 2b04: d8 01 movw r26, r16 - 2b06: 13 96 adiw r26, 0x03 ; 3 - 2b08: 8c 93 st X, r24 - 2b0a: 13 97 sbiw r26, 0x03 ; 3 - 2b0c: 14 96 adiw r26, 0x04 ; 4 - 2b0e: fc 90 ld r15, X - 2b10: b4 d6 rcall .+3432 ; 0x387a - 2b12: 8f 25 eor r24, r15 - 2b14: f8 01 movw r30, r16 - 2b16: 84 83 std Z+4, r24 ; 0x04 - 2b18: f5 80 ldd r15, Z+5 ; 0x05 - 2b1a: af d6 rcall .+3422 ; 0x387a - 2b1c: 8f 25 eor r24, r15 - 2b1e: d8 01 movw r26, r16 - 2b20: 15 96 adiw r26, 0x05 ; 5 - 2b22: 8c 93 st X, r24 - - if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { - 2b24: 64 e0 ldi r22, 0x04 ; 4 - 2b26: 70 e0 ldi r23, 0x00 ; 0 - 2b28: c8 01 movw r24, r16 - 2b2a: 25 d4 rcall .+2122 ; 0x3376 - 2b2c: 81 11 cpse r24, r1 - 2b2e: 0c c2 rjmp .+1048 ; 0x2f48 - /* Not sure if this is the correct error code.. */ - Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); - } - } else { - /* CRC Error. */ - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2b30: e5 d6 rcall .+3530 ; 0x38fc - 2b32: 91 e0 ldi r25, 0x01 ; 1 - 2b34: 98 27 eor r25, r24 - 2b36: f8 01 movw r30, r16 - 2b38: 90 83 st Z, r25 - } - - State = STATE_AUTHED_IDLE; - 2b3a: 85 e0 ldi r24, 0x05 ; 5 - 2b3c: 80 93 b5 24 sts 0x24B5, r24 - return ACK_NAK_FRAME_SIZE; - 2b40: 24 e0 ldi r18, 0x04 ; 4 - 2b42: 30 e0 ldi r19, 0x00 ; 0 - break; - } - - /* No response has been sent, when we reach here */ - return ISO14443A_APP_NO_RESPONSE; -} - 2b44: c9 01 movw r24, r18 - 2b46: 2e 96 adiw r28, 0x0e ; 14 - 2b48: cd bf out 0x3d, r28 ; 61 - 2b4a: de bf out 0x3e, r29 ; 62 - 2b4c: df 91 pop r29 - 2b4e: cf 91 pop r28 - 2b50: 1f 91 pop r17 - 2b52: 0f 91 pop r16 - 2b54: ff 90 pop r15 - 2b56: ef 90 pop r14 - 2b58: df 90 pop r13 - 2b5a: cf 90 pop r12 - 2b5c: bf 90 pop r11 - 2b5e: af 90 pop r10 - 2b60: 9f 90 pop r9 - 2b62: 8f 90 pop r8 - 2b64: 7f 90 pop r7 - 2b66: 6f 90 pop r6 - 2b68: 08 95 ret -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - case STATE_IDLE: - case STATE_HALT: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 2b6a: 20 91 b6 24 lds r18, 0x24B6 - 2b6e: 90 91 b7 24 lds r25, 0x24B7 - 2b72: d8 01 movw r26, r16 - 2b74: 8c 91 ld r24, X - 2b76: 86 32 cpi r24, 0x26 ; 38 - 2b78: 09 f4 brne .+2 ; 0x2b7c - 2b7a: f1 c0 rjmp .+482 ; 0x2d5e - 2b7c: 82 35 cpi r24, 0x52 ; 82 - 2b7e: 09 f4 brne .+2 ; 0x2b82 - 2b80: ee c0 rjmp .+476 ; 0x2d5e - - *BitCount = ISO14443A_SAK_FRAME_SIZE; - return true; - } else { - /* We have not been selected. Don't send anything. */ - *BitCount = 0; - 2b82: 20 e0 ldi r18, 0x00 ; 0 - 2b84: 30 e0 ldi r19, 0x00 ; 0 - 2b86: de cf rjmp .-68 ; 0x2b44 - 2b88: 78 01 movw r14, r16 - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) -{ - switch(State) { - 2b8a: 52 e1 ldi r21, 0x12 ; 18 - 2b8c: d5 2e mov r13, r21 - * check for CRC. Then write the data when ReadOnly mode is not - * activated. */ - - /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ - for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) - Buffer[i] ^= Crypto1Byte(); - 2b8e: d7 01 movw r26, r14 - 2b90: cc 90 ld r12, X - 2b92: 73 d6 rcall .+3302 ; 0x387a - 2b94: 8c 25 eor r24, r12 - 2b96: f7 01 movw r30, r14 - 2b98: 81 93 st Z+, r24 - 2b9a: 7f 01 movw r14, r30 - 2b9c: da 94 dec r13 - * sending the data to be written. Decrypt the data first and - * check for CRC. Then write the data when ReadOnly mode is not - * activated. */ - - /* We receive 16 bytes of data to be written and 2 bytes CRCA. Decrypt */ - for (uint8_t i=0; i<(MEM_BYTES_PER_BLOCK + ISO14443A_CRCA_SIZE); i++) - 2b9e: b9 f7 brne .-18 ; 0x2b8e - Buffer[i] ^= Crypto1Byte(); - - if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - 2ba0: 60 e1 ldi r22, 0x10 ; 16 - 2ba2: 70 e0 ldi r23, 0x00 ; 0 - 2ba4: c8 01 movw r24, r16 - 2ba6: e7 d3 rcall .+1998 ; 0x3376 - 2ba8: 88 23 and r24, r24 - 2baa: 09 f4 brne .+2 ; 0x2bae - 2bac: c1 cf rjmp .-126 ; 0x2b30 - if (!ActiveConfiguration.ReadOnly) { - 2bae: 80 91 fc 24 lds r24, 0x24FC - 2bb2: 88 23 and r24, r24 - 2bb4: 09 f4 brne .+2 ; 0x2bb8 - 2bb6: e2 c1 rjmp .+964 ; 0x2f7c - MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - } else { - /* Silently ignore in ReadOnly mode */ - } - - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 2bb8: a1 d6 rcall .+3394 ; 0x38fc - 2bba: 9a e0 ldi r25, 0x0A ; 10 - 2bbc: 98 27 eor r25, r24 - 2bbe: d8 01 movw r26, r16 - 2bc0: 9c 93 st X, r25 - 2bc2: bb cf rjmp .-138 ; 0x2b3a - return BitCount; - } - break; - - case STATE_READY: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 2bc4: 20 91 b6 24 lds r18, 0x24B6 - 2bc8: 90 91 b7 24 lds r25, 0x24B7 -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) ){ - 2bcc: d8 01 movw r26, r16 - 2bce: 8c 91 ld r24, X - 2bd0: 86 32 cpi r24, 0x26 ; 38 - 2bd2: 09 f4 brne .+2 ; 0x2bd6 - 2bd4: c4 c0 rjmp .+392 ; 0x2d5e - 2bd6: 82 35 cpi r24, 0x52 ; 82 - 2bd8: 09 f4 brne .+2 ; 0x2bdc - 2bda: c1 c0 rjmp .+386 ; 0x2d5e - State = STATE_READY; - return BitCount; - } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { - 2bdc: 83 39 cpi r24, 0x93 ; 147 - 2bde: 09 f4 brne .+2 ; 0x2be2 - 2be0: 20 c2 rjmp .+1088 ; 0x3022 <__stack+0x23> - * byte is supposed to be 0. */ - if (Buffer[1] == 0) { - if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { - /* According to ISO14443, we must not send anything - * in order to acknowledge the HALT command. */ - State = STATE_HALT; - 2be2: 10 92 b5 24 sts 0x24B5, r1 - return ISO14443A_APP_NO_RESPONSE; - 2be6: 20 e0 ldi r18, 0x00 ; 0 - 2be8: 30 e0 ldi r19, 0x00 ; 0 - 2bea: ac cf rjmp .-168 ; 0x2b44 - - 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]); - 2bec: c8 01 movw r24, r16 - 2bee: 1c d6 rcall .+3128 ; 0x3828 - - for (uint8_t i=0; i<4; i++) - Buffer[i+4] ^= Crypto1Byte(); - 2bf0: d8 01 movw r26, r16 - 2bf2: 14 96 adiw r26, 0x04 ; 4 - 2bf4: fc 90 ld r15, X - 2bf6: 41 d6 rcall .+3202 ; 0x387a - 2bf8: 8f 25 eor r24, r15 - 2bfa: f8 01 movw r30, r16 - 2bfc: 84 83 std Z+4, r24 ; 0x04 - 2bfe: f5 80 ldd r15, Z+5 ; 0x05 - 2c00: 3c d6 rcall .+3192 ; 0x387a - 2c02: 8f 25 eor r24, r15 - 2c04: d8 01 movw r26, r16 - 2c06: 15 96 adiw r26, 0x05 ; 5 - 2c08: 8c 93 st X, r24 - 2c0a: 15 97 sbiw r26, 0x05 ; 5 - 2c0c: 16 96 adiw r26, 0x06 ; 6 - 2c0e: fc 90 ld r15, X - 2c10: 34 d6 rcall .+3176 ; 0x387a - 2c12: 8f 25 eor r24, r15 - 2c14: f8 01 movw r30, r16 - 2c16: 86 83 std Z+6, r24 ; 0x06 - 2c18: f7 80 ldd r15, Z+7 ; 0x07 - 2c1a: 2f d6 rcall .+3166 ; 0x387a - 2c1c: 8f 25 eor r24, r15 - 2c1e: d8 01 movw r26, r16 - 2c20: 17 96 adiw r26, 0x07 ; 7 - 2c22: 8c 93 st X, r24 - 2c24: 17 97 sbiw r26, 0x07 ; 7 - - if ((Buffer[4] == ReaderResponse[0]) && - 2c26: 14 96 adiw r26, 0x04 ; 4 - 2c28: 2c 91 ld r18, X - 2c2a: 14 97 sbiw r26, 0x04 ; 4 - 2c2c: 90 91 b9 24 lds r25, 0x24B9 - 2c30: 29 13 cpse r18, r25 - 2c32: 1f cf rjmp .-450 ; 0x2a72 - 2c34: 15 96 adiw r26, 0x05 ; 5 - 2c36: 2c 91 ld r18, X - 2c38: 15 97 sbiw r26, 0x05 ; 5 - 2c3a: 90 91 ba 24 lds r25, 0x24BA - 2c3e: 29 13 cpse r18, r25 - 2c40: 18 cf rjmp .-464 ; 0x2a72 - (Buffer[5] == ReaderResponse[1]) && - 2c42: 16 96 adiw r26, 0x06 ; 6 - 2c44: 2c 91 ld r18, X - 2c46: 90 91 bb 24 lds r25, 0x24BB - 2c4a: 29 13 cpse r18, r25 - 2c4c: 12 cf rjmp .-476 ; 0x2a72 - (Buffer[6] == ReaderResponse[2]) && - 2c4e: 90 91 bc 24 lds r25, 0x24BC - 2c52: 89 13 cpse r24, r25 - 2c54: 0e cf rjmp .-484 ; 0x2a72 - (Buffer[7] == ReaderResponse[3])) { - /* Reader is authenticated. Encrypt the precalculated card response - * and generate the parity bits. */ - for (uint8_t i=0; i - 2c5c: 8f 25 eor r24, r15 - 2c5e: f8 01 movw r30, r16 - 2c60: 80 83 st Z, r24 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2c62: f0 90 bd 24 lds r15, 0x24BD - 2c66: 0f 2c mov r0, r15 - 2c68: f2 94 swap r15 - 2c6a: f0 24 eor r15, r0 - 2c6c: 0f 2c mov r0, r15 - 2c6e: f6 94 lsr r15 - 2c70: f6 94 lsr r15 - 2c72: f0 24 eor r15, r0 - 2c74: 05 d4 rcall .+2058 ; 0x3480 - 2c76: f8 01 movw r30, r16 - 2c78: e0 58 subi r30, 0x80 ; 128 - 2c7a: ff 4f sbci r31, 0xFF ; 255 - 2c7c: 2f 2d mov r18, r15 - 2c7e: 30 e0 ldi r19, 0x00 ; 0 - 2c80: 2f 5f subi r18, 0xFF ; 255 - 2c82: 3f 4f sbci r19, 0xFF ; 255 - 2c84: 21 fb bst r18, 1 - 2c86: 88 24 eor r8, r8 - 2c88: 80 f8 bld r8, 0 - 2c8a: 91 2c mov r9, r1 - 2c8c: 31 e0 ldi r19, 0x01 ; 1 - 2c8e: 83 26 eor r8, r19 - 2c90: 88 25 eor r24, r8 - 2c92: 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 - 2c9a: 8f 25 eor r24, r15 - 2c9c: d8 01 movw r26, r16 - 2c9e: 11 96 adiw r26, 0x01 ; 1 - 2ca0: 8c 93 st X, r24 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2ca2: f0 90 be 24 lds r15, 0x24BE - 2ca6: 0f 2c mov r0, r15 - 2ca8: f2 94 swap r15 - 2caa: f0 24 eor r15, r0 - 2cac: 0f 2c mov r0, r15 - 2cae: f6 94 lsr r15 - 2cb0: f6 94 lsr r15 - 2cb2: f0 24 eor r15, r0 - 2cb4: e5 d3 rcall .+1994 ; 0x3480 - 2cb6: f8 01 movw r30, r16 - 2cb8: ef 57 subi r30, 0x7F ; 127 - 2cba: ff 4f sbci r31, 0xFF ; 255 - 2cbc: 2f 2d mov r18, r15 - 2cbe: 30 e0 ldi r19, 0x00 ; 0 - 2cc0: 2f 5f subi r18, 0xFF ; 255 - 2cc2: 3f 4f sbci r19, 0xFF ; 255 - 2cc4: 21 fb bst r18, 1 - 2cc6: aa 24 eor r10, r10 - 2cc8: a0 f8 bld r10, 0 - 2cca: b1 2c mov r11, r1 - 2ccc: b1 e0 ldi r27, 0x01 ; 1 - 2cce: ab 26 eor r10, r27 - 2cd0: 8a 25 eor r24, r10 - 2cd2: 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 - 2cda: 8f 25 eor r24, r15 - 2cdc: f8 01 movw r30, r16 - 2cde: 82 83 std Z+2, r24 ; 0x02 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2ce0: f0 90 bf 24 lds r15, 0x24BF - 2ce4: 0f 2c mov r0, r15 - 2ce6: f2 94 swap r15 - 2ce8: f0 24 eor r15, r0 - 2cea: 0f 2c mov r0, r15 - 2cec: f6 94 lsr r15 - 2cee: f6 94 lsr r15 - 2cf0: f0 24 eor r15, r0 - 2cf2: c6 d3 rcall .+1932 ; 0x3480 - 2cf4: f8 01 movw r30, r16 - 2cf6: ee 57 subi r30, 0x7E ; 126 - 2cf8: ff 4f sbci r31, 0xFF ; 255 - 2cfa: 2f 2d mov r18, r15 - 2cfc: 30 e0 ldi r19, 0x00 ; 0 - 2cfe: 2f 5f subi r18, 0xFF ; 255 - 2d00: 3f 4f sbci r19, 0xFF ; 255 - 2d02: 21 fb bst r18, 1 - 2d04: cc 24 eor r12, r12 - 2d06: c0 f8 bld r12, 0 - 2d08: d1 2c mov r13, r1 - 2d0a: 31 e0 ldi r19, 0x01 ; 1 - 2d0c: c3 26 eor r12, r19 - 2d0e: 8c 25 eor r24, r12 - 2d10: 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 - 2d18: 8f 25 eor r24, r15 - 2d1a: d8 01 movw r26, r16 - 2d1c: 13 96 adiw r26, 0x03 ; 3 - 2d1e: 8c 93 st X, r24 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); - 2d20: f0 90 c0 24 lds r15, 0x24C0 - 2d24: 0f 2c mov r0, r15 - 2d26: f2 94 swap r15 - 2d28: f0 24 eor r15, r0 - 2d2a: 0f 2c mov r0, r15 - 2d2c: f6 94 lsr r15 - 2d2e: f6 94 lsr r15 - 2d30: f0 24 eor r15, r0 - 2d32: a6 d3 rcall .+1868 ; 0x3480 - 2d34: f8 01 movw r30, r16 - 2d36: ed 57 subi r30, 0x7D ; 125 - 2d38: ff 4f sbci r31, 0xFF ; 255 - 2d3a: 2f 2d mov r18, r15 - 2d3c: 30 e0 ldi r19, 0x00 ; 0 - 2d3e: 2f 5f subi r18, 0xFF ; 255 - 2d40: 3f 4f sbci r19, 0xFF ; 255 - 2d42: 21 fb bst r18, 1 - 2d44: 66 24 eor r6, r6 - 2d46: 60 f8 bld r6, 0 - 2d48: 71 2c mov r7, r1 - 2d4a: b1 e0 ldi r27, 0x01 ; 1 - 2d4c: 6b 26 eor r6, r27 - 2d4e: 86 25 eor r24, r6 - 2d50: 80 83 st Z, r24 - } - - State = STATE_AUTHED_IDLE; - 2d52: 85 e0 ldi r24, 0x05 ; 5 - 2d54: 80 93 b5 24 sts 0x24B5, r24 - - return (CMD_AUTH_BA_FRAME_SIZE * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; - 2d58: 20 e2 ldi r18, 0x20 ; 32 - 2d5a: 30 e1 ldi r19, 0x10 ; 16 - 2d5c: f3 ce rjmp .-538 ; 0x2b44 - DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 2d5e: f8 01 movw r30, r16 - 2d60: 20 83 st Z, r18 - DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 2d62: 91 83 std Z+1, r25 ; 0x01 - } - break; - - case STATE_READY: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - State = STATE_READY; - 2d64: 82 e0 ldi r24, 0x02 ; 2 - 2d66: 80 93 b5 24 sts 0x24B5, r24 - - *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 2d6a: 20 e1 ldi r18, 0x10 ; 16 - 2d6c: 30 e0 ldi r19, 0x00 ; 0 - return BitCount; - 2d6e: ea ce rjmp .-556 ; 0x2b44 -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; - 2d70: 84 e0 ldi r24, 0x04 ; 4 - 2d72: d8 01 movw r26, r16 - 2d74: 8c 93 st X, r24 - DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 2d76: 11 96 adiw r26, 0x01 ; 1 - 2d78: 1c 92 st X, r1 - } - break; - - case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { - State = STATE_READY; - 2d7a: 82 e0 ldi r24, 0x02 ; 2 - 2d7c: 80 93 b5 24 sts 0x24B5, r24 - - *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 2d80: 20 e1 ldi r18, 0x10 ; 16 - 2d82: 30 e0 ldi r19, 0x00 ; 0 - return BitCount; - 2d84: df ce rjmp .-578 ; 0x2b44 - } 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) { - 2d86: f8 01 movw r30, r16 - 2d88: 81 81 ldd r24, Z+1 ; 0x01 - 2d8a: 88 23 and r24, r24 - 2d8c: 09 f4 brne .+2 ; 0x2d90 - 2d8e: 7c c2 rjmp .+1272 ; 0x3288 <__stack+0x289> - } else { - Buffer[0] = NAK_CRC_ERROR; - return ACK_NAK_FRAME_SIZE; - } - } else { - Buffer[0] = NAK_INVALID_ARG; - 2d90: f8 01 movw r30, r16 - 2d92: 10 82 st Z, r1 - return ACK_NAK_FRAME_SIZE; - 2d94: 24 e0 ldi r18, 0x04 ; 4 - 2d96: 30 e0 ldi r19, 0x00 ; 0 - 2d98: d5 ce rjmp .-598 ; 0x2b44 - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - - return ACK_NAK_FRAME_SIZE; - } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { - if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - 2d9a: 62 e0 ldi r22, 0x02 ; 2 - 2d9c: 70 e0 ldi r23, 0x00 ; 0 - 2d9e: c8 01 movw r24, r16 - 2da0: ea d2 rcall .+1492 ; 0x3376 - 2da2: 88 23 and r24, r24 - 2da4: 09 f4 brne .+2 ; 0x2da8 - 2da6: f6 c0 rjmp .+492 ; 0x2f94 - /* Nested authentication. */ - uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 2da8: f8 01 movw r30, r16 - 2daa: 81 81 ldd r24, Z+1 ; 0x01 - 2dac: 8c 73 andi r24, 0x3C ; 60 - uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 2dae: 90 81 ld r25, Z - 2db0: 90 36 cpi r25, 0x60 ; 96 - 2db2: 09 f4 brne .+2 ; 0x2db6 - 2db4: 85 c2 rjmp .+1290 ; 0x32c0 <__stack+0x2c1> - 2db6: 6a e3 ldi r22, 0x3A ; 58 - 2db8: 70 e0 ldi r23, 0x00 ; 0 - uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 2dba: 7b 01 movw r14, r22 - 2dbc: f0 e1 ldi r31, 0x10 ; 16 - 2dbe: 8f 9f mul r24, r31 - 2dc0: e0 0c add r14, r0 - 2dc2: f1 1c adc r15, r1 - 2dc4: 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)); - 2dc6: 64 e0 ldi r22, 0x04 ; 4 - 2dc8: ce 01 movw r24, r28 - 2dca: 07 96 adiw r24, 0x07 ; 7 - 2dcc: 0e 94 03 05 call 0xa06 ; 0xa06 - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2dd0: 44 e0 ldi r20, 0x04 ; 4 - 2dd2: 50 e0 ldi r21, 0x00 ; 0 - 2dd4: 60 e0 ldi r22, 0x00 ; 0 - 2dd6: 70 e0 ldi r23, 0x00 ; 0 - 2dd8: ce 01 movw r24, r28 - 2dda: 0b 96 adiw r24, 0x0b ; 11 - 2ddc: 0e 94 a2 05 call 0xb44 ; 0xb44 - MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 2de0: 46 e0 ldi r20, 0x06 ; 6 - 2de2: 50 e0 ldi r21, 0x00 ; 0 - 2de4: b7 01 movw r22, r14 - 2de6: ce 01 movw r24, r28 - 2de8: 01 96 adiw r24, 0x01 ; 1 - 2dea: 0e 94 a2 05 call 0xb44 ; 0xb44 - - /* 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); - 2e3a: ae 01 movw r20, r28 - 2e3c: 49 5f subi r20, 0xF9 ; 249 - 2e3e: 5f 4f sbci r21, 0xFF ; 255 - 2e40: be 01 movw r22, r28 - 2e42: 65 5f subi r22, 0xF5 ; 245 - 2e44: 7f 4f sbci r23, 0xFF ; 255 - 2e46: ce 01 movw r24, r28 - 2e48: 01 96 adiw r24, 0x01 ; 1 - 2e4a: 4e d3 rcall .+1692 ; 0x34e8 - - for (uint8_t i=0; i - } 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)) { - 2e74: 62 e0 ldi r22, 0x02 ; 2 - 2e76: 70 e0 ldi r23, 0x00 ; 0 - 2e78: c8 01 movw r24, r16 - 2e7a: 7d d2 rcall .+1274 ; 0x3376 - 2e7c: 88 23 and r24, r24 - 2e7e: 09 f4 brne .+2 ; 0x2e82 - 2e80: 09 c2 rjmp .+1042 ; 0x3294 <__stack+0x295> - uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 2e82: d8 01 movw r26, r16 - 2e84: 11 96 adiw r26, 0x01 ; 1 - 2e86: 2c 91 ld r18, X - 2e88: 11 97 sbiw r26, 0x01 ; 1 - 2e8a: 2c 73 andi r18, 0x3C ; 60 - uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 2e8c: 8c 91 ld r24, X - 2e8e: 80 36 cpi r24, 0x60 ; 96 - 2e90: 09 f4 brne .+2 ; 0x2e94 - 2e92: 19 c2 rjmp .+1074 ; 0x32c6 <__stack+0x2c7> - 2e94: 8a e3 ldi r24, 0x3A ; 58 - 2e96: 90 e0 ldi r25, 0x00 ; 0 - uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 2e98: 7c 01 movw r14, r24 - 2e9a: b0 e1 ldi r27, 0x10 ; 16 - 2e9c: 2b 9f mul r18, r27 - 2e9e: e0 0c add r14, r0 - 2ea0: f1 1c adc r15, r1 - 2ea2: 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)); - 2ea4: 64 e0 ldi r22, 0x04 ; 4 - 2ea6: ce 01 movw r24, r28 - 2ea8: 07 96 adiw r24, 0x07 ; 7 - 2eaa: 0e 94 03 05 call 0xa06 ; 0xa06 - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2eae: 44 e0 ldi r20, 0x04 ; 4 - 2eb0: 50 e0 ldi r21, 0x00 ; 0 - 2eb2: 60 e0 ldi r22, 0x00 ; 0 - 2eb4: 70 e0 ldi r23, 0x00 ; 0 - 2eb6: ce 01 movw r24, r28 - 2eb8: 0b 96 adiw r24, 0x0b ; 11 - 2eba: 0e 94 a2 05 call 0xb44 ; 0xb44 - MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 2ebe: 46 e0 ldi r20, 0x06 ; 6 - 2ec0: 50 e0 ldi r21, 0x00 ; 0 - 2ec2: b7 01 movw r22, r14 - 2ec4: ce 01 movw r24, r28 - 2ec6: 01 96 adiw r24, 0x01 ; 1 - 2ec8: 0e 94 a2 05 call 0xb44 ; 0xb44 - - /* 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 - - /* Respond with the random card nonce and expect further authentication - * form the reader in the next frame. */ - State = STATE_AUTHING; - 2f18: 84 e0 ldi r24, 0x04 ; 4 - 2f1a: 80 93 b5 24 sts 0x24B5, r24 - - for (uint8_t i=0; i - - return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - 2f42: 20 e2 ldi r18, 0x20 ; 32 - 2f44: 30 e0 ldi r19, 0x00 ; 0 - 2f46: fe cd rjmp .-1028 ; 0x2b44 - * 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); - 2f48: 60 91 c1 24 lds r22, 0x24C1 - 2f4c: b0 e1 ldi r27, 0x10 ; 16 - 2f4e: 6b 9f mul r22, r27 - 2f50: b0 01 movw r22, r0 - 2f52: 11 24 eor r1, r1 - 2f54: 40 e1 ldi r20, 0x10 ; 16 - 2f56: 50 e0 ldi r21, 0x00 ; 0 - 2f58: 82 ec ldi r24, 0xC2 ; 194 - 2f5a: 94 e2 ldi r25, 0x24 ; 36 - 2f5c: 0e 94 a2 05 call 0xb44 ; 0xb44 - -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]) - 2f60: 20 91 c2 24 lds r18, 0x24C2 - 2f64: 80 91 c6 24 lds r24, 0x24C6 - 2f68: 80 95 com r24 - 2f6a: 28 17 cp r18, r24 - 2f6c: 09 f4 brne .+2 ; 0x2f70 - 2f6e: c4 c0 rjmp .+392 ; 0x30f8 <__stack+0xf9> - 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(); - 2f70: c5 d4 rcall .+2442 ; 0x38fc - 2f72: 96 e0 ldi r25, 0x06 ; 6 - 2f74: 98 27 eor r25, r24 - 2f76: d8 01 movw r26, r16 - 2f78: 9c 93 st X, r25 - 2f7a: df cd rjmp .-1090 ; 0x2b3a - 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); - 2f7c: 60 91 c1 24 lds r22, 0x24C1 - 2f80: f0 e1 ldi r31, 0x10 ; 16 - 2f82: 6f 9f mul r22, r31 - 2f84: b0 01 movw r22, r0 - 2f86: 11 24 eor r1, r1 - 2f88: 40 e1 ldi r20, 0x10 ; 16 - 2f8a: 50 e0 ldi r21, 0x00 ; 0 - 2f8c: c8 01 movw r24, r16 - 2f8e: 0e 94 ba 05 call 0xb74 ; 0xb74 - 2f92: 12 ce rjmp .-988 ; 0x2bb8 - * form the reader in the next frame. */ - State = STATE_AUTHING; - - return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2f94: b3 d4 rcall .+2406 ; 0x38fc - 2f96: 91 e0 ldi r25, 0x01 ; 1 - 2f98: 98 27 eor r25, r24 - 2f9a: f8 01 movw r30, r16 - 2f9c: 90 83 st Z, r25 - return ACK_NAK_FRAME_SIZE; - 2f9e: 24 e0 ldi r18, 0x04 ; 4 - 2fa0: 30 e0 ldi r19, 0x00 ; 0 - 2fa2: d0 cd rjmp .-1120 ; 0x2b44 - * 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)) { - 2fa4: 62 e0 ldi r22, 0x02 ; 2 - 2fa6: 70 e0 ldi r23, 0x00 ; 0 - 2fa8: c8 01 movw r24, r16 - 2faa: e5 d1 rcall .+970 ; 0x3376 - 2fac: 88 23 and r24, r24 - 2fae: 91 f3 breq .-28 ; 0x2f94 - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 2fb0: d8 01 movw r26, r16 - 2fb2: 11 96 adiw r26, 0x01 ; 1 - 2fb4: 6c 91 ld r22, X - 2fb6: b0 e1 ldi r27, 0x10 ; 16 - 2fb8: 6b 9f mul r22, r27 - 2fba: b0 01 movw r22, r0 - 2fbc: 11 24 eor r1, r1 - 2fbe: 40 e1 ldi r20, 0x10 ; 16 - 2fc0: 50 e0 ldi r21, 0x00 ; 0 - 2fc2: c8 01 movw r24, r16 - 2fc4: 0e 94 a2 05 call 0xb44 ; 0xb44 - ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - 2fc8: 60 e1 ldi r22, 0x10 ; 16 - 2fca: 70 e0 ldi r23, 0x00 ; 0 - 2fcc: c8 01 movw r24, r16 - 2fce: a4 d1 rcall .+840 ; 0x3318 -void MifareClassicAppTask(void) -{ - -} - -uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) - 2fd0: 68 01 movw r12, r16 - 2fd2: e0 e8 ldi r30, 0x80 ; 128 - 2fd4: ce 0e add r12, r30 - 2fd6: d1 1c adc r13, r1 - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - - /* Encrypt and calculate parity bits. */ - for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { - 2fd8: a1 2c mov r10, r1 - uint8_t Plain = Buffer[i]; - 2fda: d8 01 movw r26, r16 - 2fdc: bc 90 ld r11, X - Buffer[i] = Plain ^ Crypto1Byte(); - 2fde: 4d d4 rcall .+2202 ; 0x387a - 2fe0: 8b 25 eor r24, r11 - 2fe2: f8 01 movw r30, r16 - 2fe4: 81 93 st Z+, r24 - 2fe6: 8f 01 movw r16, r30 - Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); - 2fe8: 0b 2c mov r0, r11 - 2fea: b2 94 swap r11 - 2fec: b0 24 eor r11, r0 - 2fee: 0b 2c mov r0, r11 - 2ff0: b6 94 lsr r11 - 2ff2: b6 94 lsr r11 - 2ff4: b0 24 eor r11, r0 - 2ff6: 44 d2 rcall .+1160 ; 0x3480 - 2ff8: 2b 2d mov r18, r11 - 2ffa: 30 e0 ldi r19, 0x00 ; 0 - 2ffc: 2f 5f subi r18, 0xFF ; 255 - 2ffe: 3f 4f sbci r19, 0xFF ; 255 - 3000: 21 fb bst r18, 1 - 3002: ee 24 eor r14, r14 - 3004: e0 f8 bld r14, 0 - 3006: f1 2c mov r15, r1 - 3008: f1 e0 ldi r31, 0x01 ; 1 - 300a: ef 26 eor r14, r31 - 300c: 8e 25 eor r24, r14 - 300e: d6 01 movw r26, r12 - 3010: 8d 93 st X+, r24 - 3012: 6d 01 movw r12, r26 - /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - - /* Encrypt and calculate parity bits. */ - for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { - 3014: a3 94 inc r10 - 3016: b2 e1 ldi r27, 0x12 ; 18 - 3018: ab 12 cpse r10, r27 - 301a: df cf rjmp .-66 ; 0x2fda - 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 ) - 301c: 20 e9 ldi r18, 0x90 ; 144 - 301e: 30 e1 ldi r19, 0x10 ; 16 - 3020: 91 cd rjmp .-1246 ; 0x2b44 - State = STATE_READY; - return BitCount; - } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { - /* Load UID CL1 and perform anticollision */ - uint8_t UidCL1[4]; - MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 3022: 44 e0 ldi r20, 0x04 ; 4 - 3024: 50 e0 ldi r21, 0x00 ; 0 - 3026: 60 e0 ldi r22, 0x00 ; 0 - 3028: 70 e0 ldi r23, 0x00 ; 0 - 302a: ce 01 movw r24, r28 - 302c: 01 96 adiw r24, 0x01 ; 1 - 302e: 0e 94 a2 05 call 0xb44 ; 0xb44 - - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { - 3032: 90 91 b8 24 lds r25, 0x24B8 - 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) { - 3036: d8 01 movw r26, r16 - 3038: 11 96 adiw r26, 0x01 ; 1 - 303a: 8c 91 ld r24, X - 303c: 80 32 cpi r24, 0x20 ; 32 - 303e: 09 f4 brne .+2 ; 0x3042 <__stack+0x43> - 3040: 2f c1 rjmp .+606 ; 0x32a0 <__stack+0x2a1> - 3042: 80 37 cpi r24, 0x70 ; 112 - 3044: 09 f0 breq .+2 ; 0x3048 <__stack+0x49> - 3046: 9d cd rjmp .-1222 ; 0x2b82 - return false; - - case ISO14443A_NVB_AC_END: - /* End of anticollision procedure. - * Send SAK CLn if we are selected. */ - if ( (DataPtr[2] == UidCL[0]) && - 3048: d8 01 movw r26, r16 - 304a: 12 96 adiw r26, 0x02 ; 2 - 304c: 2c 91 ld r18, X - 304e: 12 97 sbiw r26, 0x02 ; 2 - 3050: 89 81 ldd r24, Y+1 ; 0x01 - 3052: 28 13 cpse r18, r24 - 3054: 96 cd rjmp .-1236 ; 0x2b82 - 3056: 13 96 adiw r26, 0x03 ; 3 - 3058: 2c 91 ld r18, X - 305a: 13 97 sbiw r26, 0x03 ; 3 - 305c: 8a 81 ldd r24, Y+2 ; 0x02 - 305e: 28 13 cpse r18, r24 - 3060: 90 cd rjmp .-1248 ; 0x2b82 - (DataPtr[3] == UidCL[1]) && - 3062: 14 96 adiw r26, 0x04 ; 4 - 3064: 2c 91 ld r18, X - 3066: 14 97 sbiw r26, 0x04 ; 4 - 3068: 8b 81 ldd r24, Y+3 ; 0x03 - 306a: 28 13 cpse r18, r24 - 306c: 8a cd rjmp .-1260 ; 0x2b82 - (DataPtr[4] == UidCL[2]) && - 306e: 15 96 adiw r26, 0x05 ; 5 - 3070: 2c 91 ld r18, X - 3072: 15 97 sbiw r26, 0x05 ; 5 - 3074: 8c 81 ldd r24, Y+4 ; 0x04 - 3076: 28 13 cpse r18, r24 - 3078: 84 cd rjmp .-1272 ; 0x2b82 - (DataPtr[5] == UidCL[3]) ) { - - DataPtr[0] = SAKValue; - 307a: 9c 93 st X, r25 - ISO14443AAppendCRCA(Buffer, 1); - 307c: 61 e0 ldi r22, 0x01 ; 1 - 307e: 70 e0 ldi r23, 0x00 ; 0 - 3080: c8 01 movw r24, r16 - 3082: 4a d1 rcall .+660 ; 0x3318 - State = STATE_ACTIVE; - 3084: 83 e0 ldi r24, 0x03 ; 3 - 3086: 80 93 b5 24 sts 0x24B5, r24 - - *BitCount = ISO14443A_SAK_FRAME_SIZE; - 308a: 28 e1 ldi r18, 0x18 ; 24 - 308c: 30 e0 ldi r19, 0x00 ; 0 - 308e: 5a cd rjmp .-1356 ; 0x2b44 - } 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)) { - 3090: 62 e0 ldi r22, 0x02 ; 2 - 3092: 70 e0 ldi r23, 0x00 ; 0 - 3094: c8 01 movw r24, r16 - 3096: 6f d1 rcall .+734 ; 0x3376 - 3098: 88 23 and r24, r24 - 309a: 81 f0 breq .+32 ; 0x30bc <__stack+0xbd> - /* Write command. Store the address and prepare for the upcoming data. - * Respond with ACK. */ - CurrentAddress = Buffer[1]; - 309c: d8 01 movw r26, r16 - 309e: 11 96 adiw r26, 0x01 ; 1 - 30a0: 8c 91 ld r24, X - 30a2: 80 93 c1 24 sts 0x24C1, r24 - State = STATE_WRITE; - 30a6: 86 e0 ldi r24, 0x06 ; 6 - 30a8: 80 93 b5 24 sts 0x24B5, r24 - MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); - } else { - /* In read only mode, silently ignore the write */ - } - - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 30ac: 27 d4 rcall .+2126 ; 0x38fc - 30ae: 9a e0 ldi r25, 0x0A ; 10 - 30b0: 98 27 eor r25, r24 - 30b2: f8 01 movw r30, r16 - 30b4: 90 83 st Z, r25 - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - - return ACK_NAK_FRAME_SIZE; - 30b6: 24 e0 ldi r18, 0x04 ; 4 - 30b8: 30 e0 ldi r19, 0x00 ; 0 - 30ba: 44 cd rjmp .-1400 ; 0x2b44 - /* In read only mode, silently ignore the write */ - } - - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 30bc: 1f d4 rcall .+2110 ; 0x38fc - 30be: 91 e0 ldi r25, 0x01 ; 1 - 30c0: 98 27 eor r25, r24 - 30c2: d8 01 movw r26, r16 - 30c4: 9c 93 st X, r25 - } - - return ACK_NAK_FRAME_SIZE; - 30c6: 24 e0 ldi r18, 0x04 ; 4 - 30c8: 30 e0 ldi r19, 0x00 ; 0 - 30ca: 3c cd rjmp .-1416 ; 0x2b44 - } 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)) { - 30cc: 62 e0 ldi r22, 0x02 ; 2 - 30ce: 70 e0 ldi r23, 0x00 ; 0 - 30d0: c8 01 movw r24, r16 - 30d2: 51 d1 rcall .+674 ; 0x3376 - 30d4: 88 23 and r24, r24 - 30d6: 09 f4 brne .+2 ; 0x30da <__stack+0xdb> - 30d8: 5d cf rjmp .-326 ; 0x2f94 - CurrentAddress = Buffer[1]; - 30da: f8 01 movw r30, r16 - 30dc: 81 81 ldd r24, Z+1 ; 0x01 - 30de: 80 93 c1 24 sts 0x24C1, r24 - State = STATE_DECREMENT; - 30e2: 88 e0 ldi r24, 0x08 ; 8 - } - return ACK_NAK_FRAME_SIZE; - } else if (Buffer[0] == CMD_RESTORE) { - if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { - CurrentAddress = Buffer[1]; - State = STATE_RESTORE; - 30e4: 80 93 b5 24 sts 0x24B5, r24 - Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 30e8: 09 d4 rcall .+2066 ; 0x38fc - 30ea: 9a e0 ldi r25, 0x0A ; 10 - 30ec: 98 27 eor r25, r24 - 30ee: d8 01 movw r26, r16 - 30f0: 9c 93 st X, r25 - } else { - Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - } - return ACK_NAK_FRAME_SIZE; - 30f2: 24 e0 ldi r18, 0x04 ; 4 - 30f4: 30 e0 ldi r19, 0x00 ; 0 - 30f6: 26 cd rjmp .-1460 ; 0x2b44 - -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]) - 30f8: 80 91 ca 24 lds r24, 0x24CA - 30fc: 28 13 cpse r18, r24 - 30fe: 38 cf rjmp .-400 ; 0x2f70 - && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) - 3100: e0 91 c3 24 lds r30, 0x24C3 - 3104: 80 91 c7 24 lds r24, 0x24C7 - 3108: 80 95 com r24 - 310a: e8 13 cpse r30, r24 - 310c: 31 cf rjmp .-414 ; 0x2f70 - 310e: 80 91 cb 24 lds r24, 0x24CB - 3112: e8 13 cpse r30, r24 - 3114: 2d cf rjmp .-422 ; 0x2f70 - && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) - 3116: 80 91 c4 24 lds r24, 0x24C4 - 311a: 90 91 c8 24 lds r25, 0x24C8 - 311e: 90 95 com r25 - 3120: 89 13 cpse r24, r25 - 3122: 26 cf rjmp .-436 ; 0x2f70 - 3124: 90 91 cc 24 lds r25, 0x24CC - 3128: 89 13 cpse r24, r25 - 312a: 22 cf rjmp .-444 ; 0x2f70 - && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) - 312c: 30 91 c5 24 lds r19, 0x24C5 - 3130: 90 91 c9 24 lds r25, 0x24C9 - 3134: 90 95 com r25 - 3136: 39 13 cpse r19, r25 - 3138: 1b cf rjmp .-458 ; 0x2f70 - 313a: 90 91 cd 24 lds r25, 0x24CD - 313e: 39 13 cpse r19, r25 - 3140: 17 cf rjmp .-466 ; 0x2f70 - && (Block[12] == (uint8_t) ~Block[13]) - 3142: 40 91 ce 24 lds r20, 0x24CE - 3146: 90 91 cf 24 lds r25, 0x24CF - 314a: 90 95 com r25 - 314c: 49 13 cpse r20, r25 - 314e: 10 cf rjmp .-480 ; 0x2f70 - && (Block[12] == Block[14]) - 3150: 90 91 d0 24 lds r25, 0x24D0 - 3154: 49 13 cpse r20, r25 - 3156: 0c cf rjmp .-488 ; 0x2f70 - && (Block[14] == (uint8_t) ~Block[15])) { - 3158: 90 91 d1 24 lds r25, 0x24D1 - 315c: 90 95 com r25 - 315e: 49 13 cpse r20, r25 - 3160: 07 cf rjmp .-498 ; 0x2f70 -} - -INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) -{ - *Value = 0; - *Value |= ((uint32_t) Block[0] << 0); - 3162: d8 01 movw r26, r16 - 3164: 9c 91 ld r25, X - *Value |= ((uint32_t) Block[1] << 8); - 3166: 11 96 adiw r26, 0x01 ; 1 - 3168: fc 91 ld r31, X - 316a: 11 97 sbiw r26, 0x01 ; 1 - *Value |= ((uint32_t) Block[2] << 16); - 316c: 12 96 adiw r26, 0x02 ; 2 - 316e: 4c 91 ld r20, X - 3170: 12 97 sbiw r26, 0x02 ; 2 - 3172: 50 e0 ldi r21, 0x00 ; 0 - 3174: 60 e0 ldi r22, 0x00 ; 0 - 3176: 70 e0 ldi r23, 0x00 ; 0 - 3178: ba 01 movw r22, r20 - 317a: 55 27 eor r21, r21 - 317c: 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); - 317e: 5f 2b or r21, r31 - *Value |= ((uint32_t) Block[2] << 16); - 3180: 49 2b or r20, r25 - *Value |= ((uint32_t) Block[3] << 24); - 3182: 13 96 adiw r26, 0x03 ; 3 - 3184: 9c 91 ld r25, X - 3186: 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); - 3188: 90 e0 ldi r25, 0x00 ; 0 - 318a: a0 e0 ldi r26, 0x00 ; 0 - 318c: b0 e0 ldi r27, 0x00 ; 0 - 318e: dc 01 movw r26, r24 - 3190: 99 27 eor r25, r25 - 3192: 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); - 3194: 9e 2b or r25, r30 - *Value |= ((uint32_t) Block[2] << 16); - 3196: 82 2b or r24, r18 - *Value |= ((uint32_t) Block[3] << 24); - 3198: b3 2b or r27, r19 - uint32_t BlockValue; - - ValueFromBlock(&ParamValue, Buffer); - ValueFromBlock(&BlockValue, BlockBuffer); - - if (State == STATE_DECREMENT) { - 319a: 20 91 b5 24 lds r18, 0x24B5 - 319e: 28 30 cpi r18, 0x08 ; 8 - 31a0: 09 f4 brne .+2 ; 0x31a4 <__stack+0x1a5> - 31a2: 6d c0 rjmp .+218 ; 0x327e <__stack+0x27f> - BlockValue -= ParamValue; - } else if (State == STATE_INCREMENT) { - 31a4: 27 30 cpi r18, 0x07 ; 7 - 31a6: 21 f4 brne .+8 ; 0x31b0 <__stack+0x1b1> - BlockValue += ParamValue; - 31a8: 84 0f add r24, r20 - 31aa: 95 1f adc r25, r21 - 31ac: a6 1f adc r26, r22 - 31ae: 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); - 31b0: 80 93 c2 24 sts 0x24C2, r24 - Block[1] = (uint8_t) (Value >> 8); - 31b4: c9 2e mov r12, r25 - 31b6: da 2e mov r13, r26 - 31b8: eb 2e mov r14, r27 - 31ba: ff 24 eor r15, r15 - 31bc: c0 92 c3 24 sts 0x24C3, r12 - Block[2] = (uint8_t) (Value >> 16); - 31c0: 8d 01 movw r16, r26 - 31c2: 22 27 eor r18, r18 - 31c4: 33 27 eor r19, r19 - 31c6: 00 93 c4 24 sts 0x24C4, r16 - Block[3] = (uint8_t) (Value >> 24); - 31ca: 4b 2f mov r20, r27 - 31cc: 55 27 eor r21, r21 - 31ce: 66 27 eor r22, r22 - 31d0: 77 27 eor r23, r23 - 31d2: 40 93 c5 24 sts 0x24C5, r20 - Block[4] = ~Block[0]; - 31d6: e8 2f mov r30, r24 - 31d8: e0 95 com r30 - 31da: e0 93 c6 24 sts 0x24C6, r30 - Block[5] = ~Block[1]; - 31de: ec 2d mov r30, r12 - 31e0: e0 95 com r30 - 31e2: e0 93 c7 24 sts 0x24C7, r30 - Block[6] = ~Block[2]; - 31e6: e0 2f mov r30, r16 - 31e8: e0 95 com r30 - 31ea: e0 93 c8 24 sts 0x24C8, r30 - Block[7] = ~Block[3]; - 31ee: e4 2f mov r30, r20 - 31f0: e0 95 com r30 - 31f2: e0 93 c9 24 sts 0x24C9, r30 - Block[8] = Block[0]; - 31f6: 80 93 ca 24 sts 0x24CA, r24 - Block[9] = Block[1]; - 31fa: c0 92 cb 24 sts 0x24CB, r12 - Block[10] = Block[2]; - 31fe: 00 93 cc 24 sts 0x24CC, r16 - Block[11] = Block[3]; - 3202: 40 93 cd 24 sts 0x24CD, r20 - /* Do nothing */ - } - - ValueToBlock(BlockBuffer, BlockValue); - - State = STATE_AUTHED_IDLE; - 3206: 85 e0 ldi r24, 0x05 ; 5 - 3208: 80 93 b5 24 sts 0x24B5, r24 - /* No ACK response on value commands part 2 */ - return ISO14443A_APP_NO_RESPONSE; - 320c: 20 e0 ldi r18, 0x00 ; 0 - 320e: 30 e0 ldi r19, 0x00 ; 0 - 3210: 99 cc rjmp .-1742 ; 0x2b44 - } 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)) { - 3212: 62 e0 ldi r22, 0x02 ; 2 - 3214: 70 e0 ldi r23, 0x00 ; 0 - 3216: c8 01 movw r24, r16 - 3218: ae d0 rcall .+348 ; 0x3376 - 321a: 88 23 and r24, r24 - 321c: 09 f4 brne .+2 ; 0x3220 <__stack+0x221> - 321e: 4e cf rjmp .-356 ; 0x30bc <__stack+0xbd> - CurrentAddress = Buffer[1]; - 3220: d8 01 movw r26, r16 - 3222: 11 96 adiw r26, 0x01 ; 1 - 3224: 8c 91 ld r24, X - 3226: 80 93 c1 24 sts 0x24C1, r24 - State = STATE_INCREMENT; - 322a: 87 e0 ldi r24, 0x07 ; 7 - 322c: 80 93 b5 24 sts 0x24B5, r24 - 3230: 3d cf rjmp .-390 ; 0x30ac <__stack+0xad> - } 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)) { - 3232: 62 e0 ldi r22, 0x02 ; 2 - 3234: 70 e0 ldi r23, 0x00 ; 0 - 3236: c8 01 movw r24, r16 - 3238: 9e d0 rcall .+316 ; 0x3376 - 323a: 88 23 and r24, r24 - 323c: 09 f4 brne .+2 ; 0x3240 <__stack+0x241> - 323e: aa ce rjmp .-684 ; 0x2f94 - CurrentAddress = Buffer[1]; - 3240: f8 01 movw r30, r16 - 3242: 81 81 ldd r24, Z+1 ; 0x01 - 3244: 80 93 c1 24 sts 0x24C1, r24 - State = STATE_RESTORE; - 3248: 89 e0 ldi r24, 0x09 ; 9 - 324a: 4c cf rjmp .-360 ; 0x30e4 <__stack+0xe5> - 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)) { - 324c: 62 e0 ldi r22, 0x02 ; 2 - 324e: 70 e0 ldi r23, 0x00 ; 0 - 3250: c8 01 movw r24, r16 - 3252: 91 d0 rcall .+290 ; 0x3376 - 3254: 88 23 and r24, r24 - 3256: 09 f4 brne .+2 ; 0x325a <__stack+0x25b> - 3258: 31 cf rjmp .-414 ; 0x30bc <__stack+0xbd> - if (!ActiveConfiguration.ReadOnly) { - 325a: 80 91 fc 24 lds r24, 0x24FC - 325e: 81 11 cpse r24, r1 - 3260: 25 cf rjmp .-438 ; 0x30ac <__stack+0xad> - MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); - 3262: d8 01 movw r26, r16 - 3264: 11 96 adiw r26, 0x01 ; 1 - 3266: 6c 91 ld r22, X - 3268: b0 e1 ldi r27, 0x10 ; 16 - 326a: 6b 9f mul r22, r27 - 326c: b0 01 movw r22, r0 - 326e: 11 24 eor r1, r1 - 3270: 40 e1 ldi r20, 0x10 ; 16 - 3272: 50 e0 ldi r21, 0x00 ; 0 - 3274: 82 ec ldi r24, 0xC2 ; 194 - 3276: 94 e2 ldi r25, 0x24 ; 36 - 3278: 0e 94 ba 05 call 0xb74 ; 0xb74 - 327c: 17 cf rjmp .-466 ; 0x30ac <__stack+0xad> - - ValueFromBlock(&ParamValue, Buffer); - ValueFromBlock(&BlockValue, BlockBuffer); - - if (State == STATE_DECREMENT) { - BlockValue -= ParamValue; - 327e: 84 1b sub r24, r20 - 3280: 95 0b sbc r25, r21 - 3282: a6 0b sbc r26, r22 - 3284: b7 0b sbc r27, r23 - 3286: 94 cf rjmp .-216 ; 0x31b0 <__stack+0x1b1> - 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)) { - 3288: 62 e0 ldi r22, 0x02 ; 2 - 328a: 70 e0 ldi r23, 0x00 ; 0 - 328c: c8 01 movw r24, r16 - 328e: 73 d0 rcall .+230 ; 0x3376 - 3290: 81 11 cpse r24, r1 - 3292: a7 cc rjmp .-1714 ; 0x2be2 - /* Setup crypto1 cipher. Discard in-place encrypted CardNonce. */ - Crypto1Setup(Key, Uid, CardNonce); - - return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - } else { - Buffer[0] = NAK_CRC_ERROR; - 3294: 81 e0 ldi r24, 0x01 ; 1 - 3296: d8 01 movw r26, r16 - 3298: 8c 93 st X, r24 - return ACK_NAK_FRAME_SIZE; - 329a: 24 e0 ldi r18, 0x04 ; 4 - 329c: 30 e0 ldi r19, 0x00 ; 0 - 329e: 52 cc rjmp .-1884 ; 0x2b44 - - switch (NVB) { - case ISO14443A_NVB_AC_START: - /* Start of anticollision procedure. - * Send whole UID CLn + BCC */ - DataPtr[0] = UidCL[0]; - 32a0: 89 81 ldd r24, Y+1 ; 0x01 - 32a2: f8 01 movw r30, r16 - 32a4: 80 83 st Z, r24 - DataPtr[1] = UidCL[1]; - 32a6: 3a 81 ldd r19, Y+2 ; 0x02 - 32a8: 31 83 std Z+1, r19 ; 0x01 - DataPtr[2] = UidCL[2]; - 32aa: 2b 81 ldd r18, Y+3 ; 0x03 - 32ac: 22 83 std Z+2, r18 ; 0x02 - DataPtr[3] = UidCL[3]; - 32ae: 9c 81 ldd r25, Y+4 ; 0x04 - 32b0: 93 83 std Z+3, r25 ; 0x03 - DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 32b2: 83 27 eor r24, r19 - 32b4: 82 27 eor r24, r18 - 32b6: 89 27 eor r24, r25 - 32b8: 84 83 std Z+4, r24 ; 0x04 - - *BitCount = ISO14443A_CL_FRAME_SIZE; - 32ba: 28 e2 ldi r18, 0x28 ; 40 - 32bc: 30 e0 ldi r19, 0x00 ; 0 - 32be: 42 cc rjmp .-1916 ; 0x2b44 - 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); - 32c0: 60 e3 ldi r22, 0x30 ; 48 - 32c2: 70 e0 ldi r23, 0x00 ; 0 - 32c4: 7a cd rjmp .-1292 ; 0x2dba - 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); - 32c6: 80 e3 ldi r24, 0x30 ; 48 - 32c8: 90 e0 ldi r25, 0x00 ; 0 - 32ca: e6 cd rjmp .-1076 ; 0x2e98 - -000032cc : - return ISO14443A_APP_NO_RESPONSE; -} - -void MifareClassicGetUid(ConfigurationUidType Uid) -{ - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 32cc: 44 e0 ldi r20, 0x04 ; 4 - 32ce: 50 e0 ldi r21, 0x00 ; 0 - 32d0: 60 e0 ldi r22, 0x00 ; 0 - 32d2: 70 e0 ldi r23, 0x00 ; 0 - 32d4: 0c 94 a2 05 jmp 0xb44 ; 0xb44 - -000032d8 : -} - -void MifareClassicSetUid(ConfigurationUidType Uid) -{ - 32d8: cf 93 push r28 - 32da: df 93 push r29 - 32dc: 1f 92 push r1 - 32de: cd b7 in r28, 0x3d ; 61 - 32e0: de b7 in r29, 0x3e ; 62 - uint8_t BCC = Uid[0] ^ Uid[1] ^ Uid[2] ^ Uid[3]; - 32e2: fc 01 movw r30, r24 - 32e4: 21 81 ldd r18, Z+1 ; 0x01 - 32e6: 30 81 ld r19, Z - 32e8: 23 27 eor r18, r19 - 32ea: 32 81 ldd r19, Z+2 ; 0x02 - 32ec: 23 27 eor r18, r19 - 32ee: 33 81 ldd r19, Z+3 ; 0x03 - 32f0: 23 27 eor r18, r19 - 32f2: 29 83 std Y+1, r18 ; 0x01 - - MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 32f4: 44 e0 ldi r20, 0x04 ; 4 - 32f6: 50 e0 ldi r21, 0x00 ; 0 - 32f8: 60 e0 ldi r22, 0x00 ; 0 - 32fa: 70 e0 ldi r23, 0x00 ; 0 - 32fc: 0e 94 ba 05 call 0xb74 ; 0xb74 - MemoryWriteBlock(&BCC, MEM_UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); - 3300: 41 e0 ldi r20, 0x01 ; 1 - 3302: 50 e0 ldi r21, 0x00 ; 0 - 3304: 64 e0 ldi r22, 0x04 ; 4 - 3306: 70 e0 ldi r23, 0x00 ; 0 - 3308: ce 01 movw r24, r28 - 330a: 01 96 adiw r24, 0x01 ; 1 - 330c: 0e 94 ba 05 call 0xb74 ; 0xb74 -} - 3310: 0f 90 pop r0 - 3312: df 91 pop r29 - 3314: cf 91 pop r28 - 3316: 08 95 ret - -00003318 : - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 3318: 61 15 cp r22, r1 - 331a: 71 05 cpc r23, r1 - 331c: 41 f1 breq .+80 ; 0x336e - * policies, either expressed or implied, of the ORIGINAL AUTHORS. - */ - -#include "ISO14443-3A.h" - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - 331e: 68 0f add r22, r24 - 3320: 79 1f adc r23, r25 - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - 3322: fc 01 movw r30, r24 - */ - -#include "ISO14443-3A.h" - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - uint16_t Checksum = 0x6363; - 3324: 23 e6 ldi r18, 0x63 ; 99 - 3326: 33 e6 ldi r19, 0x63 ; 99 - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - uint8_t Byte = *DataPtr++; - 3328: 41 91 ld r20, Z+ - - Byte ^= (uint8_t) (Checksum & 0x00FF); - 332a: 42 27 eor r20, r18 - Byte ^= Byte << 4; - 332c: 50 e1 ldi r21, 0x10 ; 16 - 332e: 45 9f mul r20, r21 - 3330: c0 01 movw r24, r0 - 3332: 11 24 eor r1, r1 - 3334: a4 2f mov r26, r20 - 3336: a8 27 eor r26, r24 - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3338: 8a 2f mov r24, r26 - 333a: 90 e0 ldi r25, 0x00 ; 0 - 333c: 58 2f mov r21, r24 - 333e: 44 27 eor r20, r20 - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3340: 88 0f add r24, r24 - 3342: 99 1f adc r25, r25 - 3344: 88 0f add r24, r24 - 3346: 99 1f adc r25, r25 - 3348: 88 0f add r24, r24 - 334a: 99 1f adc r25, r25 - uint8_t Byte = *DataPtr++; - - Byte ^= (uint8_t) (Checksum & 0x00FF); - Byte ^= Byte << 4; - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 334c: 48 27 eor r20, r24 - 334e: 59 27 eor r21, r25 - 3350: 23 2f mov r18, r19 - 3352: 33 27 eor r19, r19 - 3354: 24 27 eor r18, r20 - 3356: 35 27 eor r19, r21 - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3358: a2 95 swap r26 - 335a: 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 ) ^ - 335c: 2a 27 eor r18, r26 - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 335e: e6 17 cp r30, r22 - 3360: f7 07 cpc r31, r23 - 3362: 11 f7 brne .-60 ; 0x3328 - 3364: 92 2f mov r25, r18 - 3366: 83 2f mov r24, r19 - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - } - - *DataPtr++ = (Checksum >> 0) & 0x00FF; - 3368: 90 83 st Z, r25 - *DataPtr = (Checksum >> 8) & 0x00FF; - 336a: 81 83 std Z+1, r24 ; 0x01 - 336c: 08 95 ret - -#include "ISO14443-3A.h" - -void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - 336e: fc 01 movw r30, r24 - - while(ByteCount--) { - 3370: 83 e6 ldi r24, 0x63 ; 99 - 3372: 93 e6 ldi r25, 0x63 ; 99 - 3374: f9 cf rjmp .-14 ; 0x3368 - -00003376 : -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 3376: 61 15 cp r22, r1 - 3378: 71 05 cpc r23, r1 - 337a: b1 f1 breq .+108 ; 0x33e8 - - *DataPtr++ = (Checksum >> 0) & 0x00FF; - *DataPtr = (Checksum >> 8) & 0x00FF; -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) - 337c: 68 0f add r22, r24 - 337e: 79 1f adc r23, r25 -{ - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - 3380: fc 01 movw r30, r24 - *DataPtr = (Checksum >> 8) & 0x00FF; -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - 3382: 23 e6 ldi r18, 0x63 ; 99 - 3384: 33 e6 ldi r19, 0x63 ; 99 - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - uint8_t Byte = *DataPtr++; - 3386: 41 91 ld r20, Z+ - - Byte ^= (uint8_t) (Checksum & 0x00FF); - 3388: 42 27 eor r20, r18 - Byte ^= Byte << 4; - 338a: 50 e1 ldi r21, 0x10 ; 16 - 338c: 45 9f mul r20, r21 - 338e: c0 01 movw r24, r0 - 3390: 11 24 eor r1, r1 - 3392: a4 2f mov r26, r20 - 3394: a8 27 eor r26, r24 - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3396: 8a 2f mov r24, r26 - 3398: 90 e0 ldi r25, 0x00 ; 0 - 339a: 58 2f mov r21, r24 - 339c: 44 27 eor r20, r20 - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 339e: 88 0f add r24, r24 - 33a0: 99 1f adc r25, r25 - 33a2: 88 0f add r24, r24 - 33a4: 99 1f adc r25, r25 - 33a6: 88 0f add r24, r24 - 33a8: 99 1f adc r25, r25 - uint8_t Byte = *DataPtr++; - - Byte ^= (uint8_t) (Checksum & 0x00FF); - Byte ^= Byte << 4; - - Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 33aa: 48 27 eor r20, r24 - 33ac: 59 27 eor r21, r25 - 33ae: 23 2f mov r18, r19 - 33b0: 33 27 eor r19, r19 - 33b2: 24 27 eor r18, r20 - 33b4: 35 27 eor r19, r21 - ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 33b6: a2 95 swap r26 - 33b8: 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 ) ^ - 33ba: 2a 27 eor r18, r26 -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - - while(ByteCount--) { - 33bc: e6 17 cp r30, r22 - 33be: f7 07 cpc r31, r23 - 33c0: 11 f7 brne .-60 ; 0x3386 - 33c2: a9 01 movw r20, r18 - 33c4: 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)); - 33c6: 80 81 ld r24, Z - 33c8: 90 e0 ldi r25, 0x00 ; 0 - 33ca: 84 17 cp r24, r20 - 33cc: 95 07 cpc r25, r21 - 33ce: 11 f0 breq .+4 ; 0x33d4 - 33d0: 80 e0 ldi r24, 0x00 ; 0 -} - 33d2: 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)); - 33d4: 41 81 ldd r20, Z+1 ; 0x01 - 33d6: 50 e0 ldi r21, 0x00 ; 0 - 33d8: 23 2f mov r18, r19 - 33da: 33 27 eor r19, r19 - 33dc: 81 e0 ldi r24, 0x01 ; 1 - 33de: 42 17 cp r20, r18 - 33e0: 53 07 cpc r21, r19 - 33e2: b9 f3 breq .-18 ; 0x33d2 - 33e4: 80 e0 ldi r24, 0x00 ; 0 - 33e6: f5 cf rjmp .-22 ; 0x33d2 -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - uint8_t* DataPtr = (uint8_t*) Buffer; - 33e8: fc 01 movw r30, r24 - - while(ByteCount--) { - 33ea: 43 e6 ldi r20, 0x63 ; 99 - 33ec: 50 e0 ldi r21, 0x00 ; 0 - *DataPtr = (Checksum >> 8) & 0x00FF; -} - -bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) -{ - uint16_t Checksum = 0x6363; - 33ee: 23 e6 ldi r18, 0x63 ; 99 - 33f0: 33 e6 ldi r19, 0x63 ; 99 - 33f2: e9 cf rjmp .-46 ; 0x33c6 - -000033f4 : -/* 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) { - 33f4: 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); - 33f6: b0 91 d5 24 lds r27, 0x24D5 - Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 33fa: c0 91 d6 24 lds r28, 0x24D6 - Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 33fe: 40 91 d7 24 lds r20, 0x24D7 - - Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 3402: a0 91 d2 24 lds r26, 0x24D2 - Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 3406: f0 91 d3 24 lds r31, 0x24D3 - Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 340a: e0 91 d4 24 lds r30, 0x24D4 - 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); - 340e: 9c 2f mov r25, r28 - 3410: 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); - 3412: 2b 2f mov r18, r27 - 3414: 21 7e andi r18, 0xE1 ; 225 - Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 3416: 92 27 eor r25, r18 - Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 3418: 24 2f mov r18, r20 - 341a: 20 72 andi r18, 0x20 ; 32 - 341c: 92 27 eor r25, r18 - - Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 341e: 2a 2f mov r18, r26 - 3420: 24 79 andi r18, 0x94 ; 148 - 3422: 92 27 eor r25, r18 - Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 3424: 2f 2f mov r18, r31 - 3426: 23 77 andi r18, 0x73 ; 115 - 3428: 92 27 eor r25, r18 - Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 342a: 2e 2f mov r18, r30 - 342c: 2a 73 andi r18, 0x3A ; 58 - 342e: 92 27 eor r25, r18 - - Feedback ^= Feedback >> 4; - 3430: 39 2f mov r19, r25 - 3432: 32 95 swap r19 - 3434: 3f 70 andi r19, 0x0F ; 15 - 3436: 39 27 eor r19, r25 - Feedback ^= Feedback >> 2; - 3438: 23 2f mov r18, r19 - 343a: 26 95 lsr r18 - 343c: 26 95 lsr r18 - 343e: 23 27 eor r18, r19 - Feedback ^= Feedback >> 1; - 3440: 92 2f mov r25, r18 - 3442: 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); - 3444: 50 e0 ldi r21, 0x00 ; 0 - 3446: 60 e0 ldi r22, 0x00 ; 0 - 3448: 70 e0 ldi r23, 0x00 ; 0 - 344a: ba 01 movw r22, r20 - 344c: 55 27 eor r21, r21 - 344e: 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); - 3450: 5c 2b or r21, r28 - Temp |= ((uint32_t) StateEven[2] << 16); - 3452: 4b 2b or r20, r27 - - /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ - Temp = (Temp >> 1) & 0x00FFFFFF; - 3454: 76 95 lsr r23 - 3456: 67 95 ror r22 - 3458: 57 95 ror r21 - 345a: 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; - 345c: 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 ) { - 345e: 91 70 andi r25, 0x01 ; 1 - 3460: 98 13 cpse r25, r24 - Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); - 3462: 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]; - 3464: a0 93 d5 24 sts 0x24D5, r26 - StateEven[1] = StateOdd[1]; - 3468: f0 93 d6 24 sts 0x24D6, r31 - StateEven[2] = StateOdd[2]; - 346c: e0 93 d7 24 sts 0x24D7, r30 - - StateOdd[0] = (uint8_t) (Temp >> 0); - 3470: 40 93 d2 24 sts 0x24D2, r20 - StateOdd[1] = (uint8_t) (Temp >> 8); - 3474: 50 93 d3 24 sts 0x24D3, r21 - StateOdd[2] = (uint8_t) (Temp >> 16); - 3478: 60 93 d4 24 sts 0x24D4, r22 -} - 347c: cf 91 pop r28 - 347e: 08 95 ret - -00003480 : - -uint8_t Crypto1FilterOutput(void) { - 3480: cf 93 push r28 - 3482: 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]; - 3484: c0 91 d3 24 lds r28, 0x24D3 - Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 3488: 90 91 d4 24 lds r25, 0x24D4 - 348c: a9 2f mov r26, r25 - 348e: af 70 andi r26, 0x0F ; 15 - 3490: b0 e0 ldi r27, 0x00 ; 0 - 3492: a0 5e subi r26, 0xE0 ; 224 - 3494: 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]; - 3496: ec 2f mov r30, r28 - 3498: ef 70 andi r30, 0x0F ; 15 - 349a: f0 e0 ldi r31, 0x00 ; 0 - 349c: e0 5e subi r30, 0xE0 ; 224 - 349e: ff 4d sbci r31, 0xDF ; 223 - 34a0: d0 96 adiw r26, 0x30 ; 48 - 34a2: 8c 91 ld r24, X - 34a4: 20 89 ldd r18, Z+16 ; 0x10 - 34a6: 82 2b or r24, r18 - * can simply be ORed together to produce the resulting - * 5 bits that are used to lookup the output bit. - */ - uint8_t Sum = 0; - - Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; - 34a8: e0 91 d2 24 lds r30, 0x24D2 - 34ac: e2 95 swap r30 - 34ae: ef 70 andi r30, 0x0F ; 15 - 34b0: f0 e0 ldi r31, 0x00 ; 0 - 34b2: e0 5e subi r30, 0xE0 ; 224 - 34b4: ff 4d sbci r31, 0xDF ; 223 - Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; - Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - 34b6: 20 81 ld r18, Z - 34b8: 82 2b or r24, r18 - 34ba: c2 95 swap r28 - 34bc: cf 70 andi r28, 0x0F ; 15 - 34be: d0 e0 ldi r29, 0x00 ; 0 - 34c0: c0 5e subi r28, 0xE0 ; 224 - 34c2: df 4d sbci r29, 0xDF ; 223 - Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 34c4: 28 a1 ldd r18, Y+32 ; 0x20 - 34c6: 82 2b or r24, r18 - Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; - 34c8: 92 95 swap r25 - 34ca: 9f 70 andi r25, 0x0F ; 15 - 34cc: a9 2f mov r26, r25 - 34ce: b0 e0 ldi r27, 0x00 ; 0 - 34d0: a0 5a subi r26, 0xA0 ; 160 - 34d2: bf 4d sbci r27, 0xDF ; 223 - 34d4: 9c 91 ld r25, X - 34d6: 89 2b or r24, r25 - - return TableC[Sum]; - 34d8: e8 2f mov r30, r24 - 34da: f0 e0 ldi r31, 0x00 ; 0 - 34dc: e0 59 subi r30, 0x90 ; 144 - 34de: ff 4d sbci r31, 0xDF ; 223 -} - 34e0: 80 81 ld r24, Z - 34e2: df 91 pop r29 - 34e4: cf 91 pop r28 - 34e6: 08 95 ret - -000034e8 : - -void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) -{ - 34e8: cf 92 push r12 - 34ea: df 92 push r13 - 34ec: ef 92 push r14 - 34ee: ff 92 push r15 - 34f0: 0f 93 push r16 - 34f2: 1f 93 push r17 - 34f4: cf 93 push r28 - 34f6: df 93 push r29 - 34f8: fc 01 movw r30, r24 - 34fa: db 01 movw r26, r22 - 34fc: ea 01 movw r28, r20 - * The inner loop generates 8 even and 8 odd bits from 16 key bits and - * the outer loop stores them. */ - for (i=0; i<(LFSR_SIZE/2); i++) { - uint8_t EvenByte = 0; - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 34fe: 91 81 ldd r25, Z+1 ; 0x01 - 3500: 80 e0 ldi r24, 0x00 ; 0 - 3502: 20 81 ld r18, Z - 3504: 82 2b or r24, r18 - 3506: 80 fd sbrc r24, 0 - 3508: 8d c1 rjmp .+794 ; 0x3824 - 350a: 30 e0 ldi r19, 0x00 ; 0 - 350c: 81 fd sbrc r24, 1 - 350e: 88 c1 rjmp .+784 ; 0x3820 - 3510: 20 e0 ldi r18, 0x00 ; 0 - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - 3512: 96 95 lsr r25 - 3514: 87 95 ror r24 - 3516: 96 95 lsr r25 - 3518: 87 95 ror r24 - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 351a: 43 2f mov r20, r19 - 351c: 40 68 ori r20, 0x80 ; 128 - 351e: 80 fd sbrc r24, 0 - 3520: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3522: 42 2f mov r20, r18 - 3524: 40 68 ori r20, 0x80 ; 128 - 3526: 81 fd sbrc r24, 1 - 3528: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 352a: 96 95 lsr r25 - 352c: 87 95 ror r24 - 352e: 96 95 lsr r25 - 3530: 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; - 3532: 36 95 lsr r19 - OddByte >>= 1; - 3534: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3536: 43 2f mov r20, r19 - 3538: 40 68 ori r20, 0x80 ; 128 - 353a: 80 fd sbrc r24, 0 - 353c: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 353e: 42 2f mov r20, r18 - 3540: 40 68 ori r20, 0x80 ; 128 - 3542: 81 fd sbrc r24, 1 - 3544: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3546: 96 95 lsr r25 - 3548: 87 95 ror r24 - 354a: 96 95 lsr r25 - 354c: 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; - 354e: 36 95 lsr r19 - OddByte >>= 1; - 3550: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3552: 43 2f mov r20, r19 - 3554: 40 68 ori r20, 0x80 ; 128 - 3556: 80 fd sbrc r24, 0 - 3558: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 355a: 42 2f mov r20, r18 - 355c: 40 68 ori r20, 0x80 ; 128 - 355e: 81 fd sbrc r24, 1 - 3560: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3562: 96 95 lsr r25 - 3564: 87 95 ror r24 - 3566: 96 95 lsr r25 - 3568: 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; - 356a: 36 95 lsr r19 - OddByte >>= 1; - 356c: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 356e: 43 2f mov r20, r19 - 3570: 40 68 ori r20, 0x80 ; 128 - 3572: 80 fd sbrc r24, 0 - 3574: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3576: 42 2f mov r20, r18 - 3578: 40 68 ori r20, 0x80 ; 128 - 357a: 81 fd sbrc r24, 1 - 357c: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 357e: 96 95 lsr r25 - 3580: 87 95 ror r24 - 3582: 96 95 lsr r25 - 3584: 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; - 3586: 36 95 lsr r19 - OddByte >>= 1; - 3588: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 358a: 43 2f mov r20, r19 - 358c: 40 68 ori r20, 0x80 ; 128 - 358e: 80 fd sbrc r24, 0 - 3590: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3592: 42 2f mov r20, r18 - 3594: 40 68 ori r20, 0x80 ; 128 - 3596: 81 fd sbrc r24, 1 - 3598: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 359a: 96 95 lsr r25 - 359c: 87 95 ror r24 - 359e: 96 95 lsr r25 - 35a0: 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; - 35a2: 36 95 lsr r19 - OddByte >>= 1; - 35a4: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 35a6: 43 2f mov r20, r19 - 35a8: 40 68 ori r20, 0x80 ; 128 - 35aa: 80 fd sbrc r24, 0 - 35ac: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 35ae: 42 2f mov r20, r18 - 35b0: 40 68 ori r20, 0x80 ; 128 - 35b2: 81 fd sbrc r24, 1 - 35b4: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 35b6: 96 95 lsr r25 - 35b8: 87 95 ror r24 - 35ba: 96 95 lsr r25 - 35bc: 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; - 35be: 36 95 lsr r19 - OddByte >>= 1; - 35c0: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 35c2: 53 2f mov r21, r19 - 35c4: 50 68 ori r21, 0x80 ; 128 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 35c6: 42 2f mov r20, r18 - 35c8: 40 68 ori r20, 0x80 ; 128 - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - 35ca: 80 fd sbrc r24, 0 - 35cc: 35 2f mov r19, r21 - 35ce: 30 93 d5 24 sts 0x24D5, r19 - StateOdd[i] = OddByte; - 35d2: 81 fd sbrc r24, 1 - 35d4: 24 2f mov r18, r20 - 35d6: 20 93 d2 24 sts 0x24D2, 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]; - 35da: 93 81 ldd r25, Z+3 ; 0x03 - 35dc: 80 e0 ldi r24, 0x00 ; 0 - 35de: 22 81 ldd r18, Z+2 ; 0x02 - 35e0: 82 2b or r24, r18 - 35e2: 80 fd sbrc r24, 0 - 35e4: 1b c1 rjmp .+566 ; 0x381c - 35e6: 30 e0 ldi r19, 0x00 ; 0 - 35e8: 81 fd sbrc r24, 1 - 35ea: 16 c1 rjmp .+556 ; 0x3818 - 35ec: 20 e0 ldi r18, 0x00 ; 0 - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - 35ee: 96 95 lsr r25 - 35f0: 87 95 ror r24 - 35f2: 96 95 lsr r25 - 35f4: 87 95 ror r24 - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 35f6: 43 2f mov r20, r19 - 35f8: 40 68 ori r20, 0x80 ; 128 - 35fa: 80 fd sbrc r24, 0 - 35fc: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 35fe: 42 2f mov r20, r18 - 3600: 40 68 ori r20, 0x80 ; 128 - 3602: 81 fd sbrc r24, 1 - 3604: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3606: 96 95 lsr r25 - 3608: 87 95 ror r24 - 360a: 96 95 lsr r25 - 360c: 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; - 360e: 36 95 lsr r19 - OddByte >>= 1; - 3610: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3612: 43 2f mov r20, r19 - 3614: 40 68 ori r20, 0x80 ; 128 - 3616: 80 fd sbrc r24, 0 - 3618: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 361a: 42 2f mov r20, r18 - 361c: 40 68 ori r20, 0x80 ; 128 - 361e: 81 fd sbrc r24, 1 - 3620: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3622: 96 95 lsr r25 - 3624: 87 95 ror r24 - 3626: 96 95 lsr r25 - 3628: 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; - 362a: 36 95 lsr r19 - OddByte >>= 1; - 362c: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 362e: 43 2f mov r20, r19 - 3630: 40 68 ori r20, 0x80 ; 128 - 3632: 80 fd sbrc r24, 0 - 3634: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3636: 42 2f mov r20, r18 - 3638: 40 68 ori r20, 0x80 ; 128 - 363a: 81 fd sbrc r24, 1 - 363c: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 363e: 96 95 lsr r25 - 3640: 87 95 ror r24 - 3642: 96 95 lsr r25 - 3644: 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; - 3646: 36 95 lsr r19 - OddByte >>= 1; - 3648: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 364a: 43 2f mov r20, r19 - 364c: 40 68 ori r20, 0x80 ; 128 - 364e: 80 fd sbrc r24, 0 - 3650: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3652: 42 2f mov r20, r18 - 3654: 40 68 ori r20, 0x80 ; 128 - 3656: 81 fd sbrc r24, 1 - 3658: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 365a: 96 95 lsr r25 - 365c: 87 95 ror r24 - 365e: 96 95 lsr r25 - 3660: 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; - 3662: 36 95 lsr r19 - OddByte >>= 1; - 3664: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3666: 43 2f mov r20, r19 - 3668: 40 68 ori r20, 0x80 ; 128 - 366a: 80 fd sbrc r24, 0 - 366c: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 366e: 42 2f mov r20, r18 - 3670: 40 68 ori r20, 0x80 ; 128 - 3672: 81 fd sbrc r24, 1 - 3674: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3676: 96 95 lsr r25 - 3678: 87 95 ror r24 - 367a: 96 95 lsr r25 - 367c: 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; - 367e: 36 95 lsr r19 - OddByte >>= 1; - 3680: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3682: 43 2f mov r20, r19 - 3684: 40 68 ori r20, 0x80 ; 128 - 3686: 80 fd sbrc r24, 0 - 3688: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 368a: 42 2f mov r20, r18 - 368c: 40 68 ori r20, 0x80 ; 128 - 368e: 81 fd sbrc r24, 1 - 3690: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3692: 96 95 lsr r25 - 3694: 87 95 ror r24 - 3696: 96 95 lsr r25 - 3698: 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; - 369a: 36 95 lsr r19 - OddByte >>= 1; - 369c: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 369e: 53 2f mov r21, r19 - 36a0: 50 68 ori r21, 0x80 ; 128 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 36a2: 42 2f mov r20, r18 - 36a4: 40 68 ori r20, 0x80 ; 128 - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - 36a6: 80 fd sbrc r24, 0 - 36a8: 35 2f mov r19, r21 - 36aa: 30 93 d6 24 sts 0x24D6, r19 - StateOdd[i] = OddByte; - 36ae: 81 fd sbrc r24, 1 - 36b0: 24 2f mov r18, r20 - 36b2: 20 93 d3 24 sts 0x24D3, 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]; - 36b6: 95 81 ldd r25, Z+5 ; 0x05 - 36b8: 80 e0 ldi r24, 0x00 ; 0 - 36ba: 24 81 ldd r18, Z+4 ; 0x04 - 36bc: 82 2b or r24, r18 - 36be: 80 fd sbrc r24, 0 - 36c0: a9 c0 rjmp .+338 ; 0x3814 - 36c2: 30 e0 ldi r19, 0x00 ; 0 - 36c4: 81 fd sbrc r24, 1 - 36c6: a4 c0 rjmp .+328 ; 0x3810 - 36c8: 20 e0 ldi r18, 0x00 ; 0 - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - 36ca: 96 95 lsr r25 - 36cc: 87 95 ror r24 - 36ce: 96 95 lsr r25 - 36d0: 87 95 ror r24 - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 36d2: 43 2f mov r20, r19 - 36d4: 40 68 ori r20, 0x80 ; 128 - 36d6: 80 fd sbrc r24, 0 - 36d8: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 36da: 42 2f mov r20, r18 - 36dc: 40 68 ori r20, 0x80 ; 128 - 36de: 81 fd sbrc r24, 1 - 36e0: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 36e2: 96 95 lsr r25 - 36e4: 87 95 ror r24 - 36e6: 96 95 lsr r25 - 36e8: 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; - 36ea: 36 95 lsr r19 - OddByte >>= 1; - 36ec: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 36ee: 43 2f mov r20, r19 - 36f0: 40 68 ori r20, 0x80 ; 128 - 36f2: 80 fd sbrc r24, 0 - 36f4: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 36f6: 42 2f mov r20, r18 - 36f8: 40 68 ori r20, 0x80 ; 128 - 36fa: 81 fd sbrc r24, 1 - 36fc: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 36fe: 96 95 lsr r25 - 3700: 87 95 ror r24 - 3702: 96 95 lsr r25 - 3704: 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; - 3706: 36 95 lsr r19 - OddByte >>= 1; - 3708: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 370a: 43 2f mov r20, r19 - 370c: 40 68 ori r20, 0x80 ; 128 - 370e: 80 fd sbrc r24, 0 - 3710: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3712: 42 2f mov r20, r18 - 3714: 40 68 ori r20, 0x80 ; 128 - 3716: 81 fd sbrc r24, 1 - 3718: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 371a: 96 95 lsr r25 - 371c: 87 95 ror r24 - 371e: 96 95 lsr r25 - 3720: 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; - 3722: 36 95 lsr r19 - OddByte >>= 1; - 3724: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3726: 43 2f mov r20, r19 - 3728: 40 68 ori r20, 0x80 ; 128 - 372a: 80 fd sbrc r24, 0 - 372c: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 372e: 42 2f mov r20, r18 - 3730: 40 68 ori r20, 0x80 ; 128 - 3732: 81 fd sbrc r24, 1 - 3734: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3736: 96 95 lsr r25 - 3738: 87 95 ror r24 - 373a: 96 95 lsr r25 - 373c: 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; - 373e: 36 95 lsr r19 - OddByte >>= 1; - 3740: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3742: 43 2f mov r20, r19 - 3744: 40 68 ori r20, 0x80 ; 128 - 3746: 80 fd sbrc r24, 0 - 3748: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 374a: 42 2f mov r20, r18 - 374c: 40 68 ori r20, 0x80 ; 128 - 374e: 81 fd sbrc r24, 1 - 3750: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3752: 96 95 lsr r25 - 3754: 87 95 ror r24 - 3756: 96 95 lsr r25 - 3758: 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; - 375a: 36 95 lsr r19 - OddByte >>= 1; - 375c: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 375e: 43 2f mov r20, r19 - 3760: 40 68 ori r20, 0x80 ; 128 - 3762: 80 fd sbrc r24, 0 - 3764: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3766: 42 2f mov r20, r18 - 3768: 40 68 ori r20, 0x80 ; 128 - 376a: 81 fd sbrc r24, 1 - 376c: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 376e: 96 95 lsr r25 - 3770: 87 95 ror r24 - 3772: 96 95 lsr r25 - 3774: 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; - 3776: 36 95 lsr r19 - OddByte >>= 1; - 3778: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 377a: 53 2f mov r21, r19 - 377c: 50 68 ori r21, 0x80 ; 128 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 377e: 42 2f mov r20, r18 - 3780: 40 68 ori r20, 0x80 ; 128 - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - 3782: 80 fd sbrc r24, 0 - 3784: 35 2f mov r19, r21 - 3786: 30 93 d7 24 sts 0x24D7, r19 - StateOdd[i] = OddByte; - 378a: 81 fd sbrc r24, 1 - 378c: 24 2f mov r18, r20 - 378e: 20 93 d4 24 sts 0x24D4, r18 - /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the - * Crypto1 LFSR.*/ - uint32_t Temp = 0; - - Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; - Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - 3792: 89 81 ldd r24, Y+1 ; 0x01 - 3794: 11 96 adiw r26, 0x01 ; 1 - 3796: 9c 91 ld r25, X - 3798: 11 97 sbiw r26, 0x01 ; 1 - 379a: 89 27 eor r24, r25 - Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 379c: ca 80 ldd r12, Y+2 ; 0x02 - 379e: 12 96 adiw r26, 0x02 ; 2 - 37a0: 9c 91 ld r25, X - 37a2: 12 97 sbiw r26, 0x02 ; 2 - 37a4: c9 26 eor r12, r25 - 37a6: d1 2c mov r13, r1 - 37a8: e1 2c mov r14, r1 - 37aa: f1 2c mov r15, r1 - 37ac: 76 01 movw r14, r12 - 37ae: dd 24 eor r13, r13 - 37b0: 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; - 37b2: 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; - 37b4: 88 81 ld r24, Y - 37b6: 9c 91 ld r25, X - 37b8: 89 27 eor r24, r25 - Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 37ba: c8 2a or r12, r24 - Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; - 37bc: 8b 81 ldd r24, Y+3 ; 0x03 - 37be: 13 96 adiw r26, 0x03 ; 3 - 37c0: 9c 91 ld r25, X - 37c2: 89 27 eor r24, r25 - 37c4: f8 2a or r15, r24 - 37c6: 10 e2 ldi r17, 0x20 ; 32 - - for (i=0; i<32; i++) { - uint8_t Out = Crypto1FilterOutput(); - 37c8: 5b de rcall .-842 ; 0x3480 - 37ca: 08 2f mov r16, r24 - - Crypto1LFSR(Temp & 0x01); - 37cc: 8c 2d mov r24, r12 - 37ce: 81 70 andi r24, 0x01 ; 1 - 37d0: 11 de rcall .-990 ; 0x33f4 - Temp >>= 1; - 37d2: f6 94 lsr r15 - 37d4: e7 94 ror r14 - 37d6: d7 94 ror r13 - 37d8: c7 94 ror r12 - - /* Store the keystream for later use */ - if (Out) { - 37da: 00 23 and r16, r16 - 37dc: 11 f0 breq .+4 ; 0x37e2 - Temp |= (uint32_t) 1 << 31; - 37de: 68 94 set - 37e0: f7 f8 bld r15, 7 - 37e2: 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++) { - 37e4: 89 f7 brne .-30 ; 0x37c8 - } - - /* 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); - 37e6: 88 81 ld r24, Y - 37e8: 8c 25 eor r24, r12 - 37ea: 88 83 st Y, r24 - CardNonce[1] ^= (uint8_t) (Temp >> 8); - 37ec: 89 81 ldd r24, Y+1 ; 0x01 - 37ee: 8d 25 eor r24, r13 - 37f0: 89 83 std Y+1, r24 ; 0x01 - CardNonce[2] ^= (uint8_t) (Temp >> 16); - 37f2: 8a 81 ldd r24, Y+2 ; 0x02 - 37f4: 8e 25 eor r24, r14 - 37f6: 8a 83 std Y+2, r24 ; 0x02 - CardNonce[3] ^= (uint8_t) (Temp >> 24); - 37f8: 8b 81 ldd r24, Y+3 ; 0x03 - 37fa: 8f 25 eor r24, r15 - 37fc: 8b 83 std Y+3, r24 ; 0x03 -} - 37fe: df 91 pop r29 - 3800: cf 91 pop r28 - 3802: 1f 91 pop r17 - 3804: 0f 91 pop r16 - 3806: ff 90 pop r15 - 3808: ef 90 pop r14 - 380a: df 90 pop r13 - 380c: cf 90 pop r12 - 380e: 08 95 ret - 3810: 20 e4 ldi r18, 0x40 ; 64 - 3812: 5b cf rjmp .-330 ; 0x36ca - 3814: 30 e4 ldi r19, 0x40 ; 64 - 3816: 56 cf rjmp .-340 ; 0x36c4 - 3818: 20 e4 ldi r18, 0x40 ; 64 - 381a: e9 ce rjmp .-558 ; 0x35ee - 381c: 30 e4 ldi r19, 0x40 ; 64 - 381e: e4 ce rjmp .-568 ; 0x35e8 - 3820: 20 e4 ldi r18, 0x40 ; 64 - 3822: 77 ce rjmp .-786 ; 0x3512 - 3824: 30 e4 ldi r19, 0x40 ; 64 - 3826: 72 ce rjmp .-796 ; 0x350c - -00003828 : - -void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) -{ - 3828: cf 92 push r12 - 382a: df 92 push r13 - 382c: ef 92 push r14 - 382e: ff 92 push r15 - 3830: cf 93 push r28 - 3832: 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; - 3834: 81 81 ldd r24, Z+1 ; 0x01 - Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 3836: c2 80 ldd r12, Z+2 ; 0x02 - 3838: d1 2c mov r13, r1 - 383a: e1 2c mov r14, r1 - 383c: f1 2c mov r15, r1 - 383e: 76 01 movw r14, r12 - 3840: dd 24 eor r13, r13 - 3842: 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; - 3844: 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; - 3846: 80 81 ld r24, Z - Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; - Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 3848: c8 2a or r12, r24 - Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; - 384a: 83 81 ldd r24, Z+3 ; 0x03 - 384c: f8 2a or r15, r24 - 384e: 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(); - 3850: 17 de rcall .-978 ; 0x3480 - uint8_t Bit = Out ^ (Temp & 0x01); - 3852: b7 01 movw r22, r14 - 3854: a6 01 movw r20, r12 - 3856: 41 70 andi r20, 0x01 ; 1 - 3858: 55 27 eor r21, r21 - 385a: 66 27 eor r22, r22 - 385c: 77 27 eor r23, r23 - - /* Feed back the bit to load the LFSR with the (decrypted) nonce */ - Crypto1LFSR(Bit); - 385e: 84 27 eor r24, r20 - 3860: c9 dd rcall .-1134 ; 0x33f4 - Temp >>= 1; - 3862: f6 94 lsr r15 - 3864: e7 94 ror r14 - 3866: d7 94 ror r13 - 3868: c7 94 ror r12 - 386a: 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++) { - 386c: 89 f7 brne .-30 ; 0x3850 - - /* Feed back the bit to load the LFSR with the (decrypted) nonce */ - Crypto1LFSR(Bit); - Temp >>= 1; - } -} - 386e: cf 91 pop r28 - 3870: ff 90 pop r15 - 3872: ef 90 pop r14 - 3874: df 90 pop r13 - 3876: cf 90 pop r12 - 3878: 08 95 ret - -0000387a : - -uint8_t Crypto1Byte(void) -{ - 387a: cf 93 push r28 - 387c: df 93 push r29 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 387e: 00 de rcall .-1024 ; 0x3480 - 3880: c8 2f mov r28, r24 - Crypto1LFSR(0); - 3882: 80 e0 ldi r24, 0x00 ; 0 - 3884: b7 dd rcall .-1170 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - - if (Out) { - 3886: cc 23 and r28, r28 - 3888: 09 f4 brne .+2 ; 0x388c - 388a: 36 c0 rjmp .+108 ; 0x38f8 - KeyStream |= (1<<7); - 388c: c0 e8 ldi r28, 0x80 ; 128 - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 388e: f8 dd rcall .-1040 ; 0x3480 - 3890: d8 2f mov r29, r24 - Crypto1LFSR(0); - 3892: 80 e0 ldi r24, 0x00 ; 0 - 3894: af dd rcall .-1186 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 3896: c6 95 lsr r28 - - if (Out) { - 3898: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 389a: 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(); - 389c: f1 dd rcall .-1054 ; 0x3480 - 389e: d8 2f mov r29, r24 - Crypto1LFSR(0); - 38a0: 80 e0 ldi r24, 0x00 ; 0 - 38a2: a8 dd rcall .-1200 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 38a4: c6 95 lsr r28 - - if (Out) { - 38a6: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 38a8: 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(); - 38aa: ea dd rcall .-1068 ; 0x3480 - 38ac: d8 2f mov r29, r24 - Crypto1LFSR(0); - 38ae: 80 e0 ldi r24, 0x00 ; 0 - 38b0: a1 dd rcall .-1214 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 38b2: c6 95 lsr r28 - - if (Out) { - 38b4: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 38b6: 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(); - 38b8: e3 dd rcall .-1082 ; 0x3480 - 38ba: d8 2f mov r29, r24 - Crypto1LFSR(0); - 38bc: 80 e0 ldi r24, 0x00 ; 0 - 38be: 9a dd rcall .-1228 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 38c0: c6 95 lsr r28 - - if (Out) { - 38c2: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 38c4: 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(); - 38c6: dc dd rcall .-1096 ; 0x3480 - 38c8: d8 2f mov r29, r24 - Crypto1LFSR(0); - 38ca: 80 e0 ldi r24, 0x00 ; 0 - 38cc: 93 dd rcall .-1242 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 38ce: c6 95 lsr r28 - - if (Out) { - 38d0: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 38d2: 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(); - 38d4: d5 dd rcall .-1110 ; 0x3480 - 38d6: d8 2f mov r29, r24 - Crypto1LFSR(0); - 38d8: 80 e0 ldi r24, 0x00 ; 0 - 38da: 8c dd rcall .-1256 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 38dc: c6 95 lsr r28 - - if (Out) { - 38de: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 38e0: 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(); - 38e2: ce dd rcall .-1124 ; 0x3480 - 38e4: d8 2f mov r29, r24 - Crypto1LFSR(0); - 38e6: 80 e0 ldi r24, 0x00 ; 0 - 38e8: 85 dd rcall .-1270 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 38ea: 8c 2f mov r24, r28 - 38ec: 86 95 lsr r24 - - if (Out) { - 38ee: d1 11 cpse r29, r1 - KeyStream |= (1<<7); - 38f0: 80 68 ori r24, 0x80 ; 128 - } - } - - return KeyStream; -} - 38f2: df 91 pop r29 - 38f4: cf 91 pop r28 - 38f6: 08 95 ret - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); - - /* Store keystream bit */ - KeyStream >>= 1; - 38f8: c0 e0 ldi r28, 0x00 ; 0 - 38fa: c9 cf rjmp .-110 ; 0x388e - -000038fc : - - return KeyStream; -} - -uint8_t Crypto1Nibble(void) -{ - 38fc: cf 93 push r28 - 38fe: df 93 push r29 - /* Generate 4 keystream-bits */ - for (i=0; i<4; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 3900: bf dd rcall .-1154 ; 0x3480 - 3902: c8 2f mov r28, r24 - Crypto1LFSR(0); - 3904: 80 e0 ldi r24, 0x00 ; 0 - 3906: 76 dd rcall .-1300 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - - if (Out) { - 3908: cc 23 and r28, r28 - 390a: d1 f0 breq .+52 ; 0x3940 - KeyStream |= (1<<3); - 390c: c8 e0 ldi r28, 0x08 ; 8 - /* Generate 4 keystream-bits */ - for (i=0; i<4; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - 390e: b8 dd rcall .-1168 ; 0x3480 - 3910: d8 2f mov r29, r24 - Crypto1LFSR(0); - 3912: 80 e0 ldi r24, 0x00 ; 0 - 3914: 6f dd rcall .-1314 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 3916: c6 95 lsr r28 - - if (Out) { - 3918: d1 11 cpse r29, r1 - KeyStream |= (1<<3); - 391a: 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(); - 391c: b1 dd rcall .-1182 ; 0x3480 - 391e: d8 2f mov r29, r24 - Crypto1LFSR(0); - 3920: 80 e0 ldi r24, 0x00 ; 0 - 3922: 68 dd rcall .-1328 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 3924: c6 95 lsr r28 - - if (Out) { - 3926: d1 11 cpse r29, r1 - KeyStream |= (1<<3); - 3928: 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(); - 392a: aa dd rcall .-1196 ; 0x3480 - 392c: d8 2f mov r29, r24 - Crypto1LFSR(0); - 392e: 80 e0 ldi r24, 0x00 ; 0 - 3930: 61 dd rcall .-1342 ; 0x33f4 - - /* Store keystream bit */ - KeyStream >>= 1; - 3932: 8c 2f mov r24, r28 - 3934: 86 95 lsr r24 - - if (Out) { - 3936: d1 11 cpse r29, r1 - KeyStream |= (1<<3); - 3938: 88 60 ori r24, 0x08 ; 8 - } - } - - return KeyStream; -} - 393a: df 91 pop r29 - 393c: cf 91 pop r28 - 393e: 08 95 ret - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); - - /* Store keystream bit */ - KeyStream >>= 1; - 3940: c0 e0 ldi r28, 0x00 ; 0 - 3942: e5 cf rjmp .-54 ; 0x390e - -00003944 : - - return KeyStream; -} - -void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) -{ - 3944: 6f 92 push r6 - 3946: 7f 92 push r7 - 3948: 8f 92 push r8 - 394a: 9f 92 push r9 - 394c: af 92 push r10 - 394e: bf 92 push r11 - 3950: cf 92 push r12 - 3952: df 92 push r13 - 3954: ef 92 push r14 - 3956: ff 92 push r15 - 3958: 0f 93 push r16 - 395a: 1f 93 push r17 - 395c: cf 93 push r28 - 395e: df 93 push r29 - 3960: 3c 01 movw r6, r24 - while(ClockCount--) { - 3962: cb 01 movw r24, r22 - 3964: 01 97 sbiw r24, 0x01 ; 1 - 3966: 67 2b or r22, r23 - 3968: c9 f1 breq .+114 ; 0x39dc - 396a: f3 01 movw r30, r6 - 396c: a2 81 ldd r26, Z+2 ; 0x02 - 396e: c0 81 ld r28, Z - 3970: b1 81 ldd r27, Z+1 ; 0x01 - 3972: d3 81 ldd r29, Z+3 ; 0x03 - * XOR all tapped bits to a single feedback bit. */ - uint8_t Feedback = 0; - - Feedback ^= State[0] & (uint8_t) (PRNG_MASK >> 0); - Feedback ^= State[1] & (uint8_t) (PRNG_MASK >> 8); - Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); - 3974: 2a 2f mov r18, r26 - 3976: 2d 72 andi r18, 0x2D ; 45 - Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); - - Feedback ^= Feedback >> 4; - 3978: 32 2f mov r19, r18 - 397a: 32 95 swap r19 - 397c: 3f 70 andi r19, 0x0F ; 15 - 397e: 32 27 eor r19, r18 - Feedback ^= Feedback >> 2; - 3980: 23 2f mov r18, r19 - 3982: 26 95 lsr r18 - 3984: 26 95 lsr r18 - 3986: 23 27 eor r18, r19 - Feedback ^= Feedback >> 1; - 3988: 32 2f mov r19, r18 - 398a: 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; - 398c: 4d 2f mov r20, r29 - 398e: 50 e0 ldi r21, 0x00 ; 0 - 3990: 60 e0 ldi r22, 0x00 ; 0 - 3992: 70 e0 ldi r23, 0x00 ; 0 - 3994: 74 2f mov r23, r20 - 3996: 66 27 eor r22, r22 - 3998: 55 27 eor r21, r21 - 399a: 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; - 399c: 5b 2b or r21, r27 - Temp |= (uint32_t) State[2] << 16; - 399e: 4c 2b or r20, r28 - Temp |= (uint32_t) State[3] << 24; - 39a0: 6a 2b or r22, r26 - - /* Cycle LFSR and feed back. */ - Temp >>= 1; - 39a2: 76 95 lsr r23 - 39a4: 67 95 ror r22 - 39a6: 57 95 ror r21 - 39a8: 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; - 39aa: 32 27 eor r19, r18 - Temp |= (uint32_t) State[3] << 24; - - /* Cycle LFSR and feed back. */ - Temp >>= 1; - - if (Feedback & 0x01) { - 39ac: 30 fd sbrc r19, 0 - Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); - 39ae: 70 68 ori r23, 0x80 ; 128 - } - - /* Store back state */ - State[0] = (uint8_t) (Temp >> 0); - 39b0: c4 2f mov r28, r20 - State[1] = (uint8_t) (Temp >> 8); - 39b2: 85 2e mov r8, r21 - 39b4: 96 2e mov r9, r22 - 39b6: a7 2e mov r10, r23 - 39b8: bb 24 eor r11, r11 - 39ba: b8 2d mov r27, r8 - State[2] = (uint8_t) (Temp >> 16); - 39bc: 6b 01 movw r12, r22 - 39be: ee 24 eor r14, r14 - 39c0: ff 24 eor r15, r15 - 39c2: ac 2d mov r26, r12 - State[3] = (uint8_t) (Temp >> 24); - 39c4: 07 2f mov r16, r23 - 39c6: 11 27 eor r17, r17 - 39c8: 22 27 eor r18, r18 - 39ca: 33 27 eor r19, r19 - 39cc: d0 2f mov r29, r16 - return KeyStream; -} - -void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) -{ - while(ClockCount--) { - 39ce: 01 97 sbiw r24, 0x01 ; 1 - 39d0: 88 f6 brcc .-94 ; 0x3974 - 39d2: f3 01 movw r30, r6 - 39d4: 40 83 st Z, r20 - 39d6: 81 82 std Z+1, r8 ; 0x01 - 39d8: c2 82 std Z+2, r12 ; 0x02 - 39da: 03 83 std Z+3, r16 ; 0x03 - State[2] = (uint8_t) (Temp >> 16); - State[3] = (uint8_t) (Temp >> 24); - } - - -} - 39dc: df 91 pop r29 - 39de: cf 91 pop r28 - 39e0: 1f 91 pop r17 - 39e2: 0f 91 pop r16 - 39e4: ff 90 pop r15 - 39e6: ef 90 pop r14 - 39e8: df 90 pop r13 - 39ea: cf 90 pop r12 - 39ec: bf 90 pop r11 - 39ee: af 90 pop r10 - 39f0: 9f 90 pop r9 - 39f2: 8f 90 pop r8 - 39f4: 7f 90 pop r7 - 39f6: 6f 90 pop r6 - 39f8: 08 95 ret - -000039fa : -#if !defined(NO_DEVICE_REMOTE_WAKEUP) -bool USB_Device_RemoteWakeupEnabled; -#endif - -void USB_Device_ProcessControlRequest(void) -{ - 39fa: 0f 93 push r16 - 39fc: 1f 93 push r17 - 39fe: cf 93 push r28 - 3a00: df 93 push r29 - 3a02: cd b7 in r28, 0x3d ; 61 - 3a04: de b7 in r29, 0x3e ; 62 - 3a06: ec 97 sbiw r28, 0x3c ; 60 - 3a08: cd bf out 0x3d, r28 ; 61 - 3a0a: de bf out 0x3e, r29 ; 62 - USB_ControlRequest.wLength = Endpoint_Read_16_LE(); - #else - uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; - - for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) - *(RequestHeader++) = Endpoint_Read_8(); - 3a0c: 2b d3 rcall .+1622 ; 0x4064 - 3a0e: 80 93 15 27 sts 0x2715, r24 - 3a12: 28 d3 rcall .+1616 ; 0x4064 - 3a14: 80 93 16 27 sts 0x2716, r24 - 3a18: 25 d3 rcall .+1610 ; 0x4064 - 3a1a: 80 93 17 27 sts 0x2717, r24 - 3a1e: 22 d3 rcall .+1604 ; 0x4064 - 3a20: 80 93 18 27 sts 0x2718, r24 - 3a24: 1f d3 rcall .+1598 ; 0x4064 - 3a26: 80 93 19 27 sts 0x2719, r24 - 3a2a: 1c d3 rcall .+1592 ; 0x4064 - 3a2c: 80 93 1a 27 sts 0x271A, r24 - 3a30: 19 d3 rcall .+1586 ; 0x4064 - 3a32: 80 93 1b 27 sts 0x271B, r24 - 3a36: 16 d3 rcall .+1580 ; 0x4064 - 3a38: 80 93 1c 27 sts 0x271C, r24 - #endif - - EVENT_USB_Device_ControlRequest(); - 3a3c: 0e 94 f9 0c call 0x19f2 ; 0x19f2 - - if (Endpoint_IsSETUPReceived()) - 3a40: b0 d3 rcall .+1888 ; 0x41a2 - 3a42: 88 23 and r24, r24 - 3a44: 89 f0 breq .+34 ; 0x3a68 - { - uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 3a46: 90 91 15 27 lds r25, 0x2715 - - switch (USB_ControlRequest.bRequest) - 3a4a: 80 91 16 27 lds r24, 0x2716 - 3a4e: 85 30 cpi r24, 0x05 ; 5 - 3a50: 09 f4 brne .+2 ; 0x3a54 - 3a52: 52 c0 rjmp .+164 ; 0x3af8 - 3a54: b0 f0 brcs .+44 ; 0x3a82 - 3a56: 88 30 cpi r24, 0x08 ; 8 - 3a58: 09 f4 brne .+2 ; 0x3a5c - 3a5a: b3 c0 rjmp .+358 ; 0x3bc2 - 3a5c: 89 30 cpi r24, 0x09 ; 9 - 3a5e: 09 f4 brne .+2 ; 0x3a62 - 3a60: 98 c0 rjmp .+304 ; 0x3b92 - 3a62: 86 30 cpi r24, 0x06 ; 6 - 3a64: 09 f4 brne .+2 ; 0x3a68 - 3a66: 5a c0 rjmp .+180 ; 0x3b1c - default: - break; - } - } - - if (Endpoint_IsSETUPReceived()) - 3a68: 9c d3 rcall .+1848 ; 0x41a2 - 3a6a: 88 23 and r24, r24 - 3a6c: 11 f0 breq .+4 ; 0x3a72 - { - Endpoint_ClearSETUP(); - 3a6e: 6d d3 rcall .+1754 ; 0x414a - Endpoint_StallTransaction(); - 3a70: 50 d3 rcall .+1696 ; 0x4112 - } -} - 3a72: ec 96 adiw r28, 0x3c ; 60 - 3a74: cd bf out 0x3d, r28 ; 61 - 3a76: de bf out 0x3e, r29 ; 62 - 3a78: df 91 pop r29 - 3a7a: cf 91 pop r28 - 3a7c: 1f 91 pop r17 - 3a7e: 0f 91 pop r16 - 3a80: 08 95 ret - - if (Endpoint_IsSETUPReceived()) - { - uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - - switch (USB_ControlRequest.bRequest) - 3a82: 81 30 cpi r24, 0x01 ; 1 - 3a84: 21 f0 breq .+8 ; 0x3a8e - 3a86: 08 f4 brcc .+2 ; 0x3a8a - 3a88: 68 c0 rjmp .+208 ; 0x3b5a - 3a8a: 83 30 cpi r24, 0x03 ; 3 - 3a8c: 69 f7 brne .-38 ; 0x3a68 - } - - break; - case REQ_ClearFeature: - case REQ_SetFeature: - if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3a8e: 99 23 and r25, r25 - 3a90: 09 f4 brne .+2 ; 0x3a94 - 3a92: a1 c0 rjmp .+322 ; 0x3bd6 - 3a94: 92 30 cpi r25, 0x02 ; 2 - 3a96: 41 f7 brne .-48 ; 0x3a68 - - break; - #endif - #if !defined(CONTROL_ONLY_DEVICE) - case REQREC_ENDPOINT: - if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 3a98: 80 91 17 27 lds r24, 0x2717 - 3a9c: 81 11 cpse r24, r1 - 3a9e: 27 c0 rjmp .+78 ; 0x3aee - { - uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 3aa0: 00 91 19 27 lds r16, 0x2719 - 3aa4: 10 91 1a 27 lds r17, 0x271A - 3aa8: 0f 70 andi r16, 0x0F ; 15 - 3aaa: 11 27 eor r17, r17 - - if (EndpointIndex == ENDPOINT_CONTROLEP) - 3aac: 01 15 cp r16, r1 - 3aae: 11 05 cpc r17, r1 - 3ab0: d9 f2 breq .-74 ; 0x3a68 - return; - - Endpoint_SelectEndpoint(EndpointIndex); - 3ab2: 80 2f mov r24, r16 - 3ab4: f5 d2 rcall .+1514 ; 0x40a0 - - if (Endpoint_IsEnabled()) - { - if (USB_ControlRequest.bRequest == REQ_SetFeature) - 3ab6: 80 91 16 27 lds r24, 0x2716 - 3aba: 83 30 cpi r24, 0x03 ; 3 - 3abc: 09 f4 brne .+2 ; 0x3ac0 - 3abe: e6 c0 rjmp .+460 ; 0x3c8c - * \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; - 3ac0: e0 91 1f 27 lds r30, 0x271F - 3ac4: f0 91 20 27 lds r31, 0x2720 - 3ac8: 81 81 ldd r24, Z+1 ; 0x01 - 3aca: 8b 7f andi r24, 0xFB ; 251 - 3acc: 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; - 3ace: 84 e8 ldi r24, 0x84 ; 132 - 3ad0: 80 9f mul r24, r16 - 3ad2: f0 01 movw r30, r0 - 3ad4: 81 9f mul r24, r17 - 3ad6: f0 0d add r31, r0 - 3ad8: 11 24 eor r1, r1 - 3ada: ed 59 subi r30, 0x9D ; 157 - 3adc: f8 4d sbci r31, 0xD8 ; 216 - 3ade: 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; - 3ae0: e0 91 1f 27 lds r30, 0x271F - 3ae4: f0 91 20 27 lds r31, 0x2720 - 3ae8: 80 81 ld r24, Z - 3aea: 8e 7f andi r24, 0xFE ; 254 - 3aec: 80 83 st Z, r24 - #endif - default: - return; - } - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3aee: 80 e0 ldi r24, 0x00 ; 0 - 3af0: d7 d2 rcall .+1454 ; 0x40a0 - - Endpoint_ClearSETUP(); - 3af2: 2b d3 rcall .+1622 ; 0x414a - - Endpoint_ClearStatusStage(); - 3af4: 8f d4 rcall .+2334 ; 0x4414 - 3af6: b8 cf rjmp .-144 ; 0x3a68 - USB_Device_ClearSetFeature(); - } - - break; - case REQ_SetAddress: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 3af8: 91 11 cpse r25, r1 - 3afa: b6 cf rjmp .-148 ; 0x3a68 - } -} - -static void USB_Device_SetAddress(void) -{ - uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 3afc: 10 91 17 27 lds r17, 0x2717 - 3b00: 1f 77 andi r17, 0x7F ; 127 - - USB_Device_SetDeviceAddress(DeviceAddress); - - Endpoint_ClearSETUP(); - 3b02: 23 d3 rcall .+1606 ; 0x414a - - Endpoint_ClearStatusStage(); - 3b04: 87 d4 rcall .+2318 ; 0x4414 - - while (!(Endpoint_IsINReady())); - 3b06: 7f d3 rcall .+1790 ; 0x4206 - 3b08: 88 23 and r24, r24 - 3b0a: e9 f3 breq .-6 ; 0x3b06 - } - - 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; - 3b0c: 10 93 c3 04 sts 0x04C3, r17 - - USB_Device_EnableDeviceAddress(DeviceAddress); - - USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 3b10: 11 11 cpse r17, r1 - 3b12: 76 c0 rjmp .+236 ; 0x3c00 - 3b14: 82 e0 ldi r24, 0x02 ; 2 - 3b16: 80 93 14 27 sts 0x2714, r24 - 3b1a: a6 cf rjmp .-180 ; 0x3a68 - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - USB_Device_SetAddress(); - - break; - case REQ_GetDescriptor: - if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3b1c: 90 58 subi r25, 0x80 ; 128 - 3b1e: 92 30 cpi r25, 0x02 ; 2 - 3b20: 08 f0 brcs .+2 ; 0x3b24 - 3b22: a2 cf rjmp .-188 ; 0x3a68 - !(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)) - 3b24: 80 91 17 27 lds r24, 0x2717 - 3b28: 90 91 18 27 lds r25, 0x2718 - 3b2c: 8c 3d cpi r24, 0xDC ; 220 - 3b2e: 23 e0 ldi r18, 0x03 ; 3 - 3b30: 92 07 cpc r25, r18 - 3b32: 09 f4 brne .+2 ; 0x3b36 - 3b34: 67 c0 rjmp .+206 ; 0x3c04 - USB_Device_GetInternalSerialDescriptor(); - return; - } - #endif - - if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 3b36: ae 01 movw r20, r28 - 3b38: 45 5c subi r20, 0xC5 ; 197 - 3b3a: 5f 4f sbci r21, 0xFF ; 255 - 3b3c: 60 91 19 27 lds r22, 0x2719 - 3b40: 0e 94 ac 03 call 0x758 ; 0x758 - 3b44: 8c 01 movw r16, r24 - 3b46: 00 97 sbiw r24, 0x00 ; 0 - 3b48: 09 f4 brne .+2 ; 0x3b4c - 3b4a: 8e cf rjmp .-228 ; 0x3a68 - )) == NO_DESCRIPTOR) - { - return; - } - - Endpoint_ClearSETUP(); - 3b4c: fe d2 rcall .+1532 ; 0x414a - #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); - 3b4e: b8 01 movw r22, r16 - 3b50: 8b ad ldd r24, Y+59 ; 0x3b - 3b52: 9c ad ldd r25, Y+60 ; 0x3c - 3b54: c0 d1 rcall .+896 ; 0x3ed6 - Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); - else - Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); - #endif - - Endpoint_ClearOUT(); - 3b56: 77 d2 rcall .+1262 ; 0x4046 - 3b58: 87 cf rjmp .-242 ; 0x3a68 - uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - - switch (USB_ControlRequest.bRequest) - { - case REQ_GetStatus: - if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3b5a: 90 38 cpi r25, 0x80 ; 128 - 3b5c: 09 f4 brne .+2 ; 0x3b60 - 3b5e: 47 c0 rjmp .+142 ; 0x3bee - 3b60: 92 38 cpi r25, 0x82 ; 130 - 3b62: 09 f0 breq .+2 ; 0x3b66 - 3b64: 81 cf rjmp .-254 ; 0x3a68 - 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); - 3b66: 80 91 19 27 lds r24, 0x2719 - 3b6a: 8f 70 andi r24, 0x0F ; 15 - 3b6c: 99 d2 rcall .+1330 ; 0x40a0 - * \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); - 3b6e: e0 91 1f 27 lds r30, 0x271F - 3b72: f0 91 20 27 lds r31, 0x2720 - 3b76: 11 81 ldd r17, Z+1 ; 0x01 - 3b78: 12 fb bst r17, 2 - 3b7a: 11 27 eor r17, r17 - 3b7c: 10 f9 bld r17, 0 - - CurrentStatus = Endpoint_IsStalled(); - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3b7e: 80 e0 ldi r24, 0x00 ; 0 - 3b80: 8f d2 rcall .+1310 ; 0x40a0 - break; - default: - return; - } - - Endpoint_ClearSETUP(); - 3b82: e3 d2 rcall .+1478 ; 0x414a - * \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); - 3b84: 81 2f mov r24, r17 - 3b86: 7d d2 rcall .+1274 ; 0x4082 - Endpoint_Write_8(Data >> 8); - 3b88: 80 e0 ldi r24, 0x00 ; 0 - 3b8a: 7b d2 rcall .+1270 ; 0x4082 - - Endpoint_Write_16_LE(CurrentStatus); - Endpoint_ClearIN(); - 3b8c: 43 d2 rcall .+1158 ; 0x4014 - - Endpoint_ClearStatusStage(); - 3b8e: 42 d4 rcall .+2180 ; 0x4414 - 3b90: 6b cf rjmp .-298 ; 0x3a68 - if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - USB_Device_GetConfiguration(); - - break; - case REQ_SetConfiguration: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 3b92: 91 11 cpse r25, r1 - 3b94: 69 cf rjmp .-302 ; 0x3a68 -} - -static void USB_Device_SetConfiguration(void) -{ - #if defined(FIXED_NUM_CONFIGURATIONS) - if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 3b96: 80 91 17 27 lds r24, 0x2717 - 3b9a: 82 30 cpi r24, 0x02 ; 2 - 3b9c: 08 f0 brcs .+2 ; 0x3ba0 - 3b9e: 64 cf rjmp .-312 ; 0x3a68 - if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) - return; - #endif - #endif - - Endpoint_ClearSETUP(); - 3ba0: d4 d2 rcall .+1448 ; 0x414a - - USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 3ba2: 80 91 17 27 lds r24, 0x2717 - 3ba6: 80 93 10 27 sts 0x2710, r24 - - Endpoint_ClearStatusStage(); - 3baa: 34 d4 rcall .+2152 ; 0x4414 - - if (USB_Device_ConfigurationNumber) - 3bac: 80 91 10 27 lds r24, 0x2710 - 3bb0: 88 23 and r24, r24 - 3bb2: 09 f4 brne .+2 ; 0x3bb6 - 3bb4: 61 c0 rjmp .+194 ; 0x3c78 - USB_DeviceState = DEVICE_STATE_Configured; - 3bb6: 84 e0 ldi r24, 0x04 ; 4 - 3bb8: 80 93 14 27 sts 0x2714, r24 - else - USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - - EVENT_USB_Device_ConfigurationChanged(); - 3bbc: 0e 94 f5 0c call 0x19ea ; 0x19ea - 3bc0: 53 cf rjmp .-346 ; 0x3a68 - USB_Device_GetDescriptor(); - } - - break; - case REQ_GetConfiguration: - if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 3bc2: 90 38 cpi r25, 0x80 ; 128 - 3bc4: 09 f0 breq .+2 ; 0x3bc8 - 3bc6: 50 cf rjmp .-352 ; 0x3a68 - EVENT_USB_Device_ConfigurationChanged(); -} - -static void USB_Device_GetConfiguration(void) -{ - Endpoint_ClearSETUP(); - 3bc8: c0 d2 rcall .+1408 ; 0x414a - - Endpoint_Write_8(USB_Device_ConfigurationNumber); - 3bca: 80 91 10 27 lds r24, 0x2710 - 3bce: 59 d2 rcall .+1202 ; 0x4082 - Endpoint_ClearIN(); - 3bd0: 21 d2 rcall .+1090 ; 0x4014 - - Endpoint_ClearStatusStage(); - 3bd2: 20 d4 rcall .+2112 ; 0x4414 - 3bd4: 49 cf rjmp .-366 ; 0x3a68 -{ - 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) - 3bd6: 90 91 17 27 lds r25, 0x2717 - 3bda: 91 30 cpi r25, 0x01 ; 1 - 3bdc: 09 f0 breq .+2 ; 0x3be0 - 3bde: 44 cf rjmp .-376 ; 0x3a68 - USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 3be0: 91 e0 ldi r25, 0x01 ; 1 - 3be2: 83 30 cpi r24, 0x03 ; 3 - 3be4: 09 f0 breq .+2 ; 0x3be8 - 3be6: 90 e0 ldi r25, 0x00 ; 0 - 3be8: 90 93 12 27 sts 0x2712, r25 - 3bec: 80 cf rjmp .-256 ; 0x3aee - Endpoint_ClearOUT(); -} - -static void USB_Device_GetStatus(void) -{ - uint8_t CurrentStatus = 0; - 3bee: 10 91 11 27 lds r17, 0x2711 - if (USB_Device_CurrentlySelfPowered) - CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; - #endif - - #if !defined(NO_DEVICE_REMOTE_WAKEUP) - if (USB_Device_RemoteWakeupEnabled) - 3bf2: 80 91 12 27 lds r24, 0x2712 - 3bf6: 88 23 and r24, r24 - 3bf8: 09 f4 brne .+2 ; 0x3bfc - 3bfa: c3 cf rjmp .-122 ; 0x3b82 - CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 3bfc: 12 60 ori r17, 0x02 ; 2 - 3bfe: c1 cf rjmp .-126 ; 0x3b82 - - while (!(Endpoint_IsINReady())); - - USB_Device_EnableDeviceAddress(DeviceAddress); - - USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 3c00: 83 e0 ldi r24, 0x03 ; 3 - 3c02: 89 cf rjmp .-238 ; 0x3b16 - { - USB_Descriptor_Header_t Header; - uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; - } SignatureDescriptor; - - SignatureDescriptor.Header.Type = DTYPE_String; - 3c04: 83 e0 ldi r24, 0x03 ; 3 - 3c06: 8a 83 std Y+2, r24 ; 0x02 - SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 3c08: 8a e3 ldi r24, 0x3A ; 58 - 3c0a: 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; - 3c0c: 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(); - 3c0e: f8 94 cli - - for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) - { - uint8_t SerialByte; - - NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c10: 82 e0 ldi r24, 0x02 ; 2 - 3c12: 80 93 ca 01 sts 0x01CA, r24 - SerialByte = pgm_read_byte(SigReadAddress); - 3c16: e8 e0 ldi r30, 0x08 ; 8 - 3c18: f0 e0 ldi r31, 0x00 ; 0 - 3c1a: e4 91 lpm r30, Z - NVM.CMD = 0; - 3c1c: 10 92 ca 01 sts 0x01CA, r1 - - USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); - 3c20: de 01 movw r26, r28 - 3c22: 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++) - 3c24: 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; - 3c26: 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; - 3c28: 42 e0 ldi r20, 0x02 ; 2 - { - SerialByte >>= 4; - SigReadAddress++; - } - - SerialByte &= 0x0F; - 3c2a: ef 70 andi r30, 0x0F ; 15 - - UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 3c2c: 8e 2f mov r24, r30 - 3c2e: 90 e0 ldi r25, 0x00 ; 0 - 3c30: ea 30 cpi r30, 0x0A ; 10 - 3c32: b8 f0 brcs .+46 ; 0x3c62 - 3c34: c7 96 adiw r24, 0x37 ; 55 - 3c36: 8d 93 st X+, r24 - 3c38: 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++) - 3c3a: 2f 5f subi r18, 0xFF ; 255 - 3c3c: 2c 31 cpi r18, 0x1C ; 28 - 3c3e: 99 f0 breq .+38 ; 0x3c66 - { - uint8_t SerialByte; - - NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c40: 40 93 ca 01 sts 0x01CA, r20 - SerialByte = pgm_read_byte(SigReadAddress); - 3c44: e3 2f mov r30, r19 - 3c46: f0 e0 ldi r31, 0x00 ; 0 - 3c48: e4 91 lpm r30, Z - NVM.CMD = 0; - 3c4a: 10 92 ca 01 sts 0x01CA, r1 - - if (SerialCharNum & 0x01) - 3c4e: 20 ff sbrs r18, 0 - 3c50: ec cf rjmp .-40 ; 0x3c2a - { - SerialByte >>= 4; - 3c52: e2 95 swap r30 - 3c54: ef 70 andi r30, 0x0F ; 15 - SigReadAddress++; - 3c56: 3f 5f subi r19, 0xFF ; 255 - } - - SerialByte &= 0x0F; - 3c58: ef 70 andi r30, 0x0F ; 15 - - UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 3c5a: 8e 2f mov r24, r30 - 3c5c: 90 e0 ldi r25, 0x00 ; 0 - 3c5e: ea 30 cpi r30, 0x0A ; 10 - 3c60: 48 f7 brcc .-46 ; 0x3c34 - 3c62: c0 96 adiw r24, 0x30 ; 48 - 3c64: e8 cf rjmp .-48 ; 0x3c36 - if (GlobalIntState & AVR32_SR_GM) - __builtin_ssrf(AVR32_SR_GM_OFFSET); - else - __builtin_csrf(AVR32_SR_GM_OFFSET); - #elif (ARCH == ARCH_XMEGA) - SREG = GlobalIntState; - 3c66: 5f bf out 0x3f, r21 ; 63 - - Endpoint_ClearSETUP(); - 3c68: 70 d2 rcall .+1248 ; 0x414a - - Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); - 3c6a: 6a e3 ldi r22, 0x3A ; 58 - 3c6c: 70 e0 ldi r23, 0x00 ; 0 - 3c6e: ce 01 movw r24, r28 - 3c70: 01 96 adiw r24, 0x01 ; 1 - 3c72: 90 d0 rcall .+288 ; 0x3d94 - Endpoint_ClearOUT(); - 3c74: e8 d1 rcall .+976 ; 0x4046 - 3c76: f8 ce rjmp .-528 ; 0x3a68 - } - - 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); - 3c78: 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; - 3c7c: 88 23 and r24, r24 - 3c7e: 21 f0 breq .+8 ; 0x3c88 - 3c80: 84 e0 ldi r24, 0x04 ; 4 - 3c82: 80 93 14 27 sts 0x2714, r24 - 3c86: 9a cf rjmp .-204 ; 0x3bbc - 3c88: 81 e0 ldi r24, 0x01 ; 1 - 3c8a: fb cf rjmp .-10 ; 0x3c82 - - if (Endpoint_IsEnabled()) - { - if (USB_ControlRequest.bRequest == REQ_SetFeature) - { - Endpoint_StallTransaction(); - 3c8c: 42 d2 rcall .+1156 ; 0x4112 - 3c8e: 2f cf rjmp .-418 ; 0x3aee - -00003c90 : -#define __INCLUDE_FROM_EVENTS_C -#define __INCLUDE_FROM_USB_DRIVER -#include "Events.h" - -void USB_Event_Stub(void) -{ - 3c90: 08 95 ret - -00003c92 : -#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) -volatile uint8_t USB_DeviceState; -#endif - -void USB_USBTask(void) -{ - 3c92: cf 93 push r28 -} - -#if defined(USB_CAN_BE_DEVICE) -static void USB_DeviceTask(void) -{ - if (USB_DeviceState == DEVICE_STATE_Unattached) - 3c94: 80 91 14 27 lds r24, 0x2714 - 3c98: 81 11 cpse r24, r1 - 3c9a: 02 c0 rjmp .+4 ; 0x3ca0 - #elif defined(USB_CAN_BE_HOST) - USB_HostTask(); - #elif defined(USB_CAN_BE_DEVICE) - USB_DeviceTask(); - #endif -} - 3c9c: cf 91 pop r28 - 3c9e: 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; - 3ca0: c0 91 21 27 lds r28, 0x2721 - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - - uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3ca4: 80 e0 ldi r24, 0x00 ; 0 - 3ca6: fc d1 rcall .+1016 ; 0x40a0 - - if (Endpoint_IsSETUPReceived()) - 3ca8: 7c d2 rcall .+1272 ; 0x41a2 - 3caa: 81 11 cpse r24, r1 - 3cac: 03 c0 rjmp .+6 ; 0x3cb4 - USB_Device_ProcessControlRequest(); - - Endpoint_SelectEndpoint(PrevEndpoint); - 3cae: 8c 2f mov r24, r28 - #elif defined(USB_CAN_BE_HOST) - USB_HostTask(); - #elif defined(USB_CAN_BE_DEVICE) - USB_DeviceTask(); - #endif -} - 3cb0: cf 91 pop r28 - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - - if (Endpoint_IsSETUPReceived()) - USB_Device_ProcessControlRequest(); - - Endpoint_SelectEndpoint(PrevEndpoint); - 3cb2: f6 c1 rjmp .+1004 ; 0x40a0 - uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); - - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - - if (Endpoint_IsSETUPReceived()) - USB_Device_ProcessControlRequest(); - 3cb4: a2 de rcall .-700 ; 0x39fa - - Endpoint_SelectEndpoint(PrevEndpoint); - 3cb6: 8c 2f mov r24, r28 - #elif defined(USB_CAN_BE_HOST) - USB_HostTask(); - #elif defined(USB_CAN_BE_DEVICE) - USB_DeviceTask(); - #endif -} - 3cb8: cf 91 pop r28 - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - - if (Endpoint_IsSETUPReceived()) - USB_Device_ProcessControlRequest(); - - Endpoint_SelectEndpoint(PrevEndpoint); - 3cba: f2 c1 rjmp .+996 ; 0x40a0 - -00003cbc : - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - } - - return ENDPOINT_RWCSTREAM_NoError; - 3cbc: af 92 push r10 - 3cbe: bf 92 push r11 - 3cc0: df 92 push r13 - 3cc2: ef 92 push r14 - 3cc4: ff 92 push r15 - 3cc6: 0f 93 push r16 - 3cc8: 1f 93 push r17 - 3cca: cf 93 push r28 - 3ccc: df 93 push r29 - 3cce: 8c 01 movw r16, r24 - 3cd0: eb 01 movw r28, r22 - 3cd2: 7a 01 movw r14, r20 - 3cd4: b5 d3 rcall .+1898 ; 0x4440 - 3cd6: d8 2e mov r13, r24 - 3cd8: 81 11 cpse r24, r1 - 3cda: 27 c0 rjmp .+78 ; 0x3d2a - 3cdc: e1 14 cp r14, r1 - 3cde: f1 04 cpc r15, r1 - 3ce0: a1 f1 breq .+104 ; 0x3d4a - 3ce2: f7 01 movw r30, r14 - 3ce4: 20 81 ld r18, Z - 3ce6: 31 81 ldd r19, Z+1 ; 0x01 - 3ce8: c2 1b sub r28, r18 - 3cea: d3 0b sbc r29, r19 - 3cec: 02 0f add r16, r18 - 3cee: 13 1f adc r17, r19 - 3cf0: 20 97 sbiw r28, 0x00 ; 0 - 3cf2: d9 f0 breq .+54 ; 0x3d2a - 3cf4: a1 2c mov r10, r1 - 3cf6: b1 2c mov r11, r1 - 3cf8: 80 91 1d 27 lds r24, 0x271D - 3cfc: 90 91 1e 27 lds r25, 0x271E - 3d00: fc 01 movw r30, r24 - 3d02: ef 5b subi r30, 0xBF ; 191 - 3d04: ff 4f sbci r31, 0xFF ; 255 - 3d06: 20 81 ld r18, Z - 3d08: fc 01 movw r30, r24 - 3d0a: e0 5c subi r30, 0xC0 ; 192 - 3d0c: ff 4f sbci r31, 0xFF ; 255 - 3d0e: 80 81 ld r24, Z - 3d10: 28 17 cp r18, r24 - 3d12: 90 f1 brcs .+100 ; 0x3d78 - 3d14: 7f d1 rcall .+766 ; 0x4014 - 3d16: bd df rcall .-134 ; 0x3c92 - 3d18: f7 01 movw r30, r14 - 3d1a: 80 81 ld r24, Z - 3d1c: 91 81 ldd r25, Z+1 ; 0x01 - 3d1e: 8a 0d add r24, r10 - 3d20: 9b 1d adc r25, r11 - 3d22: 80 83 st Z, r24 - 3d24: 91 83 std Z+1, r25 ; 0x01 - 3d26: 25 e0 ldi r18, 0x05 ; 5 - 3d28: d2 2e mov r13, r18 - 3d2a: 8d 2d mov r24, r13 - 3d2c: df 91 pop r29 - 3d2e: cf 91 pop r28 - 3d30: 1f 91 pop r17 - 3d32: 0f 91 pop r16 - 3d34: ff 90 pop r15 - 3d36: ef 90 pop r14 - 3d38: df 90 pop r13 - 3d3a: bf 90 pop r11 - 3d3c: af 90 pop r10 - 3d3e: 08 95 ret - 3d40: 69 d1 rcall .+722 ; 0x4014 - 3d42: a7 df rcall .-178 ; 0x3c92 - 3d44: 7d d3 rcall .+1786 ; 0x4440 - 3d46: 81 11 cpse r24, r1 - 3d48: 23 c0 rjmp .+70 ; 0x3d90 - 3d4a: 20 97 sbiw r28, 0x00 ; 0 - 3d4c: 71 f3 breq .-36 ; 0x3d2a - 3d4e: 20 91 1d 27 lds r18, 0x271D - 3d52: 30 91 1e 27 lds r19, 0x271E - 3d56: f9 01 movw r30, r18 - 3d58: ef 5b subi r30, 0xBF ; 191 - 3d5a: ff 4f sbci r31, 0xFF ; 255 - 3d5c: 90 81 ld r25, Z - 3d5e: f9 01 movw r30, r18 - 3d60: e0 5c subi r30, 0xC0 ; 192 - 3d62: ff 4f sbci r31, 0xFF ; 255 - 3d64: 80 81 ld r24, Z - 3d66: 98 17 cp r25, r24 - 3d68: 58 f7 brcc .-42 ; 0x3d40 - 3d6a: f8 01 movw r30, r16 - 3d6c: 81 91 ld r24, Z+ - 3d6e: 8f 01 movw r16, r30 - 3d70: 88 d1 rcall .+784 ; 0x4082 - 3d72: 21 97 sbiw r28, 0x01 ; 1 - 3d74: 61 f7 brne .-40 ; 0x3d4e - 3d76: d9 cf rjmp .-78 ; 0x3d2a - 3d78: f8 01 movw r30, r16 - 3d7a: 81 91 ld r24, Z+ - 3d7c: 8f 01 movw r16, r30 - 3d7e: 81 d1 rcall .+770 ; 0x4082 - 3d80: ff ef ldi r31, 0xFF ; 255 - 3d82: af 1a sub r10, r31 - 3d84: bf 0a sbc r11, r31 - 3d86: ca 15 cp r28, r10 - 3d88: db 05 cpc r29, r11 - 3d8a: 09 f0 breq .+2 ; 0x3d8e - 3d8c: b5 cf rjmp .-150 ; 0x3cf8 - 3d8e: cd cf rjmp .-102 ; 0x3d2a - 3d90: d8 2e mov r13, r24 - 3d92: cb cf rjmp .-106 ; 0x3d2a - -00003d94 : - 3d94: cf 92 push r12 - 3d96: df 92 push r13 - 3d98: ef 92 push r14 - 3d9a: ff 92 push r15 - 3d9c: 0f 93 push r16 - 3d9e: 1f 93 push r17 - 3da0: cf 93 push r28 - 3da2: df 93 push r29 - 3da4: 6c 01 movw r12, r24 - 3da6: eb 01 movw r28, r22 - 3da8: 80 91 21 27 lds r24, 0x2721 - 3dac: 80 68 ori r24, 0x80 ; 128 - 3dae: 78 d1 rcall .+752 ; 0x40a0 - 3db0: 00 91 1b 27 lds r16, 0x271B - 3db4: 10 91 1c 27 lds r17, 0x271C - 3db8: 0c 17 cp r16, r28 - 3dba: 1d 07 cpc r17, r29 - 3dbc: 20 f0 brcs .+8 ; 0x3dc6 - 3dbe: 20 97 sbiw r28, 0x00 ; 0 - 3dc0: 09 f4 brne .+2 ; 0x3dc4 - 3dc2: 83 c0 rjmp .+262 ; 0x3eca - 3dc4: 8e 01 movw r16, r28 - 3dc6: c0 e0 ldi r28, 0x00 ; 0 - 3dc8: 01 15 cp r16, r1 - 3dca: 11 05 cpc r17, r1 - 3dcc: 09 f0 breq .+2 ; 0x3dd0 - 3dce: 4a c0 rjmp .+148 ; 0x3e64 - 3dd0: cc 23 and r28, r28 - 3dd2: 09 f4 brne .+2 ; 0x3dd6 - 3dd4: 5c c0 rjmp .+184 ; 0x3e8e - 3dd6: 80 91 14 27 lds r24, 0x2714 - 3dda: 88 23 and r24, r24 - 3ddc: 09 f4 brne .+2 ; 0x3de0 - 3dde: 55 c0 rjmp .+170 ; 0x3e8a - 3de0: 85 30 cpi r24, 0x05 ; 5 - 3de2: 09 f4 brne .+2 ; 0x3de6 - 3de4: 5d c0 rjmp .+186 ; 0x3ea0 - 3de6: dd d1 rcall .+954 ; 0x41a2 - 3de8: 81 11 cpse r24, r1 - 3dea: 6d c0 rjmp .+218 ; 0x3ec6 - 3dec: f3 d1 rcall .+998 ; 0x41d4 - 3dee: 81 11 cpse r24, r1 - 3df0: 4e c0 rjmp .+156 ; 0x3e8e - 3df2: 09 d2 rcall .+1042 ; 0x4206 - 3df4: 88 23 and r24, r24 - 3df6: 79 f3 breq .-34 ; 0x3dd6 - 3df8: 80 91 21 27 lds r24, 0x2721 - 3dfc: 87 fd sbrc r24, 7 - 3dfe: 5a c0 rjmp .+180 ; 0x3eb4 - 3e00: 20 91 1d 27 lds r18, 0x271D - 3e04: 30 91 1e 27 lds r19, 0x271E - 3e08: f9 01 movw r30, r18 - 3e0a: e0 5c subi r30, 0xC0 ; 192 - 3e0c: ff 4f sbci r31, 0xFF ; 255 - 3e0e: e0 80 ld r14, Z - 3e10: f9 01 movw r30, r18 - 3e12: ef 5b subi r30, 0xBF ; 191 - 3e14: ff 4f sbci r31, 0xFF ; 255 - 3e16: 80 81 ld r24, Z - 3e18: f1 2c mov r15, r1 - 3e1a: e8 1a sub r14, r24 - 3e1c: f1 08 sbc r15, r1 - 3e1e: 01 15 cp r16, r1 - 3e20: 11 05 cpc r17, r1 - 3e22: a9 f0 breq .+42 ; 0x3e4e - 3e24: 88 e0 ldi r24, 0x08 ; 8 - 3e26: e8 16 cp r14, r24 - 3e28: f1 04 cpc r15, r1 - 3e2a: 88 f4 brcc .+34 ; 0x3e4e - 3e2c: e6 01 movw r28, r12 - 3e2e: 04 c0 rjmp .+8 ; 0x3e38 - 3e30: 88 e0 ldi r24, 0x08 ; 8 - 3e32: e8 16 cp r14, r24 - 3e34: f1 04 cpc r15, r1 - 3e36: 59 f0 breq .+22 ; 0x3e4e - 3e38: 89 91 ld r24, Y+ - 3e3a: 23 d1 rcall .+582 ; 0x4082 - 3e3c: 6e 01 movw r12, r28 - 3e3e: 01 50 subi r16, 0x01 ; 1 - 3e40: 11 09 sbc r17, r1 - 3e42: 8f ef ldi r24, 0xFF ; 255 - 3e44: e8 1a sub r14, r24 - 3e46: f8 0a sbc r15, r24 - 3e48: 01 15 cp r16, r1 - 3e4a: 11 05 cpc r17, r1 - 3e4c: 89 f7 brne .-30 ; 0x3e30 - 3e4e: c1 e0 ldi r28, 0x01 ; 1 - 3e50: 88 e0 ldi r24, 0x08 ; 8 - 3e52: e8 16 cp r14, r24 - 3e54: f1 04 cpc r15, r1 - 3e56: 09 f0 breq .+2 ; 0x3e5a - 3e58: c0 e0 ldi r28, 0x00 ; 0 - 3e5a: dc d0 rcall .+440 ; 0x4014 - 3e5c: 01 15 cp r16, r1 - 3e5e: 11 05 cpc r17, r1 - 3e60: 09 f4 brne .+2 ; 0x3e64 - 3e62: b6 cf rjmp .-148 ; 0x3dd0 - 3e64: 80 91 14 27 lds r24, 0x2714 - 3e68: 88 23 and r24, r24 - 3e6a: 79 f0 breq .+30 ; 0x3e8a - 3e6c: 85 30 cpi r24, 0x05 ; 5 - 3e6e: c1 f0 breq .+48 ; 0x3ea0 - 3e70: 98 d1 rcall .+816 ; 0x41a2 - 3e72: 81 11 cpse r24, r1 - 3e74: 28 c0 rjmp .+80 ; 0x3ec6 - 3e76: ae d1 rcall .+860 ; 0x41d4 - 3e78: 81 11 cpse r24, r1 - 3e7a: 09 c0 rjmp .+18 ; 0x3e8e - 3e7c: c4 d1 rcall .+904 ; 0x4206 - 3e7e: 81 11 cpse r24, r1 - 3e80: bb cf rjmp .-138 ; 0x3df8 - 3e82: 80 91 14 27 lds r24, 0x2714 - 3e86: 81 11 cpse r24, r1 - 3e88: f1 cf rjmp .-30 ; 0x3e6c - 3e8a: 82 e0 ldi r24, 0x02 ; 2 - 3e8c: 0a c0 rjmp .+20 ; 0x3ea2 - 3e8e: a2 d1 rcall .+836 ; 0x41d4 - 3e90: 81 11 cpse r24, r1 - 3e92: 1f c0 rjmp .+62 ; 0x3ed2 - 3e94: 80 91 14 27 lds r24, 0x2714 - 3e98: 88 23 and r24, r24 - 3e9a: b9 f3 breq .-18 ; 0x3e8a - 3e9c: 85 30 cpi r24, 0x05 ; 5 - 3e9e: b9 f7 brne .-18 ; 0x3e8e - 3ea0: 83 e0 ldi r24, 0x03 ; 3 - 3ea2: df 91 pop r29 - 3ea4: cf 91 pop r28 - 3ea6: 1f 91 pop r17 - 3ea8: 0f 91 pop r16 - 3eaa: ff 90 pop r15 - 3eac: ef 90 pop r14 - 3eae: df 90 pop r13 - 3eb0: cf 90 pop r12 - 3eb2: 08 95 ret - 3eb4: e0 91 1d 27 lds r30, 0x271D - 3eb8: f0 91 1e 27 lds r31, 0x271E - 3ebc: ef 5b subi r30, 0xBF ; 191 - 3ebe: ff 4f sbci r31, 0xFF ; 255 - 3ec0: e0 80 ld r14, Z - 3ec2: f1 2c mov r15, r1 - 3ec4: ac cf rjmp .-168 ; 0x3e1e - 3ec6: 81 e0 ldi r24, 0x01 ; 1 - 3ec8: ec cf rjmp .-40 ; 0x3ea2 - 3eca: a4 d0 rcall .+328 ; 0x4014 - 3ecc: 00 e0 ldi r16, 0x00 ; 0 - 3ece: 10 e0 ldi r17, 0x00 ; 0 - 3ed0: 7a cf rjmp .-268 ; 0x3dc6 - 3ed2: 80 e0 ldi r24, 0x00 ; 0 - 3ed4: e6 cf rjmp .-52 ; 0x3ea2 - -00003ed6 : - -#if defined(TEMPLATE_FUNC_NAME) - -uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, - uint16_t Length) -{ - 3ed6: cf 92 push r12 - 3ed8: df 92 push r13 - 3eda: ef 92 push r14 - 3edc: ff 92 push r15 - 3ede: 0f 93 push r16 - 3ee0: 1f 93 push r17 - 3ee2: cf 93 push r28 - 3ee4: df 93 push r29 - 3ee6: d8 2e mov r13, r24 - 3ee8: c9 2e mov r12, r25 - 3eea: 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); - 3eec: 80 91 21 27 lds r24, 0x2721 - 3ef0: 80 68 ori r24, 0x80 ; 128 - 3ef2: d6 d0 rcall .+428 ; 0x40a0 - - if (Length > USB_ControlRequest.wLength) - 3ef4: c0 91 1b 27 lds r28, 0x271B - 3ef8: d0 91 1c 27 lds r29, 0x271C - 3efc: c0 17 cp r28, r16 - 3efe: d1 07 cpc r29, r17 - 3f00: 28 f0 brcs .+10 ; 0x3f0c - Length = USB_ControlRequest.wLength; - else if (!(Length)) - 3f02: 01 15 cp r16, r1 - 3f04: 11 05 cpc r17, r1 - 3f06: 09 f4 brne .+2 ; 0x3f0a - 3f08: 7f c0 rjmp .+254 ; 0x4008 - 3f0a: e8 01 movw r28, r16 - 3f0c: ed 2c mov r14, r13 - 3f0e: fc 2c mov r15, r12 - 3f10: d1 2c mov r13, r1 - 3f12: 20 97 sbiw r28, 0x00 ; 0 - 3f14: 09 f0 breq .+2 ; 0x3f18 - 3f16: 45 c0 rjmp .+138 ; 0x3fa2 - 3f18: dd 20 and r13, r13 - 3f1a: 09 f4 brne .+2 ; 0x3f1e - 3f1c: 57 c0 rjmp .+174 ; 0x3fcc - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3f1e: 80 91 14 27 lds r24, 0x2714 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3f22: 88 23 and r24, r24 - 3f24: 09 f4 brne .+2 ; 0x3f28 - 3f26: 50 c0 rjmp .+160 ; 0x3fc8 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3f28: 85 30 cpi r24, 0x05 ; 5 - 3f2a: 09 f4 brne .+2 ; 0x3f2e - 3f2c: 58 c0 rjmp .+176 ; 0x3fde - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3f2e: 39 d1 rcall .+626 ; 0x41a2 - 3f30: 81 11 cpse r24, r1 - 3f32: 68 c0 rjmp .+208 ; 0x4004 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 3f34: 4f d1 rcall .+670 ; 0x41d4 - 3f36: 81 11 cpse r24, r1 - 3f38: 49 c0 rjmp .+146 ; 0x3fcc - break; - - if (Endpoint_IsINReady()) - 3f3a: 65 d1 rcall .+714 ; 0x4206 - 3f3c: 88 23 and r24, r24 - 3f3e: 79 f3 breq .-34 ; 0x3f1e - * \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) - 3f40: 80 91 21 27 lds r24, 0x2721 - 3f44: 87 fd sbrc r24, 7 - 3f46: 55 c0 rjmp .+170 ; 0x3ff2 - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 3f48: 80 91 1d 27 lds r24, 0x271D - 3f4c: 90 91 1e 27 lds r25, 0x271E - 3f50: fc 01 movw r30, r24 - 3f52: e0 5c subi r30, 0xC0 ; 192 - 3f54: ff 4f sbci r31, 0xFF ; 255 - 3f56: 00 81 ld r16, Z - 3f58: fc 01 movw r30, r24 - 3f5a: ef 5b subi r30, 0xBF ; 191 - 3f5c: ff 4f sbci r31, 0xFF ; 255 - 3f5e: 80 81 ld r24, Z - 3f60: 10 e0 ldi r17, 0x00 ; 0 - 3f62: 08 1b sub r16, r24 - 3f64: 11 09 sbc r17, r1 - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3f66: 20 97 sbiw r28, 0x00 ; 0 - 3f68: 91 f0 breq .+36 ; 0x3f8e - 3f6a: 08 30 cpi r16, 0x08 ; 8 - 3f6c: 11 05 cpc r17, r1 - 3f6e: 20 f0 brcs .+8 ; 0x3f78 - 3f70: 0e c0 rjmp .+28 ; 0x3f8e - 3f72: 08 30 cpi r16, 0x08 ; 8 - 3f74: 11 05 cpc r17, r1 - 3f76: 59 f0 breq .+22 ; 0x3f8e - { - TEMPLATE_TRANSFER_BYTE(DataStream); - 3f78: f7 01 movw r30, r14 - 3f7a: 84 91 lpm r24, Z - 3f7c: 82 d0 rcall .+260 ; 0x4082 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - 3f7e: ff ef ldi r31, 0xFF ; 255 - 3f80: ef 1a sub r14, r31 - 3f82: ff 0a sbc r15, r31 - Length--; - 3f84: 21 97 sbiw r28, 0x01 ; 1 - BytesInEndpoint++; - 3f86: 0f 5f subi r16, 0xFF ; 255 - 3f88: 1f 4f sbci r17, 0xFF ; 255 - - if (Endpoint_IsINReady()) - { - uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); - - while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3f8a: 20 97 sbiw r28, 0x00 ; 0 - 3f8c: 91 f7 brne .-28 ; 0x3f72 - TEMPLATE_BUFFER_MOVE(DataStream, 1); - Length--; - BytesInEndpoint++; - } - - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 3f8e: dd 24 eor r13, r13 - 3f90: d3 94 inc r13 - 3f92: 08 30 cpi r16, 0x08 ; 8 - 3f94: 11 05 cpc r17, r1 - 3f96: 09 f0 breq .+2 ; 0x3f9a - 3f98: d1 2c mov r13, r1 - Endpoint_ClearIN(); - 3f9a: 3c d0 rcall .+120 ; 0x4014 - 3f9c: 20 97 sbiw r28, 0x00 ; 0 - 3f9e: 09 f4 brne .+2 ; 0x3fa2 - 3fa0: bb cf rjmp .-138 ; 0x3f18 - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3fa2: 80 91 14 27 lds r24, 0x2714 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3fa6: 88 23 and r24, r24 - 3fa8: 79 f0 breq .+30 ; 0x3fc8 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3faa: 85 30 cpi r24, 0x05 ; 5 - 3fac: c1 f0 breq .+48 ; 0x3fde - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3fae: f9 d0 rcall .+498 ; 0x41a2 - 3fb0: 81 11 cpse r24, r1 - 3fb2: 28 c0 rjmp .+80 ; 0x4004 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) - 3fb4: 0f d1 rcall .+542 ; 0x41d4 - 3fb6: 81 11 cpse r24, r1 - 3fb8: 09 c0 rjmp .+18 ; 0x3fcc - break; - - if (Endpoint_IsINReady()) - 3fba: 25 d1 rcall .+586 ; 0x4206 - 3fbc: 81 11 cpse r24, r1 - 3fbe: c0 cf rjmp .-128 ; 0x3f40 - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3fc0: 80 91 14 27 lds r24, 0x2714 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3fc4: 81 11 cpse r24, r1 - 3fc6: f1 cf rjmp .-30 ; 0x3faa - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 3fc8: 82 e0 ldi r24, 0x02 ; 2 - 3fca: 0a c0 rjmp .+20 ; 0x3fe0 - LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - Endpoint_ClearIN(); - } - } - - while (!(Endpoint_IsOUTReceived())) - 3fcc: 03 d1 rcall .+518 ; 0x41d4 - 3fce: 81 11 cpse r24, r1 - 3fd0: 1f c0 rjmp .+62 ; 0x4010 - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3fd2: 80 91 14 27 lds r24, 0x2714 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3fd6: 88 23 and r24, r24 - 3fd8: b9 f3 breq .-18 ; 0x3fc8 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3fda: 85 30 cpi r24, 0x05 ; 5 - 3fdc: b9 f7 brne .-18 ; 0x3fcc - 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; - 3fde: 83 e0 ldi r24, 0x03 ; 3 - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - } - - return ENDPOINT_RWCSTREAM_NoError; -} - 3fe0: df 91 pop r29 - 3fe2: cf 91 pop r28 - 3fe4: 1f 91 pop r17 - 3fe6: 0f 91 pop r16 - 3fe8: ff 90 pop r15 - 3fea: ef 90 pop r14 - 3fec: df 90 pop r13 - 3fee: cf 90 pop r12 - 3ff0: 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; - 3ff2: e0 91 1d 27 lds r30, 0x271D - 3ff6: f0 91 1e 27 lds r31, 0x271E - 3ffa: ef 5b subi r30, 0xBF ; 191 - 3ffc: ff 4f sbci r31, 0xFF ; 255 - 3ffe: 00 81 ld r16, Z - 4000: 10 e0 ldi r17, 0x00 ; 0 - 4002: b1 cf rjmp .-158 ; 0x3f66 - 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; - 4004: 81 e0 ldi r24, 0x01 ; 1 - 4006: ec cf rjmp .-40 ; 0x3fe0 - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - - if (Length > USB_ControlRequest.wLength) - Length = USB_ControlRequest.wLength; - else if (!(Length)) - Endpoint_ClearIN(); - 4008: 05 d0 rcall .+10 ; 0x4014 - 400a: c0 e0 ldi r28, 0x00 ; 0 - 400c: d0 e0 ldi r29, 0x00 ; 0 - 400e: 7e cf rjmp .-260 ; 0x3f0c - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_RWCSTREAM_BusSuspended; - } - - return ENDPOINT_RWCSTREAM_NoError; - 4010: 80 e0 ldi r24, 0x00 ; 0 - 4012: e6 cf rjmp .-52 ; 0x3fe0 - -00004014 : - USB_Endpoint_SelectedFIFO->Position = 0; -} - -void Endpoint_ClearIN(void) -{ - USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; - 4014: e0 91 1f 27 lds r30, 0x271F - 4018: f0 91 20 27 lds r31, 0x2720 - 401c: a0 91 1d 27 lds r26, 0x271D - 4020: b0 91 1e 27 lds r27, 0x271E - 4024: af 5b subi r26, 0xBF ; 191 - 4026: bf 4f sbci r27, 0xFF ; 255 - 4028: 8c 91 ld r24, X - 402a: 90 e0 ldi r25, 0x00 ; 0 - 402c: 82 83 std Z+2, r24 ; 0x02 - 402e: 93 83 std Z+3, r25 ; 0x03 - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 4030: 80 81 ld r24, Z - 4032: 8d 79 andi r24, 0x9D ; 157 - 4034: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 4036: e0 91 1d 27 lds r30, 0x271D - 403a: f0 91 1e 27 lds r31, 0x271E - 403e: ef 5b subi r30, 0xBF ; 191 - 4040: ff 4f sbci r31, 0xFF ; 255 - 4042: 10 82 st Z, r1 - 4044: 08 95 ret - -00004046 : -} - -void Endpoint_ClearOUT(void) -{ - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 4046: e0 91 1f 27 lds r30, 0x271F - 404a: f0 91 20 27 lds r31, 0x2720 - 404e: 80 81 ld r24, Z - 4050: 8d 79 andi r24, 0x9D ; 157 - 4052: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 4054: e0 91 1d 27 lds r30, 0x271D - 4058: f0 91 1e 27 lds r31, 0x271E - 405c: ef 5b subi r30, 0xBF ; 191 - 405e: ff 4f sbci r31, 0xFF ; 255 - 4060: 10 82 st Z, r1 - 4062: 08 95 ret - -00004064 : - } -} - -uint8_t Endpoint_Read_8(void) -{ - return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; - 4064: 80 91 1d 27 lds r24, 0x271D - 4068: 90 91 1e 27 lds r25, 0x271E - 406c: fc 01 movw r30, r24 - 406e: ef 5b subi r30, 0xBF ; 191 - 4070: ff 4f sbci r31, 0xFF ; 255 - 4072: 20 81 ld r18, Z - 4074: dc 01 movw r26, r24 - 4076: a2 0f add r26, r18 - 4078: b1 1d adc r27, r1 - 407a: 8c 91 ld r24, X - 407c: 2f 5f subi r18, 0xFF ; 255 - 407e: 20 83 st Z, r18 -} - 4080: 08 95 ret - -00004082 : - -void Endpoint_Write_8(const uint8_t Data) -{ - USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; - 4082: 20 91 1d 27 lds r18, 0x271D - 4086: 30 91 1e 27 lds r19, 0x271E - 408a: f9 01 movw r30, r18 - 408c: ef 5b subi r30, 0xBF ; 191 - 408e: ff 4f sbci r31, 0xFF ; 255 - 4090: 90 81 ld r25, Z - 4092: d9 01 movw r26, r18 - 4094: a9 0f add r26, r25 - 4096: b1 1d adc r27, r1 - 4098: 8c 93 st X, r24 - 409a: 9f 5f subi r25, 0xFF ; 255 - 409c: 90 83 st Z, r25 - 409e: 08 95 ret - -000040a0 : - -void Endpoint_SelectEndpoint(const uint8_t Address) -{ - uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); - - USB_Endpoint_SelectedEndpoint = Address; - 40a0: 80 93 21 27 sts 0x2721, r24 - USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; -} - -void Endpoint_SelectEndpoint(const uint8_t Address) -{ - uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); - 40a4: 28 2f mov r18, r24 - 40a6: 2f 70 andi r18, 0x0F ; 15 - - USB_Endpoint_SelectedEndpoint = Address; - - Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; - 40a8: 62 2f mov r22, r18 - 40aa: 70 e0 ldi r23, 0x00 ; 0 - 40ac: 94 e8 ldi r25, 0x84 ; 132 - 40ae: 29 9f mul r18, r25 - 40b0: 90 01 movw r18, r0 - 40b2: 11 24 eor r1, r1 - 40b4: 2e 5d subi r18, 0xDE ; 222 - 40b6: 38 4d sbci r19, 0xD8 ; 216 - USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; - 40b8: 40 91 c6 04 lds r20, 0x04C6 - 40bc: 50 91 c7 04 lds r21, 0x04C7 - - if (Address & ENDPOINT_DIR_IN) - 40c0: 87 fd sbrc r24, 7 - 40c2: 12 c0 rjmp .+36 ; 0x40e8 - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - } - else - { - USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; - 40c4: 20 93 1d 27 sts 0x271D, r18 - 40c8: 30 93 1e 27 sts 0x271E, r19 - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; - 40cc: cb 01 movw r24, r22 - 40ce: 82 95 swap r24 - 40d0: 92 95 swap r25 - 40d2: 90 7f andi r25, 0xF0 ; 240 - 40d4: 98 27 eor r25, r24 - 40d6: 80 7f andi r24, 0xF0 ; 240 - 40d8: 98 27 eor r25, r24 - 40da: 84 0f add r24, r20 - 40dc: 95 1f adc r25, r21 - 40de: 80 93 1f 27 sts 0x271F, r24 - 40e2: 90 93 20 27 sts 0x2720, r25 - 40e6: 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; - 40e8: 2e 5b subi r18, 0xBE ; 190 - 40ea: 3f 4f sbci r19, 0xFF ; 255 - 40ec: 20 93 1d 27 sts 0x271D, r18 - 40f0: 30 93 1e 27 sts 0x271E, r19 - USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - 40f4: 62 95 swap r22 - 40f6: 72 95 swap r23 - 40f8: 70 7f andi r23, 0xF0 ; 240 - 40fa: 76 27 eor r23, r22 - 40fc: 60 7f andi r22, 0xF0 ; 240 - 40fe: 76 27 eor r23, r22 - 4100: 68 5f subi r22, 0xF8 ; 248 - 4102: 7f 4f sbci r23, 0xFF ; 255 - 4104: 64 0f add r22, r20 - 4106: 75 1f adc r23, r21 - 4108: 60 93 1f 27 sts 0x271F, r22 - 410c: 70 93 20 27 sts 0x2720, r23 - 4110: 08 95 ret - -00004112 : - USB_Endpoint_SelectedFIFO->Position = 0; -} - -void Endpoint_StallTransaction(void) -{ - USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 4112: e0 91 1f 27 lds r30, 0x271F - 4116: f0 91 20 27 lds r31, 0x2720 - 411a: 81 81 ldd r24, Z+1 ; 0x01 - 411c: 84 60 ori r24, 0x04 ; 4 - 411e: 81 83 std Z+1, r24 ; 0x01 - - if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) - 4120: e0 91 1f 27 lds r30, 0x271F - 4124: f0 91 20 27 lds r31, 0x2720 - 4128: 81 81 ldd r24, Z+1 ; 0x01 - 412a: 80 7c andi r24, 0xC0 ; 192 - 412c: 80 34 cpi r24, 0x40 ; 64 - 412e: 09 f0 breq .+2 ; 0x4132 - 4130: 08 95 ret - { - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); - 4132: 80 91 21 27 lds r24, 0x2721 - 4136: 80 58 subi r24, 0x80 ; 128 - 4138: b3 df rcall .-154 ; 0x40a0 - USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 413a: e0 91 1f 27 lds r30, 0x271F - 413e: f0 91 20 27 lds r31, 0x2720 - 4142: 81 81 ldd r24, Z+1 ; 0x01 - 4144: 84 60 ori r24, 0x04 ; 4 - 4146: 81 83 std Z+1, r24 ; 0x01 - 4148: 08 95 ret - -0000414a : - return false; -} - -void Endpoint_ClearSETUP(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 414a: 80 91 21 27 lds r24, 0x2721 - 414e: 8f 77 andi r24, 0x7F ; 127 - 4150: a7 df rcall .-178 ; 0x40a0 - USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 4152: e0 91 1f 27 lds r30, 0x271F - 4156: f0 91 20 27 lds r31, 0x2720 - 415a: 80 81 ld r24, Z - 415c: 8d 78 andi r24, 0x8D ; 141 - 415e: 80 83 st Z, r24 - USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 4160: e0 91 1f 27 lds r30, 0x271F - 4164: f0 91 20 27 lds r31, 0x2720 - 4168: 80 81 ld r24, Z - 416a: 81 60 ori r24, 0x01 ; 1 - 416c: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 416e: e0 91 1d 27 lds r30, 0x271D - 4172: f0 91 1e 27 lds r31, 0x271E - 4176: ef 5b subi r30, 0xBF ; 191 - 4178: ff 4f sbci r31, 0xFF ; 255 - 417a: 10 82 st Z, r1 - - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 417c: 80 91 21 27 lds r24, 0x2721 - 4180: 80 68 ori r24, 0x80 ; 128 - 4182: 8e df rcall .-228 ; 0x40a0 - USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 4184: e0 91 1f 27 lds r30, 0x271F - 4188: f0 91 20 27 lds r31, 0x2720 - 418c: 80 81 ld r24, Z - 418e: 81 60 ori r24, 0x01 ; 1 - 4190: 80 83 st Z, r24 - USB_Endpoint_SelectedFIFO->Position = 0; - 4192: e0 91 1d 27 lds r30, 0x271D - 4196: f0 91 1e 27 lds r31, 0x271E - 419a: ef 5b subi r30, 0xBF ; 191 - 419c: ff 4f sbci r31, 0xFF ; 255 - 419e: 10 82 st Z, r1 - 41a0: 08 95 ret - -000041a2 : - return false; -} - -bool Endpoint_IsSETUPReceived(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 41a2: 80 91 21 27 lds r24, 0x2721 - 41a6: 8f 77 andi r24, 0x7F ; 127 - 41a8: 7b df rcall .-266 ; 0x40a0 - - if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) - 41aa: e0 91 1f 27 lds r30, 0x271F - 41ae: f0 91 20 27 lds r31, 0x2720 - 41b2: 80 81 ld r24, Z - 41b4: 84 ff sbrs r24, 4 - 41b6: 0c c0 rjmp .+24 ; 0x41d0 - { - USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 41b8: 20 91 1d 27 lds r18, 0x271D - 41bc: 30 91 1e 27 lds r19, 0x271E - 41c0: 82 81 ldd r24, Z+2 ; 0x02 - 41c2: 93 81 ldd r25, Z+3 ; 0x03 - 41c4: f9 01 movw r30, r18 - 41c6: e0 5c subi r30, 0xC0 ; 192 - 41c8: ff 4f sbci r31, 0xFF ; 255 - 41ca: 80 83 st Z, r24 - return true; - 41cc: 81 e0 ldi r24, 0x01 ; 1 - 41ce: 08 95 ret - } - - return false; - 41d0: 80 e0 ldi r24, 0x00 ; 0 -} - 41d2: 08 95 ret - -000041d4 : - return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); -} - -bool Endpoint_IsOUTReceived(void) -{ - Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 41d4: 80 91 21 27 lds r24, 0x2721 - 41d8: 8f 77 andi r24, 0x7F ; 127 - 41da: 62 df rcall .-316 ; 0x40a0 - - if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) - 41dc: e0 91 1f 27 lds r30, 0x271F - 41e0: f0 91 20 27 lds r31, 0x2720 - 41e4: 80 81 ld r24, Z - 41e6: 85 ff sbrs r24, 5 - 41e8: 0c c0 rjmp .+24 ; 0x4202 - { - USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 41ea: 20 91 1d 27 lds r18, 0x271D - 41ee: 30 91 1e 27 lds r19, 0x271E - 41f2: 82 81 ldd r24, Z+2 ; 0x02 - 41f4: 93 81 ldd r25, Z+3 ; 0x03 - 41f6: f9 01 movw r30, r18 - 41f8: e0 5c subi r30, 0xC0 ; 192 - 41fa: ff 4f sbci r31, 0xFF ; 255 - 41fc: 80 83 st Z, r24 - return true; - 41fe: 81 e0 ldi r24, 0x01 ; 1 - 4200: 08 95 ret - } - - return false; - 4202: 80 e0 ldi r24, 0x00 ; 0 -} - 4204: 08 95 ret - -00004206 : -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); - 4206: 80 91 21 27 lds r24, 0x2721 - 420a: 80 68 ori r24, 0x80 ; 128 - 420c: 49 df rcall .-366 ; 0x40a0 - - return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); - 420e: e0 91 1f 27 lds r30, 0x271F - 4212: f0 91 20 27 lds r31, 0x2720 - 4216: 80 81 ld r24, Z -} - 4218: 86 95 lsr r24 - 421a: 81 70 andi r24, 0x01 ; 1 - 421c: 08 95 ret - -0000421e : -} - -bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, - const uint8_t Config, - const uint8_t Size) -{ - 421e: 1f 93 push r17 - 4220: cf 93 push r28 - 4222: df 93 push r29 - 4224: 00 d0 rcall .+0 ; 0x4226 - 4226: cd b7 in r28, 0x3d ; 61 - 4228: de b7 in r29, 0x3e ; 62 - 422a: 18 2f mov r17, r24 - Endpoint_SelectEndpoint(Address); - 422c: 4a 83 std Y+2, r20 ; 0x02 - 422e: 69 83 std Y+1, r22 ; 0x01 - 4230: 37 df rcall .-402 ; 0x40a0 - - USB_Endpoint_SelectedHandle->CTRL = 0; - 4232: e0 91 1f 27 lds r30, 0x271F - 4236: f0 91 20 27 lds r31, 0x2720 - 423a: 11 82 std Z+1, r1 ; 0x01 - USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 423c: e0 91 1f 27 lds r30, 0x271F - 4240: f0 91 20 27 lds r31, 0x2720 - 4244: 4a 81 ldd r20, Y+2 ; 0x02 - 4246: 69 81 ldd r22, Y+1 ; 0x01 - 4248: 17 fd sbrc r17, 7 - 424a: 22 c0 rjmp .+68 ; 0x4290 - 424c: 10 82 st Z, r1 - USB_Endpoint_SelectedHandle->CTRL = Config; - 424e: e0 91 1f 27 lds r30, 0x271F - 4252: f0 91 20 27 lds r31, 0x2720 - 4256: 61 83 std Z+1, r22 ; 0x01 - USB_Endpoint_SelectedHandle->CNT = 0; - 4258: e0 91 1f 27 lds r30, 0x271F - 425c: f0 91 20 27 lds r31, 0x2720 - 4260: 12 82 std Z+2, r1 ; 0x02 - 4262: 13 82 std Z+3, r1 ; 0x03 - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 4264: 80 91 1d 27 lds r24, 0x271D - 4268: 90 91 1e 27 lds r25, 0x271E - 426c: 84 83 std Z+4, r24 ; 0x04 - 426e: 95 83 std Z+5, r25 ; 0x05 - - USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; - 4270: 40 e0 ldi r20, 0x00 ; 0 - 4272: fc 01 movw r30, r24 - 4274: e0 5c subi r30, 0xC0 ; 192 - 4276: ff 4f sbci r31, 0xFF ; 255 - 4278: 40 83 st Z, r20 - USB_Endpoint_SelectedFIFO->Position = 0; - 427a: fc 01 movw r30, r24 - 427c: ef 5b subi r30, 0xBF ; 191 - 427e: ff 4f sbci r31, 0xFF ; 255 - 4280: 10 82 st Z, r1 - - return true; -} - 4282: 81 e0 ldi r24, 0x01 ; 1 - 4284: 0f 90 pop r0 - 4286: 0f 90 pop r0 - 4288: df 91 pop r29 - 428a: cf 91 pop r28 - 428c: 1f 91 pop r17 - 428e: 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; - 4290: 82 e0 ldi r24, 0x02 ; 2 - 4292: 80 83 st Z, r24 - USB_Endpoint_SelectedHandle->CTRL = Config; - 4294: e0 91 1f 27 lds r30, 0x271F - 4298: f0 91 20 27 lds r31, 0x2720 - 429c: 61 83 std Z+1, r22 ; 0x01 - USB_Endpoint_SelectedHandle->CNT = 0; - 429e: e0 91 1f 27 lds r30, 0x271F - 42a2: f0 91 20 27 lds r31, 0x2720 - 42a6: 12 82 std Z+2, r1 ; 0x02 - 42a8: 13 82 std Z+3, r1 ; 0x03 - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 42aa: 80 91 1d 27 lds r24, 0x271D - 42ae: 90 91 1e 27 lds r25, 0x271E - 42b2: 84 83 std Z+4, r24 ; 0x04 - 42b4: 95 83 std Z+5, r25 ; 0x05 - 42b6: dd cf rjmp .-70 ; 0x4272 - -000042b8 : - } -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - const uint8_t Entries) -{ - 42b8: af 92 push r10 - 42ba: bf 92 push r11 - 42bc: df 92 push r13 - 42be: ef 92 push r14 - 42c0: ff 92 push r15 - 42c2: 0f 93 push r16 - 42c4: 1f 93 push r17 - 42c6: cf 93 push r28 - 42c8: df 93 push r29 - 42ca: 00 d0 rcall .+0 ; 0x42cc - 42cc: cd b7 in r28, 0x3d ; 61 - 42ce: de b7 in r29, 0x3e ; 62 - 42d0: e6 2e mov r14, r22 - for (uint8_t i = 0; i < Entries; i++) - 42d2: 66 23 and r22, r22 - 42d4: 09 f4 brne .+2 ; 0x42d8 - 42d6: 4a c0 rjmp .+148 ; 0x436c - 42d8: 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, - 42da: 8c 01 movw r16, r24 - 42dc: 0c 5f subi r16, 0xFC ; 252 - 42de: 1f 4f sbci r17, 0xFF ; 255 - const uint8_t Entries) -{ - for (uint8_t i = 0; i < Entries; i++) - 42e0: f1 2c mov r15, r1 - { - if (!(Table[i].Address)) - 42e2: d5 01 movw r26, r10 - 42e4: 5c 91 ld r21, X - 42e6: 55 23 and r21, r21 - 42e8: c9 f1 breq .+114 ; 0x435c - continue; - - if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 42ea: d5 01 movw r26, r10 - 42ec: 11 96 adiw r26, 0x01 ; 1 - 42ee: ed 91 ld r30, X+ - 42f0: fc 91 ld r31, X - 42f2: 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, - 42f4: d8 01 movw r26, r16 - 42f6: 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))) - 42f8: 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)); - 42fa: d8 01 movw r26, r16 - 42fc: 8c 91 ld r24, X - 42fe: 82 30 cpi r24, 0x02 ; 2 - 4300: 08 f4 brcc .+2 ; 0x4304 - 4302: 43 c0 rjmp .+134 ; 0x438a - 4304: 98 e1 ldi r25, 0x18 ; 24 - 4306: 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) - 4308: e9 30 cpi r30, 0x09 ; 9 - 430a: f1 05 cpc r31, r1 - 430c: 50 f0 brcs .+20 ; 0x4322 - 430e: 28 e0 ldi r18, 0x08 ; 8 - 4310: 30 e0 ldi r19, 0x00 ; 0 - 4312: 90 e0 ldi r25, 0x00 ; 0 - { - MaskVal++; - 4314: 9f 5f subi r25, 0xFF ; 255 - CheckBytes <<= 1; - 4316: 22 0f add r18, r18 - 4318: 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) - 431a: 2e 17 cp r18, r30 - 431c: 3f 07 cpc r19, r31 - 431e: d0 f3 brcs .-12 ; 0x4314 - 4320: 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) - 4322: 25 2f mov r18, r21 - 4324: 2f 70 andi r18, 0x0F ; 15 - 4326: 30 e0 ldi r19, 0x00 ; 0 - 4328: 26 30 cpi r18, 0x06 ; 6 - 432a: 31 05 cpc r19, r1 - 432c: 64 f5 brge .+88 ; 0x4386 - return false; - - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - if (Size > 64) - 432e: e1 34 cpi r30, 0x41 ; 65 - 4330: f1 05 cpc r31, r1 - 4332: 48 f5 brcc .+82 ; 0x4386 - - if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) - return false; - - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - 4334: 9f 7e andi r25, 0xEF ; 239 - if (Size > 64) - return false; - - switch (Type) - 4336: 41 11 cpse r20, r1 - 4338: 2b c0 rjmp .+86 ; 0x4390 - { - case EP_TYPE_CONTROL: - EPConfigMask |= USB_EP_TYPE_CONTROL_gc; - 433a: 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); - 433c: de 2e mov r13, r30 - 433e: 4e 2f mov r20, r30 - 4340: 69 2f mov r22, r25 - 4342: 85 2f mov r24, r21 - 4344: 80 58 subi r24, 0x80 ; 128 - 4346: 59 83 std Y+1, r21 ; 0x01 - 4348: 9a 83 std Y+2, r25 ; 0x02 - 434a: 69 df rcall .-302 ; 0x421e - 434c: 9a 81 ldd r25, Y+2 ; 0x02 - 434e: 59 81 ldd r21, Y+1 ; 0x01 - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4350: 4d 2d mov r20, r13 - 4352: 69 2f mov r22, r25 - 4354: 85 2f mov r24, r21 - 4356: 63 df rcall .-314 ; 0x421e - 4358: 88 23 and r24, r24 - 435a: a9 f0 breq .+42 ; 0x4386 -} - -bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, - const uint8_t Entries) -{ - for (uint8_t i = 0; i < Entries; i++) - 435c: f3 94 inc r15 - 435e: b5 e0 ldi r27, 0x05 ; 5 - 4360: ab 0e add r10, r27 - 4362: b1 1c adc r11, r1 - 4364: 0b 5f subi r16, 0xFB ; 251 - 4366: 1f 4f sbci r17, 0xFF ; 255 - 4368: fe 10 cpse r15, r14 - 436a: bb cf rjmp .-138 ; 0x42e2 - { - return false; - } - } - - return true; - 436c: 81 e0 ldi r24, 0x01 ; 1 -} - 436e: 0f 90 pop r0 - 4370: 0f 90 pop r0 - 4372: df 91 pop r29 - 4374: cf 91 pop r28 - 4376: 1f 91 pop r17 - 4378: 0f 91 pop r16 - 437a: ff 90 pop r15 - 437c: ef 90 pop r14 - 437e: df 90 pop r13 - 4380: bf 90 pop r11 - 4382: af 90 pop r10 - 4384: 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; - 4386: 80 e0 ldi r24, 0x00 ; 0 - 4388: f2 cf rjmp .-28 ; 0x436e - 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)); - 438a: 98 e0 ldi r25, 0x08 ; 8 - 438c: 88 e0 ldi r24, 0x08 ; 8 - 438e: bc cf rjmp .-136 ; 0x4308 - // TODO - Fix once limitations are lifted - EPConfigMask &= ~USB_EP_PINGPONG_bm; - if (Size > 64) - return false; - - switch (Type) - 4390: 41 30 cpi r20, 0x01 ; 1 - 4392: 29 f0 breq .+10 ; 0x439e - break; - case EP_TYPE_ISOCHRONOUS: - EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; - break; - default: - EPConfigMask |= USB_EP_TYPE_BULK_gc; - 4394: 90 68 ori r25, 0x80 ; 128 - break; - } - - if (Type == EP_TYPE_CONTROL) - 4396: 44 23 and r20, r20 - 4398: 89 f2 breq .-94 ; 0x433c - 439a: de 2e mov r13, r30 - 439c: d9 cf rjmp .-78 ; 0x4350 - { - case EP_TYPE_CONTROL: - EPConfigMask |= USB_EP_TYPE_CONTROL_gc; - break; - case EP_TYPE_ISOCHRONOUS: - EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; - 439e: 90 6c ori r25, 0xC0 ; 192 - 43a0: de 2e mov r13, r30 - 43a2: d6 cf rjmp .-84 ; 0x4350 - -000043a4 : - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 43a4: e0 ec ldi r30, 0xC0 ; 192 - 43a6: f4 e0 ldi r31, 0x04 ; 4 - 43a8: a6 81 ldd r26, Z+6 ; 0x06 - 43aa: b7 81 ldd r27, Z+7 ; 0x07 - 43ac: 19 96 adiw r26, 0x09 ; 9 - 43ae: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43b0: a6 81 ldd r26, Z+6 ; 0x06 - 43b2: b7 81 ldd r27, Z+7 ; 0x07 - 43b4: 11 96 adiw r26, 0x01 ; 1 - 43b6: 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; - 43b8: a6 81 ldd r26, Z+6 ; 0x06 - 43ba: b7 81 ldd r27, Z+7 ; 0x07 - 43bc: 59 96 adiw r26, 0x19 ; 25 - 43be: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43c0: a6 81 ldd r26, Z+6 ; 0x06 - 43c2: b7 81 ldd r27, Z+7 ; 0x07 - 43c4: 51 96 adiw r26, 0x11 ; 17 - 43c6: 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; - 43c8: a6 81 ldd r26, Z+6 ; 0x06 - 43ca: b7 81 ldd r27, Z+7 ; 0x07 - 43cc: 99 96 adiw r26, 0x29 ; 41 - 43ce: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43d0: a6 81 ldd r26, Z+6 ; 0x06 - 43d2: b7 81 ldd r27, Z+7 ; 0x07 - 43d4: 91 96 adiw r26, 0x21 ; 33 - 43d6: 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; - 43d8: a6 81 ldd r26, Z+6 ; 0x06 - 43da: b7 81 ldd r27, Z+7 ; 0x07 - 43dc: d9 96 adiw r26, 0x39 ; 57 - 43de: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43e0: a6 81 ldd r26, Z+6 ; 0x06 - 43e2: b7 81 ldd r27, Z+7 ; 0x07 - 43e4: d1 96 adiw r26, 0x31 ; 49 - 43e6: 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; - 43e8: a6 81 ldd r26, Z+6 ; 0x06 - 43ea: b7 81 ldd r27, Z+7 ; 0x07 - 43ec: a7 5b subi r26, 0xB7 ; 183 - 43ee: bf 4f sbci r27, 0xFF ; 255 - 43f0: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43f2: a6 81 ldd r26, Z+6 ; 0x06 - 43f4: b7 81 ldd r27, Z+7 ; 0x07 - 43f6: af 5b subi r26, 0xBF ; 191 - 43f8: bf 4f sbci r27, 0xFF ; 255 - 43fa: 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; - 43fc: a6 81 ldd r26, Z+6 ; 0x06 - 43fe: b7 81 ldd r27, Z+7 ; 0x07 - 4400: a7 5a subi r26, 0xA7 ; 167 - 4402: bf 4f sbci r27, 0xFF ; 255 - 4404: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 4406: 06 80 ldd r0, Z+6 ; 0x06 - 4408: f7 81 ldd r31, Z+7 ; 0x07 - 440a: e0 2d mov r30, r0 - 440c: ef 5a subi r30, 0xAF ; 175 - 440e: ff 4f sbci r31, 0xFF ; 255 - 4410: 10 82 st Z, r1 - 4412: 08 95 ret - -00004414 : - } -} - -void Endpoint_ClearStatusStage(void) -{ - if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - 4414: 80 91 15 27 lds r24, 0x2715 - 4418: 87 fd sbrc r24, 7 - 441a: 08 c0 rjmp .+16 ; 0x442c - - Endpoint_ClearOUT(); - } - else - { - while (!(Endpoint_IsINReady())) - 441c: f4 de rcall .-536 ; 0x4206 - 441e: 81 11 cpse r24, r1 - 4420: 0d c0 rjmp .+26 ; 0x443c - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 4422: 80 91 14 27 lds r24, 0x2714 - 4426: 81 11 cpse r24, r1 - 4428: f9 cf rjmp .-14 ; 0x441c - 442a: 08 95 ret - -void Endpoint_ClearStatusStage(void) -{ - if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - { - while (!(Endpoint_IsOUTReceived())) - 442c: d3 de rcall .-602 ; 0x41d4 - 442e: 81 11 cpse r24, r1 - 4430: 06 c0 rjmp .+12 ; 0x443e - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 4432: 80 91 14 27 lds r24, 0x2714 - 4436: 81 11 cpse r24, r1 - 4438: f9 cf rjmp .-14 ; 0x442c - 443a: 08 95 ret - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - 443c: eb cd rjmp .-1066 ; 0x4014 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearOUT(); - 443e: 03 ce rjmp .-1018 ; 0x4046 - -00004440 : - } -} - -#if !defined(CONTROL_ONLY_DEVICE) -uint8_t Endpoint_WaitUntilReady(void) -{ - 4440: 1f 93 push r17 - 4442: cf 93 push r28 - 4444: 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; - 4446: e0 91 c6 04 lds r30, 0x04C6 - 444a: f0 91 c7 04 lds r31, 0x04C7 - 444e: e0 5a subi r30, 0xA0 ; 160 - 4450: ff 4f sbci r31, 0xFF ; 255 - 4452: c0 81 ld r28, Z - 4454: d1 81 ldd r29, Z+1 ; 0x01 - #if (USB_STREAM_TIMEOUT_MS < 0xFF) - uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; - 4456: 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); - 4458: 80 91 21 27 lds r24, 0x2721 - 445c: 80 78 andi r24, 0x80 ; 128 - - uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); - - for (;;) - { - if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 445e: 80 38 cpi r24, 0x80 ; 128 - 4460: 31 f1 breq .+76 ; 0x44ae - if (Endpoint_IsINReady()) - return ENDPOINT_READYWAIT_NoError; - } - else - { - if (Endpoint_IsOUTReceived()) - 4462: b8 de rcall .-656 ; 0x41d4 - 4464: 81 11 cpse r24, r1 - 4466: 26 c0 rjmp .+76 ; 0x44b4 - return ENDPOINT_READYWAIT_NoError; - } - - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4468: 80 91 14 27 lds r24, 0x2714 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 446c: 88 23 and r24, r24 - 446e: 39 f1 breq .+78 ; 0x44be - return ENDPOINT_READYWAIT_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 4470: 85 30 cpi r24, 0x05 ; 5 - 4472: 51 f1 breq .+84 ; 0x44c8 - * \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); - 4474: e0 91 1f 27 lds r30, 0x271F - 4478: f0 91 20 27 lds r31, 0x2720 - 447c: 81 81 ldd r24, Z+1 ; 0x01 - return ENDPOINT_READYWAIT_BusSuspended; - else if (Endpoint_IsStalled()) - 447e: 82 fd sbrc r24, 2 - 4480: 28 c0 rjmp .+80 ; 0x44d2 - 4482: e0 91 c6 04 lds r30, 0x04C6 - 4486: f0 91 c7 04 lds r31, 0x04C7 - 448a: e0 5a subi r30, 0xA0 ; 160 - 448c: ff 4f sbci r31, 0xFF ; 255 - 448e: 80 81 ld r24, Z - 4490: 91 81 ldd r25, Z+1 ; 0x01 - return ENDPOINT_READYWAIT_EndpointStalled; - - uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); - - if (CurrentFrameNumber != PreviousFrameNumber) - 4492: c8 17 cp r28, r24 - 4494: d9 07 cpc r29, r25 - 4496: 01 f3 breq .-64 ; 0x4458 - { - PreviousFrameNumber = CurrentFrameNumber; - - if (!(TimeoutMSRem--)) - 4498: 21 2f mov r18, r17 - 449a: 21 50 subi r18, 0x01 ; 1 - 449c: 11 23 and r17, r17 - 449e: f1 f0 breq .+60 ; 0x44dc - 44a0: ec 01 movw r28, r24 - 44a2: 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); - 44a4: 80 91 21 27 lds r24, 0x2721 - 44a8: 80 78 andi r24, 0x80 ; 128 - - uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); - - for (;;) - { - if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 44aa: 80 38 cpi r24, 0x80 ; 128 - 44ac: d1 f6 brne .-76 ; 0x4462 - { - if (Endpoint_IsINReady()) - 44ae: ab de rcall .-682 ; 0x4206 - 44b0: 88 23 and r24, r24 - 44b2: d1 f2 breq .-76 ; 0x4468 - return ENDPOINT_READYWAIT_NoError; - 44b4: 80 e0 ldi r24, 0x00 ; 0 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44b6: df 91 pop r29 - 44b8: cf 91 pop r28 - 44ba: 1f 91 pop r17 - 44bc: 08 95 ret - } - - uint8_t USB_DeviceState_LCL = USB_DeviceState; - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - return ENDPOINT_READYWAIT_DeviceDisconnected; - 44be: 82 e0 ldi r24, 0x02 ; 2 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44c0: df 91 pop r29 - 44c2: cf 91 pop r28 - 44c4: 1f 91 pop r17 - 44c6: 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; - 44c8: 83 e0 ldi r24, 0x03 ; 3 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44ca: df 91 pop r29 - 44cc: cf 91 pop r28 - 44ce: 1f 91 pop r17 - 44d0: 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; - 44d2: 81 e0 ldi r24, 0x01 ; 1 - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - } - } -} - 44d4: df 91 pop r29 - 44d6: cf 91 pop r28 - 44d8: 1f 91 pop r17 - 44da: 08 95 ret - if (CurrentFrameNumber != PreviousFrameNumber) - { - PreviousFrameNumber = CurrentFrameNumber; - - if (!(TimeoutMSRem--)) - return ENDPOINT_READYWAIT_Timeout; - 44dc: 84 e0 ldi r24, 0x04 ; 4 - } - } -} - 44de: df 91 pop r29 - 44e0: cf 91 pop r28 - 44e2: 1f 91 pop r17 - 44e4: 08 95 ret - -000044e6 : - USB_ResetInterface(); -} - -void USB_Disable(void) -{ - USB_INT_DisableAllInterrupts(); - 44e6: 63 d0 rcall .+198 ; 0x45ae - USB_INT_ClearAllInterrupts(); - 44e8: 69 d0 rcall .+210 ; 0x45bc - * 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; - 44ea: e0 ec ldi r30, 0xC0 ; 192 - 44ec: f4 e0 ldi r31, 0x04 ; 4 - 44ee: 81 81 ldd r24, Z+1 ; 0x01 - 44f0: 8e 7f andi r24, 0xFE ; 254 - 44f2: 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; - 44f4: 80 81 ld r24, Z - 44f6: 8f 77 andi r24, 0x7F ; 127 - 44f8: 80 83 st Z, r24 - - USB_Detach(); - USB_Controller_Disable(); - - USB_IsInitialized = false; - 44fa: 10 92 13 27 sts 0x2713, r1 - 44fe: 08 95 ret - -00004500 : -} - -void USB_ResetInterface(void) -{ - 4500: cf 93 push r28 - 4502: 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); - 4504: e0 e4 ldi r30, 0x40 ; 64 - 4506: f0 e0 ldi r31, 0x00 ; 0 - 4508: 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); - 450a: 84 81 ldd r24, Z+4 ; 0x04 - 450c: 81 60 ori r24, 0x01 ; 1 - 450e: 84 83 std Z+4, r24 ; 0x04 - else - CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); - - USB_Device_SetDeviceAddress(0); - - USB_INT_DisableAllInterrupts(); - 4510: 4e d0 rcall .+156 ; 0x45ae - USB_INT_ClearAllInterrupts(); - 4512: 54 d0 rcall .+168 ; 0x45bc - } - - static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; - static inline void USB_Controller_Reset(void) - { - USB.CTRLA &= ~USB_ENABLE_bm; - 4514: c0 ec ldi r28, 0xC0 ; 192 - 4516: d4 e0 ldi r29, 0x04 ; 4 - 4518: 88 81 ld r24, Y - 451a: 8f 77 andi r24, 0x7F ; 127 - 451c: 88 83 st Y, r24 - USB.CTRLA |= USB_ENABLE_bm; - 451e: 88 81 ld r24, Y - 4520: 80 68 ori r24, 0x80 ; 128 - 4522: 88 83 st Y, r24 -} - -#if defined(USB_CAN_BE_DEVICE) -static void USB_Init_Device(void) -{ - USB_DeviceState = DEVICE_STATE_Unattached; - 4524: 10 92 14 27 sts 0x2714, r1 - USB_Device_ConfigurationNumber = 0; - 4528: 10 92 10 27 sts 0x2710, r1 - - #if !defined(NO_DEVICE_REMOTE_WAKEUP) - USB_Device_RemoteWakeupEnabled = false; - 452c: 10 92 12 27 sts 0x2712, r1 - #endif - - #if !defined(NO_DEVICE_SELF_POWER) - USB_Device_CurrentlySelfPowered = false; - 4530: 10 92 11 27 sts 0x2711, r1 - } - - static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; - static inline void USB_Device_SetFullSpeed(void) - { - USB.CTRLA |= USB_SPEED_bm; - 4534: 88 81 ld r24, Y - 4536: 80 64 ori r24, 0x40 ; 64 - 4538: 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); - 453a: 48 e0 ldi r20, 0x08 ; 8 - 453c: 68 e4 ldi r22, 0x48 ; 72 - 453e: 80 e8 ldi r24, 0x80 ; 128 - 4540: 6e de rcall .-804 ; 0x421e - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4542: 48 e0 ldi r20, 0x08 ; 8 - 4544: 68 e4 ldi r22, 0x48 ; 72 - 4546: 80 e0 ldi r24, 0x00 ; 0 - 4548: 6a de rcall .-812 ; 0x421e - static inline void USB_INT_Enable(const uint8_t Interrupt) - { - switch (Interrupt) - { - case USB_INT_BUSEVENTI: - USB.INTCTRLA |= USB_BUSEVIE_bm; - 454a: 88 85 ldd r24, Y+8 ; 0x08 - 454c: 80 64 ori r24, 0x40 ; 64 - 454e: 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; - 4550: 89 81 ldd r24, Y+1 ; 0x01 - 4552: 81 60 ori r24, 0x01 ; 1 - 4554: 89 83 std Y+1, r24 ; 0x01 - USB_INT_DisableAllInterrupts(); - USB_INT_ClearAllInterrupts(); - - USB_Controller_Reset(); - USB_Init_Device(); -} - 4556: df 91 pop r29 - 4558: cf 91 pop r28 - 455a: 08 95 ret - -0000455c : - - #if !defined(USE_STATIC_OPTIONS) - const uint8_t Options - #endif - ) -{ - 455c: cf 93 push r28 - 455e: df 93 push r29 - #if (ARCH == ARCH_AVR8) - return SREG; - #elif (ARCH == ARCH_UC3) - return __builtin_mfsr(AVR32_SR); - #elif (ARCH == ARCH_XMEGA) - return SREG; - 4560: 3f b7 in r19, 0x3f ; 63 - #if (ARCH == ARCH_AVR8) - cli(); - #elif (ARCH == ARCH_UC3) - __builtin_ssrf(AVR32_SR_GM_OFFSET); - #elif (ARCH == ARCH_XMEGA) - cli(); - 4562: f8 94 cli - #endif - - uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); - GlobalInterruptDisable(); - - NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 4564: c0 ec ldi r28, 0xC0 ; 192 - 4566: d1 e0 ldi r29, 0x01 ; 1 - 4568: 22 e0 ldi r18, 0x02 ; 2 - 456a: 2a 87 std Y+10, r18 ; 0x0a - USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); - 456c: ea e1 ldi r30, 0x1A ; 26 - 456e: f0 e0 ldi r31, 0x00 ; 0 - 4570: e4 91 lpm r30, Z - 4572: a0 ec ldi r26, 0xC0 ; 192 - 4574: b4 e0 ldi r27, 0x04 ; 4 - 4576: da 96 adiw r26, 0x3a ; 58 - 4578: ec 93 st X, r30 - 457a: da 97 sbiw r26, 0x3a ; 58 - USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); - 457c: eb e1 ldi r30, 0x1B ; 27 - 457e: f0 e0 ldi r31, 0x00 ; 0 - 4580: e4 91 lpm r30, Z - 4582: db 96 adiw r26, 0x3b ; 59 - 4584: ec 93 st X, r30 - 4586: db 97 sbiw r26, 0x3b ; 59 - NVM.CMD = NVM_CMD_NO_OPERATION_gc; - 4588: 1a 86 std Y+10, r1 ; 0x0a - - /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ - USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0)); - 458a: 8b e3 ldi r24, 0x3B ; 59 - 458c: 9a e2 ldi r25, 0x2A ; 42 - 458e: 8e 7f andi r24, 0xFE ; 254 - 4590: 16 96 adiw r26, 0x06 ; 6 - 4592: 8d 93 st X+, r24 - 4594: 9c 93 st X, r25 - 4596: 17 97 sbiw r26, 0x07 ; 7 - USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); - 4598: 85 e1 ldi r24, 0x15 ; 21 - 459a: 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); - 459c: 18 96 adiw r26, 0x08 ; 8 - 459e: 2c 93 st X, r18 - if (GlobalIntState & AVR32_SR_GM) - __builtin_ssrf(AVR32_SR_GM_OFFSET); - else - __builtin_csrf(AVR32_SR_GM_OFFSET); - #elif (ARCH == ARCH_XMEGA) - SREG = GlobalIntState; - 45a0: 3f bf out 0x3f, r19 ; 63 - - #if defined(USB_CAN_BE_BOTH) - USB_CurrentMode = Mode; - #endif - - USB_IsInitialized = true; - 45a2: 81 e0 ldi r24, 0x01 ; 1 - 45a4: 80 93 13 27 sts 0x2713, r24 - - USB_ResetInterface(); -} - 45a8: df 91 pop r29 - 45aa: cf 91 pop r28 - USB_CurrentMode = Mode; - #endif - - USB_IsInitialized = true; - - USB_ResetInterface(); - 45ac: a9 cf rjmp .-174 ; 0x4500 - -000045ae : -#define __INCLUDE_FROM_USB_DRIVER -#include "../USBInterrupt.h" - -void USB_INT_DisableAllInterrupts(void) -{ - USB.INTCTRLA &= USB_INTLVL_gm; - 45ae: e0 ec ldi r30, 0xC0 ; 192 - 45b0: f4 e0 ldi r31, 0x04 ; 4 - 45b2: 80 85 ldd r24, Z+8 ; 0x08 - 45b4: 83 70 andi r24, 0x03 ; 3 - 45b6: 80 87 std Z+8, r24 ; 0x08 - USB.INTCTRLB = 0; - 45b8: 11 86 std Z+9, r1 ; 0x09 - 45ba: 08 95 ret - -000045bc : -} - -void USB_INT_ClearAllInterrupts(void) -{ - USB.INTFLAGSACLR = 0xFF; - 45bc: e0 ec ldi r30, 0xC0 ; 192 - 45be: f4 e0 ldi r31, 0x04 ; 4 - 45c0: 8f ef ldi r24, 0xFF ; 255 - 45c2: 82 87 std Z+10, r24 ; 0x0a - USB.INTFLAGSBCLR = 0xFF; - 45c4: 84 87 std Z+12, r24 ; 0x0c - 45c6: 08 95 ret - -000045c8 <__vector_125>: -} - -ISR(USB_BUSEVENT_vect) -{ - 45c8: 1f 92 push r1 - 45ca: 0f 92 push r0 - 45cc: 0f b6 in r0, 0x3f ; 63 - 45ce: 0f 92 push r0 - 45d0: 11 24 eor r1, r1 - 45d2: 2f 93 push r18 - 45d4: 3f 93 push r19 - 45d6: 4f 93 push r20 - 45d8: 5f 93 push r21 - 45da: 6f 93 push r22 - 45dc: 7f 93 push r23 - 45de: 8f 93 push r24 - 45e0: 9f 93 push r25 - 45e2: af 93 push r26 - 45e4: bf 93 push r27 - 45e6: ef 93 push r30 - 45e8: 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); - 45ea: 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)) - 45ee: 87 fd sbrc r24, 7 - 45f0: 4d c0 rjmp .+154 ; 0x468c <__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); - 45f2: 80 91 ca 04 lds r24, 0x04CA - - EVENT_USB_Device_StartOfFrame(); - } - #endif - - if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) - 45f6: 86 fd sbrc r24, 6 - 45f8: 41 c0 rjmp .+130 ; 0x467c <__vector_125+0xb4> - case USB_INT_BUSEVENTI_Resume: - return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); - 45fa: 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)) - 45fe: 85 ff sbrs r24, 5 - 4600: 0c c0 rjmp .+24 ; 0x461a <__vector_125+0x52> - { - case USB_INT_BUSEVENTI_Suspend: - USB.INTFLAGSACLR = USB_SUSPENDIF_bm; - break; - case USB_INT_BUSEVENTI_Resume: - USB.INTFLAGSACLR = USB_RESUMEIF_bm; - 4602: 80 e2 ldi r24, 0x20 ; 32 - 4604: 80 93 ca 04 sts 0x04CA, r24 - { - USB_INT_Clear(USB_INT_BUSEVENTI_Resume); - - if (USB_Device_ConfigurationNumber) - 4608: 80 91 10 27 lds r24, 0x2710 - 460c: 88 23 and r24, r24 - 460e: 71 f1 breq .+92 ; 0x466c <__vector_125+0xa4> - USB_DeviceState = DEVICE_STATE_Configured; - 4610: 84 e0 ldi r24, 0x04 ; 4 - 4612: 80 93 14 27 sts 0x2714, r24 - else - USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; - - #if !defined(NO_LIMITED_CONTROLLER_CONNECT) - EVENT_USB_Device_Connect(); - 4616: 0e 94 eb 0c call 0x19d6 ; 0x19d6 - 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); - 461a: 80 91 ca 04 lds r24, 0x04CA - #else - EVENT_USB_Device_WakeUp(); - #endif - } - - if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) - 461e: 84 ff sbrs r24, 4 - 4620: 14 c0 rjmp .+40 ; 0x464a <__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; - 4622: 80 e1 ldi r24, 0x10 ; 16 - 4624: 80 93 ca 04 sts 0x04CA, r24 - { - USB_INT_Clear(USB_INT_BUSEVENTI_Reset); - - USB_DeviceState = DEVICE_STATE_Default; - 4628: 82 e0 ldi r24, 0x02 ; 2 - 462a: 80 93 14 27 sts 0x2714, r24 - USB_Device_ConfigurationNumber = 0; - 462e: 10 92 10 27 sts 0x2710, 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; - 4632: 10 92 c3 04 sts 0x04C3, r1 - - USB_Device_EnableDeviceAddress(0); - - Endpoint_ClearEndpoints(); - 4636: b6 de rcall .-660 ; 0x43a4 - EPConfigMask |= USB_EP_TYPE_BULK_gc; - break; - } - - if (Type == EP_TYPE_CONTROL) - Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 4638: 48 e0 ldi r20, 0x08 ; 8 - 463a: 68 e4 ldi r22, 0x48 ; 72 - 463c: 80 e8 ldi r24, 0x80 ; 128 - 463e: ef dd rcall .-1058 ; 0x421e - - return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4640: 48 e0 ldi r20, 0x08 ; 8 - 4642: 68 e4 ldi r22, 0x48 ; 72 - 4644: 80 e0 ldi r24, 0x00 ; 0 - 4646: eb dd rcall .-1066 ; 0x421e - Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, - USB_Device_ControlEndpointSize, 1); - - EVENT_USB_Device_Reset(); - 4648: 23 db rcall .-2490 ; 0x3c90 - } -} - 464a: ff 91 pop r31 - 464c: ef 91 pop r30 - 464e: bf 91 pop r27 - 4650: af 91 pop r26 - 4652: 9f 91 pop r25 - 4654: 8f 91 pop r24 - 4656: 7f 91 pop r23 - 4658: 6f 91 pop r22 - 465a: 5f 91 pop r21 - 465c: 4f 91 pop r20 - 465e: 3f 91 pop r19 - 4660: 2f 91 pop r18 - 4662: 0f 90 pop r0 - 4664: 0f be out 0x3f, r0 ; 63 - 4666: 0f 90 pop r0 - 4668: 1f 90 pop r1 - 466a: 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); - 466c: 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; - 4670: 81 11 cpse r24, r1 - 4672: 15 c0 rjmp .+42 ; 0x469e <__vector_125+0xd6> - 4674: 81 e0 ldi r24, 0x01 ; 1 - 4676: 80 93 14 27 sts 0x2714, r24 - 467a: cd cf rjmp .-102 ; 0x4616 <__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; - 467c: 80 e4 ldi r24, 0x40 ; 64 - 467e: 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; - 4682: 10 92 14 27 sts 0x2714, r1 - EVENT_USB_Device_Disconnect(); - 4686: 0e 94 f0 0c call 0x19e0 ; 0x19e0 - 468a: b7 cf rjmp .-146 ; 0x45fa <__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); - 468c: 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)) - 4690: 87 ff sbrs r24, 7 - 4692: af cf rjmp .-162 ; 0x45f2 <__vector_125+0x2a> - break; - case USB_INT_BUSEVENTI_Reset: - USB.INTFLAGSACLR = USB_RSTIF_bm; - break; - case USB_INT_SOFI: - USB.INTFLAGSACLR = USB_SOFIF_bm; - 4694: 80 e8 ldi r24, 0x80 ; 128 - 4696: 80 93 ca 04 sts 0x04CA, r24 - { - USB_INT_Clear(USB_INT_SOFI); - - EVENT_USB_Device_StartOfFrame(); - 469a: fa da rcall .-2572 ; 0x3c90 - 469c: aa cf rjmp .-172 ; 0x45f2 <__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; - 469e: 83 e0 ldi r24, 0x03 ; 3 - 46a0: ea cf rjmp .-44 ; 0x4676 <__vector_125+0xae> - -000046a2 : - -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); - 46a2: cf 93 push r28 - 46a4: df 93 push r29 - 46a6: ec 01 movw r28, r24 - 46a8: 40 96 adiw r24, 0x10 ; 16 - 46aa: fc 01 movw r30, r24 - 46ac: 8b e0 ldi r24, 0x0B ; 11 - 46ae: df 01 movw r26, r30 - 46b0: 1d 92 st X+, r1 - 46b2: 8a 95 dec r24 - 46b4: e9 f7 brne .-6 ; 0x46b0 - 46b6: 82 e0 ldi r24, 0x02 ; 2 - 46b8: 8c 83 std Y+4, r24 ; 0x04 - 46ba: 89 87 std Y+9, r24 ; 0x09 - 46bc: 83 e0 ldi r24, 0x03 ; 3 - 46be: 8e 87 std Y+14, r24 ; 0x0e - 46c0: 61 e0 ldi r22, 0x01 ; 1 - 46c2: ce 01 movw r24, r28 - 46c4: 01 96 adiw r24, 0x01 ; 1 - 46c6: f8 dd rcall .-1040 ; 0x42b8 - 46c8: 81 11 cpse r24, r1 - 46ca: 04 c0 rjmp .+8 ; 0x46d4 - 46cc: 80 e0 ldi r24, 0x00 ; 0 - 46ce: df 91 pop r29 - 46d0: cf 91 pop r28 - 46d2: 08 95 ret - 46d4: 61 e0 ldi r22, 0x01 ; 1 - 46d6: ce 01 movw r24, r28 - 46d8: 06 96 adiw r24, 0x06 ; 6 - 46da: ee dd rcall .-1060 ; 0x42b8 - 46dc: 88 23 and r24, r24 - 46de: b1 f3 breq .-20 ; 0x46cc - 46e0: 61 e0 ldi r22, 0x01 ; 1 - 46e2: ce 01 movw r24, r28 - 46e4: 0b 96 adiw r24, 0x0b ; 11 - 46e6: df 91 pop r29 - 46e8: cf 91 pop r28 - 46ea: e6 cd rjmp .-1076 ; 0x42b8 - -000046ec : - 46ec: cf 93 push r28 - 46ee: df 93 push r29 - 46f0: d6 2f mov r29, r22 - 46f2: c7 2f mov r28, r23 - 46f4: 20 91 14 27 lds r18, 0x2714 - 46f8: 24 30 cpi r18, 0x04 ; 4 - 46fa: 21 f0 breq .+8 ; 0x4704 - 46fc: 82 e0 ldi r24, 0x02 ; 2 - 46fe: df 91 pop r29 - 4700: cf 91 pop r28 - 4702: 08 95 ret - 4704: fc 01 movw r30, r24 - 4706: 44 89 ldd r20, Z+20 ; 0x14 - 4708: 55 89 ldd r21, Z+21 ; 0x15 - 470a: 66 89 ldd r22, Z+22 ; 0x16 - 470c: 77 89 ldd r23, Z+23 ; 0x17 - 470e: 45 2b or r20, r21 - 4710: 46 2b or r20, r22 - 4712: 47 2b or r20, r23 - 4714: 99 f3 breq .-26 ; 0x46fc - 4716: 81 81 ldd r24, Z+1 ; 0x01 - 4718: c3 dc rcall .-1658 ; 0x40a0 - 471a: ad 2f mov r26, r29 - 471c: bc 2f mov r27, r28 - 471e: fd 01 movw r30, r26 - 4720: 01 90 ld r0, Z+ - 4722: 00 20 and r0, r0 - 4724: e9 f7 brne .-6 ; 0x4720 - 4726: bf 01 movw r22, r30 - 4728: 61 50 subi r22, 0x01 ; 1 - 472a: 71 09 sbc r23, r1 - 472c: 6a 1b sub r22, r26 - 472e: 7b 0b sbc r23, r27 - 4730: 40 e0 ldi r20, 0x00 ; 0 - 4732: 50 e0 ldi r21, 0x00 ; 0 - 4734: 8d 2f mov r24, r29 - 4736: 9c 2f mov r25, r28 - 4738: df 91 pop r29 - 473a: cf 91 pop r28 - 473c: bf ca rjmp .-2690 ; 0x3cbc - -0000473e : - 473e: ef 92 push r14 - 4740: ff 92 push r15 - 4742: 0f 93 push r16 - 4744: 1f 93 push r17 - 4746: cf 93 push r28 - 4748: df 93 push r29 - 474a: eb 01 movw r28, r22 - 474c: 7a 01 movw r14, r20 - 474e: 20 91 14 27 lds r18, 0x2714 - 4752: 24 30 cpi r18, 0x04 ; 4 - 4754: 41 f0 breq .+16 ; 0x4766 - 4756: 82 e0 ldi r24, 0x02 ; 2 - 4758: df 91 pop r29 - 475a: cf 91 pop r28 - 475c: 1f 91 pop r17 - 475e: 0f 91 pop r16 - 4760: ff 90 pop r15 - 4762: ef 90 pop r14 - 4764: 08 95 ret - 4766: fc 01 movw r30, r24 - 4768: 04 89 ldd r16, Z+20 ; 0x14 - 476a: 15 89 ldd r17, Z+21 ; 0x15 - 476c: 26 89 ldd r18, Z+22 ; 0x16 - 476e: 37 89 ldd r19, Z+23 ; 0x17 - 4770: 01 2b or r16, r17 - 4772: 02 2b or r16, r18 - 4774: 03 2b or r16, r19 - 4776: 79 f3 breq .-34 ; 0x4756 - 4778: 81 81 ldd r24, Z+1 ; 0x01 - 477a: 92 dc rcall .-1756 ; 0x40a0 - 477c: 40 e0 ldi r20, 0x00 ; 0 - 477e: 50 e0 ldi r21, 0x00 ; 0 - 4780: b7 01 movw r22, r14 - 4782: ce 01 movw r24, r28 - 4784: df 91 pop r29 - 4786: cf 91 pop r28 - 4788: 1f 91 pop r17 - 478a: 0f 91 pop r16 - 478c: ff 90 pop r15 - 478e: ef 90 pop r14 - 4790: 95 ca rjmp .-2774 ; 0x3cbc - -00004792 : - 4792: 0f 93 push r16 - 4794: 1f 93 push r17 - 4796: cf 93 push r28 - 4798: df 93 push r29 - 479a: 1f 92 push r1 - 479c: cd b7 in r28, 0x3d ; 61 - 479e: de b7 in r29, 0x3e ; 62 - 47a0: 20 91 14 27 lds r18, 0x2714 - 47a4: 24 30 cpi r18, 0x04 ; 4 - 47a6: 39 f0 breq .+14 ; 0x47b6 - 47a8: 82 e0 ldi r24, 0x02 ; 2 - 47aa: 0f 90 pop r0 - 47ac: df 91 pop r29 - 47ae: cf 91 pop r28 - 47b0: 1f 91 pop r17 - 47b2: 0f 91 pop r16 - 47b4: 08 95 ret - 47b6: fc 01 movw r30, r24 - 47b8: 04 89 ldd r16, Z+20 ; 0x14 - 47ba: 15 89 ldd r17, Z+21 ; 0x15 - 47bc: 26 89 ldd r18, Z+22 ; 0x16 - 47be: 37 89 ldd r19, Z+23 ; 0x17 - 47c0: 01 2b or r16, r17 - 47c2: 02 2b or r16, r18 - 47c4: 03 2b or r16, r19 - 47c6: 81 f3 breq .-32 ; 0x47a8 - 47c8: 81 81 ldd r24, Z+1 ; 0x01 - 47ca: 69 83 std Y+1, r22 ; 0x01 - 47cc: 69 dc rcall .-1838 ; 0x40a0 - 47ce: 20 91 1d 27 lds r18, 0x271D - 47d2: 30 91 1e 27 lds r19, 0x271E - 47d6: f9 01 movw r30, r18 - 47d8: ef 5b subi r30, 0xBF ; 191 - 47da: ff 4f sbci r31, 0xFF ; 255 - 47dc: 90 81 ld r25, Z - 47de: f9 01 movw r30, r18 - 47e0: e0 5c subi r30, 0xC0 ; 192 - 47e2: ff 4f sbci r31, 0xFF ; 255 - 47e4: 80 81 ld r24, Z - 47e6: 69 81 ldd r22, Y+1 ; 0x01 - 47e8: 98 17 cp r25, r24 - 47ea: 30 f0 brcs .+12 ; 0x47f8 - 47ec: 69 83 std Y+1, r22 ; 0x01 - 47ee: 12 dc rcall .-2012 ; 0x4014 - 47f0: 27 de rcall .-946 ; 0x4440 - 47f2: 69 81 ldd r22, Y+1 ; 0x01 - 47f4: 81 11 cpse r24, r1 - 47f6: d9 cf rjmp .-78 ; 0x47aa - 47f8: 86 2f mov r24, r22 - 47fa: 43 dc rcall .-1914 ; 0x4082 - 47fc: 80 e0 ldi r24, 0x00 ; 0 - 47fe: d5 cf rjmp .-86 ; 0x47aa - -00004800 : - 4800: 0f 93 push r16 - 4802: 1f 93 push r17 - 4804: cf 93 push r28 - 4806: df 93 push r29 - 4808: 1f 92 push r1 - 480a: cd b7 in r28, 0x3d ; 61 - 480c: de b7 in r29, 0x3e ; 62 - 480e: 20 91 14 27 lds r18, 0x2714 - 4812: 24 30 cpi r18, 0x04 ; 4 - 4814: 39 f0 breq .+14 ; 0x4824 - 4816: 82 e0 ldi r24, 0x02 ; 2 - 4818: 0f 90 pop r0 - 481a: df 91 pop r29 - 481c: cf 91 pop r28 - 481e: 1f 91 pop r17 - 4820: 0f 91 pop r16 - 4822: 08 95 ret - 4824: fc 01 movw r30, r24 - 4826: 44 89 ldd r20, Z+20 ; 0x14 - 4828: 55 89 ldd r21, Z+21 ; 0x15 - 482a: 66 89 ldd r22, Z+22 ; 0x16 - 482c: 77 89 ldd r23, Z+23 ; 0x17 - 482e: 45 2b or r20, r21 - 4830: 46 2b or r20, r22 - 4832: 47 2b or r20, r23 - 4834: 81 f3 breq .-32 ; 0x4816 - 4836: 81 81 ldd r24, Z+1 ; 0x01 - 4838: 33 dc rcall .-1946 ; 0x40a0 - 483a: 80 91 21 27 lds r24, 0x2721 - 483e: 20 91 1d 27 lds r18, 0x271D - 4842: 30 91 1e 27 lds r19, 0x271E - 4846: f9 01 movw r30, r18 - 4848: 87 fd sbrc r24, 7 - 484a: 1d c0 rjmp .+58 ; 0x4886 - 484c: e0 5c subi r30, 0xC0 ; 192 - 484e: ff 4f sbci r31, 0xFF ; 255 - 4850: 80 81 ld r24, Z - 4852: f9 01 movw r30, r18 - 4854: ef 5b subi r30, 0xBF ; 191 - 4856: ff 4f sbci r31, 0xFF ; 255 - 4858: 40 81 ld r20, Z - 485a: 90 e0 ldi r25, 0x00 ; 0 - 485c: 84 1b sub r24, r20 - 485e: 91 09 sbc r25, r1 - 4860: 89 2b or r24, r25 - 4862: 11 f4 brne .+4 ; 0x4868 - 4864: 80 e0 ldi r24, 0x00 ; 0 - 4866: d8 cf rjmp .-80 ; 0x4818 - 4868: 00 81 ld r16, Z - 486a: f9 01 movw r30, r18 - 486c: e0 5c subi r30, 0xC0 ; 192 - 486e: ff 4f sbci r31, 0xFF ; 255 - 4870: 10 81 ld r17, Z - 4872: d0 db rcall .-2144 ; 0x4014 - 4874: 01 17 cp r16, r17 - 4876: b0 f3 brcs .-20 ; 0x4864 - 4878: e3 dd rcall .-1082 ; 0x4440 - 487a: 81 11 cpse r24, r1 - 487c: cd cf rjmp .-102 ; 0x4818 - 487e: 89 83 std Y+1, r24 ; 0x01 - 4880: c9 db rcall .-2158 ; 0x4014 - 4882: 89 81 ldd r24, Y+1 ; 0x01 - 4884: c9 cf rjmp .-110 ; 0x4818 - 4886: ef 5b subi r30, 0xBF ; 191 - 4888: ff 4f sbci r31, 0xFF ; 255 - 488a: 80 81 ld r24, Z - 488c: 90 e0 ldi r25, 0x00 ; 0 - 488e: e8 cf rjmp .-48 ; 0x4860 - -00004890 : - 4890: cf 93 push r28 - 4892: df 93 push r29 - 4894: ec 01 movw r28, r24 - 4896: 80 91 14 27 lds r24, 0x2714 - 489a: 84 30 cpi r24, 0x04 ; 4 - 489c: 19 f0 breq .+6 ; 0x48a4 - 489e: df 91 pop r29 - 48a0: cf 91 pop r28 - 48a2: 08 95 ret - 48a4: 4c 89 ldd r20, Y+20 ; 0x14 - 48a6: 5d 89 ldd r21, Y+21 ; 0x15 - 48a8: 6e 89 ldd r22, Y+22 ; 0x16 - 48aa: 7f 89 ldd r23, Y+23 ; 0x17 - 48ac: 45 2b or r20, r21 - 48ae: 46 2b or r20, r22 - 48b0: 47 2b or r20, r23 - 48b2: a9 f3 breq .-22 ; 0x489e - 48b4: 89 81 ldd r24, Y+1 ; 0x01 - 48b6: f4 db rcall .-2072 ; 0x40a0 - 48b8: a6 dc rcall .-1716 ; 0x4206 - 48ba: 88 23 and r24, r24 - 48bc: 81 f3 breq .-32 ; 0x489e - 48be: ce 01 movw r24, r28 - 48c0: df 91 pop r29 - 48c2: cf 91 pop r28 - 48c4: 9d cf rjmp .-198 ; 0x4800 - -000048c6 : - 48c6: cf 93 push r28 - 48c8: df 93 push r29 - 48ca: 20 91 14 27 lds r18, 0x2714 - 48ce: 24 30 cpi r18, 0x04 ; 4 - 48d0: c1 f5 brne .+112 ; 0x4942 - 48d2: fc 01 movw r30, r24 - 48d4: 44 89 ldd r20, Z+20 ; 0x14 - 48d6: 55 89 ldd r21, Z+21 ; 0x15 - 48d8: 66 89 ldd r22, Z+22 ; 0x16 - 48da: 77 89 ldd r23, Z+23 ; 0x17 - 48dc: 45 2b or r20, r21 - 48de: 46 2b or r20, r22 - 48e0: 47 2b or r20, r23 - 48e2: 79 f1 breq .+94 ; 0x4942 - 48e4: 86 81 ldd r24, Z+6 ; 0x06 - 48e6: dc db rcall .-2120 ; 0x40a0 - 48e8: 75 dc rcall .-1814 ; 0x41d4 - 48ea: 88 23 and r24, r24 - 48ec: 51 f1 breq .+84 ; 0x4942 - 48ee: 80 91 21 27 lds r24, 0x2721 - 48f2: 87 fd sbrc r24, 7 - 48f4: 3d c0 rjmp .+122 ; 0x4970 - 48f6: 80 91 1d 27 lds r24, 0x271D - 48fa: 90 91 1e 27 lds r25, 0x271E - 48fe: fc 01 movw r30, r24 - 4900: e0 5c subi r30, 0xC0 ; 192 - 4902: ff 4f sbci r31, 0xFF ; 255 - 4904: 20 81 ld r18, Z - 4906: fc 01 movw r30, r24 - 4908: ef 5b subi r30, 0xBF ; 191 - 490a: ff 4f sbci r31, 0xFF ; 255 - 490c: 40 81 ld r20, Z - 490e: 30 e0 ldi r19, 0x00 ; 0 - 4910: 24 1b sub r18, r20 - 4912: 31 09 sbc r19, r1 - 4914: 23 2b or r18, r19 - 4916: d9 f4 brne .+54 ; 0x494e - 4918: cf ef ldi r28, 0xFF ; 255 - 491a: df ef ldi r29, 0xFF ; 255 - 491c: 20 91 21 27 lds r18, 0x2721 - 4920: 27 fd sbrc r18, 7 - 4922: 23 c0 rjmp .+70 ; 0x496a - 4924: dc 01 movw r26, r24 - 4926: a0 5c subi r26, 0xC0 ; 192 - 4928: bf 4f sbci r27, 0xFF ; 255 - 492a: 8c 91 ld r24, X - 492c: 20 81 ld r18, Z - 492e: 90 e0 ldi r25, 0x00 ; 0 - 4930: 82 1b sub r24, r18 - 4932: 91 09 sbc r25, r1 - 4934: 89 2b or r24, r25 - 4936: 39 f4 brne .+14 ; 0x4946 - 4938: 86 db rcall .-2292 ; 0x4046 - 493a: ce 01 movw r24, r28 - 493c: df 91 pop r29 - 493e: cf 91 pop r28 - 4940: 08 95 ret - 4942: cf ef ldi r28, 0xFF ; 255 - 4944: df ef ldi r29, 0xFF ; 255 - 4946: ce 01 movw r24, r28 - 4948: df 91 pop r29 - 494a: cf 91 pop r28 - 494c: 08 95 ret - 494e: 8a db rcall .-2284 ; 0x4064 - 4950: c8 2f mov r28, r24 - 4952: d0 e0 ldi r29, 0x00 ; 0 - 4954: 80 91 1d 27 lds r24, 0x271D - 4958: 90 91 1e 27 lds r25, 0x271E - 495c: fc 01 movw r30, r24 - 495e: ef 5b subi r30, 0xBF ; 191 - 4960: ff 4f sbci r31, 0xFF ; 255 - 4962: 20 91 21 27 lds r18, 0x2721 - 4966: 27 ff sbrs r18, 7 - 4968: dd cf rjmp .-70 ; 0x4924 - 496a: 80 81 ld r24, Z - 496c: 90 e0 ldi r25, 0x00 ; 0 - 496e: e2 cf rjmp .-60 ; 0x4934 - 4970: 80 91 1d 27 lds r24, 0x271D - 4974: 90 91 1e 27 lds r25, 0x271E - 4978: fc 01 movw r30, r24 - 497a: ef 5b subi r30, 0xBF ; 191 - 497c: ff 4f sbci r31, 0xFF ; 255 - 497e: 20 81 ld r18, Z - 4980: 30 e0 ldi r19, 0x00 ; 0 - 4982: c8 cf rjmp .-112 ; 0x4914 - -00004984 : - return ReceivedByte; -} -#endif - -void CDC_Device_Event_Stub(void) -{ - 4984: 08 95 ret - -00004986 : -#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) -{ - 4986: ff 92 push r15 - 4988: 0f 93 push r16 - 498a: 1f 93 push r17 - 498c: cf 93 push r28 - 498e: df 93 push r29 - 4990: ec 01 movw r28, r24 - if (!(Endpoint_IsSETUPReceived())) - 4992: 07 dc rcall .-2034 ; 0x41a2 - 4994: 88 23 and r24, r24 - 4996: 49 f0 breq .+18 ; 0x49aa - return; - - if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 4998: 88 81 ld r24, Y - 499a: 90 e0 ldi r25, 0x00 ; 0 - 499c: 20 91 19 27 lds r18, 0x2719 - 49a0: 30 91 1a 27 lds r19, 0x271A - 49a4: 28 17 cp r18, r24 - 49a6: 39 07 cpc r19, r25 - 49a8: 31 f0 breq .+12 ; 0x49b6 - EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - } - - break; - } -} - 49aa: df 91 pop r29 - 49ac: cf 91 pop r28 - 49ae: 1f 91 pop r17 - 49b0: 0f 91 pop r16 - 49b2: ff 90 pop r15 - 49b4: 08 95 ret - return; - - if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - return; - - switch (USB_ControlRequest.bRequest) - 49b6: 80 91 16 27 lds r24, 0x2716 - 49ba: 81 32 cpi r24, 0x21 ; 33 - 49bc: 09 f4 brne .+2 ; 0x49c0 - 49be: 4b c0 rjmp .+150 ; 0x4a56 - 49c0: 08 f0 brcs .+2 ; 0x49c4 - 49c2: 33 c0 rjmp .+102 ; 0x4a2a - 49c4: 80 32 cpi r24, 0x20 ; 32 - 49c6: 89 f7 brne .-30 ; 0x49aa - Endpoint_ClearStatusStage(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 49c8: 80 91 15 27 lds r24, 0x2715 - 49cc: 81 32 cpi r24, 0x21 ; 33 - 49ce: 69 f7 brne .-38 ; 0x49aa - { - Endpoint_ClearSETUP(); - 49d0: bc db rcall .-2184 ; 0x414a - - while (!(Endpoint_IsOUTReceived())) - 49d2: 04 c0 rjmp .+8 ; 0x49dc - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - 49d4: 80 91 14 27 lds r24, 0x2714 - 49d8: 88 23 and r24, r24 - 49da: 39 f3 breq .-50 ; 0x49aa - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - while (!(Endpoint_IsOUTReceived())) - 49dc: fb db rcall .-2058 ; 0x41d4 - 49de: 88 23 and r24, r24 - 49e0: c9 f3 breq .-14 ; 0x49d4 - * \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(); - 49e2: 40 db rcall .-2432 ; 0x4064 - 49e4: 08 2f mov r16, r24 - uint32_t Byte1 = Endpoint_Read_8(); - 49e6: 3e db rcall .-2436 ; 0x4064 - 49e8: 18 2f mov r17, r24 - uint32_t Byte2 = Endpoint_Read_8(); - 49ea: 3c db rcall .-2440 ; 0x4064 - 49ec: f8 2e mov r15, r24 - uint32_t Byte3 = Endpoint_Read_8(); - 49ee: 3a db rcall .-2444 ; 0x4064 - 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(); - 49f0: 4f 2d mov r20, r15 - 49f2: 50 e0 ldi r21, 0x00 ; 0 - 49f4: 60 e0 ldi r22, 0x00 ; 0 - 49f6: 70 e0 ldi r23, 0x00 ; 0 - uint32_t Byte3 = Endpoint_Read_8(); - - return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 49f8: ba 01 movw r22, r20 - 49fa: 55 27 eor r21, r21 - 49fc: 44 27 eor r20, r20 - 49fe: 78 2b or r23, r24 - 4a00: 40 2b or r20, r16 - 4a02: 51 2b or r21, r17 - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 4a04: 4c 8b std Y+20, r20 ; 0x14 - 4a06: 5d 8b std Y+21, r21 ; 0x15 - 4a08: 6e 8b std Y+22, r22 ; 0x16 - 4a0a: 7f 8b std Y+23, r23 ; 0x17 - CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 4a0c: 2b db rcall .-2474 ; 0x4064 - 4a0e: 88 8f std Y+24, r24 ; 0x18 - CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 4a10: 29 db rcall .-2478 ; 0x4064 - 4a12: 89 8f std Y+25, r24 ; 0x19 - CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 4a14: 27 db rcall .-2482 ; 0x4064 - 4a16: 8a 8f std Y+26, r24 ; 0x1a - - Endpoint_ClearOUT(); - 4a18: 16 db rcall .-2516 ; 0x4046 - Endpoint_ClearStatusStage(); - 4a1a: fc dc rcall .-1544 ; 0x4414 - - EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 4a1c: ce 01 movw r24, r28 - EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - } - - break; - } -} - 4a1e: df 91 pop r29 - 4a20: cf 91 pop r28 - 4a22: 1f 91 pop r17 - 4a24: 0f 91 pop r16 - 4a26: ff 90 pop r15 - CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - - Endpoint_ClearOUT(); - Endpoint_ClearStatusStage(); - - EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 4a28: ad cf rjmp .-166 ; 0x4984 - return; - - if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - return; - - switch (USB_ControlRequest.bRequest) - 4a2a: 82 32 cpi r24, 0x22 ; 34 - 4a2c: 09 f4 brne .+2 ; 0x4a30 - 4a2e: 34 c0 rjmp .+104 ; 0x4a98 - 4a30: 83 32 cpi r24, 0x23 ; 35 - 4a32: 09 f0 breq .+2 ; 0x4a36 - 4a34: ba cf rjmp .-140 ; 0x49aa - EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - } - - break; - case CDC_REQ_SendBreak: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 4a36: 80 91 15 27 lds r24, 0x2715 - 4a3a: 81 32 cpi r24, 0x21 ; 33 - 4a3c: 09 f0 breq .+2 ; 0x4a40 - 4a3e: b5 cf rjmp .-150 ; 0x49aa - { - Endpoint_ClearSETUP(); - 4a40: 84 db rcall .-2296 ; 0x414a - Endpoint_ClearStatusStage(); - 4a42: e8 dc rcall .-1584 ; 0x4414 - - EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 4a44: 60 91 17 27 lds r22, 0x2717 - 4a48: ce 01 movw r24, r28 - } - - break; - } -} - 4a4a: df 91 pop r29 - 4a4c: cf 91 pop r28 - 4a4e: 1f 91 pop r17 - 4a50: 0f 91 pop r16 - 4a52: 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); - 4a54: 97 cf rjmp .-210 ; 0x4984 - return; - - switch (USB_ControlRequest.bRequest) - { - case CDC_REQ_GetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 4a56: 80 91 15 27 lds r24, 0x2715 - 4a5a: 81 3a cpi r24, 0xA1 ; 161 - 4a5c: 09 f0 breq .+2 ; 0x4a60 - 4a5e: a5 cf rjmp .-182 ; 0x49aa - { - Endpoint_ClearSETUP(); - 4a60: 74 db rcall .-2328 ; 0x414a - - while (!(Endpoint_IsINReady())); - 4a62: d1 db rcall .-2142 ; 0x4206 - 4a64: 88 23 and r24, r24 - 4a66: e9 f3 breq .-6 ; 0x4a62 - - Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 4a68: 8c 89 ldd r24, Y+20 ; 0x14 - 4a6a: fd 88 ldd r15, Y+21 ; 0x15 - 4a6c: 0e 89 ldd r16, Y+22 ; 0x16 - 4a6e: 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); - 4a70: 08 db rcall .-2544 ; 0x4082 - Endpoint_Write_8(Data >> 8); - 4a72: 8f 2d mov r24, r15 - 4a74: 06 db rcall .-2548 ; 0x4082 - Endpoint_Write_8(Data >> 16); - 4a76: 80 2f mov r24, r16 - 4a78: 04 db rcall .-2552 ; 0x4082 - Endpoint_Write_8(Data >> 24); - 4a7a: 81 2f mov r24, r17 - 4a7c: 02 db rcall .-2556 ; 0x4082 - Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 4a7e: 88 8d ldd r24, Y+24 ; 0x18 - 4a80: 00 db rcall .-2560 ; 0x4082 - Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 4a82: 89 8d ldd r24, Y+25 ; 0x19 - 4a84: fe da rcall .-2564 ; 0x4082 - Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 4a86: 8a 8d ldd r24, Y+26 ; 0x1a - 4a88: fc da rcall .-2568 ; 0x4082 - - Endpoint_ClearIN(); - 4a8a: c4 da rcall .-2680 ; 0x4014 - EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - } - - break; - } -} - 4a8c: df 91 pop r29 - 4a8e: cf 91 pop r28 - 4a90: 1f 91 pop r17 - 4a92: 0f 91 pop r16 - 4a94: 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(); - 4a96: be cc rjmp .-1668 ; 0x4414 - EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - } - - break; - case CDC_REQ_SetControlLineState: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 4a98: 80 91 15 27 lds r24, 0x2715 - 4a9c: 81 32 cpi r24, 0x21 ; 33 - 4a9e: 09 f0 breq .+2 ; 0x4aa2 - 4aa0: 84 cf rjmp .-248 ; 0x49aa - { - Endpoint_ClearSETUP(); - 4aa2: 53 db rcall .-2394 ; 0x414a - Endpoint_ClearStatusStage(); - 4aa4: b7 dc rcall .-1682 ; 0x4414 - - CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 4aa6: 80 91 17 27 lds r24, 0x2717 - 4aaa: 90 91 18 27 lds r25, 0x2718 - 4aae: 88 8b std Y+16, r24 ; 0x10 - 4ab0: 99 8b std Y+17, r25 ; 0x11 - - EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 4ab2: ce 01 movw r24, r28 - EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - } - - break; - } -} - 4ab4: df 91 pop r29 - 4ab6: cf 91 pop r28 - 4ab8: 1f 91 pop r17 - 4aba: 0f 91 pop r16 - 4abc: ff 90 pop r15 - Endpoint_ClearSETUP(); - Endpoint_ClearStatusStage(); - - CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - - EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 4abe: 62 cf rjmp .-316 ; 0x4984 - -00004ac0 <__mulshisi3>: - 4ac0: b7 ff sbrs r27, 7 - 4ac2: 04 c0 rjmp .+8 ; 0x4acc <__muluhisi3> - -00004ac4 <__mulohisi3>: - 4ac4: 03 d0 rcall .+6 ; 0x4acc <__muluhisi3> - 4ac6: 82 1b sub r24, r18 - 4ac8: 93 0b sbc r25, r19 - 4aca: 08 95 ret - -00004acc <__muluhisi3>: - 4acc: 09 d0 rcall .+18 ; 0x4ae0 <__umulhisi3> - 4ace: a5 9f mul r26, r21 - 4ad0: 90 0d add r25, r0 - 4ad2: b4 9f mul r27, r20 - 4ad4: 90 0d add r25, r0 - 4ad6: a4 9f mul r26, r20 - 4ad8: 80 0d add r24, r0 - 4ada: 91 1d adc r25, r1 - 4adc: 11 24 eor r1, r1 - 4ade: 08 95 ret - -00004ae0 <__umulhisi3>: - 4ae0: a2 9f mul r26, r18 - 4ae2: b0 01 movw r22, r0 - 4ae4: b3 9f mul r27, r19 - 4ae6: c0 01 movw r24, r0 - 4ae8: a3 9f mul r26, r19 - 4aea: 01 d0 rcall .+2 ; 0x4aee <__umulhisi3+0xe> - 4aec: b2 9f mul r27, r18 - 4aee: 70 0d add r23, r0 - 4af0: 81 1d adc r24, r1 - 4af2: 11 24 eor r1, r1 - 4af4: 91 1d adc r25, r1 - 4af6: 08 95 ret - -00004af8 : - 4af8: 8f 92 push r8 - 4afa: 9f 92 push r9 - 4afc: af 92 push r10 - 4afe: bf 92 push r11 - 4b00: cf 92 push r12 - 4b02: df 92 push r13 - 4b04: ef 92 push r14 - 4b06: ff 92 push r15 - 4b08: cf 93 push r28 - 4b0a: df 93 push r29 - 4b0c: ec 01 movw r28, r24 - 4b0e: 68 81 ld r22, Y - 4b10: 79 81 ldd r23, Y+1 ; 0x01 - 4b12: 8a 81 ldd r24, Y+2 ; 0x02 - 4b14: 9b 81 ldd r25, Y+3 ; 0x03 - 4b16: 61 15 cp r22, r1 - 4b18: 71 05 cpc r23, r1 - 4b1a: 81 05 cpc r24, r1 - 4b1c: 91 05 cpc r25, r1 - 4b1e: 21 f4 brne .+8 ; 0x4b28 - 4b20: 64 e2 ldi r22, 0x24 ; 36 - 4b22: 79 ed ldi r23, 0xD9 ; 217 - 4b24: 8b e5 ldi r24, 0x5B ; 91 - 4b26: 97 e0 ldi r25, 0x07 ; 7 - 4b28: 2d e1 ldi r18, 0x1D ; 29 - 4b2a: 33 ef ldi r19, 0xF3 ; 243 - 4b2c: 41 e0 ldi r20, 0x01 ; 1 - 4b2e: 50 e0 ldi r21, 0x00 ; 0 - 4b30: 38 d3 rcall .+1648 ; 0x51a2 <__divmodsi4> - 4b32: 49 01 movw r8, r18 - 4b34: 5a 01 movw r10, r20 - 4b36: 9b 01 movw r18, r22 - 4b38: ac 01 movw r20, r24 - 4b3a: a7 ea ldi r26, 0xA7 ; 167 - 4b3c: b1 e4 ldi r27, 0x41 ; 65 - 4b3e: c6 df rcall .-116 ; 0x4acc <__muluhisi3> - 4b40: 6b 01 movw r12, r22 - 4b42: 7c 01 movw r14, r24 - 4b44: ac ee ldi r26, 0xEC ; 236 - 4b46: b4 ef ldi r27, 0xF4 ; 244 - 4b48: a5 01 movw r20, r10 - 4b4a: 94 01 movw r18, r8 - 4b4c: bb df rcall .-138 ; 0x4ac4 <__mulohisi3> - 4b4e: c6 0e add r12, r22 - 4b50: d7 1e adc r13, r23 - 4b52: e8 1e adc r14, r24 - 4b54: f9 1e adc r15, r25 - 4b56: f7 fe sbrs r15, 7 - 4b58: 06 c0 rjmp .+12 ; 0x4b66 - 4b5a: 81 e0 ldi r24, 0x01 ; 1 - 4b5c: c8 1a sub r12, r24 - 4b5e: d1 08 sbc r13, r1 - 4b60: e1 08 sbc r14, r1 - 4b62: 80 e8 ldi r24, 0x80 ; 128 - 4b64: f8 0a sbc r15, r24 - 4b66: c8 82 st Y, r12 - 4b68: d9 82 std Y+1, r13 ; 0x01 - 4b6a: ea 82 std Y+2, r14 ; 0x02 - 4b6c: fb 82 std Y+3, r15 ; 0x03 - 4b6e: e8 94 clt - 4b70: d7 f8 bld r13, 7 - 4b72: ee 24 eor r14, r14 - 4b74: ff 24 eor r15, r15 - 4b76: c6 01 movw r24, r12 - 4b78: df 91 pop r29 - 4b7a: cf 91 pop r28 - 4b7c: ff 90 pop r15 - 4b7e: ef 90 pop r14 - 4b80: df 90 pop r13 - 4b82: cf 90 pop r12 - 4b84: bf 90 pop r11 - 4b86: af 90 pop r10 - 4b88: 9f 90 pop r9 - 4b8a: 8f 90 pop r8 - 4b8c: 08 95 ret - -00004b8e : - 4b8e: b4 cf rjmp .-152 ; 0x4af8 - -00004b90 : - 4b90: 8c e1 ldi r24, 0x1C ; 28 - 4b92: 90 e2 ldi r25, 0x20 ; 32 - 4b94: b1 cf rjmp .-158 ; 0x4af8 - -00004b96 : - 4b96: a0 e0 ldi r26, 0x00 ; 0 - 4b98: b0 e0 ldi r27, 0x00 ; 0 - 4b9a: 80 93 1c 20 sts 0x201C, r24 - 4b9e: 90 93 1d 20 sts 0x201D, r25 - 4ba2: a0 93 1e 20 sts 0x201E, r26 - 4ba6: b0 93 1f 20 sts 0x201F, r27 - 4baa: 08 95 ret - -00004bac : - 4bac: fb 01 movw r30, r22 - 4bae: dc 01 movw r26, r24 - 4bb0: 02 c0 rjmp .+4 ; 0x4bb6 - 4bb2: 05 90 lpm r0, Z+ - 4bb4: 0d 92 st X+, r0 - 4bb6: 41 50 subi r20, 0x01 ; 1 - 4bb8: 50 40 sbci r21, 0x00 ; 0 - 4bba: d8 f7 brcc .-10 ; 0x4bb2 - 4bbc: 08 95 ret - -00004bbe : - 4bbe: fb 01 movw r30, r22 - 4bc0: dc 01 movw r26, r24 - 4bc2: 8d 91 ld r24, X+ - 4bc4: 05 90 lpm r0, Z+ - 4bc6: 80 19 sub r24, r0 - 4bc8: 01 10 cpse r0, r1 - 4bca: d9 f3 breq .-10 ; 0x4bc2 - 4bcc: 99 0b sbc r25, r25 - 4bce: 08 95 ret - -00004bd0 : - 4bd0: fb 01 movw r30, r22 - 4bd2: dc 01 movw r26, r24 - 4bd4: 41 50 subi r20, 0x01 ; 1 - 4bd6: 50 40 sbci r21, 0x00 ; 0 - 4bd8: 48 f0 brcs .+18 ; 0x4bec - 4bda: 05 90 lpm r0, Z+ - 4bdc: 0d 92 st X+, r0 - 4bde: 00 20 and r0, r0 - 4be0: c9 f7 brne .-14 ; 0x4bd4 - 4be2: 01 c0 rjmp .+2 ; 0x4be6 - 4be4: 1d 92 st X+, r1 - 4be6: 41 50 subi r20, 0x01 ; 1 - 4be8: 50 40 sbci r21, 0x00 ; 0 - 4bea: e0 f7 brcc .-8 ; 0x4be4 - 4bec: 08 95 ret - -00004bee : - 4bee: fb 01 movw r30, r22 - 4bf0: dc 01 movw r26, r24 - 4bf2: 02 c0 rjmp .+4 ; 0x4bf8 - 4bf4: 01 90 ld r0, Z+ - 4bf6: 0d 92 st X+, r0 - 4bf8: 41 50 subi r20, 0x01 ; 1 - 4bfa: 50 40 sbci r21, 0x00 ; 0 - 4bfc: d8 f7 brcc .-10 ; 0x4bf4 - 4bfe: 08 95 ret - -00004c00 : - 4c00: ae e0 ldi r26, 0x0E ; 14 - 4c02: b0 e0 ldi r27, 0x00 ; 0 - 4c04: e5 e0 ldi r30, 0x05 ; 5 - 4c06: f6 e2 ldi r31, 0x26 ; 38 - 4c08: f5 c2 rjmp .+1514 ; 0x51f4 <__prologue_saves__+0x1c> - 4c0a: 0d 89 ldd r16, Y+21 ; 0x15 - 4c0c: 1e 89 ldd r17, Y+22 ; 0x16 - 4c0e: 8f 89 ldd r24, Y+23 ; 0x17 - 4c10: 98 8d ldd r25, Y+24 ; 0x18 - 4c12: 2e e0 ldi r18, 0x0E ; 14 - 4c14: 2c 83 std Y+4, r18 ; 0x04 - 4c16: 09 83 std Y+1, r16 ; 0x01 - 4c18: 1a 83 std Y+2, r17 ; 0x02 - 4c1a: 97 ff sbrs r25, 7 - 4c1c: 02 c0 rjmp .+4 ; 0x4c22 - 4c1e: 80 e0 ldi r24, 0x00 ; 0 - 4c20: 90 e8 ldi r25, 0x80 ; 128 - 4c22: 01 97 sbiw r24, 0x01 ; 1 - 4c24: 8d 83 std Y+5, r24 ; 0x05 - 4c26: 9e 83 std Y+6, r25 ; 0x06 - 4c28: ce 01 movw r24, r28 - 4c2a: 4b 96 adiw r24, 0x1b ; 27 - 4c2c: ac 01 movw r20, r24 - 4c2e: 69 8d ldd r22, Y+25 ; 0x19 - 4c30: 7a 8d ldd r23, Y+26 ; 0x1a - 4c32: ce 01 movw r24, r28 - 4c34: 01 96 adiw r24, 0x01 ; 1 - 4c36: 11 d0 rcall .+34 ; 0x4c5a - 4c38: 4d 81 ldd r20, Y+5 ; 0x05 - 4c3a: 5e 81 ldd r21, Y+6 ; 0x06 - 4c3c: 57 fd sbrc r21, 7 - 4c3e: 0a c0 rjmp .+20 ; 0x4c54 - 4c40: 2f 81 ldd r18, Y+7 ; 0x07 - 4c42: 38 85 ldd r19, Y+8 ; 0x08 - 4c44: 42 17 cp r20, r18 - 4c46: 53 07 cpc r21, r19 - 4c48: 0c f4 brge .+2 ; 0x4c4c - 4c4a: 9a 01 movw r18, r20 - 4c4c: f8 01 movw r30, r16 - 4c4e: e2 0f add r30, r18 - 4c50: f3 1f adc r31, r19 - 4c52: 10 82 st Z, r1 - 4c54: 2e 96 adiw r28, 0x0e ; 14 - 4c56: e4 e0 ldi r30, 0x04 ; 4 - 4c58: e6 c2 rjmp .+1484 ; 0x5226 <__epilogue_restores__+0x1c> - -00004c5a : - 4c5a: ac e0 ldi r26, 0x0C ; 12 - 4c5c: b0 e0 ldi r27, 0x00 ; 0 - 4c5e: e2 e3 ldi r30, 0x32 ; 50 - 4c60: f6 e2 ldi r31, 0x26 ; 38 - 4c62: ba c2 rjmp .+1396 ; 0x51d8 <__prologue_saves__> - 4c64: 7c 01 movw r14, r24 - 4c66: 6b 01 movw r12, r22 - 4c68: 8a 01 movw r16, r20 - 4c6a: fc 01 movw r30, r24 - 4c6c: 16 82 std Z+6, r1 ; 0x06 - 4c6e: 17 82 std Z+7, r1 ; 0x07 - 4c70: 83 81 ldd r24, Z+3 ; 0x03 - 4c72: 81 ff sbrs r24, 1 - 4c74: b9 c1 rjmp .+882 ; 0x4fe8 - 4c76: 88 24 eor r8, r8 - 4c78: 83 94 inc r8 - 4c7a: 91 2c mov r9, r1 - 4c7c: 8c 0e add r8, r28 - 4c7e: 9d 1e adc r9, r29 - 4c80: f7 01 movw r30, r14 - 4c82: 93 81 ldd r25, Z+3 ; 0x03 - 4c84: f6 01 movw r30, r12 - 4c86: 93 fd sbrc r25, 3 - 4c88: 85 91 lpm r24, Z+ - 4c8a: 93 ff sbrs r25, 3 - 4c8c: 81 91 ld r24, Z+ - 4c8e: 6f 01 movw r12, r30 - 4c90: 88 23 and r24, r24 - 4c92: 09 f4 brne .+2 ; 0x4c96 - 4c94: a5 c1 rjmp .+842 ; 0x4fe0 - 4c96: 85 32 cpi r24, 0x25 ; 37 - 4c98: 39 f4 brne .+14 ; 0x4ca8 - 4c9a: 93 fd sbrc r25, 3 - 4c9c: 85 91 lpm r24, Z+ - 4c9e: 93 ff sbrs r25, 3 - 4ca0: 81 91 ld r24, Z+ - 4ca2: 6f 01 movw r12, r30 - 4ca4: 85 32 cpi r24, 0x25 ; 37 - 4ca6: 21 f4 brne .+8 ; 0x4cb0 - 4ca8: b7 01 movw r22, r14 - 4caa: 90 e0 ldi r25, 0x00 ; 0 - 4cac: f0 d1 rcall .+992 ; 0x508e - 4cae: e8 cf rjmp .-48 ; 0x4c80 - 4cb0: 51 2c mov r5, r1 - 4cb2: 31 2c mov r3, r1 - 4cb4: 20 e0 ldi r18, 0x00 ; 0 - 4cb6: 20 32 cpi r18, 0x20 ; 32 - 4cb8: a8 f4 brcc .+42 ; 0x4ce4 - 4cba: 8b 32 cpi r24, 0x2B ; 43 - 4cbc: 61 f0 breq .+24 ; 0x4cd6 - 4cbe: 28 f4 brcc .+10 ; 0x4cca - 4cc0: 80 32 cpi r24, 0x20 ; 32 - 4cc2: 51 f0 breq .+20 ; 0x4cd8 - 4cc4: 83 32 cpi r24, 0x23 ; 35 - 4cc6: 71 f4 brne .+28 ; 0x4ce4 - 4cc8: 0b c0 rjmp .+22 ; 0x4ce0 - 4cca: 8d 32 cpi r24, 0x2D ; 45 - 4ccc: 39 f0 breq .+14 ; 0x4cdc - 4cce: 80 33 cpi r24, 0x30 ; 48 - 4cd0: 49 f4 brne .+18 ; 0x4ce4 - 4cd2: 21 60 ori r18, 0x01 ; 1 - 4cd4: 28 c0 rjmp .+80 ; 0x4d26 - 4cd6: 22 60 ori r18, 0x02 ; 2 - 4cd8: 24 60 ori r18, 0x04 ; 4 - 4cda: 25 c0 rjmp .+74 ; 0x4d26 - 4cdc: 28 60 ori r18, 0x08 ; 8 - 4cde: 23 c0 rjmp .+70 ; 0x4d26 - 4ce0: 20 61 ori r18, 0x10 ; 16 - 4ce2: 21 c0 rjmp .+66 ; 0x4d26 - 4ce4: 27 fd sbrc r18, 7 - 4ce6: 27 c0 rjmp .+78 ; 0x4d36 - 4ce8: 38 2f mov r19, r24 - 4cea: 30 53 subi r19, 0x30 ; 48 - 4cec: 3a 30 cpi r19, 0x0A ; 10 - 4cee: 78 f4 brcc .+30 ; 0x4d0e - 4cf0: 26 ff sbrs r18, 6 - 4cf2: 06 c0 rjmp .+12 ; 0x4d00 - 4cf4: fa e0 ldi r31, 0x0A ; 10 - 4cf6: 5f 9e mul r5, r31 - 4cf8: 30 0d add r19, r0 - 4cfa: 11 24 eor r1, r1 - 4cfc: 53 2e mov r5, r19 - 4cfe: 13 c0 rjmp .+38 ; 0x4d26 - 4d00: 8a e0 ldi r24, 0x0A ; 10 - 4d02: 38 9e mul r3, r24 - 4d04: 30 0d add r19, r0 - 4d06: 11 24 eor r1, r1 - 4d08: 33 2e mov r3, r19 - 4d0a: 20 62 ori r18, 0x20 ; 32 - 4d0c: 0c c0 rjmp .+24 ; 0x4d26 - 4d0e: 8e 32 cpi r24, 0x2E ; 46 - 4d10: 21 f4 brne .+8 ; 0x4d1a - 4d12: 26 fd sbrc r18, 6 - 4d14: 65 c1 rjmp .+714 ; 0x4fe0 - 4d16: 20 64 ori r18, 0x40 ; 64 - 4d18: 06 c0 rjmp .+12 ; 0x4d26 - 4d1a: 8c 36 cpi r24, 0x6C ; 108 - 4d1c: 11 f4 brne .+4 ; 0x4d22 - 4d1e: 20 68 ori r18, 0x80 ; 128 - 4d20: 02 c0 rjmp .+4 ; 0x4d26 - 4d22: 88 36 cpi r24, 0x68 ; 104 - 4d24: 41 f4 brne .+16 ; 0x4d36 - 4d26: f6 01 movw r30, r12 - 4d28: 93 fd sbrc r25, 3 - 4d2a: 85 91 lpm r24, Z+ - 4d2c: 93 ff sbrs r25, 3 - 4d2e: 81 91 ld r24, Z+ - 4d30: 6f 01 movw r12, r30 - 4d32: 81 11 cpse r24, r1 - 4d34: c0 cf rjmp .-128 ; 0x4cb6 - 4d36: 98 2f mov r25, r24 - 4d38: 95 54 subi r25, 0x45 ; 69 - 4d3a: 93 30 cpi r25, 0x03 ; 3 - 4d3c: 18 f0 brcs .+6 ; 0x4d44 - 4d3e: 90 52 subi r25, 0x20 ; 32 - 4d40: 93 30 cpi r25, 0x03 ; 3 - 4d42: 28 f4 brcc .+10 ; 0x4d4e - 4d44: 0c 5f subi r16, 0xFC ; 252 - 4d46: 1f 4f sbci r17, 0xFF ; 255 - 4d48: ff e3 ldi r31, 0x3F ; 63 - 4d4a: f9 83 std Y+1, r31 ; 0x01 - 4d4c: 0d c0 rjmp .+26 ; 0x4d68 - 4d4e: 83 36 cpi r24, 0x63 ; 99 - 4d50: 31 f0 breq .+12 ; 0x4d5e - 4d52: 83 37 cpi r24, 0x73 ; 115 - 4d54: 71 f0 breq .+28 ; 0x4d72 - 4d56: 83 35 cpi r24, 0x53 ; 83 - 4d58: 09 f0 breq .+2 ; 0x4d5c - 4d5a: 5a c0 rjmp .+180 ; 0x4e10 - 4d5c: 22 c0 rjmp .+68 ; 0x4da2 - 4d5e: f8 01 movw r30, r16 - 4d60: 80 81 ld r24, Z - 4d62: 89 83 std Y+1, r24 ; 0x01 - 4d64: 0e 5f subi r16, 0xFE ; 254 - 4d66: 1f 4f sbci r17, 0xFF ; 255 - 4d68: 44 24 eor r4, r4 - 4d6a: 43 94 inc r4 - 4d6c: 51 2c mov r5, r1 - 4d6e: 54 01 movw r10, r8 - 4d70: 14 c0 rjmp .+40 ; 0x4d9a - 4d72: 38 01 movw r6, r16 - 4d74: f2 e0 ldi r31, 0x02 ; 2 - 4d76: 6f 0e add r6, r31 - 4d78: 71 1c adc r7, r1 - 4d7a: f8 01 movw r30, r16 - 4d7c: a0 80 ld r10, Z - 4d7e: b1 80 ldd r11, Z+1 ; 0x01 - 4d80: 26 ff sbrs r18, 6 - 4d82: 03 c0 rjmp .+6 ; 0x4d8a - 4d84: 65 2d mov r22, r5 - 4d86: 70 e0 ldi r23, 0x00 ; 0 - 4d88: 02 c0 rjmp .+4 ; 0x4d8e - 4d8a: 6f ef ldi r22, 0xFF ; 255 - 4d8c: 7f ef ldi r23, 0xFF ; 255 - 4d8e: c5 01 movw r24, r10 - 4d90: 2c 87 std Y+12, r18 ; 0x0c - 4d92: 72 d1 rcall .+740 ; 0x5078 - 4d94: 2c 01 movw r4, r24 - 4d96: 83 01 movw r16, r6 - 4d98: 2c 85 ldd r18, Y+12 ; 0x0c - 4d9a: 6f e7 ldi r22, 0x7F ; 127 - 4d9c: 26 2e mov r2, r22 - 4d9e: 22 22 and r2, r18 - 4da0: 17 c0 rjmp .+46 ; 0x4dd0 - 4da2: 38 01 movw r6, r16 - 4da4: f2 e0 ldi r31, 0x02 ; 2 - 4da6: 6f 0e add r6, r31 - 4da8: 71 1c adc r7, r1 - 4daa: f8 01 movw r30, r16 - 4dac: a0 80 ld r10, Z - 4dae: b1 80 ldd r11, Z+1 ; 0x01 - 4db0: 26 ff sbrs r18, 6 - 4db2: 03 c0 rjmp .+6 ; 0x4dba - 4db4: 65 2d mov r22, r5 - 4db6: 70 e0 ldi r23, 0x00 ; 0 - 4db8: 02 c0 rjmp .+4 ; 0x4dbe - 4dba: 6f ef ldi r22, 0xFF ; 255 - 4dbc: 7f ef ldi r23, 0xFF ; 255 - 4dbe: c5 01 movw r24, r10 - 4dc0: 2c 87 std Y+12, r18 ; 0x0c - 4dc2: 4f d1 rcall .+670 ; 0x5062 - 4dc4: 2c 01 movw r4, r24 - 4dc6: 2c 85 ldd r18, Y+12 ; 0x0c - 4dc8: 50 e8 ldi r21, 0x80 ; 128 - 4dca: 25 2e mov r2, r21 - 4dcc: 22 2a or r2, r18 - 4dce: 83 01 movw r16, r6 - 4dd0: 23 fc sbrc r2, 3 - 4dd2: 1a c0 rjmp .+52 ; 0x4e08 - 4dd4: 05 c0 rjmp .+10 ; 0x4de0 - 4dd6: b7 01 movw r22, r14 - 4dd8: 80 e2 ldi r24, 0x20 ; 32 - 4dda: 90 e0 ldi r25, 0x00 ; 0 - 4ddc: 58 d1 rcall .+688 ; 0x508e - 4dde: 3a 94 dec r3 - 4de0: 83 2d mov r24, r3 - 4de2: 90 e0 ldi r25, 0x00 ; 0 - 4de4: 48 16 cp r4, r24 - 4de6: 59 06 cpc r5, r25 - 4de8: b0 f3 brcs .-20 ; 0x4dd6 - 4dea: 0e c0 rjmp .+28 ; 0x4e08 - 4dec: f5 01 movw r30, r10 - 4dee: 27 fc sbrc r2, 7 - 4df0: 85 91 lpm r24, Z+ - 4df2: 27 fe sbrs r2, 7 - 4df4: 81 91 ld r24, Z+ - 4df6: 5f 01 movw r10, r30 - 4df8: b7 01 movw r22, r14 - 4dfa: 90 e0 ldi r25, 0x00 ; 0 - 4dfc: 48 d1 rcall .+656 ; 0x508e - 4dfe: 31 10 cpse r3, r1 - 4e00: 3a 94 dec r3 - 4e02: f1 e0 ldi r31, 0x01 ; 1 - 4e04: 4f 1a sub r4, r31 - 4e06: 51 08 sbc r5, r1 - 4e08: 41 14 cp r4, r1 - 4e0a: 51 04 cpc r5, r1 - 4e0c: 79 f7 brne .-34 ; 0x4dec - 4e0e: e5 c0 rjmp .+458 ; 0x4fda - 4e10: 84 36 cpi r24, 0x64 ; 100 - 4e12: 11 f0 breq .+4 ; 0x4e18 - 4e14: 89 36 cpi r24, 0x69 ; 105 - 4e16: 39 f5 brne .+78 ; 0x4e66 - 4e18: f8 01 movw r30, r16 - 4e1a: 27 ff sbrs r18, 7 - 4e1c: 07 c0 rjmp .+14 ; 0x4e2c - 4e1e: 60 81 ld r22, Z - 4e20: 71 81 ldd r23, Z+1 ; 0x01 - 4e22: 82 81 ldd r24, Z+2 ; 0x02 - 4e24: 93 81 ldd r25, Z+3 ; 0x03 - 4e26: 0c 5f subi r16, 0xFC ; 252 - 4e28: 1f 4f sbci r17, 0xFF ; 255 - 4e2a: 08 c0 rjmp .+16 ; 0x4e3c - 4e2c: 60 81 ld r22, Z - 4e2e: 71 81 ldd r23, Z+1 ; 0x01 - 4e30: 88 27 eor r24, r24 - 4e32: 77 fd sbrc r23, 7 - 4e34: 80 95 com r24 - 4e36: 98 2f mov r25, r24 - 4e38: 0e 5f subi r16, 0xFE ; 254 - 4e3a: 1f 4f sbci r17, 0xFF ; 255 - 4e3c: 4f e6 ldi r20, 0x6F ; 111 - 4e3e: b4 2e mov r11, r20 - 4e40: b2 22 and r11, r18 - 4e42: 97 ff sbrs r25, 7 - 4e44: 09 c0 rjmp .+18 ; 0x4e58 - 4e46: 90 95 com r25 - 4e48: 80 95 com r24 - 4e4a: 70 95 com r23 - 4e4c: 61 95 neg r22 - 4e4e: 7f 4f sbci r23, 0xFF ; 255 - 4e50: 8f 4f sbci r24, 0xFF ; 255 - 4e52: 9f 4f sbci r25, 0xFF ; 255 - 4e54: f0 e8 ldi r31, 0x80 ; 128 - 4e56: bf 2a or r11, r31 - 4e58: 2a e0 ldi r18, 0x0A ; 10 - 4e5a: 30 e0 ldi r19, 0x00 ; 0 - 4e5c: a4 01 movw r20, r8 - 4e5e: 43 d1 rcall .+646 ; 0x50e6 <__ultoa_invert> - 4e60: a8 2e mov r10, r24 - 4e62: a8 18 sub r10, r8 - 4e64: 42 c0 rjmp .+132 ; 0x4eea - 4e66: 85 37 cpi r24, 0x75 ; 117 - 4e68: 31 f4 brne .+12 ; 0x4e76 - 4e6a: 3f ee ldi r19, 0xEF ; 239 - 4e6c: b3 2e mov r11, r19 - 4e6e: b2 22 and r11, r18 - 4e70: 2a e0 ldi r18, 0x0A ; 10 - 4e72: 30 e0 ldi r19, 0x00 ; 0 - 4e74: 24 c0 rjmp .+72 ; 0x4ebe - 4e76: 99 ef ldi r25, 0xF9 ; 249 - 4e78: b9 2e mov r11, r25 - 4e7a: b2 22 and r11, r18 - 4e7c: 8f 36 cpi r24, 0x6F ; 111 - 4e7e: b9 f0 breq .+46 ; 0x4eae - 4e80: 20 f4 brcc .+8 ; 0x4e8a - 4e82: 88 35 cpi r24, 0x58 ; 88 - 4e84: 09 f0 breq .+2 ; 0x4e88 - 4e86: ac c0 rjmp .+344 ; 0x4fe0 - 4e88: 0d c0 rjmp .+26 ; 0x4ea4 - 4e8a: 80 37 cpi r24, 0x70 ; 112 - 4e8c: 21 f0 breq .+8 ; 0x4e96 - 4e8e: 88 37 cpi r24, 0x78 ; 120 - 4e90: 09 f0 breq .+2 ; 0x4e94 - 4e92: a6 c0 rjmp .+332 ; 0x4fe0 - 4e94: 02 c0 rjmp .+4 ; 0x4e9a - 4e96: 20 e1 ldi r18, 0x10 ; 16 - 4e98: b2 2a or r11, r18 - 4e9a: b4 fe sbrs r11, 4 - 4e9c: 0b c0 rjmp .+22 ; 0x4eb4 - 4e9e: 84 e0 ldi r24, 0x04 ; 4 - 4ea0: b8 2a or r11, r24 - 4ea2: 08 c0 rjmp .+16 ; 0x4eb4 - 4ea4: 24 ff sbrs r18, 4 - 4ea6: 09 c0 rjmp .+18 ; 0x4eba - 4ea8: e6 e0 ldi r30, 0x06 ; 6 - 4eaa: be 2a or r11, r30 - 4eac: 06 c0 rjmp .+12 ; 0x4eba - 4eae: 28 e0 ldi r18, 0x08 ; 8 - 4eb0: 30 e0 ldi r19, 0x00 ; 0 - 4eb2: 05 c0 rjmp .+10 ; 0x4ebe - 4eb4: 20 e1 ldi r18, 0x10 ; 16 - 4eb6: 30 e0 ldi r19, 0x00 ; 0 - 4eb8: 02 c0 rjmp .+4 ; 0x4ebe - 4eba: 20 e1 ldi r18, 0x10 ; 16 - 4ebc: 32 e0 ldi r19, 0x02 ; 2 - 4ebe: f8 01 movw r30, r16 - 4ec0: b7 fe sbrs r11, 7 - 4ec2: 07 c0 rjmp .+14 ; 0x4ed2 - 4ec4: 60 81 ld r22, Z - 4ec6: 71 81 ldd r23, Z+1 ; 0x01 - 4ec8: 82 81 ldd r24, Z+2 ; 0x02 - 4eca: 93 81 ldd r25, Z+3 ; 0x03 - 4ecc: 0c 5f subi r16, 0xFC ; 252 - 4ece: 1f 4f sbci r17, 0xFF ; 255 - 4ed0: 06 c0 rjmp .+12 ; 0x4ede - 4ed2: 60 81 ld r22, Z - 4ed4: 71 81 ldd r23, Z+1 ; 0x01 - 4ed6: 80 e0 ldi r24, 0x00 ; 0 - 4ed8: 90 e0 ldi r25, 0x00 ; 0 - 4eda: 0e 5f subi r16, 0xFE ; 254 - 4edc: 1f 4f sbci r17, 0xFF ; 255 - 4ede: a4 01 movw r20, r8 - 4ee0: 02 d1 rcall .+516 ; 0x50e6 <__ultoa_invert> - 4ee2: a8 2e mov r10, r24 - 4ee4: a8 18 sub r10, r8 - 4ee6: ff e7 ldi r31, 0x7F ; 127 - 4ee8: bf 22 and r11, r31 - 4eea: b6 fe sbrs r11, 6 - 4eec: 0b c0 rjmp .+22 ; 0x4f04 - 4eee: 2b 2d mov r18, r11 - 4ef0: 2e 7f andi r18, 0xFE ; 254 - 4ef2: a5 14 cp r10, r5 - 4ef4: 50 f4 brcc .+20 ; 0x4f0a - 4ef6: b4 fe sbrs r11, 4 - 4ef8: 0a c0 rjmp .+20 ; 0x4f0e - 4efa: b2 fc sbrc r11, 2 - 4efc: 08 c0 rjmp .+16 ; 0x4f0e - 4efe: 2b 2d mov r18, r11 - 4f00: 2e 7e andi r18, 0xEE ; 238 - 4f02: 05 c0 rjmp .+10 ; 0x4f0e - 4f04: 7a 2c mov r7, r10 - 4f06: 2b 2d mov r18, r11 - 4f08: 03 c0 rjmp .+6 ; 0x4f10 - 4f0a: 7a 2c mov r7, r10 - 4f0c: 01 c0 rjmp .+2 ; 0x4f10 - 4f0e: 75 2c mov r7, r5 - 4f10: 24 ff sbrs r18, 4 - 4f12: 0d c0 rjmp .+26 ; 0x4f2e - 4f14: fe 01 movw r30, r28 - 4f16: ea 0d add r30, r10 - 4f18: f1 1d adc r31, r1 - 4f1a: 80 81 ld r24, Z - 4f1c: 80 33 cpi r24, 0x30 ; 48 - 4f1e: 11 f4 brne .+4 ; 0x4f24 - 4f20: 29 7e andi r18, 0xE9 ; 233 - 4f22: 09 c0 rjmp .+18 ; 0x4f36 - 4f24: 22 ff sbrs r18, 2 - 4f26: 06 c0 rjmp .+12 ; 0x4f34 - 4f28: 73 94 inc r7 - 4f2a: 73 94 inc r7 - 4f2c: 04 c0 rjmp .+8 ; 0x4f36 - 4f2e: 82 2f mov r24, r18 - 4f30: 86 78 andi r24, 0x86 ; 134 - 4f32: 09 f0 breq .+2 ; 0x4f36 - 4f34: 73 94 inc r7 - 4f36: 23 fd sbrc r18, 3 - 4f38: 13 c0 rjmp .+38 ; 0x4f60 - 4f3a: 20 ff sbrs r18, 0 - 4f3c: 0e c0 rjmp .+28 ; 0x4f5a - 4f3e: 5a 2c mov r5, r10 - 4f40: 73 14 cp r7, r3 - 4f42: 58 f4 brcc .+22 ; 0x4f5a - 4f44: 53 0c add r5, r3 - 4f46: 57 18 sub r5, r7 - 4f48: 73 2c mov r7, r3 - 4f4a: 07 c0 rjmp .+14 ; 0x4f5a - 4f4c: b7 01 movw r22, r14 - 4f4e: 80 e2 ldi r24, 0x20 ; 32 - 4f50: 90 e0 ldi r25, 0x00 ; 0 - 4f52: 2c 87 std Y+12, r18 ; 0x0c - 4f54: 9c d0 rcall .+312 ; 0x508e - 4f56: 73 94 inc r7 - 4f58: 2c 85 ldd r18, Y+12 ; 0x0c - 4f5a: 73 14 cp r7, r3 - 4f5c: b8 f3 brcs .-18 ; 0x4f4c - 4f5e: 04 c0 rjmp .+8 ; 0x4f68 - 4f60: 73 14 cp r7, r3 - 4f62: 10 f4 brcc .+4 ; 0x4f68 - 4f64: 37 18 sub r3, r7 - 4f66: 01 c0 rjmp .+2 ; 0x4f6a - 4f68: 31 2c mov r3, r1 - 4f6a: 24 ff sbrs r18, 4 - 4f6c: 11 c0 rjmp .+34 ; 0x4f90 - 4f6e: b7 01 movw r22, r14 - 4f70: 80 e3 ldi r24, 0x30 ; 48 - 4f72: 90 e0 ldi r25, 0x00 ; 0 - 4f74: 2c 87 std Y+12, r18 ; 0x0c - 4f76: 8b d0 rcall .+278 ; 0x508e - 4f78: 2c 85 ldd r18, Y+12 ; 0x0c - 4f7a: 22 ff sbrs r18, 2 - 4f7c: 1c c0 rjmp .+56 ; 0x4fb6 - 4f7e: 21 ff sbrs r18, 1 - 4f80: 03 c0 rjmp .+6 ; 0x4f88 - 4f82: 88 e5 ldi r24, 0x58 ; 88 - 4f84: 90 e0 ldi r25, 0x00 ; 0 - 4f86: 02 c0 rjmp .+4 ; 0x4f8c - 4f88: 88 e7 ldi r24, 0x78 ; 120 - 4f8a: 90 e0 ldi r25, 0x00 ; 0 - 4f8c: b7 01 movw r22, r14 - 4f8e: 0c c0 rjmp .+24 ; 0x4fa8 - 4f90: 82 2f mov r24, r18 - 4f92: 86 78 andi r24, 0x86 ; 134 - 4f94: 81 f0 breq .+32 ; 0x4fb6 - 4f96: 21 fd sbrc r18, 1 - 4f98: 02 c0 rjmp .+4 ; 0x4f9e - 4f9a: 80 e2 ldi r24, 0x20 ; 32 - 4f9c: 01 c0 rjmp .+2 ; 0x4fa0 - 4f9e: 8b e2 ldi r24, 0x2B ; 43 - 4fa0: 27 fd sbrc r18, 7 - 4fa2: 8d e2 ldi r24, 0x2D ; 45 - 4fa4: b7 01 movw r22, r14 - 4fa6: 90 e0 ldi r25, 0x00 ; 0 - 4fa8: 72 d0 rcall .+228 ; 0x508e - 4faa: 05 c0 rjmp .+10 ; 0x4fb6 - 4fac: b7 01 movw r22, r14 - 4fae: 80 e3 ldi r24, 0x30 ; 48 - 4fb0: 90 e0 ldi r25, 0x00 ; 0 - 4fb2: 6d d0 rcall .+218 ; 0x508e - 4fb4: 5a 94 dec r5 - 4fb6: a5 14 cp r10, r5 - 4fb8: c8 f3 brcs .-14 ; 0x4fac - 4fba: aa 94 dec r10 - 4fbc: f4 01 movw r30, r8 - 4fbe: ea 0d add r30, r10 - 4fc0: f1 1d adc r31, r1 - 4fc2: b7 01 movw r22, r14 - 4fc4: 80 81 ld r24, Z - 4fc6: 90 e0 ldi r25, 0x00 ; 0 - 4fc8: 62 d0 rcall .+196 ; 0x508e - 4fca: a1 10 cpse r10, r1 - 4fcc: f6 cf rjmp .-20 ; 0x4fba - 4fce: 05 c0 rjmp .+10 ; 0x4fda - 4fd0: b7 01 movw r22, r14 - 4fd2: 80 e2 ldi r24, 0x20 ; 32 - 4fd4: 90 e0 ldi r25, 0x00 ; 0 - 4fd6: 5b d0 rcall .+182 ; 0x508e - 4fd8: 3a 94 dec r3 - 4fda: 31 10 cpse r3, r1 - 4fdc: f9 cf rjmp .-14 ; 0x4fd0 - 4fde: 50 ce rjmp .-864 ; 0x4c80 - 4fe0: f7 01 movw r30, r14 - 4fe2: 26 81 ldd r18, Z+6 ; 0x06 - 4fe4: 37 81 ldd r19, Z+7 ; 0x07 - 4fe6: 02 c0 rjmp .+4 ; 0x4fec - 4fe8: 2f ef ldi r18, 0xFF ; 255 - 4fea: 3f ef ldi r19, 0xFF ; 255 - 4fec: c9 01 movw r24, r18 - 4fee: 2c 96 adiw r28, 0x0c ; 12 - 4ff0: e2 e1 ldi r30, 0x12 ; 18 - 4ff2: 0b c1 rjmp .+534 ; 0x520a <__epilogue_restores__> - -00004ff4 <__eerd_block_x32a4u>: - 4ff4: e0 ec ldi r30, 0xC0 ; 192 - 4ff6: f1 e0 ldi r31, 0x01 ; 1 - 4ff8: a7 85 ldd r26, Z+15 ; 0x0f - 4ffa: a7 fd sbrc r26, 7 - 4ffc: fd cf rjmp .-6 ; 0x4ff8 <__eerd_block_x32a4u+0x4> - 4ffe: a4 85 ldd r26, Z+12 ; 0x0c - 5000: a8 60 ori r26, 0x08 ; 8 - 5002: a4 87 std Z+12, r26 ; 0x0c - 5004: 60 50 subi r22, 0x00 ; 0 - 5006: 70 4f sbci r23, 0xF0 ; 240 - 5008: f2 cd rjmp .-1052 ; 0x4bee - -0000500a <__eewr_block_x32a4u>: - 500a: dc 01 movw r26, r24 - 500c: cb 01 movw r24, r22 - 500e: 02 c0 rjmp .+4 ; 0x5014 <__eewr_block_x32a4u+0xa> - 5010: 2d 91 ld r18, X+ - 5012: 05 d0 rcall .+10 ; 0x501e <__eewr_r18_x32a4u> - 5014: 41 50 subi r20, 0x01 ; 1 - 5016: 50 40 sbci r21, 0x00 ; 0 - 5018: d8 f7 brcc .-10 ; 0x5010 <__eewr_block_x32a4u+0x6> - 501a: 08 95 ret - -0000501c <__eewr_byte_x32a4u>: - 501c: 26 2f mov r18, r22 - -0000501e <__eewr_r18_x32a4u>: - 501e: e0 ec ldi r30, 0xC0 ; 192 - 5020: f1 e0 ldi r31, 0x01 ; 1 - 5022: 37 85 ldd r19, Z+15 ; 0x0f - 5024: 37 fd sbrc r19, 7 - 5026: fd cf rjmp .-6 ; 0x5022 <__eewr_r18_x32a4u+0x4> - 5028: 34 85 ldd r19, Z+12 ; 0x0c - 502a: 37 7f andi r19, 0xF7 ; 247 - 502c: 34 87 std Z+12, r19 ; 0x0c - 502e: 37 85 ldd r19, Z+15 ; 0x0f - 5030: 31 ff sbrs r19, 1 - 5032: 09 c0 rjmp .+18 ; 0x5046 <__eewr_r18_x32a4u+0x28> - 5034: 36 e3 ldi r19, 0x36 ; 54 - 5036: 32 87 std Z+10, r19 ; 0x0a - 5038: 38 ed ldi r19, 0xD8 ; 216 - 503a: 34 bf out 0x34, r19 ; 52 - 503c: 31 e0 ldi r19, 0x01 ; 1 - 503e: 33 87 std Z+11, r19 ; 0x0b - 5040: 37 85 ldd r19, Z+15 ; 0x0f - 5042: 37 fd sbrc r19, 7 - 5044: fd cf rjmp .-6 ; 0x5040 <__eewr_r18_x32a4u+0x22> - 5046: 33 e3 ldi r19, 0x33 ; 51 - 5048: 32 87 std Z+10, r19 ; 0x0a - 504a: 80 83 st Z, r24 - 504c: 91 83 std Z+1, r25 ; 0x01 - 504e: 12 82 std Z+2, r1 ; 0x02 - 5050: 24 83 std Z+4, r18 ; 0x04 - 5052: 25 e3 ldi r18, 0x35 ; 53 - 5054: 22 87 std Z+10, r18 ; 0x0a - 5056: 28 ed ldi r18, 0xD8 ; 216 - 5058: 31 e0 ldi r19, 0x01 ; 1 - 505a: 24 bf out 0x34, r18 ; 52 - 505c: 33 87 std Z+11, r19 ; 0x0b - 505e: 01 96 adiw r24, 0x01 ; 1 - 5060: 08 95 ret - -00005062 : - 5062: fc 01 movw r30, r24 - 5064: 05 90 lpm r0, Z+ - 5066: 61 50 subi r22, 0x01 ; 1 - 5068: 70 40 sbci r23, 0x00 ; 0 - 506a: 01 10 cpse r0, r1 - 506c: d8 f7 brcc .-10 ; 0x5064 - 506e: 80 95 com r24 - 5070: 90 95 com r25 - 5072: 8e 0f add r24, r30 - 5074: 9f 1f adc r25, r31 - 5076: 08 95 ret - -00005078 : - 5078: fc 01 movw r30, r24 - 507a: 61 50 subi r22, 0x01 ; 1 - 507c: 70 40 sbci r23, 0x00 ; 0 - 507e: 01 90 ld r0, Z+ - 5080: 01 10 cpse r0, r1 - 5082: d8 f7 brcc .-10 ; 0x507a - 5084: 80 95 com r24 - 5086: 90 95 com r25 - 5088: 8e 0f add r24, r30 - 508a: 9f 1f adc r25, r31 - 508c: 08 95 ret - -0000508e : - 508e: 0f 93 push r16 - 5090: 1f 93 push r17 - 5092: cf 93 push r28 - 5094: df 93 push r29 - 5096: 8c 01 movw r16, r24 - 5098: eb 01 movw r28, r22 - 509a: 8b 81 ldd r24, Y+3 ; 0x03 - 509c: 81 fd sbrc r24, 1 - 509e: 03 c0 rjmp .+6 ; 0x50a6 - 50a0: 0f ef ldi r16, 0xFF ; 255 - 50a2: 1f ef ldi r17, 0xFF ; 255 - 50a4: 1a c0 rjmp .+52 ; 0x50da - 50a6: 82 ff sbrs r24, 2 - 50a8: 0d c0 rjmp .+26 ; 0x50c4 - 50aa: 2e 81 ldd r18, Y+6 ; 0x06 - 50ac: 3f 81 ldd r19, Y+7 ; 0x07 - 50ae: 8c 81 ldd r24, Y+4 ; 0x04 - 50b0: 9d 81 ldd r25, Y+5 ; 0x05 - 50b2: 28 17 cp r18, r24 - 50b4: 39 07 cpc r19, r25 - 50b6: 64 f4 brge .+24 ; 0x50d0 - 50b8: e8 81 ld r30, Y - 50ba: f9 81 ldd r31, Y+1 ; 0x01 - 50bc: 01 93 st Z+, r16 - 50be: e8 83 st Y, r30 - 50c0: f9 83 std Y+1, r31 ; 0x01 - 50c2: 06 c0 rjmp .+12 ; 0x50d0 - 50c4: e8 85 ldd r30, Y+8 ; 0x08 - 50c6: f9 85 ldd r31, Y+9 ; 0x09 - 50c8: 80 2f mov r24, r16 - 50ca: 09 95 icall - 50cc: 89 2b or r24, r25 - 50ce: 41 f7 brne .-48 ; 0x50a0 - 50d0: 8e 81 ldd r24, Y+6 ; 0x06 - 50d2: 9f 81 ldd r25, Y+7 ; 0x07 - 50d4: 01 96 adiw r24, 0x01 ; 1 - 50d6: 8e 83 std Y+6, r24 ; 0x06 - 50d8: 9f 83 std Y+7, r25 ; 0x07 - 50da: c8 01 movw r24, r16 - 50dc: df 91 pop r29 - 50de: cf 91 pop r28 - 50e0: 1f 91 pop r17 - 50e2: 0f 91 pop r16 - 50e4: 08 95 ret - -000050e6 <__ultoa_invert>: - 50e6: fa 01 movw r30, r20 - 50e8: aa 27 eor r26, r26 - 50ea: 28 30 cpi r18, 0x08 ; 8 - 50ec: 51 f1 breq .+84 ; 0x5142 <__ultoa_invert+0x5c> - 50ee: 20 31 cpi r18, 0x10 ; 16 - 50f0: 81 f1 breq .+96 ; 0x5152 <__ultoa_invert+0x6c> - 50f2: e8 94 clt - 50f4: 6f 93 push r22 - 50f6: 6e 7f andi r22, 0xFE ; 254 - 50f8: 6e 5f subi r22, 0xFE ; 254 - 50fa: 7f 4f sbci r23, 0xFF ; 255 - 50fc: 8f 4f sbci r24, 0xFF ; 255 - 50fe: 9f 4f sbci r25, 0xFF ; 255 - 5100: af 4f sbci r26, 0xFF ; 255 - 5102: b1 e0 ldi r27, 0x01 ; 1 - 5104: 3e d0 rcall .+124 ; 0x5182 <__ultoa_invert+0x9c> - 5106: b4 e0 ldi r27, 0x04 ; 4 - 5108: 3c d0 rcall .+120 ; 0x5182 <__ultoa_invert+0x9c> - 510a: 67 0f add r22, r23 - 510c: 78 1f adc r23, r24 - 510e: 89 1f adc r24, r25 - 5110: 9a 1f adc r25, r26 - 5112: a1 1d adc r26, r1 - 5114: 68 0f add r22, r24 - 5116: 79 1f adc r23, r25 - 5118: 8a 1f adc r24, r26 - 511a: 91 1d adc r25, r1 - 511c: a1 1d adc r26, r1 - 511e: 6a 0f add r22, r26 - 5120: 71 1d adc r23, r1 - 5122: 81 1d adc r24, r1 - 5124: 91 1d adc r25, r1 - 5126: a1 1d adc r26, r1 - 5128: 20 d0 rcall .+64 ; 0x516a <__ultoa_invert+0x84> - 512a: 09 f4 brne .+2 ; 0x512e <__ultoa_invert+0x48> - 512c: 68 94 set - 512e: 3f 91 pop r19 - 5130: 2a e0 ldi r18, 0x0A ; 10 - 5132: 26 9f mul r18, r22 - 5134: 11 24 eor r1, r1 - 5136: 30 19 sub r19, r0 - 5138: 30 5d subi r19, 0xD0 ; 208 - 513a: 31 93 st Z+, r19 - 513c: de f6 brtc .-74 ; 0x50f4 <__ultoa_invert+0xe> - 513e: cf 01 movw r24, r30 - 5140: 08 95 ret - 5142: 46 2f mov r20, r22 - 5144: 47 70 andi r20, 0x07 ; 7 - 5146: 40 5d subi r20, 0xD0 ; 208 - 5148: 41 93 st Z+, r20 - 514a: b3 e0 ldi r27, 0x03 ; 3 - 514c: 0f d0 rcall .+30 ; 0x516c <__ultoa_invert+0x86> - 514e: c9 f7 brne .-14 ; 0x5142 <__ultoa_invert+0x5c> - 5150: f6 cf rjmp .-20 ; 0x513e <__ultoa_invert+0x58> - 5152: 46 2f mov r20, r22 - 5154: 4f 70 andi r20, 0x0F ; 15 - 5156: 40 5d subi r20, 0xD0 ; 208 - 5158: 4a 33 cpi r20, 0x3A ; 58 - 515a: 18 f0 brcs .+6 ; 0x5162 <__ultoa_invert+0x7c> - 515c: 49 5d subi r20, 0xD9 ; 217 - 515e: 31 fd sbrc r19, 1 - 5160: 40 52 subi r20, 0x20 ; 32 - 5162: 41 93 st Z+, r20 - 5164: 02 d0 rcall .+4 ; 0x516a <__ultoa_invert+0x84> - 5166: a9 f7 brne .-22 ; 0x5152 <__ultoa_invert+0x6c> - 5168: ea cf rjmp .-44 ; 0x513e <__ultoa_invert+0x58> - 516a: b4 e0 ldi r27, 0x04 ; 4 - 516c: a6 95 lsr r26 - 516e: 97 95 ror r25 - 5170: 87 95 ror r24 - 5172: 77 95 ror r23 - 5174: 67 95 ror r22 - 5176: ba 95 dec r27 - 5178: c9 f7 brne .-14 ; 0x516c <__ultoa_invert+0x86> - 517a: 00 97 sbiw r24, 0x00 ; 0 - 517c: 61 05 cpc r22, r1 - 517e: 71 05 cpc r23, r1 - 5180: 08 95 ret - 5182: 9b 01 movw r18, r22 - 5184: ac 01 movw r20, r24 - 5186: 0a 2e mov r0, r26 - 5188: 06 94 lsr r0 - 518a: 57 95 ror r21 - 518c: 47 95 ror r20 - 518e: 37 95 ror r19 - 5190: 27 95 ror r18 - 5192: ba 95 dec r27 - 5194: c9 f7 brne .-14 ; 0x5188 <__ultoa_invert+0xa2> - 5196: 62 0f add r22, r18 - 5198: 73 1f adc r23, r19 - 519a: 84 1f adc r24, r20 - 519c: 95 1f adc r25, r21 - 519e: a0 1d adc r26, r0 - 51a0: 08 95 ret - -000051a2 <__divmodsi4>: - 51a2: 05 2e mov r0, r21 - 51a4: 97 fb bst r25, 7 - 51a6: 16 f4 brtc .+4 ; 0x51ac <__divmodsi4+0xa> - 51a8: 00 94 com r0 - 51aa: 06 d0 rcall .+12 ; 0x51b8 <__divmodsi4_neg1> - 51ac: 57 fd sbrc r21, 7 - 51ae: 0c d0 rcall .+24 ; 0x51c8 <__divmodsi4_neg2> - 51b0: 44 d0 rcall .+136 ; 0x523a <__udivmodsi4> - 51b2: 07 fc sbrc r0, 7 - 51b4: 09 d0 rcall .+18 ; 0x51c8 <__divmodsi4_neg2> - 51b6: 7e f4 brtc .+30 ; 0x51d6 <__divmodsi4_exit> - -000051b8 <__divmodsi4_neg1>: - 51b8: 90 95 com r25 - 51ba: 80 95 com r24 - 51bc: 70 95 com r23 - 51be: 61 95 neg r22 - 51c0: 7f 4f sbci r23, 0xFF ; 255 - 51c2: 8f 4f sbci r24, 0xFF ; 255 - 51c4: 9f 4f sbci r25, 0xFF ; 255 - 51c6: 08 95 ret - -000051c8 <__divmodsi4_neg2>: - 51c8: 50 95 com r21 - 51ca: 40 95 com r20 - 51cc: 30 95 com r19 - 51ce: 21 95 neg r18 - 51d0: 3f 4f sbci r19, 0xFF ; 255 - 51d2: 4f 4f sbci r20, 0xFF ; 255 - 51d4: 5f 4f sbci r21, 0xFF ; 255 - -000051d6 <__divmodsi4_exit>: - 51d6: 08 95 ret - -000051d8 <__prologue_saves__>: - 51d8: 2f 92 push r2 - 51da: 3f 92 push r3 - 51dc: 4f 92 push r4 - 51de: 5f 92 push r5 - 51e0: 6f 92 push r6 - 51e2: 7f 92 push r7 - 51e4: 8f 92 push r8 - 51e6: 9f 92 push r9 - 51e8: af 92 push r10 - 51ea: bf 92 push r11 - 51ec: cf 92 push r12 - 51ee: df 92 push r13 - 51f0: ef 92 push r14 - 51f2: ff 92 push r15 - 51f4: 0f 93 push r16 - 51f6: 1f 93 push r17 - 51f8: cf 93 push r28 - 51fa: df 93 push r29 - 51fc: cd b7 in r28, 0x3d ; 61 - 51fe: de b7 in r29, 0x3e ; 62 - 5200: ca 1b sub r28, r26 - 5202: db 0b sbc r29, r27 - 5204: cd bf out 0x3d, r28 ; 61 - 5206: de bf out 0x3e, r29 ; 62 - 5208: 09 94 ijmp - -0000520a <__epilogue_restores__>: - 520a: 2a 88 ldd r2, Y+18 ; 0x12 - 520c: 39 88 ldd r3, Y+17 ; 0x11 - 520e: 48 88 ldd r4, Y+16 ; 0x10 - 5210: 5f 84 ldd r5, Y+15 ; 0x0f - 5212: 6e 84 ldd r6, Y+14 ; 0x0e - 5214: 7d 84 ldd r7, Y+13 ; 0x0d - 5216: 8c 84 ldd r8, Y+12 ; 0x0c - 5218: 9b 84 ldd r9, Y+11 ; 0x0b - 521a: aa 84 ldd r10, Y+10 ; 0x0a - 521c: b9 84 ldd r11, Y+9 ; 0x09 - 521e: c8 84 ldd r12, Y+8 ; 0x08 - 5220: df 80 ldd r13, Y+7 ; 0x07 - 5222: ee 80 ldd r14, Y+6 ; 0x06 - 5224: fd 80 ldd r15, Y+5 ; 0x05 - 5226: 0c 81 ldd r16, Y+4 ; 0x04 - 5228: 1b 81 ldd r17, Y+3 ; 0x03 - 522a: aa 81 ldd r26, Y+2 ; 0x02 - 522c: b9 81 ldd r27, Y+1 ; 0x01 - 522e: ce 0f add r28, r30 - 5230: d1 1d adc r29, r1 - 5232: cd bf out 0x3d, r28 ; 61 - 5234: de bf out 0x3e, r29 ; 62 - 5236: ed 01 movw r28, r26 - 5238: 08 95 ret - -0000523a <__udivmodsi4>: - 523a: a1 e2 ldi r26, 0x21 ; 33 - 523c: 1a 2e mov r1, r26 - 523e: aa 1b sub r26, r26 - 5240: bb 1b sub r27, r27 - 5242: fd 01 movw r30, r26 - 5244: 0d c0 rjmp .+26 ; 0x5260 <__udivmodsi4_ep> - -00005246 <__udivmodsi4_loop>: - 5246: aa 1f adc r26, r26 - 5248: bb 1f adc r27, r27 - 524a: ee 1f adc r30, r30 - 524c: ff 1f adc r31, r31 - 524e: a2 17 cp r26, r18 - 5250: b3 07 cpc r27, r19 - 5252: e4 07 cpc r30, r20 - 5254: f5 07 cpc r31, r21 - 5256: 20 f0 brcs .+8 ; 0x5260 <__udivmodsi4_ep> - 5258: a2 1b sub r26, r18 - 525a: b3 0b sbc r27, r19 - 525c: e4 0b sbc r30, r20 - 525e: f5 0b sbc r31, r21 - -00005260 <__udivmodsi4_ep>: - 5260: 66 1f adc r22, r22 - 5262: 77 1f adc r23, r23 - 5264: 88 1f adc r24, r24 - 5266: 99 1f adc r25, r25 - 5268: 1a 94 dec r1 - 526a: 69 f7 brne .-38 ; 0x5246 <__udivmodsi4_loop> - 526c: 60 95 com r22 - 526e: 70 95 com r23 - 5270: 80 95 com r24 - 5272: 90 95 com r25 - 5274: 9b 01 movw r18, r22 - 5276: ac 01 movw r20, r24 - 5278: bd 01 movw r22, r26 - 527a: cf 01 movw r24, r30 - 527c: 08 95 ret - -0000527e <_exit>: - 527e: f8 94 cli - -00005280 <__stop_program>: - 5280: ff cf rjmp .-2 ; 0x5280 <__stop_program> + +Chameleon-Mini.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 00004e9a 00000000 00000000 000000b4 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .data 00000092 00802000 00004e9a 00004f4e 2**0 + CONTENTS, ALLOC, LOAD, DATA + 2 .bss 00000a0b 00802092 00802092 00004fe0 2**0 + ALLOC + 3 .eeprom 00000013 00810000 00810000 00004fe0 2**0 + CONTENTS, ALLOC, LOAD, DATA + 4 .comment 0000005c 00000000 00000000 00004ff3 2**0 + CONTENTS, READONLY + 5 .debug_aranges 00000b50 00000000 00000000 0000504f 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_info 000189de 00000000 00000000 00005b9f 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_abbrev 0000553d 00000000 00000000 0001e57d 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_line 0000a17f 00000000 00000000 00023aba 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_frame 00001d28 00000000 00000000 0002dc3c 2**2 + CONTENTS, READONLY, DEBUGGING + 10 .debug_str 000076e1 00000000 00000000 0002f964 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_loc 0000c84e 00000000 00000000 00037045 2**0 + CONTENTS, READONLY, DEBUGGING + 12 .debug_ranges 000016c8 00000000 00000000 00043893 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00000000 <__vectors>: + 0: 7b c3 rjmp .+1782 ; 0x6f8 <__ctors_end> + 2: 00 00 nop + 4: 95 c3 rjmp .+1834 ; 0x730 <__bad_interrupt> + 6: 00 00 nop + 8: 93 c3 rjmp .+1830 ; 0x730 <__bad_interrupt> + a: 00 00 nop + c: 91 c3 rjmp .+1826 ; 0x730 <__bad_interrupt> + e: 00 00 nop + 10: 8f c3 rjmp .+1822 ; 0x730 <__bad_interrupt> + 12: 00 00 nop + 14: 8d c3 rjmp .+1818 ; 0x730 <__bad_interrupt> + 16: 00 00 nop + 18: 8b c3 rjmp .+1814 ; 0x730 <__bad_interrupt> + 1a: 00 00 nop + 1c: 89 c3 rjmp .+1810 ; 0x730 <__bad_interrupt> + 1e: 00 00 nop + 20: 87 c3 rjmp .+1806 ; 0x730 <__bad_interrupt> + 22: 00 00 nop + 24: 85 c3 rjmp .+1802 ; 0x730 <__bad_interrupt> + 26: 00 00 nop + 28: 83 c3 rjmp .+1798 ; 0x730 <__bad_interrupt> + 2a: 00 00 nop + 2c: 81 c3 rjmp .+1794 ; 0x730 <__bad_interrupt> + 2e: 00 00 nop + 30: 7f c3 rjmp .+1790 ; 0x730 <__bad_interrupt> + 32: 00 00 nop + 34: 7d c3 rjmp .+1786 ; 0x730 <__bad_interrupt> + 36: 00 00 nop + 38: 7b c3 rjmp .+1782 ; 0x730 <__bad_interrupt> + 3a: 00 00 nop + 3c: 79 c3 rjmp .+1778 ; 0x730 <__bad_interrupt> + 3e: 00 00 nop + 40: 77 c3 rjmp .+1774 ; 0x730 <__bad_interrupt> + 42: 00 00 nop + 44: 75 c3 rjmp .+1770 ; 0x730 <__bad_interrupt> + 46: 00 00 nop + 48: 73 c3 rjmp .+1766 ; 0x730 <__bad_interrupt> + 4a: 00 00 nop + 4c: 71 c3 rjmp .+1762 ; 0x730 <__bad_interrupt> + 4e: 00 00 nop + 50: 6f c3 rjmp .+1758 ; 0x730 <__bad_interrupt> + 52: 00 00 nop + 54: 6d c3 rjmp .+1754 ; 0x730 <__bad_interrupt> + 56: 00 00 nop + 58: 0c 94 ab 12 jmp 0x2556 ; 0x2556 <__vector_22> + 5c: 69 c3 rjmp .+1746 ; 0x730 <__bad_interrupt> + 5e: 00 00 nop + 60: 67 c3 rjmp .+1742 ; 0x730 <__bad_interrupt> + 62: 00 00 nop + 64: 65 c3 rjmp .+1738 ; 0x730 <__bad_interrupt> + 66: 00 00 nop + 68: 63 c3 rjmp .+1734 ; 0x730 <__bad_interrupt> + 6a: 00 00 nop + 6c: 61 c3 rjmp .+1730 ; 0x730 <__bad_interrupt> + 6e: 00 00 nop + 70: 5f c3 rjmp .+1726 ; 0x730 <__bad_interrupt> + 72: 00 00 nop + 74: 5d c3 rjmp .+1722 ; 0x730 <__bad_interrupt> + 76: 00 00 nop + 78: 5b c3 rjmp .+1718 ; 0x730 <__bad_interrupt> + 7a: 00 00 nop + 7c: 59 c3 rjmp .+1714 ; 0x730 <__bad_interrupt> + 7e: 00 00 nop + 80: 57 c3 rjmp .+1710 ; 0x730 <__bad_interrupt> + 82: 00 00 nop + 84: 55 c3 rjmp .+1706 ; 0x730 <__bad_interrupt> + 86: 00 00 nop + 88: 0c 94 67 12 jmp 0x24ce ; 0x24ce <__vector_34> + 8c: 51 c3 rjmp .+1698 ; 0x730 <__bad_interrupt> + 8e: 00 00 nop + 90: 4f c3 rjmp .+1694 ; 0x730 <__bad_interrupt> + 92: 00 00 nop + 94: 4d c3 rjmp .+1690 ; 0x730 <__bad_interrupt> + 96: 00 00 nop + 98: 4b c3 rjmp .+1686 ; 0x730 <__bad_interrupt> + 9a: 00 00 nop + 9c: 49 c3 rjmp .+1682 ; 0x730 <__bad_interrupt> + 9e: 00 00 nop + a0: 47 c3 rjmp .+1678 ; 0x730 <__bad_interrupt> + a2: 00 00 nop + a4: 45 c3 rjmp .+1674 ; 0x730 <__bad_interrupt> + a6: 00 00 nop + a8: 43 c3 rjmp .+1670 ; 0x730 <__bad_interrupt> + aa: 00 00 nop + ac: 41 c3 rjmp .+1666 ; 0x730 <__bad_interrupt> + ae: 00 00 nop + b0: 3f c3 rjmp .+1662 ; 0x730 <__bad_interrupt> + b2: 00 00 nop + b4: 3d c3 rjmp .+1658 ; 0x730 <__bad_interrupt> + b6: 00 00 nop + b8: 3b c3 rjmp .+1654 ; 0x730 <__bad_interrupt> + ba: 00 00 nop + bc: 39 c3 rjmp .+1650 ; 0x730 <__bad_interrupt> + be: 00 00 nop + c0: 37 c3 rjmp .+1646 ; 0x730 <__bad_interrupt> + c2: 00 00 nop + c4: 35 c3 rjmp .+1642 ; 0x730 <__bad_interrupt> + c6: 00 00 nop + c8: 33 c3 rjmp .+1638 ; 0x730 <__bad_interrupt> + ca: 00 00 nop + cc: 31 c3 rjmp .+1634 ; 0x730 <__bad_interrupt> + ce: 00 00 nop + d0: 2f c3 rjmp .+1630 ; 0x730 <__bad_interrupt> + d2: 00 00 nop + d4: 2d c3 rjmp .+1626 ; 0x730 <__bad_interrupt> + d6: 00 00 nop + d8: 2b c3 rjmp .+1622 ; 0x730 <__bad_interrupt> + da: 00 00 nop + dc: 29 c3 rjmp .+1618 ; 0x730 <__bad_interrupt> + de: 00 00 nop + e0: 27 c3 rjmp .+1614 ; 0x730 <__bad_interrupt> + e2: 00 00 nop + e4: 25 c3 rjmp .+1610 ; 0x730 <__bad_interrupt> + e6: 00 00 nop + e8: 23 c3 rjmp .+1606 ; 0x730 <__bad_interrupt> + ea: 00 00 nop + ec: 21 c3 rjmp .+1602 ; 0x730 <__bad_interrupt> + ee: 00 00 nop + f0: 1f c3 rjmp .+1598 ; 0x730 <__bad_interrupt> + f2: 00 00 nop + f4: 1d c3 rjmp .+1594 ; 0x730 <__bad_interrupt> + f6: 00 00 nop + f8: 1b c3 rjmp .+1590 ; 0x730 <__bad_interrupt> + fa: 00 00 nop + fc: 19 c3 rjmp .+1586 ; 0x730 <__bad_interrupt> + fe: 00 00 nop + 100: 17 c3 rjmp .+1582 ; 0x730 <__bad_interrupt> + 102: 00 00 nop + 104: 15 c3 rjmp .+1578 ; 0x730 <__bad_interrupt> + 106: 00 00 nop + 108: 13 c3 rjmp .+1574 ; 0x730 <__bad_interrupt> + 10a: 00 00 nop + 10c: 11 c3 rjmp .+1570 ; 0x730 <__bad_interrupt> + 10e: 00 00 nop + 110: 0f c3 rjmp .+1566 ; 0x730 <__bad_interrupt> + 112: 00 00 nop + 114: 0d c3 rjmp .+1562 ; 0x730 <__bad_interrupt> + 116: 00 00 nop + 118: 0b c3 rjmp .+1558 ; 0x730 <__bad_interrupt> + 11a: 00 00 nop + 11c: 09 c3 rjmp .+1554 ; 0x730 <__bad_interrupt> + 11e: 00 00 nop + 120: 07 c3 rjmp .+1550 ; 0x730 <__bad_interrupt> + 122: 00 00 nop + 124: 05 c3 rjmp .+1546 ; 0x730 <__bad_interrupt> + 126: 00 00 nop + 128: 03 c3 rjmp .+1542 ; 0x730 <__bad_interrupt> + 12a: 00 00 nop + 12c: 01 c3 rjmp .+1538 ; 0x730 <__bad_interrupt> + 12e: 00 00 nop + 130: ff c2 rjmp .+1534 ; 0x730 <__bad_interrupt> + 132: 00 00 nop + 134: fd c2 rjmp .+1530 ; 0x730 <__bad_interrupt> + 136: 00 00 nop + 138: fb c2 rjmp .+1526 ; 0x730 <__bad_interrupt> + 13a: 00 00 nop + 13c: f9 c2 rjmp .+1522 ; 0x730 <__bad_interrupt> + 13e: 00 00 nop + 140: f7 c2 rjmp .+1518 ; 0x730 <__bad_interrupt> + 142: 00 00 nop + 144: f5 c2 rjmp .+1514 ; 0x730 <__bad_interrupt> + 146: 00 00 nop + 148: f3 c2 rjmp .+1510 ; 0x730 <__bad_interrupt> + 14a: 00 00 nop + 14c: 0c 94 65 13 jmp 0x26ca ; 0x26ca <__vector_83> + 150: ef c2 rjmp .+1502 ; 0x730 <__bad_interrupt> + 152: 00 00 nop + 154: ed c2 rjmp .+1498 ; 0x730 <__bad_interrupt> + 156: 00 00 nop + 158: eb c2 rjmp .+1494 ; 0x730 <__bad_interrupt> + 15a: 00 00 nop + 15c: e9 c2 rjmp .+1490 ; 0x730 <__bad_interrupt> + 15e: 00 00 nop + 160: e7 c2 rjmp .+1486 ; 0x730 <__bad_interrupt> + 162: 00 00 nop + 164: e5 c2 rjmp .+1482 ; 0x730 <__bad_interrupt> + 166: 00 00 nop + 168: e3 c2 rjmp .+1478 ; 0x730 <__bad_interrupt> + 16a: 00 00 nop + 16c: e1 c2 rjmp .+1474 ; 0x730 <__bad_interrupt> + 16e: 00 00 nop + 170: df c2 rjmp .+1470 ; 0x730 <__bad_interrupt> + 172: 00 00 nop + 174: dd c2 rjmp .+1466 ; 0x730 <__bad_interrupt> + 176: 00 00 nop + 178: db c2 rjmp .+1462 ; 0x730 <__bad_interrupt> + 17a: 00 00 nop + 17c: d9 c2 rjmp .+1458 ; 0x730 <__bad_interrupt> + 17e: 00 00 nop + 180: d7 c2 rjmp .+1454 ; 0x730 <__bad_interrupt> + 182: 00 00 nop + 184: d5 c2 rjmp .+1450 ; 0x730 <__bad_interrupt> + 186: 00 00 nop + 188: d3 c2 rjmp .+1446 ; 0x730 <__bad_interrupt> + 18a: 00 00 nop + 18c: d1 c2 rjmp .+1442 ; 0x730 <__bad_interrupt> + 18e: 00 00 nop + 190: cf c2 rjmp .+1438 ; 0x730 <__bad_interrupt> + 192: 00 00 nop + 194: cd c2 rjmp .+1434 ; 0x730 <__bad_interrupt> + 196: 00 00 nop + 198: cb c2 rjmp .+1430 ; 0x730 <__bad_interrupt> + 19a: 00 00 nop + 19c: c9 c2 rjmp .+1426 ; 0x730 <__bad_interrupt> + 19e: 00 00 nop + 1a0: c7 c2 rjmp .+1422 ; 0x730 <__bad_interrupt> + 1a2: 00 00 nop + 1a4: c5 c2 rjmp .+1418 ; 0x730 <__bad_interrupt> + 1a6: 00 00 nop + 1a8: c3 c2 rjmp .+1414 ; 0x730 <__bad_interrupt> + 1aa: 00 00 nop + 1ac: c1 c2 rjmp .+1410 ; 0x730 <__bad_interrupt> + 1ae: 00 00 nop + 1b0: bf c2 rjmp .+1406 ; 0x730 <__bad_interrupt> + 1b2: 00 00 nop + 1b4: bd c2 rjmp .+1402 ; 0x730 <__bad_interrupt> + 1b6: 00 00 nop + 1b8: bb c2 rjmp .+1398 ; 0x730 <__bad_interrupt> + 1ba: 00 00 nop + 1bc: b9 c2 rjmp .+1394 ; 0x730 <__bad_interrupt> + 1be: 00 00 nop + 1c0: b7 c2 rjmp .+1390 ; 0x730 <__bad_interrupt> + 1c2: 00 00 nop + 1c4: b5 c2 rjmp .+1386 ; 0x730 <__bad_interrupt> + 1c6: 00 00 nop + 1c8: b3 c2 rjmp .+1382 ; 0x730 <__bad_interrupt> + 1ca: 00 00 nop + 1cc: b1 c2 rjmp .+1378 ; 0x730 <__bad_interrupt> + 1ce: 00 00 nop + 1d0: af c2 rjmp .+1374 ; 0x730 <__bad_interrupt> + 1d2: 00 00 nop + 1d4: ad c2 rjmp .+1370 ; 0x730 <__bad_interrupt> + 1d6: 00 00 nop + 1d8: ab c2 rjmp .+1366 ; 0x730 <__bad_interrupt> + 1da: 00 00 nop + 1dc: a9 c2 rjmp .+1362 ; 0x730 <__bad_interrupt> + 1de: 00 00 nop + 1e0: a7 c2 rjmp .+1358 ; 0x730 <__bad_interrupt> + 1e2: 00 00 nop + 1e4: a5 c2 rjmp .+1354 ; 0x730 <__bad_interrupt> + 1e6: 00 00 nop + 1e8: a3 c2 rjmp .+1350 ; 0x730 <__bad_interrupt> + 1ea: 00 00 nop + 1ec: a1 c2 rjmp .+1346 ; 0x730 <__bad_interrupt> + 1ee: 00 00 nop + 1f0: 9f c2 rjmp .+1342 ; 0x730 <__bad_interrupt> + 1f2: 00 00 nop + 1f4: 0c 94 03 21 jmp 0x4206 ; 0x4206 <__vector_125> + 1f8: 9b c2 rjmp .+1334 ; 0x730 <__bad_interrupt> + 1fa: 00 00 nop + 1fc: 66 0f add r22, r22 + 1fe: 66 0f add r22, r22 + 200: 4e 0f add r20, r30 + 202: 57 0f add r21, r23 + 204: 70 0f add r23, r16 + 206: 24 0f add r18, r20 + 208: 3e 0f add r19, r30 + 20a: 41 0f add r20, r17 + 20c: 38 0f add r19, r24 + 20e: 29 14 cp r2, r9 + 210: b5 13 cpse r27, r21 + 212: be 13 cpse r27, r30 + 214: c5 13 cpse r28, r21 + 216: d3 13 cpse r29, r19 + 218: de 13 cpse r29, r30 + 21a: 03 14 cp r0, r3 + 21c: 7d 13 cpse r23, r29 + 21e: 11 14 cp r1, r1 + 220: 18 14 cp r1, r8 + 222: 1f 14 cp r1, r15 + 224: 81 15 cp r24, r1 + 226: 81 15 cp r24, r1 + 228: 95 15 cp r25, r5 + 22a: 50 16 cp r5, r16 + 22c: a7 15 cp r26, r7 + 22e: c5 15 cp r28, r5 + 230: 45 15 cp r20, r5 + 232: 69 15 cp r22, r9 + 234: 69 15 cp r22, r9 + 236: 69 15 cp r22, r9 + 238: 0e 1c adc r0, r14 + 23a: db 1b sub r29, r27 + 23c: 7a 1b sub r23, r26 + 23e: db 1b sub r29, r27 + 240: 7a 1b sub r23, r26 + 242: c9 1b sub r28, r25 + 244: ab 1b sub r26, r27 + 246: 7a 1b sub r23, r26 + 248: a2 1b sub r26, r18 + 24a: 8b 1b sub r24, r27 + +0000024c : + 24c: 1c 03 4c 00 55 00 46 00 41 00 20 00 43 00 44 00 ..L.U.F.A. .C.D. + 25c: 43 00 20 00 44 00 65 00 6d 00 6f 00 00 00 C. .D.e.m.o... + +0000026a : + 26a: 18 03 44 00 65 00 61 00 6e 00 20 00 43 00 61 00 ..D.e.a.n. .C.a. + 27a: 6d 00 65 00 72 00 61 00 00 00 m.e.r.a... + +00000284 : + 284: 04 03 09 04 .... + +00000288 : + 288: 09 02 3e 00 02 01 00 c0 32 09 04 00 00 01 02 02 ..>.....2....... + 298: 01 00 05 24 00 10 01 04 24 02 06 05 24 06 00 01 ...$....$...$... + 2a8: 07 05 82 03 08 00 ff 09 04 01 00 02 0a 00 00 00 ................ + 2b8: 07 05 04 02 10 00 05 07 05 83 02 10 00 05 .............. + +000002c6 : + 2c6: 12 01 10 01 02 00 00 08 eb 03 44 20 01 00 01 02 ..........D .... + 2d6: dc 01 .. + +000002d8 : + 2d8: 00 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 .NONE........... + 2e8: 00 89 04 8a 04 8b 04 8c 04 8d 04 8e 04 91 04 92 ................ + 2f8: 04 00 00 00 01 01 4d 46 5f 43 4c 41 53 53 49 43 ......MF_CLASSIC + 308: 5f 31 4b 00 00 00 43 14 7a 14 f5 14 0f 15 13 15 _1K...C.z....... + 318: 14 15 e7 18 ed 18 00 04 04 00 02 4d 46 5f 43 4c ...........MF_CL + 328: 41 53 53 49 43 5f 34 4b 00 00 00 43 14 7a 14 02 ASSIC_4K...C.z.. + 338: 15 0f 15 13 15 14 15 e7 18 ed 18 00 10 04 00 ............... + +00000347 : + 347: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ + 357: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 367: 55 49 44 5f 52 41 4e 44 4f 4d 00 00 00 00 00 00 UID_RANDOM...... + 377: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 387: 55 49 44 5f 4c 45 46 54 5f 49 4e 43 52 45 4d 45 UID_LEFT_INCREME + 397: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. + 3a7: 55 49 44 5f 52 49 47 48 54 5f 49 4e 43 52 45 4d UID_RIGHT_INCREM + 3b7: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. + 3c7: 55 49 44 5f 4c 45 46 54 5f 44 45 43 52 45 4d 45 UID_LEFT_DECREME + 3d7: 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NT.............. + 3e7: 55 49 44 5f 52 49 47 48 54 5f 44 45 43 52 45 4d UID_RIGHT_DECREM + 3f7: 45 4e 54 00 00 00 00 00 00 00 00 00 00 00 00 00 ENT............. + 407: 43 59 43 4c 45 5f 53 45 54 54 49 4e 47 53 00 00 CYCLE_SETTINGS.. + 417: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 427: 53 54 4f 52 45 5f 4d 45 4d 00 00 00 00 00 00 00 STORE_MEM....... + 437: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 447: 52 45 43 41 4c 4c 5f 4d 45 4d 00 00 00 00 00 00 RECALL_MEM...... + 457: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + +00000467 <__c.6505>: + 467: 25 35 75 20 6d 56 00 %5u mV. + +0000046e <__c.6466>: + 46e: 25 75 00 %u. + +00000471 <__c.6461>: + 471: 25 75 00 %u. + +00000474 <__c.6434>: + 474: 52 41 4e 44 4f 4d 00 RANDOM. + +0000047b <__c.6416>: + 47b: 25 73 00 %s. + +0000047e <__c.6405>: + 47e: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % + 48e: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S + 49e: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV + 4ae: 52 2d 47 43 43 20 25 53 00 R-GCC %S. + +000004b7 <__c.6407>: + 4b7: 31 34 30 39 32 34 00 140924. + +000004be <__c.6409>: + 4be: 31 33 30 39 30 31 00 130901. + +000004c5 <__c.6411>: + 4c5: 34 2e 38 2e 31 00 4.8.1. + +000004cb <__c.6197>: + 4cb: 0d 0a 00 ... + +000004ce <__c.6195>: + 4ce: 0d 0a 00 ... + +000004d1 : + 4d1: 64 31 30 30 3a 4f 4b 00 00 00 00 00 00 00 00 00 d100:OK......... + 4e1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 4f1: 00 65 31 30 31 3a 4f 4b 20 57 49 54 48 20 54 45 .e101:OK WITH TE + 501: 58 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XT.............. + 511: 00 00 6e 31 31 30 3a 57 41 49 54 49 4e 47 20 46 ..n110:WAITING F + 521: 4f 52 20 58 4d 4f 44 45 4d 00 00 00 00 00 00 00 OR XMODEM....... + 531: 00 00 00 c8 32 30 30 3a 55 4e 4b 4e 4f 57 4e 20 ....200:UNKNOWN + 541: 43 4f 4d 4d 41 4e 44 00 00 00 00 00 00 00 00 00 COMMAND......... + 551: 00 00 00 00 c9 32 30 31 3a 49 4e 56 41 4c 49 44 .....201:INVALID + 561: 20 43 4f 4d 4d 41 4e 44 20 55 53 41 47 45 00 00 COMMAND USAGE.. + 571: 00 00 00 00 00 ca 32 30 32 3a 49 4e 56 41 4c 49 ......202:INVALI + 581: 44 20 50 41 52 41 4d 45 54 45 52 00 00 00 00 00 D PARAMETER..... + 591: 00 00 00 00 00 00 ...... + +00000597 : + 597: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... + 5a7: 00 00 00 00 14 0d 43 4f 4e 46 49 47 00 00 00 00 ......CONFIG.... + 5b7: 00 00 00 00 00 00 51 0d 48 0d 32 0d 55 49 44 00 ......Q.H.2.UID. + 5c7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 81 0d ................ + 5d7: 57 0d 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 W.READONLY...... + 5e7: 00 00 00 00 e5 0d d3 0d 55 50 4c 4f 41 44 00 00 ........UPLOAD.. + 5f7: 00 00 00 00 00 00 00 00 f9 0d 00 00 00 00 44 4f ..............DO + 607: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 fe 0d WNLOAD.......... + 617: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... + 627: 00 00 00 00 03 0e 00 00 00 00 55 50 47 52 41 44 ..........UPGRAD + 637: 45 00 00 00 00 00 00 00 00 00 0e 0e 00 00 00 00 E............... + 647: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... + 657: 00 00 00 00 19 0e 55 49 44 53 49 5a 45 00 00 00 ......UIDSIZE... + 667: 00 00 00 00 00 00 00 00 00 00 31 0e 42 55 54 54 ..........1.BUTT + 677: 4f 4e 00 00 00 00 00 00 00 00 00 00 47 0e 51 0e ON..........G.Q. + 687: 4c 0e 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 L.SETTING....... + 697: 00 00 00 00 5e 0e 59 0e 43 4c 45 41 52 00 00 00 ....^.Y.CLEAR... + 6a7: 00 00 00 00 00 00 00 00 66 0e 00 00 00 00 48 45 ........f.....HE + 6b7: 4c 50 00 00 00 00 00 00 00 00 00 00 00 00 6a 0e LP............j. + 6c7: 00 00 00 00 52 53 53 49 00 00 00 00 00 00 00 00 ....RSSI........ + 6d7: 00 00 00 00 00 00 00 00 b4 0e 00 00 00 00 00 00 ................ + 6e7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 6f7: 00 . + +000006f8 <__ctors_end>: + 6f8: 11 24 eor r1, r1 + 6fa: 1f be out 0x3f, r1 ; 63 + 6fc: cf ef ldi r28, 0xFF ; 255 + 6fe: cd bf out 0x3d, r28 ; 61 + 700: df e2 ldi r29, 0x2F ; 47 + 702: de bf out 0x3e, r29 ; 62 + +00000704 <__do_copy_data>: + 704: 10 e2 ldi r17, 0x20 ; 32 + 706: a0 e0 ldi r26, 0x00 ; 0 + 708: b0 e2 ldi r27, 0x20 ; 32 + 70a: ea e9 ldi r30, 0x9A ; 154 + 70c: fe e4 ldi r31, 0x4E ; 78 + 70e: 02 c0 rjmp .+4 ; 0x714 <__do_copy_data+0x10> + 710: 05 90 lpm r0, Z+ + 712: 0d 92 st X+, r0 + 714: a2 39 cpi r26, 0x92 ; 146 + 716: b1 07 cpc r27, r17 + 718: d9 f7 brne .-10 ; 0x710 <__do_copy_data+0xc> + +0000071a <__do_clear_bss>: + 71a: 2a e2 ldi r18, 0x2A ; 42 + 71c: a2 e9 ldi r26, 0x92 ; 146 + 71e: b0 e2 ldi r27, 0x20 ; 32 + 720: 01 c0 rjmp .+2 ; 0x724 <.do_clear_bss_start> + +00000722 <.do_clear_bss_loop>: + 722: 1d 92 st X+, r1 + +00000724 <.do_clear_bss_start>: + 724: ad 39 cpi r26, 0x9D ; 157 + 726: b2 07 cpc r27, r18 + 728: e1 f7 brne .-8 ; 0x722 <.do_clear_bss_loop> + 72a: 03 d0 rcall .+6 ; 0x732
+ 72c: 0c 94 4b 27 jmp 0x4e96 ; 0x4e96 <_exit> + +00000730 <__bad_interrupt>: + 730: 79 c0 rjmp .+242 ; 0x824 <__vector_default> + +00000732
: + +#include "Chameleon-Mini.h" + +int main(void) +{ + SystemInit(); + 732: 7e d0 rcall .+252 ; 0x830 + SettingsLoad(); + 734: 0e 94 d0 0b call 0x17a0 ; 0x17a0 + +extern uint8_t LEDPulseMask; + +static inline +void LEDInit(void) { + LED_PORT.DIRSET = LED_MASK; + 738: 80 e3 ldi r24, 0x30 ; 48 + 73a: 80 93 01 06 sts 0x0601, r24 + LEDInit(); + MemoryInit(); + 73e: e4 d2 rcall .+1480 ; 0xd08 + ConfigurationInit(); + 740: 0d d1 rcall .+538 ; 0x95c + TerminalInit(); + 742: 0e 94 9e 0c call 0x193c ; 0x193c + RandomInit(); + 746: 87 d1 rcall .+782 ; 0xa56 + ButtonInit(); + 748: a0 d6 rcall .+3392 ; 0x148a +#define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE) + +static inline +void AntennaLevelInit(void) +{ + ADCA.CTRLA = ADC_ENABLE_bm; + 74a: 81 e0 ldi r24, 0x01 ; 1 + 74c: 80 93 00 02 sts 0x0200, r24 + ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; + 750: 10 92 01 02 sts 0x0201, r1 + ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; + 754: 92 e0 ldi r25, 0x02 ; 2 + 756: 90 93 02 02 sts 0x0202, r25 + ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; + 75a: 93 e0 ldi r25, 0x03 ; 3 + 75c: 90 93 04 02 sts 0x0204, r25 + ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; + 760: 80 93 20 02 sts 0x0220, r24 + ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc; + 764: 88 e3 ldi r24, 0x38 ; 56 + 766: 80 93 21 02 sts 0x0221, r24 + AntennaLevelInit(); + + SystemInterruptInit(); + 76a: cd d0 rcall .+410 ; 0x906 +} + +INLINE bool SystemTick100ms(void) +{ + if (TCE0.INTFLAGS & TC0_OVFIF_bm) { + TCE0.INTFLAGS = TC0_OVFIF_bm; + 76c: c1 e0 ldi r28, 0x01 ; 1 + + while(1) { + TerminalTask(); + 76e: 0e 94 a3 0c call 0x1946 ; 0x1946 +INLINE void CodecInit(void) { + ActiveConfiguration.CodecInitFunc(); +} + +INLINE void CodecTask(void) { + ActiveConfiguration.CodecTaskFunc(); + 772: e0 91 eb 24 lds r30, 0x24EB + 776: f0 91 ec 24 lds r31, 0x24EC + 77a: 09 95 icall +INLINE void ApplicationInit(void) { + ActiveConfiguration.ApplicationInitFunc(); +} + +INLINE void ApplicationTask(void) { + ActiveConfiguration.ApplicationTaskFunc(); + 77c: e0 91 f1 24 lds r30, 0x24F1 + 780: f0 91 f2 24 lds r31, 0x24F2 + 784: 09 95 icall + return RTC.CNT; +} + +INLINE bool SystemTick100ms(void) +{ + if (TCE0.INTFLAGS & TC0_OVFIF_bm) { + 786: 80 91 0c 0a lds r24, 0x0A0C + 78a: 80 ff sbrs r24, 0 + 78c: f0 cf rjmp .-32 ; 0x76e + TCE0.INTFLAGS = TC0_OVFIF_bm; + 78e: c0 93 0c 0a sts 0x0A0C, r28 + CodecTask(); + ApplicationTask(); + + if (SystemTick100ms()) { + RandomTick(); + 792: 75 d1 rcall .+746 ; 0xa7e + TerminalTick(); + 794: 0e 94 c2 0c call 0x1984 ; 0x1984 + ButtonTick(); + 798: 7f d6 rcall .+3326 ; 0x1498 + LED_PORT.OUTSET = Mask; +} + +static inline +void LEDTick(void) { + LED_PORT.OUTCLR = LEDPulseMask; + 79a: 80 91 93 24 lds r24, 0x2493 + 79e: 80 93 06 06 sts 0x0606, r24 + LEDPulseMask = 0; + 7a2: 10 92 93 24 sts 0x2493, r1 + 7a6: e3 cf rjmp .-58 ; 0x76e + +000007a8 : + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + 7a8: 29 2f mov r18, r25 + 7aa: 33 27 eor r19, r19 + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + 7ac: 22 30 cpi r18, 0x02 ; 2 + 7ae: 31 05 cpc r19, r1 + 7b0: 29 f1 breq .+74 ; 0x7fc + 7b2: 23 30 cpi r18, 0x03 ; 3 + 7b4: 31 05 cpc r19, r1 + 7b6: 99 f0 breq .+38 ; 0x7de + 7b8: 21 30 cpi r18, 0x01 ; 1 + 7ba: 31 05 cpc r19, r1 + 7bc: 41 f0 breq .+16 ; 0x7ce +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + 7be: 80 e0 ldi r24, 0x00 ; 0 + 7c0: 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; + 7c2: 20 e0 ldi r18, 0x00 ; 0 + 7c4: 30 e0 ldi r19, 0x00 ; 0 + } + + break; + } + + *DescriptorAddress = Address; + 7c6: fa 01 movw r30, r20 + 7c8: 20 83 st Z, r18 + 7ca: 31 83 std Z+1, r19 ; 0x01 + return Size; +} + 7cc: 08 95 ret + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + 7ce: 82 e1 ldi r24, 0x12 ; 18 + 7d0: 90 e0 ldi r25, 0x00 ; 0 + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + 7d2: 26 ec ldi r18, 0xC6 ; 198 + 7d4: 32 e0 ldi r19, 0x02 ; 2 + } + + break; + } + + *DescriptorAddress = Address; + 7d6: fa 01 movw r30, r20 + 7d8: 20 83 st Z, r18 + 7da: 31 83 std Z+1, r19 ; 0x01 + return Size; +} + 7dc: 08 95 ret + 7de: 99 27 eor r25, r25 + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + 7e0: 81 30 cpi r24, 0x01 ; 1 + 7e2: 91 05 cpc r25, r1 + 7e4: 99 f0 breq .+38 ; 0x80c + 7e6: 82 30 cpi r24, 0x02 ; 2 + 7e8: 91 05 cpc r25, r1 + 7ea: b1 f0 breq .+44 ; 0x818 + 7ec: 89 2b or r24, r25 + 7ee: 39 f7 brne .-50 ; 0x7be + { + case 0x00: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + 7f0: e4 e8 ldi r30, 0x84 ; 132 + 7f2: f2 e0 ldi r31, 0x02 ; 2 + 7f4: 84 91 lpm r24, Z + 7f6: 90 e0 ldi r25, 0x00 ; 0 + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = &LanguageString; + 7f8: 9f 01 movw r18, r30 + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + 7fa: e5 cf rjmp .-54 ; 0x7c6 + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + 7fc: 8e e3 ldi r24, 0x3E ; 62 + 7fe: 90 e0 ldi r25, 0x00 ; 0 + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + 800: 28 e8 ldi r18, 0x88 ; 136 + 802: 32 e0 ldi r19, 0x02 ; 2 + } + + break; + } + + *DescriptorAddress = Address; + 804: fa 01 movw r30, r20 + 806: 20 83 st Z, r18 + 808: 31 83 std Z+1, r19 ; 0x01 + return Size; +} + 80a: 08 95 ret + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + 80c: ea e6 ldi r30, 0x6A ; 106 + 80e: f2 e0 ldi r31, 0x02 ; 2 + 810: 84 91 lpm r24, Z + 812: 90 e0 ldi r25, 0x00 ; 0 + case 0x00: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = &ManufacturerString; + 814: 9f 01 movw r18, r30 + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + 816: d7 cf rjmp .-82 ; 0x7c6 + case 0x02: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + 818: ec e4 ldi r30, 0x4C ; 76 + 81a: f2 e0 ldi r31, 0x02 ; 2 + 81c: 84 91 lpm r24, Z + 81e: 90 e0 ldi r25, 0x00 ; 0 + case 0x01: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case 0x02: + Address = &ProductString; + 820: 9f 01 movw r18, r30 + Size = pgm_read_byte(&ProductString.Header.Size); + break; + 822: d1 cf rjmp .-94 ; 0x7c6 + +00000824 <__vector_default>: + +#include "System.h" +#include "LED.h" + +ISR(BADISR_vect) +{ + 824: 1f 92 push r1 + 826: 0f 92 push r0 + 828: 0f b6 in r0, 0x3f ; 63 + 82a: 0f 92 push r0 + 82c: 11 24 eor r1, r1 + 82e: ff cf rjmp .-2 ; 0x82e <__vector_default+0xa> + +00000830 : + while(1); +} + +void SystemInit(void) +{ + if (RST.STATUS & RST_WDRF_bm) { + 830: 80 91 78 00 lds r24, 0x0078 + 834: 83 ff sbrs r24, 3 + 836: 0a c0 rjmp .+20 ; 0x84c + /* On Watchdog reset clear WDRF bit, disable watchdog + * and jump into bootloader */ + RST.STATUS = RST_WDRF_bm; + 838: 88 e0 ldi r24, 0x08 ; 8 + 83a: 80 93 78 00 sts 0x0078, r24 + + CCP = CCP_IOREG_gc; + 83e: 88 ed ldi r24, 0xD8 ; 216 + 840: 84 bf out 0x34, r24 ; 52 + WDT.CTRL = WDT_CEN_bm; + 842: 81 e0 ldi r24, 0x01 ; 1 + 844: 80 93 80 00 sts 0x0080, r24 + + asm volatile ("jmp %0"::"i" (BOOT_SECTION_START + 0x1FC)); + 848: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f32d0> + } + + /* 32MHz system clock using internal RC and 32K DFLL*/ + OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm; + 84c: 80 91 50 00 lds r24, 0x0050 + 850: 86 60 ori r24, 0x06 ; 6 + 852: 80 93 50 00 sts 0x0050, r24 + while(!(OSC.STATUS & OSC_RC32MRDY_bm)) + 856: 80 91 51 00 lds r24, 0x0051 + 85a: 81 ff sbrs r24, 1 + 85c: fc cf rjmp .-8 ; 0x856 + ; + while(!(OSC.STATUS & OSC_RC32KRDY_bm)) + 85e: 80 91 51 00 lds r24, 0x0051 + 862: 82 ff sbrs r24, 2 + 864: fc cf rjmp .-8 ; 0x85e + ; + + OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; + 866: 10 92 56 00 sts 0x0056, r1 + DFLLRC32M.CTRL = DFLL_ENABLE_bm; + 86a: 21 e0 ldi r18, 0x01 ; 1 + 86c: 20 93 60 00 sts 0x0060, r18 + + CCP = CCP_IOREG_gc; + 870: 88 ed ldi r24, 0xD8 ; 216 + 872: 84 bf out 0x34, r24 ; 52 + CLK.CTRL = CLK_SCLKSEL_RC32M_gc; + 874: 20 93 40 00 sts 0x0040, r18 + + /* Use TCE0 as system tick */ + TCE0.PER = F_CPU / 256 / SYSTEM_TICK_FREQ - 1; + 878: 83 ed ldi r24, 0xD3 ; 211 + 87a: 90 e3 ldi r25, 0x30 ; 48 + 87c: 80 93 26 0a sts 0x0A26, r24 + 880: 90 93 27 0a sts 0x0A27, r25 + TCE0.CTRLA = TC_CLKSEL_DIV256_gc; + 884: 86 e0 ldi r24, 0x06 ; 6 + 886: 80 93 00 0a sts 0x0A00, r24 + + /* Enable RTC with roughly 1kHz clock */ + CLK.RTCCTRL = CLK_RTCSRC_ULP_gc | CLK_RTCEN_bm; + 88a: 20 93 43 00 sts 0x0043, r18 + RTC.CTRL = RTC_PRESCALER_DIV1_gc; + 88e: 20 93 00 04 sts 0x0400, r18 + + /* Enable EEPROM data memory mapping */ + NVM.CTRLB |= NVM_EEMAPEN_bm; + 892: 80 91 cc 01 lds r24, 0x01CC + 896: 88 60 ori r24, 0x08 ; 8 + 898: 80 93 cc 01 sts 0x01CC, r24 + 89c: 08 95 ret + +0000089e : +} + +void SystemReset(void) +{ + CCP = CCP_IOREG_gc; + 89e: 88 ed ldi r24, 0xD8 ; 216 + 8a0: 84 bf out 0x34, r24 ; 52 + RST.CTRL = RST_SWRST_bm; + 8a2: 81 e0 ldi r24, 0x01 ; 1 + 8a4: e8 e7 ldi r30, 0x78 ; 120 + 8a6: f0 e0 ldi r31, 0x00 ; 0 + 8a8: 81 83 std Z+1, r24 ; 0x01 + 8aa: 08 95 ret + +000008ac : +} + +void SystemEnterBootloader(void) +{ + /* Use Watchdog timer to reset into bootloader. */ + CCP = CCP_IOREG_gc; + 8ac: 88 ed ldi r24, 0xD8 ; 216 + 8ae: 84 bf out 0x34, r24 ; 52 + WDT.CTRL = WDT_PER_512CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; + 8b0: 8b e1 ldi r24, 0x1B ; 27 + 8b2: 80 93 80 00 sts 0x0080, r24 + 8b6: 08 95 ret + +000008b8 : + + +void SystemStartUSBClock(void) +{ + /* 48MHz USB Clock using 12MHz XTAL */ + OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; + 8b8: 8b ec ldi r24, 0xCB ; 203 + 8ba: 80 93 52 00 sts 0x0052, r24 + OSC.CTRL |= OSC_XOSCEN_bm; + 8be: 80 91 50 00 lds r24, 0x0050 + 8c2: 88 60 ori r24, 0x08 ; 8 + 8c4: 80 93 50 00 sts 0x0050, r24 + while(!(OSC.STATUS & OSC_XOSCRDY_bm)) + 8c8: 80 91 51 00 lds r24, 0x0051 + 8cc: 83 ff sbrs r24, 3 + 8ce: fc cf rjmp .-8 ; 0x8c8 + ; + + OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (4 << OSC_PLLFAC_gp); + 8d0: 84 ec ldi r24, 0xC4 ; 196 + 8d2: 80 93 55 00 sts 0x0055, r24 + + OSC.CTRL |= OSC_PLLEN_bm; + 8d6: 80 91 50 00 lds r24, 0x0050 + 8da: 80 61 ori r24, 0x10 ; 16 + 8dc: 80 93 50 00 sts 0x0050, r24 + while(!(OSC.STATUS & OSC_PLLRDY_bm)) + 8e0: 80 91 51 00 lds r24, 0x0051 + 8e4: 84 ff sbrs r24, 4 + 8e6: fc cf rjmp .-8 ; 0x8e0 + ; +} + 8e8: 08 95 ret + +000008ea : + +void SystemStopUSBClock(void) +{ + /* Disable USB Clock to minimize power consumption */ + CLK.USBCTRL &= ~CLK_USBSEN_bm; + 8ea: e0 e4 ldi r30, 0x40 ; 64 + 8ec: f0 e0 ldi r31, 0x00 ; 0 + 8ee: 84 81 ldd r24, Z+4 ; 0x04 + 8f0: 8e 7f andi r24, 0xFE ; 254 + 8f2: 84 83 std Z+4, r24 ; 0x04 + OSC.CTRL &= ~OSC_PLLEN_bm; + 8f4: e0 e5 ldi r30, 0x50 ; 80 + 8f6: f0 e0 ldi r31, 0x00 ; 0 + 8f8: 80 81 ld r24, Z + 8fa: 8f 7e andi r24, 0xEF ; 239 + 8fc: 80 83 st Z, r24 + OSC.CTRL &= ~OSC_XOSCEN_bm; + 8fe: 80 81 ld r24, Z + 900: 87 7f andi r24, 0xF7 ; 247 + 902: 80 83 st Z, r24 + 904: 08 95 ret + +00000906 : +} + +void SystemInterruptInit(void) +{ + /* Enable all interrupt levels */ + PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; + 906: 87 e0 ldi r24, 0x07 ; 7 + 908: e0 ea ldi r30, 0xA0 ; 160 + 90a: f0 e0 ldi r31, 0x00 ; 0 + 90c: 82 83 std Z+2, r24 ; 0x02 + sei(); + 90e: 78 94 sei + 910: 08 95 ret + +00000912 : + +/* Include all Codecs and Applications */ +#include "Codec/Codec.h" +#include "Application/Application.h" + +static void CodecInitDummy(void) { } + 912: 08 95 ret + +00000914 : +static void CodecTaskDummy(void) { } + 914: 08 95 ret + +00000916 : +static void ApplicationInitDummy(void) {} + 916: 08 95 ret + +00000918 : +static void ApplicationResetDummy(void) {} + 918: 08 95 ret + +0000091a : +static void ApplicationTaskDummy(void) {} + 91a: 08 95 ret + +0000091c : +static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } + 91c: 80 e0 ldi r24, 0x00 ; 0 + 91e: 90 e0 ldi r25, 0x00 ; 0 + 920: 08 95 ret + +00000922 : +static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } + 922: 08 95 ret + +00000924 : +static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } + 924: 08 95 ret + +00000926 : + ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); +} + +void ConfigurationSetById( ConfigurationEnum Configuration ) +{ + GlobalSettings.ActiveSettingPtr->Configuration = Configuration; + 926: e0 91 fe 24 lds r30, 0x24FE + 92a: f0 91 ff 24 lds r31, 0x24FF + 92e: 81 83 std Z+1, r24 ; 0x01 + + /* Copy struct from PROGMEM to RAM */ + memcpy_P(&ActiveConfiguration, + &ConfigurationTable[Configuration], sizeof(ConfigurationType)); + 930: 95 e2 ldi r25, 0x25 ; 37 + 932: 89 9f mul r24, r25 + 934: b0 01 movw r22, r0 + 936: 11 24 eor r1, r1 + 938: 68 52 subi r22, 0x28 ; 40 + 93a: 7d 4f sbci r23, 0xFD ; 253 +void ConfigurationSetById( ConfigurationEnum Configuration ) +{ + GlobalSettings.ActiveSettingPtr->Configuration = Configuration; + + /* Copy struct from PROGMEM to RAM */ + memcpy_P(&ActiveConfiguration, + 93c: 45 e2 ldi r20, 0x25 ; 37 + 93e: 50 e0 ldi r21, 0x00 ; 0 + 940: 88 ed ldi r24, 0xD8 ; 216 + 942: 94 e2 ldi r25, 0x24 ; 36 + 944: 0e 94 e5 23 call 0x47ca ; 0x47ca +/* Applications */ +#include "MifareClassic.h" + +/* Function wrappers */ +INLINE void ApplicationInit(void) { + ActiveConfiguration.ApplicationInitFunc(); + 948: e0 91 ed 24 lds r30, 0x24ED + 94c: f0 91 ee 24 lds r31, 0x24EE + 950: 09 95 icall +#define CODEC_CARRIER_FREQ 13560000 + +extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; + +INLINE void CodecInit(void) { + ActiveConfiguration.CodecInitFunc(); + 952: e0 91 e9 24 lds r30, 0x24E9 + 956: f0 91 ea 24 lds r31, 0x24EA + 95a: 09 94 ijmp + +0000095c : + +ConfigurationType ActiveConfiguration; + +void ConfigurationInit(void) +{ + ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); + 95c: e0 91 fe 24 lds r30, 0x24FE + 960: f0 91 ff 24 lds r31, 0x24FF + 964: 81 81 ldd r24, Z+1 ; 0x01 + 966: df cf rjmp .-66 ; 0x926 + +00000968 : + ApplicationInit(); + CodecInit(); +} + +bool ConfigurationSetByName(const char* ConfigurationName) +{ + 968: 0f 93 push r16 + 96a: 1f 93 push r17 + 96c: cf 93 push r28 + 96e: df 93 push r29 + 970: 49 ed ldi r20, 0xD9 ; 217 + 972: 52 e0 ldi r21, 0x02 ; 2 + uint8_t i; + + /* Loop through table trying to find the configuration */ + for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { + 974: 10 e0 ldi r17, 0x00 ; 0 + 976: bc 01 movw r22, r24 + 978: 6f 5f subi r22, 0xFF ; 255 + 97a: 7f 4f sbci r23, 0xFF ; 255 + const char* pTableConfigName = ConfigurationTable[i].ConfigurationName; + 97c: 9a 01 movw r18, r20 + const char* pRequestedConfigName = ConfigurationName; + bool StringMismatch = false; + char c = pgm_read_byte(pTableConfigName); + 97e: fa 01 movw r30, r20 + 980: c4 91 lpm r28, Z + + /* Try to keep running until both strings end at the same point */ + while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { + 982: c1 11 cpse r28, r1 + 984: 0f c0 rjmp .+30 ; 0x9a4 + 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; + 986: 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') ) { + 988: 28 81 ld r18, Y + 98a: 22 23 and r18, r18 + 98c: 11 f1 breq .+68 ; 0x9d2 +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++) { + 98e: 1f 5f subi r17, 0xFF ; 255 + 990: 4b 5d subi r20, 0xDB ; 219 + 992: 5f 4f sbci r21, 0xFF ; 255 + 994: 13 30 cpi r17, 0x03 ; 3 + 996: 91 f7 brne .-28 ; 0x97c + ConfigurationSetById(i); + return true; + } + } + + return false; + 998: 80 e0 ldi r24, 0x00 ; 0 +} + 99a: df 91 pop r29 + 99c: cf 91 pop r28 + 99e: 1f 91 pop r17 + 9a0: 0f 91 pop r16 + 9a2: 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') ) { + 9a4: dc 01 movw r26, r24 + 9a6: fc 91 ld r31, X + 9a8: ff 23 and r31, r31 + 9aa: 89 f3 breq .-30 ; 0x98e + /* One String ended before the other did -> unequal length */ + StringMismatch = true; + break; + } + + if (c != *pRequestedConfigName) { + 9ac: cf 13 cpse r28, r31 + 9ae: ef cf rjmp .-34 ; 0x98e + 9b0: db 01 movw r26, r22 + 9b2: 05 c0 rjmp .+10 ; 0x9be + 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') ) { + 9b4: fd 91 ld r31, X+ + 9b6: ff 23 and r31, r31 + 9b8: 51 f3 breq .-44 ; 0x98e + /* One String ended before the other did -> unequal length */ + StringMismatch = true; + break; + } + + if (c != *pRequestedConfigName) { + 9ba: f0 13 cpse r31, r16 + 9bc: e8 cf rjmp .-48 ; 0x98e + StringMismatch = true; + break; + } + + /* Proceed to next character */ + pTableConfigName++; + 9be: 2f 5f subi r18, 0xFF ; 255 + 9c0: 3f 4f sbci r19, 0xFF ; 255 + pRequestedConfigName++; + 9c2: ed 01 movw r28, r26 + + c = pgm_read_byte(pTableConfigName); + 9c4: f9 01 movw r30, r18 + 9c6: 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') ) { + 9c8: 01 11 cpse r16, r1 + 9ca: f4 cf rjmp .-24 ; 0x9b4 + 9cc: 28 81 ld r18, Y + 9ce: 21 11 cpse r18, r1 + 9d0: de cf rjmp .-68 ; 0x98e + c = pgm_read_byte(pTableConfigName); + } + + if (!StringMismatch) { + /* Configuration found */ + ConfigurationSetById(i); + 9d2: 81 2f mov r24, r17 + 9d4: a8 df rcall .-176 ; 0x926 + return true; + 9d6: 81 e0 ldi r24, 0x01 ; 1 + } + } + + return false; +} + 9d8: df 91 pop r29 + 9da: cf 91 pop r28 + 9dc: 1f 91 pop r17 + 9de: 0f 91 pop r16 + 9e0: 08 95 ret + +000009e2 : + +void ConfigurationGetList(char* ConfigListOut, uint16_t ByteCount) +{ + 9e2: 0f 93 push r16 + 9e4: 1f 93 push r17 + 9e6: cf 93 push r28 + 9e8: df 93 push r29 + uint8_t i; + + /* Account for '\0' */ + ByteCount--; + 9ea: 61 50 subi r22, 0x01 ; 1 + 9ec: 71 09 sbc r23, r1 + 9ee: 49 ed ldi r20, 0xD9 ; 217 + 9f0: 52 e0 ldi r21, 0x02 ; 2 + ByteCount--; + } + + if ( i < (CONFIG_COUNT - 1) ) { + /* No comma on last configuration */ + *ConfigListOut++ = ','; + 9f2: 1c e2 ldi r17, 0x2C ; 44 + + /* Account for '\0' */ + ByteCount--; + + for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { + 9f6: fa 01 movw r30, r20 + 9f8: 04 91 lpm r16, Z + 9fa: 00 23 and r16, r16 + 9fc: 51 f1 breq .+84 ; 0xa52 + 9fe: 61 31 cpi r22, 0x11 ; 17 + a00: 71 05 cpc r23, r1 + a02: 20 f4 brcc .+8 ; 0xa0c + a04: 26 c0 rjmp .+76 ; 0xa52 + a06: 60 31 cpi r22, 0x10 ; 16 + a08: 71 05 cpc r23, r1 + a0a: 61 f0 breq .+24 ; 0xa24 + a0c: dc 01 movw r26, r24 + a0e: 01 96 adiw r24, 0x01 ; 1 + a10: ec 01 movw r28, r24 + /* While not end-of-string and enough buffer to + * put a complete configuration name */ + *ConfigListOut++ = c; + a12: 0c 93 st X, r16 + ConfigName++; + a14: 2f 5f subi r18, 0xFF ; 255 + a16: 3f 4f sbci r19, 0xFF ; 255 + ByteCount--; + a18: 61 50 subi r22, 0x01 ; 1 + a1a: 71 09 sbc r23, r1 + + for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { + a1c: f9 01 movw r30, r18 + a1e: 04 91 lpm r16, Z + a20: 01 11 cpse r16, r1 + a22: f1 cf rjmp .-30 ; 0xa06 + *ConfigListOut++ = c; + ConfigName++; + ByteCount--; + } + + if ( i < (CONFIG_COUNT - 1) ) { + a24: f3 e0 ldi r31, 0x03 ; 3 + a26: 43 32 cpi r20, 0x23 ; 35 + a28: 5f 07 cpc r21, r31 + a2a: 31 f4 brne .+12 ; 0xa38 + *ConfigListOut++ = ','; + ByteCount--; + } + } + + *ConfigListOut = '\0'; + a2c: 18 82 st Y, r1 +} + a2e: df 91 pop r29 + a30: cf 91 pop r28 + a32: 1f 91 pop r17 + a34: 0f 91 pop r16 + a36: 08 95 ret + ByteCount--; + } + + if ( i < (CONFIG_COUNT - 1) ) { + /* No comma on last configuration */ + *ConfigListOut++ = ','; + a38: ce 01 movw r24, r28 + a3a: 01 96 adiw r24, 0x01 ; 1 + a3c: 18 83 st Y, r17 + ByteCount--; + a3e: 61 50 subi r22, 0x01 ; 1 + a40: 71 09 sbc r23, r1 + a42: 4b 5d subi r20, 0xDB ; 219 + a44: 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++ = ','; + a4e: ec 01 movw r28, r24 + a50: ed cf rjmp .-38 ; 0xa2c + + for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { + a52: ec 01 movw r28, r24 + a54: e7 cf rjmp .-50 ; 0xa24 + +00000a56 : +#include "Random.h" + +#include + +void RandomInit(void) +{ + a56: 08 95 ret + +00000a58 : + +} + +uint8_t RandomGetByte(void) +{ + return rand() & 0xFF; + a58: 0c 94 d7 23 jmp 0x47ae ; 0x47ae +} + a5c: 08 95 ret + +00000a5e : + +void RandomGetBuffer(void* Buffer, uint8_t ByteCount) +{ + a5e: 1f 93 push r17 + a60: cf 93 push r28 + a62: df 93 push r29 + uint8_t* BufferPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + a64: 66 23 and r22, r22 + a66: 39 f0 breq .+14 ; 0xa76 + a68: ec 01 movw r28, r24 + a6a: 16 2f mov r17, r22 + +} + +uint8_t RandomGetByte(void) +{ + return rand() & 0xFF; + a6c: 0e 94 d7 23 call 0x47ae ; 0x47ae + a70: 89 93 st Y+, r24 + a72: 11 50 subi r17, 0x01 ; 1 + +void RandomGetBuffer(void* Buffer, uint8_t ByteCount) +{ + uint8_t* BufferPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + a74: d9 f7 brne .-10 ; 0xa6c + *BufferPtr++ = RandomGetByte(); + } +} + a76: df 91 pop r29 + a78: cf 91 pop r28 + a7a: 1f 91 pop r17 + a7c: 08 95 ret + +00000a7e : + +void RandomTick(void) +{ + rand(); + a7e: 0e 94 d7 23 call 0x47ae ; 0x47ae + rand(); + a82: 0e 94 d7 23 call 0x47ae ; 0x47ae + rand(); + a86: 0e 94 d7 23 call 0x47ae ; 0x47ae + rand(); + a8a: 0c 94 d7 23 jmp 0x47ae ; 0x47ae + +00000a8e : + */ + +#include "Common.h" + +uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) +{ + a8e: cf 93 push r28 + a90: df 93 push r29 + a92: dc 01 movw r26, r24 + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t CharCount = 0; + + /* Account for '\0' at the end */ + MaxChars--; + a94: 61 50 subi r22, 0x01 ; 1 + a96: 71 09 sbc r23, r1 + + while( (ByteCount > 0) && (MaxChars >= 2) ) { + a98: 21 15 cp r18, r1 + a9a: 31 05 cpc r19, r1 + a9c: a9 f1 breq .+106 ; 0xb08 + a9e: 62 30 cpi r22, 0x02 ; 2 + aa0: 71 05 cpc r23, r1 + aa2: 90 f1 brcs .+100 ; 0xb08 + aa4: fa 01 movw r30, r20 + aa6: 21 50 subi r18, 0x01 ; 1 + aa8: 31 09 sbc r19, r1 + aaa: 24 0f add r18, r20 + aac: 35 1f adc r19, r21 +#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; + aae: 80 e0 ldi r24, 0x00 ; 0 + ab0: 90 e0 ldi r25, 0x00 ; 0 + ab2: 17 c0 rjmp .+46 ; 0xae2 + MaxChars--; + + while( (ByteCount > 0) && (MaxChars >= 2) ) { + uint8_t Byte = *ByteBuffer; + + HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); + ab4: d0 5d subi r29, 0xD0 ; 208 + ab6: dc 93 st X, r29 + HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); + ab8: cf 70 andi r28, 0x0F ; 15 + aba: 4c 2f mov r20, r28 + abc: 50 e0 ldi r21, 0x00 ; 0 + abe: 4a 30 cpi r20, 0x0A ; 10 + ac0: 51 05 cpc r21, r1 + ac2: 04 f5 brge .+64 ; 0xb04 + ac4: c0 5d subi r28, 0xD0 ; 208 + ac6: 11 96 adiw r26, 0x01 ; 1 + ac8: cc 93 st X, r28 + aca: 11 97 sbiw r26, 0x01 ; 1 + + HexOut += 2; + acc: 12 96 adiw r26, 0x02 ; 2 + MaxChars -= 2; + ace: 62 50 subi r22, 0x02 ; 2 + ad0: 71 09 sbc r23, r1 + CharCount += 2; + ad2: 02 96 adiw r24, 0x02 ; 2 + uint16_t CharCount = 0; + + /* Account for '\0' at the end */ + MaxChars--; + + while( (ByteCount > 0) && (MaxChars >= 2) ) { + ad4: e2 17 cp r30, r18 + ad6: f3 07 cpc r31, r19 + ad8: c9 f0 breq .+50 ; 0xb0c + ada: 31 96 adiw r30, 0x01 ; 1 + adc: 62 30 cpi r22, 0x02 ; 2 + ade: 71 05 cpc r23, r1 + ae0: a8 f0 brcs .+42 ; 0xb0c + uint8_t Byte = *ByteBuffer; + ae2: c0 81 ld r28, Z + + HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); + ae4: dc 2f mov r29, r28 + ae6: d2 95 swap r29 + ae8: df 70 andi r29, 0x0F ; 15 + aea: 4d 2f mov r20, r29 + aec: 50 e0 ldi r21, 0x00 ; 0 + aee: 4a 30 cpi r20, 0x0A ; 10 + af0: 51 05 cpc r21, r1 + af2: 04 f3 brlt .-64 ; 0xab4 + af4: d9 5c subi r29, 0xC9 ; 201 + af6: dc 93 st X, r29 + HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); + af8: cf 70 andi r28, 0x0F ; 15 + afa: 4c 2f mov r20, r28 + afc: 50 e0 ldi r21, 0x00 ; 0 + afe: 4a 30 cpi r20, 0x0A ; 10 + b00: 51 05 cpc r21, r1 + b02: 04 f3 brlt .-64 ; 0xac4 + b04: c9 5c subi r28, 0xC9 ; 201 + b06: df cf rjmp .-66 ; 0xac6 +#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; + b08: 80 e0 ldi r24, 0x00 ; 0 + b0a: 90 e0 ldi r25, 0x00 ; 0 + CharCount += 2; + ByteBuffer++; + ByteCount -= 1; + } + + *HexOut = '\0'; + b0c: 1c 92 st X, r1 + + return CharCount; +} + b0e: df 91 pop r29 + b10: cf 91 pop r28 + b12: 08 95 ret + +00000b14 : + +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) +{ + b14: dc 01 movw r26, r24 + b16: fa 01 movw r30, r20 + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t ByteCount = 0; + + while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { + b18: 80 81 ld r24, Z + b1a: 88 23 and r24, r24 + b1c: 09 f4 brne .+2 ; 0xb20 + b1e: 41 c0 rjmp .+130 ; 0xba2 + b20: 91 81 ldd r25, Z+1 ; 0x01 + b22: 99 23 and r25, r25 + b24: d9 f1 breq .+118 ; 0xb9c +} + +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t ByteCount = 0; + b26: 20 e0 ldi r18, 0x00 ; 0 + b28: 30 e0 ldi r19, 0x00 ; 0 + + while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { + b2a: 61 15 cp r22, r1 + b2c: 71 05 cpc r23, r1 + b2e: a1 f4 brne .+40 ; 0xb58 + b30: 33 c0 rjmp .+102 ; 0xb98 + if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { + uint8_t Byte = 0; + + Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; + b32: 82 95 swap r24 + b34: 80 7f andi r24, 0xF0 ; 240 + Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; + b36: 91 34 cpi r25, 0x41 ; 65 + b38: 30 f5 brcc .+76 ; 0xb86 + b3a: 94 2f mov r25, r20 + b3c: 89 2b or r24, r25 + + *ByteBuffer = Byte; + b3e: 8d 93 st X+, r24 + + ByteBuffer++; + MaxBytes--; + ByteCount++; + b40: 2f 5f subi r18, 0xFF ; 255 + b42: 3f 4f sbci r19, 0xFF ; 255 + HexIn += 2; + b44: 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) ) { + b46: 80 81 ld r24, Z + b48: 88 23 and r24, r24 + b4a: 31 f1 breq .+76 ; 0xb98 + b4c: 91 81 ldd r25, Z+1 ; 0x01 + b4e: 99 23 and r25, r25 + b50: 29 f1 breq .+74 ; 0xb9c + b52: 62 17 cp r22, r18 + b54: 73 07 cpc r23, r19 + b56: 01 f1 breq .+64 ; 0xb98 + if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { + b58: 40 ed ldi r20, 0xD0 ; 208 + b5a: 48 0f add r20, r24 + b5c: 4a 30 cpi r20, 0x0A ; 10 + b5e: 20 f0 brcs .+8 ; 0xb68 + b60: 4f eb ldi r20, 0xBF ; 191 + b62: 48 0f add r20, r24 + b64: 46 30 cpi r20, 0x06 ; 6 + b66: d0 f4 brcc .+52 ; 0xb9c + b68: 40 ed ldi r20, 0xD0 ; 208 + b6a: 49 0f add r20, r25 + b6c: 4a 30 cpi r20, 0x0A ; 10 + b6e: 20 f0 brcs .+8 ; 0xb78 + b70: 5f eb ldi r21, 0xBF ; 191 + b72: 59 0f add r21, r25 + b74: 56 30 cpi r21, 0x06 ; 6 + b76: 90 f4 brcc .+36 ; 0xb9c + uint8_t Byte = 0; + + Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; + b78: 81 34 cpi r24, 0x41 ; 65 + b7a: d8 f2 brcs .-74 ; 0xb32 + b7c: 82 95 swap r24 + b7e: 80 7f andi r24, 0xF0 ; 240 + b80: 80 57 subi r24, 0x70 ; 112 + Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; + b82: 91 34 cpi r25, 0x41 ; 65 + b84: d0 f2 brcs .-76 ; 0xb3a + b86: 97 53 subi r25, 0x37 ; 55 + b88: 89 2b or r24, r25 + + *ByteBuffer = Byte; + b8a: 8d 93 st X+, r24 + + ByteBuffer++; + MaxBytes--; + ByteCount++; + b8c: 2f 5f subi r18, 0xFF ; 255 + b8e: 3f 4f sbci r19, 0xFF ; 255 + HexIn += 2; + b90: 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) ) { + b92: 80 81 ld r24, Z + b94: 81 11 cpse r24, r1 + b96: da cf rjmp .-76 ; 0xb4c + if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { + /* Odd number of characters */ + return 0; + } + + return ByteCount; + b98: c9 01 movw r24, r18 + b9a: 08 95 ret + } + } + + if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { + /* Odd number of characters */ + return 0; + b9c: 80 e0 ldi r24, 0x00 ; 0 + b9e: 90 e0 ldi r25, 0x00 ; 0 + } + + return ByteCount; +} + ba0: 08 95 ret +} + +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t ByteCount = 0; + ba2: 20 e0 ldi r18, 0x00 ; 0 + ba4: 30 e0 ldi r19, 0x00 ; 0 + ba6: f8 cf rjmp .-16 ; 0xb98 + +00000ba8 : + MemoryRecall(); +} + +void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) +{ + uint8_t* SrcPtr = &Memory[Address]; + ba8: fb 01 movw r30, r22 + baa: ee 56 subi r30, 0x6E ; 110 + bac: ff 4d sbci r31, 0xDF ; 223 + uint8_t* DstPtr = (uint8_t*) Buffer; + + /* Prevent Buf Ovfs */ + ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + bae: 20 e0 ldi r18, 0x00 ; 0 + bb0: 34 e0 ldi r19, 0x04 ; 4 + bb2: 26 1b sub r18, r22 + bb4: 37 0b sbc r19, r23 + bb6: 42 17 cp r20, r18 + bb8: 53 07 cpc r21, r19 + bba: 08 f4 brcc .+2 ; 0xbbe + bbc: 9a 01 movw r18, r20 + + while(ByteCount--) { + bbe: 21 15 cp r18, r1 + bc0: 31 05 cpc r19, r1 + bc2: 49 f0 breq .+18 ; 0xbd6 + bc4: dc 01 movw r26, r24 + bc6: cf 01 movw r24, r30 + bc8: 82 0f add r24, r18 + bca: 93 1f adc r25, r19 + *DstPtr++ = *SrcPtr++; + bcc: 21 91 ld r18, Z+ + bce: 2d 93 st X+, r18 + uint8_t* DstPtr = (uint8_t*) Buffer; + + /* Prevent Buf Ovfs */ + ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + + while(ByteCount--) { + bd0: e8 17 cp r30, r24 + bd2: f9 07 cpc r31, r25 + bd4: d9 f7 brne .-10 ; 0xbcc + bd6: 08 95 ret + +00000bd8 : +} + +void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) +{ + uint8_t* SrcPtr = (uint8_t*) Buffer; + uint8_t* DstPtr = &Memory[Address]; + bd8: db 01 movw r26, r22 + bda: ae 56 subi r26, 0x6E ; 110 + bdc: bf 4d sbci r27, 0xDF ; 223 + + /* Prevent Buf Ovfs */ + ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + bde: 20 e0 ldi r18, 0x00 ; 0 + be0: 34 e0 ldi r19, 0x04 ; 4 + be2: 26 1b sub r18, r22 + be4: 37 0b sbc r19, r23 + be6: 42 17 cp r20, r18 + be8: 53 07 cpc r21, r19 + bea: 08 f4 brcc .+2 ; 0xbee + bec: 9a 01 movw r18, r20 + + while(ByteCount--) { + bee: 21 15 cp r18, r1 + bf0: 31 05 cpc r19, r1 + bf2: 41 f0 breq .+16 ; 0xc04 + bf4: fc 01 movw r30, r24 + bf6: 82 0f add r24, r18 + bf8: 93 1f adc r25, r19 + *DstPtr++ = *SrcPtr++; + bfa: 21 91 ld r18, Z+ + bfc: 2d 93 st X+, r18 + uint8_t* DstPtr = &Memory[Address]; + + /* Prevent Buf Ovfs */ + ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + + while(ByteCount--) { + bfe: e8 17 cp r30, r24 + c00: f9 07 cpc r31, r25 + c02: d9 f7 brne .-10 ; 0xbfa + c04: 08 95 ret + +00000c06 : + *DstPtr++ = *SrcPtr++; + } +} + +void MemoryClear(void) +{ + c06: 80 e0 ldi r24, 0x00 ; 0 + c08: 94 e0 ldi r25, 0x04 ; 4 + c0a: e2 e9 ldi r30, 0x92 ; 146 + c0c: f0 e2 ldi r31, 0x20 ; 32 + c0e: df 01 movw r26, r30 + c10: 9c 01 movw r18, r24 + c12: 1d 92 st X+, r1 + c14: 21 50 subi r18, 0x01 ; 1 + c16: 30 40 sbci r19, 0x00 ; 0 + c18: e1 f7 brne .-8 ; 0xc12 + c1a: 08 95 ret + +00000c1c : +} + +void MemoryRecall(void) +{ + /* Recall memory from permanent flash */ + FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + c1c: 80 91 fd 24 lds r24, 0x24FD + c20: 90 e0 ldi r25, 0x00 ; 0 + c22: a0 e0 ldi r26, 0x00 ; 0 + c24: b0 e0 ldi r27, 0x00 ; 0 + c26: 4a e0 ldi r20, 0x0A ; 10 + c28: 88 0f add r24, r24 + c2a: 99 1f adc r25, r25 + c2c: aa 1f adc r26, r26 + c2e: bb 1f adc r27, r27 + c30: 4a 95 dec r20 + c32: d1 f7 brne .-12 ; 0xc28 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + c34: 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; + c36: 57 ed ldi r21, 0xD7 ; 215 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + c38: 30 e4 ldi r19, 0x40 ; 64 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + c3a: 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; + c3e: 50 93 a0 09 sts 0x09A0, r21 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + c42: 20 91 a1 09 lds r18, 0x09A1 + c46: 26 ff sbrs r18, 6 + c48: fc cf rjmp .-8 ; 0xc42 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + c4a: 30 93 a1 09 sts 0x09A1, r19 + + return MEMORY_FLASH_USART.DATA; + c4e: 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; + c52: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + c56: 20 91 a1 09 lds r18, 0x09A1 + c5a: 26 ff sbrs r18, 6 + c5c: fc cf rjmp .-8 ; 0xc56 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + c5e: 30 93 a1 09 sts 0x09A1, r19 + + return MEMORY_FLASH_USART.DATA; + c62: 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; + c66: 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()); + c6a: 27 ff sbrs r18, 7 + c6c: e6 cf rjmp .-52 ; 0xc3a + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + c6e: 20 e1 ldi r18, 0x10 ; 16 + c70: 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; + c74: 23 e0 ldi r18, 0x03 ; 3 + c76: 20 93 a0 09 sts 0x09A0, r18 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + c7a: 20 91 a1 09 lds r18, 0x09A1 + c7e: 26 ff sbrs r18, 6 + c80: fc cf rjmp .-8 ; 0xc7a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + c82: 20 e4 ldi r18, 0x40 ; 64 + c84: 20 93 a1 09 sts 0x09A1, r18 + + return MEMORY_FLASH_USART.DATA; + c88: 20 91 a0 09 lds r18, 0x09A0 +{ + while(FlashIsBusy()); + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + SPITransferByte(0x03); + SPITransferByte( (Address >> 16) & 0xFF ); + c8c: ad 01 movw r20, r26 + c8e: 66 27 eor r22, r22 + c90: 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; + c92: 40 93 a0 09 sts 0x09A0, r20 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + c96: 20 91 a1 09 lds r18, 0x09A1 + c9a: 26 ff sbrs r18, 6 + c9c: fc cf rjmp .-8 ; 0xc96 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + c9e: 20 e4 ldi r18, 0x40 ; 64 + ca0: 20 93 a1 09 sts 0x09A1, r18 + + return MEMORY_FLASH_USART.DATA; + ca4: 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 ); + ca8: 89 2f mov r24, r25 + caa: 9a 2f mov r25, r26 + cac: ab 2f mov r26, r27 + cae: 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; + cb0: 80 93 a0 09 sts 0x09A0, r24 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + cb4: 80 91 a1 09 lds r24, 0x09A1 + cb8: 86 ff sbrs r24, 6 + cba: fc cf rjmp .-8 ; 0xcb4 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + cbc: 80 e4 ldi r24, 0x40 ; 64 + cbe: 80 93 a1 09 sts 0x09A1, r24 + + return MEMORY_FLASH_USART.DATA; + cc2: 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; + cc6: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + cca: 80 91 a1 09 lds r24, 0x09A1 + cce: 86 ff sbrs r24, 6 + cd0: fc cf rjmp .-8 ; 0xcca + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + cd2: 80 e4 ldi r24, 0x40 ; 64 + cd4: 80 93 a1 09 sts 0x09A1, r24 + + return MEMORY_FLASH_USART.DATA; + cd8: 80 91 a0 09 lds r24, 0x09A0 + cdc: e2 e9 ldi r30, 0x92 ; 146 + cde: f0 e2 ldi r31, 0x20 ; 32 + uint8_t* ByteBuffer = (uint8_t*) Buffer; + + while(ByteCount-- > 0) { + MEMORY_FLASH_USART.DATA = 0; + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + ce0: 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; + ce2: 10 92 a0 09 sts 0x09A0, r1 + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + ce6: 80 91 a1 09 lds r24, 0x09A1 + cea: 86 ff sbrs r24, 6 + cec: fc cf rjmp .-8 ; 0xce6 + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + cee: 90 93 a1 09 sts 0x09A1, r25 + *ByteBuffer++ = MEMORY_FLASH_USART.DATA; + cf2: 80 91 a0 09 lds r24, 0x09A0 + cf6: 81 93 st Z+, r24 + +INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + + while(ByteCount-- > 0) { + cf8: 84 e2 ldi r24, 0x24 ; 36 + cfa: e2 39 cpi r30, 0x92 ; 146 + cfc: f8 07 cpc r31, r24 + cfe: 89 f7 brne .-30 ; 0xce2 + SPITransferByte(0x03); + SPITransferByte( (Address >> 16) & 0xFF ); + SPITransferByte( (Address >> 8) & 0xFF ); + SPITransferByte( (Address >> 0) & 0xFF ); + SPIReadBlock(Buffer, ByteCount); + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; + d00: 80 e1 ldi r24, 0x10 ; 16 + d02: 80 93 65 06 sts 0x0665, r24 + d06: 08 95 ret + +00000d08 : + SPITransferByte( 0 ); + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; +} + +void MemoryInit(void) +{ + d08: cf 93 push r28 + d0a: df 93 push r29 + d0c: 00 d0 rcall .+0 ; 0xd0e + d0e: 00 d0 rcall .+0 ; 0xd10 + d10: cd b7 in r28, 0x3d ; 61 + d12: 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; + d14: 80 e1 ldi r24, 0x10 ; 16 + d16: 80 93 65 06 sts 0x0665, r24 + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_SCK; + d1a: 92 e0 ldi r25, 0x02 ; 2 + d1c: 90 93 66 06 sts 0x0666, r25 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_MOSI; + d20: 98 e0 ldi r25, 0x08 ; 8 + d22: 90 93 65 06 sts 0x0665, r25 + + MEMORY_FLASH_PORT.DIRSET = MEMORY_FLASH_SCK | MEMORY_FLASH_MOSI | MEMORY_FLASH_CS; + d26: 9a e1 ldi r25, 0x1A ; 26 + d28: 90 93 61 06 sts 0x0661, r25 + + MEMORY_FLASH_USART.BAUDCTRLA = 0; + d2c: 10 92 a6 09 sts 0x09A6, r1 + MEMORY_FLASH_USART.BAUDCTRLB = 0; + d30: 10 92 a7 09 sts 0x09A7, r1 + MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; + d34: 90 ec ldi r25, 0xC0 ; 192 + d36: 90 93 a5 09 sts 0x09A5, r25 + MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; + d3a: 98 e1 ldi r25, 0x18 ; 24 + d3c: 90 93 a4 09 sts 0x09A4, r25 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + d40: 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; + d44: 87 ed ldi r24, 0xD7 ; 215 + d46: 80 93 a0 09 sts 0x09A0, r24 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + d4a: 80 91 a1 09 lds r24, 0x09A1 + d4e: 86 ff sbrs r24, 6 + d50: fc cf rjmp .-8 ; 0xd4a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + d52: 80 e4 ldi r24, 0x40 ; 64 + d54: 80 93 a1 09 sts 0x09A1, r24 + + return MEMORY_FLASH_USART.DATA; + d58: 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; + d5c: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + d60: 80 91 a1 09 lds r24, 0x09A1 + d64: 86 ff sbrs r24, 6 + d66: fc cf rjmp .-8 ; 0xd60 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + d68: 80 e4 ldi r24, 0x40 ; 64 + d6a: 80 93 a1 09 sts 0x09A1, r24 + + return MEMORY_FLASH_USART.DATA; + d6e: 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; + d72: 90 e1 ldi r25, 0x10 ; 16 + d74: 90 93 65 06 sts 0x0665, r25 + MEMORY_FLASH_USART.BAUDCTRLB = 0; + MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc; + MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; + + + if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { + d78: 80 fd sbrc r24, 0 + d7a: 3e c0 rjmp .+124 ; 0xdf8 + return !(FlashReadStatusRegister() & FLASH_STATUS_REG_READY_BIT); +} + +INLINE void FlashConfigurePageSize(void) +{ + uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; + d7c: 8d e3 ldi r24, 0x3D ; 61 + d7e: 89 83 std Y+1, r24 ; 0x01 + d80: 8a e2 ldi r24, 0x2A ; 42 + d82: 8a 83 std Y+2, r24 ; 0x02 + d84: 80 e8 ldi r24, 0x80 ; 128 + d86: 8b 83 std Y+3, r24 ; 0x03 + d88: 86 ea ldi r24, 0xA6 ; 166 + d8a: 8c 83 std Y+4, r24 ; 0x04 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + d8c: 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; + d8e: 37 ed ldi r19, 0xD7 ; 215 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + d90: 90 e4 ldi r25, 0x40 ; 64 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + d92: 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; + d96: 30 93 a0 09 sts 0x09A0, r19 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + d9a: 80 91 a1 09 lds r24, 0x09A1 + d9e: 86 ff sbrs r24, 6 + da0: fc cf rjmp .-8 ; 0xd9a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + da2: 90 93 a1 09 sts 0x09A1, r25 + + return MEMORY_FLASH_USART.DATA; + da6: 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; + daa: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + dae: 80 91 a1 09 lds r24, 0x09A1 + db2: 86 ff sbrs r24, 6 + db4: fc cf rjmp .-8 ; 0xdae + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + db6: 90 93 a1 09 sts 0x09A1, r25 + + return MEMORY_FLASH_USART.DATA; + dba: 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; + dbe: 20 93 65 06 sts 0x0665, r18 + +INLINE void FlashConfigurePageSize(void) +{ + uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; + + while(FlashIsBusy()); + dc2: 87 ff sbrs r24, 7 + dc4: e6 cf rjmp .-52 ; 0xd92 + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + dc6: 80 e1 ldi r24, 0x10 ; 16 + dc8: 80 93 66 06 sts 0x0666, r24 + dcc: fe 01 movw r30, r28 + dce: 31 96 adiw r30, 0x01 ; 1 + dd0: ce 01 movw r24, r28 + dd2: 05 96 adiw r24, 0x05 ; 5 + uint8_t* ByteBuffer = (uint8_t*) Buffer; + + while(ByteCount-- > 0) { + MEMORY_FLASH_USART.DATA = *ByteBuffer++; + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + dd4: 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++; + dd6: 21 91 ld r18, Z+ + dd8: 20 93 a0 09 sts 0x09A0, r18 + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + ddc: 20 91 a1 09 lds r18, 0x09A1 + de0: 26 ff sbrs r18, 6 + de2: fc cf rjmp .-8 ; 0xddc + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + de4: 30 93 a1 09 sts 0x09A1, r19 + MEMORY_FLASH_USART.DATA; /* Flush Buffer */ + de8: 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) { + dec: e8 17 cp r30, r24 + dee: f9 07 cpc r31, r25 + df0: 91 f7 brne .-28 ; 0xdd6 + + while(FlashIsBusy()); + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + SPIWriteBlock(Sequence, sizeof(Sequence)); + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; + df2: 80 e1 ldi r24, 0x10 ; 16 + df4: 80 93 65 06 sts 0x0665, r24 + FlashConfigurePageSize(); + } + + /* Load permanent flash contents to memory at startup */ + MemoryRecall(); +} + df8: 24 96 adiw r28, 0x04 ; 4 + dfa: cd bf out 0x3d, r28 ; 61 + dfc: de bf out 0x3e, r29 ; 62 + dfe: df 91 pop r29 + e00: cf 91 pop r28 + /* Configure for 256 byte Dataflash if not already done. */ + FlashConfigurePageSize(); + } + + /* Load permanent flash contents to memory at startup */ + MemoryRecall(); + e02: 0c cf rjmp .-488 ; 0xc1c + +00000e04 : + /* Recall memory from permanent flash */ + FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); +} + +void MemoryStore(void) +{ + e04: 5f 92 push r5 + e06: 6f 92 push r6 + e08: 7f 92 push r7 + e0a: 8f 92 push r8 + e0c: 9f 92 push r9 + e0e: af 92 push r10 + e10: bf 92 push r11 + e12: cf 92 push r12 + e14: df 92 push r13 + e16: ef 92 push r14 + e18: ff 92 push r15 + e1a: 0f 93 push r16 + e1c: 1f 93 push r17 + e1e: cf 93 push r28 + e20: df 93 push r29 + /* Store current memory into permanent flash */ + FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + e22: 80 91 fd 24 lds r24, 0x24FD + e26: 90 e0 ldi r25, 0x00 ; 0 + e28: a0 e0 ldi r26, 0x00 ; 0 + e2a: b0 e0 ldi r27, 0x00 ; 0 + e2c: 6a e0 ldi r22, 0x0A ; 10 + e2e: 88 0f add r24, r24 + e30: 99 1f adc r25, r25 + e32: aa 1f adc r26, r26 + e34: bb 1f adc r27, r27 + e36: 6a 95 dec r22 + e38: d1 f7 brne .-12 ; 0xe2e + e3a: 00 e0 ldi r16, 0x00 ; 0 + e3c: 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); + e3e: e1 2c mov r14, r1 + e40: ff 24 eor r15, r15 + e42: f3 94 inc r15 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + e44: e0 e1 ldi r30, 0x10 ; 16 + e46: 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; + e48: f7 ed ldi r31, 0xD7 ; 215 + e4a: bf 2e mov r11, r31 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + e4c: c0 e4 ldi r28, 0x40 ; 64 + e4e: dc 2e mov r13, r28 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + e50: d0 e1 ldi r29, 0x10 ; 16 + e52: 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; + e54: 27 ed ldi r18, 0xD7 ; 215 + e56: 92 2e mov r9, r18 + e58: 33 e5 ldi r19, 0x53 ; 83 + e5a: 63 2e mov r6, r19 + e5c: 44 e8 ldi r20, 0x84 ; 132 + e5e: 74 2e mov r7, r20 + e60: 53 e8 ldi r21, 0x83 ; 131 + e62: 85 2e mov r8, r21 +} + +INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) +{ + while(ByteCount > 0) { + uint16_t PageAddress = Address / FLASH_PAGE_SIZE; + e64: 49 2f mov r20, r25 + e66: 5a 2f mov r21, r26 + e68: 6b 2f mov r22, r27 + e6a: 77 27 eor r23, r23 + uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; + e6c: 38 2f mov r19, r24 + uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); + e6e: e7 01 movw r28, r14 + e70: c8 1b sub r28, r24 + e72: d1 09 sbc r29, r1 + e74: 0c 17 cp r16, r28 + e76: 1d 07 cpc r17, r29 + e78: 08 f4 brcc .+2 ; 0xe7c + e7a: e8 01 movw r28, r16 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + e7c: 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; + e80: 90 92 a0 09 sts 0x09A0, r9 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + e84: 20 91 a1 09 lds r18, 0x09A1 + e88: 26 ff sbrs r18, 6 + e8a: fc cf rjmp .-8 ; 0xe84 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + e8c: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + e90: 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; + e94: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + e98: 20 91 a1 09 lds r18, 0x09A1 + e9c: 26 ff sbrs r18, 6 + e9e: fc cf rjmp .-8 ; 0xe98 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + ea0: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + ea4: 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; + ea8: c0 92 65 06 sts 0x0665, r12 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; +} + +INLINE void FlashMemoryToBuffer(uint16_t PageAddress) +{ + while(FlashIsBusy()); + eac: 27 ff sbrs r18, 7 + eae: e6 cf rjmp .-52 ; 0xe7c + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + eb0: 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; + eb4: 60 92 a0 09 sts 0x09A0, r6 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + eb8: 20 91 a1 09 lds r18, 0x09A1 + ebc: 26 ff sbrs r18, 6 + ebe: fc cf rjmp .-8 ; 0xeb8 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + ec0: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + ec4: 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; + ec8: 50 93 a0 09 sts 0x09A0, r21 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + ecc: 20 91 a1 09 lds r18, 0x09A1 + ed0: 26 ff sbrs r18, 6 + ed2: fc cf rjmp .-8 ; 0xecc + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + ed4: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + ed8: 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; + edc: 40 93 a0 09 sts 0x09A0, r20 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + ee0: 20 91 a1 09 lds r18, 0x09A1 + ee4: 26 ff sbrs r18, 6 + ee6: fc cf rjmp .-8 ; 0xee0 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + ee8: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + eec: 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; + ef0: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + ef4: 20 91 a1 09 lds r18, 0x09A1 + ef8: 26 ff sbrs r18, 6 + efa: fc cf rjmp .-8 ; 0xef4 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + efc: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f00: 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; + f04: c0 92 65 06 sts 0x0665, r12 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + f08: 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; + f0c: b0 92 a0 09 sts 0x09A0, r11 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + f10: 20 91 a1 09 lds r18, 0x09A1 + f14: 26 ff sbrs r18, 6 + f16: fc cf rjmp .-8 ; 0xf10 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + f18: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f1c: 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; + f20: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + f24: 20 91 a1 09 lds r18, 0x09A1 + f28: 26 ff sbrs r18, 6 + f2a: fc cf rjmp .-8 ; 0xf24 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + f2c: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f30: 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; + f34: 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()); + f38: 27 ff sbrs r18, 7 + f3a: e6 cf rjmp .-52 ; 0xf08 + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + f3c: 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; + f40: 70 92 a0 09 sts 0x09A0, r7 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + f44: 20 91 a1 09 lds r18, 0x09A1 + f48: 26 ff sbrs r18, 6 + f4a: fc cf rjmp .-8 ; 0xf44 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + f4c: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f50: 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; + f54: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + f58: 20 91 a1 09 lds r18, 0x09A1 + f5c: 26 ff sbrs r18, 6 + f5e: fc cf rjmp .-8 ; 0xf58 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + f60: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f64: 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; + f68: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + f6c: 20 91 a1 09 lds r18, 0x09A1 + f70: 26 ff sbrs r18, 6 + f72: fc cf rjmp .-8 ; 0xf6c + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + f74: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f78: 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; + f7c: 30 93 a0 09 sts 0x09A0, r19 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + f80: 20 91 a1 09 lds r18, 0x09A1 + f84: 26 ff sbrs r18, 6 + f86: fc cf rjmp .-8 ; 0xf80 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + f88: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + f8c: 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) { + f90: 20 97 sbiw r28, 0x00 ; 0 + f92: 99 f0 breq .+38 ; 0xfba + f94: e2 e9 ldi r30, 0x92 ; 146 + f96: f0 e2 ldi r31, 0x20 ; 32 + f98: 9e 01 movw r18, r28 + f9a: 2e 56 subi r18, 0x6E ; 110 + f9c: 3f 4d sbci r19, 0xDF ; 223 + MEMORY_FLASH_USART.DATA = *ByteBuffer++; + f9e: 51 90 ld r5, Z+ + fa0: 50 92 a0 09 sts 0x09A0, r5 + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + fa4: 50 90 a1 09 lds r5, 0x09A1 + fa8: 56 fe sbrs r5, 6 + faa: fc cf rjmp .-8 ; 0xfa4 + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + fac: d0 92 a1 09 sts 0x09A1, r13 + MEMORY_FLASH_USART.DATA; /* Flush Buffer */ + fb0: 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) { + fb4: e2 17 cp r30, r18 + fb6: f3 07 cpc r31, r19 + fb8: 91 f7 brne .-28 ; 0xf9e + SPITransferByte(FLASH_CMD_BUF1_WRITE); + SPITransferByte( 0 ); + SPITransferByte( 0 ); + SPITransferByte( Address ); + SPIWriteBlock(Buffer, ByteCount); + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; + fba: c0 92 65 06 sts 0x0665, r12 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + fbe: 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; + fc2: b0 92 a0 09 sts 0x09A0, r11 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + fc6: 20 91 a1 09 lds r18, 0x09A1 + fca: 26 ff sbrs r18, 6 + fcc: fc cf rjmp .-8 ; 0xfc6 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + fce: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + fd2: 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; + fd6: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + fda: 20 91 a1 09 lds r18, 0x09A1 + fde: 26 ff sbrs r18, 6 + fe0: fc cf rjmp .-8 ; 0xfda + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + fe2: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + fe6: 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; + fea: c0 92 65 06 sts 0x0665, r12 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; +} + +INLINE void FlashBufferToMemory(uint16_t PageAddress) +{ + while(FlashIsBusy()); + fee: 27 ff sbrs r18, 7 + ff0: e6 cf rjmp .-52 ; 0xfbe + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + ff2: 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; + ff6: 80 92 a0 09 sts 0x09A0, r8 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + ffa: 20 91 a1 09 lds r18, 0x09A1 + ffe: 26 ff sbrs r18, 6 + 1000: fc cf rjmp .-8 ; 0xffa + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1002: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + 1006: 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; + 100a: 50 93 a0 09 sts 0x09A0, r21 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 100e: 20 91 a1 09 lds r18, 0x09A1 + 1012: 26 ff sbrs r18, 6 + 1014: fc cf rjmp .-8 ; 0x100e + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1016: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + 101a: 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; + 101e: 40 93 a0 09 sts 0x09A0, r20 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1022: 20 91 a1 09 lds r18, 0x09A1 + 1026: 26 ff sbrs r18, 6 + 1028: fc cf rjmp .-8 ; 0x1022 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 102a: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + 102e: 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; + 1032: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1036: 20 91 a1 09 lds r18, 0x09A1 + 103a: 26 ff sbrs r18, 6 + 103c: fc cf rjmp .-8 ; 0x1036 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 103e: d0 92 a1 09 sts 0x09A1, r13 + + return MEMORY_FLASH_USART.DATA; + 1042: 20 91 a0 09 lds r18, 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; + 1046: c0 92 65 06 sts 0x0665, r12 + + FlashMemoryToBuffer(PageAddress); + FlashWriteBuffer(Buffer, ByteAddress, PageBytes); + FlashBufferToMemory(PageAddress); + + ByteCount -= PageBytes; + 104a: 0c 1b sub r16, r28 + 104c: 1d 0b sbc r17, r29 + Address += PageBytes; + 104e: 8c 0f add r24, r28 + 1050: 9d 1f adc r25, r29 + 1052: a1 1d adc r26, r1 + 1054: 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) { + 1056: 01 15 cp r16, r1 + 1058: 11 05 cpc r17, r1 + 105a: 09 f0 breq .+2 ; 0x105e + 105c: 03 cf rjmp .-506 ; 0xe64 + +void MemoryStore(void) +{ + /* Store current memory into permanent flash */ + FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); +} + 105e: df 91 pop r29 + 1060: cf 91 pop r28 + 1062: 1f 91 pop r17 + 1064: 0f 91 pop r16 + 1066: ff 90 pop r15 + 1068: ef 90 pop r14 + 106a: df 90 pop r13 + 106c: cf 90 pop r12 + 106e: bf 90 pop r11 + 1070: af 90 pop r10 + 1072: 9f 90 pop r9 + 1074: 8f 90 pop r8 + 1076: 7f 90 pop r7 + 1078: 6f 90 pop r6 + 107a: 5f 90 pop r5 + 107c: 08 95 ret + +0000107e : + +bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) +{ + 107e: 2f 92 push r2 + 1080: 3f 92 push r3 + 1082: 4f 92 push r4 + 1084: 5f 92 push r5 + 1086: 6f 92 push r6 + 1088: 7f 92 push r7 + 108a: 8f 92 push r8 + 108c: 9f 92 push r9 + 108e: af 92 push r10 + 1090: bf 92 push r11 + 1092: cf 92 push r12 + 1094: df 92 push r13 + 1096: ef 92 push r14 + 1098: ff 92 push r15 + 109a: 0f 93 push r16 + 109c: 1f 93 push r17 + 109e: cf 93 push r28 + 10a0: df 93 push r29 + 10a2: cd b7 in r28, 0x3d ; 61 + 10a4: de b7 in r29, 0x3e ; 62 + 10a6: 2a 97 sbiw r28, 0x0a ; 10 + 10a8: cd bf out 0x3d, r28 ; 61 + 10aa: de bf out 0x3e, r29 ; 62 + 10ac: 8c 01 movw r16, r24 + if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { + 10ae: 41 15 cp r20, r1 + 10b0: 84 e0 ldi r24, 0x04 ; 4 + 10b2: 58 07 cpc r21, r24 + 10b4: 61 05 cpc r22, r1 + 10b6: 71 05 cpc r23, r1 + 10b8: 08 f0 brcs .+2 ; 0x10bc + 10ba: 8e c1 rjmp .+796 ; 0x13d8 + /* 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.ActiveSetting * MEMORY_SIZE_PER_SETTING; + 10bc: 80 91 fd 24 lds r24, 0x24FD + 10c0: 90 e0 ldi r25, 0x00 ; 0 + 10c2: a0 e0 ldi r26, 0x00 ; 0 + 10c4: b0 e0 ldi r27, 0x00 ; 0 + 10c6: ea e0 ldi r30, 0x0A ; 10 + 10c8: 88 0f add r24, r24 + 10ca: 99 1f adc r25, r25 + 10cc: aa 1f adc r26, r26 + 10ce: bb 1f adc r27, r27 + 10d0: ea 95 dec r30 + 10d2: d1 f7 brne .-12 ; 0x10c8 + 10d4: 84 0f add r24, r20 + 10d6: 95 1f adc r25, r21 + 10d8: a6 1f adc r26, r22 + 10da: 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; + 10dc: 81 2c mov r8, r1 + 10de: f4 e0 ldi r31, 0x04 ; 4 + 10e0: 9f 2e mov r9, r31 + 10e2: a1 2c mov r10, r1 + 10e4: b1 2c mov r11, r1 + uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; + ByteCount = MIN(ByteCount, BytesLeft); + 10e6: 69 01 movw r12, r18 + 10e8: e1 2c mov r14, r1 + 10ea: f1 2c mov r15, r1 + 10ec: 84 1a sub r8, r20 + 10ee: 95 0a sbc r9, r21 + 10f0: a6 0a sbc r10, r22 + 10f2: b7 0a sbc r11, r23 + 10f4: 89 82 std Y+1, r8 ; 0x01 + 10f6: 9a 82 std Y+2, r9 ; 0x02 + 10f8: ab 82 std Y+3, r10 ; 0x03 + 10fa: bc 82 std Y+4, r11 ; 0x04 + 10fc: c8 14 cp r12, r8 + 10fe: d9 04 cpc r13, r9 + 1100: ea 04 cpc r14, r10 + 1102: fb 04 cpc r15, r11 + 1104: 08 f4 brcc .+2 ; 0x1108 + 1106: 7f c1 rjmp .+766 ; 0x1406 + 1108: 29 81 ldd r18, Y+1 ; 0x01 + 110a: 3a 81 ldd r19, Y+2 ; 0x02 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; +} + +INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) +{ + while(ByteCount > 0) { + 110c: 21 15 cp r18, r1 + 110e: 31 05 cpc r19, r1 + 1110: 09 f4 brne .+2 ; 0x1114 + 1112: 62 c1 rjmp .+708 ; 0x13d8 + uint16_t PageAddress = Address / FLASH_PAGE_SIZE; + uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; + uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); + 1114: e1 2c mov r14, r1 + 1116: ff 24 eor r15, r15 + 1118: f3 94 inc r15 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 111a: e0 e1 ldi r30, 0x10 ; 16 + 111c: 7e 2e mov r7, r30 + +static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; + +INLINE uint8_t SPITransferByte(uint8_t Data) +{ + MEMORY_FLASH_USART.DATA = Data; + 111e: f7 ed ldi r31, 0xD7 ; 215 + 1120: df 2e mov r13, r31 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1122: e0 e4 ldi r30, 0x40 ; 64 + 1124: 4e 2e mov r4, r30 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 1126: f0 e1 ldi r31, 0x10 ; 16 + 1128: cf 2e mov r12, r31 + +static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; + +INLINE uint8_t SPITransferByte(uint8_t Data) +{ + MEMORY_FLASH_USART.DATA = Data; + 112a: e7 ed ldi r30, 0xD7 ; 215 + 112c: 3e 2e mov r3, r30 + 112e: f3 e5 ldi r31, 0x53 ; 83 + 1130: 5f 2e mov r5, r31 + 1132: e4 e8 ldi r30, 0x84 ; 132 + 1134: 6e 2e mov r6, r30 + 1136: f3 e8 ldi r31, 0x83 ; 131 + 1138: 2f 2e mov r2, r31 + 113a: 29 87 std Y+9, r18 ; 0x09 + 113c: 3a 87 std Y+10, r19 ; 0x0a + 113e: 4d 83 std Y+5, r20 ; 0x05 + 1140: 5e 83 std Y+6, r21 ; 0x06 + 1142: 6f 83 std Y+7, r22 ; 0x07 + 1144: 78 87 std Y+8, r23 ; 0x08 + 1146: b9 01 movw r22, r18 +} + +INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) +{ + while(ByteCount > 0) { + uint16_t PageAddress = Address / FLASH_PAGE_SIZE; + 1148: 89 2e mov r8, r25 + 114a: 9a 2e mov r9, r26 + 114c: ab 2e mov r10, r27 + 114e: bb 24 eor r11, r11 + uint8_t ByteAddress = Address % FLASH_PAGE_SIZE; + 1150: 38 2f mov r19, r24 + uint16_t PageBytes = MIN(FLASH_PAGE_SIZE - ByteAddress, ByteCount); + 1152: a7 01 movw r20, r14 + 1154: 48 1b sub r20, r24 + 1156: 51 09 sbc r21, r1 + 1158: 64 17 cp r22, r20 + 115a: 75 07 cpc r23, r21 + 115c: 08 f4 brcc .+2 ; 0x1160 + 115e: ab 01 movw r20, r22 + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 1160: 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; + 1164: 30 92 a0 09 sts 0x09A0, r3 + + 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 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1170: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1174: 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; + 1178: 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 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1184: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1188: 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; + 118c: 70 92 65 06 sts 0x0665, r7 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; +} + +INLINE void FlashMemoryToBuffer(uint16_t PageAddress) +{ + while(FlashIsBusy()); + 1190: 27 ff sbrs r18, 7 + 1192: e6 cf rjmp .-52 ; 0x1160 + 1194: 69 87 std Y+9, r22 ; 0x09 + 1196: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 1198: 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; + 119c: 50 92 a0 09 sts 0x09A0, r5 + 11a0: 69 85 ldd r22, Y+9 ; 0x09 + 11a2: 7a 85 ldd r23, Y+10 ; 0x0a + + 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 + 11ac: 69 87 std Y+9, r22 ; 0x09 + 11ae: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 11b0: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 11b4: 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; + 11b8: 90 92 a0 09 sts 0x09A0, r9 + 11bc: 69 85 ldd r22, Y+9 ; 0x09 + 11be: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 11c0: 20 91 a1 09 lds r18, 0x09A1 + 11c4: 26 ff sbrs r18, 6 + 11c6: fc cf rjmp .-8 ; 0x11c0 + 11c8: 69 87 std Y+9, r22 ; 0x09 + 11ca: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 11cc: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 11d0: 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; + 11d4: 80 92 a0 09 sts 0x09A0, r8 + 11d8: 69 85 ldd r22, Y+9 ; 0x09 + 11da: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 11dc: 20 91 a1 09 lds r18, 0x09A1 + 11e0: 26 ff sbrs r18, 6 + 11e2: fc cf rjmp .-8 ; 0x11dc + 11e4: 69 87 std Y+9, r22 ; 0x09 + 11e6: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 11e8: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 11ec: 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; + 11f0: 10 92 a0 09 sts 0x09A0, r1 + 11f4: 69 85 ldd r22, Y+9 ; 0x09 + 11f6: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 11f8: 20 91 a1 09 lds r18, 0x09A1 + 11fc: 26 ff sbrs r18, 6 + 11fe: fc cf rjmp .-8 ; 0x11f8 + 1200: 69 87 std Y+9, r22 ; 0x09 + 1202: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1204: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1208: 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; + 120c: 70 92 65 06 sts 0x0665, r7 + 1210: 69 85 ldd r22, Y+9 ; 0x09 + 1212: 7a 85 ldd r23, Y+10 ; 0x0a + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 1214: 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; + 1218: d0 92 a0 09 sts 0x09A0, r13 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 121c: 20 91 a1 09 lds r18, 0x09A1 + 1220: 26 ff sbrs r18, 6 + 1222: fc cf rjmp .-8 ; 0x121c + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1224: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1228: 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; + 122c: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1230: 20 91 a1 09 lds r18, 0x09A1 + 1234: 26 ff sbrs r18, 6 + 1236: fc cf rjmp .-8 ; 0x1230 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1238: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 123c: 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; + 1240: 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()); + 1244: 27 ff sbrs r18, 7 + 1246: e6 cf rjmp .-52 ; 0x1214 + 1248: 69 87 std Y+9, r22 ; 0x09 + 124a: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 124c: 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; + 1250: 60 92 a0 09 sts 0x09A0, r6 + 1254: 69 85 ldd r22, Y+9 ; 0x09 + 1256: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1258: 20 91 a1 09 lds r18, 0x09A1 + 125c: 26 ff sbrs r18, 6 + 125e: fc cf rjmp .-8 ; 0x1258 + 1260: 69 87 std Y+9, r22 ; 0x09 + 1262: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1264: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1268: 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; + 126c: 10 92 a0 09 sts 0x09A0, r1 + 1270: 69 85 ldd r22, Y+9 ; 0x09 + 1272: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1274: 20 91 a1 09 lds r18, 0x09A1 + 1278: 26 ff sbrs r18, 6 + 127a: fc cf rjmp .-8 ; 0x1274 + 127c: 69 87 std Y+9, r22 ; 0x09 + 127e: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1280: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1284: 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; + 1288: 10 92 a0 09 sts 0x09A0, r1 + 128c: 69 85 ldd r22, Y+9 ; 0x09 + 128e: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1290: 20 91 a1 09 lds r18, 0x09A1 + 1294: 26 ff sbrs r18, 6 + 1296: fc cf rjmp .-8 ; 0x1290 + 1298: 69 87 std Y+9, r22 ; 0x09 + 129a: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 129c: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 12a0: 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; + 12a4: 30 93 a0 09 sts 0x09A0, r19 + 12a8: 69 85 ldd r22, Y+9 ; 0x09 + 12aa: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 12ac: 20 91 a1 09 lds r18, 0x09A1 + 12b0: 26 ff sbrs r18, 6 + 12b2: fc cf rjmp .-8 ; 0x12ac + 12b4: 69 87 std Y+9, r22 ; 0x09 + 12b6: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 12b8: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 12bc: 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) { + 12c0: 41 15 cp r20, r1 + 12c2: 51 05 cpc r21, r1 + 12c4: 91 f0 breq .+36 ; 0x12ea + 12c6: f8 01 movw r30, r16 + 12c8: 9a 01 movw r18, r20 + 12ca: 20 0f add r18, r16 + 12cc: 31 1f adc r19, r17 + MEMORY_FLASH_USART.DATA = *ByteBuffer++; + 12ce: 61 91 ld r22, Z+ + 12d0: 60 93 a0 09 sts 0x09A0, r22 + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 12d4: 60 91 a1 09 lds r22, 0x09A1 + 12d8: 66 ff sbrs r22, 6 + 12da: fc cf rjmp .-8 ; 0x12d4 + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 12dc: 40 92 a1 09 sts 0x09A1, r4 + MEMORY_FLASH_USART.DATA; /* Flush Buffer */ + 12e0: 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) { + 12e4: e2 17 cp r30, r18 + 12e6: f3 07 cpc r31, r19 + 12e8: 91 f7 brne .-28 ; 0x12ce + SPITransferByte(FLASH_CMD_BUF1_WRITE); + SPITransferByte( 0 ); + SPITransferByte( 0 ); + SPITransferByte( Address ); + SPIWriteBlock(Buffer, ByteCount); + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; + 12ea: 70 92 65 06 sts 0x0665, r7 + 12ee: 69 85 ldd r22, Y+9 ; 0x09 + 12f0: 7a 85 ldd r23, Y+10 ; 0x0a + +INLINE uint8_t FlashReadStatusRegister(void) +{ + uint8_t Register; + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 12f2: 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; + 12f6: d0 92 a0 09 sts 0x09A0, r13 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 12fa: 20 91 a1 09 lds r18, 0x09A1 + 12fe: 26 ff sbrs r18, 6 + 1300: fc cf rjmp .-8 ; 0x12fa + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1302: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1306: 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; + 130a: 10 92 a0 09 sts 0x09A0, r1 + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 130e: 20 91 a1 09 lds r18, 0x09A1 + 1312: 26 ff sbrs r18, 6 + 1314: fc cf rjmp .-8 ; 0x130e + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1316: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 131a: 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; + 131e: 70 92 65 06 sts 0x0665, r7 + MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; +} + +INLINE void FlashBufferToMemory(uint16_t PageAddress) +{ + while(FlashIsBusy()); + 1322: 27 ff sbrs r18, 7 + 1324: e6 cf rjmp .-52 ; 0x12f2 + 1326: 69 87 std Y+9, r22 ; 0x09 + 1328: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + 132a: 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; + 132e: 20 92 a0 09 sts 0x09A0, r2 + 1332: 69 85 ldd r22, Y+9 ; 0x09 + 1334: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1336: 20 91 a1 09 lds r18, 0x09A1 + 133a: 26 ff sbrs r18, 6 + 133c: fc cf rjmp .-8 ; 0x1336 + 133e: 69 87 std Y+9, r22 ; 0x09 + 1340: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1342: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1346: 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; + 134a: 90 92 a0 09 sts 0x09A0, r9 + 134e: 69 85 ldd r22, Y+9 ; 0x09 + 1350: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 1352: 20 91 a1 09 lds r18, 0x09A1 + 1356: 26 ff sbrs r18, 6 + 1358: fc cf rjmp .-8 ; 0x1352 + 135a: 69 87 std Y+9, r22 ; 0x09 + 135c: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 135e: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1362: 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; + 1366: 80 92 a0 09 sts 0x09A0, r8 + 136a: 69 85 ldd r22, Y+9 ; 0x09 + 136c: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 136e: 20 91 a1 09 lds r18, 0x09A1 + 1372: 26 ff sbrs r18, 6 + 1374: fc cf rjmp .-8 ; 0x136e + 1376: 69 87 std Y+9, r22 ; 0x09 + 1378: 7a 87 std Y+10, r23 ; 0x0a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 137a: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 137e: 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; + 1382: 10 92 a0 09 sts 0x09A0, r1 + 1386: 69 85 ldd r22, Y+9 ; 0x09 + 1388: 7a 85 ldd r23, Y+10 ; 0x0a + + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + 138a: 20 91 a1 09 lds r18, 0x09A1 + 138e: 26 ff sbrs r18, 6 + 1390: fc cf rjmp .-8 ; 0x138a + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + 1392: 40 92 a1 09 sts 0x09A1, r4 + + return MEMORY_FLASH_USART.DATA; + 1396: 20 91 a0 09 lds r18, 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; + 139a: 70 92 65 06 sts 0x0665, r7 + + FlashMemoryToBuffer(PageAddress); + FlashWriteBuffer(Buffer, ByteAddress, PageBytes); + FlashBufferToMemory(PageAddress); + + ByteCount -= PageBytes; + 139e: 64 1b sub r22, r20 + 13a0: 75 0b sbc r23, r21 + 13a2: 69 87 std Y+9, r22 ; 0x09 + 13a4: 7a 87 std Y+10, r23 ; 0x0a + Address += PageBytes; + 13a6: 84 0f add r24, r20 + 13a8: 95 1f adc r25, r21 + 13aa: a1 1d adc r26, r1 + 13ac: 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) { + 13ae: 61 15 cp r22, r1 + 13b0: 71 05 cpc r23, r1 + 13b2: 09 f0 breq .+2 ; 0x13b6 + 13b4: c9 ce rjmp .-622 ; 0x1148 + 13b6: 4d 81 ldd r20, Y+5 ; 0x05 + 13b8: 5e 81 ldd r21, Y+6 ; 0x06 + 13ba: 6f 81 ldd r22, Y+7 ; 0x07 + 13bc: 78 85 ldd r23, Y+8 ; 0x08 + + /* Store into flash */ + FlashWrite(Buffer, FlashAddress, ByteCount); + + /* Store to local memory */ + uint8_t* DstPtr = &Memory[BlockAddress]; + 13be: da 01 movw r26, r20 + 13c0: ae 56 subi r26, 0x6E ; 110 + 13c2: bf 4d sbci r27, 0xDF ; 223 + 13c4: 89 81 ldd r24, Y+1 ; 0x01 + 13c6: 9a 81 ldd r25, Y+2 ; 0x02 + 13c8: 8a 0f add r24, r26 + 13ca: 9b 1f adc r25, r27 + 13cc: f8 01 movw r30, r16 + uint8_t* SrcPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + *DstPtr++ = *SrcPtr++; + 13ce: 21 91 ld r18, Z+ + 13d0: 2d 93 st X+, r18 + + /* Store to local memory */ + uint8_t* DstPtr = &Memory[BlockAddress]; + uint8_t* SrcPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 13d2: a8 17 cp r26, r24 + 13d4: b9 07 cpc r27, r25 + 13d6: d9 f7 brne .-10 ; 0x13ce + } + + return true; + } + +} + 13d8: 81 e0 ldi r24, 0x01 ; 1 + 13da: 2a 96 adiw r28, 0x0a ; 10 + 13dc: cd bf out 0x3d, r28 ; 61 + 13de: de bf out 0x3e, r29 ; 62 + 13e0: df 91 pop r29 + 13e2: cf 91 pop r28 + 13e4: 1f 91 pop r17 + 13e6: 0f 91 pop r16 + 13e8: ff 90 pop r15 + 13ea: ef 90 pop r14 + 13ec: df 90 pop r13 + 13ee: cf 90 pop r12 + 13f0: bf 90 pop r11 + 13f2: af 90 pop r10 + 13f4: 9f 90 pop r9 + 13f6: 8f 90 pop r8 + 13f8: 7f 90 pop r7 + 13fa: 6f 90 pop r6 + 13fc: 5f 90 pop r5 + 13fe: 4f 90 pop r4 + 1400: 3f 90 pop r3 + 1402: 2f 90 pop r2 + 1404: 08 95 ret + 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.ActiveSetting * MEMORY_SIZE_PER_SETTING; + ByteCount = MIN(ByteCount, BytesLeft); + 1406: c9 82 std Y+1, r12 ; 0x01 + 1408: da 82 std Y+2, r13 ; 0x02 + 140a: eb 82 std Y+3, r14 ; 0x03 + 140c: fc 82 std Y+4, r15 ; 0x04 + 140e: 7c ce rjmp .-776 ; 0x1108 + +00001410 : + } + +} + +bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) +{ + 1410: cf 92 push r12 + 1412: df 92 push r13 + 1414: ef 92 push r14 + 1416: ff 92 push r15 + 1418: 0f 93 push r16 + 141a: 1f 93 push r17 + 141c: 69 01 movw r12, r18 + if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { + 141e: 41 15 cp r20, r1 + 1420: 24 e0 ldi r18, 0x04 ; 4 + 1422: 52 07 cpc r21, r18 + 1424: 61 05 cpc r22, r1 + 1426: 71 05 cpc r23, r1 + 1428: 40 f5 brcc .+80 ; 0x147a + /* 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; + 142a: 00 e0 ldi r16, 0x00 ; 0 + 142c: 14 e0 ldi r17, 0x04 ; 4 + 142e: 20 e0 ldi r18, 0x00 ; 0 + 1430: 30 e0 ldi r19, 0x00 ; 0 + //uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; + ByteCount = MIN(ByteCount, BytesLeft); + 1432: e1 2c mov r14, r1 + 1434: f1 2c mov r15, r1 + 1436: 04 1b sub r16, r20 + 1438: 15 0b sbc r17, r21 + 143a: 26 0b sbc r18, r22 + 143c: 37 0b sbc r19, r23 + 143e: c0 16 cp r12, r16 + 1440: d1 06 cpc r13, r17 + 1442: e2 06 cpc r14, r18 + 1444: f3 06 cpc r15, r19 + 1446: b0 f0 brcs .+44 ; 0x1474 + + /* Output local memory contents */ + uint8_t* DstPtr = (uint8_t*) Buffer; + uint8_t* SrcPtr = &Memory[BlockAddress]; + 1448: 4e 56 subi r20, 0x6E ; 110 + 144a: 5f 4d sbci r21, 0xDF ; 223 + + while(ByteCount--) { + 144c: 01 15 cp r16, r1 + 144e: 11 05 cpc r17, r1 + 1450: 49 f0 breq .+18 ; 0x1464 + 1452: da 01 movw r26, r20 + 1454: fc 01 movw r30, r24 + 1456: 08 0f add r16, r24 + 1458: 19 1f adc r17, r25 + *DstPtr++ = *SrcPtr++; + 145a: 8d 91 ld r24, X+ + 145c: 81 93 st Z+, r24 + + /* Output local memory contents */ + uint8_t* DstPtr = (uint8_t*) Buffer; + uint8_t* SrcPtr = &Memory[BlockAddress]; + + while(ByteCount--) { + 145e: e0 17 cp r30, r16 + 1460: f1 07 cpc r31, r17 + 1462: d9 f7 brne .-10 ; 0x145a + *DstPtr++ = *SrcPtr++; + } + + return true; + 1464: 81 e0 ldi r24, 0x01 ; 1 + } + 1466: 1f 91 pop r17 + 1468: 0f 91 pop r16 + 146a: ff 90 pop r15 + 146c: ef 90 pop r14 + 146e: df 90 pop r13 + 1470: cf 90 pop r12 + 1472: 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); + 1474: 97 01 movw r18, r14 + 1476: 86 01 movw r16, r12 + 1478: e7 cf rjmp .-50 ; 0x1448 + +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; + 147a: 80 e0 ldi r24, 0x00 ; 0 + *DstPtr++ = *SrcPtr++; + } + + return true; + } + 147c: 1f 91 pop r17 + 147e: 0f 91 pop r16 + 1480: ff 90 pop r15 + 1482: ef 90 pop r14 + 1484: df 90 pop r13 + 1486: cf 90 pop r12 + 1488: 08 95 ret + +0000148a : +} + +void ButtonSetActionById(ButtonActionEnum Action) +{ +#ifndef BUTTON_SETTING_GLOBAL + GlobalSettings.ActiveSettingPtr->ButtonAction = Action; + 148a: e0 e0 ldi r30, 0x00 ; 0 + 148c: f6 e0 ldi r31, 0x06 ; 6 + 148e: 80 e4 ldi r24, 0x40 ; 64 + 1490: 82 83 std Z+2, r24 ; 0x02 + 1492: 88 e1 ldi r24, 0x18 ; 24 + 1494: 86 8b std Z+22, r24 ; 0x16 + 1496: 08 95 ret + +00001498 : + 1498: ff 92 push r15 + 149a: 0f 93 push r16 + 149c: 1f 93 push r17 + 149e: cf 93 push r28 + 14a0: df 93 push r29 + 14a2: cd b7 in r28, 0x3d ; 61 + 14a4: de b7 in r29, 0x3e ; 62 + 14a6: a0 97 sbiw r28, 0x20 ; 32 + 14a8: cd bf out 0x3d, r28 ; 61 + 14aa: de bf out 0x3e, r29 ; 62 + 14ac: 80 91 08 06 lds r24, 0x0608 + 14b0: 80 95 com r24 + 14b2: 90 91 92 24 lds r25, 0x2492 + 14b6: 98 27 eor r25, r24 + 14b8: 80 93 92 24 sts 0x2492, r24 + 14bc: 80 74 andi r24, 0x40 ; 64 + 14be: 89 23 and r24, r25 + 14c0: d9 f0 breq .+54 ; 0x14f8 + 14c2: e0 91 fe 24 lds r30, 0x24FE + 14c6: f0 91 ff 24 lds r31, 0x24FF + 14ca: 80 81 ld r24, Z + 14cc: 81 30 cpi r24, 0x01 ; 1 + 14ce: e9 f0 breq .+58 ; 0x150a + 14d0: 82 30 cpi r24, 0x02 ; 2 + 14d2: a9 f1 breq .+106 ; 0x153e + 14d4: 83 30 cpi r24, 0x03 ; 3 + 14d6: 09 f4 brne .+2 ; 0x14da + 14d8: 50 c0 rjmp .+160 ; 0x157a + 14da: 84 30 cpi r24, 0x04 ; 4 + 14dc: 09 f4 brne .+2 ; 0x14e0 + 14de: 73 c0 rjmp .+230 ; 0x15c6 + 14e0: 85 30 cpi r24, 0x05 ; 5 + 14e2: 09 f4 brne .+2 ; 0x14e6 + 14e4: 8e c0 rjmp .+284 ; 0x1602 + 14e6: 86 30 cpi r24, 0x06 ; 6 + 14e8: 09 f4 brne .+2 ; 0x14ec + 14ea: ad c0 rjmp .+346 ; 0x1646 + 14ec: 87 30 cpi r24, 0x07 ; 7 + 14ee: 09 f4 brne .+2 ; 0x14f2 + 14f0: 66 c0 rjmp .+204 ; 0x15be + 14f2: 88 30 cpi r24, 0x08 ; 8 + 14f4: 09 f4 brne .+2 ; 0x14f8 + 14f6: 65 c0 rjmp .+202 ; 0x15c2 + 14f8: a0 96 adiw r28, 0x20 ; 32 + 14fa: cd bf out 0x3d, r28 ; 61 + 14fc: de bf out 0x3e, r29 ; 62 + 14fe: df 91 pop r29 + 1500: cf 91 pop r28 + 1502: 1f 91 pop r17 + 1504: 0f 91 pop r16 + 1506: ff 90 pop r15 + 1508: 08 95 ret + 150a: 80 91 fb 24 lds r24, 0x24FB + 150e: 88 23 and r24, r24 + 1510: 09 f4 brne .+2 ; 0x1514 + 1512: 9b c0 rjmp .+310 ; 0x164a + 1514: f1 2c mov r15, r1 + 1516: 8e 01 movw r16, r28 + 1518: 0f 5f subi r16, 0xFF ; 255 + 151a: 1f 4f sbci r17, 0xFF ; 255 + 151c: 9d da rcall .-2758 ; 0xa58 + 151e: f8 01 movw r30, r16 + 1520: ef 0d add r30, r15 + 1522: f1 1d adc r31, r1 + 1524: 80 83 st Z, r24 + 1526: f3 94 inc r15 + 1528: 80 91 fb 24 lds r24, 0x24FB + 152c: f8 16 cp r15, r24 + 152e: b0 f3 brcs .-20 ; 0x151c + 1530: e0 91 f7 24 lds r30, 0x24F7 + 1534: f0 91 f8 24 lds r31, 0x24F8 + 1538: c8 01 movw r24, r16 + 153a: 09 95 icall + 153c: dd cf rjmp .-70 ; 0x14f8 + 153e: e0 91 f5 24 lds r30, 0x24F5 + 1542: f0 91 f6 24 lds r31, 0x24F6 + 1546: 8e 01 movw r16, r28 + 1548: 0f 5f subi r16, 0xFF ; 255 + 154a: 1f 4f sbci r17, 0xFF ; 255 + 154c: c8 01 movw r24, r16 + 154e: 09 95 icall + 1550: 20 91 fb 24 lds r18, 0x24FB + 1554: 22 23 and r18, r18 + 1556: 61 f3 breq .-40 ; 0x1530 + 1558: f8 01 movw r30, r16 + 155a: 91 e0 ldi r25, 0x01 ; 1 + 155c: 99 23 and r25, r25 + 155e: 39 f0 breq .+14 ; 0x156e + 1560: 80 81 ld r24, Z + 1562: 91 e0 ldi r25, 0x01 ; 1 + 1564: 8f 3f cpi r24, 0xFF ; 255 + 1566: 09 f0 breq .+2 ; 0x156a + 1568: 90 e0 ldi r25, 0x00 ; 0 + 156a: 8f 5f subi r24, 0xFF ; 255 + 156c: 80 83 st Z, r24 + 156e: 31 96 adiw r30, 0x01 ; 1 + 1570: 8e 2f mov r24, r30 + 1572: 80 1b sub r24, r16 + 1574: 82 17 cp r24, r18 + 1576: 90 f3 brcs .-28 ; 0x155c + 1578: db cf rjmp .-74 ; 0x1530 + 157a: e0 91 f5 24 lds r30, 0x24F5 + 157e: f0 91 f6 24 lds r31, 0x24F6 + 1582: 8e 01 movw r16, r28 + 1584: 0f 5f subi r16, 0xFF ; 255 + 1586: 1f 4f sbci r17, 0xFF ; 255 + 1588: c8 01 movw r24, r16 + 158a: 09 95 icall + 158c: 20 91 fb 24 lds r18, 0x24FB + 1590: 31 e0 ldi r19, 0x01 ; 1 + 1592: 21 50 subi r18, 0x01 ; 1 + 1594: 68 f2 brcs .-102 ; 0x1530 + 1596: 33 23 and r19, r19 + 1598: e1 f3 breq .-8 ; 0x1592 + 159a: 82 2f mov r24, r18 + 159c: 90 e0 ldi r25, 0x00 ; 0 + 159e: f8 01 movw r30, r16 + 15a0: e8 0f add r30, r24 + 15a2: f9 1f adc r31, r25 + 15a4: 40 81 ld r20, Z + 15a6: 31 e0 ldi r19, 0x01 ; 1 + 15a8: 4f 3f cpi r20, 0xFF ; 255 + 15aa: 09 f0 breq .+2 ; 0x15ae + 15ac: 30 e0 ldi r19, 0x00 ; 0 + 15ae: f8 01 movw r30, r16 + 15b0: e8 0f add r30, r24 + 15b2: f9 1f adc r31, r25 + 15b4: 4f 5f subi r20, 0xFF ; 255 + 15b6: 40 83 st Z, r20 + 15b8: 21 50 subi r18, 0x01 ; 1 + 15ba: 68 f7 brcc .-38 ; 0x1596 + 15bc: b9 cf rjmp .-142 ; 0x1530 + 15be: 22 dc rcall .-1980 ; 0xe04 + 15c0: 9b cf rjmp .-202 ; 0x14f8 + 15c2: 2c db rcall .-2472 ; 0xc1c + 15c4: 99 cf rjmp .-206 ; 0x14f8 + 15c6: e0 91 f5 24 lds r30, 0x24F5 + 15ca: f0 91 f6 24 lds r31, 0x24F6 + 15ce: 8e 01 movw r16, r28 + 15d0: 0f 5f subi r16, 0xFF ; 255 + 15d2: 1f 4f sbci r17, 0xFF ; 255 + 15d4: c8 01 movw r24, r16 + 15d6: 09 95 icall + 15d8: 20 91 fb 24 lds r18, 0x24FB + 15dc: 22 23 and r18, r18 + 15de: 09 f4 brne .+2 ; 0x15e2 + 15e0: a7 cf rjmp .-178 ; 0x1530 + 15e2: f8 01 movw r30, r16 + 15e4: 91 e0 ldi r25, 0x01 ; 1 + 15e6: 99 23 and r25, r25 + 15e8: 31 f0 breq .+12 ; 0x15f6 + 15ea: 80 81 ld r24, Z + 15ec: 91 e0 ldi r25, 0x01 ; 1 + 15ee: 81 11 cpse r24, r1 + 15f0: 90 e0 ldi r25, 0x00 ; 0 + 15f2: 81 50 subi r24, 0x01 ; 1 + 15f4: 80 83 st Z, r24 + 15f6: 31 96 adiw r30, 0x01 ; 1 + 15f8: 8e 2f mov r24, r30 + 15fa: 80 1b sub r24, r16 + 15fc: 82 17 cp r24, r18 + 15fe: 98 f3 brcs .-26 ; 0x15e6 + 1600: 97 cf rjmp .-210 ; 0x1530 + 1602: e0 91 f5 24 lds r30, 0x24F5 + 1606: f0 91 f6 24 lds r31, 0x24F6 + 160a: 8e 01 movw r16, r28 + 160c: 0f 5f subi r16, 0xFF ; 255 + 160e: 1f 4f sbci r17, 0xFF ; 255 + 1610: c8 01 movw r24, r16 + 1612: 09 95 icall + 1614: 20 91 fb 24 lds r18, 0x24FB + 1618: 31 e0 ldi r19, 0x01 ; 1 + 161a: 21 50 subi r18, 0x01 ; 1 + 161c: 08 f4 brcc .+2 ; 0x1620 + 161e: 88 cf rjmp .-240 ; 0x1530 + 1620: 33 23 and r19, r19 + 1622: d9 f3 breq .-10 ; 0x161a + 1624: 82 2f mov r24, r18 + 1626: 90 e0 ldi r25, 0x00 ; 0 + 1628: f8 01 movw r30, r16 + 162a: e8 0f add r30, r24 + 162c: f9 1f adc r31, r25 + 162e: 40 81 ld r20, Z + 1630: 31 e0 ldi r19, 0x01 ; 1 + 1632: 41 11 cpse r20, r1 + 1634: 30 e0 ldi r19, 0x00 ; 0 + 1636: f8 01 movw r30, r16 + 1638: e8 0f add r30, r24 + 163a: f9 1f adc r31, r25 + 163c: 41 50 subi r20, 0x01 ; 1 + 163e: 40 83 st Z, r20 + 1640: 21 50 subi r18, 0x01 ; 1 + 1642: 70 f7 brcc .-36 ; 0x1620 + 1644: 75 cf rjmp .-278 ; 0x1530 + 1646: da d0 rcall .+436 ; 0x17fc + 1648: 57 cf rjmp .-338 ; 0x14f8 + 164a: 8e 01 movw r16, r28 + 164c: 0f 5f subi r16, 0xFF ; 255 + 164e: 1f 4f sbci r17, 0xFF ; 255 + 1650: 6f cf rjmp .-290 ; 0x1530 + +00001652 : + 1652: 0f 93 push r16 + 1654: 1f 93 push r17 + 1656: cf 93 push r28 + 1658: df 93 push r29 + 165a: 61 50 subi r22, 0x01 ; 1 + 165c: 71 09 sbc r23, r1 + 165e: 47 e4 ldi r20, 0x47 ; 71 + 1660: 53 e0 ldi r21, 0x03 ; 3 + 1662: 1c e2 ldi r17, 0x2C ; 44 + 1664: 9a 01 movw r18, r20 + 1666: fa 01 movw r30, r20 + 1668: 04 91 lpm r16, Z + 166a: 00 23 and r16, r16 + 166c: 49 f1 breq .+82 ; 0x16c0 + 166e: 61 32 cpi r22, 0x21 ; 33 + 1670: 71 05 cpc r23, r1 + 1672: 20 f4 brcc .+8 ; 0x167c + 1674: 25 c0 rjmp .+74 ; 0x16c0 + 1676: 60 32 cpi r22, 0x20 ; 32 + 1678: 71 05 cpc r23, r1 + 167a: 61 f0 breq .+24 ; 0x1694 + 167c: dc 01 movw r26, r24 + 167e: 01 96 adiw r24, 0x01 ; 1 + 1680: ec 01 movw r28, r24 + 1682: 0c 93 st X, r16 + 1684: 2f 5f subi r18, 0xFF ; 255 + 1686: 3f 4f sbci r19, 0xFF ; 255 + 1688: 61 50 subi r22, 0x01 ; 1 + 168a: 71 09 sbc r23, r1 + 168c: f9 01 movw r30, r18 + 168e: 04 91 lpm r16, Z + 1690: 01 11 cpse r16, r1 + 1692: f1 cf rjmp .-30 ; 0x1676 + 1694: f4 e0 ldi r31, 0x04 ; 4 + 1696: 47 34 cpi r20, 0x47 ; 71 + 1698: 5f 07 cpc r21, r31 + 169a: 61 f0 breq .+24 ; 0x16b4 + 169c: ce 01 movw r24, r28 + 169e: 01 96 adiw r24, 0x01 ; 1 + 16a0: 18 83 st Y, r17 + 16a2: 61 50 subi r22, 0x01 ; 1 + 16a4: 71 09 sbc r23, r1 + 16a6: 40 5e subi r20, 0xE0 ; 224 + 16a8: 5f 4f sbci r21, 0xFF ; 255 + 16aa: 24 e0 ldi r18, 0x04 ; 4 + 16ac: 47 36 cpi r20, 0x67 ; 103 + 16ae: 52 07 cpc r21, r18 + 16b0: c9 f6 brne .-78 ; 0x1664 + 16b2: ec 01 movw r28, r24 + 16b4: 18 82 st Y, r1 + 16b6: df 91 pop r29 + 16b8: cf 91 pop r28 + 16ba: 1f 91 pop r17 + 16bc: 0f 91 pop r16 + 16be: 08 95 ret + 16c0: ec 01 movw r28, r24 + 16c2: e8 cf rjmp .-48 ; 0x1694 + +000016c4 : + } +#endif +} + +void ButtonGetActionByName(char* ActionOut, uint16_t BufferSize) +{ + 16c4: ab 01 movw r20, r22 + strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonAction], BufferSize); + 16c6: e0 91 fe 24 lds r30, 0x24FE + 16ca: f0 91 ff 24 lds r31, 0x24FF + 16ce: 60 81 ld r22, Z + 16d0: 20 e2 ldi r18, 0x20 ; 32 + 16d2: 62 9f mul r22, r18 + 16d4: b0 01 movw r22, r0 + 16d6: 11 24 eor r1, r1 + 16d8: 69 5b subi r22, 0xB9 ; 185 + 16da: 7c 4f sbci r23, 0xFC ; 252 + 16dc: 0c 94 f7 23 jmp 0x47ee ; 0x47ee + +000016e0 : +} + +bool ButtonSetActionByName(const char* Action) +{ + 16e0: cf 93 push r28 + 16e2: df 93 push r29 + 16e4: ec 01 movw r28, r24 + uint8_t i; + + for (i=0; i + 16ee: 89 2b or r24, r25 + 16f0: e9 f1 breq .+122 ; 0x176c + 16f2: 67 e6 ldi r22, 0x67 ; 103 + 16f4: 73 e0 ldi r23, 0x03 ; 3 + 16f6: ce 01 movw r24, r28 + 16f8: 0e 94 ee 23 call 0x47dc ; 0x47dc + 16fc: 89 2b or r24, r25 + 16fe: 09 f4 brne .+2 ; 0x1702 + 1700: 3f c0 rjmp .+126 ; 0x1780 + 1702: 67 e8 ldi r22, 0x87 ; 135 + 1704: 73 e0 ldi r23, 0x03 ; 3 + 1706: ce 01 movw r24, r28 + 1708: 0e 94 ee 23 call 0x47dc ; 0x47dc + 170c: 89 2b or r24, r25 + 170e: d1 f1 breq .+116 ; 0x1784 + 1710: 67 ea ldi r22, 0xA7 ; 167 + 1712: 73 e0 ldi r23, 0x03 ; 3 + 1714: ce 01 movw r24, r28 + 1716: 0e 94 ee 23 call 0x47dc ; 0x47dc + 171a: 89 2b or r24, r25 + 171c: a9 f1 breq .+106 ; 0x1788 + 171e: 67 ec ldi r22, 0xC7 ; 199 + 1720: 73 e0 ldi r23, 0x03 ; 3 + 1722: ce 01 movw r24, r28 + 1724: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1728: 89 2b or r24, r25 + 172a: 81 f1 breq .+96 ; 0x178c + 172c: 67 ee ldi r22, 0xE7 ; 231 + 172e: 73 e0 ldi r23, 0x03 ; 3 + 1730: ce 01 movw r24, r28 + 1732: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1736: 89 2b or r24, r25 + 1738: 59 f1 breq .+86 ; 0x1790 + 173a: 67 e0 ldi r22, 0x07 ; 7 + 173c: 74 e0 ldi r23, 0x04 ; 4 + 173e: ce 01 movw r24, r28 + 1740: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1744: 89 2b or r24, r25 + 1746: 31 f1 breq .+76 ; 0x1794 + 1748: 67 e2 ldi r22, 0x27 ; 39 + 174a: 74 e0 ldi r23, 0x04 ; 4 + 174c: ce 01 movw r24, r28 + 174e: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1752: 89 2b or r24, r25 + 1754: 09 f1 breq .+66 ; 0x1798 + 1756: 67 e4 ldi r22, 0x47 ; 71 + 1758: 74 e0 ldi r23, 0x04 ; 4 + 175a: ce 01 movw r24, r28 + 175c: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1760: 89 2b or r24, r25 + 1762: e1 f0 breq .+56 ; 0x179c + return true; + } + } + + /* Button action not found */ + return false; + 1764: 80 e0 ldi r24, 0x00 ; 0 +} + 1766: df 91 pop r29 + 1768: cf 91 pop r28 + 176a: 08 95 ret + +bool ButtonSetActionByName(const char* Action) +{ + uint8_t i; + + for (i=0; iButtonAction = Action; + 176e: e0 91 fe 24 lds r30, 0x24FE + 1772: f0 91 ff 24 lds r31, 0x24FF + 1776: 80 83 st Z, r24 + uint8_t i; + + for (i=0; i + 1784: 82 e0 ldi r24, 0x02 ; 2 + 1786: f3 cf rjmp .-26 ; 0x176e + 1788: 83 e0 ldi r24, 0x03 ; 3 + 178a: f1 cf rjmp .-30 ; 0x176e + 178c: 84 e0 ldi r24, 0x04 ; 4 + 178e: ef cf rjmp .-34 ; 0x176e + 1790: 85 e0 ldi r24, 0x05 ; 5 + 1792: ed cf rjmp .-38 ; 0x176e + 1794: 86 e0 ldi r24, 0x06 ; 6 + 1796: eb cf rjmp .-42 ; 0x176e + 1798: 87 e0 ldi r24, 0x07 ; 7 + 179a: e9 cf rjmp .-46 ; 0x176e + 179c: 88 e0 ldi r24, 0x08 ; 8 + 179e: e7 cf rjmp .-50 ; 0x176e + +000017a0 : + } +} + +uint8_t SettingsGetActiveById(void) { + return GlobalSettings.ActiveSetting; +} + 17a0: 43 e1 ldi r20, 0x13 ; 19 + 17a2: 50 e0 ldi r21, 0x00 ; 0 + 17a4: 60 e0 ldi r22, 0x00 ; 0 + 17a6: 70 e0 ldi r23, 0x00 ; 0 + 17a8: 8d ef ldi r24, 0xFD ; 253 + 17aa: 94 e2 ldi r25, 0x24 ; 36 + 17ac: 0c 94 ff 25 jmp 0x4bfe ; 0x4bfe <__eerd_block_x32a4u> + +000017b0 : + 17b0: 43 e1 ldi r20, 0x13 ; 19 + 17b2: 50 e0 ldi r21, 0x00 ; 0 + 17b4: 60 e0 ldi r22, 0x00 ; 0 + 17b6: 70 e0 ldi r23, 0x00 ; 0 + 17b8: 8d ef ldi r24, 0xFD ; 253 + 17ba: 94 e2 ldi r25, 0x24 ; 36 + 17bc: 0c 94 0a 26 jmp 0x4c14 ; 0x4c14 <__eewr_block_x32a4u> + +000017c0 : + 17c0: cf 93 push r28 + 17c2: df 93 push r29 + 17c4: 1f 92 push r1 + 17c6: cd b7 in r28, 0x3d ; 61 + 17c8: de b7 in r29, 0x3e ; 62 + 17ca: 88 30 cpi r24, 0x08 ; 8 + 17cc: 20 f0 brcs .+8 ; 0x17d6 + 17ce: 0f 90 pop r0 + 17d0: df 91 pop r29 + 17d2: cf 91 pop r28 + 17d4: 08 95 ret + 17d6: 89 83 std Y+1, r24 ; 0x01 + 17d8: 15 db rcall .-2518 ; 0xe04 + 17da: 89 81 ldd r24, Y+1 ; 0x01 + 17dc: 80 93 fd 24 sts 0x24FD, r24 + 17e0: 90 e0 ldi r25, 0x00 ; 0 + 17e2: 88 0f add r24, r24 + 17e4: 99 1f adc r25, r25 + 17e6: 80 50 subi r24, 0x00 ; 0 + 17e8: 9b 4d sbci r25, 0xDB ; 219 + 17ea: 80 93 fe 24 sts 0x24FE, r24 + 17ee: 90 93 ff 24 sts 0x24FF, r25 + 17f2: b4 d8 rcall .-3736 ; 0x95c + 17f4: 0f 90 pop r0 + 17f6: df 91 pop r29 + 17f8: cf 91 pop r28 + 17fa: 10 ca rjmp .-3040 ; 0xc1c + +000017fc : + 17fc: 20 91 fd 24 lds r18, 0x24FD + 1800: 30 e0 ldi r19, 0x00 ; 0 + 1802: 2f 5f subi r18, 0xFF ; 255 + 1804: 3f 4f sbci r19, 0xFF ; 255 + 1806: 27 70 andi r18, 0x07 ; 7 + 1808: 33 27 eor r19, r19 + 180a: 82 2f mov r24, r18 + 180c: f9 01 movw r30, r18 + 180e: ee 0f add r30, r30 + 1810: ff 1f adc r31, r31 + 1812: ef 5f subi r30, 0xFF ; 255 + 1814: fa 4d sbci r31, 0xDA ; 218 + 1816: 90 81 ld r25, Z + 1818: 91 11 cpse r25, r1 + 181a: 5c c0 rjmp .+184 ; 0x18d4 + 181c: 2f 5f subi r18, 0xFF ; 255 + 181e: 3f 4f sbci r19, 0xFF ; 255 + 1820: 27 70 andi r18, 0x07 ; 7 + 1822: 33 27 eor r19, r19 + 1824: 82 2f mov r24, r18 + 1826: f9 01 movw r30, r18 + 1828: ee 0f add r30, r30 + 182a: ff 1f adc r31, r31 + 182c: ef 5f subi r30, 0xFF ; 255 + 182e: fa 4d sbci r31, 0xDA ; 218 + 1830: 90 81 ld r25, Z + 1832: 91 11 cpse r25, r1 + 1834: 4f c0 rjmp .+158 ; 0x18d4 + 1836: 2f 5f subi r18, 0xFF ; 255 + 1838: 3f 4f sbci r19, 0xFF ; 255 + 183a: 27 70 andi r18, 0x07 ; 7 + 183c: 33 27 eor r19, r19 + 183e: 82 2f mov r24, r18 + 1840: f9 01 movw r30, r18 + 1842: ee 0f add r30, r30 + 1844: ff 1f adc r31, r31 + 1846: ef 5f subi r30, 0xFF ; 255 + 1848: fa 4d sbci r31, 0xDA ; 218 + 184a: 90 81 ld r25, Z + 184c: 91 11 cpse r25, r1 + 184e: 42 c0 rjmp .+132 ; 0x18d4 + 1850: 2f 5f subi r18, 0xFF ; 255 + 1852: 3f 4f sbci r19, 0xFF ; 255 + 1854: 27 70 andi r18, 0x07 ; 7 + 1856: 33 27 eor r19, r19 + 1858: 82 2f mov r24, r18 + 185a: f9 01 movw r30, r18 + 185c: ee 0f add r30, r30 + 185e: ff 1f adc r31, r31 + 1860: ef 5f subi r30, 0xFF ; 255 + 1862: fa 4d sbci r31, 0xDA ; 218 + 1864: 90 81 ld r25, Z + 1866: 91 11 cpse r25, r1 + 1868: 35 c0 rjmp .+106 ; 0x18d4 + 186a: 2f 5f subi r18, 0xFF ; 255 + 186c: 3f 4f sbci r19, 0xFF ; 255 + 186e: 27 70 andi r18, 0x07 ; 7 + 1870: 33 27 eor r19, r19 + 1872: 82 2f mov r24, r18 + 1874: f9 01 movw r30, r18 + 1876: ee 0f add r30, r30 + 1878: ff 1f adc r31, r31 + 187a: ef 5f subi r30, 0xFF ; 255 + 187c: fa 4d sbci r31, 0xDA ; 218 + 187e: 90 81 ld r25, Z + 1880: 91 11 cpse r25, r1 + 1882: 28 c0 rjmp .+80 ; 0x18d4 + 1884: 2f 5f subi r18, 0xFF ; 255 + 1886: 3f 4f sbci r19, 0xFF ; 255 + 1888: 27 70 andi r18, 0x07 ; 7 + 188a: 33 27 eor r19, r19 + 188c: 82 2f mov r24, r18 + 188e: f9 01 movw r30, r18 + 1890: ee 0f add r30, r30 + 1892: ff 1f adc r31, r31 + 1894: ef 5f subi r30, 0xFF ; 255 + 1896: fa 4d sbci r31, 0xDA ; 218 + 1898: 90 81 ld r25, Z + 189a: 91 11 cpse r25, r1 + 189c: 1b c0 rjmp .+54 ; 0x18d4 + 189e: 2f 5f subi r18, 0xFF ; 255 + 18a0: 3f 4f sbci r19, 0xFF ; 255 + 18a2: 27 70 andi r18, 0x07 ; 7 + 18a4: 33 27 eor r19, r19 + 18a6: 82 2f mov r24, r18 + 18a8: f9 01 movw r30, r18 + 18aa: ee 0f add r30, r30 + 18ac: ff 1f adc r31, r31 + 18ae: ef 5f subi r30, 0xFF ; 255 + 18b0: fa 4d sbci r31, 0xDA ; 218 + 18b2: 90 81 ld r25, Z + 18b4: 91 11 cpse r25, r1 + 18b6: 0e c0 rjmp .+28 ; 0x18d4 + 18b8: 2f 5f subi r18, 0xFF ; 255 + 18ba: 3f 4f sbci r19, 0xFF ; 255 + 18bc: 27 70 andi r18, 0x07 ; 7 + 18be: 33 27 eor r19, r19 + 18c0: 82 2f mov r24, r18 + 18c2: f9 01 movw r30, r18 + 18c4: ee 0f add r30, r30 + 18c6: ff 1f adc r31, r31 + 18c8: ef 5f subi r30, 0xFF ; 255 + 18ca: fa 4d sbci r31, 0xDA ; 218 + 18cc: 90 81 ld r25, Z + 18ce: 91 11 cpse r25, r1 + 18d0: 01 c0 rjmp .+2 ; 0x18d4 + 18d2: 08 95 ret + 18d4: 75 cf rjmp .-278 ; 0x17c0 + +000018d6 : + +void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { + SettingOut[0] = SettingsGetActiveById() + '0'; + 18d6: 20 91 fd 24 lds r18, 0x24FD + 18da: 20 5d subi r18, 0xD0 ; 208 + 18dc: fc 01 movw r30, r24 + 18de: 20 83 st Z, r18 + SettingOut[1] = '\0'; + 18e0: 11 82 std Z+1, r1 ; 0x01 + 18e2: 08 95 ret + +000018e4 : +} + +bool SettingsSetActiveByName(const char* Setting) { + 18e4: fc 01 movw r30, r24 + uint8_t SettingNr = Setting[0] - '0'; + 18e6: 80 81 ld r24, Z + + if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { + 18e8: 91 81 ldd r25, Z+1 ; 0x01 + 18ea: 91 11 cpse r25, r1 + 18ec: 03 c0 rjmp .+6 ; 0x18f4 + SettingOut[0] = SettingsGetActiveById() + '0'; + SettingOut[1] = '\0'; +} + +bool SettingsSetActiveByName(const char* Setting) { + uint8_t SettingNr = Setting[0] - '0'; + 18ee: 80 53 subi r24, 0x30 ; 48 + + if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { + 18f0: 88 30 cpi r24, 0x08 ; 8 + 18f2: 10 f0 brcs .+4 ; 0x18f8 + SettingsSetActiveById(SettingNr); + return true; + } else { + return false; + 18f4: 80 e0 ldi r24, 0x00 ; 0 + } +} + 18f6: 08 95 ret + +bool SettingsSetActiveByName(const char* Setting) { + uint8_t SettingNr = Setting[0] - '0'; + + if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { + SettingsSetActiveById(SettingNr); + 18f8: 63 df rcall .-314 ; 0x17c0 + return true; + 18fa: 81 e0 ldi r24, 0x01 ; 1 + 18fc: 08 95 ret + +000018fe : +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); + 18fe: bc 01 movw r22, r24 + 1900: 81 e0 ldi r24, 0x01 ; 1 + 1902: 90 e2 ldi r25, 0x20 ; 32 + 1904: 0c 94 95 21 jmp 0x432a ; 0x432a + +00001908 : +} + +void TerminalSendStringP(const char* s) { + 1908: cf 93 push r28 + 190a: df 93 push r29 + char c; + + while( (c = pgm_read_byte(s++)) != '\0' ) { + 190c: ec 01 movw r28, r24 + 190e: 21 96 adiw r28, 0x01 ; 1 + 1910: fc 01 movw r30, r24 + 1912: 64 91 lpm r22, Z + 1914: 66 23 and r22, r22 + 1916: 49 f0 breq .+18 ; 0x192a +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); } + 1918: 81 e0 ldi r24, 0x01 ; 1 + 191a: 90 e2 ldi r25, 0x20 ; 32 + 191c: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + 1920: fe 01 movw r30, r28 + 1922: 64 91 lpm r22, Z + 1924: 21 96 adiw r28, 0x01 ; 1 + 1926: 61 11 cpse r22, r1 + 1928: f7 cf rjmp .-18 ; 0x1918 + TerminalSendChar(c); + } +} + 192a: df 91 pop r29 + 192c: cf 91 pop r28 + 192e: 08 95 ret + +00001930 : +#endif + + + +void TerminalSendBlock(void* Buffer, uint16_t ByteCount) +{ + 1930: ab 01 movw r20, r22 + CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); + 1932: bc 01 movw r22, r24 + 1934: 81 e0 ldi r24, 0x01 ; 1 + 1936: 90 e2 ldi r25, 0x20 ; 32 + 1938: 0c 94 ba 21 jmp 0x4374 ; 0x4374 + +0000193c : + } +} + +void TerminalInit(void) +{ + TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK; + 193c: 80 e2 ldi r24, 0x20 ; 32 + 193e: e0 e6 ldi r30, 0x60 ; 96 + 1940: f6 e0 ldi r31, 0x06 ; 6 + 1942: 82 83 std Z+2, r24 ; 0x02 + 1944: 08 95 ret + +00001946 : +} + +void TerminalTask(void) +{ + 1946: cf 93 push r28 + 1948: df 93 push r29 + CDC_Device_USBTask(&TerminalHandle); + 194a: 81 e0 ldi r24, 0x01 ; 1 + 194c: 90 e2 ldi r25, 0x20 ; 32 + 194e: 0e 94 57 22 call 0x44ae ; 0x44ae + USB_USBTask(); + 1952: 0e 94 7a 1c call 0x38f4 ; 0x38f4 + CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); +} + + +static void ProcessByte(void) { + int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle); + 1956: 81 e0 ldi r24, 0x01 ; 1 + 1958: 90 e2 ldi r25, 0x20 ; 32 + 195a: 0e 94 72 22 call 0x44e4 ; 0x44e4 + 195e: ec 01 movw r28, r24 + + if (Byte >= 0) { + 1960: 97 fd sbrc r25, 7 + 1962: 09 c0 rjmp .+18 ; 0x1976 + LED_PORT.OUTTGL = Mask; +} + +static inline +void LEDPulse(uint8_t Mask) { + LEDPulseMask = Mask; + 1964: 80 e1 ldi r24, 0x10 ; 16 + 1966: 80 93 93 24 sts 0x2493, r24 + LED_PORT.OUTSET = Mask; + 196a: 80 93 05 06 sts 0x0605, r24 + /* Byte received */ + LEDPulse(LED_RED); + + if (XModemProcessByte(Byte)) { + 196e: 8c 2f mov r24, r28 + 1970: 5a d2 rcall .+1204 ; 0x1e26 + 1972: 88 23 and r24, r24 + 1974: 19 f0 breq .+6 ; 0x197c +{ + CDC_Device_USBTask(&TerminalHandle); + USB_USBTask(); + + ProcessByte(); +} + 1976: df 91 pop r29 + 1978: cf 91 pop r28 + 197a: 08 95 ret + /* Byte received */ + LEDPulse(LED_RED); + + if (XModemProcessByte(Byte)) { + /* XModem handled the byte */ + } else if (CommandLineProcessByte(Byte)) { + 197c: 8c 2f mov r24, r28 +{ + CDC_Device_USBTask(&TerminalHandle); + USB_USBTask(); + + ProcessByte(); +} + 197e: df 91 pop r29 + 1980: cf 91 pop r28 + /* Byte received */ + LEDPulse(LED_RED); + + if (XModemProcessByte(Byte)) { + /* XModem handled the byte */ + } else if (CommandLineProcessByte(Byte)) { + 1982: e0 c3 rjmp .+1984 ; 0x2144 + +00001984 : + } +} + +static void SenseVBus(void) +{ + switch(TerminalState) { + 1984: 80 91 94 24 lds r24, 0x2494 + 1988: 81 30 cpi r24, 0x01 ; 1 + 198a: 31 f1 breq .+76 ; 0x19d8 + 198c: c8 f0 brcs .+50 ; 0x19c0 + 198e: 82 30 cpi r24, 0x02 ; 2 + 1990: 59 f0 breq .+22 ; 0x19a8 + 1992: 83 30 cpi r24, 0x03 ; 3 + 1994: 39 f4 brne .+14 ; 0x19a4 + TerminalState = TERMINAL_UNITIALIZING; + } + break; + + case TERMINAL_UNITIALIZING: + if (--TerminalInitDelay == 0) { + 1996: 80 91 00 20 lds r24, 0x2000 + 199a: 81 50 subi r24, 0x01 ; 1 + 199c: 80 93 00 20 sts 0x2000, r24 + 19a0: 88 23 and r24, r24 + 19a2: 49 f1 breq .+82 ; 0x19f6 + +void TerminalTick(void) +{ + SenseVBus(); + + XModemTick(); + 19a4: a1 d3 rcall .+1858 ; 0x20e8 + CommandLineTick(); + 19a6: 74 c5 rjmp .+2792 ; 0x2490 + TerminalState = TERMINAL_INITIALIZED; + } + break; + + case TERMINAL_INITIALIZED: + if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { + 19a8: 80 91 68 06 lds r24, 0x0668 + 19ac: 85 fd sbrc r24, 5 + 19ae: fa cf rjmp .-12 ; 0x19a4 + /* Initialized and VBUS sense low */ + TerminalInitDelay = INIT_DELAY; + 19b0: 84 e1 ldi r24, 0x14 ; 20 + 19b2: 80 93 00 20 sts 0x2000, r24 + TerminalState = TERMINAL_UNITIALIZING; + 19b6: 83 e0 ldi r24, 0x03 ; 3 + 19b8: 80 93 94 24 sts 0x2494, r24 + +void TerminalTick(void) +{ + SenseVBus(); + + XModemTick(); + 19bc: 95 d3 rcall .+1834 ; 0x20e8 + CommandLineTick(); + 19be: 68 c5 rjmp .+2768 ; 0x2490 + +static void SenseVBus(void) +{ + switch(TerminalState) { + case TERMINAL_UNINITIALIZED: + if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { + 19c0: 80 91 68 06 lds r24, 0x0668 + 19c4: 85 ff sbrs r24, 5 + 19c6: ee cf rjmp .-36 ; 0x19a4 + /* Not initialized and VBUS sense high */ + TerminalInitDelay = INIT_DELAY; + 19c8: 84 e1 ldi r24, 0x14 ; 20 + 19ca: 80 93 00 20 sts 0x2000, r24 + TerminalState = TERMINAL_INITIALIZING; + 19ce: 81 e0 ldi r24, 0x01 ; 1 + 19d0: 80 93 94 24 sts 0x2494, r24 + +void TerminalTick(void) +{ + SenseVBus(); + + XModemTick(); + 19d4: 89 d3 rcall .+1810 ; 0x20e8 + CommandLineTick(); + 19d6: 5c c5 rjmp .+2744 ; 0x2490 + TerminalState = TERMINAL_INITIALIZING; + } + break; + + case TERMINAL_INITIALIZING: + if (--TerminalInitDelay == 0) { + 19d8: 80 91 00 20 lds r24, 0x2000 + 19dc: 81 50 subi r24, 0x01 ; 1 + 19de: 80 93 00 20 sts 0x2000, r24 + 19e2: 81 11 cpse r24, r1 + 19e4: df cf rjmp .-66 ; 0x19a4 + SystemStartUSBClock(); + 19e6: 0e 94 5c 04 call 0x8b8 ; 0x8b8 + USB_Init(); + 19ea: 0e 94 ce 20 call 0x419c ; 0x419c + TerminalState = TERMINAL_INITIALIZED; + 19ee: 82 e0 ldi r24, 0x02 ; 2 + 19f0: 80 93 94 24 sts 0x2494, r24 + 19f4: d7 cf rjmp .-82 ; 0x19a4 + } + break; + + case TERMINAL_UNITIALIZING: + if (--TerminalInitDelay == 0) { + USB_Disable(); + 19f6: 0e 94 93 20 call 0x4126 ; 0x4126 + SystemStopUSBClock(); + 19fa: 0e 94 75 04 call 0x8ea ; 0x8ea + TerminalState = TERMINAL_UNINITIALIZED; + 19fe: 10 92 94 24 sts 0x2494, r1 + 1a02: d0 cf rjmp .-96 ; 0x19a4 + +00001a04 : + LED_PORT.DIRSET = LED_MASK; +} + +static inline +void LEDSetOn(uint8_t Mask) { + LED_PORT.OUTSET = Mask; + 1a04: 80 e2 ldi r24, 0x20 ; 32 + 1a06: e0 e0 ldi r30, 0x00 ; 0 + 1a08: f6 e0 ldi r31, 0x06 ; 6 + 1a0a: 85 83 std Z+5, r24 ; 0x05 + 1a0c: 08 95 ret + +00001a0e : +} + +static inline +void LEDSetOff(uint8_t Mask) { + LED_PORT.OUTCLR = Mask; + 1a0e: 80 e2 ldi r24, 0x20 ; 32 + 1a10: e0 e0 ldi r30, 0x00 ; 0 + 1a12: f6 e0 ldi r31, 0x06 ; 6 + 1a14: 86 83 std Z+6, r24 ; 0x06 + 1a16: 08 95 ret + +00001a18 : + + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&TerminalHandle); + 1a18: 81 e0 ldi r24, 0x01 ; 1 + 1a1a: 90 e2 ldi r25, 0x20 ; 32 + 1a1c: 0c 94 70 21 jmp 0x42e0 ; 0x42e0 + +00001a20 : +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&TerminalHandle); + 1a20: 81 e0 ldi r24, 0x01 ; 1 + 1a22: 90 e2 ldi r25, 0x20 ; 32 + 1a24: 0c 94 cf 22 jmp 0x459e ; 0x459e + +00001a28 : + +extern const PROGMEM CommandEntryType CommandTable[]; + +CommandStatusIdType CommandGetVersion(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR( + 1a28: 25 ec ldi r18, 0xC5 ; 197 + 1a2a: 34 e0 ldi r19, 0x04 ; 4 + 1a2c: 3f 93 push r19 + 1a2e: 2f 93 push r18 + 1a30: 2e eb ldi r18, 0xBE ; 190 + 1a32: 34 e0 ldi r19, 0x04 ; 4 + 1a34: 3f 93 push r19 + 1a36: 2f 93 push r18 + 1a38: 27 eb ldi r18, 0xB7 ; 183 + 1a3a: 34 e0 ldi r19, 0x04 ; 4 + 1a3c: 3f 93 push r19 + 1a3e: 2f 93 push r18 + 1a40: 2e e7 ldi r18, 0x7E ; 126 + 1a42: 34 e0 ldi r19, 0x04 ; 4 + 1a44: 3f 93 push r19 + 1a46: 2f 93 push r18 + 1a48: 21 e0 ldi r18, 0x01 ; 1 + 1a4a: 2f 93 push r18 + 1a4c: 1f 92 push r1 + 1a4e: 9f 93 push r25 + 1a50: 8f 93 push r24 + 1a52: 0e 94 0f 24 call 0x481e ; 0x481e + "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; + 1a56: 8d b7 in r24, 0x3d ; 61 + 1a58: 9e b7 in r25, 0x3e ; 62 + 1a5a: 0c 96 adiw r24, 0x0c ; 12 + 1a5c: 8d bf out 0x3d, r24 ; 61 + 1a5e: 9e bf out 0x3e, r25 ; 62 +} + 1a60: 85 e6 ldi r24, 0x65 ; 101 + 1a62: 08 95 ret + +00001a64 : + +CommandStatusIdType CommandGetConfig(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, + 1a64: 29 ed ldi r18, 0xD9 ; 217 + 1a66: 34 e2 ldi r19, 0x24 ; 36 + 1a68: 3f 93 push r19 + 1a6a: 2f 93 push r18 + 1a6c: 2b e7 ldi r18, 0x7B ; 123 + 1a6e: 34 e0 ldi r19, 0x04 ; 4 + 1a70: 3f 93 push r19 + 1a72: 2f 93 push r18 + 1a74: 21 e0 ldi r18, 0x01 ; 1 + 1a76: 2f 93 push r18 + 1a78: 1f 92 push r1 + 1a7a: 9f 93 push r25 + 1a7c: 8f 93 push r24 + 1a7e: 0e 94 0f 24 call 0x481e ; 0x481e + PSTR("%s"), ActiveConfiguration.ConfigurationName); + + return COMMAND_INFO_OK_WITH_TEXT_ID; + 1a82: 8d b7 in r24, 0x3d ; 61 + 1a84: 9e b7 in r25, 0x3e ; 62 + 1a86: 08 96 adiw r24, 0x08 ; 8 + 1a88: 8d bf out 0x3d, r24 ; 61 + 1a8a: 9e bf out 0x3e, r25 ; 62 + +} + 1a8c: 85 e6 ldi r24, 0x65 ; 101 + 1a8e: 08 95 ret + +00001a90 : + +CommandStatusIdType CommandSetConfig(const char* InParam) +{ + if (ConfigurationSetByName(InParam)) { + 1a90: 0e 94 b4 04 call 0x968 ; 0x968 + 1a94: 81 11 cpse r24, r1 + 1a96: 02 c0 rjmp .+4 ; 0x1a9c + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + 1a98: 8a ec ldi r24, 0xCA ; 202 + } +} + 1a9a: 08 95 ret +} + +CommandStatusIdType CommandSetConfig(const char* InParam) +{ + if (ConfigurationSetByName(InParam)) { + SettingsSave(); + 1a9c: 89 de rcall .-750 ; 0x17b0 + return COMMAND_INFO_OK_ID; + 1a9e: 84 e6 ldi r24, 0x64 ; 100 + 1aa0: 08 95 ret + +00001aa2 : + } +} + +CommandStatusIdType CommandExecConfig(char* OutMessage) +{ + ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); + 1aa2: 60 e0 ldi r22, 0x00 ; 0 + 1aa4: 71 e0 ldi r23, 0x01 ; 1 + 1aa6: 0e 94 f1 04 call 0x9e2 ; 0x9e2 + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1aaa: 85 e6 ldi r24, 0x65 ; 101 + 1aac: 08 95 ret + +00001aae : + +CommandStatusIdType CommandGetUid(char* OutParam) +{ + 1aae: ef 92 push r14 + 1ab0: ff 92 push r15 + 1ab2: 0f 93 push r16 + 1ab4: 1f 93 push r17 + 1ab6: cf 93 push r28 + 1ab8: df 93 push r29 + 1aba: cd b7 in r28, 0x3d ; 61 + 1abc: de b7 in r29, 0x3e ; 62 + 1abe: a0 97 sbiw r28, 0x20 ; 32 + 1ac0: cd bf out 0x3d, r28 ; 61 + 1ac2: de bf out 0x3e, r29 ; 62 + 1ac4: 8c 01 movw r16, r24 + uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; + uint16_t UidSize = ActiveConfiguration.UidSize; + 1ac6: e0 90 fb 24 lds r14, 0x24FB + 1aca: f1 2c mov r15, r1 +INLINE void ApplicationReset(void) { + ActiveConfiguration.ApplicationResetFunc(); +} + +INLINE void ApplicationGetUid(ConfigurationUidType Uid) { + ActiveConfiguration.ApplicationGetUidFunc(Uid); + 1acc: e0 91 f5 24 lds r30, 0x24F5 + 1ad0: f0 91 f6 24 lds r31, 0x24F6 + 1ad4: ce 01 movw r24, r28 + 1ad6: 01 96 adiw r24, 0x01 ; 1 + 1ad8: 09 95 icall + + ApplicationGetUid(UidBuffer); + + BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE, + 1ada: 97 01 movw r18, r14 + 1adc: ae 01 movw r20, r28 + 1ade: 4f 5f subi r20, 0xFF ; 255 + 1ae0: 5f 4f sbci r21, 0xFF ; 255 + 1ae2: 60 e0 ldi r22, 0x00 ; 0 + 1ae4: 71 e0 ldi r23, 0x01 ; 1 + 1ae6: c8 01 movw r24, r16 + 1ae8: 0e 94 47 05 call 0xa8e ; 0xa8e + UidBuffer, UidSize); + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1aec: 85 e6 ldi r24, 0x65 ; 101 + 1aee: a0 96 adiw r28, 0x20 ; 32 + 1af0: cd bf out 0x3d, r28 ; 61 + 1af2: de bf out 0x3e, r29 ; 62 + 1af4: df 91 pop r29 + 1af6: cf 91 pop r28 + 1af8: 1f 91 pop r17 + 1afa: 0f 91 pop r16 + 1afc: ff 90 pop r15 + 1afe: ef 90 pop r14 + 1b00: 08 95 ret + +00001b02 : + +CommandStatusIdType CommandSetUid(const char* InParam) +{ + 1b02: bf 92 push r11 + 1b04: cf 92 push r12 + 1b06: df 92 push r13 + 1b08: ef 92 push r14 + 1b0a: ff 92 push r15 + 1b0c: 0f 93 push r16 + 1b0e: 1f 93 push r17 + 1b10: cf 93 push r28 + 1b12: df 93 push r29 + 1b14: cd b7 in r28, 0x3d ; 61 + 1b16: de b7 in r29, 0x3e ; 62 + 1b18: a0 97 sbiw r28, 0x20 ; 32 + 1b1a: cd bf out 0x3d, r28 ; 61 + 1b1c: de bf out 0x3e, r29 ; 62 + 1b1e: 8c 01 movw r16, r24 + uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; + uint16_t UidSize = ActiveConfiguration.UidSize; + 1b20: c0 90 fb 24 lds r12, 0x24FB + 1b24: d1 2c mov r13, r1 + + if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { + 1b26: 64 e7 ldi r22, 0x74 ; 116 + 1b28: 74 e0 ldi r23, 0x04 ; 4 + 1b2a: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1b2e: 89 2b or r24, r25 + 1b30: 49 f5 brne .+82 ; 0x1b84 + /* Load with random bytes */ + for (uint8_t i=0; i + 1b38: b1 2c mov r11, r1 + 1b3a: ce 01 movw r24, r28 + 1b3c: 01 96 adiw r24, 0x01 ; 1 + 1b3e: 7c 01 movw r14, r24 + 1b40: 00 e0 ldi r16, 0x00 ; 0 + 1b42: 10 e0 ldi r17, 0x00 ; 0 + UidBuffer[i] = RandomGetByte(); + 1b44: 0e 94 2c 05 call 0xa58 ; 0xa58 + 1b48: f7 01 movw r30, r14 + 1b4a: e0 0f add r30, r16 + 1b4c: f1 1f adc r31, r17 + 1b4e: 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 +} + +INLINE void ApplicationSetUid(ConfigurationUidType Uid) { + ActiveConfiguration.ApplicationSetUidFunc(Uid); + 1b5c: e0 91 f7 24 lds r30, 0x24F7 + 1b60: f0 91 f8 24 lds r31, 0x24F8 + 1b64: c7 01 movw r24, r14 + 1b66: 09 95 icall + } + } + + ApplicationSetUid(UidBuffer); + + return COMMAND_INFO_OK_ID; + 1b68: 84 e6 ldi r24, 0x64 ; 100 +} + 1b6a: a0 96 adiw r28, 0x20 ; 32 + 1b6c: cd bf out 0x3d, r28 ; 61 + 1b6e: de bf out 0x3e, r29 ; 62 + 1b70: df 91 pop r29 + 1b72: cf 91 pop r28 + 1b74: 1f 91 pop r17 + 1b76: 0f 91 pop r16 + 1b78: ff 90 pop r15 + 1b7a: ef 90 pop r14 + 1b7c: df 90 pop r13 + 1b7e: cf 90 pop r12 + 1b80: bf 90 pop r11 + 1b82: 08 95 ret + for (uint8_t i=0; i + 1b94: 8c 15 cp r24, r12 + 1b96: 9d 05 cpc r25, r13 + 1b98: 09 f3 breq .-62 ; 0x1b5c + /* Malformed input. Abort */ + return COMMAND_ERR_INVALID_PARAM_ID; + 1b9a: 8a ec ldi r24, 0xCA ; 202 + 1b9c: e6 cf rjmp .-52 ; 0x1b6a + 1b9e: ce 01 movw r24, r28 + 1ba0: 01 96 adiw r24, 0x01 ; 1 + 1ba2: 7c 01 movw r14, r24 + 1ba4: db cf rjmp .-74 ; 0x1b5c + +00001ba6 : + return COMMAND_INFO_OK_ID; +} + +CommandStatusIdType CommandGetReadOnly(char* OutParam) +{ + if (ActiveConfiguration.ReadOnly) { + 1ba6: 20 91 fc 24 lds r18, 0x24FC + 1baa: 21 11 cpse r18, r1 + 1bac: 07 c0 rjmp .+14 ; 0x1bbc + OutParam[0] = COMMAND_CHAR_TRUE; + } else { + OutParam[0] = COMMAND_CHAR_FALSE; + 1bae: 20 e3 ldi r18, 0x30 ; 48 + 1bb0: fc 01 movw r30, r24 + 1bb2: 20 83 st Z, r18 + } + + OutParam[1] = '\0'; + 1bb4: fc 01 movw r30, r24 + 1bb6: 11 82 std Z+1, r1 ; 0x01 + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1bb8: 85 e6 ldi r24, 0x65 ; 101 + 1bba: 08 95 ret +} + +CommandStatusIdType CommandGetReadOnly(char* OutParam) +{ + if (ActiveConfiguration.ReadOnly) { + OutParam[0] = COMMAND_CHAR_TRUE; + 1bbc: 21 e3 ldi r18, 0x31 ; 49 + 1bbe: fc 01 movw r30, r24 + 1bc0: 20 83 st Z, r18 + } else { + OutParam[0] = COMMAND_CHAR_FALSE; + } + + OutParam[1] = '\0'; + 1bc2: fc 01 movw r30, r24 + 1bc4: 11 82 std Z+1, r1 ; 0x01 + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1bc6: 85 e6 ldi r24, 0x65 ; 101 + 1bc8: 08 95 ret + +00001bca : + +CommandStatusIdType CommandSetReadOnly(const char* InParam) +{ + if (InParam[1] == '\0') { + 1bca: fc 01 movw r30, r24 + 1bcc: 21 81 ldd r18, Z+1 ; 0x01 + 1bce: 21 11 cpse r18, r1 + 1bd0: 05 c0 rjmp .+10 ; 0x1bdc + if (InParam[0] == COMMAND_CHAR_TRUE) { + 1bd2: 80 81 ld r24, Z + 1bd4: 81 33 cpi r24, 0x31 ; 49 + 1bd6: 41 f0 breq .+16 ; 0x1be8 + ActiveConfiguration.ReadOnly = true; + return COMMAND_INFO_OK_ID; + } else if (InParam[0] == COMMAND_CHAR_FALSE) { + 1bd8: 80 33 cpi r24, 0x30 ; 48 + 1bda: 11 f0 breq .+4 ; 0x1be0 + ActiveConfiguration.ReadOnly = false; + return COMMAND_INFO_OK_ID; + } + } + + return COMMAND_ERR_INVALID_PARAM_ID; + 1bdc: 8a ec ldi r24, 0xCA ; 202 +} + 1bde: 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; + 1be0: 10 92 fc 24 sts 0x24FC, r1 + return COMMAND_INFO_OK_ID; + 1be4: 84 e6 ldi r24, 0x64 ; 100 + 1be6: 08 95 ret + +CommandStatusIdType CommandSetReadOnly(const char* InParam) +{ + if (InParam[1] == '\0') { + if (InParam[0] == COMMAND_CHAR_TRUE) { + ActiveConfiguration.ReadOnly = true; + 1be8: 81 e0 ldi r24, 0x01 ; 1 + 1bea: 80 93 fc 24 sts 0x24FC, r24 + return COMMAND_INFO_OK_ID; + 1bee: 84 e6 ldi r24, 0x64 ; 100 + 1bf0: 08 95 ret + +00001bf2 : + return COMMAND_ERR_INVALID_PARAM_ID; +} + +CommandStatusIdType CommandExecUpload(char* OutMessage) +{ + XModemReceive(MemoryUploadBlock); + 1bf2: 8f e3 ldi r24, 0x3F ; 63 + 1bf4: 98 e0 ldi r25, 0x08 ; 8 + 1bf6: ec d0 rcall .+472 ; 0x1dd0 + return COMMAND_INFO_XMODEM_WAIT_ID; +} + 1bf8: 8e e6 ldi r24, 0x6E ; 110 + 1bfa: 08 95 ret + +00001bfc : + +CommandStatusIdType CommandExecDownload(char* OutMessage) +{ + XModemSend(MemoryDownloadBlock); + 1bfc: 88 e0 ldi r24, 0x08 ; 8 + 1bfe: 9a e0 ldi r25, 0x0A ; 10 + 1c00: ff d0 rcall .+510 ; 0x1e00 + return COMMAND_INFO_XMODEM_WAIT_ID; +} + 1c02: 8e e6 ldi r24, 0x6E ; 110 + 1c04: 08 95 ret + +00001c06 : + * 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; + 1c06: e0 ec ldi r30, 0xC0 ; 192 + 1c08: f4 e0 ldi r31, 0x04 ; 4 + 1c0a: 81 81 ldd r24, Z+1 ; 0x01 + 1c0c: 8e 7f andi r24, 0xFE ; 254 + 1c0e: 81 83 std Z+1, r24 ; 0x01 + +CommandStatusIdType CommandExecReset(char* OutMessage) +{ + USB_Detach(); + USB_Disable(); + 1c10: 0e 94 93 20 call 0x4126 ; 0x4126 + + SystemReset(); + 1c14: 0e 94 4f 04 call 0x89e ; 0x89e + + return COMMAND_INFO_OK_ID; +} + 1c18: 84 e6 ldi r24, 0x64 ; 100 + 1c1a: 08 95 ret + +00001c1c : + 1c1c: e0 ec ldi r30, 0xC0 ; 192 + 1c1e: f4 e0 ldi r31, 0x04 ; 4 + 1c20: 81 81 ldd r24, Z+1 ; 0x01 + 1c22: 8e 7f andi r24, 0xFE ; 254 + 1c24: 81 83 std Z+1, r24 ; 0x01 + +#ifdef SUPPORT_FIRMWARE_UPGRADE +CommandStatusIdType CommandExecUpgrade(char* OutMessage) +{ + USB_Detach(); + USB_Disable(); + 1c26: 0e 94 93 20 call 0x4126 ; 0x4126 + + SystemEnterBootloader(); + 1c2a: 0e 94 56 04 call 0x8ac ; 0x8ac + + return COMMAND_INFO_OK_ID; +} + 1c2e: 84 e6 ldi r24, 0x64 ; 100 + 1c30: 08 95 ret + +00001c32 : +#endif + +CommandStatusIdType CommandGetMemSize(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.MemorySize); + 1c32: e9 ef ldi r30, 0xF9 ; 249 + 1c34: f4 e2 ldi r31, 0x24 ; 36 + 1c36: 21 81 ldd r18, Z+1 ; 0x01 + 1c38: 2f 93 push r18 + 1c3a: 20 81 ld r18, Z + 1c3c: 2f 93 push r18 + 1c3e: 21 e7 ldi r18, 0x71 ; 113 + 1c40: 34 e0 ldi r19, 0x04 ; 4 + 1c42: 3f 93 push r19 + 1c44: 2f 93 push r18 + 1c46: 21 e0 ldi r18, 0x01 ; 1 + 1c48: 2f 93 push r18 + 1c4a: 1f 92 push r1 + 1c4c: 9f 93 push r25 + 1c4e: 8f 93 push r24 + 1c50: 0e 94 0f 24 call 0x481e ; 0x481e + + return COMMAND_INFO_OK_WITH_TEXT_ID; + 1c54: 8d b7 in r24, 0x3d ; 61 + 1c56: 9e b7 in r25, 0x3e ; 62 + 1c58: 08 96 adiw r24, 0x08 ; 8 + 1c5a: 8d bf out 0x3d, r24 ; 61 + 1c5c: 9e bf out 0x3e, r25 ; 62 +} + 1c5e: 85 e6 ldi r24, 0x65 ; 101 + 1c60: 08 95 ret + +00001c62 : + +CommandStatusIdType CommandGetUidSize(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.UidSize); + 1c62: 20 91 fb 24 lds r18, 0x24FB + 1c66: 1f 92 push r1 + 1c68: 2f 93 push r18 + 1c6a: 2e e6 ldi r18, 0x6E ; 110 + 1c6c: 34 e0 ldi r19, 0x04 ; 4 + 1c6e: 3f 93 push r19 + 1c70: 2f 93 push r18 + 1c72: 21 e0 ldi r18, 0x01 ; 1 + 1c74: 2f 93 push r18 + 1c76: 1f 92 push r1 + 1c78: 9f 93 push r25 + 1c7a: 8f 93 push r24 + 1c7c: 0e 94 0f 24 call 0x481e ; 0x481e + + return COMMAND_INFO_OK_WITH_TEXT_ID; + 1c80: 8d b7 in r24, 0x3d ; 61 + 1c82: 9e b7 in r25, 0x3e ; 62 + 1c84: 08 96 adiw r24, 0x08 ; 8 + 1c86: 8d bf out 0x3d, r24 ; 61 + 1c88: 9e bf out 0x3e, r25 ; 62 +} + 1c8a: 85 e6 ldi r24, 0x65 ; 101 + 1c8c: 08 95 ret + +00001c8e : + +CommandStatusIdType CommandExecButton(char* OutMessage) +{ + ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); + 1c8e: 60 e0 ldi r22, 0x00 ; 0 + 1c90: 71 e0 ldi r23, 0x01 ; 1 + 1c92: df dc rcall .-1602 ; 0x1652 + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1c94: 85 e6 ldi r24, 0x65 ; 101 + 1c96: 08 95 ret + +00001c98 : + +CommandStatusIdType CommandGetButton(char* OutParam) +{ + ButtonGetActionByName(OutParam, TERMINAL_BUFFER_SIZE); + 1c98: 60 e0 ldi r22, 0x00 ; 0 + 1c9a: 71 e0 ldi r23, 0x01 ; 1 + 1c9c: 13 dd rcall .-1498 ; 0x16c4 + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1c9e: 85 e6 ldi r24, 0x65 ; 101 + 1ca0: 08 95 ret + +00001ca2 : + +CommandStatusIdType CommandSetButton(const char* InParam) +{ + if (ButtonSetActionByName(InParam)) { + 1ca2: 1e dd rcall .-1476 ; 0x16e0 + 1ca4: 81 11 cpse r24, r1 + 1ca6: 02 c0 rjmp .+4 ; 0x1cac + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + 1ca8: 8a ec ldi r24, 0xCA ; 202 + } +} + 1caa: 08 95 ret +} + +CommandStatusIdType CommandSetButton(const char* InParam) +{ + if (ButtonSetActionByName(InParam)) { + SettingsSave(); + 1cac: 81 dd rcall .-1278 ; 0x17b0 + return COMMAND_INFO_OK_ID; + 1cae: 84 e6 ldi r24, 0x64 ; 100 + 1cb0: 08 95 ret + +00001cb2 : + } +} + +CommandStatusIdType CommandGetSetting(char* OutParam) +{ + SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); + 1cb2: 60 e0 ldi r22, 0x00 ; 0 + 1cb4: 71 e0 ldi r23, 0x01 ; 1 + 1cb6: 0f de rcall .-994 ; 0x18d6 + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1cb8: 85 e6 ldi r24, 0x65 ; 101 + 1cba: 08 95 ret + +00001cbc : + +CommandStatusIdType CommandSetSetting(const char* InParam) +{ + if (SettingsSetActiveByName(InParam)) { + 1cbc: 13 de rcall .-986 ; 0x18e4 + 1cbe: 81 11 cpse r24, r1 + 1cc0: 02 c0 rjmp .+4 ; 0x1cc6 + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + 1cc2: 8a ec ldi r24, 0xCA ; 202 + } +} + 1cc4: 08 95 ret +} + +CommandStatusIdType CommandSetSetting(const char* InParam) +{ + if (SettingsSetActiveByName(InParam)) { + SettingsSave(); + 1cc6: 74 dd rcall .-1304 ; 0x17b0 + return COMMAND_INFO_OK_ID; + 1cc8: 84 e6 ldi r24, 0x64 ; 100 + 1cca: 08 95 ret + +00001ccc : + } +} + +CommandStatusIdType CommandExecClear(char* OutParam) +{ + MemoryClear(); + 1ccc: 0e 94 03 06 call 0xc06 ; 0xc06 + return COMMAND_INFO_OK_ID; +} + 1cd0: 84 e6 ldi r24, 0x64 ; 100 + 1cd2: 08 95 ret + +00001cd4 : + +CommandStatusIdType CommandExecHelp(char* OutMessage) +{ + 1cd4: df 92 push r13 + 1cd6: ef 92 push r14 + 1cd8: ff 92 push r15 + 1cda: 0f 93 push r16 + 1cdc: 1f 93 push r17 + 1cde: cf 93 push r28 + 1ce0: df 93 push r29 + 1ce2: 7c 01 movw r14, r24 + const CommandEntryType* EntryPtr = CommandTable; + uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ + 1ce4: cf ef ldi r28, 0xFF ; 255 + 1ce6: d0 e0 ldi r29, 0x00 ; 0 + return COMMAND_INFO_OK_ID; +} + +CommandStatusIdType CommandExecHelp(char* OutMessage) +{ + const CommandEntryType* EntryPtr = CommandTable; + 1ce8: 07 e9 ldi r16, 0x97 ; 151 + 1cea: 15 e0 ldi r17, 0x05 ; 5 + *OutMessage++ = c; + CommandName++; + ByteCount--; + } + + *OutMessage++ = ','; + 1cec: 8c e2 ldi r24, 0x2C ; 44 + 1cee: 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) { + 1cf0: b8 01 movw r22, r16 + 1cf2: 80 e9 ldi r24, 0x90 ; 144 + 1cf4: 90 e2 ldi r25, 0x20 ; 32 + 1cf6: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1cfa: 89 2b or r24, r25 + 1cfc: 39 f1 breq .+78 ; 0x1d4c + const char* CommandName = EntryPtr->Command; + char c; + + while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { + 1cfe: f8 01 movw r30, r16 + 1d00: 44 91 lpm r20, Z + 1d02: 44 23 and r20, r20 + 1d04: 79 f1 breq .+94 ; 0x1d64 + 1d06: c1 32 cpi r28, 0x21 ; 33 + 1d08: d1 05 cpc r29, r1 + 1d0a: 60 f1 brcs .+88 ; 0x1d64 + 1d0c: d7 01 movw r26, r14 + 1d0e: f8 01 movw r30, r16 + 1d10: 04 c0 rjmp .+8 ; 0x1d1a + 1d12: c0 32 cpi r28, 0x20 ; 32 + 1d14: d1 05 cpc r29, r1 + 1d16: 51 f0 breq .+20 ; 0x1d2c + 1d18: dc 01 movw r26, r24 + 1d1a: cd 01 movw r24, r26 + 1d1c: 01 96 adiw r24, 0x01 ; 1 + 1d1e: 9c 01 movw r18, r24 + *OutMessage++ = c; + 1d20: 4c 93 st X, r20 + CommandName++; + 1d22: 31 96 adiw r30, 0x01 ; 1 + ByteCount--; + 1d24: 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) { + 1d26: 44 91 lpm r20, Z + 1d28: 41 11 cpse r20, r1 + 1d2a: f3 cf rjmp .-26 ; 0x1d12 + *OutMessage++ = c; + CommandName++; + ByteCount--; + } + + *OutMessage++ = ','; + 1d2c: 79 01 movw r14, r18 + 1d2e: 8f ef ldi r24, 0xFF ; 255 + 1d30: e8 1a sub r14, r24 + 1d32: f8 0a sbc r15, r24 + 1d34: f9 01 movw r30, r18 + 1d36: d0 82 st Z, r13 + ByteCount--; + 1d38: 21 97 sbiw r28, 0x01 ; 1 + + EntryPtr++; + 1d3a: 0a 5e subi r16, 0xEA ; 234 + 1d3c: 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) { + 1d3e: b8 01 movw r22, r16 + 1d40: 80 e9 ldi r24, 0x90 ; 144 + 1d42: 90 e2 ldi r25, 0x20 ; 32 + 1d44: 0e 94 ee 23 call 0x47dc ; 0x47dc + 1d48: 89 2b or r24, r25 + 1d4a: c9 f6 brne .-78 ; 0x1cfe + ByteCount--; + + EntryPtr++; + } + + *--OutMessage = '\0'; + 1d4c: d7 01 movw r26, r14 + 1d4e: 11 97 sbiw r26, 0x01 ; 1 + 1d50: 1c 92 st X, r1 + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + 1d52: 85 e6 ldi r24, 0x65 ; 101 + 1d54: df 91 pop r29 + 1d56: cf 91 pop r28 + 1d58: 1f 91 pop r17 + 1d5a: 0f 91 pop r16 + 1d5c: ff 90 pop r15 + 1d5e: ef 90 pop r14 + 1d60: df 90 pop r13 + 1d62: 08 95 ret + + 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) { + 1d64: 97 01 movw r18, r14 + 1d66: e2 cf rjmp .-60 ; 0x1d2c + +00001d68 : + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + +CommandStatusIdType CommandGetRssi(char* OutParam) +{ + 1d68: fc 01 movw r30, r24 +} + +static inline +uint16_t AntennaLevelGet(void) +{ + ADCA.CH0.CTRL |= ADC_CH_START_bm; + 1d6a: 20 91 20 02 lds r18, 0x0220 + 1d6e: 20 68 ori r18, 0x80 ; 128 + 1d70: 20 93 20 02 sts 0x0220, r18 + while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); + 1d74: 20 91 23 02 lds r18, 0x0223 + 1d78: 20 ff sbrs r18, 0 + 1d7a: fc cf rjmp .-8 ; 0x1d74 + + ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; + 1d7c: 81 e0 ldi r24, 0x01 ; 1 + 1d7e: 80 93 23 02 sts 0x0223, r24 + + int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; + 1d82: a0 91 10 02 lds r26, 0x0210 + 1d86: b0 91 11 02 lds r27, 0x0211 + 1d8a: ae 5b subi r26, 0xBE ; 190 + 1d8c: b1 09 sbc r27, r1 + 1d8e: b7 fd sbrc r27, 7 + 1d90: 1c c0 rjmp .+56 ; 0x1dca + if (Result < 0) Result = 0; + + return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); + 1d92: 29 e6 ldi r18, 0x69 ; 105 + 1d94: 37 e5 ldi r19, 0x57 ; 87 + 1d96: 4b e0 ldi r20, 0x0B ; 11 + 1d98: 50 e0 ldi r21, 0x00 ; 0 + 1d9a: 0e 94 6f 23 call 0x46de ; 0x46de <__mulshisi3> + 1d9e: aa 27 eor r26, r26 + 1da0: bb 27 eor r27, r27 + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, + 1da2: 9f 93 push r25 + 1da4: 8f 93 push r24 + 1da6: 27 e6 ldi r18, 0x67 ; 103 + 1da8: 34 e0 ldi r19, 0x04 ; 4 + 1daa: 3f 93 push r19 + 1dac: 2f 93 push r18 + 1dae: 81 e0 ldi r24, 0x01 ; 1 + 1db0: 8f 93 push r24 + 1db2: 1f 92 push r1 + 1db4: ff 93 push r31 + 1db6: ef 93 push r30 + 1db8: 0e 94 0f 24 call 0x481e ; 0x481e + PSTR("%5u mV"), AntennaLevelGet()); + + + return COMMAND_INFO_OK_WITH_TEXT_ID; + 1dbc: 8d b7 in r24, 0x3d ; 61 + 1dbe: 9e b7 in r25, 0x3e ; 62 + 1dc0: 08 96 adiw r24, 0x08 ; 8 + 1dc2: 8d bf out 0x3d, r24 ; 61 + 1dc4: 9e bf out 0x3e, r25 ; 62 +} + 1dc6: 85 e6 ldi r24, 0x65 ; 101 + 1dc8: 08 95 ret + 1dca: a0 e0 ldi r26, 0x00 ; 0 + 1dcc: b0 e0 ldi r27, 0x00 ; 0 + 1dce: e1 cf rjmp .-62 ; 0x1d92 + +00001dd0 : + return Checksum; +} + +void XModemReceive(XModemCallbackType TheCallbackFunc) +{ + State = STATE_RECEIVE_INIT; + 1dd0: 21 e0 ldi r18, 0x01 ; 1 + 1dd2: 20 93 a2 24 sts 0x24A2, r18 + CurrentFrameNumber = FIRST_FRAME_NUMBER; + 1dd6: 20 93 a1 24 sts 0x24A1, r18 + RetryCount = RECV_INIT_COUNT; + 1dda: 24 e1 ldi r18, 0x14 ; 20 + 1ddc: 20 93 9e 24 sts 0x249E, r18 + RetryTimeout = RECV_INIT_TIMEOUT; + 1de0: 25 e0 ldi r18, 0x05 ; 5 + 1de2: 20 93 9d 24 sts 0x249D, r18 + BlockAddress = 0; + 1de6: 10 92 97 24 sts 0x2497, r1 + 1dea: 10 92 98 24 sts 0x2498, r1 + 1dee: 10 92 99 24 sts 0x2499, r1 + 1df2: 10 92 9a 24 sts 0x249A, r1 + + CallbackFunc = TheCallbackFunc; + 1df6: 80 93 95 24 sts 0x2495, r24 + 1dfa: 90 93 96 24 sts 0x2496, r25 + 1dfe: 08 95 ret + +00001e00 : +} + +void XModemSend(XModemCallbackType TheCallbackFunc) +{ + State = STATE_SEND_INIT; + 1e00: 27 e0 ldi r18, 0x07 ; 7 + 1e02: 20 93 a2 24 sts 0x24A2, r18 + RetryTimeout = SEND_INIT_TIMEOUT; + 1e06: 24 e6 ldi r18, 0x64 ; 100 + 1e08: 20 93 9d 24 sts 0x249D, r18 + BlockAddress = 0; + 1e0c: 10 92 97 24 sts 0x2497, r1 + 1e10: 10 92 98 24 sts 0x2498, r1 + 1e14: 10 92 99 24 sts 0x2499, r1 + 1e18: 10 92 9a 24 sts 0x249A, r1 + + CallbackFunc = TheCallbackFunc; + 1e1c: 80 93 95 24 sts 0x2495, r24 + 1e20: 90 93 96 24 sts 0x2496, r25 + 1e24: 08 95 ret + +00001e26 : +} + +bool XModemProcessByte(uint8_t Byte) +{ + 1e26: cf 93 push r28 + switch(State) { + 1e28: 40 91 a2 24 lds r20, 0x24A2 + 1e2c: 50 e0 ldi r21, 0x00 ; 0 + 1e2e: fa 01 movw r30, r20 + 1e30: 31 97 sbiw r30, 0x01 ; 1 + 1e32: e9 30 cpi r30, 0x09 ; 9 + 1e34: f1 05 cpc r31, r1 + 1e36: 20 f0 brcs .+8 ; 0x1e40 + /* Receive Ack */ + State = STATE_OFF; + break; + + default: + return false; + 1e38: c0 e0 ldi r28, 0x00 ; 0 + break; + } + + return true; +} + 1e3a: 8c 2f mov r24, r28 + 1e3c: cf 91 pop r28 + 1e3e: 08 95 ret + CallbackFunc = TheCallbackFunc; +} + +bool XModemProcessByte(uint8_t Byte) +{ + switch(State) { + 1e40: e2 50 subi r30, 0x02 ; 2 + 1e42: ff 4f sbci r31, 0xFF ; 255 + 1e44: 0c 94 69 23 jmp 0x46d2 ; 0x46d2 <__tablejump2__> + } + + break; + + case STATE_RECEIVE_PROCESS: + if (ReceivedFrameNumber == CurrentFrameNumber) { + 1e48: 20 91 a0 24 lds r18, 0x24A0 + 1e4c: 90 91 a1 24 lds r25, 0x24A1 + 1e50: 29 17 cp r18, r25 + 1e52: 09 f4 brne .+2 ; 0x1e56 + 1e54: dd c0 rjmp .+442 ; 0x2010 + } else { + /* Data seems to be damaged */ + TerminalSendByte(BYTE_NAK); + State = STATE_RECEIVE_WAIT; + } + } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { + 1e56: 30 e0 ldi r19, 0x00 ; 0 + 1e58: 89 2f mov r24, r25 + 1e5a: 90 e0 ldi r25, 0x00 ; 0 + 1e5c: 01 97 sbiw r24, 0x01 ; 1 + 1e5e: 28 17 cp r18, r24 + 1e60: 39 07 cpc r19, r25 + 1e62: 09 f4 brne .+2 ; 0x1e66 + 1e64: 20 c1 rjmp .+576 ; 0x20a6 +INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } + 1e66: 68 e1 ldi r22, 0x18 ; 24 + 1e68: 81 e0 ldi r24, 0x01 ; 1 + 1e6a: 90 e2 ldi r25, 0x20 ; 32 + 1e6c: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendByte(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + } else { + /* This frame is completely out of order. Just cancel */ + TerminalSendByte(BYTE_CAN); + State = STATE_OFF; + 1e70: 10 92 a2 24 sts 0x24A2, r1 + default: + return false; + break; + } + + return true; + 1e74: c1 e0 ldi r28, 0x01 ; 1 +} + 1e76: 8c 2f mov r24, r28 + 1e78: cf 91 pop r28 + 1e7a: 08 95 ret + + break; + + case STATE_SEND_INIT: + /* Start sending on NAK */ + if (Byte == BYTE_NAK) { + 1e7c: 85 31 cpi r24, 0x15 ; 21 + 1e7e: 09 f4 brne .+2 ; 0x1e82 + 1e80: 50 c0 rjmp .+160 ; 0x1f22 + } + + /* Fallthrough */ + + case STATE_SEND_WAIT: + if (Byte == BYTE_CAN) { + 1e82: 88 31 cpi r24, 0x18 ; 24 + 1e84: 09 f4 brne .+2 ; 0x1e88 + 1e86: 06 c1 rjmp .+524 ; 0x2094 + /* Cancel */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if (Byte == BYTE_ACK) { + 1e88: 86 30 cpi r24, 0x06 ; 6 + 1e8a: 09 f4 brne .+2 ; 0x1e8e + 1e8c: 29 c1 rjmp .+594 ; 0x20e0 + BlockAddress += XMODEM_BLOCK_SIZE; + } else { + TerminalSendByte(BYTE_EOT); + State = STATE_SEND_EOT; + } + } else if (Byte == BYTE_NAK){ + 1e8e: 85 31 cpi r24, 0x15 ; 21 + 1e90: 09 f4 brne .+2 ; 0x1e94 + 1e92: 98 c0 rjmp .+304 ; 0x1fc4 + default: + return false; + break; + } + + return true; + 1e94: c1 e0 ldi r28, 0x01 ; 1 +} + 1e96: 8c 2f mov r24, r28 + 1e98: cf 91 pop r28 + 1e9a: 08 95 ret + + break; + + case STATE_RECEIVE_FRAMENUM1: + /* Store frame number */ + ReceivedFrameNumber = Byte; + 1e9c: 80 93 a0 24 sts 0x24A0, r24 + State = STATE_RECEIVE_FRAMENUM2; + 1ea0: 84 e0 ldi r24, 0x04 ; 4 + 1ea2: 80 93 a2 24 sts 0x24A2, r24 + default: + return false; + break; + } + + return true; + 1ea6: c1 e0 ldi r28, 0x01 ; 1 +} + 1ea8: 8c 2f mov r24, r28 + 1eaa: cf 91 pop r28 + 1eac: 08 95 ret + ReceivedFrameNumber = Byte; + State = STATE_RECEIVE_FRAMENUM2; + break; + + case STATE_RECEIVE_FRAMENUM2: + if (Byte == (255 - ReceivedFrameNumber)) { + 1eae: 90 e0 ldi r25, 0x00 ; 0 + 1eb0: 40 91 a0 24 lds r20, 0x24A0 + 1eb4: 2f ef ldi r18, 0xFF ; 255 + 1eb6: 30 e0 ldi r19, 0x00 ; 0 + 1eb8: 24 1b sub r18, r20 + 1eba: 31 09 sbc r19, r1 + 1ebc: 82 17 cp r24, r18 + 1ebe: 93 07 cpc r25, r19 + 1ec0: 31 f5 brne .+76 ; 0x1f0e + /* frame-number check passed. */ + State = STATE_RECEIVE_DATA; + 1ec2: 85 e0 ldi r24, 0x05 ; 5 + 1ec4: 80 93 a2 24 sts 0x24A2, r24 + default: + return false; + break; + } + + return true; + 1ec8: c1 e0 ldi r28, 0x01 ; 1 + 1eca: b7 cf rjmp .-146 ; 0x1e3a +bool XModemProcessByte(uint8_t Byte) +{ + switch(State) { + case STATE_RECEIVE_INIT: + case STATE_RECEIVE_WAIT: + if (Byte == BYTE_SOH) { + 1ecc: 81 30 cpi r24, 0x01 ; 1 + 1ece: 09 f4 brne .+2 ; 0x1ed2 + 1ed0: ec c0 rjmp .+472 ; 0x20aa + /* Next frame incoming */ + BufferIdx = 0; + Checksum = CHECKSUM_INIT_VALUE; + State = STATE_RECEIVE_FRAMENUM1; + } else if (Byte == BYTE_EOT) { + 1ed2: 84 30 cpi r24, 0x04 ; 4 + 1ed4: 09 f4 brne .+2 ; 0x1ed8 + 1ed6: de c0 rjmp .+444 ; 0x2094 + /* Transmission finished */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if (Byte == BYTE_CAN) { + 1ed8: 88 31 cpi r24, 0x18 ; 24 + 1eda: 51 f2 breq .-108 ; 0x1e70 + default: + return false; + break; + } + + return true; + 1edc: c1 e0 ldi r28, 0x01 ; 1 + 1ede: db cf rjmp .-74 ; 0x1e96 + + break; + + case STATE_RECEIVE_DATA: + /* Process byte and update checksum */ + TerminalBuffer[BufferIdx++] = Byte; + 1ee0: 40 91 9b 24 lds r20, 0x249B + 1ee4: 50 91 9c 24 lds r21, 0x249C + 1ee8: 9a 01 movw r18, r20 + 1eea: 2f 5f subi r18, 0xFF ; 255 + 1eec: 3f 4f sbci r19, 0xFF ; 255 + 1eee: 20 93 9b 24 sts 0x249B, r18 + 1ef2: 30 93 9c 24 sts 0x249C, r19 + 1ef6: fa 01 movw r30, r20 + 1ef8: e0 5f subi r30, 0xF0 ; 240 + 1efa: fa 4d sbci r31, 0xDA ; 218 + 1efc: 80 83 st Z, r24 + + if (BufferIdx == XMODEM_BLOCK_SIZE) { + 1efe: 20 38 cpi r18, 0x80 ; 128 + 1f00: 31 05 cpc r19, r1 + 1f02: 41 f6 brne .-112 ; 0x1e94 + /* Block full */ + State = STATE_RECEIVE_PROCESS; + 1f04: 86 e0 ldi r24, 0x06 ; 6 + 1f06: 80 93 a2 24 sts 0x24A2, r24 + default: + return false; + break; + } + + return true; + 1f0a: c1 e0 ldi r28, 0x01 ; 1 + 1f0c: 96 cf rjmp .-212 ; 0x1e3a + 1f0e: 65 e1 ldi r22, 0x15 ; 21 + 1f10: 81 e0 ldi r24, 0x01 ; 1 + 1f12: 90 e2 ldi r25, 0x20 ; 32 + 1f14: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + State = STATE_RECEIVE_WAIT; + } + } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { + /* This is a retransmission */ + TerminalSendByte(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + 1f18: 82 e0 ldi r24, 0x02 ; 2 + 1f1a: 80 93 a2 24 sts 0x24A2, r24 + default: + return false; + break; + } + + return true; + 1f1e: c1 e0 ldi r28, 0x01 ; 1 + 1f20: 8c cf rjmp .-232 ; 0x1e3a + 1f22: 81 e0 ldi r24, 0x01 ; 1 + /* Cancel */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if (Byte == BYTE_ACK) { + /* Acknowledge. Proceed to next frame, get data and calc checksum */ + CurrentFrameNumber++; + 1f24: 80 93 a1 24 sts 0x24A1, r24 + + if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { + 1f28: 40 91 97 24 lds r20, 0x2497 + 1f2c: 50 91 98 24 lds r21, 0x2498 + 1f30: 60 91 99 24 lds r22, 0x2499 + 1f34: 70 91 9a 24 lds r23, 0x249A + 1f38: e0 91 95 24 lds r30, 0x2495 + 1f3c: f0 91 96 24 lds r31, 0x2496 + 1f40: 20 e8 ldi r18, 0x80 ; 128 + 1f42: 30 e0 ldi r19, 0x00 ; 0 + 1f44: 80 e1 ldi r24, 0x10 ; 16 + 1f46: 95 e2 ldi r25, 0x25 ; 37 + 1f48: 09 95 icall + 1f4a: c8 2f mov r28, r24 + 1f4c: 88 23 and r24, r24 + 1f4e: 09 f4 brne .+2 ; 0x1f52 + 1f50: b7 c0 rjmp .+366 ; 0x20c0 + 1f52: 61 e0 ldi r22, 0x01 ; 1 + 1f54: 81 e0 ldi r24, 0x01 ; 1 + 1f56: 90 e2 ldi r25, 0x20 ; 32 + 1f58: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + 1f5c: 60 91 a1 24 lds r22, 0x24A1 + 1f60: 81 e0 ldi r24, 0x01 ; 1 + 1f62: 90 e2 ldi r25, 0x20 ; 32 + 1f64: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + 1f68: 60 91 a1 24 lds r22, 0x24A1 + 1f6c: 60 95 com r22 + 1f6e: 81 e0 ldi r24, 0x01 ; 1 + 1f70: 90 e2 ldi r25, 0x20 ; 32 + 1f72: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + 1f76: 60 e8 ldi r22, 0x80 ; 128 + 1f78: 70 e0 ldi r23, 0x00 ; 0 + 1f7a: 80 e1 ldi r24, 0x10 ; 16 + 1f7c: 95 e2 ldi r25, 0x25 ; 37 + 1f7e: d8 dc rcall .-1616 ; 0x1930 + 1f80: e0 e1 ldi r30, 0x10 ; 16 + 1f82: f5 e2 ldi r31, 0x25 ; 37 +static uint32_t BlockAddress; + +static XModemCallbackType CallbackFunc; + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + 1f84: 60 e0 ldi r22, 0x00 ; 0 + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + Checksum += *DataPtr++; + 1f86: 81 91 ld r24, Z+ + 1f88: 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--) { + 1f8a: 85 e2 ldi r24, 0x25 ; 37 + 1f8c: e0 39 cpi r30, 0x90 ; 144 + 1f8e: f8 07 cpc r31, r24 + 1f90: d1 f7 brne .-12 ; 0x1f86 + 1f92: 81 e0 ldi r24, 0x01 ; 1 + 1f94: 90 e2 ldi r25, 0x20 ; 32 + 1f96: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + + BlockAddress += XMODEM_BLOCK_SIZE; + 1f9a: 40 91 97 24 lds r20, 0x2497 + 1f9e: 50 91 98 24 lds r21, 0x2498 + 1fa2: 60 91 99 24 lds r22, 0x2499 + 1fa6: 70 91 9a 24 lds r23, 0x249A + 1faa: 40 58 subi r20, 0x80 ; 128 + 1fac: 5f 4f sbci r21, 0xFF ; 255 + 1fae: 6f 4f sbci r22, 0xFF ; 255 + 1fb0: 7f 4f sbci r23, 0xFF ; 255 + 1fb2: 40 93 97 24 sts 0x2497, r20 + 1fb6: 50 93 98 24 sts 0x2498, r21 + 1fba: 60 93 99 24 sts 0x2499, r22 + 1fbe: 70 93 9a 24 sts 0x249A, r23 + 1fc2: 3b cf rjmp .-394 ; 0x1e3a + 1fc4: 61 e0 ldi r22, 0x01 ; 1 + 1fc6: 81 e0 ldi r24, 0x01 ; 1 + 1fc8: 90 e2 ldi r25, 0x20 ; 32 + 1fca: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + 1fce: 60 91 a1 24 lds r22, 0x24A1 + 1fd2: 81 e0 ldi r24, 0x01 ; 1 + 1fd4: 90 e2 ldi r25, 0x20 ; 32 + 1fd6: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + } + } else if (Byte == BYTE_NAK){ + /* Resend frame */ + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + 1fda: 60 91 a1 24 lds r22, 0x24A1 + 1fde: 60 95 com r22 + 1fe0: 81 e0 ldi r24, 0x01 ; 1 + 1fe2: 90 e2 ldi r25, 0x20 ; 32 + 1fe4: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + 1fe8: 60 e8 ldi r22, 0x80 ; 128 + 1fea: 70 e0 ldi r23, 0x00 ; 0 + 1fec: 80 e1 ldi r24, 0x10 ; 16 + 1fee: 95 e2 ldi r25, 0x25 ; 37 + 1ff0: 9f dc rcall .-1730 ; 0x1930 + 1ff2: e0 e1 ldi r30, 0x10 ; 16 + 1ff4: f5 e2 ldi r31, 0x25 ; 37 +static uint32_t BlockAddress; + +static XModemCallbackType CallbackFunc; + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + 1ff6: 60 e0 ldi r22, 0x00 ; 0 + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + Checksum += *DataPtr++; + 1ff8: 81 91 ld r24, Z+ + 1ffa: 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--) { + 1ffc: 25 e2 ldi r18, 0x25 ; 37 + 1ffe: e0 39 cpi r30, 0x90 ; 144 + 2000: f2 07 cpc r31, r18 + 2002: d1 f7 brne .-12 ; 0x1ff8 + 2004: 81 e0 ldi r24, 0x01 ; 1 + 2006: 90 e2 ldi r25, 0x20 ; 32 + 2008: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + default: + return false; + break; + } + + return true; + 200c: c1 e0 ldi r28, 0x01 ; 1 + 200e: 43 cf rjmp .-378 ; 0x1e96 + 2010: e0 e1 ldi r30, 0x10 ; 16 + 2012: f5 e2 ldi r31, 0x25 ; 37 + } + + break; + + case STATE_RECEIVE_PROCESS: + if (ReceivedFrameNumber == CurrentFrameNumber) { + 2014: 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++; + 2016: 21 91 ld r18, Z+ + 2018: 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--) { + 201a: 25 e2 ldi r18, 0x25 ; 37 + 201c: e0 39 cpi r30, 0x90 ; 144 + 201e: f2 07 cpc r31, r18 + 2020: d1 f7 brne .-12 ; 0x2016 + + case STATE_RECEIVE_PROCESS: + if (ReceivedFrameNumber == CurrentFrameNumber) { + /* This is the expected frame. Calculate and verify checksum */ + + if (CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE) == Byte) { + 2022: 89 13 cpse r24, r25 + 2024: 74 cf rjmp .-280 ; 0x1f0e + /* Checksum is valid. Pass received data to callback function */ + if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { + 2026: 40 91 97 24 lds r20, 0x2497 + 202a: 50 91 98 24 lds r21, 0x2498 + 202e: 60 91 99 24 lds r22, 0x2499 + 2032: 70 91 9a 24 lds r23, 0x249A + 2036: e0 91 95 24 lds r30, 0x2495 + 203a: f0 91 96 24 lds r31, 0x2496 + 203e: 20 e8 ldi r18, 0x80 ; 128 + 2040: 30 e0 ldi r19, 0x00 ; 0 + 2042: 80 e1 ldi r24, 0x10 ; 16 + 2044: 95 e2 ldi r25, 0x25 ; 37 + 2046: 09 95 icall + 2048: c8 2f mov r28, r24 + 204a: 88 23 and r24, r24 + 204c: 09 f4 brne .+2 ; 0x2050 + 204e: 42 c0 rjmp .+132 ; 0x20d4 + /* Proceed to next frame and send ACK */ + CurrentFrameNumber++; + 2050: 80 91 a1 24 lds r24, 0x24A1 + 2054: 8f 5f subi r24, 0xFF ; 255 + 2056: 80 93 a1 24 sts 0x24A1, r24 + BlockAddress += XMODEM_BLOCK_SIZE; + 205a: 40 91 97 24 lds r20, 0x2497 + 205e: 50 91 98 24 lds r21, 0x2498 + 2062: 60 91 99 24 lds r22, 0x2499 + 2066: 70 91 9a 24 lds r23, 0x249A + 206a: 40 58 subi r20, 0x80 ; 128 + 206c: 5f 4f sbci r21, 0xFF ; 255 + 206e: 6f 4f sbci r22, 0xFF ; 255 + 2070: 7f 4f sbci r23, 0xFF ; 255 + 2072: 40 93 97 24 sts 0x2497, r20 + 2076: 50 93 98 24 sts 0x2498, r21 + 207a: 60 93 99 24 sts 0x2499, r22 + 207e: 70 93 9a 24 sts 0x249A, 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); } + 2082: 66 e0 ldi r22, 0x06 ; 6 + 2084: 81 e0 ldi r24, 0x01 ; 1 + 2086: 90 e2 ldi r25, 0x20 ; 32 + 2088: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendChar(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + 208c: 82 e0 ldi r24, 0x02 ; 2 + 208e: 80 93 a2 24 sts 0x24A2, r24 + 2092: d3 ce rjmp .-602 ; 0x1e3a +INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } + 2094: 66 e0 ldi r22, 0x06 ; 6 + 2096: 81 e0 ldi r24, 0x01 ; 1 + 2098: 90 e2 ldi r25, 0x20 ; 32 + 209a: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + Checksum = CHECKSUM_INIT_VALUE; + State = STATE_RECEIVE_FRAMENUM1; + } else if (Byte == BYTE_EOT) { + /* Transmission finished */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + 209e: 10 92 a2 24 sts 0x24A2, r1 + default: + return false; + break; + } + + return true; + 20a2: c1 e0 ldi r28, 0x01 ; 1 + 20a4: ca ce rjmp .-620 ; 0x1e3a + 20a6: 66 e0 ldi r22, 0x06 ; 6 + 20a8: 33 cf rjmp .-410 ; 0x1f10 + switch(State) { + case STATE_RECEIVE_INIT: + case STATE_RECEIVE_WAIT: + if (Byte == BYTE_SOH) { + /* Next frame incoming */ + BufferIdx = 0; + 20aa: 10 92 9b 24 sts 0x249B, r1 + 20ae: 10 92 9c 24 sts 0x249C, r1 + Checksum = CHECKSUM_INIT_VALUE; + 20b2: 10 92 9f 24 sts 0x249F, r1 + State = STATE_RECEIVE_FRAMENUM1; + 20b6: 83 e0 ldi r24, 0x03 ; 3 + 20b8: 80 93 a2 24 sts 0x24A2, r24 + default: + return false; + break; + } + + return true; + 20bc: c1 e0 ldi r28, 0x01 ; 1 + 20be: bd ce rjmp .-646 ; 0x1e3a + 20c0: 64 e0 ldi r22, 0x04 ; 4 + 20c2: 81 e0 ldi r24, 0x01 ; 1 + 20c4: 90 e2 ldi r25, 0x20 ; 32 + 20c6: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + + BlockAddress += XMODEM_BLOCK_SIZE; + } else { + TerminalSendByte(BYTE_EOT); + State = STATE_SEND_EOT; + 20ca: 89 e0 ldi r24, 0x09 ; 9 + 20cc: 80 93 a2 24 sts 0x24A2, r24 + default: + return false; + break; + } + + return true; + 20d0: c1 e0 ldi r28, 0x01 ; 1 + 20d2: b3 ce rjmp .-666 ; 0x1e3a + 20d4: 68 e1 ldi r22, 0x18 ; 24 + 20d6: 81 e0 ldi r24, 0x01 ; 1 + 20d8: 90 e2 ldi r25, 0x20 ; 32 + 20da: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + 20de: c3 ce rjmp .-634 ; 0x1e66 + 20e0: 80 91 a1 24 lds r24, 0x24A1 + 20e4: 8f 5f subi r24, 0xFF ; 255 + 20e6: 1e cf rjmp .-452 ; 0x1f24 + +000020e8 : +} + +void XModemTick(void) +{ + /* Timeouts go here */ + switch(State) { + 20e8: 80 91 a2 24 lds r24, 0x24A2 + 20ec: 81 30 cpi r24, 0x01 ; 1 + 20ee: 71 f0 breq .+28 ; 0x210c + 20f0: 87 30 cpi r24, 0x07 ; 7 + 20f2: 59 f4 brne .+22 ; 0x210a + RetryTimeout = RECV_INIT_TIMEOUT; + } + break; + + case STATE_SEND_INIT: + if (RetryTimeout-- == 0) { + 20f4: 80 91 9d 24 lds r24, 0x249D + 20f8: 9f ef ldi r25, 0xFF ; 255 + 20fa: 98 0f add r25, r24 + 20fc: 90 93 9d 24 sts 0x249D, r25 + 2100: 81 11 cpse r24, r1 + 2102: 02 c0 rjmp .+4 ; 0x2108 + /* Abort */ + State = STATE_OFF; + 2104: 10 92 a2 24 sts 0x24A2, r1 + 2108: 08 95 ret + 210a: 08 95 ret +void XModemTick(void) +{ + /* Timeouts go here */ + switch(State) { + case STATE_RECEIVE_INIT: + if (RetryTimeout-- == 0) { + 210c: 80 91 9d 24 lds r24, 0x249D + 2110: 9f ef ldi r25, 0xFF ; 255 + 2112: 98 0f add r25, r24 + 2114: 90 93 9d 24 sts 0x249D, r25 + 2118: 81 11 cpse r24, r1 + 211a: f6 cf rjmp .-20 ; 0x2108 + if (RetryCount-- > 0) { + 211c: 80 91 9e 24 lds r24, 0x249E + 2120: 9f ef ldi r25, 0xFF ; 255 + 2122: 98 0f add r25, r24 + 2124: 90 93 9e 24 sts 0x249E, r25 + 2128: 81 11 cpse r24, r1 + 212a: 06 c0 rjmp .+12 ; 0x2138 + /* Put out communication request */ + TerminalSendChar(BYTE_NAK); + } else { + /* Just shut off after some time. */ + State = STATE_OFF; + 212c: 10 92 a2 24 sts 0x24A2, r1 + } + + RetryTimeout = RECV_INIT_TIMEOUT; + 2130: 85 e0 ldi r24, 0x05 ; 5 + 2132: 80 93 9d 24 sts 0x249D, r24 + 2136: 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); } + 2138: 65 e1 ldi r22, 0x15 ; 21 + 213a: 81 e0 ldi r24, 0x01 ; 1 + 213c: 90 e2 ldi r25, 0x20 ; 32 + 213e: 0e 94 e4 21 call 0x43c8 ; 0x43c8 + 2142: f6 cf rjmp .-20 ; 0x2130 + +00002144 : +void CommandLineInit(void) +{ + BufferIdx = 0; +} + +bool CommandLineProcessByte(uint8_t Byte) { + 2144: 1f 93 push r17 + 2146: cf 93 push r28 + 2148: df 93 push r29 + if (IS_CHARACTER(Byte)){ + 214a: 9f eb ldi r25, 0xBF ; 191 + 214c: 98 0f add r25, r24 + 214e: 9a 31 cpi r25, 0x1A ; 26 + 2150: 28 f0 brcs .+10 ; 0x215c + 2152: 9f e9 ldi r25, 0x9F ; 159 + 2154: 98 0f add r25, r24 + 2156: 9a 31 cpi r25, 0x1A ; 26 + 2158: c0 f4 brcc .+48 ; 0x218a + /* Store uppercase character */ + if (IS_LOWERCASE(Byte)) { + Byte = TO_UPPERCASE(Byte); + 215a: 80 52 subi r24, 0x20 ; 32 + } + + /* Prevent buffer overflow and account for '\0' */ + if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { + 215c: 20 91 a3 24 lds r18, 0x24A3 + 2160: 30 91 a4 24 lds r19, 0x24A4 + 2164: 2f 3f cpi r18, 0xFF ; 255 + 2166: 31 05 cpc r19, r1 + 2168: 58 f4 brcc .+22 ; 0x2180 + TerminalBuffer[BufferIdx++] = Byte; + 216a: a9 01 movw r20, r18 + 216c: 4f 5f subi r20, 0xFF ; 255 + 216e: 5f 4f sbci r21, 0xFF ; 255 + 2170: 40 93 a3 24 sts 0x24A3, r20 + 2174: 50 93 a4 24 sts 0x24A4, r21 + 2178: f9 01 movw r30, r18 + 217a: e0 5f subi r30, 0xF0 ; 240 + 217c: fa 4d sbci r31, 0xDA ; 218 + 217e: 80 83 st Z, r24 + } else { + /* Ignore other chars */ + } + + return true; +} + 2180: 81 e0 ldi r24, 0x01 ; 1 + 2182: df 91 pop r29 + 2184: cf 91 pop r28 + 2186: 1f 91 pop r17 + 2188: 08 95 ret +{ + BufferIdx = 0; +} + +bool CommandLineProcessByte(uint8_t Byte) { + if (IS_CHARACTER(Byte)){ + 218a: 90 ed ldi r25, 0xD0 ; 208 + 218c: 98 0f add r25, r24 + 218e: 9a 30 cpi r25, 0x0A ; 10 + 2190: 28 f3 brcs .-54 ; 0x215c + 2192: 8f 35 cpi r24, 0x5F ; 95 + 2194: 19 f3 breq .-58 ; 0x215c + 2196: 98 2f mov r25, r24 + 2198: 9d 7f andi r25, 0xFD ; 253 + 219a: 9d 33 cpi r25, 0x3D ; 61 + 219c: f9 f2 breq .-66 ; 0x215c + + /* Prevent buffer overflow and account for '\0' */ + if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { + TerminalBuffer[BufferIdx++] = Byte; + } + }else if (Byte == '\r') { + 219e: 8d 30 cpi r24, 0x0D ; 13 + 21a0: a9 f0 breq .+42 ; 0x21cc + /* Process on \r. Terminate string and decode. */ + TerminalBuffer[BufferIdx] = '\0'; + BufferIdx = 0; + + DecodeCommand(); + }else if (Byte == '\b') { + 21a2: 88 30 cpi r24, 0x08 ; 8 + 21a4: 39 f0 breq .+14 ; 0x21b4 + /* Backspace. Delete last character in buffer. */ + if (BufferIdx > 0) { + BufferIdx--; + } + } else if (Byte == 0x1B){ + 21a6: 8b 31 cpi r24, 0x1B ; 27 + 21a8: 59 f7 brne .-42 ; 0x2180 + /* Drop buffer on escape */ + BufferIdx = 0; + 21aa: 10 92 a3 24 sts 0x24A3, r1 + 21ae: 10 92 a4 24 sts 0x24A4, r1 + 21b2: e6 cf rjmp .-52 ; 0x2180 + BufferIdx = 0; + + DecodeCommand(); + }else if (Byte == '\b') { + /* Backspace. Delete last character in buffer. */ + if (BufferIdx > 0) { + 21b4: 80 91 a3 24 lds r24, 0x24A3 + 21b8: 90 91 a4 24 lds r25, 0x24A4 + 21bc: 00 97 sbiw r24, 0x00 ; 0 + 21be: 01 f3 breq .-64 ; 0x2180 + BufferIdx--; + 21c0: 01 97 sbiw r24, 0x01 ; 1 + 21c2: 80 93 a3 24 sts 0x24A3, r24 + 21c6: 90 93 a4 24 sts 0x24A4, r25 + 21ca: da cf rjmp .-76 ; 0x2180 + if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { + TerminalBuffer[BufferIdx++] = Byte; + } + }else if (Byte == '\r') { + /* Process on \r. Terminate string and decode. */ + TerminalBuffer[BufferIdx] = '\0'; + 21cc: e0 91 a3 24 lds r30, 0x24A3 + 21d0: f0 91 a4 24 lds r31, 0x24A4 + 21d4: e0 5f subi r30, 0xF0 ; 240 + 21d6: fa 4d sbci r31, 0xDA ; 218 + 21d8: 10 82 st Z, r1 + BufferIdx = 0; + 21da: 10 92 a3 24 sts 0x24A3, r1 + 21de: 10 92 a4 24 sts 0x24A4, 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])) { + 21e2: 80 91 10 25 lds r24, 0x2510 + 21e6: 88 23 and r24, r24 + 21e8: 09 f4 brne .+2 ; 0x21ec + 21ea: a0 c0 rjmp .+320 ; 0x232c + 21ec: 8d 7f andi r24, 0xFD ; 253 + 21ee: 8d 33 cpi r24, 0x3D ; 61 + 21f0: 09 f4 brne .+2 ; 0x21f4 + 21f2: 9c c0 rjmp .+312 ; 0x232c + 21f4: e1 e1 ldi r30, 0x11 ; 17 + 21f6: f5 e2 ldi r31, 0x25 ; 37 + 21f8: 04 c0 rjmp .+8 ; 0x2202 + char* pCommandDelimiter = pTerminalBuffer; + char CommandDelimiter = '\0'; + + /* Search for command delimiter, store it and replace with '\0' */ + while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) + 21fa: 1f 33 cpi r17, 0x3F ; 63 + 21fc: 31 f0 breq .+12 ; 0x220a + 21fe: 1d 33 cpi r17, 0x3D ; 61 + 2200: 21 f0 breq .+8 ; 0x220a + pCommandDelimiter++; + 2202: ef 01 movw r28, r30 + if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { + char* pCommandDelimiter = pTerminalBuffer; + char CommandDelimiter = '\0'; + + /* Search for command delimiter, store it and replace with '\0' */ + while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) + 2204: 11 91 ld r17, Z+ + 2206: 11 11 cpse r17, r1 + 2208: f8 cf rjmp .-16 ; 0x21fa + pCommandDelimiter++; + + CommandDelimiter = *pCommandDelimiter; + *pCommandDelimiter = '\0'; + 220a: 18 82 st Y, r1 + + /* Search in command table */ + for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { + if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { + 220c: 67 e9 ldi r22, 0x97 ; 151 + 220e: 75 e0 ldi r23, 0x05 ; 5 + 2210: 80 e1 ldi r24, 0x10 ; 16 + 2212: 95 e2 ldi r25, 0x25 ; 37 + 2214: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2218: 89 2b or r24, r25 + 221a: 09 f4 brne .+2 ; 0x221e + 221c: 36 c1 rjmp .+620 ; 0x248a + 221e: 6d ea ldi r22, 0xAD ; 173 + 2220: 75 e0 ldi r23, 0x05 ; 5 + 2222: 80 e1 ldi r24, 0x10 ; 16 + 2224: 95 e2 ldi r25, 0x25 ; 37 + 2226: 0e 94 ee 23 call 0x47dc ; 0x47dc + 222a: 89 2b or r24, r25 + 222c: 09 f4 brne .+2 ; 0x2230 + 222e: 2a c1 rjmp .+596 ; 0x2484 + 2230: 63 ec ldi r22, 0xC3 ; 195 + 2232: 75 e0 ldi r23, 0x05 ; 5 + 2234: 80 e1 ldi r24, 0x10 ; 16 + 2236: 95 e2 ldi r25, 0x25 ; 37 + 2238: 0e 94 ee 23 call 0x47dc ; 0x47dc + 223c: 89 2b or r24, r25 + 223e: 09 f4 brne .+2 ; 0x2242 + 2240: 1e c1 rjmp .+572 ; 0x247e + 2242: 69 ed ldi r22, 0xD9 ; 217 + 2244: 75 e0 ldi r23, 0x05 ; 5 + 2246: 80 e1 ldi r24, 0x10 ; 16 + 2248: 95 e2 ldi r25, 0x25 ; 37 + 224a: 0e 94 ee 23 call 0x47dc ; 0x47dc + 224e: 89 2b or r24, r25 + 2250: 09 f4 brne .+2 ; 0x2254 + 2252: 12 c1 rjmp .+548 ; 0x2478 + 2254: 6f ee ldi r22, 0xEF ; 239 + 2256: 75 e0 ldi r23, 0x05 ; 5 + 2258: 80 e1 ldi r24, 0x10 ; 16 + 225a: 95 e2 ldi r25, 0x25 ; 37 + 225c: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2260: 89 2b or r24, r25 + 2262: 09 f4 brne .+2 ; 0x2266 + 2264: 06 c1 rjmp .+524 ; 0x2472 + 2266: 65 e0 ldi r22, 0x05 ; 5 + 2268: 76 e0 ldi r23, 0x06 ; 6 + 226a: 80 e1 ldi r24, 0x10 ; 16 + 226c: 95 e2 ldi r25, 0x25 ; 37 + 226e: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2272: 89 2b or r24, r25 + 2274: 09 f4 brne .+2 ; 0x2278 + 2276: fa c0 rjmp .+500 ; 0x246c + 2278: 6b e1 ldi r22, 0x1B ; 27 + 227a: 76 e0 ldi r23, 0x06 ; 6 + 227c: 80 e1 ldi r24, 0x10 ; 16 + 227e: 95 e2 ldi r25, 0x25 ; 37 + 2280: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2284: 89 2b or r24, r25 + 2286: 09 f4 brne .+2 ; 0x228a + 2288: ee c0 rjmp .+476 ; 0x2466 + 228a: 61 e3 ldi r22, 0x31 ; 49 + 228c: 76 e0 ldi r23, 0x06 ; 6 + 228e: 80 e1 ldi r24, 0x10 ; 16 + 2290: 95 e2 ldi r25, 0x25 ; 37 + 2292: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2296: 89 2b or r24, r25 + 2298: 09 f4 brne .+2 ; 0x229c + 229a: e2 c0 rjmp .+452 ; 0x2460 + 229c: 67 e4 ldi r22, 0x47 ; 71 + 229e: 76 e0 ldi r23, 0x06 ; 6 + 22a0: 80 e1 ldi r24, 0x10 ; 16 + 22a2: 95 e2 ldi r25, 0x25 ; 37 + 22a4: 0e 94 ee 23 call 0x47dc ; 0x47dc + 22a8: 89 2b or r24, r25 + 22aa: 09 f4 brne .+2 ; 0x22ae + 22ac: d6 c0 rjmp .+428 ; 0x245a + 22ae: 6d e5 ldi r22, 0x5D ; 93 + 22b0: 76 e0 ldi r23, 0x06 ; 6 + 22b2: 80 e1 ldi r24, 0x10 ; 16 + 22b4: 95 e2 ldi r25, 0x25 ; 37 + 22b6: 0e 94 ee 23 call 0x47dc ; 0x47dc + 22ba: 89 2b or r24, r25 + 22bc: 09 f4 brne .+2 ; 0x22c0 + 22be: ca c0 rjmp .+404 ; 0x2454 + 22c0: 63 e7 ldi r22, 0x73 ; 115 + 22c2: 76 e0 ldi r23, 0x06 ; 6 + 22c4: 80 e1 ldi r24, 0x10 ; 16 + 22c6: 95 e2 ldi r25, 0x25 ; 37 + 22c8: 0e 94 ee 23 call 0x47dc ; 0x47dc + 22cc: 89 2b or r24, r25 + 22ce: 09 f4 brne .+2 ; 0x22d2 + 22d0: be c0 rjmp .+380 ; 0x244e + 22d2: 69 e8 ldi r22, 0x89 ; 137 + 22d4: 76 e0 ldi r23, 0x06 ; 6 + 22d6: 80 e1 ldi r24, 0x10 ; 16 + 22d8: 95 e2 ldi r25, 0x25 ; 37 + 22da: 0e 94 ee 23 call 0x47dc ; 0x47dc + 22de: 89 2b or r24, r25 + 22e0: 09 f4 brne .+2 ; 0x22e4 + 22e2: b2 c0 rjmp .+356 ; 0x2448 + 22e4: 6f e9 ldi r22, 0x9F ; 159 + 22e6: 76 e0 ldi r23, 0x06 ; 6 + 22e8: 80 e1 ldi r24, 0x10 ; 16 + 22ea: 95 e2 ldi r25, 0x25 ; 37 + 22ec: 0e 94 ee 23 call 0x47dc ; 0x47dc + 22f0: 89 2b or r24, r25 + 22f2: 09 f4 brne .+2 ; 0x22f6 + 22f4: a6 c0 rjmp .+332 ; 0x2442 + 22f6: 65 eb ldi r22, 0xB5 ; 181 + 22f8: 76 e0 ldi r23, 0x06 ; 6 + 22fa: 80 e1 ldi r24, 0x10 ; 16 + 22fc: 95 e2 ldi r25, 0x25 ; 37 + 22fe: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2302: 89 2b or r24, r25 + 2304: 09 f4 brne .+2 ; 0x2308 + 2306: 9a c0 rjmp .+308 ; 0x243c + 2308: 6b ec ldi r22, 0xCB ; 203 + 230a: 76 e0 ldi r23, 0x06 ; 6 + 230c: 80 e1 ldi r24, 0x10 ; 16 + 230e: 95 e2 ldi r25, 0x25 ; 37 + 2310: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2314: 89 2b or r24, r25 + 2316: 09 f4 brne .+2 ; 0x231a + 2318: 8e c0 rjmp .+284 ; 0x2436 + 231a: 61 ee ldi r22, 0xE1 ; 225 + 231c: 76 e0 ldi r23, 0x06 ; 6 + 231e: 80 e1 ldi r24, 0x10 ; 16 + 2320: 95 e2 ldi r25, 0x25 ; 37 + 2322: 0e 94 ee 23 call 0x47dc ; 0x47dc + 2326: 89 2b or r24, r25 + 2328: 09 f4 brne .+2 ; 0x232c + 232a: 52 c0 rjmp .+164 ; 0x23d0 + +static void DecodeCommand(void) +{ + uint8_t i; + bool CommandFound = false; + CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; + 232c: 88 ec ldi r24, 0xC8 ; 200 +} + +static void DecodeCommand(void) +{ + uint8_t i; + bool CommandFound = false; + 232e: c0 e0 ldi r28, 0x00 ; 0 +static const char* GetStatusMessageP(CommandStatusIdType StatusId) +{ + uint8_t i; + + for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { + if (pgm_read_byte(&StatusTable[i].Id) == StatusId) + 2330: e1 ed ldi r30, 0xD1 ; 209 + 2332: f4 e0 ldi r31, 0x04 ; 4 + 2334: e4 91 lpm r30, Z + 2336: 8e 17 cp r24, r30 + 2338: 09 f4 brne .+2 ; 0x233c + 233a: 30 c0 rjmp .+96 ; 0x239c + 233c: e2 ef ldi r30, 0xF2 ; 242 + 233e: f4 e0 ldi r31, 0x04 ; 4 + 2340: e4 91 lpm r30, Z + 2342: 8e 17 cp r24, r30 + 2344: 09 f4 brne .+2 ; 0x2348 + 2346: 41 c0 rjmp .+130 ; 0x23ca + 2348: e3 e1 ldi r30, 0x13 ; 19 + 234a: f5 e0 ldi r31, 0x05 ; 5 + 234c: e4 91 lpm r30, Z + 234e: 8e 17 cp r24, r30 + 2350: 09 f4 brne .+2 ; 0x2354 + 2352: 38 c0 rjmp .+112 ; 0x23c4 + 2354: e4 e3 ldi r30, 0x34 ; 52 + 2356: f5 e0 ldi r31, 0x05 ; 5 + 2358: e4 91 lpm r30, Z + 235a: 8e 17 cp r24, r30 + 235c: 81 f1 breq .+96 ; 0x23be + 235e: e5 e5 ldi r30, 0x55 ; 85 + 2360: f5 e0 ldi r31, 0x05 ; 5 + 2362: e4 91 lpm r30, Z + 2364: 8e 17 cp r24, r30 + 2366: 41 f1 breq .+80 ; 0x23b8 + 2368: e6 e7 ldi r30, 0x76 ; 118 + 236a: f5 e0 ldi r31, 0x05 ; 5 + 236c: e4 91 lpm r30, Z + 236e: 8e 17 cp r24, r30 + 2370: 01 f1 breq .+64 ; 0x23b2 + return StatusTable[i].Message; + } + + return (void*) 0; + 2372: 80 e0 ldi r24, 0x00 ; 0 + 2374: 90 e0 ldi r25, 0x00 ; 0 + } + } + } + + /* Send command status message */ + TerminalSendStringP(GetStatusMessageP(StatusId)); + 2376: c8 da rcall .-2672 ; 0x1908 + TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); + 2378: 8e ec ldi r24, 0xCE ; 206 + 237a: 94 e0 ldi r25, 0x04 ; 4 + 237c: c5 da rcall .-2678 ; 0x1908 + + if (CommandFound && (pTerminalBuffer[0] != '\0') ) { + 237e: cc 23 and r28, r28 + 2380: 09 f4 brne .+2 ; 0x2384 + 2382: fe ce rjmp .-516 ; 0x2180 + 2384: 80 91 10 25 lds r24, 0x2510 + 2388: 88 23 and r24, r24 + 238a: 09 f4 brne .+2 ; 0x238e + 238c: f9 ce rjmp .-526 ; 0x2180 + /* Send optional answer */ + TerminalSendString(pTerminalBuffer); + 238e: 80 e1 ldi r24, 0x10 ; 16 + 2390: 95 e2 ldi r25, 0x25 ; 37 + 2392: b5 da rcall .-2710 ; 0x18fe + TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); + 2394: 8b ec ldi r24, 0xCB ; 203 + 2396: 94 e0 ldi r25, 0x04 ; 4 + 2398: b7 da rcall .-2706 ; 0x1908 + 239a: f2 ce rjmp .-540 ; 0x2180 +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) + 239c: 20 e0 ldi r18, 0x00 ; 0 + 239e: 30 e0 ldi r19, 0x00 ; 0 + return StatusTable[i].Message; + 23a0: 41 e2 ldi r20, 0x21 ; 33 + 23a2: 42 9f mul r20, r18 + 23a4: c0 01 movw r24, r0 + 23a6: 43 9f mul r20, r19 + 23a8: 90 0d add r25, r0 + 23aa: 11 24 eor r1, r1 + 23ac: 8e 52 subi r24, 0x2E ; 46 + 23ae: 9b 4f sbci r25, 0xFB ; 251 + 23b0: e2 cf rjmp .-60 ; 0x2376 +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) + 23b2: 25 e0 ldi r18, 0x05 ; 5 + 23b4: 30 e0 ldi r19, 0x00 ; 0 + 23b6: f4 cf rjmp .-24 ; 0x23a0 + 23b8: 24 e0 ldi r18, 0x04 ; 4 + 23ba: 30 e0 ldi r19, 0x00 ; 0 + 23bc: f1 cf rjmp .-30 ; 0x23a0 + 23be: 23 e0 ldi r18, 0x03 ; 3 + 23c0: 30 e0 ldi r19, 0x00 ; 0 + 23c2: ee cf rjmp .-36 ; 0x23a0 + 23c4: 22 e0 ldi r18, 0x02 ; 2 + 23c6: 30 e0 ldi r19, 0x00 ; 0 + 23c8: eb cf rjmp .-42 ; 0x23a0 + 23ca: 21 e0 ldi r18, 0x01 ; 1 + 23cc: 30 e0 ldi r19, 0x00 ; 0 + 23ce: e8 cf rjmp .-48 ; 0x23a0 + CommandDelimiter = *pCommandDelimiter; + *pCommandDelimiter = '\0'; + + /* Search in command table */ + for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { + if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { + 23d0: 21 ee ldi r18, 0xE1 ; 225 + 23d2: 36 e0 ldi r19, 0x06 ; 6 + /* Command found. Clear buffer, and call appropriate function */ + char* pParam = ++pCommandDelimiter; + + pTerminalBuffer[0] = '\0'; + 23d4: 10 92 10 25 sts 0x2510, 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) { + 23d8: 1f 33 cpi r17, 0x3F ; 63 + 23da: 19 f1 breq .+70 ; 0x2422 + CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); + if (GetFunc != NO_FUNCTION) { + return GetFunc(pTerminalBuffer); + } + } else if (CommandDelimiter == CHAR_SET_MODE) { + 23dc: 1d 33 cpi r17, 0x3D ; 61 + 23de: 99 f0 breq .+38 ; 0x2406 + CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); + if (SetFunc != NO_FUNCTION) { + return SetFunc(pParam); + } + } else if (CommandDelimiter == CHAR_EXEC_MODE){ + 23e0: 11 23 and r17, r17 + 23e2: 19 f0 breq .+6 ; 0x23ea + } else { + /* This should not happen (TM) */ + } + + /* This delimiter has not been registered with this command */ + return COMMAND_ERR_INVALID_USAGE_ID; + 23e4: 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; + 23e6: c1 e0 ldi r28, 0x01 ; 1 + 23e8: a3 cf rjmp .-186 ; 0x2330 + 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); + 23ea: 20 5f subi r18, 0xF0 ; 240 + 23ec: 3f 4f sbci r19, 0xFF ; 255 + 23ee: f9 01 movw r30, r18 + 23f0: 45 91 lpm r20, Z+ + 23f2: 54 91 lpm r21, Z + if (ExecFunc != NO_FUNCTION) { + 23f4: 41 15 cp r20, r1 + 23f6: 51 05 cpc r21, r1 + 23f8: a9 f3 breq .-22 ; 0x23e4 + return ExecFunc(pTerminalBuffer); + 23fa: 80 e1 ldi r24, 0x10 ; 16 + 23fc: 95 e2 ldi r25, 0x25 ; 37 + 23fe: fa 01 movw r30, r20 + 2400: 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; + 2402: c1 e0 ldi r28, 0x01 ; 1 + 2404: 95 cf rjmp .-214 ; 0x2330 + 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); + 2406: 2e 5e subi r18, 0xEE ; 238 + 2408: 3f 4f sbci r19, 0xFF ; 255 + 240a: f9 01 movw r30, r18 + 240c: 45 91 lpm r20, Z+ + 240e: 54 91 lpm r21, Z + if (SetFunc != NO_FUNCTION) { + 2410: 41 15 cp r20, r1 + 2412: 51 05 cpc r21, r1 + 2414: 39 f3 breq .-50 ; 0x23e4 + return SetFunc(pParam); + 2416: ce 01 movw r24, r28 + 2418: 01 96 adiw r24, 0x01 ; 1 + 241a: fa 01 movw r30, r20 + 241c: 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; + 241e: c1 e0 ldi r28, 0x01 ; 1 + 2420: 87 cf rjmp .-242 ; 0x2330 + 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); + 2422: 2c 5e subi r18, 0xEC ; 236 + 2424: 3f 4f sbci r19, 0xFF ; 255 + 2426: f9 01 movw r30, r18 + 2428: 45 91 lpm r20, Z+ + 242a: 54 91 lpm r21, Z + if (GetFunc != NO_FUNCTION) { + 242c: 41 15 cp r20, r1 + 242e: 51 05 cpc r21, r1 + 2430: 21 f7 brne .-56 ; 0x23fa + } else { + /* This should not happen (TM) */ + } + + /* This delimiter has not been registered with this command */ + return COMMAND_ERR_INVALID_USAGE_ID; + 2432: 89 ec ldi r24, 0xC9 ; 201 + 2434: d8 cf rjmp .-80 ; 0x23e6 + CommandDelimiter = *pCommandDelimiter; + *pCommandDelimiter = '\0'; + + /* Search in command table */ + for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { + if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { + 2436: 2b ec ldi r18, 0xCB ; 203 + 2438: 36 e0 ldi r19, 0x06 ; 6 + 243a: cc cf rjmp .-104 ; 0x23d4 + 243c: 25 eb ldi r18, 0xB5 ; 181 + 243e: 36 e0 ldi r19, 0x06 ; 6 + 2440: c9 cf rjmp .-110 ; 0x23d4 + 2442: 2f e9 ldi r18, 0x9F ; 159 + 2444: 36 e0 ldi r19, 0x06 ; 6 + 2446: c6 cf rjmp .-116 ; 0x23d4 + 2448: 29 e8 ldi r18, 0x89 ; 137 + 244a: 36 e0 ldi r19, 0x06 ; 6 + 244c: c3 cf rjmp .-122 ; 0x23d4 + 244e: 23 e7 ldi r18, 0x73 ; 115 + 2450: 36 e0 ldi r19, 0x06 ; 6 + 2452: c0 cf rjmp .-128 ; 0x23d4 + 2454: 2d e5 ldi r18, 0x5D ; 93 + 2456: 36 e0 ldi r19, 0x06 ; 6 + 2458: bd cf rjmp .-134 ; 0x23d4 + 245a: 27 e4 ldi r18, 0x47 ; 71 + 245c: 36 e0 ldi r19, 0x06 ; 6 + 245e: ba cf rjmp .-140 ; 0x23d4 + 2460: 21 e3 ldi r18, 0x31 ; 49 + 2462: 36 e0 ldi r19, 0x06 ; 6 + 2464: b7 cf rjmp .-146 ; 0x23d4 + 2466: 2b e1 ldi r18, 0x1B ; 27 + 2468: 36 e0 ldi r19, 0x06 ; 6 + 246a: b4 cf rjmp .-152 ; 0x23d4 + 246c: 25 e0 ldi r18, 0x05 ; 5 + 246e: 36 e0 ldi r19, 0x06 ; 6 + 2470: b1 cf rjmp .-158 ; 0x23d4 + 2472: 2f ee ldi r18, 0xEF ; 239 + 2474: 35 e0 ldi r19, 0x05 ; 5 + 2476: ae cf rjmp .-164 ; 0x23d4 + 2478: 29 ed ldi r18, 0xD9 ; 217 + 247a: 35 e0 ldi r19, 0x05 ; 5 + 247c: ab cf rjmp .-170 ; 0x23d4 + 247e: 23 ec ldi r18, 0xC3 ; 195 + 2480: 35 e0 ldi r19, 0x05 ; 5 + 2482: a8 cf rjmp .-176 ; 0x23d4 + 2484: 2d ea ldi r18, 0xAD ; 173 + 2486: 35 e0 ldi r19, 0x05 ; 5 + 2488: a5 cf rjmp .-182 ; 0x23d4 + 248a: 27 e9 ldi r18, 0x97 ; 151 + 248c: 35 e0 ldi r19, 0x05 ; 5 + 248e: a2 cf rjmp .-188 ; 0x23d4 + +00002490 : + + return true; +} + +void CommandLineTick(void) +{ + 2490: 08 95 ret + +00002492 : +INLINE void CodecTask(void) { + ActiveConfiguration.CodecTaskFunc(); +} + +INLINE void CodecSetDemodPower(bool bOnOff) { + CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; + 2492: a0 e2 ldi r26, 0x20 ; 32 + 2494: b6 e0 ldi r27, 0x06 ; 6 + 2496: 82 e0 ldi r24, 0x02 ; 2 + 2498: 11 96 adiw r26, 0x01 ; 1 + 249a: 8c 93 st X, r24 + 249c: 11 97 sbiw r26, 0x01 ; 1 + + if (bOnOff) { + CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; + 249e: 15 96 adiw r26, 0x05 ; 5 + 24a0: 8c 93 st X, r24 + 24a2: 15 97 sbiw r26, 0x05 ; 5 +static void StartDemod(void) { + /* Activate Power for demodulator */ + CodecSetDemodPower(true); + + /* Configure sampling-timer free running and sync to first modulation-pause. */ + CODEC_TIMER_SAMPLING.CNT = 0; + 24a4: e0 e4 ldi r30, 0x40 ; 64 + 24a6: f8 e0 ldi r31, 0x08 ; 8 + 24a8: 10 a2 std Z+32, r1 ; 0x20 + 24aa: 11 a2 std Z+33, r1 ; 0x21 + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; + 24ac: 8d e2 ldi r24, 0x2D ; 45 + 24ae: 91 e0 ldi r25, 0x01 ; 1 + 24b0: 86 a3 std Z+38, r24 ; 0x26 + 24b2: 97 a3 std Z+39, r25 ; 0x27 + CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ + 24b4: 8f ef ldi r24, 0xFF ; 255 + 24b6: 9f ef ldi r25, 0xFF ; 255 + 24b8: 80 a7 std Z+40, r24 ; 0x28 + 24ba: 91 a7 std Z+41, r25 ; 0x29 + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + 24bc: 81 e0 ldi r24, 0x01 ; 1 + 24be: 80 83 st Z, r24 + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; + 24c0: 98 e8 ldi r25, 0x88 ; 136 + 24c2: 93 83 std Z+3, r25 ; 0x03 + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; + 24c4: 93 e0 ldi r25, 0x03 ; 3 + 24c6: 97 83 std Z+7, r25 ; 0x07 + + /* Start looking out for modulation pause via interrupt. */ + CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; + 24c8: 1a 96 adiw r26, 0x0a ; 10 + 24ca: 8c 93 st X, r24 + 24cc: 08 95 ret + +000024ce <__vector_34>: +} + +ISR(CODEC_DEMOD_IN_INT0_VECT) { + 24ce: 1f 92 push r1 + 24d0: 0f 92 push r0 + 24d2: 0f b6 in r0, 0x3f ; 63 + 24d4: 0f 92 push r0 + 24d6: 11 24 eor r1, r1 + 24d8: 8f 93 push r24 + 24da: 9f 93 push r25 + 24dc: ef 93 push r30 + 24de: ff 93 push r31 + /* This is the first edge of the first modulation-pause after StartDemod. + * Now we have time to prepare our timers and variables to start + * demodulating beginning from one bit-width after this edge. */ + CodecBufferPtr = CodecBuffer; + 24e0: 80 e1 ldi r24, 0x10 ; 16 + 24e2: 96 e2 ldi r25, 0x26 ; 38 + 24e4: 80 93 b1 24 sts 0x24B1, r24 + 24e8: 90 93 b2 24 sts 0x24B2, r25 + ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; + 24ec: 80 e9 ldi r24, 0x90 ; 144 + 24ee: 96 e2 ldi r25, 0x26 ; 38 + 24f0: 80 93 af 24 sts 0x24AF, r24 + 24f4: 90 93 b0 24 sts 0x24B0, r25 + DataRegister = 0; + 24f8: 10 92 aa 24 sts 0x24AA, r1 + SampleRegister = 0; + 24fc: 10 92 a9 24 sts 0x24A9, r1 + SamplePosition = 0; + 2500: 10 92 a5 24 sts 0x24A5, r1 + BitCount = 0; + 2504: 10 92 ad 24 sts 0x24AD, r1 + 2508: 10 92 ae 24 sts 0x24AE, r1 + IsParityBit = false; + 250c: 10 92 a8 24 sts 0x24A8, r1 + * XYZBUF mechanism of the xmega to automatically double the sampling rate on the + * next overflow. For this we have to temporarily deactivate the automatical alignment + * in order to catch next overflow event for updating the BUF registers. + * We want to sample the demodulated data stream in the first quarter of the half-bit + * where the pulsed miller encoded is located. */ + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + 2510: e0 e4 ldi r30, 0x40 ; 64 + 2512: f8 e0 ldi r31, 0x08 ; 8 + 2514: 13 82 std Z+3, r1 ; 0x03 + CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ + 2516: 86 e9 ldi r24, 0x96 ; 150 + 2518: 90 e0 ldi r25, 0x00 ; 0 + 251a: 86 ab std Z+54, r24 ; 0x36 + 251c: 97 ab std Z+55, r25 ; 0x37 + CODEC_TIMER_SAMPLING.CCABUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 10 - 1; /* Compensate for DIGFILT and ISR prolog */ + 251e: 8a e1 ldi r24, 0x1A ; 26 + 2520: 90 e0 ldi r25, 0x00 ; 0 + 2522: 80 af std Z+56, r24 ; 0x38 + 2524: 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; + 2526: e0 e4 ldi r30, 0x40 ; 64 + 2528: f9 e0 ldi r31, 0x09 ; 9 + 252a: 10 a2 std Z+32, r1 ; 0x20 + 252c: 11 a2 std Z+33, r1 ; 0x21 + CODEC_TIMER_LOADMOD.PER = 0xFFFF; + 252e: 8f ef ldi r24, 0xFF ; 255 + 2530: 9f ef ldi r25, 0xFF ; 255 + 2532: 86 a3 std Z+38, r24 ; 0x26 + 2534: 97 a3 std Z+39, r25 ; 0x27 + CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; + 2536: 89 e8 ldi r24, 0x89 ; 137 + 2538: 83 83 std Z+3, r24 ; 0x03 + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_EVCH6_gc; + 253a: 8e e0 ldi r24, 0x0E ; 14 + 253c: 80 83 st Z, r24 + + /* Disable this interrupt */ + CODEC_DEMOD_IN_PORT.INT0MASK = 0; + 253e: e0 e2 ldi r30, 0x20 ; 32 + 2540: f6 e0 ldi r31, 0x06 ; 6 + 2542: 12 86 std Z+10, r1 ; 0x0a +} + 2544: ff 91 pop r31 + 2546: ef 91 pop r30 + 2548: 9f 91 pop r25 + 254a: 8f 91 pop r24 + 254c: 0f 90 pop r0 + 254e: 0f be out 0x3f, r0 ; 63 + 2550: 0f 90 pop r0 + 2552: 1f 90 pop r1 + 2554: 18 95 reti + +00002556 <__vector_22>: + +ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { + 2556: 1f 92 push r1 + 2558: 0f 92 push r0 + 255a: 0f b6 in r0, 0x3f ; 63 + 255c: 0f 92 push r0 + 255e: 11 24 eor r1, r1 + 2560: 2f 93 push r18 + 2562: 3f 93 push r19 + 2564: 4f 93 push r20 + 2566: 8f 93 push r24 + 2568: 9f 93 push r25 + 256a: ef 93 push r30 + 256c: 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; + 256e: 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; + 2572: 80 91 a9 24 lds r24, 0x24A9 + 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; + 2576: 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); + 2578: 21 e0 ldi r18, 0x01 ; 1 + 257a: 09 f0 breq .+2 ; 0x257e <__vector_22+0x28> + 257c: 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; + 257e: 88 0f add r24, r24 + NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); + 2580: 82 2b or r24, r18 + SampleRegister = NewSampleRegister; + 2582: 80 93 a9 24 sts 0x24A9, r24 + + if (SamplePosition) { + 2586: 90 91 a5 24 lds r25, 0x24A5 + 258a: 99 23 and r25, r25 + 258c: c1 f1 breq .+112 ; 0x25fe <__vector_22+0xa8> + /* Analyze the sampling register after 2 samples. */ + if ((NewSampleRegister & 0x07) == 0x07) { + 258e: 98 2f mov r25, r24 + 2590: 97 70 andi r25, 0x07 ; 7 + 2592: 97 30 cpi r25, 0x07 ; 7 + 2594: 09 f4 brne .+2 ; 0x2598 <__vector_22+0x42> + 2596: 48 c0 rjmp .+144 ; 0x2628 <__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; + 2598: 98 2f mov r25, r24 + 259a: 9c 70 andi r25, 0x0C ; 12 + uint8_t Bit = 0; + + if (BitSample != (0x0 << 2)) { + 259c: 81 f1 breq .+96 ; 0x25fe <__vector_22+0xa8> + /* We have a valid bit. decode and process it. */ + if (BitSample & (0x1 << 2)) { + 259e: 82 fb bst r24, 2 + 25a0: 88 27 eor r24, r24 + 25a2: 80 f9 bld r24, 0 + 25a4: 91 e0 ldi r25, 0x01 ; 1 + 25a6: 89 27 eor r24, r25 + } else { + /* 10 sequence -> This is a one bit */ + Bit = 1; + } + + LastBit = Bit; + 25a8: 80 93 a7 24 sts 0x24A7, r24 + + if (!IsParityBit) { + 25ac: 90 91 a8 24 lds r25, 0x24A8 + 25b0: 91 11 cpse r25, r1 + 25b2: 7f c0 rjmp .+254 ; 0x26b2 <__vector_22+0x15c> + /* This is a data bit, so shift it into the data register and + * hold a local copy of it. */ + uint8_t NewDataRegister = DataRegister >> 1; + 25b4: 90 91 aa 24 lds r25, 0x24AA + 25b8: 96 95 lsr r25 + NewDataRegister |= (Bit ? 0x80 : 0x00); + 25ba: 88 23 and r24, r24 + 25bc: 09 f4 brne .+2 ; 0x25c0 <__vector_22+0x6a> + 25be: 83 c0 rjmp .+262 ; 0x26c6 <__vector_22+0x170> + 25c0: 20 e8 ldi r18, 0x80 ; 128 + 25c2: 29 2b or r18, r25 + DataRegister = NewDataRegister; + 25c4: 20 93 aa 24 sts 0x24AA, r18 + + /* Update bitcount */ + uint16_t NewBitCount = ++BitCount; + 25c8: 80 91 ad 24 lds r24, 0x24AD + 25cc: 90 91 ae 24 lds r25, 0x24AE + 25d0: 01 96 adiw r24, 0x01 ; 1 + 25d2: 80 93 ad 24 sts 0x24AD, r24 + 25d6: 90 93 ae 24 sts 0x24AE, r25 + if ((NewBitCount & 0x07) == 0) { + 25da: 87 70 andi r24, 0x07 ; 7 + 25dc: 99 27 eor r25, r25 + 25de: 89 2b or r24, r25 + 25e0: 71 f4 brne .+28 ; 0x25fe <__vector_22+0xa8> + /* We have reached a byte boundary! Store the data register. */ + /* TODO: Prevent buffer overflow */ + *CodecBufferPtr++ = NewDataRegister; + 25e2: e0 91 b1 24 lds r30, 0x24B1 + 25e6: f0 91 b2 24 lds r31, 0x24B2 + 25ea: cf 01 movw r24, r30 + 25ec: 01 96 adiw r24, 0x01 ; 1 + 25ee: 80 93 b1 24 sts 0x24B1, r24 + 25f2: 90 93 b2 24 sts 0x24B2, r25 + 25f6: 20 83 st Z, r18 + + /* Store bit for determining FDT at EOC and enable parity + * handling on next bit. */ + IsParityBit = true; + 25f8: 81 e0 ldi r24, 0x01 ; 1 + 25fa: 80 93 a8 24 sts 0x24A8, r24 + } + } else { + /* On odd sample position just sample. */ + } + + SamplePosition = !SamplePosition; + 25fe: 80 91 a5 24 lds r24, 0x24A5 + 2602: 91 e0 ldi r25, 0x01 ; 1 + 2604: 89 27 eor r24, r25 + 2606: 80 93 a5 24 sts 0x24A5, 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; + 260a: 88 e8 ldi r24, 0x88 ; 136 + 260c: 80 93 43 08 sts 0x0843, r24 +} + 2610: ff 91 pop r31 + 2612: ef 91 pop r30 + 2614: 9f 91 pop r25 + 2616: 8f 91 pop r24 + 2618: 4f 91 pop r20 + 261a: 3f 91 pop r19 + 261c: 2f 91 pop r18 + 261e: 0f 90 pop r0 + 2620: 0f be out 0x3f, r0 ; 63 + 2622: 0f 90 pop r0 + 2624: 1f 90 pop r1 + 2626: 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; + 2628: 10 92 40 08 sts 0x0840, r1 + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; + 262c: 80 e1 ldi r24, 0x10 ; 16 + 262e: 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; + 2632: 10 92 43 09 sts 0x0943, r1 + + if (LastBit) { + 2636: 80 91 a7 24 lds r24, 0x24A7 + 263a: 88 23 and r24, r24 + 263c: e9 f1 breq .+122 ; 0x26b8 <__vector_22+0x162> + CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; + 263e: 8c eb ldi r24, 0xBC ; 188 + 2640: 94 e0 ldi r25, 0x04 ; 4 + 2642: 80 93 66 09 sts 0x0966, r24 + 2646: 90 93 67 09 sts 0x0967, r25 + } else { + CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; + } + + LoadModState = LOADMOD_FDT; + 264a: 10 92 a6 24 sts 0x24A6, r1 + + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_OVFIF_bm; + 264e: 81 e0 ldi r24, 0x01 ; 1 + 2650: 80 93 4c 09 sts 0x094C, r24 + CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; + 2654: 83 e0 ldi r24, 0x03 ; 3 + 2656: 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; + 265a: 80 91 ad 24 lds r24, 0x24AD + 265e: 90 91 ae 24 lds r25, 0x24AE + 2662: 87 70 andi r24, 0x07 ; 7 + if (RemainingBits != 0) { + 2664: 11 f1 breq .+68 ; 0x26aa <__vector_22+0x154> + uint8_t NewDataRegister = DataRegister; + 2666: 90 91 aa 24 lds r25, 0x24AA + + while (RemainingBits++ < 8) { + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 266a: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 266c: 22 e0 ldi r18, 0x02 ; 2 + 266e: 28 0f add r18, r24 + 2670: 87 30 cpi r24, 0x07 ; 7 + 2672: b1 f0 breq .+44 ; 0x26a0 <__vector_22+0x14a> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 2674: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 2676: 43 e0 ldi r20, 0x03 ; 3 + 2678: 48 0f add r20, r24 + 267a: 28 30 cpi r18, 0x08 ; 8 + 267c: 88 f4 brcc .+34 ; 0x26a0 <__vector_22+0x14a> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 267e: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 2680: 34 e0 ldi r19, 0x04 ; 4 + 2682: 38 0f add r19, r24 + 2684: 48 30 cpi r20, 0x08 ; 8 + 2686: 60 f4 brcc .+24 ; 0x26a0 <__vector_22+0x14a> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 2688: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 268a: 25 e0 ldi r18, 0x05 ; 5 + 268c: 28 0f add r18, r24 + 268e: 38 30 cpi r19, 0x08 ; 8 + 2690: 38 f4 brcc .+14 ; 0x26a0 <__vector_22+0x14a> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 2692: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 2694: 28 30 cpi r18, 0x08 ; 8 + 2696: 20 f4 brcc .+8 ; 0x26a0 <__vector_22+0x14a> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 2698: 96 95 lsr r25 + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + 269a: 81 30 cpi r24, 0x01 ; 1 + 269c: 09 f4 brne .+2 ; 0x26a0 <__vector_22+0x14a> + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + 269e: 96 95 lsr r25 + } + + /* TODO: Prevent buffer overflow */ + *CodecBufferPtr = NewDataRegister; + 26a0: e0 91 b1 24 lds r30, 0x24B1 + 26a4: f0 91 b2 24 lds r31, 0x24B2 + 26a8: 90 83 st Z, r25 + } + + /* Signal, that we have finished sampling */ + Flags.DemodFinished = 1; + 26aa: 81 e0 ldi r24, 0x01 ; 1 + 26ac: 80 93 b3 24 sts 0x24B3, r24 + 26b0: a6 cf rjmp .-180 ; 0x25fe <__vector_22+0xa8> + + } else { + /* This is a parity bit. Store it */ + /* TODO: Store parity and prevent overflow */ + //*ParityBufferPtr++ = Bit; + IsParityBit = false; + 26b2: 10 92 a8 24 sts 0x24A8, r1 + 26b6: a3 cf rjmp .-186 ; 0x25fe <__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; + 26b8: 8c e7 ldi r24, 0x7C ; 124 + 26ba: 94 e0 ldi r25, 0x04 ; 4 + 26bc: 80 93 66 09 sts 0x0966, r24 + 26c0: 90 93 67 09 sts 0x0967, r25 + 26c4: c2 cf rjmp .-124 ; 0x264a <__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); + 26c6: 20 e0 ldi r18, 0x00 ; 0 + 26c8: 7c cf rjmp .-264 ; 0x25c2 <__vector_22+0x6c> + +000026ca <__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) { + 26ca: 1f 92 push r1 + 26cc: 0f 92 push r0 + 26ce: 0f b6 in r0, 0x3f ; 63 + 26d0: 0f 92 push r0 + 26d2: 11 24 eor r1, r1 + 26d4: 2f 93 push r18 + 26d6: 3f 93 push r19 + 26d8: 8f 93 push r24 + 26da: 9f 93 push r25 + 26dc: af 93 push r26 + 26de: bf 93 push r27 + 26e0: ef 93 push r30 + 26e2: ff 93 push r31 + /* Bit rate timer. Output a half bit on the output. */ + uint8_t Temp8; + uint16_t Temp16; + + switch (LoadModState) { + 26e4: 80 91 a6 24 lds r24, 0x24A6 + 26e8: 90 e0 ldi r25, 0x00 ; 0 + 26ea: 8b 30 cpi r24, 0x0B ; 11 + 26ec: 91 05 cpc r25, r1 + 26ee: 80 f5 brcc .+96 ; 0x2750 <__vector_83+0x86> + 26f0: fc 01 movw r30, r24 + 26f2: e9 5f subi r30, 0xF9 ; 249 + 26f4: fe 4f sbci r31, 0xFE ; 254 + 26f6: 0c 94 69 23 jmp 0x46d2 ; 0x46d2 <__tablejump2__> + + LoadModState = LOADMOD_PARITY1; + break; + + case LOADMOD_PARITY1: + if (*ParityBufferPtr) { + 26fa: e0 91 af 24 lds r30, 0x24AF + 26fe: f0 91 b0 24 lds r31, 0x24B0 + 2702: 80 81 ld r24, Z + 2704: 81 11 cpse r24, r1 + 2706: ac c0 rjmp .+344 ; 0x2860 <__vector_83+0x196> + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 2708: 80 e4 ldi r24, 0x40 ; 64 + 270a: 80 93 45 06 sts 0x0645, r24 + } + + if (BitSent == BitCount) { + 270e: 20 91 ab 24 lds r18, 0x24AB + 2712: 30 91 ac 24 lds r19, 0x24AC + 2716: 80 91 ad 24 lds r24, 0x24AD + 271a: 90 91 ae 24 lds r25, 0x24AE + 271e: 28 17 cp r18, r24 + 2720: 39 07 cpc r19, r25 + 2722: 09 f4 brne .+2 ; 0x2726 <__vector_83+0x5c> + 2724: 6c c0 rjmp .+216 ; 0x27fe <__vector_83+0x134> + /* No data left */ + LoadModState = LOADMOD_STOP_BIT0; + } else { + /* Fetch next data and continue sending bits. */ + ParityBufferPtr++; + 2726: 31 96 adiw r30, 0x01 ; 1 + 2728: e0 93 af 24 sts 0x24AF, r30 + 272c: f0 93 b0 24 sts 0x24B0, r31 + DataRegister = *++CodecBufferPtr; + 2730: e0 91 b1 24 lds r30, 0x24B1 + 2734: f0 91 b2 24 lds r31, 0x24B2 + 2738: cf 01 movw r24, r30 + 273a: 01 96 adiw r24, 0x01 ; 1 + 273c: 80 93 b1 24 sts 0x24B1, r24 + 2740: 90 93 b2 24 sts 0x24B2, r25 + 2744: 81 81 ldd r24, Z+1 ; 0x01 + 2746: 80 93 aa 24 sts 0x24AA, r24 + LoadModState = LOADMOD_DATA0; + 274a: 84 e0 ldi r24, 0x04 ; 4 + 274c: 80 93 a6 24 sts 0x24A6, r24 + break; + + default: + break; + } +} + 2750: ff 91 pop r31 + 2752: ef 91 pop r30 + 2754: bf 91 pop r27 + 2756: af 91 pop r26 + 2758: 9f 91 pop r25 + 275a: 8f 91 pop r24 + 275c: 3f 91 pop r19 + 275e: 2f 91 pop r18 + 2760: 0f 90 pop r0 + 2762: 0f be out 0x3f, r0 ; 63 + 2764: 0f 90 pop r0 + 2766: 1f 90 pop r1 + 2768: 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; + 276a: 8f e3 ldi r24, 0x3F ; 63 + 276c: 90 e0 ldi r25, 0x00 ; 0 + 276e: 80 93 66 09 sts 0x0966, r24 + 2772: 90 93 67 09 sts 0x0967, r25 + CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_EVCH6_gc; + 2776: 8e e0 ldi r24, 0x0E ; 14 + 2778: 80 93 00 08 sts 0x0800, r24 + + /* Fallthrough to first bit */ + + case LOADMOD_START_BIT0: + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 277c: 80 e4 ldi r24, 0x40 ; 64 + 277e: 80 93 45 06 sts 0x0645, r24 + LoadModState = LOADMOD_START_BIT1; + 2782: 83 e0 ldi r24, 0x03 ; 3 + 2784: 80 93 a6 24 sts 0x24A6, r24 + break; + 2788: e3 cf rjmp .-58 ; 0x2750 <__vector_83+0x86> + + case LOADMOD_START_BIT1: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 278a: 80 e4 ldi r24, 0x40 ; 64 + 278c: 80 93 46 06 sts 0x0646, r24 + LoadModState = LOADMOD_DATA0; + 2790: 84 e0 ldi r24, 0x04 ; 4 + 2792: 80 93 a6 24 sts 0x24A6, r24 + + /* Fetch first byte */ + DataRegister = *CodecBufferPtr; + 2796: e0 91 b1 24 lds r30, 0x24B1 + 279a: f0 91 b2 24 lds r31, 0x24B2 + 279e: 80 81 ld r24, Z + 27a0: 80 93 aa 24 sts 0x24AA, r24 + break; + 27a4: d5 cf rjmp .-86 ; 0x2750 <__vector_83+0x86> + + case LOADMOD_DATA0: + if (DataRegister & 1) { + 27a6: 80 91 aa 24 lds r24, 0x24AA + 27aa: 80 fd sbrc r24, 0 + 27ac: 64 c0 rjmp .+200 ; 0x2876 <__vector_83+0x1ac> + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 27ae: 80 e4 ldi r24, 0x40 ; 64 + 27b0: 80 93 46 06 sts 0x0646, r24 + } + + LoadModState = LOADMOD_DATA1; + 27b4: 85 e0 ldi r24, 0x05 ; 5 + 27b6: 80 93 a6 24 sts 0x24A6, r24 + break; + 27ba: ca cf rjmp .-108 ; 0x2750 <__vector_83+0x86> + + case LOADMOD_DATA1: + Temp8 = DataRegister; + 27bc: 80 91 aa 24 lds r24, 0x24AA + + if (Temp8 & 1) { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 27c0: 90 e4 ldi r25, 0x40 ; 64 + break; + + case LOADMOD_DATA1: + Temp8 = DataRegister; + + if (Temp8 & 1) { + 27c2: 80 fd sbrc r24, 0 + 27c4: 55 c0 rjmp .+170 ; 0x2870 <__vector_83+0x1a6> + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 27c6: 90 93 45 06 sts 0x0645, r25 + } + + DataRegister = Temp8 >> 1; + 27ca: 86 95 lsr r24 + 27cc: 80 93 aa 24 sts 0x24AA, r24 + + Temp16 = BitSent; + 27d0: 80 91 ab 24 lds r24, 0x24AB + 27d4: 90 91 ac 24 lds r25, 0x24AC + BitSent = ++Temp16; + 27d8: 01 96 adiw r24, 0x01 ; 1 + 27da: 80 93 ab 24 sts 0x24AB, r24 + 27de: 90 93 ac 24 sts 0x24AC, r25 + + if ((Temp16 & 0x07) == 0) { + 27e2: 9c 01 movw r18, r24 + 27e4: 27 70 andi r18, 0x07 ; 7 + 27e6: 33 27 eor r19, r19 + 27e8: 23 2b or r18, r19 + 27ea: 09 f4 brne .+2 ; 0x27ee <__vector_83+0x124> + 27ec: 48 c0 rjmp .+144 ; 0x287e <__vector_83+0x1b4> + /* Byte boundary. Load parity bit and output it later. */ + LoadModState = LOADMOD_PARITY0; + break; + } + + if (Temp16 == BitCount) { + 27ee: 20 91 ad 24 lds r18, 0x24AD + 27f2: 30 91 ae 24 lds r19, 0x24AE + 27f6: 82 17 cp r24, r18 + 27f8: 93 07 cpc r25, r19 + 27fa: 09 f0 breq .+2 ; 0x27fe <__vector_83+0x134> + 27fc: a6 cf rjmp .-180 ; 0x274a <__vector_83+0x80> + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } + + if (BitSent == BitCount) { + /* No data left */ + LoadModState = LOADMOD_STOP_BIT0; + 27fe: 88 e0 ldi r24, 0x08 ; 8 + 2800: 80 93 a6 24 sts 0x24A6, r24 + 2804: a5 cf rjmp .-182 ; 0x2750 <__vector_83+0x86> + LoadModState = LOADMOD_DATA0; + + break; + + case LOADMOD_PARITY0: + if (*ParityBufferPtr) { + 2806: e0 91 af 24 lds r30, 0x24AF + 280a: f0 91 b0 24 lds r31, 0x24B0 + 280e: 80 81 ld r24, Z + 2810: 81 11 cpse r24, r1 + 2812: 2a c0 rjmp .+84 ; 0x2868 <__vector_83+0x19e> + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 2814: 80 e4 ldi r24, 0x40 ; 64 + 2816: 80 93 46 06 sts 0x0646, r24 + } + + LoadModState = LOADMOD_PARITY1; + 281a: 87 e0 ldi r24, 0x07 ; 7 + 281c: 80 93 a6 24 sts 0x24A6, r24 + break; + 2820: 97 cf rjmp .-210 ; 0x2750 <__vector_83+0x86> + } + + break; + + case LOADMOD_STOP_BIT0: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 2822: 80 e4 ldi r24, 0x40 ; 64 + 2824: 80 93 46 06 sts 0x0646, r24 + LoadModState = LOADMOD_STOP_BIT1; + 2828: 89 e0 ldi r24, 0x09 ; 9 + 282a: 80 93 a6 24 sts 0x24A6, r24 + break; + 282e: 90 cf rjmp .-224 ; 0x2750 <__vector_83+0x86> + + case LOADMOD_STOP_BIT1: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 2830: 80 e4 ldi r24, 0x40 ; 64 + 2832: 80 93 46 06 sts 0x0646, r24 + LoadModState = LOADMOD_FINISHED; + 2836: 8a e0 ldi r24, 0x0A ; 10 + 2838: 80 93 a6 24 sts 0x24A6, r24 + break; + 283c: 89 cf rjmp .-238 ; 0x2750 <__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; + 283e: 10 92 40 09 sts 0x0940, r1 + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + 2842: 10 92 46 09 sts 0x0946, r1 + CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; + 2846: 10 92 00 08 sts 0x0800, r1 + + /* Signal application that we have finished loadmod */ + Flags.LoadmodFinished = 1; + 284a: 81 e0 ldi r24, 0x01 ; 1 + 284c: 80 93 b4 24 sts 0x24B4, r24 + break; + 2850: 7f cf rjmp .-258 ; 0x2750 <__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; + 2852: 8f e7 ldi r24, 0x7F ; 127 + 2854: 90 e0 ldi r25, 0x00 ; 0 + 2856: 80 93 66 09 sts 0x0966, r24 + 285a: 90 93 67 09 sts 0x0967, r25 + break; + 285e: 78 cf rjmp .-272 ; 0x2750 <__vector_83+0x86> + LoadModState = LOADMOD_PARITY1; + break; + + case LOADMOD_PARITY1: + if (*ParityBufferPtr) { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 2860: 80 e4 ldi r24, 0x40 ; 64 + 2862: 80 93 46 06 sts 0x0646, r24 + 2866: 53 cf rjmp .-346 ; 0x270e <__vector_83+0x44> + + break; + + case LOADMOD_PARITY0: + if (*ParityBufferPtr) { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 2868: 80 e4 ldi r24, 0x40 ; 64 + 286a: 80 93 45 06 sts 0x0645, r24 + 286e: d5 cf rjmp .-86 ; 0x281a <__vector_83+0x150> + + case LOADMOD_DATA1: + Temp8 = DataRegister; + + if (Temp8 & 1) { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 2870: 90 93 46 06 sts 0x0646, r25 + 2874: aa cf rjmp .-172 ; 0x27ca <__vector_83+0x100> + DataRegister = *CodecBufferPtr; + break; + + case LOADMOD_DATA0: + if (DataRegister & 1) { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + 2876: 80 e4 ldi r24, 0x40 ; 64 + 2878: 80 93 45 06 sts 0x0645, r24 + 287c: 9b cf rjmp .-202 ; 0x27b4 <__vector_83+0xea> + Temp16 = BitSent; + BitSent = ++Temp16; + + if ((Temp16 & 0x07) == 0) { + /* Byte boundary. Load parity bit and output it later. */ + LoadModState = LOADMOD_PARITY0; + 287e: 86 e0 ldi r24, 0x06 ; 6 + 2880: 80 93 a6 24 sts 0x24A6, r24 + break; + 2884: 65 cf rjmp .-310 ; 0x2750 <__vector_83+0x86> + +00002886 : + default: + break; + } +} + +void ISO14443ACodecInit(void) { + 2886: cf 93 push r28 + 2888: 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; + 288a: e0 e4 ldi r30, 0x40 ; 64 + 288c: f6 e0 ldi r31, 0x06 ; 6 + 288e: 84 e0 ldi r24, 0x04 ; 4 + 2890: 82 83 std Z+2, r24 ; 0x02 + CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc; + 2892: 12 8a std Z+18, r1 ; 0x12 + EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; + 2894: c0 e8 ldi r28, 0x80 ; 128 + 2896: d1 e0 ldi r29, 0x01 ; 1 + 2898: 82 e6 ldi r24, 0x62 ; 98 + 289a: 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; + 289c: a0 e2 ldi r26, 0x20 ; 32 + 289e: b6 e0 ldi r27, 0x06 ; 6 + 28a0: 85 e0 ldi r24, 0x05 ; 5 + 28a2: 12 96 adiw r26, 0x02 ; 2 + 28a4: 8c 93 st X, r24 + 28a6: 12 97 sbiw r26, 0x02 ; 2 + CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; + 28a8: 81 e0 ldi r24, 0x01 ; 1 + 28aa: 50 96 adiw r26, 0x10 ; 16 + 28ac: 8c 93 st X, r24 + 28ae: 50 97 sbiw r26, 0x10 ; 16 + CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; + 28b0: 82 e0 ldi r24, 0x02 ; 2 + 28b2: 52 96 adiw r26, 0x12 ; 18 + 28b4: 8c 93 st X, r24 + 28b6: 52 97 sbiw r26, 0x12 ; 18 + CODEC_DEMOD_IN_PORT.INT0MASK = 0; + 28b8: 1a 96 adiw r26, 0x0a ; 10 + 28ba: 1c 92 st X, r1 + 28bc: 1a 97 sbiw r26, 0x0a ; 10 + CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; + 28be: 83 e0 ldi r24, 0x03 ; 3 + 28c0: 19 96 adiw r26, 0x09 ; 9 + 28c2: 8c 93 st X, r24 + EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; + 28c4: 98 e5 ldi r25, 0x58 ; 88 + 28c6: 98 83 st Y, r25 + EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; + 28c8: 9a e5 ldi r25, 0x5A ; 90 + 28ca: 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; + 28cc: 90 e4 ldi r25, 0x40 ; 64 + 28ce: 91 83 std Z+1, r25 ; 0x01 + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + 28d0: 96 83 std Z+6, r25 ; 0x06 + CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK; + 28d2: 81 83 std Z+1, r24 ; 0x01 + CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK; + 28d4: 86 83 std Z+6, r24 ; 0x06 + + /* Configure subcarrier generation with 50% DC output using OOK */ + CODEC_SUBCARRIER_TIMER.PER = ISO14443A_SUBCARRIER_DIVIDER - 1; + 28d6: e0 e0 ldi r30, 0x00 ; 0 + 28d8: f8 e0 ldi r31, 0x08 ; 8 + 28da: 8f e0 ldi r24, 0x0F ; 15 + 28dc: 90 e0 ldi r25, 0x00 ; 0 + 28de: 86 a3 std Z+38, r24 ; 0x26 + 28e0: 97 a3 std Z+39, r25 ; 0x27 + CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = ISO14443A_SUBCARRIER_DIVIDER/2; + 28e2: 88 e0 ldi r24, 0x08 ; 8 + 28e4: 90 e0 ldi r25, 0x00 ; 0 + 28e6: 82 a7 std Z+42, r24 ; 0x2a + 28e8: 93 a7 std Z+43, r25 ; 0x2b + CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; + 28ea: 83 e2 ldi r24, 0x23 ; 35 + 28ec: 81 83 std Z+1, r24 ; 0x01 +void ISO14443ACodecInit(void) { + /* Initialize common peripherals and start listening + * for incoming data. */ + Initialize(); + StartDemod(); +} + 28ee: df 91 pop r29 + 28f0: cf 91 pop r28 + +void ISO14443ACodecInit(void) { + /* Initialize common peripherals and start listening + * for incoming data. */ + Initialize(); + StartDemod(); + 28f2: cf cd rjmp .-1122 ; 0x2492 + +000028f4 : +} + +void ISO14443ACodecTask(void) { + 28f4: cf 93 push r28 + 28f6: df 93 push r29 + if (Flags.DemodFinished) { + 28f8: 80 91 b3 24 lds r24, 0x24B3 + 28fc: 88 23 and r24, r24 + 28fe: c1 f0 breq .+48 ; 0x2930 + Flags.DemodFinished = 0; + 2900: 10 92 b3 24 sts 0x24B3, r1 +INLINE void CodecTask(void) { + ActiveConfiguration.CodecTaskFunc(); +} + +INLINE void CodecSetDemodPower(bool bOnOff) { + CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; + 2904: 82 e0 ldi r24, 0x02 ; 2 + 2906: 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; + 290a: 80 93 26 06 sts 0x0626, r24 + /* Reception finished. Process the received bytes */ + CodecSetDemodPower(false); + + uint16_t DemodBitCount = BitCount; + 290e: 60 91 ad 24 lds r22, 0x24AD + 2912: 70 91 ae 24 lds r23, 0x24AE + uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; + + if (DemodBitCount > 0) { + 2916: 61 15 cp r22, r1 + 2918: 71 05 cpc r23, r1 + 291a: 89 f4 brne .+34 ; 0x293e +INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { + return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); +} + +INLINE void ApplicationReset(void) { + ActiveConfiguration.ApplicationResetFunc(); + 291c: e0 91 ef 24 lds r30, 0x24EF + 2920: f0 91 f0 24 lds r31, 0x24F0 + 2924: 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; + 2926: 10 92 40 09 sts 0x0940, r1 + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + 292a: 10 92 46 09 sts 0x0946, r1 + + StartDemod(); + 292e: b1 dd rcall .-1182 ; 0x2492 + } + } + + if (Flags.LoadmodFinished) { + 2930: 80 91 b4 24 lds r24, 0x24B4 + 2934: 81 11 cpse r24, r1 + 2936: 2a c0 rjmp .+84 ; 0x298c + Flags.LoadmodFinished = 0; + /* Load modulation has been finished. Stop it and start to listen + * for incoming data again. */ + StartDemod(); + } +} + 2938: df 91 pop r29 + 293a: cf 91 pop r28 + 293c: 08 95 ret +INLINE void ApplicationTask(void) { + ActiveConfiguration.ApplicationTaskFunc(); +} + +INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { + return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); + 293e: e0 91 f3 24 lds r30, 0x24F3 + 2942: f0 91 f4 24 lds r31, 0x24F4 + 2946: 80 e1 ldi r24, 0x10 ; 16 + 2948: 96 e2 ldi r25, 0x26 ; 38 + 294a: 09 95 icall + + if (DemodBitCount > 0) { + /* Call application if we received data */ + AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); + + if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { + 294c: 94 ff sbrs r25, 4 + 294e: 23 c0 rjmp .+70 ; 0x2996 + /* Application has generated it's own parity bits. + * Clear this option bit. */ + AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; + 2950: 9f 7e andi r25, 0xEF ; 239 + } + } else { + ApplicationReset(); + } + + if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { + 2952: 00 97 sbiw r24, 0x00 ; 0 + 2954: 41 f3 breq .-48 ; 0x2926 + BitCount = AnswerBitCount; + 2956: 80 93 ad 24 sts 0x24AD, r24 + 295a: 90 93 ae 24 sts 0x24AE, r25 + BitSent = 0; + 295e: 10 92 ab 24 sts 0x24AB, r1 + 2962: 10 92 ac 24 sts 0x24AC, r1 + CodecBufferPtr = CodecBuffer; + 2966: 80 e1 ldi r24, 0x10 ; 16 + 2968: 96 e2 ldi r25, 0x26 ; 38 + 296a: 80 93 b1 24 sts 0x24B1, r24 + 296e: 90 93 b2 24 sts 0x24B2, r25 + ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; + 2972: 80 e9 ldi r24, 0x90 ; 144 + 2974: 96 e2 ldi r25, 0x26 ; 38 + 2976: 80 93 af 24 sts 0x24AF, r24 + 297a: 90 93 b0 24 sts 0x24B0, r25 + LoadModState = LOADMOD_START; + 297e: 81 e0 ldi r24, 0x01 ; 1 + 2980: 80 93 a6 24 sts 0x24A6, r24 + + StartDemod(); + } + } + + if (Flags.LoadmodFinished) { + 2984: 80 91 b4 24 lds r24, 0x24B4 + 2988: 88 23 and r24, r24 + 298a: b1 f2 breq .-84 ; 0x2938 + Flags.LoadmodFinished = 0; + 298c: 10 92 b4 24 sts 0x24B4, r1 + /* Load modulation has been finished. Stop it and start to listen + * for incoming data again. */ + StartDemod(); + } +} + 2990: df 91 pop r29 + 2992: cf 91 pop r28 + + if (Flags.LoadmodFinished) { + Flags.LoadmodFinished = 0; + /* Load modulation has been finished. Stop it and start to listen + * for incoming data again. */ + StartDemod(); + 2994: 7e cd rjmp .-1284 ; 0x2492 + /* 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++) { + 2996: ac 01 movw r20, r24 + 2998: 56 95 lsr r21 + 299a: 47 95 ror r20 + 299c: 56 95 lsr r21 + 299e: 47 95 ror r20 + 29a0: 56 95 lsr r21 + 29a2: 47 95 ror r20 + 29a4: 41 15 cp r20, r1 + 29a6: 51 05 cpc r21, r1 + 29a8: a1 f2 breq .-88 ; 0x2952 + 29aa: 70 e0 ldi r23, 0x00 ; 0 + 29ac: 20 e0 ldi r18, 0x00 ; 0 + 29ae: 30 e0 ldi r19, 0x00 ; 0 + /* For each whole byte, generate a parity bit. */ + CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = + ODD_PARITY(CodecBuffer[i]); + 29b0: f9 01 movw r30, r18 + 29b2: e0 5f subi r30, 0xF0 ; 240 + 29b4: f9 4d sbci r31, 0xD9 ; 217 + 29b6: 60 81 ld r22, Z + 29b8: 06 2e mov r0, r22 + 29ba: 62 95 swap r22 + 29bc: 60 25 eor r22, r0 + 29be: 06 2e mov r0, r22 + 29c0: 66 95 lsr r22 + 29c2: 66 95 lsr r22 + 29c4: 60 25 eor r22, 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] = + 29c6: e0 58 subi r30, 0x80 ; 128 + 29c8: ff 4f sbci r31, 0xFF ; 255 + ODD_PARITY(CodecBuffer[i]); + 29ca: 6f 5f subi r22, 0xFF ; 255 + 29cc: 66 95 lsr r22 + 29ce: 61 70 andi r22, 0x01 ; 1 + 29d0: c6 2f mov r28, r22 + 29d2: 20 e0 ldi r18, 0x00 ; 0 + 29d4: d2 2f mov r29, r18 + 29d6: 21 e0 ldi r18, 0x01 ; 1 + 29d8: c2 27 eor r28, r18 + 29da: 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++) { + 29dc: 7f 5f subi r23, 0xFF ; 255 + 29de: 27 2f mov r18, r23 + 29e0: 30 e0 ldi r19, 0x00 ; 0 + 29e2: 24 17 cp r18, r20 + 29e4: 35 07 cpc r19, r21 + 29e6: 20 f3 brcs .-56 ; 0x29b0 + 29e8: b6 cf rjmp .-148 ; 0x2956 + +000029ea : + Block[11] = Block[3]; +} + +void MifareClassicAppInit1K(void) +{ + State = STATE_IDLE; + 29ea: 81 e0 ldi r24, 0x01 ; 1 + 29ec: 80 93 d1 24 sts 0x24D1, r24 + CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; + 29f0: 84 e0 ldi r24, 0x04 ; 4 + 29f2: 90 e0 ldi r25, 0x00 ; 0 + 29f4: 80 93 b6 24 sts 0x24B6, r24 + 29f8: 90 93 b7 24 sts 0x24B7, r25 + CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; + 29fc: 88 e0 ldi r24, 0x08 ; 8 + 29fe: 80 93 b5 24 sts 0x24B5, r24 + 2a02: 08 95 ret + +00002a04 : +} + +void MifareClassicAppInit4K(void) +{ + State = STATE_IDLE; + 2a04: 81 e0 ldi r24, 0x01 ; 1 + 2a06: 80 93 d1 24 sts 0x24D1, r24 + CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; + 2a0a: 82 e0 ldi r24, 0x02 ; 2 + 2a0c: 90 e0 ldi r25, 0x00 ; 0 + 2a0e: 80 93 b6 24 sts 0x24B6, r24 + 2a12: 90 93 b7 24 sts 0x24B7, r25 + CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; + 2a16: 88 e1 ldi r24, 0x18 ; 24 + 2a18: 80 93 b5 24 sts 0x24B5, r24 + 2a1c: 08 95 ret + +00002a1e : +} + +void MifareClassicAppReset(void) +{ + State = STATE_IDLE; + 2a1e: 81 e0 ldi r24, 0x01 ; 1 + 2a20: 80 93 d1 24 sts 0x24D1, r24 + 2a24: 08 95 ret + +00002a26 : +} + +void MifareClassicAppTask(void) +{ + 2a26: 08 95 ret + +00002a28 : + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + 2a28: 7f 92 push r7 + 2a2a: 8f 92 push r8 + 2a2c: 9f 92 push r9 + 2a2e: af 92 push r10 + 2a30: bf 92 push r11 + 2a32: cf 92 push r12 + 2a34: df 92 push r13 + 2a36: ef 92 push r14 + 2a38: ff 92 push r15 + 2a3a: 0f 93 push r16 + 2a3c: 1f 93 push r17 + 2a3e: cf 93 push r28 + 2a40: df 93 push r29 + 2a42: cd b7 in r28, 0x3d ; 61 + 2a44: de b7 in r29, 0x3e ; 62 + 2a46: 2e 97 sbiw r28, 0x0e ; 14 + 2a48: cd bf out 0x3d, r28 ; 61 + 2a4a: de bf out 0x3e, r29 ; 62 + 2a4c: 8c 01 movw r16, r24 + switch(State) { + 2a4e: 40 91 d1 24 lds r20, 0x24D1 + 2a52: 50 e0 ldi r21, 0x00 ; 0 + 2a54: 4a 30 cpi r20, 0x0A ; 10 + 2a56: 51 05 cpc r21, r1 + 2a58: 98 f0 brcs .+38 ; 0x2a80 + + *BitCount = ISO14443A_SAK_FRAME_SIZE; + return true; + } else { + /* We have not been selected. Don't send anything. */ + *BitCount = 0; + 2a5a: 80 e0 ldi r24, 0x00 ; 0 + 2a5c: 90 e0 ldi r25, 0x00 ; 0 + break; + } + + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; +} + 2a5e: 2e 96 adiw r28, 0x0e ; 14 + 2a60: cd bf out 0x3d, r28 ; 61 + 2a62: de bf out 0x3e, r29 ; 62 + 2a64: df 91 pop r29 + 2a66: cf 91 pop r28 + 2a68: 1f 91 pop r17 + 2a6a: 0f 91 pop r16 + 2a6c: ff 90 pop r15 + 2a6e: ef 90 pop r14 + 2a70: df 90 pop r13 + 2a72: cf 90 pop r12 + 2a74: bf 90 pop r11 + 2a76: af 90 pop r10 + 2a78: 9f 90 pop r9 + 2a7a: 8f 90 pop r8 + 2a7c: 7f 90 pop r7 + 2a7e: 08 95 ret + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + 2a80: fa 01 movw r30, r20 + 2a82: ee 5e subi r30, 0xEE ; 238 + 2a84: fe 4f sbci r31, 0xFE ; 254 + 2a86: 0c 94 69 23 jmp 0x46d2 ; 0x46d2 <__tablejump2__> + 2a8a: 7c 01 movw r14, r24 + 2a8c: 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(); + 2a8e: f7 01 movw r30, r14 + 2a90: c0 80 ld r12, Z + 2a92: 99 d5 rcall .+2866 ; 0x35c6 + 2a94: 8c 25 eor r24, r12 + 2a96: d7 01 movw r26, r14 + 2a98: 8d 93 st X+, r24 + 2a9a: 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++) + 2a9c: d3 94 inc r13 + 2a9e: b2 e1 ldi r27, 0x12 ; 18 + 2aa0: db 12 cpse r13, r27 + 2aa2: f5 cf rjmp .-22 ; 0x2a8e + Buffer[i] ^= Crypto1Byte(); + + if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { + 2aa4: 60 e1 ldi r22, 0x10 ; 16 + 2aa6: 70 e0 ldi r23, 0x00 ; 0 + 2aa8: c8 01 movw r24, r16 + 2aaa: e5 d3 rcall .+1994 ; 0x3276 + 2aac: 88 23 and r24, r24 + 2aae: 09 f4 brne .+2 ; 0x2ab2 + 2ab0: ec c1 rjmp .+984 ; 0x2e8a + if (!ActiveConfiguration.ReadOnly) { + 2ab2: 80 91 fc 24 lds r24, 0x24FC + 2ab6: 88 23 and r24, r24 + 2ab8: 09 f4 brne .+2 ; 0x2abc + 2aba: ed c1 rjmp .+986 ; 0x2e96 + MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + } else { + /* Silently ignore in ReadOnly mode */ + } + + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 2abc: 97 d5 rcall .+2862 ; 0x35ec + 2abe: 9a e0 ldi r25, 0x0A ; 10 + 2ac0: 98 27 eor r25, r24 + 2ac2: d8 01 movw r26, r16 + 2ac4: 9c 93 st X, r25 + } else { + /* CRC Error. */ + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + + State = STATE_AUTHED_IDLE; + 2ac6: 85 e0 ldi r24, 0x05 ; 5 + 2ac8: 80 93 d1 24 sts 0x24D1, r24 + return ACK_NAK_FRAME_SIZE; + 2acc: 84 e0 ldi r24, 0x04 ; 4 + 2ace: 90 e0 ldi r25, 0x00 ; 0 + 2ad0: c6 cf rjmp .-116 ; 0x2a5e + 2ad2: 7c 01 movw r14, r24 + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + 2ad4: 56 e0 ldi r21, 0x06 ; 6 + 2ad6: 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(); + 2ad8: d7 01 movw r26, r14 + 2ada: cc 90 ld r12, X + 2adc: 74 d5 rcall .+2792 ; 0x35c6 + 2ade: 8c 25 eor r24, r12 + 2ae0: f7 01 movw r30, r14 + 2ae2: 81 93 st Z+, r24 + 2ae4: 7f 01 movw r14, r30 + 2ae6: 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++) + 2ae8: b9 f7 brne .-18 ; 0x2ad8 + Buffer[i] ^= Crypto1Byte(); + + if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { + 2aea: 64 e0 ldi r22, 0x04 ; 4 + 2aec: 70 e0 ldi r23, 0x00 ; 0 + 2aee: c8 01 movw r24, r16 + 2af0: c2 d3 rcall .+1924 ; 0x3276 + 2af2: 81 11 cpse r24, r1 + 2af4: b0 c1 rjmp .+864 ; 0x2e56 + /* Not sure if this is the correct error code.. */ + Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); + } + } else { + /* CRC Error. */ + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 2af6: 7a d5 rcall .+2804 ; 0x35ec + 2af8: 91 e0 ldi r25, 0x01 ; 1 + 2afa: 98 27 eor r25, r24 + 2afc: d8 01 movw r26, r16 + 2afe: 9c 93 st X, r25 + 2b00: e2 cf rjmp .-60 ; 0x2ac6 +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + case STATE_IDLE: + case STATE_HALT: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + 2b02: 20 91 b6 24 lds r18, 0x24B6 + 2b06: 90 91 b7 24 lds r25, 0x24B7 +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) ){ + 2b0a: d8 01 movw r26, r16 + 2b0c: 8c 91 ld r24, X + 2b0e: 86 32 cpi r24, 0x26 ; 38 + 2b10: 19 f0 breq .+6 ; 0x2b18 + 2b12: 82 35 cpi r24, 0x52 ; 82 + 2b14: 09 f0 breq .+2 ; 0x2b18 + 2b16: a1 cf rjmp .-190 ; 0x2a5a + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + 2b18: f8 01 movw r30, r16 + 2b1a: 20 83 st Z, r18 + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + 2b1c: 91 83 std Z+1, r25 ; 0x01 + } + break; + + case STATE_READY: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + State = STATE_READY; + 2b1e: 82 e0 ldi r24, 0x02 ; 2 + 2b20: 80 93 d1 24 sts 0x24D1, r24 + + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + 2b24: 80 e1 ldi r24, 0x10 ; 16 + 2b26: 90 e0 ldi r25, 0x00 ; 0 + return BitCount; + 2b28: 9a cf rjmp .-204 ; 0x2a5e + return BitCount; + } + break; + + case STATE_READY: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + 2b2a: 20 91 b6 24 lds r18, 0x24B6 + 2b2e: 90 91 b7 24 lds r25, 0x24B7 +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) ){ + 2b32: d8 01 movw r26, r16 + 2b34: 8c 91 ld r24, X + 2b36: 86 32 cpi r24, 0x26 ; 38 + 2b38: 79 f3 breq .-34 ; 0x2b18 + 2b3a: 82 35 cpi r24, 0x52 ; 82 + 2b3c: 69 f3 breq .-38 ; 0x2b18 + State = STATE_READY; + return BitCount; + } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { + 2b3e: 83 39 cpi r24, 0x93 ; 147 + 2b40: 09 f4 brne .+2 ; 0x2b44 + 2b42: cb c1 rjmp .+918 ; 0x2eda + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { + /* According to ISO14443, we must not send anything + * in order to acknowledge the HALT command. */ + State = STATE_HALT; + 2b44: 10 92 d1 24 sts 0x24D1, r1 + return ISO14443A_APP_NO_RESPONSE; + 2b48: 80 e0 ldi r24, 0x00 ; 0 + 2b4a: 90 e0 ldi r25, 0x00 ; 0 + 2b4c: 88 cf rjmp .-240 ; 0x2a5e + + 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]); + 2b4e: 16 d5 rcall .+2604 ; 0x357c + 2b50: 68 01 movw r12, r16 + 2b52: b4 e0 ldi r27, 0x04 ; 4 + 2b54: cb 0e add r12, r27 + 2b56: d1 1c adc r13, r1 + + for (uint8_t i=0; i<4; i++) + 2b58: b1 2c mov r11, r1 + Buffer[i+4] ^= Crypto1Byte(); + 2b5a: f6 01 movw r30, r12 + 2b5c: a0 80 ld r10, Z + 2b5e: 33 d5 rcall .+2662 ; 0x35c6 + 2b60: 8a 25 eor r24, r10 + 2b62: d6 01 movw r26, r12 + 2b64: 8d 93 st X+, r24 + 2b66: 6d 01 movw r12, 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++) + 2b68: b3 94 inc r11 + 2b6a: b4 e0 ldi r27, 0x04 ; 4 + 2b6c: bb 12 cpse r11, r27 + 2b6e: f5 cf rjmp .-22 ; 0x2b5a + Buffer[i+4] ^= Crypto1Byte(); + + if ((Buffer[4] == ReaderResponse[0]) && + 2b70: f8 01 movw r30, r16 + 2b72: 94 81 ldd r25, Z+4 ; 0x04 + 2b74: 80 91 c9 24 lds r24, 0x24C9 + 2b78: 98 17 cp r25, r24 + 2b7a: 09 f4 brne .+2 ; 0x2b7e + 2b7c: 2e c1 rjmp .+604 ; 0x2dda + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + return ACK_NAK_FRAME_SIZE; + } + } else { + /* Unknown command. Enter HALT state */ + State = STATE_IDLE; + 2b7e: 81 e0 ldi r24, 0x01 ; 1 + 2b80: 80 93 d1 24 sts 0x24D1, r24 + /* Unknown state? Should never happen. */ + break; + } + + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; + 2b84: 80 e0 ldi r24, 0x00 ; 0 + 2b86: 90 e0 ldi r25, 0x00 ; 0 + } else { + /* Unknown command. Enter HALT state */ + State = STATE_IDLE; + } + + break; + 2b88: 6a cf rjmp .-300 ; 0x2a5e + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + 2b8a: 7c 01 movw r14, r24 + 2b8c: 74 e0 ldi r23, 0x04 ; 4 + 2b8e: b7 2e mov r11, r23 + + 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(); + 2b90: d7 01 movw r26, r14 + 2b92: ac 90 ld r10, X + 2b94: 18 d5 rcall .+2608 ; 0x35c6 + 2b96: 8a 25 eor r24, r10 + 2b98: f7 01 movw r30, r14 + 2b9a: 81 93 st Z+, r24 + 2b9c: 7f 01 movw r14, r30 + 2b9e: 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++) + 2ba0: b9 f7 brne .-18 ; 0x2b90 + Buffer[i] ^= Crypto1Byte(); + + if (Buffer[0] == CMD_READ) { + 2ba2: d8 01 movw r26, r16 + 2ba4: 8c 91 ld r24, X + 2ba6: 80 33 cpi r24, 0x30 ; 48 + 2ba8: 09 f4 brne .+2 ; 0x2bac + 2baa: 89 c1 rjmp .+786 ; 0x2ebe + * 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) { + 2bac: 80 3a cpi r24, 0xA0 ; 160 + 2bae: 09 f4 brne .+2 ; 0x2bb2 + 2bb0: cb c1 rjmp .+918 ; 0x2f48 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_DECREMENT) { + 2bb2: 80 3c cpi r24, 0xC0 ; 192 + 2bb4: 09 f4 brne .+2 ; 0x2bb8 + 2bb6: da c1 rjmp .+948 ; 0x2f6c + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_INCREMENT) { + 2bb8: 81 3c cpi r24, 0xC1 ; 193 + 2bba: 09 f4 brne .+2 ; 0x2bbe + 2bbc: 75 c2 rjmp .+1258 ; 0x30a8 <__stack+0xa9> + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_RESTORE) { + 2bbe: 82 3c cpi r24, 0xC2 ; 194 + 2bc0: 09 f4 brne .+2 ; 0x2bc4 + 2bc2: 80 c2 rjmp .+1280 ; 0x30c4 <__stack+0xc5> + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + }else if (Buffer[0] == CMD_TRANSFER) { + 2bc4: 80 3b cpi r24, 0xB0 ; 176 + 2bc6: 09 f4 brne .+2 ; 0x2bca + 2bc8: 8e c2 rjmp .+1308 ; 0x30e6 <__stack+0xe7> + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + + return ACK_NAK_FRAME_SIZE; + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { + 2bca: 80 56 subi r24, 0x60 ; 96 + 2bcc: 82 30 cpi r24, 0x02 ; 2 + 2bce: b8 f6 brcc .-82 ; 0x2b7e + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + 2bd0: 62 e0 ldi r22, 0x02 ; 2 + 2bd2: 70 e0 ldi r23, 0x00 ; 0 + 2bd4: c8 01 movw r24, r16 + 2bd6: 4f d3 rcall .+1694 ; 0x3276 + 2bd8: 88 23 and r24, r24 + 2bda: 09 f4 brne .+2 ; 0x2bde + 2bdc: 68 c1 rjmp .+720 ; 0x2eae + /* Nested authentication. */ + uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + 2bde: f8 01 movw r30, r16 + 2be0: 81 81 ldd r24, Z+1 ; 0x01 + 2be2: 8c 73 andi r24, 0x3C ; 60 + uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + 2be4: 90 81 ld r25, Z + 2be6: 90 36 cpi r25, 0x60 ; 96 + 2be8: 09 f4 brne .+2 ; 0x2bec + 2bea: eb c2 rjmp .+1494 ; 0x31c2 <__stack+0x1c3> + 2bec: 6a e3 ldi r22, 0x3A ; 58 + 2bee: 70 e0 ldi r23, 0x00 ; 0 + uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; + 2bf0: 7b 01 movw r14, r22 + 2bf2: f0 e1 ldi r31, 0x10 ; 16 + 2bf4: 8f 9f mul r24, r31 + 2bf6: e0 0c add r14, r0 + 2bf8: f1 1c adc r15, r1 + 2bfa: 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)); + 2bfc: 64 e0 ldi r22, 0x04 ; 4 + 2bfe: ce 01 movw r24, r28 + 2c00: 07 96 adiw r24, 0x07 ; 7 + 2c02: 0e 94 2f 05 call 0xa5e ; 0xa5e + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 2c06: 44 e0 ldi r20, 0x04 ; 4 + 2c08: 50 e0 ldi r21, 0x00 ; 0 + 2c0a: 60 e0 ldi r22, 0x00 ; 0 + 2c0c: 70 e0 ldi r23, 0x00 ; 0 + 2c0e: ce 01 movw r24, r28 + 2c10: 0b 96 adiw r24, 0x0b ; 11 + 2c12: 0e 94 d4 05 call 0xba8 ; 0xba8 + MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); + 2c16: 46 e0 ldi r20, 0x06 ; 6 + 2c18: 50 e0 ldi r21, 0x00 ; 0 + 2c1a: b7 01 movw r22, r14 + 2c1c: ce 01 movw r24, r28 + 2c1e: 01 96 adiw r24, 0x01 ; 1 + 2c20: 0e 94 d4 05 call 0xba8 ; 0xba8 + 2c24: 8f 81 ldd r24, Y+7 ; 0x07 + 2c26: 98 85 ldd r25, Y+8 ; 0x08 + 2c28: a9 85 ldd r26, Y+9 ; 0x09 + 2c2a: ba 85 ldd r27, Y+10 ; 0x0a + 2c2c: 80 93 c9 24 sts 0x24C9, r24 + 2c30: 90 93 ca 24 sts 0x24CA, r25 + 2c34: a0 93 cb 24 sts 0x24CB, r26 + 2c38: b0 93 cc 24 sts 0x24CC, r27 + + /* Precalculate the reader response from card-nonce */ + for (uint8_t i=0; i + 2c46: 80 91 c9 24 lds r24, 0x24C9 + 2c4a: 90 91 ca 24 lds r25, 0x24CA + 2c4e: a0 91 cb 24 lds r26, 0x24CB + 2c52: b0 91 cc 24 lds r27, 0x24CC + 2c56: 80 93 cd 24 sts 0x24CD, r24 + 2c5a: 90 93 ce 24 sts 0x24CE, r25 + 2c5e: a0 93 cf 24 sts 0x24CF, r26 + 2c62: b0 93 d0 24 sts 0x24D0, r27 + + /* Precalculate our response from the reader response */ + for (uint8_t i=0; i + + /* Setup crypto1 cipher. */ + Crypto1Setup(Key, Uid, CardNonce); + 2c70: ae 01 movw r20, r28 + 2c72: 49 5f subi r20, 0xF9 ; 249 + 2c74: 5f 4f sbci r21, 0xFF ; 255 + 2c76: be 01 movw r22, r28 + 2c78: 65 5f subi r22, 0xF5 ; 245 + 2c7a: 7f 4f sbci r23, 0xFF ; 255 + 2c7c: ce 01 movw r24, r28 + 2c7e: 01 96 adiw r24, 0x01 ; 1 + 2c80: b0 d3 rcall .+1888 ; 0x33e2 + 2c82: 8f 81 ldd r24, Y+7 ; 0x07 + 2c84: 98 85 ldd r25, Y+8 ; 0x08 + 2c86: a9 85 ldd r26, Y+9 ; 0x09 + 2c88: ba 85 ldd r27, Y+10 ; 0x0a + 2c8a: f8 01 movw r30, r16 + 2c8c: 80 83 st Z, r24 + 2c8e: 91 83 std Z+1, r25 ; 0x01 + 2c90: a2 83 std Z+2, r26 ; 0x02 + 2c92: b3 83 std Z+3, r27 ; 0x03 + for (uint8_t i=0; i + 2ca0: fc 01 movw r30, r24 + 2ca2: 80 81 ld r24, Z + 2ca4: 86 32 cpi r24, 0x26 ; 38 + 2ca6: d1 f0 breq .+52 ; 0x2cdc + 2ca8: 82 35 cpi r24, 0x52 ; 82 + 2caa: c1 f0 breq .+48 ; 0x2cdc + + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { + State = STATE_READY; + return BitCount; + } else if (Buffer[0] == CMD_HALT) { + 2cac: 80 35 cpi r24, 0x50 ; 80 + 2cae: 09 f1 breq .+66 ; 0x2cf2 + } + } else { + Buffer[0] = NAK_INVALID_ARG; + return ACK_NAK_FRAME_SIZE; + } + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + 2cb0: 90 ea ldi r25, 0xA0 ; 160 + 2cb2: 98 0f add r25, r24 + 2cb4: 92 30 cpi r25, 0x02 ; 2 + 2cb6: 38 f1 brcs .+78 ; 0x2d06 + 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) + 2cb8: 98 2f mov r25, r24 + 2cba: 9f 77 andi r25, 0x7F ; 127 + 2cbc: 90 33 cpi r25, 0x30 ; 48 + 2cbe: 31 f0 breq .+12 ; 0x2ccc + 2cc0: 80 3a cpi r24, 0xA0 ; 160 + 2cc2: 21 f0 breq .+8 ; 0x2ccc + 2cc4: 80 5c subi r24, 0xC0 ; 192 + 2cc6: 83 30 cpi r24, 0x03 ; 3 + 2cc8: 08 f0 brcs .+2 ; 0x2ccc + 2cca: 59 cf rjmp .-334 ; 0x2b7e + || (Buffer[0] == CMD_INCREMENT) || (Buffer[0] == CMD_RESTORE) || (Buffer[0] == CMD_TRANSFER) ) { + State = STATE_IDLE; + 2ccc: 81 e0 ldi r24, 0x01 ; 1 + 2cce: 80 93 d1 24 sts 0x24D1, r24 + Buffer[0] = NAK_NOT_AUTHED; + 2cd2: 84 e0 ldi r24, 0x04 ; 4 + 2cd4: d8 01 movw r26, r16 + 2cd6: 8c 93 st X, r24 + return ACK_NAK_FRAME_SIZE; + 2cd8: 90 e0 ldi r25, 0x00 ; 0 + 2cda: c1 ce rjmp .-638 ; 0x2a5e + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + 2cdc: 84 e0 ldi r24, 0x04 ; 4 + 2cde: d8 01 movw r26, r16 + 2ce0: 8c 93 st X, r24 + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + 2ce2: 11 96 adiw r26, 0x01 ; 1 + 2ce4: 1c 92 st X, r1 + } + break; + + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { + State = STATE_READY; + 2ce6: 82 e0 ldi r24, 0x02 ; 2 + 2ce8: 80 93 d1 24 sts 0x24D1, r24 + + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + 2cec: 80 e1 ldi r24, 0x10 ; 16 + 2cee: 90 e0 ldi r25, 0x00 ; 0 + return BitCount; + 2cf0: b6 ce rjmp .-660 ; 0x2a5e + } 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) { + 2cf2: f8 01 movw r30, r16 + 2cf4: 81 81 ldd r24, Z+1 ; 0x01 + 2cf6: 88 23 and r24, r24 + 2cf8: 09 f4 brne .+2 ; 0x2cfc + 2cfa: 13 c2 rjmp .+1062 ; 0x3122 <__stack+0x123> + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_INVALID_ARG; + 2cfc: f8 01 movw r30, r16 + 2cfe: 10 82 st Z, r1 + return ACK_NAK_FRAME_SIZE; + 2d00: 84 e0 ldi r24, 0x04 ; 4 + 2d02: 90 e0 ldi r25, 0x00 ; 0 + 2d04: ac ce rjmp .-680 ; 0x2a5e + } + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + 2d06: 62 e0 ldi r22, 0x02 ; 2 + 2d08: 70 e0 ldi r23, 0x00 ; 0 + 2d0a: c8 01 movw r24, r16 + 2d0c: b4 d2 rcall .+1384 ; 0x3276 + 2d0e: 88 23 and r24, r24 + 2d10: 09 f4 brne .+2 ; 0x2d14 + 2d12: 0d c2 rjmp .+1050 ; 0x312e <__stack+0x12f> + uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + 2d14: d8 01 movw r26, r16 + 2d16: 11 96 adiw r26, 0x01 ; 1 + 2d18: 2c 91 ld r18, X + 2d1a: 11 97 sbiw r26, 0x01 ; 1 + 2d1c: 2c 73 andi r18, 0x3C ; 60 + uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + 2d1e: 8c 91 ld r24, X + 2d20: 80 36 cpi r24, 0x60 ; 96 + 2d22: 09 f4 brne .+2 ; 0x2d26 + 2d24: 51 c2 rjmp .+1186 ; 0x31c8 <__stack+0x1c9> + 2d26: 8a e3 ldi r24, 0x3A ; 58 + 2d28: 90 e0 ldi r25, 0x00 ; 0 + uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; + 2d2a: 7c 01 movw r14, r24 + 2d2c: b0 e1 ldi r27, 0x10 ; 16 + 2d2e: 2b 9f mul r18, r27 + 2d30: e0 0c add r14, r0 + 2d32: f1 1c adc r15, r1 + 2d34: 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)); + 2d36: 64 e0 ldi r22, 0x04 ; 4 + 2d38: ce 01 movw r24, r28 + 2d3a: 07 96 adiw r24, 0x07 ; 7 + 2d3c: 0e 94 2f 05 call 0xa5e ; 0xa5e + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 2d40: 44 e0 ldi r20, 0x04 ; 4 + 2d42: 50 e0 ldi r21, 0x00 ; 0 + 2d44: 60 e0 ldi r22, 0x00 ; 0 + 2d46: 70 e0 ldi r23, 0x00 ; 0 + 2d48: ce 01 movw r24, r28 + 2d4a: 0b 96 adiw r24, 0x0b ; 11 + 2d4c: 0e 94 d4 05 call 0xba8 ; 0xba8 + MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); + 2d50: 46 e0 ldi r20, 0x06 ; 6 + 2d52: 50 e0 ldi r21, 0x00 ; 0 + 2d54: b7 01 movw r22, r14 + 2d56: ce 01 movw r24, r28 + 2d58: 01 96 adiw r24, 0x01 ; 1 + 2d5a: 0e 94 d4 05 call 0xba8 ; 0xba8 + 2d5e: 8f 81 ldd r24, Y+7 ; 0x07 + 2d60: 98 85 ldd r25, Y+8 ; 0x08 + 2d62: a9 85 ldd r26, Y+9 ; 0x09 + 2d64: ba 85 ldd r27, Y+10 ; 0x0a + 2d66: 80 93 c9 24 sts 0x24C9, r24 + 2d6a: 90 93 ca 24 sts 0x24CA, r25 + 2d6e: a0 93 cb 24 sts 0x24CB, r26 + 2d72: b0 93 cc 24 sts 0x24CC, r27 + + /* Precalculate the reader response from card-nonce */ + for (uint8_t i=0; i + 2d80: 80 91 c9 24 lds r24, 0x24C9 + 2d84: 90 91 ca 24 lds r25, 0x24CA + 2d88: a0 91 cb 24 lds r26, 0x24CB + 2d8c: b0 91 cc 24 lds r27, 0x24CC + 2d90: 80 93 cd 24 sts 0x24CD, r24 + 2d94: 90 93 ce 24 sts 0x24CE, r25 + 2d98: a0 93 cf 24 sts 0x24CF, r26 + 2d9c: b0 93 d0 24 sts 0x24D0, 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; + 2daa: 84 e0 ldi r24, 0x04 ; 4 + 2dac: 80 93 d1 24 sts 0x24D1, r24 + 2db0: 8f 81 ldd r24, Y+7 ; 0x07 + 2db2: 98 85 ldd r25, Y+8 ; 0x08 + 2db4: a9 85 ldd r26, Y+9 ; 0x09 + 2db6: ba 85 ldd r27, Y+10 ; 0x0a + 2db8: f8 01 movw r30, r16 + 2dba: 80 83 st Z, r24 + 2dbc: 91 83 std Z+1, r25 ; 0x01 + 2dbe: a2 83 std Z+2, r26 ; 0x02 + 2dc0: b3 83 std Z+3, r27 ; 0x03 + + for (uint8_t i=0; i + + return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; + 2dd4: 80 e2 ldi r24, 0x20 ; 32 + 2dd6: 90 e0 ldi r25, 0x00 ; 0 + 2dd8: 42 ce rjmp .-892 ; 0x2a5e + Crypto1Auth(&Buffer[0]); + + for (uint8_t i=0; i<4; i++) + Buffer[i+4] ^= Crypto1Byte(); + + if ((Buffer[4] == ReaderResponse[0]) && + 2dda: 95 81 ldd r25, Z+5 ; 0x05 + 2ddc: 80 91 ca 24 lds r24, 0x24CA + 2de0: 98 13 cpse r25, r24 + 2de2: cd ce rjmp .-614 ; 0x2b7e + (Buffer[5] == ReaderResponse[1]) && + 2de4: 96 81 ldd r25, Z+6 ; 0x06 + 2de6: 80 91 cb 24 lds r24, 0x24CB + 2dea: 98 13 cpse r25, r24 + 2dec: c8 ce rjmp .-624 ; 0x2b7e + (Buffer[6] == ReaderResponse[2]) && + 2dee: 97 81 ldd r25, Z+7 ; 0x07 + 2df0: 80 91 cc 24 lds r24, 0x24CC + 2df4: 98 13 cpse r25, r24 + 2df6: c3 ce rjmp .-634 ; 0x2b7e + 2df8: 68 01 movw r12, r16 + 2dfa: 0d ec ldi r16, 0xCD ; 205 + 2dfc: 14 e2 ldi r17, 0x24 ; 36 + 2dfe: 5f 01 movw r10, r30 + 2e00: f0 e8 ldi r31, 0x80 ; 128 + 2e02: af 0e add r10, r31 + 2e04: b1 1c adc r11, r1 + 2e06: 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 + 2e10: 87 25 eor r24, r7 + 2e12: f6 01 movw r30, r12 + 2e14: 81 93 st Z+, r24 + 2e16: 6f 01 movw r12, r30 + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); + 2e18: d4 01 movw r26, r8 + 2e1a: 9c 90 ld r9, X + 2e1c: 09 2c mov r0, r9 + 2e1e: 92 94 swap r9 + 2e20: 90 24 eor r9, r0 + 2e22: 09 2c mov r0, r9 + 2e24: 96 94 lsr r9 + 2e26: 96 94 lsr r9 + 2e28: 90 24 eor r9, r0 + 2e2a: a9 d2 rcall .+1362 ; 0x337e + 2e2c: 93 94 inc r9 + 2e2e: 91 fa bst r9, 1 + 2e30: ee 24 eor r14, r14 + 2e32: e0 f8 bld r14, 0 + 2e34: f1 2c mov r15, r1 + 2e36: b1 e0 ldi r27, 0x01 ; 1 + 2e38: eb 26 eor r14, r27 + 2e3a: 8e 25 eor r24, r14 + 2e3c: f5 01 movw r30, r10 + 2e3e: 81 93 st Z+, r24 + 2e40: 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; + 2e4a: 85 e0 ldi r24, 0x05 ; 5 + 2e4c: 80 93 d1 24 sts 0x24D1, r24 + + return (CMD_AUTH_BA_FRAME_SIZE * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; + 2e50: 80 e2 ldi r24, 0x20 ; 32 + 2e52: 90 e1 ldi r25, 0x10 ; 16 + 2e54: 04 ce rjmp .-1016 ; 0x2a5e + * 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); + 2e56: 60 91 c8 24 lds r22, 0x24C8 + 2e5a: f0 e1 ldi r31, 0x10 ; 16 + 2e5c: 6f 9f mul r22, r31 + 2e5e: b0 01 movw r22, r0 + 2e60: 11 24 eor r1, r1 + 2e62: 40 e1 ldi r20, 0x10 ; 16 + 2e64: 50 e0 ldi r21, 0x00 ; 0 + 2e66: 88 eb ldi r24, 0xB8 ; 184 + 2e68: 94 e2 ldi r25, 0x24 ; 36 + 2e6a: 0e 94 d4 05 call 0xba8 ; 0xba8 + +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]) + 2e6e: 20 91 b8 24 lds r18, 0x24B8 + 2e72: 80 91 bc 24 lds r24, 0x24BC + 2e76: 80 95 com r24 + 2e78: 28 17 cp r18, r24 + 2e7a: 09 f4 brne .+2 ; 0x2e7e + 2e7c: 88 c0 rjmp .+272 ; 0x2f8e + 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(); + 2e7e: b6 d3 rcall .+1900 ; 0x35ec + 2e80: 96 e0 ldi r25, 0x06 ; 6 + 2e82: 98 27 eor r25, r24 + 2e84: f8 01 movw r30, r16 + 2e86: 90 83 st Z, r25 + 2e88: 1e ce rjmp .-964 ; 0x2ac6 + /* Silently ignore in ReadOnly mode */ + } + + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 2e8a: b0 d3 rcall .+1888 ; 0x35ec + 2e8c: 91 e0 ldi r25, 0x01 ; 1 + 2e8e: 98 27 eor r25, r24 + 2e90: f8 01 movw r30, r16 + 2e92: 90 83 st Z, r25 + 2e94: 18 ce rjmp .-976 ; 0x2ac6 + 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); + 2e96: 60 91 c8 24 lds r22, 0x24C8 + 2e9a: e0 e1 ldi r30, 0x10 ; 16 + 2e9c: 6e 9f mul r22, r30 + 2e9e: b0 01 movw r22, r0 + 2ea0: 11 24 eor r1, r1 + 2ea2: 40 e1 ldi r20, 0x10 ; 16 + 2ea4: 50 e0 ldi r21, 0x00 ; 0 + 2ea6: c8 01 movw r24, r16 + 2ea8: 0e 94 ec 05 call 0xbd8 ; 0xbd8 + 2eac: 07 ce rjmp .-1010 ; 0x2abc + * form the reader in the next frame. */ + State = STATE_AUTHING; + + return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + 2eae: 9e d3 rcall .+1852 ; 0x35ec + 2eb0: 91 e0 ldi r25, 0x01 ; 1 + 2eb2: 98 27 eor r25, r24 + 2eb4: d8 01 movw r26, r16 + 2eb6: 9c 93 st X, r25 + return ACK_NAK_FRAME_SIZE; + 2eb8: 84 e0 ldi r24, 0x04 ; 4 + 2eba: 90 e0 ldi r25, 0x00 ; 0 + 2ebc: d0 cd rjmp .-1120 ; 0x2a5e + * 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)) { + 2ebe: 62 e0 ldi r22, 0x02 ; 2 + 2ec0: 70 e0 ldi r23, 0x00 ; 0 + 2ec2: c8 01 movw r24, r16 + 2ec4: d8 d1 rcall .+944 ; 0x3276 + 2ec6: 81 11 cpse r24, r1 + 2ec8: 38 c1 rjmp .+624 ; 0x313a <__stack+0x13b> + 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(); + 2eca: 90 d3 rcall .+1824 ; 0x35ec + 2ecc: 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(); + 2ece: 98 27 eor r25, r24 + 2ed0: f8 01 movw r30, r16 + 2ed2: 90 83 st Z, r25 + } else { + Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); + } + return ACK_NAK_FRAME_SIZE; + 2ed4: 84 e0 ldi r24, 0x04 ; 4 + 2ed6: 90 e0 ldi r25, 0x00 ; 0 + 2ed8: c2 cd rjmp .-1148 ; 0x2a5e + State = STATE_READY; + return BitCount; + } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { + /* Load UID CL1 and perform anticollision */ + uint8_t UidCL1[4]; + MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 2eda: 44 e0 ldi r20, 0x04 ; 4 + 2edc: 50 e0 ldi r21, 0x00 ; 0 + 2ede: 60 e0 ldi r22, 0x00 ; 0 + 2ee0: 70 e0 ldi r23, 0x00 ; 0 + 2ee2: ce 01 movw r24, r28 + 2ee4: 01 96 adiw r24, 0x01 ; 1 + 2ee6: 0e 94 d4 05 call 0xba8 ; 0xba8 + + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { + 2eea: 90 91 b5 24 lds r25, 0x24B5 + 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) { + 2eee: d8 01 movw r26, r16 + 2ef0: 11 96 adiw r26, 0x01 ; 1 + 2ef2: 8c 91 ld r24, X + 2ef4: 80 32 cpi r24, 0x20 ; 32 + 2ef6: 09 f4 brne .+2 ; 0x2efa + 2ef8: 54 c1 rjmp .+680 ; 0x31a2 <__stack+0x1a3> + 2efa: 80 37 cpi r24, 0x70 ; 112 + 2efc: 09 f0 breq .+2 ; 0x2f00 + 2efe: ad cd rjmp .-1190 ; 0x2a5a + return false; + + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + 2f00: d8 01 movw r26, r16 + 2f02: 12 96 adiw r26, 0x02 ; 2 + 2f04: 2c 91 ld r18, X + 2f06: 12 97 sbiw r26, 0x02 ; 2 + 2f08: 89 81 ldd r24, Y+1 ; 0x01 + 2f0a: 28 13 cpse r18, r24 + 2f0c: a6 cd rjmp .-1204 ; 0x2a5a + 2f0e: 13 96 adiw r26, 0x03 ; 3 + 2f10: 2c 91 ld r18, X + 2f12: 13 97 sbiw r26, 0x03 ; 3 + 2f14: 8a 81 ldd r24, Y+2 ; 0x02 + 2f16: 28 13 cpse r18, r24 + 2f18: a0 cd rjmp .-1216 ; 0x2a5a + (DataPtr[3] == UidCL[1]) && + 2f1a: 14 96 adiw r26, 0x04 ; 4 + 2f1c: 2c 91 ld r18, X + 2f1e: 14 97 sbiw r26, 0x04 ; 4 + 2f20: 8b 81 ldd r24, Y+3 ; 0x03 + 2f22: 28 13 cpse r18, r24 + 2f24: 9a cd rjmp .-1228 ; 0x2a5a + (DataPtr[4] == UidCL[2]) && + 2f26: 15 96 adiw r26, 0x05 ; 5 + 2f28: 2c 91 ld r18, X + 2f2a: 15 97 sbiw r26, 0x05 ; 5 + 2f2c: 8c 81 ldd r24, Y+4 ; 0x04 + 2f2e: 28 13 cpse r18, r24 + 2f30: 94 cd rjmp .-1240 ; 0x2a5a + (DataPtr[5] == UidCL[3]) ) { + + DataPtr[0] = SAKValue; + 2f32: 9c 93 st X, r25 + ISO14443AAppendCRCA(Buffer, 1); + 2f34: 61 e0 ldi r22, 0x01 ; 1 + 2f36: 70 e0 ldi r23, 0x00 ; 0 + 2f38: c8 01 movw r24, r16 + 2f3a: 6f d1 rcall .+734 ; 0x321a + State = STATE_ACTIVE; + 2f3c: 83 e0 ldi r24, 0x03 ; 3 + 2f3e: 80 93 d1 24 sts 0x24D1, r24 + + *BitCount = ISO14443A_SAK_FRAME_SIZE; + 2f42: 88 e1 ldi r24, 0x18 ; 24 + 2f44: 90 e0 ldi r25, 0x00 ; 0 + 2f46: 8b cd rjmp .-1258 ; 0x2a5e + } 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)) { + 2f48: 62 e0 ldi r22, 0x02 ; 2 + 2f4a: 70 e0 ldi r23, 0x00 ; 0 + 2f4c: c8 01 movw r24, r16 + 2f4e: 93 d1 rcall .+806 ; 0x3276 + 2f50: 88 23 and r24, r24 + 2f52: 09 f4 brne .+2 ; 0x2f56 + 2f54: ac cf rjmp .-168 ; 0x2eae + /* Write command. Store the address and prepare for the upcoming data. + * Respond with ACK. */ + CurrentAddress = Buffer[1]; + 2f56: d8 01 movw r26, r16 + 2f58: 11 96 adiw r26, 0x01 ; 1 + 2f5a: 8c 91 ld r24, X + 2f5c: 80 93 c8 24 sts 0x24C8, r24 + State = STATE_WRITE; + 2f60: 86 e0 ldi r24, 0x06 ; 6 + 2f62: 80 93 d1 24 sts 0x24D1, r24 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 2f66: 42 d3 rcall .+1668 ; 0x35ec + 2f68: 9a e0 ldi r25, 0x0A ; 10 + 2f6a: b1 cf rjmp .-158 ; 0x2ece + } 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)) { + 2f6c: 62 e0 ldi r22, 0x02 ; 2 + 2f6e: 70 e0 ldi r23, 0x00 ; 0 + 2f70: c8 01 movw r24, r16 + 2f72: 81 d1 rcall .+770 ; 0x3276 + 2f74: 88 23 and r24, r24 + 2f76: 09 f4 brne .+2 ; 0x2f7a + 2f78: a8 cf rjmp .-176 ; 0x2eca + CurrentAddress = Buffer[1]; + 2f7a: f8 01 movw r30, r16 + 2f7c: 81 81 ldd r24, Z+1 ; 0x01 + 2f7e: 80 93 c8 24 sts 0x24C8, r24 + State = STATE_DECREMENT; + 2f82: 88 e0 ldi r24, 0x08 ; 8 + 2f84: 80 93 d1 24 sts 0x24D1, r24 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 2f88: 31 d3 rcall .+1634 ; 0x35ec + 2f8a: 9a e0 ldi r25, 0x0A ; 10 + 2f8c: 92 cf rjmp .-220 ; 0x2eb2 + +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]) + 2f8e: 80 91 c0 24 lds r24, 0x24C0 + 2f92: 28 13 cpse r18, r24 + 2f94: 74 cf rjmp .-280 ; 0x2e7e + && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) + 2f96: e0 91 b9 24 lds r30, 0x24B9 + 2f9a: 80 91 bd 24 lds r24, 0x24BD + 2f9e: 80 95 com r24 + 2fa0: e8 13 cpse r30, r24 + 2fa2: 6d cf rjmp .-294 ; 0x2e7e + 2fa4: 80 91 c1 24 lds r24, 0x24C1 + 2fa8: e8 13 cpse r30, r24 + 2faa: 69 cf rjmp .-302 ; 0x2e7e + && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) + 2fac: 80 91 ba 24 lds r24, 0x24BA + 2fb0: 90 91 be 24 lds r25, 0x24BE + 2fb4: 90 95 com r25 + 2fb6: 89 13 cpse r24, r25 + 2fb8: 62 cf rjmp .-316 ; 0x2e7e + 2fba: 90 91 c2 24 lds r25, 0x24C2 + 2fbe: 89 13 cpse r24, r25 + 2fc0: 5e cf rjmp .-324 ; 0x2e7e + && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) + 2fc2: 30 91 bb 24 lds r19, 0x24BB + 2fc6: 90 91 bf 24 lds r25, 0x24BF + 2fca: 90 95 com r25 + 2fcc: 39 13 cpse r19, r25 + 2fce: 57 cf rjmp .-338 ; 0x2e7e + 2fd0: 90 91 c3 24 lds r25, 0x24C3 + 2fd4: 39 13 cpse r19, r25 + 2fd6: 53 cf rjmp .-346 ; 0x2e7e + && (Block[12] == (uint8_t) ~Block[13]) + 2fd8: 40 91 c4 24 lds r20, 0x24C4 + 2fdc: 90 91 c5 24 lds r25, 0x24C5 + 2fe0: 90 95 com r25 + 2fe2: 49 13 cpse r20, r25 + 2fe4: 4c cf rjmp .-360 ; 0x2e7e + && (Block[12] == Block[14]) + 2fe6: 90 91 c6 24 lds r25, 0x24C6 + 2fea: 49 13 cpse r20, r25 + 2fec: 48 cf rjmp .-368 ; 0x2e7e + && (Block[14] == (uint8_t) ~Block[15])) { + 2fee: 90 91 c7 24 lds r25, 0x24C7 + 2ff2: 90 95 com r25 + 2ff4: 49 13 cpse r20, r25 + 2ff6: 43 cf rjmp .-378 ; 0x2e7e +} + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + 2ff8: d8 01 movw r26, r16 + 2ffa: 9c 91 ld r25, X + *Value |= ((uint32_t) Block[1] << 8); + 2ffc: 11 96 adiw r26, 0x01 ; 1 + 2ffe: fc 91 ld r31, X + 3000: 11 97 sbiw r26, 0x01 ; 1 + *Value |= ((uint32_t) Block[2] << 16); + 3002: 12 96 adiw r26, 0x02 ; 2 + 3004: 4c 91 ld r20, X + 3006: 12 97 sbiw r26, 0x02 ; 2 + 3008: 50 e0 ldi r21, 0x00 ; 0 + 300a: 60 e0 ldi r22, 0x00 ; 0 + 300c: 70 e0 ldi r23, 0x00 ; 0 + 300e: ba 01 movw r22, r20 + 3010: 55 27 eor r21, r21 + 3012: 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); + 3014: 5f 2b or r21, r31 + *Value |= ((uint32_t) Block[2] << 16); + 3016: 49 2b or r20, r25 + *Value |= ((uint32_t) Block[3] << 24); + 3018: 13 96 adiw r26, 0x03 ; 3 + 301a: 9c 91 ld r25, X + 301c: 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); + 301e: 90 e0 ldi r25, 0x00 ; 0 + 3020: a0 e0 ldi r26, 0x00 ; 0 + 3022: b0 e0 ldi r27, 0x00 ; 0 + 3024: dc 01 movw r26, r24 + 3026: 99 27 eor r25, r25 + 3028: 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); + 302a: 9e 2b or r25, r30 + *Value |= ((uint32_t) Block[2] << 16); + 302c: 82 2b or r24, r18 + *Value |= ((uint32_t) Block[3] << 24); + 302e: b3 2b or r27, r19 + uint32_t BlockValue; + + ValueFromBlock(&ParamValue, Buffer); + ValueFromBlock(&BlockValue, BlockBuffer); + + if (State == STATE_DECREMENT) { + 3030: 20 91 d1 24 lds r18, 0x24D1 + 3034: 28 30 cpi r18, 0x08 ; 8 + 3036: 09 f4 brne .+2 ; 0x303a <__stack+0x3b> + 3038: 6f c0 rjmp .+222 ; 0x3118 <__stack+0x119> + BlockValue -= ParamValue; + } else if (State == STATE_INCREMENT) { + 303a: 27 30 cpi r18, 0x07 ; 7 + 303c: 21 f4 brne .+8 ; 0x3046 <__stack+0x47> + BlockValue += ParamValue; + 303e: 84 0f add r24, r20 + 3040: 95 1f adc r25, r21 + 3042: a6 1f adc r26, r22 + 3044: 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); + 3046: 80 93 b8 24 sts 0x24B8, r24 + Block[1] = (uint8_t) (Value >> 8); + 304a: c9 2e mov r12, r25 + 304c: da 2e mov r13, r26 + 304e: eb 2e mov r14, r27 + 3050: ff 24 eor r15, r15 + 3052: c0 92 b9 24 sts 0x24B9, r12 + Block[2] = (uint8_t) (Value >> 16); + 3056: 8d 01 movw r16, r26 + 3058: 22 27 eor r18, r18 + 305a: 33 27 eor r19, r19 + 305c: 00 93 ba 24 sts 0x24BA, r16 + Block[3] = (uint8_t) (Value >> 24); + 3060: 4b 2f mov r20, r27 + 3062: 55 27 eor r21, r21 + 3064: 66 27 eor r22, r22 + 3066: 77 27 eor r23, r23 + 3068: 40 93 bb 24 sts 0x24BB, r20 + Block[4] = ~Block[0]; + 306c: e8 2f mov r30, r24 + 306e: e0 95 com r30 + 3070: e0 93 bc 24 sts 0x24BC, r30 + Block[5] = ~Block[1]; + 3074: ec 2d mov r30, r12 + 3076: e0 95 com r30 + 3078: e0 93 bd 24 sts 0x24BD, r30 + Block[6] = ~Block[2]; + 307c: e0 2f mov r30, r16 + 307e: e0 95 com r30 + 3080: e0 93 be 24 sts 0x24BE, r30 + Block[7] = ~Block[3]; + 3084: e4 2f mov r30, r20 + 3086: e0 95 com r30 + 3088: e0 93 bf 24 sts 0x24BF, r30 + Block[8] = Block[0]; + 308c: 80 93 c0 24 sts 0x24C0, r24 + Block[9] = Block[1]; + 3090: c0 92 c1 24 sts 0x24C1, r12 + Block[10] = Block[2]; + 3094: 00 93 c2 24 sts 0x24C2, r16 + Block[11] = Block[3]; + 3098: 40 93 c3 24 sts 0x24C3, r20 + /* Do nothing */ + } + + ValueToBlock(BlockBuffer, BlockValue); + + State = STATE_AUTHED_IDLE; + 309c: 85 e0 ldi r24, 0x05 ; 5 + 309e: 80 93 d1 24 sts 0x24D1, r24 + /* No ACK response on value commands part 2 */ + return ISO14443A_APP_NO_RESPONSE; + 30a2: 80 e0 ldi r24, 0x00 ; 0 + 30a4: 90 e0 ldi r25, 0x00 ; 0 + 30a6: db cc rjmp .-1610 ; 0x2a5e + } 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)) { + 30a8: 62 e0 ldi r22, 0x02 ; 2 + 30aa: 70 e0 ldi r23, 0x00 ; 0 + 30ac: c8 01 movw r24, r16 + 30ae: e3 d0 rcall .+454 ; 0x3276 + 30b0: 88 23 and r24, r24 + 30b2: 09 f4 brne .+2 ; 0x30b6 <__stack+0xb7> + 30b4: fc ce rjmp .-520 ; 0x2eae + CurrentAddress = Buffer[1]; + 30b6: d8 01 movw r26, r16 + 30b8: 11 96 adiw r26, 0x01 ; 1 + 30ba: 8c 91 ld r24, X + 30bc: 80 93 c8 24 sts 0x24C8, r24 + State = STATE_INCREMENT; + 30c0: 87 e0 ldi r24, 0x07 ; 7 + 30c2: 4f cf rjmp .-354 ; 0x2f62 + } 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)) { + 30c4: 62 e0 ldi r22, 0x02 ; 2 + 30c6: 70 e0 ldi r23, 0x00 ; 0 + 30c8: c8 01 movw r24, r16 + 30ca: d5 d0 rcall .+426 ; 0x3276 + 30cc: 88 23 and r24, r24 + 30ce: 09 f4 brne .+2 ; 0x30d2 <__stack+0xd3> + 30d0: fc ce rjmp .-520 ; 0x2eca + CurrentAddress = Buffer[1]; + 30d2: f8 01 movw r30, r16 + 30d4: 81 81 ldd r24, Z+1 ; 0x01 + 30d6: 80 93 c8 24 sts 0x24C8, r24 + State = STATE_RESTORE; + 30da: 89 e0 ldi r24, 0x09 ; 9 + 30dc: 80 93 d1 24 sts 0x24D1, r24 + Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); + 30e0: 85 d2 rcall .+1290 ; 0x35ec + 30e2: 9a e0 ldi r25, 0x0A ; 10 + 30e4: e6 ce rjmp .-564 ; 0x2eb2 + 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)) { + 30e6: 62 e0 ldi r22, 0x02 ; 2 + 30e8: 70 e0 ldi r23, 0x00 ; 0 + 30ea: c8 01 movw r24, r16 + 30ec: c4 d0 rcall .+392 ; 0x3276 + 30ee: 88 23 and r24, r24 + 30f0: 09 f4 brne .+2 ; 0x30f4 <__stack+0xf5> + 30f2: dd ce rjmp .-582 ; 0x2eae + if (!ActiveConfiguration.ReadOnly) { + 30f4: 80 91 fc 24 lds r24, 0x24FC + 30f8: 81 11 cpse r24, r1 + 30fa: 35 cf rjmp .-406 ; 0x2f66 + MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); + 30fc: d8 01 movw r26, r16 + 30fe: 11 96 adiw r26, 0x01 ; 1 + 3100: 6c 91 ld r22, X + 3102: b0 e1 ldi r27, 0x10 ; 16 + 3104: 6b 9f mul r22, r27 + 3106: b0 01 movw r22, r0 + 3108: 11 24 eor r1, r1 + 310a: 40 e1 ldi r20, 0x10 ; 16 + 310c: 50 e0 ldi r21, 0x00 ; 0 + 310e: 88 eb ldi r24, 0xB8 ; 184 + 3110: 94 e2 ldi r25, 0x24 ; 36 + 3112: 0e 94 ec 05 call 0xbd8 ; 0xbd8 + 3116: 27 cf rjmp .-434 ; 0x2f66 + + ValueFromBlock(&ParamValue, Buffer); + ValueFromBlock(&BlockValue, BlockBuffer); + + if (State == STATE_DECREMENT) { + BlockValue -= ParamValue; + 3118: 84 1b sub r24, r20 + 311a: 95 0b sbc r25, r21 + 311c: a6 0b sbc r26, r22 + 311e: b7 0b sbc r27, r23 + 3120: 92 cf rjmp .-220 ; 0x3046 <__stack+0x47> + 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)) { + 3122: 62 e0 ldi r22, 0x02 ; 2 + 3124: 70 e0 ldi r23, 0x00 ; 0 + 3126: c8 01 movw r24, r16 + 3128: a6 d0 rcall .+332 ; 0x3276 + 312a: 81 11 cpse r24, r1 + 312c: 0b cd rjmp .-1514 ; 0x2b44 + /* 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; + 312e: 81 e0 ldi r24, 0x01 ; 1 + 3130: d8 01 movw r26, r16 + 3132: 8c 93 st X, r24 + return ACK_NAK_FRAME_SIZE; + 3134: 84 e0 ldi r24, 0x04 ; 4 + 3136: 90 e0 ldi r25, 0x00 ; 0 + 3138: 92 cc rjmp .-1756 ; 0x2a5e + Buffer[i] ^= Crypto1Byte(); + + 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); + 313a: f8 01 movw r30, r16 + 313c: 61 81 ldd r22, Z+1 ; 0x01 + 313e: f0 e1 ldi r31, 0x10 ; 16 + 3140: 6f 9f mul r22, r31 + 3142: b0 01 movw r22, r0 + 3144: 11 24 eor r1, r1 + 3146: 40 e1 ldi r20, 0x10 ; 16 + 3148: 50 e0 ldi r21, 0x00 ; 0 + 314a: c8 01 movw r24, r16 + 314c: 0e 94 d4 05 call 0xba8 ; 0xba8 + ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); + 3150: 60 e1 ldi r22, 0x10 ; 16 + 3152: 70 e0 ldi r23, 0x00 ; 0 + 3154: c8 01 movw r24, r16 + 3156: 61 d0 rcall .+194 ; 0x321a + 3158: 78 01 movw r14, r16 + 315a: 30 e8 ldi r19, 0x80 ; 128 + 315c: e3 0e add r14, r19 + 315e: f1 1c adc r15, r1 + 3160: 62 e1 ldi r22, 0x12 ; 18 + 3162: a6 2e mov r10, r22 + + /* Encrypt and calculate parity bits. */ + for (uint8_t i=0; i<(ISO14443A_CRCA_SIZE + MEM_BYTES_PER_BLOCK); i++) { + uint8_t Plain = Buffer[i]; + 3164: d8 01 movw r26, r16 + 3166: bc 90 ld r11, X + Buffer[i] = Plain ^ Crypto1Byte(); + 3168: 2e d2 rcall .+1116 ; 0x35c6 + 316a: 8b 25 eor r24, r11 + 316c: f8 01 movw r30, r16 + 316e: 81 93 st Z+, r24 + 3170: 8f 01 movw r16, r30 + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); + 3172: 0b 2c mov r0, r11 + 3174: b2 94 swap r11 + 3176: b0 24 eor r11, r0 + 3178: 0b 2c mov r0, r11 + 317a: b6 94 lsr r11 + 317c: b6 94 lsr r11 + 317e: b0 24 eor r11, r0 + 3180: fe d0 rcall .+508 ; 0x337e + 3182: b3 94 inc r11 + 3184: b1 fa bst r11, 1 + 3186: cc 24 eor r12, r12 + 3188: c0 f8 bld r12, 0 + 318a: d1 2c mov r13, r1 + 318c: f1 e0 ldi r31, 0x01 ; 1 + 318e: cf 26 eor r12, r31 + 3190: 8c 25 eor r24, r12 + 3192: d7 01 movw r26, r14 + 3194: 8d 93 st X+, r24 + 3196: 7d 01 movw r14, r26 + 3198: 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++) { + 319a: 21 f7 brne .-56 ; 0x3164 <__stack+0x165> + 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 ) + 319c: 80 e9 ldi r24, 0x90 ; 144 + 319e: 90 e1 ldi r25, 0x10 ; 16 + 31a0: 5e cc rjmp .-1860 ; 0x2a5e + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + 31a2: 89 81 ldd r24, Y+1 ; 0x01 + 31a4: f8 01 movw r30, r16 + 31a6: 80 83 st Z, r24 + DataPtr[1] = UidCL[1]; + 31a8: 3a 81 ldd r19, Y+2 ; 0x02 + 31aa: 31 83 std Z+1, r19 ; 0x01 + DataPtr[2] = UidCL[2]; + 31ac: 2b 81 ldd r18, Y+3 ; 0x03 + 31ae: 22 83 std Z+2, r18 ; 0x02 + DataPtr[3] = UidCL[3]; + 31b0: 9c 81 ldd r25, Y+4 ; 0x04 + 31b2: 93 83 std Z+3, r25 ; 0x03 + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + 31b4: 83 27 eor r24, r19 + 31b6: 82 27 eor r24, r18 + 31b8: 89 27 eor r24, r25 + 31ba: 84 83 std Z+4, r24 ; 0x04 + + *BitCount = ISO14443A_CL_FRAME_SIZE; + 31bc: 88 e2 ldi r24, 0x28 ; 40 + 31be: 90 e0 ldi r25, 0x00 ; 0 + 31c0: 4e cc rjmp .-1892 ; 0x2a5e + 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); + 31c2: 60 e3 ldi r22, 0x30 ; 48 + 31c4: 70 e0 ldi r23, 0x00 ; 0 + 31c6: 14 cd rjmp .-1496 ; 0x2bf0 + 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); + 31c8: 80 e3 ldi r24, 0x30 ; 48 + 31ca: 90 e0 ldi r25, 0x00 ; 0 + 31cc: ae cd rjmp .-1188 ; 0x2d2a + +000031ce : + return ISO14443A_APP_NO_RESPONSE; +} + +void MifareClassicGetUid(ConfigurationUidType Uid) +{ + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 31ce: 44 e0 ldi r20, 0x04 ; 4 + 31d0: 50 e0 ldi r21, 0x00 ; 0 + 31d2: 60 e0 ldi r22, 0x00 ; 0 + 31d4: 70 e0 ldi r23, 0x00 ; 0 + 31d6: 0c 94 d4 05 jmp 0xba8 ; 0xba8 + +000031da : +} + +void MifareClassicSetUid(ConfigurationUidType Uid) +{ + 31da: cf 93 push r28 + 31dc: df 93 push r29 + 31de: 1f 92 push r1 + 31e0: cd b7 in r28, 0x3d ; 61 + 31e2: de b7 in r29, 0x3e ; 62 + uint8_t BCC = Uid[0] ^ Uid[1] ^ Uid[2] ^ Uid[3]; + 31e4: fc 01 movw r30, r24 + 31e6: 21 81 ldd r18, Z+1 ; 0x01 + 31e8: 30 81 ld r19, Z + 31ea: 23 27 eor r18, r19 + 31ec: 32 81 ldd r19, Z+2 ; 0x02 + 31ee: 23 27 eor r18, r19 + 31f0: 33 81 ldd r19, Z+3 ; 0x03 + 31f2: 23 27 eor r18, r19 + 31f4: 29 83 std Y+1, r18 ; 0x01 + + MemoryWriteBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + 31f6: 44 e0 ldi r20, 0x04 ; 4 + 31f8: 50 e0 ldi r21, 0x00 ; 0 + 31fa: 60 e0 ldi r22, 0x00 ; 0 + 31fc: 70 e0 ldi r23, 0x00 ; 0 + 31fe: 0e 94 ec 05 call 0xbd8 ; 0xbd8 + MemoryWriteBlock(&BCC, MEM_UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); + 3202: 41 e0 ldi r20, 0x01 ; 1 + 3204: 50 e0 ldi r21, 0x00 ; 0 + 3206: 64 e0 ldi r22, 0x04 ; 4 + 3208: 70 e0 ldi r23, 0x00 ; 0 + 320a: ce 01 movw r24, r28 + 320c: 01 96 adiw r24, 0x01 ; 1 + 320e: 0e 94 ec 05 call 0xbd8 ; 0xbd8 +} + 3212: 0f 90 pop r0 + 3214: df 91 pop r29 + 3216: cf 91 pop r28 + 3218: 08 95 ret + +0000321a : + * policies, either expressed or implied, of the ORIGINAL AUTHORS. + */ + +#include "ISO14443-3A.h" + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { + 321a: fc 01 movw r30, r24 + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 321c: 61 15 cp r22, r1 + 321e: 71 05 cpc r23, r1 + 3220: 39 f1 breq .+78 ; 0x3270 + 3222: 68 0f add r22, r24 + 3224: 79 1f adc r23, r25 + */ + +#include "ISO14443-3A.h" + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { + uint16_t Checksum = 0x6363; + 3226: 23 e6 ldi r18, 0x63 ; 99 + 3228: 33 e6 ldi r19, 0x63 ; 99 + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + uint8_t Byte = *DataPtr++; + 322a: 41 91 ld r20, Z+ + + Byte ^= (uint8_t) (Checksum & 0x00FF); + 322c: 42 27 eor r20, r18 + Byte ^= Byte << 4; + 322e: 50 e1 ldi r21, 0x10 ; 16 + 3230: 45 9f mul r20, r21 + 3232: c0 01 movw r24, r0 + 3234: 11 24 eor r1, r1 + 3236: a4 2f mov r26, r20 + 3238: a8 27 eor r26, r24 + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 323a: 8a 2f mov r24, r26 + 323c: 90 e0 ldi r25, 0x00 ; 0 + 323e: 58 2f mov r21, r24 + 3240: 44 27 eor r20, r20 + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + 3242: 88 0f add r24, r24 + 3244: 99 1f adc r25, r25 + 3246: 88 0f add r24, r24 + 3248: 99 1f adc r25, r25 + 324a: 88 0f add r24, r24 + 324c: 99 1f adc r25, r25 + uint8_t Byte = *DataPtr++; + + Byte ^= (uint8_t) (Checksum & 0x00FF); + Byte ^= Byte << 4; + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 324e: 48 27 eor r20, r24 + 3250: 59 27 eor r21, r25 + 3252: 23 2f mov r18, r19 + 3254: 33 27 eor r19, r19 + 3256: 24 27 eor r18, r20 + 3258: 35 27 eor r19, r21 + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + 325a: a2 95 swap r26 + 325c: 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 ) ^ + 325e: 2a 27 eor r18, r26 + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 3260: e6 17 cp r30, r22 + 3262: f7 07 cpc r31, r23 + 3264: 11 f7 brne .-60 ; 0x322a + 3266: 92 2f mov r25, r18 + 3268: 83 2f mov r24, r19 + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + } + + *DataPtr++ = (Checksum >> 0) & 0x00FF; + 326a: 90 83 st Z, r25 + *DataPtr = (Checksum >> 8) & 0x00FF; + 326c: 81 83 std Z+1, r24 ; 0x01 + 326e: 08 95 ret + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 3270: 83 e6 ldi r24, 0x63 ; 99 + 3272: 93 e6 ldi r25, 0x63 ; 99 + 3274: fa cf rjmp .-12 ; 0x326a + +00003276 : + *DataPtr++ = (Checksum >> 0) & 0x00FF; + *DataPtr = (Checksum >> 8) & 0x00FF; +} + +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + 3276: fc 01 movw r30, r24 + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 3278: 61 15 cp r22, r1 + 327a: 71 05 cpc r23, r1 + 327c: a9 f1 breq .+106 ; 0x32e8 + 327e: 68 0f add r22, r24 + 3280: 79 1f adc r23, r25 + *DataPtr = (Checksum >> 8) & 0x00FF; +} + +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + 3282: 23 e6 ldi r18, 0x63 ; 99 + 3284: 33 e6 ldi r19, 0x63 ; 99 + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + uint8_t Byte = *DataPtr++; + 3286: 41 91 ld r20, Z+ + + Byte ^= (uint8_t) (Checksum & 0x00FF); + 3288: 42 27 eor r20, r18 + Byte ^= Byte << 4; + 328a: 50 e1 ldi r21, 0x10 ; 16 + 328c: 45 9f mul r20, r21 + 328e: c0 01 movw r24, r0 + 3290: 11 24 eor r1, r1 + 3292: a4 2f mov r26, r20 + 3294: a8 27 eor r26, r24 + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 3296: 8a 2f mov r24, r26 + 3298: 90 e0 ldi r25, 0x00 ; 0 + 329a: 58 2f mov r21, r24 + 329c: 44 27 eor r20, r20 + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + 329e: 88 0f add r24, r24 + 32a0: 99 1f adc r25, r25 + 32a2: 88 0f add r24, r24 + 32a4: 99 1f adc r25, r25 + 32a6: 88 0f add r24, r24 + 32a8: 99 1f adc r25, r25 + uint8_t Byte = *DataPtr++; + + Byte ^= (uint8_t) (Checksum & 0x00FF); + Byte ^= Byte << 4; + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + 32aa: 48 27 eor r20, r24 + 32ac: 59 27 eor r21, r25 + 32ae: 23 2f mov r18, r19 + 32b0: 33 27 eor r19, r19 + 32b2: 24 27 eor r18, r20 + 32b4: 35 27 eor r19, r21 + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + 32b6: a2 95 swap r26 + 32b8: 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 ) ^ + 32ba: 2a 27 eor r18, r26 +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 32bc: e6 17 cp r30, r22 + 32be: f7 07 cpc r31, r23 + 32c0: 11 f7 brne .-60 ; 0x3286 + 32c2: a9 01 movw r20, r18 + 32c4: 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)); + 32c6: 80 81 ld r24, Z + 32c8: 90 e0 ldi r25, 0x00 ; 0 + 32ca: 84 17 cp r24, r20 + 32cc: 95 07 cpc r25, r21 + 32ce: 11 f0 breq .+4 ; 0x32d4 + 32d0: 80 e0 ldi r24, 0x00 ; 0 +} + 32d2: 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)); + 32d4: 41 81 ldd r20, Z+1 ; 0x01 + 32d6: 50 e0 ldi r21, 0x00 ; 0 + 32d8: 23 2f mov r18, r19 + 32da: 33 27 eor r19, r19 + 32dc: 81 e0 ldi r24, 0x01 ; 1 + 32de: 42 17 cp r20, r18 + 32e0: 53 07 cpc r21, r19 + 32e2: b9 f3 breq .-18 ; 0x32d2 + 32e4: 80 e0 ldi r24, 0x00 ; 0 + 32e6: f5 cf rjmp .-22 ; 0x32d2 +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + 32e8: 43 e6 ldi r20, 0x63 ; 99 + 32ea: 50 e0 ldi r21, 0x00 ; 0 + *DataPtr = (Checksum >> 8) & 0x00FF; +} + +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + 32ec: 23 e6 ldi r18, 0x63 ; 99 + 32ee: 33 e6 ldi r19, 0x63 ; 99 + 32f0: ea cf rjmp .-44 ; 0x32c6 + +000032f2 : +/* 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) { + 32f2: 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); + 32f4: b0 91 d5 24 lds r27, 0x24D5 + Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); + 32f8: c0 91 d6 24 lds r28, 0x24D6 + Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); + 32fc: 40 91 d7 24 lds r20, 0x24D7 + + Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); + 3300: a0 91 d2 24 lds r26, 0x24D2 + Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); + 3304: f0 91 d3 24 lds r31, 0x24D3 + Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); + 3308: e0 91 d4 24 lds r30, 0x24D4 + 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); + 330c: 9c 2f mov r25, r28 + 330e: 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); + 3310: 2b 2f mov r18, r27 + 3312: 21 7e andi r18, 0xE1 ; 225 + Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); + 3314: 92 27 eor r25, r18 + Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); + 3316: 24 2f mov r18, r20 + 3318: 20 72 andi r18, 0x20 ; 32 + 331a: 92 27 eor r25, r18 + + Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); + 331c: 2a 2f mov r18, r26 + 331e: 24 79 andi r18, 0x94 ; 148 + 3320: 92 27 eor r25, r18 + Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); + 3322: 2f 2f mov r18, r31 + 3324: 23 77 andi r18, 0x73 ; 115 + 3326: 92 27 eor r25, r18 + Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); + 3328: 2e 2f mov r18, r30 + 332a: 2a 73 andi r18, 0x3A ; 58 + 332c: 92 27 eor r25, r18 + + Feedback ^= Feedback >> 4; + 332e: 39 2f mov r19, r25 + 3330: 32 95 swap r19 + 3332: 3f 70 andi r19, 0x0F ; 15 + 3334: 39 27 eor r19, r25 + Feedback ^= Feedback >> 2; + 3336: 23 2f mov r18, r19 + 3338: 26 95 lsr r18 + 333a: 26 95 lsr r18 + 333c: 23 27 eor r18, r19 + Feedback ^= Feedback >> 1; + 333e: 92 2f mov r25, r18 + 3340: 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); + 3342: 50 e0 ldi r21, 0x00 ; 0 + 3344: 60 e0 ldi r22, 0x00 ; 0 + 3346: 70 e0 ldi r23, 0x00 ; 0 + 3348: ba 01 movw r22, r20 + 334a: 55 27 eor r21, r21 + 334c: 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); + 334e: 5c 2b or r21, r28 + Temp |= ((uint32_t) StateEven[2] << 16); + 3350: 4b 2b or r20, r27 + + /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ + Temp = (Temp >> 1) & 0x00FFFFFF; + 3352: 76 95 lsr r23 + 3354: 67 95 ror r22 + 3356: 57 95 ror r21 + 3358: 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; + 335a: 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 ) { + 335c: 91 70 andi r25, 0x01 ; 1 + 335e: 98 13 cpse r25, r24 + Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); + 3360: 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]; + 3362: a0 93 d5 24 sts 0x24D5, r26 + StateEven[1] = StateOdd[1]; + 3366: f0 93 d6 24 sts 0x24D6, r31 + StateEven[2] = StateOdd[2]; + 336a: e0 93 d7 24 sts 0x24D7, r30 + + StateOdd[0] = (uint8_t) (Temp >> 0); + 336e: 40 93 d2 24 sts 0x24D2, r20 + StateOdd[1] = (uint8_t) (Temp >> 8); + 3372: 50 93 d3 24 sts 0x24D3, r21 + StateOdd[2] = (uint8_t) (Temp >> 16); + 3376: 60 93 d4 24 sts 0x24D4, r22 +} + 337a: cf 91 pop r28 + 337c: 08 95 ret + +0000337e : + +uint8_t Crypto1FilterOutput(void) { + 337e: cf 93 push r28 + 3380: 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]; + 3382: a0 91 d3 24 lds r26, 0x24D3 + 3386: ea 2f mov r30, r26 + 3388: ef 70 andi r30, 0x0F ; 15 + 338a: f0 e0 ldi r31, 0x00 ; 0 + 338c: e0 5c subi r30, 0xC0 ; 192 + 338e: 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]; + 3390: c0 91 d2 24 lds r28, 0x24D2 + 3394: c2 95 swap r28 + 3396: cf 70 andi r28, 0x0F ; 15 + 3398: d0 e0 ldi r29, 0x00 ; 0 + 339a: c0 5c subi r28, 0xC0 ; 192 + 339c: df 4d sbci r29, 0xDF ; 223 + Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; + 339e: e0 89 ldd r30, Z+16 ; 0x10 + 33a0: 88 81 ld r24, Y + 33a2: e8 2b or r30, r24 + Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; + 33a4: a2 95 swap r26 + 33a6: af 70 andi r26, 0x0F ; 15 + 33a8: b0 e0 ldi r27, 0x00 ; 0 + 33aa: a0 5c subi r26, 0xC0 ; 192 + 33ac: bf 4d sbci r27, 0xDF ; 223 + 33ae: 90 96 adiw r26, 0x20 ; 32 + 33b0: 8c 91 ld r24, X + 33b2: e8 2b or r30, r24 + Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; + 33b4: a0 91 d4 24 lds r26, 0x24D4 + 33b8: ca 2f mov r28, r26 + 33ba: cf 70 andi r28, 0x0F ; 15 + 33bc: d0 e0 ldi r29, 0x00 ; 0 + 33be: c0 5c subi r28, 0xC0 ; 192 + 33c0: df 4d sbci r29, 0xDF ; 223 + 33c2: 88 a9 ldd r24, Y+48 ; 0x30 + 33c4: e8 2b or r30, r24 + Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; + 33c6: a2 95 swap r26 + 33c8: af 70 andi r26, 0x0F ; 15 + 33ca: b0 e0 ldi r27, 0x00 ; 0 + 33cc: a0 58 subi r26, 0x80 ; 128 + 33ce: bf 4d sbci r27, 0xDF ; 223 + 33d0: 8c 91 ld r24, X + 33d2: e8 2b or r30, r24 + + return TableC[Sum]; + 33d4: f0 e0 ldi r31, 0x00 ; 0 + 33d6: e0 5e subi r30, 0xE0 ; 224 + 33d8: ff 4d sbci r31, 0xDF ; 223 +} + 33da: 80 81 ld r24, Z + 33dc: df 91 pop r29 + 33de: cf 91 pop r28 + 33e0: 08 95 ret + +000033e2 : + +void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) +{ + 33e2: af 92 push r10 + 33e4: bf 92 push r11 + 33e6: cf 92 push r12 + 33e8: df 92 push r13 + 33ea: ef 92 push r14 + 33ec: ff 92 push r15 + 33ee: 0f 93 push r16 + 33f0: 1f 93 push r17 + 33f2: cf 93 push r28 + 33f4: df 93 push r29 + 33f6: 5b 01 movw r10, r22 + 33f8: ea 01 movw r28, r20 + 33fa: dc 01 movw r26, r24 + 33fc: 11 96 adiw r26, 0x01 ; 1 + 33fe: 45 ed ldi r20, 0xD5 ; 213 + 3400: 54 e2 ldi r21, 0x24 ; 36 + 3402: 62 ed ldi r22, 0xD2 ; 210 + 3404: 74 e2 ldi r23, 0x24 ; 36 + 3406: cd 01 movw r24, r26 + 3408: 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]; + 340a: fc 01 movw r30, r24 + 340c: 20 81 ld r18, Z + 340e: 8c 91 ld r24, X + 3410: 30 e0 ldi r19, 0x00 ; 0 + 3412: 38 2b or r19, r24 + 3414: 20 ff sbrs r18, 0 + 3416: b0 c0 rjmp .+352 ; 0x3578 + 3418: 00 e4 ldi r16, 0x40 ; 64 + 341a: 21 ff sbrs r18, 1 + 341c: ab c0 rjmp .+342 ; 0x3574 + 341e: 10 e4 ldi r17, 0x40 ; 64 + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + } + + KeyWord >>= 2; + 3420: c9 01 movw r24, r18 + 3422: 96 95 lsr r25 + 3424: 87 95 ror r24 + 3426: 96 95 lsr r25 + 3428: 87 95 ror r24 + for (j=0; j<8; j++) { + EvenByte >>= 1; + OddByte >>= 1; + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 342a: 30 2f mov r19, r16 + 342c: 30 68 ori r19, 0x80 ; 128 + 342e: 80 ff sbrs r24, 0 + 3430: 30 2f mov r19, r16 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 3432: 21 2f mov r18, r17 + 3434: 20 68 ori r18, 0x80 ; 128 + 3436: 81 ff sbrs r24, 1 + 3438: 21 2f mov r18, r17 + } + + KeyWord >>= 2; + 343a: 96 95 lsr r25 + 343c: 87 95 ror r24 + 343e: 96 95 lsr r25 + 3440: 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; + 3442: 36 95 lsr r19 + OddByte >>= 1; + 3444: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 3446: 13 2f mov r17, r19 + 3448: 10 68 ori r17, 0x80 ; 128 + 344a: 80 fd sbrc r24, 0 + 344c: 31 2f mov r19, r17 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 344e: 12 2f mov r17, r18 + 3450: 10 68 ori r17, 0x80 ; 128 + 3452: 81 fd sbrc r24, 1 + 3454: 21 2f mov r18, r17 + } + + KeyWord >>= 2; + 3456: 96 95 lsr r25 + 3458: 87 95 ror r24 + 345a: 96 95 lsr r25 + 345c: 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; + 345e: 36 95 lsr r19 + OddByte >>= 1; + 3460: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 3462: 13 2f mov r17, r19 + 3464: 10 68 ori r17, 0x80 ; 128 + 3466: 80 fd sbrc r24, 0 + 3468: 31 2f mov r19, r17 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 346a: 12 2f mov r17, r18 + 346c: 10 68 ori r17, 0x80 ; 128 + 346e: 81 fd sbrc r24, 1 + 3470: 21 2f mov r18, r17 + } + + KeyWord >>= 2; + 3472: 96 95 lsr r25 + 3474: 87 95 ror r24 + 3476: 96 95 lsr r25 + 3478: 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; + 347a: 36 95 lsr r19 + OddByte >>= 1; + 347c: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 347e: 13 2f mov r17, r19 + 3480: 10 68 ori r17, 0x80 ; 128 + 3482: 80 fd sbrc r24, 0 + 3484: 31 2f mov r19, r17 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 3486: 12 2f mov r17, r18 + 3488: 10 68 ori r17, 0x80 ; 128 + 348a: 81 fd sbrc r24, 1 + 348c: 21 2f mov r18, r17 + } + + KeyWord >>= 2; + 348e: 96 95 lsr r25 + 3490: 87 95 ror r24 + 3492: 96 95 lsr r25 + 3494: 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; + 3496: 36 95 lsr r19 + OddByte >>= 1; + 3498: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 349a: 13 2f mov r17, r19 + 349c: 10 68 ori r17, 0x80 ; 128 + 349e: 80 fd sbrc r24, 0 + 34a0: 31 2f mov r19, r17 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 34a2: 12 2f mov r17, r18 + 34a4: 10 68 ori r17, 0x80 ; 128 + 34a6: 81 fd sbrc r24, 1 + 34a8: 21 2f mov r18, r17 + } + + KeyWord >>= 2; + 34aa: 96 95 lsr r25 + 34ac: 87 95 ror r24 + 34ae: 96 95 lsr r25 + 34b0: 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; + 34b2: 36 95 lsr r19 + OddByte >>= 1; + 34b4: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 34b6: 13 2f mov r17, r19 + 34b8: 10 68 ori r17, 0x80 ; 128 + 34ba: 80 fd sbrc r24, 0 + 34bc: 31 2f mov r19, r17 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 34be: 12 2f mov r17, r18 + 34c0: 10 68 ori r17, 0x80 ; 128 + 34c2: 81 fd sbrc r24, 1 + 34c4: 21 2f mov r18, r17 + } + + KeyWord >>= 2; + 34c6: 96 95 lsr r25 + 34c8: 87 95 ror r24 + 34ca: 96 95 lsr r25 + 34cc: 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; + 34ce: 36 95 lsr r19 + OddByte >>= 1; + 34d0: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 34d2: 03 2f mov r16, r19 + 34d4: 00 68 ori r16, 0x80 ; 128 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 34d6: 12 2f mov r17, r18 + 34d8: 10 68 ori r17, 0x80 ; 128 + 34da: 80 fd sbrc r24, 0 + 34dc: 30 2f mov r19, r16 + } + + KeyWord >>= 2; + } + + StateEven[i] = EvenByte; + 34de: fa 01 movw r30, r20 + 34e0: 31 93 st Z+, r19 + 34e2: af 01 movw r20, r30 + 34e4: 81 fd sbrc r24, 1 + 34e6: 21 2f mov r18, r17 + StateOdd[i] = OddByte; + 34e8: fb 01 movw r30, r22 + 34ea: 21 93 st Z+, r18 + 34ec: bf 01 movw r22, r30 + 34ee: 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++) { + 34f0: f4 e2 ldi r31, 0x24 ; 36 + 34f2: 48 3d cpi r20, 0xD8 ; 216 + 34f4: 5f 07 cpc r21, r31 + 34f6: 09 f0 breq .+2 ; 0x34fa + 34f8: 86 cf rjmp .-244 ; 0x3406 + /* 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; + 34fa: f5 01 movw r30, r10 + 34fc: 81 81 ldd r24, Z+1 ; 0x01 + 34fe: 99 81 ldd r25, Y+1 ; 0x01 + 3500: 89 27 eor r24, r25 + Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; + 3502: c2 80 ldd r12, Z+2 ; 0x02 + 3504: 9a 81 ldd r25, Y+2 ; 0x02 + 3506: c9 26 eor r12, r25 + 3508: d1 2c mov r13, r1 + 350a: e1 2c mov r14, r1 + 350c: f1 2c mov r15, r1 + 350e: 76 01 movw r14, r12 + 3510: dd 24 eor r13, r13 + 3512: 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; + 3514: 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; + 3516: 80 81 ld r24, Z + 3518: 98 81 ld r25, Y + 351a: 89 27 eor r24, r25 + Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; + Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; + 351c: c8 2a or r12, r24 + Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; + 351e: 83 81 ldd r24, Z+3 ; 0x03 + 3520: 9b 81 ldd r25, Y+3 ; 0x03 + 3522: 89 27 eor r24, r25 + 3524: f8 2a or r15, r24 + 3526: 10 e2 ldi r17, 0x20 ; 32 + + for (i=0; i<32; i++) { + uint8_t Out = Crypto1FilterOutput(); + 3528: 2a df rcall .-428 ; 0x337e + 352a: 08 2f mov r16, r24 + + Crypto1LFSR(Temp & 0x01); + 352c: 8c 2d mov r24, r12 + 352e: 81 70 andi r24, 0x01 ; 1 + 3530: e0 de rcall .-576 ; 0x32f2 + Temp >>= 1; + 3532: f6 94 lsr r15 + 3534: e7 94 ror r14 + 3536: d7 94 ror r13 + 3538: c7 94 ror r12 + + /* Store the keystream for later use */ + if (Out) { + 353a: 00 23 and r16, r16 + 353c: 11 f0 breq .+4 ; 0x3542 + Temp |= (uint32_t) 1 << 31; + 353e: 68 94 set + 3540: f7 f8 bld r15, 7 + 3542: 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++) { + 3544: 89 f7 brne .-30 ; 0x3528 + } + + /* 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); + 3546: 88 81 ld r24, Y + 3548: 8c 25 eor r24, r12 + 354a: 88 83 st Y, r24 + CardNonce[1] ^= (uint8_t) (Temp >> 8); + 354c: 89 81 ldd r24, Y+1 ; 0x01 + 354e: 8d 25 eor r24, r13 + 3550: 89 83 std Y+1, r24 ; 0x01 + CardNonce[2] ^= (uint8_t) (Temp >> 16); + 3552: 8a 81 ldd r24, Y+2 ; 0x02 + 3554: 8e 25 eor r24, r14 + 3556: 8a 83 std Y+2, r24 ; 0x02 + CardNonce[3] ^= (uint8_t) (Temp >> 24); + 3558: 8b 81 ldd r24, Y+3 ; 0x03 + 355a: 8f 25 eor r24, r15 + 355c: 8b 83 std Y+3, r24 ; 0x03 +} + 355e: df 91 pop r29 + 3560: cf 91 pop r28 + 3562: 1f 91 pop r17 + 3564: 0f 91 pop r16 + 3566: ff 90 pop r15 + 3568: ef 90 pop r14 + 356a: df 90 pop r13 + 356c: cf 90 pop r12 + 356e: bf 90 pop r11 + 3570: af 90 pop r10 + 3572: 08 95 ret + 3574: 10 e0 ldi r17, 0x00 ; 0 + 3576: 54 cf rjmp .-344 ; 0x3420 + 3578: 00 e0 ldi r16, 0x00 ; 0 + 357a: 4f cf rjmp .-354 ; 0x341a + +0000357c : + +void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) +{ + 357c: cf 92 push r12 + 357e: df 92 push r13 + 3580: ef 92 push r14 + 3582: ff 92 push r15 + 3584: cf 93 push r28 + 3586: 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; + 3588: 81 81 ldd r24, Z+1 ; 0x01 + Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; + 358a: c2 80 ldd r12, Z+2 ; 0x02 + 358c: d1 2c mov r13, r1 + 358e: e1 2c mov r14, r1 + 3590: f1 2c mov r15, r1 + 3592: 76 01 movw r14, r12 + 3594: dd 24 eor r13, r13 + 3596: 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; + 3598: 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; + 359a: 80 81 ld r24, Z + Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; + Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; + 359c: c8 2a or r12, r24 + Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; + 359e: 83 81 ldd r24, Z+3 ; 0x03 + 35a0: f8 2a or r15, r24 + 35a2: 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(); + 35a4: ec de rcall .-552 ; 0x337e + uint8_t Bit = Out ^ (Temp & 0x01); + 35a6: 9c 2d mov r25, r12 + 35a8: 91 70 andi r25, 0x01 ; 1 + + /* Feed back the bit to load the LFSR with the (decrypted) nonce */ + Crypto1LFSR(Bit); + 35aa: 89 27 eor r24, r25 + 35ac: a2 de rcall .-700 ; 0x32f2 + Temp >>= 1; + 35ae: f6 94 lsr r15 + 35b0: e7 94 ror r14 + 35b2: d7 94 ror r13 + 35b4: c7 94 ror r12 + 35b6: 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++) { + 35b8: a9 f7 brne .-22 ; 0x35a4 + + /* Feed back the bit to load the LFSR with the (decrypted) nonce */ + Crypto1LFSR(Bit); + Temp >>= 1; + } +} + 35ba: cf 91 pop r28 + 35bc: ff 90 pop r15 + 35be: ef 90 pop r14 + 35c0: df 90 pop r13 + 35c2: cf 90 pop r12 + 35c4: 08 95 ret + +000035c6 : + +uint8_t Crypto1Byte(void) +{ + 35c6: 1f 93 push r17 + 35c8: cf 93 push r28 + 35ca: df 93 push r29 + 35cc: d8 e0 ldi r29, 0x08 ; 8 + uint8_t KeyStream = 0; + 35ce: 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(); + 35d0: d6 de rcall .-596 ; 0x337e + 35d2: 18 2f mov r17, r24 + Crypto1LFSR(0); + 35d4: 80 e0 ldi r24, 0x00 ; 0 + 35d6: 8d de rcall .-742 ; 0x32f2 + + /* Store keystream bit */ + KeyStream >>= 1; + 35d8: c6 95 lsr r28 + + if (Out) { + 35da: 11 11 cpse r17, r1 + KeyStream |= (1<<7); + 35dc: c0 68 ori r28, 0x80 ; 128 + 35de: d1 50 subi r29, 0x01 ; 1 +{ + uint8_t KeyStream = 0; + uint8_t i; + + /* Generate 8 keystream-bits */ + for (i=0; i<8; i++) { + 35e0: b9 f7 brne .-18 ; 0x35d0 + KeyStream |= (1<<7); + } + } + + return KeyStream; +} + 35e2: 8c 2f mov r24, r28 + 35e4: df 91 pop r29 + 35e6: cf 91 pop r28 + 35e8: 1f 91 pop r17 + 35ea: 08 95 ret + +000035ec : + +uint8_t Crypto1Nibble(void) +{ + 35ec: 1f 93 push r17 + 35ee: cf 93 push r28 + 35f0: df 93 push r29 + 35f2: d4 e0 ldi r29, 0x04 ; 4 + uint8_t KeyStream = 0; + 35f4: 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(); + 35f6: c3 de rcall .-634 ; 0x337e + 35f8: 18 2f mov r17, r24 + Crypto1LFSR(0); + 35fa: 80 e0 ldi r24, 0x00 ; 0 + 35fc: 7a de rcall .-780 ; 0x32f2 + + /* Store keystream bit */ + KeyStream >>= 1; + 35fe: c6 95 lsr r28 + + if (Out) { + 3600: 11 11 cpse r17, r1 + KeyStream |= (1<<3); + 3602: c8 60 ori r28, 0x08 ; 8 + 3604: d1 50 subi r29, 0x01 ; 1 +{ + uint8_t KeyStream = 0; + uint8_t i; + + /* Generate 4 keystream-bits */ + for (i=0; i<4; i++) { + 3606: b9 f7 brne .-18 ; 0x35f6 + KeyStream |= (1<<3); + } + } + + return KeyStream; +} + 3608: 8c 2f mov r24, r28 + 360a: df 91 pop r29 + 360c: cf 91 pop r28 + 360e: 1f 91 pop r17 + 3610: 08 95 ret + +00003612 : + +void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) +{ + 3612: 8f 92 push r8 + 3614: 9f 92 push r9 + 3616: af 92 push r10 + 3618: bf 92 push r11 + 361a: cf 92 push r12 + 361c: df 92 push r13 + 361e: ef 92 push r14 + 3620: ff 92 push r15 + 3622: 0f 93 push r16 + 3624: 1f 93 push r17 + 3626: fc 01 movw r30, r24 + while(ClockCount--) { + 3628: cb 01 movw r24, r22 + 362a: 01 97 sbiw r24, 0x01 ; 1 + 362c: 67 2b or r22, r23 + 362e: b1 f1 breq .+108 ; 0x369c + 3630: b2 81 ldd r27, Z+2 ; 0x02 + 3632: a0 81 ld r26, Z + 3634: 81 80 ldd r8, Z+1 ; 0x01 + 3636: 03 81 ldd r16, Z+3 ; 0x03 + 3638: 02 c0 rjmp .+4 ; 0x363e + 363a: a4 2f mov r26, r20 + 363c: 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); + 363e: 2b 2f mov r18, r27 + 3640: 2d 72 andi r18, 0x2D ; 45 + Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); + + Feedback ^= Feedback >> 4; + 3642: 32 2f mov r19, r18 + 3644: 32 95 swap r19 + 3646: 3f 70 andi r19, 0x0F ; 15 + 3648: 32 27 eor r19, r18 + Feedback ^= Feedback >> 2; + 364a: 23 2f mov r18, r19 + 364c: 26 95 lsr r18 + 364e: 26 95 lsr r18 + 3650: 23 27 eor r18, r19 + Feedback ^= Feedback >> 1; + 3652: 32 2f mov r19, r18 + 3654: 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; + 3656: 40 2f mov r20, r16 + 3658: 50 e0 ldi r21, 0x00 ; 0 + 365a: 60 e0 ldi r22, 0x00 ; 0 + 365c: 70 e0 ldi r23, 0x00 ; 0 + 365e: 74 2f mov r23, r20 + 3660: 66 27 eor r22, r22 + 3662: 55 27 eor r21, r21 + 3664: 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; + 3666: 58 29 or r21, r8 + Temp |= (uint32_t) State[2] << 16; + 3668: 4a 2b or r20, r26 + Temp |= (uint32_t) State[3] << 24; + 366a: 6b 2b or r22, r27 + + /* Cycle LFSR and feed back. */ + Temp >>= 1; + 366c: 76 95 lsr r23 + 366e: 67 95 ror r22 + 3670: 57 95 ror r21 + 3672: 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; + 3674: 32 27 eor r19, r18 + Temp |= (uint32_t) State[3] << 24; + + /* Cycle LFSR and feed back. */ + Temp >>= 1; + + if (Feedback & 0x01) { + 3676: 30 fd sbrc r19, 0 + Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); + 3678: 70 68 ori r23, 0x80 ; 128 + } + + /* Store back state */ + State[0] = (uint8_t) (Temp >> 0); + State[1] = (uint8_t) (Temp >> 8); + 367a: 85 2e mov r8, r21 + 367c: 96 2e mov r9, r22 + 367e: a7 2e mov r10, r23 + 3680: bb 24 eor r11, r11 + State[2] = (uint8_t) (Temp >> 16); + 3682: 6b 01 movw r12, r22 + 3684: ee 24 eor r14, r14 + 3686: ff 24 eor r15, r15 + State[3] = (uint8_t) (Temp >> 24); + 3688: 07 2f mov r16, r23 + 368a: 11 27 eor r17, r17 + 368c: 22 27 eor r18, r18 + 368e: 33 27 eor r19, r19 + return KeyStream; +} + +void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) +{ + while(ClockCount--) { + 3690: 01 97 sbiw r24, 0x01 ; 1 + 3692: 98 f6 brcc .-90 ; 0x363a + 3694: 40 83 st Z, r20 + 3696: 81 82 std Z+1, r8 ; 0x01 + 3698: c2 82 std Z+2, r12 ; 0x02 + 369a: 03 83 std Z+3, r16 ; 0x03 + State[2] = (uint8_t) (Temp >> 16); + State[3] = (uint8_t) (Temp >> 24); + } + + +} + 369c: 1f 91 pop r17 + 369e: 0f 91 pop r16 + 36a0: ff 90 pop r15 + 36a2: ef 90 pop r14 + 36a4: df 90 pop r13 + 36a6: cf 90 pop r12 + 36a8: bf 90 pop r11 + 36aa: af 90 pop r10 + 36ac: 9f 90 pop r9 + 36ae: 8f 90 pop r8 + 36b0: 08 95 ret + +000036b2 : +#if !defined(NO_DEVICE_REMOTE_WAKEUP) +bool USB_Device_RemoteWakeupEnabled; +#endif + +void USB_Device_ProcessControlRequest(void) +{ + 36b2: 0f 93 push r16 + 36b4: 1f 93 push r17 + 36b6: cf 93 push r28 + 36b8: df 93 push r29 + 36ba: cd b7 in r28, 0x3d ; 61 + 36bc: de b7 in r29, 0x3e ; 62 + 36be: ea 97 sbiw r28, 0x3a ; 58 + 36c0: cd bf out 0x3d, r28 ; 61 + 36c2: de bf out 0x3e, r29 ; 62 + 36c4: 05 e1 ldi r16, 0x15 ; 21 + 36c6: 17 e2 ldi r17, 0x27 ; 39 + 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(); + 36c8: f7 d2 rcall .+1518 ; 0x3cb8 + 36ca: f8 01 movw r30, r16 + 36cc: 81 93 st Z+, r24 + 36ce: 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++) + 36d0: f7 e2 ldi r31, 0x27 ; 39 + 36d2: 0d 31 cpi r16, 0x1D ; 29 + 36d4: 1f 07 cpc r17, r31 + 36d6: c1 f7 brne .-16 ; 0x36c8 + *(RequestHeader++) = Endpoint_Read_8(); + #endif + + EVENT_USB_Device_ControlRequest(); + 36d8: 0e 94 10 0d call 0x1a20 ; 0x1a20 + + if (Endpoint_IsSETUPReceived()) + 36dc: 6b d3 rcall .+1750 ; 0x3db4 + 36de: 88 23 and r24, r24 + 36e0: 49 f0 breq .+18 ; 0x36f4 + { + uint8_t bmRequestType = USB_ControlRequest.bmRequestType; + 36e2: 30 91 15 27 lds r19, 0x2715 + + switch (USB_ControlRequest.bRequest) + 36e6: 20 91 16 27 lds r18, 0x2716 + 36ea: 82 2f mov r24, r18 + 36ec: 90 e0 ldi r25, 0x00 ; 0 + 36ee: 8a 30 cpi r24, 0x0A ; 10 + 36f0: 91 05 cpc r25, r1 + 36f2: 68 f0 brcs .+26 ; 0x370e + default: + break; + } + } + + if (Endpoint_IsSETUPReceived()) + 36f4: 5f d3 rcall .+1726 ; 0x3db4 + 36f6: 88 23 and r24, r24 + 36f8: 11 f0 breq .+4 ; 0x36fe + { + Endpoint_ClearSETUP(); + 36fa: 75 d3 rcall .+1770 ; 0x3de6 + Endpoint_StallTransaction(); + 36fc: a0 d3 rcall .+1856 ; 0x3e3e + } +} + 36fe: ea 96 adiw r28, 0x3a ; 58 + 3700: cd bf out 0x3d, r28 ; 61 + 3702: de bf out 0x3e, r29 ; 62 + 3704: df 91 pop r29 + 3706: cf 91 pop r28 + 3708: 1f 91 pop r17 + 370a: 0f 91 pop r16 + 370c: 08 95 ret + + if (Endpoint_IsSETUPReceived()) + { + uint8_t bmRequestType = USB_ControlRequest.bmRequestType; + + switch (USB_ControlRequest.bRequest) + 370e: fc 01 movw r30, r24 + 3710: e4 5e subi r30, 0xE4 ; 228 + 3712: fe 4f sbci r31, 0xFE ; 254 + 3714: de c7 rjmp .+4028 ; 0x46d2 <__tablejump2__> + if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) + USB_Device_GetConfiguration(); + + break; + case REQ_SetConfiguration: + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + 3716: 31 11 cpse r19, r1 + 3718: ed cf rjmp .-38 ; 0x36f4 +} + +static void USB_Device_SetConfiguration(void) +{ + #if defined(FIXED_NUM_CONFIGURATIONS) + if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) + 371a: 80 91 17 27 lds r24, 0x2717 + 371e: 82 30 cpi r24, 0x02 ; 2 + 3720: 48 f7 brcc .-46 ; 0x36f4 + if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) + return; + #endif + #endif + + Endpoint_ClearSETUP(); + 3722: 61 d3 rcall .+1730 ; 0x3de6 + + USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; + 3724: 80 91 17 27 lds r24, 0x2717 + 3728: 80 93 10 27 sts 0x2710, r24 + + Endpoint_ClearStatusStage(); + 372c: 93 d4 rcall .+2342 ; 0x4054 + + if (USB_Device_ConfigurationNumber) + 372e: 80 91 10 27 lds r24, 0x2710 + 3732: 88 23 and r24, r24 + 3734: 09 f4 brne .+2 ; 0x3738 + 3736: d1 c0 rjmp .+418 ; 0x38da + USB_DeviceState = DEVICE_STATE_Configured; + 3738: 84 e0 ldi r24, 0x04 ; 4 + 373a: 80 93 14 27 sts 0x2714, r24 + else + USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; + + EVENT_USB_Device_ConfigurationChanged(); + 373e: 0e 94 0c 0d call 0x1a18 ; 0x1a18 + 3742: d8 cf rjmp .-80 ; 0x36f4 + USB_Device_GetDescriptor(); + } + + break; + case REQ_GetConfiguration: + if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) + 3744: 30 38 cpi r19, 0x80 ; 128 + 3746: b1 f6 brne .-84 ; 0x36f4 + EVENT_USB_Device_ConfigurationChanged(); +} + +static void USB_Device_GetConfiguration(void) +{ + Endpoint_ClearSETUP(); + 3748: 4e d3 rcall .+1692 ; 0x3de6 + + Endpoint_Write_8(USB_Device_ConfigurationNumber); + 374a: 80 91 10 27 lds r24, 0x2710 + 374e: c4 d2 rcall .+1416 ; 0x3cd8 + Endpoint_ClearIN(); + 3750: 8b d2 rcall .+1302 ; 0x3c68 + + Endpoint_ClearStatusStage(); + 3752: 80 d4 rcall .+2304 ; 0x4054 + 3754: cf cf rjmp .-98 ; 0x36f4 + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + USB_Device_SetAddress(); + + break; + case REQ_GetDescriptor: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + 3756: 30 58 subi r19, 0x80 ; 128 + 3758: 32 30 cpi r19, 0x02 ; 2 + 375a: 60 f6 brcc .-104 ; 0x36f4 + !(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)) + 375c: 80 91 17 27 lds r24, 0x2717 + 3760: 90 91 18 27 lds r25, 0x2718 + 3764: 8c 3d cpi r24, 0xDC ; 220 + 3766: e3 e0 ldi r30, 0x03 ; 3 + 3768: 9e 07 cpc r25, r30 + 376a: 09 f4 brne .+2 ; 0x376e + 376c: 88 c0 rjmp .+272 ; 0x387e + USB_Device_GetInternalSerialDescriptor(); + return; + } + #endif + + if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, + 376e: ae 01 movw r20, r28 + 3770: 4f 5f subi r20, 0xFF ; 255 + 3772: 5f 4f sbci r21, 0xFF ; 255 + 3774: 60 91 19 27 lds r22, 0x2719 + 3778: 0e 94 d4 03 call 0x7a8 ; 0x7a8 + 377c: 8c 01 movw r16, r24 + 377e: 00 97 sbiw r24, 0x00 ; 0 + 3780: 09 f4 brne .+2 ; 0x3784 + 3782: b8 cf rjmp .-144 ; 0x36f4 + )) == NO_DESCRIPTOR) + { + return; + } + + Endpoint_ClearSETUP(); + 3784: 30 d3 rcall .+1632 ; 0x3de6 + #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); + 3786: b8 01 movw r22, r16 + 3788: 89 81 ldd r24, Y+1 ; 0x01 + 378a: 9a 81 ldd r25, Y+2 ; 0x02 + 378c: c1 d1 rcall .+898 ; 0x3b10 + Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); + else + Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); + #endif + + Endpoint_ClearOUT(); + 378e: 85 d2 rcall .+1290 ; 0x3c9a + 3790: b1 cf rjmp .-158 ; 0x36f4 + USB_Device_ClearSetFeature(); + } + + break; + case REQ_SetAddress: + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + 3792: 31 11 cpse r19, r1 + 3794: af cf rjmp .-162 ; 0x36f4 + } +} + +static void USB_Device_SetAddress(void) +{ + uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); + 3796: 10 91 17 27 lds r17, 0x2717 + 379a: 1f 77 andi r17, 0x7F ; 127 + + USB_Device_SetDeviceAddress(DeviceAddress); + + Endpoint_ClearSETUP(); + 379c: 24 d3 rcall .+1608 ; 0x3de6 + + Endpoint_ClearStatusStage(); + 379e: 5a d4 rcall .+2228 ; 0x4054 + + while (!(Endpoint_IsINReady())); + 37a0: e4 d2 rcall .+1480 ; 0x3d6a + 37a2: 88 23 and r24, r24 + 37a4: e9 f3 breq .-6 ; 0x37a0 + } + + 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; + 37a6: 10 93 c3 04 sts 0x04C3, r17 + + USB_Device_EnableDeviceAddress(DeviceAddress); + + USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; + 37aa: 11 11 cpse r17, r1 + 37ac: 66 c0 rjmp .+204 ; 0x387a + 37ae: 82 e0 ldi r24, 0x02 ; 2 + 37b0: 80 93 14 27 sts 0x2714, r24 + 37b4: 9f cf rjmp .-194 ; 0x36f4 + } + + break; + case REQ_ClearFeature: + case REQ_SetFeature: + if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || + 37b6: 33 23 and r19, r19 + 37b8: 09 f4 brne .+2 ; 0x37bc + 37ba: 4b c0 rjmp .+150 ; 0x3852 + 37bc: 32 30 cpi r19, 0x02 ; 2 + 37be: 09 f0 breq .+2 ; 0x37c2 + 37c0: 99 cf rjmp .-206 ; 0x36f4 + + break; + #endif + #if !defined(CONTROL_ONLY_DEVICE) + case REQREC_ENDPOINT: + if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) + 37c2: 80 91 17 27 lds r24, 0x2717 + 37c6: 81 11 cpse r24, r1 + 37c8: 24 c0 rjmp .+72 ; 0x3812 + { + uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + 37ca: 10 91 19 27 lds r17, 0x2719 + 37ce: 1f 70 andi r17, 0x0F ; 15 + + if (EndpointIndex == ENDPOINT_CONTROLEP) + 37d0: 09 f4 brne .+2 ; 0x37d4 + 37d2: 90 cf rjmp .-224 ; 0x36f4 + return; + + Endpoint_SelectEndpoint(EndpointIndex); + 37d4: 81 2f mov r24, r17 + 37d6: 90 d2 rcall .+1312 ; 0x3cf8 + + if (Endpoint_IsEnabled()) + { + if (USB_ControlRequest.bRequest == REQ_SetFeature) + 37d8: 80 91 16 27 lds r24, 0x2716 + 37dc: 83 30 cpi r24, 0x03 ; 3 + 37de: 09 f4 brne .+2 ; 0x37e2 + 37e0: 86 c0 rjmp .+268 ; 0x38ee + * \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; + 37e2: a0 91 1f 27 lds r26, 0x271F + 37e6: b0 91 20 27 lds r27, 0x2720 + 37ea: 11 96 adiw r26, 0x01 ; 1 + 37ec: 8c 91 ld r24, X + 37ee: 11 97 sbiw r26, 0x01 ; 1 + 37f0: 8b 7f andi r24, 0xFB ; 251 + 37f2: 11 96 adiw r26, 0x01 ; 1 + 37f4: 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; + 37f6: 24 e8 ldi r18, 0x84 ; 132 + 37f8: 12 9f mul r17, r18 + 37fa: f0 01 movw r30, r0 + 37fc: 11 24 eor r1, r1 + 37fe: ed 59 subi r30, 0x9D ; 157 + 3800: f8 4d sbci r31, 0xD8 ; 216 + 3802: 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; + 3804: e0 91 1f 27 lds r30, 0x271F + 3808: f0 91 20 27 lds r31, 0x2720 + 380c: 80 81 ld r24, Z + 380e: 8e 7f andi r24, 0xFE ; 254 + 3810: 80 83 st Z, r24 + #endif + default: + return; + } + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + 3812: 80 e0 ldi r24, 0x00 ; 0 + 3814: 71 d2 rcall .+1250 ; 0x3cf8 + + Endpoint_ClearSETUP(); + 3816: e7 d2 rcall .+1486 ; 0x3de6 + + Endpoint_ClearStatusStage(); + 3818: 1d d4 rcall .+2106 ; 0x4054 + 381a: 6c cf rjmp .-296 ; 0x36f4 + uint8_t bmRequestType = USB_ControlRequest.bmRequestType; + + switch (USB_ControlRequest.bRequest) + { + case REQ_GetStatus: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + 381c: 30 38 cpi r19, 0x80 ; 128 + 381e: 29 f1 breq .+74 ; 0x386a + 3820: 32 38 cpi r19, 0x82 ; 130 + 3822: 09 f0 breq .+2 ; 0x3826 + 3824: 67 cf rjmp .-306 ; 0x36f4 + 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); + 3826: 80 91 19 27 lds r24, 0x2719 + 382a: 8f 70 andi r24, 0x0F ; 15 + 382c: 65 d2 rcall .+1226 ; 0x3cf8 + * \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); + 382e: e0 91 1f 27 lds r30, 0x271F + 3832: f0 91 20 27 lds r31, 0x2720 + 3836: 11 81 ldd r17, Z+1 ; 0x01 + 3838: 12 fb bst r17, 2 + 383a: 11 27 eor r17, r17 + 383c: 10 f9 bld r17, 0 + + CurrentStatus = Endpoint_IsStalled(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + 383e: 80 e0 ldi r24, 0x00 ; 0 + 3840: 5b d2 rcall .+1206 ; 0x3cf8 + break; + default: + return; + } + + Endpoint_ClearSETUP(); + 3842: d1 d2 rcall .+1442 ; 0x3de6 + * \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); + 3844: 81 2f mov r24, r17 + 3846: 48 d2 rcall .+1168 ; 0x3cd8 + Endpoint_Write_8(Data >> 8); + 3848: 80 e0 ldi r24, 0x00 ; 0 + 384a: 46 d2 rcall .+1164 ; 0x3cd8 + + Endpoint_Write_16_LE(CurrentStatus); + Endpoint_ClearIN(); + 384c: 0d d2 rcall .+1050 ; 0x3c68 + + Endpoint_ClearStatusStage(); + 384e: 02 d4 rcall .+2052 ; 0x4054 + 3850: 51 cf rjmp .-350 ; 0x36f4 +{ + 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) + 3852: 80 91 17 27 lds r24, 0x2717 + 3856: 81 30 cpi r24, 0x01 ; 1 + 3858: 09 f0 breq .+2 ; 0x385c + 385a: 4c cf rjmp .-360 ; 0x36f4 + USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); + 385c: 81 e0 ldi r24, 0x01 ; 1 + 385e: 23 30 cpi r18, 0x03 ; 3 + 3860: 09 f0 breq .+2 ; 0x3864 + 3862: 80 e0 ldi r24, 0x00 ; 0 + 3864: 80 93 12 27 sts 0x2712, r24 + 3868: d4 cf rjmp .-88 ; 0x3812 + Endpoint_ClearOUT(); +} + +static void USB_Device_GetStatus(void) +{ + uint8_t CurrentStatus = 0; + 386a: 10 91 11 27 lds r17, 0x2711 + if (USB_Device_CurrentlySelfPowered) + CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; + #endif + + #if !defined(NO_DEVICE_REMOTE_WAKEUP) + if (USB_Device_RemoteWakeupEnabled) + 386e: 80 91 12 27 lds r24, 0x2712 + 3872: 88 23 and r24, r24 + 3874: 31 f3 breq .-52 ; 0x3842 + CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; + 3876: 12 60 ori r17, 0x02 ; 2 + 3878: e4 cf rjmp .-56 ; 0x3842 + + while (!(Endpoint_IsINReady())); + + USB_Device_EnableDeviceAddress(DeviceAddress); + + USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; + 387a: 83 e0 ldi r24, 0x03 ; 3 + 387c: 99 cf rjmp .-206 ; 0x37b0 + { + USB_Descriptor_Header_t Header; + uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; + } SignatureDescriptor; + + SignatureDescriptor.Header.Type = DTYPE_String; + 387e: 83 e0 ldi r24, 0x03 ; 3 + 3880: 8a 83 std Y+2, r24 ; 0x02 + SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); + 3882: 8a e3 ldi r24, 0x3A ; 58 + 3884: 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; + 3886: 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(); + 3888: f8 94 cli + #endif + + GCC_MEMORY_BARRIER(); + 388a: de 01 movw r26, r28 + 388c: 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++) + 388e: 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; + 3890: 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; + 3892: 42 e0 ldi r20, 0x02 ; 2 + 3894: 07 c0 rjmp .+14 ; 0x38a4 + SigReadAddress++; + } + + SerialByte &= 0x0F; + + UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? + 3896: 90 e0 ldi r25, 0x00 ; 0 + 3898: c7 96 adiw r24, 0x37 ; 55 + 389a: 8d 93 st X+, r24 + 389c: 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++) + 389e: 2f 5f subi r18, 0xFF ; 255 + 38a0: 2c 31 cpi r18, 0x1C ; 28 + 38a2: 91 f0 breq .+36 ; 0x38c8 + { + uint8_t SerialByte; + + NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; + 38a4: 40 93 ca 01 sts 0x01CA, r20 + SerialByte = pgm_read_byte(SigReadAddress); + 38a8: e3 2f mov r30, r19 + 38aa: f0 e0 ldi r31, 0x00 ; 0 + 38ac: 84 91 lpm r24, Z + NVM.CMD = 0; + 38ae: 10 92 ca 01 sts 0x01CA, r1 + + if (SerialCharNum & 0x01) + 38b2: 20 ff sbrs r18, 0 + 38b4: 03 c0 rjmp .+6 ; 0x38bc + { + SerialByte >>= 4; + 38b6: 82 95 swap r24 + 38b8: 8f 70 andi r24, 0x0F ; 15 + SigReadAddress++; + 38ba: 3f 5f subi r19, 0xFF ; 255 + } + + SerialByte &= 0x0F; + 38bc: 8f 70 andi r24, 0x0F ; 15 + + UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? + 38be: 8a 30 cpi r24, 0x0A ; 10 + 38c0: 50 f7 brcc .-44 ; 0x3896 + 38c2: 90 e0 ldi r25, 0x00 ; 0 + 38c4: c0 96 adiw r24, 0x30 ; 48 + 38c6: e9 cf rjmp .-46 ; 0x389a + if (GlobalIntState & AVR32_SR_GM) + __builtin_ssrf(AVR32_SR_GM_OFFSET); + else + __builtin_csrf(AVR32_SR_GM_OFFSET); + #elif (ARCH == ARCH_XMEGA) + SREG = GlobalIntState; + 38c8: 5f bf out 0x3f, r21 ; 63 + + USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); + + Endpoint_ClearSETUP(); + 38ca: 8d d2 rcall .+1306 ; 0x3de6 + + Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); + 38cc: 6a e3 ldi r22, 0x3A ; 58 + 38ce: 70 e0 ldi r23, 0x00 ; 0 + 38d0: ce 01 movw r24, r28 + 38d2: 01 96 adiw r24, 0x01 ; 1 + 38d4: 88 d0 rcall .+272 ; 0x39e6 + Endpoint_ClearOUT(); + 38d6: e1 d1 rcall .+962 ; 0x3c9a + 38d8: 0d cf rjmp .-486 ; 0x36f4 + } + + 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); + 38da: 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; + 38de: 88 23 and r24, r24 + 38e0: 21 f0 breq .+8 ; 0x38ea + 38e2: 84 e0 ldi r24, 0x04 ; 4 + 38e4: 80 93 14 27 sts 0x2714, r24 + 38e8: 2a cf rjmp .-428 ; 0x373e + 38ea: 81 e0 ldi r24, 0x01 ; 1 + 38ec: fb cf rjmp .-10 ; 0x38e4 + + if (Endpoint_IsEnabled()) + { + if (USB_ControlRequest.bRequest == REQ_SetFeature) + { + Endpoint_StallTransaction(); + 38ee: a7 d2 rcall .+1358 ; 0x3e3e + 38f0: 90 cf rjmp .-224 ; 0x3812 + +000038f2 : +#define __INCLUDE_FROM_EVENTS_C +#define __INCLUDE_FROM_USB_DRIVER +#include "Events.h" + +void USB_Event_Stub(void) +{ + 38f2: 08 95 ret + +000038f4 : +#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) +volatile uint8_t USB_DeviceState; +#endif + +void USB_USBTask(void) +{ + 38f4: cf 93 push r28 +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_DeviceTask(void) +{ + if (USB_DeviceState == DEVICE_STATE_Unattached) + 38f6: 80 91 14 27 lds r24, 0x2714 + 38fa: 81 11 cpse r24, r1 + 38fc: 02 c0 rjmp .+4 ; 0x3902 + #elif defined(USB_CAN_BE_HOST) + USB_HostTask(); + #elif defined(USB_CAN_BE_DEVICE) + USB_DeviceTask(); + #endif +} + 38fe: cf 91 pop r28 + 3900: 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; + 3902: c0 91 21 27 lds r28, 0x2721 + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + + uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + 3906: 80 e0 ldi r24, 0x00 ; 0 + 3908: f7 d1 rcall .+1006 ; 0x3cf8 + + if (Endpoint_IsSETUPReceived()) + 390a: 54 d2 rcall .+1192 ; 0x3db4 + 390c: 81 11 cpse r24, r1 + 390e: 03 c0 rjmp .+6 ; 0x3916 + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(PrevEndpoint); + 3910: 8c 2f mov r24, r28 + #elif defined(USB_CAN_BE_HOST) + USB_HostTask(); + #elif defined(USB_CAN_BE_DEVICE) + USB_DeviceTask(); + #endif +} + 3912: cf 91 pop r28 + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + if (Endpoint_IsSETUPReceived()) + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(PrevEndpoint); + 3914: f1 c1 rjmp .+994 ; 0x3cf8 + uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + if (Endpoint_IsSETUPReceived()) + USB_Device_ProcessControlRequest(); + 3916: cd de rcall .-614 ; 0x36b2 + + Endpoint_SelectEndpoint(PrevEndpoint); + 3918: 8c 2f mov r24, r28 + #elif defined(USB_CAN_BE_HOST) + USB_HostTask(); + #elif defined(USB_CAN_BE_DEVICE) + USB_DeviceTask(); + #endif +} + 391a: cf 91 pop r28 + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + if (Endpoint_IsSETUPReceived()) + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(PrevEndpoint); + 391c: ed c1 rjmp .+986 ; 0x3cf8 + +0000391e : + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 391e: cf 92 push r12 + 3920: df 92 push r13 + 3922: ef 92 push r14 + 3924: ff 92 push r15 + 3926: 0f 93 push r16 + 3928: 1f 93 push r17 + 392a: cf 93 push r28 + 392c: df 93 push r29 + 392e: 8c 01 movw r16, r24 + 3930: eb 01 movw r28, r22 + 3932: 7a 01 movw r14, r20 + 3934: a5 d3 rcall .+1866 ; 0x4080 + 3936: 81 11 cpse r24, r1 + 3938: 25 c0 rjmp .+74 ; 0x3984 + 393a: e1 14 cp r14, r1 + 393c: f1 04 cpc r15, r1 + 393e: 81 f1 breq .+96 ; 0x39a0 + 3940: f7 01 movw r30, r14 + 3942: 80 81 ld r24, Z + 3944: 91 81 ldd r25, Z+1 ; 0x01 + 3946: c8 1b sub r28, r24 + 3948: d9 0b sbc r29, r25 + 394a: 08 0f add r16, r24 + 394c: 19 1f adc r17, r25 + 394e: 20 97 sbiw r28, 0x00 ; 0 + 3950: 09 f4 brne .+2 ; 0x3954 + 3952: 3b c0 rjmp .+118 ; 0x39ca + 3954: c1 2c mov r12, r1 + 3956: d1 2c mov r13, r1 + 3958: 20 91 1d 27 lds r18, 0x271D + 395c: 30 91 1e 27 lds r19, 0x271E + 3960: f9 01 movw r30, r18 + 3962: ef 5b subi r30, 0xBF ; 191 + 3964: ff 4f sbci r31, 0xFF ; 255 + 3966: 90 81 ld r25, Z + 3968: 31 97 sbiw r30, 0x01 ; 1 + 396a: 80 81 ld r24, Z + 396c: 98 17 cp r25, r24 + 396e: 78 f1 brcs .+94 ; 0x39ce + 3970: 7b d1 rcall .+758 ; 0x3c68 + 3972: c0 df rcall .-128 ; 0x38f4 + 3974: f7 01 movw r30, r14 + 3976: 80 81 ld r24, Z + 3978: 91 81 ldd r25, Z+1 ; 0x01 + 397a: 8c 0d add r24, r12 + 397c: 9d 1d adc r25, r13 + 397e: 80 83 st Z, r24 + 3980: 91 83 std Z+1, r25 ; 0x01 + 3982: 85 e0 ldi r24, 0x05 ; 5 + 3984: df 91 pop r29 + 3986: cf 91 pop r28 + 3988: 1f 91 pop r17 + 398a: 0f 91 pop r16 + 398c: ff 90 pop r15 + 398e: ef 90 pop r14 + 3990: df 90 pop r13 + 3992: cf 90 pop r12 + 3994: 08 95 ret + 3996: 68 d1 rcall .+720 ; 0x3c68 + 3998: ad df rcall .-166 ; 0x38f4 + 399a: 72 d3 rcall .+1764 ; 0x4080 + 399c: 81 11 cpse r24, r1 + 399e: f2 cf rjmp .-28 ; 0x3984 + 39a0: 20 97 sbiw r28, 0x00 ; 0 + 39a2: 99 f0 breq .+38 ; 0x39ca + 39a4: 20 91 1d 27 lds r18, 0x271D + 39a8: 30 91 1e 27 lds r19, 0x271E + 39ac: f9 01 movw r30, r18 + 39ae: ef 5b subi r30, 0xBF ; 191 + 39b0: ff 4f sbci r31, 0xFF ; 255 + 39b2: 90 81 ld r25, Z + 39b4: 31 97 sbiw r30, 0x01 ; 1 + 39b6: 80 81 ld r24, Z + 39b8: 98 17 cp r25, r24 + 39ba: 68 f7 brcc .-38 ; 0x3996 + 39bc: f8 01 movw r30, r16 + 39be: 81 91 ld r24, Z+ + 39c0: 8f 01 movw r16, r30 + 39c2: 8a d1 rcall .+788 ; 0x3cd8 + 39c4: 21 97 sbiw r28, 0x01 ; 1 + 39c6: 20 97 sbiw r28, 0x00 ; 0 + 39c8: 69 f7 brne .-38 ; 0x39a4 + 39ca: 80 e0 ldi r24, 0x00 ; 0 + 39cc: db cf rjmp .-74 ; 0x3984 + 39ce: f8 01 movw r30, r16 + 39d0: 81 91 ld r24, Z+ + 39d2: 8f 01 movw r16, r30 + 39d4: 81 d1 rcall .+770 ; 0x3cd8 + 39d6: ff ef ldi r31, 0xFF ; 255 + 39d8: cf 1a sub r12, r31 + 39da: df 0a sbc r13, r31 + 39dc: cc 15 cp r28, r12 + 39de: dd 05 cpc r29, r13 + 39e0: 09 f0 breq .+2 ; 0x39e4 + 39e2: ba cf rjmp .-140 ; 0x3958 + 39e4: f2 cf rjmp .-28 ; 0x39ca + +000039e6 : + 39e6: cf 92 push r12 + 39e8: df 92 push r13 + 39ea: ef 92 push r14 + 39ec: ff 92 push r15 + 39ee: 0f 93 push r16 + 39f0: 1f 93 push r17 + 39f2: cf 93 push r28 + 39f4: df 93 push r29 + 39f6: 6c 01 movw r12, r24 + 39f8: 8b 01 movw r16, r22 + 39fa: 80 91 21 27 lds r24, 0x2721 + 39fe: 80 68 ori r24, 0x80 ; 128 + 3a00: 7b d1 rcall .+758 ; 0x3cf8 + 3a02: c0 91 1b 27 lds r28, 0x271B + 3a06: d0 91 1c 27 lds r29, 0x271C + 3a0a: c0 17 cp r28, r16 + 3a0c: d1 07 cpc r29, r17 + 3a0e: 28 f0 brcs .+10 ; 0x3a1a + 3a10: 01 15 cp r16, r1 + 3a12: 11 05 cpc r17, r1 + 3a14: 09 f4 brne .+2 ; 0x3a18 + 3a16: 6f c0 rjmp .+222 ; 0x3af6 + 3a18: e8 01 movw r28, r16 + 3a1a: 10 e0 ldi r17, 0x00 ; 0 + 3a1c: 20 97 sbiw r28, 0x00 ; 0 + 3a1e: 39 f5 brne .+78 ; 0x3a6e + 3a20: 11 11 cpse r17, r1 + 3a22: 0c c0 rjmp .+24 ; 0x3a3c + 3a24: 2f c0 rjmp .+94 ; 0x3a84 + 3a26: 85 30 cpi r24, 0x05 ; 5 + 3a28: 91 f1 breq .+100 ; 0x3a8e + 3a2a: c4 d1 rcall .+904 ; 0x3db4 + 3a2c: 81 11 cpse r24, r1 + 3a2e: 31 c0 rjmp .+98 ; 0x3a92 + 3a30: a8 d1 rcall .+848 ; 0x3d82 + 3a32: 81 11 cpse r24, r1 + 3a34: 27 c0 rjmp .+78 ; 0x3a84 + 3a36: 99 d1 rcall .+818 ; 0x3d6a + 3a38: 81 11 cpse r24, r1 + 3a3a: 2d c0 rjmp .+90 ; 0x3a96 + 3a3c: 80 91 14 27 lds r24, 0x2714 + 3a40: 81 11 cpse r24, r1 + 3a42: f1 cf rjmp .-30 ; 0x3a26 + 3a44: 82 e0 ldi r24, 0x02 ; 2 + 3a46: df 91 pop r29 + 3a48: cf 91 pop r28 + 3a4a: 1f 91 pop r17 + 3a4c: 0f 91 pop r16 + 3a4e: ff 90 pop r15 + 3a50: ef 90 pop r14 + 3a52: df 90 pop r13 + 3a54: cf 90 pop r12 + 3a56: 08 95 ret + 3a58: 85 30 cpi r24, 0x05 ; 5 + 3a5a: c9 f0 breq .+50 ; 0x3a8e + 3a5c: ab d1 rcall .+854 ; 0x3db4 + 3a5e: 81 11 cpse r24, r1 + 3a60: 18 c0 rjmp .+48 ; 0x3a92 + 3a62: 8f d1 rcall .+798 ; 0x3d82 + 3a64: 81 11 cpse r24, r1 + 3a66: 0e c0 rjmp .+28 ; 0x3a84 + 3a68: 80 d1 rcall .+768 ; 0x3d6a + 3a6a: 81 11 cpse r24, r1 + 3a6c: 14 c0 rjmp .+40 ; 0x3a96 + 3a6e: 80 91 14 27 lds r24, 0x2714 + 3a72: 81 11 cpse r24, r1 + 3a74: f1 cf rjmp .-30 ; 0x3a58 + 3a76: e6 cf rjmp .-52 ; 0x3a44 + 3a78: 80 91 14 27 lds r24, 0x2714 + 3a7c: 88 23 and r24, r24 + 3a7e: 11 f3 breq .-60 ; 0x3a44 + 3a80: 85 30 cpi r24, 0x05 ; 5 + 3a82: 29 f0 breq .+10 ; 0x3a8e + 3a84: 7e d1 rcall .+764 ; 0x3d82 + 3a86: 88 23 and r24, r24 + 3a88: b9 f3 breq .-18 ; 0x3a78 + 3a8a: 80 e0 ldi r24, 0x00 ; 0 + 3a8c: dc cf rjmp .-72 ; 0x3a46 + 3a8e: 83 e0 ldi r24, 0x03 ; 3 + 3a90: da cf rjmp .-76 ; 0x3a46 + 3a92: 81 e0 ldi r24, 0x01 ; 1 + 3a94: d8 cf rjmp .-80 ; 0x3a46 + 3a96: 80 91 21 27 lds r24, 0x2721 + 3a9a: 87 fd sbrc r24, 7 + 3a9c: 30 c0 rjmp .+96 ; 0x3afe + 3a9e: 20 91 1d 27 lds r18, 0x271D + 3aa2: 30 91 1e 27 lds r19, 0x271E + 3aa6: f9 01 movw r30, r18 + 3aa8: e0 5c subi r30, 0xC0 ; 192 + 3aaa: ff 4f sbci r31, 0xFF ; 255 + 3aac: e0 80 ld r14, Z + 3aae: 31 96 adiw r30, 0x01 ; 1 + 3ab0: 80 81 ld r24, Z + 3ab2: f1 2c mov r15, r1 + 3ab4: e8 1a sub r14, r24 + 3ab6: f1 08 sbc r15, r1 + 3ab8: 20 97 sbiw r28, 0x00 ; 0 + 3aba: a9 f0 breq .+42 ; 0x3ae6 + 3abc: 88 e0 ldi r24, 0x08 ; 8 + 3abe: e8 16 cp r14, r24 + 3ac0: f1 04 cpc r15, r1 + 3ac2: 88 f4 brcc .+34 ; 0x3ae6 + 3ac4: 86 01 movw r16, r12 + 3ac6: 04 c0 rjmp .+8 ; 0x3ad0 + 3ac8: 88 e0 ldi r24, 0x08 ; 8 + 3aca: e8 16 cp r14, r24 + 3acc: f1 04 cpc r15, r1 + 3ace: 59 f0 breq .+22 ; 0x3ae6 + 3ad0: f8 01 movw r30, r16 + 3ad2: 81 91 ld r24, Z+ + 3ad4: 8f 01 movw r16, r30 + 3ad6: 00 d1 rcall .+512 ; 0x3cd8 + 3ad8: 68 01 movw r12, r16 + 3ada: 21 97 sbiw r28, 0x01 ; 1 + 3adc: ff ef ldi r31, 0xFF ; 255 + 3ade: ef 1a sub r14, r31 + 3ae0: ff 0a sbc r15, r31 + 3ae2: 20 97 sbiw r28, 0x00 ; 0 + 3ae4: 89 f7 brne .-30 ; 0x3ac8 + 3ae6: 11 e0 ldi r17, 0x01 ; 1 + 3ae8: e8 e0 ldi r30, 0x08 ; 8 + 3aea: ee 16 cp r14, r30 + 3aec: f1 04 cpc r15, r1 + 3aee: 09 f0 breq .+2 ; 0x3af2 + 3af0: 10 e0 ldi r17, 0x00 ; 0 + 3af2: ba d0 rcall .+372 ; 0x3c68 + 3af4: 93 cf rjmp .-218 ; 0x3a1c + 3af6: b8 d0 rcall .+368 ; 0x3c68 + 3af8: c0 e0 ldi r28, 0x00 ; 0 + 3afa: d0 e0 ldi r29, 0x00 ; 0 + 3afc: 8e cf rjmp .-228 ; 0x3a1a + 3afe: e0 91 1d 27 lds r30, 0x271D + 3b02: f0 91 1e 27 lds r31, 0x271E + 3b06: ef 5b subi r30, 0xBF ; 191 + 3b08: ff 4f sbci r31, 0xFF ; 255 + 3b0a: e0 80 ld r14, Z + 3b0c: f1 2c mov r15, r1 + 3b0e: d4 cf rjmp .-88 ; 0x3ab8 + +00003b10 : + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, + uint16_t Length) +{ + 3b10: df 92 push r13 + 3b12: ef 92 push r14 + 3b14: ff 92 push r15 + 3b16: 0f 93 push r16 + 3b18: 1f 93 push r17 + 3b1a: cf 93 push r28 + 3b1c: df 93 push r29 + 3b1e: f8 2e mov r15, r24 + 3b20: e9 2e mov r14, r25 + 3b22: 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); + 3b24: 80 91 21 27 lds r24, 0x2721 + 3b28: 80 68 ori r24, 0x80 ; 128 + 3b2a: e6 d0 rcall .+460 ; 0x3cf8 + + if (Length > USB_ControlRequest.wLength) + 3b2c: c0 91 1b 27 lds r28, 0x271B + 3b30: d0 91 1c 27 lds r29, 0x271C + 3b34: c0 17 cp r28, r16 + 3b36: d1 07 cpc r29, r17 + 3b38: 28 f0 brcs .+10 ; 0x3b44 + Length = USB_ControlRequest.wLength; + else if (!(Length)) + 3b3a: 01 15 cp r16, r1 + 3b3c: 11 05 cpc r17, r1 + 3b3e: 09 f4 brne .+2 ; 0x3b42 + 3b40: 86 c0 rjmp .+268 ; 0x3c4e + 3b42: e8 01 movw r28, r16 + 3b44: 0f 2d mov r16, r15 + 3b46: 1e 2d mov r17, r14 + 3b48: d1 2c mov r13, r1 + 3b4a: 20 97 sbiw r28, 0x00 ; 0 + 3b4c: 39 f5 brne .+78 ; 0x3b9c + 3b4e: d1 10 cpse r13, r1 + 3b50: 0d c0 rjmp .+26 ; 0x3b6c + 3b52: 2f c0 rjmp .+94 ; 0x3bb2 + { + 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) + 3b54: 85 30 cpi r24, 0x05 ; 5 + 3b56: 09 f4 brne .+2 ; 0x3b5a + 3b58: 38 c0 rjmp .+112 ; 0x3bca + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 3b5a: 2c d1 rcall .+600 ; 0x3db4 + 3b5c: 81 11 cpse r24, r1 + 3b5e: 3e c0 rjmp .+124 ; 0x3bdc + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 3b60: 10 d1 rcall .+544 ; 0x3d82 + 3b62: 81 11 cpse r24, r1 + 3b64: 26 c0 rjmp .+76 ; 0x3bb2 + break; + + if (Endpoint_IsINReady()) + 3b66: 01 d1 rcall .+514 ; 0x3d6a + 3b68: 81 11 cpse r24, r1 + 3b6a: 41 c0 rjmp .+130 ; 0x3bee + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3b6c: 80 91 14 27 lds r24, 0x2714 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3b70: 81 11 cpse r24, r1 + 3b72: f0 cf rjmp .-32 ; 0x3b54 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + 3b74: 82 e0 ldi r24, 0x02 ; 2 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 3b76: df 91 pop r29 + 3b78: cf 91 pop r28 + 3b7a: 1f 91 pop r17 + 3b7c: 0f 91 pop r16 + 3b7e: ff 90 pop r15 + 3b80: ef 90 pop r14 + 3b82: df 90 pop r13 + 3b84: 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) + 3b86: 85 30 cpi r24, 0x05 ; 5 + 3b88: 01 f1 breq .+64 ; 0x3bca + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 3b8a: 14 d1 rcall .+552 ; 0x3db4 + 3b8c: 81 11 cpse r24, r1 + 3b8e: 26 c0 rjmp .+76 ; 0x3bdc + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 3b90: f8 d0 rcall .+496 ; 0x3d82 + 3b92: 81 11 cpse r24, r1 + 3b94: 0e c0 rjmp .+28 ; 0x3bb2 + break; + + if (Endpoint_IsINReady()) + 3b96: e9 d0 rcall .+466 ; 0x3d6a + 3b98: 81 11 cpse r24, r1 + 3b9a: 29 c0 rjmp .+82 ; 0x3bee + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3b9c: 80 91 14 27 lds r24, 0x2714 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3ba0: 81 11 cpse r24, r1 + 3ba2: f1 cf rjmp .-30 ; 0x3b86 + 3ba4: e7 cf rjmp .-50 ; 0x3b74 + } + } + + while (!(Endpoint_IsOUTReceived())) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3ba6: 80 91 14 27 lds r24, 0x2714 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3baa: 88 23 and r24, r24 + 3bac: 19 f3 breq .-58 ; 0x3b74 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 3bae: 85 30 cpi r24, 0x05 ; 5 + 3bb0: 61 f0 breq .+24 ; 0x3bca + LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); + Endpoint_ClearIN(); + } + } + + while (!(Endpoint_IsOUTReceived())) + 3bb2: e7 d0 rcall .+462 ; 0x3d82 + 3bb4: 88 23 and r24, r24 + 3bb6: b9 f3 breq .-18 ; 0x3ba6 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; + 3bb8: 80 e0 ldi r24, 0x00 ; 0 +} + 3bba: df 91 pop r29 + 3bbc: cf 91 pop r28 + 3bbe: 1f 91 pop r17 + 3bc0: 0f 91 pop r16 + 3bc2: ff 90 pop r15 + 3bc4: ef 90 pop r14 + 3bc6: df 90 pop r13 + 3bc8: 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; + 3bca: 83 e0 ldi r24, 0x03 ; 3 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 3bcc: df 91 pop r29 + 3bce: cf 91 pop r28 + 3bd0: 1f 91 pop r17 + 3bd2: 0f 91 pop r16 + 3bd4: ff 90 pop r15 + 3bd6: ef 90 pop r14 + 3bd8: df 90 pop r13 + 3bda: 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; + 3bdc: 81 e0 ldi r24, 0x01 ; 1 + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + 3bde: df 91 pop r29 + 3be0: cf 91 pop r28 + 3be2: 1f 91 pop r17 + 3be4: 0f 91 pop r16 + 3be6: ff 90 pop r15 + 3be8: ef 90 pop r14 + 3bea: df 90 pop r13 + 3bec: 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) + 3bee: 80 91 21 27 lds r24, 0x2721 + 3bf2: 87 fd sbrc r24, 7 + 3bf4: 30 c0 rjmp .+96 ; 0x3c56 + return USB_Endpoint_SelectedFIFO->Position; + else + return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); + 3bf6: 80 91 1d 27 lds r24, 0x271D + 3bfa: 90 91 1e 27 lds r25, 0x271E + 3bfe: fc 01 movw r30, r24 + 3c00: e0 5c subi r30, 0xC0 ; 192 + 3c02: ff 4f sbci r31, 0xFF ; 255 + 3c04: e0 80 ld r14, Z + 3c06: 31 96 adiw r30, 0x01 ; 1 + 3c08: 80 81 ld r24, Z + 3c0a: f1 2c mov r15, r1 + 3c0c: e8 1a sub r14, r24 + 3c0e: f1 08 sbc r15, r1 + + if (Endpoint_IsINReady()) + { + uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + + while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) + 3c10: 20 97 sbiw r28, 0x00 ; 0 + 3c12: a1 f0 breq .+40 ; 0x3c3c + 3c14: 88 e0 ldi r24, 0x08 ; 8 + 3c16: e8 16 cp r14, r24 + 3c18: f1 04 cpc r15, r1 + 3c1a: 28 f0 brcs .+10 ; 0x3c26 + 3c1c: 0f c0 rjmp .+30 ; 0x3c3c + 3c1e: 88 e0 ldi r24, 0x08 ; 8 + 3c20: e8 16 cp r14, r24 + 3c22: f1 04 cpc r15, r1 + 3c24: 59 f0 breq .+22 ; 0x3c3c + { + TEMPLATE_TRANSFER_BYTE(DataStream); + 3c26: f8 01 movw r30, r16 + 3c28: 84 91 lpm r24, Z + 3c2a: 56 d0 rcall .+172 ; 0x3cd8 + TEMPLATE_BUFFER_MOVE(DataStream, 1); + 3c2c: 0f 5f subi r16, 0xFF ; 255 + 3c2e: 1f 4f sbci r17, 0xFF ; 255 + Length--; + 3c30: 21 97 sbiw r28, 0x01 ; 1 + BytesInEndpoint++; + 3c32: ff ef ldi r31, 0xFF ; 255 + 3c34: ef 1a sub r14, r31 + 3c36: ff 0a sbc r15, r31 + + if (Endpoint_IsINReady()) + { + uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + + while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) + 3c38: 20 97 sbiw r28, 0x00 ; 0 + 3c3a: 89 f7 brne .-30 ; 0x3c1e + TEMPLATE_BUFFER_MOVE(DataStream, 1); + Length--; + BytesInEndpoint++; + } + + LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); + 3c3c: dd 24 eor r13, r13 + 3c3e: d3 94 inc r13 + 3c40: e8 e0 ldi r30, 0x08 ; 8 + 3c42: ee 16 cp r14, r30 + 3c44: f1 04 cpc r15, r1 + 3c46: 09 f0 breq .+2 ; 0x3c4a + 3c48: d1 2c mov r13, r1 + Endpoint_ClearIN(); + 3c4a: 0e d0 rcall .+28 ; 0x3c68 + 3c4c: 7e cf rjmp .-260 ; 0x3b4a + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + + if (Length > USB_ControlRequest.wLength) + Length = USB_ControlRequest.wLength; + else if (!(Length)) + Endpoint_ClearIN(); + 3c4e: 0c d0 rcall .+24 ; 0x3c68 + 3c50: c0 e0 ldi r28, 0x00 ; 0 + 3c52: d0 e0 ldi r29, 0x00 ; 0 + 3c54: 77 cf rjmp .-274 ; 0x3b44 + */ + 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; + 3c56: e0 91 1d 27 lds r30, 0x271D + 3c5a: f0 91 1e 27 lds r31, 0x271E + 3c5e: ef 5b subi r30, 0xBF ; 191 + 3c60: ff 4f sbci r31, 0xFF ; 255 + 3c62: e0 80 ld r14, Z + 3c64: f1 2c mov r15, r1 + 3c66: d4 cf rjmp .-88 ; 0x3c10 + +00003c68 : + USB_Endpoint_SelectedFIFO->Position = 0; +} + +void Endpoint_ClearIN(void) +{ + USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; + 3c68: e0 91 1f 27 lds r30, 0x271F + 3c6c: f0 91 20 27 lds r31, 0x2720 + 3c70: a0 91 1d 27 lds r26, 0x271D + 3c74: b0 91 1e 27 lds r27, 0x271E + 3c78: af 5b subi r26, 0xBF ; 191 + 3c7a: bf 4f sbci r27, 0xFF ; 255 + 3c7c: 8c 91 ld r24, X + 3c7e: 90 e0 ldi r25, 0x00 ; 0 + 3c80: 82 83 std Z+2, r24 ; 0x02 + 3c82: 93 83 std Z+3, r25 ; 0x03 + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 3c84: 80 81 ld r24, Z + 3c86: 8d 79 andi r24, 0x9D ; 157 + 3c88: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3c8a: e0 91 1d 27 lds r30, 0x271D + 3c8e: f0 91 1e 27 lds r31, 0x271E + 3c92: ef 5b subi r30, 0xBF ; 191 + 3c94: ff 4f sbci r31, 0xFF ; 255 + 3c96: 10 82 st Z, r1 + 3c98: 08 95 ret + +00003c9a : +} + +void Endpoint_ClearOUT(void) +{ + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 3c9a: e0 91 1f 27 lds r30, 0x271F + 3c9e: f0 91 20 27 lds r31, 0x2720 + 3ca2: 80 81 ld r24, Z + 3ca4: 8d 79 andi r24, 0x9D ; 157 + 3ca6: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3ca8: e0 91 1d 27 lds r30, 0x271D + 3cac: f0 91 1e 27 lds r31, 0x271E + 3cb0: ef 5b subi r30, 0xBF ; 191 + 3cb2: ff 4f sbci r31, 0xFF ; 255 + 3cb4: 10 82 st Z, r1 + 3cb6: 08 95 ret + +00003cb8 : + } +} + +uint8_t Endpoint_Read_8(void) +{ + return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; + 3cb8: 80 91 1d 27 lds r24, 0x271D + 3cbc: 90 91 1e 27 lds r25, 0x271E + 3cc0: fc 01 movw r30, r24 + 3cc2: ef 5b subi r30, 0xBF ; 191 + 3cc4: ff 4f sbci r31, 0xFF ; 255 + 3cc6: 20 81 ld r18, Z + 3cc8: 31 e0 ldi r19, 0x01 ; 1 + 3cca: 32 0f add r19, r18 + 3ccc: 30 83 st Z, r19 + 3cce: fc 01 movw r30, r24 + 3cd0: e2 0f add r30, r18 + 3cd2: f1 1d adc r31, r1 + 3cd4: 80 81 ld r24, Z +} + 3cd6: 08 95 ret + +00003cd8 : + +void Endpoint_Write_8(const uint8_t Data) +{ + USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; + 3cd8: 20 91 1d 27 lds r18, 0x271D + 3cdc: 30 91 1e 27 lds r19, 0x271E + 3ce0: f9 01 movw r30, r18 + 3ce2: ef 5b subi r30, 0xBF ; 191 + 3ce4: ff 4f sbci r31, 0xFF ; 255 + 3ce6: 90 81 ld r25, Z + 3ce8: 41 e0 ldi r20, 0x01 ; 1 + 3cea: 49 0f add r20, r25 + 3cec: 40 83 st Z, r20 + 3cee: f9 01 movw r30, r18 + 3cf0: e9 0f add r30, r25 + 3cf2: f1 1d adc r31, r1 + 3cf4: 80 83 st Z, r24 + 3cf6: 08 95 ret + +00003cf8 : + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ + uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + + USB_Endpoint_SelectedEndpoint = Address; + 3cf8: 80 93 21 27 sts 0x2721, r24 + USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; +} + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ + uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + 3cfc: 28 2f mov r18, r24 + 3cfe: 2f 70 andi r18, 0x0F ; 15 + + USB_Endpoint_SelectedEndpoint = Address; + + Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; + 3d00: 62 2f mov r22, r18 + 3d02: 70 e0 ldi r23, 0x00 ; 0 + 3d04: 94 e8 ldi r25, 0x84 ; 132 + 3d06: 29 9f mul r18, r25 + 3d08: 90 01 movw r18, r0 + 3d0a: 11 24 eor r1, r1 + 3d0c: 2e 5d subi r18, 0xDE ; 222 + 3d0e: 38 4d sbci r19, 0xD8 ; 216 + USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; + 3d10: 40 91 c6 04 lds r20, 0x04C6 + 3d14: 50 91 c7 04 lds r21, 0x04C7 + + if (Address & ENDPOINT_DIR_IN) + 3d18: 87 fd sbrc r24, 7 + 3d1a: 12 c0 rjmp .+36 ; 0x3d40 + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; + } + else + { + USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; + 3d1c: 20 93 1d 27 sts 0x271D, r18 + 3d20: 30 93 1e 27 sts 0x271E, r19 + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; + 3d24: cb 01 movw r24, r22 + 3d26: 82 95 swap r24 + 3d28: 92 95 swap r25 + 3d2a: 90 7f andi r25, 0xF0 ; 240 + 3d2c: 98 27 eor r25, r24 + 3d2e: 80 7f andi r24, 0xF0 ; 240 + 3d30: 98 27 eor r25, r24 + 3d32: 84 0f add r24, r20 + 3d34: 95 1f adc r25, r21 + 3d36: 80 93 1f 27 sts 0x271F, r24 + 3d3a: 90 93 20 27 sts 0x2720, r25 + 3d3e: 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; + 3d40: 2e 5b subi r18, 0xBE ; 190 + 3d42: 3f 4f sbci r19, 0xFF ; 255 + 3d44: 20 93 1d 27 sts 0x271D, r18 + 3d48: 30 93 1e 27 sts 0x271E, r19 + USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; + 3d4c: 62 95 swap r22 + 3d4e: 72 95 swap r23 + 3d50: 70 7f andi r23, 0xF0 ; 240 + 3d52: 76 27 eor r23, r22 + 3d54: 60 7f andi r22, 0xF0 ; 240 + 3d56: 76 27 eor r23, r22 + 3d58: 68 5f subi r22, 0xF8 ; 248 + 3d5a: 7f 4f sbci r23, 0xFF ; 255 + 3d5c: 64 0f add r22, r20 + 3d5e: 75 1f adc r23, r21 + 3d60: 60 93 1f 27 sts 0x271F, r22 + 3d64: 70 93 20 27 sts 0x2720, r23 + 3d68: 08 95 ret + +00003d6a : +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); + 3d6a: 80 91 21 27 lds r24, 0x2721 + 3d6e: 80 68 ori r24, 0x80 ; 128 + 3d70: c3 df rcall .-122 ; 0x3cf8 + + return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); + 3d72: e0 91 1f 27 lds r30, 0x271F + 3d76: f0 91 20 27 lds r31, 0x2720 + 3d7a: 80 81 ld r24, Z +} + 3d7c: 86 95 lsr r24 + 3d7e: 81 70 andi r24, 0x01 ; 1 + 3d80: 08 95 ret + +00003d82 : + +bool Endpoint_IsOUTReceived(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 3d82: 80 91 21 27 lds r24, 0x2721 + 3d86: 8f 77 andi r24, 0x7F ; 127 + 3d88: b7 df rcall .-146 ; 0x3cf8 + + if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) + 3d8a: e0 91 1f 27 lds r30, 0x271F + 3d8e: f0 91 20 27 lds r31, 0x2720 + 3d92: 80 81 ld r24, Z + 3d94: 85 ff sbrs r24, 5 + 3d96: 0c c0 rjmp .+24 ; 0x3db0 + { + USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; + 3d98: 20 91 1d 27 lds r18, 0x271D + 3d9c: 30 91 1e 27 lds r19, 0x271E + 3da0: 82 81 ldd r24, Z+2 ; 0x02 + 3da2: 93 81 ldd r25, Z+3 ; 0x03 + 3da4: f9 01 movw r30, r18 + 3da6: e0 5c subi r30, 0xC0 ; 192 + 3da8: ff 4f sbci r31, 0xFF ; 255 + 3daa: 80 83 st Z, r24 + return true; + 3dac: 81 e0 ldi r24, 0x01 ; 1 + 3dae: 08 95 ret + } + + return false; + 3db0: 80 e0 ldi r24, 0x00 ; 0 +} + 3db2: 08 95 ret + +00003db4 : + +bool Endpoint_IsSETUPReceived(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 3db4: 80 91 21 27 lds r24, 0x2721 + 3db8: 8f 77 andi r24, 0x7F ; 127 + 3dba: 9e df rcall .-196 ; 0x3cf8 + + if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) + 3dbc: e0 91 1f 27 lds r30, 0x271F + 3dc0: f0 91 20 27 lds r31, 0x2720 + 3dc4: 80 81 ld r24, Z + 3dc6: 84 ff sbrs r24, 4 + 3dc8: 0c c0 rjmp .+24 ; 0x3de2 + { + USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; + 3dca: 20 91 1d 27 lds r18, 0x271D + 3dce: 30 91 1e 27 lds r19, 0x271E + 3dd2: 82 81 ldd r24, Z+2 ; 0x02 + 3dd4: 93 81 ldd r25, Z+3 ; 0x03 + 3dd6: f9 01 movw r30, r18 + 3dd8: e0 5c subi r30, 0xC0 ; 192 + 3dda: ff 4f sbci r31, 0xFF ; 255 + 3ddc: 80 83 st Z, r24 + return true; + 3dde: 81 e0 ldi r24, 0x01 ; 1 + 3de0: 08 95 ret + } + + return false; + 3de2: 80 e0 ldi r24, 0x00 ; 0 +} + 3de4: 08 95 ret + +00003de6 : + +void Endpoint_ClearSETUP(void) +{ + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + 3de6: 80 91 21 27 lds r24, 0x2721 + 3dea: 8f 77 andi r24, 0x7F ; 127 + 3dec: 85 df rcall .-246 ; 0x3cf8 + USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); + 3dee: e0 91 1f 27 lds r30, 0x271F + 3df2: f0 91 20 27 lds r31, 0x2720 + 3df6: 80 81 ld r24, Z + 3df8: 8d 78 andi r24, 0x8D ; 141 + 3dfa: 80 83 st Z, r24 + USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; + 3dfc: e0 91 1f 27 lds r30, 0x271F + 3e00: f0 91 20 27 lds r31, 0x2720 + 3e04: 80 81 ld r24, Z + 3e06: 81 60 ori r24, 0x01 ; 1 + 3e08: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3e0a: e0 91 1d 27 lds r30, 0x271D + 3e0e: f0 91 1e 27 lds r31, 0x271E + 3e12: ef 5b subi r30, 0xBF ; 191 + 3e14: ff 4f sbci r31, 0xFF ; 255 + 3e16: 10 82 st Z, r1 + + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + 3e18: 80 91 21 27 lds r24, 0x2721 + 3e1c: 80 68 ori r24, 0x80 ; 128 + 3e1e: 6c df rcall .-296 ; 0x3cf8 + USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; + 3e20: e0 91 1f 27 lds r30, 0x271F + 3e24: f0 91 20 27 lds r31, 0x2720 + 3e28: 80 81 ld r24, Z + 3e2a: 81 60 ori r24, 0x01 ; 1 + 3e2c: 80 83 st Z, r24 + USB_Endpoint_SelectedFIFO->Position = 0; + 3e2e: e0 91 1d 27 lds r30, 0x271D + 3e32: f0 91 1e 27 lds r31, 0x271E + 3e36: ef 5b subi r30, 0xBF ; 191 + 3e38: ff 4f sbci r31, 0xFF ; 255 + 3e3a: 10 82 st Z, r1 + 3e3c: 08 95 ret + +00003e3e : + USB_Endpoint_SelectedFIFO->Position = 0; +} + +void Endpoint_StallTransaction(void) +{ + USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + 3e3e: e0 91 1f 27 lds r30, 0x271F + 3e42: f0 91 20 27 lds r31, 0x2720 + 3e46: 81 81 ldd r24, Z+1 ; 0x01 + 3e48: 84 60 ori r24, 0x04 ; 4 + 3e4a: 81 83 std Z+1, r24 ; 0x01 + + if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) + 3e4c: e0 91 1f 27 lds r30, 0x271F + 3e50: f0 91 20 27 lds r31, 0x2720 + 3e54: 81 81 ldd r24, Z+1 ; 0x01 + 3e56: 80 7c andi r24, 0xC0 ; 192 + 3e58: 80 34 cpi r24, 0x40 ; 64 + 3e5a: 09 f0 breq .+2 ; 0x3e5e + 3e5c: 08 95 ret + { + Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); + 3e5e: 80 91 21 27 lds r24, 0x2721 + 3e62: 80 58 subi r24, 0x80 ; 128 + 3e64: 49 df rcall .-366 ; 0x3cf8 + USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + 3e66: e0 91 1f 27 lds r30, 0x271F + 3e6a: f0 91 20 27 lds r31, 0x2720 + 3e6e: 81 81 ldd r24, Z+1 ; 0x01 + 3e70: 84 60 ori r24, 0x04 ; 4 + 3e72: 81 83 std Z+1, r24 ; 0x01 + 3e74: 08 95 ret + +00003e76 : +} + +bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, + const uint8_t Config, + const uint8_t Size) +{ + 3e76: 1f 93 push r17 + 3e78: cf 93 push r28 + 3e7a: df 93 push r29 + 3e7c: 00 d0 rcall .+0 ; 0x3e7e + 3e7e: cd b7 in r28, 0x3d ; 61 + 3e80: de b7 in r29, 0x3e ; 62 + 3e82: 18 2f mov r17, r24 + Endpoint_SelectEndpoint(Address); + 3e84: 4a 83 std Y+2, r20 ; 0x02 + 3e86: 69 83 std Y+1, r22 ; 0x01 + 3e88: 37 df rcall .-402 ; 0x3cf8 + + USB_Endpoint_SelectedHandle->CTRL = 0; + 3e8a: e0 91 1f 27 lds r30, 0x271F + 3e8e: f0 91 20 27 lds r31, 0x2720 + 3e92: 11 82 std Z+1, r1 ; 0x01 + USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; + 3e94: e0 91 1f 27 lds r30, 0x271F + 3e98: f0 91 20 27 lds r31, 0x2720 + 3e9c: 4a 81 ldd r20, Y+2 ; 0x02 + 3e9e: 69 81 ldd r22, Y+1 ; 0x01 + 3ea0: 17 fd sbrc r17, 7 + 3ea2: 20 c0 rjmp .+64 ; 0x3ee4 + 3ea4: 10 82 st Z, r1 + USB_Endpoint_SelectedHandle->CTRL = Config; + 3ea6: e0 91 1f 27 lds r30, 0x271F + 3eaa: f0 91 20 27 lds r31, 0x2720 + 3eae: 61 83 std Z+1, r22 ; 0x01 + USB_Endpoint_SelectedHandle->CNT = 0; + 3eb0: e0 91 1f 27 lds r30, 0x271F + 3eb4: f0 91 20 27 lds r31, 0x2720 + 3eb8: 12 82 std Z+2, r1 ; 0x02 + 3eba: 13 82 std Z+3, r1 ; 0x03 + USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + 3ebc: 80 91 1d 27 lds r24, 0x271D + 3ec0: 90 91 1e 27 lds r25, 0x271E + 3ec4: 84 83 std Z+4, r24 ; 0x04 + 3ec6: 95 83 std Z+5, r25 ; 0x05 + + USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; + 3ec8: 40 e0 ldi r20, 0x00 ; 0 + 3eca: fc 01 movw r30, r24 + 3ecc: e0 5c subi r30, 0xC0 ; 192 + 3ece: ff 4f sbci r31, 0xFF ; 255 + 3ed0: 40 83 st Z, r20 + USB_Endpoint_SelectedFIFO->Position = 0; + 3ed2: 31 96 adiw r30, 0x01 ; 1 + 3ed4: 10 82 st Z, r1 + + return true; +} + 3ed6: 81 e0 ldi r24, 0x01 ; 1 + 3ed8: 0f 90 pop r0 + 3eda: 0f 90 pop r0 + 3edc: df 91 pop r29 + 3ede: cf 91 pop r28 + 3ee0: 1f 91 pop r17 + 3ee2: 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; + 3ee4: 82 e0 ldi r24, 0x02 ; 2 + 3ee6: 80 83 st Z, r24 + USB_Endpoint_SelectedHandle->CTRL = Config; + 3ee8: e0 91 1f 27 lds r30, 0x271F + 3eec: f0 91 20 27 lds r31, 0x2720 + 3ef0: 61 83 std Z+1, r22 ; 0x01 + USB_Endpoint_SelectedHandle->CNT = 0; + 3ef2: e0 91 1f 27 lds r30, 0x271F + 3ef6: f0 91 20 27 lds r31, 0x2720 + 3efa: 12 82 std Z+2, r1 ; 0x02 + 3efc: 13 82 std Z+3, r1 ; 0x03 + USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + 3efe: 80 91 1d 27 lds r24, 0x271D + 3f02: 90 91 1e 27 lds r25, 0x271E + 3f06: 84 83 std Z+4, r24 ; 0x04 + 3f08: 95 83 std Z+5, r25 ; 0x05 + 3f0a: df cf rjmp .-66 ; 0x3eca + +00003f0c : + } +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + const uint8_t Entries) +{ + 3f0c: cf 92 push r12 + 3f0e: df 92 push r13 + 3f10: ef 92 push r14 + 3f12: ff 92 push r15 + 3f14: 0f 93 push r16 + 3f16: 1f 93 push r17 + 3f18: cf 93 push r28 + 3f1a: df 93 push r29 + 3f1c: 1f 92 push r1 + 3f1e: cd b7 in r28, 0x3d ; 61 + 3f20: de b7 in r29, 0x3e ; 62 + 3f22: f6 2e mov r15, r22 + for (uint8_t i = 0; i < Entries; i++) + 3f24: 66 23 and r22, r22 + 3f26: 09 f4 brne .+2 ; 0x3f2a + 3f28: 3e c0 rjmp .+124 ; 0x3fa6 + 3f2a: 6c 01 movw r12, r24 + 3f2c: 00 e0 ldi r16, 0x00 ; 0 + { + if (!(Table[i].Address)) + 3f2e: d6 01 movw r26, r12 + 3f30: 1c 91 ld r17, X + 3f32: 11 23 and r17, r17 + 3f34: 91 f1 breq .+100 ; 0x3f9a + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + 3f36: d6 01 movw r26, r12 + 3f38: 11 96 adiw r26, 0x01 ; 1 + 3f3a: ed 91 ld r30, X+ + 3f3c: fc 91 ld r31, X + 3f3e: 12 97 sbiw r26, 0x02 ; 2 + 3f40: 13 96 adiw r26, 0x03 ; 3 + 3f42: 8c 91 ld r24, X + 3f44: 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)); + 3f46: 14 96 adiw r26, 0x04 ; 4 + 3f48: 9c 91 ld r25, X + 3f4a: 92 30 cpi r25, 0x02 ; 2 + 3f4c: 08 f4 brcc .+2 ; 0x3f50 + 3f4e: 45 c0 rjmp .+138 ; 0x3fda + 3f50: 98 e1 ldi r25, 0x18 ; 24 + 3f52: 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) + 3f54: e9 30 cpi r30, 0x09 ; 9 + 3f56: f1 05 cpc r31, r1 + 3f58: 50 f0 brcs .+20 ; 0x3f6e + 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; + 3f5a: 28 e0 ldi r18, 0x08 ; 8 + 3f5c: 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; + 3f5e: 90 e0 ldi r25, 0x00 ; 0 + uint16_t CheckBytes = 8; + + while (CheckBytes < Bytes) + { + MaskVal++; + 3f60: 9f 5f subi r25, 0xFF ; 255 + CheckBytes <<= 1; + 3f62: 22 0f add r18, r18 + 3f64: 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) + 3f66: 2e 17 cp r18, r30 + 3f68: 3f 07 cpc r19, r31 + 3f6a: d0 f3 brcs .-12 ; 0x3f60 + 3f6c: 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) + 3f6e: 21 2f mov r18, r17 + 3f70: 2f 70 andi r18, 0x0F ; 15 + 3f72: 30 e0 ldi r19, 0x00 ; 0 + 3f74: 26 30 cpi r18, 0x06 ; 6 + 3f76: 31 05 cpc r19, r1 + 3f78: 9c f5 brge .+102 ; 0x3fe0 + return false; + + // TODO - Fix once limitations are lifted + EPConfigMask &= ~USB_EP_PINGPONG_bm; + 3f7a: 9f 7e andi r25, 0xEF ; 239 + if (Size > 64) + 3f7c: e1 34 cpi r30, 0x41 ; 65 + 3f7e: f1 05 cpc r31, r1 + 3f80: 78 f5 brcc .+94 ; 0x3fe0 + return false; + + switch (Type) + 3f82: 88 23 and r24, r24 + 3f84: 01 f1 breq .+64 ; 0x3fc6 + 3f86: 81 30 cpi r24, 0x01 ; 1 + 3f88: c9 f4 brne .+50 ; 0x3fbc + { + case EP_TYPE_CONTROL: + EPConfigMask |= USB_EP_TYPE_CONTROL_gc; + break; + case EP_TYPE_ISOCHRONOUS: + EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; + 3f8a: 90 6c ori r25, 0xC0 ; 192 + 3f8c: 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); + 3f8e: 4e 2d mov r20, r14 + 3f90: 69 2f mov r22, r25 + 3f92: 81 2f mov r24, r17 + 3f94: 70 df rcall .-288 ; 0x3e76 + 3f96: 88 23 and r24, r24 + 3f98: 19 f1 breq .+70 ; 0x3fe0 +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, + const uint8_t Entries) +{ + for (uint8_t i = 0; i < Entries; i++) + 3f9a: 0f 5f subi r16, 0xFF ; 255 + 3f9c: b5 e0 ldi r27, 0x05 ; 5 + 3f9e: cb 0e add r12, r27 + 3fa0: d1 1c adc r13, r1 + 3fa2: 0f 11 cpse r16, r15 + 3fa4: c4 cf rjmp .-120 ; 0x3f2e + { + return false; + } + } + + return true; + 3fa6: 81 e0 ldi r24, 0x01 ; 1 +} + 3fa8: 0f 90 pop r0 + 3faa: df 91 pop r29 + 3fac: cf 91 pop r28 + 3fae: 1f 91 pop r17 + 3fb0: 0f 91 pop r16 + 3fb2: ff 90 pop r15 + 3fb4: ef 90 pop r14 + 3fb6: df 90 pop r13 + 3fb8: cf 90 pop r12 + 3fba: 08 95 ret + break; + case EP_TYPE_ISOCHRONOUS: + EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; + break; + default: + EPConfigMask |= USB_EP_TYPE_BULK_gc; + 3fbc: 90 68 ori r25, 0x80 ; 128 + break; + } + + if (Type == EP_TYPE_CONTROL) + 3fbe: 88 23 and r24, r24 + 3fc0: 19 f0 breq .+6 ; 0x3fc8 + 3fc2: ee 2e mov r14, r30 + 3fc4: e4 cf rjmp .-56 ; 0x3f8e + return false; + + switch (Type) + { + case EP_TYPE_CONTROL: + EPConfigMask |= USB_EP_TYPE_CONTROL_gc; + 3fc6: 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); + 3fc8: ee 2e mov r14, r30 + 3fca: 4e 2f mov r20, r30 + 3fcc: 69 2f mov r22, r25 + 3fce: 80 e8 ldi r24, 0x80 ; 128 + 3fd0: 81 0f add r24, r17 + 3fd2: 99 83 std Y+1, r25 ; 0x01 + 3fd4: 50 df rcall .-352 ; 0x3e76 + 3fd6: 99 81 ldd r25, Y+1 ; 0x01 + 3fd8: da cf rjmp .-76 ; 0x3f8e + 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)); + 3fda: 98 e0 ldi r25, 0x08 ; 8 + 3fdc: 48 e0 ldi r20, 0x08 ; 8 + 3fde: ba cf rjmp .-140 ; 0x3f54 + if (!(Table[i].Address)) + continue; + + if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) + { + return false; + 3fe0: 80 e0 ldi r24, 0x00 ; 0 + 3fe2: e2 cf rjmp .-60 ; 0x3fa8 + +00003fe4 : + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 3fe4: e0 ec ldi r30, 0xC0 ; 192 + 3fe6: f4 e0 ldi r31, 0x04 ; 4 + 3fe8: a6 81 ldd r26, Z+6 ; 0x06 + 3fea: b7 81 ldd r27, Z+7 ; 0x07 + 3fec: 19 96 adiw r26, 0x09 ; 9 + 3fee: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 3ff0: a6 81 ldd r26, Z+6 ; 0x06 + 3ff2: b7 81 ldd r27, Z+7 ; 0x07 + 3ff4: 11 96 adiw r26, 0x01 ; 1 + 3ff6: 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; + 3ff8: a6 81 ldd r26, Z+6 ; 0x06 + 3ffa: b7 81 ldd r27, Z+7 ; 0x07 + 3ffc: 59 96 adiw r26, 0x19 ; 25 + 3ffe: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4000: a6 81 ldd r26, Z+6 ; 0x06 + 4002: b7 81 ldd r27, Z+7 ; 0x07 + 4004: 51 96 adiw r26, 0x11 ; 17 + 4006: 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; + 4008: a6 81 ldd r26, Z+6 ; 0x06 + 400a: b7 81 ldd r27, Z+7 ; 0x07 + 400c: 99 96 adiw r26, 0x29 ; 41 + 400e: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4010: a6 81 ldd r26, Z+6 ; 0x06 + 4012: b7 81 ldd r27, Z+7 ; 0x07 + 4014: 91 96 adiw r26, 0x21 ; 33 + 4016: 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; + 4018: a6 81 ldd r26, Z+6 ; 0x06 + 401a: b7 81 ldd r27, Z+7 ; 0x07 + 401c: d9 96 adiw r26, 0x39 ; 57 + 401e: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4020: a6 81 ldd r26, Z+6 ; 0x06 + 4022: b7 81 ldd r27, Z+7 ; 0x07 + 4024: d1 96 adiw r26, 0x31 ; 49 + 4026: 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; + 4028: a6 81 ldd r26, Z+6 ; 0x06 + 402a: b7 81 ldd r27, Z+7 ; 0x07 + 402c: a7 5b subi r26, 0xB7 ; 183 + 402e: bf 4f sbci r27, 0xFF ; 255 + 4030: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4032: a6 81 ldd r26, Z+6 ; 0x06 + 4034: b7 81 ldd r27, Z+7 ; 0x07 + 4036: af 5b subi r26, 0xBF ; 191 + 4038: bf 4f sbci r27, 0xFF ; 255 + 403a: 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; + 403c: a6 81 ldd r26, Z+6 ; 0x06 + 403e: b7 81 ldd r27, Z+7 ; 0x07 + 4040: a7 5a subi r26, 0xA7 ; 167 + 4042: bf 4f sbci r27, 0xFF ; 255 + 4044: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4046: 06 80 ldd r0, Z+6 ; 0x06 + 4048: f7 81 ldd r31, Z+7 ; 0x07 + 404a: e0 2d mov r30, r0 + 404c: ef 5a subi r30, 0xAF ; 175 + 404e: ff 4f sbci r31, 0xFF ; 255 + 4050: 10 82 st Z, r1 + 4052: 08 95 ret + +00004054 : + } +} + +void Endpoint_ClearStatusStage(void) +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + 4054: 80 91 15 27 lds r24, 0x2715 + 4058: 87 ff sbrs r24, 7 + 405a: 05 c0 rjmp .+10 ; 0x4066 + 405c: 0c c0 rjmp .+24 ; 0x4076 + } + else + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 405e: 80 91 14 27 lds r24, 0x2714 + 4062: 88 23 and r24, r24 + 4064: 61 f0 breq .+24 ; 0x407e + + Endpoint_ClearOUT(); + } + else + { + while (!(Endpoint_IsINReady())) + 4066: 81 de rcall .-766 ; 0x3d6a + 4068: 88 23 and r24, r24 + 406a: c9 f3 breq .-14 ; 0x405e + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + 406c: fd cd rjmp .-1030 ; 0x3c68 +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + { + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 406e: 80 91 14 27 lds r24, 0x2714 + 4072: 88 23 and r24, r24 + 4074: 21 f0 breq .+8 ; 0x407e + +void Endpoint_ClearStatusStage(void) +{ + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) + { + while (!(Endpoint_IsOUTReceived())) + 4076: 85 de rcall .-758 ; 0x3d82 + 4078: 88 23 and r24, r24 + 407a: c9 f3 breq .-14 ; 0x406e + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearOUT(); + 407c: 0e ce rjmp .-996 ; 0x3c9a + 407e: 08 95 ret + +00004080 : + } +} + +#if !defined(CONTROL_ONLY_DEVICE) +uint8_t Endpoint_WaitUntilReady(void) +{ + 4080: 1f 93 push r17 + 4082: cf 93 push r28 + 4084: 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; + 4086: e0 91 c6 04 lds r30, 0x04C6 + 408a: f0 91 c7 04 lds r31, 0x04C7 + 408e: e0 5a subi r30, 0xA0 ; 160 + 4090: ff 4f sbci r31, 0xFF ; 255 + 4092: c0 81 ld r28, Z + 4094: d1 81 ldd r29, Z+1 ; 0x01 + #if (USB_STREAM_TIMEOUT_MS < 0xFF) + uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; + 4096: 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); + 4098: 80 91 21 27 lds r24, 0x2721 + 409c: 80 78 andi r24, 0x80 ; 128 + + uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); + + for (;;) + { + if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) + 409e: 80 38 cpi r24, 0x80 ; 128 + 40a0: 31 f1 breq .+76 ; 0x40ee + if (Endpoint_IsINReady()) + return ENDPOINT_READYWAIT_NoError; + } + else + { + if (Endpoint_IsOUTReceived()) + 40a2: 6f de rcall .-802 ; 0x3d82 + 40a4: 81 11 cpse r24, r1 + 40a6: 26 c0 rjmp .+76 ; 0x40f4 + return ENDPOINT_READYWAIT_NoError; + } + + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 40a8: 80 91 14 27 lds r24, 0x2714 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 40ac: 88 23 and r24, r24 + 40ae: 39 f1 breq .+78 ; 0x40fe + return ENDPOINT_READYWAIT_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 40b0: 85 30 cpi r24, 0x05 ; 5 + 40b2: 51 f1 breq .+84 ; 0x4108 + * \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); + 40b4: e0 91 1f 27 lds r30, 0x271F + 40b8: f0 91 20 27 lds r31, 0x2720 + 40bc: 81 81 ldd r24, Z+1 ; 0x01 + return ENDPOINT_READYWAIT_BusSuspended; + else if (Endpoint_IsStalled()) + 40be: 82 fd sbrc r24, 2 + 40c0: 28 c0 rjmp .+80 ; 0x4112 + 40c2: e0 91 c6 04 lds r30, 0x04C6 + 40c6: f0 91 c7 04 lds r31, 0x04C7 + 40ca: e0 5a subi r30, 0xA0 ; 160 + 40cc: ff 4f sbci r31, 0xFF ; 255 + 40ce: 80 81 ld r24, Z + 40d0: 91 81 ldd r25, Z+1 ; 0x01 + return ENDPOINT_READYWAIT_EndpointStalled; + + uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); + + if (CurrentFrameNumber != PreviousFrameNumber) + 40d2: c8 17 cp r28, r24 + 40d4: d9 07 cpc r29, r25 + 40d6: 01 f3 breq .-64 ; 0x4098 + { + PreviousFrameNumber = CurrentFrameNumber; + + if (!(TimeoutMSRem--)) + 40d8: 2f ef ldi r18, 0xFF ; 255 + 40da: 21 0f add r18, r17 + 40dc: 11 23 and r17, r17 + 40de: f1 f0 breq .+60 ; 0x411c + 40e0: ec 01 movw r28, r24 + 40e2: 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); + 40e4: 80 91 21 27 lds r24, 0x2721 + 40e8: 80 78 andi r24, 0x80 ; 128 + + uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); + + for (;;) + { + if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) + 40ea: 80 38 cpi r24, 0x80 ; 128 + 40ec: d1 f6 brne .-76 ; 0x40a2 + { + if (Endpoint_IsINReady()) + 40ee: 3d de rcall .-902 ; 0x3d6a + 40f0: 88 23 and r24, r24 + 40f2: d1 f2 breq .-76 ; 0x40a8 + return ENDPOINT_READYWAIT_NoError; + 40f4: 80 e0 ldi r24, 0x00 ; 0 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 40f6: df 91 pop r29 + 40f8: cf 91 pop r28 + 40fa: 1f 91 pop r17 + 40fc: 08 95 ret + } + + uint8_t USB_DeviceState_LCL = USB_DeviceState; + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_READYWAIT_DeviceDisconnected; + 40fe: 82 e0 ldi r24, 0x02 ; 2 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 4100: df 91 pop r29 + 4102: cf 91 pop r28 + 4104: 1f 91 pop r17 + 4106: 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; + 4108: 83 e0 ldi r24, 0x03 ; 3 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 410a: df 91 pop r29 + 410c: cf 91 pop r28 + 410e: 1f 91 pop r17 + 4110: 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; + 4112: 81 e0 ldi r24, 0x01 ; 1 + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + } + } +} + 4114: df 91 pop r29 + 4116: cf 91 pop r28 + 4118: 1f 91 pop r17 + 411a: 08 95 ret + if (CurrentFrameNumber != PreviousFrameNumber) + { + PreviousFrameNumber = CurrentFrameNumber; + + if (!(TimeoutMSRem--)) + return ENDPOINT_READYWAIT_Timeout; + 411c: 84 e0 ldi r24, 0x04 ; 4 + } + } +} + 411e: df 91 pop r29 + 4120: cf 91 pop r28 + 4122: 1f 91 pop r17 + 4124: 08 95 ret + +00004126 : + USB_ResetInterface(); +} + +void USB_Disable(void) +{ + USB_INT_DisableAllInterrupts(); + 4126: 62 d0 rcall .+196 ; 0x41ec + USB_INT_ClearAllInterrupts(); + 4128: 68 d0 rcall .+208 ; 0x41fa + * 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; + 412a: e0 ec ldi r30, 0xC0 ; 192 + 412c: f4 e0 ldi r31, 0x04 ; 4 + 412e: 81 81 ldd r24, Z+1 ; 0x01 + 4130: 8e 7f andi r24, 0xFE ; 254 + 4132: 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; + 4134: 80 81 ld r24, Z + 4136: 8f 77 andi r24, 0x7F ; 127 + 4138: 80 83 st Z, r24 + + USB_Detach(); + USB_Controller_Disable(); + + USB_IsInitialized = false; + 413a: 10 92 13 27 sts 0x2713, r1 + 413e: 08 95 ret + +00004140 : +} + +void USB_ResetInterface(void) +{ + 4140: cf 93 push r28 + 4142: 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); + 4144: e0 e4 ldi r30, 0x40 ; 64 + 4146: f0 e0 ldi r31, 0x00 ; 0 + 4148: 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); + 414a: 84 81 ldd r24, Z+4 ; 0x04 + 414c: 81 60 ori r24, 0x01 ; 1 + 414e: 84 83 std Z+4, r24 ; 0x04 + else + CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); + + USB_Device_SetDeviceAddress(0); + + USB_INT_DisableAllInterrupts(); + 4150: 4d d0 rcall .+154 ; 0x41ec + USB_INT_ClearAllInterrupts(); + 4152: 53 d0 rcall .+166 ; 0x41fa + } + + static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; + static inline void USB_Controller_Reset(void) + { + USB.CTRLA &= ~USB_ENABLE_bm; + 4154: c0 ec ldi r28, 0xC0 ; 192 + 4156: d4 e0 ldi r29, 0x04 ; 4 + 4158: 88 81 ld r24, Y + 415a: 8f 77 andi r24, 0x7F ; 127 + 415c: 88 83 st Y, r24 + USB.CTRLA |= USB_ENABLE_bm; + 415e: 88 81 ld r24, Y + 4160: 80 68 ori r24, 0x80 ; 128 + 4162: 88 83 st Y, r24 +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_Init_Device(void) +{ + USB_DeviceState = DEVICE_STATE_Unattached; + 4164: 10 92 14 27 sts 0x2714, r1 + USB_Device_ConfigurationNumber = 0; + 4168: 10 92 10 27 sts 0x2710, r1 + + #if !defined(NO_DEVICE_REMOTE_WAKEUP) + USB_Device_RemoteWakeupEnabled = false; + 416c: 10 92 12 27 sts 0x2712, r1 + #endif + + #if !defined(NO_DEVICE_SELF_POWER) + USB_Device_CurrentlySelfPowered = false; + 4170: 10 92 11 27 sts 0x2711, r1 + } + + static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; + static inline void USB_Device_SetFullSpeed(void) + { + USB.CTRLA |= USB_SPEED_bm; + 4174: 88 81 ld r24, Y + 4176: 80 64 ori r24, 0x40 ; 64 + 4178: 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); + 417a: 48 e0 ldi r20, 0x08 ; 8 + 417c: 68 e4 ldi r22, 0x48 ; 72 + 417e: 80 e8 ldi r24, 0x80 ; 128 + 4180: 7a de rcall .-780 ; 0x3e76 + + return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); + 4182: 48 e0 ldi r20, 0x08 ; 8 + 4184: 68 e4 ldi r22, 0x48 ; 72 + 4186: 80 e0 ldi r24, 0x00 ; 0 + 4188: 76 de rcall .-788 ; 0x3e76 + static inline void USB_INT_Enable(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_BUSEVENTI: + USB.INTCTRLA |= USB_BUSEVIE_bm; + 418a: 88 85 ldd r24, Y+8 ; 0x08 + 418c: 80 64 ori r24, 0x40 ; 64 + 418e: 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; + 4190: 89 81 ldd r24, Y+1 ; 0x01 + 4192: 81 60 ori r24, 0x01 ; 1 + 4194: 89 83 std Y+1, r24 ; 0x01 + USB_INT_DisableAllInterrupts(); + USB_INT_ClearAllInterrupts(); + + USB_Controller_Reset(); + USB_Init_Device(); +} + 4196: df 91 pop r29 + 4198: cf 91 pop r28 + 419a: 08 95 ret + +0000419c : + #if (ARCH == ARCH_AVR8) + return SREG; + #elif (ARCH == ARCH_UC3) + return __builtin_mfsr(AVR32_SR); + #elif (ARCH == ARCH_XMEGA) + return SREG; + 419c: 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(); + 419e: f8 94 cli + #endif + + uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); + GlobalInterruptDisable(); + + NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; + 41a0: 82 e0 ldi r24, 0x02 ; 2 + 41a2: e0 ec ldi r30, 0xC0 ; 192 + 41a4: f1 e0 ldi r31, 0x01 ; 1 + 41a6: 82 87 std Z+10, r24 ; 0x0a + USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); + 41a8: ea e1 ldi r30, 0x1A ; 26 + 41aa: f0 e0 ldi r31, 0x00 ; 0 + 41ac: e4 91 lpm r30, Z + 41ae: a0 ec ldi r26, 0xC0 ; 192 + 41b0: b4 e0 ldi r27, 0x04 ; 4 + 41b2: da 96 adiw r26, 0x3a ; 58 + 41b4: ec 93 st X, r30 + 41b6: da 97 sbiw r26, 0x3a ; 58 + USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); + 41b8: eb e1 ldi r30, 0x1B ; 27 + 41ba: f0 e0 ldi r31, 0x00 ; 0 + 41bc: e4 91 lpm r30, Z + 41be: db 96 adiw r26, 0x3b ; 59 + 41c0: ec 93 st X, r30 + 41c2: db 97 sbiw r26, 0x3b ; 59 + NVM.CMD = NVM_CMD_NO_OPERATION_gc; + 41c4: e0 ec ldi r30, 0xC0 ; 192 + 41c6: f1 e0 ldi r31, 0x01 ; 1 + 41c8: 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)); + 41ca: 8b e3 ldi r24, 0x3B ; 59 + 41cc: 9a e2 ldi r25, 0x2A ; 42 + 41ce: 8e 7f andi r24, 0xFE ; 254 + 41d0: 16 96 adiw r26, 0x06 ; 6 + 41d2: 8d 93 st X+, r24 + 41d4: 9c 93 st X, r25 + 41d6: 17 97 sbiw r26, 0x07 ; 7 + USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); + 41d8: 85 e1 ldi r24, 0x15 ; 21 + 41da: 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); + 41dc: 82 e0 ldi r24, 0x02 ; 2 + 41de: 18 96 adiw r26, 0x08 ; 8 + 41e0: 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; + 41e2: 2f bf out 0x3f, r18 ; 63 + + #if defined(USB_CAN_BE_BOTH) + USB_CurrentMode = Mode; + #endif + + USB_IsInitialized = true; + 41e4: 81 e0 ldi r24, 0x01 ; 1 + 41e6: 80 93 13 27 sts 0x2713, r24 + + USB_ResetInterface(); + 41ea: aa cf rjmp .-172 ; 0x4140 + +000041ec : +#define __INCLUDE_FROM_USB_DRIVER +#include "../USBInterrupt.h" + +void USB_INT_DisableAllInterrupts(void) +{ + USB.INTCTRLA &= USB_INTLVL_gm; + 41ec: e0 ec ldi r30, 0xC0 ; 192 + 41ee: f4 e0 ldi r31, 0x04 ; 4 + 41f0: 80 85 ldd r24, Z+8 ; 0x08 + 41f2: 83 70 andi r24, 0x03 ; 3 + 41f4: 80 87 std Z+8, r24 ; 0x08 + USB.INTCTRLB = 0; + 41f6: 11 86 std Z+9, r1 ; 0x09 + 41f8: 08 95 ret + +000041fa : +} + +void USB_INT_ClearAllInterrupts(void) +{ + USB.INTFLAGSACLR = 0xFF; + 41fa: e0 ec ldi r30, 0xC0 ; 192 + 41fc: f4 e0 ldi r31, 0x04 ; 4 + 41fe: 8f ef ldi r24, 0xFF ; 255 + 4200: 82 87 std Z+10, r24 ; 0x0a + USB.INTFLAGSBCLR = 0xFF; + 4202: 84 87 std Z+12, r24 ; 0x0c + 4204: 08 95 ret + +00004206 <__vector_125>: +} + +ISR(USB_BUSEVENT_vect) +{ + 4206: 1f 92 push r1 + 4208: 0f 92 push r0 + 420a: 0f b6 in r0, 0x3f ; 63 + 420c: 0f 92 push r0 + 420e: 11 24 eor r1, r1 + 4210: 2f 93 push r18 + 4212: 3f 93 push r19 + 4214: 4f 93 push r20 + 4216: 5f 93 push r21 + 4218: 6f 93 push r22 + 421a: 7f 93 push r23 + 421c: 8f 93 push r24 + 421e: 9f 93 push r25 + 4220: af 93 push r26 + 4222: bf 93 push r27 + 4224: ef 93 push r30 + 4226: 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); + 4228: 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)) + 422c: 87 fd sbrc r24, 7 + 422e: 4d c0 rjmp .+154 ; 0x42ca <__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); + 4230: 80 91 ca 04 lds r24, 0x04CA + + EVENT_USB_Device_StartOfFrame(); + } + #endif + + if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) + 4234: 86 fd sbrc r24, 6 + 4236: 41 c0 rjmp .+130 ; 0x42ba <__vector_125+0xb4> + case USB_INT_BUSEVENTI_Resume: + return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); + 4238: 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)) + 423c: 85 ff sbrs r24, 5 + 423e: 0c c0 rjmp .+24 ; 0x4258 <__vector_125+0x52> + { + case USB_INT_BUSEVENTI_Suspend: + USB.INTFLAGSACLR = USB_SUSPENDIF_bm; + break; + case USB_INT_BUSEVENTI_Resume: + USB.INTFLAGSACLR = USB_RESUMEIF_bm; + 4240: 80 e2 ldi r24, 0x20 ; 32 + 4242: 80 93 ca 04 sts 0x04CA, r24 + { + USB_INT_Clear(USB_INT_BUSEVENTI_Resume); + + if (USB_Device_ConfigurationNumber) + 4246: 80 91 10 27 lds r24, 0x2710 + 424a: 88 23 and r24, r24 + 424c: 71 f1 breq .+92 ; 0x42aa <__vector_125+0xa4> + USB_DeviceState = DEVICE_STATE_Configured; + 424e: 84 e0 ldi r24, 0x04 ; 4 + 4250: 80 93 14 27 sts 0x2714, r24 + else + USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; + + #if !defined(NO_LIMITED_CONTROLLER_CONNECT) + EVENT_USB_Device_Connect(); + 4254: 0e 94 02 0d call 0x1a04 ; 0x1a04 + 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); + 4258: 80 91 ca 04 lds r24, 0x04CA + #else + EVENT_USB_Device_WakeUp(); + #endif + } + + if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) + 425c: 84 ff sbrs r24, 4 + 425e: 14 c0 rjmp .+40 ; 0x4288 <__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; + 4260: 80 e1 ldi r24, 0x10 ; 16 + 4262: 80 93 ca 04 sts 0x04CA, r24 + { + USB_INT_Clear(USB_INT_BUSEVENTI_Reset); + + USB_DeviceState = DEVICE_STATE_Default; + 4266: 82 e0 ldi r24, 0x02 ; 2 + 4268: 80 93 14 27 sts 0x2714, r24 + USB_Device_ConfigurationNumber = 0; + 426c: 10 92 10 27 sts 0x2710, 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; + 4270: 10 92 c3 04 sts 0x04C3, r1 + + USB_Device_EnableDeviceAddress(0); + + Endpoint_ClearEndpoints(); + 4274: b7 de rcall .-658 ; 0x3fe4 + EPConfigMask |= USB_EP_TYPE_BULK_gc; + break; + } + + if (Type == EP_TYPE_CONTROL) + Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + 4276: 48 e0 ldi r20, 0x08 ; 8 + 4278: 68 e4 ldi r22, 0x48 ; 72 + 427a: 80 e8 ldi r24, 0x80 ; 128 + 427c: fc dd rcall .-1032 ; 0x3e76 + + return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); + 427e: 48 e0 ldi r20, 0x08 ; 8 + 4280: 68 e4 ldi r22, 0x48 ; 72 + 4282: 80 e0 ldi r24, 0x00 ; 0 + 4284: f8 dd rcall .-1040 ; 0x3e76 + Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, + USB_Device_ControlEndpointSize, 1); + + EVENT_USB_Device_Reset(); + 4286: 35 db rcall .-2454 ; 0x38f2 + } +} + 4288: ff 91 pop r31 + 428a: ef 91 pop r30 + 428c: bf 91 pop r27 + 428e: af 91 pop r26 + 4290: 9f 91 pop r25 + 4292: 8f 91 pop r24 + 4294: 7f 91 pop r23 + 4296: 6f 91 pop r22 + 4298: 5f 91 pop r21 + 429a: 4f 91 pop r20 + 429c: 3f 91 pop r19 + 429e: 2f 91 pop r18 + 42a0: 0f 90 pop r0 + 42a2: 0f be out 0x3f, r0 ; 63 + 42a4: 0f 90 pop r0 + 42a6: 1f 90 pop r1 + 42a8: 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); + 42aa: 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; + 42ae: 81 11 cpse r24, r1 + 42b0: 15 c0 rjmp .+42 ; 0x42dc <__vector_125+0xd6> + 42b2: 81 e0 ldi r24, 0x01 ; 1 + 42b4: 80 93 14 27 sts 0x2714, r24 + 42b8: cd cf rjmp .-102 ; 0x4254 <__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; + 42ba: 80 e4 ldi r24, 0x40 ; 64 + 42bc: 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; + 42c0: 10 92 14 27 sts 0x2714, r1 + EVENT_USB_Device_Disconnect(); + 42c4: 0e 94 07 0d call 0x1a0e ; 0x1a0e + 42c8: b7 cf rjmp .-146 ; 0x4238 <__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); + 42ca: 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)) + 42ce: 87 ff sbrs r24, 7 + 42d0: af cf rjmp .-162 ; 0x4230 <__vector_125+0x2a> + break; + case USB_INT_BUSEVENTI_Reset: + USB.INTFLAGSACLR = USB_RSTIF_bm; + break; + case USB_INT_SOFI: + USB.INTFLAGSACLR = USB_SOFIF_bm; + 42d2: 80 e8 ldi r24, 0x80 ; 128 + 42d4: 80 93 ca 04 sts 0x04CA, r24 + { + USB_INT_Clear(USB_INT_SOFI); + + EVENT_USB_Device_StartOfFrame(); + 42d8: 0c db rcall .-2536 ; 0x38f2 + 42da: aa cf rjmp .-172 ; 0x4230 <__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; + 42dc: 83 e0 ldi r24, 0x03 ; 3 + 42de: ea cf rjmp .-44 ; 0x42b4 <__vector_125+0xae> + +000042e0 : + +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); + 42e0: cf 93 push r28 + 42e2: df 93 push r29 + 42e4: ec 01 movw r28, r24 + 42e6: fc 01 movw r30, r24 + 42e8: 70 96 adiw r30, 0x10 ; 16 + 42ea: 8b e0 ldi r24, 0x0B ; 11 + 42ec: df 01 movw r26, r30 + 42ee: 1d 92 st X+, r1 + 42f0: 8a 95 dec r24 + 42f2: e9 f7 brne .-6 ; 0x42ee + 42f4: 82 e0 ldi r24, 0x02 ; 2 + 42f6: 8c 83 std Y+4, r24 ; 0x04 + 42f8: 89 87 std Y+9, r24 ; 0x09 + 42fa: 83 e0 ldi r24, 0x03 ; 3 + 42fc: 8e 87 std Y+14, r24 ; 0x0e + 42fe: 61 e0 ldi r22, 0x01 ; 1 + 4300: ce 01 movw r24, r28 + 4302: 01 96 adiw r24, 0x01 ; 1 + 4304: 03 de rcall .-1018 ; 0x3f0c + 4306: 81 11 cpse r24, r1 + 4308: 04 c0 rjmp .+8 ; 0x4312 + 430a: 80 e0 ldi r24, 0x00 ; 0 + 430c: df 91 pop r29 + 430e: cf 91 pop r28 + 4310: 08 95 ret + 4312: 61 e0 ldi r22, 0x01 ; 1 + 4314: ce 01 movw r24, r28 + 4316: 06 96 adiw r24, 0x06 ; 6 + 4318: f9 dd rcall .-1038 ; 0x3f0c + 431a: 88 23 and r24, r24 + 431c: b1 f3 breq .-20 ; 0x430a + 431e: 61 e0 ldi r22, 0x01 ; 1 + 4320: ce 01 movw r24, r28 + 4322: 0b 96 adiw r24, 0x0b ; 11 + 4324: df 91 pop r29 + 4326: cf 91 pop r28 + 4328: f1 cd rjmp .-1054 ; 0x3f0c + +0000432a : + 432a: cf 93 push r28 + 432c: df 93 push r29 + 432e: eb 01 movw r28, r22 + 4330: 20 91 14 27 lds r18, 0x2714 + 4334: 24 30 cpi r18, 0x04 ; 4 + 4336: 21 f0 breq .+8 ; 0x4340 + 4338: 82 e0 ldi r24, 0x02 ; 2 + 433a: df 91 pop r29 + 433c: cf 91 pop r28 + 433e: 08 95 ret + 4340: fc 01 movw r30, r24 + 4342: 44 89 ldd r20, Z+20 ; 0x14 + 4344: 55 89 ldd r21, Z+21 ; 0x15 + 4346: 66 89 ldd r22, Z+22 ; 0x16 + 4348: 77 89 ldd r23, Z+23 ; 0x17 + 434a: 45 2b or r20, r21 + 434c: 46 2b or r20, r22 + 434e: 47 2b or r20, r23 + 4350: 99 f3 breq .-26 ; 0x4338 + 4352: 81 81 ldd r24, Z+1 ; 0x01 + 4354: d1 dc rcall .-1630 ; 0x3cf8 + 4356: fe 01 movw r30, r28 + 4358: 01 90 ld r0, Z+ + 435a: 00 20 and r0, r0 + 435c: e9 f7 brne .-6 ; 0x4358 + 435e: bf 01 movw r22, r30 + 4360: 61 50 subi r22, 0x01 ; 1 + 4362: 71 09 sbc r23, r1 + 4364: 6c 1b sub r22, r28 + 4366: 7d 0b sbc r23, r29 + 4368: 40 e0 ldi r20, 0x00 ; 0 + 436a: 50 e0 ldi r21, 0x00 ; 0 + 436c: ce 01 movw r24, r28 + 436e: df 91 pop r29 + 4370: cf 91 pop r28 + 4372: d5 ca rjmp .-2646 ; 0x391e + +00004374 : + 4374: ef 92 push r14 + 4376: ff 92 push r15 + 4378: 0f 93 push r16 + 437a: 1f 93 push r17 + 437c: cf 93 push r28 + 437e: df 93 push r29 + 4380: eb 01 movw r28, r22 + 4382: 7a 01 movw r14, r20 + 4384: 20 91 14 27 lds r18, 0x2714 + 4388: 24 30 cpi r18, 0x04 ; 4 + 438a: 41 f0 breq .+16 ; 0x439c + 438c: 82 e0 ldi r24, 0x02 ; 2 + 438e: df 91 pop r29 + 4390: cf 91 pop r28 + 4392: 1f 91 pop r17 + 4394: 0f 91 pop r16 + 4396: ff 90 pop r15 + 4398: ef 90 pop r14 + 439a: 08 95 ret + 439c: fc 01 movw r30, r24 + 439e: 04 89 ldd r16, Z+20 ; 0x14 + 43a0: 15 89 ldd r17, Z+21 ; 0x15 + 43a2: 26 89 ldd r18, Z+22 ; 0x16 + 43a4: 37 89 ldd r19, Z+23 ; 0x17 + 43a6: 01 2b or r16, r17 + 43a8: 02 2b or r16, r18 + 43aa: 03 2b or r16, r19 + 43ac: 79 f3 breq .-34 ; 0x438c + 43ae: 81 81 ldd r24, Z+1 ; 0x01 + 43b0: a3 dc rcall .-1722 ; 0x3cf8 + 43b2: 40 e0 ldi r20, 0x00 ; 0 + 43b4: 50 e0 ldi r21, 0x00 ; 0 + 43b6: b7 01 movw r22, r14 + 43b8: ce 01 movw r24, r28 + 43ba: df 91 pop r29 + 43bc: cf 91 pop r28 + 43be: 1f 91 pop r17 + 43c0: 0f 91 pop r16 + 43c2: ff 90 pop r15 + 43c4: ef 90 pop r14 + 43c6: ab ca rjmp .-2730 ; 0x391e + +000043c8 : + 43c8: 0f 93 push r16 + 43ca: 1f 93 push r17 + 43cc: cf 93 push r28 + 43ce: df 93 push r29 + 43d0: 1f 92 push r1 + 43d2: cd b7 in r28, 0x3d ; 61 + 43d4: de b7 in r29, 0x3e ; 62 + 43d6: 20 91 14 27 lds r18, 0x2714 + 43da: 24 30 cpi r18, 0x04 ; 4 + 43dc: 39 f0 breq .+14 ; 0x43ec + 43de: 82 e0 ldi r24, 0x02 ; 2 + 43e0: 0f 90 pop r0 + 43e2: df 91 pop r29 + 43e4: cf 91 pop r28 + 43e6: 1f 91 pop r17 + 43e8: 0f 91 pop r16 + 43ea: 08 95 ret + 43ec: fc 01 movw r30, r24 + 43ee: 04 89 ldd r16, Z+20 ; 0x14 + 43f0: 15 89 ldd r17, Z+21 ; 0x15 + 43f2: 26 89 ldd r18, Z+22 ; 0x16 + 43f4: 37 89 ldd r19, Z+23 ; 0x17 + 43f6: 01 2b or r16, r17 + 43f8: 02 2b or r16, r18 + 43fa: 03 2b or r16, r19 + 43fc: 81 f3 breq .-32 ; 0x43de + 43fe: 81 81 ldd r24, Z+1 ; 0x01 + 4400: 69 83 std Y+1, r22 ; 0x01 + 4402: 7a dc rcall .-1804 ; 0x3cf8 + 4404: 20 91 1d 27 lds r18, 0x271D + 4408: 30 91 1e 27 lds r19, 0x271E + 440c: f9 01 movw r30, r18 + 440e: ef 5b subi r30, 0xBF ; 191 + 4410: ff 4f sbci r31, 0xFF ; 255 + 4412: 90 81 ld r25, Z + 4414: 31 97 sbiw r30, 0x01 ; 1 + 4416: 80 81 ld r24, Z + 4418: 69 81 ldd r22, Y+1 ; 0x01 + 441a: 98 17 cp r25, r24 + 441c: 30 f0 brcs .+12 ; 0x442a + 441e: 69 83 std Y+1, r22 ; 0x01 + 4420: 23 dc rcall .-1978 ; 0x3c68 + 4422: 2e de rcall .-932 ; 0x4080 + 4424: 69 81 ldd r22, Y+1 ; 0x01 + 4426: 81 11 cpse r24, r1 + 4428: db cf rjmp .-74 ; 0x43e0 + 442a: 86 2f mov r24, r22 + 442c: 55 dc rcall .-1878 ; 0x3cd8 + 442e: 80 e0 ldi r24, 0x00 ; 0 + 4430: d7 cf rjmp .-82 ; 0x43e0 + +00004432 : + 4432: cf 93 push r28 + 4434: df 93 push r29 + 4436: 20 91 14 27 lds r18, 0x2714 + 443a: 24 30 cpi r18, 0x04 ; 4 + 443c: 21 f0 breq .+8 ; 0x4446 + 443e: 82 e0 ldi r24, 0x02 ; 2 + 4440: df 91 pop r29 + 4442: cf 91 pop r28 + 4444: 08 95 ret + 4446: fc 01 movw r30, r24 + 4448: 44 89 ldd r20, Z+20 ; 0x14 + 444a: 55 89 ldd r21, Z+21 ; 0x15 + 444c: 66 89 ldd r22, Z+22 ; 0x16 + 444e: 77 89 ldd r23, Z+23 ; 0x17 + 4450: 45 2b or r20, r21 + 4452: 46 2b or r20, r22 + 4454: 47 2b or r20, r23 + 4456: 99 f3 breq .-26 ; 0x443e + 4458: 81 81 ldd r24, Z+1 ; 0x01 + 445a: 4e dc rcall .-1892 ; 0x3cf8 + 445c: 80 91 21 27 lds r24, 0x2721 + 4460: 20 91 1d 27 lds r18, 0x271D + 4464: 30 91 1e 27 lds r19, 0x271E + 4468: f9 01 movw r30, r18 + 446a: 87 fd sbrc r24, 7 + 446c: 1b c0 rjmp .+54 ; 0x44a4 + 446e: e0 5c subi r30, 0xC0 ; 192 + 4470: ff 4f sbci r31, 0xFF ; 255 + 4472: 80 81 ld r24, Z + 4474: 31 96 adiw r30, 0x01 ; 1 + 4476: 40 81 ld r20, Z + 4478: 90 e0 ldi r25, 0x00 ; 0 + 447a: 84 1b sub r24, r20 + 447c: 91 09 sbc r25, r1 + 447e: 89 2b or r24, r25 + 4480: 11 f4 brne .+4 ; 0x4486 + 4482: 80 e0 ldi r24, 0x00 ; 0 + 4484: dd cf rjmp .-70 ; 0x4440 + 4486: f9 01 movw r30, r18 + 4488: ef 5b subi r30, 0xBF ; 191 + 448a: ff 4f sbci r31, 0xFF ; 255 + 448c: d0 81 ld r29, Z + 448e: 31 97 sbiw r30, 0x01 ; 1 + 4490: c0 81 ld r28, Z + 4492: ea db rcall .-2092 ; 0x3c68 + 4494: dc 17 cp r29, r28 + 4496: a8 f3 brcs .-22 ; 0x4482 + 4498: f3 dd rcall .-1050 ; 0x4080 + 449a: 81 11 cpse r24, r1 + 449c: d1 cf rjmp .-94 ; 0x4440 + 449e: e4 db rcall .-2104 ; 0x3c68 + 44a0: 80 e0 ldi r24, 0x00 ; 0 + 44a2: ce cf rjmp .-100 ; 0x4440 + 44a4: ef 5b subi r30, 0xBF ; 191 + 44a6: ff 4f sbci r31, 0xFF ; 255 + 44a8: 80 81 ld r24, Z + 44aa: 90 e0 ldi r25, 0x00 ; 0 + 44ac: e8 cf rjmp .-48 ; 0x447e + +000044ae : + 44ae: cf 93 push r28 + 44b0: df 93 push r29 + 44b2: ec 01 movw r28, r24 + 44b4: 80 91 14 27 lds r24, 0x2714 + 44b8: 84 30 cpi r24, 0x04 ; 4 + 44ba: 19 f0 breq .+6 ; 0x44c2 + 44bc: df 91 pop r29 + 44be: cf 91 pop r28 + 44c0: 08 95 ret + 44c2: 4c 89 ldd r20, Y+20 ; 0x14 + 44c4: 5d 89 ldd r21, Y+21 ; 0x15 + 44c6: 6e 89 ldd r22, Y+22 ; 0x16 + 44c8: 7f 89 ldd r23, Y+23 ; 0x17 + 44ca: 45 2b or r20, r21 + 44cc: 46 2b or r20, r22 + 44ce: 47 2b or r20, r23 + 44d0: a9 f3 breq .-22 ; 0x44bc + 44d2: 89 81 ldd r24, Y+1 ; 0x01 + 44d4: 11 dc rcall .-2014 ; 0x3cf8 + 44d6: 49 dc rcall .-1902 ; 0x3d6a + 44d8: 88 23 and r24, r24 + 44da: 81 f3 breq .-32 ; 0x44bc + 44dc: ce 01 movw r24, r28 + 44de: df 91 pop r29 + 44e0: cf 91 pop r28 + 44e2: a7 cf rjmp .-178 ; 0x4432 + +000044e4 : + 44e4: cf 93 push r28 + 44e6: df 93 push r29 + 44e8: 20 91 14 27 lds r18, 0x2714 + 44ec: 24 30 cpi r18, 0x04 ; 4 + 44ee: a9 f5 brne .+106 ; 0x455a + 44f0: fc 01 movw r30, r24 + 44f2: 44 89 ldd r20, Z+20 ; 0x14 + 44f4: 55 89 ldd r21, Z+21 ; 0x15 + 44f6: 66 89 ldd r22, Z+22 ; 0x16 + 44f8: 77 89 ldd r23, Z+23 ; 0x17 + 44fa: 45 2b or r20, r21 + 44fc: 46 2b or r20, r22 + 44fe: 47 2b or r20, r23 + 4500: 61 f1 breq .+88 ; 0x455a + 4502: 86 81 ldd r24, Z+6 ; 0x06 + 4504: f9 db rcall .-2062 ; 0x3cf8 + 4506: 3d dc rcall .-1926 ; 0x3d82 + 4508: 88 23 and r24, r24 + 450a: 39 f1 breq .+78 ; 0x455a + 450c: 80 91 21 27 lds r24, 0x2721 + 4510: 40 91 1d 27 lds r20, 0x271D + 4514: 50 91 1e 27 lds r21, 0x271E + 4518: fa 01 movw r30, r20 + 451a: 87 fd sbrc r24, 7 + 451c: 3a c0 rjmp .+116 ; 0x4592 + 451e: e0 5c subi r30, 0xC0 ; 192 + 4520: ff 4f sbci r31, 0xFF ; 255 + 4522: 80 81 ld r24, Z + 4524: 31 96 adiw r30, 0x01 ; 1 + 4526: 20 81 ld r18, Z + 4528: 90 e0 ldi r25, 0x00 ; 0 + 452a: 82 1b sub r24, r18 + 452c: 91 09 sbc r25, r1 + 452e: 89 2b or r24, r25 + 4530: c9 f4 brne .+50 ; 0x4564 + 4532: cf ef ldi r28, 0xFF ; 255 + 4534: df ef ldi r29, 0xFF ; 255 + 4536: 80 91 21 27 lds r24, 0x2721 + 453a: fa 01 movw r30, r20 + 453c: 87 fd sbrc r24, 7 + 453e: 1e c0 rjmp .+60 ; 0x457c + 4540: e0 5c subi r30, 0xC0 ; 192 + 4542: ff 4f sbci r31, 0xFF ; 255 + 4544: 20 81 ld r18, Z + 4546: 31 96 adiw r30, 0x01 ; 1 + 4548: 80 81 ld r24, Z + 454a: 30 e0 ldi r19, 0x00 ; 0 + 454c: 28 1b sub r18, r24 + 454e: 31 09 sbc r19, r1 + 4550: d9 f0 breq .+54 ; 0x4588 + 4552: ce 01 movw r24, r28 + 4554: df 91 pop r29 + 4556: cf 91 pop r28 + 4558: 08 95 ret + 455a: 8f ef ldi r24, 0xFF ; 255 + 455c: 9f ef ldi r25, 0xFF ; 255 + 455e: df 91 pop r29 + 4560: cf 91 pop r28 + 4562: 08 95 ret + 4564: a9 db rcall .-2222 ; 0x3cb8 + 4566: c8 2f mov r28, r24 + 4568: d0 e0 ldi r29, 0x00 ; 0 + 456a: 40 91 1d 27 lds r20, 0x271D + 456e: 50 91 1e 27 lds r21, 0x271E + 4572: 80 91 21 27 lds r24, 0x2721 + 4576: fa 01 movw r30, r20 + 4578: 87 ff sbrs r24, 7 + 457a: e2 cf rjmp .-60 ; 0x4540 + 457c: ef 5b subi r30, 0xBF ; 191 + 457e: ff 4f sbci r31, 0xFF ; 255 + 4580: 20 81 ld r18, Z + 4582: 30 e0 ldi r19, 0x00 ; 0 + 4584: 23 2b or r18, r19 + 4586: 29 f7 brne .-54 ; 0x4552 + 4588: 88 db rcall .-2288 ; 0x3c9a + 458a: ce 01 movw r24, r28 + 458c: df 91 pop r29 + 458e: cf 91 pop r28 + 4590: 08 95 ret + 4592: ef 5b subi r30, 0xBF ; 191 + 4594: ff 4f sbci r31, 0xFF ; 255 + 4596: 80 81 ld r24, Z + 4598: 90 e0 ldi r25, 0x00 ; 0 + 459a: c9 cf rjmp .-110 ; 0x452e + +0000459c : + return ReceivedByte; +} +#endif + +void CDC_Device_Event_Stub(void) +{ + 459c: 08 95 ret + +0000459e : +#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) +{ + 459e: ff 92 push r15 + 45a0: 0f 93 push r16 + 45a2: 1f 93 push r17 + 45a4: cf 93 push r28 + 45a6: df 93 push r29 + 45a8: ec 01 movw r28, r24 + if (!(Endpoint_IsSETUPReceived())) + 45aa: 04 dc rcall .-2040 ; 0x3db4 + 45ac: 88 23 and r24, r24 + 45ae: 49 f0 breq .+18 ; 0x45c2 + return; + + if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) + 45b0: 88 81 ld r24, Y + 45b2: 90 e0 ldi r25, 0x00 ; 0 + 45b4: 20 91 19 27 lds r18, 0x2719 + 45b8: 30 91 1a 27 lds r19, 0x271A + 45bc: 28 17 cp r18, r24 + 45be: 39 07 cpc r19, r25 + 45c0: 31 f0 breq .+12 ; 0x45ce + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 45c2: df 91 pop r29 + 45c4: cf 91 pop r28 + 45c6: 1f 91 pop r17 + 45c8: 0f 91 pop r16 + 45ca: ff 90 pop r15 + 45cc: 08 95 ret + return; + + if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + 45ce: 80 91 16 27 lds r24, 0x2716 + 45d2: 81 32 cpi r24, 0x21 ; 33 + 45d4: 09 f4 brne .+2 ; 0x45d8 + 45d6: 48 c0 rjmp .+144 ; 0x4668 + 45d8: a0 f0 brcs .+40 ; 0x4602 + 45da: 82 32 cpi r24, 0x22 ; 34 + 45dc: 09 f4 brne .+2 ; 0x45e0 + 45de: 65 c0 rjmp .+202 ; 0x46aa + 45e0: 83 32 cpi r24, 0x23 ; 35 + 45e2: 79 f7 brne .-34 ; 0x45c2 + EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); + } + + break; + case CDC_REQ_SendBreak: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + 45e4: 80 91 15 27 lds r24, 0x2715 + 45e8: 81 32 cpi r24, 0x21 ; 33 + 45ea: 59 f7 brne .-42 ; 0x45c2 + { + Endpoint_ClearSETUP(); + 45ec: fc db rcall .-2056 ; 0x3de6 + Endpoint_ClearStatusStage(); + 45ee: 32 dd rcall .-1436 ; 0x4054 + + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + 45f0: 60 91 17 27 lds r22, 0x2717 + 45f4: ce 01 movw r24, r28 + } + + break; + } +} + 45f6: df 91 pop r29 + 45f8: cf 91 pop r28 + 45fa: 1f 91 pop r17 + 45fc: 0f 91 pop r16 + 45fe: 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); + 4600: cd cf rjmp .-102 ; 0x459c + return; + + if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + 4602: 80 32 cpi r24, 0x20 ; 32 + 4604: f1 f6 brne .-68 ; 0x45c2 + Endpoint_ClearStatusStage(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + 4606: 80 91 15 27 lds r24, 0x2715 + 460a: 81 32 cpi r24, 0x21 ; 33 + 460c: d1 f6 brne .-76 ; 0x45c2 + { + Endpoint_ClearSETUP(); + 460e: eb db rcall .-2090 ; 0x3de6 + + while (!(Endpoint_IsOUTReceived())) + 4610: 04 c0 rjmp .+8 ; 0x461a + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + 4612: 80 91 14 27 lds r24, 0x2714 + 4616: 88 23 and r24, r24 + 4618: a1 f2 breq .-88 ; 0x45c2 + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + while (!(Endpoint_IsOUTReceived())) + 461a: b3 db rcall .-2202 ; 0x3d82 + 461c: 88 23 and r24, r24 + 461e: c9 f3 breq .-14 ; 0x4612 + * \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(); + 4620: 4b db rcall .-2410 ; 0x3cb8 + 4622: 08 2f mov r16, r24 + uint32_t Byte1 = Endpoint_Read_8(); + 4624: 49 db rcall .-2414 ; 0x3cb8 + 4626: 18 2f mov r17, r24 + uint32_t Byte2 = Endpoint_Read_8(); + 4628: 47 db rcall .-2418 ; 0x3cb8 + 462a: f8 2e mov r15, r24 + uint32_t Byte3 = Endpoint_Read_8(); + 462c: 45 db rcall .-2422 ; 0x3cb8 + 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(); + 462e: 4f 2d mov r20, r15 + 4630: 50 e0 ldi r21, 0x00 ; 0 + 4632: 60 e0 ldi r22, 0x00 ; 0 + 4634: 70 e0 ldi r23, 0x00 ; 0 + uint32_t Byte3 = Endpoint_Read_8(); + + return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); + 4636: ba 01 movw r22, r20 + 4638: 55 27 eor r21, r21 + 463a: 44 27 eor r20, r20 + 463c: 78 2b or r23, r24 + 463e: 40 2b or r20, r16 + 4640: 51 2b or r21, r17 + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); + 4642: 4c 8b std Y+20, r20 ; 0x14 + 4644: 5d 8b std Y+21, r21 ; 0x15 + 4646: 6e 8b std Y+22, r22 ; 0x16 + 4648: 7f 8b std Y+23, r23 ; 0x17 + CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); + 464a: 36 db rcall .-2452 ; 0x3cb8 + 464c: 88 8f std Y+24, r24 ; 0x18 + CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); + 464e: 34 db rcall .-2456 ; 0x3cb8 + 4650: 89 8f std Y+25, r24 ; 0x19 + CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); + 4652: 32 db rcall .-2460 ; 0x3cb8 + 4654: 8a 8f std Y+26, r24 ; 0x1a + + Endpoint_ClearOUT(); + 4656: 21 db rcall .-2494 ; 0x3c9a + Endpoint_ClearStatusStage(); + 4658: fd dc rcall .-1542 ; 0x4054 + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + 465a: ce 01 movw r24, r28 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 465c: df 91 pop r29 + 465e: cf 91 pop r28 + 4660: 1f 91 pop r17 + 4662: 0f 91 pop r16 + 4664: ff 90 pop r15 + CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); + + Endpoint_ClearOUT(); + Endpoint_ClearStatusStage(); + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + 4666: 9a cf rjmp .-204 ; 0x459c + return; + + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + 4668: 80 91 15 27 lds r24, 0x2715 + 466c: 81 3a cpi r24, 0xA1 ; 161 + 466e: 09 f0 breq .+2 ; 0x4672 + 4670: a8 cf rjmp .-176 ; 0x45c2 + { + Endpoint_ClearSETUP(); + 4672: b9 db rcall .-2190 ; 0x3de6 + + while (!(Endpoint_IsINReady())); + 4674: 7a db rcall .-2316 ; 0x3d6a + 4676: 88 23 and r24, r24 + 4678: e9 f3 breq .-6 ; 0x4674 + + Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + 467a: 8c 89 ldd r24, Y+20 ; 0x14 + 467c: fd 88 ldd r15, Y+21 ; 0x15 + 467e: 0e 89 ldd r16, Y+22 ; 0x16 + 4680: 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); + 4682: 2a db rcall .-2476 ; 0x3cd8 + Endpoint_Write_8(Data >> 8); + 4684: 8f 2d mov r24, r15 + 4686: 28 db rcall .-2480 ; 0x3cd8 + Endpoint_Write_8(Data >> 16); + 4688: 80 2f mov r24, r16 + 468a: 26 db rcall .-2484 ; 0x3cd8 + Endpoint_Write_8(Data >> 24); + 468c: 81 2f mov r24, r17 + 468e: 24 db rcall .-2488 ; 0x3cd8 + Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); + 4690: 88 8d ldd r24, Y+24 ; 0x18 + 4692: 22 db rcall .-2492 ; 0x3cd8 + Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); + 4694: 89 8d ldd r24, Y+25 ; 0x19 + 4696: 20 db rcall .-2496 ; 0x3cd8 + Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); + 4698: 8a 8d ldd r24, Y+26 ; 0x1a + 469a: 1e db rcall .-2500 ; 0x3cd8 + + Endpoint_ClearIN(); + 469c: e5 da rcall .-2614 ; 0x3c68 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 469e: df 91 pop r29 + 46a0: cf 91 pop r28 + 46a2: 1f 91 pop r17 + 46a4: 0f 91 pop r16 + 46a6: 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(); + 46a8: d5 cc rjmp .-1622 ; 0x4054 + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + } + + break; + case CDC_REQ_SetControlLineState: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + 46aa: 80 91 15 27 lds r24, 0x2715 + 46ae: 81 32 cpi r24, 0x21 ; 33 + 46b0: 09 f0 breq .+2 ; 0x46b4 + 46b2: 87 cf rjmp .-242 ; 0x45c2 + { + Endpoint_ClearSETUP(); + 46b4: 98 db rcall .-2256 ; 0x3de6 + Endpoint_ClearStatusStage(); + 46b6: ce dc rcall .-1636 ; 0x4054 + + CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; + 46b8: 80 91 17 27 lds r24, 0x2717 + 46bc: 90 91 18 27 lds r25, 0x2718 + 46c0: 88 8b std Y+16, r24 ; 0x10 + 46c2: 99 8b std Y+17, r25 ; 0x11 + + EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); + 46c4: ce 01 movw r24, r28 + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + 46c6: df 91 pop r29 + 46c8: cf 91 pop r28 + 46ca: 1f 91 pop r17 + 46cc: 0f 91 pop r16 + 46ce: ff 90 pop r15 + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; + + EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); + 46d0: 65 cf rjmp .-310 ; 0x459c + +000046d2 <__tablejump2__>: + 46d2: ee 0f add r30, r30 + 46d4: ff 1f adc r31, r31 + +000046d6 <__tablejump__>: + 46d6: 05 90 lpm r0, Z+ + 46d8: f4 91 lpm r31, Z + 46da: e0 2d mov r30, r0 + 46dc: 09 94 ijmp + +000046de <__mulshisi3>: + 46de: b7 ff sbrs r27, 7 + 46e0: 04 c0 rjmp .+8 ; 0x46ea <__muluhisi3> + +000046e2 <__mulohisi3>: + 46e2: 03 d0 rcall .+6 ; 0x46ea <__muluhisi3> + 46e4: 82 1b sub r24, r18 + 46e6: 93 0b sbc r25, r19 + 46e8: 08 95 ret + +000046ea <__muluhisi3>: + 46ea: 09 d0 rcall .+18 ; 0x46fe <__umulhisi3> + 46ec: a5 9f mul r26, r21 + 46ee: 90 0d add r25, r0 + 46f0: b4 9f mul r27, r20 + 46f2: 90 0d add r25, r0 + 46f4: a4 9f mul r26, r20 + 46f6: 80 0d add r24, r0 + 46f8: 91 1d adc r25, r1 + 46fa: 11 24 eor r1, r1 + 46fc: 08 95 ret + +000046fe <__umulhisi3>: + 46fe: a2 9f mul r26, r18 + 4700: b0 01 movw r22, r0 + 4702: b3 9f mul r27, r19 + 4704: c0 01 movw r24, r0 + 4706: a3 9f mul r26, r19 + 4708: 70 0d add r23, r0 + 470a: 81 1d adc r24, r1 + 470c: 11 24 eor r1, r1 + 470e: 91 1d adc r25, r1 + 4710: b2 9f mul r27, r18 + 4712: 70 0d add r23, r0 + 4714: 81 1d adc r24, r1 + 4716: 11 24 eor r1, r1 + 4718: 91 1d adc r25, r1 + 471a: 08 95 ret + +0000471c : + 471c: 8f 92 push r8 + 471e: 9f 92 push r9 + 4720: af 92 push r10 + 4722: bf 92 push r11 + 4724: cf 92 push r12 + 4726: df 92 push r13 + 4728: ef 92 push r14 + 472a: ff 92 push r15 + 472c: cf 93 push r28 + 472e: df 93 push r29 + 4730: ec 01 movw r28, r24 + 4732: 68 81 ld r22, Y + 4734: 79 81 ldd r23, Y+1 ; 0x01 + 4736: 8a 81 ldd r24, Y+2 ; 0x02 + 4738: 9b 81 ldd r25, Y+3 ; 0x03 + 473a: 61 15 cp r22, r1 + 473c: 71 05 cpc r23, r1 + 473e: 81 05 cpc r24, r1 + 4740: 91 05 cpc r25, r1 + 4742: 21 f4 brne .+8 ; 0x474c + 4744: 64 e2 ldi r22, 0x24 ; 36 + 4746: 79 ed ldi r23, 0xD9 ; 217 + 4748: 8b e5 ldi r24, 0x5B ; 91 + 474a: 97 e0 ldi r25, 0x07 ; 7 + 474c: 2d e1 ldi r18, 0x1D ; 29 + 474e: 33 ef ldi r19, 0xF3 ; 243 + 4750: 41 e0 ldi r20, 0x01 ; 1 + 4752: 50 e0 ldi r21, 0x00 ; 0 + 4754: 31 d3 rcall .+1634 ; 0x4db8 <__divmodsi4> + 4756: 49 01 movw r8, r18 + 4758: 5a 01 movw r10, r20 + 475a: 9b 01 movw r18, r22 + 475c: ac 01 movw r20, r24 + 475e: a7 ea ldi r26, 0xA7 ; 167 + 4760: b1 e4 ldi r27, 0x41 ; 65 + 4762: c3 df rcall .-122 ; 0x46ea <__muluhisi3> + 4764: 6b 01 movw r12, r22 + 4766: 7c 01 movw r14, r24 + 4768: ac ee ldi r26, 0xEC ; 236 + 476a: b4 ef ldi r27, 0xF4 ; 244 + 476c: a5 01 movw r20, r10 + 476e: 94 01 movw r18, r8 + 4770: b8 df rcall .-144 ; 0x46e2 <__mulohisi3> + 4772: c6 0e add r12, r22 + 4774: d7 1e adc r13, r23 + 4776: e8 1e adc r14, r24 + 4778: f9 1e adc r15, r25 + 477a: f7 fe sbrs r15, 7 + 477c: 06 c0 rjmp .+12 ; 0x478a + 477e: 81 e0 ldi r24, 0x01 ; 1 + 4780: c8 1a sub r12, r24 + 4782: d1 08 sbc r13, r1 + 4784: e1 08 sbc r14, r1 + 4786: 80 e8 ldi r24, 0x80 ; 128 + 4788: f8 0a sbc r15, r24 + 478a: c8 82 st Y, r12 + 478c: d9 82 std Y+1, r13 ; 0x01 + 478e: ea 82 std Y+2, r14 ; 0x02 + 4790: fb 82 std Y+3, r15 ; 0x03 + 4792: c6 01 movw r24, r12 + 4794: 9f 77 andi r25, 0x7F ; 127 + 4796: df 91 pop r29 + 4798: cf 91 pop r28 + 479a: ff 90 pop r15 + 479c: ef 90 pop r14 + 479e: df 90 pop r13 + 47a0: cf 90 pop r12 + 47a2: bf 90 pop r11 + 47a4: af 90 pop r10 + 47a6: 9f 90 pop r9 + 47a8: 8f 90 pop r8 + 47aa: 08 95 ret + +000047ac : + 47ac: b7 cf rjmp .-146 ; 0x471c + +000047ae : + 47ae: 8c e1 ldi r24, 0x1C ; 28 + 47b0: 90 e2 ldi r25, 0x20 ; 32 + 47b2: b4 cf rjmp .-152 ; 0x471c + +000047b4 : + 47b4: a0 e0 ldi r26, 0x00 ; 0 + 47b6: b0 e0 ldi r27, 0x00 ; 0 + 47b8: 80 93 1c 20 sts 0x201C, r24 + 47bc: 90 93 1d 20 sts 0x201D, r25 + 47c0: a0 93 1e 20 sts 0x201E, r26 + 47c4: b0 93 1f 20 sts 0x201F, r27 + 47c8: 08 95 ret + +000047ca : + 47ca: fb 01 movw r30, r22 + 47cc: dc 01 movw r26, r24 + 47ce: 02 c0 rjmp .+4 ; 0x47d4 + 47d0: 05 90 lpm r0, Z+ + 47d2: 0d 92 st X+, r0 + 47d4: 41 50 subi r20, 0x01 ; 1 + 47d6: 50 40 sbci r21, 0x00 ; 0 + 47d8: d8 f7 brcc .-10 ; 0x47d0 + 47da: 08 95 ret + +000047dc : + 47dc: fb 01 movw r30, r22 + 47de: dc 01 movw r26, r24 + 47e0: 8d 91 ld r24, X+ + 47e2: 05 90 lpm r0, Z+ + 47e4: 80 19 sub r24, r0 + 47e6: 01 10 cpse r0, r1 + 47e8: d9 f3 breq .-10 ; 0x47e0 + 47ea: 99 0b sbc r25, r25 + 47ec: 08 95 ret + +000047ee : + 47ee: fb 01 movw r30, r22 + 47f0: dc 01 movw r26, r24 + 47f2: 41 50 subi r20, 0x01 ; 1 + 47f4: 50 40 sbci r21, 0x00 ; 0 + 47f6: 48 f0 brcs .+18 ; 0x480a + 47f8: 05 90 lpm r0, Z+ + 47fa: 0d 92 st X+, r0 + 47fc: 00 20 and r0, r0 + 47fe: c9 f7 brne .-14 ; 0x47f2 + 4800: 01 c0 rjmp .+2 ; 0x4804 + 4802: 1d 92 st X+, r1 + 4804: 41 50 subi r20, 0x01 ; 1 + 4806: 50 40 sbci r21, 0x00 ; 0 + 4808: e0 f7 brcc .-8 ; 0x4802 + 480a: 08 95 ret + +0000480c : + 480c: fb 01 movw r30, r22 + 480e: dc 01 movw r26, r24 + 4810: 02 c0 rjmp .+4 ; 0x4816 + 4812: 01 90 ld r0, Z+ + 4814: 0d 92 st X+, r0 + 4816: 41 50 subi r20, 0x01 ; 1 + 4818: 50 40 sbci r21, 0x00 ; 0 + 481a: d8 f7 brcc .-10 ; 0x4812 + 481c: 08 95 ret + +0000481e : + 481e: ae e0 ldi r26, 0x0E ; 14 + 4820: b0 e0 ldi r27, 0x00 ; 0 + 4822: e4 e1 ldi r30, 0x14 ; 20 + 4824: f4 e2 ldi r31, 0x24 ; 36 + 4826: f2 c2 rjmp .+1508 ; 0x4e0c <__prologue_saves__+0x1c> + 4828: 0d 89 ldd r16, Y+21 ; 0x15 + 482a: 1e 89 ldd r17, Y+22 ; 0x16 + 482c: 8f 89 ldd r24, Y+23 ; 0x17 + 482e: 98 8d ldd r25, Y+24 ; 0x18 + 4830: 2e e0 ldi r18, 0x0E ; 14 + 4832: 2c 83 std Y+4, r18 ; 0x04 + 4834: 09 83 std Y+1, r16 ; 0x01 + 4836: 1a 83 std Y+2, r17 ; 0x02 + 4838: 97 ff sbrs r25, 7 + 483a: 02 c0 rjmp .+4 ; 0x4840 + 483c: 80 e0 ldi r24, 0x00 ; 0 + 483e: 90 e8 ldi r25, 0x80 ; 128 + 4840: 01 97 sbiw r24, 0x01 ; 1 + 4842: 8d 83 std Y+5, r24 ; 0x05 + 4844: 9e 83 std Y+6, r25 ; 0x06 + 4846: ae 01 movw r20, r28 + 4848: 45 5e subi r20, 0xE5 ; 229 + 484a: 5f 4f sbci r21, 0xFF ; 255 + 484c: 69 8d ldd r22, Y+25 ; 0x19 + 484e: 7a 8d ldd r23, Y+26 ; 0x1a + 4850: ce 01 movw r24, r28 + 4852: 01 96 adiw r24, 0x01 ; 1 + 4854: 11 d0 rcall .+34 ; 0x4878 + 4856: 4d 81 ldd r20, Y+5 ; 0x05 + 4858: 5e 81 ldd r21, Y+6 ; 0x06 + 485a: 57 fd sbrc r21, 7 + 485c: 0a c0 rjmp .+20 ; 0x4872 + 485e: 2f 81 ldd r18, Y+7 ; 0x07 + 4860: 38 85 ldd r19, Y+8 ; 0x08 + 4862: 42 17 cp r20, r18 + 4864: 53 07 cpc r21, r19 + 4866: 0c f4 brge .+2 ; 0x486a + 4868: 9a 01 movw r18, r20 + 486a: f8 01 movw r30, r16 + 486c: e2 0f add r30, r18 + 486e: f3 1f adc r31, r19 + 4870: 10 82 st Z, r1 + 4872: 2e 96 adiw r28, 0x0e ; 14 + 4874: e4 e0 ldi r30, 0x04 ; 4 + 4876: e3 c2 rjmp .+1478 ; 0x4e3e <__epilogue_restores__+0x1c> + +00004878 : + 4878: ac e0 ldi r26, 0x0C ; 12 + 487a: b0 e0 ldi r27, 0x00 ; 0 + 487c: e1 e4 ldi r30, 0x41 ; 65 + 487e: f4 e2 ldi r31, 0x24 ; 36 + 4880: b7 c2 rjmp .+1390 ; 0x4df0 <__prologue_saves__> + 4882: 7c 01 movw r14, r24 + 4884: 6b 01 movw r12, r22 + 4886: 8a 01 movw r16, r20 + 4888: fc 01 movw r30, r24 + 488a: 16 82 std Z+6, r1 ; 0x06 + 488c: 17 82 std Z+7, r1 ; 0x07 + 488e: 83 81 ldd r24, Z+3 ; 0x03 + 4890: 81 ff sbrs r24, 1 + 4892: b0 c1 rjmp .+864 ; 0x4bf4 + 4894: ce 01 movw r24, r28 + 4896: 01 96 adiw r24, 0x01 ; 1 + 4898: 4c 01 movw r8, r24 + 489a: f7 01 movw r30, r14 + 489c: 93 81 ldd r25, Z+3 ; 0x03 + 489e: f6 01 movw r30, r12 + 48a0: 93 fd sbrc r25, 3 + 48a2: 85 91 lpm r24, Z+ + 48a4: 93 ff sbrs r25, 3 + 48a6: 81 91 ld r24, Z+ + 48a8: 6f 01 movw r12, r30 + 48aa: 88 23 and r24, r24 + 48ac: 09 f4 brne .+2 ; 0x48b0 + 48ae: 9e c1 rjmp .+828 ; 0x4bec + 48b0: 85 32 cpi r24, 0x25 ; 37 + 48b2: 39 f4 brne .+14 ; 0x48c2 + 48b4: 93 fd sbrc r25, 3 + 48b6: 85 91 lpm r24, Z+ + 48b8: 93 ff sbrs r25, 3 + 48ba: 81 91 ld r24, Z+ + 48bc: 6f 01 movw r12, r30 + 48be: 85 32 cpi r24, 0x25 ; 37 + 48c0: 21 f4 brne .+8 ; 0x48ca + 48c2: b7 01 movw r22, r14 + 48c4: 90 e0 ldi r25, 0x00 ; 0 + 48c6: e8 d1 rcall .+976 ; 0x4c98 + 48c8: e8 cf rjmp .-48 ; 0x489a + 48ca: 51 2c mov r5, r1 + 48cc: 31 2c mov r3, r1 + 48ce: 20 e0 ldi r18, 0x00 ; 0 + 48d0: 20 32 cpi r18, 0x20 ; 32 + 48d2: a0 f4 brcc .+40 ; 0x48fc + 48d4: 8b 32 cpi r24, 0x2B ; 43 + 48d6: 69 f0 breq .+26 ; 0x48f2 + 48d8: 30 f4 brcc .+12 ; 0x48e6 + 48da: 80 32 cpi r24, 0x20 ; 32 + 48dc: 59 f0 breq .+22 ; 0x48f4 + 48de: 83 32 cpi r24, 0x23 ; 35 + 48e0: 69 f4 brne .+26 ; 0x48fc + 48e2: 20 61 ori r18, 0x10 ; 16 + 48e4: 2c c0 rjmp .+88 ; 0x493e + 48e6: 8d 32 cpi r24, 0x2D ; 45 + 48e8: 39 f0 breq .+14 ; 0x48f8 + 48ea: 80 33 cpi r24, 0x30 ; 48 + 48ec: 39 f4 brne .+14 ; 0x48fc + 48ee: 21 60 ori r18, 0x01 ; 1 + 48f0: 26 c0 rjmp .+76 ; 0x493e + 48f2: 22 60 ori r18, 0x02 ; 2 + 48f4: 24 60 ori r18, 0x04 ; 4 + 48f6: 23 c0 rjmp .+70 ; 0x493e + 48f8: 28 60 ori r18, 0x08 ; 8 + 48fa: 21 c0 rjmp .+66 ; 0x493e + 48fc: 27 fd sbrc r18, 7 + 48fe: 27 c0 rjmp .+78 ; 0x494e + 4900: 30 ed ldi r19, 0xD0 ; 208 + 4902: 38 0f add r19, r24 + 4904: 3a 30 cpi r19, 0x0A ; 10 + 4906: 78 f4 brcc .+30 ; 0x4926 + 4908: 26 ff sbrs r18, 6 + 490a: 06 c0 rjmp .+12 ; 0x4918 + 490c: fa e0 ldi r31, 0x0A ; 10 + 490e: 5f 9e mul r5, r31 + 4910: 30 0d add r19, r0 + 4912: 11 24 eor r1, r1 + 4914: 53 2e mov r5, r19 + 4916: 13 c0 rjmp .+38 ; 0x493e + 4918: 8a e0 ldi r24, 0x0A ; 10 + 491a: 38 9e mul r3, r24 + 491c: 30 0d add r19, r0 + 491e: 11 24 eor r1, r1 + 4920: 33 2e mov r3, r19 + 4922: 20 62 ori r18, 0x20 ; 32 + 4924: 0c c0 rjmp .+24 ; 0x493e + 4926: 8e 32 cpi r24, 0x2E ; 46 + 4928: 21 f4 brne .+8 ; 0x4932 + 492a: 26 fd sbrc r18, 6 + 492c: 5f c1 rjmp .+702 ; 0x4bec + 492e: 20 64 ori r18, 0x40 ; 64 + 4930: 06 c0 rjmp .+12 ; 0x493e + 4932: 8c 36 cpi r24, 0x6C ; 108 + 4934: 11 f4 brne .+4 ; 0x493a + 4936: 20 68 ori r18, 0x80 ; 128 + 4938: 02 c0 rjmp .+4 ; 0x493e + 493a: 88 36 cpi r24, 0x68 ; 104 + 493c: 41 f4 brne .+16 ; 0x494e + 493e: f6 01 movw r30, r12 + 4940: 93 fd sbrc r25, 3 + 4942: 85 91 lpm r24, Z+ + 4944: 93 ff sbrs r25, 3 + 4946: 81 91 ld r24, Z+ + 4948: 6f 01 movw r12, r30 + 494a: 81 11 cpse r24, r1 + 494c: c1 cf rjmp .-126 ; 0x48d0 + 494e: 98 2f mov r25, r24 + 4950: 9f 7d andi r25, 0xDF ; 223 + 4952: 95 54 subi r25, 0x45 ; 69 + 4954: 93 30 cpi r25, 0x03 ; 3 + 4956: 28 f4 brcc .+10 ; 0x4962 + 4958: 0c 5f subi r16, 0xFC ; 252 + 495a: 1f 4f sbci r17, 0xFF ; 255 + 495c: ff e3 ldi r31, 0x3F ; 63 + 495e: f9 83 std Y+1, r31 ; 0x01 + 4960: 0d c0 rjmp .+26 ; 0x497c + 4962: 83 36 cpi r24, 0x63 ; 99 + 4964: 31 f0 breq .+12 ; 0x4972 + 4966: 83 37 cpi r24, 0x73 ; 115 + 4968: 71 f0 breq .+28 ; 0x4986 + 496a: 83 35 cpi r24, 0x53 ; 83 + 496c: 09 f0 breq .+2 ; 0x4970 + 496e: 57 c0 rjmp .+174 ; 0x4a1e + 4970: 21 c0 rjmp .+66 ; 0x49b4 + 4972: f8 01 movw r30, r16 + 4974: 80 81 ld r24, Z + 4976: 89 83 std Y+1, r24 ; 0x01 + 4978: 0e 5f subi r16, 0xFE ; 254 + 497a: 1f 4f sbci r17, 0xFF ; 255 + 497c: 44 24 eor r4, r4 + 497e: 43 94 inc r4 + 4980: 51 2c mov r5, r1 + 4982: 54 01 movw r10, r8 + 4984: 14 c0 rjmp .+40 ; 0x49ae + 4986: 38 01 movw r6, r16 + 4988: f2 e0 ldi r31, 0x02 ; 2 + 498a: 6f 0e add r6, r31 + 498c: 71 1c adc r7, r1 + 498e: f8 01 movw r30, r16 + 4990: a0 80 ld r10, Z + 4992: b1 80 ldd r11, Z+1 ; 0x01 + 4994: 26 ff sbrs r18, 6 + 4996: 03 c0 rjmp .+6 ; 0x499e + 4998: 65 2d mov r22, r5 + 499a: 70 e0 ldi r23, 0x00 ; 0 + 499c: 02 c0 rjmp .+4 ; 0x49a2 + 499e: 6f ef ldi r22, 0xFF ; 255 + 49a0: 7f ef ldi r23, 0xFF ; 255 + 49a2: c5 01 movw r24, r10 + 49a4: 2c 87 std Y+12, r18 ; 0x0c + 49a6: 6d d1 rcall .+730 ; 0x4c82 + 49a8: 2c 01 movw r4, r24 + 49aa: 83 01 movw r16, r6 + 49ac: 2c 85 ldd r18, Y+12 ; 0x0c + 49ae: 2f 77 andi r18, 0x7F ; 127 + 49b0: 22 2e mov r2, r18 + 49b2: 16 c0 rjmp .+44 ; 0x49e0 + 49b4: 38 01 movw r6, r16 + 49b6: f2 e0 ldi r31, 0x02 ; 2 + 49b8: 6f 0e add r6, r31 + 49ba: 71 1c adc r7, r1 + 49bc: f8 01 movw r30, r16 + 49be: a0 80 ld r10, Z + 49c0: b1 80 ldd r11, Z+1 ; 0x01 + 49c2: 26 ff sbrs r18, 6 + 49c4: 03 c0 rjmp .+6 ; 0x49cc + 49c6: 65 2d mov r22, r5 + 49c8: 70 e0 ldi r23, 0x00 ; 0 + 49ca: 02 c0 rjmp .+4 ; 0x49d0 + 49cc: 6f ef ldi r22, 0xFF ; 255 + 49ce: 7f ef ldi r23, 0xFF ; 255 + 49d0: c5 01 movw r24, r10 + 49d2: 2c 87 std Y+12, r18 ; 0x0c + 49d4: 4b d1 rcall .+662 ; 0x4c6c + 49d6: 2c 01 movw r4, r24 + 49d8: 2c 85 ldd r18, Y+12 ; 0x0c + 49da: 20 68 ori r18, 0x80 ; 128 + 49dc: 22 2e mov r2, r18 + 49de: 83 01 movw r16, r6 + 49e0: 23 fc sbrc r2, 3 + 49e2: 19 c0 rjmp .+50 ; 0x4a16 + 49e4: 83 2d mov r24, r3 + 49e6: 90 e0 ldi r25, 0x00 ; 0 + 49e8: 48 16 cp r4, r24 + 49ea: 59 06 cpc r5, r25 + 49ec: a0 f4 brcc .+40 ; 0x4a16 + 49ee: b7 01 movw r22, r14 + 49f0: 80 e2 ldi r24, 0x20 ; 32 + 49f2: 90 e0 ldi r25, 0x00 ; 0 + 49f4: 51 d1 rcall .+674 ; 0x4c98 + 49f6: 3a 94 dec r3 + 49f8: f5 cf rjmp .-22 ; 0x49e4 + 49fa: f5 01 movw r30, r10 + 49fc: 27 fc sbrc r2, 7 + 49fe: 85 91 lpm r24, Z+ + 4a00: 27 fe sbrs r2, 7 + 4a02: 81 91 ld r24, Z+ + 4a04: 5f 01 movw r10, r30 + 4a06: b7 01 movw r22, r14 + 4a08: 90 e0 ldi r25, 0x00 ; 0 + 4a0a: 46 d1 rcall .+652 ; 0x4c98 + 4a0c: 31 10 cpse r3, r1 + 4a0e: 3a 94 dec r3 + 4a10: f1 e0 ldi r31, 0x01 ; 1 + 4a12: 4f 1a sub r4, r31 + 4a14: 51 08 sbc r5, r1 + 4a16: 41 14 cp r4, r1 + 4a18: 51 04 cpc r5, r1 + 4a1a: 79 f7 brne .-34 ; 0x49fa + 4a1c: de c0 rjmp .+444 ; 0x4bda + 4a1e: 84 36 cpi r24, 0x64 ; 100 + 4a20: 11 f0 breq .+4 ; 0x4a26 + 4a22: 89 36 cpi r24, 0x69 ; 105 + 4a24: 31 f5 brne .+76 ; 0x4a72 + 4a26: f8 01 movw r30, r16 + 4a28: 27 ff sbrs r18, 7 + 4a2a: 07 c0 rjmp .+14 ; 0x4a3a + 4a2c: 60 81 ld r22, Z + 4a2e: 71 81 ldd r23, Z+1 ; 0x01 + 4a30: 82 81 ldd r24, Z+2 ; 0x02 + 4a32: 93 81 ldd r25, Z+3 ; 0x03 + 4a34: 0c 5f subi r16, 0xFC ; 252 + 4a36: 1f 4f sbci r17, 0xFF ; 255 + 4a38: 08 c0 rjmp .+16 ; 0x4a4a + 4a3a: 60 81 ld r22, Z + 4a3c: 71 81 ldd r23, Z+1 ; 0x01 + 4a3e: 88 27 eor r24, r24 + 4a40: 77 fd sbrc r23, 7 + 4a42: 80 95 com r24 + 4a44: 98 2f mov r25, r24 + 4a46: 0e 5f subi r16, 0xFE ; 254 + 4a48: 1f 4f sbci r17, 0xFF ; 255 + 4a4a: 2f 76 andi r18, 0x6F ; 111 + 4a4c: b2 2e mov r11, r18 + 4a4e: 97 ff sbrs r25, 7 + 4a50: 09 c0 rjmp .+18 ; 0x4a64 + 4a52: 90 95 com r25 + 4a54: 80 95 com r24 + 4a56: 70 95 com r23 + 4a58: 61 95 neg r22 + 4a5a: 7f 4f sbci r23, 0xFF ; 255 + 4a5c: 8f 4f sbci r24, 0xFF ; 255 + 4a5e: 9f 4f sbci r25, 0xFF ; 255 + 4a60: 20 68 ori r18, 0x80 ; 128 + 4a62: b2 2e mov r11, r18 + 4a64: 2a e0 ldi r18, 0x0A ; 10 + 4a66: 30 e0 ldi r19, 0x00 ; 0 + 4a68: a4 01 movw r20, r8 + 4a6a: 48 d1 rcall .+656 ; 0x4cfc <__ultoa_invert> + 4a6c: a8 2e mov r10, r24 + 4a6e: a8 18 sub r10, r8 + 4a70: 43 c0 rjmp .+134 ; 0x4af8 + 4a72: 85 37 cpi r24, 0x75 ; 117 + 4a74: 29 f4 brne .+10 ; 0x4a80 + 4a76: 2f 7e andi r18, 0xEF ; 239 + 4a78: b2 2e mov r11, r18 + 4a7a: 2a e0 ldi r18, 0x0A ; 10 + 4a7c: 30 e0 ldi r19, 0x00 ; 0 + 4a7e: 25 c0 rjmp .+74 ; 0x4aca + 4a80: f2 2f mov r31, r18 + 4a82: f9 7f andi r31, 0xF9 ; 249 + 4a84: bf 2e mov r11, r31 + 4a86: 8f 36 cpi r24, 0x6F ; 111 + 4a88: c1 f0 breq .+48 ; 0x4aba + 4a8a: 18 f4 brcc .+6 ; 0x4a92 + 4a8c: 88 35 cpi r24, 0x58 ; 88 + 4a8e: 79 f0 breq .+30 ; 0x4aae + 4a90: ad c0 rjmp .+346 ; 0x4bec + 4a92: 80 37 cpi r24, 0x70 ; 112 + 4a94: 19 f0 breq .+6 ; 0x4a9c + 4a96: 88 37 cpi r24, 0x78 ; 120 + 4a98: 21 f0 breq .+8 ; 0x4aa2 + 4a9a: a8 c0 rjmp .+336 ; 0x4bec + 4a9c: 2f 2f mov r18, r31 + 4a9e: 20 61 ori r18, 0x10 ; 16 + 4aa0: b2 2e mov r11, r18 + 4aa2: b4 fe sbrs r11, 4 + 4aa4: 0d c0 rjmp .+26 ; 0x4ac0 + 4aa6: 8b 2d mov r24, r11 + 4aa8: 84 60 ori r24, 0x04 ; 4 + 4aaa: b8 2e mov r11, r24 + 4aac: 09 c0 rjmp .+18 ; 0x4ac0 + 4aae: 24 ff sbrs r18, 4 + 4ab0: 0a c0 rjmp .+20 ; 0x4ac6 + 4ab2: 9f 2f mov r25, r31 + 4ab4: 96 60 ori r25, 0x06 ; 6 + 4ab6: b9 2e mov r11, r25 + 4ab8: 06 c0 rjmp .+12 ; 0x4ac6 + 4aba: 28 e0 ldi r18, 0x08 ; 8 + 4abc: 30 e0 ldi r19, 0x00 ; 0 + 4abe: 05 c0 rjmp .+10 ; 0x4aca + 4ac0: 20 e1 ldi r18, 0x10 ; 16 + 4ac2: 30 e0 ldi r19, 0x00 ; 0 + 4ac4: 02 c0 rjmp .+4 ; 0x4aca + 4ac6: 20 e1 ldi r18, 0x10 ; 16 + 4ac8: 32 e0 ldi r19, 0x02 ; 2 + 4aca: f8 01 movw r30, r16 + 4acc: b7 fe sbrs r11, 7 + 4ace: 07 c0 rjmp .+14 ; 0x4ade + 4ad0: 60 81 ld r22, Z + 4ad2: 71 81 ldd r23, Z+1 ; 0x01 + 4ad4: 82 81 ldd r24, Z+2 ; 0x02 + 4ad6: 93 81 ldd r25, Z+3 ; 0x03 + 4ad8: 0c 5f subi r16, 0xFC ; 252 + 4ada: 1f 4f sbci r17, 0xFF ; 255 + 4adc: 06 c0 rjmp .+12 ; 0x4aea + 4ade: 60 81 ld r22, Z + 4ae0: 71 81 ldd r23, Z+1 ; 0x01 + 4ae2: 80 e0 ldi r24, 0x00 ; 0 + 4ae4: 90 e0 ldi r25, 0x00 ; 0 + 4ae6: 0e 5f subi r16, 0xFE ; 254 + 4ae8: 1f 4f sbci r17, 0xFF ; 255 + 4aea: a4 01 movw r20, r8 + 4aec: 07 d1 rcall .+526 ; 0x4cfc <__ultoa_invert> + 4aee: a8 2e mov r10, r24 + 4af0: a8 18 sub r10, r8 + 4af2: fb 2d mov r31, r11 + 4af4: ff 77 andi r31, 0x7F ; 127 + 4af6: bf 2e mov r11, r31 + 4af8: b6 fe sbrs r11, 6 + 4afa: 0b c0 rjmp .+22 ; 0x4b12 + 4afc: 2b 2d mov r18, r11 + 4afe: 2e 7f andi r18, 0xFE ; 254 + 4b00: a5 14 cp r10, r5 + 4b02: 50 f4 brcc .+20 ; 0x4b18 + 4b04: b4 fe sbrs r11, 4 + 4b06: 0a c0 rjmp .+20 ; 0x4b1c + 4b08: b2 fc sbrc r11, 2 + 4b0a: 08 c0 rjmp .+16 ; 0x4b1c + 4b0c: 2b 2d mov r18, r11 + 4b0e: 2e 7e andi r18, 0xEE ; 238 + 4b10: 05 c0 rjmp .+10 ; 0x4b1c + 4b12: 7a 2c mov r7, r10 + 4b14: 2b 2d mov r18, r11 + 4b16: 03 c0 rjmp .+6 ; 0x4b1e + 4b18: 7a 2c mov r7, r10 + 4b1a: 01 c0 rjmp .+2 ; 0x4b1e + 4b1c: 75 2c mov r7, r5 + 4b1e: 24 ff sbrs r18, 4 + 4b20: 0d c0 rjmp .+26 ; 0x4b3c + 4b22: fe 01 movw r30, r28 + 4b24: ea 0d add r30, r10 + 4b26: f1 1d adc r31, r1 + 4b28: 80 81 ld r24, Z + 4b2a: 80 33 cpi r24, 0x30 ; 48 + 4b2c: 11 f4 brne .+4 ; 0x4b32 + 4b2e: 29 7e andi r18, 0xE9 ; 233 + 4b30: 09 c0 rjmp .+18 ; 0x4b44 + 4b32: 22 ff sbrs r18, 2 + 4b34: 06 c0 rjmp .+12 ; 0x4b42 + 4b36: 73 94 inc r7 + 4b38: 73 94 inc r7 + 4b3a: 04 c0 rjmp .+8 ; 0x4b44 + 4b3c: 82 2f mov r24, r18 + 4b3e: 86 78 andi r24, 0x86 ; 134 + 4b40: 09 f0 breq .+2 ; 0x4b44 + 4b42: 73 94 inc r7 + 4b44: 23 fd sbrc r18, 3 + 4b46: 12 c0 rjmp .+36 ; 0x4b6c + 4b48: 20 ff sbrs r18, 0 + 4b4a: 06 c0 rjmp .+12 ; 0x4b58 + 4b4c: 5a 2c mov r5, r10 + 4b4e: 73 14 cp r7, r3 + 4b50: 18 f4 brcc .+6 ; 0x4b58 + 4b52: 53 0c add r5, r3 + 4b54: 57 18 sub r5, r7 + 4b56: 73 2c mov r7, r3 + 4b58: 73 14 cp r7, r3 + 4b5a: 60 f4 brcc .+24 ; 0x4b74 + 4b5c: b7 01 movw r22, r14 + 4b5e: 80 e2 ldi r24, 0x20 ; 32 + 4b60: 90 e0 ldi r25, 0x00 ; 0 + 4b62: 2c 87 std Y+12, r18 ; 0x0c + 4b64: 99 d0 rcall .+306 ; 0x4c98 + 4b66: 73 94 inc r7 + 4b68: 2c 85 ldd r18, Y+12 ; 0x0c + 4b6a: f6 cf rjmp .-20 ; 0x4b58 + 4b6c: 73 14 cp r7, r3 + 4b6e: 10 f4 brcc .+4 ; 0x4b74 + 4b70: 37 18 sub r3, r7 + 4b72: 01 c0 rjmp .+2 ; 0x4b76 + 4b74: 31 2c mov r3, r1 + 4b76: 24 ff sbrs r18, 4 + 4b78: 11 c0 rjmp .+34 ; 0x4b9c + 4b7a: b7 01 movw r22, r14 + 4b7c: 80 e3 ldi r24, 0x30 ; 48 + 4b7e: 90 e0 ldi r25, 0x00 ; 0 + 4b80: 2c 87 std Y+12, r18 ; 0x0c + 4b82: 8a d0 rcall .+276 ; 0x4c98 + 4b84: 2c 85 ldd r18, Y+12 ; 0x0c + 4b86: 22 ff sbrs r18, 2 + 4b88: 16 c0 rjmp .+44 ; 0x4bb6 + 4b8a: 21 ff sbrs r18, 1 + 4b8c: 03 c0 rjmp .+6 ; 0x4b94 + 4b8e: 88 e5 ldi r24, 0x58 ; 88 + 4b90: 90 e0 ldi r25, 0x00 ; 0 + 4b92: 02 c0 rjmp .+4 ; 0x4b98 + 4b94: 88 e7 ldi r24, 0x78 ; 120 + 4b96: 90 e0 ldi r25, 0x00 ; 0 + 4b98: b7 01 movw r22, r14 + 4b9a: 0c c0 rjmp .+24 ; 0x4bb4 + 4b9c: 82 2f mov r24, r18 + 4b9e: 86 78 andi r24, 0x86 ; 134 + 4ba0: 51 f0 breq .+20 ; 0x4bb6 + 4ba2: 21 fd sbrc r18, 1 + 4ba4: 02 c0 rjmp .+4 ; 0x4baa + 4ba6: 80 e2 ldi r24, 0x20 ; 32 + 4ba8: 01 c0 rjmp .+2 ; 0x4bac + 4baa: 8b e2 ldi r24, 0x2B ; 43 + 4bac: 27 fd sbrc r18, 7 + 4bae: 8d e2 ldi r24, 0x2D ; 45 + 4bb0: b7 01 movw r22, r14 + 4bb2: 90 e0 ldi r25, 0x00 ; 0 + 4bb4: 71 d0 rcall .+226 ; 0x4c98 + 4bb6: a5 14 cp r10, r5 + 4bb8: 30 f4 brcc .+12 ; 0x4bc6 + 4bba: b7 01 movw r22, r14 + 4bbc: 80 e3 ldi r24, 0x30 ; 48 + 4bbe: 90 e0 ldi r25, 0x00 ; 0 + 4bc0: 6b d0 rcall .+214 ; 0x4c98 + 4bc2: 5a 94 dec r5 + 4bc4: f8 cf rjmp .-16 ; 0x4bb6 + 4bc6: aa 94 dec r10 + 4bc8: f4 01 movw r30, r8 + 4bca: ea 0d add r30, r10 + 4bcc: f1 1d adc r31, r1 + 4bce: 80 81 ld r24, Z + 4bd0: b7 01 movw r22, r14 + 4bd2: 90 e0 ldi r25, 0x00 ; 0 + 4bd4: 61 d0 rcall .+194 ; 0x4c98 + 4bd6: a1 10 cpse r10, r1 + 4bd8: f6 cf rjmp .-20 ; 0x4bc6 + 4bda: 33 20 and r3, r3 + 4bdc: 09 f4 brne .+2 ; 0x4be0 + 4bde: 5d ce rjmp .-838 ; 0x489a + 4be0: b7 01 movw r22, r14 + 4be2: 80 e2 ldi r24, 0x20 ; 32 + 4be4: 90 e0 ldi r25, 0x00 ; 0 + 4be6: 58 d0 rcall .+176 ; 0x4c98 + 4be8: 3a 94 dec r3 + 4bea: f7 cf rjmp .-18 ; 0x4bda + 4bec: f7 01 movw r30, r14 + 4bee: 86 81 ldd r24, Z+6 ; 0x06 + 4bf0: 97 81 ldd r25, Z+7 ; 0x07 + 4bf2: 02 c0 rjmp .+4 ; 0x4bf8 + 4bf4: 8f ef ldi r24, 0xFF ; 255 + 4bf6: 9f ef ldi r25, 0xFF ; 255 + 4bf8: 2c 96 adiw r28, 0x0c ; 12 + 4bfa: e2 e1 ldi r30, 0x12 ; 18 + 4bfc: 12 c1 rjmp .+548 ; 0x4e22 <__epilogue_restores__> + +00004bfe <__eerd_block_x32a4u>: + 4bfe: e0 ec ldi r30, 0xC0 ; 192 + 4c00: f1 e0 ldi r31, 0x01 ; 1 + 4c02: a7 85 ldd r26, Z+15 ; 0x0f + 4c04: a7 fd sbrc r26, 7 + 4c06: fd cf rjmp .-6 ; 0x4c02 <__eerd_block_x32a4u+0x4> + 4c08: a4 85 ldd r26, Z+12 ; 0x0c + 4c0a: a8 60 ori r26, 0x08 ; 8 + 4c0c: a4 87 std Z+12, r26 ; 0x0c + 4c0e: 60 50 subi r22, 0x00 ; 0 + 4c10: 70 4f sbci r23, 0xF0 ; 240 + 4c12: fc cd rjmp .-1032 ; 0x480c + +00004c14 <__eewr_block_x32a4u>: + 4c14: dc 01 movw r26, r24 + 4c16: cb 01 movw r24, r22 + 4c18: 02 c0 rjmp .+4 ; 0x4c1e <__eewr_block_x32a4u+0xa> + 4c1a: 2d 91 ld r18, X+ + 4c1c: 05 d0 rcall .+10 ; 0x4c28 <__eewr_r18_x32a4u> + 4c1e: 41 50 subi r20, 0x01 ; 1 + 4c20: 50 40 sbci r21, 0x00 ; 0 + 4c22: d8 f7 brcc .-10 ; 0x4c1a <__eewr_block_x32a4u+0x6> + 4c24: 08 95 ret + +00004c26 <__eewr_byte_x32a4u>: + 4c26: 26 2f mov r18, r22 + +00004c28 <__eewr_r18_x32a4u>: + 4c28: e0 ec ldi r30, 0xC0 ; 192 + 4c2a: f1 e0 ldi r31, 0x01 ; 1 + 4c2c: 37 85 ldd r19, Z+15 ; 0x0f + 4c2e: 37 fd sbrc r19, 7 + 4c30: fd cf rjmp .-6 ; 0x4c2c <__eewr_r18_x32a4u+0x4> + 4c32: 34 85 ldd r19, Z+12 ; 0x0c + 4c34: 37 7f andi r19, 0xF7 ; 247 + 4c36: 34 87 std Z+12, r19 ; 0x0c + 4c38: 37 85 ldd r19, Z+15 ; 0x0f + 4c3a: 31 ff sbrs r19, 1 + 4c3c: 09 c0 rjmp .+18 ; 0x4c50 <__eewr_r18_x32a4u+0x28> + 4c3e: 36 e3 ldi r19, 0x36 ; 54 + 4c40: 32 87 std Z+10, r19 ; 0x0a + 4c42: 38 ed ldi r19, 0xD8 ; 216 + 4c44: 34 bf out 0x34, r19 ; 52 + 4c46: 31 e0 ldi r19, 0x01 ; 1 + 4c48: 33 87 std Z+11, r19 ; 0x0b + 4c4a: 37 85 ldd r19, Z+15 ; 0x0f + 4c4c: 37 fd sbrc r19, 7 + 4c4e: fd cf rjmp .-6 ; 0x4c4a <__eewr_r18_x32a4u+0x22> + 4c50: 33 e3 ldi r19, 0x33 ; 51 + 4c52: 32 87 std Z+10, r19 ; 0x0a + 4c54: 80 83 st Z, r24 + 4c56: 91 83 std Z+1, r25 ; 0x01 + 4c58: 12 82 std Z+2, r1 ; 0x02 + 4c5a: 24 83 std Z+4, r18 ; 0x04 + 4c5c: 25 e3 ldi r18, 0x35 ; 53 + 4c5e: 22 87 std Z+10, r18 ; 0x0a + 4c60: 28 ed ldi r18, 0xD8 ; 216 + 4c62: 31 e0 ldi r19, 0x01 ; 1 + 4c64: 24 bf out 0x34, r18 ; 52 + 4c66: 33 87 std Z+11, r19 ; 0x0b + 4c68: 01 96 adiw r24, 0x01 ; 1 + 4c6a: 08 95 ret + +00004c6c : + 4c6c: fc 01 movw r30, r24 + 4c6e: 05 90 lpm r0, Z+ + 4c70: 61 50 subi r22, 0x01 ; 1 + 4c72: 70 40 sbci r23, 0x00 ; 0 + 4c74: 01 10 cpse r0, r1 + 4c76: d8 f7 brcc .-10 ; 0x4c6e + 4c78: 80 95 com r24 + 4c7a: 90 95 com r25 + 4c7c: 8e 0f add r24, r30 + 4c7e: 9f 1f adc r25, r31 + 4c80: 08 95 ret + +00004c82 : + 4c82: fc 01 movw r30, r24 + 4c84: 61 50 subi r22, 0x01 ; 1 + 4c86: 70 40 sbci r23, 0x00 ; 0 + 4c88: 01 90 ld r0, Z+ + 4c8a: 01 10 cpse r0, r1 + 4c8c: d8 f7 brcc .-10 ; 0x4c84 + 4c8e: 80 95 com r24 + 4c90: 90 95 com r25 + 4c92: 8e 0f add r24, r30 + 4c94: 9f 1f adc r25, r31 + 4c96: 08 95 ret + +00004c98 : + 4c98: 0f 93 push r16 + 4c9a: 1f 93 push r17 + 4c9c: cf 93 push r28 + 4c9e: df 93 push r29 + 4ca0: 18 2f mov r17, r24 + 4ca2: 09 2f mov r16, r25 + 4ca4: eb 01 movw r28, r22 + 4ca6: 8b 81 ldd r24, Y+3 ; 0x03 + 4ca8: 81 fd sbrc r24, 1 + 4caa: 03 c0 rjmp .+6 ; 0x4cb2 + 4cac: 8f ef ldi r24, 0xFF ; 255 + 4cae: 9f ef ldi r25, 0xFF ; 255 + 4cb0: 20 c0 rjmp .+64 ; 0x4cf2 + 4cb2: 82 ff sbrs r24, 2 + 4cb4: 10 c0 rjmp .+32 ; 0x4cd6 + 4cb6: 4e 81 ldd r20, Y+6 ; 0x06 + 4cb8: 5f 81 ldd r21, Y+7 ; 0x07 + 4cba: 2c 81 ldd r18, Y+4 ; 0x04 + 4cbc: 3d 81 ldd r19, Y+5 ; 0x05 + 4cbe: 42 17 cp r20, r18 + 4cc0: 53 07 cpc r21, r19 + 4cc2: 7c f4 brge .+30 ; 0x4ce2 + 4cc4: e8 81 ld r30, Y + 4cc6: f9 81 ldd r31, Y+1 ; 0x01 + 4cc8: 9f 01 movw r18, r30 + 4cca: 2f 5f subi r18, 0xFF ; 255 + 4ccc: 3f 4f sbci r19, 0xFF ; 255 + 4cce: 28 83 st Y, r18 + 4cd0: 39 83 std Y+1, r19 ; 0x01 + 4cd2: 10 83 st Z, r17 + 4cd4: 06 c0 rjmp .+12 ; 0x4ce2 + 4cd6: e8 85 ldd r30, Y+8 ; 0x08 + 4cd8: f9 85 ldd r31, Y+9 ; 0x09 + 4cda: 81 2f mov r24, r17 + 4cdc: 09 95 icall + 4cde: 89 2b or r24, r25 + 4ce0: 29 f7 brne .-54 ; 0x4cac + 4ce2: 2e 81 ldd r18, Y+6 ; 0x06 + 4ce4: 3f 81 ldd r19, Y+7 ; 0x07 + 4ce6: 2f 5f subi r18, 0xFF ; 255 + 4ce8: 3f 4f sbci r19, 0xFF ; 255 + 4cea: 2e 83 std Y+6, r18 ; 0x06 + 4cec: 3f 83 std Y+7, r19 ; 0x07 + 4cee: 81 2f mov r24, r17 + 4cf0: 90 2f mov r25, r16 + 4cf2: df 91 pop r29 + 4cf4: cf 91 pop r28 + 4cf6: 1f 91 pop r17 + 4cf8: 0f 91 pop r16 + 4cfa: 08 95 ret + +00004cfc <__ultoa_invert>: + 4cfc: fa 01 movw r30, r20 + 4cfe: aa 27 eor r26, r26 + 4d00: 28 30 cpi r18, 0x08 ; 8 + 4d02: 51 f1 breq .+84 ; 0x4d58 <__ultoa_invert+0x5c> + 4d04: 20 31 cpi r18, 0x10 ; 16 + 4d06: 81 f1 breq .+96 ; 0x4d68 <__ultoa_invert+0x6c> + 4d08: e8 94 clt + 4d0a: 6f 93 push r22 + 4d0c: 6e 7f andi r22, 0xFE ; 254 + 4d0e: 6e 5f subi r22, 0xFE ; 254 + 4d10: 7f 4f sbci r23, 0xFF ; 255 + 4d12: 8f 4f sbci r24, 0xFF ; 255 + 4d14: 9f 4f sbci r25, 0xFF ; 255 + 4d16: af 4f sbci r26, 0xFF ; 255 + 4d18: b1 e0 ldi r27, 0x01 ; 1 + 4d1a: 3e d0 rcall .+124 ; 0x4d98 <__ultoa_invert+0x9c> + 4d1c: b4 e0 ldi r27, 0x04 ; 4 + 4d1e: 3c d0 rcall .+120 ; 0x4d98 <__ultoa_invert+0x9c> + 4d20: 67 0f add r22, r23 + 4d22: 78 1f adc r23, r24 + 4d24: 89 1f adc r24, r25 + 4d26: 9a 1f adc r25, r26 + 4d28: a1 1d adc r26, r1 + 4d2a: 68 0f add r22, r24 + 4d2c: 79 1f adc r23, r25 + 4d2e: 8a 1f adc r24, r26 + 4d30: 91 1d adc r25, r1 + 4d32: a1 1d adc r26, r1 + 4d34: 6a 0f add r22, r26 + 4d36: 71 1d adc r23, r1 + 4d38: 81 1d adc r24, r1 + 4d3a: 91 1d adc r25, r1 + 4d3c: a1 1d adc r26, r1 + 4d3e: 20 d0 rcall .+64 ; 0x4d80 <__ultoa_invert+0x84> + 4d40: 09 f4 brne .+2 ; 0x4d44 <__ultoa_invert+0x48> + 4d42: 68 94 set + 4d44: 3f 91 pop r19 + 4d46: 2a e0 ldi r18, 0x0A ; 10 + 4d48: 26 9f mul r18, r22 + 4d4a: 11 24 eor r1, r1 + 4d4c: 30 19 sub r19, r0 + 4d4e: 30 5d subi r19, 0xD0 ; 208 + 4d50: 31 93 st Z+, r19 + 4d52: de f6 brtc .-74 ; 0x4d0a <__ultoa_invert+0xe> + 4d54: cf 01 movw r24, r30 + 4d56: 08 95 ret + 4d58: 46 2f mov r20, r22 + 4d5a: 47 70 andi r20, 0x07 ; 7 + 4d5c: 40 5d subi r20, 0xD0 ; 208 + 4d5e: 41 93 st Z+, r20 + 4d60: b3 e0 ldi r27, 0x03 ; 3 + 4d62: 0f d0 rcall .+30 ; 0x4d82 <__ultoa_invert+0x86> + 4d64: c9 f7 brne .-14 ; 0x4d58 <__ultoa_invert+0x5c> + 4d66: f6 cf rjmp .-20 ; 0x4d54 <__ultoa_invert+0x58> + 4d68: 46 2f mov r20, r22 + 4d6a: 4f 70 andi r20, 0x0F ; 15 + 4d6c: 40 5d subi r20, 0xD0 ; 208 + 4d6e: 4a 33 cpi r20, 0x3A ; 58 + 4d70: 18 f0 brcs .+6 ; 0x4d78 <__ultoa_invert+0x7c> + 4d72: 49 5d subi r20, 0xD9 ; 217 + 4d74: 31 fd sbrc r19, 1 + 4d76: 40 52 subi r20, 0x20 ; 32 + 4d78: 41 93 st Z+, r20 + 4d7a: 02 d0 rcall .+4 ; 0x4d80 <__ultoa_invert+0x84> + 4d7c: a9 f7 brne .-22 ; 0x4d68 <__ultoa_invert+0x6c> + 4d7e: ea cf rjmp .-44 ; 0x4d54 <__ultoa_invert+0x58> + 4d80: b4 e0 ldi r27, 0x04 ; 4 + 4d82: a6 95 lsr r26 + 4d84: 97 95 ror r25 + 4d86: 87 95 ror r24 + 4d88: 77 95 ror r23 + 4d8a: 67 95 ror r22 + 4d8c: ba 95 dec r27 + 4d8e: c9 f7 brne .-14 ; 0x4d82 <__ultoa_invert+0x86> + 4d90: 00 97 sbiw r24, 0x00 ; 0 + 4d92: 61 05 cpc r22, r1 + 4d94: 71 05 cpc r23, r1 + 4d96: 08 95 ret + 4d98: 9b 01 movw r18, r22 + 4d9a: ac 01 movw r20, r24 + 4d9c: 0a 2e mov r0, r26 + 4d9e: 06 94 lsr r0 + 4da0: 57 95 ror r21 + 4da2: 47 95 ror r20 + 4da4: 37 95 ror r19 + 4da6: 27 95 ror r18 + 4da8: ba 95 dec r27 + 4daa: c9 f7 brne .-14 ; 0x4d9e <__ultoa_invert+0xa2> + 4dac: 62 0f add r22, r18 + 4dae: 73 1f adc r23, r19 + 4db0: 84 1f adc r24, r20 + 4db2: 95 1f adc r25, r21 + 4db4: a0 1d adc r26, r0 + 4db6: 08 95 ret + +00004db8 <__divmodsi4>: + 4db8: 05 2e mov r0, r21 + 4dba: 97 fb bst r25, 7 + 4dbc: 16 f4 brtc .+4 ; 0x4dc2 <__divmodsi4+0xa> + 4dbe: 00 94 com r0 + 4dc0: 0f d0 rcall .+30 ; 0x4de0 <__negsi2> + 4dc2: 57 fd sbrc r21, 7 + 4dc4: 05 d0 rcall .+10 ; 0x4dd0 <__divmodsi4_neg2> + 4dc6: 45 d0 rcall .+138 ; 0x4e52 <__udivmodsi4> + 4dc8: 07 fc sbrc r0, 7 + 4dca: 02 d0 rcall .+4 ; 0x4dd0 <__divmodsi4_neg2> + 4dcc: 46 f4 brtc .+16 ; 0x4dde <__divmodsi4_exit> + 4dce: 08 c0 rjmp .+16 ; 0x4de0 <__negsi2> + +00004dd0 <__divmodsi4_neg2>: + 4dd0: 50 95 com r21 + 4dd2: 40 95 com r20 + 4dd4: 30 95 com r19 + 4dd6: 21 95 neg r18 + 4dd8: 3f 4f sbci r19, 0xFF ; 255 + 4dda: 4f 4f sbci r20, 0xFF ; 255 + 4ddc: 5f 4f sbci r21, 0xFF ; 255 + +00004dde <__divmodsi4_exit>: + 4dde: 08 95 ret + +00004de0 <__negsi2>: + 4de0: 90 95 com r25 + 4de2: 80 95 com r24 + 4de4: 70 95 com r23 + 4de6: 61 95 neg r22 + 4de8: 7f 4f sbci r23, 0xFF ; 255 + 4dea: 8f 4f sbci r24, 0xFF ; 255 + 4dec: 9f 4f sbci r25, 0xFF ; 255 + 4dee: 08 95 ret + +00004df0 <__prologue_saves__>: + 4df0: 2f 92 push r2 + 4df2: 3f 92 push r3 + 4df4: 4f 92 push r4 + 4df6: 5f 92 push r5 + 4df8: 6f 92 push r6 + 4dfa: 7f 92 push r7 + 4dfc: 8f 92 push r8 + 4dfe: 9f 92 push r9 + 4e00: af 92 push r10 + 4e02: bf 92 push r11 + 4e04: cf 92 push r12 + 4e06: df 92 push r13 + 4e08: ef 92 push r14 + 4e0a: ff 92 push r15 + 4e0c: 0f 93 push r16 + 4e0e: 1f 93 push r17 + 4e10: cf 93 push r28 + 4e12: df 93 push r29 + 4e14: cd b7 in r28, 0x3d ; 61 + 4e16: de b7 in r29, 0x3e ; 62 + 4e18: ca 1b sub r28, r26 + 4e1a: db 0b sbc r29, r27 + 4e1c: cd bf out 0x3d, r28 ; 61 + 4e1e: de bf out 0x3e, r29 ; 62 + 4e20: 09 94 ijmp + +00004e22 <__epilogue_restores__>: + 4e22: 2a 88 ldd r2, Y+18 ; 0x12 + 4e24: 39 88 ldd r3, Y+17 ; 0x11 + 4e26: 48 88 ldd r4, Y+16 ; 0x10 + 4e28: 5f 84 ldd r5, Y+15 ; 0x0f + 4e2a: 6e 84 ldd r6, Y+14 ; 0x0e + 4e2c: 7d 84 ldd r7, Y+13 ; 0x0d + 4e2e: 8c 84 ldd r8, Y+12 ; 0x0c + 4e30: 9b 84 ldd r9, Y+11 ; 0x0b + 4e32: aa 84 ldd r10, Y+10 ; 0x0a + 4e34: b9 84 ldd r11, Y+9 ; 0x09 + 4e36: c8 84 ldd r12, Y+8 ; 0x08 + 4e38: df 80 ldd r13, Y+7 ; 0x07 + 4e3a: ee 80 ldd r14, Y+6 ; 0x06 + 4e3c: fd 80 ldd r15, Y+5 ; 0x05 + 4e3e: 0c 81 ldd r16, Y+4 ; 0x04 + 4e40: 1b 81 ldd r17, Y+3 ; 0x03 + 4e42: aa 81 ldd r26, Y+2 ; 0x02 + 4e44: b9 81 ldd r27, Y+1 ; 0x01 + 4e46: ce 0f add r28, r30 + 4e48: d1 1d adc r29, r1 + 4e4a: cd bf out 0x3d, r28 ; 61 + 4e4c: de bf out 0x3e, r29 ; 62 + 4e4e: ed 01 movw r28, r26 + 4e50: 08 95 ret + +00004e52 <__udivmodsi4>: + 4e52: a1 e2 ldi r26, 0x21 ; 33 + 4e54: 1a 2e mov r1, r26 + 4e56: aa 1b sub r26, r26 + 4e58: bb 1b sub r27, r27 + 4e5a: fd 01 movw r30, r26 + 4e5c: 0d c0 rjmp .+26 ; 0x4e78 <__udivmodsi4_ep> + +00004e5e <__udivmodsi4_loop>: + 4e5e: aa 1f adc r26, r26 + 4e60: bb 1f adc r27, r27 + 4e62: ee 1f adc r30, r30 + 4e64: ff 1f adc r31, r31 + 4e66: a2 17 cp r26, r18 + 4e68: b3 07 cpc r27, r19 + 4e6a: e4 07 cpc r30, r20 + 4e6c: f5 07 cpc r31, r21 + 4e6e: 20 f0 brcs .+8 ; 0x4e78 <__udivmodsi4_ep> + 4e70: a2 1b sub r26, r18 + 4e72: b3 0b sbc r27, r19 + 4e74: e4 0b sbc r30, r20 + 4e76: f5 0b sbc r31, r21 + +00004e78 <__udivmodsi4_ep>: + 4e78: 66 1f adc r22, r22 + 4e7a: 77 1f adc r23, r23 + 4e7c: 88 1f adc r24, r24 + 4e7e: 99 1f adc r25, r25 + 4e80: 1a 94 dec r1 + 4e82: 69 f7 brne .-38 ; 0x4e5e <__udivmodsi4_loop> + 4e84: 60 95 com r22 + 4e86: 70 95 com r23 + 4e88: 80 95 com r24 + 4e8a: 90 95 com r25 + 4e8c: 9b 01 movw r18, r22 + 4e8e: ac 01 movw r20, r24 + 4e90: bd 01 movw r22, r26 + 4e92: cf 01 movw r24, r30 + 4e94: 08 95 ret + +00004e96 <_exit>: + 4e96: f8 94 cli + +00004e98 <__stop_program>: + 4e98: ff cf rjmp .-2 ; 0x4e98 <__stop_program> diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.map b/Firmware/Chameleon-Mini/Chameleon-Mini.map index 628f16f..729541b 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.map +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.map @@ -1,2935 +1,2936 @@ -Archive member included because of file (symbol) - -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - Bin/HIDParser.o (__tablejump2__) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - Bin/Terminal.o (__do_copy_data) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - Bin/Configuration.o (__do_clear_bss) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - Bin/Commands.o (__mulshisi3) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) (__muluhisi3) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) (__umulhisi3) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - Bin/Random.o (rand) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - Bin/Configuration.o (memcpy_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - Bin/Button.o (strcmp_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - Bin/Button.o (strncpy_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - Bin/HIDClassDevice.o (memcmp) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - Bin/HIDClassDevice.o (memcpy) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - Bin/HIDClassDevice.o (memset) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - Bin/Commands.o (snprintf_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (vfprintf) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - Bin/Settings.o (__eerd_block_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - Bin/EndpointStream_XMEGA.o (__eerd_byte_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - Bin/EndpointStream_XMEGA.o (__eeupd_byte_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - Bin/Settings.o (__eewr_block_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) (__eewr_r18_x32a4u) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen_P) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (strnlen) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (fputc) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) (__ultoa_invert) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) (__divmodsi4) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__prologue_saves__) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) (__epilogue_restores__) -c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) (__udivmodsi4) - -Allocating common symbols -Common symbol size file - -USB_IsInitialized 0x1 Bin/USBTask.o -USB_EndpointTable 0x63 Bin/USBController_XMEGA.o -TerminalBuffer 0x100 Bin/Terminal.o -USB_Endpoint_SelectedFIFO - 0x2 Bin/Endpoint_XMEGA.o -ActiveConfiguration - 0x25 Bin/Configuration.o -USB_DeviceState 0x1 Bin/USBTask.o -USB_Device_ConfigurationNumber - 0x1 Bin/DeviceStandardReq.o -USB_Endpoint_SelectedHandle - 0x2 Bin/Endpoint_XMEGA.o -USB_Device_CurrentlySelfPowered - 0x1 Bin/DeviceStandardReq.o -CodecBuffer 0x100 Bin/Codec.o -GlobalSettings 0x13 Bin/Settings.o -USB_Endpoint_SelectedEndpoint - 0x1 Bin/Endpoint_XMEGA.o -USB_ControlRequest 0x8 Bin/USBTask.o -USB_Endpoint_FIFOs 0x318 Bin/Endpoint_XMEGA.o -USB_Device_RemoteWakeupEnabled - 0x1 Bin/DeviceStandardReq.o - -Discarded input sections - - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - .text 0x00000000 0x0 Bin/Chameleon-Mini.o - .bss 0x00000000 0x0 Bin/Chameleon-Mini.o - .text 0x00000000 0x0 Bin/LUFADescriptors.o - .bss 0x00000000 0x0 Bin/LUFADescriptors.o - .text 0x00000000 0x0 Bin/System.o - .bss 0x00000000 0x0 Bin/System.o - .text 0x00000000 0x0 Bin/Configuration.o - .bss 0x00000000 0x0 Bin/Configuration.o - .text 0x00000000 0x0 Bin/Random.o - .bss 0x00000000 0x0 Bin/Random.o - .text 0x00000000 0x0 Bin/Common.o - .bss 0x00000000 0x0 Bin/Common.o - .text 0x00000000 0x0 Bin/Memory.o - .text 0x00000000 0x0 Bin/Button.o - .text 0x00000000 0x0 Bin/Settings.o - .bss 0x00000000 0x0 Bin/Settings.o - .text 0x00000000 0x0 Bin/LED.o - .text 0x00000000 0x0 Bin/Terminal.o - .text 0x00000000 0x0 Bin/Commands.o - .bss 0x00000000 0x0 Bin/Commands.o - .text 0x00000000 0x0 Bin/XModem.o - .text 0x00000000 0x0 Bin/CommandLine.o - .text.CommandLineInit - 0x00000000 0xa Bin/CommandLine.o - .text 0x00000000 0x0 Bin/Codec.o - .bss 0x00000000 0x0 Bin/Codec.o - .text 0x00000000 0x0 Bin/ISO14443-2A.o - .text 0x00000000 0x0 Bin/MifareClassic.o - .text 0x00000000 0x0 Bin/ISO14443-3A.o - .bss 0x00000000 0x0 Bin/ISO14443-3A.o - .text 0x00000000 0x0 Bin/Crypto1.o - .text 0x00000000 0x0 Bin/HIDParser.o - .bss 0x00000000 0x0 Bin/HIDParser.o - .text.USB_ProcessHIDReport - 0x00000000 0x850 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 - .text.USB_GetHIDReportSize - 0x00000000 0x158 Bin/HIDParser.o - .text 0x00000000 0x0 Bin/ConfigDescriptors.o - .bss 0x00000000 0x0 Bin/ConfigDescriptors.o - .text.USB_GetNextDescriptorOfType - 0x00000000 0x50 Bin/ConfigDescriptors.o - .text.USB_GetNextDescriptorOfTypeBefore - 0x00000000 0x6c Bin/ConfigDescriptors.o - .text.USB_GetNextDescriptorOfTypeAfter - 0x00000000 0x3e Bin/ConfigDescriptors.o - .text.USB_GetNextDescriptorComp - 0x00000000 0x8e Bin/ConfigDescriptors.o - .text 0x00000000 0x0 Bin/DeviceStandardReq.o - .bss 0x00000000 0x0 Bin/DeviceStandardReq.o - .text 0x00000000 0x0 Bin/Events.o - .bss 0x00000000 0x0 Bin/Events.o - .text 0x00000000 0x0 Bin/HostStandardReq.o - .bss 0x00000000 0x0 Bin/HostStandardReq.o - .text 0x00000000 0x0 Bin/USBTask.o - .bss 0x00000000 0x0 Bin/USBTask.o - .text 0x00000000 0x0 Bin/Device_XMEGA.o - .bss 0x00000000 0x0 Bin/Device_XMEGA.o - .text.USB_Device_SendRemoteWakeup - 0x00000000 0xc Bin/Device_XMEGA.o - .text 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_Write_Stream_BE - 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Stream_LE - 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Stream_BE - 0x00000000 0xf8 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_PStream_LE - 0x00000000 0xec Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_PStream_BE - 0x00000000 0xf6 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_EStream_LE - 0x00000000 0xf0 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_EStream_BE - 0x00000000 0xfa Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_EStream_LE - 0x00000000 0xfe Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_EStream_BE - 0x00000000 0x108 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Write_Control_Stream_BE - 0x00000000 0x170 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Control_Stream_LE - 0x00000000 0xf0 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Control_Stream_BE - 0x00000000 0xde 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 - .text.Endpoint_Write_Control_EStream_BE - 0x00000000 0x172 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Control_EStream_LE - 0x00000000 0xf6 Bin/EndpointStream_XMEGA.o - .text.Endpoint_Read_Control_EStream_BE - 0x00000000 0xe2 Bin/EndpointStream_XMEGA.o - .text 0x00000000 0x0 Bin/Endpoint_XMEGA.o - .bss 0x00000000 0x0 Bin/Endpoint_XMEGA.o - .text 0x00000000 0x0 Bin/Host_XMEGA.o - .bss 0x00000000 0x0 Bin/Host_XMEGA.o - .text 0x00000000 0x0 Bin/PipeStream_XMEGA.o - .bss 0x00000000 0x0 Bin/PipeStream_XMEGA.o - .text 0x00000000 0x0 Bin/Pipe_XMEGA.o - .bss 0x00000000 0x0 Bin/Pipe_XMEGA.o - .text 0x00000000 0x0 Bin/USBController_XMEGA.o - .bss 0x00000000 0x0 Bin/USBController_XMEGA.o - .text 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o - .bss 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o - .text 0x00000000 0x0 Bin/AudioClassDevice.o - .bss 0x00000000 0x0 Bin/AudioClassDevice.o - .text.Audio_Device_ConfigureEndpoints - 0x00000000 0x32 Bin/AudioClassDevice.o - .text.Audio_Device_Event_Stub - 0x00000000 0x2 Bin/AudioClassDevice.o - .text.Audio_Device_ProcessControlRequest - 0x00000000 0x29e Bin/AudioClassDevice.o - .text 0x00000000 0x0 Bin/CDCClassDevice.o - .bss 0x00000000 0x0 Bin/CDCClassDevice.o - .text.CDC_Device_putchar - 0x00000000 0x1e Bin/CDCClassDevice.o - .text.CDC_Device_BytesReceived - 0x00000000 0x8a Bin/CDCClassDevice.o - .text.CDC_Device_getchar_Blocking - 0x00000000 0x3e Bin/CDCClassDevice.o - .text.CDC_Device_getchar - 0x00000000 0x1a Bin/CDCClassDevice.o - .rodata 0x00000000 0x8 Bin/CDCClassDevice.o - .text.CDC_Device_SendControlLineStateChange - 0x00000000 0x7c Bin/CDCClassDevice.o - .text.CDC_Device_CreateStream - 0x00000000 0x26 Bin/CDCClassDevice.o - .text.CDC_Device_CreateBlockingStream - 0x00000000 0x26 Bin/CDCClassDevice.o - .text 0x00000000 0x0 Bin/HIDClassDevice.o - .bss 0x00000000 0x0 Bin/HIDClassDevice.o - .text.HID_Device_ProcessControlRequest - 0x00000000 0x254 Bin/HIDClassDevice.o - .text.HID_Device_ConfigureEndpoints - 0x00000000 0x2c Bin/HIDClassDevice.o - .text.HID_Device_USBTask - 0x00000000 0x1b2 Bin/HIDClassDevice.o - .text 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 - .text 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 - .text.MIDI_Device_Flush - 0x00000000 0x5c Bin/MIDIClassDevice.o - .text.MIDI_Device_USBTask - 0x00000000 0x2c Bin/MIDIClassDevice.o - .text.MIDI_Device_ReceiveEventPacket - 0x00000000 0x70 Bin/MIDIClassDevice.o - .text 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 - .text.PRNT_Device_SendData - 0x00000000 0x3c Bin/PrinterClassDevice.o - .text.PRNT_Device_SendByte - 0x00000000 0x5e Bin/PrinterClassDevice.o - .text.PRNT_Device_putchar - 0x00000000 0x1e Bin/PrinterClassDevice.o - .text.PRNT_Device_Flush - 0x00000000 0x88 Bin/PrinterClassDevice.o - .text.PRNT_Device_USBTask - 0x00000000 0xcc Bin/PrinterClassDevice.o - .text.PRNT_Device_BytesReceived - 0x00000000 0x7a Bin/PrinterClassDevice.o - .text.PRNT_Device_ReceiveByte - 0x00000000 0xb6 Bin/PrinterClassDevice.o - .text.PRNT_Device_getchar_Blocking - 0x00000000 0x3e Bin/PrinterClassDevice.o - .text.PRNT_Device_getchar - 0x00000000 0x1a Bin/PrinterClassDevice.o - .text.PRNT_Device_CreateStream - 0x00000000 0x26 Bin/PrinterClassDevice.o - .text.PRNT_Device_CreateBlockingStream - 0x00000000 0x26 Bin/PrinterClassDevice.o - .text.PRNT_Device_Event_Stub - 0x00000000 0x2 Bin/PrinterClassDevice.o - .text.PRNT_Device_ProcessControlRequest - 0x00000000 0xe2 Bin/PrinterClassDevice.o - .text 0x00000000 0x0 Bin/RNDISClassDevice.o - .bss 0x00000000 0x0 Bin/RNDISClassDevice.o - .text.RNDIS_Device_ProcessControlRequest - 0x00000000 0x53c Bin/RNDISClassDevice.o - .text.RNDIS_Device_ConfigureEndpoints - 0x00000000 0x50 Bin/RNDISClassDevice.o - .rodata 0x00000000 0x8 Bin/RNDISClassDevice.o - .text.RNDIS_Device_USBTask - 0x00000000 0x74 Bin/RNDISClassDevice.o - .text.RNDIS_Device_IsPacketReceived - 0x00000000 0x24 Bin/RNDISClassDevice.o - .text.RNDIS_Device_ReadPacket - 0x00000000 0xa2 Bin/RNDISClassDevice.o - .text.RNDIS_Device_SendPacket - 0x00000000 0xca Bin/RNDISClassDevice.o - .progmem.data 0x00000000 0x6c Bin/RNDISClassDevice.o - .text 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o - .bss 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o - .text 0x00000000 0x0 Bin/AudioClassHost.o - .bss 0x00000000 0x0 Bin/AudioClassHost.o - .text 0x00000000 0x0 Bin/CDCClassHost.o - .bss 0x00000000 0x0 Bin/CDCClassHost.o - .text 0x00000000 0x0 Bin/HIDClassHost.o - .bss 0x00000000 0x0 Bin/HIDClassHost.o - .text 0x00000000 0x0 Bin/MassStorageClassHost.o - .bss 0x00000000 0x0 Bin/MassStorageClassHost.o - .text 0x00000000 0x0 Bin/MIDIClassHost.o - .bss 0x00000000 0x0 Bin/MIDIClassHost.o - .text 0x00000000 0x0 Bin/PrinterClassHost.o - .bss 0x00000000 0x0 Bin/PrinterClassHost.o - .text 0x00000000 0x0 Bin/RNDISClassHost.o - .bss 0x00000000 0x0 Bin/RNDISClassHost.o - .text 0x00000000 0x0 Bin/StillImageClassHost.o - .bss 0x00000000 0x0 Bin/StillImageClassHost.o - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc 0x00000000 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .text.avr-libc - 0x00000000 0x1a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .text.avr-libc - 0x00000000 0xe c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .text.avr-libc - 0x00000000 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .text.avr-libc - 0x00000000 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.div - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .text 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .bss 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc.mul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc.prologue - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc.builtins - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - .text.libgcc.fmul - 0x00000000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - -Memory Configuration - -Name Origin Length Attributes -text 0x00000000 0x00100000 xr -data 0x00802000 0x0000ffa0 rw !x -eeprom 0x00810000 0x00010000 rw !x -fuse 0x00820000 0x00000400 rw !x -lock 0x00830000 0x00000400 rw !x -signature 0x00840000 0x00000400 rw !x -user_signatures 0x00850000 0x00000400 rw !x -*default* 0x00000000 0xffffffff - -Linker script and memory map - -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -LOAD Bin/Chameleon-Mini.o -LOAD Bin/LUFADescriptors.o -LOAD Bin/System.o -LOAD Bin/Configuration.o -LOAD Bin/Random.o -LOAD Bin/Common.o -LOAD Bin/Memory.o -LOAD Bin/Button.o -LOAD Bin/Settings.o -LOAD Bin/LED.o -LOAD Bin/Terminal.o -LOAD Bin/Commands.o -LOAD Bin/XModem.o -LOAD Bin/CommandLine.o -LOAD Bin/Codec.o -LOAD Bin/ISO14443-2A.o -LOAD Bin/MifareClassic.o -LOAD Bin/ISO14443-3A.o -LOAD Bin/Crypto1.o -LOAD Bin/HIDParser.o -LOAD Bin/ConfigDescriptors.o -LOAD Bin/DeviceStandardReq.o -LOAD Bin/Events.o -LOAD Bin/HostStandardReq.o -LOAD Bin/USBTask.o -LOAD Bin/Device_XMEGA.o -LOAD Bin/EndpointStream_XMEGA.o -LOAD Bin/Endpoint_XMEGA.o -LOAD Bin/Host_XMEGA.o -LOAD Bin/PipeStream_XMEGA.o -LOAD Bin/Pipe_XMEGA.o -LOAD Bin/USBController_XMEGA.o -LOAD Bin/USBInterrupt_XMEGA.o -LOAD Bin/AudioClassDevice.o -LOAD Bin/CDCClassDevice.o -LOAD Bin/HIDClassDevice.o -LOAD Bin/MassStorageClassDevice.o -LOAD Bin/MIDIClassDevice.o -LOAD Bin/PrinterClassDevice.o -LOAD Bin/RNDISClassDevice.o -LOAD Bin/AndroidAccessoryClassHost.o -LOAD Bin/AudioClassHost.o -LOAD Bin/CDCClassHost.o -LOAD Bin/HIDClassHost.o -LOAD Bin/MassStorageClassHost.o -LOAD Bin/MIDIClassHost.o -LOAD Bin/PrinterClassHost.o -LOAD Bin/RNDISClassHost.o -LOAD Bin/StillImageClassHost.o -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libm.a -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a -LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a - -.hash - *(.hash) - -.dynsym - *(.dynsym) - -.dynstr - *(.dynstr) - -.gnu.version - *(.gnu.version) - -.gnu.version_d - *(.gnu.version_d) - -.gnu.version_r - *(.gnu.version_r) - -.rel.init - *(.rel.init) - -.rela.init - *(.rela.init) - -.rel.text - *(.rel.text) - *(.rel.text.*) - *(.rel.gnu.linkonce.t*) - -.rela.text - *(.rela.text) - *(.rela.text.*) - *(.rela.gnu.linkonce.t*) - -.rel.fini - *(.rel.fini) - -.rela.fini - *(.rela.fini) - -.rel.rodata - *(.rel.rodata) - *(.rel.rodata.*) - *(.rel.gnu.linkonce.r*) - -.rela.rodata - *(.rela.rodata) - *(.rela.rodata.*) - *(.rela.gnu.linkonce.r*) - -.rel.data - *(.rel.data) - *(.rel.data.*) - *(.rel.gnu.linkonce.d*) - -.rela.data - *(.rela.data) - *(.rela.data.*) - *(.rela.gnu.linkonce.d*) - -.rel.ctors - *(.rel.ctors) - -.rela.ctors - *(.rela.ctors) - -.rel.dtors - *(.rel.dtors) - -.rela.dtors - *(.rela.dtors) - -.rel.got - *(.rel.got) - -.rela.got - *(.rela.got) - -.rel.bss - *(.rel.bss) - -.rela.bss - *(.rela.bss) - -.rel.plt - *(.rel.plt) - -.rela.plt - *(.rela.plt) - -.text 0x00000000 0x5282 - *(.vectors) - .vectors 0x00000000 0x1fc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x00000000 __vectors - *(.vectors) - *(.progmem.gcc*) - *(.progmem*) - .progmem.data 0x000001fc 0x8c Bin/LUFADescriptors.o - 0x000001fc ProductString - 0x0000021a ManufacturerString - 0x00000234 LanguageString - 0x00000238 ConfigurationDescriptor - 0x00000276 DeviceDescriptor - .progmem.data 0x00000288 0x6f Bin/Configuration.o - .progmem.data 0x000002f7 0x120 Bin/Button.o - .progmem.data 0x00000417 0x64 Bin/Commands.o - .progmem.data 0x0000047b 0x22c Bin/CommandLine.o - 0x0000047b CommandTable - 0x000006a8 . = ALIGN (0x2) - *fill* 0x000006a7 0x1 - 0x000006a8 __trampolines_start = . - *(.trampolines) - .trampolines 0x000006a8 0x0 linker stubs - *(.trampolines*) - 0x000006a8 __trampolines_end = . - *(.jumptables) - *(.jumptables*) - *(.lowtext) - *(.lowtext*) - 0x000006a8 __ctors_start = . - *(.ctors) - 0x000006a8 __ctors_end = . - 0x000006a8 __dtors_start = . - *(.dtors) - 0x000006a8 __dtors_end = . - SORT(*)(.ctors) - SORT(*)(.dtors) - *(.init0) - .init0 0x000006a8 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x000006a8 __init - *(.init0) - *(.init1) - *(.init1) - *(.init2) - .init2 0x000006a8 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - *(.init2) - *(.init3) - *(.init3) - *(.init4) - .init4 0x000006b4 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - 0x000006b4 __do_copy_data - .init4 0x000006ca 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - 0x000006ca __do_clear_bss - *(.init4) - *(.init5) - *(.init5) - *(.init6) - *(.init6) - *(.init7) - *(.init7) - *(.init8) - *(.init8) - *(.init9) - .init9 0x000006da 0x6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - *(.init9) - *(.text) - .text 0x000006e0 0x2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x000006e0 __vector_38 - 0x000006e0 __vector_104 - 0x000006e0 __vector_63 - 0x000006e0 __vector_28 - 0x000006e0 __vector_67 - 0x000006e0 __vector_1 - 0x000006e0 __vector_119 - 0x000006e0 __vector_32 - 0x000006e0 __vector_75 - 0x000006e0 __vector_71 - 0x000006e0 __vector_91 - 0x000006e0 __vector_62 - 0x000006e0 __vector_77 - 0x000006e0 __vector_102 - 0x000006e0 __vector_24 - 0x000006e0 __vector_12 - 0x000006e0 __vector_55 - 0x000006e0 __vector_69 - 0x000006e0 __vector_81 - 0x000006e0 __vector_90 - 0x000006e0 __vector_46 - 0x000006e0 __bad_interrupt - 0x000006e0 __vector_122 - 0x000006e0 __vector_72 - 0x000006e0 __vector_114 - 0x000006e0 __vector_6 - 0x000006e0 __vector_110 - 0x000006e0 __vector_31 - 0x000006e0 __vector_92 - 0x000006e0 __vector_35 - 0x000006e0 __vector_78 - 0x000006e0 __vector_74 - 0x000006e0 __vector_117 - 0x000006e0 __vector_39 - 0x000006e0 __vector_107 - 0x000006e0 __vector_3 - 0x000006e0 __vector_105 - 0x000006e0 __vector_98 - 0x000006e0 __vector_23 - 0x000006e0 __vector_68 - 0x000006e0 __vector_30 - 0x000006e0 __vector_73 - 0x000006e0 __vector_45 - 0x000006e0 __vector_25 - 0x000006e0 __vector_93 - 0x000006e0 __vector_61 - 0x000006e0 __vector_11 - 0x000006e0 __vector_54 - 0x000006e0 __vector_99 - 0x000006e0 __vector_13 - 0x000006e0 __vector_17 - 0x000006e0 __vector_19 - 0x000006e0 __vector_56 - 0x000006e0 __vector_7 - 0x000006e0 __vector_49 - 0x000006e0 __vector_123 - 0x000006e0 __vector_41 - 0x000006e0 __vector_86 - 0x000006e0 __vector_100 - 0x000006e0 __vector_101 - 0x000006e0 __vector_64 - 0x000006e0 __vector_88 - 0x000006e0 __vector_109 - 0x000006e0 __vector_43 - 0x000006e0 __vector_27 - 0x000006e0 __vector_5 - 0x000006e0 __vector_113 - 0x000006e0 __vector_33 - 0x000006e0 __vector_76 - 0x000006e0 __vector_115 - 0x000006e0 __vector_47 - 0x000006e0 __vector_52 - 0x000006e0 __vector_37 - 0x000006e0 __vector_95 - 0x000006e0 __vector_103 - 0x000006e0 __vector_96 - 0x000006e0 __vector_89 - 0x000006e0 __vector_108 - 0x000006e0 __vector_4 - 0x000006e0 __vector_44 - 0x000006e0 __vector_82 - 0x000006e0 __vector_106 - 0x000006e0 __vector_118 - 0x000006e0 __vector_51 - 0x000006e0 __vector_9 - 0x000006e0 __vector_2 - 0x000006e0 __vector_21 - 0x000006e0 __vector_15 - 0x000006e0 __vector_66 - 0x000006e0 __vector_36 - 0x000006e0 __vector_79 - 0x000006e0 __vector_58 - 0x000006e0 __vector_70 - 0x000006e0 __vector_29 - 0x000006e0 __vector_60 - 0x000006e0 __vector_121 - 0x000006e0 __vector_40 - 0x000006e0 __vector_85 - 0x000006e0 __vector_94 - 0x000006e0 __vector_126 - 0x000006e0 __vector_8 - 0x000006e0 __vector_26 - 0x000006e0 __vector_48 - 0x000006e0 __vector_124 - 0x000006e0 __vector_116 - 0x000006e0 __vector_112 - 0x000006e0 __vector_111 - 0x000006e0 __vector_80 - 0x000006e0 __vector_14 - 0x000006e0 __vector_84 - 0x000006e0 __vector_57 - 0x000006e0 __vector_53 - 0x000006e0 __vector_10 - 0x000006e0 __vector_50 - 0x000006e0 __vector_16 - 0x000006e0 __vector_59 - 0x000006e0 __vector_18 - 0x000006e0 __vector_97 - 0x000006e0 __vector_20 - 0x000006e0 __vector_42 - 0x000006e0 __vector_87 - 0x000006e0 __vector_65 - 0x000006e0 __vector_120 - 0x000006e2 . = ALIGN (0x2) - *(.text.*) - .text.startup.main - 0x000006e2 0x76 Bin/Chameleon-Mini.o - 0x000006e2 main - .text.CALLBACK_USB_GetDescriptor - 0x00000758 0x82 Bin/LUFADescriptors.o - 0x00000758 CALLBACK_USB_GetDescriptor - .text.__vector_default - 0x000007da 0xc Bin/System.o - 0x000007da __vector_default - .text.SystemInit - 0x000007e6 0x6e Bin/System.o - 0x000007e6 SystemInit - .text.SystemReset - 0x00000854 0xe Bin/System.o - 0x00000854 SystemReset - .text.SystemEnterBootloader - 0x00000862 0xc Bin/System.o - 0x00000862 SystemEnterBootloader - .text.SystemStartUSBClock - 0x0000086e 0x32 Bin/System.o - 0x0000086e SystemStartUSBClock - .text.SystemStopUSBClock - 0x000008a0 0x1c Bin/System.o - 0x000008a0 SystemStopUSBClock - .text.SystemInterruptInit - 0x000008bc 0xc Bin/System.o - 0x000008bc SystemInterruptInit - .text.CodecInitDummy - 0x000008c8 0x2 Bin/Configuration.o - .text.CodecTaskDummy - 0x000008ca 0x2 Bin/Configuration.o - .text.ApplicationInitDummy - 0x000008cc 0x2 Bin/Configuration.o - .text.ApplicationResetDummy - 0x000008ce 0x2 Bin/Configuration.o - .text.ApplicationTaskDummy - 0x000008d0 0x2 Bin/Configuration.o - .text.ApplicationProcessDummy - 0x000008d2 0x6 Bin/Configuration.o - .text.ApplicationGetUidDummy - 0x000008d8 0x2 Bin/Configuration.o - .text.ApplicationSetUidDummy - 0x000008da 0x2 Bin/Configuration.o - .text.ConfigurationSetById - 0x000008dc 0x36 Bin/Configuration.o - 0x000008dc ConfigurationSetById - .text.ConfigurationInit - 0x00000912 0xc Bin/Configuration.o - 0x00000912 ConfigurationInit - .text.ConfigurationSetByName - 0x0000091e 0x82 Bin/Configuration.o - 0x0000091e ConfigurationSetByName - .text.ConfigurationGetList - 0x000009a0 0x5e Bin/Configuration.o - 0x000009a0 ConfigurationGetList - .text.RandomInit - 0x000009fe 0x2 Bin/Random.o - 0x000009fe RandomInit - .text.RandomGetByte - 0x00000a00 0x6 Bin/Random.o - 0x00000a00 RandomGetByte - .text.RandomGetBuffer - 0x00000a06 0x1e Bin/Random.o - 0x00000a06 RandomGetBuffer - .text.RandomTick - 0x00000a24 0x10 Bin/Random.o - 0x00000a24 RandomTick - .text.BufferToHexString - 0x00000a34 0x84 Bin/Common.o - 0x00000a34 BufferToHexString - .text.HexStringToBuffer - 0x00000ab8 0x8c Bin/Common.o - 0x00000ab8 HexStringToBuffer - .text.MemoryReadBlock - 0x00000b44 0x30 Bin/Memory.o - 0x00000b44 MemoryReadBlock - .text.MemoryWriteBlock - 0x00000b74 0x32 Bin/Memory.o - 0x00000b74 MemoryWriteBlock - .text.MemoryClear - 0x00000ba6 0x10 Bin/Memory.o - 0x00000ba6 MemoryClear - .text.MemoryRecall - 0x00000bb6 0xec Bin/Memory.o - 0x00000bb6 MemoryRecall - .text.MemoryInit - 0x00000ca2 0xfc Bin/Memory.o - 0x00000ca2 MemoryInit - .text.MemoryStore - 0x00000d9e 0x282 Bin/Memory.o - 0x00000d9e MemoryStore - .text.MemoryUploadBlock - 0x00001020 0x3c2 Bin/Memory.o - 0x00001020 MemoryUploadBlock - .text.MemoryDownloadBlock - 0x000013e2 0x7a Bin/Memory.o - 0x000013e2 MemoryDownloadBlock - .text.ButtonInit - 0x0000145c 0xe Bin/Button.o - 0x0000145c ButtonInit - .text.ButtonTick - 0x0000146a 0x1ca Bin/Button.o - 0x0000146a ButtonTick - .text.ButtonGetActionList - 0x00001634 0x64 Bin/Button.o - 0x00001634 ButtonGetActionList - .text.ButtonSetActionById - 0x00001698 0xc Bin/Button.o - 0x00001698 ButtonSetActionById - .text.ButtonGetActionByName - 0x000016a4 0x1c Bin/Button.o - 0x000016a4 ButtonGetActionByName - .text.ButtonSetActionByName - 0x000016c0 0xb6 Bin/Button.o - 0x000016c0 ButtonSetActionByName - .text.SettingsLoad - 0x00001776 0x10 Bin/Settings.o - 0x00001776 SettingsLoad - .text.SettingsSave - 0x00001786 0x10 Bin/Settings.o - 0x00001786 SettingsSave - .text.SettingsSetActiveById - 0x00001796 0x2c Bin/Settings.o - 0x00001796 SettingsSetActiveById - .text.SettingsCycle - 0x000017c2 0xda Bin/Settings.o - 0x000017c2 SettingsCycle - .text.SettingsGetActiveById - 0x0000189c 0x6 Bin/Settings.o - 0x0000189c SettingsGetActiveById - .text.SettingsGetActiveByName - 0x000018a2 0x14 Bin/Settings.o - 0x000018a2 SettingsGetActiveByName - .text.SettingsSetActiveByName - 0x000018b6 0x1a Bin/Settings.o - 0x000018b6 SettingsSetActiveByName - .text.TerminalSendString - 0x000018d0 0xa Bin/Terminal.o - 0x000018d0 TerminalSendString - .text.TerminalSendStringP - 0x000018da 0x28 Bin/Terminal.o - 0x000018da TerminalSendStringP - .text.TerminalSendBlock - 0x00001902 0xc Bin/Terminal.o - 0x00001902 TerminalSendBlock - .text.TerminalInit - 0x0000190e 0xa Bin/Terminal.o - 0x0000190e TerminalInit - .text.TerminalTask - 0x00001918 0x3e Bin/Terminal.o - 0x00001918 TerminalTask - .text.TerminalTick - 0x00001956 0x80 Bin/Terminal.o - 0x00001956 TerminalTick - .text.EVENT_USB_Device_Connect - 0x000019d6 0xa Bin/Terminal.o - 0x000019d6 EVENT_USB_Device_Connect - .text.EVENT_USB_Device_Disconnect - 0x000019e0 0xa Bin/Terminal.o - 0x000019e0 EVENT_USB_Device_Disconnect - .text.EVENT_USB_Device_ConfigurationChanged - 0x000019ea 0x8 Bin/Terminal.o - 0x000019ea EVENT_USB_Device_ConfigurationChanged - .text.EVENT_USB_Device_ControlRequest - 0x000019f2 0x8 Bin/Terminal.o - 0x000019f2 EVENT_USB_Device_ControlRequest - .text.CommandGetVersion - 0x000019fa 0x3c Bin/Commands.o - 0x000019fa CommandGetVersion - .text.CommandGetConfig - 0x00001a36 0x2c Bin/Commands.o - 0x00001a36 CommandGetConfig - .text.CommandSetConfig - 0x00001a62 0x12 Bin/Commands.o - 0x00001a62 CommandSetConfig - .text.CommandExecConfig - 0x00001a74 0xc Bin/Commands.o - 0x00001a74 CommandExecConfig - .text.CommandGetUid - 0x00001a80 0x4e Bin/Commands.o - 0x00001a80 CommandGetUid - .text.CommandSetUid - 0x00001ace 0xb2 Bin/Commands.o - 0x00001ace CommandSetUid - .text.CommandGetReadOnly - 0x00001b80 0x24 Bin/Commands.o - 0x00001b80 CommandGetReadOnly - .text.CommandSetReadOnly - 0x00001ba4 0x28 Bin/Commands.o - 0x00001ba4 CommandSetReadOnly - .text.CommandExecUpload - 0x00001bcc 0xa Bin/Commands.o - 0x00001bcc CommandExecUpload - .text.CommandExecDownload - 0x00001bd6 0xa Bin/Commands.o - 0x00001bd6 CommandExecDownload - .text.CommandExecReset - 0x00001be0 0x16 Bin/Commands.o - 0x00001be0 CommandExecReset - .text.CommandExecUpgrade - 0x00001bf6 0x16 Bin/Commands.o - 0x00001bf6 CommandExecUpgrade - .text.CommandGetMemSize - 0x00001c0c 0x30 Bin/Commands.o - 0x00001c0c CommandGetMemSize - .text.CommandGetUidSize - 0x00001c3c 0x2c Bin/Commands.o - 0x00001c3c CommandGetUidSize - .text.CommandExecButton - 0x00001c68 0xa Bin/Commands.o - 0x00001c68 CommandExecButton - .text.CommandGetButton - 0x00001c72 0xa Bin/Commands.o - 0x00001c72 CommandGetButton - .text.CommandSetButton - 0x00001c7c 0x10 Bin/Commands.o - 0x00001c7c CommandSetButton - .text.CommandGetSetting - 0x00001c8c 0xa Bin/Commands.o - 0x00001c8c CommandGetSetting - .text.CommandSetSetting - 0x00001c96 0x10 Bin/Commands.o - 0x00001c96 CommandSetSetting - .text.CommandExecClear - 0x00001ca6 0x8 Bin/Commands.o - 0x00001ca6 CommandExecClear - .text.CommandExecHelp - 0x00001cae 0x98 Bin/Commands.o - 0x00001cae CommandExecHelp - .text.CommandGetRssi - 0x00001d46 0x68 Bin/Commands.o - 0x00001d46 CommandGetRssi - .text.CalcChecksum.constprop.0 - 0x00001dae 0x14 Bin/XModem.o - .text.XModemReceive - 0x00001dc2 0x30 Bin/XModem.o - 0x00001dc2 XModemReceive - .text.XModemSend - 0x00001df2 0x26 Bin/XModem.o - 0x00001df2 XModemSend - .text.XModemProcessByte - 0x00001e18 0x284 Bin/XModem.o - 0x00001e18 XModemProcessByte - .text.XModemTick - 0x0000209c 0x5c Bin/XModem.o - 0x0000209c XModemTick - .text.CommandLineProcessByte - 0x000020f8 0x342 Bin/CommandLine.o - 0x000020f8 CommandLineProcessByte - .text.CommandLineTick - 0x0000243a 0x2 Bin/CommandLine.o - 0x0000243a CommandLineTick - .text.StartDemod - 0x0000243c 0x3c Bin/ISO14443-2A.o - .text.__vector_34 - 0x00002478 0x88 Bin/ISO14443-2A.o - 0x00002478 __vector_34 - .text.__vector_22 - 0x00002500 0x148 Bin/ISO14443-2A.o - 0x00002500 __vector_22 - .text.__vector_83 - 0x00002648 0x1e2 Bin/ISO14443-2A.o - 0x00002648 __vector_83 - .text.ISO14443ACodecInit - 0x0000282a 0x6e Bin/ISO14443-2A.o - 0x0000282a ISO14443ACodecInit - .text.ISO14443ACodecTask - 0x00002898 0xfc Bin/ISO14443-2A.o - 0x00002898 ISO14443ACodecTask - .text.MifareClassicAppInit1K - 0x00002994 0x1a Bin/MifareClassic.o - 0x00002994 MifareClassicAppInit1K - .text.MifareClassicAppInit4K - 0x000029ae 0x1a Bin/MifareClassic.o - 0x000029ae MifareClassicAppInit4K - .text.MifareClassicAppReset - 0x000029c8 0x8 Bin/MifareClassic.o - 0x000029c8 MifareClassicAppReset - .text.MifareClassicAppTask - 0x000029d0 0x2 Bin/MifareClassic.o - 0x000029d0 MifareClassicAppTask - .text.MifareClassicAppProcess - 0x000029d2 0x8fa Bin/MifareClassic.o - 0x000029d2 MifareClassicAppProcess - .text.MifareClassicGetUid - 0x000032cc 0xc Bin/MifareClassic.o - 0x000032cc MifareClassicGetUid - .text.MifareClassicSetUid - 0x000032d8 0x40 Bin/MifareClassic.o - 0x000032d8 MifareClassicSetUid - .text.ISO14443AAppendCRCA - 0x00003318 0x5e Bin/ISO14443-3A.o - 0x00003318 ISO14443AAppendCRCA - .text.ISO14443ACheckCRCA - 0x00003376 0x7e Bin/ISO14443-3A.o - 0x00003376 ISO14443ACheckCRCA - .text.Crypto1LFSR - 0x000033f4 0x8c Bin/Crypto1.o - .text.Crypto1FilterOutput - 0x00003480 0x68 Bin/Crypto1.o - 0x00003480 Crypto1FilterOutput - .text.Crypto1Setup - 0x000034e8 0x340 Bin/Crypto1.o - 0x000034e8 Crypto1Setup - .text.Crypto1Auth - 0x00003828 0x52 Bin/Crypto1.o - 0x00003828 Crypto1Auth - .text.Crypto1Byte - 0x0000387a 0x82 Bin/Crypto1.o - 0x0000387a Crypto1Byte - .text.Crypto1Nibble - 0x000038fc 0x48 Bin/Crypto1.o - 0x000038fc Crypto1Nibble - .text.Crypto1PRNG - 0x00003944 0xb6 Bin/Crypto1.o - 0x00003944 Crypto1PRNG - .text.USB_Device_ProcessControlRequest - 0x000039fa 0x296 Bin/DeviceStandardReq.o - 0x000039fa USB_Device_ProcessControlRequest - .text.USB_Event_Stub - 0x00003c90 0x2 Bin/Events.o - 0x00003c90 USB_Event_Stub - 0x00003c90 EVENT_USB_Device_Suspend - 0x00003c90 EVENT_USB_Device_StartOfFrame - 0x00003c90 EVENT_USB_Device_Reset - 0x00003c90 EVENT_USB_Device_WakeUp - .text.USB_USBTask - 0x00003c92 0x2a Bin/USBTask.o - 0x00003c92 USB_USBTask - .text.Endpoint_Write_Stream_LE - 0x00003cbc 0xd8 Bin/EndpointStream_XMEGA.o - 0x00003cbc Endpoint_Write_Stream_LE - .text.Endpoint_Write_Control_Stream_LE - 0x00003d94 0x142 Bin/EndpointStream_XMEGA.o - 0x00003d94 Endpoint_Write_Control_Stream_LE - .text.Endpoint_Write_Control_PStream_LE - 0x00003ed6 0x13e Bin/EndpointStream_XMEGA.o - 0x00003ed6 Endpoint_Write_Control_PStream_LE - .text.Endpoint_ClearIN - 0x00004014 0x32 Bin/Endpoint_XMEGA.o - 0x00004014 Endpoint_ClearIN - .text.Endpoint_ClearOUT - 0x00004046 0x1e Bin/Endpoint_XMEGA.o - 0x00004046 Endpoint_ClearOUT - .text.Endpoint_Read_8 - 0x00004064 0x1e Bin/Endpoint_XMEGA.o - 0x00004064 Endpoint_Read_8 - .text.Endpoint_Write_8 - 0x00004082 0x1e Bin/Endpoint_XMEGA.o - 0x00004082 Endpoint_Write_8 - .text.Endpoint_SelectEndpoint - 0x000040a0 0x72 Bin/Endpoint_XMEGA.o - 0x000040a0 Endpoint_SelectEndpoint - .text.Endpoint_StallTransaction - 0x00004112 0x38 Bin/Endpoint_XMEGA.o - 0x00004112 Endpoint_StallTransaction - .text.Endpoint_ClearSETUP - 0x0000414a 0x58 Bin/Endpoint_XMEGA.o - 0x0000414a Endpoint_ClearSETUP - .text.Endpoint_IsSETUPReceived - 0x000041a2 0x32 Bin/Endpoint_XMEGA.o - 0x000041a2 Endpoint_IsSETUPReceived - .text.Endpoint_IsOUTReceived - 0x000041d4 0x32 Bin/Endpoint_XMEGA.o - 0x000041d4 Endpoint_IsOUTReceived - .text.Endpoint_IsINReady - 0x00004206 0x18 Bin/Endpoint_XMEGA.o - 0x00004206 Endpoint_IsINReady - .text.Endpoint_ConfigureEndpoint_PRV - 0x0000421e 0x9a Bin/Endpoint_XMEGA.o - 0x0000421e Endpoint_ConfigureEndpoint_PRV - .text.Endpoint_ConfigureEndpointTable - 0x000042b8 0xec Bin/Endpoint_XMEGA.o - 0x000042b8 Endpoint_ConfigureEndpointTable - .text.Endpoint_ClearEndpoints - 0x000043a4 0x70 Bin/Endpoint_XMEGA.o - 0x000043a4 Endpoint_ClearEndpoints - .text.Endpoint_ClearStatusStage - 0x00004414 0x2c Bin/Endpoint_XMEGA.o - 0x00004414 Endpoint_ClearStatusStage - .text.Endpoint_WaitUntilReady - 0x00004440 0xa6 Bin/Endpoint_XMEGA.o - 0x00004440 Endpoint_WaitUntilReady - .text.USB_Disable - 0x000044e6 0x1a Bin/USBController_XMEGA.o - 0x000044e6 USB_Disable - .text.USB_ResetInterface - 0x00004500 0x5c Bin/USBController_XMEGA.o - 0x00004500 USB_ResetInterface - .text.USB_Init - 0x0000455c 0x52 Bin/USBController_XMEGA.o - 0x0000455c USB_Init - .text.USB_INT_DisableAllInterrupts - 0x000045ae 0xe Bin/USBInterrupt_XMEGA.o - 0x000045ae USB_INT_DisableAllInterrupts - .text.USB_INT_ClearAllInterrupts - 0x000045bc 0xc Bin/USBInterrupt_XMEGA.o - 0x000045bc USB_INT_ClearAllInterrupts - .text.__vector_125 - 0x000045c8 0xda Bin/USBInterrupt_XMEGA.o - 0x000045c8 __vector_125 - .text.CDC_Device_ConfigureEndpoints - 0x000046a2 0x4a Bin/CDCClassDevice.o - 0x000046a2 CDC_Device_ConfigureEndpoints - .text.CDC_Device_SendString - 0x000046ec 0x52 Bin/CDCClassDevice.o - 0x000046ec CDC_Device_SendString - .text.CDC_Device_SendData - 0x0000473e 0x54 Bin/CDCClassDevice.o - 0x0000473e CDC_Device_SendData - .text.CDC_Device_SendByte - 0x00004792 0x6e Bin/CDCClassDevice.o - 0x00004792 CDC_Device_SendByte - .text.CDC_Device_Flush - 0x00004800 0x90 Bin/CDCClassDevice.o - 0x00004800 CDC_Device_Flush - .text.CDC_Device_USBTask - 0x00004890 0x36 Bin/CDCClassDevice.o - 0x00004890 CDC_Device_USBTask - .text.CDC_Device_ReceiveByte - 0x000048c6 0xbe Bin/CDCClassDevice.o - 0x000048c6 CDC_Device_ReceiveByte - .text.CDC_Device_Event_Stub - 0x00004984 0x2 Bin/CDCClassDevice.o - 0x00004984 EVENT_CDC_Device_ControLineStateChanged - 0x00004984 EVENT_CDC_Device_BreakSent - 0x00004984 CDC_Device_Event_Stub - 0x00004984 EVENT_CDC_Device_LineEncodingChanged - .text.CDC_Device_ProcessControlRequest - 0x00004986 0x13a Bin/CDCClassDevice.o - 0x00004986 CDC_Device_ProcessControlRequest - .text.libgcc.mul - 0x00004ac0 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - 0x00004ac0 __mulshisi3 - 0x00004ac4 __mulohisi3 - .text.libgcc.mul - 0x00004acc 0x14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - 0x00004acc __muluhisi3 - .text.libgcc.mul - 0x00004ae0 0x18 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - 0x00004ae0 __umulhisi3 - .text.avr-libc - 0x00004af8 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0x00004b8e rand_r - 0x00004b90 rand - 0x00004b96 srand - .text.avr-libc - 0x00004bac 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - 0x00004bac memcpy_P - .text.avr-libc - 0x00004bbe 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - 0x00004bbe strcmp_P - .text.avr-libc - 0x00004bd0 0x1e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - 0x00004bd0 strncpy_P - .text.avr-libc - 0x00004bee 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - 0x00004bee memcpy - .text.avr-libc - 0x00004c00 0x5a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x00004c00 snprintf_P - .text.avr-libc - 0x00004c5a 0x39a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x00004c5a vfprintf - .text.avr-libc - 0x00004ff4 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - 0x00004ff4 __eerd_block_x32a4u - .text.avr-libc - 0x0000500a 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - 0x0000500a __eewr_block_x32a4u - .text.avr-libc - 0x0000501c 0x46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - 0x0000501c __eewr_byte_x32a4u - 0x0000501e __eewr_r18_x32a4u - .text.avr-libc - 0x00005062 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - 0x00005062 strnlen_P - .text.avr-libc - 0x00005078 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - 0x00005078 strnlen - .text.avr-libc - 0x0000508e 0x58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0x0000508e fputc - .text.avr-libc - 0x000050e6 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - 0x000050e6 __ultoa_invert - .text.libgcc.div - 0x000051a2 0x36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - 0x000051a2 __divmodsi4 - .text.libgcc.prologue - 0x000051d8 0x32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - 0x000051d8 __prologue_saves__ - .text.libgcc.prologue - 0x0000520a 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - 0x0000520a __epilogue_restores__ - .text.libgcc.div - 0x0000523a 0x44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - 0x0000523a __udivmodsi4 - 0x0000527e . = ALIGN (0x2) - *(.fini9) - .fini9 0x0000527e 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - 0x0000527e _exit - 0x0000527e exit - *(.fini9) - *(.fini8) - *(.fini8) - *(.fini7) - *(.fini7) - *(.fini6) - *(.fini6) - *(.fini5) - *(.fini5) - *(.fini4) - *(.fini4) - *(.fini3) - *(.fini3) - *(.fini2) - *(.fini2) - *(.fini1) - *(.fini1) - *(.fini0) - .fini0 0x0000527e 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - *(.fini0) - 0x00005282 _etext = . - -.data 0x00802000 0x92 load address 0x00005282 - 0x00802000 PROVIDE (__data_start, .) - *(.data) - .data 0x00802000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - .data 0x00802000 0x0 Bin/Chameleon-Mini.o - .data 0x00802000 0x0 Bin/LUFADescriptors.o - .data 0x00802000 0x0 Bin/System.o - .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/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/MifareClassic.o - .data 0x0080201c 0x0 Bin/ISO14443-3A.o - .data 0x0080201c 0x0 Bin/Crypto1.o - .data 0x0080201c 0x0 Bin/HIDParser.o - .data 0x0080201c 0x0 Bin/ConfigDescriptors.o - .data 0x0080201c 0x0 Bin/DeviceStandardReq.o - .data 0x0080201c 0x0 Bin/Events.o - .data 0x0080201c 0x0 Bin/HostStandardReq.o - .data 0x0080201c 0x0 Bin/USBTask.o - .data 0x0080201c 0x0 Bin/Device_XMEGA.o - .data 0x0080201c 0x0 Bin/EndpointStream_XMEGA.o - .data 0x0080201c 0x0 Bin/Endpoint_XMEGA.o - .data 0x0080201c 0x0 Bin/Host_XMEGA.o - .data 0x0080201c 0x0 Bin/PipeStream_XMEGA.o - .data 0x0080201c 0x0 Bin/Pipe_XMEGA.o - .data 0x0080201c 0x0 Bin/USBController_XMEGA.o - .data 0x0080201c 0x0 Bin/USBInterrupt_XMEGA.o - .data 0x0080201c 0x0 Bin/AudioClassDevice.o - .data 0x0080201c 0x0 Bin/CDCClassDevice.o - .data 0x0080201c 0x0 Bin/HIDClassDevice.o - .data 0x0080201c 0x0 Bin/MassStorageClassDevice.o - .data 0x0080201c 0x0 Bin/MIDIClassDevice.o - .data 0x0080201c 0x0 Bin/PrinterClassDevice.o - .data 0x0080201c 0x0 Bin/RNDISClassDevice.o - .data 0x0080201c 0x0 Bin/AndroidAccessoryClassHost.o - .data 0x0080201c 0x0 Bin/AudioClassHost.o - .data 0x0080201c 0x0 Bin/CDCClassHost.o - .data 0x0080201c 0x0 Bin/HIDClassHost.o - .data 0x0080201c 0x0 Bin/MassStorageClassHost.o - .data 0x0080201c 0x0 Bin/MIDIClassHost.o - .data 0x0080201c 0x0 Bin/PrinterClassHost.o - .data 0x0080201c 0x0 Bin/RNDISClassHost.o - .data 0x0080201c 0x0 Bin/StillImageClassHost.o - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - .data 0x0080201c 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - .data 0x0080201c 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - .data 0x00802020 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - *(.data*) - *(.rodata) - .rodata 0x00802020 0x70 Bin/Crypto1.o - *(.rodata*) - .rodata.str1.1 - 0x00802090 0x1 Bin/Commands.o - *(.gnu.linkonce.d*) - 0x00802092 . = ALIGN (0x2) - *fill* 0x00802091 0x1 - 0x00802092 _edata = . - 0x00802092 PROVIDE (__data_end, .) - -.bss 0x00802092 0xa0b - 0x00802092 PROVIDE (__bss_start, .) - *(.bss) - .bss 0x00802092 0x400 Bin/Memory.o - .bss 0x00802492 0x1 Bin/Button.o - .bss 0x00802493 0x1 Bin/LED.o - 0x00802493 LEDPulseMask - .bss 0x00802494 0x1 Bin/Terminal.o - 0x00802494 TerminalState - .bss 0x00802495 0xe Bin/XModem.o - .bss 0x008024a3 0x2 Bin/CommandLine.o - .bss 0x008024a5 0x10 Bin/ISO14443-2A.o - .bss 0x008024b5 0x1d Bin/MifareClassic.o - .bss 0x008024d2 0x6 Bin/Crypto1.o - *(.bss*) - *(COMMON) - COMMON 0x008024d8 0x25 Bin/Configuration.o - 0x008024d8 ActiveConfiguration - COMMON 0x008024fd 0x13 Bin/Settings.o - 0x008024fd GlobalSettings - COMMON 0x00802510 0x100 Bin/Terminal.o - 0x00802510 TerminalBuffer - COMMON 0x00802610 0x100 Bin/Codec.o - 0x00802610 CodecBuffer - COMMON 0x00802710 0x3 Bin/DeviceStandardReq.o - 0x00802710 USB_Device_ConfigurationNumber - 0x00802711 USB_Device_CurrentlySelfPowered - 0x00802712 USB_Device_RemoteWakeupEnabled - COMMON 0x00802713 0xa Bin/USBTask.o - 0x00802713 USB_IsInitialized - 0x00802714 USB_DeviceState - 0x00802715 USB_ControlRequest - COMMON 0x0080271d 0x31d Bin/Endpoint_XMEGA.o - 0x0080271d USB_Endpoint_SelectedFIFO - 0x0080271f USB_Endpoint_SelectedHandle - 0x00802721 USB_Endpoint_SelectedEndpoint - 0x00802722 USB_Endpoint_FIFOs - COMMON 0x00802a3a 0x63 Bin/USBController_XMEGA.o - 0x00802a3a USB_EndpointTable - 0x00802a9d PROVIDE (__bss_end, .) - 0x00005282 __data_load_start = LOADADDR (.data) - 0x00005314 __data_load_end = (__data_load_start + SIZEOF (.data)) - -.noinit 0x00802a9d 0x0 - 0x00802a9d PROVIDE (__noinit_start, .) - *(.noinit*) - 0x00802a9d PROVIDE (__noinit_end, .) - 0x00802a9d _end = . - 0x00802a9d PROVIDE (__heap_start, .) - -.eeprom 0x00810000 0x13 - *(.eeprom*) - .eeprom 0x00810000 0x13 Bin/Settings.o - 0x00810000 StoredSettings - 0x00810013 __eeprom_end = . - -.fuse - *(.fuse) - *(.lfuse) - *(.hfuse) - *(.efuse) - -.lock - *(.lock*) - -.signature - *(.signature*) - -.user_signatures - *(.user_signatures*) - -.stab 0x00000000 0x14d0 - *(.stab) - .stab 0x00000000 0x6cc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - .stab 0x000006cc 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - 0x90 (size before relaxing) - .stab 0x00000750 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - 0x90 (size before relaxing) - .stab 0x000007d4 0xcc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - 0xd8 (size before relaxing) - .stab 0x000008a0 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - 0xc0 (size before relaxing) - .stab 0x00000954 0x84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - 0x90 (size before relaxing) - .stab 0x000009d8 0x6c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - 0x78 (size before relaxing) - .stab 0x00000a44 0xb4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - 0xc0 (size before relaxing) - .stab 0x00000af8 0xfc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - 0x108 (size before relaxing) - .stab 0x00000bf4 0xa8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - 0xb4 (size before relaxing) - .stab 0x00000c9c 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - 0xa8 (size before relaxing) - .stab 0x00000d38 0x1e0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - 0x1ec (size before relaxing) - .stab 0x00000f18 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - 0xa8 (size before relaxing) - .stab 0x00000fb4 0x9c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - 0xa8 (size before relaxing) - .stab 0x00001050 0x480 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - 0x48c (size before relaxing) - -.stabstr 0x00000000 0x70f - *(.stabstr) - .stabstr 0x00000000 0x70f c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - -.stab.excl - *(.stab.excl) - -.stab.exclstr - *(.stab.exclstr) - -.stab.index - *(.stab.index) - -.stab.indexstr - *(.stab.indexstr) - -.comment 0x00000000 0x2f - *(.comment) - .comment 0x00000000 0x2f Bin/Chameleon-Mini.o - 0x30 (size before relaxing) - .comment 0x00000000 0x30 Bin/LUFADescriptors.o - .comment 0x00000000 0x30 Bin/System.o - .comment 0x00000000 0x30 Bin/Configuration.o - .comment 0x00000000 0x30 Bin/Random.o - .comment 0x00000000 0x30 Bin/Common.o - .comment 0x00000000 0x30 Bin/Memory.o - .comment 0x00000000 0x30 Bin/Button.o - .comment 0x00000000 0x30 Bin/Settings.o - .comment 0x00000000 0x30 Bin/LED.o - .comment 0x00000000 0x30 Bin/Terminal.o - .comment 0x00000000 0x30 Bin/Commands.o - .comment 0x00000000 0x30 Bin/XModem.o - .comment 0x00000000 0x30 Bin/CommandLine.o - .comment 0x00000000 0x30 Bin/Codec.o - .comment 0x00000000 0x30 Bin/ISO14443-2A.o - .comment 0x00000000 0x30 Bin/MifareClassic.o - .comment 0x00000000 0x30 Bin/ISO14443-3A.o - .comment 0x00000000 0x30 Bin/Crypto1.o - .comment 0x00000000 0x30 Bin/HIDParser.o - .comment 0x00000000 0x30 Bin/ConfigDescriptors.o - .comment 0x00000000 0x30 Bin/DeviceStandardReq.o - .comment 0x00000000 0x30 Bin/Events.o - .comment 0x00000000 0x30 Bin/HostStandardReq.o - .comment 0x00000000 0x30 Bin/USBTask.o - .comment 0x00000000 0x30 Bin/Device_XMEGA.o - .comment 0x00000000 0x30 Bin/EndpointStream_XMEGA.o - .comment 0x00000000 0x30 Bin/Endpoint_XMEGA.o - .comment 0x00000000 0x30 Bin/Host_XMEGA.o - .comment 0x00000000 0x30 Bin/PipeStream_XMEGA.o - .comment 0x00000000 0x30 Bin/Pipe_XMEGA.o - .comment 0x00000000 0x30 Bin/USBController_XMEGA.o - .comment 0x00000000 0x30 Bin/USBInterrupt_XMEGA.o - .comment 0x00000000 0x30 Bin/AudioClassDevice.o - .comment 0x00000000 0x30 Bin/CDCClassDevice.o - .comment 0x00000000 0x30 Bin/HIDClassDevice.o - .comment 0x00000000 0x30 Bin/MassStorageClassDevice.o - .comment 0x00000000 0x30 Bin/MIDIClassDevice.o - .comment 0x00000000 0x30 Bin/PrinterClassDevice.o - .comment 0x00000000 0x30 Bin/RNDISClassDevice.o - .comment 0x00000000 0x30 Bin/AndroidAccessoryClassHost.o - .comment 0x00000000 0x30 Bin/AudioClassHost.o - .comment 0x00000000 0x30 Bin/CDCClassHost.o - .comment 0x00000000 0x30 Bin/HIDClassHost.o - .comment 0x00000000 0x30 Bin/MassStorageClassHost.o - .comment 0x00000000 0x30 Bin/MIDIClassHost.o - .comment 0x00000000 0x30 Bin/PrinterClassHost.o - .comment 0x00000000 0x30 Bin/RNDISClassHost.o - .comment 0x00000000 0x30 Bin/StillImageClassHost.o - .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .comment 0x00000000 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug - *(.debug) - -.line - *(.line) - -.debug_srcinfo - *(.debug_srcinfo) - -.debug_sfnames - *(.debug_sfnames) - -.debug_aranges 0x00000000 0xbf0 - *(.debug_aranges) - .debug_aranges - 0x00000000 0x20 Bin/Chameleon-Mini.o - .debug_aranges - 0x00000020 0x20 Bin/LUFADescriptors.o - .debug_aranges - 0x00000040 0x50 Bin/System.o - .debug_aranges - 0x00000090 0x78 Bin/Configuration.o - .debug_aranges - 0x00000108 0x38 Bin/Random.o - .debug_aranges - 0x00000140 0x28 Bin/Common.o - .debug_aranges - 0x00000168 0x58 Bin/Memory.o - .debug_aranges - 0x000001c0 0x48 Bin/Button.o - .debug_aranges - 0x00000208 0x50 Bin/Settings.o - .debug_aranges - 0x00000258 0x18 Bin/LED.o - .debug_aranges - 0x00000270 0x68 Bin/Terminal.o - .debug_aranges - 0x000002d8 0xc8 Bin/Commands.o - .debug_aranges - 0x000003a0 0x40 Bin/XModem.o - .debug_aranges - 0x000003e0 0x30 Bin/CommandLine.o - .debug_aranges - 0x00000410 0x18 Bin/Codec.o - .debug_aranges - 0x00000428 0x48 Bin/ISO14443-2A.o - .debug_aranges - 0x00000470 0x50 Bin/MifareClassic.o - .debug_aranges - 0x000004c0 0x28 Bin/ISO14443-3A.o - .debug_aranges - 0x000004e8 0x50 Bin/Crypto1.o - .debug_aranges - 0x00000538 0x38 Bin/HIDParser.o - .debug_aranges - 0x00000570 0x38 Bin/ConfigDescriptors.o - .debug_aranges - 0x000005a8 0x20 Bin/DeviceStandardReq.o - .debug_aranges - 0x000005c8 0x20 Bin/Events.o - .debug_aranges - 0x000005e8 0x18 Bin/HostStandardReq.o - .debug_aranges - 0x00000600 0x20 Bin/USBTask.o - .debug_aranges - 0x00000620 0x20 Bin/Device_XMEGA.o - .debug_aranges - 0x00000640 0xc8 Bin/EndpointStream_XMEGA.o - .debug_aranges - 0x00000708 0x90 Bin/Endpoint_XMEGA.o - .debug_aranges - 0x00000798 0x18 Bin/Host_XMEGA.o - .debug_aranges - 0x000007b0 0x18 Bin/PipeStream_XMEGA.o - .debug_aranges - 0x000007c8 0x18 Bin/Pipe_XMEGA.o - .debug_aranges - 0x000007e0 0x30 Bin/USBController_XMEGA.o - .debug_aranges - 0x00000810 0x30 Bin/USBInterrupt_XMEGA.o - .debug_aranges - 0x00000840 0x30 Bin/AudioClassDevice.o - .debug_aranges - 0x00000870 0x98 Bin/CDCClassDevice.o - .debug_aranges - 0x00000908 0x30 Bin/HIDClassDevice.o - .debug_aranges - 0x00000938 0x30 Bin/MassStorageClassDevice.o - .debug_aranges - 0x00000968 0x40 Bin/MIDIClassDevice.o - .debug_aranges - 0x000009a8 0x90 Bin/PrinterClassDevice.o - .debug_aranges - 0x00000a38 0x48 Bin/RNDISClassDevice.o - .debug_aranges - 0x00000a80 0x18 Bin/AndroidAccessoryClassHost.o - .debug_aranges - 0x00000a98 0x18 Bin/AudioClassHost.o - .debug_aranges - 0x00000ab0 0x18 Bin/CDCClassHost.o - .debug_aranges - 0x00000ac8 0x18 Bin/HIDClassHost.o - .debug_aranges - 0x00000ae0 0x18 Bin/MassStorageClassHost.o - .debug_aranges - 0x00000af8 0x18 Bin/MIDIClassHost.o - .debug_aranges - 0x00000b10 0x18 Bin/PrinterClassHost.o - .debug_aranges - 0x00000b28 0x18 Bin/RNDISClassHost.o - .debug_aranges - 0x00000b40 0x18 Bin/StillImageClassHost.o - .debug_aranges - 0x00000b58 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_aranges - 0x00000b90 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_aranges - 0x00000bb0 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_aranges - 0x00000bd0 0x20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug_pubnames - *(.debug_pubnames) - -.debug_info 0x00000000 0x19536 - *(.debug_info) - .debug_info 0x00000000 0x1381 Bin/Chameleon-Mini.o - .debug_info 0x00001381 0x962 Bin/LUFADescriptors.o - .debug_info 0x00001ce3 0xde5 Bin/System.o - .debug_info 0x00002ac8 0x656 Bin/Configuration.o - .debug_info 0x0000311e 0x161 Bin/Random.o - .debug_info 0x0000327f 0x1b3 Bin/Common.o - .debug_info 0x00003432 0x126a Bin/Memory.o - .debug_info 0x0000469c 0xa99 Bin/Button.o - .debug_info 0x00005135 0x54f Bin/Settings.o - .debug_info 0x00005684 0x7a Bin/LED.o - .debug_info 0x000056fe 0xb73 Bin/Terminal.o - .debug_info 0x00006271 0x17f3 Bin/Commands.o - .debug_info 0x00007a64 0x9a3 Bin/XModem.o - .debug_info 0x00008407 0xb66 Bin/CommandLine.o - .debug_info 0x00008f6d 0x1f1 Bin/Codec.o - .debug_info 0x0000915e 0x187e Bin/ISO14443-2A.o - .debug_info 0x0000a9dc 0x101c Bin/MifareClassic.o - .debug_info 0x0000b9f8 0x179 Bin/ISO14443-3A.o - .debug_info 0x0000bb71 0x53a Bin/Crypto1.o - .debug_info 0x0000c0ab 0x72e Bin/HIDParser.o - .debug_info 0x0000c7d9 0x5ed Bin/ConfigDescriptors.o - .debug_info 0x0000cdc6 0x11d6 Bin/DeviceStandardReq.o - .debug_info 0x0000df9c 0x7f Bin/Events.o - .debug_info 0x0000e01b 0x5d Bin/HostStandardReq.o - .debug_info 0x0000e078 0x435 Bin/USBTask.o - .debug_info 0x0000e4ad 0x670 Bin/Device_XMEGA.o - .debug_info 0x0000eb1d 0x19be Bin/EndpointStream_XMEGA.o - .debug_info 0x000104db 0xcff Bin/Endpoint_XMEGA.o - .debug_info 0x000111da 0x5d Bin/Host_XMEGA.o - .debug_info 0x00011237 0x5d Bin/PipeStream_XMEGA.o - .debug_info 0x00011294 0x5d Bin/Pipe_XMEGA.o - .debug_info 0x000112f1 0xd40 Bin/USBController_XMEGA.o - .debug_info 0x00012031 0xa7b Bin/USBInterrupt_XMEGA.o - .debug_info 0x00012aac 0xa9d Bin/AudioClassDevice.o - .debug_info 0x00013549 0xf93 Bin/CDCClassDevice.o - .debug_info 0x000144dc 0xf91 Bin/HIDClassDevice.o - .debug_info 0x0001546d 0xaa0 Bin/MassStorageClassDevice.o - .debug_info 0x00015f0d 0x7c6 Bin/MIDIClassDevice.o - .debug_info 0x000166d3 0xddd Bin/PrinterClassDevice.o - .debug_info 0x000174b0 0x1311 Bin/RNDISClassDevice.o - .debug_info 0x000187c1 0x5d Bin/AndroidAccessoryClassHost.o - .debug_info 0x0001881e 0x5d Bin/AudioClassHost.o - .debug_info 0x0001887b 0x5d Bin/CDCClassHost.o - .debug_info 0x000188d8 0x5d Bin/HIDClassHost.o - .debug_info 0x00018935 0x5d Bin/MassStorageClassHost.o - .debug_info 0x00018992 0x5d Bin/MIDIClassHost.o - .debug_info 0x000189ef 0x5d Bin/PrinterClassHost.o - .debug_info 0x00018a4c 0x5d Bin/RNDISClassHost.o - .debug_info 0x00018aa9 0x5d Bin/StillImageClassHost.o - .debug_info 0x00018b06 0x157 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_info 0x00018c5d 0x21c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_info 0x00018e79 0x549 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_info 0x000193c2 0x174 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - *(.gnu.linkonce.wi.*) - -.debug_abbrev 0x00000000 0x5a36 - *(.debug_abbrev) - .debug_abbrev 0x00000000 0x1d2 Bin/Chameleon-Mini.o - .debug_abbrev 0x000001d2 0x1bb Bin/LUFADescriptors.o - .debug_abbrev 0x0000038d 0x144 Bin/System.o - .debug_abbrev 0x000004d1 0x25f Bin/Configuration.o - .debug_abbrev 0x00000730 0xfb Bin/Random.o - .debug_abbrev 0x0000082b 0xb2 Bin/Common.o - .debug_abbrev 0x000008dd 0x346 Bin/Memory.o - .debug_abbrev 0x00000c23 0x2b7 Bin/Button.o - .debug_abbrev 0x00000eda 0x1fb Bin/Settings.o - .debug_abbrev 0x000010d5 0x44 Bin/LED.o - .debug_abbrev 0x00001119 0x33a Bin/Terminal.o - .debug_abbrev 0x00001453 0x38e Bin/Commands.o - .debug_abbrev 0x000017e1 0x2d7 Bin/XModem.o - .debug_abbrev 0x00001ab8 0x2db Bin/CommandLine.o - .debug_abbrev 0x00001d93 0xc4 Bin/Codec.o - .debug_abbrev 0x00001e57 0x2db Bin/ISO14443-2A.o - .debug_abbrev 0x00002132 0x321 Bin/MifareClassic.o - .debug_abbrev 0x00002453 0xa6 Bin/ISO14443-3A.o - .debug_abbrev 0x000024f9 0x1bd Bin/Crypto1.o - .debug_abbrev 0x000026b6 0x20a Bin/HIDParser.o - .debug_abbrev 0x000028c0 0x248 Bin/ConfigDescriptors.o - .debug_abbrev 0x00002b08 0x37e Bin/DeviceStandardReq.o - .debug_abbrev 0x00002e86 0x44 Bin/Events.o - .debug_abbrev 0x00002eca 0x26 Bin/HostStandardReq.o - .debug_abbrev 0x00002ef0 0x21d Bin/USBTask.o - .debug_abbrev 0x0000310d 0x11e Bin/Device_XMEGA.o - .debug_abbrev 0x0000322b 0x252 Bin/EndpointStream_XMEGA.o - .debug_abbrev 0x0000347d 0x300 Bin/Endpoint_XMEGA.o - .debug_abbrev 0x0000377d 0x26 Bin/Host_XMEGA.o - .debug_abbrev 0x000037a3 0x26 Bin/PipeStream_XMEGA.o - .debug_abbrev 0x000037c9 0x26 Bin/Pipe_XMEGA.o - .debug_abbrev 0x000037ef 0x306 Bin/USBController_XMEGA.o - .debug_abbrev 0x00003af5 0x266 Bin/USBInterrupt_XMEGA.o - .debug_abbrev 0x00003d5b 0x28b Bin/AudioClassDevice.o - .debug_abbrev 0x00003fe6 0x439 Bin/CDCClassDevice.o - .debug_abbrev 0x0000441f 0x2de Bin/HIDClassDevice.o - .debug_abbrev 0x000046fd 0x338 Bin/MassStorageClassDevice.o - .debug_abbrev 0x00004a35 0x287 Bin/MIDIClassDevice.o - .debug_abbrev 0x00004cbc 0x3e1 Bin/PrinterClassDevice.o - .debug_abbrev 0x0000509d 0x36d Bin/RNDISClassDevice.o - .debug_abbrev 0x0000540a 0x26 Bin/AndroidAccessoryClassHost.o - .debug_abbrev 0x00005430 0x26 Bin/AudioClassHost.o - .debug_abbrev 0x00005456 0x26 Bin/CDCClassHost.o - .debug_abbrev 0x0000547c 0x26 Bin/HIDClassHost.o - .debug_abbrev 0x000054a2 0x26 Bin/MassStorageClassHost.o - .debug_abbrev 0x000054c8 0x26 Bin/MIDIClassHost.o - .debug_abbrev 0x000054ee 0x26 Bin/PrinterClassHost.o - .debug_abbrev 0x00005514 0x26 Bin/RNDISClassHost.o - .debug_abbrev 0x0000553a 0x26 Bin/StillImageClassHost.o - .debug_abbrev 0x00005560 0xd6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_abbrev 0x00005636 0x139 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_abbrev 0x0000576f 0x1d6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_abbrev 0x00005945 0xf1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug_line 0x00000000 0xb5c9 - *(.debug_line) - .debug_line 0x00000000 0x390 Bin/Chameleon-Mini.o - .debug_line 0x00000390 0x30a Bin/LUFADescriptors.o - .debug_line 0x0000069a 0x251 Bin/System.o - .debug_line 0x000008eb 0x39e Bin/Configuration.o - .debug_line 0x00000c89 0x119 Bin/Random.o - .debug_line 0x00000da2 0x219 Bin/Common.o - .debug_line 0x00000fbb 0x9fa Bin/Memory.o - .debug_line 0x000019b5 0x454 Bin/Button.o - .debug_line 0x00001e09 0x2ff Bin/Settings.o - .debug_line 0x00002108 0x8b Bin/LED.o - .debug_line 0x00002193 0x457 Bin/Terminal.o - .debug_line 0x000025ea 0x7ea Bin/Commands.o - .debug_line 0x00002dd4 0x50b Bin/XModem.o - .debug_line 0x000032df 0x3db Bin/CommandLine.o - .debug_line 0x000036ba 0xaf Bin/Codec.o - .debug_line 0x00003769 0x636 Bin/ISO14443-2A.o - .debug_line 0x00003d9f 0x734 Bin/MifareClassic.o - .debug_line 0x000044d3 0x1a8 Bin/ISO14443-3A.o - .debug_line 0x0000467b 0x72c Bin/Crypto1.o - .debug_line 0x00004da7 0x638 Bin/HIDParser.o - .debug_line 0x000053df 0x2c5 Bin/ConfigDescriptors.o - .debug_line 0x000056a4 0x4d2 Bin/DeviceStandardReq.o - .debug_line 0x00005b76 0x4f Bin/Events.o - .debug_line 0x00005bc5 0x1a Bin/HostStandardReq.o - .debug_line 0x00005bdf 0x209 Bin/USBTask.o - .debug_line 0x00005de8 0x185 Bin/Device_XMEGA.o - .debug_line 0x00005f6d 0x1655 Bin/EndpointStream_XMEGA.o - .debug_line 0x000075c2 0x6fd Bin/Endpoint_XMEGA.o - .debug_line 0x00007cbf 0x1a Bin/Host_XMEGA.o - .debug_line 0x00007cd9 0x1a Bin/PipeStream_XMEGA.o - .debug_line 0x00007cf3 0x1a Bin/Pipe_XMEGA.o - .debug_line 0x00007d0d 0x3b1 Bin/USBController_XMEGA.o - .debug_line 0x000080be 0x3b0 Bin/USBInterrupt_XMEGA.o - .debug_line 0x0000846e 0x453 Bin/AudioClassDevice.o - .debug_line 0x000088c1 0x832 Bin/CDCClassDevice.o - .debug_line 0x000090f3 0x598 Bin/HIDClassDevice.o - .debug_line 0x0000968b 0x50f Bin/MassStorageClassDevice.o - .debug_line 0x00009b9a 0x402 Bin/MIDIClassDevice.o - .debug_line 0x00009f9c 0x775 Bin/PrinterClassDevice.o - .debug_line 0x0000a711 0x72a Bin/RNDISClassDevice.o - .debug_line 0x0000ae3b 0x1a Bin/AndroidAccessoryClassHost.o - .debug_line 0x0000ae55 0x1a Bin/AudioClassHost.o - .debug_line 0x0000ae6f 0x1a Bin/CDCClassHost.o - .debug_line 0x0000ae89 0x1a Bin/HIDClassHost.o - .debug_line 0x0000aea3 0x1a Bin/MassStorageClassHost.o - .debug_line 0x0000aebd 0x1a Bin/MIDIClassHost.o - .debug_line 0x0000aed7 0x1a Bin/PrinterClassHost.o - .debug_line 0x0000aef1 0x1a Bin/RNDISClassHost.o - .debug_line 0x0000af0b 0x1a Bin/StillImageClassHost.o - .debug_line 0x0000af25 0xa1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_line 0x0000afc6 0x1a6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_line 0x0000b16c 0x359 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_line 0x0000b4c5 0x104 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug_frame 0x00000000 0x1ed0 - *(.debug_frame) - .debug_frame 0x00000000 0x24 Bin/Chameleon-Mini.o - .debug_frame 0x00000024 0x24 Bin/LUFADescriptors.o - .debug_frame 0x00000048 0x90 Bin/System.o - .debug_frame 0x000000d8 0xf4 Bin/Configuration.o - .debug_frame 0x000001cc 0x64 Bin/Random.o - .debug_frame 0x00000230 0x40 Bin/Common.o - .debug_frame 0x00000270 0x174 Bin/Memory.o - .debug_frame 0x000003e4 0xac Bin/Button.o - .debug_frame 0x00000490 0x98 Bin/Settings.o - .debug_frame 0x00000528 0xcc Bin/Terminal.o - .debug_frame 0x000005f4 0x28c Bin/Commands.o - .debug_frame 0x00000880 0x6c Bin/XModem.o - .debug_frame 0x000008ec 0x54 Bin/CommandLine.o - .debug_frame 0x00000940 0xf8 Bin/ISO14443-2A.o - .debug_frame 0x00000a38 0xe0 Bin/MifareClassic.o - .debug_frame 0x00000b18 0x34 Bin/ISO14443-3A.o - .debug_frame 0x00000b4c 0x13c Bin/Crypto1.o - .debug_frame 0x00000c88 0x11c Bin/HIDParser.o - .debug_frame 0x00000da4 0xd0 Bin/ConfigDescriptors.o - .debug_frame 0x00000e74 0x40 Bin/DeviceStandardReq.o - .debug_frame 0x00000eb4 0x24 Bin/Events.o - .debug_frame 0x00000ed8 0x2c Bin/USBTask.o - .debug_frame 0x00000f04 0x24 Bin/Device_XMEGA.o - .debug_frame 0x00000f28 0x4f8 Bin/EndpointStream_XMEGA.o - .debug_frame 0x00001420 0x160 Bin/Endpoint_XMEGA.o - .debug_frame 0x00001580 0x5c Bin/USBController_XMEGA.o - .debug_frame 0x000015dc 0x8c Bin/USBInterrupt_XMEGA.o - .debug_frame 0x00001668 0xa4 Bin/AudioClassDevice.o - .debug_frame 0x0000170c 0x1e0 Bin/CDCClassDevice.o - .debug_frame 0x000018ec 0xf0 Bin/HIDClassDevice.o - .debug_frame 0x000019dc 0x80 Bin/MassStorageClassDevice.o - .debug_frame 0x00001a5c 0xa4 Bin/MIDIClassDevice.o - .debug_frame 0x00001b00 0x194 Bin/PrinterClassDevice.o - .debug_frame 0x00001c94 0x100 Bin/RNDISClassDevice.o - .debug_frame 0x00001d94 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_frame 0x00001e1c 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_frame 0x00001e4c 0x4c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_frame 0x00001e98 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug_str 0x00000000 0x7842 - *(.debug_str) - .debug_str 0x00000000 0xccd Bin/Chameleon-Mini.o - 0xd92 (size before relaxing) - .debug_str 0x00000ccd 0x8cc Bin/LUFADescriptors.o - 0xb1d (size before relaxing) - .debug_str 0x00001599 0x748 Bin/System.o - 0xb52 (size before relaxing) - .debug_str 0x00001ce1 0x2ff Bin/Configuration.o - 0x56d (size before relaxing) - .debug_str 0x00001fe0 0x27 Bin/Random.o - 0x117 (size before relaxing) - .debug_str 0x00002007 0x56 Bin/Common.o - 0x13a (size before relaxing) - .debug_str 0x0000205d 0x22d Bin/Memory.o - 0x722 (size before relaxing) - .debug_str 0x0000228a 0x1d2 Bin/Button.o - 0x6cc (size before relaxing) - .debug_str 0x0000245c 0xc0 Bin/Settings.o - 0x4d4 (size before relaxing) - .debug_str 0x0000251c 0x6 Bin/LED.o - 0xc8 (size before relaxing) - .debug_str 0x00002522 0x295 Bin/Terminal.o - 0x72c (size before relaxing) - .debug_str 0x000027b7 0x3f0 Bin/Commands.o - 0xcd2 (size before relaxing) - .debug_str 0x00002ba7 0x149 Bin/XModem.o - 0x533 (size before relaxing) - .debug_str 0x00002cf0 0xc1 Bin/CommandLine.o - 0x510 (size before relaxing) - .debug_str 0x00002db1 0x1a Bin/Codec.o - 0x238 (size before relaxing) - .debug_str 0x00002dcb 0x12b9 Bin/ISO14443-2A.o - 0x1a20 (size before relaxing) - .debug_str 0x00004084 0x2b0 Bin/MifareClassic.o - 0x545 (size before relaxing) - .debug_str 0x00004334 0x1a Bin/ISO14443-3A.o - 0x131 (size before relaxing) - .debug_str 0x0000434e 0x95 Bin/Crypto1.o - 0x1bf (size before relaxing) - .debug_str 0x000043e3 0x492 Bin/HIDParser.o - 0x5f3 (size before relaxing) - .debug_str 0x00004875 0x22e Bin/ConfigDescriptors.o - 0x431 (size before relaxing) - .debug_str 0x00004aa3 0xa04 Bin/DeviceStandardReq.o - 0x112f (size before relaxing) - .debug_str 0x000054a7 0x31 Bin/Events.o - 0xde (size before relaxing) - .debug_str 0x000054d8 0x2b Bin/HostStandardReq.o - 0xd8 (size before relaxing) - .debug_str 0x00005503 0x6d Bin/USBTask.o - 0x3aa (size before relaxing) - .debug_str 0x00005570 0x4a Bin/Device_XMEGA.o - 0x51e (size before relaxing) - .debug_str 0x000055ba 0x4d9 Bin/EndpointStream_XMEGA.o - 0x8c2 (size before relaxing) - .debug_str 0x00005a93 0x2aa Bin/Endpoint_XMEGA.o - 0xa30 (size before relaxing) - .debug_str 0x00005d3d 0x2c Bin/Host_XMEGA.o - 0xd9 (size before relaxing) - .debug_str 0x00005d69 0x32 Bin/PipeStream_XMEGA.o - 0xdf (size before relaxing) - .debug_str 0x00005d9b 0x2c Bin/Pipe_XMEGA.o - 0xd9 (size before relaxing) - .debug_str 0x00005dc7 0x1bb Bin/USBController_XMEGA.o - 0xdc0 (size before relaxing) - .debug_str 0x00005f82 0xaa Bin/USBInterrupt_XMEGA.o - 0x891 (size before relaxing) - .debug_str 0x0000602c 0x280 Bin/AudioClassDevice.o - 0x705 (size before relaxing) - .debug_str 0x000062ac 0x286 Bin/CDCClassDevice.o - 0xa5a (size before relaxing) - .debug_str 0x00006532 0x248 Bin/HIDClassDevice.o - 0xa75 (size before relaxing) - .debug_str 0x0000677a 0x261 Bin/MassStorageClassDevice.o - 0x858 (size before relaxing) - .debug_str 0x000069db 0x115 Bin/MIDIClassDevice.o - 0x6af (size before relaxing) - .debug_str 0x00006af0 0x269 Bin/PrinterClassDevice.o - 0x983 (size before relaxing) - .debug_str 0x00006d59 0x6e5 Bin/RNDISClassDevice.o - 0xdb8 (size before relaxing) - .debug_str 0x0000743e 0x3b Bin/AndroidAccessoryClassHost.o - 0xe8 (size before relaxing) - .debug_str 0x00007479 0x30 Bin/AudioClassHost.o - 0xdd (size before relaxing) - .debug_str 0x000074a9 0x2e Bin/CDCClassHost.o - 0xdb (size before relaxing) - .debug_str 0x000074d7 0x2e Bin/HIDClassHost.o - 0xdb (size before relaxing) - .debug_str 0x00007505 0x36 Bin/MassStorageClassHost.o - 0xe3 (size before relaxing) - .debug_str 0x0000753b 0x2f Bin/MIDIClassHost.o - 0xdc (size before relaxing) - .debug_str 0x0000756a 0x32 Bin/PrinterClassHost.o - 0xdf (size before relaxing) - .debug_str 0x0000759c 0x30 Bin/RNDISClassHost.o - 0xdd (size before relaxing) - .debug_str 0x000075cc 0x35 Bin/StillImageClassHost.o - 0xe2 (size before relaxing) - .debug_str 0x00007601 0x81 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0xba (size before relaxing) - .debug_str 0x00007682 0x91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x149 (size before relaxing) - .debug_str 0x00007713 0xcd c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x1ad (size before relaxing) - .debug_str 0x000077e0 0x62 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0x10d (size before relaxing) - -.debug_loc 0x00000000 0xd068 - *(.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 0xba4 Bin/Memory.o - .debug_loc 0x000015dc 0x740 Bin/Button.o - .debug_loc 0x00001d1c 0x1cf Bin/Settings.o - .debug_loc 0x00001eeb 0x1f9 Bin/Terminal.o - .debug_loc 0x000020e4 0x9b7 Bin/Commands.o - .debug_loc 0x00002a9b 0x313 Bin/XModem.o - .debug_loc 0x00002dae 0x6be Bin/CommandLine.o - .debug_loc 0x0000346c 0x4a5 Bin/ISO14443-2A.o - .debug_loc 0x00003911 0xb6a Bin/MifareClassic.o - .debug_loc 0x0000447b 0x231 Bin/ISO14443-3A.o - .debug_loc 0x000046ac 0xa3a Bin/Crypto1.o - .debug_loc 0x000050e6 0xc34 Bin/HIDParser.o - .debug_loc 0x00005d1a 0x536 Bin/ConfigDescriptors.o - .debug_loc 0x00006250 0x2d9 Bin/DeviceStandardReq.o - .debug_loc 0x00006529 0x22 Bin/USBTask.o - .debug_loc 0x0000654b 0x2bf0 Bin/EndpointStream_XMEGA.o - .debug_loc 0x0000913b 0x581 Bin/Endpoint_XMEGA.o - .debug_loc 0x000096bc 0xa3 Bin/USBController_XMEGA.o - .debug_loc 0x0000975f 0x200 Bin/USBInterrupt_XMEGA.o - .debug_loc 0x0000995f 0x3ad Bin/AudioClassDevice.o - .debug_loc 0x00009d0c 0x9f6 Bin/CDCClassDevice.o - .debug_loc 0x0000a702 0x473 Bin/HIDClassDevice.o - .debug_loc 0x0000ab75 0x303 Bin/MassStorageClassDevice.o - .debug_loc 0x0000ae78 0x35f Bin/MIDIClassDevice.o - .debug_loc 0x0000b1d7 0x8b8 Bin/PrinterClassDevice.o - .debug_loc 0x0000ba8f 0xd6d Bin/RNDISClassDevice.o - .debug_loc 0x0000c7fc 0x1e8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_loc 0x0000c9e4 0x74 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_loc 0x0000ca58 0x51d c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_loc 0x0000cf75 0xf3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug_macinfo - *(.debug_macinfo) - -.debug_pubtypes - *(.debug_pubtypes) - -.debug_ranges 0x00000000 0x1ae0 - *(.debug_ranges) - .debug_ranges 0x00000000 0x28 Bin/Chameleon-Mini.o - .debug_ranges 0x00000028 0x10 Bin/LUFADescriptors.o - .debug_ranges 0x00000038 0x40 Bin/System.o - .debug_ranges 0x00000078 0xb0 Bin/Configuration.o - .debug_ranges 0x00000128 0x28 Bin/Random.o - .debug_ranges 0x00000150 0x48 Bin/Common.o - .debug_ranges 0x00000198 0x378 Bin/Memory.o - .debug_ranges 0x00000510 0xf8 Bin/Button.o - .debug_ranges 0x00000608 0x58 Bin/Settings.o - .debug_ranges 0x00000660 0xd0 Bin/Terminal.o - .debug_ranges 0x00000730 0x118 Bin/Commands.o - .debug_ranges 0x00000848 0x48 Bin/XModem.o - .debug_ranges 0x00000890 0x100 Bin/CommandLine.o - .debug_ranges 0x00000990 0xc0 Bin/ISO14443-2A.o - .debug_ranges 0x00000a50 0x1c8 Bin/MifareClassic.o - .debug_ranges 0x00000c18 0x18 Bin/ISO14443-3A.o - .debug_ranges 0x00000c30 0x70 Bin/Crypto1.o - .debug_ranges 0x00000ca0 0x150 Bin/HIDParser.o - .debug_ranges 0x00000df0 0x40 Bin/ConfigDescriptors.o - .debug_ranges 0x00000e30 0x138 Bin/DeviceStandardReq.o - .debug_ranges 0x00000f68 0x10 Bin/Events.o - .debug_ranges 0x00000f78 0x60 Bin/USBTask.o - .debug_ranges 0x00000fd8 0x10 Bin/Device_XMEGA.o - .debug_ranges 0x00000fe8 0x4a8 Bin/EndpointStream_XMEGA.o - .debug_ranges 0x00001490 0x188 Bin/Endpoint_XMEGA.o - .debug_ranges 0x00001618 0x20 Bin/USBController_XMEGA.o - .debug_ranges 0x00001638 0x20 Bin/USBInterrupt_XMEGA.o - .debug_ranges 0x00001658 0x38 Bin/AudioClassDevice.o - .debug_ranges 0x00001690 0x100 Bin/CDCClassDevice.o - .debug_ranges 0x00001790 0x20 Bin/HIDClassDevice.o - .debug_ranges 0x000017b0 0xa0 Bin/MassStorageClassDevice.o - .debug_ranges 0x00001850 0x48 Bin/MIDIClassDevice.o - .debug_ranges 0x00001898 0x128 Bin/PrinterClassDevice.o - .debug_ranges 0x000019c0 0xc8 Bin/RNDISClassDevice.o - .debug_ranges 0x00001a88 0x28 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - .debug_ranges 0x00001ab0 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - .debug_ranges 0x00001ac0 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - .debug_ranges 0x00001ad0 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - -.debug_macro - *(.debug_macro) -OUTPUT(Chameleon-Mini.elf elf32-avr) -LOAD linker stubs - -Cross Reference Table - -Symbol File -ActiveConfiguration Bin/MifareClassic.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 -Audio_Device_ProcessControlRequest Bin/AudioClassDevice.o -BufferToHexString Bin/Common.o - Bin/Commands.o -ButtonGetActionByName Bin/Button.o - Bin/Commands.o -ButtonGetActionList Bin/Button.o - Bin/Commands.o -ButtonInit Bin/Button.o - Bin/Chameleon-Mini.o -ButtonSetActionById Bin/Button.o -ButtonSetActionByName Bin/Button.o - Bin/Commands.o -ButtonTick Bin/Button.o - Bin/Chameleon-Mini.o -CALLBACK_Audio_Device_GetSetEndpointProperty Bin/AudioClassDevice.o -CALLBACK_Audio_Device_GetSetInterfaceProperty Bin/AudioClassDevice.o -CALLBACK_HIDParser_FilterHIDReportItem Bin/HIDParser.o -CALLBACK_HID_Device_CreateHIDReport Bin/HIDClassDevice.o -CALLBACK_HID_Device_ProcessHIDReport Bin/HIDClassDevice.o -CALLBACK_MS_Device_SCSICommandReceived Bin/MassStorageClassDevice.o -CALLBACK_USB_GetDescriptor Bin/LUFADescriptors.o - Bin/DeviceStandardReq.o -CDC_Device_BytesReceived Bin/CDCClassDevice.o -CDC_Device_ConfigureEndpoints Bin/CDCClassDevice.o - Bin/Terminal.o -CDC_Device_CreateBlockingStream Bin/CDCClassDevice.o -CDC_Device_CreateStream Bin/CDCClassDevice.o -CDC_Device_Event_Stub Bin/CDCClassDevice.o -CDC_Device_Flush Bin/CDCClassDevice.o -CDC_Device_ProcessControlRequest Bin/CDCClassDevice.o - Bin/Terminal.o -CDC_Device_ReceiveByte Bin/CDCClassDevice.o - Bin/Terminal.o -CDC_Device_SendByte Bin/CDCClassDevice.o - Bin/XModem.o - Bin/Terminal.o -CDC_Device_SendControlLineStateChange Bin/CDCClassDevice.o -CDC_Device_SendData Bin/CDCClassDevice.o - Bin/Terminal.o -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 -CommandExecButton Bin/Commands.o - Bin/CommandLine.o -CommandExecClear Bin/Commands.o - Bin/CommandLine.o -CommandExecConfig Bin/Commands.o - Bin/CommandLine.o -CommandExecDownload Bin/Commands.o - Bin/CommandLine.o -CommandExecHelp Bin/Commands.o - Bin/CommandLine.o -CommandExecReset Bin/Commands.o - Bin/CommandLine.o -CommandExecUpgrade Bin/Commands.o - Bin/CommandLine.o -CommandExecUpload Bin/Commands.o - Bin/CommandLine.o -CommandGetButton Bin/Commands.o - Bin/CommandLine.o -CommandGetConfig Bin/Commands.o - Bin/CommandLine.o -CommandGetMemSize Bin/Commands.o - Bin/CommandLine.o -CommandGetReadOnly Bin/Commands.o - Bin/CommandLine.o -CommandGetRssi Bin/Commands.o - Bin/CommandLine.o -CommandGetSetting Bin/Commands.o - Bin/CommandLine.o -CommandGetUid Bin/Commands.o - Bin/CommandLine.o -CommandGetUidSize Bin/Commands.o - Bin/CommandLine.o -CommandGetVersion Bin/Commands.o - Bin/CommandLine.o -CommandLineInit Bin/CommandLine.o -CommandLineProcessByte Bin/CommandLine.o - Bin/Terminal.o -CommandLineTick Bin/CommandLine.o - Bin/Terminal.o -CommandSetButton Bin/Commands.o - Bin/CommandLine.o -CommandSetConfig Bin/Commands.o - Bin/CommandLine.o -CommandSetReadOnly Bin/Commands.o - Bin/CommandLine.o -CommandSetSetting Bin/Commands.o - Bin/CommandLine.o -CommandSetUid Bin/Commands.o - Bin/CommandLine.o -CommandTable Bin/CommandLine.o - Bin/Commands.o -ConfigurationDescriptor Bin/LUFADescriptors.o -ConfigurationGetList Bin/Configuration.o - Bin/Commands.o -ConfigurationInit Bin/Configuration.o - Bin/Settings.o - Bin/Chameleon-Mini.o -ConfigurationSetById Bin/Configuration.o -ConfigurationSetByName Bin/Configuration.o - Bin/Commands.o -Crypto1Auth Bin/Crypto1.o - Bin/MifareClassic.o -Crypto1Byte Bin/Crypto1.o - Bin/MifareClassic.o -Crypto1FilterOutput Bin/Crypto1.o - Bin/MifareClassic.o -Crypto1Nibble Bin/Crypto1.o - Bin/MifareClassic.o -Crypto1PRNG Bin/Crypto1.o - Bin/MifareClassic.o -Crypto1Setup Bin/Crypto1.o - Bin/MifareClassic.o -DeviceDescriptor Bin/LUFADescriptors.o -EVENT_Audio_Device_StreamStartStop Bin/AudioClassDevice.o -EVENT_CDC_Device_BreakSent Bin/CDCClassDevice.o -EVENT_CDC_Device_ControLineStateChanged Bin/CDCClassDevice.o -EVENT_CDC_Device_LineEncodingChanged Bin/CDCClassDevice.o -EVENT_PRNT_Device_SoftReset Bin/PrinterClassDevice.o -EVENT_USB_Device_ConfigurationChanged Bin/Terminal.o - Bin/DeviceStandardReq.o -EVENT_USB_Device_Connect Bin/Terminal.o - Bin/USBInterrupt_XMEGA.o -EVENT_USB_Device_ControlRequest Bin/Terminal.o - Bin/DeviceStandardReq.o -EVENT_USB_Device_Disconnect Bin/Terminal.o - Bin/USBInterrupt_XMEGA.o -EVENT_USB_Device_Reset Bin/Events.o - Bin/USBInterrupt_XMEGA.o -EVENT_USB_Device_StartOfFrame Bin/Events.o - Bin/USBInterrupt_XMEGA.o -EVENT_USB_Device_Suspend Bin/Events.o -EVENT_USB_Device_WakeUp Bin/Events.o -Endpoint_ClearEndpoints Bin/Endpoint_XMEGA.o - Bin/USBInterrupt_XMEGA.o -Endpoint_ClearIN Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/DeviceStandardReq.o -Endpoint_ClearOUT Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/DeviceStandardReq.o -Endpoint_ClearSETUP Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/DeviceStandardReq.o -Endpoint_ClearStatusStage Bin/Endpoint_XMEGA.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/DeviceStandardReq.o -Endpoint_ConfigureEndpointTable Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o -Endpoint_ConfigureEndpoint_PRV Bin/Endpoint_XMEGA.o - Bin/USBInterrupt_XMEGA.o - Bin/USBController_XMEGA.o -Endpoint_Discard_Stream Bin/EndpointStream_XMEGA.o -Endpoint_IsINReady Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/DeviceStandardReq.o -Endpoint_IsOUTReceived Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o -Endpoint_IsSETUPReceived Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/USBTask.o - Bin/DeviceStandardReq.o -Endpoint_Null_Stream Bin/EndpointStream_XMEGA.o -Endpoint_Read_8 Bin/Endpoint_XMEGA.o - Bin/PrinterClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/DeviceStandardReq.o -Endpoint_Read_Control_EStream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Read_Control_EStream_LE Bin/EndpointStream_XMEGA.o -Endpoint_Read_Control_Stream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Read_Control_Stream_LE Bin/EndpointStream_XMEGA.o - Bin/RNDISClassDevice.o - Bin/HIDClassDevice.o - Bin/AudioClassDevice.o -Endpoint_Read_EStream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Read_EStream_LE Bin/EndpointStream_XMEGA.o -Endpoint_Read_Stream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Read_Stream_LE Bin/EndpointStream_XMEGA.o - Bin/RNDISClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o -Endpoint_SelectEndpoint Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/USBTask.o - Bin/DeviceStandardReq.o -Endpoint_StallTransaction Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/MassStorageClassDevice.o - Bin/DeviceStandardReq.o -Endpoint_WaitUntilReady Bin/Endpoint_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o -Endpoint_Write_8 Bin/Endpoint_XMEGA.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/DeviceStandardReq.o -Endpoint_Write_Control_EStream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Write_Control_EStream_LE Bin/EndpointStream_XMEGA.o -Endpoint_Write_Control_PStream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Write_Control_PStream_LE Bin/EndpointStream_XMEGA.o - Bin/DeviceStandardReq.o -Endpoint_Write_Control_Stream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Write_Control_Stream_LE Bin/EndpointStream_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/HIDClassDevice.o - Bin/AudioClassDevice.o - Bin/DeviceStandardReq.o -Endpoint_Write_EStream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Write_EStream_LE Bin/EndpointStream_XMEGA.o -Endpoint_Write_PStream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Write_PStream_LE Bin/EndpointStream_XMEGA.o -Endpoint_Write_Stream_BE Bin/EndpointStream_XMEGA.o -Endpoint_Write_Stream_LE Bin/EndpointStream_XMEGA.o - Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o -GlobalSettings Bin/Settings.o - Bin/Button.o - Bin/Memory.o - Bin/Configuration.o -HID_Device_ConfigureEndpoints Bin/HIDClassDevice.o -HID_Device_ProcessControlRequest Bin/HIDClassDevice.o -HID_Device_USBTask Bin/HIDClassDevice.o -HexStringToBuffer Bin/Common.o - Bin/Commands.o -ISO14443AAppendCRCA Bin/ISO14443-3A.o - Bin/MifareClassic.o -ISO14443ACheckCRCA Bin/ISO14443-3A.o - Bin/MifareClassic.o -ISO14443ACodecInit Bin/ISO14443-2A.o - Bin/Configuration.o -ISO14443ACodecTask Bin/ISO14443-2A.o - Bin/Configuration.o -LEDPulseMask Bin/LED.o - Bin/Terminal.o - Bin/Chameleon-Mini.o -LanguageString Bin/LUFADescriptors.o -MIDI_Device_ConfigureEndpoints Bin/MIDIClassDevice.o -MIDI_Device_Flush Bin/MIDIClassDevice.o -MIDI_Device_ReceiveEventPacket Bin/MIDIClassDevice.o -MIDI_Device_SendEventPacket Bin/MIDIClassDevice.o -MIDI_Device_USBTask Bin/MIDIClassDevice.o -MS_Device_ConfigureEndpoints Bin/MassStorageClassDevice.o -MS_Device_ProcessControlRequest Bin/MassStorageClassDevice.o -MS_Device_USBTask Bin/MassStorageClassDevice.o -ManufacturerString Bin/LUFADescriptors.o -MemoryClear Bin/Memory.o - Bin/Commands.o -MemoryDownloadBlock Bin/Memory.o - Bin/Commands.o -MemoryInit Bin/Memory.o - Bin/Chameleon-Mini.o -MemoryReadBlock Bin/Memory.o - Bin/MifareClassic.o -MemoryRecall Bin/Memory.o - Bin/Settings.o - Bin/Button.o -MemoryStore Bin/Memory.o - Bin/Settings.o - Bin/Button.o -MemoryUploadBlock Bin/Memory.o - Bin/Commands.o -MemoryWriteBlock Bin/Memory.o - Bin/MifareClassic.o -MifareClassicAppInit1K Bin/MifareClassic.o - Bin/Configuration.o -MifareClassicAppInit4K Bin/MifareClassic.o - Bin/Configuration.o -MifareClassicAppProcess Bin/MifareClassic.o - Bin/Configuration.o -MifareClassicAppReset Bin/MifareClassic.o - Bin/Configuration.o -MifareClassicAppTask Bin/MifareClassic.o - Bin/Configuration.o -MifareClassicGetUid Bin/MifareClassic.o - Bin/Configuration.o -MifareClassicSetUid Bin/MifareClassic.o - Bin/Configuration.o -PRNT_Device_BytesReceived Bin/PrinterClassDevice.o -PRNT_Device_ConfigureEndpoints Bin/PrinterClassDevice.o -PRNT_Device_CreateBlockingStream Bin/PrinterClassDevice.o -PRNT_Device_CreateStream Bin/PrinterClassDevice.o -PRNT_Device_Event_Stub Bin/PrinterClassDevice.o -PRNT_Device_Flush Bin/PrinterClassDevice.o -PRNT_Device_ProcessControlRequest Bin/PrinterClassDevice.o -PRNT_Device_ReceiveByte Bin/PrinterClassDevice.o -PRNT_Device_SendByte Bin/PrinterClassDevice.o -PRNT_Device_SendData Bin/PrinterClassDevice.o -PRNT_Device_SendString Bin/PrinterClassDevice.o -PRNT_Device_USBTask Bin/PrinterClassDevice.o -ProductString Bin/LUFADescriptors.o -RNDIS_Device_ConfigureEndpoints Bin/RNDISClassDevice.o -RNDIS_Device_IsPacketReceived Bin/RNDISClassDevice.o -RNDIS_Device_ProcessControlRequest Bin/RNDISClassDevice.o -RNDIS_Device_ReadPacket Bin/RNDISClassDevice.o -RNDIS_Device_SendPacket Bin/RNDISClassDevice.o -RNDIS_Device_USBTask Bin/RNDISClassDevice.o -RandomGetBuffer Bin/Random.o - Bin/MifareClassic.o -RandomGetByte Bin/Random.o - Bin/Commands.o - Bin/Button.o -RandomInit Bin/Random.o - Bin/Chameleon-Mini.o -RandomTick Bin/Random.o - Bin/Chameleon-Mini.o -SettingsCycle Bin/Settings.o - Bin/Button.o -SettingsGetActiveById Bin/Settings.o -SettingsGetActiveByName Bin/Settings.o - Bin/Commands.o -SettingsLoad Bin/Settings.o - Bin/Chameleon-Mini.o -SettingsSave Bin/Settings.o - Bin/Commands.o -SettingsSetActiveById Bin/Settings.o -SettingsSetActiveByName Bin/Settings.o - Bin/Commands.o -StoredSettings Bin/Settings.o -SystemEnterBootloader Bin/System.o - Bin/Commands.o -SystemInit Bin/System.o - Bin/Chameleon-Mini.o -SystemInterruptInit Bin/System.o - Bin/Chameleon-Mini.o -SystemReset Bin/System.o - Bin/Commands.o -SystemStartUSBClock Bin/System.o - Bin/Terminal.o -SystemStopUSBClock Bin/System.o - Bin/Terminal.o -TerminalBuffer Bin/CommandLine.o - Bin/XModem.o - Bin/Terminal.o -TerminalHandle Bin/Terminal.o - Bin/XModem.o -TerminalInit Bin/Terminal.o - Bin/Chameleon-Mini.o -TerminalSendBlock Bin/Terminal.o - Bin/XModem.o -TerminalSendString Bin/Terminal.o - Bin/CommandLine.o -TerminalSendStringP Bin/Terminal.o - Bin/CommandLine.o -TerminalState Bin/Terminal.o -TerminalTask Bin/Terminal.o - Bin/Chameleon-Mini.o -TerminalTick Bin/Terminal.o - Bin/Chameleon-Mini.o -USB_ControlRequest Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/AudioClassDevice.o - Bin/Endpoint_XMEGA.o - Bin/EndpointStream_XMEGA.o - Bin/USBTask.o - Bin/DeviceStandardReq.o -USB_DeviceState Bin/RNDISClassDevice.o - Bin/PrinterClassDevice.o - Bin/MIDIClassDevice.o - Bin/MassStorageClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/USBInterrupt_XMEGA.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 - 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_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 - Bin/MassStorageClassDevice.o - Bin/Endpoint_XMEGA.o - Bin/DeviceStandardReq.o -USB_Endpoint_SelectedEndpoint 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 - Bin/MIDIClassDevice.o - Bin/HIDClassDevice.o - Bin/CDCClassDevice.o - Bin/Endpoint_XMEGA.o - Bin/EndpointStream_XMEGA.o -USB_Endpoint_SelectedHandle Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/Endpoint_XMEGA.o - Bin/DeviceStandardReq.o -USB_Event_Stub Bin/Events.o -USB_GetHIDReportItemInfo Bin/HIDParser.o -USB_GetHIDReportSize Bin/HIDParser.o -USB_GetNextDescriptorComp Bin/ConfigDescriptors.o -USB_GetNextDescriptorOfType Bin/ConfigDescriptors.o -USB_GetNextDescriptorOfTypeAfter Bin/ConfigDescriptors.o -USB_GetNextDescriptorOfTypeBefore Bin/ConfigDescriptors.o -USB_INT_ClearAllInterrupts Bin/USBInterrupt_XMEGA.o - Bin/USBController_XMEGA.o -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_ProcessHIDReport Bin/HIDParser.o -USB_ResetInterface Bin/USBController_XMEGA.o -USB_SetHIDReportItemInfo Bin/HIDParser.o -USB_USBTask Bin/USBTask.o - Bin/PrinterClassDevice.o - Bin/MassStorageClassDevice.o - Bin/CDCClassDevice.o - Bin/EndpointStream_XMEGA.o - Bin/Terminal.o -XModemProcessByte Bin/XModem.o - Bin/Terminal.o -XModemReceive Bin/XModem.o - Bin/Commands.o -XModemSend Bin/XModem.o - Bin/Commands.o -XModemTick Bin/XModem.o - Bin/Terminal.o -__bad_interrupt c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__bss_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) -__bss_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) -__data_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) -__data_load_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) -__data_start c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) -__divmodsi4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -__do_clear_bss c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_clear_bss.o) - Bin/USBController_XMEGA.o - Bin/Endpoint_XMEGA.o - Bin/USBTask.o - Bin/DeviceStandardReq.o - Bin/Crypto1.o - Bin/MifareClassic.o - Bin/ISO14443-2A.o - Bin/Codec.o - Bin/CommandLine.o - Bin/XModem.o - Bin/Terminal.o - Bin/LED.o - Bin/Settings.o - Bin/Button.o - Bin/Memory.o - Bin/Configuration.o -__do_copy_data c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_copy_data.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - Bin/RNDISClassDevice.o - Bin/CDCClassDevice.o - Bin/Crypto1.o - Bin/Commands.o - Bin/Terminal.o -__eerd_block_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - Bin/Settings.o -__eerd_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - Bin/EndpointStream_XMEGA.o -__eeupd_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) - Bin/EndpointStream_XMEGA.o -__eeupd_r18_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -__eewr_block_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - Bin/Settings.o -__eewr_byte_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) -__eewr_r18_x32a4u c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -__epilogue_restores__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_epilogue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) -__heap_end c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__init c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__mulohisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -__mulshisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) - Bin/Commands.o -__muluhisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_mulshisi3.o) -__prologue_saves__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_prologue.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) -__stack c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__tablejump2__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) - Bin/HIDParser.o -__tablejump__ c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_tablejump.o) -__udivmodsi4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_udivmodsi4.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_divmodsi4.o) -__ultoa_invert c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -__umulhisi3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_umulhisi3.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_muluhisi3.o) -__vector_1 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_100 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_101 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_102 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_103 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_104 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_105 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_106 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_107 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_108 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_109 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_11 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_110 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_111 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_112 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_113 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_114 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_115 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_116 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_117 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_118 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_119 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_120 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_121 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_122 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_123 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_124 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_125 Bin/USBInterrupt_XMEGA.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_126 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_13 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_14 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_15 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_17 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_18 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_19 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_20 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_21 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_22 Bin/ISO14443-2A.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_23 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_24 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_25 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_26 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_27 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_28 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_29 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_3 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_31 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_33 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_34 Bin/ISO14443-2A.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_35 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_37 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_39 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_40 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_41 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_42 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_43 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_45 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_47 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_48 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_49 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_5 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_50 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_51 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_52 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_53 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_54 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_55 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_56 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_57 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_59 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_60 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_61 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_62 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_63 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_64 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_65 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_66 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_67 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_68 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_69 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_7 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_70 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_71 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_72 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_73 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_74 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_75 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_76 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_77 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_78 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_79 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_8 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_80 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_81 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_82 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_83 Bin/ISO14443-2A.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_84 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_85 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_86 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_87 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_89 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_9 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_90 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_91 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_92 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_93 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_94 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_95 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_96 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_97 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_98 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_99 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vector_default Bin/System.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -__vectors c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -_exit c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) -eeprom_mapen c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_byte_atxmega32a4u.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eeupd_byte_atxmega32a4u.o) -exit c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/avrxmega2\libgcc.a(_exit.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -fputc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -main Bin/Chameleon-Mini.o - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2/crtx32a4u.o -memcmp c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcmp.o) - Bin/HIDClassDevice.o -memcpy c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - Bin/RNDISClassDevice.o - Bin/HIDClassDevice.o -memcpy_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - Bin/RNDISClassDevice.o - Bin/Configuration.o -memset c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(memset.o) - Bin/HIDClassDevice.o -rand c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - Bin/Random.o -rand_r c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -snprintf_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - Bin/Commands.o -srand c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) -strcmp_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - Bin/CommandLine.o - Bin/Commands.o - Bin/Button.o -strncpy_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - Bin/Button.o -strnlen c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -strnlen_P c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) -vfprintf c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.7.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) +Archive member included because of file (symbol) + +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + Bin/XModem.o (__tablejump2__) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + Bin/Terminal.o (__do_copy_data) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + Bin/Configuration.o (__do_clear_bss) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + Bin/Commands.o (__mulshisi3) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) (__muluhisi3) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) (__umulhisi3) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + Bin/Random.o (rand) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy_P.o) + Bin/Configuration.o (memcpy_P) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strcmp_P.o) + Bin/Button.o (strcmp_P) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strncpy_P.o) + Bin/Button.o (strncpy_P) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcmp.o) + Bin/HIDClassDevice.o (memcmp) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy.o) + Bin/HIDClassDevice.o (memcpy) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memset.o) + Bin/HIDClassDevice.o (memset) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + Bin/Commands.o (snprintf_P) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) (vfprintf) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + Bin/Settings.o (__eerd_block_x32a4u) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + Bin/EndpointStream_XMEGA.o (__eerd_byte_x32a4u) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) + Bin/EndpointStream_XMEGA.o (__eeupd_byte_x32a4u) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + Bin/Settings.o (__eewr_block_x32a4u) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) (__eewr_r18_x32a4u) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen_P.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) (strnlen_P) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) (strnlen) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) (fputc) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(ultoa_invert.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) (__ultoa_invert) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) (__divmodsi4) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) (__negsi2) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) (__prologue_saves__) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) (__epilogue_restores__) +/home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) (__udivmodsi4) + +Allocating common symbols +Common symbol size file + +USB_IsInitialized 0x1 Bin/USBTask.o +USB_EndpointTable 0x63 Bin/USBController_XMEGA.o +TerminalBuffer 0x100 Bin/Terminal.o +USB_Endpoint_SelectedFIFO + 0x2 Bin/Endpoint_XMEGA.o +ActiveConfiguration + 0x25 Bin/Configuration.o +USB_DeviceState 0x1 Bin/USBTask.o +USB_Device_ConfigurationNumber + 0x1 Bin/DeviceStandardReq.o +USB_Endpoint_SelectedHandle + 0x2 Bin/Endpoint_XMEGA.o +USB_Device_CurrentlySelfPowered + 0x1 Bin/DeviceStandardReq.o +CodecBuffer 0x100 Bin/Codec.o +GlobalSettings 0x13 Bin/Settings.o +USB_Endpoint_SelectedEndpoint + 0x1 Bin/Endpoint_XMEGA.o +USB_ControlRequest 0x8 Bin/USBTask.o +USB_Endpoint_FIFOs 0x318 Bin/Endpoint_XMEGA.o +USB_Device_RemoteWakeupEnabled + 0x1 Bin/DeviceStandardReq.o + +Discarded input sections + + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + .text 0x00000000 0x0 Bin/Chameleon-Mini.o + .bss 0x00000000 0x0 Bin/Chameleon-Mini.o + .text 0x00000000 0x0 Bin/LUFADescriptors.o + .bss 0x00000000 0x0 Bin/LUFADescriptors.o + .text 0x00000000 0x0 Bin/System.o + .bss 0x00000000 0x0 Bin/System.o + .text 0x00000000 0x0 Bin/Configuration.o + .bss 0x00000000 0x0 Bin/Configuration.o + .text 0x00000000 0x0 Bin/Random.o + .bss 0x00000000 0x0 Bin/Random.o + .text 0x00000000 0x0 Bin/Common.o + .bss 0x00000000 0x0 Bin/Common.o + .text 0x00000000 0x0 Bin/Memory.o + .text 0x00000000 0x0 Bin/Button.o + .text.ButtonSetActionById + 0x00000000 0xc Bin/Button.o + .text 0x00000000 0x0 Bin/Settings.o + .bss 0x00000000 0x0 Bin/Settings.o + .text.SettingsGetActiveById + 0x00000000 0x6 Bin/Settings.o + .text 0x00000000 0x0 Bin/LED.o + .text 0x00000000 0x0 Bin/Terminal.o + .text 0x00000000 0x0 Bin/Commands.o + .bss 0x00000000 0x0 Bin/Commands.o + .text 0x00000000 0x0 Bin/XModem.o + .text 0x00000000 0x0 Bin/CommandLine.o + .text.CommandLineInit + 0x00000000 0xa Bin/CommandLine.o + .text 0x00000000 0x0 Bin/Codec.o + .bss 0x00000000 0x0 Bin/Codec.o + .text 0x00000000 0x0 Bin/ISO14443-2A.o + .text 0x00000000 0x0 Bin/MifareClassic.o + .text 0x00000000 0x0 Bin/ISO14443-3A.o + .bss 0x00000000 0x0 Bin/ISO14443-3A.o + .text 0x00000000 0x0 Bin/Crypto1.o + .text 0x00000000 0x0 Bin/HIDParser.o + .bss 0x00000000 0x0 Bin/HIDParser.o + .text.USB_ProcessHIDReport + 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 0x110 Bin/HIDParser.o + .text.USB_GetHIDReportSize + 0x00000000 0x11c Bin/HIDParser.o + .text 0x00000000 0x0 Bin/ConfigDescriptors.o + .bss 0x00000000 0x0 Bin/ConfigDescriptors.o + .text.USB_GetNextDescriptorOfType + 0x00000000 0x52 Bin/ConfigDescriptors.o + .text.USB_GetNextDescriptorOfTypeBefore + 0x00000000 0x7c Bin/ConfigDescriptors.o + .text.USB_GetNextDescriptorOfTypeAfter + 0x00000000 0x3e Bin/ConfigDescriptors.o + .text.USB_GetNextDescriptorComp + 0x00000000 0x8e Bin/ConfigDescriptors.o + .text 0x00000000 0x0 Bin/DeviceStandardReq.o + .bss 0x00000000 0x0 Bin/DeviceStandardReq.o + .text 0x00000000 0x0 Bin/Events.o + .bss 0x00000000 0x0 Bin/Events.o + .text 0x00000000 0x0 Bin/HostStandardReq.o + .bss 0x00000000 0x0 Bin/HostStandardReq.o + .text 0x00000000 0x0 Bin/USBTask.o + .bss 0x00000000 0x0 Bin/USBTask.o + .text 0x00000000 0x0 Bin/Device_XMEGA.o + .bss 0x00000000 0x0 Bin/Device_XMEGA.o + .text.USB_Device_SendRemoteWakeup + 0x00000000 0xc Bin/Device_XMEGA.o + .text 0x00000000 0x0 Bin/EndpointStream_XMEGA.o + .bss 0x00000000 0x0 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Discard_Stream + 0x00000000 0xc8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Null_Stream + 0x00000000 0xc2 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_Stream_BE + 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Stream_LE + 0x00000000 0xd8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Stream_BE + 0x00000000 0xe8 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_PStream_LE + 0x00000000 0xe0 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_PStream_BE + 0x00000000 0xea Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_EStream_LE + 0x00000000 0xe0 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_EStream_BE + 0x00000000 0xea Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_EStream_LE + 0x00000000 0xee Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_EStream_BE + 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 0xe2 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Control_Stream_BE + 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 0x170 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Write_Control_EStream_BE + 0x00000000 0x172 Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Control_EStream_LE + 0x00000000 0xec Bin/EndpointStream_XMEGA.o + .text.Endpoint_Read_Control_EStream_BE + 0x00000000 0xd8 Bin/EndpointStream_XMEGA.o + .text 0x00000000 0x0 Bin/Endpoint_XMEGA.o + .bss 0x00000000 0x0 Bin/Endpoint_XMEGA.o + .text 0x00000000 0x0 Bin/Host_XMEGA.o + .bss 0x00000000 0x0 Bin/Host_XMEGA.o + .text 0x00000000 0x0 Bin/PipeStream_XMEGA.o + .bss 0x00000000 0x0 Bin/PipeStream_XMEGA.o + .text 0x00000000 0x0 Bin/Pipe_XMEGA.o + .bss 0x00000000 0x0 Bin/Pipe_XMEGA.o + .text 0x00000000 0x0 Bin/USBController_XMEGA.o + .bss 0x00000000 0x0 Bin/USBController_XMEGA.o + .text 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o + .bss 0x00000000 0x0 Bin/USBInterrupt_XMEGA.o + .text 0x00000000 0x0 Bin/AudioClassDevice.o + .bss 0x00000000 0x0 Bin/AudioClassDevice.o + .text.Audio_Device_ConfigureEndpoints + 0x00000000 0x32 Bin/AudioClassDevice.o + .text.Audio_Device_Event_Stub + 0x00000000 0x2 Bin/AudioClassDevice.o + .text.Audio_Device_ProcessControlRequest + 0x00000000 0x29e Bin/AudioClassDevice.o + .text 0x00000000 0x0 Bin/CDCClassDevice.o + .bss 0x00000000 0x0 Bin/CDCClassDevice.o + .text.CDC_Device_putchar + 0x00000000 0x22 Bin/CDCClassDevice.o + .text.CDC_Device_BytesReceived + 0x00000000 0xa4 Bin/CDCClassDevice.o + .text.CDC_Device_getchar + 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 + .text.CDC_Device_CreateStream + 0x00000000 0x26 Bin/CDCClassDevice.o + .text.CDC_Device_CreateBlockingStream + 0x00000000 0x26 Bin/CDCClassDevice.o + .text 0x00000000 0x0 Bin/HIDClassDevice.o + .bss 0x00000000 0x0 Bin/HIDClassDevice.o + .text.HID_Device_ProcessControlRequest + 0x00000000 0x240 Bin/HIDClassDevice.o + .text.HID_Device_ConfigureEndpoints + 0x00000000 0x28 Bin/HIDClassDevice.o + .text.HID_Device_USBTask + 0x00000000 0x1a8 Bin/HIDClassDevice.o + .text 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 0x2c2 Bin/MassStorageClassDevice.o + .text 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 0x54 Bin/MIDIClassDevice.o + .text.MIDI_Device_Flush + 0x00000000 0x58 Bin/MIDIClassDevice.o + .text.MIDI_Device_USBTask + 0x00000000 0x2c Bin/MIDIClassDevice.o + .text.MIDI_Device_ReceiveEventPacket + 0x00000000 0x68 Bin/MIDIClassDevice.o + .text 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 0x3e Bin/PrinterClassDevice.o + .text.PRNT_Device_SendData + 0x00000000 0x3c Bin/PrinterClassDevice.o + .text.PRNT_Device_SendByte + 0x00000000 0x5a Bin/PrinterClassDevice.o + .text.PRNT_Device_putchar + 0x00000000 0x22 Bin/PrinterClassDevice.o + .text.PRNT_Device_Flush + 0x00000000 0x74 Bin/PrinterClassDevice.o + .text.PRNT_Device_USBTask + 0x00000000 0xcc Bin/PrinterClassDevice.o + .text.PRNT_Device_BytesReceived + 0x00000000 0x94 Bin/PrinterClassDevice.o + .text.PRNT_Device_ReceiveByte + 0x00000000 0xb0 Bin/PrinterClassDevice.o + .text.PRNT_Device_getchar + 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 + 0x00000000 0x26 Bin/PrinterClassDevice.o + .text.PRNT_Device_Event_Stub + 0x00000000 0x2 Bin/PrinterClassDevice.o + .text.PRNT_Device_ProcessControlRequest + 0x00000000 0xda Bin/PrinterClassDevice.o + .text 0x00000000 0x0 Bin/RNDISClassDevice.o + .bss 0x00000000 0x0 Bin/RNDISClassDevice.o + .text.RNDIS_Device_ProcessControlRequest + 0x00000000 0x52e Bin/RNDISClassDevice.o + .text.RNDIS_Device_ConfigureEndpoints + 0x00000000 0x50 Bin/RNDISClassDevice.o + .rodata 0x00000000 0x8 Bin/RNDISClassDevice.o + .text.RNDIS_Device_USBTask + 0x00000000 0x74 Bin/RNDISClassDevice.o + .text.RNDIS_Device_IsPacketReceived + 0x00000000 0x24 Bin/RNDISClassDevice.o + .text.RNDIS_Device_ReadPacket + 0x00000000 0xa2 Bin/RNDISClassDevice.o + .text.RNDIS_Device_SendPacket + 0x00000000 0xca Bin/RNDISClassDevice.o + .progmem.data 0x00000000 0x6c Bin/RNDISClassDevice.o + .text 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o + .bss 0x00000000 0x0 Bin/AndroidAccessoryClassHost.o + .text 0x00000000 0x0 Bin/AudioClassHost.o + .bss 0x00000000 0x0 Bin/AudioClassHost.o + .text 0x00000000 0x0 Bin/CDCClassHost.o + .bss 0x00000000 0x0 Bin/CDCClassHost.o + .text 0x00000000 0x0 Bin/HIDClassHost.o + .bss 0x00000000 0x0 Bin/HIDClassHost.o + .text 0x00000000 0x0 Bin/MassStorageClassHost.o + .bss 0x00000000 0x0 Bin/MassStorageClassHost.o + .text 0x00000000 0x0 Bin/MIDIClassHost.o + .bss 0x00000000 0x0 Bin/MIDIClassHost.o + .text 0x00000000 0x0 Bin/PrinterClassHost.o + .bss 0x00000000 0x0 Bin/PrinterClassHost.o + .text 0x00000000 0x0 Bin/RNDISClassHost.o + .bss 0x00000000 0x0 Bin/RNDISClassHost.o + .text 0x00000000 0x0 Bin/StillImageClassHost.o + .bss 0x00000000 0x0 Bin/StillImageClassHost.o + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy_P.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy_P.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strcmp_P.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strcmp_P.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strncpy_P.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strncpy_P.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcmp.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcmp.o) + .text.avr-libc + 0x00000000 0x1a /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcmp.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memset.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memset.o) + .text.avr-libc + 0x00000000 0xe /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memset.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + .text.avr-libc + 0x00000000 0x20 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) + .text.avr-libc + 0x00000000 0x16 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen_P.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen_P.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(ultoa_invert.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(ultoa_invert.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text.libgcc.div + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .text 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .bss 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .text.libgcc.mul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .text.libgcc 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .text.libgcc.prologue + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .text.libgcc.builtins + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .text.libgcc.fmul + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + .text.libgcc.fixed + 0x00000000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + +Memory Configuration + +Name Origin Length Attributes +text 0x00000000 0x00100000 xr +data 0x00802000 0x0000ffa0 rw !x +eeprom 0x00810000 0x00010000 rw !x +fuse 0x00820000 0x00000400 rw !x +lock 0x00830000 0x00000400 rw !x +signature 0x00840000 0x00000400 rw !x +user_signatures 0x00850000 0x00000400 rw !x +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD /home/sk/avr8-gnu-toolchain-linux_x86/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 +LOAD Bin/Configuration.o +LOAD Bin/Random.o +LOAD Bin/Common.o +LOAD Bin/Memory.o +LOAD Bin/Button.o +LOAD Bin/Settings.o +LOAD Bin/LED.o +LOAD Bin/Terminal.o +LOAD Bin/Commands.o +LOAD Bin/XModem.o +LOAD Bin/CommandLine.o +LOAD Bin/Codec.o +LOAD Bin/ISO14443-2A.o +LOAD Bin/MifareClassic.o +LOAD Bin/ISO14443-3A.o +LOAD Bin/Crypto1.o +LOAD Bin/HIDParser.o +LOAD Bin/ConfigDescriptors.o +LOAD Bin/DeviceStandardReq.o +LOAD Bin/Events.o +LOAD Bin/HostStandardReq.o +LOAD Bin/USBTask.o +LOAD Bin/Device_XMEGA.o +LOAD Bin/EndpointStream_XMEGA.o +LOAD Bin/Endpoint_XMEGA.o +LOAD Bin/Host_XMEGA.o +LOAD Bin/PipeStream_XMEGA.o +LOAD Bin/Pipe_XMEGA.o +LOAD Bin/USBController_XMEGA.o +LOAD Bin/USBInterrupt_XMEGA.o +LOAD Bin/AudioClassDevice.o +LOAD Bin/CDCClassDevice.o +LOAD Bin/HIDClassDevice.o +LOAD Bin/MassStorageClassDevice.o +LOAD Bin/MIDIClassDevice.o +LOAD Bin/PrinterClassDevice.o +LOAD Bin/RNDISClassDevice.o +LOAD Bin/AndroidAccessoryClassHost.o +LOAD Bin/AudioClassHost.o +LOAD Bin/CDCClassHost.o +LOAD Bin/HIDClassHost.o +LOAD Bin/MassStorageClassHost.o +LOAD Bin/MIDIClassHost.o +LOAD Bin/PrinterClassHost.o +LOAD Bin/RNDISClassHost.o +LOAD Bin/StillImageClassHost.o +LOAD /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libm.a +START GROUP +LOAD /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a +LOAD /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libm.a +LOAD /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a +END GROUP + +.hash + *(.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.init + *(.rel.init) + +.rela.init + *(.rela.init) + +.rel.text + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + +.rela.text + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + +.rel.fini + *(.rel.fini) + +.rela.fini + *(.rela.fini) + +.rel.rodata + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + +.rela.rodata + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + +.rel.data + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + +.rela.data + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + +.rel.ctors + *(.rel.ctors) + +.rela.ctors + *(.rela.ctors) + +.rel.dtors + *(.rel.dtors) + +.rela.dtors + *(.rela.dtors) + +.rel.got + *(.rel.got) + +.rela.got + *(.rela.got) + +.rel.bss + *(.rel.bss) + +.rela.bss + *(.rela.bss) + +.rel.plt + *(.rel.plt) + +.rela.plt + *(.rela.plt) + +.text 0x00000000 0x4e9a + *(.vectors) + .vectors 0x00000000 0x1fc /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000000 __vectors + *(.vectors) + *(.progmem.gcc*) + .progmem.gcc_sw_table.XModemProcessByte + 0x000001fc 0x12 Bin/XModem.o + .progmem.gcc_sw_table.__vector_83 + 0x0000020e 0x16 Bin/ISO14443-2A.o + .progmem.gcc_sw_table.MifareClassicAppProcess + 0x00000224 0x14 Bin/MifareClassic.o + .progmem.gcc_sw_table.USB_Device_ProcessControlRequest + 0x00000238 0x14 Bin/DeviceStandardReq.o + 0x0000024c . = ALIGN (0x2) + 0x0000024c __trampolines_start = . + *(.trampolines) + .trampolines 0x0000024c 0x0 linker stubs + *(.trampolines*) + 0x0000024c __trampolines_end = . + *(.progmem*) + .progmem.data 0x0000024c 0x8c Bin/LUFADescriptors.o + 0x0000024c ProductString + 0x0000026a ManufacturerString + 0x00000284 LanguageString + 0x00000288 ConfigurationDescriptor + 0x000002c6 DeviceDescriptor + .progmem.data 0x000002d8 0x6f Bin/Configuration.o + .progmem.data 0x00000347 0x120 Bin/Button.o + .progmem.data 0x00000467 0x64 Bin/Commands.o + .progmem.data 0x000004cb 0x22c Bin/CommandLine.o + 0x00000597 CommandTable + 0x000006f8 . = ALIGN (0x2) + *fill* 0x000006f7 0x1 + *(.jumptables) + *(.jumptables*) + *(.lowtext) + *(.lowtext*) + 0x000006f8 __ctors_start = . + *(.ctors) + 0x000006f8 __ctors_end = . + 0x000006f8 __dtors_start = . + *(.dtors) + 0x000006f8 __dtors_end = . + SORT(*)(.ctors) + SORT(*)(.dtors) + *(.init0) + .init0 0x000006f8 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x000006f8 __init + *(.init0) + *(.init1) + *(.init1) + *(.init2) + .init2 0x000006f8 0xc /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + *(.init2) + *(.init3) + *(.init3) + *(.init4) + .init4 0x00000704 0x16 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + 0x00000704 __do_copy_data + .init4 0x0000071a 0x10 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + 0x0000071a __do_clear_bss + *(.init4) + *(.init5) + *(.init5) + *(.init6) + *(.init6) + *(.init7) + *(.init7) + *(.init8) + *(.init8) + *(.init9) + .init9 0x0000072a 0x6 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + *(.init9) + *(.text) + .text 0x00000730 0x2 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000730 __vector_38 + 0x00000730 __vector_104 + 0x00000730 __vector_63 + 0x00000730 __vector_28 + 0x00000730 __vector_67 + 0x00000730 __vector_1 + 0x00000730 __vector_119 + 0x00000730 __vector_32 + 0x00000730 __vector_75 + 0x00000730 __vector_71 + 0x00000730 __vector_91 + 0x00000730 __vector_62 + 0x00000730 __vector_77 + 0x00000730 __vector_102 + 0x00000730 __vector_24 + 0x00000730 __vector_12 + 0x00000730 __vector_55 + 0x00000730 __vector_69 + 0x00000730 __vector_81 + 0x00000730 __vector_90 + 0x00000730 __vector_46 + 0x00000730 __bad_interrupt + 0x00000730 __vector_122 + 0x00000730 __vector_72 + 0x00000730 __vector_114 + 0x00000730 __vector_6 + 0x00000730 __vector_110 + 0x00000730 __vector_31 + 0x00000730 __vector_92 + 0x00000730 __vector_35 + 0x00000730 __vector_78 + 0x00000730 __vector_74 + 0x00000730 __vector_117 + 0x00000730 __vector_39 + 0x00000730 __vector_107 + 0x00000730 __vector_3 + 0x00000730 __vector_105 + 0x00000730 __vector_98 + 0x00000730 __vector_23 + 0x00000730 __vector_68 + 0x00000730 __vector_30 + 0x00000730 __vector_73 + 0x00000730 __vector_45 + 0x00000730 __vector_25 + 0x00000730 __vector_93 + 0x00000730 __vector_61 + 0x00000730 __vector_11 + 0x00000730 __vector_54 + 0x00000730 __vector_99 + 0x00000730 __vector_13 + 0x00000730 __vector_17 + 0x00000730 __vector_19 + 0x00000730 __vector_56 + 0x00000730 __vector_7 + 0x00000730 __vector_49 + 0x00000730 __vector_123 + 0x00000730 __vector_41 + 0x00000730 __vector_86 + 0x00000730 __vector_100 + 0x00000730 __vector_101 + 0x00000730 __vector_64 + 0x00000730 __vector_88 + 0x00000730 __vector_109 + 0x00000730 __vector_43 + 0x00000730 __vector_27 + 0x00000730 __vector_5 + 0x00000730 __vector_113 + 0x00000730 __vector_33 + 0x00000730 __vector_76 + 0x00000730 __vector_115 + 0x00000730 __vector_47 + 0x00000730 __vector_52 + 0x00000730 __vector_37 + 0x00000730 __vector_95 + 0x00000730 __vector_103 + 0x00000730 __vector_96 + 0x00000730 __vector_89 + 0x00000730 __vector_108 + 0x00000730 __vector_4 + 0x00000730 __vector_44 + 0x00000730 __vector_82 + 0x00000730 __vector_106 + 0x00000730 __vector_118 + 0x00000730 __vector_51 + 0x00000730 __vector_9 + 0x00000730 __vector_2 + 0x00000730 __vector_21 + 0x00000730 __vector_15 + 0x00000730 __vector_66 + 0x00000730 __vector_36 + 0x00000730 __vector_79 + 0x00000730 __vector_58 + 0x00000730 __vector_70 + 0x00000730 __vector_29 + 0x00000730 __vector_60 + 0x00000730 __vector_121 + 0x00000730 __vector_40 + 0x00000730 __vector_85 + 0x00000730 __vector_94 + 0x00000730 __vector_126 + 0x00000730 __vector_8 + 0x00000730 __vector_26 + 0x00000730 __vector_48 + 0x00000730 __vector_124 + 0x00000730 __vector_116 + 0x00000730 __vector_112 + 0x00000730 __vector_111 + 0x00000730 __vector_80 + 0x00000730 __vector_14 + 0x00000730 __vector_84 + 0x00000730 __vector_57 + 0x00000730 __vector_53 + 0x00000730 __vector_10 + 0x00000730 __vector_50 + 0x00000730 __vector_16 + 0x00000730 __vector_59 + 0x00000730 __vector_18 + 0x00000730 __vector_97 + 0x00000730 __vector_20 + 0x00000730 __vector_42 + 0x00000730 __vector_87 + 0x00000730 __vector_65 + 0x00000730 __vector_120 + 0x00000732 . = ALIGN (0x2) + *(.text.*) + .text.startup.main + 0x00000732 0x76 Bin/Chameleon-Mini.o + 0x00000732 main + .text.CALLBACK_USB_GetDescriptor + 0x000007a8 0x7c Bin/LUFADescriptors.o + 0x000007a8 CALLBACK_USB_GetDescriptor + .text.__vector_default + 0x00000824 0xc Bin/System.o + 0x00000824 __vector_default + .text.SystemInit + 0x00000830 0x6e Bin/System.o + 0x00000830 SystemInit + .text.SystemReset + 0x0000089e 0xe Bin/System.o + 0x0000089e SystemReset + .text.SystemEnterBootloader + 0x000008ac 0xc Bin/System.o + 0x000008ac SystemEnterBootloader + .text.SystemStartUSBClock + 0x000008b8 0x32 Bin/System.o + 0x000008b8 SystemStartUSBClock + .text.SystemStopUSBClock + 0x000008ea 0x1c Bin/System.o + 0x000008ea SystemStopUSBClock + .text.SystemInterruptInit + 0x00000906 0xc Bin/System.o + 0x00000906 SystemInterruptInit + .text.CodecInitDummy + 0x00000912 0x2 Bin/Configuration.o + .text.CodecTaskDummy + 0x00000914 0x2 Bin/Configuration.o + .text.ApplicationInitDummy + 0x00000916 0x2 Bin/Configuration.o + .text.ApplicationResetDummy + 0x00000918 0x2 Bin/Configuration.o + .text.ApplicationTaskDummy + 0x0000091a 0x2 Bin/Configuration.o + .text.ApplicationProcessDummy + 0x0000091c 0x6 Bin/Configuration.o + .text.ApplicationGetUidDummy + 0x00000922 0x2 Bin/Configuration.o + .text.ApplicationSetUidDummy + 0x00000924 0x2 Bin/Configuration.o + .text.ConfigurationSetById + 0x00000926 0x36 Bin/Configuration.o + 0x00000926 ConfigurationSetById + .text.ConfigurationInit + 0x0000095c 0xc Bin/Configuration.o + 0x0000095c ConfigurationInit + .text.ConfigurationSetByName + 0x00000968 0x7a Bin/Configuration.o + 0x00000968 ConfigurationSetByName + .text.ConfigurationGetList + 0x000009e2 0x74 Bin/Configuration.o + 0x000009e2 ConfigurationGetList + .text.RandomInit + 0x00000a56 0x2 Bin/Random.o + 0x00000a56 RandomInit + .text.RandomGetByte + 0x00000a58 0x6 Bin/Random.o + 0x00000a58 RandomGetByte + .text.RandomGetBuffer + 0x00000a5e 0x20 Bin/Random.o + 0x00000a5e RandomGetBuffer + .text.RandomTick + 0x00000a7e 0x10 Bin/Random.o + 0x00000a7e RandomTick + .text.BufferToHexString + 0x00000a8e 0x86 Bin/Common.o + 0x00000a8e BufferToHexString + .text.HexStringToBuffer + 0x00000b14 0x94 Bin/Common.o + 0x00000b14 HexStringToBuffer + .text.MemoryReadBlock + 0x00000ba8 0x30 Bin/Memory.o + 0x00000ba8 MemoryReadBlock + .text.MemoryWriteBlock + 0x00000bd8 0x2e Bin/Memory.o + 0x00000bd8 MemoryWriteBlock + .text.MemoryClear + 0x00000c06 0x16 Bin/Memory.o + 0x00000c06 MemoryClear + .text.MemoryRecall + 0x00000c1c 0xec Bin/Memory.o + 0x00000c1c MemoryRecall + .text.MemoryInit + 0x00000d08 0xfc Bin/Memory.o + 0x00000d08 MemoryInit + .text.MemoryStore + 0x00000e04 0x27a Bin/Memory.o + 0x00000e04 MemoryStore + .text.MemoryUploadBlock + 0x0000107e 0x392 Bin/Memory.o + 0x0000107e MemoryUploadBlock + .text.MemoryDownloadBlock + 0x00001410 0x7a Bin/Memory.o + 0x00001410 MemoryDownloadBlock + .text.ButtonInit + 0x0000148a 0xe Bin/Button.o + 0x0000148a ButtonInit + .text.ButtonTick + 0x00001498 0x1ba Bin/Button.o + 0x00001498 ButtonTick + .text.ButtonGetActionList + 0x00001652 0x72 Bin/Button.o + 0x00001652 ButtonGetActionList + .text.ButtonGetActionByName + 0x000016c4 0x1c Bin/Button.o + 0x000016c4 ButtonGetActionByName + .text.ButtonSetActionByName + 0x000016e0 0xc0 Bin/Button.o + 0x000016e0 ButtonSetActionByName + .text.SettingsLoad + 0x000017a0 0x10 Bin/Settings.o + 0x000017a0 SettingsLoad + .text.SettingsSave + 0x000017b0 0x10 Bin/Settings.o + 0x000017b0 SettingsSave + .text.SettingsSetActiveById + 0x000017c0 0x3c Bin/Settings.o + 0x000017c0 SettingsSetActiveById + .text.SettingsCycle + 0x000017fc 0xda Bin/Settings.o + 0x000017fc SettingsCycle + .text.SettingsGetActiveByName + 0x000018d6 0xe Bin/Settings.o + 0x000018d6 SettingsGetActiveByName + .text.SettingsSetActiveByName + 0x000018e4 0x1a Bin/Settings.o + 0x000018e4 SettingsSetActiveByName + .text.TerminalSendString + 0x000018fe 0xa Bin/Terminal.o + 0x000018fe TerminalSendString + .text.TerminalSendStringP + 0x00001908 0x28 Bin/Terminal.o + 0x00001908 TerminalSendStringP + .text.TerminalSendBlock + 0x00001930 0xc Bin/Terminal.o + 0x00001930 TerminalSendBlock + .text.TerminalInit + 0x0000193c 0xa Bin/Terminal.o + 0x0000193c TerminalInit + .text.TerminalTask + 0x00001946 0x3e Bin/Terminal.o + 0x00001946 TerminalTask + .text.TerminalTick + 0x00001984 0x80 Bin/Terminal.o + 0x00001984 TerminalTick + .text.EVENT_USB_Device_Connect + 0x00001a04 0xa Bin/Terminal.o + 0x00001a04 EVENT_USB_Device_Connect + .text.EVENT_USB_Device_Disconnect + 0x00001a0e 0xa Bin/Terminal.o + 0x00001a0e EVENT_USB_Device_Disconnect + .text.EVENT_USB_Device_ConfigurationChanged + 0x00001a18 0x8 Bin/Terminal.o + 0x00001a18 EVENT_USB_Device_ConfigurationChanged + .text.EVENT_USB_Device_ControlRequest + 0x00001a20 0x8 Bin/Terminal.o + 0x00001a20 EVENT_USB_Device_ControlRequest + .text.CommandGetVersion + 0x00001a28 0x3c Bin/Commands.o + 0x00001a28 CommandGetVersion + .text.CommandGetConfig + 0x00001a64 0x2c Bin/Commands.o + 0x00001a64 CommandGetConfig + .text.CommandSetConfig + 0x00001a90 0x12 Bin/Commands.o + 0x00001a90 CommandSetConfig + .text.CommandExecConfig + 0x00001aa2 0xc Bin/Commands.o + 0x00001aa2 CommandExecConfig + .text.CommandGetUid + 0x00001aae 0x54 Bin/Commands.o + 0x00001aae CommandGetUid + .text.CommandSetUid + 0x00001b02 0xa4 Bin/Commands.o + 0x00001b02 CommandSetUid + .text.CommandGetReadOnly + 0x00001ba6 0x24 Bin/Commands.o + 0x00001ba6 CommandGetReadOnly + .text.CommandSetReadOnly + 0x00001bca 0x28 Bin/Commands.o + 0x00001bca CommandSetReadOnly + .text.CommandExecUpload + 0x00001bf2 0xa Bin/Commands.o + 0x00001bf2 CommandExecUpload + .text.CommandExecDownload + 0x00001bfc 0xa Bin/Commands.o + 0x00001bfc CommandExecDownload + .text.CommandExecReset + 0x00001c06 0x16 Bin/Commands.o + 0x00001c06 CommandExecReset + .text.CommandExecUpgrade + 0x00001c1c 0x16 Bin/Commands.o + 0x00001c1c CommandExecUpgrade + .text.CommandGetMemSize + 0x00001c32 0x30 Bin/Commands.o + 0x00001c32 CommandGetMemSize + .text.CommandGetUidSize + 0x00001c62 0x2c Bin/Commands.o + 0x00001c62 CommandGetUidSize + .text.CommandExecButton + 0x00001c8e 0xa Bin/Commands.o + 0x00001c8e CommandExecButton + .text.CommandGetButton + 0x00001c98 0xa Bin/Commands.o + 0x00001c98 CommandGetButton + .text.CommandSetButton + 0x00001ca2 0x10 Bin/Commands.o + 0x00001ca2 CommandSetButton + .text.CommandGetSetting + 0x00001cb2 0xa Bin/Commands.o + 0x00001cb2 CommandGetSetting + .text.CommandSetSetting + 0x00001cbc 0x10 Bin/Commands.o + 0x00001cbc CommandSetSetting + .text.CommandExecClear + 0x00001ccc 0x8 Bin/Commands.o + 0x00001ccc CommandExecClear + .text.CommandExecHelp + 0x00001cd4 0x94 Bin/Commands.o + 0x00001cd4 CommandExecHelp + .text.CommandGetRssi + 0x00001d68 0x68 Bin/Commands.o + 0x00001d68 CommandGetRssi + .text.XModemReceive + 0x00001dd0 0x30 Bin/XModem.o + 0x00001dd0 XModemReceive + .text.XModemSend + 0x00001e00 0x26 Bin/XModem.o + 0x00001e00 XModemSend + .text.XModemProcessByte + 0x00001e26 0x2c2 Bin/XModem.o + 0x00001e26 XModemProcessByte + .text.XModemTick + 0x000020e8 0x5c Bin/XModem.o + 0x000020e8 XModemTick + .text.CommandLineProcessByte + 0x00002144 0x34c Bin/CommandLine.o + 0x00002144 CommandLineProcessByte + .text.CommandLineTick + 0x00002490 0x2 Bin/CommandLine.o + 0x00002490 CommandLineTick + .text.StartDemod + 0x00002492 0x3c Bin/ISO14443-2A.o + .text.__vector_34 + 0x000024ce 0x88 Bin/ISO14443-2A.o + 0x000024ce __vector_34 + .text.__vector_22 + 0x00002556 0x174 Bin/ISO14443-2A.o + 0x00002556 __vector_22 + .text.__vector_83 + 0x000026ca 0x1bc Bin/ISO14443-2A.o + 0x000026ca __vector_83 + .text.ISO14443ACodecInit + 0x00002886 0x6e Bin/ISO14443-2A.o + 0x00002886 ISO14443ACodecInit + .text.ISO14443ACodecTask + 0x000028f4 0xf6 Bin/ISO14443-2A.o + 0x000028f4 ISO14443ACodecTask + .text.MifareClassicAppInit1K + 0x000029ea 0x1a Bin/MifareClassic.o + 0x000029ea MifareClassicAppInit1K + .text.MifareClassicAppInit4K + 0x00002a04 0x1a Bin/MifareClassic.o + 0x00002a04 MifareClassicAppInit4K + .text.MifareClassicAppReset + 0x00002a1e 0x8 Bin/MifareClassic.o + 0x00002a1e MifareClassicAppReset + .text.MifareClassicAppTask + 0x00002a26 0x2 Bin/MifareClassic.o + 0x00002a26 MifareClassicAppTask + .text.MifareClassicAppProcess + 0x00002a28 0x7a6 Bin/MifareClassic.o + 0x00002a28 MifareClassicAppProcess + .text.MifareClassicGetUid + 0x000031ce 0xc Bin/MifareClassic.o + 0x000031ce MifareClassicGetUid + .text.MifareClassicSetUid + 0x000031da 0x40 Bin/MifareClassic.o + 0x000031da MifareClassicSetUid + .text.ISO14443AAppendCRCA + 0x0000321a 0x5c Bin/ISO14443-3A.o + 0x0000321a ISO14443AAppendCRCA + .text.ISO14443ACheckCRCA + 0x00003276 0x7c Bin/ISO14443-3A.o + 0x00003276 ISO14443ACheckCRCA + .text.Crypto1LFSR + 0x000032f2 0x8c Bin/Crypto1.o + .text.Crypto1FilterOutput + 0x0000337e 0x64 Bin/Crypto1.o + 0x0000337e Crypto1FilterOutput + .text.Crypto1Setup + 0x000033e2 0x19a Bin/Crypto1.o + 0x000033e2 Crypto1Setup + .text.Crypto1Auth + 0x0000357c 0x4a Bin/Crypto1.o + 0x0000357c Crypto1Auth + .text.Crypto1Byte + 0x000035c6 0x26 Bin/Crypto1.o + 0x000035c6 Crypto1Byte + .text.Crypto1Nibble + 0x000035ec 0x26 Bin/Crypto1.o + 0x000035ec Crypto1Nibble + .text.Crypto1PRNG + 0x00003612 0xa0 Bin/Crypto1.o + 0x00003612 Crypto1PRNG + .text.USB_Device_ProcessControlRequest + 0x000036b2 0x240 Bin/DeviceStandardReq.o + 0x000036b2 USB_Device_ProcessControlRequest + .text.USB_Event_Stub + 0x000038f2 0x2 Bin/Events.o + 0x000038f2 EVENT_USB_Device_WakeUp + 0x000038f2 USB_Event_Stub + 0x000038f2 EVENT_USB_Device_Suspend + 0x000038f2 EVENT_USB_Device_StartOfFrame + 0x000038f2 EVENT_USB_Device_Reset + .text.USB_USBTask + 0x000038f4 0x2a Bin/USBTask.o + 0x000038f4 USB_USBTask + .text.Endpoint_Write_Stream_LE + 0x0000391e 0xc8 Bin/EndpointStream_XMEGA.o + 0x0000391e Endpoint_Write_Stream_LE + .text.Endpoint_Write_Control_Stream_LE + 0x000039e6 0x12a Bin/EndpointStream_XMEGA.o + 0x000039e6 Endpoint_Write_Control_Stream_LE + .text.Endpoint_Write_Control_PStream_LE + 0x00003b10 0x158 Bin/EndpointStream_XMEGA.o + 0x00003b10 Endpoint_Write_Control_PStream_LE + .text.Endpoint_ClearIN + 0x00003c68 0x32 Bin/Endpoint_XMEGA.o + 0x00003c68 Endpoint_ClearIN + .text.Endpoint_ClearOUT + 0x00003c9a 0x1e Bin/Endpoint_XMEGA.o + 0x00003c9a Endpoint_ClearOUT + .text.Endpoint_Read_8 + 0x00003cb8 0x20 Bin/Endpoint_XMEGA.o + 0x00003cb8 Endpoint_Read_8 + .text.Endpoint_Write_8 + 0x00003cd8 0x20 Bin/Endpoint_XMEGA.o + 0x00003cd8 Endpoint_Write_8 + .text.Endpoint_SelectEndpoint + 0x00003cf8 0x72 Bin/Endpoint_XMEGA.o + 0x00003cf8 Endpoint_SelectEndpoint + .text.Endpoint_IsINReady + 0x00003d6a 0x18 Bin/Endpoint_XMEGA.o + 0x00003d6a Endpoint_IsINReady + .text.Endpoint_IsOUTReceived + 0x00003d82 0x32 Bin/Endpoint_XMEGA.o + 0x00003d82 Endpoint_IsOUTReceived + .text.Endpoint_IsSETUPReceived + 0x00003db4 0x32 Bin/Endpoint_XMEGA.o + 0x00003db4 Endpoint_IsSETUPReceived + .text.Endpoint_ClearSETUP + 0x00003de6 0x58 Bin/Endpoint_XMEGA.o + 0x00003de6 Endpoint_ClearSETUP + .text.Endpoint_StallTransaction + 0x00003e3e 0x38 Bin/Endpoint_XMEGA.o + 0x00003e3e Endpoint_StallTransaction + .text.Endpoint_ConfigureEndpoint_PRV + 0x00003e76 0x96 Bin/Endpoint_XMEGA.o + 0x00003e76 Endpoint_ConfigureEndpoint_PRV + .text.Endpoint_ConfigureEndpointTable + 0x00003f0c 0xd8 Bin/Endpoint_XMEGA.o + 0x00003f0c Endpoint_ConfigureEndpointTable + .text.Endpoint_ClearEndpoints + 0x00003fe4 0x70 Bin/Endpoint_XMEGA.o + 0x00003fe4 Endpoint_ClearEndpoints + .text.Endpoint_ClearStatusStage + 0x00004054 0x2c Bin/Endpoint_XMEGA.o + 0x00004054 Endpoint_ClearStatusStage + .text.Endpoint_WaitUntilReady + 0x00004080 0xa6 Bin/Endpoint_XMEGA.o + 0x00004080 Endpoint_WaitUntilReady + .text.USB_Disable + 0x00004126 0x1a Bin/USBController_XMEGA.o + 0x00004126 USB_Disable + .text.USB_ResetInterface + 0x00004140 0x5c Bin/USBController_XMEGA.o + 0x00004140 USB_ResetInterface + .text.USB_Init + 0x0000419c 0x50 Bin/USBController_XMEGA.o + 0x0000419c USB_Init + .text.USB_INT_DisableAllInterrupts + 0x000041ec 0xe Bin/USBInterrupt_XMEGA.o + 0x000041ec USB_INT_DisableAllInterrupts + .text.USB_INT_ClearAllInterrupts + 0x000041fa 0xc Bin/USBInterrupt_XMEGA.o + 0x000041fa USB_INT_ClearAllInterrupts + .text.__vector_125 + 0x00004206 0xda Bin/USBInterrupt_XMEGA.o + 0x00004206 __vector_125 + .text.CDC_Device_ConfigureEndpoints + 0x000042e0 0x4a Bin/CDCClassDevice.o + 0x000042e0 CDC_Device_ConfigureEndpoints + .text.CDC_Device_SendString + 0x0000432a 0x4a Bin/CDCClassDevice.o + 0x0000432a CDC_Device_SendString + .text.CDC_Device_SendData + 0x00004374 0x54 Bin/CDCClassDevice.o + 0x00004374 CDC_Device_SendData + .text.CDC_Device_SendByte + 0x000043c8 0x6a Bin/CDCClassDevice.o + 0x000043c8 CDC_Device_SendByte + .text.CDC_Device_Flush + 0x00004432 0x7c Bin/CDCClassDevice.o + 0x00004432 CDC_Device_Flush + .text.CDC_Device_USBTask + 0x000044ae 0x36 Bin/CDCClassDevice.o + 0x000044ae CDC_Device_USBTask + .text.CDC_Device_ReceiveByte + 0x000044e4 0xb8 Bin/CDCClassDevice.o + 0x000044e4 CDC_Device_ReceiveByte + .text.CDC_Device_Event_Stub + 0x0000459c 0x2 Bin/CDCClassDevice.o + 0x0000459c EVENT_CDC_Device_LineEncodingChanged + 0x0000459c EVENT_CDC_Device_ControLineStateChanged + 0x0000459c EVENT_CDC_Device_BreakSent + 0x0000459c CDC_Device_Event_Stub + .text.CDC_Device_ProcessControlRequest + 0x0000459e 0x134 Bin/CDCClassDevice.o + 0x0000459e CDC_Device_ProcessControlRequest + .text.libgcc 0x000046d2 0xc /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + 0x000046d2 __tablejump2__ + 0x000046d6 __tablejump__ + .text.libgcc.mul + 0x000046de 0xc /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + 0x000046de __mulshisi3 + 0x000046e2 __mulohisi3 + .text.libgcc.mul + 0x000046ea 0x14 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + 0x000046ea __muluhisi3 + .text.libgcc.mul + 0x000046fe 0x1e /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + 0x000046fe __umulhisi3 + .text.avr-libc + 0x0000471c 0xae /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + 0x000047ac rand_r + 0x000047ae rand + 0x000047b4 srand + .text.avr-libc + 0x000047ca 0x12 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy_P.o) + 0x000047ca memcpy_P + .text.avr-libc + 0x000047dc 0x12 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strcmp_P.o) + 0x000047dc strcmp_P + .text.avr-libc + 0x000047ee 0x1e /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strncpy_P.o) + 0x000047ee strncpy_P + .text.avr-libc + 0x0000480c 0x12 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy.o) + 0x0000480c memcpy + .text.avr-libc + 0x0000481e 0x5a /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + 0x0000481e snprintf_P + .text.avr-libc + 0x00004878 0x386 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + 0x00004878 vfprintf + .text.avr-libc + 0x00004bfe 0x16 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + 0x00004bfe __eerd_block_x32a4u + .text.avr-libc + 0x00004c14 0x12 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + 0x00004c14 __eewr_block_x32a4u + .text.avr-libc + 0x00004c26 0x46 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) + 0x00004c26 __eewr_byte_x32a4u + 0x00004c28 __eewr_r18_x32a4u + .text.avr-libc + 0x00004c6c 0x16 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen_P.o) + 0x00004c6c strnlen_P + .text.avr-libc + 0x00004c82 0x16 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen.o) + 0x00004c82 strnlen + .text.avr-libc + 0x00004c98 0x64 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + 0x00004c98 fputc + .text.avr-libc + 0x00004cfc 0xbc /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(ultoa_invert.o) + 0x00004cfc __ultoa_invert + .text.libgcc.div + 0x00004db8 0x28 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + 0x00004db8 __divmodsi4 + .text.libgcc.div + 0x00004de0 0x10 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + 0x00004de0 __negsi2 + .text.libgcc.prologue + 0x00004df0 0x32 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + 0x00004df0 __prologue_saves__ + .text.libgcc.prologue + 0x00004e22 0x30 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + 0x00004e22 __epilogue_restores__ + .text.libgcc.div + 0x00004e52 0x44 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + 0x00004e52 __udivmodsi4 + 0x00004e96 . = ALIGN (0x2) + *(.fini9) + .fini9 0x00004e96 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + 0x00004e96 exit + 0x00004e96 _exit + *(.fini9) + *(.fini8) + *(.fini8) + *(.fini7) + *(.fini7) + *(.fini6) + *(.fini6) + *(.fini5) + *(.fini5) + *(.fini4) + *(.fini4) + *(.fini3) + *(.fini3) + *(.fini2) + *(.fini2) + *(.fini1) + *(.fini1) + *(.fini0) + .fini0 0x00004e96 0x4 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + *(.fini0) + 0x00004e9a _etext = . + +.data 0x00802000 0x92 load address 0x00004e9a + 0x00802000 PROVIDE (__data_start, .) + *(.data) + .data 0x00802000 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../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/Settings.o + .data 0x00802000 0x0 Bin/LED.o + .data 0x00802000 0x1c Bin/Terminal.o + 0x00802001 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/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 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + .data 0x0080201c 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + .data 0x0080201c 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + .data 0x0080201c 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + .data 0x0080201c 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + .data 0x0080201c 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + .data 0x0080201c 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + .data 0x0080201c 0x4 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy_P.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strcmp_P.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strncpy_P.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcmp.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memset.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen_P.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(ultoa_invert.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + .data 0x00802020 0x0 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + *(.data*) + *(.rodata) + .rodata 0x00802020 0x70 Bin/Crypto1.o + *(.rodata*) + .rodata.str1.1 + 0x00802090 0x1 Bin/Commands.o + *(.gnu.linkonce.d*) + 0x00802092 . = ALIGN (0x2) + *fill* 0x00802091 0x1 + 0x00802092 _edata = . + 0x00802092 PROVIDE (__data_end, .) + +.bss 0x00802092 0xa0b + 0x00802092 PROVIDE (__bss_start, .) + *(.bss) + .bss 0x00802092 0x400 Bin/Memory.o + .bss 0x00802492 0x1 Bin/Button.o + .bss 0x00802493 0x1 Bin/LED.o + 0x00802493 LEDPulseMask + .bss 0x00802494 0x1 Bin/Terminal.o + 0x00802494 TerminalState + .bss 0x00802495 0xe Bin/XModem.o + .bss 0x008024a3 0x2 Bin/CommandLine.o + .bss 0x008024a5 0x10 Bin/ISO14443-2A.o + .bss 0x008024b5 0x1d Bin/MifareClassic.o + .bss 0x008024d2 0x6 Bin/Crypto1.o + *(.bss*) + *(COMMON) + COMMON 0x008024d8 0x25 Bin/Configuration.o + 0x008024d8 ActiveConfiguration + COMMON 0x008024fd 0x13 Bin/Settings.o + 0x008024fd GlobalSettings + COMMON 0x00802510 0x100 Bin/Terminal.o + 0x00802510 TerminalBuffer + COMMON 0x00802610 0x100 Bin/Codec.o + 0x00802610 CodecBuffer + COMMON 0x00802710 0x3 Bin/DeviceStandardReq.o + 0x00802710 USB_Device_ConfigurationNumber + 0x00802711 USB_Device_CurrentlySelfPowered + 0x00802712 USB_Device_RemoteWakeupEnabled + COMMON 0x00802713 0xa Bin/USBTask.o + 0x00802713 USB_IsInitialized + 0x00802714 USB_DeviceState + 0x00802715 USB_ControlRequest + COMMON 0x0080271d 0x31d Bin/Endpoint_XMEGA.o + 0x0080271d USB_Endpoint_SelectedFIFO + 0x0080271f USB_Endpoint_SelectedHandle + 0x00802721 USB_Endpoint_SelectedEndpoint + 0x00802722 USB_Endpoint_FIFOs + COMMON 0x00802a3a 0x63 Bin/USBController_XMEGA.o + 0x00802a3a USB_EndpointTable + 0x00802a9d PROVIDE (__bss_end, .) + 0x00004e9a __data_load_start = LOADADDR (.data) + 0x00004f2c __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit 0x00802a9d 0x0 + 0x00802a9d PROVIDE (__noinit_start, .) + *(.noinit*) + 0x00802a9d PROVIDE (__noinit_end, .) + 0x00802a9d _end = . + 0x00802a9d PROVIDE (__heap_start, .) + +.eeprom 0x00810000 0x13 + *(.eeprom*) + .eeprom 0x00810000 0x13 Bin/Settings.o + 0x00810000 StoredSettings + 0x00810013 __eeprom_end = . + +.fuse + *(.fuse) + *(.lfuse) + *(.hfuse) + *(.efuse) + +.lock + *(.lock*) + +.signature + *(.signature*) + +.user_signatures + *(.user_signatures*) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x5c + *(.comment) + .comment 0x00000000 0x30 Bin/Chameleon-Mini.o + 0x31 (size before relaxing) + .comment 0x00000000 0x31 Bin/LUFADescriptors.o + .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/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/MifareClassic.o + .comment 0x00000000 0x31 Bin/ISO14443-3A.o + .comment 0x00000000 0x31 Bin/Crypto1.o + .comment 0x00000000 0x31 Bin/HIDParser.o + .comment 0x00000000 0x31 Bin/ConfigDescriptors.o + .comment 0x00000000 0x31 Bin/DeviceStandardReq.o + .comment 0x00000000 0x31 Bin/Events.o + .comment 0x00000000 0x31 Bin/HostStandardReq.o + .comment 0x00000000 0x31 Bin/USBTask.o + .comment 0x00000000 0x31 Bin/Device_XMEGA.o + .comment 0x00000000 0x31 Bin/EndpointStream_XMEGA.o + .comment 0x00000000 0x31 Bin/Endpoint_XMEGA.o + .comment 0x00000000 0x31 Bin/Host_XMEGA.o + .comment 0x00000000 0x31 Bin/PipeStream_XMEGA.o + .comment 0x00000000 0x31 Bin/Pipe_XMEGA.o + .comment 0x00000000 0x31 Bin/USBController_XMEGA.o + .comment 0x00000000 0x31 Bin/USBInterrupt_XMEGA.o + .comment 0x00000000 0x31 Bin/AudioClassDevice.o + .comment 0x00000000 0x31 Bin/CDCClassDevice.o + .comment 0x00000000 0x31 Bin/HIDClassDevice.o + .comment 0x00000000 0x31 Bin/MassStorageClassDevice.o + .comment 0x00000000 0x31 Bin/MIDIClassDevice.o + .comment 0x00000000 0x31 Bin/PrinterClassDevice.o + .comment 0x00000000 0x31 Bin/RNDISClassDevice.o + .comment 0x00000000 0x31 Bin/AndroidAccessoryClassHost.o + .comment 0x00000000 0x31 Bin/AudioClassHost.o + .comment 0x00000000 0x31 Bin/CDCClassHost.o + .comment 0x00000000 0x31 Bin/HIDClassHost.o + .comment 0x00000000 0x31 Bin/MassStorageClassHost.o + .comment 0x00000000 0x31 Bin/MIDIClassHost.o + .comment 0x00000000 0x31 Bin/PrinterClassHost.o + .comment 0x00000000 0x31 Bin/RNDISClassHost.o + .comment 0x00000000 0x31 Bin/StillImageClassHost.o + .comment 0x00000000 0x31 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + .comment 0x00000000 0x31 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + .comment 0x00000030 0x2c /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + 0x2d (size before relaxing) + .comment 0x00000000 0x31 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + +.note.gnu.build-id + *(.note.gnu.build-id) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0xb50 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 Bin/Chameleon-Mini.o + .debug_aranges + 0x00000020 0x20 Bin/LUFADescriptors.o + .debug_aranges + 0x00000040 0x50 Bin/System.o + .debug_aranges + 0x00000090 0x78 Bin/Configuration.o + .debug_aranges + 0x00000108 0x38 Bin/Random.o + .debug_aranges + 0x00000140 0x28 Bin/Common.o + .debug_aranges + 0x00000168 0x58 Bin/Memory.o + .debug_aranges + 0x000001c0 0x48 Bin/Button.o + .debug_aranges + 0x00000208 0x50 Bin/Settings.o + .debug_aranges + 0x00000258 0x18 Bin/LED.o + .debug_aranges + 0x00000270 0x68 Bin/Terminal.o + .debug_aranges + 0x000002d8 0xc8 Bin/Commands.o + .debug_aranges + 0x000003a0 0x38 Bin/XModem.o + .debug_aranges + 0x000003d8 0x30 Bin/CommandLine.o + .debug_aranges + 0x00000408 0x18 Bin/Codec.o + .debug_aranges + 0x00000420 0x48 Bin/ISO14443-2A.o + .debug_aranges + 0x00000468 0x50 Bin/MifareClassic.o + .debug_aranges + 0x000004b8 0x28 Bin/ISO14443-3A.o + .debug_aranges + 0x000004e0 0x50 Bin/Crypto1.o + .debug_aranges + 0x00000530 0x38 Bin/HIDParser.o + .debug_aranges + 0x00000568 0x38 Bin/ConfigDescriptors.o + .debug_aranges + 0x000005a0 0x20 Bin/DeviceStandardReq.o + .debug_aranges + 0x000005c0 0x20 Bin/Events.o + .debug_aranges + 0x000005e0 0x18 Bin/HostStandardReq.o + .debug_aranges + 0x000005f8 0x20 Bin/USBTask.o + .debug_aranges + 0x00000618 0x20 Bin/Device_XMEGA.o + .debug_aranges + 0x00000638 0xc8 Bin/EndpointStream_XMEGA.o + .debug_aranges + 0x00000700 0x90 Bin/Endpoint_XMEGA.o + .debug_aranges + 0x00000790 0x18 Bin/Host_XMEGA.o + .debug_aranges + 0x000007a8 0x18 Bin/PipeStream_XMEGA.o + .debug_aranges + 0x000007c0 0x18 Bin/Pipe_XMEGA.o + .debug_aranges + 0x000007d8 0x30 Bin/USBController_XMEGA.o + .debug_aranges + 0x00000808 0x30 Bin/USBInterrupt_XMEGA.o + .debug_aranges + 0x00000838 0x30 Bin/AudioClassDevice.o + .debug_aranges + 0x00000868 0x98 Bin/CDCClassDevice.o + .debug_aranges + 0x00000900 0x30 Bin/HIDClassDevice.o + .debug_aranges + 0x00000930 0x30 Bin/MassStorageClassDevice.o + .debug_aranges + 0x00000960 0x40 Bin/MIDIClassDevice.o + .debug_aranges + 0x000009a0 0x90 Bin/PrinterClassDevice.o + .debug_aranges + 0x00000a30 0x48 Bin/RNDISClassDevice.o + .debug_aranges + 0x00000a78 0x18 Bin/AndroidAccessoryClassHost.o + .debug_aranges + 0x00000a90 0x18 Bin/AudioClassHost.o + .debug_aranges + 0x00000aa8 0x18 Bin/CDCClassHost.o + .debug_aranges + 0x00000ac0 0x18 Bin/HIDClassHost.o + .debug_aranges + 0x00000ad8 0x18 Bin/MassStorageClassHost.o + .debug_aranges + 0x00000af0 0x18 Bin/MIDIClassHost.o + .debug_aranges + 0x00000b08 0x18 Bin/PrinterClassHost.o + .debug_aranges + 0x00000b20 0x18 Bin/RNDISClassHost.o + .debug_aranges + 0x00000b38 0x18 Bin/StillImageClassHost.o + +.debug_pubnames + *(.debug_pubnames) + +.debug_info 0x00000000 0x189de + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x1381 Bin/Chameleon-Mini.o + .debug_info 0x00001381 0x962 Bin/LUFADescriptors.o + .debug_info 0x00001ce3 0xea8 Bin/System.o + .debug_info 0x00002b8b 0x657 Bin/Configuration.o + .debug_info 0x000031e2 0x177 Bin/Random.o + .debug_info 0x00003359 0x1b3 Bin/Common.o + .debug_info 0x0000350c 0x1264 Bin/Memory.o + .debug_info 0x00004770 0xa98 Bin/Button.o + .debug_info 0x00005208 0x514 Bin/Settings.o + .debug_info 0x0000571c 0x7a Bin/LED.o + .debug_info 0x00005796 0xb73 Bin/Terminal.o + .debug_info 0x00006309 0x1806 Bin/Commands.o + .debug_info 0x00007b0f 0xa2b Bin/XModem.o + .debug_info 0x0000853a 0xb77 Bin/CommandLine.o + .debug_info 0x000090b1 0x1f1 Bin/Codec.o + .debug_info 0x000092a2 0x187e Bin/ISO14443-2A.o + .debug_info 0x0000ab20 0xee1 Bin/MifareClassic.o + .debug_info 0x0000ba01 0x179 Bin/ISO14443-3A.o + .debug_info 0x0000bb7a 0x42a Bin/Crypto1.o + .debug_info 0x0000bfa4 0x73c Bin/HIDParser.o + .debug_info 0x0000c6e0 0x5ed Bin/ConfigDescriptors.o + .debug_info 0x0000cccd 0x119b Bin/DeviceStandardReq.o + .debug_info 0x0000de68 0x7f Bin/Events.o + .debug_info 0x0000dee7 0x5d Bin/HostStandardReq.o + .debug_info 0x0000df44 0x433 Bin/USBTask.o + .debug_info 0x0000e377 0x670 Bin/Device_XMEGA.o + .debug_info 0x0000e9e7 0x198f Bin/EndpointStream_XMEGA.o + .debug_info 0x00010376 0xd09 Bin/Endpoint_XMEGA.o + .debug_info 0x0001107f 0x5d Bin/Host_XMEGA.o + .debug_info 0x000110dc 0x5d Bin/PipeStream_XMEGA.o + .debug_info 0x00011139 0x5d Bin/Pipe_XMEGA.o + .debug_info 0x00011196 0xd3e Bin/USBController_XMEGA.o + .debug_info 0x00011ed4 0xa7b Bin/USBInterrupt_XMEGA.o + .debug_info 0x0001294f 0xab1 Bin/AudioClassDevice.o + .debug_info 0x00013400 0xf9f Bin/CDCClassDevice.o + .debug_info 0x0001439f 0xf94 Bin/HIDClassDevice.o + .debug_info 0x00015333 0xa9e Bin/MassStorageClassDevice.o + .debug_info 0x00015dd1 0x7c4 Bin/MIDIClassDevice.o + .debug_info 0x00016595 0xded Bin/PrinterClassDevice.o + .debug_info 0x00017382 0x1317 Bin/RNDISClassDevice.o + .debug_info 0x00018699 0x5d Bin/AndroidAccessoryClassHost.o + .debug_info 0x000186f6 0x5d Bin/AudioClassHost.o + .debug_info 0x00018753 0x5d Bin/CDCClassHost.o + .debug_info 0x000187b0 0x5d Bin/HIDClassHost.o + .debug_info 0x0001880d 0x5d Bin/MassStorageClassHost.o + .debug_info 0x0001886a 0x5d Bin/MIDIClassHost.o + .debug_info 0x000188c7 0x5d Bin/PrinterClassHost.o + .debug_info 0x00018924 0x5d Bin/RNDISClassHost.o + .debug_info 0x00018981 0x5d Bin/StillImageClassHost.o + +.debug_abbrev 0x00000000 0x553d + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x1d2 Bin/Chameleon-Mini.o + .debug_abbrev 0x000001d2 0x1bb Bin/LUFADescriptors.o + .debug_abbrev 0x0000038d 0x144 Bin/System.o + .debug_abbrev 0x000004d1 0x250 Bin/Configuration.o + .debug_abbrev 0x00000721 0x113 Bin/Random.o + .debug_abbrev 0x00000834 0xb2 Bin/Common.o + .debug_abbrev 0x000008e6 0x331 Bin/Memory.o + .debug_abbrev 0x00000c17 0x2ea Bin/Button.o + .debug_abbrev 0x00000f01 0x1e1 Bin/Settings.o + .debug_abbrev 0x000010e2 0x44 Bin/LED.o + .debug_abbrev 0x00001126 0x33a Bin/Terminal.o + .debug_abbrev 0x00001460 0x397 Bin/Commands.o + .debug_abbrev 0x000017f7 0x2ce Bin/XModem.o + .debug_abbrev 0x00001ac5 0x2d2 Bin/CommandLine.o + .debug_abbrev 0x00001d97 0xc4 Bin/Codec.o + .debug_abbrev 0x00001e5b 0x2db Bin/ISO14443-2A.o + .debug_abbrev 0x00002136 0x314 Bin/MifareClassic.o + .debug_abbrev 0x0000244a 0xa6 Bin/ISO14443-3A.o + .debug_abbrev 0x000024f0 0x1a9 Bin/Crypto1.o + .debug_abbrev 0x00002699 0x22d Bin/HIDParser.o + .debug_abbrev 0x000028c6 0x248 Bin/ConfigDescriptors.o + .debug_abbrev 0x00002b0e 0x38d Bin/DeviceStandardReq.o + .debug_abbrev 0x00002e9b 0x44 Bin/Events.o + .debug_abbrev 0x00002edf 0x26 Bin/HostStandardReq.o + .debug_abbrev 0x00002f05 0x21b Bin/USBTask.o + .debug_abbrev 0x00003120 0x11e Bin/Device_XMEGA.o + .debug_abbrev 0x0000323e 0x252 Bin/EndpointStream_XMEGA.o + .debug_abbrev 0x00003490 0x300 Bin/Endpoint_XMEGA.o + .debug_abbrev 0x00003790 0x26 Bin/Host_XMEGA.o + .debug_abbrev 0x000037b6 0x26 Bin/PipeStream_XMEGA.o + .debug_abbrev 0x000037dc 0x26 Bin/Pipe_XMEGA.o + .debug_abbrev 0x00003802 0x2f7 Bin/USBController_XMEGA.o + .debug_abbrev 0x00003af9 0x266 Bin/USBInterrupt_XMEGA.o + .debug_abbrev 0x00003d5f 0x280 Bin/AudioClassDevice.o + .debug_abbrev 0x00003fdf 0x41d Bin/CDCClassDevice.o + .debug_abbrev 0x000043fc 0x2d1 Bin/HIDClassDevice.o + .debug_abbrev 0x000046cd 0x338 Bin/MassStorageClassDevice.o + .debug_abbrev 0x00004a05 0x285 Bin/MIDIClassDevice.o + .debug_abbrev 0x00004c8a 0x3c7 Bin/PrinterClassDevice.o + .debug_abbrev 0x00005051 0x396 Bin/RNDISClassDevice.o + .debug_abbrev 0x000053e7 0x26 Bin/AndroidAccessoryClassHost.o + .debug_abbrev 0x0000540d 0x26 Bin/AudioClassHost.o + .debug_abbrev 0x00005433 0x26 Bin/CDCClassHost.o + .debug_abbrev 0x00005459 0x26 Bin/HIDClassHost.o + .debug_abbrev 0x0000547f 0x26 Bin/MassStorageClassHost.o + .debug_abbrev 0x000054a5 0x26 Bin/MIDIClassHost.o + .debug_abbrev 0x000054cb 0x26 Bin/PrinterClassHost.o + .debug_abbrev 0x000054f1 0x26 Bin/RNDISClassHost.o + .debug_abbrev 0x00005517 0x26 Bin/StillImageClassHost.o + +.debug_line 0x00000000 0xa17f + *(.debug_line .debug_line.* .debug_line_end) + .debug_line 0x00000000 0x33c Bin/Chameleon-Mini.o + .debug_line 0x0000033c 0x2aa Bin/LUFADescriptors.o + .debug_line 0x000005e6 0x1fd Bin/System.o + .debug_line 0x000007e3 0x338 Bin/Configuration.o + .debug_line 0x00000b1b 0xef Bin/Random.o + .debug_line 0x00000c0a 0x1fb Bin/Common.o + .debug_line 0x00000e05 0x932 Bin/Memory.o + .debug_line 0x00001737 0x3f4 Bin/Button.o + .debug_line 0x00001b2b 0x2a5 Bin/Settings.o + .debug_line 0x00001dd0 0x61 Bin/LED.o + .debug_line 0x00001e31 0x403 Bin/Terminal.o + .debug_line 0x00002234 0x787 Bin/Commands.o + .debug_line 0x000029bb 0x4a8 Bin/XModem.o + .debug_line 0x00002e63 0x36d Bin/CommandLine.o + .debug_line 0x000031d0 0x85 Bin/Codec.o + .debug_line 0x00003255 0x5f6 Bin/ISO14443-2A.o + .debug_line 0x0000384b 0x6d0 Bin/MifareClassic.o + .debug_line 0x00003f1b 0x152 Bin/ISO14443-3A.o + .debug_line 0x0000406d 0x444 Bin/Crypto1.o + .debug_line 0x000044b1 0x6d1 Bin/HIDParser.o + .debug_line 0x00004b82 0x289 Bin/ConfigDescriptors.o + .debug_line 0x00004e0b 0x469 Bin/DeviceStandardReq.o + .debug_line 0x00005274 0x4f Bin/Events.o + .debug_line 0x000052c3 0x1a Bin/HostStandardReq.o + .debug_line 0x000052dd 0x1b5 Bin/USBTask.o + .debug_line 0x00005492 0x131 Bin/Device_XMEGA.o + .debug_line 0x000055c3 0x153a Bin/EndpointStream_XMEGA.o + .debug_line 0x00006afd 0x69a Bin/Endpoint_XMEGA.o + .debug_line 0x00007197 0x1a Bin/Host_XMEGA.o + .debug_line 0x000071b1 0x1a Bin/PipeStream_XMEGA.o + .debug_line 0x000071cb 0x1a Bin/Pipe_XMEGA.o + .debug_line 0x000071e5 0x357 Bin/USBController_XMEGA.o + .debug_line 0x0000753c 0x35c Bin/USBInterrupt_XMEGA.o + .debug_line 0x00007898 0x401 Bin/AudioClassDevice.o + .debug_line 0x00007c99 0x826 Bin/CDCClassDevice.o + .debug_line 0x000084bf 0x538 Bin/HIDClassDevice.o + .debug_line 0x000089f7 0x4b5 Bin/MassStorageClassDevice.o + .debug_line 0x00008eac 0x3ba Bin/MIDIClassDevice.o + .debug_line 0x00009266 0x763 Bin/PrinterClassDevice.o + .debug_line 0x000099c9 0x6cc Bin/RNDISClassDevice.o + .debug_line 0x0000a095 0x1a Bin/AndroidAccessoryClassHost.o + .debug_line 0x0000a0af 0x1a Bin/AudioClassHost.o + .debug_line 0x0000a0c9 0x1a Bin/CDCClassHost.o + .debug_line 0x0000a0e3 0x1a Bin/HIDClassHost.o + .debug_line 0x0000a0fd 0x1a Bin/MassStorageClassHost.o + .debug_line 0x0000a117 0x1a Bin/MIDIClassHost.o + .debug_line 0x0000a131 0x1a Bin/PrinterClassHost.o + .debug_line 0x0000a14b 0x1a Bin/RNDISClassHost.o + .debug_line 0x0000a165 0x1a Bin/StillImageClassHost.o + +.debug_frame 0x00000000 0x1d28 + *(.debug_frame) + .debug_frame 0x00000000 0x24 Bin/Chameleon-Mini.o + .debug_frame 0x00000024 0x24 Bin/LUFADescriptors.o + .debug_frame 0x00000048 0x90 Bin/System.o + .debug_frame 0x000000d8 0xfc Bin/Configuration.o + .debug_frame 0x000001d4 0x64 Bin/Random.o + .debug_frame 0x00000238 0x40 Bin/Common.o + .debug_frame 0x00000278 0x170 Bin/Memory.o + .debug_frame 0x000003e8 0xb4 Bin/Button.o + .debug_frame 0x0000049c 0x94 Bin/Settings.o + .debug_frame 0x00000530 0xcc Bin/Terminal.o + .debug_frame 0x000005fc 0x288 Bin/Commands.o + .debug_frame 0x00000884 0x5c Bin/XModem.o + .debug_frame 0x000008e0 0x54 Bin/CommandLine.o + .debug_frame 0x00000934 0x110 Bin/ISO14443-2A.o + .debug_frame 0x00000a44 0xdc Bin/MifareClassic.o + .debug_frame 0x00000b20 0x34 Bin/ISO14443-3A.o + .debug_frame 0x00000b54 0x13c Bin/Crypto1.o + .debug_frame 0x00000c90 0x11c Bin/HIDParser.o + .debug_frame 0x00000dac 0xd0 Bin/ConfigDescriptors.o + .debug_frame 0x00000e7c 0x40 Bin/DeviceStandardReq.o + .debug_frame 0x00000ebc 0x24 Bin/Events.o + .debug_frame 0x00000ee0 0x2c Bin/USBTask.o + .debug_frame 0x00000f0c 0x24 Bin/Device_XMEGA.o + .debug_frame 0x00000f30 0x4a0 Bin/EndpointStream_XMEGA.o + .debug_frame 0x000013d0 0x15c Bin/Endpoint_XMEGA.o + .debug_frame 0x0000152c 0x50 Bin/USBController_XMEGA.o + .debug_frame 0x0000157c 0x8c Bin/USBInterrupt_XMEGA.o + .debug_frame 0x00001608 0xa4 Bin/AudioClassDevice.o + .debug_frame 0x000016ac 0x1e0 Bin/CDCClassDevice.o + .debug_frame 0x0000188c 0xf0 Bin/HIDClassDevice.o + .debug_frame 0x0000197c 0x80 Bin/MassStorageClassDevice.o + .debug_frame 0x000019fc 0x94 Bin/MIDIClassDevice.o + .debug_frame 0x00001a90 0x194 Bin/PrinterClassDevice.o + .debug_frame 0x00001c24 0x104 Bin/RNDISClassDevice.o + +.debug_str 0x00000000 0x76e1 + *(.debug_str) + .debug_str 0x00000000 0xd8c Bin/Chameleon-Mini.o + 0xe51 (size before relaxing) + .debug_str 0x00000d8c 0x8cc Bin/LUFADescriptors.o + 0xbd9 (size before relaxing) + .debug_str 0x00001658 0x764 Bin/System.o + 0xc54 (size before relaxing) + .debug_str 0x00001dbc 0x2ff Bin/Configuration.o + 0x629 (size before relaxing) + .debug_str 0x000020bb 0x2c Bin/Random.o + 0x1d3 (size before relaxing) + .debug_str 0x000020e7 0x56 Bin/Common.o + 0x1f6 (size before relaxing) + .debug_str 0x0000213d 0x22d Bin/Memory.o + 0x7de (size before relaxing) + .debug_str 0x0000236a 0x1d2 Bin/Button.o + 0x788 (size before relaxing) + .debug_str 0x0000253c 0xc0 Bin/Settings.o + 0x590 (size before relaxing) + .debug_str 0x000025fc 0x6 Bin/LED.o + 0x184 (size before relaxing) + .debug_str 0x00002602 0x295 Bin/Terminal.o + 0x7e8 (size before relaxing) + .debug_str 0x00002897 0x3f0 Bin/Commands.o + 0xd8e (size before relaxing) + .debug_str 0x00002c87 0x149 Bin/XModem.o + 0x5ef (size before relaxing) + .debug_str 0x00002dd0 0xc1 Bin/CommandLine.o + 0x5cc (size before relaxing) + .debug_str 0x00002e91 0x1a Bin/Codec.o + 0x2f4 (size before relaxing) + .debug_str 0x00002eab 0x12b9 Bin/ISO14443-2A.o + 0x1adc (size before relaxing) + .debug_str 0x00004164 0x2b0 Bin/MifareClassic.o + 0x601 (size before relaxing) + .debug_str 0x00004414 0x1a Bin/ISO14443-3A.o + 0x1ed (size before relaxing) + .debug_str 0x0000442e 0x95 Bin/Crypto1.o + 0x27b (size before relaxing) + .debug_str 0x000044c3 0x492 Bin/HIDParser.o + 0x6af (size before relaxing) + .debug_str 0x00004955 0x22e Bin/ConfigDescriptors.o + 0x4ed (size before relaxing) + .debug_str 0x00004b83 0xa04 Bin/DeviceStandardReq.o + 0x11eb (size before relaxing) + .debug_str 0x00005587 0x31 Bin/Events.o + 0x19a (size before relaxing) + .debug_str 0x000055b8 0x2b Bin/HostStandardReq.o + 0x194 (size before relaxing) + .debug_str 0x000055e3 0x6d Bin/USBTask.o + 0x466 (size before relaxing) + .debug_str 0x00005650 0x4a Bin/Device_XMEGA.o + 0x5da (size before relaxing) + .debug_str 0x0000569a 0x4d9 Bin/EndpointStream_XMEGA.o + 0x97e (size before relaxing) + .debug_str 0x00005b73 0x2aa Bin/Endpoint_XMEGA.o + 0xaec (size before relaxing) + .debug_str 0x00005e1d 0x2c Bin/Host_XMEGA.o + 0x195 (size before relaxing) + .debug_str 0x00005e49 0x32 Bin/PipeStream_XMEGA.o + 0x19b (size before relaxing) + .debug_str 0x00005e7b 0x2c Bin/Pipe_XMEGA.o + 0x195 (size before relaxing) + .debug_str 0x00005ea7 0x1bb Bin/USBController_XMEGA.o + 0xe7c (size before relaxing) + .debug_str 0x00006062 0xaa Bin/USBInterrupt_XMEGA.o + 0x94d (size before relaxing) + .debug_str 0x0000610c 0x280 Bin/AudioClassDevice.o + 0x7c1 (size before relaxing) + .debug_str 0x0000638c 0x286 Bin/CDCClassDevice.o + 0xb16 (size before relaxing) + .debug_str 0x00006612 0x248 Bin/HIDClassDevice.o + 0xb31 (size before relaxing) + .debug_str 0x0000685a 0x261 Bin/MassStorageClassDevice.o + 0x914 (size before relaxing) + .debug_str 0x00006abb 0x115 Bin/MIDIClassDevice.o + 0x76b (size before relaxing) + .debug_str 0x00006bd0 0x269 Bin/PrinterClassDevice.o + 0xa3f (size before relaxing) + .debug_str 0x00006e39 0x6e5 Bin/RNDISClassDevice.o + 0xe74 (size before relaxing) + .debug_str 0x0000751e 0x3b Bin/AndroidAccessoryClassHost.o + 0x1a4 (size before relaxing) + .debug_str 0x00007559 0x30 Bin/AudioClassHost.o + 0x199 (size before relaxing) + .debug_str 0x00007589 0x2e Bin/CDCClassHost.o + 0x197 (size before relaxing) + .debug_str 0x000075b7 0x2e Bin/HIDClassHost.o + 0x197 (size before relaxing) + .debug_str 0x000075e5 0x36 Bin/MassStorageClassHost.o + 0x19f (size before relaxing) + .debug_str 0x0000761b 0x2f Bin/MIDIClassHost.o + 0x198 (size before relaxing) + .debug_str 0x0000764a 0x32 Bin/PrinterClassHost.o + 0x19b (size before relaxing) + .debug_str 0x0000767c 0x30 Bin/RNDISClassHost.o + 0x199 (size before relaxing) + .debug_str 0x000076ac 0x35 Bin/StillImageClassHost.o + 0x19e (size before relaxing) + +.debug_loc 0x00000000 0xc84e + *(.debug_loc) + .debug_loc 0x00000000 0x253 Bin/LUFADescriptors.o + .debug_loc 0x00000253 0x2f Bin/System.o + .debug_loc 0x00000282 0x4e7 Bin/Configuration.o + .debug_loc 0x00000769 0xde Bin/Random.o + .debug_loc 0x00000847 0x34b Bin/Common.o + .debug_loc 0x00000b92 0xcbd Bin/Memory.o + .debug_loc 0x0000184f 0x810 Bin/Button.o + .debug_loc 0x0000205f 0x1a6 Bin/Settings.o + .debug_loc 0x00002205 0x214 Bin/Terminal.o + .debug_loc 0x00002419 0xa5a Bin/Commands.o + .debug_loc 0x00002e73 0x390 Bin/XModem.o + .debug_loc 0x00003203 0x670 Bin/CommandLine.o + .debug_loc 0x00003873 0x4a4 Bin/ISO14443-2A.o + .debug_loc 0x00003d17 0x972 Bin/MifareClassic.o + .debug_loc 0x00004689 0x317 Bin/ISO14443-3A.o + .debug_loc 0x000049a0 0x7ad Bin/Crypto1.o + .debug_loc 0x0000514d 0xf2d Bin/HIDParser.o + .debug_loc 0x0000607a 0x592 Bin/ConfigDescriptors.o + .debug_loc 0x0000660c 0x2d8 Bin/DeviceStandardReq.o + .debug_loc 0x000068e4 0x22 Bin/USBTask.o + .debug_loc 0x00006906 0x2acb Bin/EndpointStream_XMEGA.o + .debug_loc 0x000093d1 0x58b Bin/Endpoint_XMEGA.o + .debug_loc 0x0000995c 0x80 Bin/USBController_XMEGA.o + .debug_loc 0x000099dc 0x200 Bin/USBInterrupt_XMEGA.o + .debug_loc 0x00009bdc 0x37f Bin/AudioClassDevice.o + .debug_loc 0x00009f5b 0xa0b Bin/CDCClassDevice.o + .debug_loc 0x0000a966 0x3e7 Bin/HIDClassDevice.o + .debug_loc 0x0000ad4d 0x29f Bin/MassStorageClassDevice.o + .debug_loc 0x0000afec 0x33c Bin/MIDIClassDevice.o + .debug_loc 0x0000b328 0x8cd Bin/PrinterClassDevice.o + .debug_loc 0x0000bbf5 0xc59 Bin/RNDISClassDevice.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 0x16c8 + *(.debug_ranges) + .debug_ranges 0x00000000 0x28 Bin/Chameleon-Mini.o + .debug_ranges 0x00000028 0x10 Bin/LUFADescriptors.o + .debug_ranges 0x00000038 0x40 Bin/System.o + .debug_ranges 0x00000078 0xb8 Bin/Configuration.o + .debug_ranges 0x00000130 0x28 Bin/Random.o + .debug_ranges 0x00000158 0x48 Bin/Common.o + .debug_ranges 0x000001a0 0x298 Bin/Memory.o + .debug_ranges 0x00000438 0xa0 Bin/Button.o + .debug_ranges 0x000004d8 0x40 Bin/Settings.o + .debug_ranges 0x00000518 0xb8 Bin/Terminal.o + .debug_ranges 0x000005d0 0xf0 Bin/Commands.o + .debug_ranges 0x000006c0 0x40 Bin/XModem.o + .debug_ranges 0x00000700 0xc0 Bin/CommandLine.o + .debug_ranges 0x000007c0 0xc0 Bin/ISO14443-2A.o + .debug_ranges 0x00000880 0x158 Bin/MifareClassic.o + .debug_ranges 0x000009d8 0x18 Bin/ISO14443-3A.o + .debug_ranges 0x000009f0 0x40 Bin/Crypto1.o + .debug_ranges 0x00000a30 0x108 Bin/HIDParser.o + .debug_ranges 0x00000b38 0x40 Bin/ConfigDescriptors.o + .debug_ranges 0x00000b78 0xf0 Bin/DeviceStandardReq.o + .debug_ranges 0x00000c68 0x10 Bin/Events.o + .debug_ranges 0x00000c78 0x38 Bin/USBTask.o + .debug_ranges 0x00000cb0 0x10 Bin/Device_XMEGA.o + .debug_ranges 0x00000cc0 0x4f0 Bin/EndpointStream_XMEGA.o + .debug_ranges 0x000011b0 0xf8 Bin/Endpoint_XMEGA.o + .debug_ranges 0x000012a8 0x20 Bin/USBController_XMEGA.o + .debug_ranges 0x000012c8 0x20 Bin/USBInterrupt_XMEGA.o + .debug_ranges 0x000012e8 0x38 Bin/AudioClassDevice.o + .debug_ranges 0x00001320 0x100 Bin/CDCClassDevice.o + .debug_ranges 0x00001420 0x20 Bin/HIDClassDevice.o + .debug_ranges 0x00001440 0x80 Bin/MassStorageClassDevice.o + .debug_ranges 0x000014c0 0x48 Bin/MIDIClassDevice.o + .debug_ranges 0x00001508 0x128 Bin/PrinterClassDevice.o + .debug_ranges 0x00001630 0x98 Bin/RNDISClassDevice.o + +.debug_macro + *(.debug_macro) +OUTPUT(Chameleon-Mini.elf elf32-avr) +LOAD linker stubs + +Cross Reference Table + +Symbol File +ActiveConfiguration Bin/Configuration.o + Bin/MifareClassic.o + Bin/ISO14443-2A.o + Bin/Commands.o + Bin/Button.o + Bin/Chameleon-Mini.o +Audio_Device_ConfigureEndpoints Bin/AudioClassDevice.o +Audio_Device_Event_Stub Bin/AudioClassDevice.o +Audio_Device_ProcessControlRequest Bin/AudioClassDevice.o +BufferToHexString Bin/Common.o + Bin/Commands.o +ButtonGetActionByName Bin/Button.o + Bin/Commands.o +ButtonGetActionList Bin/Button.o + Bin/Commands.o +ButtonInit Bin/Button.o + Bin/Chameleon-Mini.o +ButtonSetActionById Bin/Button.o +ButtonSetActionByName Bin/Button.o + Bin/Commands.o +ButtonTick Bin/Button.o + Bin/Chameleon-Mini.o +CALLBACK_Audio_Device_GetSetEndpointProperty Bin/AudioClassDevice.o +CALLBACK_Audio_Device_GetSetInterfaceProperty Bin/AudioClassDevice.o +CALLBACK_HIDParser_FilterHIDReportItem Bin/HIDParser.o +CALLBACK_HID_Device_CreateHIDReport Bin/HIDClassDevice.o +CALLBACK_HID_Device_ProcessHIDReport Bin/HIDClassDevice.o +CALLBACK_MS_Device_SCSICommandReceived Bin/MassStorageClassDevice.o +CALLBACK_USB_GetDescriptor Bin/LUFADescriptors.o + Bin/DeviceStandardReq.o +CDC_Device_BytesReceived Bin/CDCClassDevice.o +CDC_Device_ConfigureEndpoints Bin/CDCClassDevice.o + Bin/Terminal.o +CDC_Device_CreateBlockingStream Bin/CDCClassDevice.o +CDC_Device_CreateStream Bin/CDCClassDevice.o +CDC_Device_Event_Stub Bin/CDCClassDevice.o +CDC_Device_Flush Bin/CDCClassDevice.o +CDC_Device_ProcessControlRequest Bin/CDCClassDevice.o + Bin/Terminal.o +CDC_Device_ReceiveByte Bin/CDCClassDevice.o + Bin/Terminal.o +CDC_Device_SendByte Bin/CDCClassDevice.o + Bin/XModem.o + Bin/Terminal.o +CDC_Device_SendControlLineStateChange Bin/CDCClassDevice.o +CDC_Device_SendData Bin/CDCClassDevice.o + Bin/Terminal.o +CDC_Device_SendString Bin/CDCClassDevice.o + Bin/Terminal.o +CDC_Device_USBTask Bin/CDCClassDevice.o + Bin/Terminal.o +CodecBuffer Bin/Codec.o + Bin/ISO14443-2A.o +CommandExecButton Bin/Commands.o + Bin/CommandLine.o +CommandExecClear Bin/Commands.o + Bin/CommandLine.o +CommandExecConfig Bin/Commands.o + Bin/CommandLine.o +CommandExecDownload Bin/Commands.o + Bin/CommandLine.o +CommandExecHelp Bin/Commands.o + Bin/CommandLine.o +CommandExecReset Bin/Commands.o + Bin/CommandLine.o +CommandExecUpgrade Bin/Commands.o + Bin/CommandLine.o +CommandExecUpload Bin/Commands.o + Bin/CommandLine.o +CommandGetButton Bin/Commands.o + Bin/CommandLine.o +CommandGetConfig Bin/Commands.o + Bin/CommandLine.o +CommandGetMemSize Bin/Commands.o + Bin/CommandLine.o +CommandGetReadOnly Bin/Commands.o + Bin/CommandLine.o +CommandGetRssi Bin/Commands.o + Bin/CommandLine.o +CommandGetSetting Bin/Commands.o + Bin/CommandLine.o +CommandGetUid Bin/Commands.o + Bin/CommandLine.o +CommandGetUidSize Bin/Commands.o + Bin/CommandLine.o +CommandGetVersion Bin/Commands.o + Bin/CommandLine.o +CommandLineInit Bin/CommandLine.o +CommandLineProcessByte Bin/CommandLine.o + Bin/Terminal.o +CommandLineTick Bin/CommandLine.o + Bin/Terminal.o +CommandSetButton Bin/Commands.o + Bin/CommandLine.o +CommandSetConfig Bin/Commands.o + Bin/CommandLine.o +CommandSetReadOnly Bin/Commands.o + Bin/CommandLine.o +CommandSetSetting Bin/Commands.o + Bin/CommandLine.o +CommandSetUid Bin/Commands.o + Bin/CommandLine.o +CommandTable Bin/CommandLine.o + Bin/Commands.o +ConfigurationDescriptor Bin/LUFADescriptors.o +ConfigurationGetList Bin/Configuration.o + Bin/Commands.o +ConfigurationInit Bin/Configuration.o + Bin/Settings.o + Bin/Chameleon-Mini.o +ConfigurationSetById Bin/Configuration.o +ConfigurationSetByName Bin/Configuration.o + Bin/Commands.o +Crypto1Auth Bin/Crypto1.o + Bin/MifareClassic.o +Crypto1Byte Bin/Crypto1.o + Bin/MifareClassic.o +Crypto1FilterOutput Bin/Crypto1.o + Bin/MifareClassic.o +Crypto1Nibble Bin/Crypto1.o + Bin/MifareClassic.o +Crypto1PRNG Bin/Crypto1.o + Bin/MifareClassic.o +Crypto1Setup Bin/Crypto1.o + Bin/MifareClassic.o +DeviceDescriptor Bin/LUFADescriptors.o +EVENT_Audio_Device_StreamStartStop Bin/AudioClassDevice.o +EVENT_CDC_Device_BreakSent Bin/CDCClassDevice.o +EVENT_CDC_Device_ControLineStateChanged Bin/CDCClassDevice.o +EVENT_CDC_Device_LineEncodingChanged Bin/CDCClassDevice.o +EVENT_PRNT_Device_SoftReset Bin/PrinterClassDevice.o +EVENT_USB_Device_ConfigurationChanged Bin/Terminal.o + Bin/DeviceStandardReq.o +EVENT_USB_Device_Connect Bin/Terminal.o + Bin/USBInterrupt_XMEGA.o +EVENT_USB_Device_ControlRequest Bin/Terminal.o + Bin/DeviceStandardReq.o +EVENT_USB_Device_Disconnect Bin/Terminal.o + Bin/USBInterrupt_XMEGA.o +EVENT_USB_Device_Reset Bin/Events.o + Bin/USBInterrupt_XMEGA.o +EVENT_USB_Device_StartOfFrame Bin/Events.o + Bin/USBInterrupt_XMEGA.o +EVENT_USB_Device_Suspend Bin/Events.o +EVENT_USB_Device_WakeUp Bin/Events.o +Endpoint_ClearEndpoints Bin/Endpoint_XMEGA.o + Bin/USBInterrupt_XMEGA.o +Endpoint_ClearIN Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +Endpoint_ClearOUT Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +Endpoint_ClearSETUP Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o + Bin/DeviceStandardReq.o +Endpoint_ClearStatusStage Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o + Bin/DeviceStandardReq.o +Endpoint_ConfigureEndpointTable Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o +Endpoint_ConfigureEndpoint_PRV Bin/Endpoint_XMEGA.o + Bin/USBInterrupt_XMEGA.o + Bin/USBController_XMEGA.o +Endpoint_Discard_Stream Bin/EndpointStream_XMEGA.o +Endpoint_IsINReady Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +Endpoint_IsOUTReceived Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o +Endpoint_IsSETUPReceived Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/USBTask.o + Bin/DeviceStandardReq.o +Endpoint_Null_Stream Bin/EndpointStream_XMEGA.o +Endpoint_Read_8 Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +Endpoint_Read_Control_EStream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Read_Control_EStream_LE Bin/EndpointStream_XMEGA.o +Endpoint_Read_Control_Stream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Read_Control_Stream_LE Bin/EndpointStream_XMEGA.o + Bin/RNDISClassDevice.o + Bin/HIDClassDevice.o + Bin/AudioClassDevice.o +Endpoint_Read_EStream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Read_EStream_LE Bin/EndpointStream_XMEGA.o +Endpoint_Read_Stream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Read_Stream_LE Bin/EndpointStream_XMEGA.o + Bin/RNDISClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o +Endpoint_SelectEndpoint Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/USBTask.o + Bin/DeviceStandardReq.o +Endpoint_StallTransaction Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/MassStorageClassDevice.o + Bin/DeviceStandardReq.o +Endpoint_WaitUntilReady Bin/Endpoint_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o +Endpoint_Write_8 Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +Endpoint_Write_Control_EStream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Write_Control_EStream_LE Bin/EndpointStream_XMEGA.o +Endpoint_Write_Control_PStream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Write_Control_PStream_LE Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +Endpoint_Write_Control_Stream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Write_Control_Stream_LE Bin/EndpointStream_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/HIDClassDevice.o + Bin/AudioClassDevice.o + Bin/DeviceStandardReq.o +Endpoint_Write_EStream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Write_EStream_LE Bin/EndpointStream_XMEGA.o +Endpoint_Write_PStream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Write_PStream_LE Bin/EndpointStream_XMEGA.o +Endpoint_Write_Stream_BE Bin/EndpointStream_XMEGA.o +Endpoint_Write_Stream_LE Bin/EndpointStream_XMEGA.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o +GlobalSettings Bin/Settings.o + Bin/Button.o + Bin/Memory.o + Bin/Configuration.o +HID_Device_ConfigureEndpoints Bin/HIDClassDevice.o +HID_Device_ProcessControlRequest Bin/HIDClassDevice.o +HID_Device_USBTask Bin/HIDClassDevice.o +HexStringToBuffer Bin/Common.o + Bin/Commands.o +ISO14443AAppendCRCA Bin/ISO14443-3A.o + Bin/MifareClassic.o +ISO14443ACheckCRCA Bin/ISO14443-3A.o + Bin/MifareClassic.o +ISO14443ACodecInit Bin/ISO14443-2A.o + Bin/Configuration.o +ISO14443ACodecTask Bin/ISO14443-2A.o + Bin/Configuration.o +LEDPulseMask Bin/LED.o + Bin/Terminal.o + Bin/Chameleon-Mini.o +LanguageString Bin/LUFADescriptors.o +MIDI_Device_ConfigureEndpoints Bin/MIDIClassDevice.o +MIDI_Device_Flush Bin/MIDIClassDevice.o +MIDI_Device_ReceiveEventPacket Bin/MIDIClassDevice.o +MIDI_Device_SendEventPacket Bin/MIDIClassDevice.o +MIDI_Device_USBTask Bin/MIDIClassDevice.o +MS_Device_ConfigureEndpoints Bin/MassStorageClassDevice.o +MS_Device_ProcessControlRequest Bin/MassStorageClassDevice.o +MS_Device_USBTask Bin/MassStorageClassDevice.o +ManufacturerString Bin/LUFADescriptors.o +MemoryClear Bin/Memory.o + Bin/Commands.o +MemoryDownloadBlock Bin/Memory.o + Bin/Commands.o +MemoryInit Bin/Memory.o + Bin/Chameleon-Mini.o +MemoryReadBlock Bin/Memory.o + Bin/MifareClassic.o +MemoryRecall Bin/Memory.o + Bin/Settings.o + Bin/Button.o +MemoryStore Bin/Memory.o + Bin/Settings.o + Bin/Button.o +MemoryUploadBlock Bin/Memory.o + Bin/Commands.o +MemoryWriteBlock Bin/Memory.o + Bin/MifareClassic.o +MifareClassicAppInit1K Bin/MifareClassic.o + Bin/Configuration.o +MifareClassicAppInit4K Bin/MifareClassic.o + Bin/Configuration.o +MifareClassicAppProcess Bin/MifareClassic.o + Bin/Configuration.o +MifareClassicAppReset Bin/MifareClassic.o + Bin/Configuration.o +MifareClassicAppTask Bin/MifareClassic.o + Bin/Configuration.o +MifareClassicGetUid Bin/MifareClassic.o + Bin/Configuration.o +MifareClassicSetUid Bin/MifareClassic.o + Bin/Configuration.o +PRNT_Device_BytesReceived Bin/PrinterClassDevice.o +PRNT_Device_ConfigureEndpoints Bin/PrinterClassDevice.o +PRNT_Device_CreateBlockingStream Bin/PrinterClassDevice.o +PRNT_Device_CreateStream Bin/PrinterClassDevice.o +PRNT_Device_Event_Stub Bin/PrinterClassDevice.o +PRNT_Device_Flush Bin/PrinterClassDevice.o +PRNT_Device_ProcessControlRequest Bin/PrinterClassDevice.o +PRNT_Device_ReceiveByte Bin/PrinterClassDevice.o +PRNT_Device_SendByte Bin/PrinterClassDevice.o +PRNT_Device_SendData Bin/PrinterClassDevice.o +PRNT_Device_SendString Bin/PrinterClassDevice.o +PRNT_Device_USBTask Bin/PrinterClassDevice.o +ProductString Bin/LUFADescriptors.o +RNDIS_Device_ConfigureEndpoints Bin/RNDISClassDevice.o +RNDIS_Device_IsPacketReceived Bin/RNDISClassDevice.o +RNDIS_Device_ProcessControlRequest Bin/RNDISClassDevice.o +RNDIS_Device_ReadPacket Bin/RNDISClassDevice.o +RNDIS_Device_SendPacket Bin/RNDISClassDevice.o +RNDIS_Device_USBTask Bin/RNDISClassDevice.o +RandomGetBuffer Bin/Random.o + Bin/MifareClassic.o +RandomGetByte Bin/Random.o + Bin/Commands.o + Bin/Button.o +RandomInit Bin/Random.o + Bin/Chameleon-Mini.o +RandomTick Bin/Random.o + Bin/Chameleon-Mini.o +SettingsCycle Bin/Settings.o + Bin/Button.o +SettingsGetActiveById Bin/Settings.o +SettingsGetActiveByName Bin/Settings.o + Bin/Commands.o +SettingsLoad Bin/Settings.o + Bin/Chameleon-Mini.o +SettingsSave Bin/Settings.o + Bin/Commands.o +SettingsSetActiveById Bin/Settings.o +SettingsSetActiveByName Bin/Settings.o + Bin/Commands.o +StoredSettings Bin/Settings.o +SystemEnterBootloader Bin/System.o + Bin/Commands.o +SystemInit Bin/System.o + Bin/Chameleon-Mini.o +SystemInterruptInit Bin/System.o + Bin/Chameleon-Mini.o +SystemReset Bin/System.o + Bin/Commands.o +SystemStartUSBClock Bin/System.o + Bin/Terminal.o +SystemStopUSBClock Bin/System.o + Bin/Terminal.o +TerminalBuffer Bin/Terminal.o + Bin/CommandLine.o + Bin/XModem.o +TerminalHandle Bin/Terminal.o + Bin/XModem.o +TerminalInit Bin/Terminal.o + Bin/Chameleon-Mini.o +TerminalSendBlock Bin/Terminal.o + Bin/XModem.o +TerminalSendString Bin/Terminal.o + Bin/CommandLine.o +TerminalSendStringP Bin/Terminal.o + Bin/CommandLine.o +TerminalState Bin/Terminal.o +TerminalTask Bin/Terminal.o + Bin/Chameleon-Mini.o +TerminalTick Bin/Terminal.o + Bin/Chameleon-Mini.o +USB_ControlRequest Bin/USBTask.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/AudioClassDevice.o + Bin/Endpoint_XMEGA.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.o +USB_DeviceState Bin/USBTask.o + Bin/RNDISClassDevice.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/MassStorageClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/USBInterrupt_XMEGA.o + Bin/USBController_XMEGA.o + Bin/Endpoint_XMEGA.o + Bin/EndpointStream_XMEGA.o + Bin/DeviceStandardReq.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 +USB_Device_ProcessControlRequest Bin/DeviceStandardReq.o + Bin/USBTask.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/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/DeviceStandardReq.o +USB_Endpoint_SelectedEndpoint Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/USBTask.o +USB_Endpoint_SelectedFIFO Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/MIDIClassDevice.o + Bin/HIDClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o +USB_Endpoint_SelectedHandle Bin/Endpoint_XMEGA.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/DeviceStandardReq.o +USB_Event_Stub Bin/Events.o +USB_GetHIDReportItemInfo Bin/HIDParser.o +USB_GetHIDReportSize Bin/HIDParser.o +USB_GetNextDescriptorComp Bin/ConfigDescriptors.o +USB_GetNextDescriptorOfType Bin/ConfigDescriptors.o +USB_GetNextDescriptorOfTypeAfter Bin/ConfigDescriptors.o +USB_GetNextDescriptorOfTypeBefore Bin/ConfigDescriptors.o +USB_INT_ClearAllInterrupts Bin/USBInterrupt_XMEGA.o + Bin/USBController_XMEGA.o +USB_INT_DisableAllInterrupts Bin/USBInterrupt_XMEGA.o + Bin/USBController_XMEGA.o +USB_Init Bin/USBController_XMEGA.o + Bin/Terminal.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 +USB_USBTask Bin/USBTask.o + Bin/PrinterClassDevice.o + Bin/MassStorageClassDevice.o + Bin/CDCClassDevice.o + Bin/EndpointStream_XMEGA.o + Bin/Terminal.o +XModemProcessByte Bin/XModem.o + Bin/Terminal.o +XModemReceive Bin/XModem.o + Bin/Commands.o +XModemSend Bin/XModem.o + Bin/Commands.o +XModemTick Bin/XModem.o + Bin/Terminal.o +__bad_interrupt /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__bss_end /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) +__bss_start /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) +__data_end /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) +__data_load_start /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) +__data_start /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) +__divmodsi4 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) +__do_clear_bss /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_clear_bss.o) + Bin/USBController_XMEGA.o + Bin/Endpoint_XMEGA.o + Bin/USBTask.o + Bin/DeviceStandardReq.o + Bin/Crypto1.o + Bin/MifareClassic.o + Bin/ISO14443-2A.o + Bin/Codec.o + Bin/CommandLine.o + Bin/XModem.o + Bin/Terminal.o + Bin/LED.o + Bin/Settings.o + Bin/Button.o + Bin/Memory.o + Bin/Configuration.o +__do_copy_data /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_copy_data.o) + /home/sk/avr8-gnu-toolchain-linux_x86/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 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + Bin/Settings.o +__eerd_byte_x32a4u /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + Bin/EndpointStream_XMEGA.o +__eeupd_byte_x32a4u /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) + Bin/EndpointStream_XMEGA.o +__eeupd_r18_x32a4u /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) +__eewr_block_x32a4u /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + Bin/Settings.o +__eewr_byte_x32a4u /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) +__eewr_r18_x32a4u /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_byte_atxmega32a4u.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eewr_block_atxmega32a4u.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) +__epilogue_restores__ /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_epilogue.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) +__heap_end /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__init /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__mulohisi3 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) +__mulshisi3 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) + Bin/Commands.o +__muluhisi3 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_mulshisi3.o) +__negsi2 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_negsi2.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) +__prologue_saves__ /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_prologue.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) +__stack /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__tablejump2__ /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) + Bin/DeviceStandardReq.o + Bin/HIDParser.o + Bin/MifareClassic.o + Bin/ISO14443-2A.o + Bin/XModem.o +__tablejump__ /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_tablejump.o) +__udivmodsi4 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_udivmodsi4.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_divmodsi4.o) +__ultoa_invert /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(ultoa_invert.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) +__umulhisi3 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_umulhisi3.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_muluhisi3.o) +__vector_1 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_10 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_100 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_101 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_102 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_103 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_104 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_105 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_106 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_107 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_108 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_109 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_11 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_110 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_111 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_112 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_113 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_114 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_115 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_116 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_117 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_118 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_119 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_12 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_120 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_121 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_122 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_123 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_124 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_125 Bin/USBInterrupt_XMEGA.o + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_126 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_13 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_14 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_15 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_16 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_17 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_18 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_19 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_2 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_20 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_21 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_22 Bin/ISO14443-2A.o + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_23 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_24 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_25 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_26 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_27 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_28 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_29 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_3 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_30 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_31 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_32 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_33 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_34 Bin/ISO14443-2A.o + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_35 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_36 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_37 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_38 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_39 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_4 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_40 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_41 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_42 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_43 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_44 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_45 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_46 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_47 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_48 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_49 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_5 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_50 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_51 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_52 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_53 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_54 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_55 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_56 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_57 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_58 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_59 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_6 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_60 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_61 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_62 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_63 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_64 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_65 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_66 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_67 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_68 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_69 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_7 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_70 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_71 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_72 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_73 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_74 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_75 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_76 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_77 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_78 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_79 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_8 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_80 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_81 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_82 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_83 Bin/ISO14443-2A.o + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_84 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_85 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_86 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_87 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_88 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_89 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_9 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_90 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_91 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_92 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_93 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_94 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_95 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_96 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_97 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_98 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_99 /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vector_default Bin/System.o + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +__vectors /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +_exit /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) +eeprom_mapen /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_byte_atxmega32a4u.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eeupd_byte_atxmega32a4u.o) +exit /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/avrxmega2/libgcc.a(_exit.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +fputc /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(fputc.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) +main Bin/Chameleon-Mini.o + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +memcmp /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcmp.o) + Bin/HIDClassDevice.o +memcpy /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(eerd_block_atxmega32a4u.o) + Bin/RNDISClassDevice.o + Bin/HIDClassDevice.o +memcpy_P /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memcpy_P.o) + Bin/RNDISClassDevice.o + Bin/Configuration.o +memset /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(memset.o) + Bin/HIDClassDevice.o +rand /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) + Bin/Random.o +rand_r /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) +snprintf_P /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(snprintf_p.o) + Bin/Commands.o +srand /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(rand.o) +strcmp_P /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strcmp_P.o) + Bin/CommandLine.o + Bin/Commands.o + Bin/Button.o +strncpy_P /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strncpy_P.o) + Bin/Button.o +strnlen /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) +strnlen_P /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(strnlen_P.o) + /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) +vfprintf /home/sk/avr8-gnu-toolchain-linux_x86/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/libc.a(vfprintf_std.o) + /home/sk/avr8-gnu-toolchain-linux_x86/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 1816f9e..0f11987 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.sym +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.sym @@ -1,732 +1,731 @@ - U CALLBACK_Audio_Device_GetSetEndpointProperty - U CALLBACK_Audio_Device_GetSetInterfaceProperty - U CALLBACK_HID_Device_CreateHIDReport - U CALLBACK_HID_Device_ProcessHIDReport - U CALLBACK_HIDParser_FilterHIDReportItem - U CALLBACK_MS_Device_SCSICommandReceived -00000000 W __heap_end -00000000 a __tmp_reg__ -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 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 a __tmp_reg__ -00000000 a __tmp_reg__ -00000000 T __vectors -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__ -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__ -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__ -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__ -00000034 a __CCP__ -00000034 a __CCP__ -00000034 a __CCP__ -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__ -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__ -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__ -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__ -0000003e a __SP_H__ -0000003e a __SP_H__ -0000003e a __SP_H__ -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__ -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__ -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 -000002f7 t ButtonActionTable -00000417 t __c.6293 -00000450 t __c.6295 -00000457 t __c.6297 -0000045e t __c.6299 -00000464 t __c.6304 -00000467 t __c.6322 -0000046e t __c.6349 -00000471 t __c.6354 -00000474 t __c.6393 -0000047b T CommandTable -000005db t __c.6083 -000005de t __c.6085 -000005e1 t StatusTable -000006a8 T __ctors_end -000006a8 T __ctors_start -000006a8 T __dtors_end -000006a8 T __dtors_start -000006a8 W __init -000006a8 T __trampolines_end -000006a8 T __trampolines_start -000006b4 T __do_copy_data -000006ca T __do_clear_bss -000006d2 t .do_clear_bss_loop -000006d4 t .do_clear_bss_start -000006e0 T __bad_interrupt -000006e0 W __vector_1 -000006e0 W __vector_10 -000006e0 W __vector_100 -000006e0 W __vector_101 -000006e0 W __vector_102 -000006e0 W __vector_103 -000006e0 W __vector_104 -000006e0 W __vector_105 -000006e0 W __vector_106 -000006e0 W __vector_107 -000006e0 W __vector_108 -000006e0 W __vector_109 -000006e0 W __vector_11 -000006e0 W __vector_110 -000006e0 W __vector_111 -000006e0 W __vector_112 -000006e0 W __vector_113 -000006e0 W __vector_114 -000006e0 W __vector_115 -000006e0 W __vector_116 -000006e0 W __vector_117 -000006e0 W __vector_118 -000006e0 W __vector_119 -000006e0 W __vector_12 -000006e0 W __vector_120 -000006e0 W __vector_121 -000006e0 W __vector_122 -000006e0 W __vector_123 -000006e0 W __vector_124 -000006e0 W __vector_126 -000006e0 W __vector_13 -000006e0 W __vector_14 -000006e0 W __vector_15 -000006e0 W __vector_16 -000006e0 W __vector_17 -000006e0 W __vector_18 -000006e0 W __vector_19 -000006e0 W __vector_2 -000006e0 W __vector_20 -000006e0 W __vector_21 -000006e0 W __vector_23 -000006e0 W __vector_24 -000006e0 W __vector_25 -000006e0 W __vector_26 -000006e0 W __vector_27 -000006e0 W __vector_28 -000006e0 W __vector_29 -000006e0 W __vector_3 -000006e0 W __vector_30 -000006e0 W __vector_31 -000006e0 W __vector_32 -000006e0 W __vector_33 -000006e0 W __vector_35 -000006e0 W __vector_36 -000006e0 W __vector_37 -000006e0 W __vector_38 -000006e0 W __vector_39 -000006e0 W __vector_4 -000006e0 W __vector_40 -000006e0 W __vector_41 -000006e0 W __vector_42 -000006e0 W __vector_43 -000006e0 W __vector_44 -000006e0 W __vector_45 -000006e0 W __vector_46 -000006e0 W __vector_47 -000006e0 W __vector_48 -000006e0 W __vector_49 -000006e0 W __vector_5 -000006e0 W __vector_50 -000006e0 W __vector_51 -000006e0 W __vector_52 -000006e0 W __vector_53 -000006e0 W __vector_54 -000006e0 W __vector_55 -000006e0 W __vector_56 -000006e0 W __vector_57 -000006e0 W __vector_58 -000006e0 W __vector_59 -000006e0 W __vector_6 -000006e0 W __vector_60 -000006e0 W __vector_61 -000006e0 W __vector_62 -000006e0 W __vector_63 -000006e0 W __vector_64 -000006e0 W __vector_65 -000006e0 W __vector_66 -000006e0 W __vector_67 -000006e0 W __vector_68 -000006e0 W __vector_69 -000006e0 W __vector_7 -000006e0 W __vector_70 -000006e0 W __vector_71 -000006e0 W __vector_72 -000006e0 W __vector_73 -000006e0 W __vector_74 -000006e0 W __vector_75 -000006e0 W __vector_76 -000006e0 W __vector_77 -000006e0 W __vector_78 -000006e0 W __vector_79 -000006e0 W __vector_8 -000006e0 W __vector_80 -000006e0 W __vector_81 -000006e0 W __vector_82 -000006e0 W __vector_84 -000006e0 W __vector_85 -000006e0 W __vector_86 -000006e0 W __vector_87 -000006e0 W __vector_88 -000006e0 W __vector_89 -000006e0 W __vector_9 -000006e0 W __vector_90 -000006e0 W __vector_91 -000006e0 W __vector_92 -000006e0 W __vector_93 -000006e0 W __vector_94 -000006e0 W __vector_95 -000006e0 W __vector_96 -000006e0 W __vector_97 -000006e0 W __vector_98 -000006e0 W __vector_99 -000006e2 T main -00000758 T CALLBACK_USB_GetDescriptor -000007da T __vector_default -000007e6 T SystemInit -00000854 T SystemReset -00000862 T SystemEnterBootloader -0000086e T SystemStartUSBClock -000008a0 T SystemStopUSBClock -000008bc T SystemInterruptInit -000008c8 t CodecInitDummy -000008ca t CodecTaskDummy -000008cc t ApplicationInitDummy -000008ce t ApplicationResetDummy -000008d0 t ApplicationTaskDummy -000008d2 t ApplicationProcessDummy -000008d8 t ApplicationGetUidDummy -000008da t ApplicationSetUidDummy -000008dc T ConfigurationSetById -00000912 T ConfigurationInit -0000091e T ConfigurationSetByName -000009a0 T ConfigurationGetList -000009fe T RandomInit -00000a00 T RandomGetByte -00000a06 T RandomGetBuffer -00000a24 T RandomTick -00000a34 T BufferToHexString -00000ab8 T HexStringToBuffer -00000b44 T MemoryReadBlock -00000b74 T MemoryWriteBlock -00000ba6 T MemoryClear -00000bb6 T MemoryRecall -00000ca2 T MemoryInit -00000d9e T MemoryStore -00001020 T MemoryUploadBlock -000013e2 T MemoryDownloadBlock -0000145c T ButtonInit -0000146a T ButtonTick -00001634 T ButtonGetActionList -00001698 T ButtonSetActionById -000016a4 T ButtonGetActionByName -000016c0 T ButtonSetActionByName -00001776 T SettingsLoad -00001786 T SettingsSave -00001796 T SettingsSetActiveById -000017c2 T SettingsCycle -0000189c T SettingsGetActiveById -000018a2 T SettingsGetActiveByName -000018b6 T SettingsSetActiveByName -000018d0 T TerminalSendString -000018da T TerminalSendStringP -00001902 T TerminalSendBlock -0000190e T TerminalInit -00001918 T TerminalTask -00001956 T TerminalTick -000019d6 T EVENT_USB_Device_Connect -000019e0 T EVENT_USB_Device_Disconnect -000019ea T EVENT_USB_Device_ConfigurationChanged -000019f2 T EVENT_USB_Device_ControlRequest -000019fa T CommandGetVersion -00001a36 T CommandGetConfig -00001a62 T CommandSetConfig -00001a74 T CommandExecConfig -00001a80 T CommandGetUid -00001ace T CommandSetUid -00001b80 T CommandGetReadOnly -00001ba4 T CommandSetReadOnly -00001bcc T CommandExecUpload -00001bd6 T CommandExecDownload -00001be0 T CommandExecReset -00001bf6 T CommandExecUpgrade -00001c0c T CommandGetMemSize -00001c3c T CommandGetUidSize -00001c68 T CommandExecButton -00001c72 T CommandGetButton -00001c7c T CommandSetButton -00001c8c T CommandGetSetting -00001c96 T CommandSetSetting -00001ca6 T CommandExecClear -00001cae T CommandExecHelp -00001d46 T CommandGetRssi -00001dae t CalcChecksum.constprop.0 -00001dc2 T XModemReceive -00001df2 T XModemSend -00001e18 T XModemProcessByte -0000209c T XModemTick -000020f8 T CommandLineProcessByte -0000243a T CommandLineTick -0000243c t StartDemod -00002478 T __vector_34 -00002500 T __vector_22 -00002648 T __vector_83 -0000282a T ISO14443ACodecInit -00002898 T ISO14443ACodecTask -00002994 T MifareClassicAppInit1K -000029ae T MifareClassicAppInit4K -000029c8 T MifareClassicAppReset -000029d0 T MifareClassicAppTask -000029d2 T MifareClassicAppProcess -00002fff W __stack -000032cc T MifareClassicGetUid -000032d8 T MifareClassicSetUid -00003318 T ISO14443AAppendCRCA -00003376 T ISO14443ACheckCRCA -000033f4 t Crypto1LFSR -00003480 T Crypto1FilterOutput -000034e8 T Crypto1Setup -00003828 T Crypto1Auth -0000387a T Crypto1Byte -000038fc T Crypto1Nibble -00003944 T Crypto1PRNG -000039fa T USB_Device_ProcessControlRequest -00003c90 W EVENT_USB_Device_Reset -00003c90 W EVENT_USB_Device_StartOfFrame -00003c90 W EVENT_USB_Device_Suspend -00003c90 W EVENT_USB_Device_WakeUp -00003c90 T USB_Event_Stub -00003c92 T USB_USBTask -00003cbc T Endpoint_Write_Stream_LE -00003d94 T Endpoint_Write_Control_Stream_LE -00003ed6 T Endpoint_Write_Control_PStream_LE -00004014 T Endpoint_ClearIN -00004046 T Endpoint_ClearOUT -00004064 T Endpoint_Read_8 -00004082 T Endpoint_Write_8 -000040a0 T Endpoint_SelectEndpoint -00004112 T Endpoint_StallTransaction -0000414a T Endpoint_ClearSETUP -000041a2 T Endpoint_IsSETUPReceived -000041d4 T Endpoint_IsOUTReceived -00004206 T Endpoint_IsINReady -0000421e T Endpoint_ConfigureEndpoint_PRV -000042b8 T Endpoint_ConfigureEndpointTable -000043a4 T Endpoint_ClearEndpoints -00004414 T Endpoint_ClearStatusStage -00004440 T Endpoint_WaitUntilReady -000044e6 T USB_Disable -00004500 T USB_ResetInterface -0000455c T USB_Init -000045ae T USB_INT_DisableAllInterrupts -000045bc T USB_INT_ClearAllInterrupts -000045c8 T __vector_125 -000046a2 T CDC_Device_ConfigureEndpoints -000046ec T CDC_Device_SendString -0000473e T CDC_Device_SendData -00004792 T CDC_Device_SendByte -00004800 T CDC_Device_Flush -00004890 T CDC_Device_USBTask -000048c6 T CDC_Device_ReceiveByte -00004984 T CDC_Device_Event_Stub -00004984 W EVENT_CDC_Device_BreakSent -00004984 W EVENT_CDC_Device_ControLineStateChanged -00004984 W EVENT_CDC_Device_LineEncodingChanged -00004986 T CDC_Device_ProcessControlRequest -00004ac0 T __mulshisi3 -00004ac4 T __mulohisi3 -00004acc T __muluhisi3 -00004ae0 T __umulhisi3 -00004af8 t do_rand -00004b8e T rand_r -00004b90 T rand -00004b96 T srand -00004bac T memcpy_P -00004bbe T strcmp_P -00004bd0 T strncpy_P -00004bee T memcpy -00004c00 T snprintf_P -00004c5a T vfprintf -00004ff4 T __eerd_block_x32a4u -0000500a T __eewr_block_x32a4u -0000501c T __eewr_byte_x32a4u -0000501e T __eewr_r18_x32a4u -00005062 T strnlen_P -00005078 T strnlen -0000508e T fputc -000050e6 T __ultoa_invert -000051a2 T __divmodsi4 -000051b8 t __divmodsi4_neg1 -000051c8 t __divmodsi4_neg2 -000051d6 t __divmodsi4_exit -000051d8 T __prologue_saves__ -0000520a T __epilogue_restores__ -0000523a T __udivmodsi4 -00005246 t __udivmodsi4_loop -00005260 t __udivmodsi4_ep -0000527e T _exit -0000527e W exit -00005280 t __stop_program -00005282 A __data_load_start -00005282 T _etext -00005314 A __data_load_end -00802000 D __data_start -00802000 D TerminalHandle -0080201b d TerminalInitDelay -0080201c d next -00802020 d TableAB -00802070 d TableC -00802092 B __bss_start -00802092 D __data_end -00802092 D _edata -00802092 b Memory -00802492 b LastButtonState.4138 -00802493 B LEDPulseMask -00802494 B TerminalState -00802495 b State -00802496 b CurrentFrameNumber -00802497 b RetryCount -00802498 b RetryTimeout -00802499 b BlockAddress -0080249d b CallbackFunc -0080249f b BufferIdx -008024a1 b Checksum -008024a2 b ReceivedFrameNumber -008024a3 b BufferIdx -008024a5 b SamplePosition -008024a6 b LoadModState -008024a7 b LastBit -008024a8 b IsParityBit -008024a9 b SampleRegister -008024aa b DataRegister -008024ab b BitSent -008024ad b BitCount -008024af b Flags -008024b1 b CodecBufferPtr -008024b3 b ParityBufferPtr -008024b5 b State -008024b6 b CardATQAValue -008024b8 b CardSAKValue -008024b9 b ReaderResponse -008024bd b CardResponse -008024c1 b CurrentAddress -008024c2 b BlockBuffer -008024d2 b StateOdd -008024d5 b StateEven -008024d8 B ActiveConfiguration -008024fd B GlobalSettings -00802510 B TerminalBuffer -00802610 B CodecBuffer -00802710 B USB_Device_ConfigurationNumber -00802711 B USB_Device_CurrentlySelfPowered -00802712 B USB_Device_RemoteWakeupEnabled -00802713 B USB_IsInitialized -00802714 B USB_DeviceState -00802715 B USB_ControlRequest -0080271d B USB_Endpoint_SelectedFIFO -0080271f B USB_Endpoint_SelectedHandle -00802721 B USB_Endpoint_SelectedEndpoint -00802722 B USB_Endpoint_FIFOs -00802a3a B USB_EndpointTable -00802a9d B __bss_end -00802a9d B _end -00810000 D StoredSettings -00810013 D __eeprom_end + U CALLBACK_Audio_Device_GetSetEndpointProperty + U CALLBACK_Audio_Device_GetSetInterfaceProperty + U CALLBACK_HID_Device_CreateHIDReport + U CALLBACK_HID_Device_ProcessHIDReport + U CALLBACK_HIDParser_FilterHIDReportItem + U CALLBACK_MS_Device_SCSICommandReceived +00000000 W __heap_end +00000000 a __tmp_reg__ +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 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 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 T __vectors +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__ +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__ +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__ +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__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +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__ +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__ +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__ +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__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +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__ +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__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000024c T ProductString +0000024c T __trampolines_end +0000024c T __trampolines_start +0000026a T ManufacturerString +00000284 T LanguageString +00000288 T ConfigurationDescriptor +000002c6 T DeviceDescriptor +000002d8 t ConfigurationTable +00000347 t ButtonActionTable +00000467 t __c.6505 +0000046e t __c.6466 +00000471 t __c.6461 +00000474 t __c.6434 +0000047b t __c.6416 +0000047e t __c.6405 +000004b7 t __c.6407 +000004be t __c.6409 +000004c5 t __c.6411 +000004cb t __c.6197 +000004ce t __c.6195 +000004d1 t StatusTable +00000597 T CommandTable +000006f8 T __ctors_end +000006f8 T __ctors_start +000006f8 T __dtors_end +000006f8 T __dtors_start +000006f8 W __init +00000704 T __do_copy_data +0000071a T __do_clear_bss +00000722 t .do_clear_bss_loop +00000724 t .do_clear_bss_start +00000730 T __bad_interrupt +00000730 W __vector_1 +00000730 W __vector_10 +00000730 W __vector_100 +00000730 W __vector_101 +00000730 W __vector_102 +00000730 W __vector_103 +00000730 W __vector_104 +00000730 W __vector_105 +00000730 W __vector_106 +00000730 W __vector_107 +00000730 W __vector_108 +00000730 W __vector_109 +00000730 W __vector_11 +00000730 W __vector_110 +00000730 W __vector_111 +00000730 W __vector_112 +00000730 W __vector_113 +00000730 W __vector_114 +00000730 W __vector_115 +00000730 W __vector_116 +00000730 W __vector_117 +00000730 W __vector_118 +00000730 W __vector_119 +00000730 W __vector_12 +00000730 W __vector_120 +00000730 W __vector_121 +00000730 W __vector_122 +00000730 W __vector_123 +00000730 W __vector_124 +00000730 W __vector_126 +00000730 W __vector_13 +00000730 W __vector_14 +00000730 W __vector_15 +00000730 W __vector_16 +00000730 W __vector_17 +00000730 W __vector_18 +00000730 W __vector_19 +00000730 W __vector_2 +00000730 W __vector_20 +00000730 W __vector_21 +00000730 W __vector_23 +00000730 W __vector_24 +00000730 W __vector_25 +00000730 W __vector_26 +00000730 W __vector_27 +00000730 W __vector_28 +00000730 W __vector_29 +00000730 W __vector_3 +00000730 W __vector_30 +00000730 W __vector_31 +00000730 W __vector_32 +00000730 W __vector_33 +00000730 W __vector_35 +00000730 W __vector_36 +00000730 W __vector_37 +00000730 W __vector_38 +00000730 W __vector_39 +00000730 W __vector_4 +00000730 W __vector_40 +00000730 W __vector_41 +00000730 W __vector_42 +00000730 W __vector_43 +00000730 W __vector_44 +00000730 W __vector_45 +00000730 W __vector_46 +00000730 W __vector_47 +00000730 W __vector_48 +00000730 W __vector_49 +00000730 W __vector_5 +00000730 W __vector_50 +00000730 W __vector_51 +00000730 W __vector_52 +00000730 W __vector_53 +00000730 W __vector_54 +00000730 W __vector_55 +00000730 W __vector_56 +00000730 W __vector_57 +00000730 W __vector_58 +00000730 W __vector_59 +00000730 W __vector_6 +00000730 W __vector_60 +00000730 W __vector_61 +00000730 W __vector_62 +00000730 W __vector_63 +00000730 W __vector_64 +00000730 W __vector_65 +00000730 W __vector_66 +00000730 W __vector_67 +00000730 W __vector_68 +00000730 W __vector_69 +00000730 W __vector_7 +00000730 W __vector_70 +00000730 W __vector_71 +00000730 W __vector_72 +00000730 W __vector_73 +00000730 W __vector_74 +00000730 W __vector_75 +00000730 W __vector_76 +00000730 W __vector_77 +00000730 W __vector_78 +00000730 W __vector_79 +00000730 W __vector_8 +00000730 W __vector_80 +00000730 W __vector_81 +00000730 W __vector_82 +00000730 W __vector_84 +00000730 W __vector_85 +00000730 W __vector_86 +00000730 W __vector_87 +00000730 W __vector_88 +00000730 W __vector_89 +00000730 W __vector_9 +00000730 W __vector_90 +00000730 W __vector_91 +00000730 W __vector_92 +00000730 W __vector_93 +00000730 W __vector_94 +00000730 W __vector_95 +00000730 W __vector_96 +00000730 W __vector_97 +00000730 W __vector_98 +00000730 W __vector_99 +00000732 T main +000007a8 T CALLBACK_USB_GetDescriptor +00000824 T __vector_default +00000830 T SystemInit +0000089e T SystemReset +000008ac T SystemEnterBootloader +000008b8 T SystemStartUSBClock +000008ea T SystemStopUSBClock +00000906 T SystemInterruptInit +00000912 t CodecInitDummy +00000914 t CodecTaskDummy +00000916 t ApplicationInitDummy +00000918 t ApplicationResetDummy +0000091a t ApplicationTaskDummy +0000091c t ApplicationProcessDummy +00000922 t ApplicationGetUidDummy +00000924 t ApplicationSetUidDummy +00000926 T ConfigurationSetById +0000095c T ConfigurationInit +00000968 T ConfigurationSetByName +000009e2 T ConfigurationGetList +00000a56 T RandomInit +00000a58 T RandomGetByte +00000a5e T RandomGetBuffer +00000a7e T RandomTick +00000a8e T BufferToHexString +00000b14 T HexStringToBuffer +00000ba8 T MemoryReadBlock +00000bd8 T MemoryWriteBlock +00000c06 T MemoryClear +00000c1c T MemoryRecall +00000d08 T MemoryInit +00000e04 T MemoryStore +0000107e T MemoryUploadBlock +00001410 T MemoryDownloadBlock +0000148a T ButtonInit +00001498 T ButtonTick +00001652 T ButtonGetActionList +000016c4 T ButtonGetActionByName +000016e0 T ButtonSetActionByName +000017a0 T SettingsLoad +000017b0 T SettingsSave +000017c0 T SettingsSetActiveById +000017fc T SettingsCycle +000018d6 T SettingsGetActiveByName +000018e4 T SettingsSetActiveByName +000018fe T TerminalSendString +00001908 T TerminalSendStringP +00001930 T TerminalSendBlock +0000193c T TerminalInit +00001946 T TerminalTask +00001984 T TerminalTick +00001a04 T EVENT_USB_Device_Connect +00001a0e T EVENT_USB_Device_Disconnect +00001a18 T EVENT_USB_Device_ConfigurationChanged +00001a20 T EVENT_USB_Device_ControlRequest +00001a28 T CommandGetVersion +00001a64 T CommandGetConfig +00001a90 T CommandSetConfig +00001aa2 T CommandExecConfig +00001aae T CommandGetUid +00001b02 T CommandSetUid +00001ba6 T CommandGetReadOnly +00001bca T CommandSetReadOnly +00001bf2 T CommandExecUpload +00001bfc T CommandExecDownload +00001c06 T CommandExecReset +00001c1c T CommandExecUpgrade +00001c32 T CommandGetMemSize +00001c62 T CommandGetUidSize +00001c8e T CommandExecButton +00001c98 T CommandGetButton +00001ca2 T CommandSetButton +00001cb2 T CommandGetSetting +00001cbc T CommandSetSetting +00001ccc T CommandExecClear +00001cd4 T CommandExecHelp +00001d68 T CommandGetRssi +00001dd0 T XModemReceive +00001e00 T XModemSend +00001e26 T XModemProcessByte +000020e8 T XModemTick +00002144 T CommandLineProcessByte +00002490 T CommandLineTick +00002492 t StartDemod +000024ce T __vector_34 +00002556 T __vector_22 +000026ca T __vector_83 +00002886 T ISO14443ACodecInit +000028f4 T ISO14443ACodecTask +000029ea T MifareClassicAppInit1K +00002a04 T MifareClassicAppInit4K +00002a1e T MifareClassicAppReset +00002a26 T MifareClassicAppTask +00002a28 T MifareClassicAppProcess +00002fff W __stack +000031ce T MifareClassicGetUid +000031da T MifareClassicSetUid +0000321a T ISO14443AAppendCRCA +00003276 T ISO14443ACheckCRCA +000032f2 t Crypto1LFSR +0000337e T Crypto1FilterOutput +000033e2 T Crypto1Setup +0000357c T Crypto1Auth +000035c6 T Crypto1Byte +000035ec T Crypto1Nibble +00003612 T Crypto1PRNG +000036b2 T USB_Device_ProcessControlRequest +000038f2 W EVENT_USB_Device_Reset +000038f2 W EVENT_USB_Device_StartOfFrame +000038f2 W EVENT_USB_Device_Suspend +000038f2 W EVENT_USB_Device_WakeUp +000038f2 T USB_Event_Stub +000038f4 T USB_USBTask +0000391e T Endpoint_Write_Stream_LE +000039e6 T Endpoint_Write_Control_Stream_LE +00003b10 T Endpoint_Write_Control_PStream_LE +00003c68 T Endpoint_ClearIN +00003c9a T Endpoint_ClearOUT +00003cb8 T Endpoint_Read_8 +00003cd8 T Endpoint_Write_8 +00003cf8 T Endpoint_SelectEndpoint +00003d6a T Endpoint_IsINReady +00003d82 T Endpoint_IsOUTReceived +00003db4 T Endpoint_IsSETUPReceived +00003de6 T Endpoint_ClearSETUP +00003e3e T Endpoint_StallTransaction +00003e76 T Endpoint_ConfigureEndpoint_PRV +00003f0c T Endpoint_ConfigureEndpointTable +00003fe4 T Endpoint_ClearEndpoints +00004054 T Endpoint_ClearStatusStage +00004080 T Endpoint_WaitUntilReady +00004126 T USB_Disable +00004140 T USB_ResetInterface +0000419c T USB_Init +000041ec T USB_INT_DisableAllInterrupts +000041fa T USB_INT_ClearAllInterrupts +00004206 T __vector_125 +000042e0 T CDC_Device_ConfigureEndpoints +0000432a T CDC_Device_SendString +00004374 T CDC_Device_SendData +000043c8 T CDC_Device_SendByte +00004432 T CDC_Device_Flush +000044ae T CDC_Device_USBTask +000044e4 T CDC_Device_ReceiveByte +0000459c T CDC_Device_Event_Stub +0000459c W EVENT_CDC_Device_BreakSent +0000459c W EVENT_CDC_Device_ControLineStateChanged +0000459c W EVENT_CDC_Device_LineEncodingChanged +0000459e T CDC_Device_ProcessControlRequest +000046d2 T __tablejump2__ +000046d6 T __tablejump__ +000046de T __mulshisi3 +000046e2 T __mulohisi3 +000046ea T __muluhisi3 +000046fe T __umulhisi3 +0000471c t do_rand +000047ac T rand_r +000047ae T rand +000047b4 T srand +000047ca T memcpy_P +000047dc T strcmp_P +000047ee T strncpy_P +0000480c T memcpy +0000481e T snprintf_P +00004878 T vfprintf +00004bfe T __eerd_block_x32a4u +00004c14 T __eewr_block_x32a4u +00004c26 T __eewr_byte_x32a4u +00004c28 T __eewr_r18_x32a4u +00004c6c T strnlen_P +00004c82 T strnlen +00004c98 T fputc +00004cfc T __ultoa_invert +00004db8 T __divmodsi4 +00004dd0 t __divmodsi4_neg2 +00004dde t __divmodsi4_exit +00004de0 T __negsi2 +00004df0 T __prologue_saves__ +00004e22 T __epilogue_restores__ +00004e52 T __udivmodsi4 +00004e5e t __udivmodsi4_loop +00004e78 t __udivmodsi4_ep +00004e96 W exit +00004e96 T _exit +00004e98 t __stop_program +00004e9a A __data_load_start +00004e9a T _etext +00004f2c A __data_load_end +00802000 D __data_start +00802000 d TerminalInitDelay +00802001 D TerminalHandle +0080201c d next +00802020 d TableC +00802040 d TableAB +00802092 B __bss_start +00802092 D __data_end +00802092 D _edata +00802092 b Memory +00802492 b LastButtonState.4250 +00802493 B LEDPulseMask +00802494 B TerminalState +00802495 b CallbackFunc +00802497 b BlockAddress +0080249b b BufferIdx +0080249d b RetryTimeout +0080249e b RetryCount +0080249f b Checksum +008024a0 b ReceivedFrameNumber +008024a1 b CurrentFrameNumber +008024a2 b State +008024a3 b BufferIdx +008024a5 b SamplePosition +008024a6 b LoadModState +008024a7 b LastBit +008024a8 b IsParityBit +008024a9 b SampleRegister +008024aa b DataRegister +008024ab b BitSent +008024ad b BitCount +008024af b ParityBufferPtr +008024b1 b CodecBufferPtr +008024b3 b Flags +008024b5 b CardSAKValue +008024b6 b CardATQAValue +008024b8 b BlockBuffer +008024c8 b CurrentAddress +008024c9 b ReaderResponse +008024cd b CardResponse +008024d1 b State +008024d2 b StateOdd +008024d5 b StateEven +008024d8 B ActiveConfiguration +008024fd B GlobalSettings +00802510 B TerminalBuffer +00802610 B CodecBuffer +00802710 B USB_Device_ConfigurationNumber +00802711 B USB_Device_CurrentlySelfPowered +00802712 B USB_Device_RemoteWakeupEnabled +00802713 B USB_IsInitialized +00802714 B USB_DeviceState +00802715 B USB_ControlRequest +0080271d B USB_Endpoint_SelectedFIFO +0080271f B USB_Endpoint_SelectedHandle +00802721 B USB_Endpoint_SelectedEndpoint +00802722 B USB_Endpoint_FIFOs +00802a3a B USB_EndpointTable +00802a9d B __bss_end +00802a9d B _end +00810000 D StoredSettings +00810013 D __eeprom_end diff --git a/Firmware/Chameleon-Mini/Settings.c b/Firmware/Chameleon-Mini/Settings.c index 1f2e8d8..9dbe8ae 100644 --- a/Firmware/Chameleon-Mini/Settings.c +++ b/Firmware/Chameleon-Mini/Settings.c @@ -56,6 +56,7 @@ #include "Settings.h" #include #include "Configuration.h" +#include "Memory.h" SettingsType GlobalSettings; SettingsType EEMEM StoredSettings = {