diff --git a/Firmware/Chameleon-Mini/Button.c b/Firmware/Chameleon-Mini/Button.c index efb17d1..1b5b0b4 100644 --- a/Firmware/Chameleon-Mini/Button.c +++ b/Firmware/Chameleon-Mini/Button.c @@ -65,7 +65,8 @@ static const char PROGMEM ButtonActionTable[][32] = [BUTTON_ACTION_UID_LEFT_INCREMENT] = "UID_LEFT_INCREMENT", [BUTTON_ACTION_UID_RIGHT_INCREMENT] = "UID_RIGHT_INCREMENT", [BUTTON_ACTION_UID_LEFT_DECREMENT] = "UID_LEFT_DECREMENT", - [BUTTON_ACTION_UID_RIGHT_DECREMENT] = "UID_RIGHT_DECREMENT" + [BUTTON_ACTION_UID_RIGHT_DECREMENT] = "UID_RIGHT_DECREMENT", + [BUTTON_ACTION_CYCLE_SETTINGS] = "CYCLE_SETTINGS" }; void ButtonInit(void) diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.bin b/Firmware/Chameleon-Mini/Chameleon-Mini.bin index 2dfc95c..181609a 100644 Binary files a/Firmware/Chameleon-Mini/Chameleon-Mini.bin and b/Firmware/Chameleon-Mini/Chameleon-Mini.bin differ diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.elf b/Firmware/Chameleon-Mini/Chameleon-Mini.elf index 297e98f..6128a8c 100644 Binary files a/Firmware/Chameleon-Mini/Chameleon-Mini.elf and b/Firmware/Chameleon-Mini/Chameleon-Mini.elf differ diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Chameleon-Mini.hex index 72ce155..47960fd 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.hex @@ -1,35 +1,35 @@ -:1000000023C300003DC300003BC3000039C3000010 -:1000100037C3000035C3000033C3000031C3000004 -:100020002FC300002DC300002BC3000029C3000014 -:1000300027C3000025C3000023C3000021C3000024 -:100040001FC300001DC300001BC3000019C3000034 -:1000500017C3000015C300000C945A1111C300000F -:100060000FC300000DC300000BC3000009C3000054 -:1000700007C3000005C3000003C3000001C3000064 -:10008000FFC20000FDC200000C941611F9C200006E -:10009000F7C20000F5C20000F3C20000F1C2000088 -:1000A000EFC20000EDC20000EBC20000E9C2000098 -:1000B000E7C20000E5C20000E3C20000E1C20000A8 -:1000C000DFC20000DDC20000DBC20000D9C20000B8 -:1000D000D7C20000D5C20000D3C20000D1C20000C8 -:1000E000CFC20000CDC20000CBC20000C9C20000D8 -:1000F000C7C20000C5C20000C3C20000C1C20000E8 -:10010000BFC20000BDC20000BBC20000B9C20000F7 -:10011000B7C20000B5C20000B3C20000B1C2000007 -:10012000AFC20000ADC20000ABC20000A9C2000017 -:10013000A7C20000A5C20000A3C20000A1C2000027 -:100140009FC200009DC200009BC200000C94FE11E3 -:1001500097C2000095C2000093C2000091C2000047 -:100160008FC200008DC200008BC2000089C2000057 -:1001700087C2000085C2000083C2000081C2000067 -:100180007FC200007DC200007BC2000079C2000077 -:1001900077C2000075C2000073C2000071C2000087 -:1001A0006FC200006DC200006BC2000069C2000097 -:1001B00067C2000065C2000063C2000061C20000A7 -:1001C0005FC200005DC200005BC2000059C20000B7 -:1001D00057C2000055C2000053C2000051C20000C7 -:1001E0004FC200004DC200004BC2000049C20000D7 -:1001F00047C200000C94EA2243C200001C034C00DA +:1000000033C300004DC300004BC3000049C30000D0 +:1000100047C3000045C3000043C3000041C30000C4 +:100020003FC300003DC300003BC3000039C30000D4 +:1000300037C3000035C3000033C3000031C30000E4 +:100040002FC300002DC300002BC3000029C30000F4 +:1000500027C3000025C300000C946A1121C30000CF +:100060001FC300001DC300001BC3000019C3000014 +:1000700017C3000015C3000013C3000011C3000024 +:100080000FC300000DC300000C94261109C300002B +:1000900007C3000005C3000003C3000001C3000044 +:1000A000FFC20000FDC20000FBC20000F9C2000058 +:1000B000F7C20000F5C20000F3C20000F1C2000068 +:1000C000EFC20000EDC20000EBC20000E9C2000078 +:1000D000E7C20000E5C20000E3C20000E1C2000088 +:1000E000DFC20000DDC20000DBC20000D9C2000098 +:1000F000D7C20000D5C20000D3C20000D1C20000A8 +:10010000CFC20000CDC20000CBC20000C9C20000B7 +:10011000C7C20000C5C20000C3C20000C1C20000C7 +:10012000BFC20000BDC20000BBC20000B9C20000D7 +:10013000B7C20000B5C20000B3C20000B1C20000E7 +:10014000AFC20000ADC20000ABC200000C940E12A2 +:10015000A7C20000A5C20000A3C20000A1C2000007 +:100160009FC200009DC200009BC2000099C2000017 +:1001700097C2000095C2000093C2000091C2000027 +:100180008FC200008DC200008BC2000089C2000037 +:1001900087C2000085C2000083C2000081C2000047 +:1001A0007FC200007DC200007BC2000079C2000057 +:1001B00077C2000075C2000073C2000071C2000067 +:1001C0006FC200006DC200006BC2000069C2000077 +:1001D00067C2000065C2000063C2000061C2000087 +:1001E0005FC200005DC200005BC2000059C2000097 +:1001F00057C200000C94FA2253C200001C034C00AA :100200005500460041002000430044004300200008 :10021000440065006D006F00000018034400650095 :1002200061006E002000430061006D0065007200F7 @@ -39,13 +39,13 @@ :10026000040100020A00000007050402100005074F :100270000583021000051201100102000008EB03C3 :10028000442001000102DC01004E4F4E45000000F9 -:100290000000000000000000002C042D042E042F9C -:1002A00004300431043404350400000001014D46DB -:1002B0005F434C41535349435F314B0000000713E8 -:1002C0003F13B813D213D613D713B518BB180004B5 +:100290000000000000000000003C043D043E043F5C +:1002A00004400441044404450400000001014D469B +:1002B0005F434C41535349435F314B0000001713D8 +:1002C0004F13C813E213E613E713C518CB18000445 :1002D0000400024D465F434C41535349435F344B46 -:1002E00000000007133F13C513D213D613D713B55D -:1002F00018BB18001004004E4F4E450000000000CF +:1002E00000000017134F13D513E213E613E713C5ED +:1002F00018CB18001004004E4F4E450000000000BF :1003000000000000000000000000000000000000ED :10031000000000000000005549445F52414E444F28 :100320004D00000000000000000000000000000080 @@ -57,1278 +57,1280 @@ :1003800044454352454D454E5400000000000000D6 :10039000000000000000005549445F52494748549E :1003A0005F44454352454D454E5400000000000057 -:1003B000000000000000004368616D656C656F6EB1 -:1003C0002D4D696E69202553207573696E67204C29 -:1003D00055464120255320636F6D70696C6564201C -:1003E00077697468204156522D47434320255300B6 -:1003F0003133313232320031333039303100342E42 -:10040000362E320025730052414E444F4D00257563 -:1004100000257500253575206D5600564552534907 -:100420004F4E0000000000000000000000000074BB -:100430000B434F4E464947000000000000000000FB -:1004400000CE0BC60BA10B55494400000000000074 -:10045000000000000000000000F90BD30B524541E2 -:10046000444F4E4C59000000000000000000005CAA -:100470000C4D0C55504C4F41440000000000000052 -:10048000000000720C00000000444F574E4C4F41DA -:10049000440000000000000000770C000000005243 -:1004A0004553455400000000000000000000007C9F -:1004B0000C00000000555047524144450000000028 -:1004C0000000000000870C000000004D454D53491E -:1004D0005A450000000000000000000000000092EB -:1004E0000C55494453495A450000000000000000E3 -:1004F0000000000000B90C425554544F4E0000005B -:1005000000000000000000DE0CE80CE30C53455432 -:1005100054494E470000000000000000000000F5B4 -:100520000CF00C434C45415200000000000000005C -:10053000000000FD0C0000000048454C5000000089 -:10054000000000000000000000000D00000000524C -:1005500053534900000000000000000000000000AC -:100560000000004D0D000000000000000000000031 -:1005700000000000000000000000000D0A000D0A4D -:1005800000643130303A4F4B0000000000000000A2 -:10059000000000000000000000000000000000005B -:1005A0000000653130313A4F4B20574954482054B0 -:1005B000455854000000000000000000000000004A -:1005C0000000006E3131303A57414954494E4720BE -:1005D000464F5220584D4F44454D0000000000004A -:1005E00000000000C83230303A554E4B4E4F574E47 -:1005F00020434F4D4D414E440000000000000000DC -:100600000000000000C93230313A494E56414C4991 -:100610004420434F4D4D414E4420555341474500E2 -:10062000000000000000CA3230323A494E56414CB8 -:10063000494420504152414D45544552000000006C -:10064000000000000000000011241FBECFEFDFE219 -:10065000DEBFCDBF10E2A0E0B0E2EEE9F2E502C0FD -:1006600005900D92A23AB107D9F716E2A2EAB0E2DC -:1006700001C01D92AD3AB107E1F703D00C944D29AA -:100680006FC074D0F2D680E3E0E0F6E081834ED212 -:1006900016D1B3D79CD173D5E0E0F2E081E080932E -:1006A0000002118292E0928393E0948380A388E316 -:1006B00081A3CCD0C0E0DAE0FF24F39400E016E0A0 -:1006C000A1D7E091FB20F091FC200995E091012158 -:1006D000F0910221099580910C0A80FFF1CFFC86F0 -:1006E00091D1B1D753D58091A320F8018683109280 -:1006F000A320E6CF9230F9F09330A1F0913049F089 -:1007000080E090E0E0E0F0E0DA01ED93FC931197F7 -:10071000089582E190E0E6E7F2E0DA01ED93FC93E0 -:1007200011970895813081F0813098F4E4E3F2E08C -:10073000849190E0E9CF8EE390E0E8E3F2E0DA0123 -:10074000ED93FC9311970895EAE1F2E0849190E033 -:10075000DBCF8230A9F6ECEFF1E0849190E0D4CFCA -:100760001F920F920FB60F921124FFCF8091780045 -:1007700083FF0AC088E08093780088ED84BF81E021 -:1007800080938000FD95FEC080915000866080932C -:1007900050008091510081FFFCCF8091510082FF79 -:1007A000FCCFE0E5F0E0168221E02093600088EDC8 -:1007B00084BF2093400083ED90E3E0E0FAE086A35D -:1007C00097A386E08093000AE0E4F0E0238320937F -:1007D00000048091CC018860E0ECF1E0848708950A -:1007E00088ED84BF81E0E8E7F0E08183089588ED3B -:1007F00084BF8BE18093800008958BECE0E5F0E00E -:1008000082838091500088608093500080915100D5 -:1008100083FFFCCF84ECE0E5F0E08583809150001D -:100820008061809350008091510084FFFCCF089537 -:10083000E0E4F0E084818E7F8483E0E5F0E0808175 -:100840008F7E80838081877F8083089587E0E0EAC0 -:10085000F0E08283789408950895089508950895A6 -:10086000089580E090E0089508950895E0910E21A4 -:10087000F0910F21818390E09C01220F331F220F02 -:10088000331FB901660F771F660F771F660F771F3B -:10089000620F731F680F791F68577D4F88EE90E2D3 -:1008A00045E250E00E94E225E091FD20F091FE201B -:1008B0000995E091F920F091FA2009950895E091C9 -:1008C0000E21F0910F218181D1CF0F931F93CF93F0 -:1008D000DF93AC0120E030E08C010F5F1F4F622FEF -:1008E000C901880F991F880F991FFC01EE0FFF1F88 -:1008F000EE0FFF1FEE0FFF1FE80FF91FE20FF31FB0 -:10090000E757FD4F8491DA01882359F09C91992390 -:1009100059F0981749F4E80131961196849188238B -:1009200071F48C91882389F02F5F3F4F233031057C -:10093000B1F680E0DF91CF911F910F9108959991C9 -:10094000992391F3981741F3EFCF862F8FDF81E042 -:10095000DF91CF911F910F910895CF93DF93EC0119 -:100960006150704020E030E04CE2C901880F991FCF -:10097000880F991FFC01EE0FFF1FEE0FFF1FEE0FF8 -:10098000FF1FE80FF91FE20FF31FE757FD4F849198 -:10099000882381F06131710568F0DE0103C06031A8 -:1009A000710541F08D93ED01319661507040849155 -:1009B0008823A9F72230310521F41882DF91CF91E5 -:1009C00008954993615070402F5F3F4FCECF0895F7 -:1009D0000C94D42508950F931F93CF93DF93662330 -:1009E00061F08C010F5F1F4F6150060F111DEC016C -:1009F000EFDF8993C017D107D9F7DF91CF911F910E -:100A00000F9108950E94D4250E94D4250E94D425D8 -:100A10000C94D425CF93DF93FC012115310581F18E -:100A2000615070406230710558F1DA0140E050E0E9 -:100A300018C0D05DD0838C2F90E08F7090708A307A -:100A40009105D4F48C2F8F70805D818332964E5F38 -:100A50005F4F21503040B1F06250704062307105FC -:100A600088F0CD91DC2FD295DF708D2F90E08A3009 -:100A70009105FCF2D95CDECF8C2F8F70895CE5CFBD -:100A800040E050E01082CA01DF91CF910895CF93EA -:100A9000DF93DA012C91222309F443C011963C9193 -:100AA00011973323F1F161157105D9F11396EC011A -:100AB00080E090E014C02295207F313430F5342F4F -:100AC000232B29930196FD0131972081222331F1B7 -:100AD0003C91332331F1129668177907F9F0422FD0 -:100AE00040534A3018F041514630D8F4432F405318 -:100AF0004A3020F0532F5154563098F42134D8F214 -:100B00002295207F20573134D0F23753232B29935D -:100B10000196FD01319720812223D1F6DF91CF91FB -:100B2000089580E090E0DF91CF910895CF93DF9317 -:100B300000D000D0CDB7DEB7A0E6B6E080E11596D4 -:100B40008C9315979AE111969C931197E0EAF9E03E -:100B50001682178293EC958398E1948316968C9372 -:100B6000169787ED8093A0098091A10986FFFCCF9D -:100B700080E4E0EAF9E081838091A0091092A00965 -:100B80008091A10986FFFCCF80E4E0EAF9E081834F -:100B90008091A00990E1E0E6F6E0958380FD47C0F2 -:100BA0008DE389838AE28A8380E88B8386EA8C835B -:100BB000A0E6B6E020E137EDE0EAF9E090E4169631 -:100BC0002C9316973093A0098091A10986FFFCCF42 -:100BD00091838091A0091092A0098091A10986FFBC -:100BE000FCCF91838091A00915962C93159787FFD0 -:100BF000E6CF80E1E0E6F6E08683CE010596FE01D1 -:100C00003196A0EAB9E030E421912093A009209127 -:100C1000A10926FFFCCF11963C9311972091A009C2 -:100C2000E817F90789F780E1E0E6F6E08583249686 -:100C3000CDBFDEBFDF91CF9108950F931F93CF9368 -:100C4000DF93EC018B0120E030E080910D2190E0FA -:100C5000A0E0B0E0DC0199278827080F191F2A1FA0 -:100C60003B1FA0E6B6E060E177EDE0EAF9E090E452 -:100C700016966C9316977093A0098091A10986FF30 -:100C8000FCCF91838091A0091092A0098091A109C5 -:100C900086FFFCCF91838091A00915966C931597E0 -:100CA00087FFE6CF80E1E0E6F6E0868383E080938D -:100CB000A0098091A10986FFFCCF80E4E0EAF9E079 -:100CC00081838091A009C901AA27BB278093A0092D -:100CD0008091A10986FFFCCF80E4E0EAF9E08183FE -:100CE0008091A009BB27A32F922F812F8093A00969 +:1003B000000000000000004359434C455F53455482 +:1003C00054494E47530000000000000000000000A8 +:1003D000000000000000004368616D656C656F6E91 +:1003E0002D4D696E69202553207573696E67204C09 +:1003F00055464120255320636F6D70696C656420FC +:1004000077697468204156522D4743432025530095 +:100410003134303130320031333039303100342E24 +:10042000362E320025730052414E444F4D00257543 +:1004300000257500253575206D56005645525349E7 +:100440004F4E00000000000000000000000000848B +:100450000B434F4E464947000000000000000000DB +:1004600000DE0BD60BB10B55494400000000000024 +:10047000000000000000000000090CE30B524541A1 +:10048000444F4E4C59000000000000000000006C7A +:100490000C5D0C55504C4F41440000000000000022 +:1004A000000000820C00000000444F574E4C4F41AA +:1004B000440000000000000000870C000000005213 +:1004C0004553455400000000000000000000008C6F +:1004D0000C00000000555047524144450000000008 +:1004E0000000000000970C000000004D454D5349EE +:1004F0005A4500000000000000000000000000A2BB +:100500000C55494453495A450000000000000000C2 +:100510000000000000C90C425554544F4E0000002A +:1005200000000000000000EE0CF80CF30C534554E2 +:1005300054494E4700000000000000000000000584 +:100540000D000D434C45415200000000000000002A +:100550000000000D0D0000000048454C5000000058 +:10056000000000000000000000100D00000000521C +:10057000535349000000000000000000000000008C +:100580000000005D0D000000000000000000000001 +:1005900000000000000000000000000D0A000D0A2D +:1005A00000643130303A4F4B000000000000000082 +:1005B000000000000000000000000000000000003B +:1005C0000000653130313A4F4B2057495448205490 +:1005D000455854000000000000000000000000002A +:1005E0000000006E3131303A57414954494E47209E +:1005F000464F5220584D4F44454D0000000000002A +:1006000000000000C83230303A554E4B4E4F574E26 +:1006100020434F4D4D414E440000000000000000BB +:100620000000000000C93230313A494E56414C4971 +:100630004420434F4D4D414E4420555341474500C2 +:10064000000000000000CA3230323A494E56414C98 +:10065000494420504152414D45544552000000004C +:10066000000000000000000011241FBECFEFDFE2F9 +:10067000DEBFCDBF10E2A0E0B0E2EEEBF2E502C0DB +:1006800005900D92A23AB107D9F716E2A2EAB0E2BC +:1006900001C01D92AD3AB107E1F703D00C945D297A +:1006A0006FC074D0F2D680E3E0E0F6E081834ED2F2 +:1006B00016D1B3D79CD173D5E0E0F2E081E080930E +:1006C0000002118292E0928393E0948380A388E3F6 +:1006D00081A3CCD0C0E0DAE0FF24F39400E016E080 +:1006E000A1D7E091FB20F091FC200995E091012138 +:1006F000F0910221099580910C0A80FFF1CFFC86D0 +:1007000091D1B1D753D58091A320F801868310925F +:10071000A320E6CF9230F9F09330A1F0913049F068 +:1007200080E090E0E0E0F0E0DA01ED93FC931197D7 +:10073000089582E190E0E6E7F2E0DA01ED93FC93C0 +:1007400011970895813081F0813098F4E4E3F2E06C +:10075000849190E0E9CF8EE390E0E8E3F2E0DA0103 +:10076000ED93FC9311970895EAE1F2E0849190E013 +:10077000DBCF8230A9F6ECEFF1E0849190E0D4CFAA +:100780001F920F920FB60F921124FFCF8091780025 +:1007900083FF0AC088E08093780088ED84BF81E001 +:1007A00080938000FD95FEC080915000866080930C +:1007B00050008091510081FFFCCF8091510082FF59 +:1007C000FCCFE0E5F0E0168221E02093600088EDA8 +:1007D00084BF2093400083ED90E3E0E0FAE086A33D +:1007E00097A386E08093000AE0E4F0E0238320935F +:1007F00000048091CC018860E0ECF1E084870895EA +:1008000088ED84BF81E0E8E7F0E08183089588ED1A +:1008100084BF8BE18093800008958BECE0E5F0E0ED +:1008200082838091500088608093500080915100B5 +:1008300083FFFCCF84ECE0E5F0E0858380915000FD +:100840008061809350008091510084FFFCCF089517 +:10085000E0E4F0E084818E7F8483E0E5F0E0808155 +:100860008F7E80838081877F8083089587E0E0EAA0 +:10087000F0E0828378940895089508950895089586 +:10088000089580E090E0089508950895E0910E2184 +:10089000F0910F21818390E09C01220F331F220FE2 +:1008A000331FB901660F771F660F771F660F771F1B +:1008B000620F731F680F791F68577D4F88EE90E2B3 +:1008C00045E250E00E94F225E091FD20F091FE20EB +:1008D0000995E091F920F091FA2009950895E091A9 +:1008E0000E21F0910F218181D1CF0F931F93CF93D0 +:1008F000DF93AC0120E030E08C010F5F1F4F622FCF +:10090000C901880F991F880F991FFC01EE0FFF1F67 +:10091000EE0FFF1FEE0FFF1FE80FF91FE20FF31F8F +:10092000E757FD4F8491DA01882359F09C91992370 +:1009300059F0981749F4E80131961196849188236B +:1009400071F48C91882389F02F5F3F4F233031055C +:10095000B1F680E0DF91CF911F910F9108959991A9 +:10096000992391F3981741F3EFCF862F8FDF81E022 +:10097000DF91CF911F910F910895CF93DF93EC01F9 +:100980006150704020E030E04CE2C901880F991FAF +:10099000880F991FFC01EE0FFF1FEE0FFF1FEE0FD8 +:1009A000FF1FE80FF91FE20FF31FE757FD4F849178 +:1009B000882381F06131710568F0DE0103C0603188 +:1009C000710541F08D93ED01319661507040849135 +:1009D0008823A9F72230310521F41882DF91CF91C5 +:1009E00008954993615070402F5F3F4FCECF0895D7 +:1009F0000C94E42508950F931F93CF93DF93662300 +:100A000061F08C010F5F1F4F6150060F111DEC014B +:100A1000EFDF8993C017D107D9F7DF91CF911F91ED +:100A20000F9108950E94E4250E94E4250E94E42588 +:100A30000C94E425CF93DF93FC012115310581F15E +:100A4000615070406230710558F1DA0140E050E0C9 +:100A500018C0D05DD0838C2F90E08F7090708A305A +:100A60009105D4F48C2F8F70805D818332964E5F18 +:100A70005F4F21503040B1F06250704062307105DC +:100A800088F0CD91DC2FD295DF708D2F90E08A30E9 +:100A90009105FCF2D95CDECF8C2F8F70895CE5CF9D +:100AA00040E050E01082CA01DF91CF910895CF93CA +:100AB000DF93DA012C91222309F443C011963C9173 +:100AC00011973323F1F161157105D9F11396EC01FA +:100AD00080E090E014C02295207F313430F5342F2F +:100AE000232B29930196FD0131972081222331F197 +:100AF0003C91332331F1129668177907F9F0422FB0 +:100B000040534A3018F041514630D8F4432F4053F7 +:100B10004A3020F0532F5154563098F42134D8F2F3 +:100B20002295207F20573134D0F23753232B29933D +:100B30000196FD01319720812223D1F6DF91CF91DB +:100B4000089580E090E0DF91CF910895CF93DF93F7 +:100B500000D000D0CDB7DEB7A0E6B6E080E11596B4 +:100B60008C9315979AE111969C931197E0EAF9E01E +:100B70001682178293EC958398E1948316968C9352 +:100B8000169787ED8093A0098091A10986FFFCCF7D +:100B900080E4E0EAF9E081838091A0091092A00945 +:100BA0008091A10986FFFCCF80E4E0EAF9E081832F +:100BB0008091A00990E1E0E6F6E0958380FD47C0D2 +:100BC0008DE389838AE28A8380E88B8386EA8C833B +:100BD000A0E6B6E020E137EDE0EAF9E090E4169611 +:100BE0002C9316973093A0098091A10986FFFCCF22 +:100BF00091838091A0091092A0098091A10986FF9C +:100C0000FCCF91838091A00915962C93159787FFAF +:100C1000E6CF80E1E0E6F6E08683CE010596FE01B0 +:100C20003196A0EAB9E030E421912093A009209107 +:100C3000A10926FFFCCF11963C9311972091A009A2 +:100C4000E817F90789F780E1E0E6F6E08583249666 +:100C5000CDBFDEBFDF91CF9108950F931F93CF9348 +:100C6000DF93EC018B0120E030E080910D2190E0DA +:100C7000A0E0B0E0DC0199278827080F191F2A1F80 +:100C80003B1FA0E6B6E060E177EDE0EAF9E090E432 +:100C900016966C9316977093A0098091A10986FF10 +:100CA000FCCF91838091A0091092A0098091A109A5 +:100CB00086FFFCCF91838091A00915966C931597C0 +:100CC00087FFE6CF80E1E0E6F6E0868383E080936D +:100CD000A0098091A10986FFFCCF80E4E0EAF9E059 +:100CE00081838091A009C901AA27BB278093A0090D :100CF0008091A10986FFFCCF80E4E0EAF9E08183DE -:100D00008091A0090093A0098091A10986FFFCCFE2 -:100D100080E4E0EAF9E081838091A0094115510562 -:100D200071F090E41092A0098091A10986FFFCCF98 -:100D300091838091A00989934150504099F780E1B7 -:100D4000E0E6F6E08583DF91CF911F910F91089542 -:100D50002F923F924F925F926F927F928F929F92CB -:100D6000AF92BF92CF92DF92EF92FF920F931F93B9 -:100D7000CF93DF93CDB7DEB72697CDBFDEBF8B8392 -:100D80009C834A0180910D214115510509F41EC132 -:100D90006B01EE24FF2490E0A0E0B0E0DC01992795 -:100DA0008827C80ED91EEA1EFB1E212C01E0302E1A -:100DB00000E130E147EDE0EAF9E050E420E410E63C -:100DC000612E16E0712E60E117ED240146015701F6 -:100DD000BB27AB2D9A2D892D7C01982D6101C81858 -:100DE000D1084C145D0408F4620160936606109308 -:100DF000A0098091A10986FFFCCF21838091A009E1 -:100E00001092A0098091A10986FFFCCF21838091D7 -:100E1000A0093093650687FFE8CFD30116963C936F -:100E2000B3E5B093A0098091A10986FFFCCF51835F -:100E30008091A009F092A0098091A10986FFFCCFC2 -:100E400051838091A009E092A0098091A10986FFB9 -:100E5000FCCF51838091A0091092A0098091A10933 -:100E600086FFFCCF51838091A009009365063093E3 -:100E700066064093A0098091A10986FFFCCF2183DB -:100E80008091A0091092A0098091A10986FFFCCF52 -:100E900021838091A0093093650687FFE8CFD301B5 -:100EA00016963C93B4E8B093A0098091A10986FFFF -:100EB000FCCF51838091A0091092A0098091A109D3 -:100EC00086FFFCCF51838091A0091092A0098091E8 -:100ED000A10986FFFCCF51838091A0099093A009BE -:100EE0008091A10986FFFCCF51838091A009C11494 -:100EF000D104D9F0C601AB81AD83BC81BE83C98268 -:100F0000DA82AD81BE817D917093A0096D01DC0113 -:100F10008091A10986FFFCCFCD01D601218370917C -:100F2000A009019781F7C980DA80009365063093A4 -:100F300066064093A0098091A10986FFFCCF21831A -:100F40008091A0091092A0098091A10986FFFCCF91 -:100F500021838091A0093093650687FFE8CFD301F4 -:100F600016963C93B3E8B093A0098091A10986FF3F -:100F7000FCCF51838091A009F092A0098091A10932 -:100F800086FFFCCF51838091A009E092A009809157 -:100F9000A10986FFFCCF51838091A0091092A0097E -:100FA0008091A10986FFFCCF51838091A009009315 -:100FB00065064C185D08C601A0E0B0E0880E991ED9 -:100FC000AA1EBB1E4114510409F002CF2696CDBFC4 -:100FD000DEBFDF91CF911F910F91FF90EF90DF90D7 -:100FE000CF90BF90AF909F908F907F906F905F90C9 -:100FF0004F903F902F9008951F93CF93DF93809150 -:101000000D2190E0A0E0B0E0BA2FA92F982F8827FB -:101010009C0120503F4FA0E6B6E0D0E160E177EDC3 -:10102000E0EAF9E0C0E450E411E816966C931697F4 -:101030007093A0094091A10946FFFCCF51834091D4 -:10104000A0091092A0094091A10946FFFCCF51834D -:101050004091A00915966C93159747FFE6CF169619 -:10106000DC9316971093A0094091A10946FFFCCF8D -:10107000C1834091A0099093A0094091A10946FF26 -:10108000FCCFC1834091A0098093A0094091A109A0 -:1010900046FFFCCFC1834091A0091092A009409166 -:1010A000A10946FFFCCFC1834091A0091596DC93AE -:1010B000159701968217930709F0B7CFDF91CF916B -:1010C0001F9108950F931F93FC01403080E0580753 -:1010D00081E0680780E0780720F081E01F910F91A0 -:1010E000089580E090E0A1E0B0E0841B950BA60B92 -:1010F000B70B890120E030E080179107A207B30702 -:1011000040F0CF01BA01A80123DE81E01F910F91C9 -:1011100008958C019D01CF01BA01A80119DEF5CF18 -:101120000F931F93FC01403080E0580781E068076F -:1011300080E0780720F080E01F910F91089580E013 -:1011400090E0A1E0B0E0841B950BA60BB70B8901E2 -:1011500020E030E080179107A207B30740F0CF01ED -:10116000BA01A8016ADD81E01F910F9108958C01F9 -:101170009D01CF01BA01A80160DD81E0F5CFE0E07B -:10118000F6E080E4828388E1868B0895FF920F93D6 -:101190001F93CF93DF93CDB7DEB7A097CDBFDEBF50 -:1011A0009091080690958091A22089278923909399 -:1011B000A22086FF15C0E0910E21F0910F218081C1 -:1011C0008130B9F0823079F1833009F44EC0843037 -:1011D00009F470C0853009F48FC0863009F468C006 -:1011E000A096CDBFDEBFDF91CF911F910F91FF90F1 -:1011F000089580910B21882309F4A1C0FF248E015A -:101200000F5F1F4FE5DBF801EF0DF11D8083F394B5 -:1012100080910B21F816B0F3E0910721F09108219D -:10122000C8010995DDCFE0910521F09106218E01DD -:101230000F5F1F4FC801099520910B21222361F3F5 -:10124000F801CE0102962150820F911D21E0222348 -:1012500039F0308121E03F3F09F020E03F5F3083EB -:101260003196E817F90799F7D7CFE0910521F0916A -:1012700006218E010F5F1F4FC801099520910B2198 -:1012800031E0222349F221503323D9F3822F90E019 -:10129000F801E80FF91F408131E04F3F09F030E0DD -:1012A000800F911F4F5FFC014083222361F7B4CF71 -:1012B000FBD096CFE0910521F09106218E010F5FC2 -:1012C0001F4FC801099520910B21222309F4A4CFB7 -:1012D000F801CE0102962150820F911D21E02223B8 -:1012E00031F0308121E0311120E0315030833196EE -:1012F000E817F907A1F790CFE0910521F0910621B9 -:101300008E010F5F1F4FC801099520910B2131E01D -:10131000222309F481CF21503323D1F3822F90E08F -:10132000F801E80FF91F408131E0411130E0800FF2 -:10133000911F4150FC014083222369F76DCF8E013C -:101340000F5F1F4F69CFCF93DF93EC016150704067 -:1013500027EF32E04CE2C901F9015491552389F09D -:101360006132710570F0DE0103C06032710549F031 -:101370005D93ED01019661507040FC01549155233D -:10138000A1F7F3E0273B3F0721F41882DF91CF91CB -:101390000895499361507040205E3F4F83E0273DA0 -:1013A0003807C9F6F2CFE0910E21F0910F2180832A -:1013B0000895AB01E0910E21F0910F21608170E062 -:1013C000660F771F62957295707F7627607F76270C -:1013D00069507D4F0C94F425CF93DF93EC0167EFB8 -:1013E00072E00E94EB25009771F1CE0167E173E096 -:1013F0000E94EB25009769F1CE0167E373E00E943C -:10140000EB25009741F1CE0167E573E00E94EB25E3 -:10141000009719F1CE0167E773E00E94EB25009772 -:10142000F1F0CE0167E973E00E94EB250097C9F067 -:10143000CE0167EB73E00E94EB250097A1F080E0FE -:10144000DF91CF91089580E0AEDF81E0DF91CF9111 -:10145000089581E0F9CF82E0F7CF83E0F5CF84E013 -:10146000F3CF85E0F1CF86E0EFCF8DE091E260E051 -:1014700070E043E150E00C9408288DE091E260E0D8 -:1014800070E043E150E00C941328883008F0089590 -:1014900080930D2190E0880F991F805F9E4D80936F -:1014A0000E2190930F210BCA80910D218F5F8770C1 -:1014B000282F30E0F901EE0FFF1FEF5EFE4D908107 -:1014C000992309F05DC0C90101968770282F30E08B -:1014D000F901EE0FFF1FEF5EFE4D9081992309F099 -:1014E0004FC0C90101968770282F30E0F901EE0F37 -:1014F000FF1FEF5EFE4D9081992309F041C0C901A5 -:1015000001968770282F30E0F901EE0FFF1FEF5E84 -:10151000FE4D90819923A1F5C90101968770282F6E -:1015200030E0F901EE0FFF1FEF5EFE4D9081992331 -:1015300039F5C90101968770282F30E0F901EE0FC7 -:10154000FF1FEF5EFE4D90819923D1F4C9010196F2 -:101550008770282F30E0F901EE0FFF1FEF5EFE4D80 -:101560009081992369F4C90101968770E82FF0E012 -:10157000EE0FFF1FEF5EFE4D9081992309F4089551 -:1015800084CF80910D210895CF93DF93EC01F9DF93 -:10159000805D88831982DF91CF910895FC0180815D -:1015A0009181992341F48053883010F080E00895B0 -:1015B0006CDF81E0089580E00895BC0180E090E256 -:1015C0000C942B24CF93DF93FC016491662359F094 -:1015D000EC01219680E090E20E947124FE012196A8 -:1015E00064916623B9F7DF91CF9108959C01AB0117 -:1015F00080E090E2B9010C944F2480E2E0E6F6E04E -:1016000082830895CF93DF9380E090E20E94E524E7 -:101610000E94441E80E090E20E94FF24EC0197FDAE -:101620000AC080E18093A320E0E0F6E085838C2F60 -:10163000B3D2882319F0DF91CF9108958C2F33D442 -:10164000DF91CF9108958091A420813009F18130FC -:1016500030F0823059F1833071F0F7D3C7C58091F3 -:10166000680685FFFACF84E180931B2081E0809398 -:10167000A420EBD3BBC580911B20815080931B20FD -:10168000882359F70E947822D3D81092A420E5CF5E -:1016900080911B20815080931B208823F1F6ADD8C8 -:1016A0000E94B32282E08093A420D7CF8091680665 -:1016B00085FDD3CF84E180931B2083E08093A42019 -:1016C000C4D394C580E2E0E0F6E08583089580E22B -:1016D000E0E0F6E08683089580E090E20C94052433 -:1016E00080E090E20C945A232DB73EB72C50304046 -:1016F0002DBF3EBFEDB7FEB73196ADB7BEB7119661 -:101700008D939C93129780E091E08283938387EB83 -:1017100093E08483958380EF93E08683978387EFBC -:1017200093E0808791878EEF93E0828793870E9472 -:101730000C262DB73EB7245F3F4F2DBF3EBF85E639 -:1017400008952DB73EB7285030402DBF3EBFEDB7AE -:10175000FEB73196ADB7BEB711968D939C93129795 -:1017600080E091E08283938384E094E08483958396 -:1017700089EE90E2868397830E940C262DB73EB7B0 -:10178000285F3F4F2DBF3EBF85E608959ED8882332 -:1017900011F48AEC089571DE84E6089560E071E04A -:1017A000DCD885E608950F931F93CF93DF93CDB7D1 -:1017B000DEB7A197CDBFDEBF8C0120910B21E09158 -:1017C0000521F0910621CE01019629A30995C801B2 -:1017D00060E071E0AE014F5F5F4F29A130E01AD9A0 -:1017E00085E6A196CDBFDEBFDF91CF911F910F910E -:1017F0000895BF92CF92DF92EF92FF920F931F93C3 -:10180000CF93DF93CDB7DEB7A097CDBFDEBF8C01FE -:10181000E0900B21FF2467E074E00E94EB25009725 -:1018200049F5E114F104A1F1BB2400E010E06E01E0 -:101830000894C11CD11CCCD8F601E00FF11F8083A5 -:10184000B3940B2D10E00E151F05A8F3E0910721AE -:10185000F0910821C601099584E6A096CDBFDEBFB0 -:10186000DF91CF911F910F91FF90EF90DF90CF907C -:10187000BF9008956E010894C11CD11CC60160E29E -:1018800070E0A80104D98E159F0501F38AECE5CF1D -:101890006E010894C11CD11CD9CFFC0180910C2190 -:1018A000882329F480E38083118285E6089581E30B -:1018B0008083118285E60895FC018181882339F4B3 -:1018C0008081813331F0803349F08AEC08958AECCD -:1018D000089581E080930C2184E6089510920C21F4 -:1018E00084E6089582E698E02CD18EE6089580E99A -:1018F00098E03FD18EE60895E0ECF4E081818E7FA0 -:1019000081830E9478220E94F00384E60895E0EC2F -:10191000F4E081818E7F81830E9478220E94F70308 -:1019200084E608952DB73EB7285030402DBF3EBF06 -:10193000EDB7FEB73196ADB7BEB711968D939C93B8 -:10194000129780E091E0828393838EE094E0848319 -:1019500095838091092190910A21868397830E9423 -:101960000C262DB73EB7285F3F4F2DBF3EBF85E603 -:1019700008952DB73EB7285030402DBF3EBFEDB77C -:10198000FEB73196ADB7BEB711968D939C93129763 -:1019900080E091E08283938381E194E08483958366 -:1019A00080910B21868317820E940C262DB73EB7AB -:1019B000285F3F4F2DBF3EBF85E6089560E071E090 -:1019C000C2DC85E6089560E071E0F3DC85E6089509 -:1019D00003DD882311F48AEC08954FDD84E6089531 -:1019E00060E071E0D1DD85E60895D8DD882311F44B -:1019F0008AEC089542DD84E60895FEDA84E60895CF -:101A0000BF92CF92DF92EF92FF920F931F93CF93EB -:101A1000DF937C01CFEFD0E02BE1C22E24E0D22E69 -:101A20003CE2B32E86018CE190E2B6010E94EB25E8 -:101A3000009729F1F6018491882389F0C132D105FC -:101A400070F0D70103C0C032D10549F08D937D01FC -:101A50000F5F1F4F2197F80184918823A1F7F701A9 -:101A6000B1927F01219786E190E0C80ED91E8601D0 -:101A70008CE190E2B6010E94EB250097D9F6F701C0 -:101A80003197108285E6DF91CF911F910F91FF90E2 -:101A9000EF90DF90CF90BF900895CF93DF93209188 -:101AA00020022068E0E0F2E020A32091230220FF42 -:101AB000FCCF21E0E0E0F2E023A3609110027091FE -:101AC00011022DB73EB7285030402DBF3EBFCDB7D5 -:101AD000DEB72196EDB7FEB78183928380E091E077 -:101AE0008A839B8384E194E08C839D836E5B70404A -:101AF00077FD1AC0882777FD8095982F29E637E56E -:101B00004BE050E00E946525DC01CB01AE83BF8332 -:101B10000E940C262DB73EB7285F3F4F2DBF3EBF1A -:101B200085E6DF91CF91089560E070E0E3CF80E03B -:101B3000E0E2F1E29191890F91E2E03AF907D1F701 -:101B4000089521E02093A5202093A62024E120934E -:101B5000A72025E02093A8201092A9201092AA2067 -:101B60001092AB201092AC208093AD209093AE20C9 -:101B7000089527E02093A52024E62093A820109222 -:101B8000A9201092AA201092AB201092AC20809332 -:101B9000AD209093AE200895CF93C82F8091A520BB -:101BA000853009F484C08630E8F0873009F44EC0EF -:101BB000873070F52091B2208091A620281709F473 -:101BC000E1C030E090E001972817390709F40BC114 -:101BD00080E090E268E10E9471241092A52081E0EB -:101BE000CF910895833009F45AC08430C0F08C2F0F -:101BF00090E04091B2202FEF30E0241B3109821792 -:101C0000930709F06BC085E08093A52081E0E8CFC1 -:101C10008830F9F08930A9F080E0CF9108958130C3 -:101C2000D8F3C13009F4E9C0C43009F4FBC0C831AD -:101C300041F081E0CF91089580E090E266E00E945B -:101C400071241092A52081E0CF910895C53109F447 -:101C50004FC0C83189F3C63009F4F3C0C53149F724 -:101C600080E090E261E00E94712480E090E2609167 -:101C7000A6200E9471246091A620609580E090E2E9 -:101C80000E94712480E291E260E870E0AFDC4FDFF7 -:101C9000682F80E090E20E94712481E0A1CFC09380 -:101CA000B22084E08093A52081E0CF910895209117 -:101CB000AF203091B020F901E05EFE4DC083C90134 -:101CC00001968093AF209093B0208038910509F061 -:101CD000B0CF86E08093A52081E082CF80E090E2C3 -:101CE00065E10E94712482E08093A52081E078CF95 -:101CF00081E08093A6204091A9205091AA20609174 -:101D0000AB207091AC20E091AD20F091AE2080E24C -:101D100091E220E830E00995882309F479C080E059 -:101D200090E261E00E94712480E090E26091A62040 -:101D30000E9471246091A620609580E090E20E944C -:101D4000712480E291E260E870E050DCF0DE682F00 -:101D500080E090E20E9471248091A9209091AA20B5 -:101D6000A091AB20B091AC2080589F4FAF4FBF4F98 -:101D70008093A9209093AA20A093AB20B093AC208D -:101D800081E02ECFD4DE8C1709F0A8CF4091A92096 -:101D90005091AA206091AB207091AC20E091AD20D1 -:101DA000F091AE2080E291E220E830E009958823AE -:101DB00009F441C08091A6208F5F8093A620809176 -:101DC000A9209091AA20A091AB20B091AC2080587E -:101DD0009F4FAF4FBF4F8093A9209093AA20A0930D -:101DE000AB20B093AC2080E090E266E00E947124CA -:101DF00082E08093A52081E0F3CE1092AF20109274 -:101E0000B0201092B12083E08093A52081E0E8CE3D -:101E100080E090E264E00E94712489E08093A52034 -:101E200081E0DECE80E090E266E00E9471241092B4 -:101E3000A52081E0D5CE80E090E268E10E94712487 -:101E4000C7CE8091A6208F5F54CF8091A52081308E -:101E500071F0873009F008958091A820982F915053 -:101E60009093A8208823B9F71092A5200895809117 -:101E7000A820982F91509093A820882361F78091F3 -:101E8000A720982F91509093A720882331F4109287 -:101E9000A52085E08093A820089580E090E265E188 -:101EA0000E947124F6CF1F93CF93DF93982F915404 -:101EB0009A3120F090529A31B8F480522091B32098 -:101EC0003091B4202F3F310550F4F901E05EFE4D12 -:101ED00080832F5F3F4F2093B3203093B42081E065 -:101EE000DF91CF911F9108959F5C9A3038F38F3521 -:101EF00029F38F3319F38D3309F38D30A9F088302E -:101F000039F08B3161F71092B3201092B420E7CFF3 -:101F10008091B3209091B420009709F301978093AA -:101F2000B3209093B420DBCFE091B320F091B420A4 -:101F3000E05EFE4D10821092B3201092B42080918A -:101F40002021882309F4A7C08F3309F4A4C08D335E -:101F500009F4A1C0E1E2F1E2EF01219706C08F335D -:101F600009F4D3C08D3309F4CEC021968191882322 -:101F7000B1F710E0188280E291E26BE174E00E9418 -:101F8000EB25009709F420C180E291E261E374E05F -:101F90000E94EB25009709F415C180E291E267E405 -:101FA00074E00E94EB25009709F406C180E291E2FB -:101FB0006DE574E00E94EB25009709F4FBC080E218 -:101FC00091E263E774E00E94EB25009709F4F0C00A -:101FD00080E291E269E874E00E94EB25009709F441 -:101FE000B5C080E291E26FE974E00E94EB250097B2 -:101FF00009F4FAC080E291E265EB74E00E94EB25FF -:10200000009709F4EFC080E291E26BEC74E00E946B -:10201000EB25009709F4E4C080E291E261EE74E000 -:102020000E94EB25009709F4D9C080E291E267EFA6 -:1020300074E00E94EB25009709F4CEC080E291E2A3 -:102040006DE075E00E94EB25009709F4C3C080E2C3 -:1020500091E263E275E00E94EB25009709F4B8C0B5 -:1020600080E291E269E375E00E94EB25009709F4B4 -:10207000ADC080E291E26FE475E00E94EB2500972D -:1020800009F49EC080E291E265E675E00E94EB25CE -:10209000009709F493C088ECC0E0E1E8F5E0949182 -:1020A000891709F450C0B196E4918E1709F448C01D -:1020B000E3ECF5E0E4918E1709F43FC0E4EEF5E0BF -:1020C000E4918E1709F436C0E5E0F6E0E4918E174E -:1020D00071F1E6E2F6E0E4918E17C9F080E090E05D -:1020E00071DA8BE795E06EDACC2309F4F8CE8091B3 -:1020F0002021882309F4F3CE80E291E25EDA8EE7B4 -:1021000095E060DAECCE1DE335CF1FE333CF25E059 -:1021100030E0C901880F991F82959295907F98278A -:10212000807F9827820F931F8E579A4FD9CF24E034 -:1021300030E0EFCF23E030E0ECCF22E030E0E9CF39 -:1021400021E030E0E6CF20E030E0E3CF25E0109260 -:10215000202130E046E150E0249FC001259F900DF2 -:10216000349F900D1124855E9B4F1F33F9F01D3372 -:1021700089F0112319F089ECC1E08FCF4096FC0162 -:1021800085919491FC010097B1F380E291E2099569 -:10219000C1E083CF4296FC0185919491FC010097A8 -:1021A00051F3CE0101960995C1E077CF4496E7CF70 -:1021B00024E0CDCF23E0CBCF22E0C9CF2FE0C7CFA3 -:1021C0002EE0C5CF21E0C3CF20E0C1CF2DE0BFCFAF -:1021D0002CE0BDCF2BE0BBCF2AE0B9CF29E0B7CFB1 -:1021E00028E0B5CF27E0B3CF26E0B1CF0895A0E235 -:1021F000B6E082E011968C93119715968C93159703 -:10220000E0E4F8E010A211A28DE291E086A397A38A -:102210008FEF9FEF80A791A781E0808398E8938359 -:1022200093E097831A968C931A9708951F920F92B2 -:102230000FB60F9211248F939F93EF93FF9380E239 -:1022400092E28093C1209093C22080EA92E2809330 -:10225000C3209093C4201092BA201092B9201092FB -:10226000B5201092BD201092BE201092B820E0E45C -:10227000F8E0138286E990E086AB97AB8AE190E0C4 -:1022800080AF91AFE0E4F9E010A211A28FEF9FEFD1 -:1022900086A397A389E883838EE08083E0E2F6E05B -:1022A0001286FF91EF919F918F910F900FBE0F902B -:1022B0001F9018951F920F920FB60F9211242F9313 -:1022C0008F939F93EF93FF93909128068091B9206D -:1022D000880F957021E009F020E0822B8093B920CF -:1022E0009091B5209923A1F1982F9770973009F418 -:1022F00044C08C7069F191E082FD6EC09093B7206C -:102300008091B820882309F06FC08091BA2086950B -:10231000992309F471C020E8282B2093BA208091DA -:10232000BD209091BE2001968093BD209093BE2049 -:1023300087709070009761F4E091C120F091C22005 -:102340002193E093C120F093C22081E08093B820D4 -:102350009091B52081E0911180E08093B52088E8CC -:10236000E0E4F8E08383FF91EF919F918F912F91AB -:102370000F900FBE0F901F9018951092400880E1AB -:10238000E0E4F8E08487E0E4F9E013828091B7208C -:10239000882369F18CEB94E086A397A31092B62072 -:1023A000E0E4F9E081E0848783E086838091BD20CA -:1023B0009091BE20877061F09091BA208F5F9695C2 -:1023C0008F5F8930E1F7E091C120F091C2209083C6 -:1023D00081E08093BF20BCCF90E09093B7208091A4 -:1023E000B820882309F491CF1092B820B1CF8CE7A0 -:1023F00094E086A397A3D2CF20E08ECF1F920F92B6 -:102400000FB60F9211242F933F938F939F93AF9307 -:10241000BF93EF93FF938091B620853009F455C0A8 -:102420008630C0F0883009F486C0893040F58630A7 -:1024300009F4C7C0873009F495C0FF91EF91BF91AF -:10244000AF919F918F913F912F910F900FBE0F9061 -:102450001F901895823089F1833008F1833009F498 -:102460005BC0843051F78091BA2080FDC7C080E402 -:10247000E0E4F6E0868385E08093B620DECF893005 -:1024800009F461C08A30C9F610924009E0E4F9E02D -:1024900016821092000881E08093C020CECF88235E -:1024A00009F459C0813049F68FE390E0E0E4F9E0A7 -:1024B00086A397A38EE08093000880E4E0E4F6E032 -:1024C000858383E08093B620B8CF8091BA2090E4D2 -:1024D000E0E4F6E080FD90C0958386958093BA2075 -:1024E0008091BB209091BC2001968093BB2090935B -:1024F000BC209C01277030702115310509F483C080 -:102500002091BD203091BE208217930709F055C05D -:1025100088E08093B62091CF80E4E0E4F6E0868303 -:1025200084E08093B620E091C120F091C2208081A8 -:102530008093BA2082CF80E4E0E4F6E0868389E0ED -:102540008093B6207ACF80E4E0E4F6E086838AE0E8 -:102550008093B62072CF8FE790E0E0E4F9E086A3A5 -:1025600097A36BCFE091C320F091C4208081882392 -:10257000E1F580E4A0E4B6E015968C9315972091E0 -:10258000BB203091BC208091BD209091BE202817A7 -:10259000390709F4BDCF3196E093C320F093C420EE -:1025A000E091C120F091C220CF0101968093C1201B -:1025B0009093C22081818093BA2084E08093B620DA -:1025C0003CCFE091C320F091C4208081882341F466 -:1025D00080E4E0E4F6E0868387E08093B6202DCFA8 -:1025E00080E4E0E4F6E08583F7CF80E4A0E4B6E0A1 -:1025F00016968C931697C3CF96836FCF80E4E0E452 -:10260000F6E0858338CF86E08093B62016CFCF934F -:10261000DF93E0E4F6E084E08283128AC0E8D1E050 -:1026200082E68E83A0E2B6E085E012968C93129744 -:1026300081E050968C93509782E052968C935297FB -:102640001A961C921A9783E019968C9398E59883B2 -:102650009AE5998390E49183968381838683E0E071 -:10266000F8E08FE090E086A397A388E090E082A74F -:1026700093A783E28183BBDDDF91CF9108958091A1 -:10268000BF208823C9F01092BF20E0E2F6E082E08C -:10269000818386836091BD207091BE206115710594 -:1026A00099F4E091FF20F0910021099510924009E2 -:1026B000E0E4F9E016829BDD8091C020882309F4D4 -:1026C00008951092C02093CDE0910321F091042150 -:1026D00080E292E209959C0194FD28C0AC015695D8 -:1026E0004795569547955695479541155105F9F0EB -:1026F00060E0E0E0F0E0E05EFD4D8081082E829534 -:102700008025082E869586958025E058FF4F90E01D -:1027100001969595879591E080FD90E090836F5F9D -:10272000E62FF0E0E417F50730F301C03F7E2115F6 -:10273000310509F4BBCF2093BD203093BE20109209 -:10274000BB201092BC2080E292E28093C120909343 -:10275000C22080EA92E28093C3209093C42081E05B -:102760008093B6208091C020882309F4A9CFA9CFF7 -:1027700081E08093C52084E090E08093C620909310 -:10278000C72088E08093C820089581E08093C52009 -:1027900082E090E08093C6209093C72088E18093E8 -:1027A000C820089581E08093C520089508958F92F0 -:1027B0009F92AF92BF92CF92DF92EF92FF920F93D0 -:1027C0001F93CF93DF93CDB7DEB72E97CDBFDEBF7C -:1027D0007C018091C520843009F4F9C0853008F46B -:1027E0003FC0863009F4C0C0863008F064C0F701ED -:1027F00000810E94081C8027D7018C9311960C91B0 -:102800000E94081C8027F701818302810E94081C16 -:102810008027D70112968C93129713960C91F8D7B4 -:102820008027F70183838081803309F4BDC2803A19 -:1028300009F439C3803C09F453C3813C09F435C41D -:10284000823C09F43FC4803B09F44BC4805682307B -:1028500008F496C181E08093C52080E090E065C0D7 -:10286000823009F4A0C0833008F46FC0F701808182 -:10287000863209F46FC1823509F46CC1803509F4E0 -:1028800075C1982F9056923008F4E7C1803351F00B -:10289000803A41F0803C31F0813C21F0823C11F0E3 -:1028A000803BC1F681E08093C52084E0F7018083FE -:1028B00084E090E03AC08A3008F053C0F70100810C -:1028C000A7D78027D7018C9311960C91A1D7802789 -:1028D000F701818302819CD78027D70112968C93C0 -:1028E000129713960C9194D78027F7018383048164 -:1028F0008FD78027D70114968C93149715960C9137 -:1029000087D78027F7018583C70164E070E092D400 -:10291000882309F00FC2BDD791E09827F701908373 -:1029200085E08093C52084E090E02E96CDBFDEBF89 -:10293000DF91CF911F910F91FF90EF90DF90CF909B -:10294000BF90AF909F908F9008952091C620909156 -:10295000C720D7018C91863209F4F3C0823509F47F -:10296000F0C080E090E0E1CF8701CC24F8018080C6 -:102970004FD78825D8018D938D01C394B2E1CB1632 -:10298000A9F7C70160E170E055D4882309F4EFC1CD -:1029900080910C21882309F4F0C17BD79AE0982715 -:1029A000F7019083BDCF2091C6209091C720D70119 -:1029B0008C91863209F4C5C0823509F4C2C08339CE -:1029C00009F435C21092C52080E090E0AECFC70177 -:1029D000E0D6D70114960C911BD78027F70184838A -:1029E000058116D78027D70115968C9315971696D3 -:1029F0000C910ED78027F7018683078109D780279E -:102A0000D70117968C93179714962C911497909141 -:102A1000C920291709F01ECF15962C911597909172 -:102A2000CA20291709F016CF16962C911697909167 -:102A3000CB20291709F00ECF9091CC20891709F0EF -:102A400009CF0091CD20E4D68027F7018083009143 -:102A5000CD20002E02950025002E06950695002516 -:102A60009ED4F701E058FF4F202F30E02F5F3F4FFB -:102A70003595279591E020FD90E09827908300916F -:102A8000CE20C6D68027D70111968C930091CE20F8 -:102A9000002E02950025002E0695069500257FD470 -:102AA000F701EF57FF4F202F30E02F5F3F4F359555 -:102AB000279591E020FD90E0982790830091CF200A -:102AC000A7D68027F70182830091CF20002E0295A0 -:102AD0000025002E06950695002561D4F701EE57D6 -:102AE000FF4F202F30E02F5F3F4F3595279591E026 -:102AF00020FD90E0982790830091D02089D68027F0 -:102B0000D70113968C930091D020002E02950025BA -:102B1000002E06950695002542D4F701ED57FF4F8C -:102B2000202F30E02F5F3F4F3595279591E020FD16 -:102B300090E09827908385E08093C52080E290E123 -:102B4000F4CEF7012083918382E08093C52080E159 -:102B500090E0EBCE84E0D7018C9311961C921197F4 -:102B600082E08093C52080E190E0DFCEF701818193 -:102B7000882309F4D7C2F701108284E090E0D5CE13 -:102B8000C70162E070E056D3882309F405C1D7017C -:102B900011960C9111970C738C91803609F4DFC259 -:102BA0008AE390E010E002951295107F1027007FD5 -:102BB0001027080F191FCE01059664E00E94EB0450 -:102BC000CE01019660E070E044E050E00E941D06F6 -:102BD000CE010996B80146E050E00E941D068D81A5 -:102BE0008093C9208E818093CA208F818093CB20CF -:102BF00088858093CC2089EC90E260E470E06DD60B -:102C00008091C9208093CD208091CA208093CE20CE -:102C10008091CB208093CF208091CC208093D020B6 -:102C20008DEC90E260E270E058D6CE010996BE01CC -:102C30006F5F7F4FAE014B5F5F4FE5D38D81F70133 -:102C400080838E8181838F8182838885838384E0E2 -:102C50008093C52080E290E068CEC70162E070E01A -:102C6000E9D2882309F465C2D70111960C91119716 -:102C70000C738C91803609F475C28AE390E010E001 -:102C800002951295107F1027007F1027080F191F3B -:102C9000CE01019664E00E94EB04CE01059660E04F -:102CA00070E044E050E00E941D06CE010996B80194 -:102CB00046E050E00E941D0689818093C9208A81E8 -:102CC0008093CA208B818093CB208C818093CC20F1 -:102CD00089EC90E260E470E000D68091C920809396 -:102CE000CD208091CA208093CE208091CB208093EC -:102CF000CF208091CC208093D0208DEC90E260E2B8 -:102D000070E0EBD584E08093C5208981F701808352 -:102D10008A8181838B8182838C818383CE01099612 -:102D2000BE016B5F7F4FAE014F5F5F4F6CD380E2A0 -:102D300090E0FBCD6091D12070E062957295707F3C -:102D40007627607F762782ED90E240E150E00E9496 -:102D50001D062091D2208091D6208095281709F455 -:102D6000D6C097D596E09827D7019C93D9CD91D519 -:102D700091E09827D7019C93D3CD6091D12070E04A -:102D800062957295707F7627607F7627C70140E154 -:102D900050E00E94A80601CE7CD591E09827D7018B -:102DA0009C9384E090E0C1CDC70162E070E042D224 -:102DB000882391F3D70111966C9170E0629572951A -:102DC000707F7627607F7627C70140E150E00E9440 -:102DD0001D06C70160E170E0EFD1870130E8E32E06 -:102DE000F12CE00EF11E8824F801C08011D58C254D -:102DF000D8018D938D010C2CC294C0240C2CC69448 -:102E0000C694C024CCD22C2D30E02F5F3F4F359597 -:102E1000279591E020FD90E09827F70191937F019D -:102E20008394F2E18F1601F780E990E17ECDCE0127 -:102E3000059660E070E044E050E00E941D0690912D -:102E4000C820D70111968C911197803209F477C16F -:102E5000803709F086CDD70112962C9112978D817B -:102E6000281709F07ECD13962C9113978E81281781 -:102E700009F077CD14962C9114978F81281709F0BB -:102E800070CD15962C9115978885281709F069CD76 -:102E90009C93C70161E070E08FD183E08093C520EF -:102EA00088E190E042CDC70162E070E0C3D18823A1 -:102EB00079F0F70181818093D12086E08093C5204D -:102EC000E8D49AE09827D7019C9384E090E02DCD38 -:102ED000E0D491E09827F701908384E090E025CD3D -:102EE000C70162E070E0A6D1882309F455CFD7016D -:102EF00011968C918093D12088E08093C520C9D40D -:102F00009AE09827F701908384E090E00ECD8091BD -:102F1000DA20281709F025CF3091D3208091D720CF -:102F20008095381709F01DCF8091DB20381709F004 -:102F300018CF4091D4208091D8208095481709F06F -:102F400010CF8091DC20481709F00BCFE091D520FD -:102F50008091D9208095E81709F003CF8091DD207A -:102F6000E81709F0FECE9091DE208091DF20809559 -:102F7000981709F0F6CE8091E020981709F0F1CE6D -:102F80008091E1208095981709F0EBCED70111963A -:102F90008C9011979924AA24BB24BA2CA92C982C84 -:102FA000882412968C9190E0A0E0B0E0DC01992793 -:102FB0008827882A992AAA2ABB2AD7018C9190E0CF -:102FC000A0E0B0E0882A992AAA2ABB2AD701139642 -:102FD000CC90DD24EE24FF24FC2CEE24DD24CC2434 -:102FE0008C289D28AE28BF28832F90E0A0E0B0E079 -:102FF000BA2FA92F982F882750E060E070E0BA011F -:1030000055274427842B952BA62BB72B30E040E087 -:1030100050E0822B932BA42BB52B4E2F50E060E079 -:1030200070E0742F662755274427842B952BA62BF9 -:10303000B72B2091C520283009F46FC0273021F428 -:10304000880D991DAA1DBB1D8093D220092F1A2F10 -:103050002B2F33270093D320AD016627772740938A -:10306000D420CB2EDD24EE24FF24C092D520E82FDF -:10307000E095E093D620E02FE095E093D720E42F71 -:10308000E095E093D820EC2DE095E093D920809353 -:10309000DA200093DB204093DC20C092DD2085E025 -:1030A0008093C52080E090E040CCC70162E070E0F2 -:1030B000C1D0882309F40CCFF70181818093D120FE -:1030C00087E0FCCEC70162E070E0B4D0882309F449 -:1030D00063CED70111968C9111978093D12089E00E -:1030E0000CCFC70162E070E0A5D0882309F4F0CED0 -:1030F00080910C21882309F0E3CEF701618170E013 -:1031000062957295707F7627607F762782ED90E2D8 -:1031100040E150E00E94A806D3CE88199909AA0977 -:10312000BB0992CFC70162E070E084D0882309F028 -:1031300049CC81E0D7018C9384E090E0F6CB8D817F -:10314000F70180833E8131832F8122839885938389 -:10315000832782278927848388E290E0E6CB80E377 -:1031600090E020CD80E390E08ACD60E070E044E024 -:1031700050E00C941D06CF93DF930F92CDB7DEB7CE -:10318000FC018181908189279281892793818927F8 -:103190008983CF0160E070E044E050E00E94A8061F -:1031A000CE01019664E070E041E050E00E94A80684 -:1031B0000F90DF91CF910895EF92FF920F931F939D -:1031C000CF937C018B016115710581F1FB01DC015D -:1031D00043E653E68D918427C82FC295C07FC82748 -:1031E0008C2F90E0782F66279C01220F331F220F2F -:1031F000331F220F331F62277327452F552746277A -:103200005727C295CF708C2F90E0482759273197C8 -:1032100009F7F701E00FF11F942F852F9083818329 -:10322000CF911F910F91FF90EF900895FC0183E6DD -:1032300093E6F4CFEF92FF920F931F93CF937C010D -:103240008B016115710509F43DC0FB01DC0143E60A -:1032500053E68D918427C82FC295C07FC8278C2F35 -:1032600090E0782F66279C01220F331F220F331F17 -:10327000220F331F62277327452F552746275727CD -:10328000C295CF708C2F90E048275927319709F7C6 -:10329000F701E00FF11F9A013070808190E08217F2 -:1032A000930739F080E0CF911F910F91FF90EF903D -:1032B0000895218130E0452F552781E024173507F7 -:1032C00089F7F1CFFC0123E630E043E653E6E5CF92 -:1032D000CF92DF92EF92FF920F931F930091E52020 -:1032E0004091E6203091E720A091E220F091E32088 -:1032F000E091E420942F9071202F217E9227232F9C -:10330000207292272A2F247992272F2F2377922712 -:103310002E2F2A739227292F22952F702927922F3B -:10332000969596959227B92FB69550E060E070E09B -:10333000762F652F542F4427C32EDD24EE24FF243F -:103340007601DD24CC244C295D296E297F2910E0EB -:1033500020E030E0402B512B622B732B7695679544 -:1033600057954795B9272B2F30E02170307090E0AA -:103370002817390709F06068A093E520F093E6204C -:10338000E093E7204093E2205093E3206093E42011 -:103390001F910F91FF90EF90DF90CF900895509183 -:1033A000E3204091E420242F2F708DE190E2DC0196 -:1033B000A20FB11D252F2F70FC01E20FF11DD09639 -:1033C0002C91D0973089232B3091E22032953F7099 -:1033D000FC01E30FF11D3081232B52955F70FC013E -:1033E000E50FF11D30A1232B42954F70840F911DE5 -:1033F000805C9F4FFC018081282BEDE6F0E2E20F1C -:10340000F11D80810895CF92DF92EF92FF920F938A -:103410001F93CF93DF93FC01EA01318120E080818B -:1034200090E0822B932B80FDB2C130E081FDADC1D5 -:1034300020E09695879596958795432F406880FD67 -:10344000342F422F406881FD242F969587959695BD -:10345000879536952695432F406880FD342F422F5F -:10346000406881FD242F969587959695879536958A -:103470002695432F406880FD342F422F406881FD00 -:10348000242F969587959695879536952695432F63 -:10349000406880FD342F422F406881FD242F96958F -:1034A00087959695879536952695432F406880FD9C -:1034B000342F422F406881FD242F9695879596954D -:1034C000879536952695432F406880FD342F422FEF -:1034D000406881FD242F969587959695879536951A -:1034E0002695532F5068422F406880FD352F30932A -:1034F000E52081FD242F2093E220338120E082818A -:1035000090E0822B932B80FD3EC130E081FD39C1DC -:1035100020E09695879596958795432F406880FD86 -:10352000342F422F406881FD242F969587959695DC -:10353000879536952695432F406880FD342F422F7E -:10354000406881FD242F96958795969587953695A9 -:103550002695432F406880FD342F422F406881FD1F -:10356000242F969587959695879536952695432F82 -:10357000406880FD342F422F406881FD242F9695AE -:1035800087959695879536952695432F406880FDBB -:10359000342F422F406881FD242F9695879596956C -:1035A000879536952695432F406880FD342F422F0E -:1035B000406881FD242F9695879596958795369539 -:1035C0002695532F5068422F406880FD352F309349 -:1035D000E62081FD242F2093E320958180E0248143 -:1035E00030E0282B392B20FDCAC050E021FDC5C09A -:1035F00040E0C9019695879596958795352F306857 -:1036000080FF352F242F206881FF242F96958795E2 -:103610009695879536952695432F406880FD342FE3 -:10362000422F406881FD242F969587959695879522 -:1036300036952695432F406880FD342F422F4068F1 -:1036400081FD242F96958795969587953695269595 -:10365000432F406880FD342F422F406881FD242F86 -:10366000969587959695879536952695432F40682C -:1036700080FD342F422F406881FD242F9695879539 -:103680009695879536952695432F406880FD342F73 -:10369000422F406881FD242F9695879596958795B2 -:1036A00036952695532F5068422F406880FD352F60 -:1036B0003093E72081FD242F2093E420C980DB0193 -:1036C00011968C911197C826DD24EE24FF24FE2C40 -:1036D000ED2CDC2CCC248A8112969C91892790E0D9 -:1036E000A0E0B0E0DC0199278827C82AD92AEA2A75 -:1036F000FB2A8881FB019081892790E0A0E0B0E05F -:10370000C82AD92AEA2AFB2A8B819381892790E04B -:10371000A0E0B0E0B82FAA2799278827C82AD92A7D -:10372000EA2AFB2A10E23BDE082F8C2D8170D0DDC7 -:10373000F694E794D794C794002341F080E090E09A -:10374000A0E0B0E8C82AD92AEA2AFB2A115059F782 -:1037500088818C25888389818D2589838A818E251E -:103760008A838B818F258B83DF91CF911F910F915E -:10377000FF90EF90DF90CF90089540E43ACF50E46F -:1037800035CF20E4C6CE30E4C1CE20E452CE30E4C2 -:103790004DCECF92DF92EF92FF92CF93FC01C1808A -:1037A000DD24EE24FF24FE2CED2CDC2CCC248281A5 -:1037B00090E0A0E0B0E0DC0199278827C82AD92A48 -:1037C000EA2AFB2A808190E0A0E0B0E0C82AD92A4A -:1037D000EA2AFB2A838190E0A0E0B0E0B82FAA2774 -:1037E00099278827C82AD92AEA2AFB2AC0E2D7DDE6 -:1037F0009C2D917089276CDDF694E794D794C7943B -:10380000C150A9F7CF91FF90EF90DF90CF9008952E -:10381000CF93DF93C4DDC82F80E05ADDCC2309F4B9 -:1038200036C0C0E8BCDDD82F80E052DDC695D1118E -:10383000C068B5DDD82F80E04BDDC695D111C068DA -:10384000AEDDD82F80E044DDC695D111C068A7DD7C -:10385000D82F80E03DDDC695D111C068A0DDD82FFE -:1038600080E036DDC695D111C06899DDD82F80E0A3 -:103870002FDDC695D111C06892DDD82F80E028DDFC -:103880008C2F8695D1118068DF91CF910895C0E08B -:10389000C9CFCF93DF9383DDC82F80E019DDCC2320 -:1038A000D1F0C8E07CDDD82F80E012DDC695D111C3 -:1038B000C86075DDD82F80E00BDDC695D111C860DA -:1038C0006EDDD82F80E004DD8C2F8695D1118860C5 -:1038D000DF91CF910895C0E0E5CF8F929F92AF9294 -:1038E000BF92CF92DF92EF92FF920F931F93CF93ED -:1038F000DF934C015B016115710509F45FC0DC01C8 -:103900001296CC911297EC911196DC911197139627 -:10391000FC919C2F9D72892F82958F708927282F6B -:10392000269526952827322F36958D2F90E0A0E0FA -:10393000B0E0BA2FA92F982F88274C2F50E060E0D5 -:1039400070E0BA0155274427842B952BA62BB72B63 -:103950004E2F50E060E070E0842B952BA62BB72B08 -:103960004F2F50E060E070E0742F66275527442702 -:10397000842B952BA62BB72BB695A7959795879556 -:10398000322730FDB068E82F492F5A2F6B2F772749 -:10399000D42F8D0122273327C02FCB2EDD24EE24F8 -:1039A000FF24FC2D0894A108B108A114B10409F06A -:1039B000B0CFF401808341830283C382DF91CF9132 -:1039C0001F910F91FF90EF90DF90CF90BF90AF903D -:1039D0009F908F9008951F93CF93DF93CDB7DEB75D -:1039E000EE97CDBFDEBF4DD3809325234AD380937E -:1039F000262347D38093272344D38093282341D37E -:103A0000809329233ED380932A233BD380932B2377 -:103A100038D380932C230E94700BD5D3882391F048 -:103A20009091252380912623853009F453C0863058 -:103A3000A8F0883009F4BAC0893009F49EC08630F5 -:103A400009F45DC0C0D3882311F091D374D3EE96EE -:103A5000CDBFDEBFDF91CF911F910895813029F056 -:103A6000813008F46EC0833069F7992309F4A8C047 -:103A7000923041F780912723882339F5109129232B -:103A80001F7001F3812F1BD380912623833009F40B -:103A9000F8C0E0912F23F091302381818B7F8183C7 -:103AA000212F30E084E890E0289FF001299FF00D5D -:103AB000389FF00D1124ED58FC4D1082E0912F231A -:103AC000F091302380818E7F808380E0F8D24FD3C5 -:103AD000A8D4B8CF992309F0B5CF109127231F7729 -:103AE00046D39FD4A0D38823E9F3E0ECF4E013831A -:103AF000112309F07AC082E080932423A3CF905849 -:103B0000923008F09FCF809127239091282323E0C3 -:103B10008C3D920709F46BC060912923AE014F5F81 -:103B20005F4F0E947A03BC01009709F48BCF8DAFE1 -:103B30007EAF1DD389819A816DAD7EADCAD192D2FF -:103B400081CF903809F448C0923809F07BCF80913A -:103B500029238F70B4D2E0912F23F09130238181FB -:103B600011E082FF10E080E0AAD201D3812F98D229 -:103B700080E096D25ED255D465CF992309F062CF0A -:103B800080912723823008F05DCFF1D280912723E6 -:103B90008093202346D480912023882309F467C092 -:103BA00084E0809324230E946C0B4CCF903809F062 -:103BB00049CFDDD28091202373D23BD232D442CF81 -:103BC00090912723913009F03DCF91E0833009F0A7 -:103BD00090E09093222379CF10912123809122238A -:103BE000882309F4C2CF1260C0CF83E085CF83E081 -:103BF0008C838AE38B836FB7F894A0ECB1E082E00A -:103C00001A968C931A97E8E0F0E024911A961C9289 -:103C1000DE01159681E090E078E040EC51E012E0A2 -:103C2000E22FEF702E2F30E0EA30A8F0295C3F4FF2 -:103C30002D933D938C31910589F0FA011287E72F7E -:103C4000F0E02491FA01128680FF03C022952F70C4 -:103C50007F5F0196E5CF205D3F4FEACF6FBF87D2F0 -:103C6000CE0103966AE370E08FD0FCD1EBCE809159 -:103C7000C304882321F084E08093242394CF81E03F -:103C8000FBCF59D222CF0895CF938091242388234C -:103C900011F4CF910895C091312380E010D293D2D6 -:103CA000882321F48C2F0BD2CF91089594DEFACF84 -:103CB000AF92BF92CF92DF92FF920F931F93CF9359 -:103CC000DF93EC018B016A01C2D3F82E882361F5E2 -:103CD000C114D10439F0F60180819181081B190BC0 -:103CE000C80FD91F01151105F9F0C114D10441F015 -:103CF00026C08991D5D10150104001151105A1F0C0 -:103D000080912D2390912E23FC01EF5BFF4F2081AA -:103D1000805C9F4FFC018081281758F38AD1B4DF63 -:103D200096D3882351F3F82E8F2DDF91CF911F91D9 -:103D30000F91FF90DF90CF90BF90AF900895AA248D -:103D4000BB2480912D2390912E23FC01EF5BFF4F2C -:103D50002081FC01E05CFF4F8081281760F069D171 -:103D600093DFF601808191818A0D9B1D8083918371 -:103D700025E0F22ED9CF899193D10894A11CB11CD2 -:103D80000A151B05F1F6D0CFCF92DF92EF92FF928A -:103D90000F931F93CF93DF93D82EC92EEB01809101 -:103DA000312380688CD1E0902B23F0902C23EC16EB -:103DB000FD0620F0209709F486C07E0100E0E114A2 -:103DC000F10409F04CC0002309F45FC08091242362 -:103DD000882309F458C0853009F460C0F4D18823E1 -:103DE00009F06FC008D2882309F04FC01CD2882385 -:103DF00069F38091312387FD5BC080912D239091E1 -:103E00002E23FC01E05CFF4FC0818F5B9F4FFC01C4 -:103E10008081D0E0C81BD109E114F104B1F0C830B1 -:103E2000D10598F40D2D1C2D03C0C830D10569F0C3 -:103E3000F80181918F0134D1D02EC12E0894E10870 -:103E4000F1082196E114F10481F701E0C830D105B1 -:103E500009F000E0EED0E114F10409F4B4CF809150 -:103E60002423882381F08530C9F0ADD1882349F51A -:103E7000C2D1882351F4D7D1882309F0BACF8091D9 -:103E80002423882381F782E00AC0B5D18823F9F47E -:103E9000809124238823B9F38530B9F783E0DF913B -:103EA000CF911F910F91FF90EF90DF90CF900895E9 -:103EB000E0912D23F0912E23EF5BFF4FC081D0E0E6 -:103EC000ABCF81E0ECCFB5D0EE24FF2477CF80E0FC -:103ED000E6CFCF92DF92EF92FF920F931F93CF9393 -:103EE000DF930F92CDB7DEB7D82EC92E7B0180911C -:103EF00031238068E4D000912B2310912C230E15E0 -:103F00001F0528F0E114F10409F48DC08701ED2CA0 -:103F1000FC2C80E00115110509F050C0882309F43C -:103F200063C080912423882309F45CC0853009F4A0 -:103F300064C049D1882309F074C05DD1882309F099 -:103F400053C071D1882369F38091312387FD60C00C -:103F500080912D2390912E23FC01E05CFF4FC080C7 -:103F60008F5B9F4FFC018081DD24C81AD1080115A9 -:103F70001105B9F088E0C816D10428F012C0F8E0A5 -:103F8000CF16D10471F0F70184918AD00894E11C16 -:103F9000F11C015010400894C11CD11C01151105E1 -:103FA00071F781E098E0C916D10409F080E08983B7 -:103FB00040D089810115110509F4B0CF80912423E7 -:103FC000882381F08530C9F0FED0882351F513D1C4 -:103FD000882351F428D1882309F0B6CF8091242377 -:103FE000882381F782E00AC006D1882301F58091F9 -:103FF00024238823B9F38530B9F783E00F90DF914C -:10400000CF911F910F91FF90EF90DF90CF90089587 -:10401000E0912D23F0912E23EF5BFF4FC080DD2434 -:10402000A6CF81E0EBCF05D000E010E070CF80E0BC -:10403000E5CFE0912F23F0913023A0912D23B09173 -:104040002E23AF5BBF4F8C9190E08283938380815E -:104050008D798083E0912D23F0912E23EF5BFF4F2C -:1040600010820895E0912F23F091302380818D7983 -:104070008083E0912D23F0912E23EF5BFF4F108280 -:10408000089580912D2390912E23FC01EF5BFF4F2B -:104090002081820F911DDC018C912F5F2083089578 -:1040A00020912D2330912E23F901EF5BFF4F90815A -:1040B000290F311DD9018C939F5F90830895282F7C -:1040C0002F708093312330E064E870E0269FA001D8 -:1040D000279F500D369F500D11244E5C5C4D609112 -:1040E000C6047091C70487FD11C040932D235093DF -:1040F0002E2322953295307F3227207F3227260FBC -:10410000371F20932F233093302308954E5B5F4F4A -:1041100040932D2350932E2322953295307F3227C2 -:10412000207F3227285F3F4F260F371F20932F23F2 -:10413000309330230895E0912F23F0913023818133 -:1041400084608183E0912F23F09130238181807CF2 -:10415000803409F00895809131238058B0DFE091D8 -:104160002F23F09130238181846081830895809191 -:1041700031238F77A4DFE0912F23F09130238081CA -:104180008D788083E0912F23F091302380818160AE -:104190008083E0912D23F0912E23EF5BFF4F10825F -:1041A0008091312380688BDFE0912F23F0913023C1 -:1041B000808181608083E0912D23F0912E23EF5B3D -:1041C000FF4F10820895809131238F7778DFE0913F -:1041D0002F23F0913023808184FF0BC0A0912D23E9 -:1041E000B0912E2382819381A05CBF4F8C9381E09C -:1041F000089580E00895809131238F7760DFE0910A -:104200002F23F0913023808185FF0BC0A0912D23B7 -:10421000B0912E2382819381A05CBF4F8C9381E06B -:10422000089580E0089580913123806848DFE0910F -:104230002F23F0913023908181E091FF80E0089559 -:104240001F93CF93DF9300D0CDB7DEB7182F4A83EB -:10425000698335DFE0912F23F09130231182E091C3 -:104260002F23F09130234A81698117FD22C01082EB -:10427000E0912F23F09130236183E0912F23F0917F -:1042800030231282138280912D2390912E238483D8 -:10429000958340E0FC01E05CFF4F40838F5B9F4FC4 -:1042A000DC011C9281E00F900F90DF91CF911F9164 -:1042B000089582E08083E0912F23F0913023618381 -:1042C000E0912F23F09130231282138280912D23CD -:1042D00090912E2384839583DDCFCF92DF92EF924E -:1042E000FF920F931F93CF93DF930F92CDB7DEB75B -:1042F000F62E662309F441C06C0110E0F60100813E -:10430000002399F16381218132818481823008F414 -:1043100041C048E158E12930310550F088E090E093 -:1043200040E04F5F880F991F82179307D0F3452B0A -:10433000802F90E08F709070863091054CF521347D -:10434000310530F54F7E662341F5942F9064E22EBF -:10435000802F8058692F422F998372DF9981802F97 -:10436000692F4E2D6DDF882399F01F5F85E090E067 -:10437000C80ED91E1F1509F0C1CF81E00F90DF9143 -:10438000CF911F910F91FF90EF90DF90CF90089504 -:1043900080E0F4CF48E058E0BECF613031F0942F98 -:1043A00090686623A1F2E22EDACF942F906CE22E71 -:1043B000D6CFE0ECF4E0A681B78119961C92A681D5 -:1043C000B78111961C92A681B78159961C92A6813D -:1043D000B78151961C92A681B78199961C92A681AD -:1043E000B78191961C92A681B781D9961C92A6811D -:1043F000B781D1961C92A681B781A75BBF4F1C9253 -:10440000A681B781AF5BBF4F1C92A681B781A75A27 -:10441000BF4F1C920680F781E02DEF5AFF4F1082AC -:1044200008958091252387FD08C0FDDE882369F467 -:10443000809124238823C9F70895DDDE882331F491 -:10444000809124238823C9F70895F3CD0BCE1F93C1 -:10445000CF93DF93E091C604F091C704E05AFF4F79 -:10446000C081D18114E6809131238078803821F198 -:10447000C2DE882321F580912423882329F1853009 -:1044800041F1E0912F23F0913023818182FD26C0FC -:10449000E091C604F091C704E05AFF4F80819181FA -:1044A000C817D90701F31123F1F01150EC018091E5 -:1044B000312380788038E1F6B6DE8823E1F280E0AF -:1044C000DF91CF911F91089582E0DF91CF911F91ED -:1044D000089583E0DF91CF911F91089581E0DF91EE -:1044E000CF911F91089584E0DF91CF911F9108959E -:1044F00064D06AD0E0ECF4E081818E7F818380819A -:104500008F778083109223230895CF93DF93E0E485 -:10451000F0E014828481816084834FD055D0C0EC58 -:10452000D4E088818F77888388818068888310921F -:104530002423109220231092222310922123888179 -:104540008064888380E868E448E07ADE80E068E49C -:1045500048E076DE888580648887898181608983E8 -:10456000DF91CF910895CF93DF933FB7F894C0ECDC -:10457000D1E022E02A87EAE1F0E0E491A0ECB4E0A7 -:10458000DA96EC93DA97EBE1F0E0E491DB96EC93CA -:10459000DB971A868BE496E28E7F16968D939C931A -:1045A000179785E18C9318962C933FBF81E08093F9 -:1045B0002323ABDFDF91CF910895E0ECF4E0808519 -:1045C0008370808711860895E0ECF4E08FEF828796 -:1045D000848708951F920F920FB60F9211242F9384 -:1045E0003F934F935F936F937F938F939F93AF937B -:1045F000BF93EF93FF938091CA0487FD4FC08091D2 -:10460000CA0486FD42C08091CA0485FF0DC080E2C5 -:10461000E0ECF4E0828780912023882371F184E02C -:10462000809324230E94620BE0ECF4E08091CA04A2 -:1046300084FF12C080E1828782E08093242310925D -:1046400020231382B6DE80E868E448E0F9DD80E0EC -:1046500068E448E0F5DD17DBFF91EF91BF91AF9182 -:104660009F918F917F916F915F914F913F912F918A -:104670000F900FBE0F901F9018958091C304882350 -:10468000B9F481E080932423CDCF80E4E0ECF4E022 -:104690008287109224230E94670BB5CF8091C804B3 -:1046A00087FFADCF80E8E0ECF4E08287ECDAA7CFBB -:1046B00083E0E8CFEF92FF920F931F93CF93DF93A6 -:1046C000EC0181DD882349F0888190E02091292345 -:1046D00030912A232817390739F0DF91CF911F91A4 -:1046E0000F91FF90EF90089580912623813209F475 -:1046F0005FC0823208F04BC0803279F78091252369 -:10470000813259F734DD04C080912423882329F3B2 -:1047100072DD8823C9F3B5DCE82EB3DCF82EB1DCFA -:10472000082FAFDC482F50E060E070E0742F662760 -:104730005527442710E020E030E09801112700279A -:10474000402B512B622B732B8E2D90E0A0E0B0E01C -:10475000482B592B6A2B7B2B8F2D90E0A0E0B0E0EB -:10476000BA2FA92F982F8827482B592B6A2B7B2BE0 -:104770004C8B5D8B6E8B7F8B84DC888F82DC898F8A -:1047800080DC8A8F6FDC4DDECE019ED1A6CF8232D7 -:1047900061F1833209F0A1CF80912523813209F0A4 -:1047A0009CCFE5DC3EDECE01609127238DD195CFF5 -:1047B00080912523813A09F090CFD9DC34DD88231C -:1047C000E9F38C89ED88FE880F896ADC8E2D68DC20 -:1047D0008F2D66DC802F64DC888D62DC898D60DC47 -:1047E0008A8D5EDC26DC1DDE78CF80912523813228 -:1047F00009F073CFBCDC15DE80912723909128232C -:10480000888B998BCE0160D168CFCF93DF93EC0179 -:104810004096FC018BE0DF011D928A95E9F782E06A -:104820008C83898783E08E87CE01019661E055DD18 -:10483000882321F480E0DF91CF910895CE01069680 -:1048400061E04BDD8823B1F3CE010B9661E045DDDD -:10485000DF91CF910895CF93DF93EB012091242333 -:10486000243021F082E0DF91CF910895FC0144894A -:10487000558966897789411551056105710591F35F -:1048800081811DDCFE0101900020E9F73197EC1BCE -:10489000FD0BCE01BF0140E050E00ADAE4CF0F93F8 -:1048A0001F93CF93DF938B01EA01209124232430BF -:1048B00031F082E0DF91CF911F910F910895FC01BB -:1048C00044895589668977894115510561057105C6 -:1048D00081F38181F4DBC801BE0140E050E0E8D9FA -:1048E000E9CFCF93C62F20912423243019F082E002 -:1048F000CF910895FC0144895589668977894115CE -:1049000051056105710599F38181D9DB20912D2332 -:1049100030912E23F901EF5BFF4F9081205C3F4FD8 -:10492000F9018081981720F084DB91DD882301F75D -:104930008C2FB6DB80E0DCCF0F931F93CF93DF93F8 -:104940000F92CDB7DEB720912423243039F082E0D6 -:104950000F90DF91CF911F910F910895FC01448931 -:10496000558966897789411551056105710579F386 -:104970008181A5DB8091312320912D2330912E233D -:10498000F90187FD1DC0E05CFF4F8081F901EF5BFD -:10499000FF4F408190E0841B9109009711F480E063 -:1049A000D7CF0081205C3F4FF901108142DB011716 -:1049B000B0F34DDD882361F689833BDB8981C8CF65 -:1049C000EF5BFF4F808190E0E8CFCF93DF93EC0166 -:1049D00080912423843019F0DF91CF9108958C8940 -:1049E0009D89AE89BF890097A105B105A9F3898189 -:1049F00066DB19DC882381F3CE019EDFEDCFCF93F8 -:104A0000DF9300D0CDB7DEB7FC0180912423843042 -:104A100009F03EC044895589668977894115510559 -:104A200061057105A9F186814ADBE5DB882381F107 -:104A30008091312320912D2330912E23F90187FD80 -:104A40003EC0E05CFF4F8081F901EF5BFF4F40818A -:104A500090E0841B9109009711F58FEF9FEF409133 -:104A6000312347FD29C0205C3F4FD9012C91408163 -:104A700030E0241B31092115310561F489839A83C3 -:104A8000F1DA89819A810F900F90DF91CF9108958B -:104A90008FEF9FEF0F900F90DF91CF910895F1DA94 -:104AA00090E020912D2330912E23F901EF5BFF4FF1 -:104AB0004091312347FFD7CF208130E0DCCFEF5B3F -:104AC000FF4F808190E0C7CF0895629FD001739F10 -:104AD000F001829FE00DF11D649FE00DF11D929F9A -:104AE000F00D839FF00D749FF00D659FF00D9927D9 -:104AF000729FB00DE11DF91F639FB00DE11DF91FFD -:104B0000BD01CF01112408958F929F92AF92BF9261 -:104B1000CF92DF92EF92FF92CF93DF93EC018881E7 -:104B20009981AA81BB810097A105B10521F484E296 -:104B300099EDABE5B7E0BC01CD012DE133EF41E0EC -:104B400050E03DD349015A0127EA31E440E050E00A -:104B5000BCDF6B017C01C501B4012CEE34EF4FEFDB -:104B60005FEFB3DFDC01CB01C80ED91EEA1EFB1ECE -:104B7000F7FE08C08FEF9FEFAFEFBFE7C80ED91E5B -:104B8000EA1EFB1EC882D982EA82FB82C6019F7799 -:104B9000DF91CF91FF90EF90DF90CF90BF90AF90DB -:104BA0009F908F900895B0CF8DE990E2ADCFA0E0B7 -:104BB000B0E080939D2090939E20A0939F20B0937F -:104BC000A0200895FB01DC0102C005900D92415028 -:104BD0005040D8F70895FB01DC018D9105908019B4 -:104BE0000110D9F3990B0895FB01DC0141505040AD -:104BF00048F005900D920020C9F701C01D92415068 -:104C00005040E0F70895FB01DC0102C001900D92D5 -:104C100041505040D8F70895AEE0B0E0E1E1F6E24F -:104C2000F7C20D891E898F89988D2EE02C83098308 -:104C30001A8397FF02C080E090E801978D839E83DE -:104C4000AE01455E5F4FCE010196698D7A8D11D020 -:104C50004D815E8157FD0AC02F8138854217530769 -:104C60000CF49A01020F131FF80110822E96E4E053 -:104C7000E8C2ADE0B0E0EEE3F6E2BCC23C016C8716 -:104C80007D875A01FC0116821782838181FFBBC197 -:104C90002E010894411C511CF3019381EC85FD8584 -:104CA00093FD859193FF8191EC87FD87882309F41B -:104CB000A6C1853241F493FD859193FF8191EC87E4 -:104CC000FD87853221F490E0B301EFD1E5CFFF24D9 -:104CD000EE2410E01032B0F48B3269F08C3228F4FC -:104CE000803251F0833271F40BC08D3239F0803351 -:104CF00049F411602CC01260146029C0186027C0EC -:104D0000106125C017FD2EC0282F20532A3098F49B -:104D100016FF08C08F2D880FF82EFF0CFF0CF80E21 -:104D2000F20E15C08E2D880FE82EEE0CEE0CE80E5C -:104D3000E20E10620CC08E3221F416FD60C11064C8 -:104D400006C08C3611F4106802C0883659F4EC8520 -:104D5000FD8593FD859193FF8191EC87FD878823E5 -:104D600009F0B8CF982F9554933018F090529330A3 -:104D700038F424E030E0A20EB31E3FE339830FC0C5 -:104D8000833631F0833781F0833509F056C021C076 -:104D9000F5018081898322E030E0A20EB31E21E07C -:104DA000C22ED12C420113C092E0292E312C2A0CA4 -:104DB0003B1CF5018080918016FF03C06F2D70E0D1 -:104DC00002C06FEF7FEFC40165D16C0151011F7705 -:104DD00014C082E0282E312C2A0C3B1CF501808067 -:104DE000918016FF03C06F2D70E002C06FEF7FEF60 -:104DF000C40145D16C011068510113FD1AC005C0F2 -:104E000080E290E0B30151D1EA948E2D90E0C81673 -:104E1000D906B0F30EC0F40117FD859117FF8191FB -:104E20004F0190E0B30141D1E110EA940894C10828 -:104E3000D108C114D10479F7DFC0843611F0893666 -:104E400049F5F50117FF07C080819181A281B381E7 -:104E500024E030E008C080819181AA2797FDA095C9 -:104E6000BA2F22E030E0A20EB31E012F0F76B7FF5B -:104E700008C0B095A095909581959F4FAF4FBF4FBB -:104E80000068BC01CD01A2012AE030E03AD1D82E61 -:104E9000D4183EC0853721F41F7E2AE030E020C0C0 -:104EA000197F8F36A9F0803720F4883509F0A7C024 -:104EB0000BC0803721F0883709F0A1C001C0106114 -:104EC00014FF09C0146007C014FF08C0166006C0B4 -:104ED00028E030E005C020E130E002C020E132E00F -:104EE000F50117FF07C0608171818281938144E0E1 -:104EF00050E006C06081718180E090E042E050E0C7 -:104F0000A40EB51EA201FDD0D82ED418012F0F7704 -:104F100006FF09C00E7FDF1430F404FF06C002FD57 -:104F200004C00F7E02C01D2D01C01F2D802F90E0F8 -:104F300004FF0CC0FE01ED0DF11D2081203311F4A2 -:104F4000097E09C002FF06C01E5F05C0867890700A -:104F5000009709F01F5F802E992403FD11C000FF08 -:104F60000CC0FD2C1E1548F4FE0CF11A1E2D05C0B8 -:104F700080E290E0B30199D01F5F1E15C8F304C012 -:104F80001E1510F4E11A01C0EE2484FE0EC080E369 -:104F900090E0B3018AD082FE1DC081FE03C088E587 -:104FA00090E010C088E790E00DC0C4018678907052 -:104FB000009781F081FC02C080E201C08BE207FD16 -:104FC0008DE290E0B30171D005C080E390E0B301C1 -:104FD0006CD0FA94DF14C8F3DA94F201ED0DF11DF0 -:104FE000808190E0B30161D0DD20B1F705C080E29F -:104FF00090E0B3015AD0EA94EE20C9F74DCEF30108 -:105000008681978102C08FEF9FEF2D96E2E10BC161 -:10501000E0ECF1E0A785A7FDFDCFA485A860A487FB -:105020006050704FF0CDDC01CB0102C02D9105D056 -:1050300041505040D8F70895262FE0ECF1E0378535 -:1050400037FDFDCF3485377F3487378531FF09C081 -:1050500036E3328738ED34BF31E03387378537FDAB -:10506000FDCF33E33287808391831282248325E34B -:10507000228728ED31E024BF338701960895FC0193 -:105080000590615070400110D8F7809590958E0F73 -:105090009F1F0895FC016150704001900110D8F7E6 -:1050A000809590958E0F9F1F08950F931F93CF9318 -:1050B000DF938C01EB018B8181FF1BC082FF0DC050 -:1050C0002E813F818C819D812817390764F4E88106 -:1050D000F9810193E883F98306C0E885F985802F7B -:1050E0000995009731F48E819F8101968E839F836D -:1050F00002C00FEF1FEFC801DF91CF911F910F91F9 -:105100000895FA01AA27283051F1203181F1E8945D -:105110006F936E7F6E5F7F4F8F4F9F4FAF4FB1E0AA -:105120003ED0B4E03CD0670F781F891F9A1FA11DA5 -:10513000680F791F8A1F911DA11D6A0F711D811DA6 -:10514000911DA11D20D009F468943F912AE0269F6B -:1051500011243019305D3193DEF6CF010895462FCA -:105160004770405D4193B3E00FD0C9F7F6CF462FAB -:105170004F70405D4A3318F0495D31FD4052419314 -:1051800002D0A9F7EACFB4E0A695979587957795D1 -:105190006795BA95C9F700976105710508959B0158 -:1051A000AC010A2E06945795479537952795BA95E1 -:1051B000C9F7620F731F841F951FA01D089597FBE9 -:1051C000092E05260ED057FD04D045D00AD0001C6C -:1051D00038F450954095309521953F4F4F4F5F4F94 -:1051E0000895F6F790958095709561957F4F8F4F54 -:1051F0009F4F08952F923F924F925F926F927F92AE -:105200008F929F92AF92BF92CF92DF92EF92FF92D6 -:105210000F931F93CF93DF93CDB7DEB7CA1BDB0B82 -:10522000CDBFDEBF09942A88398848885F846E84A0 -:105230007D848C849B84AA84B984C884DF80EE80BA -:10524000FD800C811B81AA81B981CE0FD11DCDBFFC -:10525000DEBFED010895A1E21A2EAA1BBB1BFD01C2 -:105260000DC0AA1FBB1FEE1FFF1FA217B307E40745 -:10527000F50720F0A21BB30BE40BF50B661F771F9D -:10528000881F991F1A9469F760957095809590957D -:0E5290009B01AC01BD01CF010895F894FFCF42 -:10529E0000831000000104100000018208000001CC -:1052AE0000000000000000000000001400000101DA -:1052BE0001000000010000010001010001000000DA -:1052CE0002020000020002020202000002000000C0 -:1052DE000404000004000404040400000400080890 -:1052EE000800000008000008000808000800000080 -:1052FE00101000001000101010100000100001001F -:10530E000100000000000000010001010101010187 -:10531E0000010001000000010100010101A12000B7 -:10532E000000000200A101000000000000010000CA -:02533E0000006D +:100D00008091A009BB27A32F922F812F8093A00948 +:100D10008091A10986FFFCCF80E4E0EAF9E08183BD +:100D20008091A0090093A0098091A10986FFFCCFC2 +:100D300080E4E0EAF9E081838091A0094115510542 +:100D400071F090E41092A0098091A10986FFFCCF78 +:100D500091838091A00989934150504099F780E197 +:100D6000E0E6F6E08583DF91CF911F910F91089522 +:100D70002F923F924F925F926F927F928F929F92AB +:100D8000AF92BF92CF92DF92EF92FF920F931F9399 +:100D9000CF93DF93CDB7DEB72697CDBFDEBF8B8372 +:100DA0009C834A0180910D214115510509F41EC112 +:100DB0006B01EE24FF2490E0A0E0B0E0DC01992775 +:100DC0008827C80ED91EEA1EFB1E212C01E0302EFA +:100DD00000E130E147EDE0EAF9E050E420E410E61C +:100DE000612E16E0712E60E117ED240146015701D6 +:100DF000BB27AB2D9A2D892D7C01982D6101C81838 +:100E0000D1084C145D0408F46201609366061093E7 +:100E1000A0098091A10986FFFCCF21838091A009C0 +:100E20001092A0098091A10986FFFCCF21838091B7 +:100E3000A0093093650687FFE8CFD30116963C934F +:100E4000B3E5B093A0098091A10986FFFCCF51833F +:100E50008091A009F092A0098091A10986FFFCCFA2 +:100E600051838091A009E092A0098091A10986FF99 +:100E7000FCCF51838091A0091092A0098091A10913 +:100E800086FFFCCF51838091A009009365063093C3 +:100E900066064093A0098091A10986FFFCCF2183BB +:100EA0008091A0091092A0098091A10986FFFCCF32 +:100EB00021838091A0093093650687FFE8CFD30195 +:100EC00016963C93B4E8B093A0098091A10986FFDF +:100ED000FCCF51838091A0091092A0098091A109B3 +:100EE00086FFFCCF51838091A0091092A0098091C8 +:100EF000A10986FFFCCF51838091A0099093A0099E +:100F00008091A10986FFFCCF51838091A009C11473 +:100F1000D104D9F0C601AB81AD83BC81BE83C98247 +:100F2000DA82AD81BE817D917093A0096D01DC01F3 +:100F30008091A10986FFFCCFCD01D601218370915C +:100F4000A009019781F7C980DA8000936506309384 +:100F500066064093A0098091A10986FFFCCF2183FA +:100F60008091A0091092A0098091A10986FFFCCF71 +:100F700021838091A0093093650687FFE8CFD301D4 +:100F800016963C93B3E8B093A0098091A10986FF1F +:100F9000FCCF51838091A009F092A0098091A10912 +:100FA00086FFFCCF51838091A009E092A009809137 +:100FB000A10986FFFCCF51838091A0091092A0095E +:100FC0008091A10986FFFCCF51838091A0090093F5 +:100FD00065064C185D08C601A0E0B0E0880E991EB9 +:100FE000AA1EBB1E4114510409F002CF2696CDBFA4 +:100FF000DEBFDF91CF911F910F91FF90EF90DF90B7 +:10100000CF90BF90AF909F908F907F906F905F90A8 +:101010004F903F902F9008951F93CF93DF9380912F +:101020000D2190E0A0E0B0E0BA2FA92F982F8827DB +:101030009C0120503F4FA0E6B6E0D0E160E177EDA3 +:10104000E0EAF9E0C0E450E411E816966C931697D4 +:101050007093A0094091A10946FFFCCF51834091B4 +:10106000A0091092A0094091A10946FFFCCF51832D +:101070004091A00915966C93159747FFE6CF1696F9 +:10108000DC9316971093A0094091A10946FFFCCF6D +:10109000C1834091A0099093A0094091A10946FF06 +:1010A000FCCFC1834091A0098093A0094091A10980 +:1010B00046FFFCCFC1834091A0091092A009409146 +:1010C000A10946FFFCCFC1834091A0091596DC938E +:1010D000159701968217930709F0B7CFDF91CF914B +:1010E0001F9108950F931F93FC01403080E0580733 +:1010F00081E0680780E0780720F081E01F910F9180 +:10110000089580E090E0A1E0B0E0841B950BA60B71 +:10111000B70B890120E030E080179107A207B307E1 +:1011200040F0CF01BA01A80123DE81E01F910F91A9 +:1011300008958C019D01CF01BA01A80119DEF5CFF8 +:101140000F931F93FC01403080E0580781E068074F +:1011500080E0780720F080E01F910F91089580E0F3 +:1011600090E0A1E0B0E0841B950BA60BB70B8901C2 +:1011700020E030E080179107A207B30740F0CF01CD +:10118000BA01A8016ADD81E01F910F9108958C01D9 +:101190009D01CF01BA01A80160DD81E0F5CFE0E05B +:1011A000F6E080E4828388E1868B0895FF920F93B6 +:1011B0001F93CF93DF93CDB7DEB7A097CDBFDEBF30 +:1011C0009091080690958091A22089278923909379 +:1011D000A22086FF15C0E0910E21F0910F218081A1 +:1011E0008130B9F0823079F1833009F44EC0843017 +:1011F00009F470C0853009F48FC0863009F468C0E6 +:10120000A096CDBFDEBFDF91CF911F910F91FF90D0 +:10121000089580910B21882309F4A1C0FF248E0139 +:101220000F5F1F4FE5DBF801EF0DF11D8083F39495 +:1012300080910B21F816B0F3E0910721F09108217D +:10124000C8010995DDCFE0910521F09106218E01BD +:101250000F5F1F4FC801099520910B21222361F3D5 +:10126000F801CE0102962150820F911D21E0222328 +:1012700039F0308121E03F3F09F020E03F5F3083CB +:101280003196E817F90799F7D7CFE0910521F0914A +:1012900006218E010F5F1F4FC801099520910B2178 +:1012A00031E0222349F221503323D9F3822F90E0F9 +:1012B000F801E80FF91F408131E04F3F09F030E0BD +:1012C000800F911F4F5FFC014083222361F7B4CF51 +:1012D000FBD096CFE0910521F09106218E010F5FA2 +:1012E0001F4FC801099520910B21222309F4A4CF97 +:1012F000F801CE0102962150820F911D21E0222398 +:1013000031F0308121E0311120E0315030833196CD +:10131000E817F907A1F790CFE0910521F091062198 +:101320008E010F5F1F4FC801099520910B2131E0FD +:10133000222309F481CF21503323D1F3822F90E06F +:10134000F801E80FF91F408131E0411130E0800FD2 +:10135000911F4150FC014083222369F76DCF8E011C +:101360000F5F1F4F69CFCF93DF93EC016150704047 +:1013700027EF32E04CE2C901F9015491552389F07D +:101380006132710570F0DE0103C06032710549F011 +:101390005D93ED01019661507040FC01549155231D +:1013A000A1F7F3E0273B3F0721F41882DF91CF91AB +:1013B0000895499361507040205E3F4F83E0273D80 +:1013C0003807C9F6F2CFE0910E21F0910F2180830A +:1013D0000895AB01E0910E21F0910F21608170E042 +:1013E000660F771F62957295707F7627607F7627EC +:1013F00069507D4F0C940426CF93DF93EC0167EF87 +:1014000072E00E94FB25009771F1CE0167E173E065 +:101410000E94FB25009769F1CE0167E373E00E940B +:10142000FB25009741F1CE0167E573E00E94FB25A3 +:10143000009719F1CE0167E773E00E94FB25009742 +:10144000F1F0CE0167E973E00E94FB250097C9F037 +:10145000CE0167EB73E00E94FB250097A1F080E0CE +:10146000DF91CF91089580E0AEDF81E0DF91CF91F1 +:10147000089581E0F9CF82E0F7CF83E0F5CF84E0F3 +:10148000F3CF85E0F1CF86E0EFCF8DE091E260E031 +:1014900070E043E150E00C9418288DE091E260E0A8 +:1014A00070E043E150E00C942328883008F0089560 +:1014B00080930D2190E0880F991F805F9E4D80934F +:1014C0000E2190930F210BCA80910D218F5F8770A1 +:1014D000282F30E0F901EE0FFF1FEF5EFE4D9081E7 +:1014E000992309F05DC0C90101968770282F30E06B +:1014F000F901EE0FFF1FEF5EFE4D9081992309F079 +:101500004FC0C90101968770282F30E0F901EE0F16 +:10151000FF1FEF5EFE4D9081992309F041C0C90184 +:1015200001968770282F30E0F901EE0FFF1FEF5E64 +:10153000FE4D90819923A1F5C90101968770282F4E +:1015400030E0F901EE0FFF1FEF5EFE4D9081992311 +:1015500039F5C90101968770282F30E0F901EE0FA7 +:10156000FF1FEF5EFE4D90819923D1F4C9010196D2 +:101570008770282F30E0F901EE0FFF1FEF5EFE4D60 +:101580009081992369F4C90101968770E82FF0E0F2 +:10159000EE0FFF1FEF5EFE4D9081992309F4089531 +:1015A00084CF80910D210895CF93DF93EC01F9DF73 +:1015B000805D88831982DF91CF910895FC0180813D +:1015C0009181992341F48053883010F080E0089590 +:1015D0006CDF81E0089580E00895BC0180E090E236 +:1015E0000C943B24CF93DF93FC016491662359F064 +:1015F000EC01219680E090E20E948124FE01219678 +:1016000064916623B9F7DF91CF9108959C01AB01F6 +:1016100080E090E2B9010C945F2480E2E0E6F6E01D +:1016200082830895CF93DF9380E090E20E94F524B7 +:101630000E94541E80E090E20E940F25EC0197FD6D +:101640000AC080E18093A320E0E0F6E085838C2F40 +:10165000B3D2882319F0DF91CF9108958C2F33D422 +:10166000DF91CF9108958091A420813009F18130DC +:1016700030F0823059F1833071F0F7D3C7C58091D3 +:10168000680685FFFACF84E180931B2081E0809378 +:10169000A420EBD3BBC580911B20815080931B20DD +:1016A000882359F70E948822D3D81092A420E5CF2E +:1016B00080911B20815080931B208823F1F6ADD8A8 +:1016C0000E94C32282E08093A420D7CF8091680635 +:1016D00085FDD3CF84E180931B2083E08093A420F9 +:1016E000C4D394C580E2E0E0F6E08583089580E20B +:1016F000E0E0F6E08683089580E090E20C94152403 +:1017000080E090E20C946A232DB73EB72C50304015 +:101710002DBF3EBFEDB7FEB73196ADB7BEB7119640 +:101720008D939C93129780E091E08283938387ED61 +:1017300093E08483958380E194E08683978387E1B7 +:1017400094E0808791878EE194E0828793870E945E +:101750001C262DB73EB7245F3F4F2DBF3EBF85E609 +:1017600008952DB73EB7285030402DBF3EBFEDB78E +:10177000FEB73196ADB7BEB711968D939C93129775 +:1017800080E091E08283938384E294E08483958374 +:1017900089EE90E2868397830E941C262DB73EB780 +:1017A000285F3F4F2DBF3EBF85E608959ED8882312 +:1017B00011F48AEC089571DE84E6089560E071E02A +:1017C000DCD885E608950F931F93CF93DF93CDB7B1 +:1017D000DEB7A197CDBFDEBF8C0120910B21E09138 +:1017E0000521F0910621CE01019629A30995C80192 +:1017F00060E071E0AE014F5F5F4F29A130E01AD980 +:1018000085E6A196CDBFDEBFDF91CF911F910F91ED +:101810000895BF92CF92DF92EF92FF920F931F93A2 +:10182000CF93DF93CDB7DEB7A097CDBFDEBF8C01DE +:10183000E0900B21FF2467E274E00E94FB250097F3 +:1018400049F5E114F104A1F1BB2400E010E06E01C0 +:101850000894C11CD11CCCD8F601E00FF11F808385 +:10186000B3940B2D10E00E151F05A8F3E09107218E +:10187000F0910821C601099584E6A096CDBFDEBF90 +:10188000DF91CF911F910F91FF90EF90DF90CF905C +:10189000BF9008956E010894C11CD11CC60160E27E +:1018A00070E0A80104D98E159F0501F38AECE5CFFD +:1018B0006E010894C11CD11CD9CFFC0180910C2170 +:1018C000882329F480E38083118285E6089581E3EB +:1018D0008083118285E60895FC018181882339F493 +:1018E0008081813331F0803349F08AEC08958AECAD +:1018F000089581E080930C2184E6089510920C21D4 +:1019000084E6089582E798E02CD18EE6089580EA77 +:1019100098E03FD18EE60895E0ECF4E081818E7F7F +:1019200081830E9488220E94000484E60895E0ECEE +:10193000F4E081818E7F81830E9488220E940704C7 +:1019400084E608952DB73EB7285030402DBF3EBFE6 +:10195000EDB7FEB73196ADB7BEB711968D939C9398 +:10196000129780E091E0828393838EE294E08483F7 +:1019700095838091092190910A21868397830E9403 +:101980001C262DB73EB7285F3F4F2DBF3EBF85E6D3 +:1019900008952DB73EB7285030402DBF3EBFEDB75C +:1019A000FEB73196ADB7BEB711968D939C93129743 +:1019B00080E091E08283938381E394E08483958344 +:1019C00080910B21868317820E941C262DB73EB77B +:1019D000285F3F4F2DBF3EBF85E6089560E071E070 +:1019E000C2DC85E6089560E071E0F3DC85E60895E9 +:1019F00003DD882311F48AEC08954FDD84E6089511 +:101A000060E071E0D1DD85E60895D8DD882311F42A +:101A10008AEC089542DD84E60895FEDA84E60895AE +:101A2000BF92CF92DF92EF92FF920F931F93CF93CB +:101A3000DF937C01CFEFD0E02BE3C22E24E0D22E47 +:101A40003CE2B32E86018CE190E2B6010E94FB25B8 +:101A5000009729F1F6018491882389F0C132D105DC +:101A600070F0D70103C0C032D10549F08D937D01DC +:101A70000F5F1F4F2197F80184918823A1F7F70189 +:101A8000B1927F01219786E190E0C80ED91E8601B0 +:101A90008CE190E2B6010E94FB250097D9F6F70190 +:101AA0003197108285E6DF91CF911F910F91FF90C2 +:101AB000EF90DF90CF90BF900895CF93DF93209168 +:101AC00020022068E0E0F2E020A32091230220FF22 +:101AD000FCCF21E0E0E0F2E023A3609110027091DE +:101AE00011022DB73EB7285030402DBF3EBFCDB7B5 +:101AF000DEB72196EDB7FEB78183928380E091E057 +:101B00008A839B8384E394E08C839D836E5B704027 +:101B100077FD1AC0882777FD8095982F29E637E54D +:101B20004BE050E00E947525DC01CB01AE83BF8302 +:101B30000E941C262DB73EB7285F3F4F2DBF3EBFEA +:101B400085E6DF91CF91089560E070E0E3CF80E01B +:101B5000E0E2F1E29191890F91E2E03AF907D1F7E1 +:101B6000089521E02093A5202093A62024E120932E +:101B7000A72025E02093A8201092A9201092AA2047 +:101B80001092AB201092AC208093AD209093AE20A9 +:101B9000089527E02093A52024E62093A820109202 +:101BA000A9201092AA201092AB201092AC20809312 +:101BB000AD209093AE200895CF93C82F8091A5209B +:101BC000853009F484C08630E8F0873009F44EC0CF +:101BD000873070F52091B2208091A620281709F453 +:101BE000E1C030E090E001972817390709F40BC1F4 +:101BF00080E090E268E10E9481241092A52081E0BB +:101C0000CF910895833009F45AC08430C0F08C2FEE +:101C100090E04091B2202FEF30E0241B3109821771 +:101C2000930709F06BC085E08093A52081E0E8CFA1 +:101C30008830F9F08930A9F080E0CF9108958130A3 +:101C4000D8F3C13009F4E9C0C43009F4FBC0C8318D +:101C500041F081E0CF91089580E090E266E00E943B +:101C600081241092A52081E0CF910895C53109F417 +:101C70004FC0C83189F3C63009F4F3C0C53149F704 +:101C800080E090E261E00E94812480E090E2609137 +:101C9000A6200E9481246091A620609580E090E2B9 +:101CA0000E94812480E291E260E870E0AFDC4FDFC7 +:101CB000682F80E090E20E94812481E0A1CFC09350 +:101CC000B22084E08093A52081E0CF9108952091F7 +:101CD000AF203091B020F901E05EFE4DC083C90114 +:101CE00001968093AF209093B0208038910509F041 +:101CF000B0CF86E08093A52081E082CF80E090E2A3 +:101D000065E10E94812482E08093A52081E078CF64 +:101D100081E08093A6204091A9205091AA20609153 +:101D2000AB207091AC20E091AD20F091AE2080E22C +:101D300091E220E830E00995882309F479C080E039 +:101D400090E261E00E94812480E090E26091A62010 +:101D50000E9481246091A620609580E090E20E941C +:101D6000812480E291E260E870E050DCF0DE682FD0 +:101D700080E090E20E9481248091A9209091AA2085 +:101D8000A091AB20B091AC2080589F4FAF4FBF4F78 +:101D90008093A9209093AA20A093AB20B093AC206D +:101DA00081E02ECFD4DE8C1709F0A8CF4091A92076 +:101DB0005091AA206091AB207091AC20E091AD20B1 +:101DC000F091AE2080E291E220E830E0099588238E +:101DD00009F441C08091A6208F5F8093A620809156 +:101DE000A9209091AA20A091AB20B091AC2080585E +:101DF0009F4FAF4FBF4F8093A9209093AA20A093ED +:101E0000AB20B093AC2080E090E266E00E94812499 +:101E100082E08093A52081E0F3CE1092AF20109253 +:101E2000B0201092B12083E08093A52081E0E8CE1D +:101E300080E090E264E00E94812489E08093A52004 +:101E400081E0DECE80E090E266E00E948124109284 +:101E5000A52081E0D5CE80E090E268E10E94812457 +:101E6000C7CE8091A6208F5F54CF8091A52081306E +:101E700071F0873009F008958091A820982F915033 +:101E80009093A8208823B9F71092A52008958091F7 +:101E9000A820982F91509093A820882361F78091D3 +:101EA000A720982F91509093A720882331F4109267 +:101EB000A52085E08093A820089580E090E265E168 +:101EC0000E948124F6CF1F93CF93DF93982F9154D4 +:101ED0009A3120F090529A31B8F480522091B32078 +:101EE0003091B4202F3F310550F4F901E05EFE4DF2 +:101EF00080832F5F3F4F2093B3203093B42081E045 +:101F0000DF91CF911F9108959F5C9A3038F38F3500 +:101F100029F38F3319F38D3309F38D30A9F088300D +:101F200039F08B3161F71092B3201092B420E7CFD3 +:101F30008091B3209091B420009709F3019780938A +:101F4000B3209093B420DBCFE091B320F091B42084 +:101F5000E05EFE4D10821092B3201092B42080916A +:101F60002021882309F4A7C08F3309F4A4C08D333E +:101F700009F4A1C0E1E2F1E2EF01219706C08F333D +:101F800009F4D3C08D3309F4CEC021968191882302 +:101F9000B1F710E0188280E291E26BE374E00E94F6 +:101FA000FB25009709F420C180E291E261E574E02D +:101FB0000E94FB25009709F415C180E291E267E6D3 +:101FC00074E00E94FB25009709F406C180E291E2CB +:101FD0006DE774E00E94FB25009709F4FBC080E2E6 +:101FE00091E263E974E00E94FB25009709F4F0C0D8 +:101FF00080E291E269EA74E00E94FB25009709F40F +:10200000B5C080E291E26FEB74E00E94FB2500977F +:1020100009F4FAC080E291E265ED74E00E94FB25CC +:10202000009709F4EFC080E291E26BEE74E00E9449 +:10203000FB25009709F4E4C080E291E261E075E0DD +:102040000E94FB25009709F4D9C080E291E267E184 +:1020500075E00E94FB25009709F4CEC080E291E272 +:102060006DE275E00E94FB25009709F4C3C080E291 +:1020700091E263E475E00E94FB25009709F4B8C083 +:1020800080E291E269E575E00E94FB25009709F482 +:10209000ADC080E291E26FE675E00E94FB250097FB +:1020A00009F49EC080E291E265E875E00E94FB259C +:1020B000009709F493C088ECC0E0E1EAF5E0949160 +:1020C000891709F450C0B196E4918E1709F448C0FD +:1020D000E3EEF5E0E4918E1709F43FC0E4E0F6E0AA +:1020E000E4918E1709F436C0E5E2F6E0E4918E172C +:1020F00071F1E6E4F6E0E4918E17C9F080E090E03B +:1021000071DA8BE995E06EDACC2309F4F8CE809190 +:102110002021882309F4F3CE80E291E25EDA8EE991 +:1021200095E060DAECCE1DE335CF1FE333CF25E039 +:1021300030E0C901880F991F82959295907F98276A +:10214000807F9827820F931F8E559A4FD9CF24E016 +:1021500030E0EFCF23E030E0ECCF22E030E0E9CF19 +:1021600021E030E0E6CF20E030E0E3CF25E0109240 +:10217000202130E046E150E0249FC001259F900DD2 +:10218000349F900D1124855C9B4F1F33F9F01D3354 +:1021900089F0112319F089ECC1E08FCF4096FC0142 +:1021A00085919491FC010097B1F380E291E2099549 +:1021B000C1E083CF4296FC0185919491FC01009788 +:1021C00051F3CE0101960995C1E077CF4496E7CF50 +:1021D00024E0CDCF23E0CBCF22E0C9CF2FE0C7CF83 +:1021E0002EE0C5CF21E0C3CF20E0C1CF2DE0BFCF8F +:1021F0002CE0BDCF2BE0BBCF2AE0B9CF29E0B7CF91 +:1022000028E0B5CF27E0B3CF26E0B1CF0895A0E214 +:10221000B6E082E011968C93119715968C931597E2 +:10222000E0E4F8E010A211A28DE291E086A397A36A +:102230008FEF9FEF80A791A781E0808398E8938339 +:1022400093E097831A968C931A9708951F920F9292 +:102250000FB60F9211248F939F93EF93FF9380E219 +:1022600092E28093C1209093C22080EA92E2809310 +:10227000C3209093C4201092BA201092B9201092DB +:10228000B5201092BD201092BE201092B820E0E43C +:10229000F8E0138286E990E086AB97AB8AE190E0A4 +:1022A00080AF91AFE0E4F9E010A211A28FEF9FEFB1 +:1022B00086A397A389E883838EE08083E0E2F6E03B +:1022C0001286FF91EF919F918F910F900FBE0F900B +:1022D0001F9018951F920F920FB60F9211242F93F3 +:1022E0008F939F93EF93FF93909128068091B9204D +:1022F000880F957021E009F020E0822B8093B920AF +:102300009091B5209923A1F1982F9770973009F4F7 +:1023100044C08C7069F191E082FD6EC09093B7204B +:102320008091B820882309F06FC08091BA208695EB +:10233000992309F471C020E8282B2093BA208091BA +:10234000BD209091BE2001968093BD209093BE2029 +:1023500087709070009761F4E091C120F091C220E5 +:102360002193E093C120F093C22081E08093B820B4 +:102370009091B52081E0911180E08093B52088E8AC +:10238000E0E4F8E08383FF91EF919F918F912F918B +:102390000F900FBE0F901F9018951092400880E18B +:1023A000E0E4F8E08487E0E4F9E013828091B7206C +:1023B000882369F18CEB94E086A397A31092B62052 +:1023C000E0E4F9E081E0848783E086838091BD20AA +:1023D0009091BE20877061F09091BA208F5F9695A2 +:1023E0008F5F8930E1F7E091C120F091C2209083A6 +:1023F00081E08093BF20BCCF90E09093B720809184 +:10240000B820882309F491CF1092B820B1CF8CE77F +:1024100094E086A397A3D2CF20E08ECF1F920F9295 +:102420000FB60F9211242F933F938F939F93AF93E7 +:10243000BF93EF93FF938091B620853009F455C088 +:102440008630C0F0883009F486C0893040F5863087 +:1024500009F4C7C0873009F495C0FF91EF91BF918F +:10246000AF919F918F913F912F910F900FBE0F9041 +:102470001F901895823089F1833008F1833009F478 +:102480005BC0843051F78091BA2080FDC7C080E4E2 +:10249000E0E4F6E0868385E08093B620DECF8930E5 +:1024A00009F461C08A30C9F610924009E0E4F9E00D +:1024B00016821092000881E08093C020CECF88233E +:1024C00009F459C0813049F68FE390E0E0E4F9E087 +:1024D00086A397A38EE08093000880E4E0E4F6E012 +:1024E000858383E08093B620B8CF8091BA2090E4B2 +:1024F000E0E4F6E080FD90C0958386958093BA2055 +:102500008091BB209091BC2001968093BB2090933A +:10251000BC209C01277030702115310509F483C05F +:102520002091BD203091BE208217930709F055C03D +:1025300088E08093B62091CF80E4E0E4F6E08683E3 +:1025400084E08093B620E091C120F091C220808188 +:102550008093BA2082CF80E4E0E4F6E0868389E0CD +:102560008093B6207ACF80E4E0E4F6E086838AE0C8 +:102570008093B62072CF8FE790E0E0E4F9E086A385 +:1025800097A36BCFE091C320F091C4208081882372 +:10259000E1F580E4A0E4B6E015968C9315972091C0 +:1025A000BB203091BC208091BD209091BE20281787 +:1025B000390709F4BDCF3196E093C320F093C420CE +:1025C000E091C120F091C220CF0101968093C120FB +:1025D0009093C22081818093BA2084E08093B620BA +:1025E0003CCFE091C320F091C4208081882341F446 +:1025F00080E4E0E4F6E0868387E08093B6202DCF88 +:1026000080E4E0E4F6E08583F7CF80E4A0E4B6E080 +:1026100016968C931697C3CF96836FCF80E4E0E431 +:10262000F6E0858338CF86E08093B62016CFCF932F +:10263000DF93E0E4F6E084E08283128AC0E8D1E030 +:1026400082E68E83A0E2B6E085E012968C93129724 +:1026500081E050968C93509782E052968C935297DB +:102660001A961C921A9783E019968C9398E5988392 +:102670009AE5998390E49183968381838683E0E051 +:10268000F8E08FE090E086A397A388E090E082A72F +:1026900093A783E28183BBDDDF91CF910895809181 +:1026A000BF208823C9F01092BF20E0E2F6E082E06C +:1026B000818386836091BD207091BE206115710574 +:1026C00099F4E091FF20F0910021099510924009C2 +:1026D000E0E4F9E016829BDD8091C020882309F4B4 +:1026E00008951092C02093CDE0910321F091042130 +:1026F00080E292E209959C0194FD28C0AC015695B8 +:102700004795569547955695479541155105F9F0CA +:1027100060E0E0E0F0E0E05EFD4D8081082E829513 +:102720008025082E869586958025E058FF4F90E0FD +:1027300001969595879591E080FD90E090836F5F7D +:10274000E62FF0E0E417F50730F301C03F7E2115D6 +:10275000310509F4BBCF2093BD203093BE201092E9 +:10276000BB201092BC2080E292E28093C120909323 +:10277000C22080EA92E28093C3209093C42081E03B +:102780008093B6208091C020882309F4A9CFA9CFD7 +:1027900081E08093C52084E090E08093C6209093F0 +:1027A000C72088E08093C820089581E08093C520E9 +:1027B00082E090E08093C6209093C72088E18093C8 +:1027C000C820089581E08093C520089508958F92D0 +:1027D0009F92AF92BF92CF92DF92EF92FF920F93B0 +:1027E0001F93CF93DF93CDB7DEB72E97CDBFDEBF5C +:1027F0007C018091C520843009F4F9C0853008F44B +:102800003FC0863009F4C0C0863008F064C0F701CC +:1028100000810E94181C8027D7018C9311960C917F +:102820000E94181C8027F701818302810E94181CD6 +:102830008027D70112968C93129713960C91F8D794 +:102840008027F70183838081803309F4BDC2803AF9 +:1028500009F439C3803C09F453C3813C09F435C4FD +:10286000823C09F43FC4803B09F44BC4805682305B +:1028700008F496C181E08093C52080E090E065C0B7 +:10288000823009F4A0C0833008F46FC0F701808162 +:10289000863209F46FC1823509F46CC1803509F4C0 +:1028A00075C1982F9056923008F4E7C1803351F0EB +:1028B000803A41F0803C31F0813C21F0823C11F0C3 +:1028C000803BC1F681E08093C52084E0F7018083DE +:1028D00084E090E03AC08A3008F053C0F7010081EC +:1028E000A7D78027D7018C9311960C91A1D7802769 +:1028F000F701818302819CD78027D70112968C93A0 +:10290000129713960C9194D78027F7018383048143 +:102910008FD78027D70114968C93149715960C9116 +:1029200087D78027F7018583C70164E070E092D4E0 +:10293000882309F00FC2BDD791E09827F701908353 +:1029400085E08093C52084E090E02E96CDBFDEBF69 +:10295000DF91CF911F910F91FF90EF90DF90CF907B +:10296000BF90AF909F908F9008952091C620909136 +:10297000C720D7018C91863209F4F3C0823509F45F +:10298000F0C080E090E0E1CF8701CC24F8018080A6 +:102990004FD78825D8018D938D01C394B2E1CB1612 +:1029A000A9F7C70160E170E055D4882309F4EFC1AD +:1029B00080910C21882309F4F0C17BD79AE09827F5 +:1029C000F7019083BDCF2091C6209091C720D701F9 +:1029D0008C91863209F4C5C0823509F4C2C08339AE +:1029E00009F435C21092C52080E090E0AECFC70157 +:1029F000E0D6D70114960C911BD78027F70184836A +:102A0000058116D78027D70115968C9315971696B2 +:102A10000C910ED78027F7018683078109D780277D +:102A2000D70117968C93179714962C911497909121 +:102A3000C920291709F01ECF15962C911597909152 +:102A4000CA20291709F016CF16962C911697909147 +:102A5000CB20291709F00ECF9091CC20891709F0CF +:102A600009CF0091CD20E4D68027F7018083009123 +:102A7000CD20002E02950025002E069506950025F6 +:102A80009ED4F701E058FF4F202F30E02F5F3F4FDB +:102A90003595279591E020FD90E09827908300914F +:102AA000CE20C6D68027D70111968C930091CE20D8 +:102AB000002E02950025002E0695069500257FD450 +:102AC000F701EF57FF4F202F30E02F5F3F4F359535 +:102AD000279591E020FD90E0982790830091CF20EA +:102AE000A7D68027F70182830091CF20002E029580 +:102AF0000025002E06950695002561D4F701EE57B6 +:102B0000FF4F202F30E02F5F3F4F3595279591E005 +:102B100020FD90E0982790830091D02089D68027CF +:102B2000D70113968C930091D020002E029500259A +:102B3000002E06950695002542D4F701ED57FF4F6C +:102B4000202F30E02F5F3F4F3595279591E020FDF6 +:102B500090E09827908385E08093C52080E290E103 +:102B6000F4CEF7012083918382E08093C52080E139 +:102B700090E0EBCE84E0D7018C9311961C921197D4 +:102B800082E08093C52080E190E0DFCEF701818173 +:102B9000882309F4D7C2F701108284E090E0D5CEF3 +:102BA000C70162E070E056D3882309F405C1D7015C +:102BB00011960C9111970C738C91803609F4DFC239 +:102BC0008AE390E010E002951295107F1027007FB5 +:102BD0001027080F191FCE01059664E00E94FB0420 +:102BE000CE01019660E070E044E050E00E942D06C6 +:102BF000CE010996B80146E050E00E942D068D8175 +:102C00008093C9208E818093CA208F818093CB20AE +:102C100088858093CC2089EC90E260E470E06DD6EA +:102C20008091C9208093CD208091CA208093CE20AE +:102C30008091CB208093CF208091CC208093D02096 +:102C40008DEC90E260E270E058D6CE010996BE01AC +:102C50006F5F7F4FAE014B5F5F4FE5D38D81F70113 +:102C600080838E8181838F8182838885838384E0C2 +:102C70008093C52080E290E068CEC70162E070E0FA +:102C8000E9D2882309F465C2D70111960C911197F6 +:102C90000C738C91803609F475C28AE390E010E0E1 +:102CA00002951295107F1027007F1027080F191F1B +:102CB000CE01019664E00E94FB04CE01059660E01F +:102CC00070E044E050E00E942D06CE010996B80164 +:102CD00046E050E00E942D0689818093C9208A81B8 +:102CE0008093CA208B818093CB208C818093CC20D1 +:102CF00089EC90E260E470E000D68091C920809376 +:102D0000CD208091CA208093CE208091CB208093CB +:102D1000CF208091CC208093D0208DEC90E260E297 +:102D200070E0EBD584E08093C5208981F701808332 +:102D30008A8181838B8182838C818383CE010996F2 +:102D4000BE016B5F7F4FAE014F5F5F4F6CD380E280 +:102D500090E0FBCD6091D12070E062957295707F1C +:102D60007627607F762782ED90E240E150E00E9476 +:102D70002D062091D2208091D6208095281709F425 +:102D8000D6C097D596E09827D7019C93D9CD91D5F9 +:102D900091E09827D7019C93D3CD6091D12070E02A +:102DA00062957295707F7627607F7627C70140E134 +:102DB00050E00E94B80601CE7CD591E09827D7015B +:102DC0009C9384E090E0C1CDC70162E070E042D204 +:102DD000882391F3D70111966C9170E062957295FA +:102DE000707F7627607F7627C70140E150E00E9420 +:102DF0002D06C70160E170E0EFD1870130E8E32ED6 +:102E0000F12CE00EF11E8824F801C08011D58C252C +:102E1000D8018D938D010C2CC294C0240C2CC69427 +:102E2000C694C024CCD22C2D30E02F5F3F4F359577 +:102E3000279591E020FD90E09827F70191937F017D +:102E40008394F2E18F1601F780E990E17ECDCE0107 +:102E5000059660E070E044E050E00E942D069091FD +:102E6000C820D70111968C911197803209F477C14F +:102E7000803709F086CDD70112962C9112978D815B +:102E8000281709F07ECD13962C9113978E81281761 +:102E900009F077CD14962C9114978F81281709F09B +:102EA00070CD15962C9115978885281709F069CD56 +:102EB0009C93C70161E070E08FD183E08093C520CF +:102EC00088E190E042CDC70162E070E0C3D1882381 +:102ED00079F0F70181818093D12086E08093C5202D +:102EE000E8D49AE09827D7019C9384E090E02DCD18 +:102EF000E0D491E09827F701908384E090E025CD1D +:102F0000C70162E070E0A6D1882309F455CFD7014C +:102F100011968C918093D12088E08093C520C9D4EC +:102F20009AE09827F701908384E090E00ECD80919D +:102F3000DA20281709F025CF3091D3208091D720AF +:102F40008095381709F01DCF8091DB20381709F0E4 +:102F500018CF4091D4208091D8208095481709F04F +:102F600010CF8091DC20481709F00BCFE091D520DD +:102F70008091D9208095E81709F003CF8091DD205A +:102F8000E81709F0FECE9091DE208091DF20809539 +:102F9000981709F0F6CE8091E020981709F0F1CE4D +:102FA0008091E1208095981709F0EBCED70111961A +:102FB0008C9011979924AA24BB24BA2CA92C982C64 +:102FC000882412968C9190E0A0E0B0E0DC01992773 +:102FD0008827882A992AAA2ABB2AD7018C9190E0AF +:102FE000A0E0B0E0882A992AAA2ABB2AD701139622 +:102FF000CC90DD24EE24FF24FC2CEE24DD24CC2414 +:103000008C289D28AE28BF28832F90E0A0E0B0E058 +:10301000BA2FA92F982F882750E060E070E0BA01FE +:1030200055274427842B952BA62BB72B30E040E067 +:1030300050E0822B932BA42BB52B4E2F50E060E059 +:1030400070E0742F662755274427842B952BA62BD9 +:10305000B72B2091C520283009F46FC0273021F408 +:10306000880D991DAA1DBB1D8093D220092F1A2FF0 +:103070002B2F33270093D320AD016627772740936A +:10308000D420CB2EDD24EE24FF24C092D520E82FBF +:10309000E095E093D620E02FE095E093D720E42F51 +:1030A000E095E093D820EC2DE095E093D920809333 +:1030B000DA200093DB204093DC20C092DD2085E005 +:1030C0008093C52080E090E040CCC70162E070E0D2 +:1030D000C1D0882309F40CCFF70181818093D120DE +:1030E00087E0FCCEC70162E070E0B4D0882309F429 +:1030F00063CED70111968C9111978093D12089E0EE +:103100000CCFC70162E070E0A5D0882309F4F0CEAF +:1031100080910C21882309F0E3CEF701618170E0F2 +:1031200062957295707F7627607F762782ED90E2B8 +:1031300040E150E00E94B806D3CE88199909AA0947 +:10314000BB0992CFC70162E070E084D0882309F008 +:1031500049CC81E0D7018C9384E090E0F6CB8D815F +:10316000F70180833E8131832F8122839885938369 +:10317000832782278927848388E290E0E6CB80E357 +:1031800090E020CD80E390E08ACD60E070E044E004 +:1031900050E00C942D06CF93DF930F92CDB7DEB79E +:1031A000FC018181908189279281892793818927D8 +:1031B0008983CF0160E070E044E050E00E94B806EF +:1031C000CE01019664E070E041E050E00E94B80654 +:1031D0000F90DF91CF910895EF92FF920F931F937D +:1031E000CF937C018B016115710581F1FB01DC013D +:1031F00043E653E68D918427C82FC295C07FC82728 +:103200008C2F90E0782F66279C01220F331F220F0E +:10321000331F220F331F62277327452F5527462759 +:103220005727C295CF708C2F90E0482759273197A8 +:1032300009F7F701E00FF11F942F852F9083818309 +:10324000CF911F910F91FF90EF900895FC0183E6BD +:1032500093E6F4CFEF92FF920F931F93CF937C01ED +:103260008B016115710509F43DC0FB01DC0143E6EA +:1032700053E68D918427C82FC295C07FC8278C2F15 +:1032800090E0782F66279C01220F331F220F331FF7 +:10329000220F331F62277327452F552746275727AD +:1032A000C295CF708C2F90E048275927319709F7A6 +:1032B000F701E00FF11F9A013070808190E08217D2 +:1032C000930739F080E0CF911F910F91FF90EF901D +:1032D0000895218130E0452F552781E024173507D7 +:1032E00089F7F1CFFC0123E630E043E653E6E5CF72 +:1032F000CF92DF92EF92FF920F931F930091E52000 +:103300004091E6203091E720A091E220F091E32067 +:10331000E091E420942F9071202F217E9227232F7B +:10332000207292272A2F247992272F2F23779227F2 +:103330002E2F2A739227292F22952F702927922F1B +:10334000969596959227B92FB69550E060E070E07B +:10335000762F652F542F4427C32EDD24EE24FF241F +:103360007601DD24CC244C295D296E297F2910E0CB +:1033700020E030E0402B512B622B732B7695679524 +:1033800057954795B9272B2F30E02170307090E08A +:103390002817390709F06068A093E520F093E6202C +:1033A000E093E7204093E2205093E3206093E420F1 +:1033B0001F910F91FF90EF90DF90CF900895509163 +:1033C000E3204091E420242F2F708DE190E2DC0176 +:1033D000A20FB11D252F2F70FC01E20FF11DD09619 +:1033E0002C91D0973089232B3091E22032953F7079 +:1033F000FC01E30FF11D3081232B52955F70FC011E +:10340000E50FF11D30A1232B42954F70840F911DC4 +:10341000805C9F4FFC018081282BEDE6F0E2E20FFB +:10342000F11D80810895CF92DF92EF92FF920F936A +:103430001F93CF93DF93FC01EA01318120E080816B +:1034400090E0822B932B80FDB2C130E081FDADC1B5 +:1034500020E09695879596958795432F406880FD47 +:10346000342F422F406881FD242F9695879596959D +:10347000879536952695432F406880FD342F422F3F +:10348000406881FD242F969587959695879536956A +:103490002695432F406880FD342F422F406881FDE0 +:1034A000242F969587959695879536952695432F43 +:1034B000406880FD342F422F406881FD242F96956F +:1034C00087959695879536952695432F406880FD7C +:1034D000342F422F406881FD242F9695879596952D +:1034E000879536952695432F406880FD342F422FCF +:1034F000406881FD242F96958795969587953695FA +:103500002695532F5068422F406880FD352F309309 +:10351000E52081FD242F2093E220338120E0828169 +:1035200090E0822B932B80FD3EC130E081FD39C1BC +:1035300020E09695879596958795432F406880FD66 +:10354000342F422F406881FD242F969587959695BC +:10355000879536952695432F406880FD342F422F5E +:10356000406881FD242F9695879596958795369589 +:103570002695432F406880FD342F422F406881FDFF +:10358000242F969587959695879536952695432F62 +:10359000406880FD342F422F406881FD242F96958E +:1035A00087959695879536952695432F406880FD9B +:1035B000342F422F406881FD242F9695879596954C +:1035C000879536952695432F406880FD342F422FEE +:1035D000406881FD242F9695879596958795369519 +:1035E0002695532F5068422F406880FD352F309329 +:1035F000E62081FD242F2093E320958180E0248123 +:1036000030E0282B392B20FDCAC050E021FDC5C079 +:1036100040E0C9019695879596958795352F306836 +:1036200080FF352F242F206881FF242F96958795C2 +:103630009695879536952695432F406880FD342FC3 +:10364000422F406881FD242F969587959695879502 +:1036500036952695432F406880FD342F422F4068D1 +:1036600081FD242F96958795969587953695269575 +:10367000432F406880FD342F422F406881FD242F66 +:10368000969587959695879536952695432F40680C +:1036900080FD342F422F406881FD242F9695879519 +:1036A0009695879536952695432F406880FD342F53 +:1036B000422F406881FD242F969587959695879592 +:1036C00036952695532F5068422F406880FD352F40 +:1036D0003093E72081FD242F2093E420C980DB0173 +:1036E00011968C911197C826DD24EE24FF24FE2C20 +:1036F000ED2CDC2CCC248A8112969C91892790E0B9 +:10370000A0E0B0E0DC0199278827C82AD92AEA2A54 +:10371000FB2A8881FB019081892790E0A0E0B0E03E +:10372000C82AD92AEA2AFB2A8B819381892790E02B +:10373000A0E0B0E0B82FAA2799278827C82AD92A5D +:10374000EA2AFB2A10E23BDE082F8C2D8170D0DDA7 +:10375000F694E794D794C794002341F080E090E07A +:10376000A0E0B0E8C82AD92AEA2AFB2A115059F762 +:1037700088818C25888389818D2589838A818E25FE +:103780008A838B818F258B83DF91CF911F910F913E +:10379000FF90EF90DF90CF90089540E43ACF50E44F +:1037A00035CF20E4C6CE30E4C1CE20E452CE30E4A2 +:1037B0004DCECF92DF92EF92FF92CF93FC01C1806A +:1037C000DD24EE24FF24FE2CED2CDC2CCC24828185 +:1037D00090E0A0E0B0E0DC0199278827C82AD92A28 +:1037E000EA2AFB2A808190E0A0E0B0E0C82AD92A2A +:1037F000EA2AFB2A838190E0A0E0B0E0B82FAA2754 +:1038000099278827C82AD92AEA2AFB2AC0E2D7DDC5 +:103810009C2D917089276CDDF694E794D794C7941A +:10382000C150A9F7CF91FF90EF90DF90CF9008950E +:10383000CF93DF93C4DDC82F80E05ADDCC2309F499 +:1038400036C0C0E8BCDDD82F80E052DDC695D1116E +:10385000C068B5DDD82F80E04BDDC695D111C068BA +:10386000AEDDD82F80E044DDC695D111C068A7DD5C +:10387000D82F80E03DDDC695D111C068A0DDD82FDE +:1038800080E036DDC695D111C06899DDD82F80E083 +:103890002FDDC695D111C06892DDD82F80E028DDDC +:1038A0008C2F8695D1118068DF91CF910895C0E06B +:1038B000C9CFCF93DF9383DDC82F80E019DDCC2300 +:1038C000D1F0C8E07CDDD82F80E012DDC695D111A3 +:1038D000C86075DDD82F80E00BDDC695D111C860BA +:1038E0006EDDD82F80E004DD8C2F8695D1118860A5 +:1038F000DF91CF910895C0E0E5CF8F929F92AF9274 +:10390000BF92CF92DF92EF92FF920F931F93CF93CC +:10391000DF934C015B016115710509F45FC0DC01A7 +:103920001296CC911297EC911196DC911197139607 +:10393000FC919C2F9D72892F82958F708927282F4B +:10394000269526952827322F36958D2F90E0A0E0DA +:10395000B0E0BA2FA92F982F88274C2F50E060E0B5 +:1039600070E0BA0155274427842B952BA62BB72B43 +:103970004E2F50E060E070E0842B952BA62BB72BE8 +:103980004F2F50E060E070E0742F662755274427E2 +:10399000842B952BA62BB72BB695A7959795879536 +:1039A000322730FDB068E82F492F5A2F6B2F772729 +:1039B000D42F8D0122273327C02FCB2EDD24EE24D8 +:1039C000FF24FC2D0894A108B108A114B10409F04A +:1039D000B0CFF401808341830283C382DF91CF9112 +:1039E0001F910F91FF90EF90DF90CF90BF90AF901D +:1039F0009F908F9008951F93CF93DF93CDB7DEB73D +:103A0000EE97CDBFDEBF4DD3809325234AD380935D +:103A1000262347D38093272344D38093282341D35D +:103A2000809329233ED380932A233BD380932B2357 +:103A300038D380932C230E94800BD5D3882391F018 +:103A40009091252380912623853009F453C0863038 +:103A5000A8F0883009F4BAC0893009F49EC08630D5 +:103A600009F45DC0C0D3882311F091D374D3EE96CE +:103A7000CDBFDEBFDF91CF911F910895813029F036 +:103A8000813008F46EC0833069F7992309F4A8C027 +:103A9000923041F780912723882339F5109129230B +:103AA0001F7001F3812F1BD380912623833009F4EB +:103AB000F8C0E0912F23F091302381818B7F8183A7 +:103AC000212F30E084E890E0289FF001299FF00D3D +:103AD000389FF00D1124ED58FC4D1082E0912F23FA +:103AE000F091302380818E7F808380E0F8D24FD3A5 +:103AF000A8D4B8CF992309F0B5CF109127231F7709 +:103B000046D39FD4A0D38823E9F3E0ECF4E01383F9 +:103B1000112309F07AC082E080932423A3CF905828 +:103B2000923008F09FCF809127239091282323E0A3 +:103B30008C3D920709F46BC060912923AE014F5F61 +:103B40005F4F0E948A03BC01009709F48BCF8DAFB1 +:103B50007EAF1DD389819A816DAD7EADCAD192D2DF +:103B600081CF903809F448C0923809F07BCF80911A +:103B700029238F70B4D2E0912F23F09130238181DB +:103B800011E082FF10E080E0AAD201D3812F98D209 +:103B900080E096D25ED255D465CF992309F062CFEA +:103BA00080912723823008F05DCFF1D280912723C6 +:103BB0008093202346D480912023882309F467C072 +:103BC00084E0809324230E947C0B4CCF903809F032 +:103BD00049CFDDD28091202373D23BD232D442CF61 +:103BE00090912723913009F03DCF91E0833009F087 +:103BF00090E09093222379CF10912123809122236A +:103C0000882309F4C2CF1260C0CF83E085CF83E060 +:103C10008C838AE38B836FB7F894A0ECB1E082E0E9 +:103C20001A968C931A97E8E0F0E024911A961C9269 +:103C3000DE01159681E090E078E040EC51E012E082 +:103C4000E22FEF702E2F30E0EA30A8F0295C3F4FD2 +:103C50002D933D938C31910589F0FA011287E72F5E +:103C6000F0E02491FA01128680FF03C022952F70A4 +:103C70007F5F0196E5CF205D3F4FEACF6FBF87D2D0 +:103C8000CE0103966AE370E08FD0FCD1EBCE809139 +:103C9000C304882321F084E08093242394CF81E01F +:103CA000FBCF59D222CF0895CF938091242388232C +:103CB00011F4CF910895C091312380E010D293D2B6 +:103CC000882321F48C2F0BD2CF91089594DEFACF64 +:103CD000AF92BF92CF92DF92FF920F931F93CF9339 +:103CE000DF93EC018B016A01C2D3F82E882361F5C2 +:103CF000C114D10439F0F60180819181081B190BA0 +:103D0000C80FD91F01151105F9F0C114D10441F0F4 +:103D100026C08991D5D10150104001151105A1F09F +:103D200080912D2390912E23FC01EF5BFF4F20818A +:103D3000805C9F4FFC018081281758F38AD1B4DF43 +:103D400096D3882351F3F82E8F2DDF91CF911F91B9 +:103D50000F91FF90DF90CF90BF90AF900895AA246D +:103D6000BB2480912D2390912E23FC01EF5BFF4F0C +:103D70002081FC01E05CFF4F8081281760F069D151 +:103D800093DFF601808191818A0D9B1D8083918351 +:103D900025E0F22ED9CF899193D10894A11CB11CB2 +:103DA0000A151B05F1F6D0CFCF92DF92EF92FF926A +:103DB0000F931F93CF93DF93D82EC92EEB018091E1 +:103DC000312380688CD1E0902B23F0902C23EC16CB +:103DD000FD0620F0209709F486C07E0100E0E11482 +:103DE000F10409F04CC0002309F45FC08091242342 +:103DF000882309F458C0853009F460C0F4D18823C1 +:103E000009F06FC008D2882309F04FC01CD2882364 +:103E100069F38091312387FD5BC080912D239091C0 +:103E20002E23FC01E05CFF4FC0818F5B9F4FFC01A4 +:103E30008081D0E0C81BD109E114F104B1F0C83091 +:103E4000D10598F40D2D1C2D03C0C830D10569F0A3 +:103E5000F80181918F0134D1D02EC12E0894E10850 +:103E6000F1082196E114F10481F701E0C830D10591 +:103E700009F000E0EED0E114F10409F4B4CF809130 +:103E80002423882381F08530C9F0ADD1882349F5FA +:103E9000C2D1882351F4D7D1882309F0BACF8091B9 +:103EA0002423882381F782E00AC0B5D18823F9F45E +:103EB000809124238823B9F38530B9F783E0DF911B +:103EC000CF911F910F91FF90EF90DF90CF900895C9 +:103ED000E0912D23F0912E23EF5BFF4FC081D0E0C6 +:103EE000ABCF81E0ECCFB5D0EE24FF2477CF80E0DC +:103EF000E6CFCF92DF92EF92FF920F931F93CF9373 +:103F0000DF930F92CDB7DEB7D82EC92E7B018091FB +:103F100031238068E4D000912B2310912C230E15BF +:103F20001F0528F0E114F10409F48DC08701ED2C80 +:103F3000FC2C80E00115110509F050C0882309F41C +:103F400063C080912423882309F45CC0853009F480 +:103F500064C049D1882309F074C05DD1882309F079 +:103F600053C071D1882369F38091312387FD60C0EC +:103F700080912D2390912E23FC01E05CFF4FC080A7 +:103F80008F5B9F4FFC018081DD24C81AD108011589 +:103F90001105B9F088E0C816D10428F012C0F8E085 +:103FA000CF16D10471F0F70184918AD00894E11CF6 +:103FB000F11C015010400894C11CD11C01151105C1 +:103FC00071F781E098E0C916D10409F080E0898397 +:103FD00040D089810115110509F4B0CF80912423C7 +:103FE000882381F08530C9F0FED0882351F513D1A4 +:103FF000882351F428D1882309F0B6CF8091242357 +:10400000882381F782E00AC006D1882301F58091D8 +:1040100024238823B9F38530B9F783E00F90DF912B +:10402000CF911F910F91FF90EF90DF90CF90089567 +:10403000E0912D23F0912E23EF5BFF4FC080DD2414 +:10404000A6CF81E0EBCF05D000E010E070CF80E09C +:10405000E5CFE0912F23F0913023A0912D23B09153 +:104060002E23AF5BBF4F8C9190E08283938380813E +:104070008D798083E0912D23F0912E23EF5BFF4F0C +:1040800010820895E0912F23F091302380818D7963 +:104090008083E0912D23F0912E23EF5BFF4F108260 +:1040A000089580912D2390912E23FC01EF5BFF4F0B +:1040B0002081820F911DDC018C912F5F2083089558 +:1040C00020912D2330912E23F901EF5BFF4F90813A +:1040D000290F311DD9018C939F5F90830895282F5C +:1040E0002F708093312330E064E870E0269FA001B8 +:1040F000279F500D369F500D11244E5C5C4D6091F2 +:10410000C6047091C70487FD11C040932D235093BE +:104110002E2322953295307F3227207F3227260F9B +:10412000371F20932F233093302308954E5B5F4F2A +:1041300040932D2350932E2322953295307F3227A2 +:10414000207F3227285F3F4F260F371F20932F23D2 +:10415000309330230895E0912F23F0913023818113 +:1041600084608183E0912F23F09130238181807CD2 +:10417000803409F00895809131238058B0DFE091B8 +:104180002F23F09130238181846081830895809171 +:1041900031238F77A4DFE0912F23F09130238081AA +:1041A0008D788083E0912F23F0913023808181608E +:1041B0008083E0912D23F0912E23EF5BFF4F10823F +:1041C0008091312380688BDFE0912F23F0913023A1 +:1041D000808181608083E0912D23F0912E23EF5B1D +:1041E000FF4F10820895809131238F7778DFE0911F +:1041F0002F23F0913023808184FF0BC0A0912D23C9 +:10420000B0912E2382819381A05CBF4F8C9381E07B +:10421000089580E00895809131238F7760DFE091E9 +:104220002F23F0913023808185FF0BC0A0912D2397 +:10423000B0912E2382819381A05CBF4F8C9381E04B +:10424000089580E0089580913123806848DFE091EF +:104250002F23F0913023908181E091FF80E0089539 +:104260001F93CF93DF9300D0CDB7DEB7182F4A83CB +:10427000698335DFE0912F23F09130231182E091A3 +:104280002F23F09130234A81698117FD22C01082CB +:10429000E0912F23F09130236183E0912F23F0915F +:1042A00030231282138280912D2390912E238483B8 +:1042B000958340E0FC01E05CFF4F40838F5B9F4FA4 +:1042C000DC011C9281E00F900F90DF91CF911F9144 +:1042D000089582E08083E0912F23F0913023618361 +:1042E000E0912F23F09130231282138280912D23AD +:1042F00090912E2384839583DDCFCF92DF92EF922E +:10430000FF920F931F93CF93DF930F92CDB7DEB73A +:10431000F62E662309F441C06C0110E0F60100811D +:10432000002399F16381218132818481823008F4F4 +:1043300041C048E158E12930310550F088E090E073 +:1043400040E04F5F880F991F82179307D0F3452BEA +:10435000802F90E08F709070863091054CF521345D +:10436000310530F54F7E662341F5942F9064E22E9F +:10437000802F8058692F422F998372DF9981802F77 +:10438000692F4E2D6DDF882399F01F5F85E090E047 +:10439000C80ED91E1F1509F0C1CF81E00F90DF9123 +:1043A000CF911F910F91FF90EF90DF90CF900895E4 +:1043B00080E0F4CF48E058E0BECF613031F0942F78 +:1043C00090686623A1F2E22EDACF942F906CE22E51 +:1043D000D6CFE0ECF4E0A681B78119961C92A681B5 +:1043E000B78111961C92A681B78159961C92A6811D +:1043F000B78151961C92A681B78199961C92A6818D +:10440000B78191961C92A681B781D9961C92A681FC +:10441000B781D1961C92A681B781A75BBF4F1C9232 +:10442000A681B781AF5BBF4F1C92A681B781A75A07 +:10443000BF4F1C920680F781E02DEF5AFF4F10828C +:1044400008958091252387FD08C0FDDE882369F447 +:10445000809124238823C9F70895DDDE882331F471 +:10446000809124238823C9F70895F3CD0BCE1F93A1 +:10447000CF93DF93E091C604F091C704E05AFF4F59 +:10448000C081D18114E6809131238078803821F178 +:10449000C2DE882321F580912423882329F18530E9 +:1044A00041F1E0912F23F0913023818182FD26C0DC +:1044B000E091C604F091C704E05AFF4F80819181DA +:1044C000C817D90701F31123F1F01150EC018091C5 +:1044D000312380788038E1F6B6DE8823E1F280E08F +:1044E000DF91CF911F91089582E0DF91CF911F91CD +:1044F000089583E0DF91CF911F91089581E0DF91CE +:10450000CF911F91089584E0DF91CF911F9108957D +:1045100064D06AD0E0ECF4E081818E7F8183808179 +:104520008F778083109223230895CF93DF93E0E465 +:10453000F0E014828481816084834FD055D0C0EC38 +:10454000D4E088818F7788838881806888831092FF +:104550002423109220231092222310922123888159 +:104560008064888380E868E448E07ADE80E068E47C +:1045700048E076DE888580648887898181608983C8 +:10458000DF91CF910895CF93DF933FB7F894C0ECBC +:10459000D1E022E02A87EAE1F0E0E491A0ECB4E087 +:1045A000DA96EC93DA97EBE1F0E0E491DB96EC93AA +:1045B000DB971A868BE496E28E7F16968D939C93FA +:1045C000179785E18C9318962C933FBF81E08093D9 +:1045D0002323ABDFDF91CF910895E0ECF4E08085F9 +:1045E0008370808711860895E0ECF4E08FEF828776 +:1045F000848708951F920F920FB60F9211242F9364 +:104600003F934F935F936F937F938F939F93AF935A +:10461000BF93EF93FF938091CA0487FD4FC08091B1 +:10462000CA0486FD42C08091CA0485FF0DC080E2A5 +:10463000E0ECF4E0828780912023882371F184E00C +:10464000809324230E94720BE0ECF4E08091CA0472 +:1046500084FF12C080E1828782E08093242310923D +:1046600020231382B6DE80E868E448E0F9DD80E0CC +:1046700068E448E0F5DD17DBFF91EF91BF91AF9162 +:104680009F918F917F916F915F914F913F912F916A +:104690000F900FBE0F901F9018958091C304882330 +:1046A000B9F481E080932423CDCF80E4E0ECF4E002 +:1046B0008287109224230E94770BB5CF8091C80483 +:1046C00087FFADCF80E8E0ECF4E08287ECDAA7CF9B +:1046D00083E0E8CFEF92FF920F931F93CF93DF9386 +:1046E000EC0181DD882349F0888190E02091292325 +:1046F00030912A232817390739F0DF91CF911F9184 +:104700000F91FF90EF90089580912623813209F454 +:104710005FC0823208F04BC0803279F78091252348 +:10472000813259F734DD04C080912423882329F392 +:1047300072DD8823C9F3B5DCE82EB3DCF82EB1DCDA +:10474000082FAFDC482F50E060E070E0742F662740 +:104750005527442710E020E030E09801112700277A +:10476000402B512B622B732B8E2D90E0A0E0B0E0FC +:10477000482B592B6A2B7B2B8F2D90E0A0E0B0E0CB +:10478000BA2FA92F982F8827482B592B6A2B7B2BC0 +:104790004C8B5D8B6E8B7F8B84DC888F82DC898F6A +:1047A00080DC8A8F6FDC4DDECE019ED1A6CF8232B7 +:1047B00061F1833209F0A1CF80912523813209F084 +:1047C0009CCFE5DC3EDECE01609127238DD195CFD5 +:1047D00080912523813A09F090CFD9DC34DD8823FC +:1047E000E9F38C89ED88FE880F896ADC8E2D68DC00 +:1047F0008F2D66DC802F64DC888D62DC898D60DC27 +:104800008A8D5EDC26DC1DDE78CF80912523813207 +:1048100009F073CFBCDC15DE80912723909128230B +:10482000888B998BCE0160D168CFCF93DF93EC0159 +:104830004096FC018BE0DF011D928A95E9F782E04A +:104840008C83898783E08E87CE01019661E055DDF8 +:10485000882321F480E0DF91CF910895CE01069660 +:1048600061E04BDD8823B1F3CE010B9661E045DDBD +:10487000DF91CF910895CF93DF93EB012091242313 +:10488000243021F082E0DF91CF910895FC0144892A +:10489000558966897789411551056105710591F33F +:1048A00081811DDCFE0101900020E9F73197EC1BAE +:1048B000FD0BCE01BF0140E050E00ADAE4CF0F93D8 +:1048C0001F93CF93DF938B01EA012091242324309F +:1048D00031F082E0DF91CF911F910F910895FC019B +:1048E00044895589668977894115510561057105A6 +:1048F00081F38181F4DBC801BE0140E050E0E8D9DA +:10490000E9CFCF93C62F20912423243019F082E0E1 +:10491000CF910895FC0144895589668977894115AD +:1049200051056105710599F38181D9DB20912D2312 +:1049300030912E23F901EF5BFF4F9081205C3F4FB8 +:10494000F9018081981720F084DB91DD882301F73D +:104950008C2FB6DB80E0DCCF0F931F93CF93DF93D8 +:104960000F92CDB7DEB720912423243039F082E0B6 +:104970000F90DF91CF911F910F910895FC01448911 +:10498000558966897789411551056105710579F366 +:104990008181A5DB8091312320912D2330912E231D +:1049A000F90187FD1DC0E05CFF4F8081F901EF5BDD +:1049B000FF4F408190E0841B9109009711F480E043 +:1049C000D7CF0081205C3F4FF901108142DB0117F6 +:1049D000B0F34DDD882361F689833BDB8981C8CF45 +:1049E000EF5BFF4F808190E0E8CFCF93DF93EC0146 +:1049F00080912423843019F0DF91CF9108958C8920 +:104A00009D89AE89BF890097A105B105A9F3898168 +:104A100066DB19DC882381F3CE019EDFEDCFCF93D7 +:104A2000DF9300D0CDB7DEB7FC0180912423843022 +:104A300009F03EC044895589668977894115510539 +:104A400061057105A9F186814ADBE5DB882381F1E7 +:104A50008091312320912D2330912E23F90187FD60 +:104A60003EC0E05CFF4F8081F901EF5BFF4F40816A +:104A700090E0841B9109009711F58FEF9FEF409113 +:104A8000312347FD29C0205C3F4FD9012C91408143 +:104A900030E0241B31092115310561F489839A83A3 +:104AA000F1DA89819A810F900F90DF91CF9108956B +:104AB0008FEF9FEF0F900F90DF91CF910895F1DA74 +:104AC00090E020912D2330912E23F901EF5BFF4FD1 +:104AD0004091312347FFD7CF208130E0DCCFEF5B1F +:104AE000FF4F808190E0C7CF0895629FD001739FF0 +:104AF000F001829FE00DF11D649FE00DF11D929F7A +:104B0000F00D839FF00D749FF00D659FF00D9927B8 +:104B1000729FB00DE11DF91F639FB00DE11DF91FDC +:104B2000BD01CF01112408958F929F92AF92BF9241 +:104B3000CF92DF92EF92FF92CF93DF93EC018881C7 +:104B40009981AA81BB810097A105B10521F484E276 +:104B500099EDABE5B7E0BC01CD012DE133EF41E0CC +:104B600050E03DD349015A0127EA31E440E050E0EA +:104B7000BCDF6B017C01C501B4012CEE34EF4FEFBB +:104B80005FEFB3DFDC01CB01C80ED91EEA1EFB1EAE +:104B9000F7FE08C08FEF9FEFAFEFBFE7C80ED91E3B +:104BA000EA1EFB1EC882D982EA82FB82C6019F7779 +:104BB000DF91CF91FF90EF90DF90CF90BF90AF90BB +:104BC0009F908F900895B0CF8DE990E2ADCFA0E097 +:104BD000B0E080939D2090939E20A0939F20B0935F +:104BE000A0200895FB01DC0102C005900D92415008 +:104BF0005040D8F70895FB01DC018D910590801994 +:104C00000110D9F3990B0895FB01DC01415050408C +:104C100048F005900D920020C9F701C01D92415047 +:104C20005040E0F70895FB01DC0102C001900D92B5 +:104C300041505040D8F70895AEE0B0E0E1E2F6E22E +:104C4000F7C20D891E898F89988D2EE02C830983E8 +:104C50001A8397FF02C080E090E801978D839E83BE +:104C6000AE01455E5F4FCE010196698D7A8D11D000 +:104C70004D815E8157FD0AC02F8138854217530749 +:104C80000CF49A01020F131FF80110822E96E4E033 +:104C9000E8C2ADE0B0E0EEE4F6E2BCC23C016C87F5 +:104CA0007D875A01FC0116821782838181FFBBC177 +:104CB0002E010894411C511CF3019381EC85FD8564 +:104CC00093FD859193FF8191EC87FD87882309F4FB +:104CD000A6C1853241F493FD859193FF8191EC87C4 +:104CE000FD87853221F490E0B301EFD1E5CFFF24B9 +:104CF000EE2410E01032B0F48B3269F08C3228F4DC +:104D0000803251F0833271F40BC08D3239F0803330 +:104D100049F411602CC01260146029C0186027C0CB +:104D2000106125C017FD2EC0282F20532A3098F47B +:104D300016FF08C08F2D880FF82EFF0CFF0CF80E01 +:104D4000F20E15C08E2D880FE82EEE0CEE0CE80E3C +:104D5000E20E10620CC08E3221F416FD60C11064A8 +:104D600006C08C3611F4106802C0883659F4EC8500 +:104D7000FD8593FD859193FF8191EC87FD878823C5 +:104D800009F0B8CF982F9554933018F09052933083 +:104D900038F424E030E0A20EB31E3FE339830FC0A5 +:104DA000833631F0833781F0833509F056C021C056 +:104DB000F5018081898322E030E0A20EB31E21E05C +:104DC000C22ED12C420113C092E0292E312C2A0C84 +:104DD0003B1CF5018080918016FF03C06F2D70E0B1 +:104DE00002C06FEF7FEFC40165D16C0151011F77E5 +:104DF00014C082E0282E312C2A0C3B1CF501808047 +:104E0000918016FF03C06F2D70E002C06FEF7FEF3F +:104E1000C40145D16C011068510113FD1AC005C0D1 +:104E200080E290E0B30151D1EA948E2D90E0C81653 +:104E3000D906B0F30EC0F40117FD859117FF8191DB +:104E40004F0190E0B30141D1E110EA940894C10808 +:104E5000D108C114D10479F7DFC0843611F0893646 +:104E600049F5F50117FF07C080819181A281B381C7 +:104E700024E030E008C080819181AA2797FDA095A9 +:104E8000BA2F22E030E0A20EB31E012F0F76B7FF3B +:104E900008C0B095A095909581959F4FAF4FBF4F9B +:104EA0000068BC01CD01A2012AE030E03AD1D82E41 +:104EB000D4183EC0853721F41F7E2AE030E020C0A0 +:104EC000197F8F36A9F0803720F4883509F0A7C004 +:104ED0000BC0803721F0883709F0A1C001C01061F4 +:104EE00014FF09C0146007C014FF08C0166006C094 +:104EF00028E030E005C020E130E002C020E132E0EF +:104F0000F50117FF07C0608171818281938144E0C0 +:104F100050E006C06081718180E090E042E050E0A6 +:104F2000A40EB51EA201FDD0D82ED418012F0F77E4 +:104F300006FF09C00E7FDF1430F404FF06C002FD37 +:104F400004C00F7E02C01D2D01C01F2D802F90E0D8 +:104F500004FF0CC0FE01ED0DF11D2081203311F482 +:104F6000097E09C002FF06C01E5F05C086789070EA +:104F7000009709F01F5F802E992403FD11C000FFE8 +:104F80000CC0FD2C1E1548F4FE0CF11A1E2D05C098 +:104F900080E290E0B30199D01F5F1E15C8F304C0F2 +:104FA0001E1510F4E11A01C0EE2484FE0EC080E349 +:104FB00090E0B3018AD082FE1DC081FE03C088E567 +:104FC00090E010C088E790E00DC0C4018678907032 +:104FD000009781F081FC02C080E201C08BE207FDF6 +:104FE0008DE290E0B30171D005C080E390E0B301A1 +:104FF0006CD0FA94DF14C8F3DA94F201ED0DF11DD0 +:10500000808190E0B30161D0DD20B1F705C080E27E +:1050100090E0B3015AD0EA94EE20C9F74DCEF301E7 +:105020008681978102C08FEF9FEF2D96E2E10BC141 +:10503000E0ECF1E0A785A7FDFDCFA485A860A487DB +:105040006050704FF0CDDC01CB0102C02D9105D036 +:1050500041505040D8F70895262FE0ECF1E0378515 +:1050600037FDFDCF3485377F3487378531FF09C061 +:1050700036E3328738ED34BF31E03387378537FD8B +:10508000FDCF33E33287808391831282248325E32B +:10509000228728ED31E024BF338701960895FC0173 +:1050A0000590615070400110D8F7809590958E0F53 +:1050B0009F1F0895FC016150704001900110D8F7C6 +:1050C000809590958E0F9F1F08950F931F93CF93F8 +:1050D000DF938C01EB018B8181FF1BC082FF0DC030 +:1050E0002E813F818C819D812817390764F4E881E6 +:1050F000F9810193E883F98306C0E885F985802F5B +:105100000995009731F48E819F8101968E839F834C +:1051100002C00FEF1FEFC801DF91CF911F910F91D8 +:105120000895FA01AA27283051F1203181F1E8943D +:105130006F936E7F6E5F7F4F8F4F9F4FAF4FB1E08A +:105140003ED0B4E03CD0670F781F891F9A1FA11D85 +:10515000680F791F8A1F911DA11D6A0F711D811D86 +:10516000911DA11D20D009F468943F912AE0269F4B +:1051700011243019305D3193DEF6CF010895462FAA +:105180004770405D4193B3E00FD0C9F7F6CF462F8B +:105190004F70405D4A3318F0495D31FD40524193F4 +:1051A00002D0A9F7EACFB4E0A695979587957795B1 +:1051B0006795BA95C9F700976105710508959B0138 +:1051C000AC010A2E06945795479537952795BA95C1 +:1051D000C9F7620F731F841F951FA01D089597FBC9 +:1051E000092E05260ED057FD04D045D00AD0001C4C +:1051F00038F450954095309521953F4F4F4F5F4F74 +:105200000895F6F790958095709561957F4F8F4F33 +:105210009F4F08952F923F924F925F926F927F928D +:105220008F929F92AF92BF92CF92DF92EF92FF92B6 +:105230000F931F93CF93DF93CDB7DEB7CA1BDB0B62 +:10524000CDBFDEBF09942A88398848885F846E8480 +:105250007D848C849B84AA84B984C884DF80EE809A +:10526000FD800C811B81AA81B981CE0FD11DCDBFDC +:10527000DEBFED010895A1E21A2EAA1BBB1BFD01A2 +:105280000DC0AA1FBB1FEE1FFF1FA217B307E40725 +:10529000F50720F0A21BB30BE40BF50B661F771F7D +:1052A000881F991F1A9469F760957095809590955D +:0E52B0009B01AC01BD01CF010895F894FFCF22 +:1052BE0000831000000104100000018208000001AC +:1052CE0000000000000000000000001400000101BA +:1052DE0001000000010000010001010001000000BA +:1052EE0002020000020002020202000002000000A0 +:1052FE000404000004000404040400000400080870 +:10530E00080000000800000800080800080000005F +:10531E0010100000100010101010000010000100FE +:10532E000100000000000000010001010101010167 +:10533E0000010001000000010100010101A1200097 +:10534E000000000200A101000000000000010000AA +:02535E0000004D :00000001FF diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.lss b/Firmware/Chameleon-Mini/Chameleon-Mini.lss index d1eab40..445a85e 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.lss +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.lss @@ -3,287 +3,287 @@ Chameleon-Mini.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 0000529e 00000000 00000000 000000b4 2**1 + 0 .text 000052be 00000000 00000000 000000b4 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 000000a2 00802000 0000529e 00005352 2**0 + 1 .data 000000a2 00802000 000052be 00005372 2**0 CONTENTS, ALLOC, LOAD, DATA - 2 .bss 0000060b 008020a2 008020a2 000053f4 2**0 + 2 .bss 0000060b 008020a2 008020a2 00005414 2**0 ALLOC - 3 .eeprom 00000013 00810000 00810000 000053f4 2**0 + 3 .eeprom 00000013 00810000 00810000 00005414 2**0 CONTENTS, ALLOC, LOAD, DATA - 4 .stab 000014d0 00000000 00000000 00005408 2**2 + 4 .stab 000014d0 00000000 00000000 00005428 2**2 CONTENTS, READONLY, DEBUGGING - 5 .stabstr 00000601 00000000 00000000 000068d8 2**0 + 5 .stabstr 00000601 00000000 00000000 000068f8 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_aranges 00000b78 00000000 00000000 00006ee0 2**3 + 6 .debug_aranges 00000b78 00000000 00000000 00006f00 2**3 CONTENTS, READONLY, DEBUGGING - 7 .debug_info 000159d0 00000000 00000000 00007a58 2**0 + 7 .debug_info 000159d0 00000000 00000000 00007a78 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_abbrev 00004a41 00000000 00000000 0001d428 2**0 + 8 .debug_abbrev 00004a41 00000000 00000000 0001d448 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_line 000075a6 00000000 00000000 00021e69 2**0 + 9 .debug_line 000075a6 00000000 00000000 00021e89 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_frame 00001e1c 00000000 00000000 00029410 2**2 + 10 .debug_frame 00001e1c 00000000 00000000 00029430 2**2 CONTENTS, READONLY, DEBUGGING - 11 .debug_str 0000769c 00000000 00000000 0002b22c 2**0 + 11 .debug_str 000076b2 00000000 00000000 0002b24c 2**0 CONTENTS, READONLY, DEBUGGING - 12 .debug_loc 0000b6e8 00000000 00000000 000328c8 2**0 + 12 .debug_loc 0000b6e8 00000000 00000000 000328fe 2**0 CONTENTS, READONLY, DEBUGGING - 13 .debug_ranges 00001ae0 00000000 00000000 0003dfb0 2**0 + 13 .debug_ranges 00001ae0 00000000 00000000 0003dfe6 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: - 0: 23 c3 rjmp .+1606 ; 0x648 <__ctors_end> + 0: 33 c3 rjmp .+1638 ; 0x668 <__ctors_end> 2: 00 00 nop - 4: 3d c3 rjmp .+1658 ; 0x680 <__bad_interrupt> + 4: 4d c3 rjmp .+1690 ; 0x6a0 <__bad_interrupt> 6: 00 00 nop - 8: 3b c3 rjmp .+1654 ; 0x680 <__bad_interrupt> + 8: 4b c3 rjmp .+1686 ; 0x6a0 <__bad_interrupt> a: 00 00 nop - c: 39 c3 rjmp .+1650 ; 0x680 <__bad_interrupt> + c: 49 c3 rjmp .+1682 ; 0x6a0 <__bad_interrupt> e: 00 00 nop - 10: 37 c3 rjmp .+1646 ; 0x680 <__bad_interrupt> + 10: 47 c3 rjmp .+1678 ; 0x6a0 <__bad_interrupt> 12: 00 00 nop - 14: 35 c3 rjmp .+1642 ; 0x680 <__bad_interrupt> + 14: 45 c3 rjmp .+1674 ; 0x6a0 <__bad_interrupt> 16: 00 00 nop - 18: 33 c3 rjmp .+1638 ; 0x680 <__bad_interrupt> + 18: 43 c3 rjmp .+1670 ; 0x6a0 <__bad_interrupt> 1a: 00 00 nop - 1c: 31 c3 rjmp .+1634 ; 0x680 <__bad_interrupt> + 1c: 41 c3 rjmp .+1666 ; 0x6a0 <__bad_interrupt> 1e: 00 00 nop - 20: 2f c3 rjmp .+1630 ; 0x680 <__bad_interrupt> + 20: 3f c3 rjmp .+1662 ; 0x6a0 <__bad_interrupt> 22: 00 00 nop - 24: 2d c3 rjmp .+1626 ; 0x680 <__bad_interrupt> + 24: 3d c3 rjmp .+1658 ; 0x6a0 <__bad_interrupt> 26: 00 00 nop - 28: 2b c3 rjmp .+1622 ; 0x680 <__bad_interrupt> + 28: 3b c3 rjmp .+1654 ; 0x6a0 <__bad_interrupt> 2a: 00 00 nop - 2c: 29 c3 rjmp .+1618 ; 0x680 <__bad_interrupt> + 2c: 39 c3 rjmp .+1650 ; 0x6a0 <__bad_interrupt> 2e: 00 00 nop - 30: 27 c3 rjmp .+1614 ; 0x680 <__bad_interrupt> + 30: 37 c3 rjmp .+1646 ; 0x6a0 <__bad_interrupt> 32: 00 00 nop - 34: 25 c3 rjmp .+1610 ; 0x680 <__bad_interrupt> + 34: 35 c3 rjmp .+1642 ; 0x6a0 <__bad_interrupt> 36: 00 00 nop - 38: 23 c3 rjmp .+1606 ; 0x680 <__bad_interrupt> + 38: 33 c3 rjmp .+1638 ; 0x6a0 <__bad_interrupt> 3a: 00 00 nop - 3c: 21 c3 rjmp .+1602 ; 0x680 <__bad_interrupt> + 3c: 31 c3 rjmp .+1634 ; 0x6a0 <__bad_interrupt> 3e: 00 00 nop - 40: 1f c3 rjmp .+1598 ; 0x680 <__bad_interrupt> + 40: 2f c3 rjmp .+1630 ; 0x6a0 <__bad_interrupt> 42: 00 00 nop - 44: 1d c3 rjmp .+1594 ; 0x680 <__bad_interrupt> + 44: 2d c3 rjmp .+1626 ; 0x6a0 <__bad_interrupt> 46: 00 00 nop - 48: 1b c3 rjmp .+1590 ; 0x680 <__bad_interrupt> + 48: 2b c3 rjmp .+1622 ; 0x6a0 <__bad_interrupt> 4a: 00 00 nop - 4c: 19 c3 rjmp .+1586 ; 0x680 <__bad_interrupt> + 4c: 29 c3 rjmp .+1618 ; 0x6a0 <__bad_interrupt> 4e: 00 00 nop - 50: 17 c3 rjmp .+1582 ; 0x680 <__bad_interrupt> + 50: 27 c3 rjmp .+1614 ; 0x6a0 <__bad_interrupt> 52: 00 00 nop - 54: 15 c3 rjmp .+1578 ; 0x680 <__bad_interrupt> + 54: 25 c3 rjmp .+1610 ; 0x6a0 <__bad_interrupt> 56: 00 00 nop - 58: 0c 94 5a 11 jmp 0x22b4 ; 0x22b4 <__vector_22> - 5c: 11 c3 rjmp .+1570 ; 0x680 <__bad_interrupt> + 58: 0c 94 6a 11 jmp 0x22d4 ; 0x22d4 <__vector_22> + 5c: 21 c3 rjmp .+1602 ; 0x6a0 <__bad_interrupt> 5e: 00 00 nop - 60: 0f c3 rjmp .+1566 ; 0x680 <__bad_interrupt> + 60: 1f c3 rjmp .+1598 ; 0x6a0 <__bad_interrupt> 62: 00 00 nop - 64: 0d c3 rjmp .+1562 ; 0x680 <__bad_interrupt> + 64: 1d c3 rjmp .+1594 ; 0x6a0 <__bad_interrupt> 66: 00 00 nop - 68: 0b c3 rjmp .+1558 ; 0x680 <__bad_interrupt> + 68: 1b c3 rjmp .+1590 ; 0x6a0 <__bad_interrupt> 6a: 00 00 nop - 6c: 09 c3 rjmp .+1554 ; 0x680 <__bad_interrupt> + 6c: 19 c3 rjmp .+1586 ; 0x6a0 <__bad_interrupt> 6e: 00 00 nop - 70: 07 c3 rjmp .+1550 ; 0x680 <__bad_interrupt> + 70: 17 c3 rjmp .+1582 ; 0x6a0 <__bad_interrupt> 72: 00 00 nop - 74: 05 c3 rjmp .+1546 ; 0x680 <__bad_interrupt> + 74: 15 c3 rjmp .+1578 ; 0x6a0 <__bad_interrupt> 76: 00 00 nop - 78: 03 c3 rjmp .+1542 ; 0x680 <__bad_interrupt> + 78: 13 c3 rjmp .+1574 ; 0x6a0 <__bad_interrupt> 7a: 00 00 nop - 7c: 01 c3 rjmp .+1538 ; 0x680 <__bad_interrupt> + 7c: 11 c3 rjmp .+1570 ; 0x6a0 <__bad_interrupt> 7e: 00 00 nop - 80: ff c2 rjmp .+1534 ; 0x680 <__bad_interrupt> + 80: 0f c3 rjmp .+1566 ; 0x6a0 <__bad_interrupt> 82: 00 00 nop - 84: fd c2 rjmp .+1530 ; 0x680 <__bad_interrupt> + 84: 0d c3 rjmp .+1562 ; 0x6a0 <__bad_interrupt> 86: 00 00 nop - 88: 0c 94 16 11 jmp 0x222c ; 0x222c <__vector_34> - 8c: f9 c2 rjmp .+1522 ; 0x680 <__bad_interrupt> + 88: 0c 94 26 11 jmp 0x224c ; 0x224c <__vector_34> + 8c: 09 c3 rjmp .+1554 ; 0x6a0 <__bad_interrupt> 8e: 00 00 nop - 90: f7 c2 rjmp .+1518 ; 0x680 <__bad_interrupt> + 90: 07 c3 rjmp .+1550 ; 0x6a0 <__bad_interrupt> 92: 00 00 nop - 94: f5 c2 rjmp .+1514 ; 0x680 <__bad_interrupt> + 94: 05 c3 rjmp .+1546 ; 0x6a0 <__bad_interrupt> 96: 00 00 nop - 98: f3 c2 rjmp .+1510 ; 0x680 <__bad_interrupt> + 98: 03 c3 rjmp .+1542 ; 0x6a0 <__bad_interrupt> 9a: 00 00 nop - 9c: f1 c2 rjmp .+1506 ; 0x680 <__bad_interrupt> + 9c: 01 c3 rjmp .+1538 ; 0x6a0 <__bad_interrupt> 9e: 00 00 nop - a0: ef c2 rjmp .+1502 ; 0x680 <__bad_interrupt> + a0: ff c2 rjmp .+1534 ; 0x6a0 <__bad_interrupt> a2: 00 00 nop - a4: ed c2 rjmp .+1498 ; 0x680 <__bad_interrupt> + a4: fd c2 rjmp .+1530 ; 0x6a0 <__bad_interrupt> a6: 00 00 nop - a8: eb c2 rjmp .+1494 ; 0x680 <__bad_interrupt> + a8: fb c2 rjmp .+1526 ; 0x6a0 <__bad_interrupt> aa: 00 00 nop - ac: e9 c2 rjmp .+1490 ; 0x680 <__bad_interrupt> + ac: f9 c2 rjmp .+1522 ; 0x6a0 <__bad_interrupt> ae: 00 00 nop - b0: e7 c2 rjmp .+1486 ; 0x680 <__bad_interrupt> + b0: f7 c2 rjmp .+1518 ; 0x6a0 <__bad_interrupt> b2: 00 00 nop - b4: e5 c2 rjmp .+1482 ; 0x680 <__bad_interrupt> + b4: f5 c2 rjmp .+1514 ; 0x6a0 <__bad_interrupt> b6: 00 00 nop - b8: e3 c2 rjmp .+1478 ; 0x680 <__bad_interrupt> + b8: f3 c2 rjmp .+1510 ; 0x6a0 <__bad_interrupt> ba: 00 00 nop - bc: e1 c2 rjmp .+1474 ; 0x680 <__bad_interrupt> + bc: f1 c2 rjmp .+1506 ; 0x6a0 <__bad_interrupt> be: 00 00 nop - c0: df c2 rjmp .+1470 ; 0x680 <__bad_interrupt> + c0: ef c2 rjmp .+1502 ; 0x6a0 <__bad_interrupt> c2: 00 00 nop - c4: dd c2 rjmp .+1466 ; 0x680 <__bad_interrupt> + c4: ed c2 rjmp .+1498 ; 0x6a0 <__bad_interrupt> c6: 00 00 nop - c8: db c2 rjmp .+1462 ; 0x680 <__bad_interrupt> + c8: eb c2 rjmp .+1494 ; 0x6a0 <__bad_interrupt> ca: 00 00 nop - cc: d9 c2 rjmp .+1458 ; 0x680 <__bad_interrupt> + cc: e9 c2 rjmp .+1490 ; 0x6a0 <__bad_interrupt> ce: 00 00 nop - d0: d7 c2 rjmp .+1454 ; 0x680 <__bad_interrupt> + d0: e7 c2 rjmp .+1486 ; 0x6a0 <__bad_interrupt> d2: 00 00 nop - d4: d5 c2 rjmp .+1450 ; 0x680 <__bad_interrupt> + d4: e5 c2 rjmp .+1482 ; 0x6a0 <__bad_interrupt> d6: 00 00 nop - d8: d3 c2 rjmp .+1446 ; 0x680 <__bad_interrupt> + d8: e3 c2 rjmp .+1478 ; 0x6a0 <__bad_interrupt> da: 00 00 nop - dc: d1 c2 rjmp .+1442 ; 0x680 <__bad_interrupt> + dc: e1 c2 rjmp .+1474 ; 0x6a0 <__bad_interrupt> de: 00 00 nop - e0: cf c2 rjmp .+1438 ; 0x680 <__bad_interrupt> + e0: df c2 rjmp .+1470 ; 0x6a0 <__bad_interrupt> e2: 00 00 nop - e4: cd c2 rjmp .+1434 ; 0x680 <__bad_interrupt> + e4: dd c2 rjmp .+1466 ; 0x6a0 <__bad_interrupt> e6: 00 00 nop - e8: cb c2 rjmp .+1430 ; 0x680 <__bad_interrupt> + e8: db c2 rjmp .+1462 ; 0x6a0 <__bad_interrupt> ea: 00 00 nop - ec: c9 c2 rjmp .+1426 ; 0x680 <__bad_interrupt> + ec: d9 c2 rjmp .+1458 ; 0x6a0 <__bad_interrupt> ee: 00 00 nop - f0: c7 c2 rjmp .+1422 ; 0x680 <__bad_interrupt> + f0: d7 c2 rjmp .+1454 ; 0x6a0 <__bad_interrupt> f2: 00 00 nop - f4: c5 c2 rjmp .+1418 ; 0x680 <__bad_interrupt> + f4: d5 c2 rjmp .+1450 ; 0x6a0 <__bad_interrupt> f6: 00 00 nop - f8: c3 c2 rjmp .+1414 ; 0x680 <__bad_interrupt> + f8: d3 c2 rjmp .+1446 ; 0x6a0 <__bad_interrupt> fa: 00 00 nop - fc: c1 c2 rjmp .+1410 ; 0x680 <__bad_interrupt> + fc: d1 c2 rjmp .+1442 ; 0x6a0 <__bad_interrupt> fe: 00 00 nop - 100: bf c2 rjmp .+1406 ; 0x680 <__bad_interrupt> + 100: cf c2 rjmp .+1438 ; 0x6a0 <__bad_interrupt> 102: 00 00 nop - 104: bd c2 rjmp .+1402 ; 0x680 <__bad_interrupt> + 104: cd c2 rjmp .+1434 ; 0x6a0 <__bad_interrupt> 106: 00 00 nop - 108: bb c2 rjmp .+1398 ; 0x680 <__bad_interrupt> + 108: cb c2 rjmp .+1430 ; 0x6a0 <__bad_interrupt> 10a: 00 00 nop - 10c: b9 c2 rjmp .+1394 ; 0x680 <__bad_interrupt> + 10c: c9 c2 rjmp .+1426 ; 0x6a0 <__bad_interrupt> 10e: 00 00 nop - 110: b7 c2 rjmp .+1390 ; 0x680 <__bad_interrupt> + 110: c7 c2 rjmp .+1422 ; 0x6a0 <__bad_interrupt> 112: 00 00 nop - 114: b5 c2 rjmp .+1386 ; 0x680 <__bad_interrupt> + 114: c5 c2 rjmp .+1418 ; 0x6a0 <__bad_interrupt> 116: 00 00 nop - 118: b3 c2 rjmp .+1382 ; 0x680 <__bad_interrupt> + 118: c3 c2 rjmp .+1414 ; 0x6a0 <__bad_interrupt> 11a: 00 00 nop - 11c: b1 c2 rjmp .+1378 ; 0x680 <__bad_interrupt> + 11c: c1 c2 rjmp .+1410 ; 0x6a0 <__bad_interrupt> 11e: 00 00 nop - 120: af c2 rjmp .+1374 ; 0x680 <__bad_interrupt> + 120: bf c2 rjmp .+1406 ; 0x6a0 <__bad_interrupt> 122: 00 00 nop - 124: ad c2 rjmp .+1370 ; 0x680 <__bad_interrupt> + 124: bd c2 rjmp .+1402 ; 0x6a0 <__bad_interrupt> 126: 00 00 nop - 128: ab c2 rjmp .+1366 ; 0x680 <__bad_interrupt> + 128: bb c2 rjmp .+1398 ; 0x6a0 <__bad_interrupt> 12a: 00 00 nop - 12c: a9 c2 rjmp .+1362 ; 0x680 <__bad_interrupt> + 12c: b9 c2 rjmp .+1394 ; 0x6a0 <__bad_interrupt> 12e: 00 00 nop - 130: a7 c2 rjmp .+1358 ; 0x680 <__bad_interrupt> + 130: b7 c2 rjmp .+1390 ; 0x6a0 <__bad_interrupt> 132: 00 00 nop - 134: a5 c2 rjmp .+1354 ; 0x680 <__bad_interrupt> + 134: b5 c2 rjmp .+1386 ; 0x6a0 <__bad_interrupt> 136: 00 00 nop - 138: a3 c2 rjmp .+1350 ; 0x680 <__bad_interrupt> + 138: b3 c2 rjmp .+1382 ; 0x6a0 <__bad_interrupt> 13a: 00 00 nop - 13c: a1 c2 rjmp .+1346 ; 0x680 <__bad_interrupt> + 13c: b1 c2 rjmp .+1378 ; 0x6a0 <__bad_interrupt> 13e: 00 00 nop - 140: 9f c2 rjmp .+1342 ; 0x680 <__bad_interrupt> + 140: af c2 rjmp .+1374 ; 0x6a0 <__bad_interrupt> 142: 00 00 nop - 144: 9d c2 rjmp .+1338 ; 0x680 <__bad_interrupt> + 144: ad c2 rjmp .+1370 ; 0x6a0 <__bad_interrupt> 146: 00 00 nop - 148: 9b c2 rjmp .+1334 ; 0x680 <__bad_interrupt> + 148: ab c2 rjmp .+1366 ; 0x6a0 <__bad_interrupt> 14a: 00 00 nop - 14c: 0c 94 fe 11 jmp 0x23fc ; 0x23fc <__vector_83> - 150: 97 c2 rjmp .+1326 ; 0x680 <__bad_interrupt> + 14c: 0c 94 0e 12 jmp 0x241c ; 0x241c <__vector_83> + 150: a7 c2 rjmp .+1358 ; 0x6a0 <__bad_interrupt> 152: 00 00 nop - 154: 95 c2 rjmp .+1322 ; 0x680 <__bad_interrupt> + 154: a5 c2 rjmp .+1354 ; 0x6a0 <__bad_interrupt> 156: 00 00 nop - 158: 93 c2 rjmp .+1318 ; 0x680 <__bad_interrupt> + 158: a3 c2 rjmp .+1350 ; 0x6a0 <__bad_interrupt> 15a: 00 00 nop - 15c: 91 c2 rjmp .+1314 ; 0x680 <__bad_interrupt> + 15c: a1 c2 rjmp .+1346 ; 0x6a0 <__bad_interrupt> 15e: 00 00 nop - 160: 8f c2 rjmp .+1310 ; 0x680 <__bad_interrupt> + 160: 9f c2 rjmp .+1342 ; 0x6a0 <__bad_interrupt> 162: 00 00 nop - 164: 8d c2 rjmp .+1306 ; 0x680 <__bad_interrupt> + 164: 9d c2 rjmp .+1338 ; 0x6a0 <__bad_interrupt> 166: 00 00 nop - 168: 8b c2 rjmp .+1302 ; 0x680 <__bad_interrupt> + 168: 9b c2 rjmp .+1334 ; 0x6a0 <__bad_interrupt> 16a: 00 00 nop - 16c: 89 c2 rjmp .+1298 ; 0x680 <__bad_interrupt> + 16c: 99 c2 rjmp .+1330 ; 0x6a0 <__bad_interrupt> 16e: 00 00 nop - 170: 87 c2 rjmp .+1294 ; 0x680 <__bad_interrupt> + 170: 97 c2 rjmp .+1326 ; 0x6a0 <__bad_interrupt> 172: 00 00 nop - 174: 85 c2 rjmp .+1290 ; 0x680 <__bad_interrupt> + 174: 95 c2 rjmp .+1322 ; 0x6a0 <__bad_interrupt> 176: 00 00 nop - 178: 83 c2 rjmp .+1286 ; 0x680 <__bad_interrupt> + 178: 93 c2 rjmp .+1318 ; 0x6a0 <__bad_interrupt> 17a: 00 00 nop - 17c: 81 c2 rjmp .+1282 ; 0x680 <__bad_interrupt> + 17c: 91 c2 rjmp .+1314 ; 0x6a0 <__bad_interrupt> 17e: 00 00 nop - 180: 7f c2 rjmp .+1278 ; 0x680 <__bad_interrupt> + 180: 8f c2 rjmp .+1310 ; 0x6a0 <__bad_interrupt> 182: 00 00 nop - 184: 7d c2 rjmp .+1274 ; 0x680 <__bad_interrupt> + 184: 8d c2 rjmp .+1306 ; 0x6a0 <__bad_interrupt> 186: 00 00 nop - 188: 7b c2 rjmp .+1270 ; 0x680 <__bad_interrupt> + 188: 8b c2 rjmp .+1302 ; 0x6a0 <__bad_interrupt> 18a: 00 00 nop - 18c: 79 c2 rjmp .+1266 ; 0x680 <__bad_interrupt> + 18c: 89 c2 rjmp .+1298 ; 0x6a0 <__bad_interrupt> 18e: 00 00 nop - 190: 77 c2 rjmp .+1262 ; 0x680 <__bad_interrupt> + 190: 87 c2 rjmp .+1294 ; 0x6a0 <__bad_interrupt> 192: 00 00 nop - 194: 75 c2 rjmp .+1258 ; 0x680 <__bad_interrupt> + 194: 85 c2 rjmp .+1290 ; 0x6a0 <__bad_interrupt> 196: 00 00 nop - 198: 73 c2 rjmp .+1254 ; 0x680 <__bad_interrupt> + 198: 83 c2 rjmp .+1286 ; 0x6a0 <__bad_interrupt> 19a: 00 00 nop - 19c: 71 c2 rjmp .+1250 ; 0x680 <__bad_interrupt> + 19c: 81 c2 rjmp .+1282 ; 0x6a0 <__bad_interrupt> 19e: 00 00 nop - 1a0: 6f c2 rjmp .+1246 ; 0x680 <__bad_interrupt> + 1a0: 7f c2 rjmp .+1278 ; 0x6a0 <__bad_interrupt> 1a2: 00 00 nop - 1a4: 6d c2 rjmp .+1242 ; 0x680 <__bad_interrupt> + 1a4: 7d c2 rjmp .+1274 ; 0x6a0 <__bad_interrupt> 1a6: 00 00 nop - 1a8: 6b c2 rjmp .+1238 ; 0x680 <__bad_interrupt> + 1a8: 7b c2 rjmp .+1270 ; 0x6a0 <__bad_interrupt> 1aa: 00 00 nop - 1ac: 69 c2 rjmp .+1234 ; 0x680 <__bad_interrupt> + 1ac: 79 c2 rjmp .+1266 ; 0x6a0 <__bad_interrupt> 1ae: 00 00 nop - 1b0: 67 c2 rjmp .+1230 ; 0x680 <__bad_interrupt> + 1b0: 77 c2 rjmp .+1262 ; 0x6a0 <__bad_interrupt> 1b2: 00 00 nop - 1b4: 65 c2 rjmp .+1226 ; 0x680 <__bad_interrupt> + 1b4: 75 c2 rjmp .+1258 ; 0x6a0 <__bad_interrupt> 1b6: 00 00 nop - 1b8: 63 c2 rjmp .+1222 ; 0x680 <__bad_interrupt> + 1b8: 73 c2 rjmp .+1254 ; 0x6a0 <__bad_interrupt> 1ba: 00 00 nop - 1bc: 61 c2 rjmp .+1218 ; 0x680 <__bad_interrupt> + 1bc: 71 c2 rjmp .+1250 ; 0x6a0 <__bad_interrupt> 1be: 00 00 nop - 1c0: 5f c2 rjmp .+1214 ; 0x680 <__bad_interrupt> + 1c0: 6f c2 rjmp .+1246 ; 0x6a0 <__bad_interrupt> 1c2: 00 00 nop - 1c4: 5d c2 rjmp .+1210 ; 0x680 <__bad_interrupt> + 1c4: 6d c2 rjmp .+1242 ; 0x6a0 <__bad_interrupt> 1c6: 00 00 nop - 1c8: 5b c2 rjmp .+1206 ; 0x680 <__bad_interrupt> + 1c8: 6b c2 rjmp .+1238 ; 0x6a0 <__bad_interrupt> 1ca: 00 00 nop - 1cc: 59 c2 rjmp .+1202 ; 0x680 <__bad_interrupt> + 1cc: 69 c2 rjmp .+1234 ; 0x6a0 <__bad_interrupt> 1ce: 00 00 nop - 1d0: 57 c2 rjmp .+1198 ; 0x680 <__bad_interrupt> + 1d0: 67 c2 rjmp .+1230 ; 0x6a0 <__bad_interrupt> 1d2: 00 00 nop - 1d4: 55 c2 rjmp .+1194 ; 0x680 <__bad_interrupt> + 1d4: 65 c2 rjmp .+1226 ; 0x6a0 <__bad_interrupt> 1d6: 00 00 nop - 1d8: 53 c2 rjmp .+1190 ; 0x680 <__bad_interrupt> + 1d8: 63 c2 rjmp .+1222 ; 0x6a0 <__bad_interrupt> 1da: 00 00 nop - 1dc: 51 c2 rjmp .+1186 ; 0x680 <__bad_interrupt> + 1dc: 61 c2 rjmp .+1218 ; 0x6a0 <__bad_interrupt> 1de: 00 00 nop - 1e0: 4f c2 rjmp .+1182 ; 0x680 <__bad_interrupt> + 1e0: 5f c2 rjmp .+1214 ; 0x6a0 <__bad_interrupt> 1e2: 00 00 nop - 1e4: 4d c2 rjmp .+1178 ; 0x680 <__bad_interrupt> + 1e4: 5d c2 rjmp .+1210 ; 0x6a0 <__bad_interrupt> 1e6: 00 00 nop - 1e8: 4b c2 rjmp .+1174 ; 0x680 <__bad_interrupt> + 1e8: 5b c2 rjmp .+1206 ; 0x6a0 <__bad_interrupt> 1ea: 00 00 nop - 1ec: 49 c2 rjmp .+1170 ; 0x680 <__bad_interrupt> + 1ec: 59 c2 rjmp .+1202 ; 0x6a0 <__bad_interrupt> 1ee: 00 00 nop - 1f0: 47 c2 rjmp .+1166 ; 0x680 <__bad_interrupt> + 1f0: 57 c2 rjmp .+1198 ; 0x6a0 <__bad_interrupt> 1f2: 00 00 nop - 1f4: 0c 94 ea 22 jmp 0x45d4 ; 0x45d4 <__vector_125> - 1f8: 43 c2 rjmp .+1158 ; 0x680 <__bad_interrupt> + 1f4: 0c 94 fa 22 jmp 0x45f4 ; 0x45f4 <__vector_125> + 1f8: 53 c2 rjmp .+1190 ; 0x6a0 <__bad_interrupt> 1fa: 00 00 nop 000001fc : @@ -309,12 +309,12 @@ Disassembly of section .text: 00000288 : 288: 00 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 .NONE........... - 298: 00 2c 04 2d 04 2e 04 2f 04 30 04 31 04 34 04 35 .,.-.../.0.1.4.5 + 298: 00 3c 04 3d 04 3e 04 3f 04 40 04 41 04 44 04 45 .<.=.>.?.@.A.D.E 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 07 13 3f 13 b8 13 d2 13 d6 13 _1K.....?....... - 2c8: d7 13 b5 18 bb 18 00 04 04 00 02 4d 46 5f 43 4c ...........MF_CL - 2d8: 41 53 53 49 43 5f 34 4b 00 00 00 07 13 3f 13 c5 ASSIC_4K.....?.. - 2e8: 13 d2 13 d6 13 d7 13 b5 18 bb 18 00 10 04 00 ............... + 2b8: 5f 31 4b 00 00 00 17 13 4f 13 c8 13 e2 13 e6 13 _1K.....O....... + 2c8: e7 13 c5 18 cb 18 00 04 04 00 02 4d 46 5f 43 4c ...........MF_CL + 2d8: 41 53 53 49 43 5f 34 4b 00 00 00 17 13 4f 13 d5 ASSIC_4K.....O.. + 2e8: 13 e2 13 e6 13 e7 13 c5 18 cb 18 00 10 04 00 ............... 000002f7 : 2f7: 4e 4f 4e 45 00 00 00 00 00 00 00 00 00 00 00 00 NONE............ @@ -329,1866 +329,1837 @@ Disassembly of section .text: 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 ................ -000003b7 <__c.6198>: - 3b7: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % - 3c7: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S - 3d7: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV - 3e7: 52 2d 47 43 43 20 25 53 00 R-GCC %S. +000003d7 <__c.6198>: + 3d7: 43 68 61 6d 65 6c 65 6f 6e 2d 4d 69 6e 69 20 25 Chameleon-Mini % + 3e7: 53 20 75 73 69 6e 67 20 4c 55 46 41 20 25 53 20 S using LUFA %S + 3f7: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 41 56 compiled with AV + 407: 52 2d 47 43 43 20 25 53 00 R-GCC %S. -000003f0 <__c.6200>: - 3f0: 31 33 31 32 32 32 00 131222. +00000410 <__c.6200>: + 410: 31 34 30 31 30 32 00 140102. -000003f7 <__c.6202>: - 3f7: 31 33 30 39 30 31 00 130901. +00000417 <__c.6202>: + 417: 31 33 30 39 30 31 00 130901. -000003fe <__c.6204>: - 3fe: 34 2e 36 2e 32 00 4.6.2. +0000041e <__c.6204>: + 41e: 34 2e 36 2e 32 00 4.6.2. -00000404 <__c.6209>: - 404: 25 73 00 %s. +00000424 <__c.6209>: + 424: 25 73 00 %s. -00000407 <__c.6227>: - 407: 52 41 4e 44 4f 4d 00 RANDOM. +00000427 <__c.6227>: + 427: 52 41 4e 44 4f 4d 00 RANDOM. -0000040e <__c.6254>: - 40e: 25 75 00 %u. +0000042e <__c.6254>: + 42e: 25 75 00 %u. -00000411 <__c.6259>: - 411: 25 75 00 %u. +00000431 <__c.6259>: + 431: 25 75 00 %u. -00000414 <__c.6298>: - 414: 25 35 75 20 6d 56 00 %5u mV. +00000434 <__c.6298>: + 434: 25 35 75 20 6d 56 00 %5u mV. -0000041b : - 41b: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... - 42b: 00 00 00 00 74 0b 43 4f 4e 46 49 47 00 00 00 00 ....t.CONFIG.... - 43b: 00 00 00 00 00 00 ce 0b c6 0b a1 0b 55 49 44 00 ............UID. - 44b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f9 0b ................ - 45b: d3 0b 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 ..READONLY...... - 46b: 00 00 00 00 5c 0c 4d 0c 55 50 4c 4f 41 44 00 00 ....\.M.UPLOAD.. - 47b: 00 00 00 00 00 00 00 00 72 0c 00 00 00 00 44 4f ........r.....DO - 48b: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 77 0c WNLOAD........w. - 49b: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... - 4ab: 00 00 00 00 7c 0c 00 00 00 00 55 50 47 52 41 44 ....|.....UPGRAD - 4bb: 45 00 00 00 00 00 00 00 00 00 87 0c 00 00 00 00 E............... - 4cb: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... - 4db: 00 00 00 00 92 0c 55 49 44 53 49 5a 45 00 00 00 ......UIDSIZE... - 4eb: 00 00 00 00 00 00 00 00 00 00 b9 0c 42 55 54 54 ............BUTT - 4fb: 4f 4e 00 00 00 00 00 00 00 00 00 00 de 0c e8 0c ON.............. - 50b: e3 0c 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 ..SETTING....... - 51b: 00 00 00 00 f5 0c f0 0c 43 4c 45 41 52 00 00 00 ........CLEAR... - 52b: 00 00 00 00 00 00 00 00 fd 0c 00 00 00 00 48 45 ..............HE - 53b: 4c 50 00 00 00 00 00 00 00 00 00 00 00 00 00 0d LP.............. - 54b: 00 00 00 00 52 53 53 49 00 00 00 00 00 00 00 00 ....RSSI........ - 55b: 00 00 00 00 00 00 00 00 4d 0d 00 00 00 00 00 00 ........M....... - 56b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0000043b : + 43b: 56 45 52 53 49 4f 4e 00 00 00 00 00 00 00 00 00 VERSION......... + 44b: 00 00 00 00 84 0b 43 4f 4e 46 49 47 00 00 00 00 ......CONFIG.... + 45b: 00 00 00 00 00 00 de 0b d6 0b b1 0b 55 49 44 00 ............UID. + 46b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 0c ................ + 47b: e3 0b 52 45 41 44 4f 4e 4c 59 00 00 00 00 00 00 ..READONLY...... + 48b: 00 00 00 00 6c 0c 5d 0c 55 50 4c 4f 41 44 00 00 ....l.].UPLOAD.. + 49b: 00 00 00 00 00 00 00 00 82 0c 00 00 00 00 44 4f ..............DO + 4ab: 57 4e 4c 4f 41 44 00 00 00 00 00 00 00 00 87 0c WNLOAD.......... + 4bb: 00 00 00 00 52 45 53 45 54 00 00 00 00 00 00 00 ....RESET....... + 4cb: 00 00 00 00 8c 0c 00 00 00 00 55 50 47 52 41 44 ..........UPGRAD + 4db: 45 00 00 00 00 00 00 00 00 00 97 0c 00 00 00 00 E............... + 4eb: 4d 45 4d 53 49 5a 45 00 00 00 00 00 00 00 00 00 MEMSIZE......... + 4fb: 00 00 00 00 a2 0c 55 49 44 53 49 5a 45 00 00 00 ......UIDSIZE... + 50b: 00 00 00 00 00 00 00 00 00 00 c9 0c 42 55 54 54 ............BUTT + 51b: 4f 4e 00 00 00 00 00 00 00 00 00 00 ee 0c f8 0c ON.............. + 52b: f3 0c 53 45 54 54 49 4e 47 00 00 00 00 00 00 00 ..SETTING....... + 53b: 00 00 00 00 05 0d 00 0d 43 4c 45 41 52 00 00 00 ........CLEAR... + 54b: 00 00 00 00 00 00 00 00 0d 0d 00 00 00 00 48 45 ..............HE + 55b: 4c 50 00 00 00 00 00 00 00 00 00 00 00 00 10 0d LP.............. + 56b: 00 00 00 00 52 53 53 49 00 00 00 00 00 00 00 00 ....RSSI........ + 57b: 00 00 00 00 00 00 00 00 5d 0d 00 00 00 00 00 00 ........]....... + 58b: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -0000057b <__c.5994>: - 57b: 0d 0a 00 ... +0000059b <__c.5994>: + 59b: 0d 0a 00 ... -0000057e <__c.5996>: - 57e: 0d 0a 00 ... +0000059e <__c.5996>: + 59e: 0d 0a 00 ... -00000581 : - 581: 64 31 30 30 3a 4f 4b 00 00 00 00 00 00 00 00 00 d100:OK......... - 591: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 5a1: 00 65 31 30 31 3a 4f 4b 20 57 49 54 48 20 54 45 .e101:OK WITH TE - 5b1: 58 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XT.............. - 5c1: 00 00 6e 31 31 30 3a 57 41 49 54 49 4e 47 20 46 ..n110:WAITING F - 5d1: 4f 52 20 58 4d 4f 44 45 4d 00 00 00 00 00 00 00 OR XMODEM....... - 5e1: 00 00 00 c8 32 30 30 3a 55 4e 4b 4e 4f 57 4e 20 ....200:UNKNOWN - 5f1: 43 4f 4d 4d 41 4e 44 00 00 00 00 00 00 00 00 00 COMMAND......... - 601: 00 00 00 00 c9 32 30 31 3a 49 4e 56 41 4c 49 44 .....201:INVALID - 611: 20 43 4f 4d 4d 41 4e 44 20 55 53 41 47 45 00 00 COMMAND USAGE.. - 621: 00 00 00 00 00 ca 32 30 32 3a 49 4e 56 41 4c 49 ......202:INVALI - 631: 44 20 50 41 52 41 4d 45 54 45 52 00 00 00 00 00 D PARAMETER..... - 641: 00 00 00 00 00 00 00 ....... +000005a1 : + 5a1: 64 31 30 30 3a 4f 4b 00 00 00 00 00 00 00 00 00 d100:OK......... + 5b1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 5c1: 00 65 31 30 31 3a 4f 4b 20 57 49 54 48 20 54 45 .e101:OK WITH TE + 5d1: 58 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XT.............. + 5e1: 00 00 6e 31 31 30 3a 57 41 49 54 49 4e 47 20 46 ..n110:WAITING F + 5f1: 4f 52 20 58 4d 4f 44 45 4d 00 00 00 00 00 00 00 OR XMODEM....... + 601: 00 00 00 c8 32 30 30 3a 55 4e 4b 4e 4f 57 4e 20 ....200:UNKNOWN + 611: 43 4f 4d 4d 41 4e 44 00 00 00 00 00 00 00 00 00 COMMAND......... + 621: 00 00 00 00 c9 32 30 31 3a 49 4e 56 41 4c 49 44 .....201:INVALID + 631: 20 43 4f 4d 4d 41 4e 44 20 55 53 41 47 45 00 00 COMMAND USAGE.. + 641: 00 00 00 00 00 ca 32 30 32 3a 49 4e 56 41 4c 49 ......202:INVALI + 651: 44 20 50 41 52 41 4d 45 54 45 52 00 00 00 00 00 D PARAMETER..... + 661: 00 00 00 00 00 00 00 ....... -00000648 <__ctors_end>: - 648: 11 24 eor r1, r1 - 64a: 1f be out 0x3f, r1 ; 63 - 64c: cf ef ldi r28, 0xFF ; 255 - 64e: df e2 ldi r29, 0x2F ; 47 - 650: de bf out 0x3e, r29 ; 62 - 652: cd bf out 0x3d, r28 ; 61 +00000668 <__ctors_end>: + 668: 11 24 eor r1, r1 + 66a: 1f be out 0x3f, r1 ; 63 + 66c: cf ef ldi r28, 0xFF ; 255 + 66e: df e2 ldi r29, 0x2F ; 47 + 670: de bf out 0x3e, r29 ; 62 + 672: cd bf out 0x3d, r28 ; 61 -00000654 <__do_copy_data>: - 654: 10 e2 ldi r17, 0x20 ; 32 - 656: a0 e0 ldi r26, 0x00 ; 0 - 658: b0 e2 ldi r27, 0x20 ; 32 - 65a: ee e9 ldi r30, 0x9E ; 158 - 65c: f2 e5 ldi r31, 0x52 ; 82 - 65e: 02 c0 rjmp .+4 ; 0x664 <__do_copy_data+0x10> - 660: 05 90 lpm r0, Z+ - 662: 0d 92 st X+, r0 - 664: a2 3a cpi r26, 0xA2 ; 162 - 666: b1 07 cpc r27, r17 - 668: d9 f7 brne .-10 ; 0x660 <__do_copy_data+0xc> +00000674 <__do_copy_data>: + 674: 10 e2 ldi r17, 0x20 ; 32 + 676: a0 e0 ldi r26, 0x00 ; 0 + 678: b0 e2 ldi r27, 0x20 ; 32 + 67a: ee eb ldi r30, 0xBE ; 190 + 67c: f2 e5 ldi r31, 0x52 ; 82 + 67e: 02 c0 rjmp .+4 ; 0x684 <__do_copy_data+0x10> + 680: 05 90 lpm r0, Z+ + 682: 0d 92 st X+, r0 + 684: a2 3a cpi r26, 0xA2 ; 162 + 686: b1 07 cpc r27, r17 + 688: d9 f7 brne .-10 ; 0x680 <__do_copy_data+0xc> -0000066a <__do_clear_bss>: - 66a: 16 e2 ldi r17, 0x26 ; 38 - 66c: a2 ea ldi r26, 0xA2 ; 162 - 66e: b0 e2 ldi r27, 0x20 ; 32 - 670: 01 c0 rjmp .+2 ; 0x674 <.do_clear_bss_start> +0000068a <__do_clear_bss>: + 68a: 16 e2 ldi r17, 0x26 ; 38 + 68c: a2 ea ldi r26, 0xA2 ; 162 + 68e: b0 e2 ldi r27, 0x20 ; 32 + 690: 01 c0 rjmp .+2 ; 0x694 <.do_clear_bss_start> -00000672 <.do_clear_bss_loop>: - 672: 1d 92 st X+, r1 +00000692 <.do_clear_bss_loop>: + 692: 1d 92 st X+, r1 -00000674 <.do_clear_bss_start>: - 674: ad 3a cpi r26, 0xAD ; 173 - 676: b1 07 cpc r27, r17 - 678: e1 f7 brne .-8 ; 0x672 <.do_clear_bss_loop> - 67a: 03 d0 rcall .+6 ; 0x682
- 67c: 0c 94 4d 29 jmp 0x529a ; 0x529a <_exit> +00000694 <.do_clear_bss_start>: + 694: ad 3a cpi r26, 0xAD ; 173 + 696: b1 07 cpc r27, r17 + 698: e1 f7 brne .-8 ; 0x692 <.do_clear_bss_loop> + 69a: 03 d0 rcall .+6 ; 0x6a2
+ 69c: 0c 94 5d 29 jmp 0x52ba ; 0x52ba <_exit> -00000680 <__bad_interrupt>: - 680: 6f c0 rjmp .+222 ; 0x760 <__vector_default> +000006a0 <__bad_interrupt>: + 6a0: 6f c0 rjmp .+222 ; 0x780 <__vector_default> -00000682
: +000006a2
: #include "Chameleon-Mini.h" int main(void) { SystemInit(); - 682: 74 d0 rcall .+232 ; 0x76c - 684: f2 d6 rcall .+3556 ; 0x146a + 6a2: 74 d0 rcall .+232 ; 0x78c + 6a4: f2 d6 rcall .+3556 ; 0x148a SettingsLoad(); - 686: 80 e3 ldi r24, 0x30 ; 48 - 688: e0 e0 ldi r30, 0x00 ; 0 + 6a6: 80 e3 ldi r24, 0x30 ; 48 + 6a8: e0 e0 ldi r30, 0x00 ; 0 extern uint8_t LEDPulseMask; static inline void LEDInit(void) { LED_PORT.DIRSET = LED_MASK; - 68a: f6 e0 ldi r31, 0x06 ; 6 - 68c: 81 83 std Z+1, r24 ; 0x01 - 68e: 4e d2 rcall .+1180 ; 0xb2c - 690: 16 d1 rcall .+556 ; 0x8be + 6aa: f6 e0 ldi r31, 0x06 ; 6 + 6ac: 81 83 std Z+1, r24 ; 0x01 + 6ae: 4e d2 rcall .+1180 ; 0xb4c + 6b0: 16 d1 rcall .+556 ; 0x8de LEDInit(); MemoryInit(); - 692: b3 d7 rcall .+3942 ; 0x15fa - 694: 9c d1 rcall .+824 ; 0x9ce + 6b2: b3 d7 rcall .+3942 ; 0x161a + 6b4: 9c d1 rcall .+824 ; 0x9ee ConfigurationInit(); - 696: 73 d5 rcall .+2790 ; 0x117e - 698: e0 e0 ldi r30, 0x00 ; 0 + 6b6: 73 d5 rcall .+2790 ; 0x119e + 6b8: e0 e0 ldi r30, 0x00 ; 0 TerminalInit(); - 69a: f2 e0 ldi r31, 0x02 ; 2 - 69c: 81 e0 ldi r24, 0x01 ; 1 + 6ba: f2 e0 ldi r31, 0x02 ; 2 + 6bc: 81 e0 ldi r24, 0x01 ; 1 RandomInit(); - 69e: 80 93 00 02 sts 0x0200, r24 + 6be: 80 93 00 02 sts 0x0200, r24 ButtonInit(); - 6a2: 11 82 std Z+1, r1 ; 0x01 - 6a4: 92 e0 ldi r25, 0x02 ; 2 + 6c2: 11 82 std Z+1, r1 ; 0x01 + 6c4: 92 e0 ldi r25, 0x02 ; 2 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE) static inline void AntennaLevelInit(void) { ADCA.CTRLA = ADC_ENABLE_bm; - 6a6: 92 83 std Z+2, r25 ; 0x02 - 6a8: 93 e0 ldi r25, 0x03 ; 3 - 6aa: 94 83 std Z+4, r25 ; 0x04 - 6ac: 80 a3 lds r24, 0x50 - 6ae: 88 e3 ldi r24, 0x38 ; 56 + 6c6: 92 83 std Z+2, r25 ; 0x02 + 6c8: 93 e0 ldi r25, 0x03 ; 3 + 6ca: 94 83 std Z+4, r25 ; 0x04 + 6cc: 80 a3 lds r24, 0x50 + 6ce: 88 e3 ldi r24, 0x38 ; 56 ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; - 6b0: 81 a3 lds r24, 0x51 + 6d0: 81 a3 lds r24, 0x51 ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; - 6b2: cc d0 rcall .+408 ; 0x84c - 6b4: c0 e0 ldi r28, 0x00 ; 0 + 6d2: cc d0 rcall .+408 ; 0x86c + 6d4: c0 e0 ldi r28, 0x00 ; 0 ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; - 6b6: da e0 ldi r29, 0x0A ; 10 - 6b8: ff 24 eor r15, r15 + 6d6: da e0 ldi r29, 0x0A ; 10 + 6d8: ff 24 eor r15, r15 ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; - 6ba: f3 94 inc r15 + 6da: f3 94 inc r15 ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc; - 6bc: 00 e0 ldi r16, 0x00 ; 0 - 6be: 16 e0 ldi r17, 0x06 ; 6 + 6dc: 00 e0 ldi r16, 0x00 ; 0 + 6de: 16 e0 ldi r17, 0x06 ; 6 AntennaLevelInit(); SystemInterruptInit(); - 6c0: a1 d7 rcall .+3906 ; 0x1604 - 6c2: e0 91 fb 20 lds r30, 0x20FB + 6e0: a1 d7 rcall .+3906 ; 0x1624 + 6e2: e0 91 fb 20 lds r30, 0x20FB return RTC.CNT; } INLINE bool SystemTick100ms(void) { if (TCE0.INTFLAGS & TC0_OVFIF_bm) { - 6c6: f0 91 fc 20 lds r31, 0x20FC + 6e6: f0 91 fc 20 lds r31, 0x20FC TCE0.INTFLAGS = TC0_OVFIF_bm; - 6ca: 09 95 icall + 6ea: 09 95 icall LED_PORT.OUTSET = Mask; } static inline void LEDTick(void) { LED_PORT.OUTCLR = LEDPulseMask; - 6cc: e0 91 01 21 lds r30, 0x2101 + 6ec: e0 91 01 21 lds r30, 0x2101 while(1) { TerminalTask(); - 6d0: f0 91 02 21 lds r31, 0x2102 + 6f0: f0 91 02 21 lds r31, 0x2102 INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); } INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); - 6d4: 09 95 icall - 6d6: 80 91 0c 0a lds r24, 0x0A0C - 6da: 80 ff sbrs r24, 0 - 6dc: f1 cf rjmp .-30 ; 0x6c0 + 6f4: 09 95 icall + 6f6: 80 91 0c 0a lds r24, 0x0A0C + 6fa: 80 ff sbrs r24, 0 + 6fc: f1 cf rjmp .-30 ; 0x6e0 INLINE void ApplicationInit(void) { ActiveConfiguration.ApplicationInitFunc(); } INLINE void ApplicationTask(void) { ActiveConfiguration.ApplicationTaskFunc(); - 6de: fc 86 std Y+12, r15 ; 0x0c - 6e0: 91 d1 rcall .+802 ; 0xa04 - 6e2: b1 d7 rcall .+3938 ; 0x1646 - 6e4: 53 d5 rcall .+2726 ; 0x118c - 6e6: 80 91 a3 20 lds r24, 0x20A3 + 6fe: fc 86 std Y+12, r15 ; 0x0c + 700: 91 d1 rcall .+802 ; 0xa24 + 702: b1 d7 rcall .+3938 ; 0x1666 + 704: 53 d5 rcall .+2726 ; 0x11ac + 706: 80 91 a3 20 lds r24, 0x20A3 return RTC.CNT; } INLINE bool SystemTick100ms(void) { if (TCE0.INTFLAGS & TC0_OVFIF_bm) { - 6ea: f8 01 movw r30, r16 - 6ec: 86 83 std Z+6, r24 ; 0x06 - 6ee: 10 92 a3 20 sts 0x20A3, r1 + 70a: f8 01 movw r30, r16 + 70c: 86 83 std Z+6, r24 ; 0x06 + 70e: 10 92 a3 20 sts 0x20A3, r1 CodecTask(); ApplicationTask(); if (SystemTick100ms()) { RandomTick(); - 6f2: e6 cf rjmp .-52 ; 0x6c0 + 712: e6 cf rjmp .-52 ; 0x6e0 -000006f4 : +00000714 : const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) - 6f4: 92 30 cpi r25, 0x02 ; 2 - 6f6: f9 f0 breq .+62 ; 0x736 - 6f8: 93 30 cpi r25, 0x03 ; 3 - 6fa: a1 f0 breq .+40 ; 0x724 - 6fc: 91 30 cpi r25, 0x01 ; 1 - 6fe: 49 f0 breq .+18 ; 0x712 + 714: 92 30 cpi r25, 0x02 ; 2 + 716: f9 f0 breq .+62 ; 0x756 + 718: 93 30 cpi r25, 0x03 ; 3 + 71a: a1 f0 breq .+40 ; 0x744 + 71c: 91 30 cpi r25, 0x01 ; 1 + 71e: 49 f0 breq .+18 ; 0x732 { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - 700: 80 e0 ldi r24, 0x00 ; 0 - 702: 90 e0 ldi r25, 0x00 ; 0 + 720: 80 e0 ldi r24, 0x00 ; 0 + 722: 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; - 704: e0 e0 ldi r30, 0x00 ; 0 - 706: f0 e0 ldi r31, 0x00 ; 0 + 724: e0 e0 ldi r30, 0x00 ; 0 + 726: f0 e0 ldi r31, 0x00 ; 0 } break; } *DescriptorAddress = Address; - 708: da 01 movw r26, r20 - 70a: ed 93 st X+, r30 - 70c: fc 93 st X, r31 - 70e: 11 97 sbiw r26, 0x01 ; 1 + 728: da 01 movw r26, r20 + 72a: ed 93 st X+, r30 + 72c: fc 93 st X, r31 + 72e: 11 97 sbiw r26, 0x01 ; 1 return Size; } - 710: 08 95 ret + 730: 08 95 ret switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); - 712: 82 e1 ldi r24, 0x12 ; 18 - 714: 90 e0 ldi r25, 0x00 ; 0 + 732: 82 e1 ldi r24, 0x12 ; 18 + 734: 90 e0 ldi r25, 0x00 ; 0 uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; - 716: e6 e7 ldi r30, 0x76 ; 118 - 718: f2 e0 ldi r31, 0x02 ; 2 + 736: e6 e7 ldi r30, 0x76 ; 118 + 738: f2 e0 ldi r31, 0x02 ; 2 } break; } *DescriptorAddress = Address; - 71a: da 01 movw r26, r20 - 71c: ed 93 st X+, r30 - 71e: fc 93 st X, r31 - 720: 11 97 sbiw r26, 0x01 ; 1 + 73a: da 01 movw r26, r20 + 73c: ed 93 st X+, r30 + 73e: fc 93 st X, r31 + 740: 11 97 sbiw r26, 0x01 ; 1 return Size; } - 722: 08 95 ret + 742: 08 95 ret case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: switch (DescriptorNumber) - 724: 81 30 cpi r24, 0x01 ; 1 - 726: 81 f0 breq .+32 ; 0x748 - 728: 81 30 cpi r24, 0x01 ; 1 - 72a: 98 f4 brcc .+38 ; 0x752 + 744: 81 30 cpi r24, 0x01 ; 1 + 746: 81 f0 breq .+32 ; 0x768 + 748: 81 30 cpi r24, 0x01 ; 1 + 74a: 98 f4 brcc .+38 ; 0x772 { case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); - 72c: e4 e3 ldi r30, 0x34 ; 52 - 72e: f2 e0 ldi r31, 0x02 ; 2 - 730: 84 91 lpm r24, Z - 732: 90 e0 ldi r25, 0x00 ; 0 + 74c: e4 e3 ldi r30, 0x34 ; 52 + 74e: f2 e0 ldi r31, 0x02 ; 2 + 750: 84 91 lpm r24, Z + 752: 90 e0 ldi r25, 0x00 ; 0 break; - 734: e9 cf rjmp .-46 ; 0x708 + 754: e9 cf rjmp .-46 ; 0x728 Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); - 736: 8e e3 ldi r24, 0x3E ; 62 - 738: 90 e0 ldi r25, 0x00 ; 0 + 756: 8e e3 ldi r24, 0x3E ; 62 + 758: 90 e0 ldi r25, 0x00 ; 0 case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; - 73a: e8 e3 ldi r30, 0x38 ; 56 - 73c: f2 e0 ldi r31, 0x02 ; 2 + 75a: e8 e3 ldi r30, 0x38 ; 56 + 75c: f2 e0 ldi r31, 0x02 ; 2 } break; } *DescriptorAddress = Address; - 73e: da 01 movw r26, r20 - 740: ed 93 st X+, r30 - 742: fc 93 st X, r31 - 744: 11 97 sbiw r26, 0x01 ; 1 + 75e: da 01 movw r26, r20 + 760: ed 93 st X+, r30 + 762: fc 93 st X, r31 + 764: 11 97 sbiw r26, 0x01 ; 1 return Size; } - 746: 08 95 ret + 766: 08 95 ret Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); break; case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); - 748: ea e1 ldi r30, 0x1A ; 26 - 74a: f2 e0 ldi r31, 0x02 ; 2 - 74c: 84 91 lpm r24, Z - 74e: 90 e0 ldi r25, 0x00 ; 0 + 768: ea e1 ldi r30, 0x1A ; 26 + 76a: f2 e0 ldi r31, 0x02 ; 2 + 76c: 84 91 lpm r24, Z + 76e: 90 e0 ldi r25, 0x00 ; 0 break; - 750: db cf rjmp .-74 ; 0x708 + 770: db cf rjmp .-74 ; 0x728 case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: switch (DescriptorNumber) - 752: 82 30 cpi r24, 0x02 ; 2 - 754: a9 f6 brne .-86 ; 0x700 + 772: 82 30 cpi r24, 0x02 ; 2 + 774: a9 f6 brne .-86 ; 0x720 Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); break; case 0x02: Address = &ProductString; Size = pgm_read_byte(&ProductString.Header.Size); - 756: ec ef ldi r30, 0xFC ; 252 - 758: f1 e0 ldi r31, 0x01 ; 1 - 75a: 84 91 lpm r24, Z - 75c: 90 e0 ldi r25, 0x00 ; 0 + 776: ec ef ldi r30, 0xFC ; 252 + 778: f1 e0 ldi r31, 0x01 ; 1 + 77a: 84 91 lpm r24, Z + 77c: 90 e0 ldi r25, 0x00 ; 0 break; - 75e: d4 cf rjmp .-88 ; 0x708 + 77e: d4 cf rjmp .-88 ; 0x728 -00000760 <__vector_default>: +00000780 <__vector_default>: #include "System.h" #include "LED.h" ISR(BADISR_vect) { - 760: 1f 92 push r1 - 762: 0f 92 push r0 - 764: 0f b6 in r0, 0x3f ; 63 - 766: 0f 92 push r0 - 768: 11 24 eor r1, r1 - 76a: ff cf rjmp .-2 ; 0x76a <__vector_default+0xa> + 780: 1f 92 push r1 + 782: 0f 92 push r0 + 784: 0f b6 in r0, 0x3f ; 63 + 786: 0f 92 push r0 + 788: 11 24 eor r1, r1 + 78a: ff cf rjmp .-2 ; 0x78a <__vector_default+0xa> -0000076c : +0000078c : while(1); } void SystemInit(void) { if (RST.STATUS & RST_WDRF_bm) { - 76c: 80 91 78 00 lds r24, 0x0078 - 770: 83 ff sbrs r24, 3 - 772: 0a c0 rjmp .+20 ; 0x788 + 78c: 80 91 78 00 lds r24, 0x0078 + 790: 83 ff sbrs r24, 3 + 792: 0a c0 rjmp .+20 ; 0x7a8 /* On Watchdog reset clear WDRF bit, disable watchdog * and jump into bootloader */ RST.STATUS = RST_WDRF_bm; - 774: 88 e0 ldi r24, 0x08 ; 8 - 776: 80 93 78 00 sts 0x0078, r24 + 794: 88 e0 ldi r24, 0x08 ; 8 + 796: 80 93 78 00 sts 0x0078, r24 CCP = CCP_IOREG_gc; - 77a: 88 ed ldi r24, 0xD8 ; 216 - 77c: 84 bf out 0x34, r24 ; 52 + 79a: 88 ed ldi r24, 0xD8 ; 216 + 79c: 84 bf out 0x34, r24 ; 52 WDT.CTRL = WDT_CEN_bm; - 77e: 81 e0 ldi r24, 0x01 ; 1 - 780: 80 93 80 00 sts 0x0080, r24 + 79e: 81 e0 ldi r24, 0x01 ; 1 + 7a0: 80 93 80 00 sts 0x0080, r24 asm volatile ("jmp %0"::"i" (BOOT_SECTION_START + 0x1FC)); - 784: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f2ebc> + 7a4: fd 95 fe c0 jmp 0x7f81fc ; 0x7f81fc <__data_load_end+0x7f2e9c> } /* 32MHz system clock using internal RC and 32K DFLL*/ OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm; - 788: 80 91 50 00 lds r24, 0x0050 - 78c: 86 60 ori r24, 0x06 ; 6 - 78e: 80 93 50 00 sts 0x0050, r24 + 7a8: 80 91 50 00 lds r24, 0x0050 + 7ac: 86 60 ori r24, 0x06 ; 6 + 7ae: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_RC32MRDY_bm)) - 792: 80 91 51 00 lds r24, 0x0051 - 796: 81 ff sbrs r24, 1 - 798: fc cf rjmp .-8 ; 0x792 + 7b2: 80 91 51 00 lds r24, 0x0051 + 7b6: 81 ff sbrs r24, 1 + 7b8: fc cf rjmp .-8 ; 0x7b2 ; while(!(OSC.STATUS & OSC_RC32KRDY_bm)) - 79a: 80 91 51 00 lds r24, 0x0051 - 79e: 82 ff sbrs r24, 2 - 7a0: fc cf rjmp .-8 ; 0x79a + 7ba: 80 91 51 00 lds r24, 0x0051 + 7be: 82 ff sbrs r24, 2 + 7c0: fc cf rjmp .-8 ; 0x7ba ; OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; - 7a2: e0 e5 ldi r30, 0x50 ; 80 - 7a4: f0 e0 ldi r31, 0x00 ; 0 - 7a6: 16 82 std Z+6, r1 ; 0x06 + 7c2: e0 e5 ldi r30, 0x50 ; 80 + 7c4: f0 e0 ldi r31, 0x00 ; 0 + 7c6: 16 82 std Z+6, r1 ; 0x06 DFLLRC32M.CTRL = DFLL_ENABLE_bm; - 7a8: 21 e0 ldi r18, 0x01 ; 1 - 7aa: 20 93 60 00 sts 0x0060, r18 + 7c8: 21 e0 ldi r18, 0x01 ; 1 + 7ca: 20 93 60 00 sts 0x0060, r18 CCP = CCP_IOREG_gc; - 7ae: 88 ed ldi r24, 0xD8 ; 216 - 7b0: 84 bf out 0x34, r24 ; 52 + 7ce: 88 ed ldi r24, 0xD8 ; 216 + 7d0: 84 bf out 0x34, r24 ; 52 CLK.CTRL = CLK_SCLKSEL_RC32M_gc; - 7b2: 20 93 40 00 sts 0x0040, r18 + 7d2: 20 93 40 00 sts 0x0040, r18 /* Use TCE0 as system tick */ TCE0.PER = F_CPU / 256 / SYSTEM_TICK_FREQ - 1; - 7b6: 83 ed ldi r24, 0xD3 ; 211 - 7b8: 90 e3 ldi r25, 0x30 ; 48 - 7ba: e0 e0 ldi r30, 0x00 ; 0 - 7bc: fa e0 ldi r31, 0x0A ; 10 - 7be: 86 a3 lds r24, 0x56 - 7c0: 97 a3 lds r25, 0x57 + 7d6: 83 ed ldi r24, 0xD3 ; 211 + 7d8: 90 e3 ldi r25, 0x30 ; 48 + 7da: e0 e0 ldi r30, 0x00 ; 0 + 7dc: fa e0 ldi r31, 0x0A ; 10 + 7de: 86 a3 lds r24, 0x56 + 7e0: 97 a3 lds r25, 0x57 TCE0.CTRLA = TC_CLKSEL_DIV256_gc; - 7c2: 86 e0 ldi r24, 0x06 ; 6 - 7c4: 80 93 00 0a sts 0x0A00, r24 + 7e2: 86 e0 ldi r24, 0x06 ; 6 + 7e4: 80 93 00 0a sts 0x0A00, r24 /* Enable RTC with roughly 1kHz clock */ CLK.RTCCTRL = CLK_RTCSRC_ULP_gc | CLK_RTCEN_bm; - 7c8: e0 e4 ldi r30, 0x40 ; 64 - 7ca: f0 e0 ldi r31, 0x00 ; 0 - 7cc: 23 83 std Z+3, r18 ; 0x03 + 7e8: e0 e4 ldi r30, 0x40 ; 64 + 7ea: f0 e0 ldi r31, 0x00 ; 0 + 7ec: 23 83 std Z+3, r18 ; 0x03 RTC.CTRL = RTC_PRESCALER_DIV1_gc; - 7ce: 20 93 00 04 sts 0x0400, r18 + 7ee: 20 93 00 04 sts 0x0400, r18 /* Enable EEPROM data memory mapping */ NVM.CTRLB |= NVM_EEMAPEN_bm; - 7d2: 80 91 cc 01 lds r24, 0x01CC - 7d6: 88 60 ori r24, 0x08 ; 8 - 7d8: e0 ec ldi r30, 0xC0 ; 192 - 7da: f1 e0 ldi r31, 0x01 ; 1 - 7dc: 84 87 std Z+12, r24 ; 0x0c + 7f2: 80 91 cc 01 lds r24, 0x01CC + 7f6: 88 60 ori r24, 0x08 ; 8 + 7f8: e0 ec ldi r30, 0xC0 ; 192 + 7fa: f1 e0 ldi r31, 0x01 ; 1 + 7fc: 84 87 std Z+12, r24 ; 0x0c } - 7de: 08 95 ret + 7fe: 08 95 ret -000007e0 : +00000800 : void SystemReset(void) { CCP = CCP_IOREG_gc; - 7e0: 88 ed ldi r24, 0xD8 ; 216 - 7e2: 84 bf out 0x34, r24 ; 52 + 800: 88 ed ldi r24, 0xD8 ; 216 + 802: 84 bf out 0x34, r24 ; 52 RST.CTRL = RST_SWRST_bm; - 7e4: 81 e0 ldi r24, 0x01 ; 1 - 7e6: e8 e7 ldi r30, 0x78 ; 120 - 7e8: f0 e0 ldi r31, 0x00 ; 0 - 7ea: 81 83 std Z+1, r24 ; 0x01 + 804: 81 e0 ldi r24, 0x01 ; 1 + 806: e8 e7 ldi r30, 0x78 ; 120 + 808: f0 e0 ldi r31, 0x00 ; 0 + 80a: 81 83 std Z+1, r24 ; 0x01 } - 7ec: 08 95 ret + 80c: 08 95 ret -000007ee : +0000080e : void SystemEnterBootloader(void) { /* Use Watchdog timer to reset into bootloader. */ CCP = CCP_IOREG_gc; - 7ee: 88 ed ldi r24, 0xD8 ; 216 - 7f0: 84 bf out 0x34, r24 ; 52 + 80e: 88 ed ldi r24, 0xD8 ; 216 + 810: 84 bf out 0x34, r24 ; 52 WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; - 7f2: 8b e1 ldi r24, 0x1B ; 27 - 7f4: 80 93 80 00 sts 0x0080, r24 + 812: 8b e1 ldi r24, 0x1B ; 27 + 814: 80 93 80 00 sts 0x0080, r24 } - 7f8: 08 95 ret + 818: 08 95 ret -000007fa : +0000081a : void SystemStartUSBClock(void) { /* 48MHz USB Clock using 12MHz XTAL */ OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; - 7fa: 8b ec ldi r24, 0xCB ; 203 - 7fc: e0 e5 ldi r30, 0x50 ; 80 - 7fe: f0 e0 ldi r31, 0x00 ; 0 - 800: 82 83 std Z+2, r24 ; 0x02 + 81a: 8b ec ldi r24, 0xCB ; 203 + 81c: e0 e5 ldi r30, 0x50 ; 80 + 81e: f0 e0 ldi r31, 0x00 ; 0 + 820: 82 83 std Z+2, r24 ; 0x02 OSC.CTRL |= OSC_XOSCEN_bm; - 802: 80 91 50 00 lds r24, 0x0050 - 806: 88 60 ori r24, 0x08 ; 8 - 808: 80 93 50 00 sts 0x0050, r24 + 822: 80 91 50 00 lds r24, 0x0050 + 826: 88 60 ori r24, 0x08 ; 8 + 828: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_XOSCRDY_bm)) - 80c: 80 91 51 00 lds r24, 0x0051 - 810: 83 ff sbrs r24, 3 - 812: fc cf rjmp .-8 ; 0x80c + 82c: 80 91 51 00 lds r24, 0x0051 + 830: 83 ff sbrs r24, 3 + 832: fc cf rjmp .-8 ; 0x82c ; OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (4 << OSC_PLLFAC_gp); - 814: 84 ec ldi r24, 0xC4 ; 196 - 816: e0 e5 ldi r30, 0x50 ; 80 - 818: f0 e0 ldi r31, 0x00 ; 0 - 81a: 85 83 std Z+5, r24 ; 0x05 + 834: 84 ec ldi r24, 0xC4 ; 196 + 836: e0 e5 ldi r30, 0x50 ; 80 + 838: f0 e0 ldi r31, 0x00 ; 0 + 83a: 85 83 std Z+5, r24 ; 0x05 OSC.CTRL |= OSC_PLLEN_bm; - 81c: 80 91 50 00 lds r24, 0x0050 - 820: 80 61 ori r24, 0x10 ; 16 - 822: 80 93 50 00 sts 0x0050, r24 + 83c: 80 91 50 00 lds r24, 0x0050 + 840: 80 61 ori r24, 0x10 ; 16 + 842: 80 93 50 00 sts 0x0050, r24 while(!(OSC.STATUS & OSC_PLLRDY_bm)) - 826: 80 91 51 00 lds r24, 0x0051 - 82a: 84 ff sbrs r24, 4 - 82c: fc cf rjmp .-8 ; 0x826 + 846: 80 91 51 00 lds r24, 0x0051 + 84a: 84 ff sbrs r24, 4 + 84c: fc cf rjmp .-8 ; 0x846 ; } - 82e: 08 95 ret + 84e: 08 95 ret -00000830 : +00000850 : void SystemStopUSBClock(void) { /* Disable USB Clock to minimize power consumption */ CLK.USBCTRL &= ~CLK_USBSEN_bm; - 830: e0 e4 ldi r30, 0x40 ; 64 - 832: f0 e0 ldi r31, 0x00 ; 0 - 834: 84 81 ldd r24, Z+4 ; 0x04 - 836: 8e 7f andi r24, 0xFE ; 254 - 838: 84 83 std Z+4, r24 ; 0x04 + 850: e0 e4 ldi r30, 0x40 ; 64 + 852: f0 e0 ldi r31, 0x00 ; 0 + 854: 84 81 ldd r24, Z+4 ; 0x04 + 856: 8e 7f andi r24, 0xFE ; 254 + 858: 84 83 std Z+4, r24 ; 0x04 OSC.CTRL &= ~OSC_PLLEN_bm; - 83a: e0 e5 ldi r30, 0x50 ; 80 - 83c: f0 e0 ldi r31, 0x00 ; 0 - 83e: 80 81 ld r24, Z - 840: 8f 7e andi r24, 0xEF ; 239 - 842: 80 83 st Z, r24 + 85a: e0 e5 ldi r30, 0x50 ; 80 + 85c: f0 e0 ldi r31, 0x00 ; 0 + 85e: 80 81 ld r24, Z + 860: 8f 7e andi r24, 0xEF ; 239 + 862: 80 83 st Z, r24 OSC.CTRL &= ~OSC_XOSCEN_bm; - 844: 80 81 ld r24, Z - 846: 87 7f andi r24, 0xF7 ; 247 - 848: 80 83 st Z, r24 + 864: 80 81 ld r24, Z + 866: 87 7f andi r24, 0xF7 ; 247 + 868: 80 83 st Z, r24 } - 84a: 08 95 ret + 86a: 08 95 ret -0000084c : +0000086c : void SystemInterruptInit(void) { /* Enable all interrupt levels */ PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; - 84c: 87 e0 ldi r24, 0x07 ; 7 - 84e: e0 ea ldi r30, 0xA0 ; 160 - 850: f0 e0 ldi r31, 0x00 ; 0 - 852: 82 83 std Z+2, r24 ; 0x02 + 86c: 87 e0 ldi r24, 0x07 ; 7 + 86e: e0 ea ldi r30, 0xA0 ; 160 + 870: f0 e0 ldi r31, 0x00 ; 0 + 872: 82 83 std Z+2, r24 ; 0x02 sei(); - 854: 78 94 sei + 874: 78 94 sei } - 856: 08 95 ret + 876: 08 95 ret -00000858 : +00000878 : /* Include all Codecs and Applications */ #include "Codec/Codec.h" #include "Application/Application.h" static void CodecInitDummy(void) { } - 858: 08 95 ret + 878: 08 95 ret -0000085a : +0000087a : static void CodecTaskDummy(void) { } - 85a: 08 95 ret + 87a: 08 95 ret -0000085c : +0000087c : static void ApplicationInitDummy(void) {} - 85c: 08 95 ret + 87c: 08 95 ret -0000085e : +0000087e : static void ApplicationResetDummy(void) {} - 85e: 08 95 ret + 87e: 08 95 ret -00000860 : +00000880 : static void ApplicationTaskDummy(void) {} - 860: 08 95 ret + 880: 08 95 ret -00000862 : +00000882 : static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } - 862: 80 e0 ldi r24, 0x00 ; 0 - 864: 90 e0 ldi r25, 0x00 ; 0 - 866: 08 95 ret + 882: 80 e0 ldi r24, 0x00 ; 0 + 884: 90 e0 ldi r25, 0x00 ; 0 + 886: 08 95 ret -00000868 : +00000888 : static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } - 868: 08 95 ret + 888: 08 95 ret -0000086a : +0000088a : static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } - 86a: 08 95 ret + 88a: 08 95 ret -0000086c : +0000088c : ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); } void ConfigurationSetById( ConfigurationEnum Configuration ) { GlobalSettings.ActiveSettingPtr->Configuration = Configuration; - 86c: e0 91 0e 21 lds r30, 0x210E - 870: f0 91 0f 21 lds r31, 0x210F - 874: 81 83 std Z+1, r24 ; 0x01 + 88c: e0 91 0e 21 lds r30, 0x210E + 890: f0 91 0f 21 lds r31, 0x210F + 894: 81 83 std Z+1, r24 ; 0x01 /* Copy struct from PROGMEM to RAM */ memcpy_P(&ActiveConfiguration, - 876: 90 e0 ldi r25, 0x00 ; 0 - 878: 9c 01 movw r18, r24 - 87a: 22 0f add r18, r18 - 87c: 33 1f adc r19, r19 - 87e: 22 0f add r18, r18 - 880: 33 1f adc r19, r19 - 882: b9 01 movw r22, r18 - 884: 66 0f add r22, r22 - 886: 77 1f adc r23, r23 - 888: 66 0f add r22, r22 - 88a: 77 1f adc r23, r23 - 88c: 66 0f add r22, r22 - 88e: 77 1f adc r23, r23 - 890: 62 0f add r22, r18 - 892: 73 1f adc r23, r19 - 894: 68 0f add r22, r24 - 896: 79 1f adc r23, r25 - 898: 68 57 subi r22, 0x78 ; 120 - 89a: 7d 4f sbci r23, 0xFD ; 253 - 89c: 88 ee ldi r24, 0xE8 ; 232 - 89e: 90 e2 ldi r25, 0x20 ; 32 - 8a0: 45 e2 ldi r20, 0x25 ; 37 - 8a2: 50 e0 ldi r21, 0x00 ; 0 - 8a4: 0e 94 e2 25 call 0x4bc4 ; 0x4bc4 + 896: 90 e0 ldi r25, 0x00 ; 0 + 898: 9c 01 movw r18, r24 + 89a: 22 0f add r18, r18 + 89c: 33 1f adc r19, r19 + 89e: 22 0f add r18, r18 + 8a0: 33 1f adc r19, r19 + 8a2: b9 01 movw r22, r18 + 8a4: 66 0f add r22, r22 + 8a6: 77 1f adc r23, r23 + 8a8: 66 0f add r22, r22 + 8aa: 77 1f adc r23, r23 + 8ac: 66 0f add r22, r22 + 8ae: 77 1f adc r23, r23 + 8b0: 62 0f add r22, r18 + 8b2: 73 1f adc r23, r19 + 8b4: 68 0f add r22, r24 + 8b6: 79 1f adc r23, r25 + 8b8: 68 57 subi r22, 0x78 ; 120 + 8ba: 7d 4f sbci r23, 0xFD ; 253 + 8bc: 88 ee ldi r24, 0xE8 ; 232 + 8be: 90 e2 ldi r25, 0x20 ; 32 + 8c0: 45 e2 ldi r20, 0x25 ; 37 + 8c2: 50 e0 ldi r21, 0x00 ; 0 + 8c4: 0e 94 f2 25 call 0x4be4 ; 0x4be4 /* Applications */ #include "MifareClassic.h" /* Function wrappers */ INLINE void ApplicationInit(void) { ActiveConfiguration.ApplicationInitFunc(); - 8a8: e0 91 fd 20 lds r30, 0x20FD - 8ac: f0 91 fe 20 lds r31, 0x20FE - 8b0: 09 95 icall + 8c8: e0 91 fd 20 lds r30, 0x20FD + 8cc: f0 91 fe 20 lds r31, 0x20FE + 8d0: 09 95 icall #define CODEC_CARRIER_FREQ 13560000 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); - 8b2: e0 91 f9 20 lds r30, 0x20F9 - 8b6: f0 91 fa 20 lds r31, 0x20FA - 8ba: 09 95 icall + 8d2: e0 91 f9 20 lds r30, 0x20F9 + 8d6: f0 91 fa 20 lds r31, 0x20FA + 8da: 09 95 icall &ConfigurationTable[Configuration], sizeof(ConfigurationType)); ApplicationInit(); CodecInit(); } - 8bc: 08 95 ret + 8dc: 08 95 ret -000008be : +000008de : ConfigurationType ActiveConfiguration; void ConfigurationInit(void) { ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); - 8be: e0 91 0e 21 lds r30, 0x210E - 8c2: f0 91 0f 21 lds r31, 0x210F - 8c6: 81 81 ldd r24, Z+1 ; 0x01 - 8c8: d1 cf rjmp .-94 ; 0x86c + 8de: e0 91 0e 21 lds r30, 0x210E + 8e2: f0 91 0f 21 lds r31, 0x210F + 8e6: 81 81 ldd r24, Z+1 ; 0x01 + 8e8: d1 cf rjmp .-94 ; 0x88c -000008ca : - 8ca: 0f 93 push r16 +000008ea : + 8ea: 0f 93 push r16 } - 8cc: 1f 93 push r17 + 8ec: 1f 93 push r17 ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) { - 8ce: cf 93 push r28 - 8d0: df 93 push r29 - 8d2: ac 01 movw r20, r24 - 8d4: 20 e0 ldi r18, 0x00 ; 0 - 8d6: 30 e0 ldi r19, 0x00 ; 0 + 8ee: cf 93 push r28 + 8f0: df 93 push r29 + 8f2: ac 01 movw r20, r24 + 8f4: 20 e0 ldi r18, 0x00 ; 0 + 8f6: 30 e0 ldi r19, 0x00 ; 0 ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) - 8d8: 8c 01 movw r16, r24 - 8da: 0f 5f subi r16, 0xFF ; 255 - 8dc: 1f 4f sbci r17, 0xFF ; 255 + 8f8: 8c 01 movw r16, r24 + 8fa: 0f 5f subi r16, 0xFF ; 255 + 8fc: 1f 4f sbci r17, 0xFF ; 255 ConfigurationSetById(i); return true; } } return false; - 8de: 62 2f mov r22, r18 + 8fe: 62 2f mov r22, 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; - 8e0: c9 01 movw r24, r18 - 8e2: 88 0f add r24, r24 - 8e4: 99 1f adc r25, r25 - 8e6: 88 0f add r24, r24 - 8e8: 99 1f adc r25, r25 - 8ea: fc 01 movw r30, r24 - 8ec: ee 0f add r30, r30 - 8ee: ff 1f adc r31, r31 - 8f0: ee 0f add r30, r30 - 8f2: ff 1f adc r31, r31 - 8f4: ee 0f add r30, r30 - 8f6: ff 1f adc r31, r31 - 8f8: e8 0f add r30, r24 - 8fa: f9 1f adc r31, r25 - 8fc: e2 0f add r30, r18 - 8fe: f3 1f adc r31, r19 - 900: e7 57 subi r30, 0x77 ; 119 - 902: fd 4f sbci r31, 0xFD ; 253 + 900: c9 01 movw r24, r18 + 902: 88 0f add r24, r24 + 904: 99 1f adc r25, r25 + 906: 88 0f add r24, r24 + 908: 99 1f adc r25, r25 + 90a: fc 01 movw r30, r24 + 90c: ee 0f add r30, r30 + 90e: ff 1f adc r31, r31 + 910: ee 0f add r30, r30 + 912: ff 1f adc r31, r31 + 914: ee 0f add r30, r30 + 916: ff 1f adc r31, r31 + 918: e8 0f add r30, r24 + 91a: f9 1f adc r31, r25 + 91c: e2 0f add r30, r18 + 91e: f3 1f adc r31, r19 + 920: e7 57 subi r30, 0x77 ; 119 + 922: fd 4f sbci r31, 0xFD ; 253 const char* pRequestedConfigName = ConfigurationName; bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); - 904: 84 91 lpm r24, Z + 924: 84 91 lpm r24, Z /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - 906: da 01 movw r26, r20 + 926: da 01 movw r26, r20 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') ) { - 908: 88 23 and r24, r24 - 90a: 59 f0 breq .+22 ; 0x922 + 928: 88 23 and r24, r24 + 92a: 59 f0 breq .+22 ; 0x942 if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - 90c: 9c 91 ld r25, X - 90e: 99 23 and r25, r25 - 910: 59 f0 breq .+22 ; 0x928 + 92c: 9c 91 ld r25, X + 92e: 99 23 and r25, r25 + 930: 59 f0 breq .+22 ; 0x948 /* One String ended before the other did -> unequal length */ StringMismatch = true; break; } if (c != *pRequestedConfigName) { - 912: 98 17 cp r25, r24 - 914: 49 f4 brne .+18 ; 0x928 + 932: 98 17 cp r25, r24 + 934: 49 f4 brne .+18 ; 0x948 ApplicationInit(); CodecInit(); } bool ConfigurationSetByName(const char* ConfigurationName) - 916: e8 01 movw r28, r16 + 936: e8 01 movw r28, r16 StringMismatch = true; break; } /* Proceed to next character */ pTableConfigName++; - 918: 31 96 adiw r30, 0x01 ; 1 + 938: 31 96 adiw r30, 0x01 ; 1 pRequestedConfigName++; - 91a: 11 96 adiw r26, 0x01 ; 1 + 93a: 11 96 adiw r26, 0x01 ; 1 c = pgm_read_byte(pTableConfigName); - 91c: 84 91 lpm r24, Z + 93c: 84 91 lpm r24, 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') ) { - 91e: 88 23 and r24, r24 - 920: 71 f4 brne .+28 ; 0x93e - 922: 8c 91 ld r24, X - 924: 88 23 and r24, r24 - 926: 89 f0 breq .+34 ; 0x94a - 928: 2f 5f subi r18, 0xFF ; 255 - 92a: 3f 4f sbci r19, 0xFF ; 255 + 93e: 88 23 and r24, r24 + 940: 71 f4 brne .+28 ; 0x95e + 942: 8c 91 ld r24, X + 944: 88 23 and r24, r24 + 946: 89 f0 breq .+34 ; 0x96a + 948: 2f 5f subi r18, 0xFF ; 255 + 94a: 3f 4f sbci r19, 0xFF ; 255 bool ConfigurationSetByName(const char* ConfigurationName) { uint8_t i; /* Loop through table trying to find the configuration */ for (i=0; i<(sizeof(ConfigurationTable) / sizeof(*ConfigurationTable)); i++) { - 92c: 23 30 cpi r18, 0x03 ; 3 - 92e: 31 05 cpc r19, r1 - 930: b1 f6 brne .-84 ; 0x8de + 94c: 23 30 cpi r18, 0x03 ; 3 + 94e: 31 05 cpc r19, r1 + 950: b1 f6 brne .-84 ; 0x8fe ConfigurationSetById(i); return true; } } return false; - 932: 80 e0 ldi r24, 0x00 ; 0 + 952: 80 e0 ldi r24, 0x00 ; 0 } - 934: df 91 pop r29 - 936: cf 91 pop r28 - 938: 1f 91 pop r17 - 93a: 0f 91 pop r16 - 93c: 08 95 ret + 954: df 91 pop r29 + 956: cf 91 pop r28 + 958: 1f 91 pop r17 + 95a: 0f 91 pop r16 + 95c: 08 95 ret bool StringMismatch = false; char c = pgm_read_byte(pTableConfigName); /* Try to keep running until both strings end at the same point */ while ( !(c == '\0' && *pRequestedConfigName == '\0') ) { if ( (c == '\0') || (*pRequestedConfigName == '\0') ) { - 93e: 99 91 ld r25, Y+ - 940: 99 23 and r25, r25 - 942: 91 f3 breq .-28 ; 0x928 + 95e: 99 91 ld r25, Y+ + 960: 99 23 and r25, r25 + 962: 91 f3 breq .-28 ; 0x948 /* One String ended before the other did -> unequal length */ StringMismatch = true; break; } if (c != *pRequestedConfigName) { - 944: 98 17 cp r25, r24 - 946: 41 f3 breq .-48 ; 0x918 - 948: ef cf rjmp .-34 ; 0x928 + 964: 98 17 cp r25, r24 + 966: 41 f3 breq .-48 ; 0x938 + 968: ef cf rjmp .-34 ; 0x948 c = pgm_read_byte(pTableConfigName); } if (!StringMismatch) { /* Configuration found */ ConfigurationSetById(i); - 94a: 86 2f mov r24, r22 - 94c: 8f df rcall .-226 ; 0x86c - 94e: 81 e0 ldi r24, 0x01 ; 1 + 96a: 86 2f mov r24, r22 + 96c: 8f df rcall .-226 ; 0x88c + 96e: 81 e0 ldi r24, 0x01 ; 1 return true; - 950: df 91 pop r29 + 970: df 91 pop r29 } } return false; } - 952: cf 91 pop r28 - 954: 1f 91 pop r17 - 956: 0f 91 pop r16 - 958: 08 95 ret + 972: cf 91 pop r28 + 974: 1f 91 pop r17 + 976: 0f 91 pop r16 + 978: 08 95 ret -0000095a : - 95a: cf 93 push r28 +0000097a : + 97a: cf 93 push r28 void ConfigurationGetList(char* ConfigListOut, uint16_t ByteCount) { - 95c: df 93 push r29 - 95e: ec 01 movw r28, r24 + 97c: df 93 push r29 + 97e: ec 01 movw r28, r24 uint8_t i; /* Account for '\0' */ ByteCount--; - 960: 61 50 subi r22, 0x01 ; 1 - 962: 70 40 sbci r23, 0x00 ; 0 - 964: 20 e0 ldi r18, 0x00 ; 0 - 966: 30 e0 ldi r19, 0x00 ; 0 + 980: 61 50 subi r22, 0x01 ; 1 + 982: 70 40 sbci r23, 0x00 ; 0 + 984: 20 e0 ldi r18, 0x00 ; 0 + 986: 30 e0 ldi r19, 0x00 ; 0 ByteCount--; } if ( i < (CONFIG_COUNT - 1) ) { /* No comma on last configuration */ *ConfigListOut++ = ','; - 968: 4c e2 ldi r20, 0x2C ; 44 + 988: 4c e2 ldi r20, 0x2C ; 44 /* Account for '\0' */ ByteCount--; for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - 98e: 84 91 lpm r24, Z - 990: 88 23 and r24, r24 - 992: 81 f0 breq .+32 ; 0x9b4 - 994: 61 31 cpi r22, 0x11 ; 17 - 996: 71 05 cpc r23, r1 - 998: 68 f0 brcs .+26 ; 0x9b4 - 99a: de 01 movw r26, r28 - 99c: 03 c0 rjmp .+6 ; 0x9a4 - 99e: 60 31 cpi r22, 0x10 ; 16 - 9a0: 71 05 cpc r23, r1 - 9a2: 41 f0 breq .+16 ; 0x9b4 + 9ae: 84 91 lpm r24, Z + 9b0: 88 23 and r24, r24 + 9b2: 81 f0 breq .+32 ; 0x9d4 + 9b4: 61 31 cpi r22, 0x11 ; 17 + 9b6: 71 05 cpc r23, r1 + 9b8: 68 f0 brcs .+26 ; 0x9d4 + 9ba: de 01 movw r26, r28 + 9bc: 03 c0 rjmp .+6 ; 0x9c4 + 9be: 60 31 cpi r22, 0x10 ; 16 + 9c0: 71 05 cpc r23, r1 + 9c2: 41 f0 breq .+16 ; 0x9d4 /* While not end-of-string and enough buffer to * put a complete configuration name */ *ConfigListOut++ = c; - 9a4: 8d 93 st X+, r24 - 9a6: ed 01 movw r28, r26 + 9c4: 8d 93 st X+, r24 + 9c6: ed 01 movw r28, r26 ConfigName++; - 9a8: 31 96 adiw r30, 0x01 ; 1 + 9c8: 31 96 adiw r30, 0x01 ; 1 ByteCount--; - 9aa: 61 50 subi r22, 0x01 ; 1 - 9ac: 70 40 sbci r23, 0x00 ; 0 + 9ca: 61 50 subi r22, 0x01 ; 1 + 9cc: 70 40 sbci r23, 0x00 ; 0 for (i=0; i CONFIGURATION_NAME_LENGTH_MAX) { - 9ae: 84 91 lpm r24, Z - 9b0: 88 23 and r24, r24 - 9b2: a9 f7 brne .-22 ; 0x99e + 9ce: 84 91 lpm r24, Z + 9d0: 88 23 and r24, r24 + 9d2: a9 f7 brne .-22 ; 0x9be *ConfigListOut++ = c; ConfigName++; ByteCount--; } if ( i < (CONFIG_COUNT - 1) ) { - 9b4: 22 30 cpi r18, 0x02 ; 2 - 9b6: 31 05 cpc r19, r1 - 9b8: 21 f4 brne .+8 ; 0x9c2 + 9d4: 22 30 cpi r18, 0x02 ; 2 + 9d6: 31 05 cpc r19, r1 + 9d8: 21 f4 brne .+8 ; 0x9e2 *ConfigListOut++ = ','; ByteCount--; } } *ConfigListOut = '\0'; - 9ba: 18 82 st Y, r1 + 9da: 18 82 st Y, r1 } - 9bc: df 91 pop r29 - 9be: cf 91 pop r28 - 9c0: 08 95 ret + 9dc: df 91 pop r29 + 9de: cf 91 pop r28 + 9e0: 08 95 ret ByteCount--; } if ( i < (CONFIG_COUNT - 1) ) { /* No comma on last configuration */ *ConfigListOut++ = ','; - 9c2: 49 93 st Y+, r20 + 9e2: 49 93 st Y+, r20 ByteCount--; - 9c4: 61 50 subi r22, 0x01 ; 1 - 9c6: 70 40 sbci r23, 0x00 ; 0 - 9c8: 2f 5f subi r18, 0xFF ; 255 - 9ca: 3f 4f sbci r19, 0xFF ; 255 - 9cc: ce cf rjmp .-100 ; 0x96a + 9e4: 61 50 subi r22, 0x01 ; 1 + 9e6: 70 40 sbci r23, 0x00 ; 0 + 9e8: 2f 5f subi r18, 0xFF ; 255 + 9ea: 3f 4f sbci r19, 0xFF ; 255 + 9ec: ce cf rjmp .-100 ; 0x98a -000009ce : +000009ee : #include void RandomInit(void) { } - 9ce: 08 95 ret + 9ee: 08 95 ret -000009d0 : +000009f0 : uint8_t RandomGetByte(void) { return rand() & 0xFF; - 9d0: 0c 94 d4 25 jmp 0x4ba8 ; 0x4ba8 + 9f0: 0c 94 e4 25 jmp 0x4bc8 ; 0x4bc8 } - 9d4: 08 95 ret + 9f4: 08 95 ret -000009d6 : +000009f6 : void RandomGetBuffer(void* Buffer, uint8_t ByteCount) { - 9d6: 0f 93 push r16 - 9d8: 1f 93 push r17 - 9da: cf 93 push r28 - 9dc: df 93 push r29 + 9f6: 0f 93 push r16 + 9f8: 1f 93 push r17 + 9fa: cf 93 push r28 + 9fc: df 93 push r29 uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - 9de: 66 23 and r22, r22 - 9e0: 61 f0 breq .+24 ; 0x9fa + 9fe: 66 23 and r22, r22 + a00: 61 f0 breq .+24 ; 0xa1a uint8_t RandomGetByte(void) { return rand() & 0xFF; } void RandomGetBuffer(void* Buffer, uint8_t ByteCount) - 9e2: 8c 01 movw r16, r24 - 9e4: 0f 5f subi r16, 0xFF ; 255 - 9e6: 1f 4f sbci r17, 0xFF ; 255 + a02: 8c 01 movw r16, r24 + a04: 0f 5f subi r16, 0xFF ; 255 + a06: 1f 4f sbci r17, 0xFF ; 255 { uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - 9e8: 61 50 subi r22, 0x01 ; 1 + a08: 61 50 subi r22, 0x01 ; 1 uint8_t RandomGetByte(void) { return rand() & 0xFF; } void RandomGetBuffer(void* Buffer, uint8_t ByteCount) - 9ea: 06 0f add r16, r22 - 9ec: 11 1d adc r17, r1 + a0a: 06 0f add r16, r22 + a0c: 11 1d adc r17, r1 { uint8_t* BufferPtr = (uint8_t*) Buffer; - 9ee: ec 01 movw r28, r24 + a0e: ec 01 movw r28, r24 while(ByteCount--) { *BufferPtr++ = RandomGetByte(); - 9f0: ef df rcall .-34 ; 0x9d0 - 9f2: 89 93 st Y+, r24 - 9f4: c0 17 cp r28, r16 + a10: ef df rcall .-34 ; 0x9f0 + a12: 89 93 st Y+, r24 + a14: c0 17 cp r28, r16 void RandomGetBuffer(void* Buffer, uint8_t ByteCount) { uint8_t* BufferPtr = (uint8_t*) Buffer; while(ByteCount--) { - 9f6: d1 07 cpc r29, r17 - 9f8: d9 f7 brne .-10 ; 0x9f0 - 9fa: df 91 pop r29 + a16: d1 07 cpc r29, r17 + a18: d9 f7 brne .-10 ; 0xa10 + a1a: df 91 pop r29 *BufferPtr++ = RandomGetByte(); } } - 9fc: cf 91 pop r28 - 9fe: 1f 91 pop r17 - a00: 0f 91 pop r16 - a02: 08 95 ret + a1c: cf 91 pop r28 + a1e: 1f 91 pop r17 + a20: 0f 91 pop r16 + a22: 08 95 ret -00000a04 : - a04: 0e 94 d4 25 call 0x4ba8 ; 0x4ba8 +00000a24 : + a24: 0e 94 e4 25 call 0x4bc8 ; 0x4bc8 void RandomTick(void) { rand(); rand(); - a08: 0e 94 d4 25 call 0x4ba8 ; 0x4ba8 + a28: 0e 94 e4 25 call 0x4bc8 ; 0x4bc8 rand(); - a0c: 0e 94 d4 25 call 0x4ba8 ; 0x4ba8 + a2c: 0e 94 e4 25 call 0x4bc8 ; 0x4bc8 rand(); - a10: 0c 94 d4 25 jmp 0x4ba8 ; 0x4ba8 + a30: 0c 94 e4 25 jmp 0x4bc8 ; 0x4bc8 -00000a14 : +00000a34 : */ #include "Common.h" uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) { - a14: cf 93 push r28 - a16: df 93 push r29 - a18: fc 01 movw r30, r24 + a34: cf 93 push r28 + a36: df 93 push r29 + a38: fc 01 movw r30, r24 uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { - a1a: 21 15 cp r18, r1 - a1c: 31 05 cpc r19, r1 - a1e: 81 f1 breq .+96 ; 0xa80 + a3a: 21 15 cp r18, r1 + a3c: 31 05 cpc r19, r1 + a3e: 81 f1 breq .+96 ; 0xaa0 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; - a20: 61 50 subi r22, 0x01 ; 1 - a22: 70 40 sbci r23, 0x00 ; 0 + a40: 61 50 subi r22, 0x01 ; 1 + a42: 70 40 sbci r23, 0x00 ; 0 while( (ByteCount > 0) && (MaxChars >= 2) ) { - a24: 62 30 cpi r22, 0x02 ; 2 - a26: 71 05 cpc r23, r1 - a28: 58 f1 brcs .+86 ; 0xa80 - a2a: da 01 movw r26, r20 + a44: 62 30 cpi r22, 0x02 ; 2 + a46: 71 05 cpc r23, r1 + a48: 58 f1 brcs .+86 ; 0xaa0 + a4a: da 01 movw r26, r20 #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; - a2c: 40 e0 ldi r20, 0x00 ; 0 - a2e: 50 e0 ldi r21, 0x00 ; 0 - a30: 18 c0 rjmp .+48 ; 0xa62 + a4c: 40 e0 ldi r20, 0x00 ; 0 + a4e: 50 e0 ldi r21, 0x00 ; 0 + a50: 18 c0 rjmp .+48 ; 0xa82 MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { uint8_t Byte = *ByteBuffer; HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - a32: d0 5d subi r29, 0xD0 ; 208 - a34: d0 83 st Z, r29 + a52: d0 5d subi r29, 0xD0 ; 208 + a54: d0 83 st Z, r29 HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - a36: 8c 2f mov r24, r28 - a38: 90 e0 ldi r25, 0x00 ; 0 - a3a: 8f 70 andi r24, 0x0F ; 15 - a3c: 90 70 andi r25, 0x00 ; 0 - a3e: 8a 30 cpi r24, 0x0A ; 10 - a40: 91 05 cpc r25, r1 - a42: d4 f4 brge .+52 ; 0xa78 - a44: 8c 2f mov r24, r28 - a46: 8f 70 andi r24, 0x0F ; 15 - a48: 80 5d subi r24, 0xD0 ; 208 - a4a: 81 83 std Z+1, r24 ; 0x01 + a56: 8c 2f mov r24, r28 + a58: 90 e0 ldi r25, 0x00 ; 0 + a5a: 8f 70 andi r24, 0x0F ; 15 + a5c: 90 70 andi r25, 0x00 ; 0 + a5e: 8a 30 cpi r24, 0x0A ; 10 + a60: 91 05 cpc r25, r1 + a62: d4 f4 brge .+52 ; 0xa98 + a64: 8c 2f mov r24, r28 + a66: 8f 70 andi r24, 0x0F ; 15 + a68: 80 5d subi r24, 0xD0 ; 208 + a6a: 81 83 std Z+1, r24 ; 0x01 HexOut += 2; - a4c: 32 96 adiw r30, 0x02 ; 2 + a6c: 32 96 adiw r30, 0x02 ; 2 MaxChars -= 2; CharCount += 2; - a4e: 4e 5f subi r20, 0xFE ; 254 - a50: 5f 4f sbci r21, 0xFF ; 255 + a6e: 4e 5f subi r20, 0xFE ; 254 + a70: 5f 4f sbci r21, 0xFF ; 255 ByteBuffer++; ByteCount -= 1; - a52: 21 50 subi r18, 0x01 ; 1 - a54: 30 40 sbci r19, 0x00 ; 0 + a72: 21 50 subi r18, 0x01 ; 1 + a74: 30 40 sbci r19, 0x00 ; 0 uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { - a56: b1 f0 breq .+44 ; 0xa84 + a76: b1 f0 breq .+44 ; 0xaa4 HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); HexOut += 2; MaxChars -= 2; - a58: 62 50 subi r22, 0x02 ; 2 - a5a: 70 40 sbci r23, 0x00 ; 0 + a78: 62 50 subi r22, 0x02 ; 2 + a7a: 70 40 sbci r23, 0x00 ; 0 uint16_t CharCount = 0; /* Account for '\0' at the end */ MaxChars--; while( (ByteCount > 0) && (MaxChars >= 2) ) { - a5c: 62 30 cpi r22, 0x02 ; 2 - a5e: 71 05 cpc r23, r1 - a60: 88 f0 brcs .+34 ; 0xa84 + a7c: 62 30 cpi r22, 0x02 ; 2 + a7e: 71 05 cpc r23, r1 + a80: 88 f0 brcs .+34 ; 0xaa4 uint8_t Byte = *ByteBuffer; - a62: cd 91 ld r28, X+ + a82: cd 91 ld r28, X+ HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); - a64: dc 2f mov r29, r28 - a66: d2 95 swap r29 - a68: df 70 andi r29, 0x0F ; 15 - a6a: 8d 2f mov r24, r29 - a6c: 90 e0 ldi r25, 0x00 ; 0 - a6e: 8a 30 cpi r24, 0x0A ; 10 - a70: 91 05 cpc r25, r1 - a72: fc f2 brlt .-66 ; 0xa32 - a74: d9 5c subi r29, 0xC9 ; 201 - a76: de cf rjmp .-68 ; 0xa34 + a84: dc 2f mov r29, r28 + a86: d2 95 swap r29 + a88: df 70 andi r29, 0x0F ; 15 + a8a: 8d 2f mov r24, r29 + a8c: 90 e0 ldi r25, 0x00 ; 0 + a8e: 8a 30 cpi r24, 0x0A ; 10 + a90: 91 05 cpc r25, r1 + a92: fc f2 brlt .-66 ; 0xa52 + a94: d9 5c subi r29, 0xC9 ; 201 + a96: de cf rjmp .-68 ; 0xa54 HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); - a78: 8c 2f mov r24, r28 - a7a: 8f 70 andi r24, 0x0F ; 15 - a7c: 89 5c subi r24, 0xC9 ; 201 - a7e: e5 cf rjmp .-54 ; 0xa4a + a98: 8c 2f mov r24, r28 + a9a: 8f 70 andi r24, 0x0F ; 15 + a9c: 89 5c subi r24, 0xC9 ; 201 + a9e: e5 cf rjmp .-54 ; 0xa6a #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; - a80: 40 e0 ldi r20, 0x00 ; 0 - a82: 50 e0 ldi r21, 0x00 ; 0 + aa0: 40 e0 ldi r20, 0x00 ; 0 + aa2: 50 e0 ldi r21, 0x00 ; 0 CharCount += 2; ByteBuffer++; ByteCount -= 1; } *HexOut = '\0'; - a84: 10 82 st Z, r1 + aa4: 10 82 st Z, r1 return CharCount; } - a86: ca 01 movw r24, r20 - a88: df 91 pop r29 - a8a: cf 91 pop r28 - a8c: 08 95 ret + aa6: ca 01 movw r24, r20 + aa8: df 91 pop r29 + aaa: cf 91 pop r28 + aac: 08 95 ret -00000a8e : +00000aae : uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) { - a8e: cf 93 push r28 - a90: df 93 push r29 - a92: da 01 movw r26, r20 + aae: cf 93 push r28 + ab0: df 93 push r29 + ab2: da 01 movw r26, r20 uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - a94: 2c 91 ld r18, X - a96: 22 23 and r18, r18 - a98: 09 f4 brne .+2 ; 0xa9c - a9a: 43 c0 rjmp .+134 ; 0xb22 - a9c: 11 96 adiw r26, 0x01 ; 1 - a9e: 3c 91 ld r19, X - aa0: 11 97 sbiw r26, 0x01 ; 1 - aa2: 33 23 and r19, r19 - aa4: f1 f1 breq .+124 ; 0xb22 - aa6: 61 15 cp r22, r1 - aa8: 71 05 cpc r23, r1 - aaa: d9 f1 breq .+118 ; 0xb22 + ab4: 2c 91 ld r18, X + ab6: 22 23 and r18, r18 + ab8: 09 f4 brne .+2 ; 0xabc + aba: 43 c0 rjmp .+134 ; 0xb42 + abc: 11 96 adiw r26, 0x01 ; 1 + abe: 3c 91 ld r19, X + ac0: 11 97 sbiw r26, 0x01 ; 1 + ac2: 33 23 and r19, r19 + ac4: f1 f1 breq .+124 ; 0xb42 + ac6: 61 15 cp r22, r1 + ac8: 71 05 cpc r23, r1 + aca: d9 f1 breq .+118 ; 0xb42 *HexOut = '\0'; return CharCount; } uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) - aac: 13 96 adiw r26, 0x03 ; 3 + acc: 13 96 adiw r26, 0x03 ; 3 { uint8_t* ByteBuffer = (uint8_t*) Buffer; - aae: ec 01 movw r28, r24 + ace: ec 01 movw r28, r24 uint16_t ByteCount = 0; - ab0: 80 e0 ldi r24, 0x00 ; 0 - ab2: 90 e0 ldi r25, 0x00 ; 0 - ab4: 14 c0 rjmp .+40 ; 0xade + ad0: 80 e0 ldi r24, 0x00 ; 0 + ad2: 90 e0 ldi r25, 0x00 ; 0 + ad4: 14 c0 rjmp .+40 ; 0xafe while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { uint8_t Byte = 0; Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - ab6: 22 95 swap r18 - ab8: 20 7f andi r18, 0xF0 ; 240 + ad6: 22 95 swap r18 + ad8: 20 7f andi r18, 0xF0 ; 240 Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - aba: 31 34 cpi r19, 0x41 ; 65 - abc: 30 f5 brcc .+76 ; 0xb0a - abe: 34 2f mov r19, r20 - ac0: 23 2b or r18, r19 + ada: 31 34 cpi r19, 0x41 ; 65 + adc: 30 f5 brcc .+76 ; 0xb2a + ade: 34 2f mov r19, r20 + ae0: 23 2b or r18, r19 *ByteBuffer = Byte; - ac2: 29 93 st Y+, r18 + ae2: 29 93 st Y+, r18 ByteBuffer++; MaxBytes--; ByteCount++; - ac4: 01 96 adiw r24, 0x01 ; 1 + ae4: 01 96 adiw r24, 0x01 ; 1 *HexOut = '\0'; return CharCount; } uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) - ac6: fd 01 movw r30, r26 - ac8: 31 97 sbiw r30, 0x01 ; 1 + ae6: fd 01 movw r30, r26 + ae8: 31 97 sbiw r30, 0x01 ; 1 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - aca: 20 81 ld r18, Z - acc: 22 23 and r18, r18 - ace: 31 f1 breq .+76 ; 0xb1c - ad0: 3c 91 ld r19, X - ad2: 33 23 and r19, r19 - ad4: 31 f1 breq .+76 ; 0xb22 - ad6: 12 96 adiw r26, 0x02 ; 2 - ad8: 68 17 cp r22, r24 - ada: 79 07 cpc r23, r25 - adc: f9 f0 breq .+62 ; 0xb1c + aea: 20 81 ld r18, Z + aec: 22 23 and r18, r18 + aee: 31 f1 breq .+76 ; 0xb3c + af0: 3c 91 ld r19, X + af2: 33 23 and r19, r19 + af4: 31 f1 breq .+76 ; 0xb42 + af6: 12 96 adiw r26, 0x02 ; 2 + af8: 68 17 cp r22, r24 + afa: 79 07 cpc r23, r25 + afc: f9 f0 breq .+62 ; 0xb3c if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { - ade: 42 2f mov r20, r18 - ae0: 40 53 subi r20, 0x30 ; 48 - ae2: 4a 30 cpi r20, 0x0A ; 10 - ae4: 18 f0 brcs .+6 ; 0xaec - ae6: 41 51 subi r20, 0x11 ; 17 - ae8: 46 30 cpi r20, 0x06 ; 6 - aea: d8 f4 brcc .+54 ; 0xb22 - aec: 43 2f mov r20, r19 - aee: 40 53 subi r20, 0x30 ; 48 - af0: 4a 30 cpi r20, 0x0A ; 10 - af2: 20 f0 brcs .+8 ; 0xafc - af4: 53 2f mov r21, r19 - af6: 51 54 subi r21, 0x41 ; 65 - af8: 56 30 cpi r21, 0x06 ; 6 - afa: 98 f4 brcc .+38 ; 0xb22 + afe: 42 2f mov r20, r18 + b00: 40 53 subi r20, 0x30 ; 48 + b02: 4a 30 cpi r20, 0x0A ; 10 + b04: 18 f0 brcs .+6 ; 0xb0c + b06: 41 51 subi r20, 0x11 ; 17 + b08: 46 30 cpi r20, 0x06 ; 6 + b0a: d8 f4 brcc .+54 ; 0xb42 + b0c: 43 2f mov r20, r19 + b0e: 40 53 subi r20, 0x30 ; 48 + b10: 4a 30 cpi r20, 0x0A ; 10 + b12: 20 f0 brcs .+8 ; 0xb1c + b14: 53 2f mov r21, r19 + b16: 51 54 subi r21, 0x41 ; 65 + b18: 56 30 cpi r21, 0x06 ; 6 + b1a: 98 f4 brcc .+38 ; 0xb42 uint8_t Byte = 0; Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; - afc: 21 34 cpi r18, 0x41 ; 65 - afe: d8 f2 brcs .-74 ; 0xab6 - b00: 22 95 swap r18 - b02: 20 7f andi r18, 0xF0 ; 240 - b04: 20 57 subi r18, 0x70 ; 112 + b1c: 21 34 cpi r18, 0x41 ; 65 + b1e: d8 f2 brcs .-74 ; 0xad6 + b20: 22 95 swap r18 + b22: 20 7f andi r18, 0xF0 ; 240 + b24: 20 57 subi r18, 0x70 ; 112 Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; - b06: 31 34 cpi r19, 0x41 ; 65 - b08: d0 f2 brcs .-76 ; 0xabe - b0a: 37 53 subi r19, 0x37 ; 55 - b0c: 23 2b or r18, r19 + b26: 31 34 cpi r19, 0x41 ; 65 + b28: d0 f2 brcs .-76 ; 0xade + b2a: 37 53 subi r19, 0x37 ; 55 + b2c: 23 2b or r18, r19 *ByteBuffer = Byte; - b0e: 29 93 st Y+, r18 + b2e: 29 93 st Y+, r18 ByteBuffer++; MaxBytes--; ByteCount++; - b10: 01 96 adiw r24, 0x01 ; 1 + b30: 01 96 adiw r24, 0x01 ; 1 *HexOut = '\0'; return CharCount; } uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) - b12: fd 01 movw r30, r26 - b14: 31 97 sbiw r30, 0x01 ; 1 + b32: fd 01 movw r30, r26 + b34: 31 97 sbiw r30, 0x01 ; 1 { uint8_t* ByteBuffer = (uint8_t*) Buffer; uint16_t ByteCount = 0; while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { - b16: 20 81 ld r18, Z - b18: 22 23 and r18, r18 - b1a: d1 f6 brne .-76 ; 0xad0 + b36: 20 81 ld r18, Z + b38: 22 23 and r18, r18 + b3a: d1 f6 brne .-76 ; 0xaf0 /* Odd number of characters */ return 0; } return ByteCount; } - b1c: df 91 pop r29 - b1e: cf 91 pop r28 - b20: 08 95 ret + b3c: df 91 pop r29 + b3e: cf 91 pop r28 + b40: 08 95 ret } } if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { /* Odd number of characters */ return 0; - b22: 80 e0 ldi r24, 0x00 ; 0 - b24: 90 e0 ldi r25, 0x00 ; 0 + b42: 80 e0 ldi r24, 0x00 ; 0 + b44: 90 e0 ldi r25, 0x00 ; 0 } return ByteCount; } - b26: df 91 pop r29 - b28: cf 91 pop r28 - b2a: 08 95 ret + b46: df 91 pop r29 + b48: cf 91 pop r28 + b4a: 08 95 ret -00000b2c : +00000b4c : SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } void MemoryInit(void) { - b2c: cf 93 push r28 - b2e: df 93 push r29 - b30: 00 d0 rcall .+0 ; 0xb32 - b32: 00 d0 rcall .+0 ; 0xb34 - b34: cd b7 in r28, 0x3d ; 61 - b36: de b7 in r29, 0x3e ; 62 + b4c: cf 93 push r28 + b4e: df 93 push r29 + b50: 00 d0 rcall .+0 ; 0xb52 + b52: 00 d0 rcall .+0 ; 0xb54 + b54: cd b7 in r28, 0x3d ; 61 + b56: de b7 in r29, 0x3e ; 62 /* Configure MEMORY_FLASH_USART for SPI master mode 0 with maximum clock frequency */ MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - b38: a0 e6 ldi r26, 0x60 ; 96 - b3a: b6 e0 ldi r27, 0x06 ; 6 - b3c: 80 e1 ldi r24, 0x10 ; 16 - b3e: 15 96 adiw r26, 0x05 ; 5 - b40: 8c 93 st X, r24 - b42: 15 97 sbiw r26, 0x05 ; 5 + b58: a0 e6 ldi r26, 0x60 ; 96 + b5a: b6 e0 ldi r27, 0x06 ; 6 + b5c: 80 e1 ldi r24, 0x10 ; 16 + b5e: 15 96 adiw r26, 0x05 ; 5 + b60: 8c 93 st X, r24 + b62: 15 97 sbiw r26, 0x05 ; 5 MEMORY_FLASH_PORT.DIRSET = MEMORY_FLASH_SCK | MEMORY_FLASH_MOSI | MEMORY_FLASH_CS; - b44: 9a e1 ldi r25, 0x1A ; 26 - b46: 11 96 adiw r26, 0x01 ; 1 - b48: 9c 93 st X, r25 - b4a: 11 97 sbiw r26, 0x01 ; 1 + b64: 9a e1 ldi r25, 0x1A ; 26 + b66: 11 96 adiw r26, 0x01 ; 1 + b68: 9c 93 st X, r25 + b6a: 11 97 sbiw r26, 0x01 ; 1 MEMORY_FLASH_USART.BAUDCTRLA = 0; - b4c: e0 ea ldi r30, 0xA0 ; 160 - b4e: f9 e0 ldi r31, 0x09 ; 9 - b50: 16 82 std Z+6, r1 ; 0x06 + b6c: e0 ea ldi r30, 0xA0 ; 160 + b6e: f9 e0 ldi r31, 0x09 ; 9 + b70: 16 82 std Z+6, r1 ; 0x06 MEMORY_FLASH_USART.BAUDCTRLB = 0; - b52: 17 82 std Z+7, r1 ; 0x07 + b72: 17 82 std Z+7, r1 ; 0x07 MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc | USART_CHSIZE_8BIT_gc; - b54: 93 ec ldi r25, 0xC3 ; 195 - b56: 95 83 std Z+5, r25 ; 0x05 + b74: 93 ec ldi r25, 0xC3 ; 195 + b76: 95 83 std Z+5, r25 ; 0x05 MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; - b58: 98 e1 ldi r25, 0x18 ; 24 - b5a: 94 83 std Z+4, r25 ; 0x04 + b78: 98 e1 ldi r25, 0x18 ; 24 + b7a: 94 83 std Z+4, r25 ; 0x04 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - b5c: 16 96 adiw r26, 0x06 ; 6 - b5e: 8c 93 st X, r24 - b60: 16 97 sbiw r26, 0x06 ; 6 + b7c: 16 96 adiw r26, 0x06 ; 6 + b7e: 8c 93 st X, r24 + b80: 16 97 sbiw r26, 0x06 ; 6 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - b62: 87 ed ldi r24, 0xD7 ; 215 - b64: 80 93 a0 09 sts 0x09A0, r24 + b82: 87 ed ldi r24, 0xD7 ; 215 + b84: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - b68: 80 91 a1 09 lds r24, 0x09A1 - b6c: 86 ff sbrs r24, 6 - b6e: fc cf rjmp .-8 ; 0xb68 + b88: 80 91 a1 09 lds r24, 0x09A1 + b8c: 86 ff sbrs r24, 6 + b8e: fc cf rjmp .-8 ; 0xb88 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - b70: 80 e4 ldi r24, 0x40 ; 64 - b72: e0 ea ldi r30, 0xA0 ; 160 - b74: f9 e0 ldi r31, 0x09 ; 9 - b76: 81 83 std Z+1, r24 ; 0x01 + b90: 80 e4 ldi r24, 0x40 ; 64 + b92: e0 ea ldi r30, 0xA0 ; 160 + b94: f9 e0 ldi r31, 0x09 ; 9 + b96: 81 83 std Z+1, r24 ; 0x01 return MEMORY_FLASH_USART.DATA; - b78: 80 91 a0 09 lds r24, 0x09A0 + b98: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - b7c: 10 92 a0 09 sts 0x09A0, r1 + b9c: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - b80: 80 91 a1 09 lds r24, 0x09A1 - b84: 86 ff sbrs r24, 6 - b86: fc cf rjmp .-8 ; 0xb80 + ba0: 80 91 a1 09 lds r24, 0x09A1 + ba4: 86 ff sbrs r24, 6 + ba6: fc cf rjmp .-8 ; 0xba0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - b88: 80 e4 ldi r24, 0x40 ; 64 - b8a: e0 ea ldi r30, 0xA0 ; 160 - b8c: f9 e0 ldi r31, 0x09 ; 9 - b8e: 81 83 std Z+1, r24 ; 0x01 + ba8: 80 e4 ldi r24, 0x40 ; 64 + baa: e0 ea ldi r30, 0xA0 ; 160 + bac: f9 e0 ldi r31, 0x09 ; 9 + bae: 81 83 std Z+1, r24 ; 0x01 return MEMORY_FLASH_USART.DATA; - b90: 80 91 a0 09 lds r24, 0x09A0 + bb0: 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; - b94: 90 e1 ldi r25, 0x10 ; 16 - b96: e0 e6 ldi r30, 0x60 ; 96 - b98: f6 e0 ldi r31, 0x06 ; 6 - b9a: 95 83 std Z+5, r25 ; 0x05 + bb4: 90 e1 ldi r25, 0x10 ; 16 + bb6: e0 e6 ldi r30, 0x60 ; 96 + bb8: f6 e0 ldi r31, 0x06 ; 6 + bba: 95 83 std Z+5, r25 ; 0x05 MEMORY_FLASH_USART.BAUDCTRLB = 0; MEMORY_FLASH_USART.CTRLC = USART_CMODE_MSPI_gc | USART_CHSIZE_8BIT_gc; MEMORY_FLASH_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm; if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { - b9c: 80 fd sbrc r24, 0 - b9e: 47 c0 rjmp .+142 ; 0xc2e + bbc: 80 fd sbrc r24, 0 + bbe: 47 c0 rjmp .+142 ; 0xc4e return !(FlashReadStatusRegister() & FLASH_STATUS_REG_READY_BIT); } INLINE void FlashConfigurePageSize(void) { uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; - ba0: 8d e3 ldi r24, 0x3D ; 61 - ba2: 89 83 std Y+1, r24 ; 0x01 - ba4: 8a e2 ldi r24, 0x2A ; 42 - ba6: 8a 83 std Y+2, r24 ; 0x02 - ba8: 80 e8 ldi r24, 0x80 ; 128 - baa: 8b 83 std Y+3, r24 ; 0x03 - bac: 86 ea ldi r24, 0xA6 ; 166 - bae: 8c 83 std Y+4, r24 ; 0x04 + bc0: 8d e3 ldi r24, 0x3D ; 61 + bc2: 89 83 std Y+1, r24 ; 0x01 + bc4: 8a e2 ldi r24, 0x2A ; 42 + bc6: 8a 83 std Y+2, r24 ; 0x02 + bc8: 80 e8 ldi r24, 0x80 ; 128 + bca: 8b 83 std Y+3, r24 ; 0x03 + bcc: 86 ea ldi r24, 0xA6 ; 166 + bce: 8c 83 std Y+4, r24 ; 0x04 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bb0: a0 e6 ldi r26, 0x60 ; 96 - bb2: b6 e0 ldi r27, 0x06 ; 6 - bb4: 20 e1 ldi r18, 0x10 ; 16 + bd0: a0 e6 ldi r26, 0x60 ; 96 + bd2: b6 e0 ldi r27, 0x06 ; 6 + bd4: 20 e1 ldi r18, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - bb6: 37 ed ldi r19, 0xD7 ; 215 + bd6: 37 ed ldi r19, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bb8: e0 ea ldi r30, 0xA0 ; 160 - bba: f9 e0 ldi r31, 0x09 ; 9 + bd8: e0 ea ldi r30, 0xA0 ; 160 + bda: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - bbc: 90 e4 ldi r25, 0x40 ; 64 + bdc: 90 e4 ldi r25, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bbe: 16 96 adiw r26, 0x06 ; 6 - bc0: 2c 93 st X, r18 - bc2: 16 97 sbiw r26, 0x06 ; 6 + bde: 16 96 adiw r26, 0x06 ; 6 + be0: 2c 93 st X, r18 + be2: 16 97 sbiw r26, 0x06 ; 6 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - bc4: 30 93 a0 09 sts 0x09A0, r19 + be4: 30 93 a0 09 sts 0x09A0, r19 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bc8: 80 91 a1 09 lds r24, 0x09A1 - bcc: 86 ff sbrs r24, 6 - bce: fc cf rjmp .-8 ; 0xbc8 + be8: 80 91 a1 09 lds r24, 0x09A1 + bec: 86 ff sbrs r24, 6 + bee: fc cf rjmp .-8 ; 0xbe8 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - bd0: 91 83 std Z+1, r25 ; 0x01 + bf0: 91 83 std Z+1, r25 ; 0x01 return MEMORY_FLASH_USART.DATA; - bd2: 80 91 a0 09 lds r24, 0x09A0 + bf2: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - bd6: 10 92 a0 09 sts 0x09A0, r1 + bf6: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - bda: 80 91 a1 09 lds r24, 0x09A1 - bde: 86 ff sbrs r24, 6 - be0: fc cf rjmp .-8 ; 0xbda + bfa: 80 91 a1 09 lds r24, 0x09A1 + bfe: 86 ff sbrs r24, 6 + c00: fc cf rjmp .-8 ; 0xbfa MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - be2: 91 83 std Z+1, r25 ; 0x01 + c02: 91 83 std Z+1, r25 ; 0x01 return MEMORY_FLASH_USART.DATA; - be4: 80 91 a0 09 lds r24, 0x09A0 + c04: 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; - be8: 15 96 adiw r26, 0x05 ; 5 - bea: 2c 93 st X, r18 - bec: 15 97 sbiw r26, 0x05 ; 5 + c08: 15 96 adiw r26, 0x05 ; 5 + c0a: 2c 93 st X, r18 + c0c: 15 97 sbiw r26, 0x05 ; 5 INLINE void FlashConfigurePageSize(void) { uint8_t Sequence[] = {0x3D, 0x2A, 0x80, 0xA6}; while(FlashIsBusy()); - bee: 87 ff sbrs r24, 7 - bf0: e6 cf rjmp .-52 ; 0xbbe + c0e: 87 ff sbrs r24, 7 + c10: e6 cf rjmp .-52 ; 0xbde MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - bf2: 80 e1 ldi r24, 0x10 ; 16 - bf4: e0 e6 ldi r30, 0x60 ; 96 - bf6: f6 e0 ldi r31, 0x06 ; 6 - bf8: 86 83 std Z+6, r24 ; 0x06 + c12: 80 e1 ldi r24, 0x10 ; 16 + c14: e0 e6 ldi r30, 0x60 ; 96 + c16: f6 e0 ldi r31, 0x06 ; 6 + c18: 86 83 std Z+6, r24 ; 0x06 SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } void MemoryInit(void) - bfa: ce 01 movw r24, r28 - bfc: 05 96 adiw r24, 0x05 ; 5 + c1a: ce 01 movw r24, r28 + c1c: 05 96 adiw r24, 0x05 ; 5 } } INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; - bfe: fe 01 movw r30, r28 - c00: 31 96 adiw r30, 0x01 ; 1 + c1e: fe 01 movw r30, r28 + c20: 31 96 adiw r30, 0x01 ; 1 while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c02: a0 ea ldi r26, 0xA0 ; 160 - c04: b9 e0 ldi r27, 0x09 ; 9 + c22: a0 ea ldi r26, 0xA0 ; 160 + c24: b9 e0 ldi r27, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c06: 30 e4 ldi r19, 0x40 ; 64 + c26: 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++; - c08: 21 91 ld r18, Z+ - c0a: 20 93 a0 09 sts 0x09A0, r18 + c28: 21 91 ld r18, Z+ + c2a: 20 93 a0 09 sts 0x09A0, r18 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c0e: 20 91 a1 09 lds r18, 0x09A1 - c12: 26 ff sbrs r18, 6 - c14: fc cf rjmp .-8 ; 0xc0e + c2e: 20 91 a1 09 lds r18, 0x09A1 + c32: 26 ff sbrs r18, 6 + c34: fc cf rjmp .-8 ; 0xc2e MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c16: 11 96 adiw r26, 0x01 ; 1 - c18: 3c 93 st X, r19 - c1a: 11 97 sbiw r26, 0x01 ; 1 + c36: 11 96 adiw r26, 0x01 ; 1 + c38: 3c 93 st X, r19 + c3a: 11 97 sbiw r26, 0x01 ; 1 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - c1c: 20 91 a0 09 lds r18, 0x09A0 + c3c: 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) { - c20: e8 17 cp r30, r24 - c22: f9 07 cpc r31, r25 - c24: 89 f7 brne .-30 ; 0xc08 + c40: e8 17 cp r30, r24 + c42: f9 07 cpc r31, r25 + c44: 89 f7 brne .-30 ; 0xc28 while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPIWriteBlock(Sequence, sizeof(Sequence)); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - c26: 80 e1 ldi r24, 0x10 ; 16 - c28: e0 e6 ldi r30, 0x60 ; 96 - c2a: f6 e0 ldi r31, 0x06 ; 6 - c2c: 85 83 std Z+5, r24 ; 0x05 + c46: 80 e1 ldi r24, 0x10 ; 16 + c48: e0 e6 ldi r30, 0x60 ; 96 + c4a: f6 e0 ldi r31, 0x06 ; 6 + c4c: 85 83 std Z+5, r24 ; 0x05 if ( !(FlashReadStatusRegister() & FLASH_STATUS_REG_PAGESIZE_BIT) ) { /* Configure for 256 byte Dataflash if not already done. */ FlashConfigurePageSize(); } } - c2e: 24 96 adiw r28, 0x04 ; 4 - c30: cd bf out 0x3d, r28 ; 61 - c32: de bf out 0x3e, r29 ; 62 - c34: df 91 pop r29 - c36: cf 91 pop r28 - c38: 08 95 ret + c4e: 24 96 adiw r28, 0x04 ; 4 + c50: cd bf out 0x3d, r28 ; 61 + c52: de bf out 0x3e, r29 ; 62 + c54: df 91 pop r29 + c56: cf 91 pop r28 + c58: 08 95 ret -00000c3a : +00000c5a : void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) { - c3a: 0f 93 push r16 - c3c: 1f 93 push r17 - c3e: cf 93 push r28 - c40: df 93 push r29 - c42: ec 01 movw r28, r24 + c5a: 0f 93 push r16 + c5c: 1f 93 push r17 + c5e: cf 93 push r28 + c60: df 93 push r29 + c62: ec 01 movw r28, r24 uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - c44: 8b 01 movw r16, r22 - c46: 20 e0 ldi r18, 0x00 ; 0 - c48: 30 e0 ldi r19, 0x00 ; 0 - c4a: 80 91 0d 21 lds r24, 0x210D - c4e: 90 e0 ldi r25, 0x00 ; 0 - c50: a0 e0 ldi r26, 0x00 ; 0 - c52: b0 e0 ldi r27, 0x00 ; 0 - c54: dc 01 movw r26, r24 - c56: 99 27 eor r25, r25 - c58: 88 27 eor r24, r24 - c5a: 08 0f add r16, r24 - c5c: 19 1f adc r17, r25 - c5e: 2a 1f adc r18, r26 - c60: 3b 1f adc r19, r27 + c64: 8b 01 movw r16, r22 + c66: 20 e0 ldi r18, 0x00 ; 0 + c68: 30 e0 ldi r19, 0x00 ; 0 + c6a: 80 91 0d 21 lds r24, 0x210D + c6e: 90 e0 ldi r25, 0x00 ; 0 + c70: a0 e0 ldi r26, 0x00 ; 0 + c72: b0 e0 ldi r27, 0x00 ; 0 + c74: dc 01 movw r26, r24 + c76: 99 27 eor r25, r25 + c78: 88 27 eor r24, r24 + c7a: 08 0f add r16, r24 + c7c: 19 1f adc r17, r25 + c7e: 2a 1f adc r18, r26 + c80: 3b 1f adc r19, r27 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - c62: a0 e6 ldi r26, 0x60 ; 96 - c64: b6 e0 ldi r27, 0x06 ; 6 - c66: 60 e1 ldi r22, 0x10 ; 16 + c82: a0 e6 ldi r26, 0x60 ; 96 + c84: b6 e0 ldi r27, 0x06 ; 6 + c86: 60 e1 ldi r22, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - c68: 77 ed ldi r23, 0xD7 ; 215 + c88: 77 ed ldi r23, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c6a: e0 ea ldi r30, 0xA0 ; 160 - c6c: f9 e0 ldi r31, 0x09 ; 9 + c8a: e0 ea ldi r30, 0xA0 ; 160 + c8c: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c6e: 90 e4 ldi r25, 0x40 ; 64 + c8e: 90 e4 ldi r25, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - c70: 16 96 adiw r26, 0x06 ; 6 - c72: 6c 93 st X, r22 - c74: 16 97 sbiw r26, 0x06 ; 6 + c90: 16 96 adiw r26, 0x06 ; 6 + c92: 6c 93 st X, r22 + c94: 16 97 sbiw r26, 0x06 ; 6 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - c76: 70 93 a0 09 sts 0x09A0, r23 + c96: 70 93 a0 09 sts 0x09A0, r23 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c7a: 80 91 a1 09 lds r24, 0x09A1 - c7e: 86 ff sbrs r24, 6 - c80: fc cf rjmp .-8 ; 0xc7a + c9a: 80 91 a1 09 lds r24, 0x09A1 + c9e: 86 ff sbrs r24, 6 + ca0: fc cf rjmp .-8 ; 0xc9a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c82: 91 83 std Z+1, r25 ; 0x01 + ca2: 91 83 std Z+1, r25 ; 0x01 return MEMORY_FLASH_USART.DATA; - c84: 80 91 a0 09 lds r24, 0x09A0 + ca4: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - c88: 10 92 a0 09 sts 0x09A0, r1 + ca8: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - c8c: 80 91 a1 09 lds r24, 0x09A1 - c90: 86 ff sbrs r24, 6 - c92: fc cf rjmp .-8 ; 0xc8c + cac: 80 91 a1 09 lds r24, 0x09A1 + cb0: 86 ff sbrs r24, 6 + cb2: fc cf rjmp .-8 ; 0xcac MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - c94: 91 83 std Z+1, r25 ; 0x01 + cb4: 91 83 std Z+1, r25 ; 0x01 return MEMORY_FLASH_USART.DATA; - c96: 80 91 a0 09 lds r24, 0x09A0 + cb6: 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; - c9a: 15 96 adiw r26, 0x05 ; 5 - c9c: 6c 93 st X, r22 - c9e: 15 97 sbiw r26, 0x05 ; 5 + cba: 15 96 adiw r26, 0x05 ; 5 + cbc: 6c 93 st X, r22 + cbe: 15 97 sbiw r26, 0x05 ; 5 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashRead(void* Buffer, uint32_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - ca0: 87 ff sbrs r24, 7 - ca2: e6 cf rjmp .-52 ; 0xc70 + cc0: 87 ff sbrs r24, 7 + cc2: e6 cf rjmp .-52 ; 0xc90 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - ca4: 80 e1 ldi r24, 0x10 ; 16 - ca6: e0 e6 ldi r30, 0x60 ; 96 - ca8: f6 e0 ldi r31, 0x06 ; 6 - caa: 86 83 std Z+6, r24 ; 0x06 + cc4: 80 e1 ldi r24, 0x10 ; 16 + cc6: e0 e6 ldi r30, 0x60 ; 96 + cc8: f6 e0 ldi r31, 0x06 ; 6 + cca: 86 83 std Z+6, r24 ; 0x06 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - cac: 83 e0 ldi r24, 0x03 ; 3 - cae: 80 93 a0 09 sts 0x09A0, r24 + ccc: 83 e0 ldi r24, 0x03 ; 3 + cce: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - cb2: 80 91 a1 09 lds r24, 0x09A1 - cb6: 86 ff sbrs r24, 6 - cb8: fc cf rjmp .-8 ; 0xcb2 + cd2: 80 91 a1 09 lds r24, 0x09A1 + cd6: 86 ff sbrs r24, 6 + cd8: fc cf rjmp .-8 ; 0xcd2 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - cba: 80 e4 ldi r24, 0x40 ; 64 - cbc: e0 ea ldi r30, 0xA0 ; 160 - cbe: f9 e0 ldi r31, 0x09 ; 9 - cc0: 81 83 std Z+1, r24 ; 0x01 + cda: 80 e4 ldi r24, 0x40 ; 64 + cdc: e0 ea ldi r30, 0xA0 ; 160 + cde: f9 e0 ldi r31, 0x09 ; 9 + ce0: 81 83 std Z+1, r24 ; 0x01 return MEMORY_FLASH_USART.DATA; - cc2: 80 91 a0 09 lds r24, 0x09A0 + ce2: 80 91 a0 09 lds r24, 0x09A0 { while(FlashIsBusy()); MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); - cc6: c9 01 movw r24, r18 - cc8: aa 27 eor r26, r26 - cca: bb 27 eor r27, r27 -#define FLASH_STATUS_REG_PROTECT_BIT (1<<1) -#define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) - -INLINE uint8_t SPITransferByte(uint8_t Data) -{ - MEMORY_FLASH_USART.DATA = Data; - ccc: 80 93 a0 09 sts 0x09A0, r24 - - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - cd0: 80 91 a1 09 lds r24, 0x09A1 - cd4: 86 ff sbrs r24, 6 - cd6: fc cf rjmp .-8 ; 0xcd0 - - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - cd8: 80 e4 ldi r24, 0x40 ; 64 - cda: e0 ea ldi r30, 0xA0 ; 160 - cdc: f9 e0 ldi r31, 0x09 ; 9 - cde: 81 83 std Z+1, r24 ; 0x01 - - return MEMORY_FLASH_USART.DATA; - ce0: 80 91 a0 09 lds r24, 0x09A0 - while(FlashIsBusy()); - - MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - SPITransferByte(0x03); - SPITransferByte( (Address >> 16) & 0xFF ); - SPITransferByte( (Address >> 8) & 0xFF ); - ce4: bb 27 eor r27, r27 - ce6: a3 2f mov r26, r19 - ce8: 92 2f mov r25, r18 - cea: 81 2f mov r24, r17 + ce6: c9 01 movw r24, r18 + ce8: aa 27 eor r26, r26 + cea: bb 27 eor r27, r27 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) @@ -2200,7 +2171,7 @@ INLINE uint8_t SPITransferByte(uint8_t Data) while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); cf0: 80 91 a1 09 lds r24, 0x09A1 cf4: 86 ff sbrs r24, 6 - cf6: fc cf rjmp .-8 ; 0xcf0 + cf6: fc cf rjmp .-8 ; 0xcf0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; cf8: 80 e4 ldi r24, 0x40 ; 64 @@ -2210,11987 +2181,11988 @@ INLINE uint8_t SPITransferByte(uint8_t Data) return MEMORY_FLASH_USART.DATA; d00: 80 91 a0 09 lds r24, 0x09A0 + while(FlashIsBusy()); + + MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; + SPITransferByte(0x03); + SPITransferByte( (Address >> 16) & 0xFF ); + SPITransferByte( (Address >> 8) & 0xFF ); + d04: bb 27 eor r27, r27 + d06: a3 2f mov r26, r19 + d08: 92 2f mov r25, r18 + d0a: 81 2f mov r24, r17 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - d04: 00 93 a0 09 sts 0x09A0, r16 + d0c: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - d08: 80 91 a1 09 lds r24, 0x09A1 - d0c: 86 ff sbrs r24, 6 - d0e: fc cf rjmp .-8 ; 0xd08 + d10: 80 91 a1 09 lds r24, 0x09A1 + d14: 86 ff sbrs r24, 6 + d16: fc cf rjmp .-8 ; 0xd10 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d10: 80 e4 ldi r24, 0x40 ; 64 - d12: e0 ea ldi r30, 0xA0 ; 160 - d14: f9 e0 ldi r31, 0x09 ; 9 - d16: 81 83 std Z+1, r24 ; 0x01 + d18: 80 e4 ldi r24, 0x40 ; 64 + d1a: e0 ea ldi r30, 0xA0 ; 160 + d1c: f9 e0 ldi r31, 0x09 ; 9 + d1e: 81 83 std Z+1, r24 ; 0x01 return MEMORY_FLASH_USART.DATA; - d18: 80 91 a0 09 lds r24, 0x09A0 + d20: 80 91 a0 09 lds r24, 0x09A0 +#define FLASH_STATUS_REG_PROTECT_BIT (1<<1) +#define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) -INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) +INLINE uint8_t SPITransferByte(uint8_t Data) { - uint8_t* ByteBuffer = (uint8_t*) Buffer; + MEMORY_FLASH_USART.DATA = Data; + d24: 00 93 a0 09 sts 0x09A0, r16 - while(ByteCount-- > 0) { - d1c: 41 15 cp r20, r1 - d1e: 51 05 cpc r21, r1 - d20: 71 f0 breq .+28 ; 0xd3e - MEMORY_FLASH_USART.DATA = 0; - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d22: 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; - d24: 10 92 a0 09 sts 0x09A0, r1 - while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); d28: 80 91 a1 09 lds r24, 0x09A1 d2c: 86 ff sbrs r24, 6 - d2e: fc cf rjmp .-8 ; 0xd28 - MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - d30: 91 83 std Z+1, r25 ; 0x01 - *ByteBuffer++ = MEMORY_FLASH_USART.DATA; - d32: 80 91 a0 09 lds r24, 0x09A0 - d36: 89 93 st Y+, r24 - d38: 41 50 subi r20, 0x01 ; 1 - d3a: 50 40 sbci r21, 0x00 ; 0 + d2e: fc cf rjmp .-8 ; 0xd28 + + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + d30: 80 e4 ldi r24, 0x40 ; 64 + d32: e0 ea ldi r30, 0xA0 ; 160 + d34: f9 e0 ldi r31, 0x09 ; 9 + d36: 81 83 std Z+1, r24 ; 0x01 + + return MEMORY_FLASH_USART.DATA; + d38: 80 91 a0 09 lds r24, 0x09A0 INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - d3c: 99 f7 brne .-26 ; 0xd24 + d3c: 41 15 cp r20, r1 + d3e: 51 05 cpc r21, r1 + d40: 71 f0 breq .+28 ; 0xd5e + MEMORY_FLASH_USART.DATA = 0; + while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); + MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; + d42: 90 e4 ldi r25, 0x40 ; 64 +INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + + while(ByteCount-- > 0) { + MEMORY_FLASH_USART.DATA = 0; + d44: 10 92 a0 09 sts 0x09A0, r1 + 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: 91 83 std Z+1, r25 ; 0x01 + *ByteBuffer++ = MEMORY_FLASH_USART.DATA; + d52: 80 91 a0 09 lds r24, 0x09A0 + d56: 89 93 st Y+, r24 + d58: 41 50 subi r20, 0x01 ; 1 + d5a: 50 40 sbci r21, 0x00 ; 0 + +INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + + while(ByteCount-- > 0) { + d5c: 99 f7 brne .-26 ; 0xd44 SPITransferByte(0x03); SPITransferByte( (Address >> 16) & 0xFF ); SPITransferByte( (Address >> 8) & 0xFF ); SPITransferByte( (Address >> 0) & 0xFF ); SPIReadBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - d3e: 80 e1 ldi r24, 0x10 ; 16 - d40: e0 e6 ldi r30, 0x60 ; 96 - d42: f6 e0 ldi r31, 0x06 ; 6 - d44: 85 83 std Z+5, r24 ; 0x05 + d5e: 80 e1 ldi r24, 0x10 ; 16 + d60: e0 e6 ldi r30, 0x60 ; 96 + d62: f6 e0 ldi r31, 0x06 ; 6 + d64: 85 83 std Z+5, r24 ; 0x05 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; FlashRead(Buffer, FlashAddress, ByteCount); } - d46: df 91 pop r29 - d48: cf 91 pop r28 - d4a: 1f 91 pop r17 - d4c: 0f 91 pop r16 - d4e: 08 95 ret + d66: df 91 pop r29 + d68: cf 91 pop r28 + d6a: 1f 91 pop r17 + d6c: 0f 91 pop r16 + d6e: 08 95 ret -00000d50 : +00000d70 : void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { - d50: 2f 92 push r2 - d52: 3f 92 push r3 - d54: 4f 92 push r4 - d56: 5f 92 push r5 - d58: 6f 92 push r6 - d5a: 7f 92 push r7 - d5c: 8f 92 push r8 - d5e: 9f 92 push r9 - d60: af 92 push r10 - d62: bf 92 push r11 - d64: cf 92 push r12 - d66: df 92 push r13 - d68: ef 92 push r14 - d6a: ff 92 push r15 - d6c: 0f 93 push r16 - d6e: 1f 93 push r17 - d70: cf 93 push r28 - d72: df 93 push r29 - d74: cd b7 in r28, 0x3d ; 61 - d76: de b7 in r29, 0x3e ; 62 - d78: 26 97 sbiw r28, 0x06 ; 6 - d7a: cd bf out 0x3d, r28 ; 61 - d7c: de bf out 0x3e, r29 ; 62 - d7e: 8b 83 std Y+3, r24 ; 0x03 - d80: 9c 83 std Y+4, r25 ; 0x04 - d82: 4a 01 movw r8, r20 + d70: 2f 92 push r2 + d72: 3f 92 push r3 + d74: 4f 92 push r4 + d76: 5f 92 push r5 + d78: 6f 92 push r6 + d7a: 7f 92 push r7 + d7c: 8f 92 push r8 + d7e: 9f 92 push r9 + d80: af 92 push r10 + d82: bf 92 push r11 + d84: cf 92 push r12 + d86: df 92 push r13 + d88: ef 92 push r14 + d8a: ff 92 push r15 + d8c: 0f 93 push r16 + d8e: 1f 93 push r17 + d90: cf 93 push r28 + d92: df 93 push r29 + d94: cd b7 in r28, 0x3d ; 61 + d96: de b7 in r29, 0x3e ; 62 + d98: 26 97 sbiw r28, 0x06 ; 6 + d9a: cd bf out 0x3d, r28 ; 61 + d9c: de bf out 0x3e, r29 ; 62 + d9e: 8b 83 std Y+3, r24 ; 0x03 + da0: 9c 83 std Y+4, r25 ; 0x04 + da2: 4a 01 movw r8, r20 uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - d84: 80 91 0d 21 lds r24, 0x210D + da4: 80 91 0d 21 lds r24, 0x210D MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - d88: 41 15 cp r20, r1 - d8a: 51 05 cpc r21, r1 - d8c: 09 f4 brne .+2 ; 0xd90 - d8e: 1e c1 rjmp .+572 ; 0xfcc + da8: 41 15 cp r20, r1 + daa: 51 05 cpc r21, r1 + dac: 09 f4 brne .+2 ; 0xdb0 + dae: 1e c1 rjmp .+572 ; 0xfec FlashRead(Buffer, FlashAddress, ByteCount); } void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; - d90: 6b 01 movw r12, r22 - d92: ee 24 eor r14, r14 - d94: ff 24 eor r15, r15 - d96: 90 e0 ldi r25, 0x00 ; 0 - d98: a0 e0 ldi r26, 0x00 ; 0 - d9a: b0 e0 ldi r27, 0x00 ; 0 - d9c: dc 01 movw r26, r24 - d9e: 99 27 eor r25, r25 - da0: 88 27 eor r24, r24 - da2: c8 0e add r12, r24 - da4: d9 1e adc r13, r25 - da6: ea 1e adc r14, r26 - da8: fb 1e adc r15, r27 + db0: 6b 01 movw r12, r22 + db2: ee 24 eor r14, r14 + db4: ff 24 eor r15, r15 + db6: 90 e0 ldi r25, 0x00 ; 0 + db8: a0 e0 ldi r26, 0x00 ; 0 + dba: b0 e0 ldi r27, 0x00 ; 0 + dbc: dc 01 movw r26, r24 + dbe: 99 27 eor r25, r25 + dc0: 88 27 eor r24, r24 + dc2: c8 0e add r12, r24 + dc4: d9 1e adc r13, r25 + dc6: ea 1e adc r14, r26 + dc8: fb 1e adc r15, r27 INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { uint16_t PageAddress = Address / MEMORY_PAGE_SIZE; uint8_t ByteAddress = Address % MEMORY_PAGE_SIZE; uint16_t PageBytes = MIN(MEMORY_PAGE_SIZE - ByteAddress, ByteCount); - daa: 21 2c mov r2, r1 - dac: 01 e0 ldi r16, 0x01 ; 1 - dae: 30 2e mov r3, r16 + dca: 21 2c mov r2, r1 + dcc: 01 e0 ldi r16, 0x01 ; 1 + dce: 30 2e mov r3, r16 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - db0: 00 e1 ldi r16, 0x10 ; 16 - db2: 30 e1 ldi r19, 0x10 ; 16 + dd0: 00 e1 ldi r16, 0x10 ; 16 + dd2: 30 e1 ldi r19, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - db4: 47 ed ldi r20, 0xD7 ; 215 + dd4: 47 ed ldi r20, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - db6: e0 ea ldi r30, 0xA0 ; 160 - db8: f9 e0 ldi r31, 0x09 ; 9 + dd6: e0 ea ldi r30, 0xA0 ; 160 + dd8: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - dba: 50 e4 ldi r21, 0x40 ; 64 - dbc: 20 e4 ldi r18, 0x40 ; 64 + dda: 50 e4 ldi r21, 0x40 ; 64 + ddc: 20 e4 ldi r18, 0x40 ; 64 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - dbe: 10 e6 ldi r17, 0x60 ; 96 - dc0: 61 2e mov r6, r17 - dc2: 16 e0 ldi r17, 0x06 ; 6 - dc4: 71 2e mov r7, r17 - dc6: 60 e1 ldi r22, 0x10 ; 16 + dde: 10 e6 ldi r17, 0x60 ; 96 + de0: 61 2e mov r6, r17 + de2: 16 e0 ldi r17, 0x06 ; 6 + de4: 71 2e mov r7, r17 + de6: 60 e1 ldi r22, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - dc8: 17 ed ldi r17, 0xD7 ; 215 - dca: 24 01 movw r4, r8 - dcc: 46 01 movw r8, r12 - dce: 57 01 movw r10, r14 + de8: 17 ed ldi r17, 0xD7 ; 215 + dea: 24 01 movw r4, r8 + dec: 46 01 movw r8, r12 + dee: 57 01 movw r10, r14 } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { uint16_t PageAddress = Address / MEMORY_PAGE_SIZE; - dd0: bb 27 eor r27, r27 - dd2: ab 2d mov r26, r11 - dd4: 9a 2d mov r25, r10 - dd6: 89 2d mov r24, r9 - dd8: 7c 01 movw r14, r24 + df0: bb 27 eor r27, r27 + df2: ab 2d mov r26, r11 + df4: 9a 2d mov r25, r10 + df6: 89 2d mov r24, r9 + df8: 7c 01 movw r14, r24 uint8_t ByteAddress = Address % MEMORY_PAGE_SIZE; - dda: 98 2d mov r25, r8 + dfa: 98 2d mov r25, r8 uint16_t PageBytes = MIN(MEMORY_PAGE_SIZE - ByteAddress, ByteCount); - ddc: 61 01 movw r12, r2 - dde: c8 18 sub r12, r8 - de0: d1 08 sbc r13, r1 - de2: 4c 14 cp r4, r12 - de4: 5d 04 cpc r5, r13 - de6: 08 f4 brcc .+2 ; 0xdea - de8: 62 01 movw r12, r4 + dfc: 61 01 movw r12, r2 + dfe: c8 18 sub r12, r8 + e00: d1 08 sbc r13, r1 + e02: 4c 14 cp r4, r12 + e04: 5d 04 cpc r5, r13 + e06: 08 f4 brcc .+2 ; 0xe0a + e08: 62 01 movw r12, r4 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - dea: 60 93 66 06 sts 0x0666, r22 + e0a: 60 93 66 06 sts 0x0666, r22 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - dee: 10 93 a0 09 sts 0x09A0, r17 + e0e: 10 93 a0 09 sts 0x09A0, r17 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - df2: 80 91 a1 09 lds r24, 0x09A1 - df6: 86 ff sbrs r24, 6 - df8: fc cf rjmp .-8 ; 0xdf2 + e12: 80 91 a1 09 lds r24, 0x09A1 + e16: 86 ff sbrs r24, 6 + e18: fc cf rjmp .-8 ; 0xe12 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - dfa: 21 83 std Z+1, r18 ; 0x01 + e1a: 21 83 std Z+1, r18 ; 0x01 return MEMORY_FLASH_USART.DATA; - dfc: 80 91 a0 09 lds r24, 0x09A0 + e1c: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e00: 10 92 a0 09 sts 0x09A0, r1 + e20: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e04: 80 91 a1 09 lds r24, 0x09A1 - e08: 86 ff sbrs r24, 6 - e0a: fc cf rjmp .-8 ; 0xe04 + e24: 80 91 a1 09 lds r24, 0x09A1 + e28: 86 ff sbrs r24, 6 + e2a: fc cf rjmp .-8 ; 0xe24 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e0c: 21 83 std Z+1, r18 ; 0x01 + e2c: 21 83 std Z+1, r18 ; 0x01 return MEMORY_FLASH_USART.DATA; - e0e: 80 91 a0 09 lds r24, 0x09A0 + e2e: 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; - e12: 30 93 65 06 sts 0x0665, r19 + e32: 30 93 65 06 sts 0x0665, r19 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashMemoryToBuffer(uint16_t PageAddress) { while(FlashIsBusy()); - e16: 87 ff sbrs r24, 7 - e18: e8 cf rjmp .-48 ; 0xdea + e36: 87 ff sbrs r24, 7 + e38: e8 cf rjmp .-48 ; 0xe0a MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e1a: d3 01 movw r26, r6 - e1c: 16 96 adiw r26, 0x06 ; 6 - e1e: 3c 93 st X, r19 + e3a: d3 01 movw r26, r6 + e3c: 16 96 adiw r26, 0x06 ; 6 + e3e: 3c 93 st X, r19 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e20: b3 e5 ldi r27, 0x53 ; 83 - e22: b0 93 a0 09 sts 0x09A0, r27 + e40: b3 e5 ldi r27, 0x53 ; 83 + e42: b0 93 a0 09 sts 0x09A0, r27 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e26: 80 91 a1 09 lds r24, 0x09A1 - e2a: 86 ff sbrs r24, 6 - e2c: fc cf rjmp .-8 ; 0xe26 + e46: 80 91 a1 09 lds r24, 0x09A1 + e4a: 86 ff sbrs r24, 6 + e4c: fc cf rjmp .-8 ; 0xe46 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e2e: 51 83 std Z+1, r21 ; 0x01 + e4e: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - e30: 80 91 a0 09 lds r24, 0x09A0 + e50: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e34: f0 92 a0 09 sts 0x09A0, r15 + e54: f0 92 a0 09 sts 0x09A0, r15 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e38: 80 91 a1 09 lds r24, 0x09A1 - e3c: 86 ff sbrs r24, 6 - e3e: fc cf rjmp .-8 ; 0xe38 + e58: 80 91 a1 09 lds r24, 0x09A1 + e5c: 86 ff sbrs r24, 6 + e5e: fc cf rjmp .-8 ; 0xe58 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e40: 51 83 std Z+1, r21 ; 0x01 + e60: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - e42: 80 91 a0 09 lds r24, 0x09A0 + e62: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e46: e0 92 a0 09 sts 0x09A0, r14 + e66: e0 92 a0 09 sts 0x09A0, r14 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e4a: 80 91 a1 09 lds r24, 0x09A1 - e4e: 86 ff sbrs r24, 6 - e50: fc cf rjmp .-8 ; 0xe4a + e6a: 80 91 a1 09 lds r24, 0x09A1 + e6e: 86 ff sbrs r24, 6 + e70: fc cf rjmp .-8 ; 0xe6a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e52: 51 83 std Z+1, r21 ; 0x01 + e72: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - e54: 80 91 a0 09 lds r24, 0x09A0 + e74: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e58: 10 92 a0 09 sts 0x09A0, r1 + e78: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e5c: 80 91 a1 09 lds r24, 0x09A1 - e60: 86 ff sbrs r24, 6 - e62: fc cf rjmp .-8 ; 0xe5c + e7c: 80 91 a1 09 lds r24, 0x09A1 + e80: 86 ff sbrs r24, 6 + e82: fc cf rjmp .-8 ; 0xe7c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e64: 51 83 std Z+1, r21 ; 0x01 + e84: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - e66: 80 91 a0 09 lds r24, 0x09A0 + e86: 80 91 a0 09 lds r24, 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; - e6a: 00 93 65 06 sts 0x0665, r16 + e8a: 00 93 65 06 sts 0x0665, r16 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e6e: 30 93 66 06 sts 0x0666, r19 + e8e: 30 93 66 06 sts 0x0666, r19 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e72: 40 93 a0 09 sts 0x09A0, r20 + e92: 40 93 a0 09 sts 0x09A0, r20 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e76: 80 91 a1 09 lds r24, 0x09A1 - e7a: 86 ff sbrs r24, 6 - e7c: fc cf rjmp .-8 ; 0xe76 + e96: 80 91 a1 09 lds r24, 0x09A1 + e9a: 86 ff sbrs r24, 6 + e9c: fc cf rjmp .-8 ; 0xe96 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e7e: 21 83 std Z+1, r18 ; 0x01 + e9e: 21 83 std Z+1, r18 ; 0x01 return MEMORY_FLASH_USART.DATA; - e80: 80 91 a0 09 lds r24, 0x09A0 + ea0: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - e84: 10 92 a0 09 sts 0x09A0, r1 + ea4: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - e88: 80 91 a1 09 lds r24, 0x09A1 - e8c: 86 ff sbrs r24, 6 - e8e: fc cf rjmp .-8 ; 0xe88 + ea8: 80 91 a1 09 lds r24, 0x09A1 + eac: 86 ff sbrs r24, 6 + eae: fc cf rjmp .-8 ; 0xea8 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - e90: 21 83 std Z+1, r18 ; 0x01 + eb0: 21 83 std Z+1, r18 ; 0x01 return MEMORY_FLASH_USART.DATA; - e92: 80 91 a0 09 lds r24, 0x09A0 + eb2: 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; - e96: 30 93 65 06 sts 0x0665, r19 + eb6: 30 93 65 06 sts 0x0665, r19 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWriteBuffer(const void* Buffer, uint8_t Address, uint16_t ByteCount) { while(FlashIsBusy()); - e9a: 87 ff sbrs r24, 7 - e9c: e8 cf rjmp .-48 ; 0xe6e + eba: 87 ff sbrs r24, 7 + ebc: e8 cf rjmp .-48 ; 0xe8e MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - e9e: d3 01 movw r26, r6 - ea0: 16 96 adiw r26, 0x06 ; 6 - ea2: 3c 93 st X, r19 + ebe: d3 01 movw r26, r6 + ec0: 16 96 adiw r26, 0x06 ; 6 + ec2: 3c 93 st X, r19 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - ea4: b4 e8 ldi r27, 0x84 ; 132 - ea6: b0 93 a0 09 sts 0x09A0, r27 + ec4: b4 e8 ldi r27, 0x84 ; 132 + ec6: b0 93 a0 09 sts 0x09A0, r27 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - eaa: 80 91 a1 09 lds r24, 0x09A1 - eae: 86 ff sbrs r24, 6 - eb0: fc cf rjmp .-8 ; 0xeaa + eca: 80 91 a1 09 lds r24, 0x09A1 + ece: 86 ff sbrs r24, 6 + ed0: fc cf rjmp .-8 ; 0xeca MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - eb2: 51 83 std Z+1, r21 ; 0x01 + ed2: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - eb4: 80 91 a0 09 lds r24, 0x09A0 + ed4: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - eb8: 10 92 a0 09 sts 0x09A0, r1 + ed8: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ebc: 80 91 a1 09 lds r24, 0x09A1 - ec0: 86 ff sbrs r24, 6 - ec2: fc cf rjmp .-8 ; 0xebc + edc: 80 91 a1 09 lds r24, 0x09A1 + ee0: 86 ff sbrs r24, 6 + ee2: fc cf rjmp .-8 ; 0xedc MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ec4: 51 83 std Z+1, r21 ; 0x01 + ee4: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - ec6: 80 91 a0 09 lds r24, 0x09A0 + ee6: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - eca: 10 92 a0 09 sts 0x09A0, r1 + eea: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ece: 80 91 a1 09 lds r24, 0x09A1 - ed2: 86 ff sbrs r24, 6 - ed4: fc cf rjmp .-8 ; 0xece + eee: 80 91 a1 09 lds r24, 0x09A1 + ef2: 86 ff sbrs r24, 6 + ef4: fc cf rjmp .-8 ; 0xeee MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ed6: 51 83 std Z+1, r21 ; 0x01 + ef6: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - ed8: 80 91 a0 09 lds r24, 0x09A0 + ef8: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - edc: 90 93 a0 09 sts 0x09A0, r25 + efc: 90 93 a0 09 sts 0x09A0, r25 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - ee0: 80 91 a1 09 lds r24, 0x09A1 - ee4: 86 ff sbrs r24, 6 - ee6: fc cf rjmp .-8 ; 0xee0 + f00: 80 91 a1 09 lds r24, 0x09A1 + f04: 86 ff sbrs r24, 6 + f06: fc cf rjmp .-8 ; 0xf00 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - ee8: 51 83 std Z+1, r21 ; 0x01 + f08: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - eea: 80 91 a0 09 lds r24, 0x09A0 + f0a: 80 91 a0 09 lds r24, 0x09A0 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - eee: c1 14 cp r12, r1 - ef0: d1 04 cpc r13, r1 - ef2: d9 f0 breq .+54 ; 0xf2a - ef4: c6 01 movw r24, r12 + f0e: c1 14 cp r12, r1 + f10: d1 04 cpc r13, r1 + f12: d9 f0 breq .+54 ; 0xf4a + f14: c6 01 movw r24, r12 } } INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; - ef6: ab 81 ldd r26, Y+3 ; 0x03 - ef8: ad 83 std Y+5, r26 ; 0x05 - efa: bc 81 ldd r27, Y+4 ; 0x04 - efc: be 83 std Y+6, r27 ; 0x06 - efe: c9 82 std Y+1, r12 ; 0x01 - f00: da 82 std Y+2, r13 ; 0x02 - f02: ad 81 ldd r26, Y+5 ; 0x05 - f04: be 81 ldd r27, Y+6 ; 0x06 + f16: ab 81 ldd r26, Y+3 ; 0x03 + f18: ad 83 std Y+5, r26 ; 0x05 + f1a: bc 81 ldd r27, Y+4 ; 0x04 + f1c: be 83 std Y+6, r27 ; 0x06 + f1e: c9 82 std Y+1, r12 ; 0x01 + f20: da 82 std Y+2, r13 ; 0x02 + f22: ad 81 ldd r26, Y+5 ; 0x05 + f24: be 81 ldd r27, Y+6 ; 0x06 while(ByteCount-- > 0) { MEMORY_FLASH_USART.DATA = *ByteBuffer++; - f06: 7d 91 ld r23, X+ - f08: 70 93 a0 09 sts 0x09A0, r23 - f0c: 6d 01 movw r12, r26 - f0e: dc 01 movw r26, r24 + f26: 7d 91 ld r23, X+ + f28: 70 93 a0 09 sts 0x09A0, r23 + f2c: 6d 01 movw r12, r26 + f2e: dc 01 movw r26, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f10: 80 91 a1 09 lds r24, 0x09A1 - f14: 86 ff sbrs r24, 6 - f16: fc cf rjmp .-8 ; 0xf10 - f18: cd 01 movw r24, r26 - f1a: d6 01 movw r26, r12 + f30: 80 91 a1 09 lds r24, 0x09A1 + f34: 86 ff sbrs r24, 6 + f36: fc cf rjmp .-8 ; 0xf30 + f38: cd 01 movw r24, r26 + f3a: d6 01 movw r26, r12 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f1c: 21 83 std Z+1, r18 ; 0x01 + f3c: 21 83 std Z+1, r18 ; 0x01 MEMORY_FLASH_USART.DATA; /* Flush Buffer */ - f1e: 70 91 a0 09 lds r23, 0x09A0 - f22: 01 97 sbiw r24, 0x01 ; 1 + f3e: 70 91 a0 09 lds r23, 0x09A0 + f42: 01 97 sbiw r24, 0x01 ; 1 INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { uint8_t* ByteBuffer = (uint8_t*) Buffer; while(ByteCount-- > 0) { - f24: 81 f7 brne .-32 ; 0xf06 - f26: c9 80 ldd r12, Y+1 ; 0x01 - f28: da 80 ldd r13, Y+2 ; 0x02 + f44: 81 f7 brne .-32 ; 0xf26 + f46: c9 80 ldd r12, Y+1 ; 0x01 + f48: da 80 ldd r13, Y+2 ; 0x02 SPITransferByte(FLASH_CMD_BUF1_WRITE); SPITransferByte( 0 ); SPITransferByte( 0 ); SPITransferByte( Address ); SPIWriteBlock(Buffer, ByteCount); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - f2a: 00 93 65 06 sts 0x0665, r16 + f4a: 00 93 65 06 sts 0x0665, r16 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f2e: 30 93 66 06 sts 0x0666, r19 + f4e: 30 93 66 06 sts 0x0666, r19 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f32: 40 93 a0 09 sts 0x09A0, r20 + f52: 40 93 a0 09 sts 0x09A0, r20 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f36: 80 91 a1 09 lds r24, 0x09A1 - f3a: 86 ff sbrs r24, 6 - f3c: fc cf rjmp .-8 ; 0xf36 + f56: 80 91 a1 09 lds r24, 0x09A1 + f5a: 86 ff sbrs r24, 6 + f5c: fc cf rjmp .-8 ; 0xf56 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f3e: 21 83 std Z+1, r18 ; 0x01 + f5e: 21 83 std Z+1, r18 ; 0x01 return MEMORY_FLASH_USART.DATA; - f40: 80 91 a0 09 lds r24, 0x09A0 + f60: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f44: 10 92 a0 09 sts 0x09A0, r1 + f64: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f48: 80 91 a1 09 lds r24, 0x09A1 - f4c: 86 ff sbrs r24, 6 - f4e: fc cf rjmp .-8 ; 0xf48 + f68: 80 91 a1 09 lds r24, 0x09A1 + f6c: 86 ff sbrs r24, 6 + f6e: fc cf rjmp .-8 ; 0xf68 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f50: 21 83 std Z+1, r18 ; 0x01 + f70: 21 83 std Z+1, r18 ; 0x01 return MEMORY_FLASH_USART.DATA; - f52: 80 91 a0 09 lds r24, 0x09A0 + f72: 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; - f56: 30 93 65 06 sts 0x0665, r19 + f76: 30 93 65 06 sts 0x0665, r19 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashBufferToMemory(uint16_t PageAddress) { while(FlashIsBusy()); - f5a: 87 ff sbrs r24, 7 - f5c: e8 cf rjmp .-48 ; 0xf2e + f7a: 87 ff sbrs r24, 7 + f7c: e8 cf rjmp .-48 ; 0xf4e MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - f5e: d3 01 movw r26, r6 - f60: 16 96 adiw r26, 0x06 ; 6 - f62: 3c 93 st X, r19 + f7e: d3 01 movw r26, r6 + f80: 16 96 adiw r26, 0x06 ; 6 + f82: 3c 93 st X, r19 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f64: b3 e8 ldi r27, 0x83 ; 131 - f66: b0 93 a0 09 sts 0x09A0, r27 + f84: b3 e8 ldi r27, 0x83 ; 131 + f86: b0 93 a0 09 sts 0x09A0, r27 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f6a: 80 91 a1 09 lds r24, 0x09A1 - f6e: 86 ff sbrs r24, 6 - f70: fc cf rjmp .-8 ; 0xf6a + f8a: 80 91 a1 09 lds r24, 0x09A1 + f8e: 86 ff sbrs r24, 6 + f90: fc cf rjmp .-8 ; 0xf8a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f72: 51 83 std Z+1, r21 ; 0x01 + f92: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - f74: 80 91 a0 09 lds r24, 0x09A0 + f94: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f78: f0 92 a0 09 sts 0x09A0, r15 + f98: f0 92 a0 09 sts 0x09A0, r15 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f7c: 80 91 a1 09 lds r24, 0x09A1 - f80: 86 ff sbrs r24, 6 - f82: fc cf rjmp .-8 ; 0xf7c + f9c: 80 91 a1 09 lds r24, 0x09A1 + fa0: 86 ff sbrs r24, 6 + fa2: fc cf rjmp .-8 ; 0xf9c MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f84: 51 83 std Z+1, r21 ; 0x01 + fa4: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - f86: 80 91 a0 09 lds r24, 0x09A0 + fa6: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f8a: e0 92 a0 09 sts 0x09A0, r14 + faa: e0 92 a0 09 sts 0x09A0, r14 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - f8e: 80 91 a1 09 lds r24, 0x09A1 - f92: 86 ff sbrs r24, 6 - f94: fc cf rjmp .-8 ; 0xf8e + fae: 80 91 a1 09 lds r24, 0x09A1 + fb2: 86 ff sbrs r24, 6 + fb4: fc cf rjmp .-8 ; 0xfae MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - f96: 51 83 std Z+1, r21 ; 0x01 + fb6: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - f98: 80 91 a0 09 lds r24, 0x09A0 + fb8: 80 91 a0 09 lds r24, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - f9c: 10 92 a0 09 sts 0x09A0, r1 + fbc: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - fa0: 80 91 a1 09 lds r24, 0x09A1 - fa4: 86 ff sbrs r24, 6 - fa6: fc cf rjmp .-8 ; 0xfa0 + fc0: 80 91 a1 09 lds r24, 0x09A1 + fc4: 86 ff sbrs r24, 6 + fc6: fc cf rjmp .-8 ; 0xfc0 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - fa8: 51 83 std Z+1, r21 ; 0x01 + fc8: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - faa: 80 91 a0 09 lds r24, 0x09A0 + fca: 80 91 a0 09 lds r24, 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; - fae: 00 93 65 06 sts 0x0665, r16 + fce: 00 93 65 06 sts 0x0665, r16 FlashMemoryToBuffer(PageAddress); FlashWriteBuffer(Buffer, ByteAddress, PageBytes); FlashBufferToMemory(PageAddress); ByteCount -= PageBytes; - fb2: 4c 18 sub r4, r12 - fb4: 5d 08 sbc r5, r13 + fd2: 4c 18 sub r4, r12 + fd4: 5d 08 sbc r5, r13 Address += PageBytes; - fb6: c6 01 movw r24, r12 - fb8: a0 e0 ldi r26, 0x00 ; 0 - fba: b0 e0 ldi r27, 0x00 ; 0 - fbc: 88 0e add r8, r24 - fbe: 99 1e adc r9, r25 - fc0: aa 1e adc r10, r26 - fc2: bb 1e adc r11, r27 + fd6: c6 01 movw r24, r12 + fd8: a0 e0 ldi r26, 0x00 ; 0 + fda: b0 e0 ldi r27, 0x00 ; 0 + fdc: 88 0e add r8, r24 + fde: 99 1e adc r9, r25 + fe0: aa 1e adc r10, r26 + fe2: bb 1e adc r11, r27 MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { while(ByteCount > 0) { - fc4: 41 14 cp r4, r1 - fc6: 51 04 cpc r5, r1 - fc8: 09 f0 breq .+2 ; 0xfcc - fca: 02 cf rjmp .-508 ; 0xdd0 + fe4: 41 14 cp r4, r1 + fe6: 51 04 cpc r5, r1 + fe8: 09 f0 breq .+2 ; 0xfec + fea: 02 cf rjmp .-508 ; 0xdf0 void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; FlashWrite(Buffer, FlashAddress, ByteCount); } - fcc: 26 96 adiw r28, 0x06 ; 6 - fce: cd bf out 0x3d, r28 ; 61 - fd0: de bf out 0x3e, r29 ; 62 - fd2: df 91 pop r29 - fd4: cf 91 pop r28 - fd6: 1f 91 pop r17 - fd8: 0f 91 pop r16 - fda: ff 90 pop r15 - fdc: ef 90 pop r14 - fde: df 90 pop r13 - fe0: cf 90 pop r12 - fe2: bf 90 pop r11 - fe4: af 90 pop r10 - fe6: 9f 90 pop r9 - fe8: 8f 90 pop r8 - fea: 7f 90 pop r7 - fec: 6f 90 pop r6 - fee: 5f 90 pop r5 - ff0: 4f 90 pop r4 - ff2: 3f 90 pop r3 - ff4: 2f 90 pop r2 - ff6: 08 95 ret + fec: 26 96 adiw r28, 0x06 ; 6 + fee: cd bf out 0x3d, r28 ; 61 + ff0: de bf out 0x3e, r29 ; 62 + ff2: df 91 pop r29 + ff4: cf 91 pop r28 + ff6: 1f 91 pop r17 + ff8: 0f 91 pop r16 + ffa: ff 90 pop r15 + ffc: ef 90 pop r14 + ffe: df 90 pop r13 + 1000: cf 90 pop r12 + 1002: bf 90 pop r11 + 1004: af 90 pop r10 + 1006: 9f 90 pop r9 + 1008: 8f 90 pop r8 + 100a: 7f 90 pop r7 + 100c: 6f 90 pop r6 + 100e: 5f 90 pop r5 + 1010: 4f 90 pop r4 + 1012: 3f 90 pop r3 + 1014: 2f 90 pop r2 + 1016: 08 95 ret -00000ff8 : +00001018 : void MemoryClear(void) { - ff8: 1f 93 push r17 - ffa: cf 93 push r28 - ffc: df 93 push r29 + 1018: 1f 93 push r17 + 101a: cf 93 push r28 + 101c: df 93 push r29 uint32_t PageAddress = ((uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING) / MEMORY_PAGE_SIZE; - ffe: 80 91 0d 21 lds r24, 0x210D - 1002: 90 e0 ldi r25, 0x00 ; 0 - 1004: a0 e0 ldi r26, 0x00 ; 0 - 1006: b0 e0 ldi r27, 0x00 ; 0 - 1008: ba 2f mov r27, r26 - 100a: a9 2f mov r26, r25 - 100c: 98 2f mov r25, r24 - 100e: 88 27 eor r24, r24 + 101e: 80 91 0d 21 lds r24, 0x210D + 1022: 90 e0 ldi r25, 0x00 ; 0 + 1024: a0 e0 ldi r26, 0x00 ; 0 + 1026: b0 e0 ldi r27, 0x00 ; 0 + 1028: ba 2f mov r27, r26 + 102a: a9 2f mov r26, r25 + 102c: 98 2f mov r25, r24 + 102e: 88 27 eor r24, r24 { uint32_t FlashAddress = (uint32_t) Address + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; FlashWrite(Buffer, FlashAddress, ByteCount); } void MemoryClear(void) - 1010: 9c 01 movw r18, r24 - 1012: 20 50 subi r18, 0x00 ; 0 - 1014: 3f 4f sbci r19, 0xFF ; 255 + 1030: 9c 01 movw r18, r24 + 1032: 20 50 subi r18, 0x00 ; 0 + 1034: 3f 4f sbci r19, 0xFF ; 255 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 1016: a0 e6 ldi r26, 0x60 ; 96 - 1018: b6 e0 ldi r27, 0x06 ; 6 - 101a: d0 e1 ldi r29, 0x10 ; 16 - 101c: 60 e1 ldi r22, 0x10 ; 16 + 1036: a0 e6 ldi r26, 0x60 ; 96 + 1038: b6 e0 ldi r27, 0x06 ; 6 + 103a: d0 e1 ldi r29, 0x10 ; 16 + 103c: 60 e1 ldi r22, 0x10 ; 16 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 101e: 77 ed ldi r23, 0xD7 ; 215 + 103e: 77 ed ldi r23, 0xD7 ; 215 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1020: e0 ea ldi r30, 0xA0 ; 160 - 1022: f9 e0 ldi r31, 0x09 ; 9 + 1040: e0 ea ldi r30, 0xA0 ; 160 + 1042: f9 e0 ldi r31, 0x09 ; 9 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1024: c0 e4 ldi r28, 0x40 ; 64 - 1026: 50 e4 ldi r21, 0x40 ; 64 + 1044: c0 e4 ldi r28, 0x40 ; 64 + 1046: 50 e4 ldi r21, 0x40 ; 64 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1028: 11 e8 ldi r17, 0x81 ; 129 + 1048: 11 e8 ldi r17, 0x81 ; 129 INLINE uint8_t FlashReadStatusRegister(void) { uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 102a: 16 96 adiw r26, 0x06 ; 6 - 102c: 6c 93 st X, r22 - 102e: 16 97 sbiw r26, 0x06 ; 6 + 104a: 16 96 adiw r26, 0x06 ; 6 + 104c: 6c 93 st X, r22 + 104e: 16 97 sbiw r26, 0x06 ; 6 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1030: 70 93 a0 09 sts 0x09A0, r23 + 1050: 70 93 a0 09 sts 0x09A0, r23 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1034: 40 91 a1 09 lds r20, 0x09A1 - 1038: 46 ff sbrs r20, 6 - 103a: fc cf rjmp .-8 ; 0x1034 + 1054: 40 91 a1 09 lds r20, 0x09A1 + 1058: 46 ff sbrs r20, 6 + 105a: fc cf rjmp .-8 ; 0x1054 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 103c: 51 83 std Z+1, r21 ; 0x01 + 105c: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - 103e: 40 91 a0 09 lds r20, 0x09A0 + 105e: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1042: 10 92 a0 09 sts 0x09A0, r1 + 1062: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1046: 40 91 a1 09 lds r20, 0x09A1 - 104a: 46 ff sbrs r20, 6 - 104c: fc cf rjmp .-8 ; 0x1046 + 1066: 40 91 a1 09 lds r20, 0x09A1 + 106a: 46 ff sbrs r20, 6 + 106c: fc cf rjmp .-8 ; 0x1066 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 104e: 51 83 std Z+1, r21 ; 0x01 + 106e: 51 83 std Z+1, r21 ; 0x01 return MEMORY_FLASH_USART.DATA; - 1050: 40 91 a0 09 lds r20, 0x09A0 + 1070: 40 91 a0 09 lds r20, 0x09A0 uint8_t Register; MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_STATUS_REG_READ); Register = SPITransferByte(0); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 1054: 15 96 adiw r26, 0x05 ; 5 - 1056: 6c 93 st X, r22 - 1058: 15 97 sbiw r26, 0x05 ; 5 + 1074: 15 96 adiw r26, 0x05 ; 5 + 1076: 6c 93 st X, r22 + 1078: 15 97 sbiw r26, 0x05 ; 5 } } INLINE void FlashClearPage(uint16_t PageAddress) { while(FlashIsBusy()); - 105a: 47 ff sbrs r20, 7 - 105c: e6 cf rjmp .-52 ; 0x102a + 107a: 47 ff sbrs r20, 7 + 107c: e6 cf rjmp .-52 ; 0x104a MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; - 105e: 16 96 adiw r26, 0x06 ; 6 - 1060: dc 93 st X, r29 - 1062: 16 97 sbiw r26, 0x06 ; 6 + 107e: 16 96 adiw r26, 0x06 ; 6 + 1080: dc 93 st X, r29 + 1082: 16 97 sbiw r26, 0x06 ; 6 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1064: 10 93 a0 09 sts 0x09A0, r17 + 1084: 10 93 a0 09 sts 0x09A0, r17 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 1068: 40 91 a1 09 lds r20, 0x09A1 - 106c: 46 ff sbrs r20, 6 - 106e: fc cf rjmp .-8 ; 0x1068 + 1088: 40 91 a1 09 lds r20, 0x09A1 + 108c: 46 ff sbrs r20, 6 + 108e: fc cf rjmp .-8 ; 0x1088 MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1070: c1 83 std Z+1, r28 ; 0x01 + 1090: c1 83 std Z+1, r28 ; 0x01 return MEMORY_FLASH_USART.DATA; - 1072: 40 91 a0 09 lds r20, 0x09A0 + 1092: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1076: 90 93 a0 09 sts 0x09A0, r25 + 1096: 90 93 a0 09 sts 0x09A0, r25 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 107a: 40 91 a1 09 lds r20, 0x09A1 - 107e: 46 ff sbrs r20, 6 - 1080: fc cf rjmp .-8 ; 0x107a + 109a: 40 91 a1 09 lds r20, 0x09A1 + 109e: 46 ff sbrs r20, 6 + 10a0: fc cf rjmp .-8 ; 0x109a MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1082: c1 83 std Z+1, r28 ; 0x01 + 10a2: c1 83 std Z+1, r28 ; 0x01 return MEMORY_FLASH_USART.DATA; - 1084: 40 91 a0 09 lds r20, 0x09A0 + 10a4: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 1088: 80 93 a0 09 sts 0x09A0, r24 + 10a8: 80 93 a0 09 sts 0x09A0, r24 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 108c: 40 91 a1 09 lds r20, 0x09A1 - 1090: 46 ff sbrs r20, 6 - 1092: fc cf rjmp .-8 ; 0x108c + 10ac: 40 91 a1 09 lds r20, 0x09A1 + 10b0: 46 ff sbrs r20, 6 + 10b2: fc cf rjmp .-8 ; 0x10ac MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 1094: c1 83 std Z+1, r28 ; 0x01 + 10b4: c1 83 std Z+1, r28 ; 0x01 return MEMORY_FLASH_USART.DATA; - 1096: 40 91 a0 09 lds r20, 0x09A0 + 10b6: 40 91 a0 09 lds r20, 0x09A0 #define FLASH_STATUS_REG_PROTECT_BIT (1<<1) #define FLASH_STATUS_REG_PAGESIZE_BIT (1<<0) INLINE uint8_t SPITransferByte(uint8_t Data) { MEMORY_FLASH_USART.DATA = Data; - 109a: 10 92 a0 09 sts 0x09A0, r1 + 10ba: 10 92 a0 09 sts 0x09A0, r1 while (!(MEMORY_FLASH_USART.STATUS & USART_TXCIF_bm)); - 109e: 40 91 a1 09 lds r20, 0x09A1 - 10a2: 46 ff sbrs r20, 6 - 10a4: fc cf rjmp .-8 ; 0x109e + 10be: 40 91 a1 09 lds r20, 0x09A1 + 10c2: 46 ff sbrs r20, 6 + 10c4: fc cf rjmp .-8 ; 0x10be MEMORY_FLASH_USART.STATUS = USART_TXCIF_bm; - 10a6: c1 83 std Z+1, r28 ; 0x01 + 10c6: c1 83 std Z+1, r28 ; 0x01 return MEMORY_FLASH_USART.DATA; - 10a8: 40 91 a0 09 lds r20, 0x09A0 + 10c8: 40 91 a0 09 lds r20, 0x09A0 MEMORY_FLASH_PORT.OUTCLR = MEMORY_FLASH_CS; SPITransferByte(FLASH_CMD_PAGE_ERASE); SPITransferByte( (PageAddress >> 8) & 0xFF ); SPITransferByte( (PageAddress >> 0) & 0xFF ); SPITransferByte( 0 ); MEMORY_FLASH_PORT.OUTSET = MEMORY_FLASH_CS; - 10ac: 15 96 adiw r26, 0x05 ; 5 - 10ae: dc 93 st X, r29 - 10b0: 15 97 sbiw r26, 0x05 ; 5 - 10b2: 01 96 adiw r24, 0x01 ; 1 + 10cc: 15 96 adiw r26, 0x05 ; 5 + 10ce: dc 93 st X, r29 + 10d0: 15 97 sbiw r26, 0x05 ; 5 + 10d2: 01 96 adiw r24, 0x01 ; 1 void MemoryClear(void) { uint32_t PageAddress = ((uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING) / MEMORY_PAGE_SIZE; uint16_t PageCount = MEMORY_SIZE_PER_SETTING / MEMORY_PAGE_SIZE; while(PageCount > 0) { - 10b4: 82 17 cp r24, r18 - 10b6: 93 07 cpc r25, r19 - 10b8: 09 f0 breq .+2 ; 0x10bc - 10ba: b7 cf rjmp .-146 ; 0x102a + 10d4: 82 17 cp r24, r18 + 10d6: 93 07 cpc r25, r19 + 10d8: 09 f0 breq .+2 ; 0x10dc + 10da: b7 cf rjmp .-146 ; 0x104a FlashClearPage(PageAddress); PageCount--; PageAddress++; } } - 10bc: df 91 pop r29 - 10be: cf 91 pop r28 - 10c0: 1f 91 pop r17 - 10c2: 08 95 ret + 10dc: df 91 pop r29 + 10de: cf 91 pop r28 + 10e0: 1f 91 pop r17 + 10e2: 08 95 ret -000010c4 : +000010e4 : bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - 10c4: 0f 93 push r16 - 10c6: 1f 93 push r17 - 10c8: fc 01 movw r30, r24 + 10e4: 0f 93 push r16 + 10e6: 1f 93 push r17 + 10e8: fc 01 movw r30, r24 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 10ca: 40 30 cpi r20, 0x00 ; 0 - 10cc: 80 e0 ldi r24, 0x00 ; 0 - 10ce: 58 07 cpc r21, r24 - 10d0: 81 e0 ldi r24, 0x01 ; 1 - 10d2: 68 07 cpc r22, r24 - 10d4: 80 e0 ldi r24, 0x00 ; 0 - 10d6: 78 07 cpc r23, r24 - 10d8: 20 f0 brcs .+8 ; 0x10e2 + 10ea: 40 30 cpi r20, 0x00 ; 0 + 10ec: 80 e0 ldi r24, 0x00 ; 0 + 10ee: 58 07 cpc r21, r24 + 10f0: 81 e0 ldi r24, 0x01 ; 1 + 10f2: 68 07 cpc r22, r24 + 10f4: 80 e0 ldi r24, 0x00 ; 0 + 10f6: 78 07 cpc r23, r24 + 10f8: 20 f0 brcs .+8 ; 0x1102 uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); MemoryWriteBlock(Buffer, BlockAddress, ByteCount); return true; } } - 10da: 81 e0 ldi r24, 0x01 ; 1 - 10dc: 1f 91 pop r17 - 10de: 0f 91 pop r16 - 10e0: 08 95 ret + 10fa: 81 e0 ldi r24, 0x01 ; 1 + 10fc: 1f 91 pop r17 + 10fe: 0f 91 pop r16 + 1100: 08 95 ret if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { /* Prevent writing out of bounds by silently ignoring it */ return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - 10e2: 80 e0 ldi r24, 0x00 ; 0 - 10e4: 90 e0 ldi r25, 0x00 ; 0 - 10e6: a1 e0 ldi r26, 0x01 ; 1 - 10e8: b0 e0 ldi r27, 0x00 ; 0 - 10ea: 84 1b sub r24, r20 - 10ec: 95 0b sbc r25, r21 - 10ee: a6 0b sbc r26, r22 - 10f0: b7 0b sbc r27, r23 + 1102: 80 e0 ldi r24, 0x00 ; 0 + 1104: 90 e0 ldi r25, 0x00 ; 0 + 1106: a1 e0 ldi r26, 0x01 ; 1 + 1108: b0 e0 ldi r27, 0x00 ; 0 + 110a: 84 1b sub r24, r20 + 110c: 95 0b sbc r25, r21 + 110e: a6 0b sbc r26, r22 + 1110: b7 0b sbc r27, r23 ByteCount = MIN(ByteCount, BytesLeft); - 10f2: 89 01 movw r16, r18 - 10f4: 20 e0 ldi r18, 0x00 ; 0 - 10f6: 30 e0 ldi r19, 0x00 ; 0 - 10f8: 80 17 cp r24, r16 - 10fa: 91 07 cpc r25, r17 - 10fc: a2 07 cpc r26, r18 - 10fe: b3 07 cpc r27, r19 - 1100: 40 f0 brcs .+16 ; 0x1112 + 1112: 89 01 movw r16, r18 + 1114: 20 e0 ldi r18, 0x00 ; 0 + 1116: 30 e0 ldi r19, 0x00 ; 0 + 1118: 80 17 cp r24, r16 + 111a: 91 07 cpc r25, r17 + 111c: a2 07 cpc r26, r18 + 111e: b3 07 cpc r27, r19 + 1120: 40 f0 brcs .+16 ; 0x1132 MemoryWriteBlock(Buffer, BlockAddress, ByteCount); - 1102: cf 01 movw r24, r30 - 1104: ba 01 movw r22, r20 - 1106: a8 01 movw r20, r16 - 1108: 23 de rcall .-954 ; 0xd50 - 110a: 81 e0 ldi r24, 0x01 ; 1 + 1122: cf 01 movw r24, r30 + 1124: ba 01 movw r22, r20 + 1126: a8 01 movw r20, r16 + 1128: 23 de rcall .-954 ; 0xd70 + 112a: 81 e0 ldi r24, 0x01 ; 1 return true; } } - 110c: 1f 91 pop r17 - 110e: 0f 91 pop r16 - 1110: 08 95 ret - 1112: 8c 01 movw r16, r24 + 112c: 1f 91 pop r17 + 112e: 0f 91 pop r16 + 1130: 08 95 ret + 1132: 8c 01 movw r16, r24 /* Prevent writing out of bounds by silently ignoring it */ return true; } else { /* Calculate bytes left in memory and start writing */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); - 1114: 9d 01 movw r18, r26 - 1116: cf 01 movw r24, r30 + 1134: 9d 01 movw r18, r26 + 1136: cf 01 movw r24, r30 MemoryWriteBlock(Buffer, BlockAddress, ByteCount); - 1118: ba 01 movw r22, r20 - 111a: a8 01 movw r20, r16 - 111c: 19 de rcall .-974 ; 0xd50 - 111e: f5 cf rjmp .-22 ; 0x110a + 1138: ba 01 movw r22, r20 + 113a: a8 01 movw r20, r16 + 113c: 19 de rcall .-974 ; 0xd70 + 113e: f5 cf rjmp .-22 ; 0x112a -00001120 : - 1120: 0f 93 push r16 - 1122: 1f 93 push r17 +00001140 : + 1140: 0f 93 push r16 + 1142: 1f 93 push r17 return true; } } bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - 1124: fc 01 movw r30, r24 + 1144: fc 01 movw r30, r24 if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { - 1126: 40 30 cpi r20, 0x00 ; 0 - 1128: 80 e0 ldi r24, 0x00 ; 0 - 112a: 58 07 cpc r21, r24 - 112c: 81 e0 ldi r24, 0x01 ; 1 - 112e: 68 07 cpc r22, r24 - 1130: 80 e0 ldi r24, 0x00 ; 0 - 1132: 78 07 cpc r23, r24 - 1134: 20 f0 brcs .+8 ; 0x113e + 1146: 40 30 cpi r20, 0x00 ; 0 + 1148: 80 e0 ldi r24, 0x00 ; 0 + 114a: 58 07 cpc r21, r24 + 114c: 81 e0 ldi r24, 0x01 ; 1 + 114e: 68 07 cpc r22, r24 + 1150: 80 e0 ldi r24, 0x00 ; 0 + 1152: 78 07 cpc r23, r24 + 1154: 20 f0 brcs .+8 ; 0x115e /* There are bytes out of bounds to be read. Notify that we are done. */ return false; - 1136: 80 e0 ldi r24, 0x00 ; 0 + 1156: 80 e0 ldi r24, 0x00 ; 0 uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); MemoryReadBlock(Buffer, BlockAddress, ByteCount); return true; } } - 1138: 1f 91 pop r17 - 113a: 0f 91 pop r16 - 113c: 08 95 ret + 1158: 1f 91 pop r17 + 115a: 0f 91 pop r16 + 115c: 08 95 ret if (BlockAddress >= MEMORY_SIZE_PER_SETTING) { /* There are bytes out of bounds to be read. Notify that we are done. */ return false; } else { /* Calculate bytes left in memory and issue reading */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - 113e: 80 e0 ldi r24, 0x00 ; 0 - 1140: 90 e0 ldi r25, 0x00 ; 0 - 1142: a1 e0 ldi r26, 0x01 ; 1 - 1144: b0 e0 ldi r27, 0x00 ; 0 - 1146: 84 1b sub r24, r20 - 1148: 95 0b sbc r25, r21 - 114a: a6 0b sbc r26, r22 - 114c: b7 0b sbc r27, r23 + 115e: 80 e0 ldi r24, 0x00 ; 0 + 1160: 90 e0 ldi r25, 0x00 ; 0 + 1162: a1 e0 ldi r26, 0x01 ; 1 + 1164: b0 e0 ldi r27, 0x00 ; 0 + 1166: 84 1b sub r24, r20 + 1168: 95 0b sbc r25, r21 + 116a: a6 0b sbc r26, r22 + 116c: b7 0b sbc r27, r23 ByteCount = MIN(ByteCount, BytesLeft); - 114e: 89 01 movw r16, r18 - 1150: 20 e0 ldi r18, 0x00 ; 0 - 1152: 30 e0 ldi r19, 0x00 ; 0 - 1154: 80 17 cp r24, r16 - 1156: 91 07 cpc r25, r17 - 1158: a2 07 cpc r26, r18 - 115a: b3 07 cpc r27, r19 - 115c: 40 f0 brcs .+16 ; 0x116e + 116e: 89 01 movw r16, r18 + 1170: 20 e0 ldi r18, 0x00 ; 0 + 1172: 30 e0 ldi r19, 0x00 ; 0 + 1174: 80 17 cp r24, r16 + 1176: 91 07 cpc r25, r17 + 1178: a2 07 cpc r26, r18 + 117a: b3 07 cpc r27, r19 + 117c: 40 f0 brcs .+16 ; 0x118e MemoryReadBlock(Buffer, BlockAddress, ByteCount); - 115e: cf 01 movw r24, r30 - 1160: ba 01 movw r22, r20 - 1162: a8 01 movw r20, r16 - 1164: 6a dd rcall .-1324 ; 0xc3a - 1166: 81 e0 ldi r24, 0x01 ; 1 + 117e: cf 01 movw r24, r30 + 1180: ba 01 movw r22, r20 + 1182: a8 01 movw r20, r16 + 1184: 6a dd rcall .-1324 ; 0xc5a + 1186: 81 e0 ldi r24, 0x01 ; 1 return true; - 1168: 1f 91 pop r17 + 1188: 1f 91 pop r17 } } - 116a: 0f 91 pop r16 - 116c: 08 95 ret - 116e: 8c 01 movw r16, r24 + 118a: 0f 91 pop r16 + 118c: 08 95 ret + 118e: 8c 01 movw r16, r24 /* There are bytes out of bounds to be read. Notify that we are done. */ return false; } else { /* Calculate bytes left in memory and issue reading */ uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; ByteCount = MIN(ByteCount, BytesLeft); - 1170: 9d 01 movw r18, r26 - 1172: cf 01 movw r24, r30 + 1190: 9d 01 movw r18, r26 + 1192: cf 01 movw r24, r30 MemoryReadBlock(Buffer, BlockAddress, ByteCount); - 1174: ba 01 movw r22, r20 - 1176: a8 01 movw r20, r16 - 1178: 60 dd rcall .-1344 ; 0xc3a - 117a: 81 e0 ldi r24, 0x01 ; 1 - 117c: f5 cf rjmp .-22 ; 0x1168 + 1194: ba 01 movw r22, r20 + 1196: a8 01 movw r20, r16 + 1198: 60 dd rcall .-1344 ; 0xc5a + 119a: 81 e0 ldi r24, 0x01 ; 1 + 119c: f5 cf rjmp .-22 ; 0x1188 -0000117e : - [BUTTON_ACTION_UID_RIGHT_DECREMENT] = "UID_RIGHT_DECREMENT" +0000119e : + [BUTTON_ACTION_CYCLE_SETTINGS] = "CYCLE_SETTINGS" }; void ButtonInit(void) { BUTTON_PORT.DIRCLR = BUTTON_MASK; - 117e: e0 e0 ldi r30, 0x00 ; 0 - 1180: f6 e0 ldi r31, 0x06 ; 6 - 1182: 80 e4 ldi r24, 0x40 ; 64 - 1184: 82 83 std Z+2, r24 ; 0x02 + 119e: e0 e0 ldi r30, 0x00 ; 0 + 11a0: f6 e0 ldi r31, 0x06 ; 6 + 11a2: 80 e4 ldi r24, 0x40 ; 64 + 11a4: 82 83 std Z+2, r24 ; 0x02 BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; - 1186: 88 e1 ldi r24, 0x18 ; 24 - 1188: 86 8b std Z+22, r24 ; 0x16 + 11a6: 88 e1 ldi r24, 0x18 ; 24 + 11a8: 86 8b std Z+22, r24 ; 0x16 } - 118a: 08 95 ret + 11aa: 08 95 ret -0000118c : +000011ac : void ButtonTick(void) { - 118c: ff 92 push r15 - 118e: 0f 93 push r16 - 1190: 1f 93 push r17 - 1192: cf 93 push r28 - 1194: df 93 push r29 - 1196: cd b7 in r28, 0x3d ; 61 - 1198: de b7 in r29, 0x3e ; 62 - 119a: a0 97 sbiw r28, 0x20 ; 32 - 119c: cd bf out 0x3d, r28 ; 61 - 119e: de bf out 0x3e, r29 ; 62 + 11ac: ff 92 push r15 + 11ae: 0f 93 push r16 + 11b0: 1f 93 push r17 + 11b2: cf 93 push r28 + 11b4: df 93 push r29 + 11b6: cd b7 in r28, 0x3d ; 61 + 11b8: de b7 in r29, 0x3e ; 62 + 11ba: a0 97 sbiw r28, 0x20 ; 32 + 11bc: cd bf out 0x3d, r28 ; 61 + 11be: de bf out 0x3e, r29 ; 62 static uint8_t LastButtonState = 0; uint8_t ThisButtonState = ~BUTTON_PORT.IN; - 11a0: 90 91 08 06 lds r25, 0x0608 - 11a4: 90 95 com r25 + 11c0: 90 91 08 06 lds r25, 0x0608 + 11c4: 90 95 com r25 uint8_t ThisButtonChange = ThisButtonState ^ LastButtonState; - 11a6: 80 91 a2 20 lds r24, 0x20A2 - 11aa: 89 27 eor r24, r25 + 11c6: 80 91 a2 20 lds r24, 0x20A2 + 11ca: 89 27 eor r24, r25 uint8_t ThisButtonPress = ThisButtonChange & ThisButtonState; - 11ac: 89 23 and r24, r25 + 11cc: 89 23 and r24, r25 LastButtonState = ThisButtonState; - 11ae: 90 93 a2 20 sts 0x20A2, r25 + 11ce: 90 93 a2 20 sts 0x20A2, r25 if ( ThisButtonPress & BUTTON_MASK ) { - 11b2: 86 ff sbrs r24, 6 - 11b4: 15 c0 rjmp .+42 ; 0x11e0 + 11d2: 86 ff sbrs r24, 6 + 11d4: 15 c0 rjmp .+42 ; 0x1200 uint8_t UidBuffer[32]; ButtonActionEnum ButtonAction = GlobalSettings.ActiveSettingPtr->ButtonAction; - 11b6: e0 91 0e 21 lds r30, 0x210E - 11ba: f0 91 0f 21 lds r31, 0x210F - 11be: 80 81 ld r24, Z + 11d6: e0 91 0e 21 lds r30, 0x210E + 11da: f0 91 0f 21 lds r31, 0x210F + 11de: 80 81 ld r24, Z if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { - 11c0: 81 30 cpi r24, 0x01 ; 1 - 11c2: b9 f0 breq .+46 ; 0x11f2 + 11e0: 81 30 cpi r24, 0x01 ; 1 + 11e2: b9 f0 breq .+46 ; 0x1212 for (uint8_t i=0; i + 11e4: 82 30 cpi r24, 0x02 ; 2 + 11e6: 79 f1 breq .+94 ; 0x1246 UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { - 11c8: 83 30 cpi r24, 0x03 ; 3 - 11ca: 09 f4 brne .+2 ; 0x11ce - 11cc: 4e c0 rjmp .+156 ; 0x126a + 11e8: 83 30 cpi r24, 0x03 ; 3 + 11ea: 09 f4 brne .+2 ; 0x11ee + 11ec: 4e c0 rjmp .+156 ; 0x128a UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { - 11ce: 84 30 cpi r24, 0x04 ; 4 - 11d0: 09 f4 brne .+2 ; 0x11d4 - 11d2: 70 c0 rjmp .+224 ; 0x12b4 + 11ee: 84 30 cpi r24, 0x04 ; 4 + 11f0: 09 f4 brne .+2 ; 0x11f4 + 11f2: 70 c0 rjmp .+224 ; 0x12d4 UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { - 11d4: 85 30 cpi r24, 0x05 ; 5 - 11d6: 09 f4 brne .+2 ; 0x11da - 11d8: 8f c0 rjmp .+286 ; 0x12f8 + 11f4: 85 30 cpi r24, 0x05 ; 5 + 11f6: 09 f4 brne .+2 ; 0x11fa + 11f8: 8f c0 rjmp .+286 ; 0x1318 UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { - 11da: 86 30 cpi r24, 0x06 ; 6 - 11dc: 09 f4 brne .+2 ; 0x11e0 - 11de: 68 c0 rjmp .+208 ; 0x12b0 + 11fa: 86 30 cpi r24, 0x06 ; 6 + 11fc: 09 f4 brne .+2 ; 0x1200 + 11fe: 68 c0 rjmp .+208 ; 0x12d0 SettingsCycle(); } } } - 11e0: a0 96 adiw r28, 0x20 ; 32 - 11e2: cd bf out 0x3d, r28 ; 61 - 11e4: de bf out 0x3e, r29 ; 62 - 11e6: df 91 pop r29 - 11e8: cf 91 pop r28 - 11ea: 1f 91 pop r17 - 11ec: 0f 91 pop r16 - 11ee: ff 90 pop r15 - 11f0: 08 95 ret + 1200: a0 96 adiw r28, 0x20 ; 32 + 1202: cd bf out 0x3d, r28 ; 61 + 1204: de bf out 0x3e, r29 ; 62 + 1206: df 91 pop r29 + 1208: cf 91 pop r28 + 120a: 1f 91 pop r17 + 120c: 0f 91 pop r16 + 120e: ff 90 pop r15 + 1210: 08 95 ret 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 - 11fa: a1 c0 rjmp .+322 ; 0x133e - 11fc: ff 24 eor r15, r15 - 11fe: 8e 01 movw r16, r28 - 1200: 0f 5f subi r16, 0xFF ; 255 - 1202: 1f 4f sbci r17, 0xFF ; 255 + 1212: 80 91 0b 21 lds r24, 0x210B + 1216: 88 23 and r24, r24 + 1218: 09 f4 brne .+2 ; 0x121c + 121a: a1 c0 rjmp .+322 ; 0x135e + 121c: ff 24 eor r15, r15 + 121e: 8e 01 movw r16, r28 + 1220: 0f 5f subi r16, 0xFF ; 255 + 1222: 1f 4f sbci r17, 0xFF ; 255 UidBuffer[i] = RandomGetByte(); - 1204: e5 db rcall .-2102 ; 0x9d0 - 1206: f8 01 movw r30, r16 - 1208: ef 0d add r30, r15 - 120a: f1 1d adc r31, r1 - 120c: 80 83 st Z, r24 - 120e: f3 94 inc r15 + 1224: e5 db rcall .-2102 ; 0x9f0 + 1226: f8 01 movw r30, r16 + 1228: ef 0d add r30, r15 + 122a: f1 1d adc r31, r1 + 122c: 80 83 st Z, r24 + 122e: f3 94 inc r15 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 - 1218: e0 91 07 21 lds r30, 0x2107 + 1230: 80 91 0b 21 lds r24, 0x210B + 1234: f8 16 cp r15, r24 + 1236: b0 f3 brcs .-20 ; 0x1224 + 1238: e0 91 07 21 lds r30, 0x2107 INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); } INLINE void ApplicationSetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationSetUidFunc(Uid); - 121c: f0 91 08 21 lds r31, 0x2108 - 1220: c8 01 movw r24, r16 - 1222: 09 95 icall - 1224: dd cf rjmp .-70 ; 0x11e0 - 1226: e0 91 05 21 lds r30, 0x2105 + 123c: f0 91 08 21 lds r31, 0x2108 + 1240: c8 01 movw r24, r16 + 1242: 09 95 icall + 1244: dd cf rjmp .-70 ; 0x1200 + 1246: e0 91 05 21 lds r30, 0x2105 INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); } INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); - 122a: f0 91 06 21 lds r31, 0x2106 - 122e: 8e 01 movw r16, r28 - 1230: 0f 5f subi r16, 0xFF ; 255 - 1232: 1f 4f sbci r17, 0xFF ; 255 - 1234: c8 01 movw r24, r16 - 1236: 09 95 icall - 1238: 20 91 0b 21 lds r18, 0x210B + 124a: f0 91 06 21 lds r31, 0x2106 + 124e: 8e 01 movw r16, r28 + 1250: 0f 5f subi r16, 0xFF ; 255 + 1252: 1f 4f sbci r17, 0xFF ; 255 + 1254: c8 01 movw r24, r16 + 1256: 09 95 icall + 1258: 20 91 0b 21 lds r18, 0x210B } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1240: f8 01 movw r30, r16 - 1242: ce 01 movw r24, r28 + 125c: 22 23 and r18, r18 + 125e: 61 f3 breq .-40 ; 0x1238 + 1260: f8 01 movw r30, r16 + 1262: ce 01 movw r24, r28 { BUTTON_PORT.DIRCLR = BUTTON_MASK; BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) - 1244: 02 96 adiw r24, 0x02 ; 2 - 1246: 21 50 subi r18, 0x01 ; 1 - 1248: 82 0f add r24, r18 - 124a: 91 1d adc r25, r1 - 124c: 21 e0 ldi r18, 0x01 ; 1 + 1264: 02 96 adiw r24, 0x02 ; 2 + 1266: 21 50 subi r18, 0x01 ; 1 + 1268: 82 0f add r24, r18 + 126a: 91 1d adc r25, r1 + 126c: 21 e0 ldi r18, 0x01 ; 1 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 124e: 22 23 and r18, r18 + 126e: 22 23 and r18, r18 uint8_t i; for (i=0; i - 1252: 30 81 ld r19, Z + 1270: 39 f0 breq .+14 ; 0x1280 + 1272: 30 81 ld r19, Z if (UidBuffer[i] == 0xFF) { - 1254: 21 e0 ldi r18, 0x01 ; 1 + 1274: 21 e0 ldi r18, 0x01 ; 1 { BUTTON_PORT.DIRCLR = BUTTON_MASK; BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) - 1256: 3f 3f cpi r19, 0xFF ; 255 - 1258: 09 f0 breq .+2 ; 0x125c - 125a: 20 e0 ldi r18, 0x00 ; 0 - 125c: 3f 5f subi r19, 0xFF ; 255 + 1276: 3f 3f cpi r19, 0xFF ; 255 + 1278: 09 f0 breq .+2 ; 0x127c + 127a: 20 e0 ldi r18, 0x00 ; 0 + 127c: 3f 5f subi r19, 0xFF ; 255 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 125e: 30 83 st Z, r19 - 1260: 31 96 adiw r30, 0x01 ; 1 - 1262: e8 17 cp r30, r24 + 127e: 30 83 st Z, r19 + 1280: 31 96 adiw r30, 0x01 ; 1 + 1282: e8 17 cp r30, r24 } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 1268: d7 cf rjmp .-82 ; 0x1218 - 126a: e0 91 05 21 lds r30, 0x2105 - 126e: f0 91 06 21 lds r31, 0x2106 - 1272: 8e 01 movw r16, r28 - 1274: 0f 5f subi r16, 0xFF ; 255 - 1276: 1f 4f sbci r17, 0xFF ; 255 - 1278: c8 01 movw r24, r16 - 127a: 09 95 icall - 127c: 20 91 0b 21 lds r18, 0x210B + 1284: f9 07 cpc r31, r25 + 1286: 99 f7 brne .-26 ; 0x126e + 1288: d7 cf rjmp .-82 ; 0x1238 + 128a: e0 91 05 21 lds r30, 0x2105 + 128e: f0 91 06 21 lds r31, 0x2106 + 1292: 8e 01 movw r16, r28 + 1294: 0f 5f subi r16, 0xFF ; 255 + 1296: 1f 4f sbci r17, 0xFF ; 255 + 1298: c8 01 movw r24, r16 + 129a: 09 95 icall + 129c: 20 91 0b 21 lds r18, 0x210B ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; - 1280: 31 e0 ldi r19, 0x01 ; 1 + 12a0: 31 e0 ldi r19, 0x01 ; 1 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 1282: 22 23 and r18, r18 + 12a2: 22 23 and r18, r18 uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 1284: 49 f2 breq .-110 ; 0x1218 - 1286: 21 50 subi r18, 0x01 ; 1 - 1288: 33 23 and r19, r19 + 12a4: 49 f2 breq .-110 ; 0x1238 + 12a6: 21 50 subi r18, 0x01 ; 1 + 12a8: 33 23 and r19, r19 if (Carry) { - 128a: d9 f3 breq .-10 ; 0x1282 - 128c: 82 2f mov r24, r18 + 12aa: d9 f3 breq .-10 ; 0x12a2 + 12ac: 82 2f mov r24, r18 if (UidBuffer[i] == 0xFF) { - 128e: 90 e0 ldi r25, 0x00 ; 0 - 1290: f8 01 movw r30, r16 - 1292: e8 0f add r30, r24 - 1294: f9 1f adc r31, r25 - 1296: 40 81 ld r20, Z - 1298: 31 e0 ldi r19, 0x01 ; 1 + 12ae: 90 e0 ldi r25, 0x00 ; 0 + 12b0: f8 01 movw r30, r16 + 12b2: e8 0f add r30, r24 + 12b4: f9 1f adc r31, r25 + 12b6: 40 81 ld r20, Z + 12b8: 31 e0 ldi r19, 0x01 ; 1 { BUTTON_PORT.DIRCLR = BUTTON_MASK; BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) - 129a: 4f 3f cpi r20, 0xFF ; 255 - 129c: 09 f0 breq .+2 ; 0x12a0 - 129e: 30 e0 ldi r19, 0x00 ; 0 - 12a0: 80 0f add r24, r16 + 12ba: 4f 3f cpi r20, 0xFF ; 255 + 12bc: 09 f0 breq .+2 ; 0x12c0 + 12be: 30 e0 ldi r19, 0x00 ; 0 + 12c0: 80 0f add r24, r16 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; - 12a2: 91 1f adc r25, r17 - 12a4: 4f 5f subi r20, 0xFF ; 255 - 12a6: fc 01 movw r30, r24 - 12a8: 40 83 st Z, r20 - 12aa: 22 23 and r18, r18 + 12c2: 91 1f adc r25, r17 + 12c4: 4f 5f subi r20, 0xFF ; 255 + 12c6: fc 01 movw r30, r24 + 12c8: 40 83 st Z, r20 + 12ca: 22 23 and r18, r18 } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_INCREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 12ac: 61 f7 brne .-40 ; 0x1286 - 12ae: b4 cf rjmp .-152 ; 0x1218 - 12b0: fb d0 rcall .+502 ; 0x14a8 + 12cc: 61 f7 brne .-40 ; 0x12a6 + 12ce: b4 cf rjmp .-152 ; 0x1238 + 12d0: fb d0 rcall .+502 ; 0x14c8 } } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { SettingsCycle(); - 12b2: 96 cf rjmp .-212 ; 0x11e0 - 12b4: e0 91 05 21 lds r30, 0x2105 - 12b8: f0 91 06 21 lds r31, 0x2106 - 12bc: 8e 01 movw r16, r28 - 12be: 0f 5f subi r16, 0xFF ; 255 - 12c0: 1f 4f sbci r17, 0xFF ; 255 - 12c2: c8 01 movw r24, r16 - 12c4: 09 95 icall - 12c6: 20 91 0b 21 lds r18, 0x210B + 12d2: 96 cf rjmp .-212 ; 0x1200 + 12d4: e0 91 05 21 lds r30, 0x2105 + 12d8: f0 91 06 21 lds r31, 0x2106 + 12dc: 8e 01 movw r16, r28 + 12de: 0f 5f subi r16, 0xFF ; 255 + 12e0: 1f 4f sbci r17, 0xFF ; 255 + 12e2: c8 01 movw r24, r16 + 12e4: 09 95 icall + 12e6: 20 91 0b 21 lds r18, 0x210B } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i; for (i=0; i - 12ce: a4 cf rjmp .-184 ; 0x1218 - 12d0: f8 01 movw r30, r16 - 12d2: ce 01 movw r24, r28 - 12d4: 02 96 adiw r24, 0x02 ; 2 + 12ea: 22 23 and r18, r18 + 12ec: 09 f4 brne .+2 ; 0x12f0 + 12ee: a4 cf rjmp .-184 ; 0x1238 + 12f0: f8 01 movw r30, r16 + 12f2: ce 01 movw r24, r28 + 12f4: 02 96 adiw r24, 0x02 ; 2 { BUTTON_PORT.DIRCLR = BUTTON_MASK; BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) - 12d6: 21 50 subi r18, 0x01 ; 1 - 12d8: 82 0f add r24, r18 - 12da: 91 1d adc r25, r1 - 12dc: 21 e0 ldi r18, 0x01 ; 1 - 12de: 22 23 and r18, r18 + 12f6: 21 50 subi r18, 0x01 ; 1 + 12f8: 82 0f add r24, r18 + 12fa: 91 1d adc r25, r1 + 12fc: 21 e0 ldi r18, 0x01 ; 1 + 12fe: 22 23 and r18, r18 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 12e0: 31 f0 breq .+12 ; 0x12ee + 1300: 31 f0 breq .+12 ; 0x130e uint8_t i; for (i=0; i - 12f6: 90 cf rjmp .-224 ; 0x1218 - 12f8: e0 91 05 21 lds r30, 0x2105 - 12fc: f0 91 06 21 lds r31, 0x2106 - 1300: 8e 01 movw r16, r28 - 1302: 0f 5f subi r16, 0xFF ; 255 - 1304: 1f 4f sbci r17, 0xFF ; 255 - 1306: c8 01 movw r24, r16 - 1308: 09 95 icall - 130a: 20 91 0b 21 lds r18, 0x210B + 1314: a1 f7 brne .-24 ; 0x12fe + 1316: 90 cf rjmp .-224 ; 0x1238 + 1318: e0 91 05 21 lds r30, 0x2105 + 131c: f0 91 06 21 lds r31, 0x2106 + 1320: 8e 01 movw r16, r28 + 1322: 0f 5f subi r16, 0xFF ; 255 + 1324: 1f 4f sbci r17, 0xFF ; 255 + 1326: c8 01 movw r24, r16 + 1328: 09 95 icall + 132a: 20 91 0b 21 lds r18, 0x210B ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; - 130e: 31 e0 ldi r19, 0x01 ; 1 - 1310: 22 23 and r18, r18 + 132e: 31 e0 ldi r19, 0x01 ; 1 + 1330: 22 23 and r18, r18 } ApplicationSetUid(UidBuffer); } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; - 1312: 09 f4 brne .+2 ; 0x1316 + 1332: 09 f4 brne .+2 ; 0x1336 uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 1314: 81 cf rjmp .-254 ; 0x1218 - 1316: 21 50 subi r18, 0x01 ; 1 - 1318: 33 23 and r19, r19 - 131a: d1 f3 breq .-12 ; 0x1310 + 1334: 81 cf rjmp .-254 ; 0x1238 + 1336: 21 50 subi r18, 0x01 ; 1 + 1338: 33 23 and r19, r19 + 133a: d1 f3 breq .-12 ; 0x1330 if (Carry) { - 131c: 82 2f mov r24, r18 - 131e: 90 e0 ldi r25, 0x00 ; 0 + 133c: 82 2f mov r24, r18 + 133e: 90 e0 ldi r25, 0x00 ; 0 if (UidBuffer[i] == 0x00) { - 1320: f8 01 movw r30, r16 - 1322: e8 0f add r30, r24 - 1324: f9 1f adc r31, r25 - 1326: 40 81 ld r20, Z - 1328: 31 e0 ldi r19, 0x01 ; 1 - 132a: 41 11 cpse r20, r1 + 1340: f8 01 movw r30, r16 + 1342: e8 0f add r30, r24 + 1344: f9 1f adc r31, r25 + 1346: 40 81 ld r20, Z + 1348: 31 e0 ldi r19, 0x01 ; 1 + 134a: 41 11 cpse r20, r1 { BUTTON_PORT.DIRCLR = BUTTON_MASK; BUTTON_PORT.BUTTON_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) - 132c: 30 e0 ldi r19, 0x00 ; 0 - 132e: 80 0f add r24, r16 - 1330: 91 1f adc r25, r17 + 134c: 30 e0 ldi r19, 0x00 ; 0 + 134e: 80 0f add r24, r16 + 1350: 91 1f adc r25, r17 Carry = 1; } else { Carry = 0; } UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; - 1332: 41 50 subi r20, 0x01 ; 1 - 1334: fc 01 movw r30, r24 - 1336: 40 83 st Z, r20 - 1338: 22 23 and r18, r18 - 133a: 69 f7 brne .-38 ; 0x1316 + 1352: 41 50 subi r20, 0x01 ; 1 + 1354: fc 01 movw r30, r24 + 1356: 40 83 st Z, r20 + 1358: 22 23 and r18, r18 + 135a: 69 f7 brne .-38 ; 0x1336 } else if (ButtonAction == BUTTON_ACTION_UID_RIGHT_DECREMENT) { ApplicationGetUid(UidBuffer); bool Carry = 1; uint8_t i = ActiveConfiguration.UidSize; while(i-- > 0) { - 133c: 6d cf rjmp .-294 ; 0x1218 - 133e: 8e 01 movw r16, r28 - 1340: 0f 5f subi r16, 0xFF ; 255 - 1342: 1f 4f sbci r17, 0xFF ; 255 - 1344: 69 cf rjmp .-302 ; 0x1218 + 135c: 6d cf rjmp .-294 ; 0x1238 + 135e: 8e 01 movw r16, r28 + 1360: 0f 5f subi r16, 0xFF ; 255 + 1362: 1f 4f sbci r17, 0xFF ; 255 + 1364: 69 cf rjmp .-302 ; 0x1238 -00001346 : - 1346: cf 93 push r28 - 1348: df 93 push r29 +00001366 : + 1366: cf 93 push r28 + 1368: df 93 push r29 } } } void ButtonGetActionList(char* ListOut, uint16_t BufferSize) { - 134a: ec 01 movw r28, r24 + 136a: ec 01 movw r28, r24 uint8_t i; /* Account for '\0' */ BufferSize--; - 134c: 61 50 subi r22, 0x01 ; 1 - 134e: 70 40 sbci r23, 0x00 ; 0 - 1350: 27 ef ldi r18, 0xF7 ; 247 - 1352: 32 e0 ldi r19, 0x02 ; 2 + 136c: 61 50 subi r22, 0x01 ; 1 + 136e: 70 40 sbci r23, 0x00 ; 0 + 1370: 27 ef ldi r18, 0xF7 ; 247 + 1372: 32 e0 ldi r19, 0x02 ; 2 BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { /* No comma on last configuration */ *ListOut++ = ','; - 1354: 4c e2 ldi r20, 0x2C ; 44 + 1374: 4c e2 ldi r20, 0x2C ; 44 /* Account for '\0' */ BufferSize--; for (i=0; i sizeof(ButtonActionTable[i]) ) { - 1358: f9 01 movw r30, r18 - 135a: 54 91 lpm r21, Z - 135c: 55 23 and r21, r21 - 135e: 89 f0 breq .+34 ; 0x1382 - 1360: 61 32 cpi r22, 0x21 ; 33 - 1362: 71 05 cpc r23, r1 - 1364: 70 f0 brcs .+28 ; 0x1382 - 1366: de 01 movw r26, r28 - 1368: 03 c0 rjmp .+6 ; 0x1370 - 136a: 60 32 cpi r22, 0x20 ; 32 - 136c: 71 05 cpc r23, r1 - 136e: 49 f0 breq .+18 ; 0x1382 + 1378: f9 01 movw r30, r18 + 137a: 54 91 lpm r21, Z + 137c: 55 23 and r21, r21 + 137e: 89 f0 breq .+34 ; 0x13a2 + 1380: 61 32 cpi r22, 0x21 ; 33 + 1382: 71 05 cpc r23, r1 + 1384: 70 f0 brcs .+28 ; 0x13a2 + 1386: de 01 movw r26, r28 + 1388: 03 c0 rjmp .+6 ; 0x1390 + 138a: 60 32 cpi r22, 0x20 ; 32 + 138c: 71 05 cpc r23, r1 + 138e: 49 f0 breq .+18 ; 0x13a2 /* While not end-of-string and enough buffer to * put a complete configuration name */ *ListOut++ = c; - 1370: 5d 93 st X+, r21 - 1372: ed 01 movw r28, r26 + 1390: 5d 93 st X+, r21 + 1392: ed 01 movw r28, r26 ActionName++; - 1374: 01 96 adiw r24, 0x01 ; 1 + 1394: 01 96 adiw r24, 0x01 ; 1 BufferSize--; - 1376: 61 50 subi r22, 0x01 ; 1 - 1378: 70 40 sbci r23, 0x00 ; 0 + 1396: 61 50 subi r22, 0x01 ; 1 + 1398: 70 40 sbci r23, 0x00 ; 0 for (i=0; i sizeof(ButtonActionTable[i]) ) { - 137a: fc 01 movw r30, r24 - 137c: 54 91 lpm r21, Z - 137e: 55 23 and r21, r21 - 1380: a1 f7 brne .-24 ; 0x136a + 139a: fc 01 movw r30, r24 + 139c: 54 91 lpm r21, Z + 139e: 55 23 and r21, r21 + 13a0: a1 f7 brne .-24 ; 0x138a *ListOut++ = c; ActionName++; BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { - 1382: f3 e0 ldi r31, 0x03 ; 3 - 1384: 27 3b cpi r18, 0xB7 ; 183 - 1386: 3f 07 cpc r19, r31 - 1388: 21 f4 brne .+8 ; 0x1392 + 13a2: f3 e0 ldi r31, 0x03 ; 3 + 13a4: 27 3b cpi r18, 0xB7 ; 183 + 13a6: 3f 07 cpc r19, r31 + 13a8: 21 f4 brne .+8 ; 0x13b2 *ListOut++ = ','; BufferSize--; } } *ListOut = '\0'; - 138a: 18 82 st Y, r1 + 13aa: 18 82 st Y, r1 } - 138c: df 91 pop r29 - 138e: cf 91 pop r28 - 1390: 08 95 ret + 13ac: df 91 pop r29 + 13ae: cf 91 pop r28 + 13b0: 08 95 ret BufferSize--; } if ( i < (BUTTON_ACTION_COUNT - 1) ) { /* No comma on last configuration */ *ListOut++ = ','; - 1392: 49 93 st Y+, r20 + 13b2: 49 93 st Y+, r20 BufferSize--; - 1394: 61 50 subi r22, 0x01 ; 1 - 1396: 70 40 sbci r23, 0x00 ; 0 - 1398: 20 5e subi r18, 0xE0 ; 224 - 139a: 3f 4f sbci r19, 0xFF ; 255 + 13b4: 61 50 subi r22, 0x01 ; 1 + 13b6: 70 40 sbci r23, 0x00 ; 0 + 13b8: 20 5e subi r18, 0xE0 ; 224 + 13ba: 3f 4f sbci r19, 0xFF ; 255 uint8_t i; /* Account for '\0' */ BufferSize--; for (i=0; i - 13a4: f2 cf rjmp .-28 ; 0x138a + 13bc: 83 e0 ldi r24, 0x03 ; 3 + 13be: 27 3d cpi r18, 0xD7 ; 215 + 13c0: 38 07 cpc r19, r24 + 13c2: c9 f6 brne .-78 ; 0x1376 + 13c4: f2 cf rjmp .-28 ; 0x13aa -000013a6 : +000013c6 : *ListOut = '\0'; } void ButtonSetActionById(ButtonActionEnum Action) { GlobalSettings.ActiveSettingPtr->ButtonAction = Action; - 13a6: e0 91 0e 21 lds r30, 0x210E - 13aa: f0 91 0f 21 lds r31, 0x210F - 13ae: 80 83 st Z, r24 + 13c6: e0 91 0e 21 lds r30, 0x210E + 13ca: f0 91 0f 21 lds r31, 0x210F + 13ce: 80 83 st Z, r24 } - 13b0: 08 95 ret + 13d0: 08 95 ret -000013b2 : +000013d2 : void ButtonGetActionByName(char* ActionOut, uint16_t BufferSize) { - 13b2: ab 01 movw r20, r22 + 13d2: ab 01 movw r20, r22 strncpy_P(ActionOut, ButtonActionTable[GlobalSettings.ActiveSettingPtr->ButtonAction], BufferSize); - 13b4: e0 91 0e 21 lds r30, 0x210E - 13b8: f0 91 0f 21 lds r31, 0x210F - 13bc: 60 81 ld r22, Z - 13be: 70 e0 ldi r23, 0x00 ; 0 - 13c0: 66 0f add r22, r22 - 13c2: 77 1f adc r23, r23 - 13c4: 62 95 swap r22 - 13c6: 72 95 swap r23 - 13c8: 70 7f andi r23, 0xF0 ; 240 - 13ca: 76 27 eor r23, r22 - 13cc: 60 7f andi r22, 0xF0 ; 240 - 13ce: 76 27 eor r23, r22 - 13d0: 69 50 subi r22, 0x09 ; 9 - 13d2: 7d 4f sbci r23, 0xFD ; 253 - 13d4: 0c 94 f4 25 jmp 0x4be8 ; 0x4be8 + 13d4: e0 91 0e 21 lds r30, 0x210E + 13d8: f0 91 0f 21 lds r31, 0x210F + 13dc: 60 81 ld r22, Z + 13de: 70 e0 ldi r23, 0x00 ; 0 + 13e0: 66 0f add r22, r22 + 13e2: 77 1f adc r23, r23 + 13e4: 62 95 swap r22 + 13e6: 72 95 swap r23 + 13e8: 70 7f andi r23, 0xF0 ; 240 + 13ea: 76 27 eor r23, r22 + 13ec: 60 7f andi r22, 0xF0 ; 240 + 13ee: 76 27 eor r23, r22 + 13f0: 69 50 subi r22, 0x09 ; 9 + 13f2: 7d 4f sbci r23, 0xFD ; 253 + 13f4: 0c 94 04 26 jmp 0x4c08 ; 0x4c08 -000013d8 : +000013f8 : } - 13d8: cf 93 push r28 + 13f8: cf 93 push r28 bool ButtonSetActionByName(const char* Action) { - 13da: df 93 push r29 - 13dc: ec 01 movw r28, r24 + 13fa: df 93 push r29 + 13fc: ec 01 movw r28, r24 uint8_t i; for (i=0; i - 13e6: 00 97 sbiw r24, 0x00 ; 0 - 13e8: 71 f1 breq .+92 ; 0x1446 - 13ea: ce 01 movw r24, r28 - 13ec: 67 e1 ldi r22, 0x17 ; 23 - 13ee: 73 e0 ldi r23, 0x03 ; 3 - 13f0: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 13f4: 00 97 sbiw r24, 0x00 ; 0 - 13f6: 69 f1 breq .+90 ; 0x1452 - 13f8: ce 01 movw r24, r28 - 13fa: 67 e3 ldi r22, 0x37 ; 55 - 13fc: 73 e0 ldi r23, 0x03 ; 3 - 13fe: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1402: 00 97 sbiw r24, 0x00 ; 0 - 1404: 41 f1 breq .+80 ; 0x1456 - 1406: ce 01 movw r24, r28 - 1408: 67 e5 ldi r22, 0x57 ; 87 - 140a: 73 e0 ldi r23, 0x03 ; 3 - 140c: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1410: 00 97 sbiw r24, 0x00 ; 0 - 1412: 19 f1 breq .+70 ; 0x145a - 1414: ce 01 movw r24, r28 - 1416: 67 e7 ldi r22, 0x77 ; 119 - 1418: 73 e0 ldi r23, 0x03 ; 3 - 141a: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 141e: 00 97 sbiw r24, 0x00 ; 0 - 1420: f1 f0 breq .+60 ; 0x145e - 1422: ce 01 movw r24, r28 - 1424: 67 e9 ldi r22, 0x97 ; 151 - 1426: 73 e0 ldi r23, 0x03 ; 3 - 1428: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 142c: 00 97 sbiw r24, 0x00 ; 0 - 142e: c9 f0 breq .+50 ; 0x1462 - 1430: ce 01 movw r24, r28 - 1432: 67 eb ldi r22, 0xB7 ; 183 - 1434: 73 e0 ldi r23, 0x03 ; 3 - 1436: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 143a: 00 97 sbiw r24, 0x00 ; 0 - 143c: a1 f0 breq .+40 ; 0x1466 + 13fe: 67 ef ldi r22, 0xF7 ; 247 + 1400: 72 e0 ldi r23, 0x02 ; 2 + 1402: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1406: 00 97 sbiw r24, 0x00 ; 0 + 1408: 71 f1 breq .+92 ; 0x1466 + 140a: ce 01 movw r24, r28 + 140c: 67 e1 ldi r22, 0x17 ; 23 + 140e: 73 e0 ldi r23, 0x03 ; 3 + 1410: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1414: 00 97 sbiw r24, 0x00 ; 0 + 1416: 69 f1 breq .+90 ; 0x1472 + 1418: ce 01 movw r24, r28 + 141a: 67 e3 ldi r22, 0x37 ; 55 + 141c: 73 e0 ldi r23, 0x03 ; 3 + 141e: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1422: 00 97 sbiw r24, 0x00 ; 0 + 1424: 41 f1 breq .+80 ; 0x1476 + 1426: ce 01 movw r24, r28 + 1428: 67 e5 ldi r22, 0x57 ; 87 + 142a: 73 e0 ldi r23, 0x03 ; 3 + 142c: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1430: 00 97 sbiw r24, 0x00 ; 0 + 1432: 19 f1 breq .+70 ; 0x147a + 1434: ce 01 movw r24, r28 + 1436: 67 e7 ldi r22, 0x77 ; 119 + 1438: 73 e0 ldi r23, 0x03 ; 3 + 143a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 143e: 00 97 sbiw r24, 0x00 ; 0 + 1440: f1 f0 breq .+60 ; 0x147e + 1442: ce 01 movw r24, r28 + 1444: 67 e9 ldi r22, 0x97 ; 151 + 1446: 73 e0 ldi r23, 0x03 ; 3 + 1448: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 144c: 00 97 sbiw r24, 0x00 ; 0 + 144e: c9 f0 breq .+50 ; 0x1482 + 1450: ce 01 movw r24, r28 + 1452: 67 eb ldi r22, 0xB7 ; 183 + 1454: 73 e0 ldi r23, 0x03 ; 3 + 1456: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 145a: 00 97 sbiw r24, 0x00 ; 0 + 145c: a1 f0 breq .+40 ; 0x1486 return true; } } /* Button action not found */ return false; - 143e: 80 e0 ldi r24, 0x00 ; 0 + 145e: 80 e0 ldi r24, 0x00 ; 0 } - 1440: df 91 pop r29 - 1442: cf 91 pop r28 - 1444: 08 95 ret + 1460: df 91 pop r29 + 1462: cf 91 pop r28 + 1464: 08 95 ret bool ButtonSetActionByName(const char* Action) { uint8_t i; for (i=0; i - 144a: 81 e0 ldi r24, 0x01 ; 1 + 1468: ae df rcall .-164 ; 0x13c6 + 146a: 81 e0 ldi r24, 0x01 ; 1 return true; - 144c: df 91 pop r29 + 146c: df 91 pop r29 } } /* Button action not found */ return false; } - 144e: cf 91 pop r28 - 1450: 08 95 ret - 1452: 81 e0 ldi r24, 0x01 ; 1 + 146e: cf 91 pop r28 + 1470: 08 95 ret + 1472: 81 e0 ldi r24, 0x01 ; 1 bool ButtonSetActionByName(const char* Action) { uint8_t i; for (i=0; i - 1456: 82 e0 ldi r24, 0x02 ; 2 - 1458: f7 cf rjmp .-18 ; 0x1448 - 145a: 83 e0 ldi r24, 0x03 ; 3 - 145c: f5 cf rjmp .-22 ; 0x1448 - 145e: 84 e0 ldi r24, 0x04 ; 4 - 1460: f3 cf rjmp .-26 ; 0x1448 - 1462: 85 e0 ldi r24, 0x05 ; 5 - 1464: f1 cf rjmp .-30 ; 0x1448 - 1466: 86 e0 ldi r24, 0x06 ; 6 + 1474: f9 cf rjmp .-14 ; 0x1468 + 1476: 82 e0 ldi r24, 0x02 ; 2 + 1478: f7 cf rjmp .-18 ; 0x1468 + 147a: 83 e0 ldi r24, 0x03 ; 3 + 147c: f5 cf rjmp .-22 ; 0x1468 + 147e: 84 e0 ldi r24, 0x04 ; 4 + 1480: f3 cf rjmp .-26 ; 0x1468 + 1482: 85 e0 ldi r24, 0x05 ; 5 + 1484: f1 cf rjmp .-30 ; 0x1468 + 1486: 86 e0 ldi r24, 0x06 ; 6 if (strcmp_P(Action, ButtonActionTable[i]) == 0) { - 1468: ef cf rjmp .-34 ; 0x1448 + 1488: ef cf rjmp .-34 ; 0x1468 -0000146a : +0000148a : .ButtonAction = DEFAULT_BUTTON_ACTION, } } }; void SettingsLoad(void) { eeprom_read_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 146a: 8d e0 ldi r24, 0x0D ; 13 - 146c: 91 e2 ldi r25, 0x21 ; 33 - 146e: 60 e0 ldi r22, 0x00 ; 0 - 1470: 70 e0 ldi r23, 0x00 ; 0 - 1472: 43 e1 ldi r20, 0x13 ; 19 - 1474: 50 e0 ldi r21, 0x00 ; 0 - 1476: 0c 94 08 28 jmp 0x5010 ; 0x5010 <__eerd_block_x32a4u> + 148a: 8d e0 ldi r24, 0x0D ; 13 + 148c: 91 e2 ldi r25, 0x21 ; 33 + 148e: 60 e0 ldi r22, 0x00 ; 0 + 1490: 70 e0 ldi r23, 0x00 ; 0 + 1492: 43 e1 ldi r20, 0x13 ; 19 + 1494: 50 e0 ldi r21, 0x00 ; 0 + 1496: 0c 94 18 28 jmp 0x5030 ; 0x5030 <__eerd_block_x32a4u> -0000147a : +0000149a : } - 147a: 8d e0 ldi r24, 0x0D ; 13 + 149a: 8d e0 ldi r24, 0x0D ; 13 void SettingsSave(void) { #if ENABLE_EEPROM_SETTINGS eeprom_write_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); - 147c: 91 e2 ldi r25, 0x21 ; 33 - 147e: 60 e0 ldi r22, 0x00 ; 0 - 1480: 70 e0 ldi r23, 0x00 ; 0 - 1482: 43 e1 ldi r20, 0x13 ; 19 - 1484: 50 e0 ldi r21, 0x00 ; 0 - 1486: 0c 94 13 28 jmp 0x5026 ; 0x5026 <__eewr_block_x32a4u> + 149c: 91 e2 ldi r25, 0x21 ; 33 + 149e: 60 e0 ldi r22, 0x00 ; 0 + 14a0: 70 e0 ldi r23, 0x00 ; 0 + 14a2: 43 e1 ldi r20, 0x13 ; 19 + 14a4: 50 e0 ldi r21, 0x00 ; 0 + 14a6: 0c 94 23 28 jmp 0x5046 ; 0x5046 <__eewr_block_x32a4u> -0000148a : +000014aa : #endif } - 148a: 88 30 cpi r24, 0x08 ; 8 + 14aa: 88 30 cpi r24, 0x08 ; 8 } } } void SettingsSetActiveById(uint8_t Setting) { if (Setting < SETTINGS_COUNT) { - 148c: 08 f0 brcs .+2 ; 0x1490 - 148e: 08 95 ret + 14ac: 08 f0 brcs .+2 ; 0x14b0 + 14ae: 08 95 ret GlobalSettings.ActiveSetting = Setting; - 1490: 80 93 0d 21 sts 0x210D, r24 + 14b0: 80 93 0d 21 sts 0x210D, r24 GlobalSettings.ActiveSettingPtr = &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; - 1494: 90 e0 ldi r25, 0x00 ; 0 - 1496: 88 0f add r24, r24 - 1498: 99 1f adc r25, r25 - 149a: 80 5f subi r24, 0xF0 ; 240 - 149c: 9e 4d sbci r25, 0xDE ; 222 + 14b4: 90 e0 ldi r25, 0x00 ; 0 + 14b6: 88 0f add r24, r24 + 14b8: 99 1f adc r25, r25 + 14ba: 80 5f subi r24, 0xF0 ; 240 + 14bc: 9e 4d sbci r25, 0xDE ; 222 } void SettingsSetActiveById(uint8_t Setting) { if (Setting < SETTINGS_COUNT) { GlobalSettings.ActiveSetting = Setting; GlobalSettings.ActiveSettingPtr = - 149e: 80 93 0e 21 sts 0x210E, r24 - 14a2: 90 93 0f 21 sts 0x210F, r25 + 14be: 80 93 0e 21 sts 0x210E, r24 + 14c2: 90 93 0f 21 sts 0x210F, r25 &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; /* Settings have changed. Progress changes through system */ ConfigurationInit(); - 14a6: 0b ca rjmp .-3050 ; 0x8be + 14c6: 0b ca rjmp .-3050 ; 0x8de -000014a8 : - 14a8: 80 91 0d 21 lds r24, 0x210D +000014c8 : + 14c8: 80 91 0d 21 lds r24, 0x210D void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 14ac: 8f 5f subi r24, 0xFF ; 255 - 14ae: 87 70 andi r24, 0x07 ; 7 + 14cc: 8f 5f subi r24, 0xFF ; 255 + 14ce: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 14b0: 28 2f mov r18, r24 - 14b2: 30 e0 ldi r19, 0x00 ; 0 - 14b4: f9 01 movw r30, r18 - 14b6: ee 0f add r30, r30 - 14b8: ff 1f adc r31, r31 - 14ba: ef 5e subi r30, 0xEF ; 239 - 14bc: fe 4d sbci r31, 0xDE ; 222 - 14be: 90 81 ld r25, Z - 14c0: 99 23 and r25, r25 - 14c2: 09 f0 breq .+2 ; 0x14c6 - 14c4: 5d c0 rjmp .+186 ; 0x1580 + 14d0: 28 2f mov r18, r24 + 14d2: 30 e0 ldi r19, 0x00 ; 0 + 14d4: f9 01 movw r30, r18 + 14d6: ee 0f add r30, r30 + 14d8: ff 1f adc r31, r31 + 14da: ef 5e subi r30, 0xEF ; 239 + 14dc: fe 4d sbci r31, 0xDE ; 222 + 14de: 90 81 ld r25, Z + 14e0: 99 23 and r25, r25 + 14e2: 09 f0 breq .+2 ; 0x14e6 + 14e4: 5d c0 rjmp .+186 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 14c6: c9 01 movw r24, r18 - 14c8: 01 96 adiw r24, 0x01 ; 1 - 14ca: 87 70 andi r24, 0x07 ; 7 + 14e6: c9 01 movw r24, r18 + 14e8: 01 96 adiw r24, 0x01 ; 1 + 14ea: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 14cc: 28 2f mov r18, r24 - 14ce: 30 e0 ldi r19, 0x00 ; 0 - 14d0: f9 01 movw r30, r18 - 14d2: ee 0f add r30, r30 - 14d4: ff 1f adc r31, r31 - 14d6: ef 5e subi r30, 0xEF ; 239 - 14d8: fe 4d sbci r31, 0xDE ; 222 - 14da: 90 81 ld r25, Z - 14dc: 99 23 and r25, r25 - 14de: 09 f0 breq .+2 ; 0x14e2 - 14e0: 4f c0 rjmp .+158 ; 0x1580 + 14ec: 28 2f mov r18, r24 + 14ee: 30 e0 ldi r19, 0x00 ; 0 + 14f0: f9 01 movw r30, r18 + 14f2: ee 0f add r30, r30 + 14f4: ff 1f adc r31, r31 + 14f6: ef 5e subi r30, 0xEF ; 239 + 14f8: fe 4d sbci r31, 0xDE ; 222 + 14fa: 90 81 ld r25, Z + 14fc: 99 23 and r25, r25 + 14fe: 09 f0 breq .+2 ; 0x1502 + 1500: 4f c0 rjmp .+158 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 14e2: c9 01 movw r24, r18 - 14e4: 01 96 adiw r24, 0x01 ; 1 - 14e6: 87 70 andi r24, 0x07 ; 7 + 1502: c9 01 movw r24, r18 + 1504: 01 96 adiw r24, 0x01 ; 1 + 1506: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 14e8: 28 2f mov r18, r24 - 14ea: 30 e0 ldi r19, 0x00 ; 0 - 14ec: f9 01 movw r30, r18 - 14ee: ee 0f add r30, r30 - 14f0: ff 1f adc r31, r31 - 14f2: ef 5e subi r30, 0xEF ; 239 - 14f4: fe 4d sbci r31, 0xDE ; 222 - 14f6: 90 81 ld r25, Z - 14f8: 99 23 and r25, r25 - 14fa: 09 f0 breq .+2 ; 0x14fe - 14fc: 41 c0 rjmp .+130 ; 0x1580 + 1508: 28 2f mov r18, r24 + 150a: 30 e0 ldi r19, 0x00 ; 0 + 150c: f9 01 movw r30, r18 + 150e: ee 0f add r30, r30 + 1510: ff 1f adc r31, r31 + 1512: ef 5e subi r30, 0xEF ; 239 + 1514: fe 4d sbci r31, 0xDE ; 222 + 1516: 90 81 ld r25, Z + 1518: 99 23 and r25, r25 + 151a: 09 f0 breq .+2 ; 0x151e + 151c: 41 c0 rjmp .+130 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 14fe: c9 01 movw r24, r18 - 1500: 01 96 adiw r24, 0x01 ; 1 - 1502: 87 70 andi r24, 0x07 ; 7 + 151e: c9 01 movw r24, r18 + 1520: 01 96 adiw r24, 0x01 ; 1 + 1522: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1504: 28 2f mov r18, r24 - 1506: 30 e0 ldi r19, 0x00 ; 0 - 1508: f9 01 movw r30, r18 - 150a: ee 0f add r30, r30 - 150c: ff 1f adc r31, r31 - 150e: ef 5e subi r30, 0xEF ; 239 - 1510: fe 4d sbci r31, 0xDE ; 222 - 1512: 90 81 ld r25, Z - 1514: 99 23 and r25, r25 - 1516: a1 f5 brne .+104 ; 0x1580 + 1524: 28 2f mov r18, r24 + 1526: 30 e0 ldi r19, 0x00 ; 0 + 1528: f9 01 movw r30, r18 + 152a: ee 0f add r30, r30 + 152c: ff 1f adc r31, r31 + 152e: ef 5e subi r30, 0xEF ; 239 + 1530: fe 4d sbci r31, 0xDE ; 222 + 1532: 90 81 ld r25, Z + 1534: 99 23 and r25, r25 + 1536: a1 f5 brne .+104 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1518: c9 01 movw r24, r18 - 151a: 01 96 adiw r24, 0x01 ; 1 - 151c: 87 70 andi r24, 0x07 ; 7 + 1538: c9 01 movw r24, r18 + 153a: 01 96 adiw r24, 0x01 ; 1 + 153c: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 151e: 28 2f mov r18, r24 - 1520: 30 e0 ldi r19, 0x00 ; 0 - 1522: f9 01 movw r30, r18 - 1524: ee 0f add r30, r30 - 1526: ff 1f adc r31, r31 - 1528: ef 5e subi r30, 0xEF ; 239 - 152a: fe 4d sbci r31, 0xDE ; 222 - 152c: 90 81 ld r25, Z - 152e: 99 23 and r25, r25 - 1530: 39 f5 brne .+78 ; 0x1580 + 153e: 28 2f mov r18, r24 + 1540: 30 e0 ldi r19, 0x00 ; 0 + 1542: f9 01 movw r30, r18 + 1544: ee 0f add r30, r30 + 1546: ff 1f adc r31, r31 + 1548: ef 5e subi r30, 0xEF ; 239 + 154a: fe 4d sbci r31, 0xDE ; 222 + 154c: 90 81 ld r25, Z + 154e: 99 23 and r25, r25 + 1550: 39 f5 brne .+78 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1532: c9 01 movw r24, r18 - 1534: 01 96 adiw r24, 0x01 ; 1 - 1536: 87 70 andi r24, 0x07 ; 7 + 1552: c9 01 movw r24, r18 + 1554: 01 96 adiw r24, 0x01 ; 1 + 1556: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1538: 28 2f mov r18, r24 - 153a: 30 e0 ldi r19, 0x00 ; 0 - 153c: f9 01 movw r30, r18 - 153e: ee 0f add r30, r30 - 1540: ff 1f adc r31, r31 - 1542: ef 5e subi r30, 0xEF ; 239 - 1544: fe 4d sbci r31, 0xDE ; 222 - 1546: 90 81 ld r25, Z - 1548: 99 23 and r25, r25 - 154a: d1 f4 brne .+52 ; 0x1580 + 1558: 28 2f mov r18, r24 + 155a: 30 e0 ldi r19, 0x00 ; 0 + 155c: f9 01 movw r30, r18 + 155e: ee 0f add r30, r30 + 1560: ff 1f adc r31, r31 + 1562: ef 5e subi r30, 0xEF ; 239 + 1564: fe 4d sbci r31, 0xDE ; 222 + 1566: 90 81 ld r25, Z + 1568: 99 23 and r25, r25 + 156a: d1 f4 brne .+52 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 154c: c9 01 movw r24, r18 - 154e: 01 96 adiw r24, 0x01 ; 1 - 1550: 87 70 andi r24, 0x07 ; 7 + 156c: c9 01 movw r24, r18 + 156e: 01 96 adiw r24, 0x01 ; 1 + 1570: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 1552: 28 2f mov r18, r24 - 1554: 30 e0 ldi r19, 0x00 ; 0 - 1556: f9 01 movw r30, r18 - 1558: ee 0f add r30, r30 - 155a: ff 1f adc r31, r31 - 155c: ef 5e subi r30, 0xEF ; 239 - 155e: fe 4d sbci r31, 0xDE ; 222 - 1560: 90 81 ld r25, Z - 1562: 99 23 and r25, r25 - 1564: 69 f4 brne .+26 ; 0x1580 + 1572: 28 2f mov r18, r24 + 1574: 30 e0 ldi r19, 0x00 ; 0 + 1576: f9 01 movw r30, r18 + 1578: ee 0f add r30, r30 + 157a: ff 1f adc r31, r31 + 157c: ef 5e subi r30, 0xEF ; 239 + 157e: fe 4d sbci r31, 0xDE ; 222 + 1580: 90 81 ld r25, Z + 1582: 99 23 and r25, r25 + 1584: 69 f4 brne .+26 ; 0x15a0 void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t Setting = GlobalSettings.ActiveSetting; while (i-- > 0) { Setting = (Setting + 1) % SETTINGS_COUNT; - 1566: c9 01 movw r24, r18 - 1568: 01 96 adiw r24, 0x01 ; 1 - 156a: 87 70 andi r24, 0x07 ; 7 + 1586: c9 01 movw r24, r18 + 1588: 01 96 adiw r24, 0x01 ; 1 + 158a: 87 70 andi r24, 0x07 ; 7 if (GlobalSettings.Settings[Setting].Configuration != CONFIG_NONE) { - 156c: e8 2f mov r30, r24 - 156e: f0 e0 ldi r31, 0x00 ; 0 - 1570: ee 0f add r30, r30 - 1572: ff 1f adc r31, r31 - 1574: ef 5e subi r30, 0xEF ; 239 - 1576: fe 4d sbci r31, 0xDE ; 222 - 1578: 90 81 ld r25, Z - 157a: 99 23 and r25, r25 - 157c: 09 f4 brne .+2 ; 0x1580 - 157e: 08 95 ret + 158c: e8 2f mov r30, r24 + 158e: f0 e0 ldi r31, 0x00 ; 0 + 1590: ee 0f add r30, r30 + 1592: ff 1f adc r31, r31 + 1594: ef 5e subi r30, 0xEF ; 239 + 1596: fe 4d sbci r31, 0xDE ; 222 + 1598: 90 81 ld r25, Z + 159a: 99 23 and r25, r25 + 159c: 09 f4 brne .+2 ; 0x15a0 + 159e: 08 95 ret SettingsSetActiveById(Setting); - 1580: 84 cf rjmp .-248 ; 0x148a + 15a0: 84 cf rjmp .-248 ; 0x14aa -00001582 : - 1582: 80 91 0d 21 lds r24, 0x210D +000015a2 : + 15a2: 80 91 0d 21 lds r24, 0x210D } } uint8_t SettingsGetActiveById(void) { return GlobalSettings.ActiveSetting; } - 1586: 08 95 ret + 15a6: 08 95 ret -00001588 : +000015a8 : void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { - 1588: cf 93 push r28 - 158a: df 93 push r29 - 158c: ec 01 movw r28, r24 + 15a8: cf 93 push r28 + 15aa: df 93 push r29 + 15ac: ec 01 movw r28, r24 SettingOut[0] = SettingsGetActiveById() + '0'; - 158e: f9 df rcall .-14 ; 0x1582 - 1590: 80 5d subi r24, 0xD0 ; 208 - 1592: 88 83 st Y, r24 - 1594: 19 82 std Y+1, r1 ; 0x01 + 15ae: f9 df rcall .-14 ; 0x15a2 + 15b0: 80 5d subi r24, 0xD0 ; 208 + 15b2: 88 83 st Y, r24 + 15b4: 19 82 std Y+1, r1 ; 0x01 SettingOut[1] = '\0'; - 1596: df 91 pop r29 + 15b6: df 91 pop r29 } - 1598: cf 91 pop r28 - 159a: 08 95 ret + 15b8: cf 91 pop r28 + 15ba: 08 95 ret -0000159c : - 159c: fc 01 movw r30, r24 +000015bc : + 15bc: fc 01 movw r30, r24 bool SettingsSetActiveByName(const char* Setting) { uint8_t SettingNr = Setting[0] - '0'; - 159e: 80 81 ld r24, Z + 15be: 80 81 ld r24, Z if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - 15a0: 91 81 ldd r25, Z+1 ; 0x01 - 15a2: 99 23 and r25, r25 - 15a4: 41 f4 brne .+16 ; 0x15b6 + 15c0: 91 81 ldd r25, Z+1 ; 0x01 + 15c2: 99 23 and r25, r25 + 15c4: 41 f4 brne .+16 ; 0x15d6 SettingOut[0] = SettingsGetActiveById() + '0'; SettingOut[1] = '\0'; } bool SettingsSetActiveByName(const char* Setting) { uint8_t SettingNr = Setting[0] - '0'; - 15a6: 80 53 subi r24, 0x30 ; 48 + 15c6: 80 53 subi r24, 0x30 ; 48 if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { - 15a8: 88 30 cpi r24, 0x08 ; 8 - 15aa: 10 f0 brcs .+4 ; 0x15b0 + 15c8: 88 30 cpi r24, 0x08 ; 8 + 15ca: 10 f0 brcs .+4 ; 0x15d0 SettingsSetActiveById(SettingNr); return true; } else { return false; - 15ac: 80 e0 ldi r24, 0x00 ; 0 + 15cc: 80 e0 ldi r24, 0x00 ; 0 } } - 15ae: 08 95 ret + 15ce: 08 95 ret bool SettingsSetActiveByName(const char* Setting) { uint8_t SettingNr = Setting[0] - '0'; if ((Setting[1] == '\0') && (SettingNr < SETTINGS_COUNT)) { SettingsSetActiveById(SettingNr); - 15b0: 6c df rcall .-296 ; 0x148a - 15b2: 81 e0 ldi r24, 0x01 ; 1 + 15d0: 6c df rcall .-296 ; 0x14aa + 15d2: 81 e0 ldi r24, 0x01 ; 1 return true; - 15b4: 08 95 ret - 15b6: 80 e0 ldi r24, 0x00 ; 0 + 15d4: 08 95 ret + 15d6: 80 e0 ldi r24, 0x00 ; 0 } else { return false; - 15b8: 08 95 ret + 15d8: 08 95 ret -000015ba : +000015da : uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE]; TerminalStateEnum TerminalState = TERMINAL_UNINITIALIZED; static uint8_t TerminalInitDelay = INIT_DELAY; void TerminalSendString(const char* s) { - 15ba: bc 01 movw r22, r24 + 15da: bc 01 movw r22, r24 CDC_Device_SendString(&TerminalHandle, s); - 15bc: 80 e0 ldi r24, 0x00 ; 0 - 15be: 90 e2 ldi r25, 0x20 ; 32 - 15c0: 0c 94 2b 24 jmp 0x4856 ; 0x4856 + 15dc: 80 e0 ldi r24, 0x00 ; 0 + 15de: 90 e2 ldi r25, 0x20 ; 32 + 15e0: 0c 94 3b 24 jmp 0x4876 ; 0x4876 -000015c4 : +000015e4 : } - 15c4: cf 93 push r28 + 15e4: cf 93 push r28 void TerminalSendStringP(const char* s) { - 15c6: df 93 push r29 + 15e6: df 93 push r29 char c; while( (c = pgm_read_byte(s++)) != '\0' ) { - 15c8: fc 01 movw r30, r24 - 15ca: 64 91 lpm r22, Z - 15cc: 66 23 and r22, r22 - 15ce: 59 f0 breq .+22 ; 0x15e6 - 15d0: ec 01 movw r28, r24 - 15d2: 21 96 adiw r28, 0x01 ; 1 + 15e8: fc 01 movw r30, r24 + 15ea: 64 91 lpm r22, Z + 15ec: 66 23 and r22, r22 + 15ee: 59 f0 breq .+22 ; 0x1606 + 15f0: ec 01 movw r28, r24 + 15f2: 21 96 adiw r28, 0x01 ; 1 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); } - 15d4: 80 e0 ldi r24, 0x00 ; 0 - 15d6: 90 e2 ldi r25, 0x20 ; 32 - 15d8: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 15dc: fe 01 movw r30, r28 - 15de: 21 96 adiw r28, 0x01 ; 1 - 15e0: 64 91 lpm r22, Z - 15e2: 66 23 and r22, r22 - 15e4: b9 f7 brne .-18 ; 0x15d4 + 15f4: 80 e0 ldi r24, 0x00 ; 0 + 15f6: 90 e2 ldi r25, 0x20 ; 32 + 15f8: 0e 94 81 24 call 0x4902 ; 0x4902 + 15fc: fe 01 movw r30, r28 + 15fe: 21 96 adiw r28, 0x01 ; 1 + 1600: 64 91 lpm r22, Z + 1602: 66 23 and r22, r22 + 1604: b9 f7 brne .-18 ; 0x15f4 TerminalSendChar(c); } } - 15e6: df 91 pop r29 - 15e8: cf 91 pop r28 - 15ea: 08 95 ret + 1606: df 91 pop r29 + 1608: cf 91 pop r28 + 160a: 08 95 ret -000015ec : +0000160c : #endif void TerminalSendBlock(void* Buffer, uint16_t ByteCount) { - 15ec: 9c 01 movw r18, r24 - 15ee: ab 01 movw r20, r22 + 160c: 9c 01 movw r18, r24 + 160e: ab 01 movw r20, r22 CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); - 15f0: 80 e0 ldi r24, 0x00 ; 0 - 15f2: 90 e2 ldi r25, 0x20 ; 32 - 15f4: b9 01 movw r22, r18 - 15f6: 0c 94 4f 24 jmp 0x489e ; 0x489e + 1610: 80 e0 ldi r24, 0x00 ; 0 + 1612: 90 e2 ldi r25, 0x20 ; 32 + 1614: b9 01 movw r22, r18 + 1616: 0c 94 5f 24 jmp 0x48be ; 0x48be -000015fa : +0000161a : } - 15fa: 80 e2 ldi r24, 0x20 ; 32 + 161a: 80 e2 ldi r24, 0x20 ; 32 } } void TerminalInit(void) { TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK; - 15fc: e0 e6 ldi r30, 0x60 ; 96 - 15fe: f6 e0 ldi r31, 0x06 ; 6 - 1600: 82 83 std Z+2, r24 ; 0x02 + 161c: e0 e6 ldi r30, 0x60 ; 96 + 161e: f6 e0 ldi r31, 0x06 ; 6 + 1620: 82 83 std Z+2, r24 ; 0x02 } - 1602: 08 95 ret + 1622: 08 95 ret -00001604 : +00001624 : void TerminalTask(void) { - 1604: cf 93 push r28 - 1606: df 93 push r29 + 1624: cf 93 push r28 + 1626: df 93 push r29 CDC_Device_USBTask(&TerminalHandle); - 1608: 80 e0 ldi r24, 0x00 ; 0 - 160a: 90 e2 ldi r25, 0x20 ; 32 - 160c: 0e 94 e5 24 call 0x49ca ; 0x49ca + 1628: 80 e0 ldi r24, 0x00 ; 0 + 162a: 90 e2 ldi r25, 0x20 ; 32 + 162c: 0e 94 f5 24 call 0x49ea ; 0x49ea USB_USBTask(); - 1610: 0e 94 44 1e call 0x3c88 ; 0x3c88 + 1630: 0e 94 54 1e call 0x3ca8 ; 0x3ca8 CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); } static void ProcessByte(void) { int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle); - 1614: 80 e0 ldi r24, 0x00 ; 0 - 1616: 90 e2 ldi r25, 0x20 ; 32 - 1618: 0e 94 ff 24 call 0x49fe ; 0x49fe - 161c: ec 01 movw r28, r24 + 1634: 80 e0 ldi r24, 0x00 ; 0 + 1636: 90 e2 ldi r25, 0x20 ; 32 + 1638: 0e 94 0f 25 call 0x4a1e ; 0x4a1e + 163c: ec 01 movw r28, r24 if (Byte >= 0) { - 161e: 97 fd sbrc r25, 7 - 1620: 0a c0 rjmp .+20 ; 0x1636 + 163e: 97 fd sbrc r25, 7 + 1640: 0a c0 rjmp .+20 ; 0x1656 LED_PORT.OUTTGL = Mask; } static inline void LEDPulse(uint8_t Mask) { LEDPulseMask = Mask; - 1622: 80 e1 ldi r24, 0x10 ; 16 - 1624: 80 93 a3 20 sts 0x20A3, r24 + 1642: 80 e1 ldi r24, 0x10 ; 16 + 1644: 80 93 a3 20 sts 0x20A3, r24 LED_PORT.OUTSET = Mask; - 1628: e0 e0 ldi r30, 0x00 ; 0 - 162a: f6 e0 ldi r31, 0x06 ; 6 - 162c: 85 83 std Z+5, r24 ; 0x05 + 1648: e0 e0 ldi r30, 0x00 ; 0 + 164a: f6 e0 ldi r31, 0x06 ; 6 + 164c: 85 83 std Z+5, r24 ; 0x05 /* Byte received */ LEDPulse(LED_RED); if (XModemProcessByte(Byte)) { - 162e: 8c 2f mov r24, r28 - 1630: b3 d2 rcall .+1382 ; 0x1b98 - 1632: 88 23 and r24, r24 - 1634: 19 f0 breq .+6 ; 0x163c - 1636: df 91 pop r29 + 164e: 8c 2f mov r24, r28 + 1650: b3 d2 rcall .+1382 ; 0x1bb8 + 1652: 88 23 and r24, r24 + 1654: 19 f0 breq .+6 ; 0x165c + 1656: df 91 pop r29 { CDC_Device_USBTask(&TerminalHandle); USB_USBTask(); ProcessByte(); } - 1638: cf 91 pop r28 - 163a: 08 95 ret - 163c: 8c 2f mov r24, r28 + 1658: cf 91 pop r28 + 165a: 08 95 ret + 165c: 8c 2f mov r24, r28 /* Byte received */ LEDPulse(LED_RED); if (XModemProcessByte(Byte)) { /* XModem handled the byte */ } else if (CommandLineProcessByte(Byte)) { - 163e: 33 d4 rcall .+2150 ; 0x1ea6 - 1640: df 91 pop r29 - 1642: cf 91 pop r28 + 165e: 33 d4 rcall .+2150 ; 0x1ec6 + 1660: df 91 pop r29 + 1662: cf 91 pop r28 { CDC_Device_USBTask(&TerminalHandle); USB_USBTask(); ProcessByte(); } - 1644: 08 95 ret + 1664: 08 95 ret -00001646 : - 1646: 80 91 a4 20 lds r24, 0x20A4 +00001666 : + 1666: 80 91 a4 20 lds r24, 0x20A4 } } static void SenseVBus(void) { switch(TerminalState) { - 164a: 81 30 cpi r24, 0x01 ; 1 - 164c: 09 f1 breq .+66 ; 0x1690 - 164e: 81 30 cpi r24, 0x01 ; 1 - 1650: 30 f0 brcs .+12 ; 0x165e - 1652: 82 30 cpi r24, 0x02 ; 2 - 1654: 59 f1 breq .+86 ; 0x16ac - 1656: 83 30 cpi r24, 0x03 ; 3 - 1658: 71 f0 breq .+28 ; 0x1676 + 166a: 81 30 cpi r24, 0x01 ; 1 + 166c: 09 f1 breq .+66 ; 0x16b0 + 166e: 81 30 cpi r24, 0x01 ; 1 + 1670: 30 f0 brcs .+12 ; 0x167e + 1672: 82 30 cpi r24, 0x02 ; 2 + 1674: 59 f1 breq .+86 ; 0x16cc + 1676: 83 30 cpi r24, 0x03 ; 3 + 1678: 71 f0 breq .+28 ; 0x1696 void TerminalTick(void) { SenseVBus(); XModemTick(); - 165a: f7 d3 rcall .+2030 ; 0x1e4a - 165c: c7 c5 rjmp .+2958 ; 0x21ec + 167a: f7 d3 rcall .+2030 ; 0x1e6a + 167c: c7 c5 rjmp .+2958 ; 0x220c CommandLineTick(); - 165e: 80 91 68 06 lds r24, 0x0668 + 167e: 80 91 68 06 lds r24, 0x0668 } - 1662: 85 ff sbrs r24, 5 + 1682: 85 ff sbrs r24, 5 static void SenseVBus(void) { switch(TerminalState) { case TERMINAL_UNINITIALIZED: if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { - 1664: fa cf rjmp .-12 ; 0x165a - 1666: 84 e1 ldi r24, 0x14 ; 20 - 1668: 80 93 1b 20 sts 0x201B, r24 + 1684: fa cf rjmp .-12 ; 0x167a + 1686: 84 e1 ldi r24, 0x14 ; 20 + 1688: 80 93 1b 20 sts 0x201B, r24 /* Not initialized and VBUS sense high */ TerminalInitDelay = INIT_DELAY; - 166c: 81 e0 ldi r24, 0x01 ; 1 - 166e: 80 93 a4 20 sts 0x20A4, r24 + 168c: 81 e0 ldi r24, 0x01 ; 1 + 168e: 80 93 a4 20 sts 0x20A4, r24 TerminalState = TERMINAL_INITIALIZING; - 1672: eb d3 rcall .+2006 ; 0x1e4a - 1674: bb c5 rjmp .+2934 ; 0x21ec - 1676: 80 91 1b 20 lds r24, 0x201B + 1692: eb d3 rcall .+2006 ; 0x1e6a + 1694: bb c5 rjmp .+2934 ; 0x220c + 1696: 80 91 1b 20 lds r24, 0x201B void TerminalTick(void) { SenseVBus(); XModemTick(); - 167a: 81 50 subi r24, 0x01 ; 1 + 169a: 81 50 subi r24, 0x01 ; 1 CommandLineTick(); - 167c: 80 93 1b 20 sts 0x201B, r24 + 169c: 80 93 1b 20 sts 0x201B, r24 } - 1680: 88 23 and r24, r24 + 16a0: 88 23 and r24, r24 TerminalState = TERMINAL_UNITIALIZING; } break; case TERMINAL_UNITIALIZING: if (--TerminalInitDelay == 0) { - 1682: 59 f7 brne .-42 ; 0x165a - 1684: 0e 94 78 22 call 0x44f0 ; 0x44f0 - 1688: d3 d8 rcall .-3674 ; 0x830 - 168a: 10 92 a4 20 sts 0x20A4, r1 - 168e: e5 cf rjmp .-54 ; 0x165a + 16a2: 59 f7 brne .-42 ; 0x167a + 16a4: 0e 94 88 22 call 0x4510 ; 0x4510 + 16a8: d3 d8 rcall .-3674 ; 0x850 + 16aa: 10 92 a4 20 sts 0x20A4, r1 + 16ae: e5 cf rjmp .-54 ; 0x167a USB_Disable(); - 1690: 80 91 1b 20 lds r24, 0x201B + 16b0: 80 91 1b 20 lds r24, 0x201B SystemStopUSBClock(); - 1694: 81 50 subi r24, 0x01 ; 1 - 1696: 80 93 1b 20 sts 0x201B, r24 + 16b4: 81 50 subi r24, 0x01 ; 1 + 16b6: 80 93 1b 20 sts 0x201B, r24 TerminalState = TERMINAL_UNINITIALIZED; - 169a: 88 23 and r24, r24 - 169c: f1 f6 brne .-68 ; 0x165a + 16ba: 88 23 and r24, r24 + 16bc: f1 f6 brne .-68 ; 0x167a TerminalState = TERMINAL_INITIALIZING; } break; case TERMINAL_INITIALIZING: if (--TerminalInitDelay == 0) { - 169e: ad d8 rcall .-3750 ; 0x7fa - 16a0: 0e 94 b3 22 call 0x4566 ; 0x4566 - 16a4: 82 e0 ldi r24, 0x02 ; 2 - 16a6: 80 93 a4 20 sts 0x20A4, r24 - 16aa: d7 cf rjmp .-82 ; 0x165a + 16be: ad d8 rcall .-3750 ; 0x81a + 16c0: 0e 94 c3 22 call 0x4586 ; 0x4586 + 16c4: 82 e0 ldi r24, 0x02 ; 2 + 16c6: 80 93 a4 20 sts 0x20A4, r24 + 16ca: d7 cf rjmp .-82 ; 0x167a SystemStartUSBClock(); - 16ac: 80 91 68 06 lds r24, 0x0668 + 16cc: 80 91 68 06 lds r24, 0x0668 USB_Init(); - 16b0: 85 fd sbrc r24, 5 - 16b2: d3 cf rjmp .-90 ; 0x165a + 16d0: 85 fd sbrc r24, 5 + 16d2: d3 cf rjmp .-90 ; 0x167a TerminalState = TERMINAL_INITIALIZED; - 16b4: 84 e1 ldi r24, 0x14 ; 20 - 16b6: 80 93 1b 20 sts 0x201B, r24 - 16ba: 83 e0 ldi r24, 0x03 ; 3 + 16d4: 84 e1 ldi r24, 0x14 ; 20 + 16d6: 80 93 1b 20 sts 0x201B, r24 + 16da: 83 e0 ldi r24, 0x03 ; 3 } break; case TERMINAL_INITIALIZED: if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { - 16bc: 80 93 a4 20 sts 0x20A4, r24 - 16c0: c4 d3 rcall .+1928 ; 0x1e4a - 16c2: 94 c5 rjmp .+2856 ; 0x21ec + 16dc: 80 93 a4 20 sts 0x20A4, r24 + 16e0: c4 d3 rcall .+1928 ; 0x1e6a + 16e2: 94 c5 rjmp .+2856 ; 0x220c -000016c4 : +000016e4 : /* Initialized and VBUS sense low */ TerminalInitDelay = INIT_DELAY; - 16c4: 80 e2 ldi r24, 0x20 ; 32 - 16c6: e0 e0 ldi r30, 0x00 ; 0 - 16c8: f6 e0 ldi r31, 0x06 ; 6 + 16e4: 80 e2 ldi r24, 0x20 ; 32 + 16e6: e0 e0 ldi r30, 0x00 ; 0 + 16e8: f6 e0 ldi r31, 0x06 ; 6 TerminalState = TERMINAL_UNITIALIZING; - 16ca: 85 83 std Z+5, r24 ; 0x05 - 16cc: 08 95 ret + 16ea: 85 83 std Z+5, r24 ; 0x05 + 16ec: 08 95 ret -000016ce : - 16ce: 80 e2 ldi r24, 0x20 ; 32 +000016ee : + 16ee: 80 e2 ldi r24, 0x20 ; 32 void TerminalTick(void) { SenseVBus(); XModemTick(); - 16d0: e0 e0 ldi r30, 0x00 ; 0 - 16d2: f6 e0 ldi r31, 0x06 ; 6 + 16f0: e0 e0 ldi r30, 0x00 ; 0 + 16f2: f6 e0 ldi r31, 0x06 ; 6 CommandLineTick(); - 16d4: 86 83 std Z+6, r24 ; 0x06 - 16d6: 08 95 ret + 16f4: 86 83 std Z+6, r24 ; 0x06 + 16f6: 08 95 ret -000016d8 : +000016f8 : } - 16d8: 80 e0 ldi r24, 0x00 ; 0 + 16f8: 80 e0 ldi r24, 0x00 ; 0 /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { CDC_Device_ConfigureEndpoints(&TerminalHandle); - 16da: 90 e2 ldi r25, 0x20 ; 32 - 16dc: 0c 94 05 24 jmp 0x480a ; 0x480a + 16fa: 90 e2 ldi r25, 0x20 ; 32 + 16fc: 0c 94 15 24 jmp 0x482a ; 0x482a -000016e0 : +00001700 : } - 16e0: 80 e0 ldi r24, 0x00 ; 0 + 1700: 80 e0 ldi r24, 0x00 ; 0 /** Event handler for the library USB Control Request reception event. */ void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&TerminalHandle); - 16e2: 90 e2 ldi r25, 0x20 ; 32 - 16e4: 0c 94 5a 23 jmp 0x46b4 ; 0x46b4 + 1702: 90 e2 ldi r25, 0x20 ; 32 + 1704: 0c 94 6a 23 jmp 0x46d4 ; 0x46d4 -000016e8 : +00001708 : extern const PROGMEM CommandEntryType CommandTable[]; CommandStatusIdType CommandGetVersion(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR( - 16e8: 2d b7 in r18, 0x3d ; 61 - 16ea: 3e b7 in r19, 0x3e ; 62 - 16ec: 2c 50 subi r18, 0x0C ; 12 - 16ee: 30 40 sbci r19, 0x00 ; 0 - 16f0: 2d bf out 0x3d, r18 ; 61 - 16f2: 3e bf out 0x3e, r19 ; 62 - 16f4: ed b7 in r30, 0x3d ; 61 - 16f6: fe b7 in r31, 0x3e ; 62 - 16f8: 31 96 adiw r30, 0x01 ; 1 - 16fa: ad b7 in r26, 0x3d ; 61 - 16fc: be b7 in r27, 0x3e ; 62 - 16fe: 11 96 adiw r26, 0x01 ; 1 - 1700: 8d 93 st X+, r24 - 1702: 9c 93 st X, r25 - 1704: 12 97 sbiw r26, 0x02 ; 2 - 1706: 80 e0 ldi r24, 0x00 ; 0 - 1708: 91 e0 ldi r25, 0x01 ; 1 - 170a: 82 83 std Z+2, r24 ; 0x02 - 170c: 93 83 std Z+3, r25 ; 0x03 - 170e: 87 eb ldi r24, 0xB7 ; 183 - 1710: 93 e0 ldi r25, 0x03 ; 3 - 1712: 84 83 std Z+4, r24 ; 0x04 - 1714: 95 83 std Z+5, r25 ; 0x05 - 1716: 80 ef ldi r24, 0xF0 ; 240 - 1718: 93 e0 ldi r25, 0x03 ; 3 - 171a: 86 83 std Z+6, r24 ; 0x06 - 171c: 97 83 std Z+7, r25 ; 0x07 - 171e: 87 ef ldi r24, 0xF7 ; 247 - 1720: 93 e0 ldi r25, 0x03 ; 3 - 1722: 80 87 std Z+8, r24 ; 0x08 - 1724: 91 87 std Z+9, r25 ; 0x09 - 1726: 8e ef ldi r24, 0xFE ; 254 - 1728: 93 e0 ldi r25, 0x03 ; 3 - 172a: 82 87 std Z+10, r24 ; 0x0a - 172c: 93 87 std Z+11, r25 ; 0x0b - 172e: 0e 94 0c 26 call 0x4c18 ; 0x4c18 + 1708: 2d b7 in r18, 0x3d ; 61 + 170a: 3e b7 in r19, 0x3e ; 62 + 170c: 2c 50 subi r18, 0x0C ; 12 + 170e: 30 40 sbci r19, 0x00 ; 0 + 1710: 2d bf out 0x3d, r18 ; 61 + 1712: 3e bf out 0x3e, r19 ; 62 + 1714: ed b7 in r30, 0x3d ; 61 + 1716: fe b7 in r31, 0x3e ; 62 + 1718: 31 96 adiw r30, 0x01 ; 1 + 171a: ad b7 in r26, 0x3d ; 61 + 171c: be b7 in r27, 0x3e ; 62 + 171e: 11 96 adiw r26, 0x01 ; 1 + 1720: 8d 93 st X+, r24 + 1722: 9c 93 st X, r25 + 1724: 12 97 sbiw r26, 0x02 ; 2 + 1726: 80 e0 ldi r24, 0x00 ; 0 + 1728: 91 e0 ldi r25, 0x01 ; 1 + 172a: 82 83 std Z+2, r24 ; 0x02 + 172c: 93 83 std Z+3, r25 ; 0x03 + 172e: 87 ed ldi r24, 0xD7 ; 215 + 1730: 93 e0 ldi r25, 0x03 ; 3 + 1732: 84 83 std Z+4, r24 ; 0x04 + 1734: 95 83 std Z+5, r25 ; 0x05 + 1736: 80 e1 ldi r24, 0x10 ; 16 + 1738: 94 e0 ldi r25, 0x04 ; 4 + 173a: 86 83 std Z+6, r24 ; 0x06 + 173c: 97 83 std Z+7, r25 ; 0x07 + 173e: 87 e1 ldi r24, 0x17 ; 23 + 1740: 94 e0 ldi r25, 0x04 ; 4 + 1742: 80 87 std Z+8, r24 ; 0x08 + 1744: 91 87 std Z+9, r25 ; 0x09 + 1746: 8e e1 ldi r24, 0x1E ; 30 + 1748: 94 e0 ldi r25, 0x04 ; 4 + 174a: 82 87 std Z+10, r24 ; 0x0a + 174c: 93 87 std Z+11, r25 ; 0x0b + 174e: 0e 94 1c 26 call 0x4c38 ; 0x4c38 "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; - 1732: 2d b7 in r18, 0x3d ; 61 - 1734: 3e b7 in r19, 0x3e ; 62 - 1736: 24 5f subi r18, 0xF4 ; 244 - 1738: 3f 4f sbci r19, 0xFF ; 255 - 173a: 2d bf out 0x3d, r18 ; 61 - 173c: 3e bf out 0x3e, r19 ; 62 + 1752: 2d b7 in r18, 0x3d ; 61 + 1754: 3e b7 in r19, 0x3e ; 62 + 1756: 24 5f subi r18, 0xF4 ; 244 + 1758: 3f 4f sbci r19, 0xFF ; 255 + 175a: 2d bf out 0x3d, r18 ; 61 + 175c: 3e bf out 0x3e, r19 ; 62 } - 173e: 85 e6 ldi r24, 0x65 ; 101 - 1740: 08 95 ret + 175e: 85 e6 ldi r24, 0x65 ; 101 + 1760: 08 95 ret -00001742 : +00001762 : CommandStatusIdType CommandGetConfig(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 1742: 2d b7 in r18, 0x3d ; 61 - 1744: 3e b7 in r19, 0x3e ; 62 - 1746: 28 50 subi r18, 0x08 ; 8 - 1748: 30 40 sbci r19, 0x00 ; 0 - 174a: 2d bf out 0x3d, r18 ; 61 - 174c: 3e bf out 0x3e, r19 ; 62 - 174e: ed b7 in r30, 0x3d ; 61 - 1750: fe b7 in r31, 0x3e ; 62 - 1752: 31 96 adiw r30, 0x01 ; 1 - 1754: ad b7 in r26, 0x3d ; 61 - 1756: be b7 in r27, 0x3e ; 62 - 1758: 11 96 adiw r26, 0x01 ; 1 - 175a: 8d 93 st X+, r24 - 175c: 9c 93 st X, r25 - 175e: 12 97 sbiw r26, 0x02 ; 2 - 1760: 80 e0 ldi r24, 0x00 ; 0 - 1762: 91 e0 ldi r25, 0x01 ; 1 - 1764: 82 83 std Z+2, r24 ; 0x02 - 1766: 93 83 std Z+3, r25 ; 0x03 - 1768: 84 e0 ldi r24, 0x04 ; 4 - 176a: 94 e0 ldi r25, 0x04 ; 4 - 176c: 84 83 std Z+4, r24 ; 0x04 - 176e: 95 83 std Z+5, r25 ; 0x05 - 1770: 89 ee ldi r24, 0xE9 ; 233 - 1772: 90 e2 ldi r25, 0x20 ; 32 - 1774: 86 83 std Z+6, r24 ; 0x06 - 1776: 97 83 std Z+7, r25 ; 0x07 - 1778: 0e 94 0c 26 call 0x4c18 ; 0x4c18 + 1762: 2d b7 in r18, 0x3d ; 61 + 1764: 3e b7 in r19, 0x3e ; 62 + 1766: 28 50 subi r18, 0x08 ; 8 + 1768: 30 40 sbci r19, 0x00 ; 0 + 176a: 2d bf out 0x3d, r18 ; 61 + 176c: 3e bf out 0x3e, r19 ; 62 + 176e: ed b7 in r30, 0x3d ; 61 + 1770: fe b7 in r31, 0x3e ; 62 + 1772: 31 96 adiw r30, 0x01 ; 1 + 1774: ad b7 in r26, 0x3d ; 61 + 1776: be b7 in r27, 0x3e ; 62 + 1778: 11 96 adiw r26, 0x01 ; 1 + 177a: 8d 93 st X+, r24 + 177c: 9c 93 st X, r25 + 177e: 12 97 sbiw r26, 0x02 ; 2 + 1780: 80 e0 ldi r24, 0x00 ; 0 + 1782: 91 e0 ldi r25, 0x01 ; 1 + 1784: 82 83 std Z+2, r24 ; 0x02 + 1786: 93 83 std Z+3, r25 ; 0x03 + 1788: 84 e2 ldi r24, 0x24 ; 36 + 178a: 94 e0 ldi r25, 0x04 ; 4 + 178c: 84 83 std Z+4, r24 ; 0x04 + 178e: 95 83 std Z+5, r25 ; 0x05 + 1790: 89 ee ldi r24, 0xE9 ; 233 + 1792: 90 e2 ldi r25, 0x20 ; 32 + 1794: 86 83 std Z+6, r24 ; 0x06 + 1796: 97 83 std Z+7, r25 ; 0x07 + 1798: 0e 94 1c 26 call 0x4c38 ; 0x4c38 PSTR("%s"), ActiveConfiguration.ConfigurationName); return COMMAND_INFO_OK_WITH_TEXT_ID; - 177c: 2d b7 in r18, 0x3d ; 61 - 177e: 3e b7 in r19, 0x3e ; 62 - 1780: 28 5f subi r18, 0xF8 ; 248 - 1782: 3f 4f sbci r19, 0xFF ; 255 - 1784: 2d bf out 0x3d, r18 ; 61 - 1786: 3e bf out 0x3e, r19 ; 62 + 179c: 2d b7 in r18, 0x3d ; 61 + 179e: 3e b7 in r19, 0x3e ; 62 + 17a0: 28 5f subi r18, 0xF8 ; 248 + 17a2: 3f 4f sbci r19, 0xFF ; 255 + 17a4: 2d bf out 0x3d, r18 ; 61 + 17a6: 3e bf out 0x3e, r19 ; 62 } - 1788: 85 e6 ldi r24, 0x65 ; 101 - 178a: 08 95 ret + 17a8: 85 e6 ldi r24, 0x65 ; 101 + 17aa: 08 95 ret -0000178c : +000017ac : CommandStatusIdType CommandSetConfig(const char* InParam) { if (ConfigurationSetByName(InParam)) { - 178c: 9e d8 rcall .-3780 ; 0x8ca - 178e: 88 23 and r24, r24 - 1790: 11 f4 brne .+4 ; 0x1796 - 1792: 8a ec ldi r24, 0xCA ; 202 + 17ac: 9e d8 rcall .-3780 ; 0x8ea + 17ae: 88 23 and r24, r24 + 17b0: 11 f4 brne .+4 ; 0x17b6 + 17b2: 8a ec ldi r24, 0xCA ; 202 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 1794: 08 95 ret + 17b4: 08 95 ret } } - 1796: 71 de rcall .-798 ; 0x147a + 17b6: 71 de rcall .-798 ; 0x149a } CommandStatusIdType CommandSetConfig(const char* InParam) { if (ConfigurationSetByName(InParam)) { SettingsSave(); - 1798: 84 e6 ldi r24, 0x64 ; 100 - 179a: 08 95 ret + 17b8: 84 e6 ldi r24, 0x64 ; 100 + 17ba: 08 95 ret -0000179c : +000017bc : return COMMAND_INFO_OK_ID; - 179c: 60 e0 ldi r22, 0x00 ; 0 - 179e: 71 e0 ldi r23, 0x01 ; 1 + 17bc: 60 e0 ldi r22, 0x00 ; 0 + 17be: 71 e0 ldi r23, 0x01 ; 1 } } CommandStatusIdType CommandExecConfig(char* OutMessage) { ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); - 17a0: dc d8 rcall .-3656 ; 0x95a - 17a2: 85 e6 ldi r24, 0x65 ; 101 + 17c0: dc d8 rcall .-3656 ; 0x97a + 17c2: 85 e6 ldi r24, 0x65 ; 101 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 17a4: 08 95 ret + 17c4: 08 95 ret -000017a6 : - 17a6: 0f 93 push r16 +000017c6 : + 17c6: 0f 93 push r16 CommandStatusIdType CommandGetUid(char* OutParam) { - 17a8: 1f 93 push r17 - 17aa: cf 93 push r28 - 17ac: df 93 push r29 - 17ae: cd b7 in r28, 0x3d ; 61 - 17b0: de b7 in r29, 0x3e ; 62 - 17b2: a1 97 sbiw r28, 0x21 ; 33 - 17b4: cd bf out 0x3d, r28 ; 61 - 17b6: de bf out 0x3e, r29 ; 62 - 17b8: 8c 01 movw r16, r24 + 17c8: 1f 93 push r17 + 17ca: cf 93 push r28 + 17cc: df 93 push r29 + 17ce: cd b7 in r28, 0x3d ; 61 + 17d0: de b7 in r29, 0x3e ; 62 + 17d2: a1 97 sbiw r28, 0x21 ; 33 + 17d4: cd bf out 0x3d, r28 ; 61 + 17d6: de bf out 0x3e, r29 ; 62 + 17d8: 8c 01 movw r16, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; - 17ba: 20 91 0b 21 lds r18, 0x210B + 17da: 20 91 0b 21 lds r18, 0x210B INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); } INLINE void ApplicationGetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationGetUidFunc(Uid); - 17be: e0 91 05 21 lds r30, 0x2105 - 17c2: f0 91 06 21 lds r31, 0x2106 - 17c6: ce 01 movw r24, r28 - 17c8: 01 96 adiw r24, 0x01 ; 1 - 17ca: 29 a3 lds r18, 0x59 - 17cc: 09 95 icall + 17de: e0 91 05 21 lds r30, 0x2105 + 17e2: f0 91 06 21 lds r31, 0x2106 + 17e6: ce 01 movw r24, r28 + 17e8: 01 96 adiw r24, 0x01 ; 1 + 17ea: 29 a3 lds r18, 0x59 + 17ec: 09 95 icall ApplicationGetUid(UidBuffer); BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE, - 17ce: c8 01 movw r24, r16 - 17d0: 60 e0 ldi r22, 0x00 ; 0 - 17d2: 71 e0 ldi r23, 0x01 ; 1 - 17d4: ae 01 movw r20, r28 - 17d6: 4f 5f subi r20, 0xFF ; 255 - 17d8: 5f 4f sbci r21, 0xFF ; 255 - 17da: 29 a1 lds r18, 0x49 - 17dc: 30 e0 ldi r19, 0x00 ; 0 - 17de: 1a d9 rcall .-3532 ; 0xa14 - 17e0: 85 e6 ldi r24, 0x65 ; 101 + 17ee: c8 01 movw r24, r16 + 17f0: 60 e0 ldi r22, 0x00 ; 0 + 17f2: 71 e0 ldi r23, 0x01 ; 1 + 17f4: ae 01 movw r20, r28 + 17f6: 4f 5f subi r20, 0xFF ; 255 + 17f8: 5f 4f sbci r21, 0xFF ; 255 + 17fa: 29 a1 lds r18, 0x49 + 17fc: 30 e0 ldi r19, 0x00 ; 0 + 17fe: 1a d9 rcall .-3532 ; 0xa34 + 1800: 85 e6 ldi r24, 0x65 ; 101 UidBuffer, UidSize); return COMMAND_INFO_OK_WITH_TEXT_ID; } - 17e2: a1 96 adiw r28, 0x21 ; 33 - 17e4: cd bf out 0x3d, r28 ; 61 - 17e6: de bf out 0x3e, r29 ; 62 - 17e8: df 91 pop r29 - 17ea: cf 91 pop r28 - 17ec: 1f 91 pop r17 - 17ee: 0f 91 pop r16 - 17f0: 08 95 ret + 1802: a1 96 adiw r28, 0x21 ; 33 + 1804: cd bf out 0x3d, r28 ; 61 + 1806: de bf out 0x3e, r29 ; 62 + 1808: df 91 pop r29 + 180a: cf 91 pop r28 + 180c: 1f 91 pop r17 + 180e: 0f 91 pop r16 + 1810: 08 95 ret -000017f2 : - 17f2: bf 92 push r11 +00001812 : + 1812: bf 92 push r11 CommandStatusIdType CommandSetUid(const char* InParam) { - 17f4: cf 92 push r12 - 17f6: df 92 push r13 - 17f8: ef 92 push r14 - 17fa: ff 92 push r15 - 17fc: 0f 93 push r16 - 17fe: 1f 93 push r17 - 1800: cf 93 push r28 - 1802: df 93 push r29 - 1804: cd b7 in r28, 0x3d ; 61 - 1806: de b7 in r29, 0x3e ; 62 - 1808: a0 97 sbiw r28, 0x20 ; 32 - 180a: cd bf out 0x3d, r28 ; 61 - 180c: de bf out 0x3e, r29 ; 62 - 180e: 8c 01 movw r16, r24 + 1814: cf 92 push r12 + 1816: df 92 push r13 + 1818: ef 92 push r14 + 181a: ff 92 push r15 + 181c: 0f 93 push r16 + 181e: 1f 93 push r17 + 1820: cf 93 push r28 + 1822: df 93 push r29 + 1824: cd b7 in r28, 0x3d ; 61 + 1826: de b7 in r29, 0x3e ; 62 + 1828: a0 97 sbiw r28, 0x20 ; 32 + 182a: cd bf out 0x3d, r28 ; 61 + 182c: de bf out 0x3e, r29 ; 62 + 182e: 8c 01 movw r16, r24 uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; uint16_t UidSize = ActiveConfiguration.UidSize; - 1810: e0 90 0b 21 lds r14, 0x210B - 1814: ff 24 eor r15, r15 + 1830: e0 90 0b 21 lds r14, 0x210B + 1834: ff 24 eor r15, r15 if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { - 1816: 67 e0 ldi r22, 0x07 ; 7 - 1818: 74 e0 ldi r23, 0x04 ; 4 - 181a: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 181e: 00 97 sbiw r24, 0x00 ; 0 - 1820: 49 f5 brne .+82 ; 0x1874 + 1836: 67 e2 ldi r22, 0x27 ; 39 + 1838: 74 e0 ldi r23, 0x04 ; 4 + 183a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 183e: 00 97 sbiw r24, 0x00 ; 0 + 1840: 49 f5 brne .+82 ; 0x1894 /* Load with random bytes */ for (uint8_t i=0; i - 1828: bb 24 eor r11, r11 - 182a: 00 e0 ldi r16, 0x00 ; 0 - 182c: 10 e0 ldi r17, 0x00 ; 0 - 182e: 6e 01 movw r12, r28 - 1830: 08 94 sec - 1832: c1 1c adc r12, r1 - 1834: d1 1c adc r13, r1 + 1842: e1 14 cp r14, r1 + 1844: f1 04 cpc r15, r1 + 1846: a1 f1 breq .+104 ; 0x18b0 + 1848: bb 24 eor r11, r11 + 184a: 00 e0 ldi r16, 0x00 ; 0 + 184c: 10 e0 ldi r17, 0x00 ; 0 + 184e: 6e 01 movw r12, r28 + 1850: 08 94 sec + 1852: c1 1c adc r12, r1 + 1854: d1 1c adc r13, r1 UidBuffer[i] = RandomGetByte(); - 1836: cc d8 rcall .-3688 ; 0x9d0 - 1838: f6 01 movw r30, r12 - 183a: e0 0f add r30, r16 - 183c: f1 1f adc r31, r17 - 183e: 80 83 st Z, r24 - 1840: b3 94 inc r11 + 1856: cc d8 rcall .-3688 ; 0x9f0 + 1858: f6 01 movw r30, r12 + 185a: e0 0f add r30, r16 + 185c: f1 1f adc r31, r17 + 185e: 80 83 st Z, r24 + 1860: b3 94 inc r11 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 - 184c: e0 91 07 21 lds r30, 0x2107 + 1862: 0b 2d mov r16, r11 + 1864: 10 e0 ldi r17, 0x00 ; 0 + 1866: 0e 15 cp r16, r14 + 1868: 1f 05 cpc r17, r15 + 186a: a8 f3 brcs .-22 ; 0x1856 + 186c: e0 91 07 21 lds r30, 0x2107 } INLINE void ApplicationSetUid(ConfigurationUidType Uid) { ActiveConfiguration.ApplicationSetUidFunc(Uid); - 1850: f0 91 08 21 lds r31, 0x2108 - 1854: c6 01 movw r24, r12 - 1856: 09 95 icall - 1858: 84 e6 ldi r24, 0x64 ; 100 + 1870: f0 91 08 21 lds r31, 0x2108 + 1874: c6 01 movw r24, r12 + 1876: 09 95 icall + 1878: 84 e6 ldi r24, 0x64 ; 100 } } ApplicationSetUid(UidBuffer); return COMMAND_INFO_OK_ID; - 185a: a0 96 adiw r28, 0x20 ; 32 + 187a: a0 96 adiw r28, 0x20 ; 32 } - 185c: cd bf out 0x3d, r28 ; 61 - 185e: de bf out 0x3e, r29 ; 62 - 1860: df 91 pop r29 - 1862: cf 91 pop r28 - 1864: 1f 91 pop r17 - 1866: 0f 91 pop r16 - 1868: ff 90 pop r15 - 186a: ef 90 pop r14 - 186c: df 90 pop r13 - 186e: cf 90 pop r12 - 1870: bf 90 pop r11 - 1872: 08 95 ret - 1874: 6e 01 movw r12, r28 + 187c: cd bf out 0x3d, r28 ; 61 + 187e: de bf out 0x3e, r29 ; 62 + 1880: df 91 pop r29 + 1882: cf 91 pop r28 + 1884: 1f 91 pop r17 + 1886: 0f 91 pop r16 + 1888: ff 90 pop r15 + 188a: ef 90 pop r14 + 188c: df 90 pop r13 + 188e: cf 90 pop r12 + 1890: bf 90 pop r11 + 1892: 08 95 ret + 1894: 6e 01 movw r12, r28 for (uint8_t i=0; i - 1886: 8e 15 cp r24, r14 - 1888: 9f 05 cpc r25, r15 - 188a: 01 f3 breq .-64 ; 0x184c - 188c: 8a ec ldi r24, 0xCA ; 202 - 188e: e5 cf rjmp .-54 ; 0x185a + 1896: 08 94 sec + 1898: c1 1c adc r12, r1 + 189a: d1 1c adc r13, r1 + 189c: c6 01 movw r24, r12 + 189e: 60 e2 ldi r22, 0x20 ; 32 + 18a0: 70 e0 ldi r23, 0x00 ; 0 + 18a2: a8 01 movw r20, r16 + 18a4: 04 d9 rcall .-3576 ; 0xaae + 18a6: 8e 15 cp r24, r14 + 18a8: 9f 05 cpc r25, r15 + 18aa: 01 f3 breq .-64 ; 0x186c + 18ac: 8a ec ldi r24, 0xCA ; 202 + 18ae: e5 cf rjmp .-54 ; 0x187a /* Malformed input. Abort */ return COMMAND_ERR_INVALID_PARAM_ID; - 1890: 6e 01 movw r12, r28 - 1892: 08 94 sec - 1894: c1 1c adc r12, r1 - 1896: d1 1c adc r13, r1 - 1898: d9 cf rjmp .-78 ; 0x184c + 18b0: 6e 01 movw r12, r28 + 18b2: 08 94 sec + 18b4: c1 1c adc r12, r1 + 18b6: d1 1c adc r13, r1 + 18b8: d9 cf rjmp .-78 ; 0x186c -0000189a : - 189a: fc 01 movw r30, r24 - 189c: 80 91 0c 21 lds r24, 0x210C +000018ba : + 18ba: fc 01 movw r30, r24 + 18bc: 80 91 0c 21 lds r24, 0x210C return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetReadOnly(char* OutParam) { if (ActiveConfiguration.ReadOnly) { - 18a0: 88 23 and r24, r24 - 18a2: 29 f4 brne .+10 ; 0x18ae + 18c0: 88 23 and r24, r24 + 18c2: 29 f4 brne .+10 ; 0x18ce OutParam[0] = COMMAND_CHAR_TRUE; } else { OutParam[0] = COMMAND_CHAR_FALSE; - 18a4: 80 e3 ldi r24, 0x30 ; 48 - 18a6: 80 83 st Z, r24 + 18c4: 80 e3 ldi r24, 0x30 ; 48 + 18c6: 80 83 st Z, r24 } OutParam[1] = '\0'; - 18a8: 11 82 std Z+1, r1 ; 0x01 + 18c8: 11 82 std Z+1, r1 ; 0x01 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 18aa: 85 e6 ldi r24, 0x65 ; 101 - 18ac: 08 95 ret + 18ca: 85 e6 ldi r24, 0x65 ; 101 + 18cc: 08 95 ret } CommandStatusIdType CommandGetReadOnly(char* OutParam) { if (ActiveConfiguration.ReadOnly) { OutParam[0] = COMMAND_CHAR_TRUE; - 18ae: 81 e3 ldi r24, 0x31 ; 49 - 18b0: 80 83 st Z, r24 + 18ce: 81 e3 ldi r24, 0x31 ; 49 + 18d0: 80 83 st Z, r24 } else { OutParam[0] = COMMAND_CHAR_FALSE; } OutParam[1] = '\0'; - 18b2: 11 82 std Z+1, r1 ; 0x01 + 18d2: 11 82 std Z+1, r1 ; 0x01 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 18b4: 85 e6 ldi r24, 0x65 ; 101 - 18b6: 08 95 ret + 18d4: 85 e6 ldi r24, 0x65 ; 101 + 18d6: 08 95 ret -000018b8 : +000018d8 : CommandStatusIdType CommandSetReadOnly(const char* InParam) { - 18b8: fc 01 movw r30, r24 + 18d8: fc 01 movw r30, r24 if (InParam[1] == '\0') { - 18ba: 81 81 ldd r24, Z+1 ; 0x01 - 18bc: 88 23 and r24, r24 - 18be: 39 f4 brne .+14 ; 0x18ce + 18da: 81 81 ldd r24, Z+1 ; 0x01 + 18dc: 88 23 and r24, r24 + 18de: 39 f4 brne .+14 ; 0x18ee if (InParam[0] == COMMAND_CHAR_TRUE) { - 18c0: 80 81 ld r24, Z - 18c2: 81 33 cpi r24, 0x31 ; 49 - 18c4: 31 f0 breq .+12 ; 0x18d2 + 18e0: 80 81 ld r24, Z + 18e2: 81 33 cpi r24, 0x31 ; 49 + 18e4: 31 f0 breq .+12 ; 0x18f2 ActiveConfiguration.ReadOnly = true; return COMMAND_INFO_OK_ID; } else if (InParam[0] == COMMAND_CHAR_FALSE) { - 18c6: 80 33 cpi r24, 0x30 ; 48 - 18c8: 49 f0 breq .+18 ; 0x18dc + 18e6: 80 33 cpi r24, 0x30 ; 48 + 18e8: 49 f0 breq .+18 ; 0x18fc ActiveConfiguration.ReadOnly = false; return COMMAND_INFO_OK_ID; } } return COMMAND_ERR_INVALID_PARAM_ID; - 18ca: 8a ec ldi r24, 0xCA ; 202 + 18ea: 8a ec ldi r24, 0xCA ; 202 } - 18cc: 08 95 ret + 18ec: 08 95 ret ActiveConfiguration.ReadOnly = false; return COMMAND_INFO_OK_ID; } } return COMMAND_ERR_INVALID_PARAM_ID; - 18ce: 8a ec ldi r24, 0xCA ; 202 - 18d0: 08 95 ret + 18ee: 8a ec ldi r24, 0xCA ; 202 + 18f0: 08 95 ret CommandStatusIdType CommandSetReadOnly(const char* InParam) { if (InParam[1] == '\0') { if (InParam[0] == COMMAND_CHAR_TRUE) { ActiveConfiguration.ReadOnly = true; - 18d2: 81 e0 ldi r24, 0x01 ; 1 - 18d4: 80 93 0c 21 sts 0x210C, r24 + 18f2: 81 e0 ldi r24, 0x01 ; 1 + 18f4: 80 93 0c 21 sts 0x210C, r24 return COMMAND_INFO_OK_ID; - 18d8: 84 e6 ldi r24, 0x64 ; 100 - 18da: 08 95 ret + 18f8: 84 e6 ldi r24, 0x64 ; 100 + 18fa: 08 95 ret } else if (InParam[0] == COMMAND_CHAR_FALSE) { ActiveConfiguration.ReadOnly = false; - 18dc: 10 92 0c 21 sts 0x210C, r1 + 18fc: 10 92 0c 21 sts 0x210C, r1 return COMMAND_INFO_OK_ID; - 18e0: 84 e6 ldi r24, 0x64 ; 100 - 18e2: 08 95 ret + 1900: 84 e6 ldi r24, 0x64 ; 100 + 1902: 08 95 ret -000018e4 : +00001904 : return COMMAND_ERR_INVALID_PARAM_ID; } CommandStatusIdType CommandExecUpload(char* OutMessage) { XModemReceive(MemoryUploadBlock); - 18e4: 82 e6 ldi r24, 0x62 ; 98 - 18e6: 98 e0 ldi r25, 0x08 ; 8 - 18e8: 2c d1 rcall .+600 ; 0x1b42 - 18ea: 8e e6 ldi r24, 0x6E ; 110 + 1904: 82 e7 ldi r24, 0x72 ; 114 + 1906: 98 e0 ldi r25, 0x08 ; 8 + 1908: 2c d1 rcall .+600 ; 0x1b62 + 190a: 8e e6 ldi r24, 0x6E ; 110 return COMMAND_INFO_XMODEM_WAIT_ID; } - 18ec: 08 95 ret + 190c: 08 95 ret -000018ee : - 18ee: 80 e9 ldi r24, 0x90 ; 144 +0000190e : + 190e: 80 ea ldi r24, 0xA0 ; 160 CommandStatusIdType CommandExecDownload(char* OutMessage) { XModemSend(MemoryDownloadBlock); - 18f0: 98 e0 ldi r25, 0x08 ; 8 - 18f2: 3f d1 rcall .+638 ; 0x1b72 - 18f4: 8e e6 ldi r24, 0x6E ; 110 + 1910: 98 e0 ldi r25, 0x08 ; 8 + 1912: 3f d1 rcall .+638 ; 0x1b92 + 1914: 8e e6 ldi r24, 0x6E ; 110 return COMMAND_INFO_XMODEM_WAIT_ID; } - 18f6: 08 95 ret + 1916: 08 95 ret -000018f8 : - 18f8: e0 ec ldi r30, 0xC0 ; 192 +00001918 : + 1918: e0 ec ldi r30, 0xC0 ; 192 * 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; - 18fa: f4 e0 ldi r31, 0x04 ; 4 - 18fc: 81 81 ldd r24, Z+1 ; 0x01 - 18fe: 8e 7f andi r24, 0xFE ; 254 - 1900: 81 83 std Z+1, r24 ; 0x01 + 191a: f4 e0 ldi r31, 0x04 ; 4 + 191c: 81 81 ldd r24, Z+1 ; 0x01 + 191e: 8e 7f andi r24, 0xFE ; 254 + 1920: 81 83 std Z+1, r24 ; 0x01 CommandStatusIdType CommandExecReset(char* OutMessage) { USB_Detach(); USB_Disable(); - 1902: 0e 94 78 22 call 0x44f0 ; 0x44f0 + 1922: 0e 94 88 22 call 0x4510 ; 0x4510 SystemReset(); - 1906: 0e 94 f0 03 call 0x7e0 ; 0x7e0 + 1926: 0e 94 00 04 call 0x800 ; 0x800 return COMMAND_INFO_OK_ID; } - 190a: 84 e6 ldi r24, 0x64 ; 100 - 190c: 08 95 ret + 192a: 84 e6 ldi r24, 0x64 ; 100 + 192c: 08 95 ret -0000190e : - 190e: e0 ec ldi r30, 0xC0 ; 192 - 1910: f4 e0 ldi r31, 0x04 ; 4 - 1912: 81 81 ldd r24, Z+1 ; 0x01 - 1914: 8e 7f andi r24, 0xFE ; 254 - 1916: 81 83 std Z+1, r24 ; 0x01 +0000192e : + 192e: e0 ec ldi r30, 0xC0 ; 192 + 1930: f4 e0 ldi r31, 0x04 ; 4 + 1932: 81 81 ldd r24, Z+1 ; 0x01 + 1934: 8e 7f andi r24, 0xFE ; 254 + 1936: 81 83 std Z+1, r24 ; 0x01 #ifdef SUPPORT_FIRMWARE_UPGRADE CommandStatusIdType CommandExecUpgrade(char* OutMessage) { USB_Detach(); USB_Disable(); - 1918: 0e 94 78 22 call 0x44f0 ; 0x44f0 + 1938: 0e 94 88 22 call 0x4510 ; 0x4510 SystemEnterBootloader(); - 191c: 0e 94 f7 03 call 0x7ee ; 0x7ee + 193c: 0e 94 07 04 call 0x80e ; 0x80e return COMMAND_INFO_OK_ID; } - 1920: 84 e6 ldi r24, 0x64 ; 100 - 1922: 08 95 ret + 1940: 84 e6 ldi r24, 0x64 ; 100 + 1942: 08 95 ret -00001924 : +00001944 : #endif CommandStatusIdType CommandGetMemSize(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.MemorySize); - 1924: 2d b7 in r18, 0x3d ; 61 - 1926: 3e b7 in r19, 0x3e ; 62 - 1928: 28 50 subi r18, 0x08 ; 8 - 192a: 30 40 sbci r19, 0x00 ; 0 - 192c: 2d bf out 0x3d, r18 ; 61 - 192e: 3e bf out 0x3e, r19 ; 62 - 1930: ed b7 in r30, 0x3d ; 61 - 1932: fe b7 in r31, 0x3e ; 62 - 1934: 31 96 adiw r30, 0x01 ; 1 - 1936: ad b7 in r26, 0x3d ; 61 - 1938: be b7 in r27, 0x3e ; 62 - 193a: 11 96 adiw r26, 0x01 ; 1 - 193c: 8d 93 st X+, r24 - 193e: 9c 93 st X, r25 - 1940: 12 97 sbiw r26, 0x02 ; 2 - 1942: 80 e0 ldi r24, 0x00 ; 0 - 1944: 91 e0 ldi r25, 0x01 ; 1 - 1946: 82 83 std Z+2, r24 ; 0x02 - 1948: 93 83 std Z+3, r25 ; 0x03 - 194a: 8e e0 ldi r24, 0x0E ; 14 - 194c: 94 e0 ldi r25, 0x04 ; 4 - 194e: 84 83 std Z+4, r24 ; 0x04 - 1950: 95 83 std Z+5, r25 ; 0x05 - 1952: 80 91 09 21 lds r24, 0x2109 - 1956: 90 91 0a 21 lds r25, 0x210A - 195a: 86 83 std Z+6, r24 ; 0x06 - 195c: 97 83 std Z+7, r25 ; 0x07 - 195e: 0e 94 0c 26 call 0x4c18 ; 0x4c18 + 1944: 2d b7 in r18, 0x3d ; 61 + 1946: 3e b7 in r19, 0x3e ; 62 + 1948: 28 50 subi r18, 0x08 ; 8 + 194a: 30 40 sbci r19, 0x00 ; 0 + 194c: 2d bf out 0x3d, r18 ; 61 + 194e: 3e bf out 0x3e, r19 ; 62 + 1950: ed b7 in r30, 0x3d ; 61 + 1952: fe b7 in r31, 0x3e ; 62 + 1954: 31 96 adiw r30, 0x01 ; 1 + 1956: ad b7 in r26, 0x3d ; 61 + 1958: be b7 in r27, 0x3e ; 62 + 195a: 11 96 adiw r26, 0x01 ; 1 + 195c: 8d 93 st X+, r24 + 195e: 9c 93 st X, r25 + 1960: 12 97 sbiw r26, 0x02 ; 2 + 1962: 80 e0 ldi r24, 0x00 ; 0 + 1964: 91 e0 ldi r25, 0x01 ; 1 + 1966: 82 83 std Z+2, r24 ; 0x02 + 1968: 93 83 std Z+3, r25 ; 0x03 + 196a: 8e e2 ldi r24, 0x2E ; 46 + 196c: 94 e0 ldi r25, 0x04 ; 4 + 196e: 84 83 std Z+4, r24 ; 0x04 + 1970: 95 83 std Z+5, r25 ; 0x05 + 1972: 80 91 09 21 lds r24, 0x2109 + 1976: 90 91 0a 21 lds r25, 0x210A + 197a: 86 83 std Z+6, r24 ; 0x06 + 197c: 97 83 std Z+7, r25 ; 0x07 + 197e: 0e 94 1c 26 call 0x4c38 ; 0x4c38 return COMMAND_INFO_OK_WITH_TEXT_ID; - 1962: 2d b7 in r18, 0x3d ; 61 - 1964: 3e b7 in r19, 0x3e ; 62 - 1966: 28 5f subi r18, 0xF8 ; 248 - 1968: 3f 4f sbci r19, 0xFF ; 255 - 196a: 2d bf out 0x3d, r18 ; 61 - 196c: 3e bf out 0x3e, r19 ; 62 + 1982: 2d b7 in r18, 0x3d ; 61 + 1984: 3e b7 in r19, 0x3e ; 62 + 1986: 28 5f subi r18, 0xF8 ; 248 + 1988: 3f 4f sbci r19, 0xFF ; 255 + 198a: 2d bf out 0x3d, r18 ; 61 + 198c: 3e bf out 0x3e, r19 ; 62 } - 196e: 85 e6 ldi r24, 0x65 ; 101 - 1970: 08 95 ret + 198e: 85 e6 ldi r24, 0x65 ; 101 + 1990: 08 95 ret -00001972 : +00001992 : CommandStatusIdType CommandGetUidSize(char* OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.UidSize); - 1972: 2d b7 in r18, 0x3d ; 61 - 1974: 3e b7 in r19, 0x3e ; 62 - 1976: 28 50 subi r18, 0x08 ; 8 - 1978: 30 40 sbci r19, 0x00 ; 0 - 197a: 2d bf out 0x3d, r18 ; 61 - 197c: 3e bf out 0x3e, r19 ; 62 - 197e: ed b7 in r30, 0x3d ; 61 - 1980: fe b7 in r31, 0x3e ; 62 - 1982: 31 96 adiw r30, 0x01 ; 1 - 1984: ad b7 in r26, 0x3d ; 61 - 1986: be b7 in r27, 0x3e ; 62 - 1988: 11 96 adiw r26, 0x01 ; 1 - 198a: 8d 93 st X+, r24 - 198c: 9c 93 st X, r25 - 198e: 12 97 sbiw r26, 0x02 ; 2 - 1990: 80 e0 ldi r24, 0x00 ; 0 - 1992: 91 e0 ldi r25, 0x01 ; 1 - 1994: 82 83 std Z+2, r24 ; 0x02 - 1996: 93 83 std Z+3, r25 ; 0x03 - 1998: 81 e1 ldi r24, 0x11 ; 17 - 199a: 94 e0 ldi r25, 0x04 ; 4 - 199c: 84 83 std Z+4, r24 ; 0x04 - 199e: 95 83 std Z+5, r25 ; 0x05 - 19a0: 80 91 0b 21 lds r24, 0x210B - 19a4: 86 83 std Z+6, r24 ; 0x06 - 19a6: 17 82 std Z+7, r1 ; 0x07 - 19a8: 0e 94 0c 26 call 0x4c18 ; 0x4c18 + 1992: 2d b7 in r18, 0x3d ; 61 + 1994: 3e b7 in r19, 0x3e ; 62 + 1996: 28 50 subi r18, 0x08 ; 8 + 1998: 30 40 sbci r19, 0x00 ; 0 + 199a: 2d bf out 0x3d, r18 ; 61 + 199c: 3e bf out 0x3e, r19 ; 62 + 199e: ed b7 in r30, 0x3d ; 61 + 19a0: fe b7 in r31, 0x3e ; 62 + 19a2: 31 96 adiw r30, 0x01 ; 1 + 19a4: ad b7 in r26, 0x3d ; 61 + 19a6: be b7 in r27, 0x3e ; 62 + 19a8: 11 96 adiw r26, 0x01 ; 1 + 19aa: 8d 93 st X+, r24 + 19ac: 9c 93 st X, r25 + 19ae: 12 97 sbiw r26, 0x02 ; 2 + 19b0: 80 e0 ldi r24, 0x00 ; 0 + 19b2: 91 e0 ldi r25, 0x01 ; 1 + 19b4: 82 83 std Z+2, r24 ; 0x02 + 19b6: 93 83 std Z+3, r25 ; 0x03 + 19b8: 81 e3 ldi r24, 0x31 ; 49 + 19ba: 94 e0 ldi r25, 0x04 ; 4 + 19bc: 84 83 std Z+4, r24 ; 0x04 + 19be: 95 83 std Z+5, r25 ; 0x05 + 19c0: 80 91 0b 21 lds r24, 0x210B + 19c4: 86 83 std Z+6, r24 ; 0x06 + 19c6: 17 82 std Z+7, r1 ; 0x07 + 19c8: 0e 94 1c 26 call 0x4c38 ; 0x4c38 return COMMAND_INFO_OK_WITH_TEXT_ID; - 19ac: 2d b7 in r18, 0x3d ; 61 - 19ae: 3e b7 in r19, 0x3e ; 62 - 19b0: 28 5f subi r18, 0xF8 ; 248 - 19b2: 3f 4f sbci r19, 0xFF ; 255 - 19b4: 2d bf out 0x3d, r18 ; 61 - 19b6: 3e bf out 0x3e, r19 ; 62 + 19cc: 2d b7 in r18, 0x3d ; 61 + 19ce: 3e b7 in r19, 0x3e ; 62 + 19d0: 28 5f subi r18, 0xF8 ; 248 + 19d2: 3f 4f sbci r19, 0xFF ; 255 + 19d4: 2d bf out 0x3d, r18 ; 61 + 19d6: 3e bf out 0x3e, r19 ; 62 } - 19b8: 85 e6 ldi r24, 0x65 ; 101 - 19ba: 08 95 ret + 19d8: 85 e6 ldi r24, 0x65 ; 101 + 19da: 08 95 ret -000019bc : +000019dc : CommandStatusIdType CommandExecButton(char* OutMessage) { ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - 19bc: 60 e0 ldi r22, 0x00 ; 0 - 19be: 71 e0 ldi r23, 0x01 ; 1 - 19c0: c2 dc rcall .-1660 ; 0x1346 - 19c2: 85 e6 ldi r24, 0x65 ; 101 + 19dc: 60 e0 ldi r22, 0x00 ; 0 + 19de: 71 e0 ldi r23, 0x01 ; 1 + 19e0: c2 dc rcall .-1660 ; 0x1366 + 19e2: 85 e6 ldi r24, 0x65 ; 101 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 19c4: 08 95 ret + 19e4: 08 95 ret -000019c6 : - 19c6: 60 e0 ldi r22, 0x00 ; 0 +000019e6 : + 19e6: 60 e0 ldi r22, 0x00 ; 0 CommandStatusIdType CommandGetButton(char* OutParam) { ButtonGetActionByName(OutParam, TERMINAL_BUFFER_SIZE); - 19c8: 71 e0 ldi r23, 0x01 ; 1 - 19ca: f3 dc rcall .-1562 ; 0x13b2 - 19cc: 85 e6 ldi r24, 0x65 ; 101 + 19e8: 71 e0 ldi r23, 0x01 ; 1 + 19ea: f3 dc rcall .-1562 ; 0x13d2 + 19ec: 85 e6 ldi r24, 0x65 ; 101 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 19ce: 08 95 ret + 19ee: 08 95 ret -000019d0 : - 19d0: 03 dd rcall .-1530 ; 0x13d8 +000019f0 : + 19f0: 03 dd rcall .-1530 ; 0x13f8 CommandStatusIdType CommandSetButton(const char* InParam) { if (ButtonSetActionByName(InParam)) { - 19d2: 88 23 and r24, r24 - 19d4: 11 f4 brne .+4 ; 0x19da - 19d6: 8a ec ldi r24, 0xCA ; 202 + 19f2: 88 23 and r24, r24 + 19f4: 11 f4 brne .+4 ; 0x19fa + 19f6: 8a ec ldi r24, 0xCA ; 202 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 19d8: 08 95 ret + 19f8: 08 95 ret } } - 19da: 4f dd rcall .-1378 ; 0x147a + 19fa: 4f dd rcall .-1378 ; 0x149a } CommandStatusIdType CommandSetButton(const char* InParam) { if (ButtonSetActionByName(InParam)) { SettingsSave(); - 19dc: 84 e6 ldi r24, 0x64 ; 100 - 19de: 08 95 ret + 19fc: 84 e6 ldi r24, 0x64 ; 100 + 19fe: 08 95 ret -000019e0 : +00001a00 : return COMMAND_INFO_OK_ID; - 19e0: 60 e0 ldi r22, 0x00 ; 0 - 19e2: 71 e0 ldi r23, 0x01 ; 1 + 1a00: 60 e0 ldi r22, 0x00 ; 0 + 1a02: 71 e0 ldi r23, 0x01 ; 1 } } CommandStatusIdType CommandGetSetting(char* OutParam) { SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); - 19e4: d1 dd rcall .-1118 ; 0x1588 - 19e6: 85 e6 ldi r24, 0x65 ; 101 + 1a04: d1 dd rcall .-1118 ; 0x15a8 + 1a06: 85 e6 ldi r24, 0x65 ; 101 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 19e8: 08 95 ret + 1a08: 08 95 ret -000019ea : - 19ea: d8 dd rcall .-1104 ; 0x159c +00001a0a : + 1a0a: d8 dd rcall .-1104 ; 0x15bc CommandStatusIdType CommandSetSetting(const char* InParam) { if (SettingsSetActiveByName(InParam)) { - 19ec: 88 23 and r24, r24 - 19ee: 11 f4 brne .+4 ; 0x19f4 - 19f0: 8a ec ldi r24, 0xCA ; 202 + 1a0c: 88 23 and r24, r24 + 1a0e: 11 f4 brne .+4 ; 0x1a14 + 1a10: 8a ec ldi r24, 0xCA ; 202 SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; - 19f2: 08 95 ret + 1a12: 08 95 ret } } - 19f4: 42 dd rcall .-1404 ; 0x147a + 1a14: 42 dd rcall .-1404 ; 0x149a } CommandStatusIdType CommandSetSetting(const char* InParam) { if (SettingsSetActiveByName(InParam)) { SettingsSave(); - 19f6: 84 e6 ldi r24, 0x64 ; 100 - 19f8: 08 95 ret + 1a16: 84 e6 ldi r24, 0x64 ; 100 + 1a18: 08 95 ret -000019fa : +00001a1a : return COMMAND_INFO_OK_ID; - 19fa: fe da rcall .-2564 ; 0xff8 - 19fc: 84 e6 ldi r24, 0x64 ; 100 + 1a1a: fe da rcall .-2564 ; 0x1018 + 1a1c: 84 e6 ldi r24, 0x64 ; 100 CommandStatusIdType CommandExecClear(char* OutParam) { MemoryClear(); return COMMAND_INFO_OK_ID; } - 19fe: 08 95 ret + 1a1e: 08 95 ret -00001a00 : - 1a00: bf 92 push r11 +00001a20 : + 1a20: bf 92 push r11 CommandStatusIdType CommandExecHelp(char* OutMessage) { - 1a02: cf 92 push r12 - 1a04: df 92 push r13 - 1a06: ef 92 push r14 - 1a08: ff 92 push r15 - 1a0a: 0f 93 push r16 - 1a0c: 1f 93 push r17 - 1a0e: cf 93 push r28 - 1a10: df 93 push r29 - 1a12: 7c 01 movw r14, r24 + 1a22: cf 92 push r12 + 1a24: df 92 push r13 + 1a26: ef 92 push r14 + 1a28: ff 92 push r15 + 1a2a: 0f 93 push r16 + 1a2c: 1f 93 push r17 + 1a2e: cf 93 push r28 + 1a30: df 93 push r29 + 1a32: 7c 01 movw r14, r24 const CommandEntryType* EntryPtr = CommandTable; uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */ - 1a14: cf ef ldi r28, 0xFF ; 255 - 1a16: d0 e0 ldi r29, 0x00 ; 0 + 1a34: cf ef ldi r28, 0xFF ; 255 + 1a36: d0 e0 ldi r29, 0x00 ; 0 return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandExecHelp(char* OutMessage) { const CommandEntryType* EntryPtr = CommandTable; - 1a18: 2b e1 ldi r18, 0x1B ; 27 - 1a1a: c2 2e mov r12, r18 - 1a1c: 24 e0 ldi r18, 0x04 ; 4 - 1a1e: d2 2e mov r13, r18 + 1a38: 2b e3 ldi r18, 0x3B ; 59 + 1a3a: c2 2e mov r12, r18 + 1a3c: 24 e0 ldi r18, 0x04 ; 4 + 1a3e: d2 2e mov r13, r18 *OutMessage++ = c; CommandName++; ByteCount--; } *OutMessage++ = ','; - 1a20: 3c e2 ldi r19, 0x2C ; 44 - 1a22: b3 2e mov r11, r19 + 1a40: 3c e2 ldi r19, 0x2C ; 44 + 1a42: b3 2e mov r11, r19 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) { - 1a24: 86 01 movw r16, r12 - 1a26: 8c e1 ldi r24, 0x1C ; 28 - 1a28: 90 e2 ldi r25, 0x20 ; 32 - 1a2a: b6 01 movw r22, r12 - 1a2c: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1a30: 00 97 sbiw r24, 0x00 ; 0 - 1a32: 29 f1 breq .+74 ; 0x1a7e + 1a44: 86 01 movw r16, r12 + 1a46: 8c e1 ldi r24, 0x1C ; 28 + 1a48: 90 e2 ldi r25, 0x20 ; 32 + 1a4a: b6 01 movw r22, r12 + 1a4c: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1a50: 00 97 sbiw r24, 0x00 ; 0 + 1a52: 29 f1 breq .+74 ; 0x1a9e const char* CommandName = EntryPtr->Command; char c; while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { - 1a34: f6 01 movw r30, r12 - 1a36: 84 91 lpm r24, Z - 1a38: 88 23 and r24, r24 - 1a3a: 89 f0 breq .+34 ; 0x1a5e - 1a3c: c1 32 cpi r28, 0x21 ; 33 - 1a3e: d1 05 cpc r29, r1 - 1a40: 70 f0 brcs .+28 ; 0x1a5e - 1a42: d7 01 movw r26, r14 - 1a44: 03 c0 rjmp .+6 ; 0x1a4c - 1a46: c0 32 cpi r28, 0x20 ; 32 - 1a48: d1 05 cpc r29, r1 - 1a4a: 49 f0 breq .+18 ; 0x1a5e + 1a54: f6 01 movw r30, r12 + 1a56: 84 91 lpm r24, Z + 1a58: 88 23 and r24, r24 + 1a5a: 89 f0 breq .+34 ; 0x1a7e + 1a5c: c1 32 cpi r28, 0x21 ; 33 + 1a5e: d1 05 cpc r29, r1 + 1a60: 70 f0 brcs .+28 ; 0x1a7e + 1a62: d7 01 movw r26, r14 + 1a64: 03 c0 rjmp .+6 ; 0x1a6c + 1a66: c0 32 cpi r28, 0x20 ; 32 + 1a68: d1 05 cpc r29, r1 + 1a6a: 49 f0 breq .+18 ; 0x1a7e *OutMessage++ = c; - 1a4c: 8d 93 st X+, r24 - 1a4e: 7d 01 movw r14, r26 + 1a6c: 8d 93 st X+, r24 + 1a6e: 7d 01 movw r14, r26 CommandName++; - 1a50: 0f 5f subi r16, 0xFF ; 255 - 1a52: 1f 4f sbci r17, 0xFF ; 255 + 1a70: 0f 5f subi r16, 0xFF ; 255 + 1a72: 1f 4f sbci r17, 0xFF ; 255 ByteCount--; - 1a54: 21 97 sbiw r28, 0x01 ; 1 + 1a74: 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) { - 1a56: f8 01 movw r30, r16 - 1a58: 84 91 lpm r24, Z - 1a5a: 88 23 and r24, r24 - 1a5c: a1 f7 brne .-24 ; 0x1a46 + 1a76: f8 01 movw r30, r16 + 1a78: 84 91 lpm r24, Z + 1a7a: 88 23 and r24, r24 + 1a7c: a1 f7 brne .-24 ; 0x1a66 *OutMessage++ = c; CommandName++; ByteCount--; } *OutMessage++ = ','; - 1a5e: f7 01 movw r30, r14 - 1a60: b1 92 st Z+, r11 - 1a62: 7f 01 movw r14, r30 + 1a7e: f7 01 movw r30, r14 + 1a80: b1 92 st Z+, r11 + 1a82: 7f 01 movw r14, r30 ByteCount--; - 1a64: 21 97 sbiw r28, 0x01 ; 1 + 1a84: 21 97 sbiw r28, 0x01 ; 1 EntryPtr++; - 1a66: 86 e1 ldi r24, 0x16 ; 22 - 1a68: 90 e0 ldi r25, 0x00 ; 0 - 1a6a: c8 0e add r12, r24 - 1a6c: d9 1e adc r13, r25 + 1a86: 86 e1 ldi r24, 0x16 ; 22 + 1a88: 90 e0 ldi r25, 0x00 ; 0 + 1a8a: c8 0e add r12, r24 + 1a8c: d9 1e adc r13, r25 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) { - 1a6e: 86 01 movw r16, r12 - 1a70: 8c e1 ldi r24, 0x1C ; 28 - 1a72: 90 e2 ldi r25, 0x20 ; 32 - 1a74: b6 01 movw r22, r12 - 1a76: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1a7a: 00 97 sbiw r24, 0x00 ; 0 - 1a7c: d9 f6 brne .-74 ; 0x1a34 + 1a8e: 86 01 movw r16, r12 + 1a90: 8c e1 ldi r24, 0x1C ; 28 + 1a92: 90 e2 ldi r25, 0x20 ; 32 + 1a94: b6 01 movw r22, r12 + 1a96: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1a9a: 00 97 sbiw r24, 0x00 ; 0 + 1a9c: d9 f6 brne .-74 ; 0x1a54 ByteCount--; EntryPtr++; } *--OutMessage = '\0'; - 1a7e: f7 01 movw r30, r14 - 1a80: 31 97 sbiw r30, 0x01 ; 1 - 1a82: 10 82 st Z, r1 + 1a9e: f7 01 movw r30, r14 + 1aa0: 31 97 sbiw r30, 0x01 ; 1 + 1aa2: 10 82 st Z, r1 return COMMAND_INFO_OK_WITH_TEXT_ID; } - 1a84: 85 e6 ldi r24, 0x65 ; 101 - 1a86: df 91 pop r29 - 1a88: cf 91 pop r28 - 1a8a: 1f 91 pop r17 - 1a8c: 0f 91 pop r16 - 1a8e: ff 90 pop r15 - 1a90: ef 90 pop r14 - 1a92: df 90 pop r13 - 1a94: cf 90 pop r12 - 1a96: bf 90 pop r11 - 1a98: 08 95 ret + 1aa4: 85 e6 ldi r24, 0x65 ; 101 + 1aa6: df 91 pop r29 + 1aa8: cf 91 pop r28 + 1aaa: 1f 91 pop r17 + 1aac: 0f 91 pop r16 + 1aae: ff 90 pop r15 + 1ab0: ef 90 pop r14 + 1ab2: df 90 pop r13 + 1ab4: cf 90 pop r12 + 1ab6: bf 90 pop r11 + 1ab8: 08 95 ret -00001a9a : +00001aba : CommandStatusIdType CommandGetRssi(char* OutParam) { - 1a9a: cf 93 push r28 - 1a9c: df 93 push r29 + 1aba: cf 93 push r28 + 1abc: df 93 push r29 } static inline uint16_t AntennaLevelGet(void) { ADCA.CH0.CTRL |= ADC_CH_START_bm; - 1a9e: 20 91 20 02 lds r18, 0x0220 - 1aa2: 20 68 ori r18, 0x80 ; 128 - 1aa4: e0 e0 ldi r30, 0x00 ; 0 - 1aa6: f2 e0 ldi r31, 0x02 ; 2 - 1aa8: 20 a3 lds r18, 0x50 + 1abe: 20 91 20 02 lds r18, 0x0220 + 1ac2: 20 68 ori r18, 0x80 ; 128 + 1ac4: e0 e0 ldi r30, 0x00 ; 0 + 1ac6: f2 e0 ldi r31, 0x02 ; 2 + 1ac8: 20 a3 lds r18, 0x50 while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); - 1aaa: 20 91 23 02 lds r18, 0x0223 - 1aae: 20 ff sbrs r18, 0 - 1ab0: fc cf rjmp .-8 ; 0x1aaa + 1aca: 20 91 23 02 lds r18, 0x0223 + 1ace: 20 ff sbrs r18, 0 + 1ad0: fc cf rjmp .-8 ; 0x1aca ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; - 1ab2: 21 e0 ldi r18, 0x01 ; 1 - 1ab4: e0 e0 ldi r30, 0x00 ; 0 - 1ab6: f2 e0 ldi r31, 0x02 ; 2 - 1ab8: 23 a3 lds r18, 0x53 + 1ad2: 21 e0 ldi r18, 0x01 ; 1 + 1ad4: e0 e0 ldi r30, 0x00 ; 0 + 1ad6: f2 e0 ldi r31, 0x02 ; 2 + 1ad8: 23 a3 lds r18, 0x53 int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; - 1aba: 60 91 10 02 lds r22, 0x0210 - 1abe: 70 91 11 02 lds r23, 0x0211 + 1ada: 60 91 10 02 lds r22, 0x0210 + 1ade: 70 91 11 02 lds r23, 0x0211 snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - 1ac2: 2d b7 in r18, 0x3d ; 61 - 1ac4: 3e b7 in r19, 0x3e ; 62 - 1ac6: 28 50 subi r18, 0x08 ; 8 - 1ac8: 30 40 sbci r19, 0x00 ; 0 - 1aca: 2d bf out 0x3d, r18 ; 61 - 1acc: 3e bf out 0x3e, r19 ; 62 - 1ace: cd b7 in r28, 0x3d ; 61 - 1ad0: de b7 in r29, 0x3e ; 62 - 1ad2: 21 96 adiw r28, 0x01 ; 1 - 1ad4: ed b7 in r30, 0x3d ; 61 - 1ad6: fe b7 in r31, 0x3e ; 62 - 1ad8: 81 83 std Z+1, r24 ; 0x01 - 1ada: 92 83 std Z+2, r25 ; 0x02 - 1adc: 80 e0 ldi r24, 0x00 ; 0 - 1ade: 91 e0 ldi r25, 0x01 ; 1 - 1ae0: 8a 83 std Y+2, r24 ; 0x02 - 1ae2: 9b 83 std Y+3, r25 ; 0x03 - 1ae4: 84 e1 ldi r24, 0x14 ; 20 - 1ae6: 94 e0 ldi r25, 0x04 ; 4 - 1ae8: 8c 83 std Y+4, r24 ; 0x04 - 1aea: 9d 83 std Y+5, r25 ; 0x05 + 1ae2: 2d b7 in r18, 0x3d ; 61 + 1ae4: 3e b7 in r19, 0x3e ; 62 + 1ae6: 28 50 subi r18, 0x08 ; 8 + 1ae8: 30 40 sbci r19, 0x00 ; 0 + 1aea: 2d bf out 0x3d, r18 ; 61 + 1aec: 3e bf out 0x3e, r19 ; 62 + 1aee: cd b7 in r28, 0x3d ; 61 + 1af0: de b7 in r29, 0x3e ; 62 + 1af2: 21 96 adiw r28, 0x01 ; 1 + 1af4: ed b7 in r30, 0x3d ; 61 + 1af6: fe b7 in r31, 0x3e ; 62 + 1af8: 81 83 std Z+1, r24 ; 0x01 + 1afa: 92 83 std Z+2, r25 ; 0x02 + 1afc: 80 e0 ldi r24, 0x00 ; 0 + 1afe: 91 e0 ldi r25, 0x01 ; 1 + 1b00: 8a 83 std Y+2, r24 ; 0x02 + 1b02: 9b 83 std Y+3, r25 ; 0x03 + 1b04: 84 e3 ldi r24, 0x34 ; 52 + 1b06: 94 e0 ldi r25, 0x04 ; 4 + 1b08: 8c 83 std Y+4, r24 ; 0x04 + 1b0a: 9d 83 std Y+5, r25 ; 0x05 if (Result < 0) Result = 0; return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); - 1aec: 6e 5b subi r22, 0xBE ; 190 - 1aee: 70 40 sbci r23, 0x00 ; 0 - 1af0: 77 fd sbrc r23, 7 - 1af2: 1a c0 rjmp .+52 ; 0x1b28 - 1af4: 88 27 eor r24, r24 - 1af6: 77 fd sbrc r23, 7 - 1af8: 80 95 com r24 - 1afa: 98 2f mov r25, r24 - 1afc: 29 e6 ldi r18, 0x69 ; 105 - 1afe: 37 e5 ldi r19, 0x57 ; 87 - 1b00: 4b e0 ldi r20, 0x0B ; 11 - 1b02: 50 e0 ldi r21, 0x00 ; 0 - 1b04: 0e 94 65 25 call 0x4aca ; 0x4aca <__mulsi3> - 1b08: dc 01 movw r26, r24 - 1b0a: cb 01 movw r24, r22 - 1b0c: ae 83 std Y+6, r26 ; 0x06 - 1b0e: bf 83 std Y+7, r27 ; 0x07 - 1b10: 0e 94 0c 26 call 0x4c18 ; 0x4c18 + 1b0c: 6e 5b subi r22, 0xBE ; 190 + 1b0e: 70 40 sbci r23, 0x00 ; 0 + 1b10: 77 fd sbrc r23, 7 + 1b12: 1a c0 rjmp .+52 ; 0x1b48 + 1b14: 88 27 eor r24, r24 + 1b16: 77 fd sbrc r23, 7 + 1b18: 80 95 com r24 + 1b1a: 98 2f mov r25, r24 + 1b1c: 29 e6 ldi r18, 0x69 ; 105 + 1b1e: 37 e5 ldi r19, 0x57 ; 87 + 1b20: 4b e0 ldi r20, 0x0B ; 11 + 1b22: 50 e0 ldi r21, 0x00 ; 0 + 1b24: 0e 94 75 25 call 0x4aea ; 0x4aea <__mulsi3> + 1b28: dc 01 movw r26, r24 + 1b2a: cb 01 movw r24, r22 + 1b2c: ae 83 std Y+6, r26 ; 0x06 + 1b2e: bf 83 std Y+7, r27 ; 0x07 + 1b30: 0e 94 1c 26 call 0x4c38 ; 0x4c38 PSTR("%5u mV"), AntennaLevelGet()); return COMMAND_INFO_OK_WITH_TEXT_ID; - 1b14: 2d b7 in r18, 0x3d ; 61 - 1b16: 3e b7 in r19, 0x3e ; 62 - 1b18: 28 5f subi r18, 0xF8 ; 248 - 1b1a: 3f 4f sbci r19, 0xFF ; 255 - 1b1c: 2d bf out 0x3d, r18 ; 61 - 1b1e: 3e bf out 0x3e, r19 ; 62 + 1b34: 2d b7 in r18, 0x3d ; 61 + 1b36: 3e b7 in r19, 0x3e ; 62 + 1b38: 28 5f subi r18, 0xF8 ; 248 + 1b3a: 3f 4f sbci r19, 0xFF ; 255 + 1b3c: 2d bf out 0x3d, r18 ; 61 + 1b3e: 3e bf out 0x3e, r19 ; 62 } - 1b20: 85 e6 ldi r24, 0x65 ; 101 - 1b22: df 91 pop r29 - 1b24: cf 91 pop r28 - 1b26: 08 95 ret - 1b28: 60 e0 ldi r22, 0x00 ; 0 - 1b2a: 70 e0 ldi r23, 0x00 ; 0 - 1b2c: e3 cf rjmp .-58 ; 0x1af4 + 1b40: 85 e6 ldi r24, 0x65 ; 101 + 1b42: df 91 pop r29 + 1b44: cf 91 pop r28 + 1b46: 08 95 ret + 1b48: 60 e0 ldi r22, 0x00 ; 0 + 1b4a: 70 e0 ldi r23, 0x00 ; 0 + 1b4c: e3 cf rjmp .-58 ; 0x1b14 -00001b2e : +00001b4e : static uint32_t BlockAddress; static XModemCallbackType CallbackFunc; static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { uint8_t Checksum = CHECKSUM_INIT_VALUE; - 1b2e: 80 e0 ldi r24, 0x00 ; 0 + 1b4e: 80 e0 ldi r24, 0x00 ; 0 uint8_t* DataPtr = (uint8_t*) Buffer; - 1b30: e0 e2 ldi r30, 0x20 ; 32 - 1b32: f1 e2 ldi r31, 0x21 ; 33 + 1b50: e0 e2 ldi r30, 0x20 ; 32 + 1b52: f1 e2 ldi r31, 0x21 ; 33 while(ByteCount--) { Checksum += *DataPtr++; - 1b34: 91 91 ld r25, Z+ - 1b36: 89 0f add r24, r25 + 1b54: 91 91 ld r25, Z+ + 1b56: 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--) { - 1b38: 91 e2 ldi r25, 0x21 ; 33 - 1b3a: e0 3a cpi r30, 0xA0 ; 160 - 1b3c: f9 07 cpc r31, r25 - 1b3e: d1 f7 brne .-12 ; 0x1b34 + 1b58: 91 e2 ldi r25, 0x21 ; 33 + 1b5a: e0 3a cpi r30, 0xA0 ; 160 + 1b5c: f9 07 cpc r31, r25 + 1b5e: d1 f7 brne .-12 ; 0x1b54 Checksum += *DataPtr++; } return Checksum; } - 1b40: 08 95 ret + 1b60: 08 95 ret -00001b42 : +00001b62 : void XModemReceive(XModemCallbackType TheCallbackFunc) { State = STATE_RECEIVE_INIT; - 1b42: 21 e0 ldi r18, 0x01 ; 1 - 1b44: 20 93 a5 20 sts 0x20A5, r18 + 1b62: 21 e0 ldi r18, 0x01 ; 1 + 1b64: 20 93 a5 20 sts 0x20A5, r18 CurrentFrameNumber = FIRST_FRAME_NUMBER; - 1b48: 20 93 a6 20 sts 0x20A6, r18 + 1b68: 20 93 a6 20 sts 0x20A6, r18 RetryCount = RECV_INIT_COUNT; - 1b4c: 24 e1 ldi r18, 0x14 ; 20 - 1b4e: 20 93 a7 20 sts 0x20A7, r18 + 1b6c: 24 e1 ldi r18, 0x14 ; 20 + 1b6e: 20 93 a7 20 sts 0x20A7, r18 RetryTimeout = RECV_INIT_TIMEOUT; - 1b52: 25 e0 ldi r18, 0x05 ; 5 - 1b54: 20 93 a8 20 sts 0x20A8, r18 + 1b72: 25 e0 ldi r18, 0x05 ; 5 + 1b74: 20 93 a8 20 sts 0x20A8, r18 BlockAddress = 0; - 1b58: 10 92 a9 20 sts 0x20A9, r1 - 1b5c: 10 92 aa 20 sts 0x20AA, r1 - 1b60: 10 92 ab 20 sts 0x20AB, r1 - 1b64: 10 92 ac 20 sts 0x20AC, r1 + 1b78: 10 92 a9 20 sts 0x20A9, r1 + 1b7c: 10 92 aa 20 sts 0x20AA, r1 + 1b80: 10 92 ab 20 sts 0x20AB, r1 + 1b84: 10 92 ac 20 sts 0x20AC, r1 CallbackFunc = TheCallbackFunc; - 1b68: 80 93 ad 20 sts 0x20AD, r24 - 1b6c: 90 93 ae 20 sts 0x20AE, r25 + 1b88: 80 93 ad 20 sts 0x20AD, r24 + 1b8c: 90 93 ae 20 sts 0x20AE, r25 } - 1b70: 08 95 ret + 1b90: 08 95 ret -00001b72 : +00001b92 : void XModemSend(XModemCallbackType TheCallbackFunc) { State = STATE_SEND_INIT; - 1b72: 27 e0 ldi r18, 0x07 ; 7 - 1b74: 20 93 a5 20 sts 0x20A5, r18 + 1b92: 27 e0 ldi r18, 0x07 ; 7 + 1b94: 20 93 a5 20 sts 0x20A5, r18 RetryTimeout = SEND_INIT_TIMEOUT; - 1b78: 24 e6 ldi r18, 0x64 ; 100 - 1b7a: 20 93 a8 20 sts 0x20A8, r18 + 1b98: 24 e6 ldi r18, 0x64 ; 100 + 1b9a: 20 93 a8 20 sts 0x20A8, r18 BlockAddress = 0; - 1b7e: 10 92 a9 20 sts 0x20A9, r1 - 1b82: 10 92 aa 20 sts 0x20AA, r1 - 1b86: 10 92 ab 20 sts 0x20AB, r1 - 1b8a: 10 92 ac 20 sts 0x20AC, r1 + 1b9e: 10 92 a9 20 sts 0x20A9, r1 + 1ba2: 10 92 aa 20 sts 0x20AA, r1 + 1ba6: 10 92 ab 20 sts 0x20AB, r1 + 1baa: 10 92 ac 20 sts 0x20AC, r1 CallbackFunc = TheCallbackFunc; - 1b8e: 80 93 ad 20 sts 0x20AD, r24 - 1b92: 90 93 ae 20 sts 0x20AE, r25 + 1bae: 80 93 ad 20 sts 0x20AD, r24 + 1bb2: 90 93 ae 20 sts 0x20AE, r25 } - 1b96: 08 95 ret + 1bb6: 08 95 ret -00001b98 : +00001bb8 : bool XModemProcessByte(uint8_t Byte) { - 1b98: cf 93 push r28 - 1b9a: c8 2f mov r28, r24 + 1bb8: cf 93 push r28 + 1bba: c8 2f mov r28, r24 switch(State) { - 1b9c: 80 91 a5 20 lds r24, 0x20A5 - 1ba0: 85 30 cpi r24, 0x05 ; 5 - 1ba2: 09 f4 brne .+2 ; 0x1ba6 - 1ba4: 84 c0 rjmp .+264 ; 0x1cae - 1ba6: 86 30 cpi r24, 0x06 ; 6 - 1ba8: e8 f0 brcs .+58 ; 0x1be4 - 1baa: 87 30 cpi r24, 0x07 ; 7 - 1bac: 09 f4 brne .+2 ; 0x1bb0 - 1bae: 4e c0 rjmp .+156 ; 0x1c4c - 1bb0: 87 30 cpi r24, 0x07 ; 7 - 1bb2: 70 f5 brcc .+92 ; 0x1c10 + 1bbc: 80 91 a5 20 lds r24, 0x20A5 + 1bc0: 85 30 cpi r24, 0x05 ; 5 + 1bc2: 09 f4 brne .+2 ; 0x1bc6 + 1bc4: 84 c0 rjmp .+264 ; 0x1cce + 1bc6: 86 30 cpi r24, 0x06 ; 6 + 1bc8: e8 f0 brcs .+58 ; 0x1c04 + 1bca: 87 30 cpi r24, 0x07 ; 7 + 1bcc: 09 f4 brne .+2 ; 0x1bd0 + 1bce: 4e c0 rjmp .+156 ; 0x1c6c + 1bd0: 87 30 cpi r24, 0x07 ; 7 + 1bd2: 70 f5 brcc .+92 ; 0x1c30 } break; case STATE_RECEIVE_PROCESS: if (ReceivedFrameNumber == CurrentFrameNumber) { - 1bb4: 20 91 b2 20 lds r18, 0x20B2 - 1bb8: 80 91 a6 20 lds r24, 0x20A6 - 1bbc: 28 17 cp r18, r24 - 1bbe: 09 f4 brne .+2 ; 0x1bc2 - 1bc0: e1 c0 rjmp .+450 ; 0x1d84 + 1bd4: 20 91 b2 20 lds r18, 0x20B2 + 1bd8: 80 91 a6 20 lds r24, 0x20A6 + 1bdc: 28 17 cp r18, r24 + 1bde: 09 f4 brne .+2 ; 0x1be2 + 1be0: e1 c0 rjmp .+450 ; 0x1da4 } else { /* Data seems to be damaged */ TerminalSendByte(BYTE_NAK); State = STATE_RECEIVE_WAIT; } } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { - 1bc2: 30 e0 ldi r19, 0x00 ; 0 - 1bc4: 90 e0 ldi r25, 0x00 ; 0 - 1bc6: 01 97 sbiw r24, 0x01 ; 1 - 1bc8: 28 17 cp r18, r24 - 1bca: 39 07 cpc r19, r25 - 1bcc: 09 f4 brne .+2 ; 0x1bd0 - 1bce: 0b c1 rjmp .+534 ; 0x1de6 + 1be2: 30 e0 ldi r19, 0x00 ; 0 + 1be4: 90 e0 ldi r25, 0x00 ; 0 + 1be6: 01 97 sbiw r24, 0x01 ; 1 + 1be8: 28 17 cp r18, r24 + 1bea: 39 07 cpc r19, r25 + 1bec: 09 f4 brne .+2 ; 0x1bf0 + 1bee: 0b c1 rjmp .+534 ; 0x1e06 INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } - 1bd0: 80 e0 ldi r24, 0x00 ; 0 - 1bd2: 90 e2 ldi r25, 0x20 ; 32 - 1bd4: 68 e1 ldi r22, 0x18 ; 24 - 1bd6: 0e 94 71 24 call 0x48e2 ; 0x48e2 + 1bf0: 80 e0 ldi r24, 0x00 ; 0 + 1bf2: 90 e2 ldi r25, 0x20 ; 32 + 1bf4: 68 e1 ldi r22, 0x18 ; 24 + 1bf6: 0e 94 81 24 call 0x4902 ; 0x4902 TerminalSendByte(BYTE_ACK); State = STATE_RECEIVE_WAIT; } else { /* This frame is completely out of order. Just cancel */ TerminalSendByte(BYTE_CAN); State = STATE_OFF; - 1bda: 10 92 a5 20 sts 0x20A5, r1 + 1bfa: 10 92 a5 20 sts 0x20A5, r1 default: return false; break; } return true; - 1bde: 81 e0 ldi r24, 0x01 ; 1 + 1bfe: 81 e0 ldi r24, 0x01 ; 1 } - 1be0: cf 91 pop r28 - 1be2: 08 95 ret + 1c00: cf 91 pop r28 + 1c02: 08 95 ret CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 1be4: 83 30 cpi r24, 0x03 ; 3 - 1be6: 09 f4 brne .+2 ; 0x1bea - 1be8: 5a c0 rjmp .+180 ; 0x1c9e - 1bea: 84 30 cpi r24, 0x04 ; 4 - 1bec: c0 f0 brcs .+48 ; 0x1c1e + 1c04: 83 30 cpi r24, 0x03 ; 3 + 1c06: 09 f4 brne .+2 ; 0x1c0a + 1c08: 5a c0 rjmp .+180 ; 0x1cbe + 1c0a: 84 30 cpi r24, 0x04 ; 4 + 1c0c: c0 f0 brcs .+48 ; 0x1c3e ReceivedFrameNumber = Byte; State = STATE_RECEIVE_FRAMENUM2; break; case STATE_RECEIVE_FRAMENUM2: if (Byte == (255 - ReceivedFrameNumber)) { - 1bee: 8c 2f mov r24, r28 - 1bf0: 90 e0 ldi r25, 0x00 ; 0 - 1bf2: 40 91 b2 20 lds r20, 0x20B2 - 1bf6: 2f ef ldi r18, 0xFF ; 255 - 1bf8: 30 e0 ldi r19, 0x00 ; 0 - 1bfa: 24 1b sub r18, r20 - 1bfc: 31 09 sbc r19, r1 - 1bfe: 82 17 cp r24, r18 - 1c00: 93 07 cpc r25, r19 - 1c02: 09 f0 breq .+2 ; 0x1c06 - 1c04: 6b c0 rjmp .+214 ; 0x1cdc + 1c0e: 8c 2f mov r24, r28 + 1c10: 90 e0 ldi r25, 0x00 ; 0 + 1c12: 40 91 b2 20 lds r20, 0x20B2 + 1c16: 2f ef ldi r18, 0xFF ; 255 + 1c18: 30 e0 ldi r19, 0x00 ; 0 + 1c1a: 24 1b sub r18, r20 + 1c1c: 31 09 sbc r19, r1 + 1c1e: 82 17 cp r24, r18 + 1c20: 93 07 cpc r25, r19 + 1c22: 09 f0 breq .+2 ; 0x1c26 + 1c24: 6b c0 rjmp .+214 ; 0x1cfc /* frame-number check passed. */ State = STATE_RECEIVE_DATA; - 1c06: 85 e0 ldi r24, 0x05 ; 5 - 1c08: 80 93 a5 20 sts 0x20A5, r24 + 1c26: 85 e0 ldi r24, 0x05 ; 5 + 1c28: 80 93 a5 20 sts 0x20A5, r24 default: return false; break; } return true; - 1c0c: 81 e0 ldi r24, 0x01 ; 1 - 1c0e: e8 cf rjmp .-48 ; 0x1be0 + 1c2c: 81 e0 ldi r24, 0x01 ; 1 + 1c2e: e8 cf rjmp .-48 ; 0x1c00 CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 1c10: 88 30 cpi r24, 0x08 ; 8 - 1c12: f9 f0 breq .+62 ; 0x1c52 - 1c14: 89 30 cpi r24, 0x09 ; 9 - 1c16: a9 f0 breq .+42 ; 0x1c42 + 1c30: 88 30 cpi r24, 0x08 ; 8 + 1c32: f9 f0 breq .+62 ; 0x1c72 + 1c34: 89 30 cpi r24, 0x09 ; 9 + 1c36: a9 f0 breq .+42 ; 0x1c62 /* Receive Ack */ State = STATE_OFF; break; default: return false; - 1c18: 80 e0 ldi r24, 0x00 ; 0 + 1c38: 80 e0 ldi r24, 0x00 ; 0 break; } return true; } - 1c1a: cf 91 pop r28 - 1c1c: 08 95 ret + 1c3a: cf 91 pop r28 + 1c3c: 08 95 ret CallbackFunc = TheCallbackFunc; } bool XModemProcessByte(uint8_t Byte) { switch(State) { - 1c1e: 81 30 cpi r24, 0x01 ; 1 - 1c20: d8 f3 brcs .-10 ; 0x1c18 + 1c3e: 81 30 cpi r24, 0x01 ; 1 + 1c40: d8 f3 brcs .-10 ; 0x1c38 case STATE_RECEIVE_INIT: case STATE_RECEIVE_WAIT: if (Byte == BYTE_SOH) { - 1c22: c1 30 cpi r28, 0x01 ; 1 - 1c24: 09 f4 brne .+2 ; 0x1c28 - 1c26: e9 c0 rjmp .+466 ; 0x1dfa + 1c42: c1 30 cpi r28, 0x01 ; 1 + 1c44: 09 f4 brne .+2 ; 0x1c48 + 1c46: e9 c0 rjmp .+466 ; 0x1e1a /* Next frame incoming */ BufferIdx = 0; Checksum = CHECKSUM_INIT_VALUE; State = STATE_RECEIVE_FRAMENUM1; } else if (Byte == BYTE_EOT) { - 1c28: c4 30 cpi r28, 0x04 ; 4 - 1c2a: 09 f4 brne .+2 ; 0x1c2e - 1c2c: fb c0 rjmp .+502 ; 0x1e24 + 1c48: c4 30 cpi r28, 0x04 ; 4 + 1c4a: 09 f4 brne .+2 ; 0x1c4e + 1c4c: fb c0 rjmp .+502 ; 0x1e44 /* Transmission finished */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_CAN) { - 1c2e: c8 31 cpi r28, 0x18 ; 24 - 1c30: 41 f0 breq .+16 ; 0x1c42 + 1c4e: c8 31 cpi r28, 0x18 ; 24 + 1c50: 41 f0 breq .+16 ; 0x1c62 default: return false; break; } return true; - 1c32: 81 e0 ldi r24, 0x01 ; 1 + 1c52: 81 e0 ldi r24, 0x01 ; 1 } - 1c34: cf 91 pop r28 - 1c36: 08 95 ret - 1c38: 80 e0 ldi r24, 0x00 ; 0 - 1c3a: 90 e2 ldi r25, 0x20 ; 32 - 1c3c: 66 e0 ldi r22, 0x06 ; 6 - 1c3e: 0e 94 71 24 call 0x48e2 ; 0x48e2 + 1c54: cf 91 pop r28 + 1c56: 08 95 ret + 1c58: 80 e0 ldi r24, 0x00 ; 0 + 1c5a: 90 e2 ldi r25, 0x20 ; 32 + 1c5c: 66 e0 ldi r22, 0x06 ; 6 + 1c5e: 0e 94 81 24 call 0x4902 ; 0x4902 case STATE_SEND_WAIT: if (Byte == BYTE_CAN) { /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; - 1c42: 10 92 a5 20 sts 0x20A5, r1 + 1c62: 10 92 a5 20 sts 0x20A5, r1 default: return false; break; } return true; - 1c46: 81 e0 ldi r24, 0x01 ; 1 + 1c66: 81 e0 ldi r24, 0x01 ; 1 } - 1c48: cf 91 pop r28 - 1c4a: 08 95 ret + 1c68: cf 91 pop r28 + 1c6a: 08 95 ret break; case STATE_SEND_INIT: /* Start sending on NAK */ if (Byte == BYTE_NAK) { - 1c4c: c5 31 cpi r28, 0x15 ; 21 - 1c4e: 09 f4 brne .+2 ; 0x1c52 - 1c50: 4f c0 rjmp .+158 ; 0x1cf0 + 1c6c: c5 31 cpi r28, 0x15 ; 21 + 1c6e: 09 f4 brne .+2 ; 0x1c72 + 1c70: 4f c0 rjmp .+158 ; 0x1d10 } /* Fallthrough */ case STATE_SEND_WAIT: if (Byte == BYTE_CAN) { - 1c52: c8 31 cpi r28, 0x18 ; 24 - 1c54: 89 f3 breq .-30 ; 0x1c38 + 1c72: c8 31 cpi r28, 0x18 ; 24 + 1c74: 89 f3 breq .-30 ; 0x1c58 /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_ACK) { - 1c56: c6 30 cpi r28, 0x06 ; 6 - 1c58: 09 f4 brne .+2 ; 0x1c5c - 1c5a: f3 c0 rjmp .+486 ; 0x1e42 + 1c76: c6 30 cpi r28, 0x06 ; 6 + 1c78: 09 f4 brne .+2 ; 0x1c7c + 1c7a: f3 c0 rjmp .+486 ; 0x1e62 BlockAddress += XMODEM_BLOCK_SIZE; } else { TerminalSendByte(BYTE_EOT); State = STATE_SEND_EOT; } } else if (Byte == BYTE_NAK){ - 1c5c: c5 31 cpi r28, 0x15 ; 21 - 1c5e: 49 f7 brne .-46 ; 0x1c32 - 1c60: 80 e0 ldi r24, 0x00 ; 0 - 1c62: 90 e2 ldi r25, 0x20 ; 32 - 1c64: 61 e0 ldi r22, 0x01 ; 1 - 1c66: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1c6a: 80 e0 ldi r24, 0x00 ; 0 - 1c6c: 90 e2 ldi r25, 0x20 ; 32 - 1c6e: 60 91 a6 20 lds r22, 0x20A6 - 1c72: 0e 94 71 24 call 0x48e2 ; 0x48e2 + 1c7c: c5 31 cpi r28, 0x15 ; 21 + 1c7e: 49 f7 brne .-46 ; 0x1c52 + 1c80: 80 e0 ldi r24, 0x00 ; 0 + 1c82: 90 e2 ldi r25, 0x20 ; 32 + 1c84: 61 e0 ldi r22, 0x01 ; 1 + 1c86: 0e 94 81 24 call 0x4902 ; 0x4902 + 1c8a: 80 e0 ldi r24, 0x00 ; 0 + 1c8c: 90 e2 ldi r25, 0x20 ; 32 + 1c8e: 60 91 a6 20 lds r22, 0x20A6 + 1c92: 0e 94 81 24 call 0x4902 ; 0x4902 /* Resend frame */ TerminalSendByte(BYTE_SOH); TerminalSendByte(CurrentFrameNumber); TerminalSendByte(255 - CurrentFrameNumber); - 1c76: 60 91 a6 20 lds r22, 0x20A6 - 1c7a: 60 95 com r22 - 1c7c: 80 e0 ldi r24, 0x00 ; 0 - 1c7e: 90 e2 ldi r25, 0x20 ; 32 - 1c80: 0e 94 71 24 call 0x48e2 ; 0x48e2 + 1c96: 60 91 a6 20 lds r22, 0x20A6 + 1c9a: 60 95 com r22 + 1c9c: 80 e0 ldi r24, 0x00 ; 0 + 1c9e: 90 e2 ldi r25, 0x20 ; 32 + 1ca0: 0e 94 81 24 call 0x4902 ; 0x4902 TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 1c84: 80 e2 ldi r24, 0x20 ; 32 - 1c86: 91 e2 ldi r25, 0x21 ; 33 - 1c88: 60 e8 ldi r22, 0x80 ; 128 - 1c8a: 70 e0 ldi r23, 0x00 ; 0 - 1c8c: af dc rcall .-1698 ; 0x15ec - 1c8e: 4f df rcall .-354 ; 0x1b2e + 1ca4: 80 e2 ldi r24, 0x20 ; 32 + 1ca6: 91 e2 ldi r25, 0x21 ; 33 + 1ca8: 60 e8 ldi r22, 0x80 ; 128 + 1caa: 70 e0 ldi r23, 0x00 ; 0 + 1cac: af dc rcall .-1698 ; 0x160c + 1cae: 4f df rcall .-354 ; 0x1b4e TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 1c90: 68 2f mov r22, r24 - 1c92: 80 e0 ldi r24, 0x00 ; 0 - 1c94: 90 e2 ldi r25, 0x20 ; 32 - 1c96: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1c9a: 81 e0 ldi r24, 0x01 ; 1 - 1c9c: a1 cf rjmp .-190 ; 0x1be0 + 1cb0: 68 2f mov r22, r24 + 1cb2: 80 e0 ldi r24, 0x00 ; 0 + 1cb4: 90 e2 ldi r25, 0x20 ; 32 + 1cb6: 0e 94 81 24 call 0x4902 ; 0x4902 + 1cba: 81 e0 ldi r24, 0x01 ; 1 + 1cbc: a1 cf rjmp .-190 ; 0x1c00 default: return false; break; } return true; - 1c9e: c0 93 b2 20 sts 0x20B2, r28 + 1cbe: c0 93 b2 20 sts 0x20B2, r28 break; case STATE_RECEIVE_FRAMENUM1: /* Store frame number */ ReceivedFrameNumber = Byte; - 1ca2: 84 e0 ldi r24, 0x04 ; 4 - 1ca4: 80 93 a5 20 sts 0x20A5, r24 + 1cc2: 84 e0 ldi r24, 0x04 ; 4 + 1cc4: 80 93 a5 20 sts 0x20A5, r24 State = STATE_RECEIVE_FRAMENUM2; - 1ca8: 81 e0 ldi r24, 0x01 ; 1 - 1caa: cf 91 pop r28 + 1cc8: 81 e0 ldi r24, 0x01 ; 1 + 1cca: cf 91 pop r28 default: return false; break; } return true; - 1cac: 08 95 ret + 1ccc: 08 95 ret } - 1cae: 20 91 af 20 lds r18, 0x20AF + 1cce: 20 91 af 20 lds r18, 0x20AF break; case STATE_RECEIVE_DATA: /* Process byte and update checksum */ TerminalBuffer[BufferIdx++] = Byte; - 1cb2: 30 91 b0 20 lds r19, 0x20B0 - 1cb6: f9 01 movw r30, r18 - 1cb8: e0 5e subi r30, 0xE0 ; 224 - 1cba: fe 4d sbci r31, 0xDE ; 222 - 1cbc: c0 83 st Z, r28 - 1cbe: c9 01 movw r24, r18 - 1cc0: 01 96 adiw r24, 0x01 ; 1 - 1cc2: 80 93 af 20 sts 0x20AF, r24 - 1cc6: 90 93 b0 20 sts 0x20B0, r25 - 1cca: 80 38 cpi r24, 0x80 ; 128 - 1ccc: 91 05 cpc r25, r1 + 1cd2: 30 91 b0 20 lds r19, 0x20B0 + 1cd6: f9 01 movw r30, r18 + 1cd8: e0 5e subi r30, 0xE0 ; 224 + 1cda: fe 4d sbci r31, 0xDE ; 222 + 1cdc: c0 83 st Z, r28 + 1cde: c9 01 movw r24, r18 + 1ce0: 01 96 adiw r24, 0x01 ; 1 + 1ce2: 80 93 af 20 sts 0x20AF, r24 + 1ce6: 90 93 b0 20 sts 0x20B0, r25 + 1cea: 80 38 cpi r24, 0x80 ; 128 + 1cec: 91 05 cpc r25, r1 if (BufferIdx == XMODEM_BLOCK_SIZE) { - 1cce: 09 f0 breq .+2 ; 0x1cd2 - 1cd0: b0 cf rjmp .-160 ; 0x1c32 - 1cd2: 86 e0 ldi r24, 0x06 ; 6 - 1cd4: 80 93 a5 20 sts 0x20A5, r24 + 1cee: 09 f0 breq .+2 ; 0x1cf2 + 1cf0: b0 cf rjmp .-160 ; 0x1c52 + 1cf2: 86 e0 ldi r24, 0x06 ; 6 + 1cf4: 80 93 a5 20 sts 0x20A5, r24 /* Block full */ State = STATE_RECEIVE_PROCESS; - 1cd8: 81 e0 ldi r24, 0x01 ; 1 - 1cda: 82 cf rjmp .-252 ; 0x1be0 + 1cf8: 81 e0 ldi r24, 0x01 ; 1 + 1cfa: 82 cf rjmp .-252 ; 0x1c00 default: return false; break; } return true; - 1cdc: 80 e0 ldi r24, 0x00 ; 0 - 1cde: 90 e2 ldi r25, 0x20 ; 32 - 1ce0: 65 e1 ldi r22, 0x15 ; 21 - 1ce2: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1ce6: 82 e0 ldi r24, 0x02 ; 2 - 1ce8: 80 93 a5 20 sts 0x20A5, r24 + 1cfc: 80 e0 ldi r24, 0x00 ; 0 + 1cfe: 90 e2 ldi r25, 0x20 ; 32 + 1d00: 65 e1 ldi r22, 0x15 ; 21 + 1d02: 0e 94 81 24 call 0x4902 ; 0x4902 + 1d06: 82 e0 ldi r24, 0x02 ; 2 + 1d08: 80 93 a5 20 sts 0x20A5, r24 State = STATE_OFF; } } else { /* Data seems to be damaged */ TerminalSendByte(BYTE_NAK); State = STATE_RECEIVE_WAIT; - 1cec: 81 e0 ldi r24, 0x01 ; 1 - 1cee: 78 cf rjmp .-272 ; 0x1be0 + 1d0c: 81 e0 ldi r24, 0x01 ; 1 + 1d0e: 78 cf rjmp .-272 ; 0x1c00 default: return false; break; } return true; - 1cf0: 81 e0 ldi r24, 0x01 ; 1 - 1cf2: 80 93 a6 20 sts 0x20A6, r24 + 1d10: 81 e0 ldi r24, 0x01 ; 1 + 1d12: 80 93 a6 20 sts 0x20A6, r24 /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_ACK) { /* Acknowledge. Proceed to next frame, get data and calc checksum */ CurrentFrameNumber++; - 1cf6: 40 91 a9 20 lds r20, 0x20A9 + 1d16: 40 91 a9 20 lds r20, 0x20A9 if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 1cfa: 50 91 aa 20 lds r21, 0x20AA - 1cfe: 60 91 ab 20 lds r22, 0x20AB - 1d02: 70 91 ac 20 lds r23, 0x20AC - 1d06: e0 91 ad 20 lds r30, 0x20AD - 1d0a: f0 91 ae 20 lds r31, 0x20AE - 1d0e: 80 e2 ldi r24, 0x20 ; 32 - 1d10: 91 e2 ldi r25, 0x21 ; 33 - 1d12: 20 e8 ldi r18, 0x80 ; 128 - 1d14: 30 e0 ldi r19, 0x00 ; 0 - 1d16: 09 95 icall - 1d18: 88 23 and r24, r24 - 1d1a: 09 f4 brne .+2 ; 0x1d1e - 1d1c: 79 c0 rjmp .+242 ; 0x1e10 - 1d1e: 80 e0 ldi r24, 0x00 ; 0 - 1d20: 90 e2 ldi r25, 0x20 ; 32 - 1d22: 61 e0 ldi r22, 0x01 ; 1 - 1d24: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1d28: 80 e0 ldi r24, 0x00 ; 0 - 1d2a: 90 e2 ldi r25, 0x20 ; 32 - 1d2c: 60 91 a6 20 lds r22, 0x20A6 - 1d30: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1d34: 60 91 a6 20 lds r22, 0x20A6 + 1d1a: 50 91 aa 20 lds r21, 0x20AA + 1d1e: 60 91 ab 20 lds r22, 0x20AB + 1d22: 70 91 ac 20 lds r23, 0x20AC + 1d26: e0 91 ad 20 lds r30, 0x20AD + 1d2a: f0 91 ae 20 lds r31, 0x20AE + 1d2e: 80 e2 ldi r24, 0x20 ; 32 + 1d30: 91 e2 ldi r25, 0x21 ; 33 + 1d32: 20 e8 ldi r18, 0x80 ; 128 + 1d34: 30 e0 ldi r19, 0x00 ; 0 + 1d36: 09 95 icall + 1d38: 88 23 and r24, r24 + 1d3a: 09 f4 brne .+2 ; 0x1d3e + 1d3c: 79 c0 rjmp .+242 ; 0x1e30 + 1d3e: 80 e0 ldi r24, 0x00 ; 0 + 1d40: 90 e2 ldi r25, 0x20 ; 32 + 1d42: 61 e0 ldi r22, 0x01 ; 1 + 1d44: 0e 94 81 24 call 0x4902 ; 0x4902 + 1d48: 80 e0 ldi r24, 0x00 ; 0 + 1d4a: 90 e2 ldi r25, 0x20 ; 32 + 1d4c: 60 91 a6 20 lds r22, 0x20A6 + 1d50: 0e 94 81 24 call 0x4902 ; 0x4902 + 1d54: 60 91 a6 20 lds r22, 0x20A6 TerminalSendByte(BYTE_SOH); TerminalSendByte(CurrentFrameNumber); TerminalSendByte(255 - CurrentFrameNumber); - 1d38: 60 95 com r22 - 1d3a: 80 e0 ldi r24, 0x00 ; 0 - 1d3c: 90 e2 ldi r25, 0x20 ; 32 - 1d3e: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1d42: 80 e2 ldi r24, 0x20 ; 32 - 1d44: 91 e2 ldi r25, 0x21 ; 33 + 1d58: 60 95 com r22 + 1d5a: 80 e0 ldi r24, 0x00 ; 0 + 1d5c: 90 e2 ldi r25, 0x20 ; 32 + 1d5e: 0e 94 81 24 call 0x4902 ; 0x4902 + 1d62: 80 e2 ldi r24, 0x20 ; 32 + 1d64: 91 e2 ldi r25, 0x21 ; 33 TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); - 1d46: 60 e8 ldi r22, 0x80 ; 128 - 1d48: 70 e0 ldi r23, 0x00 ; 0 - 1d4a: 50 dc rcall .-1888 ; 0x15ec - 1d4c: f0 de rcall .-544 ; 0x1b2e - 1d4e: 68 2f mov r22, r24 - 1d50: 80 e0 ldi r24, 0x00 ; 0 + 1d66: 60 e8 ldi r22, 0x80 ; 128 + 1d68: 70 e0 ldi r23, 0x00 ; 0 + 1d6a: 50 dc rcall .-1888 ; 0x160c + 1d6c: f0 de rcall .-544 ; 0x1b4e + 1d6e: 68 2f mov r22, r24 + 1d70: 80 e0 ldi r24, 0x00 ; 0 TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); - 1d52: 90 e2 ldi r25, 0x20 ; 32 - 1d54: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1d58: 80 91 a9 20 lds r24, 0x20A9 - 1d5c: 90 91 aa 20 lds r25, 0x20AA + 1d72: 90 e2 ldi r25, 0x20 ; 32 + 1d74: 0e 94 81 24 call 0x4902 ; 0x4902 + 1d78: 80 91 a9 20 lds r24, 0x20A9 + 1d7c: 90 91 aa 20 lds r25, 0x20AA BlockAddress += XMODEM_BLOCK_SIZE; - 1d60: a0 91 ab 20 lds r26, 0x20AB - 1d64: b0 91 ac 20 lds r27, 0x20AC - 1d68: 80 58 subi r24, 0x80 ; 128 - 1d6a: 9f 4f sbci r25, 0xFF ; 255 - 1d6c: af 4f sbci r26, 0xFF ; 255 - 1d6e: bf 4f sbci r27, 0xFF ; 255 - 1d70: 80 93 a9 20 sts 0x20A9, r24 - 1d74: 90 93 aa 20 sts 0x20AA, r25 - 1d78: a0 93 ab 20 sts 0x20AB, r26 - 1d7c: b0 93 ac 20 sts 0x20AC, r27 - 1d80: 81 e0 ldi r24, 0x01 ; 1 - 1d82: 2e cf rjmp .-420 ; 0x1be0 - 1d84: d4 de rcall .-600 ; 0x1b2e - 1d86: 8c 17 cp r24, r28 + 1d80: a0 91 ab 20 lds r26, 0x20AB + 1d84: b0 91 ac 20 lds r27, 0x20AC + 1d88: 80 58 subi r24, 0x80 ; 128 + 1d8a: 9f 4f sbci r25, 0xFF ; 255 + 1d8c: af 4f sbci r26, 0xFF ; 255 + 1d8e: bf 4f sbci r27, 0xFF ; 255 + 1d90: 80 93 a9 20 sts 0x20A9, r24 + 1d94: 90 93 aa 20 sts 0x20AA, r25 + 1d98: a0 93 ab 20 sts 0x20AB, r26 + 1d9c: b0 93 ac 20 sts 0x20AC, r27 + 1da0: 81 e0 ldi r24, 0x01 ; 1 + 1da2: 2e cf rjmp .-420 ; 0x1c00 + 1da4: d4 de rcall .-600 ; 0x1b4e + 1da6: 8c 17 cp r24, r28 default: return false; break; } return true; - 1d88: 09 f0 breq .+2 ; 0x1d8c - 1d8a: a8 cf rjmp .-176 ; 0x1cdc + 1da8: 09 f0 breq .+2 ; 0x1dac + 1daa: a8 cf rjmp .-176 ; 0x1cfc case STATE_RECEIVE_PROCESS: if (ReceivedFrameNumber == CurrentFrameNumber) { /* This is the expected frame. Calculate and verify checksum */ if (CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE) == Byte) { - 1d8c: 40 91 a9 20 lds r20, 0x20A9 - 1d90: 50 91 aa 20 lds r21, 0x20AA - 1d94: 60 91 ab 20 lds r22, 0x20AB + 1dac: 40 91 a9 20 lds r20, 0x20A9 + 1db0: 50 91 aa 20 lds r21, 0x20AA + 1db4: 60 91 ab 20 lds r22, 0x20AB /* Checksum is valid. Pass received data to callback function */ if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { - 1d98: 70 91 ac 20 lds r23, 0x20AC - 1d9c: e0 91 ad 20 lds r30, 0x20AD - 1da0: f0 91 ae 20 lds r31, 0x20AE - 1da4: 80 e2 ldi r24, 0x20 ; 32 - 1da6: 91 e2 ldi r25, 0x21 ; 33 - 1da8: 20 e8 ldi r18, 0x80 ; 128 - 1daa: 30 e0 ldi r19, 0x00 ; 0 - 1dac: 09 95 icall - 1dae: 88 23 and r24, r24 - 1db0: 09 f4 brne .+2 ; 0x1db4 - 1db2: 41 c0 rjmp .+130 ; 0x1e36 - 1db4: 80 91 a6 20 lds r24, 0x20A6 - 1db8: 8f 5f subi r24, 0xFF ; 255 - 1dba: 80 93 a6 20 sts 0x20A6, r24 + 1db8: 70 91 ac 20 lds r23, 0x20AC + 1dbc: e0 91 ad 20 lds r30, 0x20AD + 1dc0: f0 91 ae 20 lds r31, 0x20AE + 1dc4: 80 e2 ldi r24, 0x20 ; 32 + 1dc6: 91 e2 ldi r25, 0x21 ; 33 + 1dc8: 20 e8 ldi r18, 0x80 ; 128 + 1dca: 30 e0 ldi r19, 0x00 ; 0 + 1dcc: 09 95 icall + 1dce: 88 23 and r24, r24 + 1dd0: 09 f4 brne .+2 ; 0x1dd4 + 1dd2: 41 c0 rjmp .+130 ; 0x1e56 + 1dd4: 80 91 a6 20 lds r24, 0x20A6 + 1dd8: 8f 5f subi r24, 0xFF ; 255 + 1dda: 80 93 a6 20 sts 0x20A6, r24 /* Proceed to next frame and send ACK */ CurrentFrameNumber++; - 1dbe: 80 91 a9 20 lds r24, 0x20A9 - 1dc2: 90 91 aa 20 lds r25, 0x20AA - 1dc6: a0 91 ab 20 lds r26, 0x20AB + 1dde: 80 91 a9 20 lds r24, 0x20A9 + 1de2: 90 91 aa 20 lds r25, 0x20AA + 1de6: a0 91 ab 20 lds r26, 0x20AB BlockAddress += XMODEM_BLOCK_SIZE; - 1dca: b0 91 ac 20 lds r27, 0x20AC - 1dce: 80 58 subi r24, 0x80 ; 128 - 1dd0: 9f 4f sbci r25, 0xFF ; 255 - 1dd2: af 4f sbci r26, 0xFF ; 255 - 1dd4: bf 4f sbci r27, 0xFF ; 255 - 1dd6: 80 93 a9 20 sts 0x20A9, r24 - 1dda: 90 93 aa 20 sts 0x20AA, r25 - 1dde: a0 93 ab 20 sts 0x20AB, r26 - 1de2: b0 93 ac 20 sts 0x20AC, r27 - 1de6: 80 e0 ldi r24, 0x00 ; 0 - 1de8: 90 e2 ldi r25, 0x20 ; 32 - 1dea: 66 e0 ldi r22, 0x06 ; 6 - 1dec: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1df0: 82 e0 ldi r24, 0x02 ; 2 - 1df2: 80 93 a5 20 sts 0x20A5, r24 - 1df6: 81 e0 ldi r24, 0x01 ; 1 - 1df8: f3 ce rjmp .-538 ; 0x1be0 + 1dea: b0 91 ac 20 lds r27, 0x20AC + 1dee: 80 58 subi r24, 0x80 ; 128 + 1df0: 9f 4f sbci r25, 0xFF ; 255 + 1df2: af 4f sbci r26, 0xFF ; 255 + 1df4: bf 4f sbci r27, 0xFF ; 255 + 1df6: 80 93 a9 20 sts 0x20A9, r24 + 1dfa: 90 93 aa 20 sts 0x20AA, r25 + 1dfe: a0 93 ab 20 sts 0x20AB, r26 + 1e02: b0 93 ac 20 sts 0x20AC, r27 + 1e06: 80 e0 ldi r24, 0x00 ; 0 + 1e08: 90 e2 ldi r25, 0x20 ; 32 + 1e0a: 66 e0 ldi r22, 0x06 ; 6 + 1e0c: 0e 94 81 24 call 0x4902 ; 0x4902 + 1e10: 82 e0 ldi r24, 0x02 ; 2 + 1e12: 80 93 a5 20 sts 0x20A5, r24 + 1e16: 81 e0 ldi r24, 0x01 ; 1 + 1e18: f3 ce rjmp .-538 ; 0x1c00 State = STATE_RECEIVE_WAIT; } } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { /* This is a retransmission */ TerminalSendByte(BYTE_ACK); State = STATE_RECEIVE_WAIT; - 1dfa: 10 92 af 20 sts 0x20AF, r1 - 1dfe: 10 92 b0 20 sts 0x20B0, r1 + 1e1a: 10 92 af 20 sts 0x20AF, r1 + 1e1e: 10 92 b0 20 sts 0x20B0, r1 default: return false; break; } return true; - 1e02: 10 92 b1 20 sts 0x20B1, r1 + 1e22: 10 92 b1 20 sts 0x20B1, r1 switch(State) { case STATE_RECEIVE_INIT: case STATE_RECEIVE_WAIT: if (Byte == BYTE_SOH) { /* Next frame incoming */ BufferIdx = 0; - 1e06: 83 e0 ldi r24, 0x03 ; 3 - 1e08: 80 93 a5 20 sts 0x20A5, r24 + 1e26: 83 e0 ldi r24, 0x03 ; 3 + 1e28: 80 93 a5 20 sts 0x20A5, r24 Checksum = CHECKSUM_INIT_VALUE; - 1e0c: 81 e0 ldi r24, 0x01 ; 1 - 1e0e: e8 ce rjmp .-560 ; 0x1be0 + 1e2c: 81 e0 ldi r24, 0x01 ; 1 + 1e2e: e8 ce rjmp .-560 ; 0x1c00 State = STATE_RECEIVE_FRAMENUM1; - 1e10: 80 e0 ldi r24, 0x00 ; 0 - 1e12: 90 e2 ldi r25, 0x20 ; 32 - 1e14: 64 e0 ldi r22, 0x04 ; 4 + 1e30: 80 e0 ldi r24, 0x00 ; 0 + 1e32: 90 e2 ldi r25, 0x20 ; 32 + 1e34: 64 e0 ldi r22, 0x04 ; 4 default: return false; break; } return true; - 1e16: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1e1a: 89 e0 ldi r24, 0x09 ; 9 - 1e1c: 80 93 a5 20 sts 0x20A5, r24 - 1e20: 81 e0 ldi r24, 0x01 ; 1 - 1e22: de ce rjmp .-580 ; 0x1be0 + 1e36: 0e 94 81 24 call 0x4902 ; 0x4902 + 1e3a: 89 e0 ldi r24, 0x09 ; 9 + 1e3c: 80 93 a5 20 sts 0x20A5, r24 + 1e40: 81 e0 ldi r24, 0x01 ; 1 + 1e42: de ce rjmp .-580 ; 0x1c00 TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); BlockAddress += XMODEM_BLOCK_SIZE; } else { TerminalSendByte(BYTE_EOT); State = STATE_SEND_EOT; - 1e24: 80 e0 ldi r24, 0x00 ; 0 - 1e26: 90 e2 ldi r25, 0x20 ; 32 - 1e28: 66 e0 ldi r22, 0x06 ; 6 + 1e44: 80 e0 ldi r24, 0x00 ; 0 + 1e46: 90 e2 ldi r25, 0x20 ; 32 + 1e48: 66 e0 ldi r22, 0x06 ; 6 default: return false; break; } return true; - 1e2a: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1e2e: 10 92 a5 20 sts 0x20A5, r1 - 1e32: 81 e0 ldi r24, 0x01 ; 1 - 1e34: d5 ce rjmp .-598 ; 0x1be0 - 1e36: 80 e0 ldi r24, 0x00 ; 0 + 1e4a: 0e 94 81 24 call 0x4902 ; 0x4902 + 1e4e: 10 92 a5 20 sts 0x20A5, r1 + 1e52: 81 e0 ldi r24, 0x01 ; 1 + 1e54: d5 ce rjmp .-598 ; 0x1c00 + 1e56: 80 e0 ldi r24, 0x00 ; 0 Checksum = CHECKSUM_INIT_VALUE; State = STATE_RECEIVE_FRAMENUM1; } else if (Byte == BYTE_EOT) { /* Transmission finished */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; - 1e38: 90 e2 ldi r25, 0x20 ; 32 - 1e3a: 68 e1 ldi r22, 0x18 ; 24 + 1e58: 90 e2 ldi r25, 0x20 ; 32 + 1e5a: 68 e1 ldi r22, 0x18 ; 24 default: return false; break; } return true; - 1e3c: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1e40: c7 ce rjmp .-626 ; 0x1bd0 - 1e42: 80 91 a6 20 lds r24, 0x20A6 - 1e46: 8f 5f subi r24, 0xFF ; 255 - 1e48: 54 cf rjmp .-344 ; 0x1cf2 + 1e5c: 0e 94 81 24 call 0x4902 ; 0x4902 + 1e60: c7 ce rjmp .-626 ; 0x1bf0 + 1e62: 80 91 a6 20 lds r24, 0x20A6 + 1e66: 8f 5f subi r24, 0xFF ; 255 + 1e68: 54 cf rjmp .-344 ; 0x1d12 -00001e4a : - 1e4a: 80 91 a5 20 lds r24, 0x20A5 +00001e6a : + 1e6a: 80 91 a5 20 lds r24, 0x20A5 case STATE_SEND_WAIT: if (Byte == BYTE_CAN) { /* Cancel */ TerminalSendByte(BYTE_ACK); State = STATE_OFF; } else if (Byte == BYTE_ACK) { - 1e4e: 81 30 cpi r24, 0x01 ; 1 - 1e50: 71 f0 breq .+28 ; 0x1e6e - 1e52: 87 30 cpi r24, 0x07 ; 7 + 1e6e: 81 30 cpi r24, 0x01 ; 1 + 1e70: 71 f0 breq .+28 ; 0x1e8e + 1e72: 87 30 cpi r24, 0x07 ; 7 } void XModemTick(void) { /* Timeouts go here */ switch(State) { - 1e54: 09 f0 breq .+2 ; 0x1e58 - 1e56: 08 95 ret + 1e74: 09 f0 breq .+2 ; 0x1e78 + 1e76: 08 95 ret RetryTimeout = RECV_INIT_TIMEOUT; } break; case STATE_SEND_INIT: if (RetryTimeout-- == 0) { - 1e58: 80 91 a8 20 lds r24, 0x20A8 - 1e5c: 98 2f mov r25, r24 - 1e5e: 91 50 subi r25, 0x01 ; 1 - 1e60: 90 93 a8 20 sts 0x20A8, r25 - 1e64: 88 23 and r24, r24 - 1e66: b9 f7 brne .-18 ; 0x1e56 + 1e78: 80 91 a8 20 lds r24, 0x20A8 + 1e7c: 98 2f mov r25, r24 + 1e7e: 91 50 subi r25, 0x01 ; 1 + 1e80: 90 93 a8 20 sts 0x20A8, r25 + 1e84: 88 23 and r24, r24 + 1e86: b9 f7 brne .-18 ; 0x1e76 /* Abort */ State = STATE_OFF; - 1e68: 10 92 a5 20 sts 0x20A5, r1 - 1e6c: 08 95 ret + 1e88: 10 92 a5 20 sts 0x20A5, r1 + 1e8c: 08 95 ret void XModemTick(void) { /* Timeouts go here */ switch(State) { case STATE_RECEIVE_INIT: if (RetryTimeout-- == 0) { - 1e6e: 80 91 a8 20 lds r24, 0x20A8 - 1e72: 98 2f mov r25, r24 - 1e74: 91 50 subi r25, 0x01 ; 1 - 1e76: 90 93 a8 20 sts 0x20A8, r25 - 1e7a: 88 23 and r24, r24 - 1e7c: 61 f7 brne .-40 ; 0x1e56 + 1e8e: 80 91 a8 20 lds r24, 0x20A8 + 1e92: 98 2f mov r25, r24 + 1e94: 91 50 subi r25, 0x01 ; 1 + 1e96: 90 93 a8 20 sts 0x20A8, r25 + 1e9a: 88 23 and r24, r24 + 1e9c: 61 f7 brne .-40 ; 0x1e76 if (RetryCount-- > 0) { - 1e7e: 80 91 a7 20 lds r24, 0x20A7 - 1e82: 98 2f mov r25, r24 - 1e84: 91 50 subi r25, 0x01 ; 1 - 1e86: 90 93 a7 20 sts 0x20A7, r25 - 1e8a: 88 23 and r24, r24 - 1e8c: 31 f4 brne .+12 ; 0x1e9a + 1e9e: 80 91 a7 20 lds r24, 0x20A7 + 1ea2: 98 2f mov r25, r24 + 1ea4: 91 50 subi r25, 0x01 ; 1 + 1ea6: 90 93 a7 20 sts 0x20A7, r25 + 1eaa: 88 23 and r24, r24 + 1eac: 31 f4 brne .+12 ; 0x1eba /* Put out communication request */ TerminalSendChar(BYTE_NAK); } else { /* Just shut off after some time. */ State = STATE_OFF; - 1e8e: 10 92 a5 20 sts 0x20A5, r1 + 1eae: 10 92 a5 20 sts 0x20A5, r1 } RetryTimeout = RECV_INIT_TIMEOUT; - 1e92: 85 e0 ldi r24, 0x05 ; 5 - 1e94: 80 93 a8 20 sts 0x20A8, r24 - 1e98: 08 95 ret + 1eb2: 85 e0 ldi r24, 0x05 ; 5 + 1eb4: 80 93 a8 20 sts 0x20A8, r24 + 1eb8: 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); } - 1e9a: 80 e0 ldi r24, 0x00 ; 0 - 1e9c: 90 e2 ldi r25, 0x20 ; 32 - 1e9e: 65 e1 ldi r22, 0x15 ; 21 - 1ea0: 0e 94 71 24 call 0x48e2 ; 0x48e2 - 1ea4: f6 cf rjmp .-20 ; 0x1e92 + 1eba: 80 e0 ldi r24, 0x00 ; 0 + 1ebc: 90 e2 ldi r25, 0x20 ; 32 + 1ebe: 65 e1 ldi r22, 0x15 ; 21 + 1ec0: 0e 94 81 24 call 0x4902 ; 0x4902 + 1ec4: f6 cf rjmp .-20 ; 0x1eb2 -00001ea6 : +00001ec6 : void CommandLineInit(void) { BufferIdx = 0; } bool CommandLineProcessByte(uint8_t Byte) { - 1ea6: 1f 93 push r17 - 1ea8: cf 93 push r28 - 1eaa: df 93 push r29 + 1ec6: 1f 93 push r17 + 1ec8: cf 93 push r28 + 1eca: df 93 push r29 if (IS_CHARACTER(Byte)){ - 1eac: 98 2f mov r25, r24 - 1eae: 91 54 subi r25, 0x41 ; 65 - 1eb0: 9a 31 cpi r25, 0x1A ; 26 - 1eb2: 20 f0 brcs .+8 ; 0x1ebc - 1eb4: 90 52 subi r25, 0x20 ; 32 - 1eb6: 9a 31 cpi r25, 0x1A ; 26 - 1eb8: b8 f4 brcc .+46 ; 0x1ee8 + 1ecc: 98 2f mov r25, r24 + 1ece: 91 54 subi r25, 0x41 ; 65 + 1ed0: 9a 31 cpi r25, 0x1A ; 26 + 1ed2: 20 f0 brcs .+8 ; 0x1edc + 1ed4: 90 52 subi r25, 0x20 ; 32 + 1ed6: 9a 31 cpi r25, 0x1A ; 26 + 1ed8: b8 f4 brcc .+46 ; 0x1f08 /* Store uppercase character */ if (IS_LOWERCASE(Byte)) { Byte = TO_UPPERCASE(Byte); - 1eba: 80 52 subi r24, 0x20 ; 32 + 1eda: 80 52 subi r24, 0x20 ; 32 } /* Prevent buffer overflow and account for '\0' */ if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { - 1ebc: 20 91 b3 20 lds r18, 0x20B3 - 1ec0: 30 91 b4 20 lds r19, 0x20B4 - 1ec4: 2f 3f cpi r18, 0xFF ; 255 - 1ec6: 31 05 cpc r19, r1 - 1ec8: 50 f4 brcc .+20 ; 0x1ede + 1edc: 20 91 b3 20 lds r18, 0x20B3 + 1ee0: 30 91 b4 20 lds r19, 0x20B4 + 1ee4: 2f 3f cpi r18, 0xFF ; 255 + 1ee6: 31 05 cpc r19, r1 + 1ee8: 50 f4 brcc .+20 ; 0x1efe TerminalBuffer[BufferIdx++] = Byte; - 1eca: f9 01 movw r30, r18 - 1ecc: e0 5e subi r30, 0xE0 ; 224 - 1ece: fe 4d sbci r31, 0xDE ; 222 - 1ed0: 80 83 st Z, r24 - 1ed2: 2f 5f subi r18, 0xFF ; 255 - 1ed4: 3f 4f sbci r19, 0xFF ; 255 - 1ed6: 20 93 b3 20 sts 0x20B3, r18 - 1eda: 30 93 b4 20 sts 0x20B4, r19 + 1eea: f9 01 movw r30, r18 + 1eec: e0 5e subi r30, 0xE0 ; 224 + 1eee: fe 4d sbci r31, 0xDE ; 222 + 1ef0: 80 83 st Z, r24 + 1ef2: 2f 5f subi r18, 0xFF ; 255 + 1ef4: 3f 4f sbci r19, 0xFF ; 255 + 1ef6: 20 93 b3 20 sts 0x20B3, r18 + 1efa: 30 93 b4 20 sts 0x20B4, r19 } else { /* Ignore other chars */ } return true; } - 1ede: 81 e0 ldi r24, 0x01 ; 1 - 1ee0: df 91 pop r29 - 1ee2: cf 91 pop r28 - 1ee4: 1f 91 pop r17 - 1ee6: 08 95 ret + 1efe: 81 e0 ldi r24, 0x01 ; 1 + 1f00: df 91 pop r29 + 1f02: cf 91 pop r28 + 1f04: 1f 91 pop r17 + 1f06: 08 95 ret { BufferIdx = 0; } bool CommandLineProcessByte(uint8_t Byte) { if (IS_CHARACTER(Byte)){ - 1ee8: 9f 5c subi r25, 0xCF ; 207 - 1eea: 9a 30 cpi r25, 0x0A ; 10 - 1eec: 38 f3 brcs .-50 ; 0x1ebc - 1eee: 8f 35 cpi r24, 0x5F ; 95 - 1ef0: 29 f3 breq .-54 ; 0x1ebc - 1ef2: 8f 33 cpi r24, 0x3F ; 63 - 1ef4: 19 f3 breq .-58 ; 0x1ebc - 1ef6: 8d 33 cpi r24, 0x3D ; 61 - 1ef8: 09 f3 breq .-62 ; 0x1ebc + 1f08: 9f 5c subi r25, 0xCF ; 207 + 1f0a: 9a 30 cpi r25, 0x0A ; 10 + 1f0c: 38 f3 brcs .-50 ; 0x1edc + 1f0e: 8f 35 cpi r24, 0x5F ; 95 + 1f10: 29 f3 breq .-54 ; 0x1edc + 1f12: 8f 33 cpi r24, 0x3F ; 63 + 1f14: 19 f3 breq .-58 ; 0x1edc + 1f16: 8d 33 cpi r24, 0x3D ; 61 + 1f18: 09 f3 breq .-62 ; 0x1edc /* Prevent buffer overflow and account for '\0' */ if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { TerminalBuffer[BufferIdx++] = Byte; } }else if (Byte == '\r') { - 1efa: 8d 30 cpi r24, 0x0D ; 13 - 1efc: a9 f0 breq .+42 ; 0x1f28 + 1f1a: 8d 30 cpi r24, 0x0D ; 13 + 1f1c: a9 f0 breq .+42 ; 0x1f48 /* Process on \r. Terminate string and decode. */ TerminalBuffer[BufferIdx] = '\0'; BufferIdx = 0; DecodeCommand(); }else if (Byte == '\b') { - 1efe: 88 30 cpi r24, 0x08 ; 8 - 1f00: 39 f0 breq .+14 ; 0x1f10 + 1f1e: 88 30 cpi r24, 0x08 ; 8 + 1f20: 39 f0 breq .+14 ; 0x1f30 /* Backspace. Delete last character in buffer. */ if (BufferIdx > 0) { BufferIdx--; } } else if (Byte == 0x1B){ - 1f02: 8b 31 cpi r24, 0x1B ; 27 - 1f04: 61 f7 brne .-40 ; 0x1ede + 1f22: 8b 31 cpi r24, 0x1B ; 27 + 1f24: 61 f7 brne .-40 ; 0x1efe /* Drop buffer on escape */ BufferIdx = 0; - 1f06: 10 92 b3 20 sts 0x20B3, r1 - 1f0a: 10 92 b4 20 sts 0x20B4, r1 - 1f0e: e7 cf rjmp .-50 ; 0x1ede + 1f26: 10 92 b3 20 sts 0x20B3, r1 + 1f2a: 10 92 b4 20 sts 0x20B4, r1 + 1f2e: e7 cf rjmp .-50 ; 0x1efe BufferIdx = 0; DecodeCommand(); }else if (Byte == '\b') { /* Backspace. Delete last character in buffer. */ if (BufferIdx > 0) { - 1f10: 80 91 b3 20 lds r24, 0x20B3 - 1f14: 90 91 b4 20 lds r25, 0x20B4 - 1f18: 00 97 sbiw r24, 0x00 ; 0 - 1f1a: 09 f3 breq .-62 ; 0x1ede + 1f30: 80 91 b3 20 lds r24, 0x20B3 + 1f34: 90 91 b4 20 lds r25, 0x20B4 + 1f38: 00 97 sbiw r24, 0x00 ; 0 + 1f3a: 09 f3 breq .-62 ; 0x1efe BufferIdx--; - 1f1c: 01 97 sbiw r24, 0x01 ; 1 - 1f1e: 80 93 b3 20 sts 0x20B3, r24 - 1f22: 90 93 b4 20 sts 0x20B4, r25 - 1f26: db cf rjmp .-74 ; 0x1ede + 1f3c: 01 97 sbiw r24, 0x01 ; 1 + 1f3e: 80 93 b3 20 sts 0x20B3, r24 + 1f42: 90 93 b4 20 sts 0x20B4, r25 + 1f46: db cf rjmp .-74 ; 0x1efe if (BufferIdx < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { TerminalBuffer[BufferIdx++] = Byte; } }else if (Byte == '\r') { /* Process on \r. Terminate string and decode. */ TerminalBuffer[BufferIdx] = '\0'; - 1f28: e0 91 b3 20 lds r30, 0x20B3 - 1f2c: f0 91 b4 20 lds r31, 0x20B4 - 1f30: e0 5e subi r30, 0xE0 ; 224 - 1f32: fe 4d sbci r31, 0xDE ; 222 - 1f34: 10 82 st Z, r1 + 1f48: e0 91 b3 20 lds r30, 0x20B3 + 1f4c: f0 91 b4 20 lds r31, 0x20B4 + 1f50: e0 5e subi r30, 0xE0 ; 224 + 1f52: fe 4d sbci r31, 0xDE ; 222 + 1f54: 10 82 st Z, r1 BufferIdx = 0; - 1f36: 10 92 b3 20 sts 0x20B3, r1 - 1f3a: 10 92 b4 20 sts 0x20B4, r1 + 1f56: 10 92 b3 20 sts 0x20B3, r1 + 1f5a: 10 92 b4 20 sts 0x20B4, 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])) { - 1f3e: 80 91 20 21 lds r24, 0x2120 - 1f42: 88 23 and r24, r24 - 1f44: 09 f4 brne .+2 ; 0x1f48 - 1f46: a7 c0 rjmp .+334 ; 0x2096 - 1f48: 8f 33 cpi r24, 0x3F ; 63 - 1f4a: 09 f4 brne .+2 ; 0x1f4e - 1f4c: a4 c0 rjmp .+328 ; 0x2096 - 1f4e: 8d 33 cpi r24, 0x3D ; 61 - 1f50: 09 f4 brne .+2 ; 0x1f54 - 1f52: a1 c0 rjmp .+322 ; 0x2096 - 1f54: e1 e2 ldi r30, 0x21 ; 33 - 1f56: f1 e2 ldi r31, 0x21 ; 33 - 1f58: ef 01 movw r28, r30 - 1f5a: 21 97 sbiw r28, 0x01 ; 1 - 1f5c: 06 c0 rjmp .+12 ; 0x1f6a + 1f5e: 80 91 20 21 lds r24, 0x2120 + 1f62: 88 23 and r24, r24 + 1f64: 09 f4 brne .+2 ; 0x1f68 + 1f66: a7 c0 rjmp .+334 ; 0x20b6 + 1f68: 8f 33 cpi r24, 0x3F ; 63 + 1f6a: 09 f4 brne .+2 ; 0x1f6e + 1f6c: a4 c0 rjmp .+328 ; 0x20b6 + 1f6e: 8d 33 cpi r24, 0x3D ; 61 + 1f70: 09 f4 brne .+2 ; 0x1f74 + 1f72: a1 c0 rjmp .+322 ; 0x20b6 + 1f74: e1 e2 ldi r30, 0x21 ; 33 + 1f76: f1 e2 ldi r31, 0x21 ; 33 + 1f78: ef 01 movw r28, r30 + 1f7a: 21 97 sbiw r28, 0x01 ; 1 + 1f7c: 06 c0 rjmp .+12 ; 0x1f8a char* pCommandDelimiter = pTerminalBuffer; char CommandDelimiter = '\0'; /* Search for command delimiter, store it and replace with '\0' */ while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 1f5e: 8f 33 cpi r24, 0x3F ; 63 - 1f60: 09 f4 brne .+2 ; 0x1f64 - 1f62: d3 c0 rjmp .+422 ; 0x210a - 1f64: 8d 33 cpi r24, 0x3D ; 61 - 1f66: 09 f4 brne .+2 ; 0x1f6a - 1f68: ce c0 rjmp .+412 ; 0x2106 + 1f7e: 8f 33 cpi r24, 0x3F ; 63 + 1f80: 09 f4 brne .+2 ; 0x1f84 + 1f82: d3 c0 rjmp .+422 ; 0x212a + 1f84: 8d 33 cpi r24, 0x3D ; 61 + 1f86: 09 f4 brne .+2 ; 0x1f8a + 1f88: ce c0 rjmp .+412 ; 0x2126 pCommandDelimiter++; - 1f6a: 21 96 adiw r28, 0x01 ; 1 + 1f8a: 21 96 adiw r28, 0x01 ; 1 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))) - 1f6c: 81 91 ld r24, Z+ - 1f6e: 88 23 and r24, r24 - 1f70: b1 f7 brne .-20 ; 0x1f5e - 1f72: 10 e0 ldi r17, 0x00 ; 0 + 1f8c: 81 91 ld r24, Z+ + 1f8e: 88 23 and r24, r24 + 1f90: b1 f7 brne .-20 ; 0x1f7e + 1f92: 10 e0 ldi r17, 0x00 ; 0 pCommandDelimiter++; CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; - 1f74: 18 82 st Y, r1 + 1f94: 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) { - 1f76: 80 e2 ldi r24, 0x20 ; 32 - 1f78: 91 e2 ldi r25, 0x21 ; 33 - 1f7a: 6b e1 ldi r22, 0x1B ; 27 - 1f7c: 74 e0 ldi r23, 0x04 ; 4 - 1f7e: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1f82: 00 97 sbiw r24, 0x00 ; 0 - 1f84: 09 f4 brne .+2 ; 0x1f88 - 1f86: 20 c1 rjmp .+576 ; 0x21c8 - 1f88: 80 e2 ldi r24, 0x20 ; 32 - 1f8a: 91 e2 ldi r25, 0x21 ; 33 - 1f8c: 61 e3 ldi r22, 0x31 ; 49 - 1f8e: 74 e0 ldi r23, 0x04 ; 4 - 1f90: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1f94: 00 97 sbiw r24, 0x00 ; 0 - 1f96: 09 f4 brne .+2 ; 0x1f9a - 1f98: 15 c1 rjmp .+554 ; 0x21c4 - 1f9a: 80 e2 ldi r24, 0x20 ; 32 - 1f9c: 91 e2 ldi r25, 0x21 ; 33 - 1f9e: 67 e4 ldi r22, 0x47 ; 71 - 1fa0: 74 e0 ldi r23, 0x04 ; 4 - 1fa2: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1fa6: 00 97 sbiw r24, 0x00 ; 0 - 1fa8: 09 f4 brne .+2 ; 0x1fac - 1faa: 06 c1 rjmp .+524 ; 0x21b8 - 1fac: 80 e2 ldi r24, 0x20 ; 32 - 1fae: 91 e2 ldi r25, 0x21 ; 33 - 1fb0: 6d e5 ldi r22, 0x5D ; 93 - 1fb2: 74 e0 ldi r23, 0x04 ; 4 - 1fb4: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1fb8: 00 97 sbiw r24, 0x00 ; 0 - 1fba: 09 f4 brne .+2 ; 0x1fbe - 1fbc: fb c0 rjmp .+502 ; 0x21b4 - 1fbe: 80 e2 ldi r24, 0x20 ; 32 - 1fc0: 91 e2 ldi r25, 0x21 ; 33 - 1fc2: 63 e7 ldi r22, 0x73 ; 115 - 1fc4: 74 e0 ldi r23, 0x04 ; 4 - 1fc6: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1fca: 00 97 sbiw r24, 0x00 ; 0 - 1fcc: 09 f4 brne .+2 ; 0x1fd0 - 1fce: f0 c0 rjmp .+480 ; 0x21b0 - 1fd0: 80 e2 ldi r24, 0x20 ; 32 - 1fd2: 91 e2 ldi r25, 0x21 ; 33 - 1fd4: 69 e8 ldi r22, 0x89 ; 137 - 1fd6: 74 e0 ldi r23, 0x04 ; 4 - 1fd8: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1fdc: 00 97 sbiw r24, 0x00 ; 0 - 1fde: 09 f4 brne .+2 ; 0x1fe2 - 1fe0: b5 c0 rjmp .+362 ; 0x214c - 1fe2: 80 e2 ldi r24, 0x20 ; 32 - 1fe4: 91 e2 ldi r25, 0x21 ; 33 - 1fe6: 6f e9 ldi r22, 0x9F ; 159 - 1fe8: 74 e0 ldi r23, 0x04 ; 4 - 1fea: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 1fee: 00 97 sbiw r24, 0x00 ; 0 - 1ff0: 09 f4 brne .+2 ; 0x1ff4 - 1ff2: fa c0 rjmp .+500 ; 0x21e8 - 1ff4: 80 e2 ldi r24, 0x20 ; 32 - 1ff6: 91 e2 ldi r25, 0x21 ; 33 - 1ff8: 65 eb ldi r22, 0xB5 ; 181 - 1ffa: 74 e0 ldi r23, 0x04 ; 4 - 1ffc: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 2000: 00 97 sbiw r24, 0x00 ; 0 - 2002: 09 f4 brne .+2 ; 0x2006 - 2004: ef c0 rjmp .+478 ; 0x21e4 - 2006: 80 e2 ldi r24, 0x20 ; 32 - 2008: 91 e2 ldi r25, 0x21 ; 33 - 200a: 6b ec ldi r22, 0xCB ; 203 - 200c: 74 e0 ldi r23, 0x04 ; 4 - 200e: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 2012: 00 97 sbiw r24, 0x00 ; 0 - 2014: 09 f4 brne .+2 ; 0x2018 - 2016: e4 c0 rjmp .+456 ; 0x21e0 - 2018: 80 e2 ldi r24, 0x20 ; 32 - 201a: 91 e2 ldi r25, 0x21 ; 33 - 201c: 61 ee ldi r22, 0xE1 ; 225 - 201e: 74 e0 ldi r23, 0x04 ; 4 - 2020: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 2024: 00 97 sbiw r24, 0x00 ; 0 - 2026: 09 f4 brne .+2 ; 0x202a - 2028: d9 c0 rjmp .+434 ; 0x21dc - 202a: 80 e2 ldi r24, 0x20 ; 32 - 202c: 91 e2 ldi r25, 0x21 ; 33 - 202e: 67 ef ldi r22, 0xF7 ; 247 - 2030: 74 e0 ldi r23, 0x04 ; 4 - 2032: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 2036: 00 97 sbiw r24, 0x00 ; 0 - 2038: 09 f4 brne .+2 ; 0x203c - 203a: ce c0 rjmp .+412 ; 0x21d8 - 203c: 80 e2 ldi r24, 0x20 ; 32 - 203e: 91 e2 ldi r25, 0x21 ; 33 - 2040: 6d e0 ldi r22, 0x0D ; 13 - 2042: 75 e0 ldi r23, 0x05 ; 5 - 2044: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 2048: 00 97 sbiw r24, 0x00 ; 0 - 204a: 09 f4 brne .+2 ; 0x204e - 204c: c3 c0 rjmp .+390 ; 0x21d4 - 204e: 80 e2 ldi r24, 0x20 ; 32 - 2050: 91 e2 ldi r25, 0x21 ; 33 - 2052: 63 e2 ldi r22, 0x23 ; 35 - 2054: 75 e0 ldi r23, 0x05 ; 5 - 2056: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 205a: 00 97 sbiw r24, 0x00 ; 0 - 205c: 09 f4 brne .+2 ; 0x2060 - 205e: b8 c0 rjmp .+368 ; 0x21d0 - 2060: 80 e2 ldi r24, 0x20 ; 32 - 2062: 91 e2 ldi r25, 0x21 ; 33 - 2064: 69 e3 ldi r22, 0x39 ; 57 - 2066: 75 e0 ldi r23, 0x05 ; 5 - 2068: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 206c: 00 97 sbiw r24, 0x00 ; 0 - 206e: 09 f4 brne .+2 ; 0x2072 - 2070: ad c0 rjmp .+346 ; 0x21cc - 2072: 80 e2 ldi r24, 0x20 ; 32 - 2074: 91 e2 ldi r25, 0x21 ; 33 - 2076: 6f e4 ldi r22, 0x4F ; 79 - 2078: 75 e0 ldi r23, 0x05 ; 5 - 207a: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 207e: 00 97 sbiw r24, 0x00 ; 0 - 2080: 09 f4 brne .+2 ; 0x2084 - 2082: 9e c0 rjmp .+316 ; 0x21c0 - 2084: 80 e2 ldi r24, 0x20 ; 32 - 2086: 91 e2 ldi r25, 0x21 ; 33 - 2088: 65 e6 ldi r22, 0x65 ; 101 - 208a: 75 e0 ldi r23, 0x05 ; 5 - 208c: 0e 94 eb 25 call 0x4bd6 ; 0x4bd6 - 2090: 00 97 sbiw r24, 0x00 ; 0 - 2092: 09 f4 brne .+2 ; 0x2096 - 2094: 93 c0 rjmp .+294 ; 0x21bc + 1f96: 80 e2 ldi r24, 0x20 ; 32 + 1f98: 91 e2 ldi r25, 0x21 ; 33 + 1f9a: 6b e3 ldi r22, 0x3B ; 59 + 1f9c: 74 e0 ldi r23, 0x04 ; 4 + 1f9e: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1fa2: 00 97 sbiw r24, 0x00 ; 0 + 1fa4: 09 f4 brne .+2 ; 0x1fa8 + 1fa6: 20 c1 rjmp .+576 ; 0x21e8 + 1fa8: 80 e2 ldi r24, 0x20 ; 32 + 1faa: 91 e2 ldi r25, 0x21 ; 33 + 1fac: 61 e5 ldi r22, 0x51 ; 81 + 1fae: 74 e0 ldi r23, 0x04 ; 4 + 1fb0: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1fb4: 00 97 sbiw r24, 0x00 ; 0 + 1fb6: 09 f4 brne .+2 ; 0x1fba + 1fb8: 15 c1 rjmp .+554 ; 0x21e4 + 1fba: 80 e2 ldi r24, 0x20 ; 32 + 1fbc: 91 e2 ldi r25, 0x21 ; 33 + 1fbe: 67 e6 ldi r22, 0x67 ; 103 + 1fc0: 74 e0 ldi r23, 0x04 ; 4 + 1fc2: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1fc6: 00 97 sbiw r24, 0x00 ; 0 + 1fc8: 09 f4 brne .+2 ; 0x1fcc + 1fca: 06 c1 rjmp .+524 ; 0x21d8 + 1fcc: 80 e2 ldi r24, 0x20 ; 32 + 1fce: 91 e2 ldi r25, 0x21 ; 33 + 1fd0: 6d e7 ldi r22, 0x7D ; 125 + 1fd2: 74 e0 ldi r23, 0x04 ; 4 + 1fd4: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1fd8: 00 97 sbiw r24, 0x00 ; 0 + 1fda: 09 f4 brne .+2 ; 0x1fde + 1fdc: fb c0 rjmp .+502 ; 0x21d4 + 1fde: 80 e2 ldi r24, 0x20 ; 32 + 1fe0: 91 e2 ldi r25, 0x21 ; 33 + 1fe2: 63 e9 ldi r22, 0x93 ; 147 + 1fe4: 74 e0 ldi r23, 0x04 ; 4 + 1fe6: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1fea: 00 97 sbiw r24, 0x00 ; 0 + 1fec: 09 f4 brne .+2 ; 0x1ff0 + 1fee: f0 c0 rjmp .+480 ; 0x21d0 + 1ff0: 80 e2 ldi r24, 0x20 ; 32 + 1ff2: 91 e2 ldi r25, 0x21 ; 33 + 1ff4: 69 ea ldi r22, 0xA9 ; 169 + 1ff6: 74 e0 ldi r23, 0x04 ; 4 + 1ff8: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 1ffc: 00 97 sbiw r24, 0x00 ; 0 + 1ffe: 09 f4 brne .+2 ; 0x2002 + 2000: b5 c0 rjmp .+362 ; 0x216c + 2002: 80 e2 ldi r24, 0x20 ; 32 + 2004: 91 e2 ldi r25, 0x21 ; 33 + 2006: 6f eb ldi r22, 0xBF ; 191 + 2008: 74 e0 ldi r23, 0x04 ; 4 + 200a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 200e: 00 97 sbiw r24, 0x00 ; 0 + 2010: 09 f4 brne .+2 ; 0x2014 + 2012: fa c0 rjmp .+500 ; 0x2208 + 2014: 80 e2 ldi r24, 0x20 ; 32 + 2016: 91 e2 ldi r25, 0x21 ; 33 + 2018: 65 ed ldi r22, 0xD5 ; 213 + 201a: 74 e0 ldi r23, 0x04 ; 4 + 201c: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 2020: 00 97 sbiw r24, 0x00 ; 0 + 2022: 09 f4 brne .+2 ; 0x2026 + 2024: ef c0 rjmp .+478 ; 0x2204 + 2026: 80 e2 ldi r24, 0x20 ; 32 + 2028: 91 e2 ldi r25, 0x21 ; 33 + 202a: 6b ee ldi r22, 0xEB ; 235 + 202c: 74 e0 ldi r23, 0x04 ; 4 + 202e: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 2032: 00 97 sbiw r24, 0x00 ; 0 + 2034: 09 f4 brne .+2 ; 0x2038 + 2036: e4 c0 rjmp .+456 ; 0x2200 + 2038: 80 e2 ldi r24, 0x20 ; 32 + 203a: 91 e2 ldi r25, 0x21 ; 33 + 203c: 61 e0 ldi r22, 0x01 ; 1 + 203e: 75 e0 ldi r23, 0x05 ; 5 + 2040: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 2044: 00 97 sbiw r24, 0x00 ; 0 + 2046: 09 f4 brne .+2 ; 0x204a + 2048: d9 c0 rjmp .+434 ; 0x21fc + 204a: 80 e2 ldi r24, 0x20 ; 32 + 204c: 91 e2 ldi r25, 0x21 ; 33 + 204e: 67 e1 ldi r22, 0x17 ; 23 + 2050: 75 e0 ldi r23, 0x05 ; 5 + 2052: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 2056: 00 97 sbiw r24, 0x00 ; 0 + 2058: 09 f4 brne .+2 ; 0x205c + 205a: ce c0 rjmp .+412 ; 0x21f8 + 205c: 80 e2 ldi r24, 0x20 ; 32 + 205e: 91 e2 ldi r25, 0x21 ; 33 + 2060: 6d e2 ldi r22, 0x2D ; 45 + 2062: 75 e0 ldi r23, 0x05 ; 5 + 2064: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 2068: 00 97 sbiw r24, 0x00 ; 0 + 206a: 09 f4 brne .+2 ; 0x206e + 206c: c3 c0 rjmp .+390 ; 0x21f4 + 206e: 80 e2 ldi r24, 0x20 ; 32 + 2070: 91 e2 ldi r25, 0x21 ; 33 + 2072: 63 e4 ldi r22, 0x43 ; 67 + 2074: 75 e0 ldi r23, 0x05 ; 5 + 2076: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 207a: 00 97 sbiw r24, 0x00 ; 0 + 207c: 09 f4 brne .+2 ; 0x2080 + 207e: b8 c0 rjmp .+368 ; 0x21f0 + 2080: 80 e2 ldi r24, 0x20 ; 32 + 2082: 91 e2 ldi r25, 0x21 ; 33 + 2084: 69 e5 ldi r22, 0x59 ; 89 + 2086: 75 e0 ldi r23, 0x05 ; 5 + 2088: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 208c: 00 97 sbiw r24, 0x00 ; 0 + 208e: 09 f4 brne .+2 ; 0x2092 + 2090: ad c0 rjmp .+346 ; 0x21ec + 2092: 80 e2 ldi r24, 0x20 ; 32 + 2094: 91 e2 ldi r25, 0x21 ; 33 + 2096: 6f e6 ldi r22, 0x6F ; 111 + 2098: 75 e0 ldi r23, 0x05 ; 5 + 209a: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 209e: 00 97 sbiw r24, 0x00 ; 0 + 20a0: 09 f4 brne .+2 ; 0x20a4 + 20a2: 9e c0 rjmp .+316 ; 0x21e0 + 20a4: 80 e2 ldi r24, 0x20 ; 32 + 20a6: 91 e2 ldi r25, 0x21 ; 33 + 20a8: 65 e8 ldi r22, 0x85 ; 133 + 20aa: 75 e0 ldi r23, 0x05 ; 5 + 20ac: 0e 94 fb 25 call 0x4bf6 ; 0x4bf6 + 20b0: 00 97 sbiw r24, 0x00 ; 0 + 20b2: 09 f4 brne .+2 ; 0x20b6 + 20b4: 93 c0 rjmp .+294 ; 0x21dc static void DecodeCommand(void) { uint8_t i; bool CommandFound = false; CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; - 2096: 88 ec ldi r24, 0xC8 ; 200 + 20b6: 88 ec ldi r24, 0xC8 ; 200 } static void DecodeCommand(void) { uint8_t i; bool CommandFound = false; - 2098: c0 e0 ldi r28, 0x00 ; 0 + 20b8: 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) - 209a: e1 e8 ldi r30, 0x81 ; 129 - 209c: f5 e0 ldi r31, 0x05 ; 5 - 209e: 94 91 lpm r25, Z - 20a0: 89 17 cp r24, r25 - 20a2: 09 f4 brne .+2 ; 0x20a6 - 20a4: 50 c0 rjmp .+160 ; 0x2146 - 20a6: b1 96 adiw r30, 0x21 ; 33 - 20a8: e4 91 lpm r30, Z - 20aa: 8e 17 cp r24, r30 - 20ac: 09 f4 brne .+2 ; 0x20b0 - 20ae: 48 c0 rjmp .+144 ; 0x2140 - 20b0: e3 ec ldi r30, 0xC3 ; 195 - 20b2: f5 e0 ldi r31, 0x05 ; 5 - 20b4: e4 91 lpm r30, Z - 20b6: 8e 17 cp r24, r30 - 20b8: 09 f4 brne .+2 ; 0x20bc - 20ba: 3f c0 rjmp .+126 ; 0x213a - 20bc: e4 ee ldi r30, 0xE4 ; 228 - 20be: f5 e0 ldi r31, 0x05 ; 5 - 20c0: e4 91 lpm r30, Z - 20c2: 8e 17 cp r24, r30 - 20c4: 09 f4 brne .+2 ; 0x20c8 - 20c6: 36 c0 rjmp .+108 ; 0x2134 - 20c8: e5 e0 ldi r30, 0x05 ; 5 - 20ca: f6 e0 ldi r31, 0x06 ; 6 - 20cc: e4 91 lpm r30, Z - 20ce: 8e 17 cp r24, r30 - 20d0: 71 f1 breq .+92 ; 0x212e - 20d2: e6 e2 ldi r30, 0x26 ; 38 - 20d4: f6 e0 ldi r31, 0x06 ; 6 - 20d6: e4 91 lpm r30, Z - 20d8: 8e 17 cp r24, r30 - 20da: c9 f0 breq .+50 ; 0x210e + 20ba: e1 ea ldi r30, 0xA1 ; 161 + 20bc: f5 e0 ldi r31, 0x05 ; 5 + 20be: 94 91 lpm r25, Z + 20c0: 89 17 cp r24, r25 + 20c2: 09 f4 brne .+2 ; 0x20c6 + 20c4: 50 c0 rjmp .+160 ; 0x2166 + 20c6: b1 96 adiw r30, 0x21 ; 33 + 20c8: e4 91 lpm r30, Z + 20ca: 8e 17 cp r24, r30 + 20cc: 09 f4 brne .+2 ; 0x20d0 + 20ce: 48 c0 rjmp .+144 ; 0x2160 + 20d0: e3 ee ldi r30, 0xE3 ; 227 + 20d2: f5 e0 ldi r31, 0x05 ; 5 + 20d4: e4 91 lpm r30, Z + 20d6: 8e 17 cp r24, r30 + 20d8: 09 f4 brne .+2 ; 0x20dc + 20da: 3f c0 rjmp .+126 ; 0x215a + 20dc: e4 e0 ldi r30, 0x04 ; 4 + 20de: f6 e0 ldi r31, 0x06 ; 6 + 20e0: e4 91 lpm r30, Z + 20e2: 8e 17 cp r24, r30 + 20e4: 09 f4 brne .+2 ; 0x20e8 + 20e6: 36 c0 rjmp .+108 ; 0x2154 + 20e8: e5 e2 ldi r30, 0x25 ; 37 + 20ea: f6 e0 ldi r31, 0x06 ; 6 + 20ec: e4 91 lpm r30, Z + 20ee: 8e 17 cp r24, r30 + 20f0: 71 f1 breq .+92 ; 0x214e + 20f2: e6 e4 ldi r30, 0x46 ; 70 + 20f4: f6 e0 ldi r31, 0x06 ; 6 + 20f6: e4 91 lpm r30, Z + 20f8: 8e 17 cp r24, r30 + 20fa: c9 f0 breq .+50 ; 0x212e return StatusTable[i].Message; } return (void*) 0; - 20dc: 80 e0 ldi r24, 0x00 ; 0 - 20de: 90 e0 ldi r25, 0x00 ; 0 + 20fc: 80 e0 ldi r24, 0x00 ; 0 + 20fe: 90 e0 ldi r25, 0x00 ; 0 } } } /* Send command status message */ TerminalSendStringP(GetStatusMessageP(StatusId)); - 20e0: 71 da rcall .-2846 ; 0x15c4 - 20e2: 8b e7 ldi r24, 0x7B ; 123 + 2100: 71 da rcall .-2846 ; 0x15e4 + 2102: 8b e9 ldi r24, 0x9B ; 155 TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); - 20e4: 95 e0 ldi r25, 0x05 ; 5 - 20e6: 6e da rcall .-2852 ; 0x15c4 - 20e8: cc 23 and r28, r28 - 20ea: 09 f4 brne .+2 ; 0x20ee + 2104: 95 e0 ldi r25, 0x05 ; 5 + 2106: 6e da rcall .-2852 ; 0x15e4 + 2108: cc 23 and r28, r28 + 210a: 09 f4 brne .+2 ; 0x210e if (CommandFound && (pTerminalBuffer[0] != '\0') ) { - 20ec: f8 ce rjmp .-528 ; 0x1ede - 20ee: 80 91 20 21 lds r24, 0x2120 - 20f2: 88 23 and r24, r24 - 20f4: 09 f4 brne .+2 ; 0x20f8 - 20f6: f3 ce rjmp .-538 ; 0x1ede - 20f8: 80 e2 ldi r24, 0x20 ; 32 - 20fa: 91 e2 ldi r25, 0x21 ; 33 + 210c: f8 ce rjmp .-528 ; 0x1efe + 210e: 80 91 20 21 lds r24, 0x2120 + 2112: 88 23 and r24, r24 + 2114: 09 f4 brne .+2 ; 0x2118 + 2116: f3 ce rjmp .-538 ; 0x1efe + 2118: 80 e2 ldi r24, 0x20 ; 32 + 211a: 91 e2 ldi r25, 0x21 ; 33 /* Send optional answer */ TerminalSendString(pTerminalBuffer); - 20fc: 5e da rcall .-2884 ; 0x15ba - 20fe: 8e e7 ldi r24, 0x7E ; 126 - 2100: 95 e0 ldi r25, 0x05 ; 5 - 2102: 60 da rcall .-2880 ; 0x15c4 + 211c: 5e da rcall .-2884 ; 0x15da + 211e: 8e e9 ldi r24, 0x9E ; 158 + 2120: 95 e0 ldi r25, 0x05 ; 5 + 2122: 60 da rcall .-2880 ; 0x15e4 TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); - 2104: ec ce rjmp .-552 ; 0x1ede - 2106: 1d e3 ldi r17, 0x3D ; 61 - 2108: 35 cf rjmp .-406 ; 0x1f74 - 210a: 1f e3 ldi r17, 0x3F ; 63 - 210c: 33 cf rjmp .-410 ; 0x1f74 + 2124: ec ce rjmp .-552 ; 0x1efe + 2126: 1d e3 ldi r17, 0x3D ; 61 + 2128: 35 cf rjmp .-406 ; 0x1f94 + 212a: 1f e3 ldi r17, 0x3F ; 63 + 212c: 33 cf rjmp .-410 ; 0x1f94 if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { char* pCommandDelimiter = pTerminalBuffer; char CommandDelimiter = '\0'; /* Search for command delimiter, store it and replace with '\0' */ while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) - 210e: 25 e0 ldi r18, 0x05 ; 5 - 2110: 30 e0 ldi r19, 0x00 ; 0 - 2112: c9 01 movw r24, r18 - 2114: 88 0f add r24, r24 -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) - 2116: 99 1f adc r25, r25 - 2118: 82 95 swap r24 - return StatusTable[i].Message; - 211a: 92 95 swap r25 - 211c: 90 7f andi r25, 0xF0 ; 240 - 211e: 98 27 eor r25, r24 - 2120: 80 7f andi r24, 0xF0 ; 240 - 2122: 98 27 eor r25, r24 - 2124: 82 0f add r24, r18 - 2126: 93 1f adc r25, r19 - 2128: 8e 57 subi r24, 0x7E ; 126 - 212a: 9a 4f sbci r25, 0xFA ; 250 - 212c: d9 cf rjmp .-78 ; 0x20e0 - 212e: 24 e0 ldi r18, 0x04 ; 4 + 212e: 25 e0 ldi r18, 0x05 ; 5 2130: 30 e0 ldi r19, 0x00 ; 0 - 2132: ef cf rjmp .-34 ; 0x2112 - 2134: 23 e0 ldi r18, 0x03 ; 3 + 2132: c9 01 movw r24, r18 + 2134: 88 0f add r24, r24 static const char* GetStatusMessageP(CommandStatusIdType StatusId) { uint8_t i; for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { if (pgm_read_byte(&StatusTable[i].Id) == StatusId) - 2136: 30 e0 ldi r19, 0x00 ; 0 - 2138: ec cf rjmp .-40 ; 0x2112 - 213a: 22 e0 ldi r18, 0x02 ; 2 - 213c: 30 e0 ldi r19, 0x00 ; 0 - 213e: e9 cf rjmp .-46 ; 0x2112 - 2140: 21 e0 ldi r18, 0x01 ; 1 - 2142: 30 e0 ldi r19, 0x00 ; 0 - 2144: e6 cf rjmp .-52 ; 0x2112 - 2146: 20 e0 ldi r18, 0x00 ; 0 - 2148: 30 e0 ldi r19, 0x00 ; 0 - 214a: e3 cf rjmp .-58 ; 0x2112 - 214c: 25 e0 ldi r18, 0x05 ; 5 - 214e: 10 92 20 21 sts 0x2120, r1 - 2152: 30 e0 ldi r19, 0x00 ; 0 + 2136: 99 1f adc r25, r25 + 2138: 82 95 swap r24 + return StatusTable[i].Message; + 213a: 92 95 swap r25 + 213c: 90 7f andi r25, 0xF0 ; 240 + 213e: 98 27 eor r25, r24 + 2140: 80 7f andi r24, 0xF0 ; 240 + 2142: 98 27 eor r25, r24 + 2144: 82 0f add r24, r18 + 2146: 93 1f adc r25, r19 + 2148: 8e 55 subi r24, 0x5E ; 94 + 214a: 9a 4f sbci r25, 0xFA ; 250 + 214c: d9 cf rjmp .-78 ; 0x2100 + 214e: 24 e0 ldi r18, 0x04 ; 4 + 2150: 30 e0 ldi r19, 0x00 ; 0 + 2152: ef cf rjmp .-34 ; 0x2132 + 2154: 23 e0 ldi r18, 0x03 ; 3 +static const char* GetStatusMessageP(CommandStatusIdType StatusId) +{ + uint8_t i; + + for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { + if (pgm_read_byte(&StatusTable[i].Id) == StatusId) + 2156: 30 e0 ldi r19, 0x00 ; 0 + 2158: ec cf rjmp .-40 ; 0x2132 + 215a: 22 e0 ldi r18, 0x02 ; 2 + 215c: 30 e0 ldi r19, 0x00 ; 0 + 215e: e9 cf rjmp .-46 ; 0x2132 + 2160: 21 e0 ldi r18, 0x01 ; 1 + 2162: 30 e0 ldi r19, 0x00 ; 0 + 2164: e6 cf rjmp .-52 ; 0x2132 + 2166: 20 e0 ldi r18, 0x00 ; 0 + 2168: 30 e0 ldi r19, 0x00 ; 0 + 216a: e3 cf rjmp .-58 ; 0x2132 + 216c: 25 e0 ldi r18, 0x05 ; 5 + 216e: 10 92 20 21 sts 0x2120, r1 + 2172: 30 e0 ldi r19, 0x00 ; 0 CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 2154: 46 e1 ldi r20, 0x16 ; 22 + 2174: 46 e1 ldi r20, 0x16 ; 22 if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; - 2156: 50 e0 ldi r21, 0x00 ; 0 - 2158: 24 9f mul r18, r20 + 2176: 50 e0 ldi r21, 0x00 ; 0 + 2178: 24 9f mul r18, r20 CommandFound = true; StatusId = CallCommandFunc(&CommandTable[i], CommandDelimiter, pParam); - 215a: c0 01 movw r24, r0 - 215c: 25 9f mul r18, r21 - 215e: 90 0d add r25, r0 - 2160: 34 9f mul r19, r20 - 2162: 90 0d add r25, r0 - 2164: 11 24 eor r1, r1 - 2166: 85 5e subi r24, 0xE5 ; 229 - 2168: 9b 4f sbci r25, 0xFB ; 251 - 216a: 1f 33 cpi r17, 0x3F ; 63 - 216c: f9 f0 breq .+62 ; 0x21ac - 216e: 1d 33 cpi r17, 0x3D ; 61 - 2170: 89 f0 breq .+34 ; 0x2194 + 217a: c0 01 movw r24, r0 + 217c: 25 9f mul r18, r21 + 217e: 90 0d add r25, r0 + 2180: 34 9f mul r19, r20 + 2182: 90 0d add r25, r0 + 2184: 11 24 eor r1, r1 + 2186: 85 5c subi r24, 0xC5 ; 197 + 2188: 9b 4f sbci r25, 0xFB ; 251 + 218a: 1f 33 cpi r17, 0x3F ; 63 + 218c: f9 f0 breq .+62 ; 0x21cc + 218e: 1d 33 cpi r17, 0x3D ; 61 + 2190: 89 f0 breq .+34 ; 0x21b4 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) { - 2172: 11 23 and r17, r17 - 2174: 19 f0 breq .+6 ; 0x217c + 2192: 11 23 and r17, r17 + 2194: 19 f0 breq .+6 ; 0x219c CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); if (GetFunc != NO_FUNCTION) { return GetFunc(pTerminalBuffer); } } else if (CommandDelimiter == CHAR_SET_MODE) { - 2176: 89 ec ldi r24, 0xC9 ; 201 - 2178: c1 e0 ldi r28, 0x01 ; 1 + 2196: 89 ec ldi r24, 0xC9 ; 201 + 2198: c1 e0 ldi r28, 0x01 ; 1 CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); if (SetFunc != NO_FUNCTION) { return SetFunc(pParam); } } else if (CommandDelimiter == CHAR_EXEC_MODE){ - 217a: 8f cf rjmp .-226 ; 0x209a - 217c: 40 96 adiw r24, 0x10 ; 16 + 219a: 8f cf rjmp .-226 ; 0x20ba + 219c: 40 96 adiw r24, 0x10 ; 16 } else { /* This should not happen (TM) */ } /* This delimiter has not been registered with this command */ return COMMAND_ERR_INVALID_USAGE_ID; - 217e: fc 01 movw r30, r24 + 219e: fc 01 movw r30, r24 if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 2180: 85 91 lpm r24, Z+ - 2182: 94 91 lpm r25, Z + 21a0: 85 91 lpm r24, Z+ + 21a2: 94 91 lpm r25, Z 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); - 2184: fc 01 movw r30, r24 - 2186: 00 97 sbiw r24, 0x00 ; 0 - 2188: b1 f3 breq .-20 ; 0x2176 - 218a: 80 e2 ldi r24, 0x20 ; 32 - 218c: 91 e2 ldi r25, 0x21 ; 33 + 21a4: fc 01 movw r30, r24 + 21a6: 00 97 sbiw r24, 0x00 ; 0 + 21a8: b1 f3 breq .-20 ; 0x2196 + 21aa: 80 e2 ldi r24, 0x20 ; 32 + 21ac: 91 e2 ldi r25, 0x21 ; 33 if (ExecFunc != NO_FUNCTION) { - 218e: 09 95 icall - 2190: c1 e0 ldi r28, 0x01 ; 1 + 21ae: 09 95 icall + 21b0: c1 e0 ldi r28, 0x01 ; 1 return ExecFunc(pTerminalBuffer); - 2192: 83 cf rjmp .-250 ; 0x209a - 2194: 42 96 adiw r24, 0x12 ; 18 - 2196: fc 01 movw r30, r24 + 21b2: 83 cf rjmp .-250 ; 0x20ba + 21b4: 42 96 adiw r24, 0x12 ; 18 + 21b6: fc 01 movw r30, r24 if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 2198: 85 91 lpm r24, Z+ - 219a: 94 91 lpm r25, Z + 21b8: 85 91 lpm r24, Z+ + 21ba: 94 91 lpm r25, Z 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); - 219c: fc 01 movw r30, r24 - 219e: 00 97 sbiw r24, 0x00 ; 0 - 21a0: 51 f3 breq .-44 ; 0x2176 - 21a2: ce 01 movw r24, r28 - 21a4: 01 96 adiw r24, 0x01 ; 1 + 21bc: fc 01 movw r30, r24 + 21be: 00 97 sbiw r24, 0x00 ; 0 + 21c0: 51 f3 breq .-44 ; 0x2196 + 21c2: ce 01 movw r24, r28 + 21c4: 01 96 adiw r24, 0x01 ; 1 if (SetFunc != NO_FUNCTION) { - 21a6: 09 95 icall - 21a8: c1 e0 ldi r28, 0x01 ; 1 + 21c6: 09 95 icall + 21c8: c1 e0 ldi r28, 0x01 ; 1 return SetFunc(pParam); - 21aa: 77 cf rjmp .-274 ; 0x209a - 21ac: 44 96 adiw r24, 0x14 ; 20 - 21ae: e7 cf rjmp .-50 ; 0x217e + 21ca: 77 cf rjmp .-274 ; 0x20ba + 21cc: 44 96 adiw r24, 0x14 ; 20 + 21ce: e7 cf rjmp .-50 ; 0x219e if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { /* Command found. Clear buffer, and call appropriate function */ char* pParam = ++pCommandDelimiter; pTerminalBuffer[0] = '\0'; CommandFound = true; - 21b0: 24 e0 ldi r18, 0x04 ; 4 - 21b2: cd cf rjmp .-102 ; 0x214e + 21d0: 24 e0 ldi r18, 0x04 ; 4 + 21d2: cd cf rjmp .-102 ; 0x216e 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); - 21b4: 23 e0 ldi r18, 0x03 ; 3 - 21b6: cb cf rjmp .-106 ; 0x214e + 21d4: 23 e0 ldi r18, 0x03 ; 3 + 21d6: cb cf rjmp .-106 ; 0x216e CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 21b8: 22 e0 ldi r18, 0x02 ; 2 - 21ba: c9 cf rjmp .-110 ; 0x214e - 21bc: 2f e0 ldi r18, 0x0F ; 15 - 21be: c7 cf rjmp .-114 ; 0x214e - 21c0: 2e e0 ldi r18, 0x0E ; 14 - 21c2: c5 cf rjmp .-118 ; 0x214e + 21d8: 22 e0 ldi r18, 0x02 ; 2 + 21da: c9 cf rjmp .-110 ; 0x216e + 21dc: 2f e0 ldi r18, 0x0F ; 15 + 21de: c7 cf rjmp .-114 ; 0x216e + 21e0: 2e e0 ldi r18, 0x0E ; 14 + 21e2: c5 cf rjmp .-118 ; 0x216e if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { - 21c4: 21 e0 ldi r18, 0x01 ; 1 - 21c6: c3 cf rjmp .-122 ; 0x214e + 21e4: 21 e0 ldi r18, 0x01 ; 1 + 21e6: c3 cf rjmp .-122 ; 0x216e CommandDelimiter = *pCommandDelimiter; *pCommandDelimiter = '\0'; /* Search in command table */ for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { - 21c8: 20 e0 ldi r18, 0x00 ; 0 - 21ca: c1 cf rjmp .-126 ; 0x214e - 21cc: 2d e0 ldi r18, 0x0D ; 13 - 21ce: bf cf rjmp .-130 ; 0x214e - 21d0: 2c e0 ldi r18, 0x0C ; 12 - 21d2: bd cf rjmp .-134 ; 0x214e - 21d4: 2b e0 ldi r18, 0x0B ; 11 - 21d6: bb cf rjmp .-138 ; 0x214e - 21d8: 2a e0 ldi r18, 0x0A ; 10 - 21da: b9 cf rjmp .-142 ; 0x214e - 21dc: 29 e0 ldi r18, 0x09 ; 9 - 21de: b7 cf rjmp .-146 ; 0x214e - 21e0: 28 e0 ldi r18, 0x08 ; 8 - 21e2: b5 cf rjmp .-150 ; 0x214e - 21e4: 27 e0 ldi r18, 0x07 ; 7 - 21e6: b3 cf rjmp .-154 ; 0x214e - 21e8: 26 e0 ldi r18, 0x06 ; 6 - 21ea: b1 cf rjmp .-158 ; 0x214e + 21e8: 20 e0 ldi r18, 0x00 ; 0 + 21ea: c1 cf rjmp .-126 ; 0x216e + 21ec: 2d e0 ldi r18, 0x0D ; 13 + 21ee: bf cf rjmp .-130 ; 0x216e + 21f0: 2c e0 ldi r18, 0x0C ; 12 + 21f2: bd cf rjmp .-134 ; 0x216e + 21f4: 2b e0 ldi r18, 0x0B ; 11 + 21f6: bb cf rjmp .-138 ; 0x216e + 21f8: 2a e0 ldi r18, 0x0A ; 10 + 21fa: b9 cf rjmp .-142 ; 0x216e + 21fc: 29 e0 ldi r18, 0x09 ; 9 + 21fe: b7 cf rjmp .-146 ; 0x216e + 2200: 28 e0 ldi r18, 0x08 ; 8 + 2202: b5 cf rjmp .-150 ; 0x216e + 2204: 27 e0 ldi r18, 0x07 ; 7 + 2206: b3 cf rjmp .-154 ; 0x216e + 2208: 26 e0 ldi r18, 0x06 ; 6 + 220a: b1 cf rjmp .-158 ; 0x216e -000021ec : - 21ec: 08 95 ret +0000220c : + 220c: 08 95 ret -000021ee : +0000220e : INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); } INLINE void CodecSetDemodPower(bool bOnOff) { CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 21ee: a0 e2 ldi r26, 0x20 ; 32 - 21f0: b6 e0 ldi r27, 0x06 ; 6 - 21f2: 82 e0 ldi r24, 0x02 ; 2 - 21f4: 11 96 adiw r26, 0x01 ; 1 - 21f6: 8c 93 st X, r24 - 21f8: 11 97 sbiw r26, 0x01 ; 1 + 220e: a0 e2 ldi r26, 0x20 ; 32 + 2210: b6 e0 ldi r27, 0x06 ; 6 + 2212: 82 e0 ldi r24, 0x02 ; 2 + 2214: 11 96 adiw r26, 0x01 ; 1 + 2216: 8c 93 st X, r24 + 2218: 11 97 sbiw r26, 0x01 ; 1 if (bOnOff) { CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; - 21fa: 15 96 adiw r26, 0x05 ; 5 - 21fc: 8c 93 st X, r24 - 21fe: 15 97 sbiw r26, 0x05 ; 5 + 221a: 15 96 adiw r26, 0x05 ; 5 + 221c: 8c 93 st X, r24 + 221e: 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; - 2200: e0 e4 ldi r30, 0x40 ; 64 - 2202: f8 e0 ldi r31, 0x08 ; 8 - 2204: 10 a2 lds r17, 0x90 - 2206: 11 a2 lds r17, 0x91 + 2220: e0 e4 ldi r30, 0x40 ; 64 + 2222: f8 e0 ldi r31, 0x08 ; 8 + 2224: 10 a2 lds r17, 0x90 + 2226: 11 a2 lds r17, 0x91 CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; - 2208: 8d e2 ldi r24, 0x2D ; 45 - 220a: 91 e0 ldi r25, 0x01 ; 1 - 220c: 86 a3 lds r24, 0x56 - 220e: 97 a3 lds r25, 0x57 + 2228: 8d e2 ldi r24, 0x2D ; 45 + 222a: 91 e0 ldi r25, 0x01 ; 1 + 222c: 86 a3 lds r24, 0x56 + 222e: 97 a3 lds r25, 0x57 CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ - 2210: 8f ef ldi r24, 0xFF ; 255 - 2212: 9f ef ldi r25, 0xFF ; 255 - 2214: 80 a7 lds r24, 0x70 - 2216: 91 a7 lds r25, 0x71 + 2230: 8f ef ldi r24, 0xFF ; 255 + 2232: 9f ef ldi r25, 0xFF ; 255 + 2234: 80 a7 lds r24, 0x70 + 2236: 91 a7 lds r25, 0x71 CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; - 2218: 81 e0 ldi r24, 0x01 ; 1 - 221a: 80 83 st Z, r24 + 2238: 81 e0 ldi r24, 0x01 ; 1 + 223a: 80 83 st Z, r24 CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - 221c: 98 e8 ldi r25, 0x88 ; 136 - 221e: 93 83 std Z+3, r25 ; 0x03 + 223c: 98 e8 ldi r25, 0x88 ; 136 + 223e: 93 83 std Z+3, r25 ; 0x03 CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; - 2220: 93 e0 ldi r25, 0x03 ; 3 - 2222: 97 83 std Z+7, r25 ; 0x07 + 2240: 93 e0 ldi r25, 0x03 ; 3 + 2242: 97 83 std Z+7, r25 ; 0x07 /* Start looking out for modulation pause via interrupt. */ CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; - 2224: 1a 96 adiw r26, 0x0a ; 10 - 2226: 8c 93 st X, r24 - 2228: 1a 97 sbiw r26, 0x0a ; 10 + 2244: 1a 96 adiw r26, 0x0a ; 10 + 2246: 8c 93 st X, r24 + 2248: 1a 97 sbiw r26, 0x0a ; 10 } - 222a: 08 95 ret + 224a: 08 95 ret -0000222c <__vector_34>: +0000224c <__vector_34>: ISR(CODEC_DEMOD_IN_INT0_VECT) { - 222c: 1f 92 push r1 - 222e: 0f 92 push r0 - 2230: 0f b6 in r0, 0x3f ; 63 - 2232: 0f 92 push r0 - 2234: 11 24 eor r1, r1 - 2236: 8f 93 push r24 - 2238: 9f 93 push r25 - 223a: ef 93 push r30 - 223c: ff 93 push r31 + 224c: 1f 92 push r1 + 224e: 0f 92 push r0 + 2250: 0f b6 in r0, 0x3f ; 63 + 2252: 0f 92 push r0 + 2254: 11 24 eor r1, r1 + 2256: 8f 93 push r24 + 2258: 9f 93 push r25 + 225a: ef 93 push r30 + 225c: ff 93 push r31 /* 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; - 223e: 80 e2 ldi r24, 0x20 ; 32 - 2240: 92 e2 ldi r25, 0x22 ; 34 - 2242: 80 93 c1 20 sts 0x20C1, r24 - 2246: 90 93 c2 20 sts 0x20C2, r25 + 225e: 80 e2 ldi r24, 0x20 ; 32 + 2260: 92 e2 ldi r25, 0x22 ; 34 + 2262: 80 93 c1 20 sts 0x20C1, r24 + 2266: 90 93 c2 20 sts 0x20C2, r25 ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 224a: 80 ea ldi r24, 0xA0 ; 160 - 224c: 92 e2 ldi r25, 0x22 ; 34 - 224e: 80 93 c3 20 sts 0x20C3, r24 - 2252: 90 93 c4 20 sts 0x20C4, r25 + 226a: 80 ea ldi r24, 0xA0 ; 160 + 226c: 92 e2 ldi r25, 0x22 ; 34 + 226e: 80 93 c3 20 sts 0x20C3, r24 + 2272: 90 93 c4 20 sts 0x20C4, r25 DataRegister = 0; - 2256: 10 92 ba 20 sts 0x20BA, r1 + 2276: 10 92 ba 20 sts 0x20BA, r1 SampleRegister = 0; - 225a: 10 92 b9 20 sts 0x20B9, r1 + 227a: 10 92 b9 20 sts 0x20B9, r1 SamplePosition = 0; - 225e: 10 92 b5 20 sts 0x20B5, r1 + 227e: 10 92 b5 20 sts 0x20B5, r1 BitCount = 0; - 2262: 10 92 bd 20 sts 0x20BD, r1 - 2266: 10 92 be 20 sts 0x20BE, r1 + 2282: 10 92 bd 20 sts 0x20BD, r1 + 2286: 10 92 be 20 sts 0x20BE, r1 IsParityBit = false; - 226a: 10 92 b8 20 sts 0x20B8, r1 + 228a: 10 92 b8 20 sts 0x20B8, 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; - 226e: e0 e4 ldi r30, 0x40 ; 64 - 2270: f8 e0 ldi r31, 0x08 ; 8 - 2272: 13 82 std Z+3, r1 ; 0x03 + 228e: e0 e4 ldi r30, 0x40 ; 64 + 2290: f8 e0 ldi r31, 0x08 ; 8 + 2292: 13 82 std Z+3, r1 ; 0x03 CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ - 2274: 86 e9 ldi r24, 0x96 ; 150 - 2276: 90 e0 ldi r25, 0x00 ; 0 - 2278: 86 ab sts 0x56, r24 - 227a: 97 ab sts 0x57, r25 + 2294: 86 e9 ldi r24, 0x96 ; 150 + 2296: 90 e0 ldi r25, 0x00 ; 0 + 2298: 86 ab sts 0x56, r24 + 229a: 97 ab sts 0x57, r25 CODEC_TIMER_SAMPLING.CCABUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 10 - 1; /* Compensate for DIGFILT and ISR prolog */ - 227c: 8a e1 ldi r24, 0x1A ; 26 - 227e: 90 e0 ldi r25, 0x00 ; 0 - 2280: 80 af sts 0x70, r24 - 2282: 91 af sts 0x71, r25 + 229c: 8a e1 ldi r24, 0x1A ; 26 + 229e: 90 e0 ldi r25, 0x00 ; 0 + 22a0: 80 af sts 0x70, r24 + 22a2: 91 af sts 0x71, r25 /* 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; - 2284: e0 e4 ldi r30, 0x40 ; 64 - 2286: f9 e0 ldi r31, 0x09 ; 9 - 2288: 10 a2 lds r17, 0x90 - 228a: 11 a2 lds r17, 0x91 + 22a4: e0 e4 ldi r30, 0x40 ; 64 + 22a6: f9 e0 ldi r31, 0x09 ; 9 + 22a8: 10 a2 lds r17, 0x90 + 22aa: 11 a2 lds r17, 0x91 CODEC_TIMER_LOADMOD.PER = 0xFFFF; - 228c: 8f ef ldi r24, 0xFF ; 255 - 228e: 9f ef ldi r25, 0xFF ; 255 - 2290: 86 a3 lds r24, 0x56 - 2292: 97 a3 lds r25, 0x57 + 22ac: 8f ef ldi r24, 0xFF ; 255 + 22ae: 9f ef ldi r25, 0xFF ; 255 + 22b0: 86 a3 lds r24, 0x56 + 22b2: 97 a3 lds r25, 0x57 CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; - 2294: 89 e8 ldi r24, 0x89 ; 137 - 2296: 83 83 std Z+3, r24 ; 0x03 + 22b4: 89 e8 ldi r24, 0x89 ; 137 + 22b6: 83 83 std Z+3, r24 ; 0x03 CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_EVCH6_gc; - 2298: 8e e0 ldi r24, 0x0E ; 14 - 229a: 80 83 st Z, r24 + 22b8: 8e e0 ldi r24, 0x0E ; 14 + 22ba: 80 83 st Z, r24 /* Disable this interrupt */ CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 229c: e0 e2 ldi r30, 0x20 ; 32 - 229e: f6 e0 ldi r31, 0x06 ; 6 - 22a0: 12 86 std Z+10, r1 ; 0x0a + 22bc: e0 e2 ldi r30, 0x20 ; 32 + 22be: f6 e0 ldi r31, 0x06 ; 6 + 22c0: 12 86 std Z+10, r1 ; 0x0a } - 22a2: ff 91 pop r31 - 22a4: ef 91 pop r30 - 22a6: 9f 91 pop r25 - 22a8: 8f 91 pop r24 - 22aa: 0f 90 pop r0 - 22ac: 0f be out 0x3f, r0 ; 63 - 22ae: 0f 90 pop r0 - 22b0: 1f 90 pop r1 - 22b2: 18 95 reti + 22c2: ff 91 pop r31 + 22c4: ef 91 pop r30 + 22c6: 9f 91 pop r25 + 22c8: 8f 91 pop r24 + 22ca: 0f 90 pop r0 + 22cc: 0f be out 0x3f, r0 ; 63 + 22ce: 0f 90 pop r0 + 22d0: 1f 90 pop r1 + 22d2: 18 95 reti -000022b4 <__vector_22>: +000022d4 <__vector_22>: ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { - 22b4: 1f 92 push r1 - 22b6: 0f 92 push r0 - 22b8: 0f b6 in r0, 0x3f ; 63 - 22ba: 0f 92 push r0 - 22bc: 11 24 eor r1, r1 - 22be: 2f 93 push r18 - 22c0: 8f 93 push r24 - 22c2: 9f 93 push r25 - 22c4: ef 93 push r30 - 22c6: ff 93 push r31 + 22d4: 1f 92 push r1 + 22d6: 0f 92 push r0 + 22d8: 0f b6 in r0, 0x3f ; 63 + 22da: 0f 92 push r0 + 22dc: 11 24 eor r1, r1 + 22de: 2f 93 push r18 + 22e0: 8f 93 push r24 + 22e2: 9f 93 push r25 + 22e4: ef 93 push r30 + 22e6: ff 93 push r31 /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; - 22c8: 90 91 28 06 lds r25, 0x0628 + 22e8: 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; - 22cc: 80 91 b9 20 lds r24, 0x20B9 - 22d0: 88 0f add r24, r24 + 22ec: 80 91 b9 20 lds r24, 0x20B9 + 22f0: 88 0f add r24, r24 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; - 22d2: 95 70 andi r25, 0x05 ; 5 + 22f2: 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); - 22d4: 21 e0 ldi r18, 0x01 ; 1 - 22d6: 09 f0 breq .+2 ; 0x22da <__vector_22+0x26> - 22d8: 20 e0 ldi r18, 0x00 ; 0 - 22da: 82 2b or r24, r18 + 22f4: 21 e0 ldi r18, 0x01 ; 1 + 22f6: 09 f0 breq .+2 ; 0x22fa <__vector_22+0x26> + 22f8: 20 e0 ldi r18, 0x00 ; 0 + 22fa: 82 2b or r24, r18 SampleRegister = NewSampleRegister; - 22dc: 80 93 b9 20 sts 0x20B9, r24 + 22fc: 80 93 b9 20 sts 0x20B9, r24 if (SamplePosition) { - 22e0: 90 91 b5 20 lds r25, 0x20B5 - 22e4: 99 23 and r25, r25 - 22e6: a1 f1 breq .+104 ; 0x2350 <__vector_22+0x9c> + 2300: 90 91 b5 20 lds r25, 0x20B5 + 2304: 99 23 and r25, r25 + 2306: a1 f1 breq .+104 ; 0x2370 <__vector_22+0x9c> /* Analyze the sampling register after 2 samples. */ if ((NewSampleRegister & 0x07) == 0x07) { - 22e8: 98 2f mov r25, r24 - 22ea: 97 70 andi r25, 0x07 ; 7 - 22ec: 97 30 cpi r25, 0x07 ; 7 - 22ee: 09 f4 brne .+2 ; 0x22f2 <__vector_22+0x3e> - 22f0: 44 c0 rjmp .+136 ; 0x237a <__vector_22+0xc6> + 2308: 98 2f mov r25, r24 + 230a: 97 70 andi r25, 0x07 ; 7 + 230c: 97 30 cpi r25, 0x07 ; 7 + 230e: 09 f4 brne .+2 ; 0x2312 <__vector_22+0x3e> + 2310: 44 c0 rjmp .+136 ; 0x239a <__vector_22+0xc6> /* 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; - 22f2: 8c 70 andi r24, 0x0C ; 12 + 2312: 8c 70 andi r24, 0x0C ; 12 uint8_t Bit = 0; if (BitSample != (0x0 << 2)) { - 22f4: 69 f1 breq .+90 ; 0x2350 <__vector_22+0x9c> + 2314: 69 f1 breq .+90 ; 0x2370 <__vector_22+0x9c> /* We have a valid bit. decode and process it. */ if (BitSample & (0x1 << 2)) { /* 01 sequence or 11 sequence -> This is a zero bit */ Bit = 0; - 22f6: 91 e0 ldi r25, 0x01 ; 1 - 22f8: 82 fd sbrc r24, 2 - 22fa: 6e c0 rjmp .+220 ; 0x23d8 <__vector_22+0x124> + 2316: 91 e0 ldi r25, 0x01 ; 1 + 2318: 82 fd sbrc r24, 2 + 231a: 6e c0 rjmp .+220 ; 0x23f8 <__vector_22+0x124> } else { /* 10 sequence -> This is a one bit */ Bit = 1; } LastBit = Bit; - 22fc: 90 93 b7 20 sts 0x20B7, r25 + 231c: 90 93 b7 20 sts 0x20B7, r25 if (!IsParityBit) { - 2300: 80 91 b8 20 lds r24, 0x20B8 - 2304: 88 23 and r24, r24 - 2306: 09 f0 breq .+2 ; 0x230a <__vector_22+0x56> - 2308: 6f c0 rjmp .+222 ; 0x23e8 <__vector_22+0x134> + 2320: 80 91 b8 20 lds r24, 0x20B8 + 2324: 88 23 and r24, r24 + 2326: 09 f0 breq .+2 ; 0x232a <__vector_22+0x56> + 2328: 6f c0 rjmp .+222 ; 0x2408 <__vector_22+0x134> /* This is a data bit, so shift it into the data register and * hold a local copy of it. */ uint8_t NewDataRegister = DataRegister >> 1; - 230a: 80 91 ba 20 lds r24, 0x20BA - 230e: 86 95 lsr r24 + 232a: 80 91 ba 20 lds r24, 0x20BA + 232e: 86 95 lsr r24 NewDataRegister |= (Bit ? 0x80 : 0x00); - 2310: 99 23 and r25, r25 - 2312: 09 f4 brne .+2 ; 0x2316 <__vector_22+0x62> - 2314: 71 c0 rjmp .+226 ; 0x23f8 <__vector_22+0x144> - 2316: 20 e8 ldi r18, 0x80 ; 128 - 2318: 28 2b or r18, r24 + 2330: 99 23 and r25, r25 + 2332: 09 f4 brne .+2 ; 0x2336 <__vector_22+0x62> + 2334: 71 c0 rjmp .+226 ; 0x2418 <__vector_22+0x144> + 2336: 20 e8 ldi r18, 0x80 ; 128 + 2338: 28 2b or r18, r24 DataRegister = NewDataRegister; - 231a: 20 93 ba 20 sts 0x20BA, r18 + 233a: 20 93 ba 20 sts 0x20BA, r18 /* Update bitcount */ uint16_t NewBitCount = ++BitCount; - 231e: 80 91 bd 20 lds r24, 0x20BD - 2322: 90 91 be 20 lds r25, 0x20BE - 2326: 01 96 adiw r24, 0x01 ; 1 - 2328: 80 93 bd 20 sts 0x20BD, r24 - 232c: 90 93 be 20 sts 0x20BE, r25 + 233e: 80 91 bd 20 lds r24, 0x20BD + 2342: 90 91 be 20 lds r25, 0x20BE + 2346: 01 96 adiw r24, 0x01 ; 1 + 2348: 80 93 bd 20 sts 0x20BD, r24 + 234c: 90 93 be 20 sts 0x20BE, r25 if ((NewBitCount & 0x07) == 0) { - 2330: 87 70 andi r24, 0x07 ; 7 - 2332: 90 70 andi r25, 0x00 ; 0 - 2334: 00 97 sbiw r24, 0x00 ; 0 - 2336: 61 f4 brne .+24 ; 0x2350 <__vector_22+0x9c> + 2350: 87 70 andi r24, 0x07 ; 7 + 2352: 90 70 andi r25, 0x00 ; 0 + 2354: 00 97 sbiw r24, 0x00 ; 0 + 2356: 61 f4 brne .+24 ; 0x2370 <__vector_22+0x9c> /* We have reached a byte boundary! Store the data register. */ /* TODO: Prevent buffer overflow */ *CodecBufferPtr++ = NewDataRegister; - 2338: e0 91 c1 20 lds r30, 0x20C1 - 233c: f0 91 c2 20 lds r31, 0x20C2 - 2340: 21 93 st Z+, r18 - 2342: e0 93 c1 20 sts 0x20C1, r30 - 2346: f0 93 c2 20 sts 0x20C2, r31 + 2358: e0 91 c1 20 lds r30, 0x20C1 + 235c: f0 91 c2 20 lds r31, 0x20C2 + 2360: 21 93 st Z+, r18 + 2362: e0 93 c1 20 sts 0x20C1, r30 + 2366: f0 93 c2 20 sts 0x20C2, r31 /* Store bit for determining FDT at EOC and enable parity * handling on next bit. */ IsParityBit = true; - 234a: 81 e0 ldi r24, 0x01 ; 1 - 234c: 80 93 b8 20 sts 0x20B8, r24 + 236a: 81 e0 ldi r24, 0x01 ; 1 + 236c: 80 93 b8 20 sts 0x20B8, r24 } } else { /* On odd sample position just sample. */ } SamplePosition = !SamplePosition; - 2350: 90 91 b5 20 lds r25, 0x20B5 - 2354: 81 e0 ldi r24, 0x01 ; 1 - 2356: 91 11 cpse r25, r1 - 2358: 80 e0 ldi r24, 0x00 ; 0 - 235a: 80 93 b5 20 sts 0x20B5, r24 + 2370: 90 91 b5 20 lds r25, 0x20B5 + 2374: 81 e0 ldi r24, 0x01 ; 1 + 2376: 91 11 cpse r25, r1 + 2378: 80 e0 ldi r24, 0x00 ; 0 + 237a: 80 93 b5 20 sts 0x20B5, r24 /* 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; - 235e: 88 e8 ldi r24, 0x88 ; 136 - 2360: e0 e4 ldi r30, 0x40 ; 64 - 2362: f8 e0 ldi r31, 0x08 ; 8 - 2364: 83 83 std Z+3, r24 ; 0x03 + 237e: 88 e8 ldi r24, 0x88 ; 136 + 2380: e0 e4 ldi r30, 0x40 ; 64 + 2382: f8 e0 ldi r31, 0x08 ; 8 + 2384: 83 83 std Z+3, r24 ; 0x03 } - 2366: ff 91 pop r31 - 2368: ef 91 pop r30 - 236a: 9f 91 pop r25 - 236c: 8f 91 pop r24 - 236e: 2f 91 pop r18 - 2370: 0f 90 pop r0 - 2372: 0f be out 0x3f, r0 ; 63 - 2374: 0f 90 pop r0 - 2376: 1f 90 pop r1 - 2378: 18 95 reti + 2386: ff 91 pop r31 + 2388: ef 91 pop r30 + 238a: 9f 91 pop r25 + 238c: 8f 91 pop r24 + 238e: 2f 91 pop r18 + 2390: 0f 90 pop r0 + 2392: 0f be out 0x3f, r0 ; 63 + 2394: 0f 90 pop r0 + 2396: 1f 90 pop r1 + 2398: 18 95 reti 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; - 237a: 10 92 40 08 sts 0x0840, r1 + 239a: 10 92 40 08 sts 0x0840, r1 CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; - 237e: 80 e1 ldi r24, 0x10 ; 16 - 2380: e0 e4 ldi r30, 0x40 ; 64 - 2382: f8 e0 ldi r31, 0x08 ; 8 - 2384: 84 87 std Z+12, r24 ; 0x0c + 239e: 80 e1 ldi r24, 0x10 ; 16 + 23a0: e0 e4 ldi r30, 0x40 ; 64 + 23a2: f8 e0 ldi r31, 0x08 ; 8 + 23a4: 84 87 std Z+12, r24 ; 0x0c /* 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; - 2386: e0 e4 ldi r30, 0x40 ; 64 - 2388: f9 e0 ldi r31, 0x09 ; 9 - 238a: 13 82 std Z+3, r1 ; 0x03 + 23a6: e0 e4 ldi r30, 0x40 ; 64 + 23a8: f9 e0 ldi r31, 0x09 ; 9 + 23aa: 13 82 std Z+3, r1 ; 0x03 if (LastBit) { - 238c: 80 91 b7 20 lds r24, 0x20B7 - 2390: 88 23 and r24, r24 - 2392: 69 f1 breq .+90 ; 0x23ee <__vector_22+0x13a> + 23ac: 80 91 b7 20 lds r24, 0x20B7 + 23b0: 88 23 and r24, r24 + 23b2: 69 f1 breq .+90 ; 0x240e <__vector_22+0x13a> CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; - 2394: 8c eb ldi r24, 0xBC ; 188 - 2396: 94 e0 ldi r25, 0x04 ; 4 - 2398: 86 a3 lds r24, 0x56 - 239a: 97 a3 lds r25, 0x57 + 23b4: 8c eb ldi r24, 0xBC ; 188 + 23b6: 94 e0 ldi r25, 0x04 ; 4 + 23b8: 86 a3 lds r24, 0x56 + 23ba: 97 a3 lds r25, 0x57 } else { CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; } LoadModState = LOADMOD_FDT; - 239c: 10 92 b6 20 sts 0x20B6, r1 + 23bc: 10 92 b6 20 sts 0x20B6, r1 CODEC_TIMER_LOADMOD.INTFLAGS = TC1_OVFIF_bm; - 23a0: e0 e4 ldi r30, 0x40 ; 64 - 23a2: f9 e0 ldi r31, 0x09 ; 9 - 23a4: 81 e0 ldi r24, 0x01 ; 1 - 23a6: 84 87 std Z+12, r24 ; 0x0c + 23c0: e0 e4 ldi r30, 0x40 ; 64 + 23c2: f9 e0 ldi r31, 0x09 ; 9 + 23c4: 81 e0 ldi r24, 0x01 ; 1 + 23c6: 84 87 std Z+12, r24 ; 0x0c CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; - 23a8: 83 e0 ldi r24, 0x03 ; 3 - 23aa: 86 83 std Z+6, r24 ; 0x06 + 23c8: 83 e0 ldi r24, 0x03 ; 3 + 23ca: 86 83 std Z+6, r24 ; 0x06 /* 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; - 23ac: 80 91 bd 20 lds r24, 0x20BD - 23b0: 90 91 be 20 lds r25, 0x20BE - 23b4: 87 70 andi r24, 0x07 ; 7 + 23cc: 80 91 bd 20 lds r24, 0x20BD + 23d0: 90 91 be 20 lds r25, 0x20BE + 23d4: 87 70 andi r24, 0x07 ; 7 if (RemainingBits != 0) { - 23b6: 61 f0 breq .+24 ; 0x23d0 <__vector_22+0x11c> + 23d6: 61 f0 breq .+24 ; 0x23f0 <__vector_22+0x11c> uint8_t NewDataRegister = DataRegister; - 23b8: 90 91 ba 20 lds r25, 0x20BA + 23d8: 90 91 ba 20 lds r25, 0x20BA while (RemainingBits++ < 8) { - 23bc: 8f 5f subi r24, 0xFF ; 255 + 23dc: 8f 5f subi r24, 0xFF ; 255 /* Pad with zeroes to right-align. */ NewDataRegister >>= 1; - 23be: 96 95 lsr r25 + 23de: 96 95 lsr r25 * store it into the buffer. */ uint8_t RemainingBits = BitCount % 8; if (RemainingBits != 0) { uint8_t NewDataRegister = DataRegister; while (RemainingBits++ < 8) { - 23c0: 8f 5f subi r24, 0xFF ; 255 - 23c2: 89 30 cpi r24, 0x09 ; 9 - 23c4: e1 f7 brne .-8 ; 0x23be <__vector_22+0x10a> + 23e0: 8f 5f subi r24, 0xFF ; 255 + 23e2: 89 30 cpi r24, 0x09 ; 9 + 23e4: e1 f7 brne .-8 ; 0x23de <__vector_22+0x10a> /* Pad with zeroes to right-align. */ NewDataRegister >>= 1; } /* TODO: Prevent buffer overflow */ *CodecBufferPtr = NewDataRegister; - 23c6: e0 91 c1 20 lds r30, 0x20C1 - 23ca: f0 91 c2 20 lds r31, 0x20C2 - 23ce: 90 83 st Z, r25 + 23e6: e0 91 c1 20 lds r30, 0x20C1 + 23ea: f0 91 c2 20 lds r31, 0x20C2 + 23ee: 90 83 st Z, r25 } /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; - 23d0: 81 e0 ldi r24, 0x01 ; 1 - 23d2: 80 93 bf 20 sts 0x20BF, r24 - 23d6: bc cf rjmp .-136 ; 0x2350 <__vector_22+0x9c> + 23f0: 81 e0 ldi r24, 0x01 ; 1 + 23f2: 80 93 bf 20 sts 0x20BF, r24 + 23f6: bc cf rjmp .-136 ; 0x2370 <__vector_22+0x9c> if (BitSample != (0x0 << 2)) { /* We have a valid bit. decode and process it. */ if (BitSample & (0x1 << 2)) { /* 01 sequence or 11 sequence -> This is a zero bit */ Bit = 0; - 23d8: 90 e0 ldi r25, 0x00 ; 0 + 23f8: 90 e0 ldi r25, 0x00 ; 0 } else { /* 10 sequence -> This is a one bit */ Bit = 1; } LastBit = Bit; - 23da: 90 93 b7 20 sts 0x20B7, r25 + 23fa: 90 93 b7 20 sts 0x20B7, r25 if (!IsParityBit) { - 23de: 80 91 b8 20 lds r24, 0x20B8 - 23e2: 88 23 and r24, r24 - 23e4: 09 f4 brne .+2 ; 0x23e8 <__vector_22+0x134> - 23e6: 91 cf rjmp .-222 ; 0x230a <__vector_22+0x56> + 23fe: 80 91 b8 20 lds r24, 0x20B8 + 2402: 88 23 and r24, r24 + 2404: 09 f4 brne .+2 ; 0x2408 <__vector_22+0x134> + 2406: 91 cf rjmp .-222 ; 0x232a <__vector_22+0x56> } else { /* This is a parity bit. Store it */ /* TODO: Store parity and prevent overflow */ //*ParityBufferPtr++ = Bit; IsParityBit = false; - 23e8: 10 92 b8 20 sts 0x20B8, r1 - 23ec: b1 cf rjmp .-158 ; 0x2350 <__vector_22+0x9c> + 2408: 10 92 b8 20 sts 0x20B8, r1 + 240c: b1 cf rjmp .-158 ; 0x2370 <__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; - 23ee: 8c e7 ldi r24, 0x7C ; 124 - 23f0: 94 e0 ldi r25, 0x04 ; 4 - 23f2: 86 a3 lds r24, 0x56 - 23f4: 97 a3 lds r25, 0x57 - 23f6: d2 cf rjmp .-92 ; 0x239c <__vector_22+0xe8> + 240e: 8c e7 ldi r24, 0x7C ; 124 + 2410: 94 e0 ldi r25, 0x04 ; 4 + 2412: 86 a3 lds r24, 0x56 + 2414: 97 a3 lds r25, 0x57 + 2416: d2 cf rjmp .-92 ; 0x23bc <__vector_22+0xe8> 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); - 23f8: 20 e0 ldi r18, 0x00 ; 0 - 23fa: 8e cf rjmp .-228 ; 0x2318 <__vector_22+0x64> + 2418: 20 e0 ldi r18, 0x00 ; 0 + 241a: 8e cf rjmp .-228 ; 0x2338 <__vector_22+0x64> -000023fc <__vector_83>: +0000241c <__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) { - 23fc: 1f 92 push r1 - 23fe: 0f 92 push r0 - 2400: 0f b6 in r0, 0x3f ; 63 - 2402: 0f 92 push r0 - 2404: 11 24 eor r1, r1 - 2406: 2f 93 push r18 - 2408: 3f 93 push r19 - 240a: 8f 93 push r24 - 240c: 9f 93 push r25 - 240e: af 93 push r26 - 2410: bf 93 push r27 - 2412: ef 93 push r30 - 2414: ff 93 push r31 + 241c: 1f 92 push r1 + 241e: 0f 92 push r0 + 2420: 0f b6 in r0, 0x3f ; 63 + 2422: 0f 92 push r0 + 2424: 11 24 eor r1, r1 + 2426: 2f 93 push r18 + 2428: 3f 93 push r19 + 242a: 8f 93 push r24 + 242c: 9f 93 push r25 + 242e: af 93 push r26 + 2430: bf 93 push r27 + 2432: ef 93 push r30 + 2434: ff 93 push r31 /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 2416: 80 91 b6 20 lds r24, 0x20B6 - 241a: 85 30 cpi r24, 0x05 ; 5 - 241c: 09 f4 brne .+2 ; 0x2420 <__vector_83+0x24> - 241e: 55 c0 rjmp .+170 ; 0x24ca <__vector_83+0xce> - 2420: 86 30 cpi r24, 0x06 ; 6 - 2422: c0 f0 brcs .+48 ; 0x2454 <__vector_83+0x58> - 2424: 88 30 cpi r24, 0x08 ; 8 - 2426: 09 f4 brne .+2 ; 0x242a <__vector_83+0x2e> - 2428: 86 c0 rjmp .+268 ; 0x2536 <__vector_83+0x13a> - 242a: 89 30 cpi r24, 0x09 ; 9 - 242c: 40 f5 brcc .+80 ; 0x247e <__vector_83+0x82> - 242e: 86 30 cpi r24, 0x06 ; 6 - 2430: 09 f4 brne .+2 ; 0x2434 <__vector_83+0x38> - 2432: c7 c0 rjmp .+398 ; 0x25c2 <__vector_83+0x1c6> - 2434: 87 30 cpi r24, 0x07 ; 7 - 2436: 09 f4 brne .+2 ; 0x243a <__vector_83+0x3e> - 2438: 95 c0 rjmp .+298 ; 0x2564 <__vector_83+0x168> + 2436: 80 91 b6 20 lds r24, 0x20B6 + 243a: 85 30 cpi r24, 0x05 ; 5 + 243c: 09 f4 brne .+2 ; 0x2440 <__vector_83+0x24> + 243e: 55 c0 rjmp .+170 ; 0x24ea <__vector_83+0xce> + 2440: 86 30 cpi r24, 0x06 ; 6 + 2442: c0 f0 brcs .+48 ; 0x2474 <__vector_83+0x58> + 2444: 88 30 cpi r24, 0x08 ; 8 + 2446: 09 f4 brne .+2 ; 0x244a <__vector_83+0x2e> + 2448: 86 c0 rjmp .+268 ; 0x2556 <__vector_83+0x13a> + 244a: 89 30 cpi r24, 0x09 ; 9 + 244c: 40 f5 brcc .+80 ; 0x249e <__vector_83+0x82> + 244e: 86 30 cpi r24, 0x06 ; 6 + 2450: 09 f4 brne .+2 ; 0x2454 <__vector_83+0x38> + 2452: c7 c0 rjmp .+398 ; 0x25e2 <__vector_83+0x1c6> + 2454: 87 30 cpi r24, 0x07 ; 7 + 2456: 09 f4 brne .+2 ; 0x245a <__vector_83+0x3e> + 2458: 95 c0 rjmp .+298 ; 0x2584 <__vector_83+0x168> break; default: break; } } - 243a: ff 91 pop r31 - 243c: ef 91 pop r30 - 243e: bf 91 pop r27 - 2440: af 91 pop r26 - 2442: 9f 91 pop r25 - 2444: 8f 91 pop r24 - 2446: 3f 91 pop r19 - 2448: 2f 91 pop r18 - 244a: 0f 90 pop r0 - 244c: 0f be out 0x3f, r0 ; 63 - 244e: 0f 90 pop r0 - 2450: 1f 90 pop r1 - 2452: 18 95 reti + 245a: ff 91 pop r31 + 245c: ef 91 pop r30 + 245e: bf 91 pop r27 + 2460: af 91 pop r26 + 2462: 9f 91 pop r25 + 2464: 8f 91 pop r24 + 2466: 3f 91 pop r19 + 2468: 2f 91 pop r18 + 246a: 0f 90 pop r0 + 246c: 0f be out 0x3f, r0 ; 63 + 246e: 0f 90 pop r0 + 2470: 1f 90 pop r1 + 2472: 18 95 reti ISR(CODEC_TIMER_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 2454: 82 30 cpi r24, 0x02 ; 2 - 2456: 89 f1 breq .+98 ; 0x24ba <__vector_83+0xbe> - 2458: 83 30 cpi r24, 0x03 ; 3 - 245a: 08 f1 brcs .+66 ; 0x249e <__vector_83+0xa2> - 245c: 83 30 cpi r24, 0x03 ; 3 - 245e: 09 f4 brne .+2 ; 0x2462 <__vector_83+0x66> - 2460: 5b c0 rjmp .+182 ; 0x2518 <__vector_83+0x11c> - 2462: 84 30 cpi r24, 0x04 ; 4 - 2464: 51 f7 brne .-44 ; 0x243a <__vector_83+0x3e> + 2474: 82 30 cpi r24, 0x02 ; 2 + 2476: 89 f1 breq .+98 ; 0x24da <__vector_83+0xbe> + 2478: 83 30 cpi r24, 0x03 ; 3 + 247a: 08 f1 brcs .+66 ; 0x24be <__vector_83+0xa2> + 247c: 83 30 cpi r24, 0x03 ; 3 + 247e: 09 f4 brne .+2 ; 0x2482 <__vector_83+0x66> + 2480: 5b c0 rjmp .+182 ; 0x2538 <__vector_83+0x11c> + 2482: 84 30 cpi r24, 0x04 ; 4 + 2484: 51 f7 brne .-44 ; 0x245a <__vector_83+0x3e> /* Fetch first byte */ DataRegister = *CodecBufferPtr; break; case LOADMOD_DATA0: if (DataRegister & 1) { - 2466: 80 91 ba 20 lds r24, 0x20BA - 246a: 80 fd sbrc r24, 0 - 246c: c7 c0 rjmp .+398 ; 0x25fc <__vector_83+0x200> + 2486: 80 91 ba 20 lds r24, 0x20BA + 248a: 80 fd sbrc r24, 0 + 248c: c7 c0 rjmp .+398 ; 0x261c <__vector_83+0x200> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 246e: 80 e4 ldi r24, 0x40 ; 64 - 2470: e0 e4 ldi r30, 0x40 ; 64 - 2472: f6 e0 ldi r31, 0x06 ; 6 - 2474: 86 83 std Z+6, r24 ; 0x06 + 248e: 80 e4 ldi r24, 0x40 ; 64 + 2490: e0 e4 ldi r30, 0x40 ; 64 + 2492: f6 e0 ldi r31, 0x06 ; 6 + 2494: 86 83 std Z+6, r24 ; 0x06 } LoadModState = LOADMOD_DATA1; - 2476: 85 e0 ldi r24, 0x05 ; 5 - 2478: 80 93 b6 20 sts 0x20B6, r24 + 2496: 85 e0 ldi r24, 0x05 ; 5 + 2498: 80 93 b6 20 sts 0x20B6, r24 break; - 247c: de cf rjmp .-68 ; 0x243a <__vector_83+0x3e> + 249c: de cf rjmp .-68 ; 0x245a <__vector_83+0x3e> ISR(CODEC_TIMER_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 247e: 89 30 cpi r24, 0x09 ; 9 - 2480: 09 f4 brne .+2 ; 0x2484 <__vector_83+0x88> - 2482: 61 c0 rjmp .+194 ; 0x2546 <__vector_83+0x14a> - 2484: 8a 30 cpi r24, 0x0A ; 10 - 2486: c9 f6 brne .-78 ; 0x243a <__vector_83+0x3e> + 249e: 89 30 cpi r24, 0x09 ; 9 + 24a0: 09 f4 brne .+2 ; 0x24a4 <__vector_83+0x88> + 24a2: 61 c0 rjmp .+194 ; 0x2566 <__vector_83+0x14a> + 24a4: 8a 30 cpi r24, 0x0A ; 10 + 24a6: c9 f6 brne .-78 ; 0x245a <__vector_83+0x3e> 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; - 2488: 10 92 40 09 sts 0x0940, r1 + 24a8: 10 92 40 09 sts 0x0940, r1 CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 248c: e0 e4 ldi r30, 0x40 ; 64 - 248e: f9 e0 ldi r31, 0x09 ; 9 - 2490: 16 82 std Z+6, r1 ; 0x06 + 24ac: e0 e4 ldi r30, 0x40 ; 64 + 24ae: f9 e0 ldi r31, 0x09 ; 9 + 24b0: 16 82 std Z+6, r1 ; 0x06 CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; - 2492: 10 92 00 08 sts 0x0800, r1 + 24b2: 10 92 00 08 sts 0x0800, r1 /* Signal application that we have finished loadmod */ Flags.LoadmodFinished = 1; - 2496: 81 e0 ldi r24, 0x01 ; 1 - 2498: 80 93 c0 20 sts 0x20C0, r24 + 24b6: 81 e0 ldi r24, 0x01 ; 1 + 24b8: 80 93 c0 20 sts 0x20C0, r24 break; - 249c: ce cf rjmp .-100 ; 0x243a <__vector_83+0x3e> + 24bc: ce cf rjmp .-100 ; 0x245a <__vector_83+0x3e> ISR(CODEC_TIMER_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ uint8_t Temp8; uint16_t Temp16; switch (LoadModState) { - 249e: 88 23 and r24, r24 - 24a0: 09 f4 brne .+2 ; 0x24a4 <__vector_83+0xa8> - 24a2: 59 c0 rjmp .+178 ; 0x2556 <__vector_83+0x15a> - 24a4: 81 30 cpi r24, 0x01 ; 1 - 24a6: 49 f6 brne .-110 ; 0x243a <__vector_83+0x3e> + 24be: 88 23 and r24, r24 + 24c0: 09 f4 brne .+2 ; 0x24c4 <__vector_83+0xa8> + 24c2: 59 c0 rjmp .+178 ; 0x2576 <__vector_83+0x15a> + 24c4: 81 30 cpi r24, 0x01 ; 1 + 24c6: 49 f6 brne .-110 ; 0x245a <__vector_83+0x3e> 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; - 24a8: 8f e3 ldi r24, 0x3F ; 63 - 24aa: 90 e0 ldi r25, 0x00 ; 0 - 24ac: e0 e4 ldi r30, 0x40 ; 64 - 24ae: f9 e0 ldi r31, 0x09 ; 9 - 24b0: 86 a3 lds r24, 0x56 - 24b2: 97 a3 lds r25, 0x57 + 24c8: 8f e3 ldi r24, 0x3F ; 63 + 24ca: 90 e0 ldi r25, 0x00 ; 0 + 24cc: e0 e4 ldi r30, 0x40 ; 64 + 24ce: f9 e0 ldi r31, 0x09 ; 9 + 24d0: 86 a3 lds r24, 0x56 + 24d2: 97 a3 lds r25, 0x57 CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_EVCH6_gc; - 24b4: 8e e0 ldi r24, 0x0E ; 14 - 24b6: 80 93 00 08 sts 0x0800, r24 + 24d4: 8e e0 ldi r24, 0x0E ; 14 + 24d6: 80 93 00 08 sts 0x0800, r24 /* Fallthrough to first bit */ case LOADMOD_START_BIT0: CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 24ba: 80 e4 ldi r24, 0x40 ; 64 - 24bc: e0 e4 ldi r30, 0x40 ; 64 - 24be: f6 e0 ldi r31, 0x06 ; 6 - 24c0: 85 83 std Z+5, r24 ; 0x05 + 24da: 80 e4 ldi r24, 0x40 ; 64 + 24dc: e0 e4 ldi r30, 0x40 ; 64 + 24de: f6 e0 ldi r31, 0x06 ; 6 + 24e0: 85 83 std Z+5, r24 ; 0x05 LoadModState = LOADMOD_START_BIT1; - 24c2: 83 e0 ldi r24, 0x03 ; 3 - 24c4: 80 93 b6 20 sts 0x20B6, r24 + 24e2: 83 e0 ldi r24, 0x03 ; 3 + 24e4: 80 93 b6 20 sts 0x20B6, r24 break; - 24c8: b8 cf rjmp .-144 ; 0x243a <__vector_83+0x3e> + 24e8: b8 cf rjmp .-144 ; 0x245a <__vector_83+0x3e> LoadModState = LOADMOD_DATA1; break; case LOADMOD_DATA1: Temp8 = DataRegister; - 24ca: 80 91 ba 20 lds r24, 0x20BA + 24ea: 80 91 ba 20 lds r24, 0x20BA if (Temp8 & 1) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 24ce: 90 e4 ldi r25, 0x40 ; 64 - 24d0: e0 e4 ldi r30, 0x40 ; 64 - 24d2: f6 e0 ldi r31, 0x06 ; 6 + 24ee: 90 e4 ldi r25, 0x40 ; 64 + 24f0: e0 e4 ldi r30, 0x40 ; 64 + 24f2: f6 e0 ldi r31, 0x06 ; 6 break; case LOADMOD_DATA1: Temp8 = DataRegister; if (Temp8 & 1) { - 24d4: 80 fd sbrc r24, 0 - 24d6: 90 c0 rjmp .+288 ; 0x25f8 <__vector_83+0x1fc> + 24f4: 80 fd sbrc r24, 0 + 24f6: 90 c0 rjmp .+288 ; 0x2618 <__vector_83+0x1fc> CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 24d8: 95 83 std Z+5, r25 ; 0x05 + 24f8: 95 83 std Z+5, r25 ; 0x05 } DataRegister = Temp8 >> 1; - 24da: 86 95 lsr r24 - 24dc: 80 93 ba 20 sts 0x20BA, r24 + 24fa: 86 95 lsr r24 + 24fc: 80 93 ba 20 sts 0x20BA, r24 Temp16 = BitSent; - 24e0: 80 91 bb 20 lds r24, 0x20BB - 24e4: 90 91 bc 20 lds r25, 0x20BC + 2500: 80 91 bb 20 lds r24, 0x20BB + 2504: 90 91 bc 20 lds r25, 0x20BC BitSent = ++Temp16; - 24e8: 01 96 adiw r24, 0x01 ; 1 - 24ea: 80 93 bb 20 sts 0x20BB, r24 - 24ee: 90 93 bc 20 sts 0x20BC, r25 + 2508: 01 96 adiw r24, 0x01 ; 1 + 250a: 80 93 bb 20 sts 0x20BB, r24 + 250e: 90 93 bc 20 sts 0x20BC, r25 if ((Temp16 & 0x07) == 0) { - 24f2: 9c 01 movw r18, r24 - 24f4: 27 70 andi r18, 0x07 ; 7 - 24f6: 30 70 andi r19, 0x00 ; 0 - 24f8: 21 15 cp r18, r1 - 24fa: 31 05 cpc r19, r1 - 24fc: 09 f4 brne .+2 ; 0x2500 <__vector_83+0x104> - 24fe: 83 c0 rjmp .+262 ; 0x2606 <__vector_83+0x20a> + 2512: 9c 01 movw r18, r24 + 2514: 27 70 andi r18, 0x07 ; 7 + 2516: 30 70 andi r19, 0x00 ; 0 + 2518: 21 15 cp r18, r1 + 251a: 31 05 cpc r19, r1 + 251c: 09 f4 brne .+2 ; 0x2520 <__vector_83+0x104> + 251e: 83 c0 rjmp .+262 ; 0x2626 <__vector_83+0x20a> /* Byte boundary. Load parity bit and output it later. */ LoadModState = LOADMOD_PARITY0; break; } if (Temp16 == BitCount) { - 2500: 20 91 bd 20 lds r18, 0x20BD - 2504: 30 91 be 20 lds r19, 0x20BE - 2508: 82 17 cp r24, r18 - 250a: 93 07 cpc r25, r19 - 250c: 09 f0 breq .+2 ; 0x2510 <__vector_83+0x114> - 250e: 55 c0 rjmp .+170 ; 0x25ba <__vector_83+0x1be> + 2520: 20 91 bd 20 lds r18, 0x20BD + 2524: 30 91 be 20 lds r19, 0x20BE + 2528: 82 17 cp r24, r18 + 252a: 93 07 cpc r25, r19 + 252c: 09 f0 breq .+2 ; 0x2530 <__vector_83+0x114> + 252e: 55 c0 rjmp .+170 ; 0x25da <__vector_83+0x1be> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } if (BitSent == BitCount) { /* No data left */ LoadModState = LOADMOD_STOP_BIT0; - 2510: 88 e0 ldi r24, 0x08 ; 8 - 2512: 80 93 b6 20 sts 0x20B6, r24 - 2516: 91 cf rjmp .-222 ; 0x243a <__vector_83+0x3e> + 2530: 88 e0 ldi r24, 0x08 ; 8 + 2532: 80 93 b6 20 sts 0x20B6, r24 + 2536: 91 cf rjmp .-222 ; 0x245a <__vector_83+0x3e> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; LoadModState = LOADMOD_START_BIT1; break; case LOADMOD_START_BIT1: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2518: 80 e4 ldi r24, 0x40 ; 64 - 251a: e0 e4 ldi r30, 0x40 ; 64 - 251c: f6 e0 ldi r31, 0x06 ; 6 - 251e: 86 83 std Z+6, r24 ; 0x06 + 2538: 80 e4 ldi r24, 0x40 ; 64 + 253a: e0 e4 ldi r30, 0x40 ; 64 + 253c: f6 e0 ldi r31, 0x06 ; 6 + 253e: 86 83 std Z+6, r24 ; 0x06 LoadModState = LOADMOD_DATA0; - 2520: 84 e0 ldi r24, 0x04 ; 4 - 2522: 80 93 b6 20 sts 0x20B6, r24 + 2540: 84 e0 ldi r24, 0x04 ; 4 + 2542: 80 93 b6 20 sts 0x20B6, r24 /* Fetch first byte */ DataRegister = *CodecBufferPtr; - 2526: e0 91 c1 20 lds r30, 0x20C1 - 252a: f0 91 c2 20 lds r31, 0x20C2 - 252e: 80 81 ld r24, Z - 2530: 80 93 ba 20 sts 0x20BA, r24 + 2546: e0 91 c1 20 lds r30, 0x20C1 + 254a: f0 91 c2 20 lds r31, 0x20C2 + 254e: 80 81 ld r24, Z + 2550: 80 93 ba 20 sts 0x20BA, r24 break; - 2534: 82 cf rjmp .-252 ; 0x243a <__vector_83+0x3e> + 2554: 82 cf rjmp .-252 ; 0x245a <__vector_83+0x3e> } break; case LOADMOD_STOP_BIT0: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2536: 80 e4 ldi r24, 0x40 ; 64 - 2538: e0 e4 ldi r30, 0x40 ; 64 - 253a: f6 e0 ldi r31, 0x06 ; 6 - 253c: 86 83 std Z+6, r24 ; 0x06 + 2556: 80 e4 ldi r24, 0x40 ; 64 + 2558: e0 e4 ldi r30, 0x40 ; 64 + 255a: f6 e0 ldi r31, 0x06 ; 6 + 255c: 86 83 std Z+6, r24 ; 0x06 LoadModState = LOADMOD_STOP_BIT1; - 253e: 89 e0 ldi r24, 0x09 ; 9 - 2540: 80 93 b6 20 sts 0x20B6, r24 + 255e: 89 e0 ldi r24, 0x09 ; 9 + 2560: 80 93 b6 20 sts 0x20B6, r24 break; - 2544: 7a cf rjmp .-268 ; 0x243a <__vector_83+0x3e> + 2564: 7a cf rjmp .-268 ; 0x245a <__vector_83+0x3e> case LOADMOD_STOP_BIT1: CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2546: 80 e4 ldi r24, 0x40 ; 64 - 2548: e0 e4 ldi r30, 0x40 ; 64 - 254a: f6 e0 ldi r31, 0x06 ; 6 - 254c: 86 83 std Z+6, r24 ; 0x06 + 2566: 80 e4 ldi r24, 0x40 ; 64 + 2568: e0 e4 ldi r30, 0x40 ; 64 + 256a: f6 e0 ldi r31, 0x06 ; 6 + 256c: 86 83 std Z+6, r24 ; 0x06 LoadModState = LOADMOD_FINISHED; - 254e: 8a e0 ldi r24, 0x0A ; 10 - 2550: 80 93 b6 20 sts 0x20B6, r24 + 256e: 8a e0 ldi r24, 0x0A ; 10 + 2570: 80 93 b6 20 sts 0x20B6, r24 break; - 2554: 72 cf rjmp .-284 ; 0x243a <__vector_83+0x3e> + 2574: 72 cf rjmp .-284 ; 0x245a <__vector_83+0x3e> 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; - 2556: 8f e7 ldi r24, 0x7F ; 127 - 2558: 90 e0 ldi r25, 0x00 ; 0 - 255a: e0 e4 ldi r30, 0x40 ; 64 - 255c: f9 e0 ldi r31, 0x09 ; 9 - 255e: 86 a3 lds r24, 0x56 - 2560: 97 a3 lds r25, 0x57 + 2576: 8f e7 ldi r24, 0x7F ; 127 + 2578: 90 e0 ldi r25, 0x00 ; 0 + 257a: e0 e4 ldi r30, 0x40 ; 64 + 257c: f9 e0 ldi r31, 0x09 ; 9 + 257e: 86 a3 lds r24, 0x56 + 2580: 97 a3 lds r25, 0x57 break; - 2562: 6b cf rjmp .-298 ; 0x243a <__vector_83+0x3e> + 2582: 6b cf rjmp .-298 ; 0x245a <__vector_83+0x3e> LoadModState = LOADMOD_PARITY1; break; case LOADMOD_PARITY1: if (*ParityBufferPtr) { - 2564: e0 91 c3 20 lds r30, 0x20C3 - 2568: f0 91 c4 20 lds r31, 0x20C4 - 256c: 80 81 ld r24, Z - 256e: 88 23 and r24, r24 - 2570: e1 f5 brne .+120 ; 0x25ea <__vector_83+0x1ee> + 2584: e0 91 c3 20 lds r30, 0x20C3 + 2588: f0 91 c4 20 lds r31, 0x20C4 + 258c: 80 81 ld r24, Z + 258e: 88 23 and r24, r24 + 2590: e1 f5 brne .+120 ; 0x260a <__vector_83+0x1ee> CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 2572: 80 e4 ldi r24, 0x40 ; 64 - 2574: a0 e4 ldi r26, 0x40 ; 64 - 2576: b6 e0 ldi r27, 0x06 ; 6 - 2578: 15 96 adiw r26, 0x05 ; 5 - 257a: 8c 93 st X, r24 - 257c: 15 97 sbiw r26, 0x05 ; 5 + 2592: 80 e4 ldi r24, 0x40 ; 64 + 2594: a0 e4 ldi r26, 0x40 ; 64 + 2596: b6 e0 ldi r27, 0x06 ; 6 + 2598: 15 96 adiw r26, 0x05 ; 5 + 259a: 8c 93 st X, r24 + 259c: 15 97 sbiw r26, 0x05 ; 5 } if (BitSent == BitCount) { - 257e: 20 91 bb 20 lds r18, 0x20BB - 2582: 30 91 bc 20 lds r19, 0x20BC - 2586: 80 91 bd 20 lds r24, 0x20BD - 258a: 90 91 be 20 lds r25, 0x20BE - 258e: 28 17 cp r18, r24 - 2590: 39 07 cpc r19, r25 - 2592: 09 f4 brne .+2 ; 0x2596 <__vector_83+0x19a> - 2594: bd cf rjmp .-134 ; 0x2510 <__vector_83+0x114> + 259e: 20 91 bb 20 lds r18, 0x20BB + 25a2: 30 91 bc 20 lds r19, 0x20BC + 25a6: 80 91 bd 20 lds r24, 0x20BD + 25aa: 90 91 be 20 lds r25, 0x20BE + 25ae: 28 17 cp r18, r24 + 25b0: 39 07 cpc r19, r25 + 25b2: 09 f4 brne .+2 ; 0x25b6 <__vector_83+0x19a> + 25b4: bd cf rjmp .-134 ; 0x2530 <__vector_83+0x114> /* No data left */ LoadModState = LOADMOD_STOP_BIT0; } else { /* Fetch next data and continue sending bits. */ ParityBufferPtr++; - 2596: 31 96 adiw r30, 0x01 ; 1 - 2598: e0 93 c3 20 sts 0x20C3, r30 - 259c: f0 93 c4 20 sts 0x20C4, r31 + 25b6: 31 96 adiw r30, 0x01 ; 1 + 25b8: e0 93 c3 20 sts 0x20C3, r30 + 25bc: f0 93 c4 20 sts 0x20C4, r31 DataRegister = *++CodecBufferPtr; - 25a0: e0 91 c1 20 lds r30, 0x20C1 - 25a4: f0 91 c2 20 lds r31, 0x20C2 - 25a8: cf 01 movw r24, r30 - 25aa: 01 96 adiw r24, 0x01 ; 1 - 25ac: 80 93 c1 20 sts 0x20C1, r24 - 25b0: 90 93 c2 20 sts 0x20C2, r25 - 25b4: 81 81 ldd r24, Z+1 ; 0x01 - 25b6: 80 93 ba 20 sts 0x20BA, r24 + 25c0: e0 91 c1 20 lds r30, 0x20C1 + 25c4: f0 91 c2 20 lds r31, 0x20C2 + 25c8: cf 01 movw r24, r30 + 25ca: 01 96 adiw r24, 0x01 ; 1 + 25cc: 80 93 c1 20 sts 0x20C1, r24 + 25d0: 90 93 c2 20 sts 0x20C2, r25 + 25d4: 81 81 ldd r24, Z+1 ; 0x01 + 25d6: 80 93 ba 20 sts 0x20BA, r24 LoadModState = LOADMOD_DATA0; - 25ba: 84 e0 ldi r24, 0x04 ; 4 - 25bc: 80 93 b6 20 sts 0x20B6, r24 - 25c0: 3c cf rjmp .-392 ; 0x243a <__vector_83+0x3e> + 25da: 84 e0 ldi r24, 0x04 ; 4 + 25dc: 80 93 b6 20 sts 0x20B6, r24 + 25e0: 3c cf rjmp .-392 ; 0x245a <__vector_83+0x3e> LoadModState = LOADMOD_DATA0; break; case LOADMOD_PARITY0: if (*ParityBufferPtr) { - 25c2: e0 91 c3 20 lds r30, 0x20C3 - 25c6: f0 91 c4 20 lds r31, 0x20C4 - 25ca: 80 81 ld r24, Z - 25cc: 88 23 and r24, r24 - 25ce: 41 f4 brne .+16 ; 0x25e0 <__vector_83+0x1e4> + 25e2: e0 91 c3 20 lds r30, 0x20C3 + 25e6: f0 91 c4 20 lds r31, 0x20C4 + 25ea: 80 81 ld r24, Z + 25ec: 88 23 and r24, r24 + 25ee: 41 f4 brne .+16 ; 0x2600 <__vector_83+0x1e4> CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; } else { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 25d0: 80 e4 ldi r24, 0x40 ; 64 - 25d2: e0 e4 ldi r30, 0x40 ; 64 - 25d4: f6 e0 ldi r31, 0x06 ; 6 - 25d6: 86 83 std Z+6, r24 ; 0x06 + 25f0: 80 e4 ldi r24, 0x40 ; 64 + 25f2: e0 e4 ldi r30, 0x40 ; 64 + 25f4: f6 e0 ldi r31, 0x06 ; 6 + 25f6: 86 83 std Z+6, r24 ; 0x06 } LoadModState = LOADMOD_PARITY1; - 25d8: 87 e0 ldi r24, 0x07 ; 7 - 25da: 80 93 b6 20 sts 0x20B6, r24 + 25f8: 87 e0 ldi r24, 0x07 ; 7 + 25fa: 80 93 b6 20 sts 0x20B6, r24 break; - 25de: 2d cf rjmp .-422 ; 0x243a <__vector_83+0x3e> + 25fe: 2d cf rjmp .-422 ; 0x245a <__vector_83+0x3e> break; case LOADMOD_PARITY0: if (*ParityBufferPtr) { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 25e0: 80 e4 ldi r24, 0x40 ; 64 - 25e2: e0 e4 ldi r30, 0x40 ; 64 - 25e4: f6 e0 ldi r31, 0x06 ; 6 - 25e6: 85 83 std Z+5, r24 ; 0x05 - 25e8: f7 cf rjmp .-18 ; 0x25d8 <__vector_83+0x1dc> + 2600: 80 e4 ldi r24, 0x40 ; 64 + 2602: e0 e4 ldi r30, 0x40 ; 64 + 2604: f6 e0 ldi r31, 0x06 ; 6 + 2606: 85 83 std Z+5, r24 ; 0x05 + 2608: f7 cf rjmp .-18 ; 0x25f8 <__vector_83+0x1dc> LoadModState = LOADMOD_PARITY1; break; case LOADMOD_PARITY1: if (*ParityBufferPtr) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 25ea: 80 e4 ldi r24, 0x40 ; 64 - 25ec: a0 e4 ldi r26, 0x40 ; 64 - 25ee: b6 e0 ldi r27, 0x06 ; 6 - 25f0: 16 96 adiw r26, 0x06 ; 6 - 25f2: 8c 93 st X, r24 - 25f4: 16 97 sbiw r26, 0x06 ; 6 - 25f6: c3 cf rjmp .-122 ; 0x257e <__vector_83+0x182> + 260a: 80 e4 ldi r24, 0x40 ; 64 + 260c: a0 e4 ldi r26, 0x40 ; 64 + 260e: b6 e0 ldi r27, 0x06 ; 6 + 2610: 16 96 adiw r26, 0x06 ; 6 + 2612: 8c 93 st X, r24 + 2614: 16 97 sbiw r26, 0x06 ; 6 + 2616: c3 cf rjmp .-122 ; 0x259e <__vector_83+0x182> case LOADMOD_DATA1: Temp8 = DataRegister; if (Temp8 & 1) { CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 25f8: 96 83 std Z+6, r25 ; 0x06 - 25fa: 6f cf rjmp .-290 ; 0x24da <__vector_83+0xde> + 2618: 96 83 std Z+6, r25 ; 0x06 + 261a: 6f cf rjmp .-290 ; 0x24fa <__vector_83+0xde> DataRegister = *CodecBufferPtr; break; case LOADMOD_DATA0: if (DataRegister & 1) { CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; - 25fc: 80 e4 ldi r24, 0x40 ; 64 - 25fe: e0 e4 ldi r30, 0x40 ; 64 - 2600: f6 e0 ldi r31, 0x06 ; 6 - 2602: 85 83 std Z+5, r24 ; 0x05 - 2604: 38 cf rjmp .-400 ; 0x2476 <__vector_83+0x7a> + 261c: 80 e4 ldi r24, 0x40 ; 64 + 261e: e0 e4 ldi r30, 0x40 ; 64 + 2620: f6 e0 ldi r31, 0x06 ; 6 + 2622: 85 83 std Z+5, r24 ; 0x05 + 2624: 38 cf rjmp .-400 ; 0x2496 <__vector_83+0x7a> Temp16 = BitSent; BitSent = ++Temp16; if ((Temp16 & 0x07) == 0) { /* Byte boundary. Load parity bit and output it later. */ LoadModState = LOADMOD_PARITY0; - 2606: 86 e0 ldi r24, 0x06 ; 6 - 2608: 80 93 b6 20 sts 0x20B6, r24 + 2626: 86 e0 ldi r24, 0x06 ; 6 + 2628: 80 93 b6 20 sts 0x20B6, r24 break; - 260c: 16 cf rjmp .-468 ; 0x243a <__vector_83+0x3e> + 262c: 16 cf rjmp .-468 ; 0x245a <__vector_83+0x3e> -0000260e : +0000262e : default: break; } } void ISO14443ACodecInit(void) { - 260e: cf 93 push r28 - 2610: df 93 push r29 + 262e: cf 93 push r28 + 2630: 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; - 2612: e0 e4 ldi r30, 0x40 ; 64 - 2614: f6 e0 ldi r31, 0x06 ; 6 - 2616: 84 e0 ldi r24, 0x04 ; 4 - 2618: 82 83 std Z+2, r24 ; 0x02 + 2632: e0 e4 ldi r30, 0x40 ; 64 + 2634: f6 e0 ldi r31, 0x06 ; 6 + 2636: 84 e0 ldi r24, 0x04 ; 4 + 2638: 82 83 std Z+2, r24 ; 0x02 CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc; - 261a: 12 8a std Z+18, r1 ; 0x12 + 263a: 12 8a std Z+18, r1 ; 0x12 EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; - 261c: c0 e8 ldi r28, 0x80 ; 128 - 261e: d1 e0 ldi r29, 0x01 ; 1 - 2620: 82 e6 ldi r24, 0x62 ; 98 - 2622: 8e 83 std Y+6, r24 ; 0x06 + 263c: c0 e8 ldi r28, 0x80 ; 128 + 263e: d1 e0 ldi r29, 0x01 ; 1 + 2640: 82 e6 ldi r24, 0x62 ; 98 + 2642: 8e 83 std Y+6, r24 ; 0x06 /* 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; - 2624: a0 e2 ldi r26, 0x20 ; 32 - 2626: b6 e0 ldi r27, 0x06 ; 6 - 2628: 85 e0 ldi r24, 0x05 ; 5 - 262a: 12 96 adiw r26, 0x02 ; 2 - 262c: 8c 93 st X, r24 - 262e: 12 97 sbiw r26, 0x02 ; 2 + 2644: a0 e2 ldi r26, 0x20 ; 32 + 2646: b6 e0 ldi r27, 0x06 ; 6 + 2648: 85 e0 ldi r24, 0x05 ; 5 + 264a: 12 96 adiw r26, 0x02 ; 2 + 264c: 8c 93 st X, r24 + 264e: 12 97 sbiw r26, 0x02 ; 2 CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; - 2630: 81 e0 ldi r24, 0x01 ; 1 - 2632: 50 96 adiw r26, 0x10 ; 16 - 2634: 8c 93 st X, r24 - 2636: 50 97 sbiw r26, 0x10 ; 16 + 2650: 81 e0 ldi r24, 0x01 ; 1 + 2652: 50 96 adiw r26, 0x10 ; 16 + 2654: 8c 93 st X, r24 + 2656: 50 97 sbiw r26, 0x10 ; 16 CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; - 2638: 82 e0 ldi r24, 0x02 ; 2 - 263a: 52 96 adiw r26, 0x12 ; 18 - 263c: 8c 93 st X, r24 - 263e: 52 97 sbiw r26, 0x12 ; 18 + 2658: 82 e0 ldi r24, 0x02 ; 2 + 265a: 52 96 adiw r26, 0x12 ; 18 + 265c: 8c 93 st X, r24 + 265e: 52 97 sbiw r26, 0x12 ; 18 CODEC_DEMOD_IN_PORT.INT0MASK = 0; - 2640: 1a 96 adiw r26, 0x0a ; 10 - 2642: 1c 92 st X, r1 - 2644: 1a 97 sbiw r26, 0x0a ; 10 + 2660: 1a 96 adiw r26, 0x0a ; 10 + 2662: 1c 92 st X, r1 + 2664: 1a 97 sbiw r26, 0x0a ; 10 CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; - 2646: 83 e0 ldi r24, 0x03 ; 3 - 2648: 19 96 adiw r26, 0x09 ; 9 - 264a: 8c 93 st X, r24 + 2666: 83 e0 ldi r24, 0x03 ; 3 + 2668: 19 96 adiw r26, 0x09 ; 9 + 266a: 8c 93 st X, r24 EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; - 264c: 98 e5 ldi r25, 0x58 ; 88 - 264e: 98 83 st Y, r25 + 266c: 98 e5 ldi r25, 0x58 ; 88 + 266e: 98 83 st Y, r25 EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; - 2650: 9a e5 ldi r25, 0x5A ; 90 - 2652: 99 83 std Y+1, r25 ; 0x01 + 2670: 9a e5 ldi r25, 0x5A ; 90 + 2672: 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; - 2654: 90 e4 ldi r25, 0x40 ; 64 - 2656: 91 83 std Z+1, r25 ; 0x01 + 2674: 90 e4 ldi r25, 0x40 ; 64 + 2676: 91 83 std Z+1, r25 ; 0x01 CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; - 2658: 96 83 std Z+6, r25 ; 0x06 + 2678: 96 83 std Z+6, r25 ; 0x06 CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK; - 265a: 81 83 std Z+1, r24 ; 0x01 + 267a: 81 83 std Z+1, r24 ; 0x01 CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK; - 265c: 86 83 std Z+6, r24 ; 0x06 + 267c: 86 83 std Z+6, r24 ; 0x06 /* Configure subcarrier generation with 50% DC output using OOK */ CODEC_SUBCARRIER_TIMER.PER = ISO14443A_SUBCARRIER_DIVIDER - 1; - 265e: e0 e0 ldi r30, 0x00 ; 0 - 2660: f8 e0 ldi r31, 0x08 ; 8 - 2662: 8f e0 ldi r24, 0x0F ; 15 - 2664: 90 e0 ldi r25, 0x00 ; 0 - 2666: 86 a3 lds r24, 0x56 - 2668: 97 a3 lds r25, 0x57 + 267e: e0 e0 ldi r30, 0x00 ; 0 + 2680: f8 e0 ldi r31, 0x08 ; 8 + 2682: 8f e0 ldi r24, 0x0F ; 15 + 2684: 90 e0 ldi r25, 0x00 ; 0 + 2686: 86 a3 lds r24, 0x56 + 2688: 97 a3 lds r25, 0x57 CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = ISO14443A_SUBCARRIER_DIVIDER/2; - 266a: 88 e0 ldi r24, 0x08 ; 8 - 266c: 90 e0 ldi r25, 0x00 ; 0 - 266e: 82 a7 lds r24, 0x72 - 2670: 93 a7 lds r25, 0x73 + 268a: 88 e0 ldi r24, 0x08 ; 8 + 268c: 90 e0 ldi r25, 0x00 ; 0 + 268e: 82 a7 lds r24, 0x72 + 2690: 93 a7 lds r25, 0x73 CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; - 2672: 83 e2 ldi r24, 0x23 ; 35 - 2674: 81 83 std Z+1, r24 ; 0x01 + 2692: 83 e2 ldi r24, 0x23 ; 35 + 2694: 81 83 std Z+1, r24 ; 0x01 void ISO14443ACodecInit(void) { /* Initialize common peripherals and start listening * for incoming data. */ Initialize(); StartDemod(); - 2676: bb dd rcall .-1162 ; 0x21ee - 2678: df 91 pop r29 + 2696: bb dd rcall .-1162 ; 0x220e + 2698: df 91 pop r29 } - 267a: cf 91 pop r28 - 267c: 08 95 ret + 269a: cf 91 pop r28 + 269c: 08 95 ret -0000267e : - 267e: 80 91 bf 20 lds r24, 0x20BF +0000269e : + 269e: 80 91 bf 20 lds r24, 0x20BF void ISO14443ACodecTask(void) { if (Flags.DemodFinished) { - 2682: 88 23 and r24, r24 - 2684: c9 f0 breq .+50 ; 0x26b8 + 26a2: 88 23 and r24, r24 + 26a4: c9 f0 breq .+50 ; 0x26d8 Flags.DemodFinished = 0; - 2686: 10 92 bf 20 sts 0x20BF, r1 + 26a6: 10 92 bf 20 sts 0x20BF, r1 INLINE void CodecTask(void) { ActiveConfiguration.CodecTaskFunc(); } INLINE void CodecSetDemodPower(bool bOnOff) { CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; - 268a: e0 e2 ldi r30, 0x20 ; 32 - 268c: f6 e0 ldi r31, 0x06 ; 6 - 268e: 82 e0 ldi r24, 0x02 ; 2 - 2690: 81 83 std Z+1, r24 ; 0x01 + 26aa: e0 e2 ldi r30, 0x20 ; 32 + 26ac: f6 e0 ldi r31, 0x06 ; 6 + 26ae: 82 e0 ldi r24, 0x02 ; 2 + 26b0: 81 83 std Z+1, r24 ; 0x01 if (bOnOff) { CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; } else { CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK; - 2692: 86 83 std Z+6, r24 ; 0x06 + 26b2: 86 83 std Z+6, r24 ; 0x06 /* Reception finished. Process the received bytes */ CodecSetDemodPower(false); uint16_t DemodBitCount = BitCount; - 2694: 60 91 bd 20 lds r22, 0x20BD - 2698: 70 91 be 20 lds r23, 0x20BE + 26b4: 60 91 bd 20 lds r22, 0x20BD + 26b8: 70 91 be 20 lds r23, 0x20BE uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; if (DemodBitCount > 0) { - 269c: 61 15 cp r22, r1 - 269e: 71 05 cpc r23, r1 - 26a0: 99 f4 brne .+38 ; 0x26c8 + 26bc: 61 15 cp r22, r1 + 26be: 71 05 cpc r23, r1 + 26c0: 99 f4 brne .+38 ; 0x26e8 INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); } INLINE void ApplicationReset(void) { ActiveConfiguration.ApplicationResetFunc(); - 26a2: e0 91 ff 20 lds r30, 0x20FF - 26a6: f0 91 00 21 lds r31, 0x2100 - 26aa: 09 95 icall + 26c2: e0 91 ff 20 lds r30, 0x20FF + 26c6: f0 91 00 21 lds r31, 0x2100 + 26ca: 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; - 26ac: 10 92 40 09 sts 0x0940, r1 + 26cc: 10 92 40 09 sts 0x0940, r1 CODEC_TIMER_LOADMOD.INTCTRLA = 0; - 26b0: e0 e4 ldi r30, 0x40 ; 64 - 26b2: f9 e0 ldi r31, 0x09 ; 9 - 26b4: 16 82 std Z+6, r1 ; 0x06 + 26d0: e0 e4 ldi r30, 0x40 ; 64 + 26d2: f9 e0 ldi r31, 0x09 ; 9 + 26d4: 16 82 std Z+6, r1 ; 0x06 StartDemod(); - 26b6: 9b dd rcall .-1226 ; 0x21ee - 26b8: 80 91 c0 20 lds r24, 0x20C0 + 26d6: 9b dd rcall .-1226 ; 0x220e + 26d8: 80 91 c0 20 lds r24, 0x20C0 } } if (Flags.LoadmodFinished) { - 26bc: 88 23 and r24, r24 - 26be: 09 f4 brne .+2 ; 0x26c2 - 26c0: 08 95 ret - 26c2: 10 92 c0 20 sts 0x20C0, r1 + 26dc: 88 23 and r24, r24 + 26de: 09 f4 brne .+2 ; 0x26e2 + 26e0: 08 95 ret + 26e2: 10 92 c0 20 sts 0x20C0, r1 Flags.LoadmodFinished = 0; - 26c6: 93 cd rjmp .-1242 ; 0x21ee + 26e6: 93 cd rjmp .-1242 ; 0x220e /* Load modulation has been finished. Stop it and start to listen * for incoming data again. */ StartDemod(); - 26c8: e0 91 03 21 lds r30, 0x2103 - 26cc: f0 91 04 21 lds r31, 0x2104 + 26e8: e0 91 03 21 lds r30, 0x2103 + 26ec: f0 91 04 21 lds r31, 0x2104 INLINE void ApplicationTask(void) { ActiveConfiguration.ApplicationTaskFunc(); } INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); - 26d0: 80 e2 ldi r24, 0x20 ; 32 - 26d2: 92 e2 ldi r25, 0x22 ; 34 - 26d4: 09 95 icall - 26d6: 9c 01 movw r18, r24 - 26d8: 94 fd sbrc r25, 4 - 26da: 28 c0 rjmp .+80 ; 0x272c - 26dc: ac 01 movw r20, r24 + 26f0: 80 e2 ldi r24, 0x20 ; 32 + 26f2: 92 e2 ldi r25, 0x22 ; 34 + 26f4: 09 95 icall + 26f6: 9c 01 movw r18, r24 + 26f8: 94 fd sbrc r25, 4 + 26fa: 28 c0 rjmp .+80 ; 0x274c + 26fc: ac 01 movw r20, r24 if (DemodBitCount > 0) { /* Call application if we received data */ AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { - 26de: 56 95 lsr r21 - 26e0: 47 95 ror r20 + 26fe: 56 95 lsr r21 + 2700: 47 95 ror r20 /* 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++) { - 26e2: 56 95 lsr r21 - 26e4: 47 95 ror r20 - 26e6: 56 95 lsr r21 - 26e8: 47 95 ror r20 - 26ea: 41 15 cp r20, r1 - 26ec: 51 05 cpc r21, r1 - 26ee: f9 f0 breq .+62 ; 0x272e - 26f0: 60 e0 ldi r22, 0x00 ; 0 - 26f2: e0 e0 ldi r30, 0x00 ; 0 - 26f4: f0 e0 ldi r31, 0x00 ; 0 - 26f6: e0 5e subi r30, 0xE0 ; 224 - 26f8: fd 4d sbci r31, 0xDD ; 221 - 26fa: 80 81 ld r24, Z + 2702: 56 95 lsr r21 + 2704: 47 95 ror r20 + 2706: 56 95 lsr r21 + 2708: 47 95 ror r20 + 270a: 41 15 cp r20, r1 + 270c: 51 05 cpc r21, r1 + 270e: f9 f0 breq .+62 ; 0x274e + 2710: 60 e0 ldi r22, 0x00 ; 0 + 2712: e0 e0 ldi r30, 0x00 ; 0 + 2714: f0 e0 ldi r31, 0x00 ; 0 + 2716: e0 5e subi r30, 0xE0 ; 224 + 2718: fd 4d sbci r31, 0xDD ; 221 + 271a: 80 81 ld r24, Z /* For each whole byte, generate a parity bit. */ CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CodecBuffer[i]); - 26fc: 08 2e mov r0, r24 - 26fe: 82 95 swap r24 - 2700: 80 25 eor r24, r0 - 2702: 08 2e mov r0, r24 - 2704: 86 95 lsr r24 - 2706: 86 95 lsr r24 - 2708: 80 25 eor r24, r0 - 270a: e0 58 subi r30, 0x80 ; 128 - 270c: ff 4f sbci r31, 0xFF ; 255 - 270e: 90 e0 ldi r25, 0x00 ; 0 + 271c: 08 2e mov r0, r24 + 271e: 82 95 swap r24 + 2720: 80 25 eor r24, r0 + 2722: 08 2e mov r0, r24 + 2724: 86 95 lsr r24 + 2726: 86 95 lsr r24 + 2728: 80 25 eor r24, r0 + 272a: e0 58 subi r30, 0x80 ; 128 + 272c: ff 4f sbci r31, 0xFF ; 255 + 272e: 90 e0 ldi r25, 0x00 ; 0 AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; } else { /* We have to generate the parity bits ourself */ for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { /* For each whole byte, generate a parity bit. */ CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - 2710: 01 96 adiw r24, 0x01 ; 1 - 2712: 95 95 asr r25 + 2730: 01 96 adiw r24, 0x01 ; 1 + 2732: 95 95 asr r25 ODD_PARITY(CodecBuffer[i]); - 2714: 87 95 ror r24 - 2716: 91 e0 ldi r25, 0x01 ; 1 - 2718: 80 fd sbrc r24, 0 - 271a: 90 e0 ldi r25, 0x00 ; 0 - 271c: 90 83 st Z, r25 - 271e: 6f 5f subi r22, 0xFF ; 255 - 2720: e6 2f mov r30, r22 + 2734: 87 95 ror r24 + 2736: 91 e0 ldi r25, 0x01 ; 1 + 2738: 80 fd sbrc r24, 0 + 273a: 90 e0 ldi r25, 0x00 ; 0 + 273c: 90 83 st Z, r25 + 273e: 6f 5f subi r22, 0xFF ; 255 + 2740: e6 2f mov r30, r22 AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; } else { /* We have to generate the parity bits ourself */ for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { /* For each whole byte, generate a parity bit. */ CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = - 2722: f0 e0 ldi r31, 0x00 ; 0 + 2742: f0 e0 ldi r31, 0x00 ; 0 /* Application has generated it's own parity bits. * Clear this option bit. */ AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; } else { /* We have to generate the parity bits ourself */ for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { - 2724: e4 17 cp r30, r20 - 2726: f5 07 cpc r31, r21 - 2728: 30 f3 brcs .-52 ; 0x26f6 - 272a: 01 c0 rjmp .+2 ; 0x272e - 272c: 3f 7e andi r19, 0xEF ; 239 - 272e: 21 15 cp r18, r1 - 2730: 31 05 cpc r19, r1 + 2744: e4 17 cp r30, r20 + 2746: f5 07 cpc r31, r21 + 2748: 30 f3 brcs .-52 ; 0x2716 + 274a: 01 c0 rjmp .+2 ; 0x274e + 274c: 3f 7e andi r19, 0xEF ; 239 + 274e: 21 15 cp r18, r1 + 2750: 31 05 cpc r19, r1 AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { /* Application has generated it's own parity bits. * Clear this option bit. */ AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; - 2732: 09 f4 brne .+2 ; 0x2736 + 2752: 09 f4 brne .+2 ; 0x2756 } } else { ApplicationReset(); } if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { - 2734: bb cf rjmp .-138 ; 0x26ac - 2736: 20 93 bd 20 sts 0x20BD, r18 - 273a: 30 93 be 20 sts 0x20BE, r19 + 2754: bb cf rjmp .-138 ; 0x26cc + 2756: 20 93 bd 20 sts 0x20BD, r18 + 275a: 30 93 be 20 sts 0x20BE, r19 BitCount = AnswerBitCount; - 273e: 10 92 bb 20 sts 0x20BB, r1 - 2742: 10 92 bc 20 sts 0x20BC, r1 + 275e: 10 92 bb 20 sts 0x20BB, r1 + 2762: 10 92 bc 20 sts 0x20BC, r1 BitSent = 0; - 2746: 80 e2 ldi r24, 0x20 ; 32 - 2748: 92 e2 ldi r25, 0x22 ; 34 - 274a: 80 93 c1 20 sts 0x20C1, r24 + 2766: 80 e2 ldi r24, 0x20 ; 32 + 2768: 92 e2 ldi r25, 0x22 ; 34 + 276a: 80 93 c1 20 sts 0x20C1, r24 CodecBufferPtr = CodecBuffer; - 274e: 90 93 c2 20 sts 0x20C2, r25 - 2752: 80 ea ldi r24, 0xA0 ; 160 - 2754: 92 e2 ldi r25, 0x22 ; 34 - 2756: 80 93 c3 20 sts 0x20C3, r24 + 276e: 90 93 c2 20 sts 0x20C2, r25 + 2772: 80 ea ldi r24, 0xA0 ; 160 + 2774: 92 e2 ldi r25, 0x22 ; 34 + 2776: 80 93 c3 20 sts 0x20C3, r24 ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; - 275a: 90 93 c4 20 sts 0x20C4, r25 - 275e: 81 e0 ldi r24, 0x01 ; 1 - 2760: 80 93 b6 20 sts 0x20B6, r24 + 277a: 90 93 c4 20 sts 0x20C4, r25 + 277e: 81 e0 ldi r24, 0x01 ; 1 + 2780: 80 93 b6 20 sts 0x20B6, r24 LoadModState = LOADMOD_START; - 2764: 80 91 c0 20 lds r24, 0x20C0 - 2768: 88 23 and r24, r24 + 2784: 80 91 c0 20 lds r24, 0x20C0 + 2788: 88 23 and r24, r24 StartDemod(); } } if (Flags.LoadmodFinished) { - 276a: 09 f4 brne .+2 ; 0x276e - 276c: a9 cf rjmp .-174 ; 0x26c0 - 276e: a9 cf rjmp .-174 ; 0x26c2 + 278a: 09 f4 brne .+2 ; 0x278e + 278c: a9 cf rjmp .-174 ; 0x26e0 + 278e: a9 cf rjmp .-174 ; 0x26e2 -00002770 : +00002790 : Block[11] = Block[3]; } void MifareClassicAppInit1K(void) { State = STATE_IDLE; - 2770: 81 e0 ldi r24, 0x01 ; 1 - 2772: 80 93 c5 20 sts 0x20C5, r24 + 2790: 81 e0 ldi r24, 0x01 ; 1 + 2792: 80 93 c5 20 sts 0x20C5, r24 CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; - 2776: 84 e0 ldi r24, 0x04 ; 4 - 2778: 90 e0 ldi r25, 0x00 ; 0 - 277a: 80 93 c6 20 sts 0x20C6, r24 - 277e: 90 93 c7 20 sts 0x20C7, r25 + 2796: 84 e0 ldi r24, 0x04 ; 4 + 2798: 90 e0 ldi r25, 0x00 ; 0 + 279a: 80 93 c6 20 sts 0x20C6, r24 + 279e: 90 93 c7 20 sts 0x20C7, r25 CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; - 2782: 88 e0 ldi r24, 0x08 ; 8 - 2784: 80 93 c8 20 sts 0x20C8, r24 + 27a2: 88 e0 ldi r24, 0x08 ; 8 + 27a4: 80 93 c8 20 sts 0x20C8, r24 } - 2788: 08 95 ret + 27a8: 08 95 ret -0000278a : +000027aa : void MifareClassicAppInit4K(void) { State = STATE_IDLE; - 278a: 81 e0 ldi r24, 0x01 ; 1 - 278c: 80 93 c5 20 sts 0x20C5, r24 + 27aa: 81 e0 ldi r24, 0x01 ; 1 + 27ac: 80 93 c5 20 sts 0x20C5, r24 CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; - 2790: 82 e0 ldi r24, 0x02 ; 2 - 2792: 90 e0 ldi r25, 0x00 ; 0 - 2794: 80 93 c6 20 sts 0x20C6, r24 - 2798: 90 93 c7 20 sts 0x20C7, r25 + 27b0: 82 e0 ldi r24, 0x02 ; 2 + 27b2: 90 e0 ldi r25, 0x00 ; 0 + 27b4: 80 93 c6 20 sts 0x20C6, r24 + 27b8: 90 93 c7 20 sts 0x20C7, r25 CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; - 279c: 88 e1 ldi r24, 0x18 ; 24 - 279e: 80 93 c8 20 sts 0x20C8, r24 + 27bc: 88 e1 ldi r24, 0x18 ; 24 + 27be: 80 93 c8 20 sts 0x20C8, r24 } - 27a2: 08 95 ret + 27c2: 08 95 ret -000027a4 : +000027c4 : void MifareClassicAppReset(void) { State = STATE_IDLE; - 27a4: 81 e0 ldi r24, 0x01 ; 1 - 27a6: 80 93 c5 20 sts 0x20C5, r24 + 27c4: 81 e0 ldi r24, 0x01 ; 1 + 27c6: 80 93 c5 20 sts 0x20C5, r24 } - 27aa: 08 95 ret + 27ca: 08 95 ret -000027ac : +000027cc : void MifareClassicAppTask(void) { } - 27ac: 08 95 ret + 27cc: 08 95 ret -000027ae : +000027ce : uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { - 27ae: 8f 92 push r8 - 27b0: 9f 92 push r9 - 27b2: af 92 push r10 - 27b4: bf 92 push r11 - 27b6: cf 92 push r12 - 27b8: df 92 push r13 - 27ba: ef 92 push r14 - 27bc: ff 92 push r15 - 27be: 0f 93 push r16 - 27c0: 1f 93 push r17 - 27c2: cf 93 push r28 - 27c4: df 93 push r29 - 27c6: cd b7 in r28, 0x3d ; 61 - 27c8: de b7 in r29, 0x3e ; 62 - 27ca: 2e 97 sbiw r28, 0x0e ; 14 - 27cc: cd bf out 0x3d, r28 ; 61 - 27ce: de bf out 0x3e, r29 ; 62 - 27d0: 7c 01 movw r14, r24 + 27ce: 8f 92 push r8 + 27d0: 9f 92 push r9 + 27d2: af 92 push r10 + 27d4: bf 92 push r11 + 27d6: cf 92 push r12 + 27d8: df 92 push r13 + 27da: ef 92 push r14 + 27dc: ff 92 push r15 + 27de: 0f 93 push r16 + 27e0: 1f 93 push r17 + 27e2: cf 93 push r28 + 27e4: df 93 push r29 + 27e6: cd b7 in r28, 0x3d ; 61 + 27e8: de b7 in r29, 0x3e ; 62 + 27ea: 2e 97 sbiw r28, 0x0e ; 14 + 27ec: cd bf out 0x3d, r28 ; 61 + 27ee: de bf out 0x3e, r29 ; 62 + 27f0: 7c 01 movw r14, r24 switch(State) { - 27d2: 80 91 c5 20 lds r24, 0x20C5 - 27d6: 84 30 cpi r24, 0x04 ; 4 - 27d8: 09 f4 brne .+2 ; 0x27dc - 27da: f9 c0 rjmp .+498 ; 0x29ce - 27dc: 85 30 cpi r24, 0x05 ; 5 - 27de: 08 f4 brcc .+2 ; 0x27e2 - 27e0: 3f c0 rjmp .+126 ; 0x2860 - 27e2: 86 30 cpi r24, 0x06 ; 6 - 27e4: 09 f4 brne .+2 ; 0x27e8 - 27e6: c0 c0 rjmp .+384 ; 0x2968 - 27e8: 86 30 cpi r24, 0x06 ; 6 - 27ea: 08 f0 brcs .+2 ; 0x27ee - 27ec: 64 c0 rjmp .+200 ; 0x28b6 + 27f2: 80 91 c5 20 lds r24, 0x20C5 + 27f6: 84 30 cpi r24, 0x04 ; 4 + 27f8: 09 f4 brne .+2 ; 0x27fc + 27fa: f9 c0 rjmp .+498 ; 0x29ee + 27fc: 85 30 cpi r24, 0x05 ; 5 + 27fe: 08 f4 brcc .+2 ; 0x2802 + 2800: 3f c0 rjmp .+126 ; 0x2880 + 2802: 86 30 cpi r24, 0x06 ; 6 + 2804: 09 f4 brne .+2 ; 0x2808 + 2806: c0 c0 rjmp .+384 ; 0x2988 + 2808: 86 30 cpi r24, 0x06 ; 6 + 280a: 08 f0 brcs .+2 ; 0x280e + 280c: 64 c0 rjmp .+200 ; 0x28d6 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(); - 27ee: f7 01 movw r30, r14 - 27f0: 00 81 ld r16, Z - 27f2: 0e 94 08 1c call 0x3810 ; 0x3810 - 27f6: 80 27 eor r24, r16 - 27f8: d7 01 movw r26, r14 - 27fa: 8c 93 st X, r24 - 27fc: 11 96 adiw r26, 0x01 ; 1 - 27fe: 0c 91 ld r16, X - 2800: 0e 94 08 1c call 0x3810 ; 0x3810 - 2804: 80 27 eor r24, r16 - 2806: f7 01 movw r30, r14 - 2808: 81 83 std Z+1, r24 ; 0x01 - 280a: 02 81 ldd r16, Z+2 ; 0x02 - 280c: 0e 94 08 1c call 0x3810 ; 0x3810 - 2810: 80 27 eor r24, r16 - 2812: d7 01 movw r26, r14 - 2814: 12 96 adiw r26, 0x02 ; 2 - 2816: 8c 93 st X, r24 - 2818: 12 97 sbiw r26, 0x02 ; 2 - 281a: 13 96 adiw r26, 0x03 ; 3 - 281c: 0c 91 ld r16, X - 281e: f8 d7 rcall .+4080 ; 0x3810 - 2820: 80 27 eor r24, r16 - 2822: f7 01 movw r30, r14 - 2824: 83 83 std Z+3, r24 ; 0x03 - 2826: 80 81 ld r24, Z + 280e: f7 01 movw r30, r14 + 2810: 00 81 ld r16, Z + 2812: 0e 94 18 1c call 0x3830 ; 0x3830 + 2816: 80 27 eor r24, r16 + 2818: d7 01 movw r26, r14 + 281a: 8c 93 st X, r24 + 281c: 11 96 adiw r26, 0x01 ; 1 + 281e: 0c 91 ld r16, X + 2820: 0e 94 18 1c call 0x3830 ; 0x3830 + 2824: 80 27 eor r24, r16 + 2826: f7 01 movw r30, r14 + 2828: 81 83 std Z+1, r24 ; 0x01 + 282a: 02 81 ldd r16, Z+2 ; 0x02 + 282c: 0e 94 18 1c call 0x3830 ; 0x3830 + 2830: 80 27 eor r24, r16 + 2832: d7 01 movw r26, r14 + 2834: 12 96 adiw r26, 0x02 ; 2 + 2836: 8c 93 st X, r24 + 2838: 12 97 sbiw r26, 0x02 ; 2 + 283a: 13 96 adiw r26, 0x03 ; 3 + 283c: 0c 91 ld r16, X + 283e: f8 d7 rcall .+4080 ; 0x3830 + 2840: 80 27 eor r24, r16 + 2842: f7 01 movw r30, r14 + 2844: 83 83 std Z+3, r24 ; 0x03 + 2846: 80 81 ld r24, Z if (Buffer[0] == CMD_READ) { - 2828: 80 33 cpi r24, 0x30 ; 48 - 282a: 09 f4 brne .+2 ; 0x282e - 282c: bd c2 rjmp .+1402 ; 0x2da8 - 282e: 80 3a cpi r24, 0xA0 ; 160 + 2848: 80 33 cpi r24, 0x30 ; 48 + 284a: 09 f4 brne .+2 ; 0x284e + 284c: bd c2 rjmp .+1402 ; 0x2dc8 + 284e: 80 3a cpi r24, 0xA0 ; 160 * 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) { - 2830: 09 f4 brne .+2 ; 0x2834 - 2832: 39 c3 rjmp .+1650 ; 0x2ea6 - 2834: 80 3c cpi r24, 0xC0 ; 192 + 2850: 09 f4 brne .+2 ; 0x2854 + 2852: 39 c3 rjmp .+1650 ; 0x2ec6 + 2854: 80 3c cpi r24, 0xC0 ; 192 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_DECREMENT) { - 2836: 09 f4 brne .+2 ; 0x283a - 2838: 53 c3 rjmp .+1702 ; 0x2ee0 - 283a: 81 3c cpi r24, 0xC1 ; 193 + 2856: 09 f4 brne .+2 ; 0x285a + 2858: 53 c3 rjmp .+1702 ; 0x2f00 + 285a: 81 3c cpi r24, 0xC1 ; 193 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_INCREMENT) { - 283c: 09 f4 brne .+2 ; 0x2840 - 283e: 35 c4 rjmp .+2154 ; 0x30aa <__stack+0xab> - 2840: 82 3c cpi r24, 0xC2 ; 194 + 285c: 09 f4 brne .+2 ; 0x2860 + 285e: 35 c4 rjmp .+2154 ; 0x30ca <__stack+0xcb> + 2860: 82 3c cpi r24, 0xC2 ; 194 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_RESTORE) { - 2842: 09 f4 brne .+2 ; 0x2846 - 2844: 3f c4 rjmp .+2174 ; 0x30c4 <__stack+0xc5> - 2846: 80 3b cpi r24, 0xB0 ; 176 + 2862: 09 f4 brne .+2 ; 0x2866 + 2864: 3f c4 rjmp .+2174 ; 0x30e4 <__stack+0xe5> + 2866: 80 3b cpi r24, 0xB0 ; 176 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; }else if (Buffer[0] == CMD_TRANSFER) { - 2848: 09 f4 brne .+2 ; 0x284c - 284a: 4b c4 rjmp .+2198 ; 0x30e2 <__stack+0xe3> - 284c: 80 56 subi r24, 0x60 ; 96 + 2868: 09 f4 brne .+2 ; 0x286c + 286a: 4b c4 rjmp .+2198 ; 0x3102 <__stack+0x103> + 286c: 80 56 subi r24, 0x60 ; 96 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { - 284e: 82 30 cpi r24, 0x02 ; 2 - 2850: 08 f4 brcc .+2 ; 0x2854 - 2852: 96 c1 rjmp .+812 ; 0x2b80 - 2854: 81 e0 ldi r24, 0x01 ; 1 + 286e: 82 30 cpi r24, 0x02 ; 2 + 2870: 08 f4 brcc .+2 ; 0x2874 + 2872: 96 c1 rjmp .+812 ; 0x2ba0 + 2874: 81 e0 ldi r24, 0x01 ; 1 Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); return ACK_NAK_FRAME_SIZE; } } else { /* Unknown command. Enter HALT state */ State = STATE_IDLE; - 2856: 80 93 c5 20 sts 0x20C5, r24 - 285a: 80 e0 ldi r24, 0x00 ; 0 + 2876: 80 93 c5 20 sts 0x20C5, r24 + 287a: 80 e0 ldi r24, 0x00 ; 0 /* Unknown state? Should never happen. */ break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; - 285c: 90 e0 ldi r25, 0x00 ; 0 - 285e: 65 c0 rjmp .+202 ; 0x292a + 287c: 90 e0 ldi r25, 0x00 ; 0 + 287e: 65 c0 rjmp .+202 ; 0x294a } else { /* Unknown command. Enter HALT state */ State = STATE_IDLE; } break; - 2860: 82 30 cpi r24, 0x02 ; 2 + 2880: 82 30 cpi r24, 0x02 ; 2 } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { - 2862: 09 f4 brne .+2 ; 0x2866 - 2864: a0 c0 rjmp .+320 ; 0x29a6 - 2866: 83 30 cpi r24, 0x03 ; 3 - 2868: 08 f4 brcc .+2 ; 0x286c - 286a: 6f c0 rjmp .+222 ; 0x294a - 286c: f7 01 movw r30, r14 + 2882: 09 f4 brne .+2 ; 0x2886 + 2884: a0 c0 rjmp .+320 ; 0x29c6 + 2886: 83 30 cpi r24, 0x03 ; 3 + 2888: 08 f4 brcc .+2 ; 0x288c + 288a: 6f c0 rjmp .+222 ; 0x296a + 288c: f7 01 movw r30, r14 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) ){ - 286e: 80 81 ld r24, Z - 2870: 86 32 cpi r24, 0x26 ; 38 - 2872: 09 f4 brne .+2 ; 0x2876 - 2874: 6f c1 rjmp .+734 ; 0x2b54 - 2876: 82 35 cpi r24, 0x52 ; 82 - 2878: 09 f4 brne .+2 ; 0x287c - 287a: 6c c1 rjmp .+728 ; 0x2b54 - 287c: 80 35 cpi r24, 0x50 ; 80 + 288e: 80 81 ld r24, Z + 2890: 86 32 cpi r24, 0x26 ; 38 + 2892: 09 f4 brne .+2 ; 0x2896 + 2894: 6f c1 rjmp .+734 ; 0x2b74 + 2896: 82 35 cpi r24, 0x52 ; 82 + 2898: 09 f4 brne .+2 ; 0x289c + 289a: 6c c1 rjmp .+728 ; 0x2b74 + 289c: 80 35 cpi r24, 0x50 ; 80 case STATE_ACTIVE: if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { State = STATE_READY; return BitCount; } else if (Buffer[0] == CMD_HALT) { - 287e: 09 f4 brne .+2 ; 0x2882 - 2880: 75 c1 rjmp .+746 ; 0x2b6c - 2882: 98 2f mov r25, r24 + 289e: 09 f4 brne .+2 ; 0x28a2 + 28a0: 75 c1 rjmp .+746 ; 0x2b8c + 28a2: 98 2f mov r25, r24 } } else { Buffer[0] = NAK_INVALID_ARG; return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - 2884: 90 56 subi r25, 0x60 ; 96 - 2886: 92 30 cpi r25, 0x02 ; 2 - 2888: 08 f4 brcc .+2 ; 0x288c - 288a: e7 c1 rjmp .+974 ; 0x2c5a - 288c: 80 33 cpi r24, 0x30 ; 48 + 28a4: 90 56 subi r25, 0x60 ; 96 + 28a6: 92 30 cpi r25, 0x02 ; 2 + 28a8: 08 f4 brcc .+2 ; 0x28ac + 28aa: e7 c1 rjmp .+974 ; 0x2c7a + 28ac: 80 33 cpi r24, 0x30 ; 48 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) - 288e: 51 f0 breq .+20 ; 0x28a4 - 2890: 80 3a cpi r24, 0xA0 ; 160 - 2892: 41 f0 breq .+16 ; 0x28a4 - 2894: 80 3c cpi r24, 0xC0 ; 192 - 2896: 31 f0 breq .+12 ; 0x28a4 - 2898: 81 3c cpi r24, 0xC1 ; 193 + 28ae: 51 f0 breq .+20 ; 0x28c4 + 28b0: 80 3a cpi r24, 0xA0 ; 160 + 28b2: 41 f0 breq .+16 ; 0x28c4 + 28b4: 80 3c cpi r24, 0xC0 ; 192 + 28b6: 31 f0 breq .+12 ; 0x28c4 + 28b8: 81 3c cpi r24, 0xC1 ; 193 || (Buffer[0] == CMD_INCREMENT) || (Buffer[0] == CMD_RESTORE) || (Buffer[0] == CMD_TRANSFER) ) { - 289a: 21 f0 breq .+8 ; 0x28a4 - 289c: 82 3c cpi r24, 0xC2 ; 194 - 289e: 11 f0 breq .+4 ; 0x28a4 - 28a0: 80 3b cpi r24, 0xB0 ; 176 - 28a2: c1 f6 brne .-80 ; 0x2854 - 28a4: 81 e0 ldi r24, 0x01 ; 1 + 28ba: 21 f0 breq .+8 ; 0x28c4 + 28bc: 82 3c cpi r24, 0xC2 ; 194 + 28be: 11 f0 breq .+4 ; 0x28c4 + 28c0: 80 3b cpi r24, 0xB0 ; 176 + 28c2: c1 f6 brne .-80 ; 0x2874 + 28c4: 81 e0 ldi r24, 0x01 ; 1 State = STATE_IDLE; - 28a6: 80 93 c5 20 sts 0x20C5, r24 - 28aa: 84 e0 ldi r24, 0x04 ; 4 + 28c6: 80 93 c5 20 sts 0x20C5, r24 + 28ca: 84 e0 ldi r24, 0x04 ; 4 Buffer[0] = NAK_NOT_AUTHED; - 28ac: f7 01 movw r30, r14 - 28ae: 80 83 st Z, r24 - 28b0: 84 e0 ldi r24, 0x04 ; 4 + 28cc: f7 01 movw r30, r14 + 28ce: 80 83 st Z, r24 + 28d0: 84 e0 ldi r24, 0x04 ; 4 return ACK_NAK_FRAME_SIZE; - 28b2: 90 e0 ldi r25, 0x00 ; 0 - 28b4: 3a c0 rjmp .+116 ; 0x292a - 28b6: 8a 30 cpi r24, 0x0A ; 10 + 28d2: 90 e0 ldi r25, 0x00 ; 0 + 28d4: 3a c0 rjmp .+116 ; 0x294a + 28d6: 8a 30 cpi r24, 0x0A ; 10 } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { - 28b8: 08 f0 brcs .+2 ; 0x28bc - 28ba: 53 c0 rjmp .+166 ; 0x2962 - 28bc: f7 01 movw r30, r14 + 28d8: 08 f0 brcs .+2 ; 0x28dc + 28da: 53 c0 rjmp .+166 ; 0x2982 + 28dc: f7 01 movw r30, r14 * 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(); - 28be: 00 81 ld r16, Z - 28c0: a7 d7 rcall .+3918 ; 0x3810 - 28c2: 80 27 eor r24, r16 - 28c4: d7 01 movw r26, r14 - 28c6: 8c 93 st X, r24 - 28c8: 11 96 adiw r26, 0x01 ; 1 - 28ca: 0c 91 ld r16, X - 28cc: a1 d7 rcall .+3906 ; 0x3810 - 28ce: 80 27 eor r24, r16 - 28d0: f7 01 movw r30, r14 - 28d2: 81 83 std Z+1, r24 ; 0x01 - 28d4: 02 81 ldd r16, Z+2 ; 0x02 - 28d6: 9c d7 rcall .+3896 ; 0x3810 - 28d8: 80 27 eor r24, r16 - 28da: d7 01 movw r26, r14 - 28dc: 12 96 adiw r26, 0x02 ; 2 - 28de: 8c 93 st X, r24 - 28e0: 12 97 sbiw r26, 0x02 ; 2 - 28e2: 13 96 adiw r26, 0x03 ; 3 - 28e4: 0c 91 ld r16, X - 28e6: 94 d7 rcall .+3880 ; 0x3810 - 28e8: 80 27 eor r24, r16 - 28ea: f7 01 movw r30, r14 - 28ec: 83 83 std Z+3, r24 ; 0x03 - 28ee: 04 81 ldd r16, Z+4 ; 0x04 - 28f0: 8f d7 rcall .+3870 ; 0x3810 - 28f2: 80 27 eor r24, r16 - 28f4: d7 01 movw r26, r14 - 28f6: 14 96 adiw r26, 0x04 ; 4 - 28f8: 8c 93 st X, r24 - 28fa: 14 97 sbiw r26, 0x04 ; 4 - 28fc: 15 96 adiw r26, 0x05 ; 5 - 28fe: 0c 91 ld r16, X - 2900: 87 d7 rcall .+3854 ; 0x3810 - 2902: 80 27 eor r24, r16 - 2904: f7 01 movw r30, r14 - 2906: 85 83 std Z+5, r24 ; 0x05 - 2908: c7 01 movw r24, r14 - 290a: 64 e0 ldi r22, 0x04 ; 4 - 290c: 70 e0 ldi r23, 0x00 ; 0 - 290e: 92 d4 rcall .+2340 ; 0x3234 - 2910: 88 23 and r24, r24 - 2912: 09 f0 breq .+2 ; 0x2916 - 2914: 0f c2 rjmp .+1054 ; 0x2d34 + 28de: 00 81 ld r16, Z + 28e0: a7 d7 rcall .+3918 ; 0x3830 + 28e2: 80 27 eor r24, r16 + 28e4: d7 01 movw r26, r14 + 28e6: 8c 93 st X, r24 + 28e8: 11 96 adiw r26, 0x01 ; 1 + 28ea: 0c 91 ld r16, X + 28ec: a1 d7 rcall .+3906 ; 0x3830 + 28ee: 80 27 eor r24, r16 + 28f0: f7 01 movw r30, r14 + 28f2: 81 83 std Z+1, r24 ; 0x01 + 28f4: 02 81 ldd r16, Z+2 ; 0x02 + 28f6: 9c d7 rcall .+3896 ; 0x3830 + 28f8: 80 27 eor r24, r16 + 28fa: d7 01 movw r26, r14 + 28fc: 12 96 adiw r26, 0x02 ; 2 + 28fe: 8c 93 st X, r24 + 2900: 12 97 sbiw r26, 0x02 ; 2 + 2902: 13 96 adiw r26, 0x03 ; 3 + 2904: 0c 91 ld r16, X + 2906: 94 d7 rcall .+3880 ; 0x3830 + 2908: 80 27 eor r24, r16 + 290a: f7 01 movw r30, r14 + 290c: 83 83 std Z+3, r24 ; 0x03 + 290e: 04 81 ldd r16, Z+4 ; 0x04 + 2910: 8f d7 rcall .+3870 ; 0x3830 + 2912: 80 27 eor r24, r16 + 2914: d7 01 movw r26, r14 + 2916: 14 96 adiw r26, 0x04 ; 4 + 2918: 8c 93 st X, r24 + 291a: 14 97 sbiw r26, 0x04 ; 4 + 291c: 15 96 adiw r26, 0x05 ; 5 + 291e: 0c 91 ld r16, X + 2920: 87 d7 rcall .+3854 ; 0x3830 + 2922: 80 27 eor r24, r16 + 2924: f7 01 movw r30, r14 + 2926: 85 83 std Z+5, r24 ; 0x05 + 2928: c7 01 movw r24, r14 + 292a: 64 e0 ldi r22, 0x04 ; 4 + 292c: 70 e0 ldi r23, 0x00 ; 0 + 292e: 92 d4 rcall .+2340 ; 0x3254 + 2930: 88 23 and r24, r24 + 2932: 09 f0 breq .+2 ; 0x2936 + 2934: 0f c2 rjmp .+1054 ; 0x2d54 if (ISO14443ACheckCRCA(Buffer, MEM_VALUE_SIZE )) { - 2916: bd d7 rcall .+3962 ; 0x3892 - 2918: 91 e0 ldi r25, 0x01 ; 1 - 291a: 98 27 eor r25, r24 - 291c: f7 01 movw r30, r14 - 291e: 90 83 st Z, r25 - 2920: 85 e0 ldi r24, 0x05 ; 5 - 2922: 80 93 c5 20 sts 0x20C5, r24 + 2936: bd d7 rcall .+3962 ; 0x38b2 + 2938: 91 e0 ldi r25, 0x01 ; 1 + 293a: 98 27 eor r25, r24 + 293c: f7 01 movw r30, r14 + 293e: 90 83 st Z, r25 + 2940: 85 e0 ldi r24, 0x05 ; 5 + 2942: 80 93 c5 20 sts 0x20C5, r24 /* Not sure if this is the correct error code.. */ Buffer[0] = NAK_OTHER_ERROR ^ Crypto1Nibble(); } } else { /* CRC Error. */ Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2926: 84 e0 ldi r24, 0x04 ; 4 - 2928: 90 e0 ldi r25, 0x00 ; 0 - 292a: 2e 96 adiw r28, 0x0e ; 14 - 292c: cd bf out 0x3d, r28 ; 61 - 292e: de bf out 0x3e, r29 ; 62 - 2930: df 91 pop r29 + 2946: 84 e0 ldi r24, 0x04 ; 4 + 2948: 90 e0 ldi r25, 0x00 ; 0 + 294a: 2e 96 adiw r28, 0x0e ; 14 + 294c: cd bf out 0x3d, r28 ; 61 + 294e: de bf out 0x3e, r29 ; 62 + 2950: df 91 pop r29 } State = STATE_AUTHED_IDLE; - 2932: cf 91 pop r28 - 2934: 1f 91 pop r17 - 2936: 0f 91 pop r16 + 2952: cf 91 pop r28 + 2954: 1f 91 pop r17 + 2956: 0f 91 pop r16 return ACK_NAK_FRAME_SIZE; - 2938: ff 90 pop r15 - 293a: ef 90 pop r14 + 2958: ff 90 pop r15 + 295a: ef 90 pop r14 break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; } - 293c: df 90 pop r13 - 293e: cf 90 pop r12 - 2940: bf 90 pop r11 - 2942: af 90 pop r10 - 2944: 9f 90 pop r9 - 2946: 8f 90 pop r8 - 2948: 08 95 ret - 294a: 20 91 c6 20 lds r18, 0x20C6 - 294e: 90 91 c7 20 lds r25, 0x20C7 - 2952: d7 01 movw r26, r14 - 2954: 8c 91 ld r24, X - 2956: 86 32 cpi r24, 0x26 ; 38 - 2958: 09 f4 brne .+2 ; 0x295c - 295a: f3 c0 rjmp .+486 ; 0x2b42 + 295c: df 90 pop r13 + 295e: cf 90 pop r12 + 2960: bf 90 pop r11 + 2962: af 90 pop r10 + 2964: 9f 90 pop r9 + 2966: 8f 90 pop r8 + 2968: 08 95 ret + 296a: 20 91 c6 20 lds r18, 0x20C6 + 296e: 90 91 c7 20 lds r25, 0x20C7 + 2972: d7 01 movw r26, r14 + 2974: 8c 91 ld r24, X + 2976: 86 32 cpi r24, 0x26 ; 38 + 2978: 09 f4 brne .+2 ; 0x297c + 297a: f3 c0 rjmp .+486 ; 0x2b62 uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { case STATE_IDLE: case STATE_HALT: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 295c: 82 35 cpi r24, 0x52 ; 82 - 295e: 09 f4 brne .+2 ; 0x2962 - 2960: f0 c0 rjmp .+480 ; 0x2b42 - 2962: 80 e0 ldi r24, 0x00 ; 0 - 2964: 90 e0 ldi r25, 0x00 ; 0 - 2966: e1 cf rjmp .-62 ; 0x292a - 2968: 87 01 movw r16, r14 - 296a: cc 24 eor r12, r12 - 296c: f8 01 movw r30, r16 - 296e: 80 80 ld r8, Z - 2970: 4f d7 rcall .+3742 ; 0x3810 - 2972: 88 25 eor r24, r8 + 297c: 82 35 cpi r24, 0x52 ; 82 + 297e: 09 f4 brne .+2 ; 0x2982 + 2980: f0 c0 rjmp .+480 ; 0x2b62 + 2982: 80 e0 ldi r24, 0x00 ; 0 + 2984: 90 e0 ldi r25, 0x00 ; 0 + 2986: e1 cf rjmp .-62 ; 0x294a + 2988: 87 01 movw r16, r14 + 298a: cc 24 eor r12, r12 + 298c: f8 01 movw r30, r16 + 298e: 80 80 ld r8, Z + 2990: 4f d7 rcall .+3742 ; 0x3830 + 2992: 88 25 eor r24, r8 /* Unknown state? Should never happen. */ break; } /* No response has been sent, when we reach here */ return ISO14443A_APP_NO_RESPONSE; - 2974: d8 01 movw r26, r16 - 2976: 8d 93 st X+, r24 - 2978: 8d 01 movw r16, r26 + 2994: d8 01 movw r26, r16 + 2996: 8d 93 st X+, r24 + 2998: 8d 01 movw r16, r26 } else { /* Unknown command. Enter HALT state */ State = STATE_IDLE; } break; - 297a: c3 94 inc r12 + 299a: c3 94 inc r12 } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { switch(State) { - 297c: b2 e1 ldi r27, 0x12 ; 18 + 299c: b2 e1 ldi r27, 0x12 ; 18 * 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(); - 297e: cb 16 cp r12, r27 - 2980: a9 f7 brne .-22 ; 0x296c - 2982: c7 01 movw r24, r14 - 2984: 60 e1 ldi r22, 0x10 ; 16 - 2986: 70 e0 ldi r23, 0x00 ; 0 - 2988: 55 d4 rcall .+2218 ; 0x3234 - 298a: 88 23 and r24, r24 - 298c: 09 f4 brne .+2 ; 0x2990 + 299e: cb 16 cp r12, r27 + 29a0: a9 f7 brne .-22 ; 0x298c + 29a2: c7 01 movw r24, r14 + 29a4: 60 e1 ldi r22, 0x10 ; 16 + 29a6: 70 e0 ldi r23, 0x00 ; 0 + 29a8: 55 d4 rcall .+2218 ; 0x3254 + 29aa: 88 23 and r24, r24 + 29ac: 09 f4 brne .+2 ; 0x29b0 * 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++) - 298e: ef c1 rjmp .+990 ; 0x2d6e - 2990: 80 91 0c 21 lds r24, 0x210C - 2994: 88 23 and r24, r24 + 29ae: ef c1 rjmp .+990 ; 0x2d8e + 29b0: 80 91 0c 21 lds r24, 0x210C + 29b4: 88 23 and r24, r24 Buffer[i] ^= Crypto1Byte(); if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { - 2996: 09 f4 brne .+2 ; 0x299a - 2998: f0 c1 rjmp .+992 ; 0x2d7a - 299a: 7b d7 rcall .+3830 ; 0x3892 - 299c: 9a e0 ldi r25, 0x0A ; 10 - 299e: 98 27 eor r25, r24 - 29a0: f7 01 movw r30, r14 - 29a2: 90 83 st Z, r25 - 29a4: bd cf rjmp .-134 ; 0x2920 + 29b6: 09 f4 brne .+2 ; 0x29ba + 29b8: f0 c1 rjmp .+992 ; 0x2d9a + 29ba: 7b d7 rcall .+3830 ; 0x38b2 + 29bc: 9a e0 ldi r25, 0x0A ; 10 + 29be: 98 27 eor r25, r24 + 29c0: f7 01 movw r30, r14 + 29c2: 90 83 st Z, r25 + 29c4: bd cf rjmp .-134 ; 0x2940 if (!ActiveConfiguration.ReadOnly) { - 29a6: 20 91 c6 20 lds r18, 0x20C6 - 29aa: 90 91 c7 20 lds r25, 0x20C7 - 29ae: d7 01 movw r26, r14 + 29c6: 20 91 c6 20 lds r18, 0x20C6 + 29ca: 90 91 c7 20 lds r25, 0x20C7 + 29ce: d7 01 movw r26, r14 MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); } else { /* Silently ignore in ReadOnly mode */ } Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 29b0: 8c 91 ld r24, X - 29b2: 86 32 cpi r24, 0x26 ; 38 - 29b4: 09 f4 brne .+2 ; 0x29b8 - 29b6: c5 c0 rjmp .+394 ; 0x2b42 - 29b8: 82 35 cpi r24, 0x52 ; 82 - 29ba: 09 f4 brne .+2 ; 0x29be - 29bc: c2 c0 rjmp .+388 ; 0x2b42 + 29d0: 8c 91 ld r24, X + 29d2: 86 32 cpi r24, 0x26 ; 38 + 29d4: 09 f4 brne .+2 ; 0x29d8 + 29d6: c5 c0 rjmp .+394 ; 0x2b62 + 29d8: 82 35 cpi r24, 0x52 ; 82 + 29da: 09 f4 brne .+2 ; 0x29de + 29dc: c2 c0 rjmp .+388 ; 0x2b62 return BitCount; } break; case STATE_READY: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { - 29be: 83 39 cpi r24, 0x93 ; 147 - 29c0: 09 f4 brne .+2 ; 0x29c4 - 29c2: 35 c2 rjmp .+1130 ; 0x2e2e - 29c4: 10 92 c5 20 sts 0x20C5, r1 - 29c8: 80 e0 ldi r24, 0x00 ; 0 - 29ca: 90 e0 ldi r25, 0x00 ; 0 - 29cc: ae cf rjmp .-164 ; 0x292a - 29ce: c7 01 movw r24, r14 - 29d0: e0 d6 rcall .+3520 ; 0x3792 - 29d2: d7 01 movw r26, r14 - 29d4: 14 96 adiw r26, 0x04 ; 4 + 29de: 83 39 cpi r24, 0x93 ; 147 + 29e0: 09 f4 brne .+2 ; 0x29e4 + 29e2: 35 c2 rjmp .+1130 ; 0x2e4e + 29e4: 10 92 c5 20 sts 0x20C5, r1 + 29e8: 80 e0 ldi r24, 0x00 ; 0 + 29ea: 90 e0 ldi r25, 0x00 ; 0 + 29ec: ae cf rjmp .-164 ; 0x294a + 29ee: c7 01 movw r24, r14 + 29f0: e0 d6 rcall .+3520 ; 0x37b2 + 29f2: d7 01 movw r26, r14 + 29f4: 14 96 adiw r26, 0x04 ; 4 State = STATE_READY; return BitCount; } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { - 29d6: 0c 91 ld r16, X - 29d8: 1b d7 rcall .+3638 ; 0x3810 - 29da: 80 27 eor r24, r16 + 29f6: 0c 91 ld r16, X + 29f8: 1b d7 rcall .+3638 ; 0x3830 + 29fa: 80 27 eor r24, r16 * 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; - 29dc: f7 01 movw r30, r14 - 29de: 84 83 std Z+4, r24 ; 0x04 + 29fc: f7 01 movw r30, r14 + 29fe: 84 83 std Z+4, r24 ; 0x04 return ISO14443A_APP_NO_RESPONSE; - 29e0: 05 81 ldd r16, Z+5 ; 0x05 - 29e2: 16 d7 rcall .+3628 ; 0x3810 - 29e4: 80 27 eor r24, r16 + 2a00: 05 81 ldd r16, Z+5 ; 0x05 + 2a02: 16 d7 rcall .+3628 ; 0x3830 + 2a04: 80 27 eor r24, r16 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]); - 29e6: d7 01 movw r26, r14 - 29e8: 15 96 adiw r26, 0x05 ; 5 - 29ea: 8c 93 st X, r24 + 2a06: d7 01 movw r26, r14 + 2a08: 15 96 adiw r26, 0x05 ; 5 + 2a0a: 8c 93 st X, r24 for (uint8_t i=0; i<4; i++) Buffer[i+4] ^= Crypto1Byte(); - 29ec: 15 97 sbiw r26, 0x05 ; 5 - 29ee: 16 96 adiw r26, 0x06 ; 6 - 29f0: 0c 91 ld r16, X - 29f2: 0e d7 rcall .+3612 ; 0x3810 - 29f4: 80 27 eor r24, r16 - 29f6: f7 01 movw r30, r14 - 29f8: 86 83 std Z+6, r24 ; 0x06 - 29fa: 07 81 ldd r16, Z+7 ; 0x07 - 29fc: 09 d7 rcall .+3602 ; 0x3810 - 29fe: 80 27 eor r24, r16 - 2a00: d7 01 movw r26, r14 - 2a02: 17 96 adiw r26, 0x07 ; 7 - 2a04: 8c 93 st X, r24 - 2a06: 17 97 sbiw r26, 0x07 ; 7 - 2a08: 14 96 adiw r26, 0x04 ; 4 - 2a0a: 2c 91 ld r18, X - 2a0c: 14 97 sbiw r26, 0x04 ; 4 - 2a0e: 90 91 c9 20 lds r25, 0x20C9 - 2a12: 29 17 cp r18, r25 - 2a14: 09 f0 breq .+2 ; 0x2a18 - 2a16: 1e cf rjmp .-452 ; 0x2854 - 2a18: 15 96 adiw r26, 0x05 ; 5 - 2a1a: 2c 91 ld r18, X - 2a1c: 15 97 sbiw r26, 0x05 ; 5 - 2a1e: 90 91 ca 20 lds r25, 0x20CA - 2a22: 29 17 cp r18, r25 - 2a24: 09 f0 breq .+2 ; 0x2a28 - 2a26: 16 cf rjmp .-468 ; 0x2854 - 2a28: 16 96 adiw r26, 0x06 ; 6 + 2a0c: 15 97 sbiw r26, 0x05 ; 5 + 2a0e: 16 96 adiw r26, 0x06 ; 6 + 2a10: 0c 91 ld r16, X + 2a12: 0e d7 rcall .+3612 ; 0x3830 + 2a14: 80 27 eor r24, r16 + 2a16: f7 01 movw r30, r14 + 2a18: 86 83 std Z+6, r24 ; 0x06 + 2a1a: 07 81 ldd r16, Z+7 ; 0x07 + 2a1c: 09 d7 rcall .+3602 ; 0x3830 + 2a1e: 80 27 eor r24, r16 + 2a20: d7 01 movw r26, r14 + 2a22: 17 96 adiw r26, 0x07 ; 7 + 2a24: 8c 93 st X, r24 + 2a26: 17 97 sbiw r26, 0x07 ; 7 + 2a28: 14 96 adiw r26, 0x04 ; 4 + 2a2a: 2c 91 ld r18, X + 2a2c: 14 97 sbiw r26, 0x04 ; 4 + 2a2e: 90 91 c9 20 lds r25, 0x20C9 + 2a32: 29 17 cp r18, r25 + 2a34: 09 f0 breq .+2 ; 0x2a38 + 2a36: 1e cf rjmp .-452 ; 0x2874 + 2a38: 15 96 adiw r26, 0x05 ; 5 + 2a3a: 2c 91 ld r18, X + 2a3c: 15 97 sbiw r26, 0x05 ; 5 + 2a3e: 90 91 ca 20 lds r25, 0x20CA + 2a42: 29 17 cp r18, r25 + 2a44: 09 f0 breq .+2 ; 0x2a48 + 2a46: 16 cf rjmp .-468 ; 0x2874 + 2a48: 16 96 adiw r26, 0x06 ; 6 if ((Buffer[4] == ReaderResponse[0]) && - 2a2a: 2c 91 ld r18, X - 2a2c: 16 97 sbiw r26, 0x06 ; 6 - 2a2e: 90 91 cb 20 lds r25, 0x20CB - 2a32: 29 17 cp r18, r25 - 2a34: 09 f0 breq .+2 ; 0x2a38 - 2a36: 0e cf rjmp .-484 ; 0x2854 - 2a38: 90 91 cc 20 lds r25, 0x20CC - 2a3c: 89 17 cp r24, r25 - 2a3e: 09 f0 breq .+2 ; 0x2a42 - 2a40: 09 cf rjmp .-494 ; 0x2854 - 2a42: 00 91 cd 20 lds r16, 0x20CD - 2a46: e4 d6 rcall .+3528 ; 0x3810 - 2a48: 80 27 eor r24, r16 + 2a4a: 2c 91 ld r18, X + 2a4c: 16 97 sbiw r26, 0x06 ; 6 + 2a4e: 90 91 cb 20 lds r25, 0x20CB + 2a52: 29 17 cp r18, r25 + 2a54: 09 f0 breq .+2 ; 0x2a58 + 2a56: 0e cf rjmp .-484 ; 0x2874 + 2a58: 90 91 cc 20 lds r25, 0x20CC + 2a5c: 89 17 cp r24, r25 + 2a5e: 09 f0 breq .+2 ; 0x2a62 + 2a60: 09 cf rjmp .-494 ; 0x2874 + 2a62: 00 91 cd 20 lds r16, 0x20CD + 2a66: e4 d6 rcall .+3528 ; 0x3830 + 2a68: 80 27 eor r24, r16 (Buffer[5] == ReaderResponse[1]) && - 2a4a: f7 01 movw r30, r14 - 2a4c: 80 83 st Z, r24 - 2a4e: 00 91 cd 20 lds r16, 0x20CD - 2a52: 00 2e mov r0, r16 - 2a54: 02 95 swap r16 - 2a56: 00 25 eor r16, r0 - 2a58: 00 2e mov r0, r16 + 2a6a: f7 01 movw r30, r14 + 2a6c: 80 83 st Z, r24 + 2a6e: 00 91 cd 20 lds r16, 0x20CD + 2a72: 00 2e mov r0, r16 + 2a74: 02 95 swap r16 + 2a76: 00 25 eor r16, r0 + 2a78: 00 2e mov r0, r16 (Buffer[6] == ReaderResponse[2]) && - 2a5a: 06 95 lsr r16 - 2a5c: 06 95 lsr r16 - 2a5e: 00 25 eor r16, r0 - 2a60: 9e d4 rcall .+2364 ; 0x339e - 2a62: f7 01 movw r30, r14 + 2a7a: 06 95 lsr r16 + 2a7c: 06 95 lsr r16 + 2a7e: 00 25 eor r16, r0 + 2a80: 9e d4 rcall .+2364 ; 0x33be + 2a82: f7 01 movw r30, r14 (Buffer[7] == ReaderResponse[3])) { /* Reader is authenticated. Encrypt the precalculated card response * and generate the parity bits. */ for (uint8_t i=0; i - 2a84: 80 27 eor r24, r16 - 2a86: d7 01 movw r26, r14 - 2a88: 11 96 adiw r26, 0x01 ; 1 - 2a8a: 8c 93 st X, r24 - 2a8c: 00 91 ce 20 lds r16, 0x20CE - 2a90: 00 2e mov r0, r16 - 2a92: 02 95 swap r16 - 2a94: 00 25 eor r16, r0 - 2a96: 00 2e mov r0, r16 - 2a98: 06 95 lsr r16 - 2a9a: 06 95 lsr r16 - 2a9c: 00 25 eor r16, r0 - 2a9e: 7f d4 rcall .+2302 ; 0x339e - 2aa0: f7 01 movw r30, r14 - 2aa2: ef 57 subi r30, 0x7F ; 127 + 2a92: 27 95 ror r18 + 2a94: 91 e0 ldi r25, 0x01 ; 1 + 2a96: 20 fd sbrc r18, 0 + 2a98: 90 e0 ldi r25, 0x00 ; 0 + 2a9a: 98 27 eor r25, r24 + 2a9c: 90 83 st Z, r25 + 2a9e: 00 91 ce 20 lds r16, 0x20CE + 2aa2: c6 d6 rcall .+3468 ; 0x3830 + 2aa4: 80 27 eor r24, r16 + 2aa6: d7 01 movw r26, r14 + 2aa8: 11 96 adiw r26, 0x01 ; 1 + 2aaa: 8c 93 st X, r24 + 2aac: 00 91 ce 20 lds r16, 0x20CE + 2ab0: 00 2e mov r0, r16 + 2ab2: 02 95 swap r16 + 2ab4: 00 25 eor r16, r0 + 2ab6: 00 2e mov r0, r16 + 2ab8: 06 95 lsr r16 + 2aba: 06 95 lsr r16 + 2abc: 00 25 eor r16, r0 + 2abe: 7f d4 rcall .+2302 ; 0x33be + 2ac0: f7 01 movw r30, r14 + 2ac2: ef 57 subi r30, 0x7F ; 127 (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 - 2ac2: 80 27 eor r24, r16 - 2ac4: f7 01 movw r30, r14 - 2ac6: 82 83 std Z+2, r24 ; 0x02 - 2ac8: 00 91 cf 20 lds r16, 0x20CF - 2acc: 00 2e mov r0, r16 - 2ace: 02 95 swap r16 - 2ad0: 00 25 eor r16, r0 - 2ad2: 00 2e mov r0, r16 - 2ad4: 06 95 lsr r16 - 2ad6: 06 95 lsr r16 - 2ad8: 00 25 eor r16, r0 - 2ada: 61 d4 rcall .+2242 ; 0x339e - 2adc: f7 01 movw r30, r14 - 2ade: ee 57 subi r30, 0x7E ; 126 - 2ae0: ff 4f sbci r31, 0xFF ; 255 - 2ae2: 20 2f mov r18, r16 - 2ae4: 30 e0 ldi r19, 0x00 ; 0 + 2ad4: 20 fd sbrc r18, 0 + 2ad6: 90 e0 ldi r25, 0x00 ; 0 + 2ad8: 98 27 eor r25, r24 + 2ada: 90 83 st Z, r25 + 2adc: 00 91 cf 20 lds r16, 0x20CF + 2ae0: a7 d6 rcall .+3406 ; 0x3830 + 2ae2: 80 27 eor r24, r16 + 2ae4: f7 01 movw r30, r14 + 2ae6: 82 83 std Z+2, r24 ; 0x02 + 2ae8: 00 91 cf 20 lds r16, 0x20CF + 2aec: 00 2e mov r0, r16 + 2aee: 02 95 swap r16 + 2af0: 00 25 eor r16, r0 + 2af2: 00 2e mov r0, r16 + 2af4: 06 95 lsr r16 + 2af6: 06 95 lsr r16 + 2af8: 00 25 eor r16, r0 + 2afa: 61 d4 rcall .+2242 ; 0x33be + 2afc: f7 01 movw r30, r14 + 2afe: ee 57 subi r30, 0x7E ; 126 + 2b00: ff 4f sbci r31, 0xFF ; 255 + 2b02: 20 2f mov r18, r16 + 2b04: 30 e0 ldi r19, 0x00 ; 0 (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 - 2afe: 80 27 eor r24, r16 - 2b00: d7 01 movw r26, r14 - 2b02: 13 96 adiw r26, 0x03 ; 3 - 2b04: 8c 93 st X, r24 - 2b06: 00 91 d0 20 lds r16, 0x20D0 - 2b0a: 00 2e mov r0, r16 - 2b0c: 02 95 swap r16 - 2b0e: 00 25 eor r16, r0 - 2b10: 00 2e mov r0, r16 - 2b12: 06 95 lsr r16 - 2b14: 06 95 lsr r16 - 2b16: 00 25 eor r16, r0 - 2b18: 42 d4 rcall .+2180 ; 0x339e - 2b1a: f7 01 movw r30, r14 - 2b1c: ed 57 subi r30, 0x7D ; 125 - 2b1e: ff 4f sbci r31, 0xFF ; 255 - 2b20: 20 2f mov r18, r16 - 2b22: 30 e0 ldi r19, 0x00 ; 0 - 2b24: 2f 5f subi r18, 0xFF ; 255 + 2b14: 98 27 eor r25, r24 + 2b16: 90 83 st Z, r25 + 2b18: 00 91 d0 20 lds r16, 0x20D0 + 2b1c: 89 d6 rcall .+3346 ; 0x3830 + 2b1e: 80 27 eor r24, r16 + 2b20: d7 01 movw r26, r14 + 2b22: 13 96 adiw r26, 0x03 ; 3 + 2b24: 8c 93 st X, r24 + 2b26: 00 91 d0 20 lds r16, 0x20D0 + 2b2a: 00 2e mov r0, r16 + 2b2c: 02 95 swap r16 + 2b2e: 00 25 eor r16, r0 + 2b30: 00 2e mov r0, r16 + 2b32: 06 95 lsr r16 + 2b34: 06 95 lsr r16 + 2b36: 00 25 eor r16, r0 + 2b38: 42 d4 rcall .+2180 ; 0x33be + 2b3a: f7 01 movw r30, r14 + 2b3c: ed 57 subi r30, 0x7D ; 125 + 2b3e: ff 4f sbci r31, 0xFF ; 255 + 2b40: 20 2f mov r18, r16 + 2b42: 30 e0 ldi r19, 0x00 ; 0 + 2b44: 2f 5f subi r18, 0xFF ; 255 (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 - 2b42: f7 01 movw r30, r14 - 2b44: 20 83 st Z, r18 - 2b46: 91 83 std Z+1, r25 ; 0x01 - 2b48: 82 e0 ldi r24, 0x02 ; 2 - 2b4a: 80 93 c5 20 sts 0x20C5, r24 - 2b4e: 80 e1 ldi r24, 0x10 ; 16 + 2b46: 3f 4f sbci r19, 0xFF ; 255 + 2b48: 35 95 asr r19 + 2b4a: 27 95 ror r18 + 2b4c: 91 e0 ldi r25, 0x01 ; 1 + 2b4e: 20 fd sbrc r18, 0 2b50: 90 e0 ldi r25, 0x00 ; 0 - 2b52: eb ce rjmp .-554 ; 0x292a - 2b54: 84 e0 ldi r24, 0x04 ; 4 - 2b56: d7 01 movw r26, r14 - 2b58: 8c 93 st X, r24 - 2b5a: 11 96 adiw r26, 0x01 ; 1 - 2b5c: 1c 92 st X, r1 - 2b5e: 11 97 sbiw r26, 0x01 ; 1 - 2b60: 82 e0 ldi r24, 0x02 ; 2 - 2b62: 80 93 c5 20 sts 0x20C5, r24 - 2b66: 80 e1 ldi r24, 0x10 ; 16 + 2b52: 98 27 eor r25, r24 + 2b54: 90 83 st Z, r25 + Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(CardResponse[i]) ^ Crypto1FilterOutput(); + 2b56: 85 e0 ldi r24, 0x05 ; 5 + 2b58: 80 93 c5 20 sts 0x20C5, r24 + 2b5c: 80 e2 ldi r24, 0x20 ; 32 + 2b5e: 90 e1 ldi r25, 0x10 ; 16 + 2b60: f4 ce rjmp .-536 ; 0x294a + 2b62: f7 01 movw r30, r14 + 2b64: 20 83 st Z, r18 + 2b66: 91 83 std Z+1, r25 ; 0x01 + 2b68: 82 e0 ldi r24, 0x02 ; 2 + 2b6a: 80 93 c5 20 sts 0x20C5, r24 + 2b6e: 80 e1 ldi r24, 0x10 ; 16 + 2b70: 90 e0 ldi r25, 0x00 ; 0 + 2b72: eb ce rjmp .-554 ; 0x294a + 2b74: 84 e0 ldi r24, 0x04 ; 4 + 2b76: d7 01 movw r26, r14 + 2b78: 8c 93 st X, r24 + 2b7a: 11 96 adiw r26, 0x01 ; 1 + 2b7c: 1c 92 st X, r1 + 2b7e: 11 97 sbiw r26, 0x01 ; 1 + 2b80: 82 e0 ldi r24, 0x02 ; 2 + 2b82: 80 93 c5 20 sts 0x20C5, r24 + 2b86: 80 e1 ldi r24, 0x10 ; 16 } State = STATE_AUTHED_IDLE; - 2b68: 90 e0 ldi r25, 0x00 ; 0 - 2b6a: df ce rjmp .-578 ; 0x292a - 2b6c: f7 01 movw r30, r14 + 2b88: 90 e0 ldi r25, 0x00 ; 0 + 2b8a: df ce rjmp .-578 ; 0x294a + 2b8c: f7 01 movw r30, r14 return (CMD_AUTH_BA_FRAME_SIZE * BITS_PER_BYTE) | ISO14443A_APP_CUSTOM_PARITY; - 2b6e: 81 81 ldd r24, Z+1 ; 0x01 - 2b70: 88 23 and r24, r24 - 2b72: 09 f4 brne .+2 ; 0x2b76 + 2b8e: 81 81 ldd r24, Z+1 ; 0x01 + 2b90: 88 23 and r24, r24 + 2b92: 09 f4 brne .+2 ; 0x2b96 DataPtr[0] = (ATQAValue >> 0) & 0x00FF; - 2b74: d7 c2 rjmp .+1454 ; 0x3124 <__stack+0x125> - 2b76: f7 01 movw r30, r14 + 2b94: d7 c2 rjmp .+1454 ; 0x3144 <__stack+0x145> + 2b96: f7 01 movw r30, r14 DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 2b78: 10 82 st Z, r1 + 2b98: 10 82 st Z, r1 } break; case STATE_READY: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { State = STATE_READY; - 2b7a: 84 e0 ldi r24, 0x04 ; 4 - 2b7c: 90 e0 ldi r25, 0x00 ; 0 - 2b7e: d5 ce rjmp .-598 ; 0x292a + 2b9a: 84 e0 ldi r24, 0x04 ; 4 + 2b9c: 90 e0 ldi r25, 0x00 ; 0 + 2b9e: d5 ce rjmp .-598 ; 0x294a *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 2b80: c7 01 movw r24, r14 - 2b82: 62 e0 ldi r22, 0x02 ; 2 + 2ba0: c7 01 movw r24, r14 + 2ba2: 62 e0 ldi r22, 0x02 ; 2 return BitCount; - 2b84: 70 e0 ldi r23, 0x00 ; 0 + 2ba4: 70 e0 ldi r23, 0x00 ; 0 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; - 2b86: 56 d3 rcall .+1708 ; 0x3234 - 2b88: 88 23 and r24, r24 - 2b8a: 09 f4 brne .+2 ; 0x2b8e + 2ba6: 56 d3 rcall .+1708 ; 0x3254 + 2ba8: 88 23 and r24, r24 + 2baa: 09 f4 brne .+2 ; 0x2bae DataPtr[1] = (ATQAValue >> 8) & 0x00FF; - 2b8c: 05 c1 rjmp .+522 ; 0x2d98 - 2b8e: d7 01 movw r26, r14 - 2b90: 11 96 adiw r26, 0x01 ; 1 + 2bac: 05 c1 rjmp .+522 ; 0x2db8 + 2bae: d7 01 movw r26, r14 + 2bb0: 11 96 adiw r26, 0x01 ; 1 } break; case STATE_ACTIVE: if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { State = STATE_READY; - 2b92: 0c 91 ld r16, X - 2b94: 11 97 sbiw r26, 0x01 ; 1 - 2b96: 0c 73 andi r16, 0x3C ; 60 + 2bb2: 0c 91 ld r16, X + 2bb4: 11 97 sbiw r26, 0x01 ; 1 + 2bb6: 0c 73 andi r16, 0x3C ; 60 *BitCount = ISO14443A_ATQA_FRAME_SIZE; - 2b98: 8c 91 ld r24, X - 2b9a: 80 36 cpi r24, 0x60 ; 96 + 2bb8: 8c 91 ld r24, X + 2bba: 80 36 cpi r24, 0x60 ; 96 return BitCount; - 2b9c: 09 f4 brne .+2 ; 0x2ba0 + 2bbc: 09 f4 brne .+2 ; 0x2bc0 } 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) { - 2b9e: df c2 rjmp .+1470 ; 0x315e <__stack+0x15f> - 2ba0: 8a e3 ldi r24, 0x3A ; 58 - 2ba2: 90 e0 ldi r25, 0x00 ; 0 - 2ba4: 10 e0 ldi r17, 0x00 ; 0 - 2ba6: 02 95 swap r16 + 2bbe: df c2 rjmp .+1470 ; 0x317e <__stack+0x17f> + 2bc0: 8a e3 ldi r24, 0x3A ; 58 + 2bc2: 90 e0 ldi r25, 0x00 ; 0 + 2bc4: 10 e0 ldi r17, 0x00 ; 0 + 2bc6: 02 95 swap r16 } else { Buffer[0] = NAK_CRC_ERROR; return ACK_NAK_FRAME_SIZE; } } else { Buffer[0] = NAK_INVALID_ARG; - 2ba8: 12 95 swap r17 - 2baa: 10 7f andi r17, 0xF0 ; 240 + 2bc8: 12 95 swap r17 + 2bca: 10 7f andi r17, 0xF0 ; 240 return ACK_NAK_FRAME_SIZE; - 2bac: 10 27 eor r17, r16 - 2bae: 00 7f andi r16, 0xF0 ; 240 - 2bb0: 10 27 eor r17, r16 + 2bcc: 10 27 eor r17, r16 + 2bce: 00 7f andi r16, 0xF0 ; 240 + 2bd0: 10 27 eor r17, r16 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)) { - 2bb2: 08 0f add r16, r24 - 2bb4: 19 1f adc r17, r25 - 2bb6: ce 01 movw r24, r28 - 2bb8: 05 96 adiw r24, 0x05 ; 5 - 2bba: 64 e0 ldi r22, 0x04 ; 4 - 2bbc: 0e 94 eb 04 call 0x9d6 ; 0x9d6 - 2bc0: ce 01 movw r24, r28 + 2bd2: 08 0f add r16, r24 + 2bd4: 19 1f adc r17, r25 + 2bd6: ce 01 movw r24, r28 + 2bd8: 05 96 adiw r24, 0x05 ; 5 + 2bda: 64 e0 ldi r22, 0x04 ; 4 + 2bdc: 0e 94 fb 04 call 0x9f6 ; 0x9f6 + 2be0: ce 01 movw r24, r28 /* Nested authentication. */ uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 2bc2: 01 96 adiw r24, 0x01 ; 1 - 2bc4: 60 e0 ldi r22, 0x00 ; 0 - 2bc6: 70 e0 ldi r23, 0x00 ; 0 - 2bc8: 44 e0 ldi r20, 0x04 ; 4 - 2bca: 50 e0 ldi r21, 0x00 ; 0 + 2be2: 01 96 adiw r24, 0x01 ; 1 + 2be4: 60 e0 ldi r22, 0x00 ; 0 + 2be6: 70 e0 ldi r23, 0x00 ; 0 + 2be8: 44 e0 ldi r20, 0x04 ; 4 + 2bea: 50 e0 ldi r21, 0x00 ; 0 uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 2bcc: 0e 94 1d 06 call 0xc3a ; 0xc3a - 2bd0: ce 01 movw r24, r28 - 2bd2: 09 96 adiw r24, 0x09 ; 9 - 2bd4: b8 01 movw r22, r16 - 2bd6: 46 e0 ldi r20, 0x06 ; 6 + 2bec: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2bf0: ce 01 movw r24, r28 + 2bf2: 09 96 adiw r24, 0x09 ; 9 + 2bf4: b8 01 movw r22, r16 + 2bf6: 46 e0 ldi r20, 0x06 ; 6 uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 2bd8: 50 e0 ldi r21, 0x00 ; 0 - 2bda: 0e 94 1d 06 call 0xc3a ; 0xc3a - 2bde: 8d 81 ldd r24, Y+5 ; 0x05 - 2be0: 80 93 c9 20 sts 0x20C9, r24 - 2be4: 8e 81 ldd r24, Y+6 ; 0x06 - 2be6: 80 93 ca 20 sts 0x20CA, r24 + 2bf8: 50 e0 ldi r21, 0x00 ; 0 + 2bfa: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2bfe: 8d 81 ldd r24, Y+5 ; 0x05 + 2c00: 80 93 c9 20 sts 0x20C9, r24 + 2c04: 8e 81 ldd r24, Y+6 ; 0x06 + 2c06: 80 93 ca 20 sts 0x20CA, r24 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)); - 2bea: 8f 81 ldd r24, Y+7 ; 0x07 - 2bec: 80 93 cb 20 sts 0x20CB, r24 - 2bf0: 88 85 ldd r24, Y+8 ; 0x08 - 2bf2: 80 93 cc 20 sts 0x20CC, r24 + 2c0a: 8f 81 ldd r24, Y+7 ; 0x07 + 2c0c: 80 93 cb 20 sts 0x20CB, r24 + 2c10: 88 85 ldd r24, Y+8 ; 0x08 + 2c12: 80 93 cc 20 sts 0x20CC, r24 MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2bf6: 89 ec ldi r24, 0xC9 ; 201 - 2bf8: 90 e2 ldi r25, 0x20 ; 32 - 2bfa: 60 e4 ldi r22, 0x40 ; 64 - 2bfc: 70 e0 ldi r23, 0x00 ; 0 - 2bfe: 6d d6 rcall .+3290 ; 0x38da - 2c00: 80 91 c9 20 lds r24, 0x20C9 + 2c16: 89 ec ldi r24, 0xC9 ; 201 + 2c18: 90 e2 ldi r25, 0x20 ; 32 + 2c1a: 60 e4 ldi r22, 0x40 ; 64 + 2c1c: 70 e0 ldi r23, 0x00 ; 0 + 2c1e: 6d d6 rcall .+3290 ; 0x38fa + 2c20: 80 91 c9 20 lds r24, 0x20C9 MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 2c04: 80 93 cd 20 sts 0x20CD, r24 - 2c08: 80 91 ca 20 lds r24, 0x20CA - 2c0c: 80 93 ce 20 sts 0x20CE, r24 - 2c10: 80 91 cb 20 lds r24, 0x20CB + 2c24: 80 93 cd 20 sts 0x20CD, r24 + 2c28: 80 91 ca 20 lds r24, 0x20CA + 2c2c: 80 93 ce 20 sts 0x20CE, r24 + 2c30: 80 91 cb 20 lds r24, 0x20CB /* Precalculate the reader response from card-nonce */ for (uint8_t i=0; i + 2c34: 80 93 cf 20 sts 0x20CF, r24 + 2c38: 80 91 cc 20 lds r24, 0x20CC + 2c3c: 80 93 d0 20 sts 0x20D0, r24 + 2c40: 8d ec ldi r24, 0xCD ; 205 + 2c42: 90 e2 ldi r25, 0x20 ; 32 + 2c44: 60 e2 ldi r22, 0x20 ; 32 + 2c46: 70 e0 ldi r23, 0x00 ; 0 + 2c48: 58 d6 rcall .+3248 ; 0x38fa Crypto1PRNG(ReaderResponse, 64); - 2c2a: ce 01 movw r24, r28 - 2c2c: 09 96 adiw r24, 0x09 ; 9 - 2c2e: be 01 movw r22, r28 - 2c30: 6f 5f subi r22, 0xFF ; 255 - 2c32: 7f 4f sbci r23, 0xFF ; 255 - 2c34: ae 01 movw r20, r28 + 2c4a: ce 01 movw r24, r28 + 2c4c: 09 96 adiw r24, 0x09 ; 9 + 2c4e: be 01 movw r22, r28 + 2c50: 6f 5f subi r22, 0xFF ; 255 + 2c52: 7f 4f sbci r23, 0xFF ; 255 + 2c54: ae 01 movw r20, r28 /* Precalculate our response from the reader response */ for (uint8_t i=0; i - 2c3c: 8d 81 ldd r24, Y+5 ; 0x05 - 2c3e: f7 01 movw r30, r14 - 2c40: 80 83 st Z, r24 - 2c42: 8e 81 ldd r24, Y+6 ; 0x06 - 2c44: 81 83 std Z+1, r24 ; 0x01 - 2c46: 8f 81 ldd r24, Y+7 ; 0x07 - 2c48: 82 83 std Z+2, r24 ; 0x02 - 2c4a: 88 85 ldd r24, Y+8 ; 0x08 - 2c4c: 83 83 std Z+3, r24 ; 0x03 - 2c4e: 84 e0 ldi r24, 0x04 ; 4 - 2c50: 80 93 c5 20 sts 0x20C5, r24 - 2c54: 80 e2 ldi r24, 0x20 ; 32 + 2c56: 4b 5f subi r20, 0xFB ; 251 + 2c58: 5f 4f sbci r21, 0xFF ; 255 + 2c5a: e5 d3 rcall .+1994 ; 0x3426 + 2c5c: 8d 81 ldd r24, Y+5 ; 0x05 + 2c5e: f7 01 movw r30, r14 + 2c60: 80 83 st Z, r24 + 2c62: 8e 81 ldd r24, Y+6 ; 0x06 + 2c64: 81 83 std Z+1, r24 ; 0x01 + 2c66: 8f 81 ldd r24, Y+7 ; 0x07 + 2c68: 82 83 std Z+2, r24 ; 0x02 + 2c6a: 88 85 ldd r24, Y+8 ; 0x08 + 2c6c: 83 83 std Z+3, r24 ; 0x03 + 2c6e: 84 e0 ldi r24, 0x04 ; 4 + 2c70: 80 93 c5 20 sts 0x20C5, r24 + 2c74: 80 e2 ldi r24, 0x20 ; 32 Crypto1PRNG(CardResponse, 32); - 2c56: 90 e0 ldi r25, 0x00 ; 0 - 2c58: 68 ce rjmp .-816 ; 0x292a - 2c5a: c7 01 movw r24, r14 - 2c5c: 62 e0 ldi r22, 0x02 ; 2 - 2c5e: 70 e0 ldi r23, 0x00 ; 0 - 2c60: e9 d2 rcall .+1490 ; 0x3234 + 2c76: 90 e0 ldi r25, 0x00 ; 0 + 2c78: 68 ce rjmp .-816 ; 0x294a + 2c7a: c7 01 movw r24, r14 + 2c7c: 62 e0 ldi r22, 0x02 ; 2 + 2c7e: 70 e0 ldi r23, 0x00 ; 0 + 2c80: e9 d2 rcall .+1490 ; 0x3254 /* Setup crypto1 cipher. */ Crypto1Setup(Key, Uid, CardNonce); - 2c62: 88 23 and r24, r24 - 2c64: 09 f4 brne .+2 ; 0x2c68 - 2c66: 65 c2 rjmp .+1226 ; 0x3132 <__stack+0x133> - 2c68: d7 01 movw r26, r14 - 2c6a: 11 96 adiw r26, 0x01 ; 1 - 2c6c: 0c 91 ld r16, X - 2c6e: 11 97 sbiw r26, 0x01 ; 1 - 2c70: 0c 73 andi r16, 0x3C ; 60 - 2c72: 8c 91 ld r24, X - 2c74: 80 36 cpi r24, 0x60 ; 96 + 2c82: 88 23 and r24, r24 + 2c84: 09 f4 brne .+2 ; 0x2c88 + 2c86: 65 c2 rjmp .+1226 ; 0x3152 <__stack+0x153> + 2c88: d7 01 movw r26, r14 + 2c8a: 11 96 adiw r26, 0x01 ; 1 + 2c8c: 0c 91 ld r16, X + 2c8e: 11 97 sbiw r26, 0x01 ; 1 + 2c90: 0c 73 andi r16, 0x3C ; 60 + 2c92: 8c 91 ld r24, X + 2c94: 80 36 cpi r24, 0x60 ; 96 for (uint8_t i=0; i - 2c78: 75 c2 rjmp .+1258 ; 0x3164 <__stack+0x165> - 2c7a: 8a e3 ldi r24, 0x3A ; 58 - 2c7c: 90 e0 ldi r25, 0x00 ; 0 - 2c7e: 10 e0 ldi r17, 0x00 ; 0 - 2c80: 02 95 swap r16 - 2c82: 12 95 swap r17 - 2c84: 10 7f andi r17, 0xF0 ; 240 - 2c86: 10 27 eor r17, r16 + 2c96: 09 f4 brne .+2 ; 0x2c9a + 2c98: 75 c2 rjmp .+1258 ; 0x3184 <__stack+0x185> + 2c9a: 8a e3 ldi r24, 0x3A ; 58 + 2c9c: 90 e0 ldi r25, 0x00 ; 0 + 2c9e: 10 e0 ldi r17, 0x00 ; 0 + 2ca0: 02 95 swap r16 + 2ca2: 12 95 swap r17 + 2ca4: 10 7f andi r17, 0xF0 ; 240 + 2ca6: 10 27 eor r17, r16 /* Respond with the encrypted random card nonce and expect further authentication * form the reader in the next frame. */ State = STATE_AUTHING; - 2c88: 00 7f andi r16, 0xF0 ; 240 - 2c8a: 10 27 eor r17, r16 - 2c8c: 08 0f add r16, r24 + 2ca8: 00 7f andi r16, 0xF0 ; 240 + 2caa: 10 27 eor r17, r16 + 2cac: 08 0f add r16, r24 return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - 2c8e: 19 1f adc r17, r25 - 2c90: ce 01 movw r24, r28 - 2c92: 01 96 adiw r24, 0x01 ; 1 + 2cae: 19 1f adc r17, r25 + 2cb0: ce 01 movw r24, r28 + 2cb2: 01 96 adiw r24, 0x01 ; 1 } 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)) { - 2c94: 64 e0 ldi r22, 0x04 ; 4 - 2c96: 0e 94 eb 04 call 0x9d6 ; 0x9d6 - 2c9a: ce 01 movw r24, r28 - 2c9c: 05 96 adiw r24, 0x05 ; 5 - 2c9e: 60 e0 ldi r22, 0x00 ; 0 - 2ca0: 70 e0 ldi r23, 0x00 ; 0 - 2ca2: 44 e0 ldi r20, 0x04 ; 4 + 2cb4: 64 e0 ldi r22, 0x04 ; 4 + 2cb6: 0e 94 fb 04 call 0x9f6 ; 0x9f6 + 2cba: ce 01 movw r24, r28 + 2cbc: 05 96 adiw r24, 0x05 ; 5 + 2cbe: 60 e0 ldi r22, 0x00 ; 0 + 2cc0: 70 e0 ldi r23, 0x00 ; 0 + 2cc2: 44 e0 ldi r20, 0x04 ; 4 uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - 2ca4: 50 e0 ldi r21, 0x00 ; 0 - 2ca6: 0e 94 1d 06 call 0xc3a ; 0xc3a - 2caa: ce 01 movw r24, r28 - 2cac: 09 96 adiw r24, 0x09 ; 9 + 2cc4: 50 e0 ldi r21, 0x00 ; 0 + 2cc6: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2cca: ce 01 movw r24, r28 + 2ccc: 09 96 adiw r24, 0x09 ; 9 uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - 2cae: b8 01 movw r22, r16 - 2cb0: 46 e0 ldi r20, 0x06 ; 6 - 2cb2: 50 e0 ldi r21, 0x00 ; 0 - 2cb4: 0e 94 1d 06 call 0xc3a ; 0xc3a - 2cb8: 89 81 ldd r24, Y+1 ; 0x01 + 2cce: b8 01 movw r22, r16 + 2cd0: 46 e0 ldi r20, 0x06 ; 6 + 2cd2: 50 e0 ldi r21, 0x00 ; 0 + 2cd4: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2cd8: 89 81 ldd r24, Y+1 ; 0x01 uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - 2cba: 80 93 c9 20 sts 0x20C9, r24 - 2cbe: 8a 81 ldd r24, Y+2 ; 0x02 - 2cc0: 80 93 ca 20 sts 0x20CA, r24 - 2cc4: 8b 81 ldd r24, Y+3 ; 0x03 - 2cc6: 80 93 cb 20 sts 0x20CB, r24 - 2cca: 8c 81 ldd r24, Y+4 ; 0x04 + 2cda: 80 93 c9 20 sts 0x20C9, r24 + 2cde: 8a 81 ldd r24, Y+2 ; 0x02 + 2ce0: 80 93 ca 20 sts 0x20CA, r24 + 2ce4: 8b 81 ldd r24, Y+3 ; 0x03 + 2ce6: 80 93 cb 20 sts 0x20CB, r24 + 2cea: 8c 81 ldd r24, Y+4 ; 0x04 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)); - 2ccc: 80 93 cc 20 sts 0x20CC, r24 - 2cd0: 89 ec ldi r24, 0xC9 ; 201 - 2cd2: 90 e2 ldi r25, 0x20 ; 32 - 2cd4: 60 e4 ldi r22, 0x40 ; 64 + 2cec: 80 93 cc 20 sts 0x20CC, r24 + 2cf0: 89 ec ldi r24, 0xC9 ; 201 + 2cf2: 90 e2 ldi r25, 0x20 ; 32 + 2cf4: 60 e4 ldi r22, 0x40 ; 64 MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - 2cd6: 70 e0 ldi r23, 0x00 ; 0 - 2cd8: 00 d6 rcall .+3072 ; 0x38da - 2cda: 80 91 c9 20 lds r24, 0x20C9 - 2cde: 80 93 cd 20 sts 0x20CD, r24 - 2ce2: 80 91 ca 20 lds r24, 0x20CA + 2cf6: 70 e0 ldi r23, 0x00 ; 0 + 2cf8: 00 d6 rcall .+3072 ; 0x38fa + 2cfa: 80 91 c9 20 lds r24, 0x20C9 + 2cfe: 80 93 cd 20 sts 0x20CD, r24 + 2d02: 80 91 ca 20 lds r24, 0x20CA MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); - 2ce6: 80 93 ce 20 sts 0x20CE, r24 - 2cea: 80 91 cb 20 lds r24, 0x20CB - 2cee: 80 93 cf 20 sts 0x20CF, r24 - 2cf2: 80 91 cc 20 lds r24, 0x20CC + 2d06: 80 93 ce 20 sts 0x20CE, r24 + 2d0a: 80 91 cb 20 lds r24, 0x20CB + 2d0e: 80 93 cf 20 sts 0x20CF, r24 + 2d12: 80 91 cc 20 lds r24, 0x20CC /* Precalculate the reader response from card-nonce */ for (uint8_t i=0; i - 2d04: 84 e0 ldi r24, 0x04 ; 4 - 2d06: 80 93 c5 20 sts 0x20C5, r24 - 2d0a: 89 81 ldd r24, Y+1 ; 0x01 + 2d16: 80 93 d0 20 sts 0x20D0, r24 + 2d1a: 8d ec ldi r24, 0xCD ; 205 + 2d1c: 90 e2 ldi r25, 0x20 ; 32 + 2d1e: 60 e2 ldi r22, 0x20 ; 32 + 2d20: 70 e0 ldi r23, 0x00 ; 0 + 2d22: eb d5 rcall .+3030 ; 0x38fa + 2d24: 84 e0 ldi r24, 0x04 ; 4 + 2d26: 80 93 c5 20 sts 0x20C5, r24 + 2d2a: 89 81 ldd r24, Y+1 ; 0x01 Crypto1PRNG(ReaderResponse, 64); - 2d0c: f7 01 movw r30, r14 - 2d0e: 80 83 st Z, r24 - 2d10: 8a 81 ldd r24, Y+2 ; 0x02 - 2d12: 81 83 std Z+1, r24 ; 0x01 - 2d14: 8b 81 ldd r24, Y+3 ; 0x03 - 2d16: 82 83 std Z+2, r24 ; 0x02 + 2d2c: f7 01 movw r30, r14 + 2d2e: 80 83 st Z, r24 + 2d30: 8a 81 ldd r24, Y+2 ; 0x02 + 2d32: 81 83 std Z+1, r24 ; 0x01 + 2d34: 8b 81 ldd r24, Y+3 ; 0x03 + 2d36: 82 83 std Z+2, r24 ; 0x02 /* Precalculate our response from the reader response */ for (uint8_t i=0; i - 2d2e: 80 e2 ldi r24, 0x20 ; 32 - 2d30: 90 e0 ldi r25, 0x00 ; 0 - 2d32: fb cd rjmp .-1034 ; 0x292a - 2d34: 60 91 d1 20 lds r22, 0x20D1 + 2d38: 8c 81 ldd r24, Y+4 ; 0x04 + 2d3a: 83 83 std Z+3, r24 ; 0x03 + 2d3c: ce 01 movw r24, r28 + 2d3e: 09 96 adiw r24, 0x09 ; 9 + 2d40: be 01 movw r22, r28 + 2d42: 6b 5f subi r22, 0xFB ; 251 + 2d44: 7f 4f sbci r23, 0xFF ; 255 + 2d46: ae 01 movw r20, r28 + 2d48: 4f 5f subi r20, 0xFF ; 255 + 2d4a: 5f 4f sbci r21, 0xFF ; 255 + 2d4c: 6c d3 rcall .+1752 ; 0x3426 + 2d4e: 80 e2 ldi r24, 0x20 ; 32 + 2d50: 90 e0 ldi r25, 0x00 ; 0 + 2d52: fb cd rjmp .-1034 ; 0x294a + 2d54: 60 91 d1 20 lds r22, 0x20D1 Crypto1PRNG(CardResponse, 32); - 2d38: 70 e0 ldi r23, 0x00 ; 0 - 2d3a: 62 95 swap r22 - 2d3c: 72 95 swap r23 - 2d3e: 70 7f andi r23, 0xF0 ; 240 - 2d40: 76 27 eor r23, r22 - 2d42: 60 7f andi r22, 0xF0 ; 240 + 2d58: 70 e0 ldi r23, 0x00 ; 0 + 2d5a: 62 95 swap r22 + 2d5c: 72 95 swap r23 + 2d5e: 70 7f andi r23, 0xF0 ; 240 + 2d60: 76 27 eor r23, r22 + 2d62: 60 7f andi r22, 0xF0 ; 240 /* Respond with the random card nonce and expect further authentication * form the reader in the next frame. */ State = STATE_AUTHING; - 2d44: 76 27 eor r23, r22 - 2d46: 82 ed ldi r24, 0xD2 ; 210 - 2d48: 90 e2 ldi r25, 0x20 ; 32 + 2d64: 76 27 eor r23, r22 + 2d66: 82 ed ldi r24, 0xD2 ; 210 + 2d68: 90 e2 ldi r25, 0x20 ; 32 for (uint8_t i=0; i - 2d52: 20 91 d2 20 lds r18, 0x20D2 - 2d56: 80 91 d6 20 lds r24, 0x20D6 - 2d5a: 80 95 com r24 + 2d6a: 40 e1 ldi r20, 0x10 ; 16 + 2d6c: 50 e0 ldi r21, 0x00 ; 0 + 2d6e: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2d72: 20 91 d2 20 lds r18, 0x20D2 + 2d76: 80 91 d6 20 lds r24, 0x20D6 + 2d7a: 80 95 com r24 /* Setup crypto1 cipher. Discard in-place encrypted CardNonce. */ Crypto1Setup(Key, Uid, CardNonce); - 2d5c: 28 17 cp r18, r24 - 2d5e: 09 f4 brne .+2 ; 0x2d62 - 2d60: d6 c0 rjmp .+428 ; 0x2f0e - 2d62: 97 d5 rcall .+2862 ; 0x3892 - 2d64: 96 e0 ldi r25, 0x06 ; 6 - 2d66: 98 27 eor r25, r24 - 2d68: d7 01 movw r26, r14 - 2d6a: 9c 93 st X, r25 - 2d6c: d9 cd rjmp .-1102 ; 0x2920 - 2d6e: 91 d5 rcall .+2850 ; 0x3892 + 2d7c: 28 17 cp r18, r24 + 2d7e: 09 f4 brne .+2 ; 0x2d82 + 2d80: d6 c0 rjmp .+428 ; 0x2f2e + 2d82: 97 d5 rcall .+2862 ; 0x38b2 + 2d84: 96 e0 ldi r25, 0x06 ; 6 + 2d86: 98 27 eor r25, r24 + 2d88: d7 01 movw r26, r14 + 2d8a: 9c 93 st X, r25 + 2d8c: d9 cd rjmp .-1102 ; 0x2940 + 2d8e: 91 d5 rcall .+2850 ; 0x38b2 return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE; - 2d70: 91 e0 ldi r25, 0x01 ; 1 - 2d72: 98 27 eor r25, r24 - 2d74: d7 01 movw r26, r14 + 2d90: 91 e0 ldi r25, 0x01 ; 1 + 2d92: 98 27 eor r25, r24 + 2d94: d7 01 movw r26, r14 * 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); - 2d76: 9c 93 st X, r25 - 2d78: d3 cd rjmp .-1114 ; 0x2920 - 2d7a: 60 91 d1 20 lds r22, 0x20D1 - 2d7e: 70 e0 ldi r23, 0x00 ; 0 - 2d80: 62 95 swap r22 - 2d82: 72 95 swap r23 - 2d84: 70 7f andi r23, 0xF0 ; 240 - 2d86: 76 27 eor r23, r22 - 2d88: 60 7f andi r22, 0xF0 ; 240 - 2d8a: 76 27 eor r23, r22 - 2d8c: c7 01 movw r24, r14 - 2d8e: 40 e1 ldi r20, 0x10 ; 16 - 2d90: 50 e0 ldi r21, 0x00 ; 0 - 2d92: 0e 94 a8 06 call 0xd50 ; 0xd50 + 2d96: 9c 93 st X, r25 + 2d98: d3 cd rjmp .-1114 ; 0x2940 + 2d9a: 60 91 d1 20 lds r22, 0x20D1 + 2d9e: 70 e0 ldi r23, 0x00 ; 0 + 2da0: 62 95 swap r22 + 2da2: 72 95 swap r23 + 2da4: 70 7f andi r23, 0xF0 ; 240 + 2da6: 76 27 eor r23, r22 + 2da8: 60 7f andi r22, 0xF0 ; 240 + 2daa: 76 27 eor r23, r22 + 2dac: c7 01 movw r24, r14 + 2dae: 40 e1 ldi r20, 0x10 ; 16 + 2db0: 50 e0 ldi r21, 0x00 ; 0 + 2db2: 0e 94 b8 06 call 0xd70 ; 0xd70 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]) - 2d96: 01 ce rjmp .-1022 ; 0x299a - 2d98: 7c d5 rcall .+2808 ; 0x3892 - 2d9a: 91 e0 ldi r25, 0x01 ; 1 - 2d9c: 98 27 eor r25, r24 - 2d9e: d7 01 movw r26, r14 - 2da0: 9c 93 st X, r25 - 2da2: 84 e0 ldi r24, 0x04 ; 4 + 2db6: 01 ce rjmp .-1022 ; 0x29ba + 2db8: 7c d5 rcall .+2808 ; 0x38b2 + 2dba: 91 e0 ldi r25, 0x01 ; 1 + 2dbc: 98 27 eor r25, r24 + 2dbe: d7 01 movw r26, r14 + 2dc0: 9c 93 st X, r25 + 2dc2: 84 e0 ldi r24, 0x04 ; 4 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(); - 2da4: 90 e0 ldi r25, 0x00 ; 0 - 2da6: c1 cd rjmp .-1150 ; 0x292a - 2da8: c7 01 movw r24, r14 - 2daa: 62 e0 ldi r22, 0x02 ; 2 - 2dac: 70 e0 ldi r23, 0x00 ; 0 - 2dae: 42 d2 rcall .+1156 ; 0x3234 - 2db0: 88 23 and r24, r24 + 2dc4: 90 e0 ldi r25, 0x00 ; 0 + 2dc6: c1 cd rjmp .-1150 ; 0x294a + 2dc8: c7 01 movw r24, r14 + 2dca: 62 e0 ldi r22, 0x02 ; 2 + 2dcc: 70 e0 ldi r23, 0x00 ; 0 + 2dce: 42 d2 rcall .+1156 ; 0x3254 + 2dd0: 88 23 and r24, r24 /* Silently ignore in ReadOnly mode */ } Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2db2: 91 f3 breq .-28 ; 0x2d98 - 2db4: d7 01 movw r26, r14 - 2db6: 11 96 adiw r26, 0x01 ; 1 - 2db8: 6c 91 ld r22, X - 2dba: 70 e0 ldi r23, 0x00 ; 0 - 2dbc: 62 95 swap r22 - 2dbe: 72 95 swap r23 + 2dd2: 91 f3 breq .-28 ; 0x2db8 + 2dd4: d7 01 movw r26, r14 + 2dd6: 11 96 adiw r26, 0x01 ; 1 + 2dd8: 6c 91 ld r22, X + 2dda: 70 e0 ldi r23, 0x00 ; 0 + 2ddc: 62 95 swap r22 + 2dde: 72 95 swap r23 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); - 2dc0: 70 7f andi r23, 0xF0 ; 240 - 2dc2: 76 27 eor r23, r22 - 2dc4: 60 7f andi r22, 0xF0 ; 240 - 2dc6: 76 27 eor r23, r22 - 2dc8: c7 01 movw r24, r14 - 2dca: 40 e1 ldi r20, 0x10 ; 16 - 2dcc: 50 e0 ldi r21, 0x00 ; 0 - 2dce: 0e 94 1d 06 call 0xc3a ; 0xc3a - 2dd2: c7 01 movw r24, r14 - 2dd4: 60 e1 ldi r22, 0x10 ; 16 - 2dd6: 70 e0 ldi r23, 0x00 ; 0 - 2dd8: ef d1 rcall .+990 ; 0x31b8 - 2dda: 87 01 movw r16, r14 - 2ddc: 30 e8 ldi r19, 0x80 ; 128 + 2de0: 70 7f andi r23, 0xF0 ; 240 + 2de2: 76 27 eor r23, r22 + 2de4: 60 7f andi r22, 0xF0 ; 240 + 2de6: 76 27 eor r23, r22 + 2de8: c7 01 movw r24, r14 + 2dea: 40 e1 ldi r20, 0x10 ; 16 + 2dec: 50 e0 ldi r21, 0x00 ; 0 + 2dee: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2df2: c7 01 movw r24, r14 + 2df4: 60 e1 ldi r22, 0x10 ; 16 + 2df6: 70 e0 ldi r23, 0x00 ; 0 + 2df8: ef d1 rcall .+990 ; 0x31d8 + 2dfa: 87 01 movw r16, r14 + 2dfc: 30 e8 ldi r19, 0x80 ; 128 * 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(); - 2dde: e3 2e mov r14, r19 - 2de0: f1 2c mov r15, r1 - 2de2: e0 0e add r14, r16 - 2de4: f1 1e adc r15, r17 - 2de6: 88 24 eor r8, r8 - 2de8: f8 01 movw r30, r16 + 2dfe: e3 2e mov r14, r19 + 2e00: f1 2c mov r15, r1 + 2e02: e0 0e add r14, r16 + 2e04: f1 1e adc r15, r17 + 2e06: 88 24 eor r8, r8 + 2e08: f8 01 movw r30, r16 return ACK_NAK_FRAME_SIZE; - 2dea: c0 80 ld r12, Z - 2dec: 11 d5 rcall .+2594 ; 0x3810 - 2dee: 8c 25 eor r24, r12 + 2e0a: c0 80 ld r12, Z + 2e0c: 11 d5 rcall .+2594 ; 0x3830 + 2e0e: 8c 25 eor r24, r12 * 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)) { - 2df0: d8 01 movw r26, r16 - 2df2: 8d 93 st X+, r24 - 2df4: 8d 01 movw r16, r26 - 2df6: 0c 2c mov r0, r12 - 2df8: c2 94 swap r12 - 2dfa: c0 24 eor r12, r0 - 2dfc: 0c 2c mov r0, r12 + 2e10: d8 01 movw r26, r16 + 2e12: 8d 93 st X+, r24 + 2e14: 8d 01 movw r16, r26 + 2e16: 0c 2c mov r0, r12 + 2e18: c2 94 swap r12 + 2e1a: c0 24 eor r12, r0 + 2e1c: 0c 2c mov r0, r12 /* Read command. Read data from memory and append CRCA. */ MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); - 2dfe: c6 94 lsr r12 - 2e00: c6 94 lsr r12 - 2e02: c0 24 eor r12, r0 - 2e04: cc d2 rcall .+1432 ; 0x339e - 2e06: 2c 2d mov r18, r12 - 2e08: 30 e0 ldi r19, 0x00 ; 0 - 2e0a: 2f 5f subi r18, 0xFF ; 255 - 2e0c: 3f 4f sbci r19, 0xFF ; 255 - 2e0e: 35 95 asr r19 - 2e10: 27 95 ror r18 - 2e12: 91 e0 ldi r25, 0x01 ; 1 - 2e14: 20 fd sbrc r18, 0 - 2e16: 90 e0 ldi r25, 0x00 ; 0 - 2e18: 98 27 eor r25, r24 - 2e1a: f7 01 movw r30, r14 + 2e1e: c6 94 lsr r12 + 2e20: c6 94 lsr r12 + 2e22: c0 24 eor r12, r0 + 2e24: cc d2 rcall .+1432 ; 0x33be + 2e26: 2c 2d mov r18, r12 + 2e28: 30 e0 ldi r19, 0x00 ; 0 + 2e2a: 2f 5f subi r18, 0xFF ; 255 + 2e2c: 3f 4f sbci r19, 0xFF ; 255 + 2e2e: 35 95 asr r19 + 2e30: 27 95 ror r18 + 2e32: 91 e0 ldi r25, 0x01 ; 1 + 2e34: 20 fd sbrc r18, 0 + 2e36: 90 e0 ldi r25, 0x00 ; 0 + 2e38: 98 27 eor r25, r24 + 2e3a: f7 01 movw r30, r14 ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); - 2e1c: 91 93 st Z+, r25 - 2e1e: 7f 01 movw r14, r30 - 2e20: 83 94 inc r8 - 2e22: f2 e1 ldi r31, 0x12 ; 18 - 2e24: 8f 16 cp r8, r31 - 2e26: 01 f7 brne .-64 ; 0x2de8 + 2e3c: 91 93 st Z+, r25 + 2e3e: 7f 01 movw r14, r30 + 2e40: 83 94 inc r8 + 2e42: f2 e1 ldi r31, 0x12 ; 18 + 2e44: 8f 16 cp r8, r31 + 2e46: 01 f7 brne .-64 ; 0x2e08 void MifareClassicAppTask(void) { } uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) - 2e28: 80 e9 ldi r24, 0x90 ; 144 - 2e2a: 90 e1 ldi r25, 0x10 ; 16 - 2e2c: 7e cd rjmp .-1284 ; 0x292a - 2e2e: ce 01 movw r24, r28 - 2e30: 05 96 adiw r24, 0x05 ; 5 + 2e48: 80 e9 ldi r24, 0x90 ; 144 + 2e4a: 90 e1 ldi r25, 0x10 ; 16 + 2e4c: 7e cd rjmp .-1284 ; 0x294a + 2e4e: ce 01 movw r24, r28 + 2e50: 05 96 adiw r24, 0x05 ; 5 /* 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++) { - 2e32: 60 e0 ldi r22, 0x00 ; 0 + 2e52: 60 e0 ldi r22, 0x00 ; 0 uint8_t Plain = Buffer[i]; - 2e34: 70 e0 ldi r23, 0x00 ; 0 - 2e36: 44 e0 ldi r20, 0x04 ; 4 + 2e54: 70 e0 ldi r23, 0x00 ; 0 + 2e56: 44 e0 ldi r20, 0x04 ; 4 Buffer[i] = Plain ^ Crypto1Byte(); - 2e38: 50 e0 ldi r21, 0x00 ; 0 - 2e3a: 0e 94 1d 06 call 0xc3a ; 0xc3a - 2e3e: 90 91 c8 20 lds r25, 0x20C8 - 2e42: d7 01 movw r26, r14 + 2e58: 50 e0 ldi r21, 0x00 ; 0 + 2e5a: 0e 94 2d 06 call 0xc5a ; 0xc5a + 2e5e: 90 91 c8 20 lds r25, 0x20C8 + 2e62: d7 01 movw r26, r14 Buffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = ODD_PARITY(Plain) ^ Crypto1FilterOutput(); - 2e44: 11 96 adiw r26, 0x01 ; 1 - 2e46: 8c 91 ld r24, X - 2e48: 11 97 sbiw r26, 0x01 ; 1 - 2e4a: 80 32 cpi r24, 0x20 ; 32 - 2e4c: 09 f4 brne .+2 ; 0x2e50 - 2e4e: 77 c1 rjmp .+750 ; 0x313e <__stack+0x13f> - 2e50: 80 37 cpi r24, 0x70 ; 112 - 2e52: 09 f0 breq .+2 ; 0x2e56 - 2e54: 86 cd rjmp .-1268 ; 0x2962 - 2e56: d7 01 movw r26, r14 - 2e58: 12 96 adiw r26, 0x02 ; 2 - 2e5a: 2c 91 ld r18, X - 2e5c: 12 97 sbiw r26, 0x02 ; 2 - 2e5e: 8d 81 ldd r24, Y+5 ; 0x05 - 2e60: 28 17 cp r18, r24 - 2e62: 09 f0 breq .+2 ; 0x2e66 - 2e64: 7e cd rjmp .-1284 ; 0x2962 - 2e66: 13 96 adiw r26, 0x03 ; 3 - 2e68: 2c 91 ld r18, X - 2e6a: 13 97 sbiw r26, 0x03 ; 3 - 2e6c: 8e 81 ldd r24, Y+6 ; 0x06 - 2e6e: 28 17 cp r18, r24 + 2e64: 11 96 adiw r26, 0x01 ; 1 + 2e66: 8c 91 ld r24, X + 2e68: 11 97 sbiw r26, 0x01 ; 1 + 2e6a: 80 32 cpi r24, 0x20 ; 32 + 2e6c: 09 f4 brne .+2 ; 0x2e70 + 2e6e: 77 c1 rjmp .+750 ; 0x315e <__stack+0x15f> + 2e70: 80 37 cpi r24, 0x70 ; 112 + 2e72: 09 f0 breq .+2 ; 0x2e76 + 2e74: 86 cd rjmp .-1268 ; 0x2982 + 2e76: d7 01 movw r26, r14 + 2e78: 12 96 adiw r26, 0x02 ; 2 + 2e7a: 2c 91 ld r18, X + 2e7c: 12 97 sbiw r26, 0x02 ; 2 + 2e7e: 8d 81 ldd r24, Y+5 ; 0x05 + 2e80: 28 17 cp r18, r24 + 2e82: 09 f0 breq .+2 ; 0x2e86 + 2e84: 7e cd rjmp .-1284 ; 0x2982 + 2e86: 13 96 adiw r26, 0x03 ; 3 + 2e88: 2c 91 ld r18, X + 2e8a: 13 97 sbiw r26, 0x03 ; 3 + 2e8c: 8e 81 ldd r24, Y+6 ; 0x06 + 2e8e: 28 17 cp r18, r24 /* 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++) { - 2e70: 09 f0 breq .+2 ; 0x2e74 - 2e72: 77 cd rjmp .-1298 ; 0x2962 - 2e74: 14 96 adiw r26, 0x04 ; 4 - 2e76: 2c 91 ld r18, X + 2e90: 09 f0 breq .+2 ; 0x2e94 + 2e92: 77 cd rjmp .-1298 ; 0x2982 + 2e94: 14 96 adiw r26, 0x04 ; 4 + 2e96: 2c 91 ld r18, X 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 ) - 2e78: 14 97 sbiw r26, 0x04 ; 4 - 2e7a: 8f 81 ldd r24, Y+7 ; 0x07 - 2e7c: 28 17 cp r18, r24 + 2e98: 14 97 sbiw r26, 0x04 ; 4 + 2e9a: 8f 81 ldd r24, Y+7 ; 0x07 + 2e9c: 28 17 cp r18, r24 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); - 2e7e: 09 f0 breq .+2 ; 0x2e82 - 2e80: 70 cd rjmp .-1312 ; 0x2962 - 2e82: 15 96 adiw r26, 0x05 ; 5 - 2e84: 2c 91 ld r18, X - 2e86: 15 97 sbiw r26, 0x05 ; 5 - 2e88: 88 85 ldd r24, Y+8 ; 0x08 - 2e8a: 28 17 cp r18, r24 - 2e8c: 09 f0 breq .+2 ; 0x2e90 + 2e9e: 09 f0 breq .+2 ; 0x2ea2 + 2ea0: 70 cd rjmp .-1312 ; 0x2982 + 2ea2: 15 96 adiw r26, 0x05 ; 5 + 2ea4: 2c 91 ld r18, X + 2ea6: 15 97 sbiw r26, 0x05 ; 5 + 2ea8: 88 85 ldd r24, Y+8 ; 0x08 + 2eaa: 28 17 cp r18, r24 + 2eac: 09 f0 breq .+2 ; 0x2eb0 if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { - 2e8e: 69 cd rjmp .-1326 ; 0x2962 - 2e90: 9c 93 st X, r25 + 2eae: 69 cd rjmp .-1326 ; 0x2982 + 2eb0: 9c 93 st X, r25 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) { - 2e92: c7 01 movw r24, r14 - 2e94: 61 e0 ldi r22, 0x01 ; 1 - 2e96: 70 e0 ldi r23, 0x00 ; 0 - 2e98: 8f d1 rcall .+798 ; 0x31b8 - 2e9a: 83 e0 ldi r24, 0x03 ; 3 - 2e9c: 80 93 c5 20 sts 0x20C5, r24 - 2ea0: 88 e1 ldi r24, 0x18 ; 24 - 2ea2: 90 e0 ldi r25, 0x00 ; 0 - 2ea4: 42 cd rjmp .-1404 ; 0x292a + 2eb2: c7 01 movw r24, r14 + 2eb4: 61 e0 ldi r22, 0x01 ; 1 + 2eb6: 70 e0 ldi r23, 0x00 ; 0 + 2eb8: 8f d1 rcall .+798 ; 0x31d8 + 2eba: 83 e0 ldi r24, 0x03 ; 3 + 2ebc: 80 93 c5 20 sts 0x20C5, r24 + 2ec0: 88 e1 ldi r24, 0x18 ; 24 + 2ec2: 90 e0 ldi r25, 0x00 ; 0 + 2ec4: 42 cd rjmp .-1404 ; 0x294a return false; case ISO14443A_NVB_AC_END: /* End of anticollision procedure. * Send SAK CLn if we are selected. */ if ( (DataPtr[2] == UidCL[0]) && - 2ea6: c7 01 movw r24, r14 - 2ea8: 62 e0 ldi r22, 0x02 ; 2 - 2eaa: 70 e0 ldi r23, 0x00 ; 0 - 2eac: c3 d1 rcall .+902 ; 0x3234 - 2eae: 88 23 and r24, r24 - 2eb0: 79 f0 breq .+30 ; 0x2ed0 - 2eb2: f7 01 movw r30, r14 - 2eb4: 81 81 ldd r24, Z+1 ; 0x01 - 2eb6: 80 93 d1 20 sts 0x20D1, r24 - 2eba: 86 e0 ldi r24, 0x06 ; 6 - 2ebc: 80 93 c5 20 sts 0x20C5, r24 - 2ec0: e8 d4 rcall .+2512 ; 0x3892 - 2ec2: 9a e0 ldi r25, 0x0A ; 10 + 2ec6: c7 01 movw r24, r14 + 2ec8: 62 e0 ldi r22, 0x02 ; 2 + 2eca: 70 e0 ldi r23, 0x00 ; 0 + 2ecc: c3 d1 rcall .+902 ; 0x3254 + 2ece: 88 23 and r24, r24 + 2ed0: 79 f0 breq .+30 ; 0x2ef0 + 2ed2: f7 01 movw r30, r14 + 2ed4: 81 81 ldd r24, Z+1 ; 0x01 + 2ed6: 80 93 d1 20 sts 0x20D1, r24 + 2eda: 86 e0 ldi r24, 0x06 ; 6 + 2edc: 80 93 c5 20 sts 0x20C5, r24 + 2ee0: e8 d4 rcall .+2512 ; 0x38b2 + 2ee2: 9a e0 ldi r25, 0x0A ; 10 (DataPtr[3] == UidCL[1]) && - 2ec4: 98 27 eor r25, r24 - 2ec6: d7 01 movw r26, r14 - 2ec8: 9c 93 st X, r25 - 2eca: 84 e0 ldi r24, 0x04 ; 4 - 2ecc: 90 e0 ldi r25, 0x00 ; 0 - 2ece: 2d cd rjmp .-1446 ; 0x292a - 2ed0: e0 d4 rcall .+2496 ; 0x3892 + 2ee4: 98 27 eor r25, r24 + 2ee6: d7 01 movw r26, r14 + 2ee8: 9c 93 st X, r25 + 2eea: 84 e0 ldi r24, 0x04 ; 4 + 2eec: 90 e0 ldi r25, 0x00 ; 0 + 2eee: 2d cd rjmp .-1446 ; 0x294a + 2ef0: e0 d4 rcall .+2496 ; 0x38b2 (DataPtr[4] == UidCL[2]) && - 2ed2: 91 e0 ldi r25, 0x01 ; 1 - 2ed4: 98 27 eor r25, r24 - 2ed6: f7 01 movw r30, r14 - 2ed8: 90 83 st Z, r25 - 2eda: 84 e0 ldi r24, 0x04 ; 4 - 2edc: 90 e0 ldi r25, 0x00 ; 0 - 2ede: 25 cd rjmp .-1462 ; 0x292a + 2ef2: 91 e0 ldi r25, 0x01 ; 1 + 2ef4: 98 27 eor r25, r24 + 2ef6: f7 01 movw r30, r14 + 2ef8: 90 83 st Z, r25 + 2efa: 84 e0 ldi r24, 0x04 ; 4 + 2efc: 90 e0 ldi r25, 0x00 ; 0 + 2efe: 25 cd rjmp .-1462 ; 0x294a (DataPtr[5] == UidCL[3]) ) { DataPtr[0] = SAKValue; - 2ee0: c7 01 movw r24, r14 + 2f00: c7 01 movw r24, r14 ISO14443AAppendCRCA(Buffer, 1); - 2ee2: 62 e0 ldi r22, 0x02 ; 2 - 2ee4: 70 e0 ldi r23, 0x00 ; 0 - 2ee6: a6 d1 rcall .+844 ; 0x3234 - 2ee8: 88 23 and r24, r24 - 2eea: 09 f4 brne .+2 ; 0x2eee + 2f02: 62 e0 ldi r22, 0x02 ; 2 + 2f04: 70 e0 ldi r23, 0x00 ; 0 + 2f06: a6 d1 rcall .+844 ; 0x3254 + 2f08: 88 23 and r24, r24 + 2f0a: 09 f4 brne .+2 ; 0x2f0e State = STATE_ACTIVE; - 2eec: 55 cf rjmp .-342 ; 0x2d98 - 2eee: d7 01 movw r26, r14 - 2ef0: 11 96 adiw r26, 0x01 ; 1 + 2f0c: 55 cf rjmp .-342 ; 0x2db8 + 2f0e: d7 01 movw r26, r14 + 2f10: 11 96 adiw r26, 0x01 ; 1 *BitCount = ISO14443A_SAK_FRAME_SIZE; - 2ef2: 8c 91 ld r24, X - 2ef4: 80 93 d1 20 sts 0x20D1, r24 + 2f12: 8c 91 ld r24, X + 2f14: 80 93 d1 20 sts 0x20D1, r24 } 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)) { - 2ef8: 88 e0 ldi r24, 0x08 ; 8 - 2efa: 80 93 c5 20 sts 0x20C5, r24 - 2efe: c9 d4 rcall .+2450 ; 0x3892 - 2f00: 9a e0 ldi r25, 0x0A ; 10 - 2f02: 98 27 eor r25, r24 - 2f04: f7 01 movw r30, r14 + 2f18: 88 e0 ldi r24, 0x08 ; 8 + 2f1a: 80 93 c5 20 sts 0x20C5, r24 + 2f1e: c9 d4 rcall .+2450 ; 0x38b2 + 2f20: 9a e0 ldi r25, 0x0A ; 10 + 2f22: 98 27 eor r25, r24 + 2f24: f7 01 movw r30, r14 /* Write command. Store the address and prepare for the upcoming data. * Respond with ACK. */ CurrentAddress = Buffer[1]; - 2f06: 90 83 st Z, r25 - 2f08: 84 e0 ldi r24, 0x04 ; 4 - 2f0a: 90 e0 ldi r25, 0x00 ; 0 - 2f0c: 0e cd rjmp .-1508 ; 0x292a + 2f26: 90 83 st Z, r25 + 2f28: 84 e0 ldi r24, 0x04 ; 4 + 2f2a: 90 e0 ldi r25, 0x00 ; 0 + 2f2c: 0e cd rjmp .-1508 ; 0x294a State = STATE_WRITE; - 2f0e: 80 91 da 20 lds r24, 0x20DA + 2f2e: 80 91 da 20 lds r24, 0x20DA } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_INCREMENT) { if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { CurrentAddress = Buffer[1]; State = STATE_INCREMENT; - 2f12: 28 17 cp r18, r24 + 2f32: 28 17 cp r18, r24 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 2f14: 09 f0 breq .+2 ; 0x2f18 - 2f16: 25 cf rjmp .-438 ; 0x2d62 - 2f18: 30 91 d3 20 lds r19, 0x20D3 - 2f1c: 80 91 d7 20 lds r24, 0x20D7 + 2f34: 09 f0 breq .+2 ; 0x2f38 + 2f36: 25 cf rjmp .-438 ; 0x2d82 + 2f38: 30 91 d3 20 lds r19, 0x20D3 + 2f3c: 80 91 d7 20 lds r24, 0x20D7 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; - 2f20: 80 95 com r24 - 2f22: 38 17 cp r19, r24 - 2f24: 09 f0 breq .+2 ; 0x2f28 + 2f40: 80 95 com r24 + 2f42: 38 17 cp r19, r24 + 2f44: 09 f0 breq .+2 ; 0x2f48 /* In read only mode, silently ignore the write */ } Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); - 2f26: 1d cf rjmp .-454 ; 0x2d62 - 2f28: 80 91 db 20 lds r24, 0x20DB - 2f2c: 38 17 cp r19, r24 - 2f2e: 09 f0 breq .+2 ; 0x2f32 - 2f30: 18 cf rjmp .-464 ; 0x2d62 + 2f46: 1d cf rjmp .-454 ; 0x2d82 + 2f48: 80 91 db 20 lds r24, 0x20DB + 2f4c: 38 17 cp r19, r24 + 2f4e: 09 f0 breq .+2 ; 0x2f52 + 2f50: 18 cf rjmp .-464 ; 0x2d82 } return ACK_NAK_FRAME_SIZE; - 2f32: 40 91 d4 20 lds r20, 0x20D4 - 2f36: 80 91 d8 20 lds r24, 0x20D8 + 2f52: 40 91 d4 20 lds r20, 0x20D4 + 2f56: 80 91 d8 20 lds r24, 0x20D8 } 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)) { - 2f3a: 80 95 com r24 - 2f3c: 48 17 cp r20, r24 - 2f3e: 09 f0 breq .+2 ; 0x2f42 - 2f40: 10 cf rjmp .-480 ; 0x2d62 - 2f42: 80 91 dc 20 lds r24, 0x20DC - 2f46: 48 17 cp r20, r24 + 2f5a: 80 95 com r24 + 2f5c: 48 17 cp r20, r24 + 2f5e: 09 f0 breq .+2 ; 0x2f62 + 2f60: 10 cf rjmp .-480 ; 0x2d82 + 2f62: 80 91 dc 20 lds r24, 0x20DC + 2f66: 48 17 cp r20, r24 CurrentAddress = Buffer[1]; - 2f48: 09 f0 breq .+2 ; 0x2f4c - 2f4a: 0b cf rjmp .-490 ; 0x2d62 - 2f4c: e0 91 d5 20 lds r30, 0x20D5 - 2f50: 80 91 d9 20 lds r24, 0x20D9 + 2f68: 09 f0 breq .+2 ; 0x2f6c + 2f6a: 0b cf rjmp .-490 ; 0x2d82 + 2f6c: e0 91 d5 20 lds r30, 0x20D5 + 2f70: 80 91 d9 20 lds r24, 0x20D9 } return ACK_NAK_FRAME_SIZE; } else if (Buffer[0] == CMD_RESTORE) { if (ISO14443ACheckCRCA(Buffer, CMD_DECREMENT_FRAME_SIZE)) { CurrentAddress = Buffer[1]; State = STATE_RESTORE; - 2f54: 80 95 com r24 - 2f56: e8 17 cp r30, r24 + 2f74: 80 95 com r24 + 2f76: e8 17 cp r30, r24 Buffer[0] = ACK_VALUE ^ Crypto1Nibble(); - 2f58: 09 f0 breq .+2 ; 0x2f5c - 2f5a: 03 cf rjmp .-506 ; 0x2d62 - 2f5c: 80 91 dd 20 lds r24, 0x20DD - 2f60: e8 17 cp r30, r24 - 2f62: 09 f0 breq .+2 ; 0x2f66 + 2f78: 09 f0 breq .+2 ; 0x2f7c + 2f7a: 03 cf rjmp .-506 ; 0x2d82 + 2f7c: 80 91 dd 20 lds r24, 0x20DD + 2f80: e8 17 cp r30, r24 + 2f82: 09 f0 breq .+2 ; 0x2f86 } else { Buffer[0] = NAK_CRC_ERROR ^ Crypto1Nibble(); } return ACK_NAK_FRAME_SIZE; - 2f64: fe ce rjmp .-516 ; 0x2d62 - 2f66: 90 91 de 20 lds r25, 0x20DE + 2f84: fe ce rjmp .-516 ; 0x2d82 + 2f86: 90 91 de 20 lds r25, 0x20DE 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]) - 2f6a: 80 91 df 20 lds r24, 0x20DF - 2f6e: 80 95 com r24 - 2f70: 98 17 cp r25, r24 - 2f72: 09 f0 breq .+2 ; 0x2f76 + 2f8a: 80 91 df 20 lds r24, 0x20DF + 2f8e: 80 95 com r24 + 2f90: 98 17 cp r25, r24 + 2f92: 09 f0 breq .+2 ; 0x2f96 && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) - 2f74: f6 ce rjmp .-532 ; 0x2d62 - 2f76: 80 91 e0 20 lds r24, 0x20E0 - 2f7a: 98 17 cp r25, r24 - 2f7c: 09 f0 breq .+2 ; 0x2f80 - 2f7e: f1 ce rjmp .-542 ; 0x2d62 - 2f80: 80 91 e1 20 lds r24, 0x20E1 - 2f84: 80 95 com r24 - 2f86: 98 17 cp r25, r24 - 2f88: 09 f0 breq .+2 ; 0x2f8c - 2f8a: eb ce rjmp .-554 ; 0x2d62 - 2f8c: d7 01 movw r26, r14 + 2f94: f6 ce rjmp .-532 ; 0x2d82 + 2f96: 80 91 e0 20 lds r24, 0x20E0 + 2f9a: 98 17 cp r25, r24 + 2f9c: 09 f0 breq .+2 ; 0x2fa0 + 2f9e: f1 ce rjmp .-542 ; 0x2d82 + 2fa0: 80 91 e1 20 lds r24, 0x20E1 + 2fa4: 80 95 com r24 + 2fa6: 98 17 cp r25, r24 + 2fa8: 09 f0 breq .+2 ; 0x2fac + 2faa: eb ce rjmp .-554 ; 0x2d82 + 2fac: d7 01 movw r26, r14 && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) - 2f8e: 11 96 adiw r26, 0x01 ; 1 - 2f90: 8c 90 ld r8, X - 2f92: 11 97 sbiw r26, 0x01 ; 1 - 2f94: 99 24 eor r9, r9 - 2f96: aa 24 eor r10, r10 - 2f98: bb 24 eor r11, r11 - 2f9a: ba 2c mov r11, r10 - 2f9c: a9 2c mov r10, r9 - 2f9e: 98 2c mov r9, r8 - 2fa0: 88 24 eor r8, r8 - 2fa2: 12 96 adiw r26, 0x02 ; 2 - 2fa4: 8c 91 ld r24, X - 2fa6: 90 e0 ldi r25, 0x00 ; 0 + 2fae: 11 96 adiw r26, 0x01 ; 1 + 2fb0: 8c 90 ld r8, X + 2fb2: 11 97 sbiw r26, 0x01 ; 1 + 2fb4: 99 24 eor r9, r9 + 2fb6: aa 24 eor r10, r10 + 2fb8: bb 24 eor r11, r11 + 2fba: ba 2c mov r11, r10 + 2fbc: a9 2c mov r10, r9 + 2fbe: 98 2c mov r9, r8 + 2fc0: 88 24 eor r8, r8 + 2fc2: 12 96 adiw r26, 0x02 ; 2 + 2fc4: 8c 91 ld r24, X + 2fc6: 90 e0 ldi r25, 0x00 ; 0 && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) - 2fa8: a0 e0 ldi r26, 0x00 ; 0 - 2faa: b0 e0 ldi r27, 0x00 ; 0 - 2fac: dc 01 movw r26, r24 - 2fae: 99 27 eor r25, r25 - 2fb0: 88 27 eor r24, r24 - 2fb2: 88 2a or r8, r24 - 2fb4: 99 2a or r9, r25 - 2fb6: aa 2a or r10, r26 - 2fb8: bb 2a or r11, r27 - 2fba: d7 01 movw r26, r14 - 2fbc: 8c 91 ld r24, X - 2fbe: 90 e0 ldi r25, 0x00 ; 0 - 2fc0: a0 e0 ldi r26, 0x00 ; 0 + 2fc8: a0 e0 ldi r26, 0x00 ; 0 + 2fca: b0 e0 ldi r27, 0x00 ; 0 + 2fcc: dc 01 movw r26, r24 + 2fce: 99 27 eor r25, r25 + 2fd0: 88 27 eor r24, r24 + 2fd2: 88 2a or r8, r24 + 2fd4: 99 2a or r9, r25 + 2fd6: aa 2a or r10, r26 + 2fd8: bb 2a or r11, r27 + 2fda: d7 01 movw r26, r14 + 2fdc: 8c 91 ld r24, X + 2fde: 90 e0 ldi r25, 0x00 ; 0 + 2fe0: a0 e0 ldi r26, 0x00 ; 0 && (Block[12] == (uint8_t) ~Block[13]) - 2fc2: b0 e0 ldi r27, 0x00 ; 0 - 2fc4: 88 2a or r8, r24 - 2fc6: 99 2a or r9, r25 - 2fc8: aa 2a or r10, r26 - 2fca: bb 2a or r11, r27 - 2fcc: d7 01 movw r26, r14 - 2fce: 13 96 adiw r26, 0x03 ; 3 - 2fd0: cc 90 ld r12, X + 2fe2: b0 e0 ldi r27, 0x00 ; 0 + 2fe4: 88 2a or r8, r24 + 2fe6: 99 2a or r9, r25 + 2fe8: aa 2a or r10, r26 + 2fea: bb 2a or r11, r27 + 2fec: d7 01 movw r26, r14 + 2fee: 13 96 adiw r26, 0x03 ; 3 + 2ff0: cc 90 ld r12, X && (Block[12] == Block[14]) - 2fd2: dd 24 eor r13, r13 - 2fd4: ee 24 eor r14, r14 - 2fd6: ff 24 eor r15, r15 - 2fd8: fc 2c mov r15, r12 - 2fda: ee 24 eor r14, r14 + 2ff2: dd 24 eor r13, r13 + 2ff4: ee 24 eor r14, r14 + 2ff6: ff 24 eor r15, r15 + 2ff8: fc 2c mov r15, r12 + 2ffa: ee 24 eor r14, r14 && (Block[14] == (uint8_t) ~Block[15])) { - 2fdc: dd 24 eor r13, r13 - 2fde: cc 24 eor r12, r12 - 2fe0: 8c 28 or r8, r12 - 2fe2: 9d 28 or r9, r13 - 2fe4: ae 28 or r10, r14 - 2fe6: bf 28 or r11, r15 + 2ffc: dd 24 eor r13, r13 + 2ffe: cc 24 eor r12, r12 + 3000: 8c 28 or r8, r12 + 3002: 9d 28 or r9, r13 + 3004: ae 28 or r10, r14 + 3006: bf 28 or r11, r15 INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); *Value |= ((uint32_t) Block[1] << 8); - 2fe8: 83 2f mov r24, r19 - 2fea: 90 e0 ldi r25, 0x00 ; 0 - 2fec: a0 e0 ldi r26, 0x00 ; 0 - 2fee: b0 e0 ldi r27, 0x00 ; 0 - 2ff0: ba 2f mov r27, r26 - 2ff2: a9 2f mov r26, r25 - 2ff4: 98 2f mov r25, r24 - 2ff6: 88 27 eor r24, r24 - 2ff8: 50 e0 ldi r21, 0x00 ; 0 - 2ffa: 60 e0 ldi r22, 0x00 ; 0 - 2ffc: 70 e0 ldi r23, 0x00 ; 0 + 3008: 83 2f mov r24, r19 + 300a: 90 e0 ldi r25, 0x00 ; 0 + 300c: a0 e0 ldi r26, 0x00 ; 0 + 300e: b0 e0 ldi r27, 0x00 ; 0 + 3010: ba 2f mov r27, r26 + 3012: a9 2f mov r26, r25 + 3014: 98 2f mov r25, r24 + 3016: 88 27 eor r24, r24 + 3018: 50 e0 ldi r21, 0x00 ; 0 + 301a: 60 e0 ldi r22, 0x00 ; 0 + 301c: 70 e0 ldi r23, 0x00 ; 0 *Value |= ((uint32_t) Block[2] << 16); - 2ffe: ba 01 movw r22, r20 - 3000: 55 27 eor r21, r21 - 3002: 44 27 eor r20, r20 - 3004: 84 2b or r24, r20 - 3006: 95 2b or r25, r21 - 3008: a6 2b or r26, r22 - 300a: b7 2b or r27, r23 - 300c: 30 e0 ldi r19, 0x00 ; 0 + 301e: ba 01 movw r22, r20 + 3020: 55 27 eor r21, r21 + 3022: 44 27 eor r20, r20 + 3024: 84 2b or r24, r20 + 3026: 95 2b or r25, r21 + 3028: a6 2b or r26, r22 + 302a: b7 2b or r27, r23 + 302c: 30 e0 ldi r19, 0x00 ; 0 INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); *Value |= ((uint32_t) Block[1] << 8); - 300e: 40 e0 ldi r20, 0x00 ; 0 - 3010: 50 e0 ldi r21, 0x00 ; 0 - 3012: 82 2b or r24, r18 - 3014: 93 2b or r25, r19 + 302e: 40 e0 ldi r20, 0x00 ; 0 + 3030: 50 e0 ldi r21, 0x00 ; 0 + 3032: 82 2b or r24, r18 + 3034: 93 2b or r25, r19 } INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); - 3016: a4 2b or r26, r20 - 3018: b5 2b or r27, r21 - 301a: 4e 2f mov r20, r30 - 301c: 50 e0 ldi r21, 0x00 ; 0 - 301e: 60 e0 ldi r22, 0x00 ; 0 + 3036: a4 2b or r26, r20 + 3038: b5 2b or r27, r21 + 303a: 4e 2f mov r20, r30 + 303c: 50 e0 ldi r21, 0x00 ; 0 + 303e: 60 e0 ldi r22, 0x00 ; 0 *Value |= ((uint32_t) Block[1] << 8); *Value |= ((uint32_t) Block[2] << 16); - 3020: 70 e0 ldi r23, 0x00 ; 0 - 3022: 74 2f mov r23, r20 - 3024: 66 27 eor r22, r22 - 3026: 55 27 eor r21, r21 + 3040: 70 e0 ldi r23, 0x00 ; 0 + 3042: 74 2f mov r23, r20 + 3044: 66 27 eor r22, r22 + 3046: 55 27 eor r21, r21 *Value |= ((uint32_t) Block[3] << 24); - 3028: 44 27 eor r20, r20 - 302a: 84 2b or r24, r20 - 302c: 95 2b or r25, r21 - 302e: a6 2b or r26, r22 - 3030: b7 2b or r27, r23 - 3032: 20 91 c5 20 lds r18, 0x20C5 - 3036: 28 30 cpi r18, 0x08 ; 8 - 3038: 09 f4 brne .+2 ; 0x303c <__stack+0x3d> - 303a: 6f c0 rjmp .+222 ; 0x311a <__stack+0x11b> - 303c: 27 30 cpi r18, 0x07 ; 7 - 303e: 21 f4 brne .+8 ; 0x3048 <__stack+0x49> - 3040: 88 0d add r24, r8 - 3042: 99 1d adc r25, r9 + 3048: 44 27 eor r20, r20 + 304a: 84 2b or r24, r20 + 304c: 95 2b or r25, r21 + 304e: a6 2b or r26, r22 + 3050: b7 2b or r27, r23 + 3052: 20 91 c5 20 lds r18, 0x20C5 + 3056: 28 30 cpi r18, 0x08 ; 8 + 3058: 09 f4 brne .+2 ; 0x305c <__stack+0x5d> + 305a: 6f c0 rjmp .+222 ; 0x313a <__stack+0x13b> + 305c: 27 30 cpi r18, 0x07 ; 7 + 305e: 21 f4 brne .+8 ; 0x3068 <__stack+0x69> + 3060: 88 0d add r24, r8 + 3062: 99 1d adc r25, r9 INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); *Value |= ((uint32_t) Block[1] << 8); - 3044: aa 1d adc r26, r10 - 3046: bb 1d adc r27, r11 - 3048: 80 93 d2 20 sts 0x20D2, r24 - 304c: 09 2f mov r16, r25 - 304e: 1a 2f mov r17, r26 - 3050: 2b 2f mov r18, r27 - 3052: 33 27 eor r19, r19 + 3064: aa 1d adc r26, r10 + 3066: bb 1d adc r27, r11 + 3068: 80 93 d2 20 sts 0x20D2, r24 + 306c: 09 2f mov r16, r25 + 306e: 1a 2f mov r17, r26 + 3070: 2b 2f mov r18, r27 + 3072: 33 27 eor r19, r19 *Value |= ((uint32_t) Block[2] << 16); - 3054: 00 93 d3 20 sts 0x20D3, r16 - 3058: ad 01 movw r20, r26 - 305a: 66 27 eor r22, r22 - 305c: 77 27 eor r23, r23 - 305e: 40 93 d4 20 sts 0x20D4, r20 + 3074: 00 93 d3 20 sts 0x20D3, r16 + 3078: ad 01 movw r20, r26 + 307a: 66 27 eor r22, r22 + 307c: 77 27 eor r23, r23 + 307e: 40 93 d4 20 sts 0x20D4, r20 INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); *Value |= ((uint32_t) Block[1] << 8); - 3062: cb 2e mov r12, r27 - 3064: dd 24 eor r13, r13 - 3066: ee 24 eor r14, r14 + 3082: cb 2e mov r12, r27 + 3084: dd 24 eor r13, r13 + 3086: ee 24 eor r14, r14 } INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) { *Value = 0; *Value |= ((uint32_t) Block[0] << 0); - 3068: ff 24 eor r15, r15 - 306a: c0 92 d5 20 sts 0x20D5, r12 + 3088: ff 24 eor r15, r15 + 308a: c0 92 d5 20 sts 0x20D5, r12 *Value |= ((uint32_t) Block[1] << 8); *Value |= ((uint32_t) Block[2] << 16); - 306e: e8 2f mov r30, r24 - 3070: e0 95 com r30 - 3072: e0 93 d6 20 sts 0x20D6, r30 + 308e: e8 2f mov r30, r24 + 3090: e0 95 com r30 + 3092: e0 93 d6 20 sts 0x20D6, r30 *Value |= ((uint32_t) Block[3] << 24); - 3076: e0 2f mov r30, r16 - 3078: e0 95 com r30 - 307a: e0 93 d7 20 sts 0x20D7, r30 - 307e: e4 2f mov r30, r20 - 3080: e0 95 com r30 - 3082: e0 93 d8 20 sts 0x20D8, r30 - 3086: ec 2d mov r30, r12 - 3088: e0 95 com r30 - 308a: e0 93 d9 20 sts 0x20D9, r30 + 3096: e0 2f mov r30, r16 + 3098: e0 95 com r30 + 309a: e0 93 d7 20 sts 0x20D7, r30 + 309e: e4 2f mov r30, r20 + 30a0: e0 95 com r30 + 30a2: e0 93 d8 20 sts 0x20D8, r30 + 30a6: ec 2d mov r30, r12 + 30a8: e0 95 com r30 + 30aa: e0 93 d9 20 sts 0x20D9, r30 uint32_t BlockValue; ValueFromBlock(&ParamValue, Buffer); ValueFromBlock(&BlockValue, BlockBuffer); if (State == STATE_DECREMENT) { - 308e: 80 93 da 20 sts 0x20DA, r24 - 3092: 00 93 db 20 sts 0x20DB, r16 - 3096: 40 93 dc 20 sts 0x20DC, r20 + 30ae: 80 93 da 20 sts 0x20DA, r24 + 30b2: 00 93 db 20 sts 0x20DB, r16 + 30b6: 40 93 dc 20 sts 0x20DC, r20 BlockValue -= ParamValue; } else if (State == STATE_INCREMENT) { - 309a: c0 92 dd 20 sts 0x20DD, r12 + 30ba: c0 92 dd 20 sts 0x20DD, r12 BlockValue += ParamValue; - 309e: 85 e0 ldi r24, 0x05 ; 5 - 30a0: 80 93 c5 20 sts 0x20C5, r24 + 30be: 85 e0 ldi r24, 0x05 ; 5 + 30c0: 80 93 c5 20 sts 0x20C5, r24 *Value |= ((uint32_t) Block[3] << 24); } INLINE void ValueToBlock(uint8_t* Block, uint32_t Value) { Block[0] = (uint8_t) (Value >> 0); - 30a4: 80 e0 ldi r24, 0x00 ; 0 - 30a6: 90 e0 ldi r25, 0x00 ; 0 + 30c4: 80 e0 ldi r24, 0x00 ; 0 + 30c6: 90 e0 ldi r25, 0x00 ; 0 Block[1] = (uint8_t) (Value >> 8); - 30a8: 40 cc rjmp .-1920 ; 0x292a - 30aa: c7 01 movw r24, r14 - 30ac: 62 e0 ldi r22, 0x02 ; 2 - 30ae: 70 e0 ldi r23, 0x00 ; 0 - 30b0: c1 d0 rcall .+386 ; 0x3234 - 30b2: 88 23 and r24, r24 + 30c8: 40 cc rjmp .-1920 ; 0x294a + 30ca: c7 01 movw r24, r14 + 30cc: 62 e0 ldi r22, 0x02 ; 2 + 30ce: 70 e0 ldi r23, 0x00 ; 0 + 30d0: c1 d0 rcall .+386 ; 0x3254 + 30d2: 88 23 and r24, r24 Block[2] = (uint8_t) (Value >> 16); - 30b4: 09 f4 brne .+2 ; 0x30b8 <__stack+0xb9> - 30b6: 0c cf rjmp .-488 ; 0x2ed0 - 30b8: f7 01 movw r30, r14 - 30ba: 81 81 ldd r24, Z+1 ; 0x01 - 30bc: 80 93 d1 20 sts 0x20D1, r24 + 30d4: 09 f4 brne .+2 ; 0x30d8 <__stack+0xd9> + 30d6: 0c cf rjmp .-488 ; 0x2ef0 + 30d8: f7 01 movw r30, r14 + 30da: 81 81 ldd r24, Z+1 ; 0x01 + 30dc: 80 93 d1 20 sts 0x20D1, r24 Block[3] = (uint8_t) (Value >> 24); - 30c0: 87 e0 ldi r24, 0x07 ; 7 - 30c2: fc ce rjmp .-520 ; 0x2ebc - 30c4: c7 01 movw r24, r14 - 30c6: 62 e0 ldi r22, 0x02 ; 2 - 30c8: 70 e0 ldi r23, 0x00 ; 0 + 30e0: 87 e0 ldi r24, 0x07 ; 7 + 30e2: fc ce rjmp .-520 ; 0x2edc + 30e4: c7 01 movw r24, r14 + 30e6: 62 e0 ldi r22, 0x02 ; 2 + 30e8: 70 e0 ldi r23, 0x00 ; 0 Block[4] = ~Block[0]; - 30ca: b4 d0 rcall .+360 ; 0x3234 - 30cc: 88 23 and r24, r24 - 30ce: 09 f4 brne .+2 ; 0x30d2 <__stack+0xd3> - 30d0: 63 ce rjmp .-826 ; 0x2d98 + 30ea: b4 d0 rcall .+360 ; 0x3254 + 30ec: 88 23 and r24, r24 + 30ee: 09 f4 brne .+2 ; 0x30f2 <__stack+0xf3> + 30f0: 63 ce rjmp .-826 ; 0x2db8 Block[5] = ~Block[1]; - 30d2: d7 01 movw r26, r14 - 30d4: 11 96 adiw r26, 0x01 ; 1 - 30d6: 8c 91 ld r24, X - 30d8: 11 97 sbiw r26, 0x01 ; 1 + 30f2: d7 01 movw r26, r14 + 30f4: 11 96 adiw r26, 0x01 ; 1 + 30f6: 8c 91 ld r24, X + 30f8: 11 97 sbiw r26, 0x01 ; 1 Block[6] = ~Block[2]; - 30da: 80 93 d1 20 sts 0x20D1, r24 - 30de: 89 e0 ldi r24, 0x09 ; 9 - 30e0: 0c cf rjmp .-488 ; 0x2efa + 30fa: 80 93 d1 20 sts 0x20D1, r24 + 30fe: 89 e0 ldi r24, 0x09 ; 9 + 3100: 0c cf rjmp .-488 ; 0x2f1a Block[7] = ~Block[3]; - 30e2: c7 01 movw r24, r14 - 30e4: 62 e0 ldi r22, 0x02 ; 2 - 30e6: 70 e0 ldi r23, 0x00 ; 0 - 30e8: a5 d0 rcall .+330 ; 0x3234 + 3102: c7 01 movw r24, r14 + 3104: 62 e0 ldi r22, 0x02 ; 2 + 3106: 70 e0 ldi r23, 0x00 ; 0 + 3108: a5 d0 rcall .+330 ; 0x3254 Block[8] = Block[0]; - 30ea: 88 23 and r24, r24 - 30ec: 09 f4 brne .+2 ; 0x30f0 <__stack+0xf1> + 310a: 88 23 and r24, r24 + 310c: 09 f4 brne .+2 ; 0x3110 <__stack+0x111> Block[9] = Block[1]; - 30ee: f0 ce rjmp .-544 ; 0x2ed0 - 30f0: 80 91 0c 21 lds r24, 0x210C + 310e: f0 ce rjmp .-544 ; 0x2ef0 + 3110: 80 91 0c 21 lds r24, 0x210C Block[10] = Block[2]; - 30f4: 88 23 and r24, r24 + 3114: 88 23 and r24, r24 Block[11] = Block[3]; - 30f6: 09 f0 breq .+2 ; 0x30fa <__stack+0xfb> - 30f8: e3 ce rjmp .-570 ; 0x2ec0 + 3116: 09 f0 breq .+2 ; 0x311a <__stack+0x11b> + 3118: e3 ce rjmp .-570 ; 0x2ee0 /* Do nothing */ } ValueToBlock(BlockBuffer, BlockValue); State = STATE_AUTHED_IDLE; - 30fa: f7 01 movw r30, r14 - 30fc: 61 81 ldd r22, Z+1 ; 0x01 - 30fe: 70 e0 ldi r23, 0x00 ; 0 + 311a: f7 01 movw r30, r14 + 311c: 61 81 ldd r22, Z+1 ; 0x01 + 311e: 70 e0 ldi r23, 0x00 ; 0 /* No ACK response on value commands part 2 */ return ISO14443A_APP_NO_RESPONSE; - 3100: 62 95 swap r22 - 3102: 72 95 swap r23 - 3104: 70 7f andi r23, 0xF0 ; 240 + 3120: 62 95 swap r22 + 3122: 72 95 swap r23 + 3124: 70 7f andi r23, 0xF0 ; 240 } 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)) { - 3106: 76 27 eor r23, r22 - 3108: 60 7f andi r22, 0xF0 ; 240 - 310a: 76 27 eor r23, r22 - 310c: 82 ed ldi r24, 0xD2 ; 210 - 310e: 90 e2 ldi r25, 0x20 ; 32 - 3110: 40 e1 ldi r20, 0x10 ; 16 - 3112: 50 e0 ldi r21, 0x00 ; 0 - 3114: 0e 94 a8 06 call 0xd50 ; 0xd50 + 3126: 76 27 eor r23, r22 + 3128: 60 7f andi r22, 0xF0 ; 240 + 312a: 76 27 eor r23, r22 + 312c: 82 ed ldi r24, 0xD2 ; 210 + 312e: 90 e2 ldi r25, 0x20 ; 32 + 3130: 40 e1 ldi r20, 0x10 ; 16 + 3132: 50 e0 ldi r21, 0x00 ; 0 + 3134: 0e 94 b8 06 call 0xd70 ; 0xd70 CurrentAddress = Buffer[1]; - 3118: d3 ce rjmp .-602 ; 0x2ec0 - 311a: 88 19 sub r24, r8 - 311c: 99 09 sbc r25, r9 + 3138: d3 ce rjmp .-602 ; 0x2ee0 + 313a: 88 19 sub r24, r8 + 313c: 99 09 sbc r25, r9 State = STATE_INCREMENT; - 311e: aa 09 sbc r26, r10 - 3120: bb 09 sbc r27, r11 + 313e: aa 09 sbc r26, r10 + 3140: bb 09 sbc r27, r11 } 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)) { - 3122: 92 cf rjmp .-220 ; 0x3048 <__stack+0x49> - 3124: c7 01 movw r24, r14 - 3126: 62 e0 ldi r22, 0x02 ; 2 - 3128: 70 e0 ldi r23, 0x00 ; 0 - 312a: 84 d0 rcall .+264 ; 0x3234 - 312c: 88 23 and r24, r24 - 312e: 09 f0 breq .+2 ; 0x3132 <__stack+0x133> - 3130: 49 cc rjmp .-1902 ; 0x29c4 + 3142: 92 cf rjmp .-220 ; 0x3068 <__stack+0x69> + 3144: c7 01 movw r24, r14 + 3146: 62 e0 ldi r22, 0x02 ; 2 + 3148: 70 e0 ldi r23, 0x00 ; 0 + 314a: 84 d0 rcall .+264 ; 0x3254 + 314c: 88 23 and r24, r24 + 314e: 09 f0 breq .+2 ; 0x3152 <__stack+0x153> + 3150: 49 cc rjmp .-1902 ; 0x29e4 CurrentAddress = Buffer[1]; - 3132: 81 e0 ldi r24, 0x01 ; 1 - 3134: d7 01 movw r26, r14 - 3136: 8c 93 st X, r24 - 3138: 84 e0 ldi r24, 0x04 ; 4 - 313a: 90 e0 ldi r25, 0x00 ; 0 - 313c: f6 cb rjmp .-2068 ; 0x292a + 3152: 81 e0 ldi r24, 0x01 ; 1 + 3154: d7 01 movw r26, r14 + 3156: 8c 93 st X, r24 + 3158: 84 e0 ldi r24, 0x04 ; 4 + 315a: 90 e0 ldi r25, 0x00 ; 0 + 315c: f6 cb rjmp .-2068 ; 0x294a State = STATE_RESTORE; - 313e: 8d 81 ldd r24, Y+5 ; 0x05 - 3140: f7 01 movw r30, r14 + 315e: 8d 81 ldd r24, Y+5 ; 0x05 + 3160: f7 01 movw r30, r14 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)) { - 3142: 80 83 st Z, r24 - 3144: 3e 81 ldd r19, Y+6 ; 0x06 - 3146: 31 83 std Z+1, r19 ; 0x01 - 3148: 2f 81 ldd r18, Y+7 ; 0x07 - 314a: 22 83 std Z+2, r18 ; 0x02 - 314c: 98 85 ldd r25, Y+8 ; 0x08 - 314e: 93 83 std Z+3, r25 ; 0x03 - 3150: 83 27 eor r24, r19 + 3162: 80 83 st Z, r24 + 3164: 3e 81 ldd r19, Y+6 ; 0x06 + 3166: 31 83 std Z+1, r19 ; 0x01 + 3168: 2f 81 ldd r18, Y+7 ; 0x07 + 316a: 22 83 std Z+2, r18 ; 0x02 + 316c: 98 85 ldd r25, Y+8 ; 0x08 + 316e: 93 83 std Z+3, r25 ; 0x03 + 3170: 83 27 eor r24, r19 if (!ActiveConfiguration.ReadOnly) { - 3152: 82 27 eor r24, r18 - 3154: 89 27 eor r24, r25 - 3156: 84 83 std Z+4, r24 ; 0x04 - 3158: 88 e2 ldi r24, 0x28 ; 40 - 315a: 90 e0 ldi r25, 0x00 ; 0 + 3172: 82 27 eor r24, r18 + 3174: 89 27 eor r24, r25 + 3176: 84 83 std Z+4, r24 ; 0x04 + 3178: 88 e2 ldi r24, 0x28 ; 40 + 317a: 90 e0 ldi r25, 0x00 ; 0 MemoryWriteBlock(BlockBuffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK ); - 315c: e6 cb rjmp .-2100 ; 0x292a - 315e: 80 e3 ldi r24, 0x30 ; 48 - 3160: 90 e0 ldi r25, 0x00 ; 0 - 3162: 20 cd rjmp .-1472 ; 0x2ba4 - 3164: 80 e3 ldi r24, 0x30 ; 48 - 3166: 90 e0 ldi r25, 0x00 ; 0 - 3168: 8a cd rjmp .-1260 ; 0x2c7e + 317c: e6 cb rjmp .-2100 ; 0x294a + 317e: 80 e3 ldi r24, 0x30 ; 48 + 3180: 90 e0 ldi r25, 0x00 ; 0 + 3182: 20 cd rjmp .-1472 ; 0x2bc4 + 3184: 80 e3 ldi r24, 0x30 ; 48 + 3186: 90 e0 ldi r25, 0x00 ; 0 + 3188: 8a cd rjmp .-1260 ; 0x2c9e -0000316a : - 316a: 60 e0 ldi r22, 0x00 ; 0 - 316c: 70 e0 ldi r23, 0x00 ; 0 - 316e: 44 e0 ldi r20, 0x04 ; 4 - 3170: 50 e0 ldi r21, 0x00 ; 0 - 3172: 0c 94 1d 06 jmp 0xc3a ; 0xc3a +0000318a : + 318a: 60 e0 ldi r22, 0x00 ; 0 + 318c: 70 e0 ldi r23, 0x00 ; 0 + 318e: 44 e0 ldi r20, 0x04 ; 4 + 3190: 50 e0 ldi r21, 0x00 ; 0 + 3192: 0c 94 2d 06 jmp 0xc5a ; 0xc5a -00003176 : - 3176: cf 93 push r28 - 3178: df 93 push r29 - 317a: 0f 92 push r0 +00003196 : + 3196: cf 93 push r28 + 3198: df 93 push r29 + 319a: 0f 92 push r0 ValueFromBlock(&ParamValue, Buffer); ValueFromBlock(&BlockValue, BlockBuffer); if (State == STATE_DECREMENT) { BlockValue -= ParamValue; - 317c: cd b7 in r28, 0x3d ; 61 - 317e: de b7 in r29, 0x3e ; 62 - 3180: fc 01 movw r30, r24 - 3182: 81 81 ldd r24, Z+1 ; 0x01 - 3184: 90 81 ld r25, Z + 319c: cd b7 in r28, 0x3d ; 61 + 319e: de b7 in r29, 0x3e ; 62 + 31a0: fc 01 movw r30, r24 + 31a2: 81 81 ldd r24, Z+1 ; 0x01 + 31a4: 90 81 ld r25, Z 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)) { - 3186: 89 27 eor r24, r25 - 3188: 92 81 ldd r25, Z+2 ; 0x02 - 318a: 89 27 eor r24, r25 - 318c: 93 81 ldd r25, Z+3 ; 0x03 - 318e: 89 27 eor r24, r25 - 3190: 89 83 std Y+1, r24 ; 0x01 - 3192: cf 01 movw r24, r30 - 3194: 60 e0 ldi r22, 0x00 ; 0 + 31a6: 89 27 eor r24, r25 + 31a8: 92 81 ldd r25, Z+2 ; 0x02 + 31aa: 89 27 eor r24, r25 + 31ac: 93 81 ldd r25, Z+3 ; 0x03 + 31ae: 89 27 eor r24, r25 + 31b0: 89 83 std Y+1, r24 ; 0x01 + 31b2: cf 01 movw r24, r30 + 31b4: 60 e0 ldi r22, 0x00 ; 0 /* 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; - 3196: 70 e0 ldi r23, 0x00 ; 0 - 3198: 44 e0 ldi r20, 0x04 ; 4 - 319a: 50 e0 ldi r21, 0x00 ; 0 + 31b6: 70 e0 ldi r23, 0x00 ; 0 + 31b8: 44 e0 ldi r20, 0x04 ; 4 + 31ba: 50 e0 ldi r21, 0x00 ; 0 return ACK_NAK_FRAME_SIZE; - 319c: 0e 94 a8 06 call 0xd50 ; 0xd50 - 31a0: ce 01 movw r24, r28 + 31bc: 0e 94 b8 06 call 0xd70 ; 0xd70 + 31c0: ce 01 movw r24, r28 switch (NVB) { case ISO14443A_NVB_AC_START: /* Start of anticollision procedure. * Send whole UID CLn + BCC */ DataPtr[0] = UidCL[0]; - 31a2: 01 96 adiw r24, 0x01 ; 1 - 31a4: 64 e0 ldi r22, 0x04 ; 4 - 31a6: 70 e0 ldi r23, 0x00 ; 0 + 31c2: 01 96 adiw r24, 0x01 ; 1 + 31c4: 64 e0 ldi r22, 0x04 ; 4 + 31c6: 70 e0 ldi r23, 0x00 ; 0 DataPtr[1] = UidCL[1]; - 31a8: 41 e0 ldi r20, 0x01 ; 1 - 31aa: 50 e0 ldi r21, 0x00 ; 0 + 31c8: 41 e0 ldi r20, 0x01 ; 1 + 31ca: 50 e0 ldi r21, 0x00 ; 0 DataPtr[2] = UidCL[2]; - 31ac: 0e 94 a8 06 call 0xd50 ; 0xd50 + 31cc: 0e 94 b8 06 call 0xd70 ; 0xd70 DataPtr[3] = UidCL[3]; - 31b0: 0f 90 pop r0 - 31b2: df 91 pop r29 + 31d0: 0f 90 pop r0 + 31d2: df 91 pop r29 DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); - 31b4: cf 91 pop r28 - 31b6: 08 95 ret + 31d4: cf 91 pop r28 + 31d6: 08 95 ret -000031b8 : +000031d8 : * policies, either expressed or implied, of the ORIGINAL AUTHORS. */ #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { - 31b8: ef 92 push r14 - 31ba: ff 92 push r15 - 31bc: 0f 93 push r16 - 31be: 1f 93 push r17 - 31c0: cf 93 push r28 - 31c2: 7c 01 movw r14, r24 - 31c4: 8b 01 movw r16, r22 + 31d8: ef 92 push r14 + 31da: ff 92 push r15 + 31dc: 0f 93 push r16 + 31de: 1f 93 push r17 + 31e0: cf 93 push r28 + 31e2: 7c 01 movw r14, r24 + 31e4: 8b 01 movw r16, r22 uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 31c6: 61 15 cp r22, r1 - 31c8: 71 05 cpc r23, r1 - 31ca: 81 f1 breq .+96 ; 0x322c - 31cc: fb 01 movw r30, r22 + 31e6: 61 15 cp r22, r1 + 31e8: 71 05 cpc r23, r1 + 31ea: 81 f1 breq .+96 ; 0x324c + 31ec: fb 01 movw r30, r22 #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 31ce: dc 01 movw r26, r24 + 31ee: dc 01 movw r26, r24 */ #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 31d0: 43 e6 ldi r20, 0x63 ; 99 - 31d2: 53 e6 ldi r21, 0x63 ; 99 + 31f0: 43 e6 ldi r20, 0x63 ; 99 + 31f2: 53 e6 ldi r21, 0x63 ; 99 uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { uint8_t Byte = *DataPtr++; - 31d4: 8d 91 ld r24, X+ + 31f4: 8d 91 ld r24, X+ Byte ^= (uint8_t) (Checksum & 0x00FF); - 31d6: 84 27 eor r24, r20 + 31f6: 84 27 eor r24, r20 Byte ^= Byte << 4; - 31d8: c8 2f mov r28, r24 - 31da: c2 95 swap r28 - 31dc: c0 7f andi r28, 0xF0 ; 240 - 31de: c8 27 eor r28, r24 + 31f8: c8 2f mov r28, r24 + 31fa: c2 95 swap r28 + 31fc: c0 7f andi r28, 0xF0 ; 240 + 31fe: c8 27 eor r28, r24 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 31e0: 8c 2f mov r24, r28 - 31e2: 90 e0 ldi r25, 0x00 ; 0 - 31e4: 78 2f mov r23, r24 - 31e6: 66 27 eor r22, r22 + 3200: 8c 2f mov r24, r28 + 3202: 90 e0 ldi r25, 0x00 ; 0 + 3204: 78 2f mov r23, r24 + 3206: 66 27 eor r22, r22 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 31e8: 9c 01 movw r18, r24 - 31ea: 22 0f add r18, r18 - 31ec: 33 1f adc r19, r19 - 31ee: 22 0f add r18, r18 - 31f0: 33 1f adc r19, r19 - 31f2: 22 0f add r18, r18 - 31f4: 33 1f adc r19, r19 + 3208: 9c 01 movw r18, r24 + 320a: 22 0f add r18, r18 + 320c: 33 1f adc r19, r19 + 320e: 22 0f add r18, r18 + 3210: 33 1f adc r19, r19 + 3212: 22 0f add r18, r18 + 3214: 33 1f adc r19, r19 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 31f6: 62 27 eor r22, r18 - 31f8: 73 27 eor r23, r19 - 31fa: 45 2f mov r20, r21 - 31fc: 55 27 eor r21, r21 - 31fe: 46 27 eor r20, r22 - 3200: 57 27 eor r21, r23 + 3216: 62 27 eor r22, r18 + 3218: 73 27 eor r23, r19 + 321a: 45 2f mov r20, r21 + 321c: 55 27 eor r21, r21 + 321e: 46 27 eor r20, r22 + 3220: 57 27 eor r21, r23 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3202: c2 95 swap r28 - 3204: cf 70 andi r28, 0x0F ; 15 - 3206: 8c 2f mov r24, r28 - 3208: 90 e0 ldi r25, 0x00 ; 0 + 3222: c2 95 swap r28 + 3224: cf 70 andi r28, 0x0F ; 15 + 3226: 8c 2f mov r24, r28 + 3228: 90 e0 ldi r25, 0x00 ; 0 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 320a: 48 27 eor r20, r24 - 320c: 59 27 eor r21, r25 - 320e: 31 97 sbiw r30, 0x01 ; 1 + 322a: 48 27 eor r20, r24 + 322c: 59 27 eor r21, r25 + 322e: 31 97 sbiw r30, 0x01 ; 1 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 3210: 09 f7 brne .-62 ; 0x31d4 - 3212: f7 01 movw r30, r14 - 3214: e0 0f add r30, r16 - 3216: f1 1f adc r31, r17 - 3218: 94 2f mov r25, r20 - 321a: 85 2f mov r24, r21 + 3230: 09 f7 brne .-62 ; 0x31f4 + 3232: f7 01 movw r30, r14 + 3234: e0 0f add r30, r16 + 3236: f1 1f adc r31, r17 + 3238: 94 2f mov r25, r20 + 323a: 85 2f mov r24, r21 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } *DataPtr++ = (Checksum >> 0) & 0x00FF; - 321c: 90 83 st Z, r25 + 323c: 90 83 st Z, r25 *DataPtr = (Checksum >> 8) & 0x00FF; - 321e: 81 83 std Z+1, r24 ; 0x01 + 323e: 81 83 std Z+1, r24 ; 0x01 } - 3220: cf 91 pop r28 - 3222: 1f 91 pop r17 - 3224: 0f 91 pop r16 - 3226: ff 90 pop r15 - 3228: ef 90 pop r14 - 322a: 08 95 ret + 3240: cf 91 pop r28 + 3242: 1f 91 pop r17 + 3244: 0f 91 pop r16 + 3246: ff 90 pop r15 + 3248: ef 90 pop r14 + 324a: 08 95 ret #include "ISO14443-3A.h" void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 322c: fc 01 movw r30, r24 + 324c: fc 01 movw r30, r24 while(ByteCount--) { - 322e: 83 e6 ldi r24, 0x63 ; 99 - 3230: 93 e6 ldi r25, 0x63 ; 99 - 3232: f4 cf rjmp .-24 ; 0x321c + 324e: 83 e6 ldi r24, 0x63 ; 99 + 3250: 93 e6 ldi r25, 0x63 ; 99 + 3252: f4 cf rjmp .-24 ; 0x323c -00003234 : +00003254 : *DataPtr++ = (Checksum >> 0) & 0x00FF; *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { - 3234: ef 92 push r14 - 3236: ff 92 push r15 - 3238: 0f 93 push r16 - 323a: 1f 93 push r17 - 323c: cf 93 push r28 - 323e: 7c 01 movw r14, r24 - 3240: 8b 01 movw r16, r22 + 3254: ef 92 push r14 + 3256: ff 92 push r15 + 3258: 0f 93 push r16 + 325a: 1f 93 push r17 + 325c: cf 93 push r28 + 325e: 7c 01 movw r14, r24 + 3260: 8b 01 movw r16, r22 uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 3242: 61 15 cp r22, r1 - 3244: 71 05 cpc r23, r1 - 3246: 09 f4 brne .+2 ; 0x324a - 3248: 3d c0 rjmp .+122 ; 0x32c4 - 324a: fb 01 movw r30, r22 + 3262: 61 15 cp r22, r1 + 3264: 71 05 cpc r23, r1 + 3266: 09 f4 brne .+2 ; 0x326a + 3268: 3d c0 rjmp .+122 ; 0x32e4 + 326a: fb 01 movw r30, r22 } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 324c: dc 01 movw r26, r24 + 326c: dc 01 movw r26, r24 *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 324e: 43 e6 ldi r20, 0x63 ; 99 - 3250: 53 e6 ldi r21, 0x63 ; 99 + 326e: 43 e6 ldi r20, 0x63 ; 99 + 3270: 53 e6 ldi r21, 0x63 ; 99 uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { uint8_t Byte = *DataPtr++; - 3252: 8d 91 ld r24, X+ + 3272: 8d 91 ld r24, X+ Byte ^= (uint8_t) (Checksum & 0x00FF); - 3254: 84 27 eor r24, r20 + 3274: 84 27 eor r24, r20 Byte ^= Byte << 4; - 3256: c8 2f mov r28, r24 - 3258: c2 95 swap r28 - 325a: c0 7f andi r28, 0xF0 ; 240 - 325c: c8 27 eor r28, r24 + 3276: c8 2f mov r28, r24 + 3278: c2 95 swap r28 + 327a: c0 7f andi r28, 0xF0 ; 240 + 327c: c8 27 eor r28, r24 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 325e: 8c 2f mov r24, r28 - 3260: 90 e0 ldi r25, 0x00 ; 0 - 3262: 78 2f mov r23, r24 - 3264: 66 27 eor r22, r22 + 327e: 8c 2f mov r24, r28 + 3280: 90 e0 ldi r25, 0x00 ; 0 + 3282: 78 2f mov r23, r24 + 3284: 66 27 eor r22, r22 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3266: 9c 01 movw r18, r24 - 3268: 22 0f add r18, r18 - 326a: 33 1f adc r19, r19 - 326c: 22 0f add r18, r18 - 326e: 33 1f adc r19, r19 - 3270: 22 0f add r18, r18 - 3272: 33 1f adc r19, r19 + 3286: 9c 01 movw r18, r24 + 3288: 22 0f add r18, r18 + 328a: 33 1f adc r19, r19 + 328c: 22 0f add r18, r18 + 328e: 33 1f adc r19, r19 + 3290: 22 0f add r18, r18 + 3292: 33 1f adc r19, r19 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3274: 62 27 eor r22, r18 - 3276: 73 27 eor r23, r19 - 3278: 45 2f mov r20, r21 - 327a: 55 27 eor r21, r21 - 327c: 46 27 eor r20, r22 - 327e: 57 27 eor r21, r23 + 3294: 62 27 eor r22, r18 + 3296: 73 27 eor r23, r19 + 3298: 45 2f mov r20, r21 + 329a: 55 27 eor r21, r21 + 329c: 46 27 eor r20, r22 + 329e: 57 27 eor r21, r23 ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); - 3280: c2 95 swap r28 - 3282: cf 70 andi r28, 0x0F ; 15 - 3284: 8c 2f mov r24, r28 - 3286: 90 e0 ldi r25, 0x00 ; 0 + 32a0: c2 95 swap r28 + 32a2: cf 70 andi r28, 0x0F ; 15 + 32a4: 8c 2f mov r24, r28 + 32a6: 90 e0 ldi r25, 0x00 ; 0 uint8_t Byte = *DataPtr++; Byte ^= (uint8_t) (Checksum & 0x00FF); Byte ^= Byte << 4; Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ - 3288: 48 27 eor r20, r24 - 328a: 59 27 eor r21, r25 - 328c: 31 97 sbiw r30, 0x01 ; 1 + 32a8: 48 27 eor r20, r24 + 32aa: 59 27 eor r21, r25 + 32ac: 31 97 sbiw r30, 0x01 ; 1 bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; while(ByteCount--) { - 328e: 09 f7 brne .-62 ; 0x3252 - 3290: f7 01 movw r30, r14 - 3292: e0 0f add r30, r16 - 3294: f1 1f adc r31, r17 - 3296: 9a 01 movw r18, r20 - 3298: 30 70 andi r19, 0x00 ; 0 + 32ae: 09 f7 brne .-62 ; 0x3272 + 32b0: f7 01 movw r30, r14 + 32b2: e0 0f add r30, r16 + 32b4: f1 1f adc r31, r17 + 32b6: 9a 01 movw r18, r20 + 32b8: 30 70 andi r19, 0x00 ; 0 Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); - 329a: 80 81 ld r24, Z - 329c: 90 e0 ldi r25, 0x00 ; 0 - 329e: 82 17 cp r24, r18 - 32a0: 93 07 cpc r25, r19 - 32a2: 39 f0 breq .+14 ; 0x32b2 - 32a4: 80 e0 ldi r24, 0x00 ; 0 + 32ba: 80 81 ld r24, Z + 32bc: 90 e0 ldi r25, 0x00 ; 0 + 32be: 82 17 cp r24, r18 + 32c0: 93 07 cpc r25, r19 + 32c2: 39 f0 breq .+14 ; 0x32d2 + 32c4: 80 e0 ldi r24, 0x00 ; 0 } - 32a6: cf 91 pop r28 - 32a8: 1f 91 pop r17 - 32aa: 0f 91 pop r16 - 32ac: ff 90 pop r15 - 32ae: ef 90 pop r14 - 32b0: 08 95 ret + 32c6: cf 91 pop r28 + 32c8: 1f 91 pop r17 + 32ca: 0f 91 pop r16 + 32cc: ff 90 pop r15 + 32ce: ef 90 pop r14 + 32d0: 08 95 ret Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); } return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); - 32b2: 21 81 ldd r18, Z+1 ; 0x01 - 32b4: 30 e0 ldi r19, 0x00 ; 0 - 32b6: 45 2f mov r20, r21 - 32b8: 55 27 eor r21, r21 + 32d2: 21 81 ldd r18, Z+1 ; 0x01 + 32d4: 30 e0 ldi r19, 0x00 ; 0 + 32d6: 45 2f mov r20, r21 + 32d8: 55 27 eor r21, r21 *DataPtr++ = (Checksum >> 0) & 0x00FF; *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) - 32ba: 81 e0 ldi r24, 0x01 ; 1 - 32bc: 24 17 cp r18, r20 - 32be: 35 07 cpc r19, r21 - 32c0: 89 f7 brne .-30 ; 0x32a4 - 32c2: f1 cf rjmp .-30 ; 0x32a6 + 32da: 81 e0 ldi r24, 0x01 ; 1 + 32dc: 24 17 cp r18, r20 + 32de: 35 07 cpc r19, r21 + 32e0: 89 f7 brne .-30 ; 0x32c4 + 32e2: f1 cf rjmp .-30 ; 0x32c6 { uint16_t Checksum = 0x6363; uint8_t* DataPtr = (uint8_t*) Buffer; - 32c4: fc 01 movw r30, r24 + 32e4: fc 01 movw r30, r24 while(ByteCount--) { - 32c6: 23 e6 ldi r18, 0x63 ; 99 - 32c8: 30 e0 ldi r19, 0x00 ; 0 + 32e6: 23 e6 ldi r18, 0x63 ; 99 + 32e8: 30 e0 ldi r19, 0x00 ; 0 *DataPtr = (Checksum >> 8) & 0x00FF; } bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) { uint16_t Checksum = 0x6363; - 32ca: 43 e6 ldi r20, 0x63 ; 99 - 32cc: 53 e6 ldi r21, 0x63 ; 99 - 32ce: e5 cf rjmp .-54 ; 0x329a + 32ea: 43 e6 ldi r20, 0x63 ; 99 + 32ec: 53 e6 ldi r21, 0x63 ; 99 + 32ee: e5 cf rjmp .-54 ; 0x32ba -000032d0 : +000032f0 : /* 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) { - 32d0: cf 92 push r12 - 32d2: df 92 push r13 - 32d4: ef 92 push r14 - 32d6: ff 92 push r15 - 32d8: 0f 93 push r16 - 32da: 1f 93 push r17 + 32f0: cf 92 push r12 + 32f2: df 92 push r13 + 32f4: ef 92 push r14 + 32f6: ff 92 push r15 + 32f8: 0f 93 push r16 + 32fa: 1f 93 push r17 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); - 32dc: 00 91 e5 20 lds r16, 0x20E5 + 32fc: 00 91 e5 20 lds r16, 0x20E5 Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 32e0: 40 91 e6 20 lds r20, 0x20E6 + 3300: 40 91 e6 20 lds r20, 0x20E6 Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 32e4: 30 91 e7 20 lds r19, 0x20E7 + 3304: 30 91 e7 20 lds r19, 0x20E7 Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 32e8: a0 91 e2 20 lds r26, 0x20E2 + 3308: a0 91 e2 20 lds r26, 0x20E2 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 32ec: f0 91 e3 20 lds r31, 0x20E3 + 330c: f0 91 e3 20 lds r31, 0x20E3 Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 32f0: e0 91 e4 20 lds r30, 0x20E4 + 3310: e0 91 e4 20 lds r30, 0x20E4 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); - 32f4: 94 2f mov r25, r20 - 32f6: 90 71 andi r25, 0x10 ; 16 + 3314: 94 2f mov r25, r20 + 3316: 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); - 32f8: 20 2f mov r18, r16 - 32fa: 21 7e andi r18, 0xE1 ; 225 + 3318: 20 2f mov r18, r16 + 331a: 21 7e andi r18, 0xE1 ; 225 Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - 32fc: 92 27 eor r25, r18 + 331c: 92 27 eor r25, r18 Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); - 32fe: 23 2f mov r18, r19 - 3300: 20 72 andi r18, 0x20 ; 32 - 3302: 92 27 eor r25, r18 + 331e: 23 2f mov r18, r19 + 3320: 20 72 andi r18, 0x20 ; 32 + 3322: 92 27 eor r25, r18 Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - 3304: 2a 2f mov r18, r26 - 3306: 24 79 andi r18, 0x94 ; 148 - 3308: 92 27 eor r25, r18 + 3324: 2a 2f mov r18, r26 + 3326: 24 79 andi r18, 0x94 ; 148 + 3328: 92 27 eor r25, r18 Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - 330a: 2f 2f mov r18, r31 - 330c: 23 77 andi r18, 0x73 ; 115 - 330e: 92 27 eor r25, r18 + 332a: 2f 2f mov r18, r31 + 332c: 23 77 andi r18, 0x73 ; 115 + 332e: 92 27 eor r25, r18 Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - 3310: 2e 2f mov r18, r30 - 3312: 2a 73 andi r18, 0x3A ; 58 - 3314: 92 27 eor r25, r18 + 3330: 2e 2f mov r18, r30 + 3332: 2a 73 andi r18, 0x3A ; 58 + 3334: 92 27 eor r25, r18 Feedback ^= Feedback >> 4; - 3316: 29 2f mov r18, r25 - 3318: 22 95 swap r18 - 331a: 2f 70 andi r18, 0x0F ; 15 - 331c: 29 27 eor r18, r25 + 3336: 29 2f mov r18, r25 + 3338: 22 95 swap r18 + 333a: 2f 70 andi r18, 0x0F ; 15 + 333c: 29 27 eor r18, r25 Feedback ^= Feedback >> 2; - 331e: 92 2f mov r25, r18 - 3320: 96 95 lsr r25 - 3322: 96 95 lsr r25 - 3324: 92 27 eor r25, r18 + 333e: 92 2f mov r25, r18 + 3340: 96 95 lsr r25 + 3342: 96 95 lsr r25 + 3344: 92 27 eor r25, r18 Feedback ^= Feedback >> 1; - 3326: b9 2f mov r27, r25 - 3328: b6 95 lsr r27 + 3346: b9 2f mov r27, r25 + 3348: b6 95 lsr r27 * - 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); - 332a: 50 e0 ldi r21, 0x00 ; 0 - 332c: 60 e0 ldi r22, 0x00 ; 0 - 332e: 70 e0 ldi r23, 0x00 ; 0 - 3330: 76 2f mov r23, r22 - 3332: 65 2f mov r22, r21 - 3334: 54 2f mov r21, r20 - 3336: 44 27 eor r20, r20 + 334a: 50 e0 ldi r21, 0x00 ; 0 + 334c: 60 e0 ldi r22, 0x00 ; 0 + 334e: 70 e0 ldi r23, 0x00 ; 0 + 3350: 76 2f mov r23, r22 + 3352: 65 2f mov r22, r21 + 3354: 54 2f mov r21, r20 + 3356: 44 27 eor r20, r20 Temp |= ((uint32_t) StateEven[2] << 16); - 3338: c3 2e mov r12, r19 - 333a: dd 24 eor r13, r13 - 333c: ee 24 eor r14, r14 - 333e: ff 24 eor r15, r15 - 3340: 76 01 movw r14, r12 - 3342: dd 24 eor r13, r13 - 3344: cc 24 eor r12, r12 + 3358: c3 2e mov r12, r19 + 335a: dd 24 eor r13, r13 + 335c: ee 24 eor r14, r14 + 335e: ff 24 eor r15, r15 + 3360: 76 01 movw r14, r12 + 3362: dd 24 eor r13, r13 + 3364: cc 24 eor r12, r12 * - the new even state becomes the old odd state * - the new odd state becomes the old even state right-shifted by 1. * For shifting the even state, we convert it into a 32 bit int first */ uint32_t Temp = 0; Temp |= ((uint32_t) StateEven[0] << 0); Temp |= ((uint32_t) StateEven[1] << 8); - 3346: 4c 29 or r20, r12 - 3348: 5d 29 or r21, r13 - 334a: 6e 29 or r22, r14 - 334c: 7f 29 or r23, r15 + 3366: 4c 29 or r20, r12 + 3368: 5d 29 or r21, r13 + 336a: 6e 29 or r22, r14 + 336c: 7f 29 or r23, r15 * see that after one LFSR clock cycle * - the new even state becomes the old odd state * - the new odd state becomes the old even state right-shifted by 1. * For shifting the even state, we convert it into a 32 bit int first */ uint32_t Temp = 0; Temp |= ((uint32_t) StateEven[0] << 0); - 334e: 10 e0 ldi r17, 0x00 ; 0 - 3350: 20 e0 ldi r18, 0x00 ; 0 - 3352: 30 e0 ldi r19, 0x00 ; 0 + 336e: 10 e0 ldi r17, 0x00 ; 0 + 3370: 20 e0 ldi r18, 0x00 ; 0 + 3372: 30 e0 ldi r19, 0x00 ; 0 Temp |= ((uint32_t) StateEven[1] << 8); Temp |= ((uint32_t) StateEven[2] << 16); - 3354: 40 2b or r20, r16 - 3356: 51 2b or r21, r17 - 3358: 62 2b or r22, r18 - 335a: 73 2b or r23, r19 + 3374: 40 2b or r20, r16 + 3376: 51 2b or r21, r17 + 3378: 62 2b or r22, r18 + 337a: 73 2b or r23, r19 /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ Temp = (Temp >> 1) & 0x00FFFFFF; - 335c: 76 95 lsr r23 - 335e: 67 95 ror r22 - 3360: 57 95 ror r21 - 3362: 47 95 ror r20 + 337c: 76 95 lsr r23 + 337e: 67 95 ror r22 + 3380: 57 95 ror r21 + 3382: 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; - 3364: b9 27 eor r27, r25 + 3384: b9 27 eor r27, r25 /* 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 ) { - 3366: 2b 2f mov r18, r27 - 3368: 30 e0 ldi r19, 0x00 ; 0 - 336a: 21 70 andi r18, 0x01 ; 1 - 336c: 30 70 andi r19, 0x00 ; 0 - 336e: 90 e0 ldi r25, 0x00 ; 0 - 3370: 28 17 cp r18, r24 - 3372: 39 07 cpc r19, r25 - 3374: 09 f0 breq .+2 ; 0x3378 + 3386: 2b 2f mov r18, r27 + 3388: 30 e0 ldi r19, 0x00 ; 0 + 338a: 21 70 andi r18, 0x01 ; 1 + 338c: 30 70 andi r19, 0x00 ; 0 + 338e: 90 e0 ldi r25, 0x00 ; 0 + 3390: 28 17 cp r18, r24 + 3392: 39 07 cpc r19, r25 + 3394: 09 f0 breq .+2 ; 0x3398 Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); - 3376: 60 68 ori r22, 0x80 ; 128 + 3396: 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]; - 3378: a0 93 e5 20 sts 0x20E5, r26 + 3398: a0 93 e5 20 sts 0x20E5, r26 StateEven[1] = StateOdd[1]; - 337c: f0 93 e6 20 sts 0x20E6, r31 + 339c: f0 93 e6 20 sts 0x20E6, r31 StateEven[2] = StateOdd[2]; - 3380: e0 93 e7 20 sts 0x20E7, r30 + 33a0: e0 93 e7 20 sts 0x20E7, r30 StateOdd[0] = (uint8_t) (Temp >> 0); - 3384: 40 93 e2 20 sts 0x20E2, r20 + 33a4: 40 93 e2 20 sts 0x20E2, r20 StateOdd[1] = (uint8_t) (Temp >> 8); - 3388: 50 93 e3 20 sts 0x20E3, r21 + 33a8: 50 93 e3 20 sts 0x20E3, r21 StateOdd[2] = (uint8_t) (Temp >> 16); - 338c: 60 93 e4 20 sts 0x20E4, r22 + 33ac: 60 93 e4 20 sts 0x20E4, r22 } - 3390: 1f 91 pop r17 - 3392: 0f 91 pop r16 - 3394: ff 90 pop r15 - 3396: ef 90 pop r14 - 3398: df 90 pop r13 - 339a: cf 90 pop r12 - 339c: 08 95 ret + 33b0: 1f 91 pop r17 + 33b2: 0f 91 pop r16 + 33b4: ff 90 pop r15 + 33b6: ef 90 pop r14 + 33b8: df 90 pop r13 + 33ba: cf 90 pop r12 + 33bc: 08 95 ret -0000339e : +000033be : * 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]; - 339e: 50 91 e3 20 lds r21, 0x20E3 + 33be: 50 91 e3 20 lds r21, 0x20E3 Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 33a2: 40 91 e4 20 lds r20, 0x20E4 - 33a6: 24 2f mov r18, r20 - 33a8: 2f 70 andi r18, 0x0F ; 15 - 33aa: 8d e1 ldi r24, 0x1D ; 29 - 33ac: 90 e2 ldi r25, 0x20 ; 32 - 33ae: dc 01 movw r26, r24 - 33b0: a2 0f add r26, r18 - 33b2: b1 1d adc r27, r1 + 33c2: 40 91 e4 20 lds r20, 0x20E4 + 33c6: 24 2f mov r18, r20 + 33c8: 2f 70 andi r18, 0x0F ; 15 + 33ca: 8d e1 ldi r24, 0x1D ; 29 + 33cc: 90 e2 ldi r25, 0x20 ; 32 + 33ce: dc 01 movw r26, r24 + 33d0: a2 0f add r26, r18 + 33d2: b1 1d adc r27, r1 * 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]; - 33b4: 25 2f mov r18, r21 - 33b6: 2f 70 andi r18, 0x0F ; 15 - 33b8: fc 01 movw r30, r24 - 33ba: e2 0f add r30, r18 - 33bc: f1 1d adc r31, r1 - 33be: d0 96 adiw r26, 0x30 ; 48 - 33c0: 2c 91 ld r18, X - 33c2: d0 97 sbiw r26, 0x30 ; 48 - 33c4: 30 89 ldd r19, Z+16 ; 0x10 - 33c6: 23 2b or r18, r19 + 33d4: 25 2f mov r18, r21 + 33d6: 2f 70 andi r18, 0x0F ; 15 + 33d8: fc 01 movw r30, r24 + 33da: e2 0f add r30, r18 + 33dc: f1 1d adc r31, r1 + 33de: d0 96 adiw r26, 0x30 ; 48 + 33e0: 2c 91 ld r18, X + 33e2: d0 97 sbiw r26, 0x30 ; 48 + 33e4: 30 89 ldd r19, Z+16 ; 0x10 + 33e6: 23 2b or r18, r19 * 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]; - 33c8: 30 91 e2 20 lds r19, 0x20E2 - 33cc: 32 95 swap r19 - 33ce: 3f 70 andi r19, 0x0F ; 15 - 33d0: fc 01 movw r30, r24 - 33d2: e3 0f add r30, r19 - 33d4: f1 1d adc r31, r1 + 33e8: 30 91 e2 20 lds r19, 0x20E2 + 33ec: 32 95 swap r19 + 33ee: 3f 70 andi r19, 0x0F ; 15 + 33f0: fc 01 movw r30, r24 + 33f2: e3 0f add r30, r19 + 33f4: f1 1d adc r31, r1 Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - 33d6: 30 81 ld r19, Z - 33d8: 23 2b or r18, r19 - 33da: 52 95 swap r21 - 33dc: 5f 70 andi r21, 0x0F ; 15 - 33de: fc 01 movw r30, r24 - 33e0: e5 0f add r30, r21 - 33e2: f1 1d adc r31, r1 + 33f6: 30 81 ld r19, Z + 33f8: 23 2b or r18, r19 + 33fa: 52 95 swap r21 + 33fc: 5f 70 andi r21, 0x0F ; 15 + 33fe: fc 01 movw r30, r24 + 3400: e5 0f add r30, r21 + 3402: f1 1d adc r31, r1 Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - 33e4: 30 a1 lds r19, 0x40 - 33e6: 23 2b or r18, r19 + 3404: 30 a1 lds r19, 0x40 + 3406: 23 2b or r18, r19 Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; - 33e8: 42 95 swap r20 - 33ea: 4f 70 andi r20, 0x0F ; 15 - 33ec: 84 0f add r24, r20 - 33ee: 91 1d adc r25, r1 - 33f0: 80 5c subi r24, 0xC0 ; 192 - 33f2: 9f 4f sbci r25, 0xFF ; 255 - 33f4: fc 01 movw r30, r24 - 33f6: 80 81 ld r24, Z - 33f8: 28 2b or r18, r24 + 3408: 42 95 swap r20 + 340a: 4f 70 andi r20, 0x0F ; 15 + 340c: 84 0f add r24, r20 + 340e: 91 1d adc r25, r1 + 3410: 80 5c subi r24, 0xC0 ; 192 + 3412: 9f 4f sbci r25, 0xFF ; 255 + 3414: fc 01 movw r30, r24 + 3416: 80 81 ld r24, Z + 3418: 28 2b or r18, r24 return TableC[Sum]; - 33fa: ed e6 ldi r30, 0x6D ; 109 - 33fc: f0 e2 ldi r31, 0x20 ; 32 - 33fe: e2 0f add r30, r18 - 3400: f1 1d adc r31, r1 + 341a: ed e6 ldi r30, 0x6D ; 109 + 341c: f0 e2 ldi r31, 0x20 ; 32 + 341e: e2 0f add r30, r18 + 3420: f1 1d adc r31, r1 } - 3402: 80 81 ld r24, Z - 3404: 08 95 ret + 3422: 80 81 ld r24, Z + 3424: 08 95 ret -00003406 : +00003426 : void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) { - 3406: cf 92 push r12 - 3408: df 92 push r13 - 340a: ef 92 push r14 - 340c: ff 92 push r15 - 340e: 0f 93 push r16 - 3410: 1f 93 push r17 - 3412: cf 93 push r28 - 3414: df 93 push r29 - 3416: fc 01 movw r30, r24 - 3418: ea 01 movw r28, r20 + 3426: cf 92 push r12 + 3428: df 92 push r13 + 342a: ef 92 push r14 + 342c: ff 92 push r15 + 342e: 0f 93 push r16 + 3430: 1f 93 push r17 + 3432: cf 93 push r28 + 3434: df 93 push r29 + 3436: fc 01 movw r30, r24 + 3438: ea 01 movw r28, r20 * 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]; - 341a: 31 81 ldd r19, Z+1 ; 0x01 - 341c: 20 e0 ldi r18, 0x00 ; 0 - 341e: 80 81 ld r24, Z - 3420: 90 e0 ldi r25, 0x00 ; 0 - 3422: 82 2b or r24, r18 - 3424: 93 2b or r25, r19 - 3426: 80 fd sbrc r24, 0 - 3428: b2 c1 rjmp .+868 ; 0x378e - 342a: 30 e0 ldi r19, 0x00 ; 0 - 342c: 81 fd sbrc r24, 1 - 342e: ad c1 rjmp .+858 ; 0x378a - 3430: 20 e0 ldi r18, 0x00 ; 0 + 343a: 31 81 ldd r19, Z+1 ; 0x01 + 343c: 20 e0 ldi r18, 0x00 ; 0 + 343e: 80 81 ld r24, Z + 3440: 90 e0 ldi r25, 0x00 ; 0 + 3442: 82 2b or r24, r18 + 3444: 93 2b or r25, r19 + 3446: 80 fd sbrc r24, 0 + 3448: b2 c1 rjmp .+868 ; 0x37ae + 344a: 30 e0 ldi r19, 0x00 ; 0 + 344c: 81 fd sbrc r24, 1 + 344e: ad c1 rjmp .+858 ; 0x37aa + 3450: 20 e0 ldi r18, 0x00 ; 0 if (KeyWord & (1<<1)) { OddByte |= 0x80; } KeyWord >>= 2; - 3432: 96 95 lsr r25 - 3434: 87 95 ror r24 - 3436: 96 95 lsr r25 - 3438: 87 95 ror r24 + 3452: 96 95 lsr r25 + 3454: 87 95 ror r24 + 3456: 96 95 lsr r25 + 3458: 87 95 ror r24 for (j=0; j<8; j++) { EvenByte >>= 1; OddByte >>= 1; if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 343a: 43 2f mov r20, r19 - 343c: 40 68 ori r20, 0x80 ; 128 - 343e: 80 fd sbrc r24, 0 - 3440: 34 2f mov r19, r20 + 345a: 43 2f mov r20, r19 + 345c: 40 68 ori r20, 0x80 ; 128 + 345e: 80 fd sbrc r24, 0 + 3460: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3442: 42 2f mov r20, r18 - 3444: 40 68 ori r20, 0x80 ; 128 - 3446: 81 fd sbrc r24, 1 - 3448: 24 2f mov r18, r20 + 3462: 42 2f mov r20, r18 + 3464: 40 68 ori r20, 0x80 ; 128 + 3466: 81 fd sbrc r24, 1 + 3468: 24 2f mov r18, r20 } KeyWord >>= 2; - 344a: 96 95 lsr r25 - 344c: 87 95 ror r24 - 344e: 96 95 lsr r25 - 3450: 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; - 3452: 36 95 lsr r19 - OddByte >>= 1; - 3454: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3456: 43 2f mov r20, r19 - 3458: 40 68 ori r20, 0x80 ; 128 - 345a: 80 fd sbrc r24, 0 - 345c: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 345e: 42 2f mov r20, r18 - 3460: 40 68 ori r20, 0x80 ; 128 - 3462: 81 fd sbrc r24, 1 - 3464: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3466: 96 95 lsr r25 - 3468: 87 95 ror r24 346a: 96 95 lsr r25 346c: 87 95 ror r24 + 346e: 96 95 lsr r25 + 3470: 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; - 346e: 36 95 lsr r19 + 3472: 36 95 lsr r19 OddByte >>= 1; - 3470: 26 95 lsr r18 + 3474: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3472: 43 2f mov r20, r19 - 3474: 40 68 ori r20, 0x80 ; 128 - 3476: 80 fd sbrc r24, 0 - 3478: 34 2f mov r19, r20 + 3476: 43 2f mov r20, r19 + 3478: 40 68 ori r20, 0x80 ; 128 + 347a: 80 fd sbrc r24, 0 + 347c: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 347a: 42 2f mov r20, r18 - 347c: 40 68 ori r20, 0x80 ; 128 - 347e: 81 fd sbrc r24, 1 - 3480: 24 2f mov r18, r20 + 347e: 42 2f mov r20, r18 + 3480: 40 68 ori r20, 0x80 ; 128 + 3482: 81 fd sbrc r24, 1 + 3484: 24 2f mov r18, r20 } KeyWord >>= 2; - 3482: 96 95 lsr r25 - 3484: 87 95 ror r24 3486: 96 95 lsr r25 3488: 87 95 ror r24 + 348a: 96 95 lsr r25 + 348c: 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; - 348a: 36 95 lsr r19 + 348e: 36 95 lsr r19 OddByte >>= 1; - 348c: 26 95 lsr r18 + 3490: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 348e: 43 2f mov r20, r19 - 3490: 40 68 ori r20, 0x80 ; 128 - 3492: 80 fd sbrc r24, 0 - 3494: 34 2f mov r19, r20 + 3492: 43 2f mov r20, r19 + 3494: 40 68 ori r20, 0x80 ; 128 + 3496: 80 fd sbrc r24, 0 + 3498: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3496: 42 2f mov r20, r18 - 3498: 40 68 ori r20, 0x80 ; 128 - 349a: 81 fd sbrc r24, 1 - 349c: 24 2f mov r18, r20 + 349a: 42 2f mov r20, r18 + 349c: 40 68 ori r20, 0x80 ; 128 + 349e: 81 fd sbrc r24, 1 + 34a0: 24 2f mov r18, r20 } KeyWord >>= 2; - 349e: 96 95 lsr r25 - 34a0: 87 95 ror r24 34a2: 96 95 lsr r25 34a4: 87 95 ror r24 + 34a6: 96 95 lsr r25 + 34a8: 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; - 34a6: 36 95 lsr r19 + 34aa: 36 95 lsr r19 OddByte >>= 1; - 34a8: 26 95 lsr r18 + 34ac: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 34aa: 43 2f mov r20, r19 - 34ac: 40 68 ori r20, 0x80 ; 128 - 34ae: 80 fd sbrc r24, 0 - 34b0: 34 2f mov r19, r20 + 34ae: 43 2f mov r20, r19 + 34b0: 40 68 ori r20, 0x80 ; 128 + 34b2: 80 fd sbrc r24, 0 + 34b4: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 34b2: 42 2f mov r20, r18 - 34b4: 40 68 ori r20, 0x80 ; 128 - 34b6: 81 fd sbrc r24, 1 - 34b8: 24 2f mov r18, r20 + 34b6: 42 2f mov r20, r18 + 34b8: 40 68 ori r20, 0x80 ; 128 + 34ba: 81 fd sbrc r24, 1 + 34bc: 24 2f mov r18, r20 } KeyWord >>= 2; - 34ba: 96 95 lsr r25 - 34bc: 87 95 ror r24 34be: 96 95 lsr r25 34c0: 87 95 ror r24 + 34c2: 96 95 lsr r25 + 34c4: 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; - 34c2: 36 95 lsr r19 + 34c6: 36 95 lsr r19 OddByte >>= 1; - 34c4: 26 95 lsr r18 + 34c8: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 34c6: 43 2f mov r20, r19 - 34c8: 40 68 ori r20, 0x80 ; 128 - 34ca: 80 fd sbrc r24, 0 - 34cc: 34 2f mov r19, r20 + 34ca: 43 2f mov r20, r19 + 34cc: 40 68 ori r20, 0x80 ; 128 + 34ce: 80 fd sbrc r24, 0 + 34d0: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 34ce: 42 2f mov r20, r18 - 34d0: 40 68 ori r20, 0x80 ; 128 - 34d2: 81 fd sbrc r24, 1 - 34d4: 24 2f mov r18, r20 + 34d2: 42 2f mov r20, r18 + 34d4: 40 68 ori r20, 0x80 ; 128 + 34d6: 81 fd sbrc r24, 1 + 34d8: 24 2f mov r18, r20 } KeyWord >>= 2; - 34d6: 96 95 lsr r25 - 34d8: 87 95 ror r24 34da: 96 95 lsr r25 34dc: 87 95 ror r24 + 34de: 96 95 lsr r25 + 34e0: 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; - 34de: 36 95 lsr r19 + 34e2: 36 95 lsr r19 OddByte >>= 1; - 34e0: 26 95 lsr r18 + 34e4: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 34e2: 53 2f mov r21, r19 - 34e4: 50 68 ori r21, 0x80 ; 128 + 34e6: 43 2f mov r20, r19 + 34e8: 40 68 ori r20, 0x80 ; 128 + 34ea: 80 fd sbrc r24, 0 + 34ec: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 34e6: 42 2f mov r20, r18 - 34e8: 40 68 ori r20, 0x80 ; 128 - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - 34ea: 80 fd sbrc r24, 0 - 34ec: 35 2f mov r19, r21 - 34ee: 30 93 e5 20 sts 0x20E5, r19 - StateOdd[i] = OddByte; + 34ee: 42 2f mov r20, r18 + 34f0: 40 68 ori r20, 0x80 ; 128 34f2: 81 fd sbrc r24, 1 34f4: 24 2f mov r18, r20 - 34f6: 20 93 e2 20 sts 0x20E2, 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]; - 34fa: 33 81 ldd r19, Z+3 ; 0x03 - 34fc: 20 e0 ldi r18, 0x00 ; 0 - 34fe: 82 81 ldd r24, Z+2 ; 0x02 - 3500: 90 e0 ldi r25, 0x00 ; 0 - 3502: 82 2b or r24, r18 - 3504: 93 2b or r25, r19 - 3506: 80 fd sbrc r24, 0 - 3508: 3e c1 rjmp .+636 ; 0x3786 - 350a: 30 e0 ldi r19, 0x00 ; 0 - 350c: 81 fd sbrc r24, 1 - 350e: 39 c1 rjmp .+626 ; 0x3782 - 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 + 34f6: 96 95 lsr r25 + 34f8: 87 95 ror r24 + 34fa: 96 95 lsr r25 + 34fc: 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 + 34fe: 36 95 lsr r19 OddByte >>= 1; - 3534: 26 95 lsr r18 + 3500: 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 + 3502: 53 2f mov r21, r19 + 3504: 50 68 ori r21, 0x80 ; 128 } 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 + 3506: 42 2f mov r20, r18 + 3508: 40 68 ori r20, 0x80 ; 128 + } + + KeyWord >>= 2; + } + + StateEven[i] = EvenByte; + 350a: 80 fd sbrc r24, 0 + 350c: 35 2f mov r19, r21 + 350e: 30 93 e5 20 sts 0x20E5, r19 + StateOdd[i] = OddByte; + 3512: 81 fd sbrc r24, 1 + 3514: 24 2f mov r18, r20 + 3516: 20 93 e2 20 sts 0x20E2, r18 + * The inner loop generates 8 even and 8 odd bits from 16 key bits and + * the outer loop stores them. */ + for (i=0; i<(LFSR_SIZE/2); i++) { + uint8_t EvenByte = 0; + uint8_t OddByte = 0; + uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; + 351a: 33 81 ldd r19, Z+3 ; 0x03 + 351c: 20 e0 ldi r18, 0x00 ; 0 + 351e: 82 81 ldd r24, Z+2 ; 0x02 + 3520: 90 e0 ldi r25, 0x00 ; 0 + 3522: 82 2b or r24, r18 + 3524: 93 2b or r25, r19 + 3526: 80 fd sbrc r24, 0 + 3528: 3e c1 rjmp .+636 ; 0x37a6 + 352a: 30 e0 ldi r19, 0x00 ; 0 + 352c: 81 fd sbrc r24, 1 + 352e: 39 c1 rjmp .+626 ; 0x37a2 + 3530: 20 e0 ldi r18, 0x00 ; 0 + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + } + + KeyWord >>= 2; + 3532: 96 95 lsr r25 + 3534: 87 95 ror r24 + 3536: 96 95 lsr r25 + 3538: 87 95 ror r24 + for (j=0; j<8; j++) { + EvenByte >>= 1; + OddByte >>= 1; + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 353a: 43 2f mov r20, r19 + 353c: 40 68 ori r20, 0x80 ; 128 + 353e: 80 fd sbrc r24, 0 + 3540: 34 2f mov r19, r20 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 3542: 42 2f mov r20, r18 + 3544: 40 68 ori r20, 0x80 ; 128 + 3546: 81 fd sbrc r24, 1 + 3548: 24 2f mov r18, r20 } KeyWord >>= 2; - 3546: 96 95 lsr r25 - 3548: 87 95 ror r24 354a: 96 95 lsr r25 354c: 87 95 ror r24 + 354e: 96 95 lsr r25 + 3550: 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 + 3552: 36 95 lsr r19 OddByte >>= 1; - 3550: 26 95 lsr r18 + 3554: 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 + 3556: 43 2f mov r20, r19 + 3558: 40 68 ori r20, 0x80 ; 128 + 355a: 80 fd sbrc r24, 0 + 355c: 34 2f mov r19, r20 } 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 + 355e: 42 2f mov r20, r18 + 3560: 40 68 ori r20, 0x80 ; 128 + 3562: 81 fd sbrc r24, 1 + 3564: 24 2f mov r18, r20 } KeyWord >>= 2; - 3562: 96 95 lsr r25 - 3564: 87 95 ror r24 3566: 96 95 lsr r25 3568: 87 95 ror r24 + 356a: 96 95 lsr r25 + 356c: 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 + 356e: 36 95 lsr r19 OddByte >>= 1; - 356c: 26 95 lsr r18 + 3570: 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 + 3572: 43 2f mov r20, r19 + 3574: 40 68 ori r20, 0x80 ; 128 + 3576: 80 fd sbrc r24, 0 + 3578: 34 2f mov r19, r20 } 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 + 357a: 42 2f mov r20, r18 + 357c: 40 68 ori r20, 0x80 ; 128 + 357e: 81 fd sbrc r24, 1 + 3580: 24 2f mov r18, r20 } KeyWord >>= 2; - 357e: 96 95 lsr r25 - 3580: 87 95 ror r24 3582: 96 95 lsr r25 3584: 87 95 ror r24 + 3586: 96 95 lsr r25 + 3588: 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 + 358a: 36 95 lsr r19 OddByte >>= 1; - 3588: 26 95 lsr r18 + 358c: 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 + 358e: 43 2f mov r20, r19 + 3590: 40 68 ori r20, 0x80 ; 128 + 3592: 80 fd sbrc r24, 0 + 3594: 34 2f mov r19, r20 } 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 + 3596: 42 2f mov r20, r18 + 3598: 40 68 ori r20, 0x80 ; 128 + 359a: 81 fd sbrc r24, 1 + 359c: 24 2f mov r18, r20 } KeyWord >>= 2; - 359a: 96 95 lsr r25 - 359c: 87 95 ror r24 359e: 96 95 lsr r25 35a0: 87 95 ror r24 + 35a2: 96 95 lsr r25 + 35a4: 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 + 35a6: 36 95 lsr r19 OddByte >>= 1; - 35a4: 26 95 lsr r18 + 35a8: 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 + 35aa: 43 2f mov r20, r19 + 35ac: 40 68 ori r20, 0x80 ; 128 + 35ae: 80 fd sbrc r24, 0 + 35b0: 34 2f mov r19, r20 } 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 + 35b2: 42 2f mov r20, r18 + 35b4: 40 68 ori r20, 0x80 ; 128 + 35b6: 81 fd sbrc r24, 1 + 35b8: 24 2f mov r18, r20 } KeyWord >>= 2; - 35b6: 96 95 lsr r25 - 35b8: 87 95 ror r24 35ba: 96 95 lsr r25 35bc: 87 95 ror r24 + 35be: 96 95 lsr r25 + 35c0: 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 + 35c2: 36 95 lsr r19 OddByte >>= 1; - 35c0: 26 95 lsr r18 + 35c4: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 35c2: 53 2f mov r21, r19 - 35c4: 50 68 ori r21, 0x80 ; 128 + 35c6: 43 2f mov r20, r19 + 35c8: 40 68 ori r20, 0x80 ; 128 + 35ca: 80 fd sbrc r24, 0 + 35cc: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 35c6: 42 2f mov r20, r18 - 35c8: 40 68 ori r20, 0x80 ; 128 + 35ce: 42 2f mov r20, r18 + 35d0: 40 68 ori r20, 0x80 ; 128 + 35d2: 81 fd sbrc r24, 1 + 35d4: 24 2f mov r18, r20 + } + + KeyWord >>= 2; + 35d6: 96 95 lsr r25 + 35d8: 87 95 ror r24 + 35da: 96 95 lsr r25 + 35dc: 87 95 ror r24 + uint8_t OddByte = 0; + uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; + uint8_t j; + + for (j=0; j<8; j++) { + EvenByte >>= 1; + 35de: 36 95 lsr r19 + OddByte >>= 1; + 35e0: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 35e2: 53 2f mov r21, r19 + 35e4: 50 68 ori r21, 0x80 ; 128 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 35e6: 42 2f mov r20, r18 + 35e8: 40 68 ori r20, 0x80 ; 128 } KeyWord >>= 2; } StateEven[i] = EvenByte; - 35ca: 80 fd sbrc r24, 0 - 35cc: 35 2f mov r19, r21 - 35ce: 30 93 e6 20 sts 0x20E6, r19 + 35ea: 80 fd sbrc r24, 0 + 35ec: 35 2f mov r19, r21 + 35ee: 30 93 e6 20 sts 0x20E6, r19 StateOdd[i] = OddByte; - 35d2: 81 fd sbrc r24, 1 - 35d4: 24 2f mov r18, r20 - 35d6: 20 93 e3 20 sts 0x20E3, r18 + 35f2: 81 fd sbrc r24, 1 + 35f4: 24 2f mov r18, r20 + 35f6: 20 93 e3 20 sts 0x20E3, 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: 95 81 ldd r25, Z+5 ; 0x05 - 35dc: 80 e0 ldi r24, 0x00 ; 0 - 35de: 24 81 ldd r18, Z+4 ; 0x04 - 35e0: 30 e0 ldi r19, 0x00 ; 0 - 35e2: 28 2b or r18, r24 - 35e4: 39 2b or r19, r25 - 35e6: 20 fd sbrc r18, 0 - 35e8: ca c0 rjmp .+404 ; 0x377e - 35ea: 50 e0 ldi r21, 0x00 ; 0 - 35ec: 21 fd sbrc r18, 1 - 35ee: c5 c0 rjmp .+394 ; 0x377a - 35f0: 40 e0 ldi r20, 0x00 ; 0 + 35fa: 95 81 ldd r25, Z+5 ; 0x05 + 35fc: 80 e0 ldi r24, 0x00 ; 0 + 35fe: 24 81 ldd r18, Z+4 ; 0x04 + 3600: 30 e0 ldi r19, 0x00 ; 0 + 3602: 28 2b or r18, r24 + 3604: 39 2b or r19, r25 + 3606: 20 fd sbrc r18, 0 + 3608: ca c0 rjmp .+404 ; 0x379e + 360a: 50 e0 ldi r21, 0x00 ; 0 + 360c: 21 fd sbrc r18, 1 + 360e: c5 c0 rjmp .+394 ; 0x379a + 3610: 40 e0 ldi r20, 0x00 ; 0 if (KeyWord & (1<<1)) { OddByte |= 0x80; } KeyWord >>= 2; - 35f2: c9 01 movw r24, r18 - 35f4: 96 95 lsr r25 - 35f6: 87 95 ror r24 - 35f8: 96 95 lsr r25 - 35fa: 87 95 ror r24 + 3612: c9 01 movw r24, r18 + 3614: 96 95 lsr r25 + 3616: 87 95 ror r24 + 3618: 96 95 lsr r25 + 361a: 87 95 ror r24 for (j=0; j<8; j++) { EvenByte >>= 1; OddByte >>= 1; if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 35fc: 35 2f mov r19, r21 - 35fe: 30 68 ori r19, 0x80 ; 128 - 3600: 80 ff sbrs r24, 0 - 3602: 35 2f mov r19, r21 + 361c: 35 2f mov r19, r21 + 361e: 30 68 ori r19, 0x80 ; 128 + 3620: 80 ff sbrs r24, 0 + 3622: 35 2f mov r19, r21 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3604: 24 2f mov r18, r20 - 3606: 20 68 ori r18, 0x80 ; 128 - 3608: 81 ff sbrs r24, 1 - 360a: 24 2f mov r18, r20 + 3624: 24 2f mov r18, r20 + 3626: 20 68 ori r18, 0x80 ; 128 + 3628: 81 ff sbrs r24, 1 + 362a: 24 2f mov r18, r20 } KeyWord >>= 2; - 360c: 96 95 lsr r25 - 360e: 87 95 ror r24 - 3610: 96 95 lsr r25 - 3612: 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; - 3614: 36 95 lsr r19 - OddByte >>= 1; - 3616: 26 95 lsr r18 - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - 3618: 43 2f mov r20, r19 - 361a: 40 68 ori r20, 0x80 ; 128 - 361c: 80 fd sbrc r24, 0 - 361e: 34 2f mov r19, r20 - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - 3620: 42 2f mov r20, r18 - 3622: 40 68 ori r20, 0x80 ; 128 - 3624: 81 fd sbrc r24, 1 - 3626: 24 2f mov r18, r20 - } - - KeyWord >>= 2; - 3628: 96 95 lsr r25 - 362a: 87 95 ror r24 362c: 96 95 lsr r25 362e: 87 95 ror r24 + 3630: 96 95 lsr r25 + 3632: 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; - 3630: 36 95 lsr r19 + 3634: 36 95 lsr r19 OddByte >>= 1; - 3632: 26 95 lsr r18 + 3636: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3634: 43 2f mov r20, r19 - 3636: 40 68 ori r20, 0x80 ; 128 - 3638: 80 fd sbrc r24, 0 - 363a: 34 2f mov r19, r20 + 3638: 43 2f mov r20, r19 + 363a: 40 68 ori r20, 0x80 ; 128 + 363c: 80 fd sbrc r24, 0 + 363e: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 363c: 42 2f mov r20, r18 - 363e: 40 68 ori r20, 0x80 ; 128 - 3640: 81 fd sbrc r24, 1 - 3642: 24 2f mov r18, r20 + 3640: 42 2f mov r20, r18 + 3642: 40 68 ori r20, 0x80 ; 128 + 3644: 81 fd sbrc r24, 1 + 3646: 24 2f mov r18, r20 } KeyWord >>= 2; - 3644: 96 95 lsr r25 - 3646: 87 95 ror r24 3648: 96 95 lsr r25 364a: 87 95 ror r24 + 364c: 96 95 lsr r25 + 364e: 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; - 364c: 36 95 lsr r19 + 3650: 36 95 lsr r19 OddByte >>= 1; - 364e: 26 95 lsr r18 + 3652: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3650: 43 2f mov r20, r19 - 3652: 40 68 ori r20, 0x80 ; 128 - 3654: 80 fd sbrc r24, 0 - 3656: 34 2f mov r19, r20 + 3654: 43 2f mov r20, r19 + 3656: 40 68 ori r20, 0x80 ; 128 + 3658: 80 fd sbrc r24, 0 + 365a: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3658: 42 2f mov r20, r18 - 365a: 40 68 ori r20, 0x80 ; 128 - 365c: 81 fd sbrc r24, 1 - 365e: 24 2f mov r18, r20 + 365c: 42 2f mov r20, r18 + 365e: 40 68 ori r20, 0x80 ; 128 + 3660: 81 fd sbrc r24, 1 + 3662: 24 2f mov r18, r20 } KeyWord >>= 2; - 3660: 96 95 lsr r25 - 3662: 87 95 ror r24 3664: 96 95 lsr r25 3666: 87 95 ror r24 + 3668: 96 95 lsr r25 + 366a: 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; - 3668: 36 95 lsr r19 + 366c: 36 95 lsr r19 OddByte >>= 1; - 366a: 26 95 lsr r18 + 366e: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 366c: 43 2f mov r20, r19 - 366e: 40 68 ori r20, 0x80 ; 128 - 3670: 80 fd sbrc r24, 0 - 3672: 34 2f mov r19, r20 + 3670: 43 2f mov r20, r19 + 3672: 40 68 ori r20, 0x80 ; 128 + 3674: 80 fd sbrc r24, 0 + 3676: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3674: 42 2f mov r20, r18 - 3676: 40 68 ori r20, 0x80 ; 128 - 3678: 81 fd sbrc r24, 1 - 367a: 24 2f mov r18, r20 + 3678: 42 2f mov r20, r18 + 367a: 40 68 ori r20, 0x80 ; 128 + 367c: 81 fd sbrc r24, 1 + 367e: 24 2f mov r18, r20 } KeyWord >>= 2; - 367c: 96 95 lsr r25 - 367e: 87 95 ror r24 3680: 96 95 lsr r25 3682: 87 95 ror r24 + 3684: 96 95 lsr r25 + 3686: 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; - 3684: 36 95 lsr r19 + 3688: 36 95 lsr r19 OddByte >>= 1; - 3686: 26 95 lsr r18 + 368a: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 3688: 43 2f mov r20, r19 - 368a: 40 68 ori r20, 0x80 ; 128 - 368c: 80 fd sbrc r24, 0 - 368e: 34 2f mov r19, r20 + 368c: 43 2f mov r20, r19 + 368e: 40 68 ori r20, 0x80 ; 128 + 3690: 80 fd sbrc r24, 0 + 3692: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 3690: 42 2f mov r20, r18 - 3692: 40 68 ori r20, 0x80 ; 128 - 3694: 81 fd sbrc r24, 1 - 3696: 24 2f mov r18, r20 + 3694: 42 2f mov r20, r18 + 3696: 40 68 ori r20, 0x80 ; 128 + 3698: 81 fd sbrc r24, 1 + 369a: 24 2f mov r18, r20 } KeyWord >>= 2; - 3698: 96 95 lsr r25 - 369a: 87 95 ror r24 369c: 96 95 lsr r25 369e: 87 95 ror r24 + 36a0: 96 95 lsr r25 + 36a2: 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; - 36a0: 36 95 lsr r19 + 36a4: 36 95 lsr r19 OddByte >>= 1; - 36a2: 26 95 lsr r18 + 36a6: 26 95 lsr r18 if (KeyWord & (1<<0)) { EvenByte |= 0x80; - 36a4: 53 2f mov r21, r19 - 36a6: 50 68 ori r21, 0x80 ; 128 + 36a8: 43 2f mov r20, r19 + 36aa: 40 68 ori r20, 0x80 ; 128 + 36ac: 80 fd sbrc r24, 0 + 36ae: 34 2f mov r19, r20 } if (KeyWord & (1<<1)) { OddByte |= 0x80; - 36a8: 42 2f mov r20, r18 - 36aa: 40 68 ori r20, 0x80 ; 128 + 36b0: 42 2f mov r20, r18 + 36b2: 40 68 ori r20, 0x80 ; 128 + 36b4: 81 fd sbrc r24, 1 + 36b6: 24 2f mov r18, r20 + } + + KeyWord >>= 2; + 36b8: 96 95 lsr r25 + 36ba: 87 95 ror r24 + 36bc: 96 95 lsr r25 + 36be: 87 95 ror r24 + uint8_t OddByte = 0; + uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; + uint8_t j; + + for (j=0; j<8; j++) { + EvenByte >>= 1; + 36c0: 36 95 lsr r19 + OddByte >>= 1; + 36c2: 26 95 lsr r18 + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + 36c4: 53 2f mov r21, r19 + 36c6: 50 68 ori r21, 0x80 ; 128 + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + 36c8: 42 2f mov r20, r18 + 36ca: 40 68 ori r20, 0x80 ; 128 } KeyWord >>= 2; } StateEven[i] = EvenByte; - 36ac: 80 fd sbrc r24, 0 - 36ae: 35 2f mov r19, r21 - 36b0: 30 93 e7 20 sts 0x20E7, r19 + 36cc: 80 fd sbrc r24, 0 + 36ce: 35 2f mov r19, r21 + 36d0: 30 93 e7 20 sts 0x20E7, r19 StateOdd[i] = OddByte; - 36b4: 81 fd sbrc r24, 1 - 36b6: 24 2f mov r18, r20 - 36b8: 20 93 e4 20 sts 0x20E4, r18 + 36d4: 81 fd sbrc r24, 1 + 36d6: 24 2f mov r18, r20 + 36d8: 20 93 e4 20 sts 0x20E4, 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; - 36bc: c9 80 ldd r12, Y+1 ; 0x01 - 36be: db 01 movw r26, r22 - 36c0: 11 96 adiw r26, 0x01 ; 1 - 36c2: 8c 91 ld r24, X - 36c4: 11 97 sbiw r26, 0x01 ; 1 - 36c6: c8 26 eor r12, r24 - 36c8: dd 24 eor r13, r13 - 36ca: ee 24 eor r14, r14 - 36cc: ff 24 eor r15, r15 - 36ce: fe 2c mov r15, r14 - 36d0: ed 2c mov r14, r13 - 36d2: dc 2c mov r13, r12 - 36d4: cc 24 eor r12, r12 + 36dc: c9 80 ldd r12, Y+1 ; 0x01 + 36de: db 01 movw r26, r22 + 36e0: 11 96 adiw r26, 0x01 ; 1 + 36e2: 8c 91 ld r24, X + 36e4: 11 97 sbiw r26, 0x01 ; 1 + 36e6: c8 26 eor r12, r24 + 36e8: dd 24 eor r13, r13 + 36ea: ee 24 eor r14, r14 + 36ec: ff 24 eor r15, r15 + 36ee: fe 2c mov r15, r14 + 36f0: ed 2c mov r14, r13 + 36f2: dc 2c mov r13, r12 + 36f4: cc 24 eor r12, r12 Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 36d6: 8a 81 ldd r24, Y+2 ; 0x02 - 36d8: 12 96 adiw r26, 0x02 ; 2 - 36da: 9c 91 ld r25, X - 36dc: 89 27 eor r24, r25 - 36de: 90 e0 ldi r25, 0x00 ; 0 - 36e0: a0 e0 ldi r26, 0x00 ; 0 - 36e2: b0 e0 ldi r27, 0x00 ; 0 - 36e4: dc 01 movw r26, r24 - 36e6: 99 27 eor r25, r25 - 36e8: 88 27 eor r24, r24 + 36f6: 8a 81 ldd r24, Y+2 ; 0x02 + 36f8: 12 96 adiw r26, 0x02 ; 2 + 36fa: 9c 91 ld r25, X + 36fc: 89 27 eor r24, r25 + 36fe: 90 e0 ldi r25, 0x00 ; 0 + 3700: a0 e0 ldi r26, 0x00 ; 0 + 3702: b0 e0 ldi r27, 0x00 ; 0 + 3704: dc 01 movw r26, r24 + 3706: 99 27 eor r25, r25 + 3708: 88 27 eor r24, r24 /* 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; - 36ea: c8 2a or r12, r24 - 36ec: d9 2a or r13, r25 - 36ee: ea 2a or r14, r26 - 36f0: fb 2a or r15, r27 + 370a: c8 2a or r12, r24 + 370c: d9 2a or r13, r25 + 370e: ea 2a or r14, r26 + 3710: fb 2a or r15, r27 /* 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; - 36f2: 88 81 ld r24, Y - 36f4: fb 01 movw r30, r22 - 36f6: 90 81 ld r25, Z - 36f8: 89 27 eor r24, r25 - 36fa: 90 e0 ldi r25, 0x00 ; 0 - 36fc: a0 e0 ldi r26, 0x00 ; 0 - 36fe: b0 e0 ldi r27, 0x00 ; 0 + 3712: 88 81 ld r24, Y + 3714: fb 01 movw r30, r22 + 3716: 90 81 ld r25, Z + 3718: 89 27 eor r24, r25 + 371a: 90 e0 ldi r25, 0x00 ; 0 + 371c: a0 e0 ldi r26, 0x00 ; 0 + 371e: b0 e0 ldi r27, 0x00 ; 0 Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - 3700: c8 2a or r12, r24 - 3702: d9 2a or r13, r25 - 3704: ea 2a or r14, r26 - 3706: fb 2a or r15, r27 + 3720: c8 2a or r12, r24 + 3722: d9 2a or r13, r25 + 3724: ea 2a or r14, r26 + 3726: fb 2a or r15, r27 Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; - 3708: 8b 81 ldd r24, Y+3 ; 0x03 - 370a: 93 81 ldd r25, Z+3 ; 0x03 - 370c: 89 27 eor r24, r25 - 370e: 90 e0 ldi r25, 0x00 ; 0 - 3710: a0 e0 ldi r26, 0x00 ; 0 - 3712: b0 e0 ldi r27, 0x00 ; 0 - 3714: b8 2f mov r27, r24 - 3716: aa 27 eor r26, r26 - 3718: 99 27 eor r25, r25 - 371a: 88 27 eor r24, r24 - 371c: c8 2a or r12, r24 - 371e: d9 2a or r13, r25 - 3720: ea 2a or r14, r26 - 3722: fb 2a or r15, r27 - 3724: 10 e2 ldi r17, 0x20 ; 32 + 3728: 8b 81 ldd r24, Y+3 ; 0x03 + 372a: 93 81 ldd r25, Z+3 ; 0x03 + 372c: 89 27 eor r24, r25 + 372e: 90 e0 ldi r25, 0x00 ; 0 + 3730: a0 e0 ldi r26, 0x00 ; 0 + 3732: b0 e0 ldi r27, 0x00 ; 0 + 3734: b8 2f mov r27, r24 + 3736: aa 27 eor r26, r26 + 3738: 99 27 eor r25, r25 + 373a: 88 27 eor r24, r24 + 373c: c8 2a or r12, r24 + 373e: d9 2a or r13, r25 + 3740: ea 2a or r14, r26 + 3742: fb 2a or r15, r27 + 3744: 10 e2 ldi r17, 0x20 ; 32 for (i=0; i<32; i++) { uint8_t Out = Crypto1FilterOutput(); - 3726: 3b de rcall .-906 ; 0x339e - 3728: 08 2f mov r16, r24 - 372a: 8c 2d mov r24, r12 + 3746: 3b de rcall .-906 ; 0x33be + 3748: 08 2f mov r16, r24 + 374a: 8c 2d mov r24, r12 Crypto1LFSR(Temp & 0x01); - 372c: 81 70 andi r24, 0x01 ; 1 - 372e: d0 dd rcall .-1120 ; 0x32d0 - 3730: f6 94 lsr r15 - 3732: e7 94 ror r14 + 374c: 81 70 andi r24, 0x01 ; 1 + 374e: d0 dd rcall .-1120 ; 0x32f0 + 3750: f6 94 lsr r15 + 3752: e7 94 ror r14 Temp >>= 1; - 3734: d7 94 ror r13 - 3736: c7 94 ror r12 - 3738: 00 23 and r16, r16 - 373a: 41 f0 breq .+16 ; 0x374c + 3754: d7 94 ror r13 + 3756: c7 94 ror r12 + 3758: 00 23 and r16, r16 + 375a: 41 f0 breq .+16 ; 0x376c /* Store the keystream for later use */ if (Out) { - 373c: 80 e0 ldi r24, 0x00 ; 0 - 373e: 90 e0 ldi r25, 0x00 ; 0 + 375c: 80 e0 ldi r24, 0x00 ; 0 + 375e: 90 e0 ldi r25, 0x00 ; 0 Temp |= (uint32_t) 1 << 31; - 3740: a0 e0 ldi r26, 0x00 ; 0 - 3742: b0 e8 ldi r27, 0x80 ; 128 - 3744: c8 2a or r12, r24 - 3746: d9 2a or r13, r25 - 3748: ea 2a or r14, r26 - 374a: fb 2a or r15, r27 - 374c: 11 50 subi r17, 0x01 ; 1 - 374e: 59 f7 brne .-42 ; 0x3726 - 3750: 88 81 ld r24, Y + 3760: a0 e0 ldi r26, 0x00 ; 0 + 3762: b0 e8 ldi r27, 0x80 ; 128 + 3764: c8 2a or r12, r24 + 3766: d9 2a or r13, r25 + 3768: ea 2a or r14, r26 + 376a: fb 2a or r15, r27 + 376c: 11 50 subi r17, 0x01 ; 1 + 376e: 59 f7 brne .-42 ; 0x3746 + 3770: 88 81 ld r24, Y 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++) { - 3752: 8c 25 eor r24, r12 + 3772: 8c 25 eor r24, r12 } /* 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); - 3754: 88 83 st Y, r24 - 3756: 89 81 ldd r24, Y+1 ; 0x01 - 3758: 8d 25 eor r24, r13 + 3774: 88 83 st Y, r24 + 3776: 89 81 ldd r24, Y+1 ; 0x01 + 3778: 8d 25 eor r24, r13 CardNonce[1] ^= (uint8_t) (Temp >> 8); - 375a: 89 83 std Y+1, r24 ; 0x01 - 375c: 8a 81 ldd r24, Y+2 ; 0x02 - 375e: 8e 25 eor r24, r14 + 377a: 89 83 std Y+1, r24 ; 0x01 + 377c: 8a 81 ldd r24, Y+2 ; 0x02 + 377e: 8e 25 eor r24, r14 CardNonce[2] ^= (uint8_t) (Temp >> 16); - 3760: 8a 83 std Y+2, r24 ; 0x02 - 3762: 8b 81 ldd r24, Y+3 ; 0x03 - 3764: 8f 25 eor r24, r15 + 3780: 8a 83 std Y+2, r24 ; 0x02 + 3782: 8b 81 ldd r24, Y+3 ; 0x03 + 3784: 8f 25 eor r24, r15 CardNonce[3] ^= (uint8_t) (Temp >> 24); - 3766: 8b 83 std Y+3, r24 ; 0x03 - 3768: df 91 pop r29 - 376a: cf 91 pop r28 + 3786: 8b 83 std Y+3, r24 ; 0x03 + 3788: df 91 pop r29 + 378a: cf 91 pop r28 } - 376c: 1f 91 pop r17 - 376e: 0f 91 pop r16 - 3770: ff 90 pop r15 - 3772: ef 90 pop r14 - 3774: df 90 pop r13 - 3776: cf 90 pop r12 - 3778: 08 95 ret - 377a: 40 e4 ldi r20, 0x40 ; 64 - 377c: 3a cf rjmp .-396 ; 0x35f2 + 378c: 1f 91 pop r17 + 378e: 0f 91 pop r16 + 3790: ff 90 pop r15 + 3792: ef 90 pop r14 + 3794: df 90 pop r13 + 3796: cf 90 pop r12 + 3798: 08 95 ret + 379a: 40 e4 ldi r20, 0x40 ; 64 + 379c: 3a cf rjmp .-396 ; 0x3612 * The inner loop generates 8 even and 8 odd bits from 16 key bits and * the outer loop stores them. */ for (i=0; i<(LFSR_SIZE/2); i++) { uint8_t EvenByte = 0; uint8_t OddByte = 0; uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - 377e: 50 e4 ldi r21, 0x40 ; 64 - 3780: 35 cf rjmp .-406 ; 0x35ec - 3782: 20 e4 ldi r18, 0x40 ; 64 - 3784: c6 ce rjmp .-628 ; 0x3512 - 3786: 30 e4 ldi r19, 0x40 ; 64 - 3788: c1 ce rjmp .-638 ; 0x350c - 378a: 20 e4 ldi r18, 0x40 ; 64 - 378c: 52 ce rjmp .-860 ; 0x3432 - 378e: 30 e4 ldi r19, 0x40 ; 64 - 3790: 4d ce rjmp .-870 ; 0x342c + 379e: 50 e4 ldi r21, 0x40 ; 64 + 37a0: 35 cf rjmp .-406 ; 0x360c + 37a2: 20 e4 ldi r18, 0x40 ; 64 + 37a4: c6 ce rjmp .-628 ; 0x3532 + 37a6: 30 e4 ldi r19, 0x40 ; 64 + 37a8: c1 ce rjmp .-638 ; 0x352c + 37aa: 20 e4 ldi r18, 0x40 ; 64 + 37ac: 52 ce rjmp .-860 ; 0x3452 + 37ae: 30 e4 ldi r19, 0x40 ; 64 + 37b0: 4d ce rjmp .-870 ; 0x344c -00003792 : - 3792: cf 92 push r12 - 3794: df 92 push r13 +000037b2 : + 37b2: cf 92 push r12 + 37b4: df 92 push r13 CardNonce[2] ^= (uint8_t) (Temp >> 16); CardNonce[3] ^= (uint8_t) (Temp >> 24); } void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) { - 3796: ef 92 push r14 - 3798: ff 92 push r15 - 379a: cf 93 push r28 - 379c: fc 01 movw r30, r24 + 37b6: ef 92 push r14 + 37b8: ff 92 push r15 + 37ba: cf 93 push r28 + 37bc: 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; - 379e: c1 80 ldd r12, Z+1 ; 0x01 - 37a0: dd 24 eor r13, r13 - 37a2: ee 24 eor r14, r14 - 37a4: ff 24 eor r15, r15 - 37a6: fe 2c mov r15, r14 - 37a8: ed 2c mov r14, r13 - 37aa: dc 2c mov r13, r12 - 37ac: cc 24 eor r12, r12 + 37be: c1 80 ldd r12, Z+1 ; 0x01 + 37c0: dd 24 eor r13, r13 + 37c2: ee 24 eor r14, r14 + 37c4: ff 24 eor r15, r15 + 37c6: fe 2c mov r15, r14 + 37c8: ed 2c mov r14, r13 + 37ca: dc 2c mov r13, r12 + 37cc: cc 24 eor r12, r12 Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 37ae: 82 81 ldd r24, Z+2 ; 0x02 - 37b0: 90 e0 ldi r25, 0x00 ; 0 - 37b2: a0 e0 ldi r26, 0x00 ; 0 - 37b4: b0 e0 ldi r27, 0x00 ; 0 - 37b6: dc 01 movw r26, r24 - 37b8: 99 27 eor r25, r25 - 37ba: 88 27 eor r24, r24 + 37ce: 82 81 ldd r24, Z+2 ; 0x02 + 37d0: 90 e0 ldi r25, 0x00 ; 0 + 37d2: a0 e0 ldi r26, 0x00 ; 0 + 37d4: b0 e0 ldi r27, 0x00 ; 0 + 37d6: dc 01 movw r26, r24 + 37d8: 99 27 eor r25, r25 + 37da: 88 27 eor r24, r24 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; - 37bc: c8 2a or r12, r24 - 37be: d9 2a or r13, r25 - 37c0: ea 2a or r14, r26 - 37c2: fb 2a or r15, r27 + 37dc: c8 2a or r12, r24 + 37de: d9 2a or r13, r25 + 37e0: ea 2a or r14, r26 + 37e2: fb 2a or r15, r27 { 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; - 37c4: 80 81 ld r24, Z - 37c6: 90 e0 ldi r25, 0x00 ; 0 - 37c8: a0 e0 ldi r26, 0x00 ; 0 - 37ca: b0 e0 ldi r27, 0x00 ; 0 + 37e4: 80 81 ld r24, Z + 37e6: 90 e0 ldi r25, 0x00 ; 0 + 37e8: a0 e0 ldi r26, 0x00 ; 0 + 37ea: b0 e0 ldi r27, 0x00 ; 0 Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - 37cc: c8 2a or r12, r24 - 37ce: d9 2a or r13, r25 - 37d0: ea 2a or r14, r26 - 37d2: fb 2a or r15, r27 + 37ec: c8 2a or r12, r24 + 37ee: d9 2a or r13, r25 + 37f0: ea 2a or r14, r26 + 37f2: fb 2a or r15, r27 Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; - 37d4: 83 81 ldd r24, Z+3 ; 0x03 - 37d6: 90 e0 ldi r25, 0x00 ; 0 - 37d8: a0 e0 ldi r26, 0x00 ; 0 - 37da: b0 e0 ldi r27, 0x00 ; 0 - 37dc: b8 2f mov r27, r24 - 37de: aa 27 eor r26, r26 - 37e0: 99 27 eor r25, r25 - 37e2: 88 27 eor r24, r24 - 37e4: c8 2a or r12, r24 - 37e6: d9 2a or r13, r25 - 37e8: ea 2a or r14, r26 - 37ea: fb 2a or r15, r27 - 37ec: c0 e2 ldi r28, 0x20 ; 32 + 37f4: 83 81 ldd r24, Z+3 ; 0x03 + 37f6: 90 e0 ldi r25, 0x00 ; 0 + 37f8: a0 e0 ldi r26, 0x00 ; 0 + 37fa: b0 e0 ldi r27, 0x00 ; 0 + 37fc: b8 2f mov r27, r24 + 37fe: aa 27 eor r26, r26 + 3800: 99 27 eor r25, r25 + 3802: 88 27 eor r24, r24 + 3804: c8 2a or r12, r24 + 3806: d9 2a or r13, r25 + 3808: ea 2a or r14, r26 + 380a: fb 2a or r15, r27 + 380c: c0 e2 ldi r28, 0x20 ; 32 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(); - 37ee: d7 dd rcall .-1106 ; 0x339e - 37f0: 9c 2d mov r25, r12 + 380e: d7 dd rcall .-1106 ; 0x33be + 3810: 9c 2d mov r25, r12 uint8_t Bit = Out ^ (Temp & 0x01); - 37f2: 91 70 andi r25, 0x01 ; 1 - 37f4: 89 27 eor r24, r25 + 3812: 91 70 andi r25, 0x01 ; 1 + 3814: 89 27 eor r24, r25 /* Feed back the bit to load the LFSR with the (decrypted) nonce */ Crypto1LFSR(Bit); - 37f6: 6c dd rcall .-1320 ; 0x32d0 - 37f8: f6 94 lsr r15 - 37fa: e7 94 ror r14 + 3816: 6c dd rcall .-1320 ; 0x32f0 + 3818: f6 94 lsr r15 + 381a: e7 94 ror r14 Temp >>= 1; - 37fc: d7 94 ror r13 - 37fe: c7 94 ror r12 - 3800: c1 50 subi r28, 0x01 ; 1 - 3802: a9 f7 brne .-22 ; 0x37ee - 3804: cf 91 pop r28 + 381c: d7 94 ror r13 + 381e: c7 94 ror r12 + 3820: c1 50 subi r28, 0x01 ; 1 + 3822: a9 f7 brne .-22 ; 0x380e + 3824: cf 91 pop r28 Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; uint8_t i; for (i=0; i<32; i++) { - 3806: ff 90 pop r15 + 3826: ff 90 pop r15 /* Feed back the bit to load the LFSR with the (decrypted) nonce */ Crypto1LFSR(Bit); Temp >>= 1; } } - 3808: ef 90 pop r14 - 380a: df 90 pop r13 - 380c: cf 90 pop r12 - 380e: 08 95 ret + 3828: ef 90 pop r14 + 382a: df 90 pop r13 + 382c: cf 90 pop r12 + 382e: 08 95 ret -00003810 : - 3810: cf 93 push r28 - 3812: df 93 push r29 +00003830 : + 3830: cf 93 push r28 + 3832: 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(); - 3814: c4 dd rcall .-1144 ; 0x339e - 3816: c8 2f mov r28, r24 - 3818: 80 e0 ldi r24, 0x00 ; 0 + 3834: c4 dd rcall .-1144 ; 0x33be + 3836: c8 2f mov r28, r24 + 3838: 80 e0 ldi r24, 0x00 ; 0 Crypto1LFSR(0); - 381a: 5a dd rcall .-1356 ; 0x32d0 - 381c: cc 23 and r28, r28 - 381e: 09 f4 brne .+2 ; 0x3822 + 383a: 5a dd rcall .-1356 ; 0x32f0 + 383c: cc 23 and r28, r28 + 383e: 09 f4 brne .+2 ; 0x3842 /* Store keystream bit */ KeyStream >>= 1; if (Out) { - 3820: 36 c0 rjmp .+108 ; 0x388e - 3822: c0 e8 ldi r28, 0x80 ; 128 - 3824: bc dd rcall .-1160 ; 0x339e + 3840: 36 c0 rjmp .+108 ; 0x38ae + 3842: c0 e8 ldi r28, 0x80 ; 128 + 3844: bc dd rcall .-1160 ; 0x33be KeyStream |= (1<<7); - 3826: d8 2f mov r29, r24 + 3846: d8 2f mov r29, r24 /* 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(); - 3828: 80 e0 ldi r24, 0x00 ; 0 - 382a: 52 dd rcall .-1372 ; 0x32d0 - 382c: c6 95 lsr r28 + 3848: 80 e0 ldi r24, 0x00 ; 0 + 384a: 52 dd rcall .-1372 ; 0x32f0 + 384c: c6 95 lsr r28 Crypto1LFSR(0); - 382e: d1 11 cpse r29, r1 - 3830: c0 68 ori r28, 0x80 ; 128 - 3832: b5 dd rcall .-1174 ; 0x339e + 384e: d1 11 cpse r29, r1 + 3850: c0 68 ori r28, 0x80 ; 128 + 3852: b5 dd rcall .-1174 ; 0x33be /* Store keystream bit */ KeyStream >>= 1; - 3834: d8 2f mov r29, r24 + 3854: d8 2f mov r29, r24 if (Out) { - 3836: 80 e0 ldi r24, 0x00 ; 0 + 3856: 80 e0 ldi r24, 0x00 ; 0 KeyStream |= (1<<7); - 3838: 4b dd rcall .-1386 ; 0x32d0 + 3858: 4b dd rcall .-1386 ; 0x32f0 /* 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(); - 383a: c6 95 lsr r28 - 383c: d1 11 cpse r29, r1 - 383e: c0 68 ori r28, 0x80 ; 128 + 385a: c6 95 lsr r28 + 385c: d1 11 cpse r29, r1 + 385e: c0 68 ori r28, 0x80 ; 128 Crypto1LFSR(0); - 3840: ae dd rcall .-1188 ; 0x339e - 3842: d8 2f mov r29, r24 - 3844: 80 e0 ldi r24, 0x00 ; 0 + 3860: ae dd rcall .-1188 ; 0x33be + 3862: d8 2f mov r29, r24 + 3864: 80 e0 ldi r24, 0x00 ; 0 /* Store keystream bit */ KeyStream >>= 1; - 3846: 44 dd rcall .-1400 ; 0x32d0 + 3866: 44 dd rcall .-1400 ; 0x32f0 if (Out) { - 3848: c6 95 lsr r28 + 3868: c6 95 lsr r28 KeyStream |= (1<<7); - 384a: d1 11 cpse r29, r1 + 386a: d1 11 cpse r29, r1 /* 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(); - 384c: c0 68 ori r28, 0x80 ; 128 - 384e: a7 dd rcall .-1202 ; 0x339e - 3850: d8 2f mov r29, r24 + 386c: c0 68 ori r28, 0x80 ; 128 + 386e: a7 dd rcall .-1202 ; 0x33be + 3870: d8 2f mov r29, r24 Crypto1LFSR(0); - 3852: 80 e0 ldi r24, 0x00 ; 0 - 3854: 3d dd rcall .-1414 ; 0x32d0 - 3856: c6 95 lsr r28 + 3872: 80 e0 ldi r24, 0x00 ; 0 + 3874: 3d dd rcall .-1414 ; 0x32f0 + 3876: c6 95 lsr r28 /* Store keystream bit */ KeyStream >>= 1; - 3858: d1 11 cpse r29, r1 + 3878: d1 11 cpse r29, r1 if (Out) { - 385a: c0 68 ori r28, 0x80 ; 128 + 387a: c0 68 ori r28, 0x80 ; 128 KeyStream |= (1<<7); - 385c: a0 dd rcall .-1216 ; 0x339e + 387c: a0 dd rcall .-1216 ; 0x33be /* 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(); - 385e: d8 2f mov r29, r24 - 3860: 80 e0 ldi r24, 0x00 ; 0 - 3862: 36 dd rcall .-1428 ; 0x32d0 + 387e: d8 2f mov r29, r24 + 3880: 80 e0 ldi r24, 0x00 ; 0 + 3882: 36 dd rcall .-1428 ; 0x32f0 Crypto1LFSR(0); - 3864: c6 95 lsr r28 - 3866: d1 11 cpse r29, r1 - 3868: c0 68 ori r28, 0x80 ; 128 + 3884: c6 95 lsr r28 + 3886: d1 11 cpse r29, r1 + 3888: c0 68 ori r28, 0x80 ; 128 /* Store keystream bit */ KeyStream >>= 1; - 386a: 99 dd rcall .-1230 ; 0x339e + 388a: 99 dd rcall .-1230 ; 0x33be if (Out) { - 386c: d8 2f mov r29, r24 + 388c: d8 2f mov r29, r24 KeyStream |= (1<<7); - 386e: 80 e0 ldi r24, 0x00 ; 0 + 388e: 80 e0 ldi r24, 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(); - 3870: 2f dd rcall .-1442 ; 0x32d0 - 3872: c6 95 lsr r28 - 3874: d1 11 cpse r29, r1 + 3890: 2f dd rcall .-1442 ; 0x32f0 + 3892: c6 95 lsr r28 + 3894: d1 11 cpse r29, r1 Crypto1LFSR(0); - 3876: c0 68 ori r28, 0x80 ; 128 - 3878: 92 dd rcall .-1244 ; 0x339e - 387a: d8 2f mov r29, r24 + 3896: c0 68 ori r28, 0x80 ; 128 + 3898: 92 dd rcall .-1244 ; 0x33be + 389a: d8 2f mov r29, r24 /* Store keystream bit */ KeyStream >>= 1; - 387c: 80 e0 ldi r24, 0x00 ; 0 + 389c: 80 e0 ldi r24, 0x00 ; 0 if (Out) { - 387e: 28 dd rcall .-1456 ; 0x32d0 + 389e: 28 dd rcall .-1456 ; 0x32f0 KeyStream |= (1<<7); - 3880: 8c 2f mov r24, r28 + 38a0: 8c 2f mov r24, r28 /* 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(); - 3882: 86 95 lsr r24 - 3884: d1 11 cpse r29, r1 - 3886: 80 68 ori r24, 0x80 ; 128 + 38a2: 86 95 lsr r24 + 38a4: d1 11 cpse r29, r1 + 38a6: 80 68 ori r24, 0x80 ; 128 Crypto1LFSR(0); - 3888: df 91 pop r29 - 388a: cf 91 pop r28 - 388c: 08 95 ret + 38a8: df 91 pop r29 + 38aa: cf 91 pop r28 + 38ac: 08 95 ret /* Store keystream bit */ KeyStream >>= 1; - 388e: c0 e0 ldi r28, 0x00 ; 0 + 38ae: c0 e0 ldi r28, 0x00 ; 0 if (Out) { - 3890: c9 cf rjmp .-110 ; 0x3824 + 38b0: c9 cf rjmp .-110 ; 0x3844 -00003892 : +000038b2 : KeyStream |= (1<<7); - 3892: cf 93 push r28 + 38b2: cf 93 push r28 /* 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(); - 3894: df 93 push r29 - 3896: 83 dd rcall .-1274 ; 0x339e - 3898: c8 2f mov r28, r24 + 38b4: df 93 push r29 + 38b6: 83 dd rcall .-1274 ; 0x33be + 38b8: c8 2f mov r28, r24 Crypto1LFSR(0); - 389a: 80 e0 ldi r24, 0x00 ; 0 - 389c: 19 dd rcall .-1486 ; 0x32d0 - 389e: cc 23 and r28, r28 + 38ba: 80 e0 ldi r24, 0x00 ; 0 + 38bc: 19 dd rcall .-1486 ; 0x32f0 + 38be: cc 23 and r28, r28 /* Store keystream bit */ KeyStream >>= 1; - 38a0: d1 f0 breq .+52 ; 0x38d6 - 38a2: c8 e0 ldi r28, 0x08 ; 8 + 38c0: d1 f0 breq .+52 ; 0x38f6 + 38c2: c8 e0 ldi r28, 0x08 ; 8 if (Out) { - 38a4: 7c dd rcall .-1288 ; 0x339e + 38c4: 7c dd rcall .-1288 ; 0x33be KeyStream |= (1<<7); - 38a6: d8 2f mov r29, r24 + 38c6: d8 2f mov r29, r24 } } return KeyStream; } - 38a8: 80 e0 ldi r24, 0x00 ; 0 - 38aa: 12 dd rcall .-1500 ; 0x32d0 - 38ac: c6 95 lsr r28 + 38c8: 80 e0 ldi r24, 0x00 ; 0 + 38ca: 12 dd rcall .-1500 ; 0x32f0 + 38cc: c6 95 lsr r28 * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); Crypto1LFSR(0); /* Store keystream bit */ KeyStream >>= 1; - 38ae: d1 11 cpse r29, r1 - 38b0: c8 60 ori r28, 0x08 ; 8 + 38ce: d1 11 cpse r29, r1 + 38d0: c8 60 ori r28, 0x08 ; 8 for (i=0; i<4; i++) { /* Calculate output of function-network and cycle LFSR with no * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); Crypto1LFSR(0); - 38b2: 75 dd rcall .-1302 ; 0x339e + 38d2: 75 dd rcall .-1302 ; 0x33be /* Store keystream bit */ KeyStream >>= 1; - 38b4: d8 2f mov r29, r24 + 38d4: d8 2f mov r29, r24 if (Out) { - 38b6: 80 e0 ldi r24, 0x00 ; 0 + 38d6: 80 e0 ldi r24, 0x00 ; 0 KeyStream |= (1<<3); - 38b8: 0b dd rcall .-1514 ; 0x32d0 + 38d8: 0b dd rcall .-1514 ; 0x32f0 /* 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(); - 38ba: c6 95 lsr r28 - 38bc: d1 11 cpse r29, r1 - 38be: c8 60 ori r28, 0x08 ; 8 + 38da: c6 95 lsr r28 + 38dc: d1 11 cpse r29, r1 + 38de: c8 60 ori r28, 0x08 ; 8 Crypto1LFSR(0); - 38c0: 6e dd rcall .-1316 ; 0x339e - 38c2: d8 2f mov r29, r24 - 38c4: 80 e0 ldi r24, 0x00 ; 0 + 38e0: 6e dd rcall .-1316 ; 0x33be + 38e2: d8 2f mov r29, r24 + 38e4: 80 e0 ldi r24, 0x00 ; 0 /* Store keystream bit */ KeyStream >>= 1; - 38c6: 04 dd rcall .-1528 ; 0x32d0 + 38e6: 04 dd rcall .-1528 ; 0x32f0 if (Out) { - 38c8: 8c 2f mov r24, r28 + 38e8: 8c 2f mov r24, r28 KeyStream |= (1<<3); - 38ca: 86 95 lsr r24 + 38ea: 86 95 lsr r24 /* 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(); - 38cc: d1 11 cpse r29, r1 - 38ce: 88 60 ori r24, 0x08 ; 8 - 38d0: df 91 pop r29 + 38ec: d1 11 cpse r29, r1 + 38ee: 88 60 ori r24, 0x08 ; 8 + 38f0: df 91 pop r29 Crypto1LFSR(0); - 38d2: cf 91 pop r28 - 38d4: 08 95 ret - 38d6: c0 e0 ldi r28, 0x00 ; 0 + 38f2: cf 91 pop r28 + 38f4: 08 95 ret + 38f6: c0 e0 ldi r28, 0x00 ; 0 /* Store keystream bit */ KeyStream >>= 1; - 38d8: e5 cf rjmp .-54 ; 0x38a4 + 38f8: e5 cf rjmp .-54 ; 0x38c4 -000038da : - 38da: 8f 92 push r8 +000038fa : + 38fa: 8f 92 push r8 if (Out) { - 38dc: 9f 92 push r9 + 38fc: 9f 92 push r9 KeyStream |= (1<<3); - 38de: af 92 push r10 + 38fe: af 92 push r10 } } return KeyStream; } - 38e0: bf 92 push r11 - 38e2: cf 92 push r12 - 38e4: df 92 push r13 + 3900: bf 92 push r11 + 3902: cf 92 push r12 + 3904: df 92 push r13 * additional input, thus linearly! */ uint8_t Out = Crypto1FilterOutput(); Crypto1LFSR(0); /* Store keystream bit */ KeyStream >>= 1; - 38e6: ef 92 push r14 - 38e8: ff 92 push r15 + 3906: ef 92 push r14 + 3908: ff 92 push r15 return KeyStream; } void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) { - 38ea: 0f 93 push r16 - 38ec: 1f 93 push r17 - 38ee: cf 93 push r28 - 38f0: df 93 push r29 - 38f2: 4c 01 movw r8, r24 - 38f4: 5b 01 movw r10, r22 + 390a: 0f 93 push r16 + 390c: 1f 93 push r17 + 390e: cf 93 push r28 + 3910: df 93 push r29 + 3912: 4c 01 movw r8, r24 + 3914: 5b 01 movw r10, r22 while(ClockCount--) { - 38f6: 61 15 cp r22, r1 - 38f8: 71 05 cpc r23, r1 - 38fa: 09 f4 brne .+2 ; 0x38fe - 38fc: 5f c0 rjmp .+190 ; 0x39bc - 38fe: dc 01 movw r26, r24 - 3900: 12 96 adiw r26, 0x02 ; 2 - 3902: cc 91 ld r28, X - 3904: 12 97 sbiw r26, 0x02 ; 2 - 3906: ec 91 ld r30, X - 3908: 11 96 adiw r26, 0x01 ; 1 - 390a: dc 91 ld r29, X - 390c: 11 97 sbiw r26, 0x01 ; 1 - 390e: 13 96 adiw r26, 0x03 ; 3 - 3910: fc 91 ld r31, X + 3916: 61 15 cp r22, r1 + 3918: 71 05 cpc r23, r1 + 391a: 09 f4 brne .+2 ; 0x391e + 391c: 5f c0 rjmp .+190 ; 0x39dc + 391e: dc 01 movw r26, r24 + 3920: 12 96 adiw r26, 0x02 ; 2 + 3922: cc 91 ld r28, X + 3924: 12 97 sbiw r26, 0x02 ; 2 + 3926: ec 91 ld r30, X + 3928: 11 96 adiw r26, 0x01 ; 1 + 392a: dc 91 ld r29, X + 392c: 11 97 sbiw r26, 0x01 ; 1 + 392e: 13 96 adiw r26, 0x03 ; 3 + 3930: fc 91 ld r31, X * 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); - 3912: 9c 2f mov r25, r28 - 3914: 9d 72 andi r25, 0x2D ; 45 + 3932: 9c 2f mov r25, r28 + 3934: 9d 72 andi r25, 0x2D ; 45 Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); Feedback ^= Feedback >> 4; - 3916: 89 2f mov r24, r25 - 3918: 82 95 swap r24 - 391a: 8f 70 andi r24, 0x0F ; 15 - 391c: 89 27 eor r24, r25 + 3936: 89 2f mov r24, r25 + 3938: 82 95 swap r24 + 393a: 8f 70 andi r24, 0x0F ; 15 + 393c: 89 27 eor r24, r25 Feedback ^= Feedback >> 2; - 391e: 28 2f mov r18, r24 - 3920: 26 95 lsr r18 - 3922: 26 95 lsr r18 - 3924: 28 27 eor r18, r24 + 393e: 28 2f mov r18, r24 + 3940: 26 95 lsr r18 + 3942: 26 95 lsr r18 + 3944: 28 27 eor r18, r24 Feedback ^= Feedback >> 1; - 3926: 32 2f mov r19, r18 - 3928: 36 95 lsr r19 + 3946: 32 2f mov r19, r18 + 3948: 36 95 lsr r19 /* 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; - 392a: 8d 2f mov r24, r29 - 392c: 90 e0 ldi r25, 0x00 ; 0 - 392e: a0 e0 ldi r26, 0x00 ; 0 - 3930: b0 e0 ldi r27, 0x00 ; 0 - 3932: ba 2f mov r27, r26 - 3934: a9 2f mov r26, r25 - 3936: 98 2f mov r25, r24 - 3938: 88 27 eor r24, r24 + 394a: 8d 2f mov r24, r29 + 394c: 90 e0 ldi r25, 0x00 ; 0 + 394e: a0 e0 ldi r26, 0x00 ; 0 + 3950: b0 e0 ldi r27, 0x00 ; 0 + 3952: ba 2f mov r27, r26 + 3954: a9 2f mov r26, r25 + 3956: 98 2f mov r25, r24 + 3958: 88 27 eor r24, r24 Temp |= (uint32_t) State[2] << 16; - 393a: 4c 2f mov r20, r28 - 393c: 50 e0 ldi r21, 0x00 ; 0 - 393e: 60 e0 ldi r22, 0x00 ; 0 - 3940: 70 e0 ldi r23, 0x00 ; 0 - 3942: ba 01 movw r22, r20 - 3944: 55 27 eor r21, r21 - 3946: 44 27 eor r20, r20 + 395a: 4c 2f mov r20, r28 + 395c: 50 e0 ldi r21, 0x00 ; 0 + 395e: 60 e0 ldi r22, 0x00 ; 0 + 3960: 70 e0 ldi r23, 0x00 ; 0 + 3962: ba 01 movw r22, r20 + 3964: 55 27 eor r21, r21 + 3966: 44 27 eor r20, r20 /* For ease of processing convert the state into a 32 bit integer first */ uint32_t Temp = 0; Temp |= (uint32_t) State[0] << 0; Temp |= (uint32_t) State[1] << 8; - 3948: 84 2b or r24, r20 - 394a: 95 2b or r25, r21 - 394c: a6 2b or r26, r22 - 394e: b7 2b or r27, r23 + 3968: 84 2b or r24, r20 + 396a: 95 2b or r25, r21 + 396c: a6 2b or r26, r22 + 396e: b7 2b or r27, r23 Feedback ^= Feedback >> 1; /* For ease of processing convert the state into a 32 bit integer first */ uint32_t Temp = 0; Temp |= (uint32_t) State[0] << 0; - 3950: 4e 2f mov r20, r30 - 3952: 50 e0 ldi r21, 0x00 ; 0 - 3954: 60 e0 ldi r22, 0x00 ; 0 - 3956: 70 e0 ldi r23, 0x00 ; 0 + 3970: 4e 2f mov r20, r30 + 3972: 50 e0 ldi r21, 0x00 ; 0 + 3974: 60 e0 ldi r22, 0x00 ; 0 + 3976: 70 e0 ldi r23, 0x00 ; 0 Temp |= (uint32_t) State[1] << 8; Temp |= (uint32_t) State[2] << 16; - 3958: 84 2b or r24, r20 - 395a: 95 2b or r25, r21 - 395c: a6 2b or r26, r22 - 395e: b7 2b or r27, r23 + 3978: 84 2b or r24, r20 + 397a: 95 2b or r25, r21 + 397c: a6 2b or r26, r22 + 397e: b7 2b or r27, r23 Temp |= (uint32_t) State[3] << 24; - 3960: 4f 2f mov r20, r31 - 3962: 50 e0 ldi r21, 0x00 ; 0 - 3964: 60 e0 ldi r22, 0x00 ; 0 - 3966: 70 e0 ldi r23, 0x00 ; 0 - 3968: 74 2f mov r23, r20 - 396a: 66 27 eor r22, r22 - 396c: 55 27 eor r21, r21 - 396e: 44 27 eor r20, r20 - 3970: 84 2b or r24, r20 - 3972: 95 2b or r25, r21 - 3974: a6 2b or r26, r22 - 3976: b7 2b or r27, r23 + 3980: 4f 2f mov r20, r31 + 3982: 50 e0 ldi r21, 0x00 ; 0 + 3984: 60 e0 ldi r22, 0x00 ; 0 + 3986: 70 e0 ldi r23, 0x00 ; 0 + 3988: 74 2f mov r23, r20 + 398a: 66 27 eor r22, r22 + 398c: 55 27 eor r21, r21 + 398e: 44 27 eor r20, r20 + 3990: 84 2b or r24, r20 + 3992: 95 2b or r25, r21 + 3994: a6 2b or r26, r22 + 3996: b7 2b or r27, r23 /* Cycle LFSR and feed back. */ Temp >>= 1; - 3978: b6 95 lsr r27 - 397a: a7 95 ror r26 - 397c: 97 95 ror r25 - 397e: 87 95 ror r24 + 3998: b6 95 lsr r27 + 399a: a7 95 ror r26 + 399c: 97 95 ror r25 + 399e: 87 95 ror r24 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; - 3980: 32 27 eor r19, r18 + 39a0: 32 27 eor r19, r18 Temp |= (uint32_t) State[3] << 24; /* Cycle LFSR and feed back. */ Temp >>= 1; if (Feedback & 0x01) { - 3982: 30 fd sbrc r19, 0 + 39a2: 30 fd sbrc r19, 0 Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); - 3984: b0 68 ori r27, 0x80 ; 128 + 39a4: b0 68 ori r27, 0x80 ; 128 } /* Store back state */ State[0] = (uint8_t) (Temp >> 0); - 3986: e8 2f mov r30, r24 + 39a6: e8 2f mov r30, r24 State[1] = (uint8_t) (Temp >> 8); - 3988: 49 2f mov r20, r25 - 398a: 5a 2f mov r21, r26 - 398c: 6b 2f mov r22, r27 - 398e: 77 27 eor r23, r23 - 3990: d4 2f mov r29, r20 + 39a8: 49 2f mov r20, r25 + 39aa: 5a 2f mov r21, r26 + 39ac: 6b 2f mov r22, r27 + 39ae: 77 27 eor r23, r23 + 39b0: d4 2f mov r29, r20 State[2] = (uint8_t) (Temp >> 16); - 3992: 8d 01 movw r16, r26 - 3994: 22 27 eor r18, r18 - 3996: 33 27 eor r19, r19 - 3998: c0 2f mov r28, r16 + 39b2: 8d 01 movw r16, r26 + 39b4: 22 27 eor r18, r18 + 39b6: 33 27 eor r19, r19 + 39b8: c0 2f mov r28, r16 State[3] = (uint8_t) (Temp >> 24); - 399a: cb 2e mov r12, r27 - 399c: dd 24 eor r13, r13 - 399e: ee 24 eor r14, r14 - 39a0: ff 24 eor r15, r15 - 39a2: fc 2d mov r31, r12 - 39a4: 08 94 sec - 39a6: a1 08 sbc r10, r1 - 39a8: b1 08 sbc r11, r1 + 39ba: cb 2e mov r12, r27 + 39bc: dd 24 eor r13, r13 + 39be: ee 24 eor r14, r14 + 39c0: ff 24 eor r15, r15 + 39c2: fc 2d mov r31, r12 + 39c4: 08 94 sec + 39c6: a1 08 sbc r10, r1 + 39c8: b1 08 sbc r11, r1 return KeyStream; } void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) { while(ClockCount--) { - 39aa: a1 14 cp r10, r1 - 39ac: b1 04 cpc r11, r1 - 39ae: 09 f0 breq .+2 ; 0x39b2 - 39b0: b0 cf rjmp .-160 ; 0x3912 - 39b2: f4 01 movw r30, r8 - 39b4: 80 83 st Z, r24 - 39b6: 41 83 std Z+1, r20 ; 0x01 - 39b8: 02 83 std Z+2, r16 ; 0x02 - 39ba: c3 82 std Z+3, r12 ; 0x03 + 39ca: a1 14 cp r10, r1 + 39cc: b1 04 cpc r11, r1 + 39ce: 09 f0 breq .+2 ; 0x39d2 + 39d0: b0 cf rjmp .-160 ; 0x3932 + 39d2: f4 01 movw r30, r8 + 39d4: 80 83 st Z, r24 + 39d6: 41 83 std Z+1, r20 ; 0x01 + 39d8: 02 83 std Z+2, r16 ; 0x02 + 39da: c3 82 std Z+3, r12 ; 0x03 State[2] = (uint8_t) (Temp >> 16); State[3] = (uint8_t) (Temp >> 24); } } - 39bc: df 91 pop r29 - 39be: cf 91 pop r28 - 39c0: 1f 91 pop r17 - 39c2: 0f 91 pop r16 - 39c4: ff 90 pop r15 - 39c6: ef 90 pop r14 - 39c8: df 90 pop r13 - 39ca: cf 90 pop r12 - 39cc: bf 90 pop r11 - 39ce: af 90 pop r10 - 39d0: 9f 90 pop r9 - 39d2: 8f 90 pop r8 - 39d4: 08 95 ret + 39dc: df 91 pop r29 + 39de: cf 91 pop r28 + 39e0: 1f 91 pop r17 + 39e2: 0f 91 pop r16 + 39e4: ff 90 pop r15 + 39e6: ef 90 pop r14 + 39e8: df 90 pop r13 + 39ea: cf 90 pop r12 + 39ec: bf 90 pop r11 + 39ee: af 90 pop r10 + 39f0: 9f 90 pop r9 + 39f2: 8f 90 pop r8 + 39f4: 08 95 ret -000039d6 : +000039f6 : #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) { - 39d6: 1f 93 push r17 - 39d8: cf 93 push r28 - 39da: df 93 push r29 - 39dc: cd b7 in r28, 0x3d ; 61 - 39de: de b7 in r29, 0x3e ; 62 - 39e0: ee 97 sbiw r28, 0x3e ; 62 - 39e2: cd bf out 0x3d, r28 ; 61 - 39e4: de bf out 0x3e, r29 ; 62 + 39f6: 1f 93 push r17 + 39f8: cf 93 push r28 + 39fa: df 93 push r29 + 39fc: cd b7 in r28, 0x3d ; 61 + 39fe: de b7 in r29, 0x3e ; 62 + 3a00: ee 97 sbiw r28, 0x3e ; 62 + 3a02: cd bf out 0x3d, r28 ; 61 + 3a04: de bf out 0x3e, r29 ; 62 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(); - 39e6: 4d d3 rcall .+1690 ; 0x4082 - 39e8: 80 93 25 23 sts 0x2325, r24 - 39ec: 4a d3 rcall .+1684 ; 0x4082 - 39ee: 80 93 26 23 sts 0x2326, r24 - 39f2: 47 d3 rcall .+1678 ; 0x4082 - 39f4: 80 93 27 23 sts 0x2327, r24 - 39f8: 44 d3 rcall .+1672 ; 0x4082 - 39fa: 80 93 28 23 sts 0x2328, r24 - 39fe: 41 d3 rcall .+1666 ; 0x4082 - 3a00: 80 93 29 23 sts 0x2329, r24 - 3a04: 3e d3 rcall .+1660 ; 0x4082 - 3a06: 80 93 2a 23 sts 0x232A, r24 - 3a0a: 3b d3 rcall .+1654 ; 0x4082 - 3a0c: 80 93 2b 23 sts 0x232B, r24 - 3a10: 38 d3 rcall .+1648 ; 0x4082 - 3a12: 80 93 2c 23 sts 0x232C, r24 - 3a16: 0e 94 70 0b call 0x16e0 ; 0x16e0 - 3a1a: d5 d3 rcall .+1962 ; 0x41c6 - 3a1c: 88 23 and r24, r24 - 3a1e: 91 f0 breq .+36 ; 0x3a44 - 3a20: 90 91 25 23 lds r25, 0x2325 - 3a24: 80 91 26 23 lds r24, 0x2326 + 3a06: 4d d3 rcall .+1690 ; 0x40a2 + 3a08: 80 93 25 23 sts 0x2325, r24 + 3a0c: 4a d3 rcall .+1684 ; 0x40a2 + 3a0e: 80 93 26 23 sts 0x2326, r24 + 3a12: 47 d3 rcall .+1678 ; 0x40a2 + 3a14: 80 93 27 23 sts 0x2327, r24 + 3a18: 44 d3 rcall .+1672 ; 0x40a2 + 3a1a: 80 93 28 23 sts 0x2328, r24 + 3a1e: 41 d3 rcall .+1666 ; 0x40a2 + 3a20: 80 93 29 23 sts 0x2329, r24 + 3a24: 3e d3 rcall .+1660 ; 0x40a2 + 3a26: 80 93 2a 23 sts 0x232A, r24 + 3a2a: 3b d3 rcall .+1654 ; 0x40a2 + 3a2c: 80 93 2b 23 sts 0x232B, r24 + 3a30: 38 d3 rcall .+1648 ; 0x40a2 + 3a32: 80 93 2c 23 sts 0x232C, r24 + 3a36: 0e 94 80 0b call 0x1700 ; 0x1700 + 3a3a: d5 d3 rcall .+1962 ; 0x41e6 + 3a3c: 88 23 and r24, r24 + 3a3e: 91 f0 breq .+36 ; 0x3a64 + 3a40: 90 91 25 23 lds r25, 0x2325 + 3a44: 80 91 26 23 lds r24, 0x2326 #endif EVENT_USB_Device_ControlRequest(); - 3a28: 85 30 cpi r24, 0x05 ; 5 + 3a48: 85 30 cpi r24, 0x05 ; 5 if (Endpoint_IsSETUPReceived()) - 3a2a: 09 f4 brne .+2 ; 0x3a2e - 3a2c: 53 c0 rjmp .+166 ; 0x3ad4 - 3a2e: 86 30 cpi r24, 0x06 ; 6 - 3a30: a8 f0 brcs .+42 ; 0x3a5c + 3a4a: 09 f4 brne .+2 ; 0x3a4e + 3a4c: 53 c0 rjmp .+166 ; 0x3af4 + 3a4e: 86 30 cpi r24, 0x06 ; 6 + 3a50: a8 f0 brcs .+42 ; 0x3a7c { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 3a32: 88 30 cpi r24, 0x08 ; 8 - 3a34: 09 f4 brne .+2 ; 0x3a38 + 3a52: 88 30 cpi r24, 0x08 ; 8 + 3a54: 09 f4 brne .+2 ; 0x3a58 switch (USB_ControlRequest.bRequest) - 3a36: ba c0 rjmp .+372 ; 0x3bac - 3a38: 89 30 cpi r24, 0x09 ; 9 - 3a3a: 09 f4 brne .+2 ; 0x3a3e - 3a3c: 9e c0 rjmp .+316 ; 0x3b7a - 3a3e: 86 30 cpi r24, 0x06 ; 6 - 3a40: 09 f4 brne .+2 ; 0x3a44 - 3a42: 5d c0 rjmp .+186 ; 0x3afe - 3a44: c0 d3 rcall .+1920 ; 0x41c6 - 3a46: 88 23 and r24, r24 - 3a48: 11 f0 breq .+4 ; 0x3a4e - 3a4a: 91 d3 rcall .+1826 ; 0x416e - 3a4c: 74 d3 rcall .+1768 ; 0x4136 - 3a4e: ee 96 adiw r28, 0x3e ; 62 - 3a50: cd bf out 0x3d, r28 ; 61 - 3a52: de bf out 0x3e, r29 ; 62 - 3a54: df 91 pop r29 + 3a56: ba c0 rjmp .+372 ; 0x3bcc + 3a58: 89 30 cpi r24, 0x09 ; 9 + 3a5a: 09 f4 brne .+2 ; 0x3a5e + 3a5c: 9e c0 rjmp .+316 ; 0x3b9a + 3a5e: 86 30 cpi r24, 0x06 ; 6 + 3a60: 09 f4 brne .+2 ; 0x3a64 + 3a62: 5d c0 rjmp .+186 ; 0x3b1e + 3a64: c0 d3 rcall .+1920 ; 0x41e6 + 3a66: 88 23 and r24, r24 + 3a68: 11 f0 breq .+4 ; 0x3a6e + 3a6a: 91 d3 rcall .+1826 ; 0x418e + 3a6c: 74 d3 rcall .+1768 ; 0x4156 + 3a6e: ee 96 adiw r28, 0x3e ; 62 + 3a70: cd bf out 0x3d, r28 ; 61 + 3a72: de bf out 0x3e, r29 ; 62 + 3a74: df 91 pop r29 default: break; } } if (Endpoint_IsSETUPReceived()) - 3a56: cf 91 pop r28 - 3a58: 1f 91 pop r17 - 3a5a: 08 95 ret - 3a5c: 81 30 cpi r24, 0x01 ; 1 + 3a76: cf 91 pop r28 + 3a78: 1f 91 pop r17 + 3a7a: 08 95 ret + 3a7c: 81 30 cpi r24, 0x01 ; 1 { Endpoint_ClearSETUP(); - 3a5e: 29 f0 breq .+10 ; 0x3a6a - 3a60: 81 30 cpi r24, 0x01 ; 1 + 3a7e: 29 f0 breq .+10 ; 0x3a8a + 3a80: 81 30 cpi r24, 0x01 ; 1 Endpoint_StallTransaction(); - 3a62: 08 f4 brcc .+2 ; 0x3a66 - 3a64: 6e c0 rjmp .+220 ; 0x3b42 + 3a82: 08 f4 brcc .+2 ; 0x3a86 + 3a84: 6e c0 rjmp .+220 ; 0x3b62 } } - 3a66: 83 30 cpi r24, 0x03 ; 3 - 3a68: 69 f7 brne .-38 ; 0x3a44 - 3a6a: 99 23 and r25, r25 - 3a6c: 09 f4 brne .+2 ; 0x3a70 - 3a6e: a8 c0 rjmp .+336 ; 0x3bc0 - 3a70: 92 30 cpi r25, 0x02 ; 2 - 3a72: 41 f7 brne .-48 ; 0x3a44 + 3a86: 83 30 cpi r24, 0x03 ; 3 + 3a88: 69 f7 brne .-38 ; 0x3a64 + 3a8a: 99 23 and r25, r25 + 3a8c: 09 f4 brne .+2 ; 0x3a90 + 3a8e: a8 c0 rjmp .+336 ; 0x3be0 + 3a90: 92 30 cpi r25, 0x02 ; 2 + 3a92: 41 f7 brne .-48 ; 0x3a64 if (Endpoint_IsSETUPReceived()) { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; switch (USB_ControlRequest.bRequest) - 3a74: 80 91 27 23 lds r24, 0x2327 - 3a78: 88 23 and r24, r24 - 3a7a: 39 f5 brne .+78 ; 0x3aca - 3a7c: 10 91 29 23 lds r17, 0x2329 - 3a80: 1f 70 andi r17, 0x0F ; 15 + 3a94: 80 91 27 23 lds r24, 0x2327 + 3a98: 88 23 and r24, r24 + 3a9a: 39 f5 brne .+78 ; 0x3aea + 3a9c: 10 91 29 23 lds r17, 0x2329 + 3aa0: 1f 70 andi r17, 0x0F ; 15 } break; case REQ_ClearFeature: case REQ_SetFeature: if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3a82: 01 f3 breq .-64 ; 0x3a44 - 3a84: 81 2f mov r24, r17 - 3a86: 1b d3 rcall .+1590 ; 0x40be - 3a88: 80 91 26 23 lds r24, 0x2326 + 3aa2: 01 f3 breq .-64 ; 0x3a64 + 3aa4: 81 2f mov r24, r17 + 3aa6: 1b d3 rcall .+1590 ; 0x40de + 3aa8: 80 91 26 23 lds r24, 0x2326 break; #endif #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 3a8c: 83 30 cpi r24, 0x03 ; 3 - 3a8e: 09 f4 brne .+2 ; 0x3a92 - 3a90: f8 c0 rjmp .+496 ; 0x3c82 - 3a92: e0 91 2f 23 lds r30, 0x232F + 3aac: 83 30 cpi r24, 0x03 ; 3 + 3aae: 09 f4 brne .+2 ; 0x3ab2 + 3ab0: f8 c0 rjmp .+496 ; 0x3ca2 + 3ab2: e0 91 2f 23 lds r30, 0x232F { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 3a96: f0 91 30 23 lds r31, 0x2330 + 3ab6: f0 91 30 23 lds r31, 0x2330 if (EndpointIndex == ENDPOINT_CONTROLEP) - 3a9a: 81 81 ldd r24, Z+1 ; 0x01 + 3aba: 81 81 ldd r24, Z+1 ; 0x01 return; Endpoint_SelectEndpoint(EndpointIndex); - 3a9c: 8b 7f andi r24, 0xFB ; 251 - 3a9e: 81 83 std Z+1, r24 ; 0x01 - 3aa0: 21 2f mov r18, r17 + 3abc: 8b 7f andi r24, 0xFB ; 251 + 3abe: 81 83 std Z+1, r24 ; 0x01 + 3ac0: 21 2f mov r18, r17 if (Endpoint_IsEnabled()) { if (USB_ControlRequest.bRequest == REQ_SetFeature) - 3aa2: 30 e0 ldi r19, 0x00 ; 0 - 3aa4: 84 e8 ldi r24, 0x84 ; 132 - 3aa6: 90 e0 ldi r25, 0x00 ; 0 - 3aa8: 28 9f mul r18, r24 - 3aaa: f0 01 movw r30, r0 + 3ac2: 30 e0 ldi r19, 0x00 ; 0 + 3ac4: 84 e8 ldi r24, 0x84 ; 132 + 3ac6: 90 e0 ldi r25, 0x00 ; 0 + 3ac8: 28 9f mul r18, r24 + 3aca: f0 01 movw r30, r0 * \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; - 3aac: 29 9f mul r18, r25 - 3aae: f0 0d add r31, r0 - 3ab0: 38 9f mul r19, r24 - 3ab2: f0 0d add r31, r0 - 3ab4: 11 24 eor r1, r1 - 3ab6: ed 58 subi r30, 0x8D ; 141 - 3ab8: fc 4d sbci r31, 0xDC ; 220 + 3acc: 29 9f mul r18, r25 + 3ace: f0 0d add r31, r0 + 3ad0: 38 9f mul r19, r24 + 3ad2: f0 0d add r31, r0 + 3ad4: 11 24 eor r1, r1 + 3ad6: ed 58 subi r30, 0x8D ; 141 + 3ad8: fc 4d sbci r31, 0xDC ; 220 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; - 3aba: 10 82 st Z, r1 - 3abc: e0 91 2f 23 lds r30, 0x232F - 3ac0: f0 91 30 23 lds r31, 0x2330 - 3ac4: 80 81 ld r24, Z - 3ac6: 8e 7f andi r24, 0xFE ; 254 - 3ac8: 80 83 st Z, r24 - 3aca: 80 e0 ldi r24, 0x00 ; 0 - 3acc: f8 d2 rcall .+1520 ; 0x40be - 3ace: 4f d3 rcall .+1694 ; 0x416e - 3ad0: a8 d4 rcall .+2384 ; 0x4422 - 3ad2: b8 cf rjmp .-144 ; 0x3a44 - 3ad4: 99 23 and r25, r25 + 3ada: 10 82 st Z, r1 + 3adc: e0 91 2f 23 lds r30, 0x232F + 3ae0: f0 91 30 23 lds r31, 0x2330 + 3ae4: 80 81 ld r24, Z + 3ae6: 8e 7f andi r24, 0xFE ; 254 + 3ae8: 80 83 st Z, r24 + 3aea: 80 e0 ldi r24, 0x00 ; 0 + 3aec: f8 d2 rcall .+1520 ; 0x40de + 3aee: 4f d3 rcall .+1694 ; 0x418e + 3af0: a8 d4 rcall .+2384 ; 0x4442 + 3af2: b8 cf rjmp .-144 ; 0x3a64 + 3af4: 99 23 and r25, r25 /** 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; - 3ad6: 09 f0 breq .+2 ; 0x3ada - 3ad8: b5 cf rjmp .-150 ; 0x3a44 - 3ada: 10 91 27 23 lds r17, 0x2327 - 3ade: 1f 77 andi r17, 0x7F ; 127 - 3ae0: 46 d3 rcall .+1676 ; 0x416e - 3ae2: 9f d4 rcall .+2366 ; 0x4422 + 3af6: 09 f0 breq .+2 ; 0x3afa + 3af8: b5 cf rjmp .-150 ; 0x3a64 + 3afa: 10 91 27 23 lds r17, 0x2327 + 3afe: 1f 77 andi r17, 0x7F ; 127 + 3b00: 46 d3 rcall .+1676 ; 0x418e + 3b02: 9f d4 rcall .+2366 ; 0x4442 #endif default: return; } Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3ae4: a0 d3 rcall .+1856 ; 0x4226 - 3ae6: 88 23 and r24, r24 - 3ae8: e9 f3 breq .-6 ; 0x3ae4 + 3b04: a0 d3 rcall .+1856 ; 0x4246 + 3b06: 88 23 and r24, r24 + 3b08: e9 f3 breq .-6 ; 0x3b04 Endpoint_ClearSETUP(); - 3aea: e0 ec ldi r30, 0xC0 ; 192 - 3aec: f4 e0 ldi r31, 0x04 ; 4 + 3b0a: e0 ec ldi r30, 0xC0 ; 192 + 3b0c: f4 e0 ldi r31, 0x04 ; 4 Endpoint_ClearStatusStage(); - 3aee: 13 83 std Z+3, r17 ; 0x03 - 3af0: 11 23 and r17, r17 - 3af2: 09 f0 breq .+2 ; 0x3af6 + 3b0e: 13 83 std Z+3, r17 ; 0x03 + 3b10: 11 23 and r17, r17 + 3b12: 09 f0 breq .+2 ; 0x3b16 USB_Device_ClearSetFeature(); } break; case REQ_SetAddress: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 3af4: 7a c0 rjmp .+244 ; 0x3bea - 3af6: 82 e0 ldi r24, 0x02 ; 2 - 3af8: 80 93 24 23 sts 0x2324, r24 + 3b14: 7a c0 rjmp .+244 ; 0x3c0a + 3b16: 82 e0 ldi r24, 0x02 ; 2 + 3b18: 80 93 24 23 sts 0x2324, r24 } } static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 3afc: a3 cf rjmp .-186 ; 0x3a44 - 3afe: 90 58 subi r25, 0x80 ; 128 + 3b1c: a3 cf rjmp .-186 ; 0x3a64 + 3b1e: 90 58 subi r25, 0x80 ; 128 USB_Device_SetDeviceAddress(DeviceAddress); Endpoint_ClearSETUP(); - 3b00: 92 30 cpi r25, 0x02 ; 2 - 3b02: 08 f0 brcs .+2 ; 0x3b06 + 3b20: 92 30 cpi r25, 0x02 ; 2 + 3b22: 08 f0 brcs .+2 ; 0x3b26 Endpoint_ClearStatusStage(); - 3b04: 9f cf rjmp .-194 ; 0x3a44 - 3b06: 80 91 27 23 lds r24, 0x2327 + 3b24: 9f cf rjmp .-194 ; 0x3a64 + 3b26: 80 91 27 23 lds r24, 0x2327 while (!(Endpoint_IsINReady())); - 3b0a: 90 91 28 23 lds r25, 0x2328 - 3b0e: 23 e0 ldi r18, 0x03 ; 3 + 3b2a: 90 91 28 23 lds r25, 0x2328 + 3b2e: 23 e0 ldi r18, 0x03 ; 3 } 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; - 3b10: 8c 3d cpi r24, 0xDC ; 220 - 3b12: 92 07 cpc r25, r18 - 3b14: 09 f4 brne .+2 ; 0x3b18 + 3b30: 8c 3d cpi r24, 0xDC ; 220 + 3b32: 92 07 cpc r25, r18 + 3b34: 09 f4 brne .+2 ; 0x3b38 USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 3b16: 6b c0 rjmp .+214 ; 0x3bee - 3b18: 60 91 29 23 lds r22, 0x2329 - 3b1c: ae 01 movw r20, r28 - 3b1e: 4f 5f subi r20, 0xFF ; 255 - 3b20: 5f 4f sbci r21, 0xFF ; 255 - 3b22: 0e 94 7a 03 call 0x6f4 ; 0x6f4 + 3b36: 6b c0 rjmp .+214 ; 0x3c0e + 3b38: 60 91 29 23 lds r22, 0x2329 + 3b3c: ae 01 movw r20, r28 + 3b3e: 4f 5f subi r20, 0xFF ; 255 + 3b40: 5f 4f sbci r21, 0xFF ; 255 + 3b42: 0e 94 8a 03 call 0x714 ; 0x714 if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_SetAddress(); break; case REQ_GetDescriptor: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3b26: bc 01 movw r22, r24 - 3b28: 00 97 sbiw r24, 0x00 ; 0 - 3b2a: 09 f4 brne .+2 ; 0x3b2e + 3b46: bc 01 movw r22, r24 + 3b48: 00 97 sbiw r24, 0x00 ; 0 + 3b4a: 09 f4 brne .+2 ; 0x3b4e !(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)) - 3b2c: 8b cf rjmp .-234 ; 0x3a44 - 3b2e: 8d af sts 0x7d, r24 - 3b30: 7e af sts 0x7e, r23 - 3b32: 1d d3 rcall .+1594 ; 0x416e - 3b34: 89 81 ldd r24, Y+1 ; 0x01 - 3b36: 9a 81 ldd r25, Y+2 ; 0x02 - 3b38: 6d ad sts 0x6d, r22 - 3b3a: 7e ad sts 0x6e, r23 - 3b3c: ca d1 rcall .+916 ; 0x3ed2 + 3b4c: 8b cf rjmp .-234 ; 0x3a64 + 3b4e: 8d af sts 0x7d, r24 + 3b50: 7e af sts 0x7e, r23 + 3b52: 1d d3 rcall .+1594 ; 0x418e + 3b54: 89 81 ldd r24, Y+1 ; 0x01 + 3b56: 9a 81 ldd r25, Y+2 ; 0x02 + 3b58: 6d ad sts 0x6d, r22 + 3b5a: 7e ad sts 0x6e, r23 + 3b5c: ca d1 rcall .+916 ; 0x3ef2 USB_Device_GetInternalSerialDescriptor(); return; } #endif if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 3b3e: 92 d2 rcall .+1316 ; 0x4064 - 3b40: 81 cf rjmp .-254 ; 0x3a44 - 3b42: 90 38 cpi r25, 0x80 ; 128 - 3b44: 09 f4 brne .+2 ; 0x3b48 - 3b46: 48 c0 rjmp .+144 ; 0x3bd8 - 3b48: 92 38 cpi r25, 0x82 ; 130 - 3b4a: 09 f0 breq .+2 ; 0x3b4e - 3b4c: 7b cf rjmp .-266 ; 0x3a44 - 3b4e: 80 91 29 23 lds r24, 0x2329 - 3b52: 8f 70 andi r24, 0x0F ; 15 + 3b5e: 92 d2 rcall .+1316 ; 0x4084 + 3b60: 81 cf rjmp .-254 ; 0x3a64 + 3b62: 90 38 cpi r25, 0x80 ; 128 + 3b64: 09 f4 brne .+2 ; 0x3b68 + 3b66: 48 c0 rjmp .+144 ; 0x3bf8 + 3b68: 92 38 cpi r25, 0x82 ; 130 + 3b6a: 09 f0 breq .+2 ; 0x3b6e + 3b6c: 7b cf rjmp .-266 ; 0x3a64 + 3b6e: 80 91 29 23 lds r24, 0x2329 + 3b72: 8f 70 andi r24, 0x0F ; 15 )) == NO_DESCRIPTOR) { return; } Endpoint_ClearSETUP(); - 3b54: b4 d2 rcall .+1384 ; 0x40be - 3b56: e0 91 2f 23 lds r30, 0x232F - 3b5a: f0 91 30 23 lds r31, 0x2330 + 3b74: b4 d2 rcall .+1384 ; 0x40de + 3b76: e0 91 2f 23 lds r30, 0x232F + 3b7a: f0 91 30 23 lds r31, 0x2330 #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); - 3b5e: 81 81 ldd r24, Z+1 ; 0x01 - 3b60: 11 e0 ldi r17, 0x01 ; 1 - 3b62: 82 ff sbrs r24, 2 - 3b64: 10 e0 ldi r17, 0x00 ; 0 - 3b66: 80 e0 ldi r24, 0x00 ; 0 + 3b7e: 81 81 ldd r24, Z+1 ; 0x01 + 3b80: 11 e0 ldi r17, 0x01 ; 1 + 3b82: 82 ff sbrs r24, 2 + 3b84: 10 e0 ldi r17, 0x00 ; 0 + 3b86: 80 e0 ldi r24, 0x00 ; 0 Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); else Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); #endif Endpoint_ClearOUT(); - 3b68: aa d2 rcall .+1364 ; 0x40be - 3b6a: 01 d3 rcall .+1538 ; 0x416e - 3b6c: 81 2f mov r24, r17 + 3b88: aa d2 rcall .+1364 ; 0x40de + 3b8a: 01 d3 rcall .+1538 ; 0x418e + 3b8c: 81 2f mov r24, r17 uint8_t bmRequestType = USB_ControlRequest.bmRequestType; switch (USB_ControlRequest.bRequest) { case REQ_GetStatus: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 3b6e: 98 d2 rcall .+1328 ; 0x40a0 - 3b70: 80 e0 ldi r24, 0x00 ; 0 - 3b72: 96 d2 rcall .+1324 ; 0x40a0 - 3b74: 5e d2 rcall .+1212 ; 0x4032 - 3b76: 55 d4 rcall .+2218 ; 0x4422 - 3b78: 65 cf rjmp .-310 ; 0x3a44 + 3b8e: 98 d2 rcall .+1328 ; 0x40c0 + 3b90: 80 e0 ldi r24, 0x00 ; 0 + 3b92: 96 d2 rcall .+1324 ; 0x40c0 + 3b94: 5e d2 rcall .+1212 ; 0x4052 + 3b96: 55 d4 rcall .+2218 ; 0x4442 + 3b98: 65 cf rjmp .-310 ; 0x3a64 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); - 3b7a: 99 23 and r25, r25 - 3b7c: 09 f0 breq .+2 ; 0x3b80 - 3b7e: 62 cf rjmp .-316 ; 0x3a44 - 3b80: 80 91 27 23 lds r24, 0x2327 + 3b9a: 99 23 and r25, r25 + 3b9c: 09 f0 breq .+2 ; 0x3ba0 + 3b9e: 62 cf rjmp .-316 ; 0x3a64 + 3ba0: 80 91 27 23 lds r24, 0x2327 * \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); - 3b84: 82 30 cpi r24, 0x02 ; 2 - 3b86: 08 f0 brcs .+2 ; 0x3b8a - 3b88: 5d cf rjmp .-326 ; 0x3a44 - 3b8a: f1 d2 rcall .+1506 ; 0x416e - 3b8c: 80 91 27 23 lds r24, 0x2327 + 3ba4: 82 30 cpi r24, 0x02 ; 2 + 3ba6: 08 f0 brcs .+2 ; 0x3baa + 3ba8: 5d cf rjmp .-326 ; 0x3a64 + 3baa: f1 d2 rcall .+1506 ; 0x418e + 3bac: 80 91 27 23 lds r24, 0x2327 CurrentStatus = Endpoint_IsStalled(); - 3b90: 80 93 20 23 sts 0x2320, r24 + 3bb0: 80 93 20 23 sts 0x2320, r24 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3b94: 46 d4 rcall .+2188 ; 0x4422 - 3b96: 80 91 20 23 lds r24, 0x2320 + 3bb4: 46 d4 rcall .+2188 ; 0x4442 + 3bb6: 80 91 20 23 lds r24, 0x2320 break; default: return; } Endpoint_ClearSETUP(); - 3b9a: 88 23 and r24, r24 - 3b9c: 09 f4 brne .+2 ; 0x3ba0 + 3bba: 88 23 and r24, r24 + 3bbc: 09 f4 brne .+2 ; 0x3bc0 * \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); - 3b9e: 67 c0 rjmp .+206 ; 0x3c6e - 3ba0: 84 e0 ldi r24, 0x04 ; 4 - 3ba2: 80 93 24 23 sts 0x2324, r24 + 3bbe: 67 c0 rjmp .+206 ; 0x3c8e + 3bc0: 84 e0 ldi r24, 0x04 ; 4 + 3bc2: 80 93 24 23 sts 0x2324, r24 Endpoint_Write_8(Data >> 8); - 3ba6: 0e 94 6c 0b call 0x16d8 ; 0x16d8 + 3bc6: 0e 94 7c 0b call 0x16f8 ; 0x16f8 Endpoint_Write_16_LE(CurrentStatus); Endpoint_ClearIN(); - 3baa: 4c cf rjmp .-360 ; 0x3a44 - 3bac: 90 38 cpi r25, 0x80 ; 128 + 3bca: 4c cf rjmp .-360 ; 0x3a64 + 3bcc: 90 38 cpi r25, 0x80 ; 128 Endpoint_ClearStatusStage(); - 3bae: 09 f0 breq .+2 ; 0x3bb2 - 3bb0: 49 cf rjmp .-366 ; 0x3a44 - 3bb2: dd d2 rcall .+1466 ; 0x416e + 3bce: 09 f0 breq .+2 ; 0x3bd2 + 3bd0: 49 cf rjmp .-366 ; 0x3a64 + 3bd2: dd d2 rcall .+1466 ; 0x418e if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_GetConfiguration(); break; case REQ_SetConfiguration: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 3bb4: 80 91 20 23 lds r24, 0x2320 - 3bb8: 73 d2 rcall .+1254 ; 0x40a0 + 3bd4: 80 91 20 23 lds r24, 0x2320 + 3bd8: 73 d2 rcall .+1254 ; 0x40c0 } static void USB_Device_SetConfiguration(void) { #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 3bba: 3b d2 rcall .+1142 ; 0x4032 - 3bbc: 32 d4 rcall .+2148 ; 0x4422 - 3bbe: 42 cf rjmp .-380 ; 0x3a44 - 3bc0: 90 91 27 23 lds r25, 0x2327 + 3bda: 3b d2 rcall .+1142 ; 0x4052 + 3bdc: 32 d4 rcall .+2148 ; 0x4442 + 3bde: 42 cf rjmp .-380 ; 0x3a64 + 3be0: 90 91 27 23 lds r25, 0x2327 if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) return; #endif #endif Endpoint_ClearSETUP(); - 3bc4: 91 30 cpi r25, 0x01 ; 1 - 3bc6: 09 f0 breq .+2 ; 0x3bca + 3be4: 91 30 cpi r25, 0x01 ; 1 + 3be6: 09 f0 breq .+2 ; 0x3bea USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 3bc8: 3d cf rjmp .-390 ; 0x3a44 - 3bca: 91 e0 ldi r25, 0x01 ; 1 - 3bcc: 83 30 cpi r24, 0x03 ; 3 - 3bce: 09 f0 breq .+2 ; 0x3bd2 + 3be8: 3d cf rjmp .-390 ; 0x3a64 + 3bea: 91 e0 ldi r25, 0x01 ; 1 + 3bec: 83 30 cpi r24, 0x03 ; 3 + 3bee: 09 f0 breq .+2 ; 0x3bf2 Endpoint_ClearStatusStage(); - 3bd0: 90 e0 ldi r25, 0x00 ; 0 - 3bd2: 90 93 22 23 sts 0x2322, r25 + 3bf0: 90 e0 ldi r25, 0x00 ; 0 + 3bf2: 90 93 22 23 sts 0x2322, r25 if (USB_Device_ConfigurationNumber) - 3bd6: 79 cf rjmp .-270 ; 0x3aca - 3bd8: 10 91 21 23 lds r17, 0x2321 - 3bdc: 80 91 22 23 lds r24, 0x2322 + 3bf6: 79 cf rjmp .-270 ; 0x3aea + 3bf8: 10 91 21 23 lds r17, 0x2321 + 3bfc: 80 91 22 23 lds r24, 0x2322 USB_DeviceState = DEVICE_STATE_Configured; - 3be0: 88 23 and r24, r24 - 3be2: 09 f4 brne .+2 ; 0x3be6 + 3c00: 88 23 and r24, r24 + 3c02: 09 f4 brne .+2 ; 0x3c06 else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; EVENT_USB_Device_ConfigurationChanged(); - 3be4: c2 cf rjmp .-124 ; 0x3b6a - 3be6: 12 60 ori r17, 0x02 ; 2 - 3be8: c0 cf rjmp .-128 ; 0x3b6a + 3c04: c2 cf rjmp .-124 ; 0x3b8a + 3c06: 12 60 ori r17, 0x02 ; 2 + 3c08: c0 cf rjmp .-128 ; 0x3b8a USB_Device_GetDescriptor(); } break; case REQ_GetConfiguration: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 3bea: 83 e0 ldi r24, 0x03 ; 3 - 3bec: 85 cf rjmp .-246 ; 0x3af8 - 3bee: 83 e0 ldi r24, 0x03 ; 3 + 3c0a: 83 e0 ldi r24, 0x03 ; 3 + 3c0c: 85 cf rjmp .-246 ; 0x3b18 + 3c0e: 83 e0 ldi r24, 0x03 ; 3 EVENT_USB_Device_ConfigurationChanged(); } static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); - 3bf0: 8c 83 std Y+4, r24 ; 0x04 - 3bf2: 8a e3 ldi r24, 0x3A ; 58 + 3c10: 8c 83 std Y+4, r24 ; 0x04 + 3c12: 8a e3 ldi r24, 0x3A ; 58 Endpoint_Write_8(USB_Device_ConfigurationNumber); - 3bf4: 8b 83 std Y+3, r24 ; 0x03 - 3bf6: 6f b7 in r22, 0x3f ; 63 - 3bf8: f8 94 cli - 3bfa: a0 ec ldi r26, 0xC0 ; 192 + 3c14: 8b 83 std Y+3, r24 ; 0x03 + 3c16: 6f b7 in r22, 0x3f ; 63 + 3c18: f8 94 cli + 3c1a: a0 ec ldi r26, 0xC0 ; 192 Endpoint_ClearIN(); - 3bfc: b1 e0 ldi r27, 0x01 ; 1 - 3bfe: 82 e0 ldi r24, 0x02 ; 2 + 3c1c: b1 e0 ldi r27, 0x01 ; 1 + 3c1e: 82 e0 ldi r24, 0x02 ; 2 Endpoint_ClearStatusStage(); - 3c00: 1a 96 adiw r26, 0x0a ; 10 - 3c02: 8c 93 st X, r24 - 3c04: 1a 97 sbiw r26, 0x0a ; 10 + 3c20: 1a 96 adiw r26, 0x0a ; 10 + 3c22: 8c 93 st X, r24 + 3c24: 1a 97 sbiw r26, 0x0a ; 10 { 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) - 3c06: e8 e0 ldi r30, 0x08 ; 8 - 3c08: f0 e0 ldi r31, 0x00 ; 0 - 3c0a: 24 91 lpm r18, Z - 3c0c: 1a 96 adiw r26, 0x0a ; 10 - 3c0e: 1c 92 st X, r1 + 3c26: e8 e0 ldi r30, 0x08 ; 8 + 3c28: f0 e0 ldi r31, 0x00 ; 0 + 3c2a: 24 91 lpm r18, Z + 3c2c: 1a 96 adiw r26, 0x0a ; 10 + 3c2e: 1c 92 st X, r1 USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 3c10: de 01 movw r26, r28 - 3c12: 15 96 adiw r26, 0x05 ; 5 - 3c14: 81 e0 ldi r24, 0x01 ; 1 - 3c16: 90 e0 ldi r25, 0x00 ; 0 - 3c18: 78 e0 ldi r23, 0x08 ; 8 - 3c1a: 40 ec ldi r20, 0xC0 ; 192 - 3c1c: 51 e0 ldi r21, 0x01 ; 1 + 3c30: de 01 movw r26, r28 + 3c32: 15 96 adiw r26, 0x05 ; 5 + 3c34: 81 e0 ldi r24, 0x01 ; 1 + 3c36: 90 e0 ldi r25, 0x00 ; 0 + 3c38: 78 e0 ldi r23, 0x08 ; 8 + 3c3a: 40 ec ldi r20, 0xC0 ; 192 + 3c3c: 51 e0 ldi r21, 0x01 ; 1 Endpoint_ClearOUT(); } static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; - 3c1e: 12 e0 ldi r17, 0x02 ; 2 - 3c20: e2 2f mov r30, r18 + 3c3e: 12 e0 ldi r17, 0x02 ; 2 + 3c40: e2 2f mov r30, r18 if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; #endif #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_Device_RemoteWakeupEnabled) - 3c22: ef 70 andi r30, 0x0F ; 15 - 3c24: 2e 2f mov r18, r30 - 3c26: 30 e0 ldi r19, 0x00 ; 0 - 3c28: ea 30 cpi r30, 0x0A ; 10 - 3c2a: a8 f0 brcs .+42 ; 0x3c56 + 3c42: ef 70 andi r30, 0x0F ; 15 + 3c44: 2e 2f mov r18, r30 + 3c46: 30 e0 ldi r19, 0x00 ; 0 + 3c48: ea 30 cpi r30, 0x0A ; 10 + 3c4a: a8 f0 brcs .+42 ; 0x3c76 CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 3c2c: 29 5c subi r18, 0xC9 ; 201 - 3c2e: 3f 4f sbci r19, 0xFF ; 255 + 3c4c: 29 5c subi r18, 0xC9 ; 201 + 3c4e: 3f 4f sbci r19, 0xFF ; 255 while (!(Endpoint_IsINReady())); USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 3c30: 2d 93 st X+, r18 - 3c32: 3d 93 st X+, r19 + 3c50: 2d 93 st X+, r18 + 3c52: 3d 93 st X+, r19 { USB_Descriptor_Header_t Header; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; - 3c34: 8c 31 cpi r24, 0x1C ; 28 - 3c36: 91 05 cpc r25, r1 + 3c54: 8c 31 cpi r24, 0x1C ; 28 + 3c56: 91 05 cpc r25, r1 SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 3c38: 89 f0 breq .+34 ; 0x3c5c - 3c3a: fa 01 movw r30, r20 + 3c58: 89 f0 breq .+34 ; 0x3c7c + 3c5a: fa 01 movw r30, r20 #if (ARCH == ARCH_AVR8) return SREG; #elif (ARCH == ARCH_UC3) return __builtin_mfsr(AVR32_SR); #elif (ARCH == ARCH_XMEGA) return SREG; - 3c3c: 12 87 std Z+10, r17 ; 0x0a + 3c5c: 12 87 std Z+10, r17 ; 0x0a #if (ARCH == ARCH_AVR8) cli(); #elif (ARCH == ARCH_UC3) __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); - 3c3e: e7 2f mov r30, r23 + 3c5e: e7 2f mov r30, r23 for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c40: f0 e0 ldi r31, 0x00 ; 0 - 3c42: 24 91 lpm r18, Z - 3c44: fa 01 movw r30, r20 - 3c46: 12 86 std Z+10, r1 ; 0x0a - 3c48: 80 ff sbrs r24, 0 - 3c4a: 03 c0 rjmp .+6 ; 0x3c52 + 3c60: f0 e0 ldi r31, 0x00 ; 0 + 3c62: 24 91 lpm r18, Z + 3c64: fa 01 movw r30, r20 + 3c66: 12 86 std Z+10, r1 ; 0x0a + 3c68: 80 ff sbrs r24, 0 + 3c6a: 03 c0 rjmp .+6 ; 0x3c72 SerialByte = pgm_read_byte(SigReadAddress); - 3c4c: 22 95 swap r18 - 3c4e: 2f 70 andi r18, 0x0F ; 15 - 3c50: 7f 5f subi r23, 0xFF ; 255 + 3c6c: 22 95 swap r18 + 3c6e: 2f 70 andi r18, 0x0F ; 15 + 3c70: 7f 5f subi r23, 0xFF ; 255 NVM.CMD = 0; - 3c52: 01 96 adiw r24, 0x01 ; 1 - 3c54: e5 cf rjmp .-54 ; 0x3c20 + 3c72: 01 96 adiw r24, 0x01 ; 1 + 3c74: e5 cf rjmp .-54 ; 0x3c40 #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) - 3c56: 20 5d subi r18, 0xD0 ; 208 - 3c58: 3f 4f sbci r19, 0xFF ; 255 - 3c5a: ea cf rjmp .-44 ; 0x3c30 - 3c5c: 6f bf out 0x3f, r22 ; 63 + 3c76: 20 5d subi r18, 0xD0 ; 208 + 3c78: 3f 4f sbci r19, 0xFF ; 255 + 3c7a: ea cf rjmp .-44 ; 0x3c50 + 3c7c: 6f bf out 0x3f, r22 ; 63 static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) { uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; - 3c5e: 87 d2 rcall .+1294 ; 0x416e + 3c7e: 87 d2 rcall .+1294 ; 0x418e for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c60: ce 01 movw r24, r28 - 3c62: 03 96 adiw r24, 0x03 ; 3 - 3c64: 6a e3 ldi r22, 0x3A ; 58 + 3c80: ce 01 movw r24, r28 + 3c82: 03 96 adiw r24, 0x03 ; 3 + 3c84: 6a e3 ldi r22, 0x3A ; 58 { SerialByte >>= 4; SigReadAddress++; } SerialByte &= 0x0F; - 3c66: 70 e0 ldi r23, 0x00 ; 0 - 3c68: 8f d0 rcall .+286 ; 0x3d88 + 3c86: 70 e0 ldi r23, 0x00 ; 0 + 3c88: 8f d0 rcall .+286 ; 0x3da8 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 3c6a: fc d1 rcall .+1016 ; 0x4064 - 3c6c: eb ce rjmp .-554 ; 0x3a44 - 3c6e: 80 91 c3 04 lds r24, 0x04C3 - 3c72: 88 23 and r24, r24 - 3c74: 21 f0 breq .+8 ; 0x3c7e - 3c76: 84 e0 ldi r24, 0x04 ; 4 - 3c78: 80 93 24 23 sts 0x2324, r24 + 3c8a: fc d1 rcall .+1016 ; 0x4084 + 3c8c: eb ce rjmp .-554 ; 0x3a64 + 3c8e: 80 91 c3 04 lds r24, 0x04C3 + 3c92: 88 23 and r24, r24 + 3c94: 21 f0 breq .+8 ; 0x3c9e + 3c96: 84 e0 ldi r24, 0x04 ; 4 + 3c98: 80 93 24 23 sts 0x2324, r24 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++) - 3c7c: 94 cf rjmp .-216 ; 0x3ba6 - 3c7e: 81 e0 ldi r24, 0x01 ; 1 + 3c9c: 94 cf rjmp .-216 ; 0x3bc6 + 3c9e: 81 e0 ldi r24, 0x01 ; 1 { uint8_t SerialByte; NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 3c80: fb cf rjmp .-10 ; 0x3c78 - 3c82: 59 d2 rcall .+1202 ; 0x4136 + 3ca0: fb cf rjmp .-10 ; 0x3c98 + 3ca2: 59 d2 rcall .+1202 ; 0x4156 SerialByte = pgm_read_byte(SigReadAddress); - 3c84: 22 cf rjmp .-444 ; 0x3aca + 3ca4: 22 cf rjmp .-444 ; 0x3aea -00003c86 : +00003ca6 : #include "Events.h" void USB_Event_Stub(void) { } - 3c86: 08 95 ret + 3ca6: 08 95 ret -00003c88 : +00003ca8 : #if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) volatile uint8_t USB_DeviceState; #endif void USB_USBTask(void) { - 3c88: cf 93 push r28 + 3ca8: cf 93 push r28 } #if defined(USB_CAN_BE_DEVICE) static void USB_DeviceTask(void) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 3c8a: 80 91 24 23 lds r24, 0x2324 - 3c8e: 88 23 and r24, r24 - 3c90: 11 f4 brne .+4 ; 0x3c96 + 3caa: 80 91 24 23 lds r24, 0x2324 + 3cae: 88 23 and r24, r24 + 3cb0: 11 f4 brne .+4 ; 0x3cb6 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 3c92: cf 91 pop r28 - 3c94: 08 95 ret + 3cb2: cf 91 pop r28 + 3cb4: 08 95 ret * \return Index of the currently selected endpoint. */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { return USB_Endpoint_SelectedEndpoint; - 3c96: c0 91 31 23 lds r28, 0x2331 + 3cb6: c0 91 31 23 lds r28, 0x2331 if (USB_DeviceState == DEVICE_STATE_Unattached) return; uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - 3c9a: 80 e0 ldi r24, 0x00 ; 0 - 3c9c: 10 d2 rcall .+1056 ; 0x40be - 3c9e: 93 d2 rcall .+1318 ; 0x41c6 + 3cba: 80 e0 ldi r24, 0x00 ; 0 + 3cbc: 10 d2 rcall .+1056 ; 0x40de + 3cbe: 93 d2 rcall .+1318 ; 0x41e6 if (Endpoint_IsSETUPReceived()) - 3ca0: 88 23 and r24, r24 - 3ca2: 21 f4 brne .+8 ; 0x3cac - 3ca4: 8c 2f mov r24, r28 - 3ca6: 0b d2 rcall .+1046 ; 0x40be + 3cc0: 88 23 and r24, r24 + 3cc2: 21 f4 brne .+8 ; 0x3ccc + 3cc4: 8c 2f mov r24, r28 + 3cc6: 0b d2 rcall .+1046 ; 0x40de USB_Device_ProcessControlRequest(); Endpoint_SelectEndpoint(PrevEndpoint); - 3ca8: cf 91 pop r28 - 3caa: 08 95 ret - 3cac: 94 de rcall .-728 ; 0x39d6 + 3cc8: cf 91 pop r28 + 3cca: 08 95 ret + 3ccc: 94 de rcall .-728 ; 0x39f6 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 3cae: fa cf rjmp .-12 ; 0x3ca4 + 3cce: fa cf rjmp .-12 ; 0x3cc4 -00003cb0 : +00003cd0 : #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, uint16_t Length, uint16_t* const BytesProcessed) { - 3cb0: af 92 push r10 - 3cb2: bf 92 push r11 - 3cb4: cf 92 push r12 - 3cb6: df 92 push r13 - 3cb8: ff 92 push r15 - 3cba: 0f 93 push r16 - 3cbc: 1f 93 push r17 - 3cbe: cf 93 push r28 - 3cc0: df 93 push r29 - 3cc2: ec 01 movw r28, r24 - 3cc4: 8b 01 movw r16, r22 - 3cc6: 6a 01 movw r12, r20 + 3cd0: af 92 push r10 + 3cd2: bf 92 push r11 + 3cd4: cf 92 push r12 + 3cd6: df 92 push r13 + 3cd8: ff 92 push r15 + 3cda: 0f 93 push r16 + 3cdc: 1f 93 push r17 + 3cde: cf 93 push r28 + 3ce0: df 93 push r29 + 3ce2: ec 01 movw r28, r24 + 3ce4: 8b 01 movw r16, r22 + 3ce6: 6a 01 movw r12, r20 uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); uint16_t BytesInTransfer = 0; uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady())) - 3cc8: c2 d3 rcall .+1924 ; 0x444e - 3cca: f8 2e mov r15, r24 - 3ccc: 88 23 and r24, r24 - 3cce: 61 f5 brne .+88 ; 0x3d28 - 3cd0: c1 14 cp r12, r1 + 3ce8: c2 d3 rcall .+1924 ; 0x446e + 3cea: f8 2e mov r15, r24 + 3cec: 88 23 and r24, r24 + 3cee: 61 f5 brne .+88 ; 0x3d48 + 3cf0: c1 14 cp r12, r1 return ErrorCode; if (BytesProcessed != NULL) - 3cd2: d1 04 cpc r13, r1 - 3cd4: 39 f0 breq .+14 ; 0x3ce4 - 3cd6: f6 01 movw r30, r12 + 3cf2: d1 04 cpc r13, r1 + 3cf4: 39 f0 breq .+14 ; 0x3d04 + 3cf6: f6 01 movw r30, r12 { Length -= *BytesProcessed; - 3cd8: 80 81 ld r24, Z - 3cda: 91 81 ldd r25, Z+1 ; 0x01 - 3cdc: 08 1b sub r16, r24 - 3cde: 19 0b sbc r17, r25 - 3ce0: c8 0f add r28, r24 + 3cf8: 80 81 ld r24, Z + 3cfa: 91 81 ldd r25, Z+1 ; 0x01 + 3cfc: 08 1b sub r16, r24 + 3cfe: 19 0b sbc r17, r25 + 3d00: c8 0f add r28, r24 TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); - 3ce2: d9 1f adc r29, r25 - 3ce4: 01 15 cp r16, r1 + 3d02: d9 1f adc r29, r25 + 3d04: 01 15 cp r16, r1 } while (Length) - 3ce6: 11 05 cpc r17, r1 - 3ce8: f9 f0 breq .+62 ; 0x3d28 - 3cea: c1 14 cp r12, r1 - 3cec: d1 04 cpc r13, r1 - 3cee: 41 f0 breq .+16 ; 0x3d00 - 3cf0: 26 c0 rjmp .+76 ; 0x3d3e - 3cf2: 89 91 ld r24, Y+ + 3d06: 11 05 cpc r17, r1 + 3d08: f9 f0 breq .+62 ; 0x3d48 + 3d0a: c1 14 cp r12, r1 + 3d0c: d1 04 cpc r13, r1 + 3d0e: 41 f0 breq .+16 ; 0x3d20 + 3d10: 26 c0 rjmp .+76 ; 0x3d5e + 3d12: 89 91 ld r24, Y+ if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } else { TEMPLATE_TRANSFER_BYTE(DataStream); - 3cf4: d5 d1 rcall .+938 ; 0x40a0 - 3cf6: 01 50 subi r16, 0x01 ; 1 - 3cf8: 10 40 sbci r17, 0x00 ; 0 + 3d14: d5 d1 rcall .+938 ; 0x40c0 + 3d16: 01 50 subi r16, 0x01 ; 1 + 3d18: 10 40 sbci r17, 0x00 ; 0 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; - 3cfa: 01 15 cp r16, r1 - 3cfc: 11 05 cpc r17, r1 + 3d1a: 01 15 cp r16, r1 + 3d1c: 11 05 cpc r17, r1 { Length -= *BytesProcessed; TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); } while (Length) - 3cfe: a1 f0 breq .+40 ; 0x3d28 - 3d00: 80 91 2d 23 lds r24, 0x232D + 3d1e: a1 f0 breq .+40 ; 0x3d48 + 3d20: 80 91 2d 23 lds r24, 0x232D * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); - 3d04: 90 91 2e 23 lds r25, 0x232E - 3d08: fc 01 movw r30, r24 - 3d0a: ef 5b subi r30, 0xBF ; 191 - 3d0c: ff 4f sbci r31, 0xFF ; 255 - 3d0e: 20 81 ld r18, Z - 3d10: 80 5c subi r24, 0xC0 ; 192 - 3d12: 9f 4f sbci r25, 0xFF ; 255 - 3d14: fc 01 movw r30, r24 - 3d16: 80 81 ld r24, Z - 3d18: 28 17 cp r18, r24 - 3d1a: 58 f3 brcs .-42 ; 0x3cf2 + 3d24: 90 91 2e 23 lds r25, 0x232E + 3d28: fc 01 movw r30, r24 + 3d2a: ef 5b subi r30, 0xBF ; 191 + 3d2c: ff 4f sbci r31, 0xFF ; 255 + 3d2e: 20 81 ld r18, Z + 3d30: 80 5c subi r24, 0xC0 ; 192 + 3d32: 9f 4f sbci r25, 0xFF ; 255 + 3d34: fc 01 movw r30, r24 + 3d36: 80 81 ld r24, Z + 3d38: 28 17 cp r18, r24 + 3d3a: 58 f3 brcs .-42 ; 0x3d12 { if (!(Endpoint_IsReadWriteAllowed())) - 3d1c: 8a d1 rcall .+788 ; 0x4032 - 3d1e: b4 df rcall .-152 ; 0x3c88 + 3d3c: 8a d1 rcall .+788 ; 0x4052 + 3d3e: b4 df rcall .-152 ; 0x3ca8 { TEMPLATE_CLEAR_ENDPOINT(); - 3d20: 96 d3 rcall .+1836 ; 0x444e - 3d22: 88 23 and r24, r24 + 3d40: 96 d3 rcall .+1836 ; 0x446e + 3d42: 88 23 and r24, r24 #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); - 3d24: 51 f3 breq .-44 ; 0x3cfa - 3d26: f8 2e mov r15, r24 + 3d44: 51 f3 breq .-44 ; 0x3d1a + 3d46: f8 2e mov r15, r24 { *BytesProcessed += BytesInTransfer; return ENDPOINT_RWSTREAM_IncompleteTransfer; } if ((ErrorCode = Endpoint_WaitUntilReady())) - 3d28: 8f 2d mov r24, r15 - 3d2a: df 91 pop r29 - 3d2c: cf 91 pop r28 - 3d2e: 1f 91 pop r17 - 3d30: 0f 91 pop r16 + 3d48: 8f 2d mov r24, r15 + 3d4a: df 91 pop r29 + 3d4c: cf 91 pop r28 + 3d4e: 1f 91 pop r17 + 3d50: 0f 91 pop r16 BytesInTransfer++; } } return ENDPOINT_RWSTREAM_NoError; } - 3d32: ff 90 pop r15 - 3d34: df 90 pop r13 - 3d36: cf 90 pop r12 - 3d38: bf 90 pop r11 - 3d3a: af 90 pop r10 - 3d3c: 08 95 ret - 3d3e: aa 24 eor r10, r10 - 3d40: bb 24 eor r11, r11 - 3d42: 80 91 2d 23 lds r24, 0x232D - 3d46: 90 91 2e 23 lds r25, 0x232E + 3d52: ff 90 pop r15 + 3d54: df 90 pop r13 + 3d56: cf 90 pop r12 + 3d58: bf 90 pop r11 + 3d5a: af 90 pop r10 + 3d5c: 08 95 ret + 3d5e: aa 24 eor r10, r10 + 3d60: bb 24 eor r11, r11 + 3d62: 80 91 2d 23 lds r24, 0x232D + 3d66: 90 91 2e 23 lds r25, 0x232E { Length -= *BytesProcessed; TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); } while (Length) - 3d4a: fc 01 movw r30, r24 - 3d4c: ef 5b subi r30, 0xBF ; 191 - 3d4e: ff 4f sbci r31, 0xFF ; 255 - 3d50: 20 81 ld r18, Z - 3d52: fc 01 movw r30, r24 - 3d54: e0 5c subi r30, 0xC0 ; 192 - 3d56: ff 4f sbci r31, 0xFF ; 255 - 3d58: 80 81 ld r24, Z - 3d5a: 28 17 cp r18, r24 - 3d5c: 60 f0 brcs .+24 ; 0x3d76 - 3d5e: 69 d1 rcall .+722 ; 0x4032 - 3d60: 93 df rcall .-218 ; 0x3c88 - 3d62: f6 01 movw r30, r12 + 3d6a: fc 01 movw r30, r24 + 3d6c: ef 5b subi r30, 0xBF ; 191 + 3d6e: ff 4f sbci r31, 0xFF ; 255 + 3d70: 20 81 ld r18, Z + 3d72: fc 01 movw r30, r24 + 3d74: e0 5c subi r30, 0xC0 ; 192 + 3d76: ff 4f sbci r31, 0xFF ; 255 + 3d78: 80 81 ld r24, Z + 3d7a: 28 17 cp r18, r24 + 3d7c: 60 f0 brcs .+24 ; 0x3d96 + 3d7e: 69 d1 rcall .+722 ; 0x4052 + 3d80: 93 df rcall .-218 ; 0x3ca8 + 3d82: f6 01 movw r30, r12 { if (!(Endpoint_IsReadWriteAllowed())) - 3d64: 80 81 ld r24, Z - 3d66: 91 81 ldd r25, Z+1 ; 0x01 + 3d84: 80 81 ld r24, Z + 3d86: 91 81 ldd r25, Z+1 ; 0x01 { TEMPLATE_CLEAR_ENDPOINT(); - 3d68: 8a 0d add r24, r10 - 3d6a: 9b 1d adc r25, r11 + 3d88: 8a 0d add r24, r10 + 3d8a: 9b 1d adc r25, r11 #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); - 3d6c: 80 83 st Z, r24 - 3d6e: 91 83 std Z+1, r25 ; 0x01 + 3d8c: 80 83 st Z, r24 + 3d8e: 91 83 std Z+1, r25 ; 0x01 #endif if (BytesProcessed != NULL) { *BytesProcessed += BytesInTransfer; - 3d70: 25 e0 ldi r18, 0x05 ; 5 - 3d72: f2 2e mov r15, r18 - 3d74: d9 cf rjmp .-78 ; 0x3d28 - 3d76: 89 91 ld r24, Y+ - 3d78: 93 d1 rcall .+806 ; 0x40a0 - 3d7a: 08 94 sec - 3d7c: a1 1c adc r10, r1 + 3d90: 25 e0 ldi r18, 0x05 ; 5 + 3d92: f2 2e mov r15, r18 + 3d94: d9 cf rjmp .-78 ; 0x3d48 + 3d96: 89 91 ld r24, Y+ + 3d98: 93 d1 rcall .+806 ; 0x40c0 + 3d9a: 08 94 sec + 3d9c: a1 1c adc r10, r1 return ENDPOINT_RWSTREAM_IncompleteTransfer; - 3d7e: b1 1c adc r11, r1 - 3d80: 0a 15 cp r16, r10 - 3d82: 1b 05 cpc r17, r11 + 3d9e: b1 1c adc r11, r1 + 3da0: 0a 15 cp r16, r10 + 3da2: 1b 05 cpc r17, r11 if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } else { TEMPLATE_TRANSFER_BYTE(DataStream); - 3d84: f1 f6 brne .-68 ; 0x3d42 - 3d86: d0 cf rjmp .-96 ; 0x3d28 + 3da4: f1 f6 brne .-68 ; 0x3d62 + 3da6: d0 cf rjmp .-96 ; 0x3d48 -00003d88 : - 3d88: cf 92 push r12 +00003da8 : + 3da8: cf 92 push r12 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInTransfer++; - 3d8a: df 92 push r13 - 3d8c: ef 92 push r14 - 3d8e: ff 92 push r15 + 3daa: df 92 push r13 + 3dac: ef 92 push r14 + 3dae: ff 92 push r15 { Length -= *BytesProcessed; TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); } while (Length) - 3d90: 0f 93 push r16 - 3d92: 1f 93 push r17 - 3d94: cf 93 push r28 - 3d96: df 93 push r29 + 3db0: 0f 93 push r16 + 3db2: 1f 93 push r17 + 3db4: cf 93 push r28 + 3db6: df 93 push r29 #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, uint16_t Length) { - 3d98: d8 2e mov r13, r24 - 3d9a: c9 2e mov r12, r25 - 3d9c: eb 01 movw r28, r22 + 3db8: d8 2e mov r13, r24 + 3dba: c9 2e mov r12, r25 + 3dbc: eb 01 movw r28, r22 uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); bool LastPacketFull = false; Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 3d9e: 80 91 31 23 lds r24, 0x2331 - 3da2: 80 68 ori r24, 0x80 ; 128 - 3da4: 8c d1 rcall .+792 ; 0x40be - 3da6: e0 90 2b 23 lds r14, 0x232B + 3dbe: 80 91 31 23 lds r24, 0x2331 + 3dc2: 80 68 ori r24, 0x80 ; 128 + 3dc4: 8c d1 rcall .+792 ; 0x40de + 3dc6: e0 90 2b 23 lds r14, 0x232B if (Length > USB_ControlRequest.wLength) - 3daa: f0 90 2c 23 lds r15, 0x232C - 3dae: ec 16 cp r14, r28 - 3db0: fd 06 cpc r15, r29 - 3db2: 20 f0 brcs .+8 ; 0x3dbc - 3db4: 20 97 sbiw r28, 0x00 ; 0 + 3dca: f0 90 2c 23 lds r15, 0x232C + 3dce: ec 16 cp r14, r28 + 3dd0: fd 06 cpc r15, r29 + 3dd2: 20 f0 brcs .+8 ; 0x3ddc + 3dd4: 20 97 sbiw r28, 0x00 ; 0 Length = USB_ControlRequest.wLength; else if (!(Length)) - 3db6: 09 f4 brne .+2 ; 0x3dba - 3db8: 86 c0 rjmp .+268 ; 0x3ec6 - 3dba: 7e 01 movw r14, r28 - 3dbc: 00 e0 ldi r16, 0x00 ; 0 - 3dbe: e1 14 cp r14, r1 + 3dd6: 09 f4 brne .+2 ; 0x3dda + 3dd8: 86 c0 rjmp .+268 ; 0x3ee6 + 3dda: 7e 01 movw r14, r28 + 3ddc: 00 e0 ldi r16, 0x00 ; 0 + 3dde: e1 14 cp r14, r1 Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); - 3dc0: f1 04 cpc r15, r1 - 3dc2: 09 f0 breq .+2 ; 0x3dc6 - 3dc4: 4c c0 rjmp .+152 ; 0x3e5e - 3dc6: 00 23 and r16, r16 - 3dc8: 09 f4 brne .+2 ; 0x3dcc - 3dca: 5f c0 rjmp .+190 ; 0x3e8a - 3dcc: 80 91 24 23 lds r24, 0x2324 + 3de0: f1 04 cpc r15, r1 + 3de2: 09 f0 breq .+2 ; 0x3de6 + 3de4: 4c c0 rjmp .+152 ; 0x3e7e + 3de6: 00 23 and r16, r16 + 3de8: 09 f4 brne .+2 ; 0x3dec + 3dea: 5f c0 rjmp .+190 ; 0x3eaa + 3dec: 80 91 24 23 lds r24, 0x2324 else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3dd0: 88 23 and r24, r24 + 3df0: 88 23 and r24, r24 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3dd2: 09 f4 brne .+2 ; 0x3dd6 - 3dd4: 58 c0 rjmp .+176 ; 0x3e86 - 3dd6: 85 30 cpi r24, 0x05 ; 5 + 3df2: 09 f4 brne .+2 ; 0x3df6 + 3df4: 58 c0 rjmp .+176 ; 0x3ea6 + 3df6: 85 30 cpi r24, 0x05 ; 5 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3dd8: 09 f4 brne .+2 ; 0x3ddc - 3dda: 60 c0 rjmp .+192 ; 0x3e9c - 3ddc: f4 d1 rcall .+1000 ; 0x41c6 + 3df8: 09 f4 brne .+2 ; 0x3dfc + 3dfa: 60 c0 rjmp .+192 ; 0x3ebc + 3dfc: f4 d1 rcall .+1000 ; 0x41e6 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - 3dde: 88 23 and r24, r24 - 3de0: 09 f0 breq .+2 ; 0x3de4 - 3de2: 6f c0 rjmp .+222 ; 0x3ec2 - 3de4: 08 d2 rcall .+1040 ; 0x41f6 - 3de6: 88 23 and r24, r24 + 3dfe: 88 23 and r24, r24 + 3e00: 09 f0 breq .+2 ; 0x3e04 + 3e02: 6f c0 rjmp .+222 ; 0x3ee2 + 3e04: 08 d2 rcall .+1040 ; 0x4216 + 3e06: 88 23 and r24, r24 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - 3de8: 09 f0 breq .+2 ; 0x3dec - 3dea: 4f c0 rjmp .+158 ; 0x3e8a - 3dec: 1c d2 rcall .+1080 ; 0x4226 - 3dee: 88 23 and r24, r24 - 3df0: 69 f3 breq .-38 ; 0x3dcc + 3e08: 09 f0 breq .+2 ; 0x3e0c + 3e0a: 4f c0 rjmp .+158 ; 0x3eaa + 3e0c: 1c d2 rcall .+1080 ; 0x4246 + 3e0e: 88 23 and r24, r24 + 3e10: 69 f3 breq .-38 ; 0x3dec break; if (Endpoint_IsINReady()) - 3df2: 80 91 31 23 lds r24, 0x2331 - 3df6: 87 fd sbrc r24, 7 - 3df8: 5b c0 rjmp .+182 ; 0x3eb0 + 3e12: 80 91 31 23 lds r24, 0x2331 + 3e16: 87 fd sbrc r24, 7 + 3e18: 5b c0 rjmp .+182 ; 0x3ed0 * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 3dfa: 80 91 2d 23 lds r24, 0x232D - 3dfe: 90 91 2e 23 lds r25, 0x232E + 3e1a: 80 91 2d 23 lds r24, 0x232D + 3e1e: 90 91 2e 23 lds r25, 0x232E return USB_Endpoint_SelectedFIFO->Position; else return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 3e02: fc 01 movw r30, r24 - 3e04: e0 5c subi r30, 0xC0 ; 192 - 3e06: ff 4f sbci r31, 0xFF ; 255 - 3e08: c0 81 ld r28, Z - 3e0a: 8f 5b subi r24, 0xBF ; 191 - 3e0c: 9f 4f sbci r25, 0xFF ; 255 - 3e0e: fc 01 movw r30, r24 - 3e10: 80 81 ld r24, Z - 3e12: d0 e0 ldi r29, 0x00 ; 0 - 3e14: c8 1b sub r28, r24 - 3e16: d1 09 sbc r29, r1 - 3e18: e1 14 cp r14, r1 - 3e1a: f1 04 cpc r15, r1 - 3e1c: b1 f0 breq .+44 ; 0x3e4a - 3e1e: c8 30 cpi r28, 0x08 ; 8 + 3e22: fc 01 movw r30, r24 + 3e24: e0 5c subi r30, 0xC0 ; 192 + 3e26: ff 4f sbci r31, 0xFF ; 255 + 3e28: c0 81 ld r28, Z + 3e2a: 8f 5b subi r24, 0xBF ; 191 + 3e2c: 9f 4f sbci r25, 0xFF ; 255 + 3e2e: fc 01 movw r30, r24 + 3e30: 80 81 ld r24, Z + 3e32: d0 e0 ldi r29, 0x00 ; 0 + 3e34: c8 1b sub r28, r24 + 3e36: d1 09 sbc r29, r1 + 3e38: e1 14 cp r14, r1 + 3e3a: f1 04 cpc r15, r1 + 3e3c: b1 f0 breq .+44 ; 0x3e6a + 3e3e: c8 30 cpi r28, 0x08 ; 8 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3e20: d1 05 cpc r29, r1 - 3e22: 98 f4 brcc .+38 ; 0x3e4a - 3e24: 0d 2d mov r16, r13 - 3e26: 1c 2d mov r17, r12 - 3e28: 03 c0 rjmp .+6 ; 0x3e30 - 3e2a: c8 30 cpi r28, 0x08 ; 8 - 3e2c: d1 05 cpc r29, r1 - 3e2e: 69 f0 breq .+26 ; 0x3e4a - 3e30: f8 01 movw r30, r16 - 3e32: 81 91 ld r24, Z+ - 3e34: 8f 01 movw r16, r30 - 3e36: 34 d1 rcall .+616 ; 0x40a0 + 3e40: d1 05 cpc r29, r1 + 3e42: 98 f4 brcc .+38 ; 0x3e6a + 3e44: 0d 2d mov r16, r13 + 3e46: 1c 2d mov r17, r12 + 3e48: 03 c0 rjmp .+6 ; 0x3e50 + 3e4a: c8 30 cpi r28, 0x08 ; 8 + 3e4c: d1 05 cpc r29, r1 + 3e4e: 69 f0 breq .+26 ; 0x3e6a + 3e50: f8 01 movw r30, r16 + 3e52: 81 91 ld r24, Z+ + 3e54: 8f 01 movw r16, r30 + 3e56: 34 d1 rcall .+616 ; 0x40c0 { TEMPLATE_TRANSFER_BYTE(DataStream); - 3e38: d0 2e mov r13, r16 - 3e3a: c1 2e mov r12, r17 - 3e3c: 08 94 sec - 3e3e: e1 08 sbc r14, r1 - 3e40: f1 08 sbc r15, r1 + 3e58: d0 2e mov r13, r16 + 3e5a: c1 2e mov r12, r17 + 3e5c: 08 94 sec + 3e5e: e1 08 sbc r14, r1 + 3e60: f1 08 sbc r15, r1 TEMPLATE_BUFFER_MOVE(DataStream, 1); - 3e42: 21 96 adiw r28, 0x01 ; 1 - 3e44: e1 14 cp r14, r1 + 3e62: 21 96 adiw r28, 0x01 ; 1 + 3e64: e1 14 cp r14, r1 Length--; - 3e46: f1 04 cpc r15, r1 - 3e48: 81 f7 brne .-32 ; 0x3e2a - 3e4a: 01 e0 ldi r16, 0x01 ; 1 + 3e66: f1 04 cpc r15, r1 + 3e68: 81 f7 brne .-32 ; 0x3e4a + 3e6a: 01 e0 ldi r16, 0x01 ; 1 BytesInEndpoint++; - 3e4c: c8 30 cpi r28, 0x08 ; 8 + 3e6c: c8 30 cpi r28, 0x08 ; 8 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3e4e: d1 05 cpc r29, r1 - 3e50: 09 f0 breq .+2 ; 0x3e54 - 3e52: 00 e0 ldi r16, 0x00 ; 0 + 3e6e: d1 05 cpc r29, r1 + 3e70: 09 f0 breq .+2 ; 0x3e74 + 3e72: 00 e0 ldi r16, 0x00 ; 0 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 3e54: ee d0 rcall .+476 ; 0x4032 - 3e56: e1 14 cp r14, r1 - 3e58: f1 04 cpc r15, r1 - 3e5a: 09 f4 brne .+2 ; 0x3e5e - 3e5c: b4 cf rjmp .-152 ; 0x3dc6 + 3e74: ee d0 rcall .+476 ; 0x4052 + 3e76: e1 14 cp r14, r1 + 3e78: f1 04 cpc r15, r1 + 3e7a: 09 f4 brne .+2 ; 0x3e7e + 3e7c: b4 cf rjmp .-152 ; 0x3de6 Endpoint_ClearIN(); - 3e5e: 80 91 24 23 lds r24, 0x2324 - 3e62: 88 23 and r24, r24 - 3e64: 81 f0 breq .+32 ; 0x3e86 - 3e66: 85 30 cpi r24, 0x05 ; 5 - 3e68: c9 f0 breq .+50 ; 0x3e9c - else if (!(Length)) - Endpoint_ClearIN(); - - while (Length || LastPacketFull) - { - uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3e6a: ad d1 rcall .+858 ; 0x41c6 - 3e6c: 88 23 and r24, r24 - - if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3e6e: 49 f5 brne .+82 ; 0x3ec2 - 3e70: c2 d1 rcall .+900 ; 0x41f6 - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3e72: 88 23 and r24, r24 - 3e74: 51 f4 brne .+20 ; 0x3e8a - return ENDPOINT_RWCSTREAM_BusSuspended; - else if (Endpoint_IsSETUPReceived()) - 3e76: d7 d1 rcall .+942 ; 0x4226 - 3e78: 88 23 and r24, r24 - 3e7a: 09 f0 breq .+2 ; 0x3e7e - 3e7c: ba cf rjmp .-140 ; 0x3df2 - return ENDPOINT_RWCSTREAM_HostAborted; - else if (Endpoint_IsOUTReceived()) 3e7e: 80 91 24 23 lds r24, 0x2324 3e82: 88 23 and r24, r24 - 3e84: 81 f7 brne .-32 ; 0x3e66 - break; - - if (Endpoint_IsINReady()) - 3e86: 82 e0 ldi r24, 0x02 ; 2 - 3e88: 0a c0 rjmp .+20 ; 0x3e9e - 3e8a: b5 d1 rcall .+874 ; 0x41f6 - 3e8c: 88 23 and r24, r24 - 3e8e: f9 f4 brne .+62 ; 0x3ece + 3e84: 81 f0 breq .+32 ; 0x3ea6 + 3e86: 85 30 cpi r24, 0x05 ; 5 + 3e88: c9 f0 breq .+50 ; 0x3ebc else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3e90: 80 91 24 23 lds r24, 0x2324 + 3e8a: ad d1 rcall .+858 ; 0x41e6 + 3e8c: 88 23 and r24, r24 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3e94: 88 23 and r24, r24 - 3e96: b9 f3 breq .-18 ; 0x3e86 + 3e8e: 49 f5 brne .+82 ; 0x3ee2 + 3e90: c2 d1 rcall .+900 ; 0x4216 + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + 3e92: 88 23 and r24, r24 + 3e94: 51 f4 brne .+20 ; 0x3eaa + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + 3e96: d7 d1 rcall .+942 ; 0x4246 + 3e98: 88 23 and r24, r24 + 3e9a: 09 f0 breq .+2 ; 0x3e9e + 3e9c: ba cf rjmp .-140 ; 0x3e12 + return ENDPOINT_RWCSTREAM_HostAborted; + else if (Endpoint_IsOUTReceived()) + 3e9e: 80 91 24 23 lds r24, 0x2324 + 3ea2: 88 23 and r24, r24 + 3ea4: 81 f7 brne .-32 ; 0x3e86 + break; + + if (Endpoint_IsINReady()) + 3ea6: 82 e0 ldi r24, 0x02 ; 2 + 3ea8: 0a c0 rjmp .+20 ; 0x3ebe + 3eaa: b5 d1 rcall .+874 ; 0x4216 + 3eac: 88 23 and r24, r24 + 3eae: f9 f4 brne .+62 ; 0x3eee + else if (!(Length)) + Endpoint_ClearIN(); + + while (Length || LastPacketFull) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + 3eb0: 80 91 24 23 lds r24, 0x2324 + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + 3eb4: 88 23 and r24, r24 + 3eb6: b9 f3 breq .-18 ; 0x3ea6 while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 3e98: 85 30 cpi r24, 0x05 ; 5 - 3e9a: b9 f7 brne .-18 ; 0x3e8a + 3eb8: 85 30 cpi r24, 0x05 ; 5 + 3eba: b9 f7 brne .-18 ; 0x3eaa LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - 3e9c: 83 e0 ldi r24, 0x03 ; 3 - 3e9e: df 91 pop r29 - 3ea0: cf 91 pop r28 - 3ea2: 1f 91 pop r17 + 3ebc: 83 e0 ldi r24, 0x03 ; 3 + 3ebe: df 91 pop r29 + 3ec0: cf 91 pop r28 + 3ec2: 1f 91 pop r17 { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3ea4: 0f 91 pop r16 - 3ea6: ff 90 pop r15 + 3ec4: 0f 91 pop r16 + 3ec6: ff 90 pop r15 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3ea8: ef 90 pop r14 - 3eaa: df 90 pop r13 + 3ec8: ef 90 pop r14 + 3eca: df 90 pop r13 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3eac: cf 90 pop r12 - 3eae: 08 95 ret + 3ecc: cf 90 pop r12 + 3ece: 08 95 ret return ENDPOINT_RWCSTREAM_BusSuspended; - 3eb0: e0 91 2d 23 lds r30, 0x232D + 3ed0: e0 91 2d 23 lds r30, 0x232D } return ENDPOINT_RWCSTREAM_NoError; } - 3eb4: f0 91 2e 23 lds r31, 0x232E - 3eb8: ef 5b subi r30, 0xBF ; 191 - 3eba: ff 4f sbci r31, 0xFF ; 255 - 3ebc: c0 81 ld r28, Z - 3ebe: d0 e0 ldi r29, 0x00 ; 0 - 3ec0: ab cf rjmp .-170 ; 0x3e18 - 3ec2: 81 e0 ldi r24, 0x01 ; 1 + 3ed4: f0 91 2e 23 lds r31, 0x232E + 3ed8: ef 5b subi r30, 0xBF ; 191 + 3eda: ff 4f sbci r31, 0xFF ; 255 + 3edc: c0 81 ld r28, Z + 3ede: d0 e0 ldi r29, 0x00 ; 0 + 3ee0: ab cf rjmp .-170 ; 0x3e38 + 3ee2: 81 e0 ldi r24, 0x01 ; 1 */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) return USB_Endpoint_SelectedFIFO->Position; - 3ec4: ec cf rjmp .-40 ; 0x3e9e - 3ec6: b5 d0 rcall .+362 ; 0x4032 - 3ec8: ee 24 eor r14, r14 - 3eca: ff 24 eor r15, r15 - 3ecc: 77 cf rjmp .-274 ; 0x3dbc - 3ece: 80 e0 ldi r24, 0x00 ; 0 - 3ed0: e6 cf rjmp .-52 ; 0x3e9e + 3ee4: ec cf rjmp .-40 ; 0x3ebe + 3ee6: b5 d0 rcall .+362 ; 0x4052 + 3ee8: ee 24 eor r14, r14 + 3eea: ff 24 eor r15, r15 + 3eec: 77 cf rjmp .-274 ; 0x3ddc + 3eee: 80 e0 ldi r24, 0x00 ; 0 + 3ef0: e6 cf rjmp .-52 ; 0x3ebe -00003ed2 : - 3ed2: cf 92 push r12 - 3ed4: df 92 push r13 +00003ef2 : + 3ef2: cf 92 push r12 + 3ef4: df 92 push r13 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - 3ed6: ef 92 push r14 - 3ed8: ff 92 push r15 + 3ef6: ef 92 push r14 + 3ef8: ff 92 push r15 Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); - 3eda: 0f 93 push r16 - 3edc: 1f 93 push r17 - 3ede: cf 93 push r28 - 3ee0: df 93 push r29 - 3ee2: 0f 92 push r0 + 3efa: 0f 93 push r16 + 3efc: 1f 93 push r17 + 3efe: cf 93 push r28 + 3f00: df 93 push r29 + 3f02: 0f 92 push r0 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - 3ee4: cd b7 in r28, 0x3d ; 61 - 3ee6: de b7 in r29, 0x3e ; 62 + 3f04: cd b7 in r28, 0x3d ; 61 + 3f06: de b7 in r29, 0x3e ; 62 #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, uint16_t Length) { - 3ee8: d8 2e mov r13, r24 - 3eea: c9 2e mov r12, r25 - 3eec: 7b 01 movw r14, r22 + 3f08: d8 2e mov r13, r24 + 3f0a: c9 2e mov r12, r25 + 3f0c: 7b 01 movw r14, r22 uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); bool LastPacketFull = false; Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 3eee: 80 91 31 23 lds r24, 0x2331 - 3ef2: 80 68 ori r24, 0x80 ; 128 - 3ef4: e4 d0 rcall .+456 ; 0x40be - 3ef6: 00 91 2b 23 lds r16, 0x232B + 3f0e: 80 91 31 23 lds r24, 0x2331 + 3f12: 80 68 ori r24, 0x80 ; 128 + 3f14: e4 d0 rcall .+456 ; 0x40de + 3f16: 00 91 2b 23 lds r16, 0x232B if (Length > USB_ControlRequest.wLength) - 3efa: 10 91 2c 23 lds r17, 0x232C - 3efe: 0e 15 cp r16, r14 - 3f00: 1f 05 cpc r17, r15 - 3f02: 28 f0 brcs .+10 ; 0x3f0e - 3f04: e1 14 cp r14, r1 + 3f1a: 10 91 2c 23 lds r17, 0x232C + 3f1e: 0e 15 cp r16, r14 + 3f20: 1f 05 cpc r17, r15 + 3f22: 28 f0 brcs .+10 ; 0x3f2e + 3f24: e1 14 cp r14, r1 Length = USB_ControlRequest.wLength; else if (!(Length)) - 3f06: f1 04 cpc r15, r1 - 3f08: 09 f4 brne .+2 ; 0x3f0c - 3f0a: 8d c0 rjmp .+282 ; 0x4026 - 3f0c: 87 01 movw r16, r14 - 3f0e: ed 2c mov r14, r13 - 3f10: fc 2c mov r15, r12 - 3f12: 80 e0 ldi r24, 0x00 ; 0 - 3f14: 01 15 cp r16, r1 + 3f26: f1 04 cpc r15, r1 + 3f28: 09 f4 brne .+2 ; 0x3f2c + 3f2a: 8d c0 rjmp .+282 ; 0x4046 + 3f2c: 87 01 movw r16, r14 + 3f2e: ed 2c mov r14, r13 + 3f30: fc 2c mov r15, r12 + 3f32: 80 e0 ldi r24, 0x00 ; 0 + 3f34: 01 15 cp r16, r1 Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); - 3f16: 11 05 cpc r17, r1 - 3f18: 09 f0 breq .+2 ; 0x3f1c - 3f1a: 50 c0 rjmp .+160 ; 0x3fbc - 3f1c: 88 23 and r24, r24 - 3f1e: 09 f4 brne .+2 ; 0x3f22 - 3f20: 63 c0 rjmp .+198 ; 0x3fe8 - 3f22: 80 91 24 23 lds r24, 0x2324 + 3f36: 11 05 cpc r17, r1 + 3f38: 09 f0 breq .+2 ; 0x3f3c + 3f3a: 50 c0 rjmp .+160 ; 0x3fdc + 3f3c: 88 23 and r24, r24 + 3f3e: 09 f4 brne .+2 ; 0x3f42 + 3f40: 63 c0 rjmp .+198 ; 0x4008 + 3f42: 80 91 24 23 lds r24, 0x2324 else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3f26: 88 23 and r24, r24 + 3f46: 88 23 and r24, r24 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3f28: 09 f4 brne .+2 ; 0x3f2c - 3f2a: 5c c0 rjmp .+184 ; 0x3fe4 - 3f2c: 85 30 cpi r24, 0x05 ; 5 + 3f48: 09 f4 brne .+2 ; 0x3f4c + 3f4a: 5c c0 rjmp .+184 ; 0x4004 + 3f4c: 85 30 cpi r24, 0x05 ; 5 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3f2e: 09 f4 brne .+2 ; 0x3f32 - 3f30: 64 c0 rjmp .+200 ; 0x3ffa - 3f32: 49 d1 rcall .+658 ; 0x41c6 + 3f4e: 09 f4 brne .+2 ; 0x3f52 + 3f50: 64 c0 rjmp .+200 ; 0x401a + 3f52: 49 d1 rcall .+658 ; 0x41e6 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - 3f34: 88 23 and r24, r24 - 3f36: 09 f0 breq .+2 ; 0x3f3a - 3f38: 74 c0 rjmp .+232 ; 0x4022 - 3f3a: 5d d1 rcall .+698 ; 0x41f6 - 3f3c: 88 23 and r24, r24 + 3f54: 88 23 and r24, r24 + 3f56: 09 f0 breq .+2 ; 0x3f5a + 3f58: 74 c0 rjmp .+232 ; 0x4042 + 3f5a: 5d d1 rcall .+698 ; 0x4216 + 3f5c: 88 23 and r24, r24 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - 3f3e: 09 f0 breq .+2 ; 0x3f42 - 3f40: 53 c0 rjmp .+166 ; 0x3fe8 - 3f42: 71 d1 rcall .+738 ; 0x4226 - 3f44: 88 23 and r24, r24 - 3f46: 69 f3 breq .-38 ; 0x3f22 + 3f5e: 09 f0 breq .+2 ; 0x3f62 + 3f60: 53 c0 rjmp .+166 ; 0x4008 + 3f62: 71 d1 rcall .+738 ; 0x4246 + 3f64: 88 23 and r24, r24 + 3f66: 69 f3 breq .-38 ; 0x3f42 break; if (Endpoint_IsINReady()) - 3f48: 80 91 31 23 lds r24, 0x2331 - 3f4c: 87 fd sbrc r24, 7 - 3f4e: 60 c0 rjmp .+192 ; 0x4010 + 3f68: 80 91 31 23 lds r24, 0x2331 + 3f6c: 87 fd sbrc r24, 7 + 3f6e: 60 c0 rjmp .+192 ; 0x4030 * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 3f50: 80 91 2d 23 lds r24, 0x232D - 3f54: 90 91 2e 23 lds r25, 0x232E + 3f70: 80 91 2d 23 lds r24, 0x232D + 3f74: 90 91 2e 23 lds r25, 0x232E return USB_Endpoint_SelectedFIFO->Position; else return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 3f58: fc 01 movw r30, r24 - 3f5a: e0 5c subi r30, 0xC0 ; 192 - 3f5c: ff 4f sbci r31, 0xFF ; 255 - 3f5e: c0 80 ld r12, Z - 3f60: 8f 5b subi r24, 0xBF ; 191 - 3f62: 9f 4f sbci r25, 0xFF ; 255 - 3f64: fc 01 movw r30, r24 - 3f66: 80 81 ld r24, Z - 3f68: dd 24 eor r13, r13 - 3f6a: c8 1a sub r12, r24 - 3f6c: d1 08 sbc r13, r1 - 3f6e: 01 15 cp r16, r1 - 3f70: 11 05 cpc r17, r1 - 3f72: b9 f0 breq .+46 ; 0x3fa2 - 3f74: 88 e0 ldi r24, 0x08 ; 8 + 3f78: fc 01 movw r30, r24 + 3f7a: e0 5c subi r30, 0xC0 ; 192 + 3f7c: ff 4f sbci r31, 0xFF ; 255 + 3f7e: c0 80 ld r12, Z + 3f80: 8f 5b subi r24, 0xBF ; 191 + 3f82: 9f 4f sbci r25, 0xFF ; 255 + 3f84: fc 01 movw r30, r24 + 3f86: 80 81 ld r24, Z + 3f88: dd 24 eor r13, r13 + 3f8a: c8 1a sub r12, r24 + 3f8c: d1 08 sbc r13, r1 + 3f8e: 01 15 cp r16, r1 + 3f90: 11 05 cpc r17, r1 + 3f92: b9 f0 breq .+46 ; 0x3fc2 + 3f94: 88 e0 ldi r24, 0x08 ; 8 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3f76: c8 16 cp r12, r24 - 3f78: d1 04 cpc r13, r1 - 3f7a: 28 f0 brcs .+10 ; 0x3f86 - 3f7c: 12 c0 rjmp .+36 ; 0x3fa2 - 3f7e: f8 e0 ldi r31, 0x08 ; 8 - 3f80: cf 16 cp r12, r31 - 3f82: d1 04 cpc r13, r1 - 3f84: 71 f0 breq .+28 ; 0x3fa2 - 3f86: f7 01 movw r30, r14 - 3f88: 84 91 lpm r24, Z - 3f8a: 8a d0 rcall .+276 ; 0x40a0 - 3f8c: 08 94 sec + 3f96: c8 16 cp r12, r24 + 3f98: d1 04 cpc r13, r1 + 3f9a: 28 f0 brcs .+10 ; 0x3fa6 + 3f9c: 12 c0 rjmp .+36 ; 0x3fc2 + 3f9e: f8 e0 ldi r31, 0x08 ; 8 + 3fa0: cf 16 cp r12, r31 + 3fa2: d1 04 cpc r13, r1 + 3fa4: 71 f0 breq .+28 ; 0x3fc2 + 3fa6: f7 01 movw r30, r14 + 3fa8: 84 91 lpm r24, Z + 3faa: 8a d0 rcall .+276 ; 0x40c0 + 3fac: 08 94 sec { TEMPLATE_TRANSFER_BYTE(DataStream); - 3f8e: e1 1c adc r14, r1 - 3f90: f1 1c adc r15, r1 - 3f92: 01 50 subi r16, 0x01 ; 1 - 3f94: 10 40 sbci r17, 0x00 ; 0 + 3fae: e1 1c adc r14, r1 + 3fb0: f1 1c adc r15, r1 + 3fb2: 01 50 subi r16, 0x01 ; 1 + 3fb4: 10 40 sbci r17, 0x00 ; 0 TEMPLATE_BUFFER_MOVE(DataStream, 1); - 3f96: 08 94 sec - 3f98: c1 1c adc r12, r1 - 3f9a: d1 1c adc r13, r1 + 3fb6: 08 94 sec + 3fb8: c1 1c adc r12, r1 + 3fba: d1 1c adc r13, r1 Length--; - 3f9c: 01 15 cp r16, r1 - 3f9e: 11 05 cpc r17, r1 + 3fbc: 01 15 cp r16, r1 + 3fbe: 11 05 cpc r17, r1 BytesInEndpoint++; - 3fa0: 71 f7 brne .-36 ; 0x3f7e - 3fa2: 81 e0 ldi r24, 0x01 ; 1 - 3fa4: 98 e0 ldi r25, 0x08 ; 8 + 3fc0: 71 f7 brne .-36 ; 0x3f9e + 3fc2: 81 e0 ldi r24, 0x01 ; 1 + 3fc4: 98 e0 ldi r25, 0x08 ; 8 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - 3fa6: c9 16 cp r12, r25 - 3fa8: d1 04 cpc r13, r1 - 3faa: 09 f0 breq .+2 ; 0x3fae + 3fc6: c9 16 cp r12, r25 + 3fc8: d1 04 cpc r13, r1 + 3fca: 09 f0 breq .+2 ; 0x3fce TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - 3fac: 80 e0 ldi r24, 0x00 ; 0 - 3fae: 89 83 std Y+1, r24 ; 0x01 - 3fb0: 40 d0 rcall .+128 ; 0x4032 - 3fb2: 89 81 ldd r24, Y+1 ; 0x01 - 3fb4: 01 15 cp r16, r1 - 3fb6: 11 05 cpc r17, r1 + 3fcc: 80 e0 ldi r24, 0x00 ; 0 + 3fce: 89 83 std Y+1, r24 ; 0x01 + 3fd0: 40 d0 rcall .+128 ; 0x4052 + 3fd2: 89 81 ldd r24, Y+1 ; 0x01 + 3fd4: 01 15 cp r16, r1 + 3fd6: 11 05 cpc r17, r1 Endpoint_ClearIN(); - 3fb8: 09 f4 brne .+2 ; 0x3fbc - 3fba: b0 cf rjmp .-160 ; 0x3f1c - 3fbc: 80 91 24 23 lds r24, 0x2324 - 3fc0: 88 23 and r24, r24 - 3fc2: 81 f0 breq .+32 ; 0x3fe4 - 3fc4: 85 30 cpi r24, 0x05 ; 5 - 3fc6: c9 f0 breq .+50 ; 0x3ffa + 3fd8: 09 f4 brne .+2 ; 0x3fdc + 3fda: b0 cf rjmp .-160 ; 0x3f3c + 3fdc: 80 91 24 23 lds r24, 0x2324 + 3fe0: 88 23 and r24, r24 + 3fe2: 81 f0 breq .+32 ; 0x4004 + 3fe4: 85 30 cpi r24, 0x05 ; 5 + 3fe6: c9 f0 breq .+50 ; 0x401a else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3fc8: fe d0 rcall .+508 ; 0x41c6 - 3fca: 88 23 and r24, r24 + 3fe8: fe d0 rcall .+508 ; 0x41e6 + 3fea: 88 23 and r24, r24 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3fcc: 51 f5 brne .+84 ; 0x4022 - 3fce: 13 d1 rcall .+550 ; 0x41f6 + 3fec: 51 f5 brne .+84 ; 0x4042 + 3fee: 13 d1 rcall .+550 ; 0x4216 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 3fd0: 88 23 and r24, r24 - 3fd2: 51 f4 brne .+20 ; 0x3fe8 + 3ff0: 88 23 and r24, r24 + 3ff2: 51 f4 brne .+20 ; 0x4008 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - 3fd4: 28 d1 rcall .+592 ; 0x4226 - 3fd6: 88 23 and r24, r24 - 3fd8: 09 f0 breq .+2 ; 0x3fdc - 3fda: b6 cf rjmp .-148 ; 0x3f48 + 3ff4: 28 d1 rcall .+592 ; 0x4246 + 3ff6: 88 23 and r24, r24 + 3ff8: 09 f0 breq .+2 ; 0x3ffc + 3ffa: b6 cf rjmp .-148 ; 0x3f68 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - 3fdc: 80 91 24 23 lds r24, 0x2324 - 3fe0: 88 23 and r24, r24 - 3fe2: 81 f7 brne .-32 ; 0x3fc4 + 3ffc: 80 91 24 23 lds r24, 0x2324 + 4000: 88 23 and r24, r24 + 4002: 81 f7 brne .-32 ; 0x3fe4 break; if (Endpoint_IsINReady()) - 3fe4: 82 e0 ldi r24, 0x02 ; 2 - 3fe6: 0a c0 rjmp .+20 ; 0x3ffc - 3fe8: 06 d1 rcall .+524 ; 0x41f6 - 3fea: 88 23 and r24, r24 - 3fec: 01 f5 brne .+64 ; 0x402e + 4004: 82 e0 ldi r24, 0x02 ; 2 + 4006: 0a c0 rjmp .+20 ; 0x401c + 4008: 06 d1 rcall .+524 ; 0x4216 + 400a: 88 23 and r24, r24 + 400c: 01 f5 brne .+64 ; 0x404e else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 3fee: 80 91 24 23 lds r24, 0x2324 + 400e: 80 91 24 23 lds r24, 0x2324 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 3ff2: 88 23 and r24, r24 - 3ff4: b9 f3 breq .-18 ; 0x3fe4 + 4012: 88 23 and r24, r24 + 4014: b9 f3 breq .-18 ; 0x4004 while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - 3ff6: 85 30 cpi r24, 0x05 ; 5 - 3ff8: b9 f7 brne .-18 ; 0x3fe8 + 4016: 85 30 cpi r24, 0x05 ; 5 + 4018: b9 f7 brne .-18 ; 0x4008 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - 3ffa: 83 e0 ldi r24, 0x03 ; 3 - 3ffc: 0f 90 pop r0 - 3ffe: df 91 pop r29 - 4000: cf 91 pop r28 + 401a: 83 e0 ldi r24, 0x03 ; 3 + 401c: 0f 90 pop r0 + 401e: df 91 pop r29 + 4020: cf 91 pop r28 { uint8_t USB_DeviceState_LCL = USB_DeviceState; - 4002: 1f 91 pop r17 - 4004: 0f 91 pop r16 + 4022: 1f 91 pop r17 + 4024: 0f 91 pop r16 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 4006: ff 90 pop r15 - 4008: ef 90 pop r14 + 4026: ff 90 pop r15 + 4028: ef 90 pop r14 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 400a: df 90 pop r13 - 400c: cf 90 pop r12 + 402a: df 90 pop r13 + 402c: cf 90 pop r12 return ENDPOINT_RWCSTREAM_BusSuspended; - 400e: 08 95 ret + 402e: 08 95 ret } return ENDPOINT_RWCSTREAM_NoError; } - 4010: e0 91 2d 23 lds r30, 0x232D - 4014: f0 91 2e 23 lds r31, 0x232E - 4018: ef 5b subi r30, 0xBF ; 191 - 401a: ff 4f sbci r31, 0xFF ; 255 - 401c: c0 80 ld r12, Z - 401e: dd 24 eor r13, r13 - 4020: a6 cf rjmp .-180 ; 0x3f6e - 4022: 81 e0 ldi r24, 0x01 ; 1 + 4030: e0 91 2d 23 lds r30, 0x232D + 4034: f0 91 2e 23 lds r31, 0x232E + 4038: ef 5b subi r30, 0xBF ; 191 + 403a: ff 4f sbci r31, 0xFF ; 255 + 403c: c0 80 ld r12, Z + 403e: dd 24 eor r13, r13 + 4040: a6 cf rjmp .-180 ; 0x3f8e + 4042: 81 e0 ldi r24, 0x01 ; 1 */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) return USB_Endpoint_SelectedFIFO->Position; - 4024: eb cf rjmp .-42 ; 0x3ffc - 4026: 05 d0 rcall .+10 ; 0x4032 - 4028: 00 e0 ldi r16, 0x00 ; 0 - 402a: 10 e0 ldi r17, 0x00 ; 0 - 402c: 70 cf rjmp .-288 ; 0x3f0e - 402e: 80 e0 ldi r24, 0x00 ; 0 - 4030: e5 cf rjmp .-54 ; 0x3ffc + 4044: eb cf rjmp .-42 ; 0x401c + 4046: 05 d0 rcall .+10 ; 0x4052 + 4048: 00 e0 ldi r16, 0x00 ; 0 + 404a: 10 e0 ldi r17, 0x00 ; 0 + 404c: 70 cf rjmp .-288 ; 0x3f2e + 404e: 80 e0 ldi r24, 0x00 ; 0 + 4050: e5 cf rjmp .-54 ; 0x401c -00004032 : +00004052 : USB_Endpoint_SelectedFIFO->Position = 0; } void Endpoint_ClearIN(void) { USB_Endpoint_SelectedHandle->CNT = USB_Endpoint_SelectedFIFO->Position; - 4032: e0 91 2f 23 lds r30, 0x232F - 4036: f0 91 30 23 lds r31, 0x2330 - 403a: a0 91 2d 23 lds r26, 0x232D - 403e: b0 91 2e 23 lds r27, 0x232E - 4042: af 5b subi r26, 0xBF ; 191 - 4044: bf 4f sbci r27, 0xFF ; 255 - 4046: 8c 91 ld r24, X - 4048: 90 e0 ldi r25, 0x00 ; 0 - 404a: 82 83 std Z+2, r24 ; 0x02 - 404c: 93 83 std Z+3, r25 ; 0x03 + 4052: e0 91 2f 23 lds r30, 0x232F + 4056: f0 91 30 23 lds r31, 0x2330 + 405a: a0 91 2d 23 lds r26, 0x232D + 405e: b0 91 2e 23 lds r27, 0x232E + 4062: af 5b subi r26, 0xBF ; 191 + 4064: bf 4f sbci r27, 0xFF ; 255 + 4066: 8c 91 ld r24, X + 4068: 90 e0 ldi r25, 0x00 ; 0 + 406a: 82 83 std Z+2, r24 ; 0x02 + 406c: 93 83 std Z+3, r25 ; 0x03 USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 404e: 80 81 ld r24, Z - 4050: 8d 79 andi r24, 0x9D ; 157 - 4052: 80 83 st Z, r24 + 406e: 80 81 ld r24, Z + 4070: 8d 79 andi r24, 0x9D ; 157 + 4072: 80 83 st Z, r24 USB_Endpoint_SelectedFIFO->Position = 0; - 4054: e0 91 2d 23 lds r30, 0x232D - 4058: f0 91 2e 23 lds r31, 0x232E - 405c: ef 5b subi r30, 0xBF ; 191 - 405e: ff 4f sbci r31, 0xFF ; 255 - 4060: 10 82 st Z, r1 + 4074: e0 91 2d 23 lds r30, 0x232D + 4078: f0 91 2e 23 lds r31, 0x232E + 407c: ef 5b subi r30, 0xBF ; 191 + 407e: ff 4f sbci r31, 0xFF ; 255 + 4080: 10 82 st Z, r1 } - 4062: 08 95 ret + 4082: 08 95 ret -00004064 : +00004084 : void Endpoint_ClearOUT(void) { USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 4064: e0 91 2f 23 lds r30, 0x232F - 4068: f0 91 30 23 lds r31, 0x2330 - 406c: 80 81 ld r24, Z - 406e: 8d 79 andi r24, 0x9D ; 157 - 4070: 80 83 st Z, r24 + 4084: e0 91 2f 23 lds r30, 0x232F + 4088: f0 91 30 23 lds r31, 0x2330 + 408c: 80 81 ld r24, Z + 408e: 8d 79 andi r24, 0x9D ; 157 + 4090: 80 83 st Z, r24 USB_Endpoint_SelectedFIFO->Position = 0; - 4072: e0 91 2d 23 lds r30, 0x232D - 4076: f0 91 2e 23 lds r31, 0x232E - 407a: ef 5b subi r30, 0xBF ; 191 - 407c: ff 4f sbci r31, 0xFF ; 255 - 407e: 10 82 st Z, r1 + 4092: e0 91 2d 23 lds r30, 0x232D + 4096: f0 91 2e 23 lds r31, 0x232E + 409a: ef 5b subi r30, 0xBF ; 191 + 409c: ff 4f sbci r31, 0xFF ; 255 + 409e: 10 82 st Z, r1 } - 4080: 08 95 ret + 40a0: 08 95 ret -00004082 : +000040a2 : } } uint8_t Endpoint_Read_8(void) { return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; - 4082: 80 91 2d 23 lds r24, 0x232D - 4086: 90 91 2e 23 lds r25, 0x232E - 408a: fc 01 movw r30, r24 - 408c: ef 5b subi r30, 0xBF ; 191 - 408e: ff 4f sbci r31, 0xFF ; 255 - 4090: 20 81 ld r18, Z - 4092: 82 0f add r24, r18 - 4094: 91 1d adc r25, r1 - 4096: dc 01 movw r26, r24 - 4098: 8c 91 ld r24, X - 409a: 2f 5f subi r18, 0xFF ; 255 - 409c: 20 83 st Z, r18 + 40a2: 80 91 2d 23 lds r24, 0x232D + 40a6: 90 91 2e 23 lds r25, 0x232E + 40aa: fc 01 movw r30, r24 + 40ac: ef 5b subi r30, 0xBF ; 191 + 40ae: ff 4f sbci r31, 0xFF ; 255 + 40b0: 20 81 ld r18, Z + 40b2: 82 0f add r24, r18 + 40b4: 91 1d adc r25, r1 + 40b6: dc 01 movw r26, r24 + 40b8: 8c 91 ld r24, X + 40ba: 2f 5f subi r18, 0xFF ; 255 + 40bc: 20 83 st Z, r18 } - 409e: 08 95 ret + 40be: 08 95 ret -000040a0 : +000040c0 : void Endpoint_Write_8(const uint8_t Data) { USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; - 40a0: 20 91 2d 23 lds r18, 0x232D - 40a4: 30 91 2e 23 lds r19, 0x232E - 40a8: f9 01 movw r30, r18 - 40aa: ef 5b subi r30, 0xBF ; 191 - 40ac: ff 4f sbci r31, 0xFF ; 255 - 40ae: 90 81 ld r25, Z - 40b0: 29 0f add r18, r25 - 40b2: 31 1d adc r19, r1 - 40b4: d9 01 movw r26, r18 - 40b6: 8c 93 st X, r24 - 40b8: 9f 5f subi r25, 0xFF ; 255 - 40ba: 90 83 st Z, r25 + 40c0: 20 91 2d 23 lds r18, 0x232D + 40c4: 30 91 2e 23 lds r19, 0x232E + 40c8: f9 01 movw r30, r18 + 40ca: ef 5b subi r30, 0xBF ; 191 + 40cc: ff 4f sbci r31, 0xFF ; 255 + 40ce: 90 81 ld r25, Z + 40d0: 29 0f add r18, r25 + 40d2: 31 1d adc r19, r1 + 40d4: d9 01 movw r26, r18 + 40d6: 8c 93 st X, r24 + 40d8: 9f 5f subi r25, 0xFF ; 255 + 40da: 90 83 st Z, r25 } - 40bc: 08 95 ret + 40dc: 08 95 ret -000040be : +000040de : void Endpoint_SelectEndpoint(const uint8_t Address) { uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); - 40be: 28 2f mov r18, r24 - 40c0: 2f 70 andi r18, 0x0F ; 15 + 40de: 28 2f mov r18, r24 + 40e0: 2f 70 andi r18, 0x0F ; 15 USB_Endpoint_SelectedEndpoint = Address; - 40c2: 80 93 31 23 sts 0x2331, r24 + 40e2: 80 93 31 23 sts 0x2331, r24 Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; - 40c6: 30 e0 ldi r19, 0x00 ; 0 - 40c8: 64 e8 ldi r22, 0x84 ; 132 - 40ca: 70 e0 ldi r23, 0x00 ; 0 - 40cc: 26 9f mul r18, r22 - 40ce: a0 01 movw r20, r0 - 40d0: 27 9f mul r18, r23 - 40d2: 50 0d add r21, r0 - 40d4: 36 9f mul r19, r22 - 40d6: 50 0d add r21, r0 - 40d8: 11 24 eor r1, r1 - 40da: 4e 5c subi r20, 0xCE ; 206 - 40dc: 5c 4d sbci r21, 0xDC ; 220 + 40e6: 30 e0 ldi r19, 0x00 ; 0 + 40e8: 64 e8 ldi r22, 0x84 ; 132 + 40ea: 70 e0 ldi r23, 0x00 ; 0 + 40ec: 26 9f mul r18, r22 + 40ee: a0 01 movw r20, r0 + 40f0: 27 9f mul r18, r23 + 40f2: 50 0d add r21, r0 + 40f4: 36 9f mul r19, r22 + 40f6: 50 0d add r21, r0 + 40f8: 11 24 eor r1, r1 + 40fa: 4e 5c subi r20, 0xCE ; 206 + 40fc: 5c 4d sbci r21, 0xDC ; 220 USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; - 40de: 60 91 c6 04 lds r22, 0x04C6 - 40e2: 70 91 c7 04 lds r23, 0x04C7 + 40fe: 60 91 c6 04 lds r22, 0x04C6 + 4102: 70 91 c7 04 lds r23, 0x04C7 if (Address & ENDPOINT_DIR_IN) - 40e6: 87 fd sbrc r24, 7 - 40e8: 11 c0 rjmp .+34 ; 0x410c + 4106: 87 fd sbrc r24, 7 + 4108: 11 c0 rjmp .+34 ; 0x412c USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; } else { USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->OUT; - 40ea: 40 93 2d 23 sts 0x232D, r20 - 40ee: 50 93 2e 23 sts 0x232E, r21 + 410a: 40 93 2d 23 sts 0x232D, r20 + 410e: 50 93 2e 23 sts 0x232E, r21 USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; - 40f2: 22 95 swap r18 - 40f4: 32 95 swap r19 - 40f6: 30 7f andi r19, 0xF0 ; 240 - 40f8: 32 27 eor r19, r18 - 40fa: 20 7f andi r18, 0xF0 ; 240 - 40fc: 32 27 eor r19, r18 - 40fe: 26 0f add r18, r22 - 4100: 37 1f adc r19, r23 - 4102: 20 93 2f 23 sts 0x232F, r18 - 4106: 30 93 30 23 sts 0x2330, r19 - 410a: 08 95 ret + 4112: 22 95 swap r18 + 4114: 32 95 swap r19 + 4116: 30 7f andi r19, 0xF0 ; 240 + 4118: 32 27 eor r19, r18 + 411a: 20 7f andi r18, 0xF0 ; 240 + 411c: 32 27 eor r19, r18 + 411e: 26 0f add r18, r22 + 4120: 37 1f adc r19, r23 + 4122: 20 93 2f 23 sts 0x232F, r18 + 4126: 30 93 30 23 sts 0x2330, r19 + 412a: 08 95 ret Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; USB_EndpointTable_t* EndpointTable = (USB_EndpointTable_t*)USB.EPPTR; if (Address & ENDPOINT_DIR_IN) { USB_Endpoint_SelectedFIFO = &EndpointFIFOPair->IN; - 410c: 4e 5b subi r20, 0xBE ; 190 - 410e: 5f 4f sbci r21, 0xFF ; 255 - 4110: 40 93 2d 23 sts 0x232D, r20 - 4114: 50 93 2e 23 sts 0x232E, r21 + 412c: 4e 5b subi r20, 0xBE ; 190 + 412e: 5f 4f sbci r21, 0xFF ; 255 + 4130: 40 93 2d 23 sts 0x232D, r20 + 4134: 50 93 2e 23 sts 0x232E, r21 USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; - 4118: 22 95 swap r18 - 411a: 32 95 swap r19 - 411c: 30 7f andi r19, 0xF0 ; 240 - 411e: 32 27 eor r19, r18 - 4120: 20 7f andi r18, 0xF0 ; 240 - 4122: 32 27 eor r19, r18 - 4124: 28 5f subi r18, 0xF8 ; 248 - 4126: 3f 4f sbci r19, 0xFF ; 255 - 4128: 26 0f add r18, r22 - 412a: 37 1f adc r19, r23 - 412c: 20 93 2f 23 sts 0x232F, r18 - 4130: 30 93 30 23 sts 0x2330, r19 - 4134: 08 95 ret + 4138: 22 95 swap r18 + 413a: 32 95 swap r19 + 413c: 30 7f andi r19, 0xF0 ; 240 + 413e: 32 27 eor r19, r18 + 4140: 20 7f andi r18, 0xF0 ; 240 + 4142: 32 27 eor r19, r18 + 4144: 28 5f subi r18, 0xF8 ; 248 + 4146: 3f 4f sbci r19, 0xFF ; 255 + 4148: 26 0f add r18, r22 + 414a: 37 1f adc r19, r23 + 414c: 20 93 2f 23 sts 0x232F, r18 + 4150: 30 93 30 23 sts 0x2330, r19 + 4154: 08 95 ret -00004136 : +00004156 : USB_Endpoint_SelectedFIFO->Position = 0; } void Endpoint_StallTransaction(void) { USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 4136: e0 91 2f 23 lds r30, 0x232F - 413a: f0 91 30 23 lds r31, 0x2330 - 413e: 81 81 ldd r24, Z+1 ; 0x01 - 4140: 84 60 ori r24, 0x04 ; 4 - 4142: 81 83 std Z+1, r24 ; 0x01 + 4156: e0 91 2f 23 lds r30, 0x232F + 415a: f0 91 30 23 lds r31, 0x2330 + 415e: 81 81 ldd r24, Z+1 ; 0x01 + 4160: 84 60 ori r24, 0x04 ; 4 + 4162: 81 83 std Z+1, r24 ; 0x01 if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) - 4144: e0 91 2f 23 lds r30, 0x232F - 4148: f0 91 30 23 lds r31, 0x2330 - 414c: 81 81 ldd r24, Z+1 ; 0x01 - 414e: 80 7c andi r24, 0xC0 ; 192 - 4150: 80 34 cpi r24, 0x40 ; 64 - 4152: 09 f0 breq .+2 ; 0x4156 - 4154: 08 95 ret + 4164: e0 91 2f 23 lds r30, 0x232F + 4168: f0 91 30 23 lds r31, 0x2330 + 416c: 81 81 ldd r24, Z+1 ; 0x01 + 416e: 80 7c andi r24, 0xC0 ; 192 + 4170: 80 34 cpi r24, 0x40 ; 64 + 4172: 09 f0 breq .+2 ; 0x4176 + 4174: 08 95 ret { Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); - 4156: 80 91 31 23 lds r24, 0x2331 - 415a: 80 58 subi r24, 0x80 ; 128 - 415c: b0 df rcall .-160 ; 0x40be - 415e: e0 91 2f 23 lds r30, 0x232F + 4176: 80 91 31 23 lds r24, 0x2331 + 417a: 80 58 subi r24, 0x80 ; 128 + 417c: b0 df rcall .-160 ; 0x40de + 417e: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; - 4162: f0 91 30 23 lds r31, 0x2330 - 4166: 81 81 ldd r24, Z+1 ; 0x01 - 4168: 84 60 ori r24, 0x04 ; 4 - 416a: 81 83 std Z+1, r24 ; 0x01 - 416c: 08 95 ret + 4182: f0 91 30 23 lds r31, 0x2330 + 4186: 81 81 ldd r24, Z+1 ; 0x01 + 4188: 84 60 ori r24, 0x04 ; 4 + 418a: 81 83 std Z+1, r24 ; 0x01 + 418c: 08 95 ret -0000416e : - 416e: 80 91 31 23 lds r24, 0x2331 +0000418e : + 418e: 80 91 31 23 lds r24, 0x2331 return false; } void Endpoint_ClearSETUP(void) { Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 4172: 8f 77 andi r24, 0x7F ; 127 - 4174: a4 df rcall .-184 ; 0x40be - 4176: e0 91 2f 23 lds r30, 0x232F + 4192: 8f 77 andi r24, 0x7F ; 127 + 4194: a4 df rcall .-184 ; 0x40de + 4196: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); - 417a: f0 91 30 23 lds r31, 0x2330 - 417e: 80 81 ld r24, Z - 4180: 8d 78 andi r24, 0x8D ; 141 - 4182: 80 83 st Z, r24 - 4184: e0 91 2f 23 lds r30, 0x232F + 419a: f0 91 30 23 lds r31, 0x2330 + 419e: 80 81 ld r24, Z + 41a0: 8d 78 andi r24, 0x8D ; 141 + 41a2: 80 83 st Z, r24 + 41a4: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 4188: f0 91 30 23 lds r31, 0x2330 - 418c: 80 81 ld r24, Z - 418e: 81 60 ori r24, 0x01 ; 1 - 4190: 80 83 st Z, r24 - 4192: e0 91 2d 23 lds r30, 0x232D + 41a8: f0 91 30 23 lds r31, 0x2330 + 41ac: 80 81 ld r24, Z + 41ae: 81 60 ori r24, 0x01 ; 1 + 41b0: 80 83 st Z, r24 + 41b2: e0 91 2d 23 lds r30, 0x232D USB_Endpoint_SelectedFIFO->Position = 0; - 4196: f0 91 2e 23 lds r31, 0x232E - 419a: ef 5b subi r30, 0xBF ; 191 - 419c: ff 4f sbci r31, 0xFF ; 255 - 419e: 10 82 st Z, r1 - 41a0: 80 91 31 23 lds r24, 0x2331 + 41b6: f0 91 2e 23 lds r31, 0x232E + 41ba: ef 5b subi r30, 0xBF ; 191 + 41bc: ff 4f sbci r31, 0xFF ; 255 + 41be: 10 82 st Z, r1 + 41c0: 80 91 31 23 lds r24, 0x2331 Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 41a4: 80 68 ori r24, 0x80 ; 128 - 41a6: 8b df rcall .-234 ; 0x40be - 41a8: e0 91 2f 23 lds r30, 0x232F + 41c4: 80 68 ori r24, 0x80 ; 128 + 41c6: 8b df rcall .-234 ; 0x40de + 41c8: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; - 41ac: f0 91 30 23 lds r31, 0x2330 - 41b0: 80 81 ld r24, Z - 41b2: 81 60 ori r24, 0x01 ; 1 - 41b4: 80 83 st Z, r24 - 41b6: e0 91 2d 23 lds r30, 0x232D + 41cc: f0 91 30 23 lds r31, 0x2330 + 41d0: 80 81 ld r24, Z + 41d2: 81 60 ori r24, 0x01 ; 1 + 41d4: 80 83 st Z, r24 + 41d6: e0 91 2d 23 lds r30, 0x232D USB_Endpoint_SelectedFIFO->Position = 0; - 41ba: f0 91 2e 23 lds r31, 0x232E - 41be: ef 5b subi r30, 0xBF ; 191 - 41c0: ff 4f sbci r31, 0xFF ; 255 - 41c2: 10 82 st Z, r1 - 41c4: 08 95 ret + 41da: f0 91 2e 23 lds r31, 0x232E + 41de: ef 5b subi r30, 0xBF ; 191 + 41e0: ff 4f sbci r31, 0xFF ; 255 + 41e2: 10 82 st Z, r1 + 41e4: 08 95 ret -000041c6 : - 41c6: 80 91 31 23 lds r24, 0x2331 +000041e6 : + 41e6: 80 91 31 23 lds r24, 0x2331 return false; } bool Endpoint_IsSETUPReceived(void) { Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 41ca: 8f 77 andi r24, 0x7F ; 127 - 41cc: 78 df rcall .-272 ; 0x40be - 41ce: e0 91 2f 23 lds r30, 0x232F + 41ea: 8f 77 andi r24, 0x7F ; 127 + 41ec: 78 df rcall .-272 ; 0x40de + 41ee: e0 91 2f 23 lds r30, 0x232F if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) - 41d2: f0 91 30 23 lds r31, 0x2330 - 41d6: 80 81 ld r24, Z - 41d8: 84 ff sbrs r24, 4 - 41da: 0b c0 rjmp .+22 ; 0x41f2 - 41dc: a0 91 2d 23 lds r26, 0x232D + 41f2: f0 91 30 23 lds r31, 0x2330 + 41f6: 80 81 ld r24, Z + 41f8: 84 ff sbrs r24, 4 + 41fa: 0b c0 rjmp .+22 ; 0x4212 + 41fc: a0 91 2d 23 lds r26, 0x232D { USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 41e0: b0 91 2e 23 lds r27, 0x232E - 41e4: 82 81 ldd r24, Z+2 ; 0x02 - 41e6: 93 81 ldd r25, Z+3 ; 0x03 - 41e8: a0 5c subi r26, 0xC0 ; 192 - 41ea: bf 4f sbci r27, 0xFF ; 255 - 41ec: 8c 93 st X, r24 - 41ee: 81 e0 ldi r24, 0x01 ; 1 + 4200: b0 91 2e 23 lds r27, 0x232E + 4204: 82 81 ldd r24, Z+2 ; 0x02 + 4206: 93 81 ldd r25, Z+3 ; 0x03 + 4208: a0 5c subi r26, 0xC0 ; 192 + 420a: bf 4f sbci r27, 0xFF ; 255 + 420c: 8c 93 st X, r24 + 420e: 81 e0 ldi r24, 0x01 ; 1 return true; - 41f0: 08 95 ret - 41f2: 80 e0 ldi r24, 0x00 ; 0 + 4210: 08 95 ret + 4212: 80 e0 ldi r24, 0x00 ; 0 } return false; - 41f4: 08 95 ret + 4214: 08 95 ret -000041f6 : +00004216 : } - 41f6: 80 91 31 23 lds r24, 0x2331 + 4216: 80 91 31 23 lds r24, 0x2331 return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); } bool Endpoint_IsOUTReceived(void) { Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); - 41fa: 8f 77 andi r24, 0x7F ; 127 - 41fc: 60 df rcall .-320 ; 0x40be - 41fe: e0 91 2f 23 lds r30, 0x232F + 421a: 8f 77 andi r24, 0x7F ; 127 + 421c: 60 df rcall .-320 ; 0x40de + 421e: e0 91 2f 23 lds r30, 0x232F if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) - 4202: f0 91 30 23 lds r31, 0x2330 - 4206: 80 81 ld r24, Z - 4208: 85 ff sbrs r24, 5 - 420a: 0b c0 rjmp .+22 ; 0x4222 - 420c: a0 91 2d 23 lds r26, 0x232D + 4222: f0 91 30 23 lds r31, 0x2330 + 4226: 80 81 ld r24, Z + 4228: 85 ff sbrs r24, 5 + 422a: 0b c0 rjmp .+22 ; 0x4242 + 422c: a0 91 2d 23 lds r26, 0x232D { USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; - 4210: b0 91 2e 23 lds r27, 0x232E - 4214: 82 81 ldd r24, Z+2 ; 0x02 - 4216: 93 81 ldd r25, Z+3 ; 0x03 - 4218: a0 5c subi r26, 0xC0 ; 192 - 421a: bf 4f sbci r27, 0xFF ; 255 - 421c: 8c 93 st X, r24 - 421e: 81 e0 ldi r24, 0x01 ; 1 + 4230: b0 91 2e 23 lds r27, 0x232E + 4234: 82 81 ldd r24, Z+2 ; 0x02 + 4236: 93 81 ldd r25, Z+3 ; 0x03 + 4238: a0 5c subi r26, 0xC0 ; 192 + 423a: bf 4f sbci r27, 0xFF ; 255 + 423c: 8c 93 st X, r24 + 423e: 81 e0 ldi r24, 0x01 ; 1 return true; - 4220: 08 95 ret - 4222: 80 e0 ldi r24, 0x00 ; 0 + 4240: 08 95 ret + 4242: 80 e0 ldi r24, 0x00 ; 0 } return false; - 4224: 08 95 ret + 4244: 08 95 ret -00004226 : +00004246 : } - 4226: 80 91 31 23 lds r24, 0x2331 + 4246: 80 91 31 23 lds r24, 0x2331 volatile USB_EP_t* USB_Endpoint_SelectedHandle; volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; bool Endpoint_IsINReady(void) { Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); - 422a: 80 68 ori r24, 0x80 ; 128 - 422c: 48 df rcall .-368 ; 0x40be - 422e: e0 91 2f 23 lds r30, 0x232F + 424a: 80 68 ori r24, 0x80 ; 128 + 424c: 48 df rcall .-368 ; 0x40de + 424e: e0 91 2f 23 lds r30, 0x232F return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); - 4232: f0 91 30 23 lds r31, 0x2330 - 4236: 90 81 ld r25, Z - 4238: 81 e0 ldi r24, 0x01 ; 1 - 423a: 91 ff sbrs r25, 1 - 423c: 80 e0 ldi r24, 0x00 ; 0 - 423e: 08 95 ret + 4252: f0 91 30 23 lds r31, 0x2330 + 4256: 90 81 ld r25, Z + 4258: 81 e0 ldi r24, 0x01 ; 1 + 425a: 91 ff sbrs r25, 1 + 425c: 80 e0 ldi r24, 0x00 ; 0 + 425e: 08 95 ret -00004240 : +00004260 : } - 4240: 1f 93 push r17 + 4260: 1f 93 push r17 } bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, const uint8_t Config, const uint8_t Size) { - 4242: cf 93 push r28 - 4244: df 93 push r29 - 4246: 00 d0 rcall .+0 ; 0x4248 - 4248: cd b7 in r28, 0x3d ; 61 - 424a: de b7 in r29, 0x3e ; 62 - 424c: 18 2f mov r17, r24 + 4262: cf 93 push r28 + 4264: df 93 push r29 + 4266: 00 d0 rcall .+0 ; 0x4268 + 4268: cd b7 in r28, 0x3d ; 61 + 426a: de b7 in r29, 0x3e ; 62 + 426c: 18 2f mov r17, r24 Endpoint_SelectEndpoint(Address); - 424e: 4a 83 std Y+2, r20 ; 0x02 - 4250: 69 83 std Y+1, r22 ; 0x01 - 4252: 35 df rcall .-406 ; 0x40be - 4254: e0 91 2f 23 lds r30, 0x232F + 426e: 4a 83 std Y+2, r20 ; 0x02 + 4270: 69 83 std Y+1, r22 ; 0x01 + 4272: 35 df rcall .-406 ; 0x40de + 4274: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->CTRL = 0; - 4258: f0 91 30 23 lds r31, 0x2330 - 425c: 11 82 std Z+1, r1 ; 0x01 - 425e: e0 91 2f 23 lds r30, 0x232F + 4278: f0 91 30 23 lds r31, 0x2330 + 427c: 11 82 std Z+1, r1 ; 0x01 + 427e: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 4262: f0 91 30 23 lds r31, 0x2330 - 4266: 4a 81 ldd r20, Y+2 ; 0x02 - 4268: 69 81 ldd r22, Y+1 ; 0x01 - 426a: 17 fd sbrc r17, 7 - 426c: 22 c0 rjmp .+68 ; 0x42b2 - 426e: 10 82 st Z, r1 - 4270: e0 91 2f 23 lds r30, 0x232F + 4282: f0 91 30 23 lds r31, 0x2330 + 4286: 4a 81 ldd r20, Y+2 ; 0x02 + 4288: 69 81 ldd r22, Y+1 ; 0x01 + 428a: 17 fd sbrc r17, 7 + 428c: 22 c0 rjmp .+68 ; 0x42d2 + 428e: 10 82 st Z, r1 + 4290: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->CTRL = Config; - 4274: f0 91 30 23 lds r31, 0x2330 - 4278: 61 83 std Z+1, r22 ; 0x01 - 427a: e0 91 2f 23 lds r30, 0x232F + 4294: f0 91 30 23 lds r31, 0x2330 + 4298: 61 83 std Z+1, r22 ; 0x01 + 429a: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->CNT = 0; - 427e: f0 91 30 23 lds r31, 0x2330 - 4282: 12 82 std Z+2, r1 ; 0x02 - 4284: 13 82 std Z+3, r1 ; 0x03 - 4286: 80 91 2d 23 lds r24, 0x232D + 429e: f0 91 30 23 lds r31, 0x2330 + 42a2: 12 82 std Z+2, r1 ; 0x02 + 42a4: 13 82 std Z+3, r1 ; 0x03 + 42a6: 80 91 2d 23 lds r24, 0x232D USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 428a: 90 91 2e 23 lds r25, 0x232E - 428e: 84 83 std Z+4, r24 ; 0x04 - 4290: 95 83 std Z+5, r25 ; 0x05 - 4292: 40 e0 ldi r20, 0x00 ; 0 + 42aa: 90 91 2e 23 lds r25, 0x232E + 42ae: 84 83 std Z+4, r24 ; 0x04 + 42b0: 95 83 std Z+5, r25 ; 0x05 + 42b2: 40 e0 ldi r20, 0x00 ; 0 USB_Endpoint_SelectedFIFO->Length = (Address & ENDPOINT_DIR_IN) ? Size : 0; - 4294: fc 01 movw r30, r24 - 4296: e0 5c subi r30, 0xC0 ; 192 - 4298: ff 4f sbci r31, 0xFF ; 255 - 429a: 40 83 st Z, r20 - 429c: 8f 5b subi r24, 0xBF ; 191 + 42b4: fc 01 movw r30, r24 + 42b6: e0 5c subi r30, 0xC0 ; 192 + 42b8: ff 4f sbci r31, 0xFF ; 255 + 42ba: 40 83 st Z, r20 + 42bc: 8f 5b subi r24, 0xBF ; 191 USB_Endpoint_SelectedFIFO->Position = 0; - 429e: 9f 4f sbci r25, 0xFF ; 255 - 42a0: dc 01 movw r26, r24 - 42a2: 1c 92 st X, r1 - 42a4: 81 e0 ldi r24, 0x01 ; 1 + 42be: 9f 4f sbci r25, 0xFF ; 255 + 42c0: dc 01 movw r26, r24 + 42c2: 1c 92 st X, r1 + 42c4: 81 e0 ldi r24, 0x01 ; 1 return true; } - 42a6: 0f 90 pop r0 - 42a8: 0f 90 pop r0 - 42aa: df 91 pop r29 - 42ac: cf 91 pop r28 - 42ae: 1f 91 pop r17 - 42b0: 08 95 ret - 42b2: 82 e0 ldi r24, 0x02 ; 2 + 42c6: 0f 90 pop r0 + 42c8: 0f 90 pop r0 + 42ca: df 91 pop r29 + 42cc: cf 91 pop r28 + 42ce: 1f 91 pop r17 + 42d0: 08 95 ret + 42d2: 82 e0 ldi r24, 0x02 ; 2 const uint8_t Size) { Endpoint_SelectEndpoint(Address); USB_Endpoint_SelectedHandle->CTRL = 0; USB_Endpoint_SelectedHandle->STATUS = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; - 42b4: 80 83 st Z, r24 - 42b6: e0 91 2f 23 lds r30, 0x232F + 42d4: 80 83 st Z, r24 + 42d6: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->CTRL = Config; - 42ba: f0 91 30 23 lds r31, 0x2330 - 42be: 61 83 std Z+1, r22 ; 0x01 - 42c0: e0 91 2f 23 lds r30, 0x232F + 42da: f0 91 30 23 lds r31, 0x2330 + 42de: 61 83 std Z+1, r22 ; 0x01 + 42e0: e0 91 2f 23 lds r30, 0x232F USB_Endpoint_SelectedHandle->CNT = 0; - 42c4: f0 91 30 23 lds r31, 0x2330 - 42c8: 12 82 std Z+2, r1 ; 0x02 - 42ca: 13 82 std Z+3, r1 ; 0x03 - 42cc: 80 91 2d 23 lds r24, 0x232D + 42e4: f0 91 30 23 lds r31, 0x2330 + 42e8: 12 82 std Z+2, r1 ; 0x02 + 42ea: 13 82 std Z+3, r1 ; 0x03 + 42ec: 80 91 2d 23 lds r24, 0x232D USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; - 42d0: 90 91 2e 23 lds r25, 0x232E - 42d4: 84 83 std Z+4, r24 ; 0x04 - 42d6: 95 83 std Z+5, r25 ; 0x05 - 42d8: dd cf rjmp .-70 ; 0x4294 + 42f0: 90 91 2e 23 lds r25, 0x232E + 42f4: 84 83 std Z+4, r24 ; 0x04 + 42f6: 95 83 std Z+5, r25 ; 0x05 + 42f8: dd cf rjmp .-70 ; 0x42b4 -000042da : - 42da: cf 92 push r12 +000042fa : + 42fa: cf 92 push r12 } } bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { - 42dc: df 92 push r13 - 42de: ef 92 push r14 - 42e0: ff 92 push r15 - 42e2: 0f 93 push r16 - 42e4: 1f 93 push r17 - 42e6: cf 93 push r28 - 42e8: df 93 push r29 - 42ea: 0f 92 push r0 - 42ec: cd b7 in r28, 0x3d ; 61 - 42ee: de b7 in r29, 0x3e ; 62 - 42f0: f6 2e mov r15, r22 + 42fc: df 92 push r13 + 42fe: ef 92 push r14 + 4300: ff 92 push r15 + 4302: 0f 93 push r16 + 4304: 1f 93 push r17 + 4306: cf 93 push r28 + 4308: df 93 push r29 + 430a: 0f 92 push r0 + 430c: cd b7 in r28, 0x3d ; 61 + 430e: de b7 in r29, 0x3e ; 62 + 4310: f6 2e mov r15, r22 for (uint8_t i = 0; i < Entries; i++) - 42f2: 66 23 and r22, r22 - 42f4: 09 f4 brne .+2 ; 0x42f8 - 42f6: 41 c0 rjmp .+130 ; 0x437a - 42f8: 6c 01 movw r12, r24 - 42fa: 10 e0 ldi r17, 0x00 ; 0 + 4312: 66 23 and r22, r22 + 4314: 09 f4 brne .+2 ; 0x4318 + 4316: 41 c0 rjmp .+130 ; 0x439a + 4318: 6c 01 movw r12, r24 + 431a: 10 e0 ldi r17, 0x00 ; 0 { if (!(Table[i].Address)) - 42fc: f6 01 movw r30, r12 - 42fe: 00 81 ld r16, Z - 4300: 00 23 and r16, r16 - 4302: 99 f1 breq .+102 ; 0x436a + 431c: f6 01 movw r30, r12 + 431e: 00 81 ld r16, Z + 4320: 00 23 and r16, r16 + 4322: 99 f1 breq .+102 ; 0x438a continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - 4304: 63 81 ldd r22, Z+3 ; 0x03 - 4306: 21 81 ldd r18, Z+1 ; 0x01 - 4308: 32 81 ldd r19, Z+2 ; 0x02 + 4324: 63 81 ldd r22, Z+3 ; 0x03 + 4326: 21 81 ldd r18, Z+1 ; 0x01 + 4328: 32 81 ldd r19, Z+2 ; 0x02 static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, const uint8_t Type, const uint16_t Size, const uint8_t Banks) { uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - 430a: 84 81 ldd r24, Z+4 ; 0x04 - 430c: 82 30 cpi r24, 0x02 ; 2 - 430e: 08 f4 brcc .+2 ; 0x4312 - 4310: 41 c0 rjmp .+130 ; 0x4394 - 4312: 48 e1 ldi r20, 0x18 ; 24 - 4314: 58 e1 ldi r21, 0x18 ; 24 + 432a: 84 81 ldd r24, Z+4 ; 0x04 + 432c: 82 30 cpi r24, 0x02 ; 2 + 432e: 08 f4 brcc .+2 ; 0x4332 + 4330: 41 c0 rjmp .+130 ; 0x43b4 + 4332: 48 e1 ldi r20, 0x18 ; 24 + 4334: 58 e1 ldi r21, 0x18 ; 24 static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; uint16_t CheckBytes = 8; while (CheckBytes < Bytes) - 4316: 29 30 cpi r18, 0x09 ; 9 - 4318: 31 05 cpc r19, r1 - 431a: 50 f0 brcs .+20 ; 0x4330 - 431c: 88 e0 ldi r24, 0x08 ; 8 - 431e: 90 e0 ldi r25, 0x00 ; 0 - 4320: 40 e0 ldi r20, 0x00 ; 0 + 4336: 29 30 cpi r18, 0x09 ; 9 + 4338: 31 05 cpc r19, r1 + 433a: 50 f0 brcs .+20 ; 0x4350 + 433c: 88 e0 ldi r24, 0x08 ; 8 + 433e: 90 e0 ldi r25, 0x00 ; 0 + 4340: 40 e0 ldi r20, 0x00 ; 0 { MaskVal++; - 4322: 4f 5f subi r20, 0xFF ; 255 + 4342: 4f 5f subi r20, 0xFF ; 255 CheckBytes <<= 1; - 4324: 88 0f add r24, r24 - 4326: 99 1f adc r25, r25 + 4344: 88 0f add r24, r24 + 4346: 99 1f adc r25, r25 static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; uint16_t CheckBytes = 8; while (CheckBytes < Bytes) - 4328: 82 17 cp r24, r18 - 432a: 93 07 cpc r25, r19 - 432c: d0 f3 brcs .-12 ; 0x4322 - 432e: 45 2b or r20, r21 + 4348: 82 17 cp r24, r18 + 434a: 93 07 cpc r25, r19 + 434c: d0 f3 brcs .-12 ; 0x4342 + 434e: 45 2b or r20, r21 const uint16_t Size, const uint8_t Banks) { uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) - 4330: 80 2f mov r24, r16 - 4332: 90 e0 ldi r25, 0x00 ; 0 - 4334: 8f 70 andi r24, 0x0F ; 15 - 4336: 90 70 andi r25, 0x00 ; 0 - 4338: 86 30 cpi r24, 0x06 ; 6 - 433a: 91 05 cpc r25, r1 - 433c: 4c f5 brge .+82 ; 0x4390 + 4350: 80 2f mov r24, r16 + 4352: 90 e0 ldi r25, 0x00 ; 0 + 4354: 8f 70 andi r24, 0x0F ; 15 + 4356: 90 70 andi r25, 0x00 ; 0 + 4358: 86 30 cpi r24, 0x06 ; 6 + 435a: 91 05 cpc r25, r1 + 435c: 4c f5 brge .+82 ; 0x43b0 return false; // TODO - Fix once limitations are lifted EPConfigMask &= ~USB_EP_PINGPONG_bm; if (Size > 64) - 433e: 21 34 cpi r18, 0x41 ; 65 - 4340: 31 05 cpc r19, r1 - 4342: 30 f5 brcc .+76 ; 0x4390 + 435e: 21 34 cpi r18, 0x41 ; 65 + 4360: 31 05 cpc r19, r1 + 4362: 30 f5 brcc .+76 ; 0x43b0 if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) return false; // TODO - Fix once limitations are lifted EPConfigMask &= ~USB_EP_PINGPONG_bm; - 4344: 4f 7e andi r20, 0xEF ; 239 + 4364: 4f 7e andi r20, 0xEF ; 239 if (Size > 64) return false; switch (Type) - 4346: 66 23 and r22, r22 - 4348: 41 f5 brne .+80 ; 0x439a + 4366: 66 23 and r22, r22 + 4368: 41 f5 brne .+80 ; 0x43ba { case EP_TYPE_CONTROL: EPConfigMask |= USB_EP_TYPE_CONTROL_gc; - 434a: 94 2f mov r25, r20 - 434c: 90 64 ori r25, 0x40 ; 64 + 436a: 94 2f mov r25, r20 + 436c: 90 64 ori r25, 0x40 ; 64 EPConfigMask |= USB_EP_TYPE_BULK_gc; break; } if (Type == EP_TYPE_CONTROL) Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 434e: e2 2e mov r14, r18 - 4350: 80 2f mov r24, r16 - 4352: 80 58 subi r24, 0x80 ; 128 - 4354: 69 2f mov r22, r25 - 4356: 42 2f mov r20, r18 - 4358: 99 83 std Y+1, r25 ; 0x01 - 435a: 72 df rcall .-284 ; 0x4240 - 435c: 99 81 ldd r25, Y+1 ; 0x01 - 435e: 80 2f mov r24, r16 + 436e: e2 2e mov r14, r18 + 4370: 80 2f mov r24, r16 + 4372: 80 58 subi r24, 0x80 ; 128 + 4374: 69 2f mov r22, r25 + 4376: 42 2f mov r20, r18 + 4378: 99 83 std Y+1, r25 ; 0x01 + 437a: 72 df rcall .-284 ; 0x4260 + 437c: 99 81 ldd r25, Y+1 ; 0x01 + 437e: 80 2f mov r24, r16 return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4360: 69 2f mov r22, r25 - 4362: 4e 2d mov r20, r14 - 4364: 6d df rcall .-294 ; 0x4240 - 4366: 88 23 and r24, r24 - 4368: 99 f0 breq .+38 ; 0x4390 - 436a: 1f 5f subi r17, 0xFF ; 255 - 436c: 85 e0 ldi r24, 0x05 ; 5 + 4380: 69 2f mov r22, r25 + 4382: 4e 2d mov r20, r14 + 4384: 6d df rcall .-294 ; 0x4260 + 4386: 88 23 and r24, r24 + 4388: 99 f0 breq .+38 ; 0x43b0 + 438a: 1f 5f subi r17, 0xFF ; 255 + 438c: 85 e0 ldi r24, 0x05 ; 5 } bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - 436e: 90 e0 ldi r25, 0x00 ; 0 - 4370: c8 0e add r12, r24 - 4372: d9 1e adc r13, r25 - 4374: 1f 15 cp r17, r15 - 4376: 09 f0 breq .+2 ; 0x437a - 4378: c1 cf rjmp .-126 ; 0x42fc - 437a: 81 e0 ldi r24, 0x01 ; 1 - 437c: 0f 90 pop r0 + 438e: 90 e0 ldi r25, 0x00 ; 0 + 4390: c8 0e add r12, r24 + 4392: d9 1e adc r13, r25 + 4394: 1f 15 cp r17, r15 + 4396: 09 f0 breq .+2 ; 0x439a + 4398: c1 cf rjmp .-126 ; 0x431c + 439a: 81 e0 ldi r24, 0x01 ; 1 + 439c: 0f 90 pop r0 { return false; } } return true; - 437e: df 91 pop r29 + 439e: df 91 pop r29 } - 4380: cf 91 pop r28 - 4382: 1f 91 pop r17 - 4384: 0f 91 pop r16 - 4386: ff 90 pop r15 - 4388: ef 90 pop r14 - 438a: df 90 pop r13 - 438c: cf 90 pop r12 - 438e: 08 95 ret - 4390: 80 e0 ldi r24, 0x00 ; 0 - 4392: f4 cf rjmp .-24 ; 0x437c + 43a0: cf 91 pop r28 + 43a2: 1f 91 pop r17 + 43a4: 0f 91 pop r16 + 43a6: ff 90 pop r15 + 43a8: ef 90 pop r14 + 43aa: df 90 pop r13 + 43ac: cf 90 pop r12 + 43ae: 08 95 ret + 43b0: 80 e0 ldi r24, 0x00 ; 0 + 43b2: f4 cf rjmp .-24 ; 0x439c if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) { return false; - 4394: 48 e0 ldi r20, 0x08 ; 8 - 4396: 58 e0 ldi r21, 0x08 ; 8 + 43b4: 48 e0 ldi r20, 0x08 ; 8 + 43b6: 58 e0 ldi r21, 0x08 ; 8 static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, const uint8_t Type, const uint16_t Size, const uint8_t Banks) { uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); - 4398: be cf rjmp .-132 ; 0x4316 - 439a: 61 30 cpi r22, 0x01 ; 1 - 439c: 31 f0 breq .+12 ; 0x43aa + 43b8: be cf rjmp .-132 ; 0x4336 + 43ba: 61 30 cpi r22, 0x01 ; 1 + 43bc: 31 f0 breq .+12 ; 0x43ca // TODO - Fix once limitations are lifted EPConfigMask &= ~USB_EP_PINGPONG_bm; if (Size > 64) return false; switch (Type) - 439e: 94 2f mov r25, r20 - 43a0: 90 68 ori r25, 0x80 ; 128 + 43be: 94 2f mov r25, r20 + 43c0: 90 68 ori r25, 0x80 ; 128 break; case EP_TYPE_ISOCHRONOUS: EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; break; default: EPConfigMask |= USB_EP_TYPE_BULK_gc; - 43a2: 66 23 and r22, r22 - 43a4: a1 f2 breq .-88 ; 0x434e + 43c2: 66 23 and r22, r22 + 43c4: a1 f2 breq .-88 ; 0x436e break; } if (Type == EP_TYPE_CONTROL) - 43a6: e2 2e mov r14, r18 - 43a8: da cf rjmp .-76 ; 0x435e - 43aa: 94 2f mov r25, r20 - 43ac: 90 6c ori r25, 0xC0 ; 192 + 43c6: e2 2e mov r14, r18 + 43c8: da cf rjmp .-76 ; 0x437e + 43ca: 94 2f mov r25, r20 + 43cc: 90 6c ori r25, 0xC0 ; 192 { case EP_TYPE_CONTROL: EPConfigMask |= USB_EP_TYPE_CONTROL_gc; break; case EP_TYPE_ISOCHRONOUS: EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; - 43ae: e2 2e mov r14, r18 - 43b0: d6 cf rjmp .-84 ; 0x435e + 43ce: e2 2e mov r14, r18 + 43d0: d6 cf rjmp .-84 ; 0x437e -000043b2 : - 43b2: e0 ec ldi r30, 0xC0 ; 192 - 43b4: f4 e0 ldi r31, 0x04 ; 4 - -void Endpoint_ClearEndpoints(void) -{ - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - { - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 43b6: a6 81 ldd r26, Z+6 ; 0x06 - 43b8: b7 81 ldd r27, Z+7 ; 0x07 - 43ba: 19 96 adiw r26, 0x09 ; 9 - 43bc: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43be: a6 81 ldd r26, Z+6 ; 0x06 - 43c0: b7 81 ldd r27, Z+7 ; 0x07 - 43c2: 11 96 adiw r26, 0x01 ; 1 - 43c4: 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; - 43c6: a6 81 ldd r26, Z+6 ; 0x06 - 43c8: b7 81 ldd r27, Z+7 ; 0x07 - 43ca: 59 96 adiw r26, 0x19 ; 25 - 43cc: 1c 92 st X, r1 - ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 43ce: a6 81 ldd r26, Z+6 ; 0x06 - 43d0: b7 81 ldd r27, Z+7 ; 0x07 - 43d2: 51 96 adiw r26, 0x11 ; 17 - 43d4: 1c 92 st X, r1 +000043d2 : + 43d2: e0 ec ldi r30, 0xC0 ; 192 + 43d4: f4 e0 ldi r31, 0x04 ; 4 void Endpoint_ClearEndpoints(void) { @@ -14199,12 +14171,12 @@ void Endpoint_ClearEndpoints(void) ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; 43d6: a6 81 ldd r26, Z+6 ; 0x06 43d8: b7 81 ldd r27, Z+7 ; 0x07 - 43da: 99 96 adiw r26, 0x29 ; 41 + 43da: 19 96 adiw r26, 0x09 ; 9 43dc: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; 43de: a6 81 ldd r26, Z+6 ; 0x06 43e0: b7 81 ldd r27, Z+7 ; 0x07 - 43e2: 91 96 adiw r26, 0x21 ; 33 + 43e2: 11 96 adiw r26, 0x01 ; 1 43e4: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) @@ -14214,12 +14186,12 @@ void Endpoint_ClearEndpoints(void) ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; 43e6: a6 81 ldd r26, Z+6 ; 0x06 43e8: b7 81 ldd r27, Z+7 ; 0x07 - 43ea: d9 96 adiw r26, 0x39 ; 57 + 43ea: 59 96 adiw r26, 0x19 ; 25 43ec: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; 43ee: a6 81 ldd r26, Z+6 ; 0x06 43f0: b7 81 ldd r27, Z+7 ; 0x07 - 43f2: d1 96 adiw r26, 0x31 ; 49 + 43f2: 51 96 adiw r26, 0x11 ; 17 43f4: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) @@ -14229,2784 +14201,2814 @@ void Endpoint_ClearEndpoints(void) ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; 43f6: a6 81 ldd r26, Z+6 ; 0x06 43f8: b7 81 ldd r27, Z+7 ; 0x07 - 43fa: a7 5b subi r26, 0xB7 ; 183 - 43fc: bf 4f sbci r27, 0xFF ; 255 - 43fe: 1c 92 st X, r1 + 43fa: 99 96 adiw r26, 0x29 ; 41 + 43fc: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 4400: a6 81 ldd r26, Z+6 ; 0x06 - 4402: b7 81 ldd r27, Z+7 ; 0x07 - 4404: af 5b subi r26, 0xBF ; 191 - 4406: bf 4f sbci r27, 0xFF ; 255 - 4408: 1c 92 st X, r1 + 43fe: a6 81 ldd r26, Z+6 ; 0x06 + 4400: b7 81 ldd r27, Z+7 ; 0x07 + 4402: 91 96 adiw r26, 0x21 ; 33 + 4404: 1c 92 st X, r1 void Endpoint_ClearEndpoints(void) { for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; - 440a: a6 81 ldd r26, Z+6 ; 0x06 - 440c: b7 81 ldd r27, Z+7 ; 0x07 - 440e: a7 5a subi r26, 0xA7 ; 167 - 4410: bf 4f sbci r27, 0xFF ; 255 - 4412: 1c 92 st X, r1 + 4406: a6 81 ldd r26, Z+6 ; 0x06 + 4408: b7 81 ldd r27, Z+7 ; 0x07 + 440a: d9 96 adiw r26, 0x39 ; 57 + 440c: 1c 92 st X, r1 ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; - 4414: 06 80 ldd r0, Z+6 ; 0x06 - 4416: f7 81 ldd r31, Z+7 ; 0x07 - 4418: e0 2d mov r30, r0 - 441a: ef 5a subi r30, 0xAF ; 175 - 441c: ff 4f sbci r31, 0xFF ; 255 - 441e: 10 82 st Z, r1 + 440e: a6 81 ldd r26, Z+6 ; 0x06 + 4410: b7 81 ldd r27, Z+7 ; 0x07 + 4412: d1 96 adiw r26, 0x31 ; 49 + 4414: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 4416: a6 81 ldd r26, Z+6 ; 0x06 + 4418: b7 81 ldd r27, Z+7 ; 0x07 + 441a: a7 5b subi r26, 0xB7 ; 183 + 441c: bf 4f sbci r27, 0xFF ; 255 + 441e: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4420: a6 81 ldd r26, Z+6 ; 0x06 + 4422: b7 81 ldd r27, Z+7 ; 0x07 + 4424: af 5b subi r26, 0xBF ; 191 + 4426: bf 4f sbci r27, 0xFF ; 255 + 4428: 1c 92 st X, r1 + +void Endpoint_ClearEndpoints(void) +{ + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL = 0; + 442a: a6 81 ldd r26, Z+6 ; 0x06 + 442c: b7 81 ldd r27, Z+7 ; 0x07 + 442e: a7 5a subi r26, 0xA7 ; 167 + 4430: bf 4f sbci r27, 0xFF ; 255 + 4432: 1c 92 st X, r1 + ((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; + 4434: 06 80 ldd r0, Z+6 ; 0x06 + 4436: f7 81 ldd r31, Z+7 ; 0x07 + 4438: e0 2d mov r30, r0 + 443a: ef 5a subi r30, 0xAF ; 175 + 443c: ff 4f sbci r31, 0xFF ; 255 + 443e: 10 82 st Z, r1 } } - 4420: 08 95 ret + 4440: 08 95 ret -00004422 : +00004442 : void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - 4422: 80 91 25 23 lds r24, 0x2325 - 4426: 87 fd sbrc r24, 7 - 4428: 08 c0 rjmp .+16 ; 0x443a + 4442: 80 91 25 23 lds r24, 0x2325 + 4446: 87 fd sbrc r24, 7 + 4448: 08 c0 rjmp .+16 ; 0x445a Endpoint_ClearOUT(); } else { while (!(Endpoint_IsINReady())) - 442a: fd de rcall .-518 ; 0x4226 - 442c: 88 23 and r24, r24 - 442e: 69 f4 brne .+26 ; 0x444a - 4430: 80 91 24 23 lds r24, 0x2324 + 444a: fd de rcall .-518 ; 0x4246 + 444c: 88 23 and r24, r24 + 444e: 69 f4 brne .+26 ; 0x446a + 4450: 80 91 24 23 lds r24, 0x2324 { if (USB_DeviceState == DEVICE_STATE_Unattached) - 4434: 88 23 and r24, r24 - 4436: c9 f7 brne .-14 ; 0x442a - 4438: 08 95 ret - 443a: dd de rcall .-582 ; 0x41f6 + 4454: 88 23 and r24, r24 + 4456: c9 f7 brne .-14 ; 0x444a + 4458: 08 95 ret + 445a: dd de rcall .-582 ; 0x4216 void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) { while (!(Endpoint_IsOUTReceived())) - 443c: 88 23 and r24, r24 - 443e: 31 f4 brne .+12 ; 0x444c - 4440: 80 91 24 23 lds r24, 0x2324 + 445c: 88 23 and r24, r24 + 445e: 31 f4 brne .+12 ; 0x446c + 4460: 80 91 24 23 lds r24, 0x2324 { if (USB_DeviceState == DEVICE_STATE_Unattached) - 4444: 88 23 and r24, r24 - 4446: c9 f7 brne .-14 ; 0x443a - 4448: 08 95 ret - 444a: f3 cd rjmp .-1050 ; 0x4032 - 444c: 0b ce rjmp .-1002 ; 0x4064 + 4464: 88 23 and r24, r24 + 4466: c9 f7 brne .-14 ; 0x445a + 4468: 08 95 ret + 446a: f3 cd rjmp .-1050 ; 0x4052 + 446c: 0b ce rjmp .-1002 ; 0x4084 -0000444e : +0000446e : { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearIN(); - 444e: 1f 93 push r17 - 4450: cf 93 push r28 - 4452: df 93 push r29 + 446e: 1f 93 push r17 + 4470: cf 93 push r28 + 4472: df 93 push r29 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearOUT(); - 4454: e0 91 c6 04 lds r30, 0x04C6 - 4458: f0 91 c7 04 lds r31, 0x04C7 + 4474: e0 91 c6 04 lds r30, 0x04C6 + 4478: f0 91 c7 04 lds r31, 0x04C7 * \return Current USB frame number from the USB controller. */ static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline uint16_t USB_Device_GetFrameNumber(void) { return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum; - 445c: e0 5a subi r30, 0xA0 ; 160 - 445e: ff 4f sbci r31, 0xFF ; 255 - 4460: c0 81 ld r28, Z - 4462: d1 81 ldd r29, Z+1 ; 0x01 + 447c: e0 5a subi r30, 0xA0 ; 160 + 447e: ff 4f sbci r31, 0xFF ; 255 + 4480: c0 81 ld r28, Z + 4482: d1 81 ldd r29, Z+1 ; 0x01 #if !defined(CONTROL_ONLY_DEVICE) uint8_t Endpoint_WaitUntilReady(void) { #if (USB_STREAM_TIMEOUT_MS < 0xFF) uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; - 4464: 14 e6 ldi r17, 0x64 ; 100 + 4484: 14 e6 ldi r17, 0x64 ; 100 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); - 4466: 80 91 31 23 lds r24, 0x2331 - 446a: 80 78 andi r24, 0x80 ; 128 + 4486: 80 91 31 23 lds r24, 0x2331 + 448a: 80 78 andi r24, 0x80 ; 128 uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 446c: 80 38 cpi r24, 0x80 ; 128 - 446e: 21 f1 breq .+72 ; 0x44b8 + 448c: 80 38 cpi r24, 0x80 ; 128 + 448e: 21 f1 breq .+72 ; 0x44d8 if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) - 4470: c2 de rcall .-636 ; 0x41f6 - 4472: 88 23 and r24, r24 - 4474: 21 f5 brne .+72 ; 0x44be - 4476: 80 91 24 23 lds r24, 0x2324 + 4490: c2 de rcall .-636 ; 0x4216 + 4492: 88 23 and r24, r24 + 4494: 21 f5 brne .+72 ; 0x44de + 4496: 80 91 24 23 lds r24, 0x2324 return ENDPOINT_READYWAIT_NoError; } uint8_t USB_DeviceState_LCL = USB_DeviceState; - 447a: 88 23 and r24, r24 + 449a: 88 23 and r24, r24 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - 447c: 29 f1 breq .+74 ; 0x44c8 - 447e: 85 30 cpi r24, 0x05 ; 5 + 449c: 29 f1 breq .+74 ; 0x44e8 + 449e: 85 30 cpi r24, 0x05 ; 5 return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - 4480: 41 f1 breq .+80 ; 0x44d2 - 4482: e0 91 2f 23 lds r30, 0x232F + 44a0: 41 f1 breq .+80 ; 0x44f2 + 44a2: e0 91 2f 23 lds r30, 0x232F * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. */ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) { return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); - 4486: f0 91 30 23 lds r31, 0x2330 - 448a: 81 81 ldd r24, Z+1 ; 0x01 - 448c: 82 fd sbrc r24, 2 + 44a6: f0 91 30 23 lds r31, 0x2330 + 44aa: 81 81 ldd r24, Z+1 ; 0x01 + 44ac: 82 fd sbrc r24, 2 return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) - 448e: 26 c0 rjmp .+76 ; 0x44dc - 4490: e0 91 c6 04 lds r30, 0x04C6 - 4494: f0 91 c7 04 lds r31, 0x04C7 - 4498: e0 5a subi r30, 0xA0 ; 160 - 449a: ff 4f sbci r31, 0xFF ; 255 - 449c: 80 81 ld r24, Z - 449e: 91 81 ldd r25, Z+1 ; 0x01 - 44a0: c8 17 cp r28, r24 + 44ae: 26 c0 rjmp .+76 ; 0x44fc + 44b0: e0 91 c6 04 lds r30, 0x04C6 + 44b4: f0 91 c7 04 lds r31, 0x04C7 + 44b8: e0 5a subi r30, 0xA0 ; 160 + 44ba: ff 4f sbci r31, 0xFF ; 255 + 44bc: 80 81 ld r24, Z + 44be: 91 81 ldd r25, Z+1 ; 0x01 + 44c0: c8 17 cp r28, r24 return ENDPOINT_READYWAIT_EndpointStalled; uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); if (CurrentFrameNumber != PreviousFrameNumber) - 44a2: d9 07 cpc r29, r25 - 44a4: 01 f3 breq .-64 ; 0x4466 - 44a6: 11 23 and r17, r17 + 44c2: d9 07 cpc r29, r25 + 44c4: 01 f3 breq .-64 ; 0x4486 + 44c6: 11 23 and r17, r17 { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) - 44a8: f1 f0 breq .+60 ; 0x44e6 - 44aa: 11 50 subi r17, 0x01 ; 1 - 44ac: ec 01 movw r28, r24 - 44ae: 80 91 31 23 lds r24, 0x2331 + 44c8: f1 f0 breq .+60 ; 0x4506 + 44ca: 11 50 subi r17, 0x01 ; 1 + 44cc: ec 01 movw r28, r24 + 44ce: 80 91 31 23 lds r24, 0x2331 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); - 44b2: 80 78 andi r24, 0x80 ; 128 - 44b4: 80 38 cpi r24, 0x80 ; 128 + 44d2: 80 78 andi r24, 0x80 ; 128 + 44d4: 80 38 cpi r24, 0x80 ; 128 uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) - 44b6: e1 f6 brne .-72 ; 0x4470 - 44b8: b6 de rcall .-660 ; 0x4226 + 44d6: e1 f6 brne .-72 ; 0x4490 + 44d8: b6 de rcall .-660 ; 0x4246 { if (Endpoint_IsINReady()) - 44ba: 88 23 and r24, r24 - 44bc: e1 f2 breq .-72 ; 0x4476 - 44be: 80 e0 ldi r24, 0x00 ; 0 - 44c0: df 91 pop r29 + 44da: 88 23 and r24, r24 + 44dc: e1 f2 breq .-72 ; 0x4496 + 44de: 80 e0 ldi r24, 0x00 ; 0 + 44e0: df 91 pop r29 return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; - 44c2: cf 91 pop r28 + 44e2: cf 91 pop r28 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 44c4: 1f 91 pop r17 - 44c6: 08 95 ret - 44c8: 82 e0 ldi r24, 0x02 ; 2 - 44ca: df 91 pop r29 + 44e4: 1f 91 pop r17 + 44e6: 08 95 ret + 44e8: 82 e0 ldi r24, 0x02 ; 2 + 44ea: df 91 pop r29 } uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; - 44cc: cf 91 pop r28 + 44ec: cf 91 pop r28 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 44ce: 1f 91 pop r17 - 44d0: 08 95 ret - 44d2: 83 e0 ldi r24, 0x03 ; 3 - 44d4: df 91 pop r29 + 44ee: 1f 91 pop r17 + 44f0: 08 95 ret + 44f2: 83 e0 ldi r24, 0x03 ; 3 + 44f4: df 91 pop r29 uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; - 44d6: cf 91 pop r28 + 44f6: cf 91 pop r28 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 44d8: 1f 91 pop r17 - 44da: 08 95 ret - 44dc: 81 e0 ldi r24, 0x01 ; 1 - 44de: df 91 pop r29 + 44f8: 1f 91 pop r17 + 44fa: 08 95 ret + 44fc: 81 e0 ldi r24, 0x01 ; 1 + 44fe: df 91 pop r29 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) return ENDPOINT_READYWAIT_EndpointStalled; - 44e0: cf 91 pop r28 + 4500: cf 91 pop r28 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - 44e2: 1f 91 pop r17 - 44e4: 08 95 ret - 44e6: 84 e0 ldi r24, 0x04 ; 4 - 44e8: df 91 pop r29 + 4502: 1f 91 pop r17 + 4504: 08 95 ret + 4506: 84 e0 ldi r24, 0x04 ; 4 + 4508: df 91 pop r29 if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; - 44ea: cf 91 pop r28 + 450a: cf 91 pop r28 } } } - 44ec: 1f 91 pop r17 - 44ee: 08 95 ret + 450c: 1f 91 pop r17 + 450e: 08 95 ret -000044f0 : +00004510 : USB_ResetInterface(); } void USB_Disable(void) { USB_INT_DisableAllInterrupts(); - 44f0: 64 d0 rcall .+200 ; 0x45ba - 44f2: 6a d0 rcall .+212 ; 0x45c8 + 4510: 64 d0 rcall .+200 ; 0x45da + 4512: 6a d0 rcall .+212 ; 0x45e8 USB_INT_ClearAllInterrupts(); - 44f4: e0 ec ldi r30, 0xC0 ; 192 - 44f6: f4 e0 ldi r31, 0x04 ; 4 + 4514: e0 ec ldi r30, 0xC0 ; 192 + 4516: f4 e0 ldi r31, 0x04 ; 4 * enumerating the device once attached until \ref USB_Attach() is called. */ static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; static inline void USB_Detach(void) { USB.CTRLB &= ~USB_ATTACH_bm; - 44f8: 81 81 ldd r24, Z+1 ; 0x01 - 44fa: 8e 7f andi r24, 0xFE ; 254 - 44fc: 81 83 std Z+1, r24 ; 0x01 - 44fe: 80 81 ld r24, Z - 4500: 8f 77 andi r24, 0x7F ; 127 + 4518: 81 81 ldd r24, Z+1 ; 0x01 + 451a: 8e 7f andi r24, 0xFE ; 254 + 451c: 81 83 std Z+1, r24 ; 0x01 + 451e: 80 81 ld r24, Z + 4520: 8f 77 andi r24, 0x7F ; 127 } static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Disable(void) { USB.CTRLA &= ~USB_ENABLE_bm; - 4502: 80 83 st Z, r24 - 4504: 10 92 23 23 sts 0x2323, r1 + 4522: 80 83 st Z, r24 + 4524: 10 92 23 23 sts 0x2323, r1 USB_Detach(); USB_Controller_Disable(); USB_IsInitialized = false; - 4508: 08 95 ret + 4528: 08 95 ret -0000450a : - 450a: cf 93 push r28 +0000452a : + 452a: cf 93 push r28 } - 450c: df 93 push r29 + 452c: df 93 push r29 { #if defined(USB_DEVICE_OPT_FULLSPEED) if (USB_Options & USB_DEVICE_OPT_LOWSPEED) CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); else CLK.USBCTRL = (((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp); - 450e: e0 e4 ldi r30, 0x40 ; 64 - 4510: f0 e0 ldi r31, 0x00 ; 0 - 4512: 14 82 std Z+4, r1 ; 0x04 + 452e: e0 e4 ldi r30, 0x40 ; 64 + 4530: f0 e0 ldi r31, 0x00 ; 0 + 4532: 14 82 std Z+4, r1 ; 0x04 #else CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); #endif if (USB_Options & USB_OPT_PLLCLKSRC) CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm); - 4514: 84 81 ldd r24, Z+4 ; 0x04 - 4516: 81 60 ori r24, 0x01 ; 1 - 4518: 84 83 std Z+4, r24 ; 0x04 + 4534: 84 81 ldd r24, Z+4 ; 0x04 + 4536: 81 60 ori r24, 0x01 ; 1 + 4538: 84 83 std Z+4, r24 ; 0x04 else CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); USB_Device_SetDeviceAddress(0); USB_INT_DisableAllInterrupts(); - 451a: 4f d0 rcall .+158 ; 0x45ba - 451c: 55 d0 rcall .+170 ; 0x45c8 + 453a: 4f d0 rcall .+158 ; 0x45da + 453c: 55 d0 rcall .+170 ; 0x45e8 USB_INT_ClearAllInterrupts(); - 451e: c0 ec ldi r28, 0xC0 ; 192 - 4520: d4 e0 ldi r29, 0x04 ; 4 + 453e: c0 ec ldi r28, 0xC0 ; 192 + 4540: d4 e0 ldi r29, 0x04 ; 4 } static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Reset(void) { USB.CTRLA &= ~USB_ENABLE_bm; - 4522: 88 81 ld r24, Y - 4524: 8f 77 andi r24, 0x7F ; 127 - 4526: 88 83 st Y, r24 - 4528: 88 81 ld r24, Y - 452a: 80 68 ori r24, 0x80 ; 128 + 4542: 88 81 ld r24, Y + 4544: 8f 77 andi r24, 0x7F ; 127 + 4546: 88 83 st Y, r24 + 4548: 88 81 ld r24, Y + 454a: 80 68 ori r24, 0x80 ; 128 USB.CTRLA |= USB_ENABLE_bm; - 452c: 88 83 st Y, r24 - 452e: 10 92 24 23 sts 0x2324, r1 + 454c: 88 83 st Y, r24 + 454e: 10 92 24 23 sts 0x2324, r1 } #if defined(USB_CAN_BE_DEVICE) static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; - 4532: 10 92 20 23 sts 0x2320, r1 + 4552: 10 92 20 23 sts 0x2320, r1 USB_Device_ConfigurationNumber = 0; - 4536: 10 92 22 23 sts 0x2322, r1 + 4556: 10 92 22 23 sts 0x2322, r1 #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; - 453a: 10 92 21 23 sts 0x2321, r1 + 455a: 10 92 21 23 sts 0x2321, r1 #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; - 453e: 88 81 ld r24, Y - 4540: 80 64 ori r24, 0x40 ; 64 + 455e: 88 81 ld r24, Y + 4560: 80 64 ori r24, 0x40 ; 64 } static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetFullSpeed(void) { USB.CTRLA |= USB_SPEED_bm; - 4542: 88 83 st Y, r24 - 4544: 80 e8 ldi r24, 0x80 ; 128 - 4546: 68 e4 ldi r22, 0x48 ; 72 + 4562: 88 83 st Y, r24 + 4564: 80 e8 ldi r24, 0x80 ; 128 + 4566: 68 e4 ldi r22, 0x48 ; 72 EPConfigMask |= USB_EP_TYPE_BULK_gc; break; } if (Type == EP_TYPE_CONTROL) Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 4548: 48 e0 ldi r20, 0x08 ; 8 - 454a: 7a de rcall .-780 ; 0x4240 - 454c: 80 e0 ldi r24, 0x00 ; 0 - 454e: 68 e4 ldi r22, 0x48 ; 72 - 4550: 48 e0 ldi r20, 0x08 ; 8 + 4568: 48 e0 ldi r20, 0x08 ; 8 + 456a: 7a de rcall .-780 ; 0x4260 + 456c: 80 e0 ldi r24, 0x00 ; 0 + 456e: 68 e4 ldi r22, 0x48 ; 72 + 4570: 48 e0 ldi r20, 0x08 ; 8 return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4552: 76 de rcall .-788 ; 0x4240 - 4554: 88 85 ldd r24, Y+8 ; 0x08 - 4556: 80 64 ori r24, 0x40 ; 64 - 4558: 88 87 std Y+8, r24 ; 0x08 - 455a: 89 81 ldd r24, Y+1 ; 0x01 + 4572: 76 de rcall .-788 ; 0x4260 + 4574: 88 85 ldd r24, Y+8 ; 0x08 + 4576: 80 64 ori r24, 0x40 ; 64 + 4578: 88 87 std Y+8, r24 ; 0x08 + 457a: 89 81 ldd r24, Y+1 ; 0x01 static inline void USB_INT_Enable(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI: USB.INTCTRLA |= USB_BUSEVIE_bm; - 455c: 81 60 ori r24, 0x01 ; 1 - 455e: 89 83 std Y+1, r24 ; 0x01 - 4560: df 91 pop r29 + 457c: 81 60 ori r24, 0x01 ; 1 + 457e: 89 83 std Y+1, r24 ; 0x01 + 4580: df 91 pop r29 * register and despite the datasheet making no mention of its requirement in host mode. */ static inline void USB_Attach(void) ATTR_ALWAYS_INLINE; static inline void USB_Attach(void) { USB.CTRLB |= USB_ATTACH_bm; - 4562: cf 91 pop r28 - 4564: 08 95 ret + 4582: cf 91 pop r28 + 4584: 08 95 ret -00004566 : - 4566: cf 93 push r28 +00004586 : + 4586: cf 93 push r28 USB_INT_DisableAllInterrupts(); USB_INT_ClearAllInterrupts(); USB_Controller_Reset(); USB_Init_Device(); } - 4568: df 93 push r29 - 456a: 3f b7 in r19, 0x3f ; 63 - 456c: f8 94 cli + 4588: df 93 push r29 + 458a: 3f b7 in r19, 0x3f ; 63 + 458c: f8 94 cli #endif uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc; - 456e: c0 ec ldi r28, 0xC0 ; 192 - 4570: d1 e0 ldi r29, 0x01 ; 1 - 4572: 22 e0 ldi r18, 0x02 ; 2 - 4574: 2a 87 std Y+10, r18 ; 0x0a + 458e: c0 ec ldi r28, 0xC0 ; 192 + 4590: d1 e0 ldi r29, 0x01 ; 1 + 4592: 22 e0 ldi r18, 0x02 ; 2 + 4594: 2a 87 std Y+10, r18 ; 0x0a USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); - 4576: ea e1 ldi r30, 0x1A ; 26 - 4578: f0 e0 ldi r31, 0x00 ; 0 - 457a: e4 91 lpm r30, Z - 457c: a0 ec ldi r26, 0xC0 ; 192 - 457e: b4 e0 ldi r27, 0x04 ; 4 - 4580: da 96 adiw r26, 0x3a ; 58 - 4582: ec 93 st X, r30 - 4584: da 97 sbiw r26, 0x3a ; 58 + 4596: ea e1 ldi r30, 0x1A ; 26 + 4598: f0 e0 ldi r31, 0x00 ; 0 + 459a: e4 91 lpm r30, Z + 459c: a0 ec ldi r26, 0xC0 ; 192 + 459e: b4 e0 ldi r27, 0x04 ; 4 + 45a0: da 96 adiw r26, 0x3a ; 58 + 45a2: ec 93 st X, r30 + 45a4: da 97 sbiw r26, 0x3a ; 58 USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); - 4586: eb e1 ldi r30, 0x1B ; 27 - 4588: f0 e0 ldi r31, 0x00 ; 0 - 458a: e4 91 lpm r30, Z - 458c: db 96 adiw r26, 0x3b ; 59 - 458e: ec 93 st X, r30 - 4590: db 97 sbiw r26, 0x3b ; 59 + 45a6: eb e1 ldi r30, 0x1B ; 27 + 45a8: f0 e0 ldi r31, 0x00 ; 0 + 45aa: e4 91 lpm r30, Z + 45ac: db 96 adiw r26, 0x3b ; 59 + 45ae: ec 93 st X, r30 + 45b0: db 97 sbiw r26, 0x3b ; 59 NVM.CMD = NVM_CMD_NO_OPERATION_gc; - 4592: 1a 86 std Y+10, r1 ; 0x0a + 45b2: 1a 86 std Y+10, r1 ; 0x0a /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0)); - 4594: 8b e4 ldi r24, 0x4B ; 75 - 4596: 96 e2 ldi r25, 0x26 ; 38 - 4598: 8e 7f andi r24, 0xFE ; 254 - 459a: 16 96 adiw r26, 0x06 ; 6 - 459c: 8d 93 st X+, r24 - 459e: 9c 93 st X, r25 - 45a0: 17 97 sbiw r26, 0x07 ; 7 + 45b4: 8b e4 ldi r24, 0x4B ; 75 + 45b6: 96 e2 ldi r25, 0x26 ; 38 + 45b8: 8e 7f andi r24, 0xFE ; 254 + 45ba: 16 96 adiw r26, 0x06 ; 6 + 45bc: 8d 93 st X+, r24 + 45be: 9c 93 st X, r25 + 45c0: 17 97 sbiw r26, 0x07 ; 7 USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); - 45a2: 85 e1 ldi r24, 0x15 ; 21 - 45a4: 8c 93 st X, r24 + 45c2: 85 e1 ldi r24, 0x15 ; 21 + 45c4: 8c 93 st X, r24 if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH) USB.INTCTRLA = (3 << USB_INTLVL_gp); else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED) USB.INTCTRLA = (2 << USB_INTLVL_gp); - 45a6: 18 96 adiw r26, 0x08 ; 8 - 45a8: 2c 93 st X, r18 + 45c6: 18 96 adiw r26, 0x08 ; 8 + 45c8: 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; - 45aa: 3f bf out 0x3f, r19 ; 63 + 45ca: 3f bf out 0x3f, r19 ; 63 #if defined(USB_CAN_BE_BOTH) USB_CurrentMode = Mode; #endif USB_IsInitialized = true; - 45ac: 81 e0 ldi r24, 0x01 ; 1 - 45ae: 80 93 23 23 sts 0x2323, r24 + 45cc: 81 e0 ldi r24, 0x01 ; 1 + 45ce: 80 93 23 23 sts 0x2323, r24 USB_ResetInterface(); - 45b2: ab df rcall .-170 ; 0x450a - 45b4: df 91 pop r29 + 45d2: ab df rcall .-170 ; 0x452a + 45d4: df 91 pop r29 } - 45b6: cf 91 pop r28 - 45b8: 08 95 ret + 45d6: cf 91 pop r28 + 45d8: 08 95 ret -000045ba : +000045da : #define __INCLUDE_FROM_USB_DRIVER #include "../USBInterrupt.h" void USB_INT_DisableAllInterrupts(void) { USB.INTCTRLA &= USB_INTLVL_gm; - 45ba: e0 ec ldi r30, 0xC0 ; 192 - 45bc: f4 e0 ldi r31, 0x04 ; 4 - 45be: 80 85 ldd r24, Z+8 ; 0x08 - 45c0: 83 70 andi r24, 0x03 ; 3 - 45c2: 80 87 std Z+8, r24 ; 0x08 + 45da: e0 ec ldi r30, 0xC0 ; 192 + 45dc: f4 e0 ldi r31, 0x04 ; 4 + 45de: 80 85 ldd r24, Z+8 ; 0x08 + 45e0: 83 70 andi r24, 0x03 ; 3 + 45e2: 80 87 std Z+8, r24 ; 0x08 USB.INTCTRLB = 0; - 45c4: 11 86 std Z+9, r1 ; 0x09 + 45e4: 11 86 std Z+9, r1 ; 0x09 } - 45c6: 08 95 ret + 45e6: 08 95 ret -000045c8 : +000045e8 : void USB_INT_ClearAllInterrupts(void) { USB.INTFLAGSACLR = 0xFF; - 45c8: e0 ec ldi r30, 0xC0 ; 192 - 45ca: f4 e0 ldi r31, 0x04 ; 4 - 45cc: 8f ef ldi r24, 0xFF ; 255 - 45ce: 82 87 std Z+10, r24 ; 0x0a + 45e8: e0 ec ldi r30, 0xC0 ; 192 + 45ea: f4 e0 ldi r31, 0x04 ; 4 + 45ec: 8f ef ldi r24, 0xFF ; 255 + 45ee: 82 87 std Z+10, r24 ; 0x0a USB.INTFLAGSBCLR = 0xFF; - 45d0: 84 87 std Z+12, r24 ; 0x0c + 45f0: 84 87 std Z+12, r24 ; 0x0c } - 45d2: 08 95 ret + 45f2: 08 95 ret -000045d4 <__vector_125>: +000045f4 <__vector_125>: ISR(USB_BUSEVENT_vect) { - 45d4: 1f 92 push r1 - 45d6: 0f 92 push r0 - 45d8: 0f b6 in r0, 0x3f ; 63 - 45da: 0f 92 push r0 - 45dc: 11 24 eor r1, r1 - 45de: 2f 93 push r18 - 45e0: 3f 93 push r19 - 45e2: 4f 93 push r20 - 45e4: 5f 93 push r21 - 45e6: 6f 93 push r22 - 45e8: 7f 93 push r23 - 45ea: 8f 93 push r24 - 45ec: 9f 93 push r25 - 45ee: af 93 push r26 - 45f0: bf 93 push r27 - 45f2: ef 93 push r30 - 45f4: ff 93 push r31 + 45f4: 1f 92 push r1 + 45f6: 0f 92 push r0 + 45f8: 0f b6 in r0, 0x3f ; 63 + 45fa: 0f 92 push r0 + 45fc: 11 24 eor r1, r1 + 45fe: 2f 93 push r18 + 4600: 3f 93 push r19 + 4602: 4f 93 push r20 + 4604: 5f 93 push r21 + 4606: 6f 93 push r22 + 4608: 7f 93 push r23 + 460a: 8f 93 push r24 + 460c: 9f 93 push r25 + 460e: af 93 push r26 + 4610: bf 93 push r27 + 4612: ef 93 push r30 + 4614: ff 93 push r31 case USB_INT_BUSEVENTI_Resume: return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); case USB_INT_BUSEVENTI_Reset: return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); case USB_INT_SOFI: return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false); - 45f6: 80 91 ca 04 lds r24, 0x04CA + 4616: 80 91 ca 04 lds r24, 0x04CA #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 45fa: 87 fd sbrc r24, 7 - 45fc: 4f c0 rjmp .+158 ; 0x469c <__vector_125+0xc8> + 461a: 87 fd sbrc r24, 7 + 461c: 4f c0 rjmp .+158 ; 0x46bc <__vector_125+0xc8> static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI_Suspend: return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); - 45fe: 80 91 ca 04 lds r24, 0x04CA + 461e: 80 91 ca 04 lds r24, 0x04CA EVENT_USB_Device_StartOfFrame(); } #endif if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) - 4602: 86 fd sbrc r24, 6 - 4604: 42 c0 rjmp .+132 ; 0x468a <__vector_125+0xb6> + 4622: 86 fd sbrc r24, 6 + 4624: 42 c0 rjmp .+132 ; 0x46aa <__vector_125+0xb6> case USB_INT_BUSEVENTI_Resume: return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); - 4606: 80 91 ca 04 lds r24, 0x04CA + 4626: 80 91 ca 04 lds r24, 0x04CA USB_DeviceState = DEVICE_STATE_Suspended; EVENT_USB_Device_Suspend(); #endif } if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Resume)) - 460a: 85 ff sbrs r24, 5 - 460c: 0d c0 rjmp .+26 ; 0x4628 <__vector_125+0x54> + 462a: 85 ff sbrs r24, 5 + 462c: 0d c0 rjmp .+26 ; 0x4648 <__vector_125+0x54> { case USB_INT_BUSEVENTI_Suspend: USB.INTFLAGSACLR = USB_SUSPENDIF_bm; break; case USB_INT_BUSEVENTI_Resume: USB.INTFLAGSACLR = USB_RESUMEIF_bm; - 460e: 80 e2 ldi r24, 0x20 ; 32 - 4610: e0 ec ldi r30, 0xC0 ; 192 - 4612: f4 e0 ldi r31, 0x04 ; 4 - 4614: 82 87 std Z+10, r24 ; 0x0a + 462e: 80 e2 ldi r24, 0x20 ; 32 + 4630: e0 ec ldi r30, 0xC0 ; 192 + 4632: f4 e0 ldi r31, 0x04 ; 4 + 4634: 82 87 std Z+10, r24 ; 0x0a { USB_INT_Clear(USB_INT_BUSEVENTI_Resume); if (USB_Device_ConfigurationNumber) - 4616: 80 91 20 23 lds r24, 0x2320 - 461a: 88 23 and r24, r24 - 461c: 71 f1 breq .+92 ; 0x467a <__vector_125+0xa6> + 4636: 80 91 20 23 lds r24, 0x2320 + 463a: 88 23 and r24, r24 + 463c: 71 f1 breq .+92 ; 0x469a <__vector_125+0xa6> USB_DeviceState = DEVICE_STATE_Configured; - 461e: 84 e0 ldi r24, 0x04 ; 4 - 4620: 80 93 24 23 sts 0x2324, r24 + 463e: 84 e0 ldi r24, 0x04 ; 4 + 4640: 80 93 24 23 sts 0x2324, r24 else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; #if !defined(NO_LIMITED_CONTROLLER_CONNECT) EVENT_USB_Device_Connect(); - 4624: 0e 94 62 0b call 0x16c4 ; 0x16c4 + 4644: 0e 94 72 0b call 0x16e4 ; 0x16e4 case USB_INT_BUSEVENTI_Suspend: return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); case USB_INT_BUSEVENTI_Resume: return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); case USB_INT_BUSEVENTI_Reset: return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); - 4628: e0 ec ldi r30, 0xC0 ; 192 - 462a: f4 e0 ldi r31, 0x04 ; 4 - 462c: 80 91 ca 04 lds r24, 0x04CA + 4648: e0 ec ldi r30, 0xC0 ; 192 + 464a: f4 e0 ldi r31, 0x04 ; 4 + 464c: 80 91 ca 04 lds r24, 0x04CA #else EVENT_USB_Device_WakeUp(); #endif } if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) - 4630: 84 ff sbrs r24, 4 - 4632: 12 c0 rjmp .+36 ; 0x4658 <__vector_125+0x84> + 4650: 84 ff sbrs r24, 4 + 4652: 12 c0 rjmp .+36 ; 0x4678 <__vector_125+0x84> break; case USB_INT_BUSEVENTI_Resume: USB.INTFLAGSACLR = USB_RESUMEIF_bm; break; case USB_INT_BUSEVENTI_Reset: USB.INTFLAGSACLR = USB_RSTIF_bm; - 4634: 80 e1 ldi r24, 0x10 ; 16 - 4636: 82 87 std Z+10, r24 ; 0x0a + 4654: 80 e1 ldi r24, 0x10 ; 16 + 4656: 82 87 std Z+10, r24 ; 0x0a { USB_INT_Clear(USB_INT_BUSEVENTI_Reset); USB_DeviceState = DEVICE_STATE_Default; - 4638: 82 e0 ldi r24, 0x02 ; 2 - 463a: 80 93 24 23 sts 0x2324, r24 + 4658: 82 e0 ldi r24, 0x02 ; 2 + 465a: 80 93 24 23 sts 0x2324, r24 USB_Device_ConfigurationNumber = 0; - 463e: 10 92 20 23 sts 0x2320, r1 + 465e: 10 92 20 23 sts 0x2320, r1 } static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) { USB.ADDR = Address; - 4642: 13 82 std Z+3, r1 ; 0x03 + 4662: 13 82 std Z+3, r1 ; 0x03 USB_Device_EnableDeviceAddress(0); Endpoint_ClearEndpoints(); - 4644: b6 de rcall .-660 ; 0x43b2 - 4646: 80 e8 ldi r24, 0x80 ; 128 + 4664: b6 de rcall .-660 ; 0x43d2 + 4666: 80 e8 ldi r24, 0x80 ; 128 EPConfigMask |= USB_EP_TYPE_BULK_gc; break; } if (Type == EP_TYPE_CONTROL) Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); - 4648: 68 e4 ldi r22, 0x48 ; 72 - 464a: 48 e0 ldi r20, 0x08 ; 8 - 464c: f9 dd rcall .-1038 ; 0x4240 - 464e: 80 e0 ldi r24, 0x00 ; 0 - 4650: 68 e4 ldi r22, 0x48 ; 72 + 4668: 68 e4 ldi r22, 0x48 ; 72 + 466a: 48 e0 ldi r20, 0x08 ; 8 + 466c: f9 dd rcall .-1038 ; 0x4260 + 466e: 80 e0 ldi r24, 0x00 ; 0 + 4670: 68 e4 ldi r22, 0x48 ; 72 return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); - 4652: 48 e0 ldi r20, 0x08 ; 8 - 4654: f5 dd rcall .-1046 ; 0x4240 - 4656: 17 db rcall .-2514 ; 0x3c86 - 4658: ff 91 pop r31 - 465a: ef 91 pop r30 + 4672: 48 e0 ldi r20, 0x08 ; 8 + 4674: f5 dd rcall .-1046 ; 0x4260 + 4676: 17 db rcall .-2514 ; 0x3ca6 + 4678: ff 91 pop r31 + 467a: ef 91 pop r30 Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, USB_Device_ControlEndpointSize, 1); EVENT_USB_Device_Reset(); - 465c: bf 91 pop r27 - 465e: af 91 pop r26 + 467c: bf 91 pop r27 + 467e: af 91 pop r26 } } - 4660: 9f 91 pop r25 - 4662: 8f 91 pop r24 - 4664: 7f 91 pop r23 - 4666: 6f 91 pop r22 - 4668: 5f 91 pop r21 - 466a: 4f 91 pop r20 - 466c: 3f 91 pop r19 - 466e: 2f 91 pop r18 - 4670: 0f 90 pop r0 - 4672: 0f be out 0x3f, r0 ; 63 - 4674: 0f 90 pop r0 - 4676: 1f 90 pop r1 - 4678: 18 95 reti - 467a: 80 91 c3 04 lds r24, 0x04C3 - 467e: 88 23 and r24, r24 - 4680: b9 f4 brne .+46 ; 0x46b0 <__vector_125+0xdc> + 4680: 9f 91 pop r25 + 4682: 8f 91 pop r24 + 4684: 7f 91 pop r23 + 4686: 6f 91 pop r22 + 4688: 5f 91 pop r21 + 468a: 4f 91 pop r20 + 468c: 3f 91 pop r19 + 468e: 2f 91 pop r18 + 4690: 0f 90 pop r0 + 4692: 0f be out 0x3f, r0 ; 63 + 4694: 0f 90 pop r0 + 4696: 1f 90 pop r1 + 4698: 18 95 reti + 469a: 80 91 c3 04 lds r24, 0x04C3 + 469e: 88 23 and r24, r24 + 46a0: b9 f4 brne .+46 ; 0x46d0 <__vector_125+0xdc> } 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); - 4682: 81 e0 ldi r24, 0x01 ; 1 - 4684: 80 93 24 23 sts 0x2324, r24 + 46a2: 81 e0 ldi r24, 0x01 ; 1 + 46a4: 80 93 24 23 sts 0x2324, r24 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; - 4688: cd cf rjmp .-102 ; 0x4624 <__vector_125+0x50> - 468a: 80 e4 ldi r24, 0x40 ; 64 - 468c: e0 ec ldi r30, 0xC0 ; 192 - 468e: f4 e0 ldi r31, 0x04 ; 4 - 4690: 82 87 std Z+10, r24 ; 0x0a + 46a8: cd cf rjmp .-102 ; 0x4644 <__vector_125+0x50> + 46aa: 80 e4 ldi r24, 0x40 ; 64 + 46ac: e0 ec ldi r30, 0xC0 ; 192 + 46ae: f4 e0 ldi r31, 0x04 ; 4 + 46b0: 82 87 std Z+10, r24 ; 0x0a static inline void USB_INT_Clear(const uint8_t Interrupt) { switch (Interrupt) { case USB_INT_BUSEVENTI_Suspend: USB.INTFLAGSACLR = USB_SUSPENDIF_bm; - 4692: 10 92 24 23 sts 0x2324, r1 - 4696: 0e 94 67 0b call 0x16ce ; 0x16ce + 46b2: 10 92 24 23 sts 0x2324, r1 + 46b6: 0e 94 77 0b call 0x16ee ; 0x16ee 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; - 469a: b5 cf rjmp .-150 ; 0x4606 <__vector_125+0x32> - 469c: 80 91 c8 04 lds r24, 0x04C8 + 46ba: b5 cf rjmp .-150 ; 0x4626 <__vector_125+0x32> + 46bc: 80 91 c8 04 lds r24, 0x04C8 EVENT_USB_Device_Disconnect(); - 46a0: 87 ff sbrs r24, 7 - 46a2: ad cf rjmp .-166 ; 0x45fe <__vector_125+0x2a> + 46c0: 87 ff sbrs r24, 7 + 46c2: ad cf rjmp .-166 ; 0x461e <__vector_125+0x2a> 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); - 46a4: 80 e8 ldi r24, 0x80 ; 128 - 46a6: e0 ec ldi r30, 0xC0 ; 192 + 46c4: 80 e8 ldi r24, 0x80 ; 128 + 46c6: e0 ec ldi r30, 0xC0 ; 192 } ISR(USB_BUSEVENT_vect) { #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - 46a8: f4 e0 ldi r31, 0x04 ; 4 - 46aa: 82 87 std Z+10, r24 ; 0x0a + 46c8: f4 e0 ldi r31, 0x04 ; 4 + 46ca: 82 87 std Z+10, r24 ; 0x0a break; case USB_INT_BUSEVENTI_Reset: USB.INTFLAGSACLR = USB_RSTIF_bm; break; case USB_INT_SOFI: USB.INTFLAGSACLR = USB_SOFIF_bm; - 46ac: ec da rcall .-2600 ; 0x3c86 - 46ae: a7 cf rjmp .-178 ; 0x45fe <__vector_125+0x2a> - 46b0: 83 e0 ldi r24, 0x03 ; 3 - 46b2: e8 cf rjmp .-48 ; 0x4684 <__vector_125+0xb0> + 46cc: ec da rcall .-2600 ; 0x3ca6 + 46ce: a7 cf rjmp .-178 ; 0x461e <__vector_125+0x2a> + 46d0: 83 e0 ldi r24, 0x03 ; 3 + 46d2: e8 cf rjmp .-48 ; 0x46a4 <__vector_125+0xb0> -000046b4 : +000046d4 : #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) { - 46b4: ef 92 push r14 - 46b6: ff 92 push r15 - 46b8: 0f 93 push r16 - 46ba: 1f 93 push r17 - 46bc: cf 93 push r28 - 46be: df 93 push r29 - 46c0: ec 01 movw r28, r24 + 46d4: ef 92 push r14 + 46d6: ff 92 push r15 + 46d8: 0f 93 push r16 + 46da: 1f 93 push r17 + 46dc: cf 93 push r28 + 46de: df 93 push r29 + 46e0: ec 01 movw r28, r24 if (!(Endpoint_IsSETUPReceived())) - 46c2: 81 dd rcall .-1278 ; 0x41c6 - 46c4: 88 23 and r24, r24 - 46c6: 49 f0 breq .+18 ; 0x46da - 46c8: 88 81 ld r24, Y + 46e2: 81 dd rcall .-1278 ; 0x41e6 + 46e4: 88 23 and r24, r24 + 46e6: 49 f0 breq .+18 ; 0x46fa + 46e8: 88 81 ld r24, Y return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 46ca: 90 e0 ldi r25, 0x00 ; 0 - 46cc: 20 91 29 23 lds r18, 0x2329 - 46d0: 30 91 2a 23 lds r19, 0x232A - 46d4: 28 17 cp r18, r24 - 46d6: 39 07 cpc r19, r25 - 46d8: 39 f0 breq .+14 ; 0x46e8 - 46da: df 91 pop r29 + 46ea: 90 e0 ldi r25, 0x00 ; 0 + 46ec: 20 91 29 23 lds r18, 0x2329 + 46f0: 30 91 2a 23 lds r19, 0x232A + 46f4: 28 17 cp r18, r24 + 46f6: 39 07 cpc r19, r25 + 46f8: 39 f0 breq .+14 ; 0x4708 + 46fa: df 91 pop r29 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); } break; } } - 46dc: cf 91 pop r28 - 46de: 1f 91 pop r17 - 46e0: 0f 91 pop r16 - 46e2: ff 90 pop r15 - 46e4: ef 90 pop r14 - 46e6: 08 95 ret - 46e8: 80 91 26 23 lds r24, 0x2326 + 46fc: cf 91 pop r28 + 46fe: 1f 91 pop r17 + 4700: 0f 91 pop r16 + 4702: ff 90 pop r15 + 4704: ef 90 pop r14 + 4706: 08 95 ret + 4708: 80 91 26 23 lds r24, 0x2326 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) return; switch (USB_ControlRequest.bRequest) - 46ec: 81 32 cpi r24, 0x21 ; 33 - 46ee: 09 f4 brne .+2 ; 0x46f2 - 46f0: 5f c0 rjmp .+190 ; 0x47b0 - 46f2: 82 32 cpi r24, 0x22 ; 34 - 46f4: 08 f0 brcs .+2 ; 0x46f8 - 46f6: 4b c0 rjmp .+150 ; 0x478e - 46f8: 80 32 cpi r24, 0x20 ; 32 - 46fa: 79 f7 brne .-34 ; 0x46da - 46fc: 80 91 25 23 lds r24, 0x2325 + 470c: 81 32 cpi r24, 0x21 ; 33 + 470e: 09 f4 brne .+2 ; 0x4712 + 4710: 5f c0 rjmp .+190 ; 0x47d0 + 4712: 82 32 cpi r24, 0x22 ; 34 + 4714: 08 f0 brcs .+2 ; 0x4718 + 4716: 4b c0 rjmp .+150 ; 0x47ae + 4718: 80 32 cpi r24, 0x20 ; 32 + 471a: 79 f7 brne .-34 ; 0x46fa + 471c: 80 91 25 23 lds r24, 0x2325 Endpoint_ClearStatusStage(); } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 4700: 81 32 cpi r24, 0x21 ; 33 - 4702: 59 f7 brne .-42 ; 0x46da - 4704: 34 dd rcall .-1432 ; 0x416e + 4720: 81 32 cpi r24, 0x21 ; 33 + 4722: 59 f7 brne .-42 ; 0x46fa + 4724: 34 dd rcall .-1432 ; 0x418e { Endpoint_ClearSETUP(); - 4706: 04 c0 rjmp .+8 ; 0x4710 - 4708: 80 91 24 23 lds r24, 0x2324 + 4726: 04 c0 rjmp .+8 ; 0x4730 + 4728: 80 91 24 23 lds r24, 0x2324 while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 470c: 88 23 and r24, r24 - 470e: 29 f3 breq .-54 ; 0x46da - 4710: 72 dd rcall .-1308 ; 0x41f6 - 4712: 88 23 and r24, r24 + 472c: 88 23 and r24, r24 + 472e: 29 f3 breq .-54 ; 0x46fa + 4730: 72 dd rcall .-1308 ; 0x4216 + 4732: 88 23 and r24, r24 case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 4714: c9 f3 breq .-14 ; 0x4708 - 4716: b5 dc rcall .-1686 ; 0x4082 - 4718: e8 2e mov r14, r24 - 471a: b3 dc rcall .-1690 ; 0x4082 + 4734: c9 f3 breq .-14 ; 0x4728 + 4736: b5 dc rcall .-1686 ; 0x40a2 + 4738: e8 2e mov r14, r24 + 473a: b3 dc rcall .-1690 ; 0x40a2 * \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(); - 471c: f8 2e mov r15, r24 - 471e: b1 dc rcall .-1694 ; 0x4082 - 4720: 08 2f mov r16, r24 + 473c: f8 2e mov r15, r24 + 473e: b1 dc rcall .-1694 ; 0x40a2 + 4740: 08 2f mov r16, r24 uint32_t Byte1 = Endpoint_Read_8(); - 4722: af dc rcall .-1698 ; 0x4082 - 4724: 48 2f mov r20, r24 - 4726: 50 e0 ldi r21, 0x00 ; 0 + 4742: af dc rcall .-1698 ; 0x40a2 + 4744: 48 2f mov r20, r24 + 4746: 50 e0 ldi r21, 0x00 ; 0 uint32_t Byte2 = Endpoint_Read_8(); - 4728: 60 e0 ldi r22, 0x00 ; 0 - 472a: 70 e0 ldi r23, 0x00 ; 0 - 472c: 74 2f mov r23, r20 + 4748: 60 e0 ldi r22, 0x00 ; 0 + 474a: 70 e0 ldi r23, 0x00 ; 0 + 474c: 74 2f mov r23, r20 uint32_t Byte3 = Endpoint_Read_8(); - 472e: 66 27 eor r22, r22 - 4730: 55 27 eor r21, r21 - 4732: 44 27 eor r20, r20 - 4734: 10 e0 ldi r17, 0x00 ; 0 - 4736: 20 e0 ldi r18, 0x00 ; 0 - 4738: 30 e0 ldi r19, 0x00 ; 0 + 474e: 66 27 eor r22, r22 + 4750: 55 27 eor r21, r21 + 4752: 44 27 eor r20, r20 + 4754: 10 e0 ldi r17, 0x00 ; 0 + 4756: 20 e0 ldi r18, 0x00 ; 0 + 4758: 30 e0 ldi r19, 0x00 ; 0 return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 473a: 98 01 movw r18, r16 - 473c: 11 27 eor r17, r17 - 473e: 00 27 eor r16, r16 - 4740: 40 2b or r20, r16 + 475a: 98 01 movw r18, r16 + 475c: 11 27 eor r17, r17 + 475e: 00 27 eor r16, r16 + 4760: 40 2b or r20, r16 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(); - 4742: 51 2b or r21, r17 - 4744: 62 2b or r22, r18 - 4746: 73 2b or r23, r19 + 4762: 51 2b or r21, r17 + 4764: 62 2b or r22, r18 + 4766: 73 2b or r23, r19 uint32_t Byte3 = Endpoint_Read_8(); return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 4748: 8e 2d mov r24, r14 - 474a: 90 e0 ldi r25, 0x00 ; 0 - 474c: a0 e0 ldi r26, 0x00 ; 0 - 474e: b0 e0 ldi r27, 0x00 ; 0 - 4750: 48 2b or r20, r24 - 4752: 59 2b or r21, r25 - 4754: 6a 2b or r22, r26 + 4768: 8e 2d mov r24, r14 + 476a: 90 e0 ldi r25, 0x00 ; 0 + 476c: a0 e0 ldi r26, 0x00 ; 0 + 476e: b0 e0 ldi r27, 0x00 ; 0 + 4770: 48 2b or r20, r24 + 4772: 59 2b or r21, r25 + 4774: 6a 2b or r22, r26 * \return Next four bytes in the currently selected endpoint's FIFO buffer. */ static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Endpoint_Read_32_LE(void) { uint32_t Byte0 = Endpoint_Read_8(); - 4756: 7b 2b or r23, r27 - 4758: 8f 2d mov r24, r15 - 475a: 90 e0 ldi r25, 0x00 ; 0 - 475c: a0 e0 ldi r26, 0x00 ; 0 + 4776: 7b 2b or r23, r27 + 4778: 8f 2d mov r24, r15 + 477a: 90 e0 ldi r25, 0x00 ; 0 + 477c: a0 e0 ldi r26, 0x00 ; 0 uint32_t Byte1 = Endpoint_Read_8(); uint32_t Byte2 = Endpoint_Read_8(); uint32_t Byte3 = Endpoint_Read_8(); return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 475e: b0 e0 ldi r27, 0x00 ; 0 - 4760: ba 2f mov r27, r26 - 4762: a9 2f mov r26, r25 - 4764: 98 2f mov r25, r24 + 477e: b0 e0 ldi r27, 0x00 ; 0 + 4780: ba 2f mov r27, r26 + 4782: a9 2f mov r26, r25 + 4784: 98 2f mov r25, r24 */ static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Endpoint_Read_32_LE(void) { uint32_t Byte0 = Endpoint_Read_8(); uint32_t Byte1 = Endpoint_Read_8(); - 4766: 88 27 eor r24, r24 - 4768: 48 2b or r20, r24 - 476a: 59 2b or r21, r25 - 476c: 6a 2b or r22, r26 + 4786: 88 27 eor r24, r24 + 4788: 48 2b or r20, r24 + 478a: 59 2b or r21, r25 + 478c: 6a 2b or r22, r26 uint32_t Byte2 = Endpoint_Read_8(); uint32_t Byte3 = Endpoint_Read_8(); return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); - 476e: 7b 2b or r23, r27 - 4770: 4c 8b std Y+20, r20 ; 0x14 - 4772: 5d 8b std Y+21, r21 ; 0x15 - 4774: 6e 8b std Y+22, r22 ; 0x16 - 4776: 7f 8b std Y+23, r23 ; 0x17 - 4778: 84 dc rcall .-1784 ; 0x4082 - 477a: 88 8f std Y+24, r24 ; 0x18 - 477c: 82 dc rcall .-1788 ; 0x4082 + 478e: 7b 2b or r23, r27 + 4790: 4c 8b std Y+20, r20 ; 0x14 + 4792: 5d 8b std Y+21, r21 ; 0x15 + 4794: 6e 8b std Y+22, r22 ; 0x16 + 4796: 7f 8b std Y+23, r23 ; 0x17 + 4798: 84 dc rcall .-1784 ; 0x40a2 + 479a: 88 8f std Y+24, r24 ; 0x18 + 479c: 82 dc rcall .-1788 ; 0x40a2 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 477e: 89 8f std Y+25, r24 ; 0x19 - 4780: 80 dc rcall .-1792 ; 0x4082 - 4782: 8a 8f std Y+26, r24 ; 0x1a - 4784: 6f dc rcall .-1826 ; 0x4064 + 479e: 89 8f std Y+25, r24 ; 0x19 + 47a0: 80 dc rcall .-1792 ; 0x40a2 + 47a2: 8a 8f std Y+26, r24 ; 0x1a + 47a4: 6f dc rcall .-1826 ; 0x4084 CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 4786: 4d de rcall .-870 ; 0x4422 - 4788: ce 01 movw r24, r28 - 478a: 9e d1 rcall .+828 ; 0x4ac8 + 47a6: 4d de rcall .-870 ; 0x4442 + 47a8: ce 01 movw r24, r28 + 47aa: 9e d1 rcall .+828 ; 0x4ae8 CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 478c: a6 cf rjmp .-180 ; 0x46da - 478e: 82 32 cpi r24, 0x22 ; 34 - 4790: 61 f1 breq .+88 ; 0x47ea + 47ac: a6 cf rjmp .-180 ; 0x46fa + 47ae: 82 32 cpi r24, 0x22 ; 34 + 47b0: 61 f1 breq .+88 ; 0x480a CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 4792: 83 32 cpi r24, 0x23 ; 35 - 4794: 09 f0 breq .+2 ; 0x4798 - 4796: a1 cf rjmp .-190 ; 0x46da + 47b2: 83 32 cpi r24, 0x23 ; 35 + 47b4: 09 f0 breq .+2 ; 0x47b8 + 47b6: a1 cf rjmp .-190 ; 0x46fa Endpoint_ClearOUT(); - 4798: 80 91 25 23 lds r24, 0x2325 + 47b8: 80 91 25 23 lds r24, 0x2325 Endpoint_ClearStatusStage(); - 479c: 81 32 cpi r24, 0x21 ; 33 - 479e: 09 f0 breq .+2 ; 0x47a2 + 47bc: 81 32 cpi r24, 0x21 ; 33 + 47be: 09 f0 breq .+2 ; 0x47c2 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 47a0: 9c cf rjmp .-200 ; 0x46da - 47a2: e5 dc rcall .-1590 ; 0x416e - 47a4: 3e de rcall .-900 ; 0x4422 - 47a6: ce 01 movw r24, r28 + 47c0: 9c cf rjmp .-200 ; 0x46fa + 47c2: e5 dc rcall .-1590 ; 0x418e + 47c4: 3e de rcall .-900 ; 0x4442 + 47c6: ce 01 movw r24, r28 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) return; switch (USB_ControlRequest.bRequest) - 47a8: 60 91 27 23 lds r22, 0x2327 - 47ac: 8d d1 rcall .+794 ; 0x4ac8 - 47ae: 95 cf rjmp .-214 ; 0x46da - 47b0: 80 91 25 23 lds r24, 0x2325 + 47c8: 60 91 27 23 lds r22, 0x2327 + 47cc: 8d d1 rcall .+794 ; 0x4ae8 + 47ce: 95 cf rjmp .-214 ; 0x46fa + 47d0: 80 91 25 23 lds r24, 0x2325 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); } break; case CDC_REQ_SendBreak: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 47b4: 81 3a cpi r24, 0xA1 ; 161 - 47b6: 09 f0 breq .+2 ; 0x47ba - 47b8: 90 cf rjmp .-224 ; 0x46da - 47ba: d9 dc rcall .-1614 ; 0x416e + 47d4: 81 3a cpi r24, 0xA1 ; 161 + 47d6: 09 f0 breq .+2 ; 0x47da + 47d8: 90 cf rjmp .-224 ; 0x46fa + 47da: d9 dc rcall .-1614 ; 0x418e { Endpoint_ClearSETUP(); - 47bc: 34 dd rcall .-1432 ; 0x4226 - 47be: 88 23 and r24, r24 + 47dc: 34 dd rcall .-1432 ; 0x4246 + 47de: 88 23 and r24, r24 Endpoint_ClearStatusStage(); - 47c0: e9 f3 breq .-6 ; 0x47bc - 47c2: 8c 89 ldd r24, Y+20 ; 0x14 + 47e0: e9 f3 breq .-6 ; 0x47dc + 47e2: 8c 89 ldd r24, Y+20 ; 0x14 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 47c4: ed 88 ldd r14, Y+21 ; 0x15 - 47c6: fe 88 ldd r15, Y+22 ; 0x16 - 47c8: 0f 89 ldd r16, Y+23 ; 0x17 - 47ca: 6a dc rcall .-1836 ; 0x40a0 - 47cc: 8e 2d mov r24, r14 - 47ce: 68 dc rcall .-1840 ; 0x40a0 + 47e4: ed 88 ldd r14, Y+21 ; 0x15 + 47e6: fe 88 ldd r15, Y+22 ; 0x16 + 47e8: 0f 89 ldd r16, Y+23 ; 0x17 + 47ea: 6a dc rcall .-1836 ; 0x40c0 + 47ec: 8e 2d mov r24, r14 + 47ee: 68 dc rcall .-1840 ; 0x40c0 return; switch (USB_ControlRequest.bRequest) { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 47d0: 8f 2d mov r24, r15 - 47d2: 66 dc rcall .-1844 ; 0x40a0 - 47d4: 80 2f mov r24, r16 - 47d6: 64 dc rcall .-1848 ; 0x40a0 - 47d8: 88 8d ldd r24, Y+24 ; 0x18 + 47f0: 8f 2d mov r24, r15 + 47f2: 66 dc rcall .-1844 ; 0x40c0 + 47f4: 80 2f mov r24, r16 + 47f6: 64 dc rcall .-1848 ; 0x40c0 + 47f8: 88 8d ldd r24, Y+24 ; 0x18 { Endpoint_ClearSETUP(); - 47da: 62 dc rcall .-1852 ; 0x40a0 - 47dc: 89 8d ldd r24, Y+25 ; 0x19 + 47fa: 62 dc rcall .-1852 ; 0x40c0 + 47fc: 89 8d ldd r24, Y+25 ; 0x19 while (!(Endpoint_IsINReady())); - 47de: 60 dc rcall .-1856 ; 0x40a0 - 47e0: 8a 8d ldd r24, Y+26 ; 0x1a - 47e2: 5e dc rcall .-1860 ; 0x40a0 - 47e4: 26 dc rcall .-1972 ; 0x4032 + 47fe: 60 dc rcall .-1856 ; 0x40c0 + 4800: 8a 8d ldd r24, Y+26 ; 0x1a + 4802: 5e dc rcall .-1860 ; 0x40c0 + 4804: 26 dc rcall .-1972 ; 0x4052 Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 47e6: 1d de rcall .-966 ; 0x4422 - 47e8: 78 cf rjmp .-272 ; 0x46da - 47ea: 80 91 25 23 lds r24, 0x2325 + 4806: 1d de rcall .-966 ; 0x4442 + 4808: 78 cf rjmp .-272 ; 0x46fa + 480a: 80 91 25 23 lds r24, 0x2325 * \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); - 47ee: 81 32 cpi r24, 0x21 ; 33 - 47f0: 09 f0 breq .+2 ; 0x47f4 + 480e: 81 32 cpi r24, 0x21 ; 33 + 4810: 09 f0 breq .+2 ; 0x4814 Endpoint_Write_8(Data >> 8); - 47f2: 73 cf rjmp .-282 ; 0x46da - 47f4: bc dc rcall .-1672 ; 0x416e - 47f6: 15 de rcall .-982 ; 0x4422 + 4812: 73 cf rjmp .-282 ; 0x46fa + 4814: bc dc rcall .-1672 ; 0x418e + 4816: 15 de rcall .-982 ; 0x4442 Endpoint_Write_8(Data >> 16); - 47f8: 80 91 27 23 lds r24, 0x2327 - 47fc: 90 91 28 23 lds r25, 0x2328 + 4818: 80 91 27 23 lds r24, 0x2327 + 481c: 90 91 28 23 lds r25, 0x2328 Endpoint_Write_8(Data >> 24); - 4800: 88 8b std Y+16, r24 ; 0x10 - 4802: 99 8b std Y+17, r25 ; 0x11 + 4820: 88 8b std Y+16, r24 ; 0x10 + 4822: 99 8b std Y+17, r25 ; 0x11 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 4804: ce 01 movw r24, r28 - 4806: 60 d1 rcall .+704 ; 0x4ac8 - 4808: 68 cf rjmp .-304 ; 0x46da + 4824: ce 01 movw r24, r28 + 4826: 60 d1 rcall .+704 ; 0x4ae8 + 4828: 68 cf rjmp .-304 ; 0x46fa -0000480a : +0000482a : Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 480a: cf 93 push r28 - 480c: df 93 push r29 - 480e: ec 01 movw r28, r24 + 482a: cf 93 push r28 + 482c: df 93 push r29 + 482e: ec 01 movw r28, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 4810: 40 96 adiw r24, 0x10 ; 16 - 4812: fc 01 movw r30, r24 - 4814: 8b e0 ldi r24, 0x0B ; 11 + 4830: 40 96 adiw r24, 0x10 ; 16 + 4832: fc 01 movw r30, r24 + 4834: 8b e0 ldi r24, 0x0B ; 11 Endpoint_ClearIN(); - 4816: df 01 movw r26, r30 - 4818: 1d 92 st X+, r1 + 4836: df 01 movw r26, r30 + 4838: 1d 92 st X+, r1 Endpoint_ClearStatusStage(); - 481a: 8a 95 dec r24 - 481c: e9 f7 brne .-6 ; 0x4818 - 481e: 82 e0 ldi r24, 0x02 ; 2 + 483a: 8a 95 dec r24 + 483c: e9 f7 brne .-6 ; 0x4838 + 483e: 82 e0 ldi r24, 0x02 ; 2 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); } break; case CDC_REQ_SetControlLineState: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 4820: 8c 83 std Y+4, r24 ; 0x04 - 4822: 89 87 std Y+9, r24 ; 0x09 - 4824: 83 e0 ldi r24, 0x03 ; 3 - 4826: 8e 87 std Y+14, r24 ; 0x0e - 4828: ce 01 movw r24, r28 + 4840: 8c 83 std Y+4, r24 ; 0x04 + 4842: 89 87 std Y+9, r24 ; 0x09 + 4844: 83 e0 ldi r24, 0x03 ; 3 + 4846: 8e 87 std Y+14, r24 ; 0x0e + 4848: ce 01 movw r24, r28 { Endpoint_ClearSETUP(); - 482a: 01 96 adiw r24, 0x01 ; 1 - 482c: 61 e0 ldi r22, 0x01 ; 1 + 484a: 01 96 adiw r24, 0x01 ; 1 + 484c: 61 e0 ldi r22, 0x01 ; 1 Endpoint_ClearStatusStage(); - 482e: 55 dd rcall .-1366 ; 0x42da - 4830: 88 23 and r24, r24 + 484e: 55 dd rcall .-1366 ; 0x42fa + 4850: 88 23 and r24, r24 CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 4832: 21 f4 brne .+8 ; 0x483c - 4834: 80 e0 ldi r24, 0x00 ; 0 - 4836: df 91 pop r29 - 4838: cf 91 pop r28 - 483a: 08 95 ret - 483c: ce 01 movw r24, r28 + 4852: 21 f4 brne .+8 ; 0x485c + 4854: 80 e0 ldi r24, 0x00 ; 0 + 4856: df 91 pop r29 + 4858: cf 91 pop r28 + 485a: 08 95 ret + 485c: ce 01 movw r24, r28 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 483e: 06 96 adiw r24, 0x06 ; 6 - 4840: 61 e0 ldi r22, 0x01 ; 1 - 4842: 4b dd rcall .-1386 ; 0x42da - 4844: 88 23 and r24, r24 + 485e: 06 96 adiw r24, 0x06 ; 6 + 4860: 61 e0 ldi r22, 0x01 ; 1 + 4862: 4b dd rcall .-1386 ; 0x42fa + 4864: 88 23 and r24, r24 CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) - 4846: b1 f3 breq .-20 ; 0x4834 - 4848: ce 01 movw r24, r28 - 484a: 0b 96 adiw r24, 0x0b ; 11 + 4866: b1 f3 breq .-20 ; 0x4854 + 4868: ce 01 movw r24, r28 + 486a: 0b 96 adiw r24, 0x0b ; 11 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) - 484c: 61 e0 ldi r22, 0x01 ; 1 - 484e: 45 dd rcall .-1398 ; 0x42da - 4850: df 91 pop r29 - 4852: cf 91 pop r28 - 4854: 08 95 ret + 486c: 61 e0 ldi r22, 0x01 ; 1 + 486e: 45 dd rcall .-1398 ; 0x42fa + 4870: df 91 pop r29 + 4872: cf 91 pop r28 + 4874: 08 95 ret -00004856 : +00004876 : return false; return true; } - 4856: cf 93 push r28 - 4858: df 93 push r29 - 485a: eb 01 movw r28, r22 + 4876: cf 93 push r28 + 4878: df 93 push r29 + 487a: eb 01 movw r28, r22 } uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const char* const String) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 485c: 20 91 24 23 lds r18, 0x2324 - 4860: 24 30 cpi r18, 0x04 ; 4 - 4862: 21 f0 breq .+8 ; 0x486c + 487c: 20 91 24 23 lds r18, 0x2324 + 4880: 24 30 cpi r18, 0x04 ; 4 + 4882: 21 f0 breq .+8 ; 0x488c return ENDPOINT_RWSTREAM_DeviceDisconnected; - 4864: 82 e0 ldi r24, 0x02 ; 2 + 4884: 82 e0 ldi r24, 0x02 ; 2 Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); return Endpoint_Write_Stream_LE(String, strlen(String), NULL); } - 4866: df 91 pop r29 - 4868: cf 91 pop r28 - 486a: 08 95 ret + 4886: df 91 pop r29 + 4888: cf 91 pop r28 + 488a: 08 95 ret } uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const char* const String) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 486c: fc 01 movw r30, r24 - 486e: 44 89 ldd r20, Z+20 ; 0x14 - 4870: 55 89 ldd r21, Z+21 ; 0x15 - 4872: 66 89 ldd r22, Z+22 ; 0x16 - 4874: 77 89 ldd r23, Z+23 ; 0x17 - 4876: 41 15 cp r20, r1 - 4878: 51 05 cpc r21, r1 - 487a: 61 05 cpc r22, r1 - 487c: 71 05 cpc r23, r1 - 487e: 91 f3 breq .-28 ; 0x4864 + 488c: fc 01 movw r30, r24 + 488e: 44 89 ldd r20, Z+20 ; 0x14 + 4890: 55 89 ldd r21, Z+21 ; 0x15 + 4892: 66 89 ldd r22, Z+22 ; 0x16 + 4894: 77 89 ldd r23, Z+23 ; 0x17 + 4896: 41 15 cp r20, r1 + 4898: 51 05 cpc r21, r1 + 489a: 61 05 cpc r22, r1 + 489c: 71 05 cpc r23, r1 + 489e: 91 f3 breq .-28 ; 0x4884 return ENDPOINT_RWSTREAM_DeviceDisconnected; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 4880: 81 81 ldd r24, Z+1 ; 0x01 - 4882: 1d dc rcall .-1990 ; 0x40be - 4884: fe 01 movw r30, r28 + 48a0: 81 81 ldd r24, Z+1 ; 0x01 + 48a2: 1d dc rcall .-1990 ; 0x40de + 48a4: fe 01 movw r30, r28 return Endpoint_Write_Stream_LE(String, strlen(String), NULL); - 4886: 01 90 ld r0, Z+ - 4888: 00 20 and r0, r0 - 488a: e9 f7 brne .-6 ; 0x4886 - 488c: 31 97 sbiw r30, 0x01 ; 1 - 488e: ec 1b sub r30, r28 - 4890: fd 0b sbc r31, r29 - 4892: ce 01 movw r24, r28 - 4894: bf 01 movw r22, r30 - 4896: 40 e0 ldi r20, 0x00 ; 0 - 4898: 50 e0 ldi r21, 0x00 ; 0 - 489a: 0a da rcall .-3052 ; 0x3cb0 - 489c: e4 cf rjmp .-56 ; 0x4866 + 48a6: 01 90 ld r0, Z+ + 48a8: 00 20 and r0, r0 + 48aa: e9 f7 brne .-6 ; 0x48a6 + 48ac: 31 97 sbiw r30, 0x01 ; 1 + 48ae: ec 1b sub r30, r28 + 48b0: fd 0b sbc r31, r29 + 48b2: ce 01 movw r24, r28 + 48b4: bf 01 movw r22, r30 + 48b6: 40 e0 ldi r20, 0x00 ; 0 + 48b8: 50 e0 ldi r21, 0x00 ; 0 + 48ba: 0a da rcall .-3052 ; 0x3cd0 + 48bc: e4 cf rjmp .-56 ; 0x4886 -0000489e : - 489e: 0f 93 push r16 - 48a0: 1f 93 push r17 +000048be : + 48be: 0f 93 push r16 + 48c0: 1f 93 push r17 } uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const void* const Buffer, const uint16_t Length) { - 48a2: cf 93 push r28 - 48a4: df 93 push r29 - 48a6: 8b 01 movw r16, r22 - 48a8: ea 01 movw r28, r20 + 48c2: cf 93 push r28 + 48c4: df 93 push r29 + 48c6: 8b 01 movw r16, r22 + 48c8: ea 01 movw r28, r20 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 48aa: 20 91 24 23 lds r18, 0x2324 - 48ae: 24 30 cpi r18, 0x04 ; 4 - 48b0: 31 f0 breq .+12 ; 0x48be + 48ca: 20 91 24 23 lds r18, 0x2324 + 48ce: 24 30 cpi r18, 0x04 ; 4 + 48d0: 31 f0 breq .+12 ; 0x48de return ENDPOINT_RWSTREAM_DeviceDisconnected; - 48b2: 82 e0 ldi r24, 0x02 ; 2 + 48d2: 82 e0 ldi r24, 0x02 ; 2 Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); return Endpoint_Write_Stream_LE(Buffer, Length, NULL); } - 48b4: df 91 pop r29 - 48b6: cf 91 pop r28 - 48b8: 1f 91 pop r17 - 48ba: 0f 91 pop r16 - 48bc: 08 95 ret + 48d4: df 91 pop r29 + 48d6: cf 91 pop r28 + 48d8: 1f 91 pop r17 + 48da: 0f 91 pop r16 + 48dc: 08 95 ret uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const void* const Buffer, const uint16_t Length) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 48be: fc 01 movw r30, r24 - 48c0: 44 89 ldd r20, Z+20 ; 0x14 - 48c2: 55 89 ldd r21, Z+21 ; 0x15 - 48c4: 66 89 ldd r22, Z+22 ; 0x16 - 48c6: 77 89 ldd r23, Z+23 ; 0x17 - 48c8: 41 15 cp r20, r1 - 48ca: 51 05 cpc r21, r1 - 48cc: 61 05 cpc r22, r1 - 48ce: 71 05 cpc r23, r1 - 48d0: 81 f3 breq .-32 ; 0x48b2 + 48de: fc 01 movw r30, r24 + 48e0: 44 89 ldd r20, Z+20 ; 0x14 + 48e2: 55 89 ldd r21, Z+21 ; 0x15 + 48e4: 66 89 ldd r22, Z+22 ; 0x16 + 48e6: 77 89 ldd r23, Z+23 ; 0x17 + 48e8: 41 15 cp r20, r1 + 48ea: 51 05 cpc r21, r1 + 48ec: 61 05 cpc r22, r1 + 48ee: 71 05 cpc r23, r1 + 48f0: 81 f3 breq .-32 ; 0x48d2 return ENDPOINT_RWSTREAM_DeviceDisconnected; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 48d2: 81 81 ldd r24, Z+1 ; 0x01 - 48d4: f4 db rcall .-2072 ; 0x40be - 48d6: c8 01 movw r24, r16 + 48f2: 81 81 ldd r24, Z+1 ; 0x01 + 48f4: f4 db rcall .-2072 ; 0x40de + 48f6: c8 01 movw r24, r16 return Endpoint_Write_Stream_LE(Buffer, Length, NULL); - 48d8: be 01 movw r22, r28 - 48da: 40 e0 ldi r20, 0x00 ; 0 - 48dc: 50 e0 ldi r21, 0x00 ; 0 - 48de: e8 d9 rcall .-3120 ; 0x3cb0 - 48e0: e9 cf rjmp .-46 ; 0x48b4 + 48f8: be 01 movw r22, r28 + 48fa: 40 e0 ldi r20, 0x00 ; 0 + 48fc: 50 e0 ldi r21, 0x00 ; 0 + 48fe: e8 d9 rcall .-3120 ; 0x3cd0 + 4900: e9 cf rjmp .-46 ; 0x48d4 -000048e2 : - 48e2: cf 93 push r28 - 48e4: c6 2f mov r28, r22 +00004902 : + 4902: cf 93 push r28 + 4904: c6 2f mov r28, r22 } uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 48e6: 20 91 24 23 lds r18, 0x2324 - 48ea: 24 30 cpi r18, 0x04 ; 4 - 48ec: 19 f0 breq .+6 ; 0x48f4 + 4906: 20 91 24 23 lds r18, 0x2324 + 490a: 24 30 cpi r18, 0x04 ; 4 + 490c: 19 f0 breq .+6 ; 0x4914 return ENDPOINT_RWSTREAM_DeviceDisconnected; - 48ee: 82 e0 ldi r24, 0x02 ; 2 + 490e: 82 e0 ldi r24, 0x02 ; 2 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; } - 48f0: cf 91 pop r28 - 48f2: 08 95 ret + 4910: cf 91 pop r28 + 4912: 08 95 ret } uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 48f4: fc 01 movw r30, r24 - 48f6: 44 89 ldd r20, Z+20 ; 0x14 - 48f8: 55 89 ldd r21, Z+21 ; 0x15 - 48fa: 66 89 ldd r22, Z+22 ; 0x16 - 48fc: 77 89 ldd r23, Z+23 ; 0x17 - 48fe: 41 15 cp r20, r1 - 4900: 51 05 cpc r21, r1 - 4902: 61 05 cpc r22, r1 - 4904: 71 05 cpc r23, r1 - 4906: 99 f3 breq .-26 ; 0x48ee + 4914: fc 01 movw r30, r24 + 4916: 44 89 ldd r20, Z+20 ; 0x14 + 4918: 55 89 ldd r21, Z+21 ; 0x15 + 491a: 66 89 ldd r22, Z+22 ; 0x16 + 491c: 77 89 ldd r23, Z+23 ; 0x17 + 491e: 41 15 cp r20, r1 + 4920: 51 05 cpc r21, r1 + 4922: 61 05 cpc r22, r1 + 4924: 71 05 cpc r23, r1 + 4926: 99 f3 breq .-26 ; 0x490e return ENDPOINT_RWSTREAM_DeviceDisconnected; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 4908: 81 81 ldd r24, Z+1 ; 0x01 - 490a: d9 db rcall .-2126 ; 0x40be - 490c: 20 91 2d 23 lds r18, 0x232D + 4928: 81 81 ldd r24, Z+1 ; 0x01 + 492a: d9 db rcall .-2126 ; 0x40de + 492c: 20 91 2d 23 lds r18, 0x232D * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); - 4910: 30 91 2e 23 lds r19, 0x232E - 4914: f9 01 movw r30, r18 - 4916: ef 5b subi r30, 0xBF ; 191 - 4918: ff 4f sbci r31, 0xFF ; 255 - 491a: 90 81 ld r25, Z - 491c: 20 5c subi r18, 0xC0 ; 192 - 491e: 3f 4f sbci r19, 0xFF ; 255 - 4920: f9 01 movw r30, r18 - 4922: 80 81 ld r24, Z - 4924: 98 17 cp r25, r24 + 4930: 30 91 2e 23 lds r19, 0x232E + 4934: f9 01 movw r30, r18 + 4936: ef 5b subi r30, 0xBF ; 191 + 4938: ff 4f sbci r31, 0xFF ; 255 + 493a: 90 81 ld r25, Z + 493c: 20 5c subi r18, 0xC0 ; 192 + 493e: 3f 4f sbci r19, 0xFF ; 255 + 4940: f9 01 movw r30, r18 + 4942: 80 81 ld r24, Z + 4944: 98 17 cp r25, r24 if (!(Endpoint_IsReadWriteAllowed())) - 4926: 20 f0 brcs .+8 ; 0x4930 - 4928: 84 db rcall .-2296 ; 0x4032 + 4946: 20 f0 brcs .+8 ; 0x4950 + 4948: 84 db rcall .-2296 ; 0x4052 { Endpoint_ClearIN(); - 492a: 91 dd rcall .-1246 ; 0x444e - 492c: 88 23 and r24, r24 + 494a: 91 dd rcall .-1246 ; 0x446e + 494c: 88 23 and r24, r24 uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 492e: 01 f7 brne .-64 ; 0x48f0 - 4930: 8c 2f mov r24, r28 - 4932: b6 db rcall .-2196 ; 0x40a0 - 4934: 80 e0 ldi r24, 0x00 ; 0 + 494e: 01 f7 brne .-64 ; 0x4910 + 4950: 8c 2f mov r24, r28 + 4952: b6 db rcall .-2196 ; 0x40c0 + 4954: 80 e0 ldi r24, 0x00 ; 0 return ErrorCode; } Endpoint_Write_8(Data); - 4936: dc cf rjmp .-72 ; 0x48f0 + 4956: dc cf rjmp .-72 ; 0x4910 -00004938 : - 4938: 0f 93 push r16 - 493a: 1f 93 push r17 +00004958 : + 4958: 0f 93 push r16 + 495a: 1f 93 push r17 return ENDPOINT_READYWAIT_NoError; - 493c: cf 93 push r28 - 493e: df 93 push r29 + 495c: cf 93 push r28 + 495e: df 93 push r29 } uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 4940: 0f 92 push r0 - 4942: cd b7 in r28, 0x3d ; 61 - 4944: de b7 in r29, 0x3e ; 62 + 4960: 0f 92 push r0 + 4962: cd b7 in r28, 0x3d ; 61 + 4964: de b7 in r29, 0x3e ; 62 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 4946: 20 91 24 23 lds r18, 0x2324 - 494a: 24 30 cpi r18, 0x04 ; 4 - 494c: 39 f0 breq .+14 ; 0x495c + 4966: 20 91 24 23 lds r18, 0x2324 + 496a: 24 30 cpi r18, 0x04 ; 4 + 496c: 39 f0 breq .+14 ; 0x497c return ENDPOINT_RWSTREAM_DeviceDisconnected; - 494e: 82 e0 ldi r24, 0x02 ; 2 + 496e: 82 e0 ldi r24, 0x02 ; 2 Endpoint_ClearIN(); } return ENDPOINT_READYWAIT_NoError; } - 4950: 0f 90 pop r0 - 4952: df 91 pop r29 - 4954: cf 91 pop r28 - 4956: 1f 91 pop r17 - 4958: 0f 91 pop r16 - 495a: 08 95 ret + 4970: 0f 90 pop r0 + 4972: df 91 pop r29 + 4974: cf 91 pop r28 + 4976: 1f 91 pop r17 + 4978: 0f 91 pop r16 + 497a: 08 95 ret return ENDPOINT_READYWAIT_NoError; } uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 495c: fc 01 movw r30, r24 - 495e: 44 89 ldd r20, Z+20 ; 0x14 - 4960: 55 89 ldd r21, Z+21 ; 0x15 - 4962: 66 89 ldd r22, Z+22 ; 0x16 - 4964: 77 89 ldd r23, Z+23 ; 0x17 - 4966: 41 15 cp r20, r1 - 4968: 51 05 cpc r21, r1 - 496a: 61 05 cpc r22, r1 - 496c: 71 05 cpc r23, r1 - 496e: 79 f3 breq .-34 ; 0x494e + 497c: fc 01 movw r30, r24 + 497e: 44 89 ldd r20, Z+20 ; 0x14 + 4980: 55 89 ldd r21, Z+21 ; 0x15 + 4982: 66 89 ldd r22, Z+22 ; 0x16 + 4984: 77 89 ldd r23, Z+23 ; 0x17 + 4986: 41 15 cp r20, r1 + 4988: 51 05 cpc r21, r1 + 498a: 61 05 cpc r22, r1 + 498c: 71 05 cpc r23, r1 + 498e: 79 f3 breq .-34 ; 0x496e return ENDPOINT_RWSTREAM_DeviceDisconnected; uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 4970: 81 81 ldd r24, Z+1 ; 0x01 - 4972: a5 db rcall .-2230 ; 0x40be - 4974: 80 91 31 23 lds r24, 0x2331 + 4990: 81 81 ldd r24, Z+1 ; 0x01 + 4992: a5 db rcall .-2230 ; 0x40de + 4994: 80 91 31 23 lds r24, 0x2331 * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4978: 20 91 2d 23 lds r18, 0x232D + 4998: 20 91 2d 23 lds r18, 0x232D return USB_Endpoint_SelectedFIFO->Position; - 497c: 30 91 2e 23 lds r19, 0x232E - 4980: f9 01 movw r30, r18 - 4982: 87 fd sbrc r24, 7 + 499c: 30 91 2e 23 lds r19, 0x232E + 49a0: f9 01 movw r30, r18 + 49a2: 87 fd sbrc r24, 7 * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4984: 1d c0 rjmp .+58 ; 0x49c0 - 4986: e0 5c subi r30, 0xC0 ; 192 + 49a4: 1d c0 rjmp .+58 ; 0x49e0 + 49a6: e0 5c subi r30, 0xC0 ; 192 return USB_Endpoint_SelectedFIFO->Position; else return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 4988: ff 4f sbci r31, 0xFF ; 255 - 498a: 80 81 ld r24, Z - 498c: f9 01 movw r30, r18 - 498e: ef 5b subi r30, 0xBF ; 191 - 4990: ff 4f sbci r31, 0xFF ; 255 - 4992: 40 81 ld r20, Z - 4994: 90 e0 ldi r25, 0x00 ; 0 - 4996: 84 1b sub r24, r20 - 4998: 91 09 sbc r25, r1 - 499a: 00 97 sbiw r24, 0x00 ; 0 + 49a8: ff 4f sbci r31, 0xFF ; 255 + 49aa: 80 81 ld r24, Z + 49ac: f9 01 movw r30, r18 + 49ae: ef 5b subi r30, 0xBF ; 191 + 49b0: ff 4f sbci r31, 0xFF ; 255 + 49b2: 40 81 ld r20, Z + 49b4: 90 e0 ldi r25, 0x00 ; 0 + 49b6: 84 1b sub r24, r20 + 49b8: 91 09 sbc r25, r1 + 49ba: 00 97 sbiw r24, 0x00 ; 0 if (!(Endpoint_BytesInEndpoint())) - 499c: 11 f4 brne .+4 ; 0x49a2 - 499e: 80 e0 ldi r24, 0x00 ; 0 + 49bc: 11 f4 brne .+4 ; 0x49c2 + 49be: 80 e0 ldi r24, 0x00 ; 0 return ErrorCode; Endpoint_ClearIN(); } return ENDPOINT_READYWAIT_NoError; - 49a0: d7 cf rjmp .-82 ; 0x4950 - 49a2: 00 81 ld r16, Z + 49c0: d7 cf rjmp .-82 ; 0x4970 + 49c2: 00 81 ld r16, Z * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); - 49a4: 20 5c subi r18, 0xC0 ; 192 - 49a6: 3f 4f sbci r19, 0xFF ; 255 - 49a8: f9 01 movw r30, r18 - 49aa: 10 81 ld r17, Z - 49ac: 42 db rcall .-2428 ; 0x4032 + 49c4: 20 5c subi r18, 0xC0 ; 192 + 49c6: 3f 4f sbci r19, 0xFF ; 255 + 49c8: f9 01 movw r30, r18 + 49ca: 10 81 ld r17, Z + 49cc: 42 db rcall .-2428 ; 0x4052 if (!(Endpoint_BytesInEndpoint())) return ENDPOINT_READYWAIT_NoError; bool BankFull = !(Endpoint_IsReadWriteAllowed()); Endpoint_ClearIN(); - 49ae: 01 17 cp r16, r17 - 49b0: b0 f3 brcs .-20 ; 0x499e + 49ce: 01 17 cp r16, r17 + 49d0: b0 f3 brcs .-20 ; 0x49be if (BankFull) - 49b2: 4d dd rcall .-1382 ; 0x444e - 49b4: 88 23 and r24, r24 + 49d2: 4d dd rcall .-1382 ; 0x446e + 49d4: 88 23 and r24, r24 { if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 49b6: 61 f6 brne .-104 ; 0x4950 - 49b8: 89 83 std Y+1, r24 ; 0x01 - 49ba: 3b db rcall .-2442 ; 0x4032 - 49bc: 89 81 ldd r24, Y+1 ; 0x01 + 49d6: 61 f6 brne .-104 ; 0x4970 + 49d8: 89 83 std Y+1, r24 ; 0x01 + 49da: 3b db rcall .-2442 ; 0x4052 + 49dc: 89 81 ldd r24, Y+1 ; 0x01 return ErrorCode; Endpoint_ClearIN(); - 49be: c8 cf rjmp .-112 ; 0x4950 - 49c0: ef 5b subi r30, 0xBF ; 191 - 49c2: ff 4f sbci r31, 0xFF ; 255 - 49c4: 80 81 ld r24, Z - 49c6: 90 e0 ldi r25, 0x00 ; 0 + 49de: c8 cf rjmp .-112 ; 0x4970 + 49e0: ef 5b subi r30, 0xBF ; 191 + 49e2: ff 4f sbci r31, 0xFF ; 255 + 49e4: 80 81 ld r24, Z + 49e6: 90 e0 ldi r25, 0x00 ; 0 */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) return USB_Endpoint_SelectedFIFO->Position; - 49c8: e8 cf rjmp .-48 ; 0x499a + 49e8: e8 cf rjmp .-48 ; 0x49ba -000049ca : - 49ca: cf 93 push r28 - 49cc: df 93 push r29 - 49ce: ec 01 movw r28, r24 - 49d0: 80 91 24 23 lds r24, 0x2324 +000049ea : + 49ea: cf 93 push r28 + 49ec: df 93 push r29 + 49ee: ec 01 movw r28, r24 + 49f0: 80 91 24 23 lds r24, 0x2324 return true; } void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 49d4: 84 30 cpi r24, 0x04 ; 4 - 49d6: 19 f0 breq .+6 ; 0x49de + 49f4: 84 30 cpi r24, 0x04 ; 4 + 49f6: 19 f0 breq .+6 ; 0x49fe Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (Endpoint_IsINReady()) CDC_Device_Flush(CDCInterfaceInfo); #endif } - 49d8: df 91 pop r29 - 49da: cf 91 pop r28 - 49dc: 08 95 ret + 49f8: df 91 pop r29 + 49fa: cf 91 pop r28 + 49fc: 08 95 ret return true; } void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 49de: 8c 89 ldd r24, Y+20 ; 0x14 - 49e0: 9d 89 ldd r25, Y+21 ; 0x15 - 49e2: ae 89 ldd r26, Y+22 ; 0x16 - 49e4: bf 89 ldd r27, Y+23 ; 0x17 - 49e6: 00 97 sbiw r24, 0x00 ; 0 - 49e8: a1 05 cpc r26, r1 - 49ea: b1 05 cpc r27, r1 - 49ec: a9 f3 breq .-22 ; 0x49d8 + 49fe: 8c 89 ldd r24, Y+20 ; 0x14 + 4a00: 9d 89 ldd r25, Y+21 ; 0x15 + 4a02: ae 89 ldd r26, Y+22 ; 0x16 + 4a04: bf 89 ldd r27, Y+23 ; 0x17 + 4a06: 00 97 sbiw r24, 0x00 ; 0 + 4a08: a1 05 cpc r26, r1 + 4a0a: b1 05 cpc r27, r1 + 4a0c: a9 f3 breq .-22 ; 0x49f8 return; #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); - 49ee: 89 81 ldd r24, Y+1 ; 0x01 - 49f0: 66 db rcall .-2356 ; 0x40be - 49f2: 19 dc rcall .-1998 ; 0x4226 + 4a0e: 89 81 ldd r24, Y+1 ; 0x01 + 4a10: 66 db rcall .-2356 ; 0x40de + 4a12: 19 dc rcall .-1998 ; 0x4246 if (Endpoint_IsINReady()) - 49f4: 88 23 and r24, r24 - 49f6: 81 f3 breq .-32 ; 0x49d8 - 49f8: ce 01 movw r24, r28 - 49fa: 9e df rcall .-196 ; 0x4938 + 4a14: 88 23 and r24, r24 + 4a16: 81 f3 breq .-32 ; 0x49f8 + 4a18: ce 01 movw r24, r28 + 4a1a: 9e df rcall .-196 ; 0x4958 CDC_Device_Flush(CDCInterfaceInfo); - 49fc: ed cf rjmp .-38 ; 0x49d8 + 4a1c: ed cf rjmp .-38 ; 0x49f8 -000049fe : - 49fe: cf 93 push r28 - 4a00: df 93 push r29 - 4a02: 00 d0 rcall .+0 ; 0x4a04 +00004a1e : + 4a1e: cf 93 push r28 + 4a20: df 93 push r29 + 4a22: 00 d0 rcall .+0 ; 0x4a24 return 0; } } int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 4a04: cd b7 in r28, 0x3d ; 61 - 4a06: de b7 in r29, 0x3e ; 62 - 4a08: fc 01 movw r30, r24 + 4a24: cd b7 in r28, 0x3d ; 61 + 4a26: de b7 in r29, 0x3e ; 62 + 4a28: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 4a0a: 80 91 24 23 lds r24, 0x2324 - 4a0e: 84 30 cpi r24, 0x04 ; 4 - 4a10: 09 f0 breq .+2 ; 0x4a14 - 4a12: 3e c0 rjmp .+124 ; 0x4a90 - 4a14: 44 89 ldd r20, Z+20 ; 0x14 - 4a16: 55 89 ldd r21, Z+21 ; 0x15 - 4a18: 66 89 ldd r22, Z+22 ; 0x16 - 4a1a: 77 89 ldd r23, Z+23 ; 0x17 - 4a1c: 41 15 cp r20, r1 - 4a1e: 51 05 cpc r21, r1 - 4a20: 61 05 cpc r22, r1 - 4a22: 71 05 cpc r23, r1 - 4a24: a9 f1 breq .+106 ; 0x4a90 + 4a2a: 80 91 24 23 lds r24, 0x2324 + 4a2e: 84 30 cpi r24, 0x04 ; 4 + 4a30: 09 f0 breq .+2 ; 0x4a34 + 4a32: 3e c0 rjmp .+124 ; 0x4ab0 + 4a34: 44 89 ldd r20, Z+20 ; 0x14 + 4a36: 55 89 ldd r21, Z+21 ; 0x15 + 4a38: 66 89 ldd r22, Z+22 ; 0x16 + 4a3a: 77 89 ldd r23, Z+23 ; 0x17 + 4a3c: 41 15 cp r20, r1 + 4a3e: 51 05 cpc r21, r1 + 4a40: 61 05 cpc r22, r1 + 4a42: 71 05 cpc r23, r1 + 4a44: a9 f1 breq .+106 ; 0x4ab0 return -1; int16_t ReceivedByte = -1; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); - 4a26: 86 81 ldd r24, Z+6 ; 0x06 - 4a28: 4a db rcall .-2412 ; 0x40be - 4a2a: e5 db rcall .-2102 ; 0x41f6 + 4a46: 86 81 ldd r24, Z+6 ; 0x06 + 4a48: 4a db rcall .-2412 ; 0x40de + 4a4a: e5 db rcall .-2102 ; 0x4216 if (Endpoint_IsOUTReceived()) - 4a2c: 88 23 and r24, r24 - 4a2e: 81 f1 breq .+96 ; 0x4a90 - 4a30: 80 91 31 23 lds r24, 0x2331 + 4a4c: 88 23 and r24, r24 + 4a4e: 81 f1 breq .+96 ; 0x4ab0 + 4a50: 80 91 31 23 lds r24, 0x2331 * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4a34: 20 91 2d 23 lds r18, 0x232D + 4a54: 20 91 2d 23 lds r18, 0x232D return USB_Endpoint_SelectedFIFO->Position; - 4a38: 30 91 2e 23 lds r19, 0x232E - 4a3c: f9 01 movw r30, r18 - 4a3e: 87 fd sbrc r24, 7 - 4a40: 3e c0 rjmp .+124 ; 0x4abe + 4a58: 30 91 2e 23 lds r19, 0x232E + 4a5c: f9 01 movw r30, r18 + 4a5e: 87 fd sbrc r24, 7 + 4a60: 3e c0 rjmp .+124 ; 0x4ade * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4a42: e0 5c subi r30, 0xC0 ; 192 - 4a44: ff 4f sbci r31, 0xFF ; 255 + 4a62: e0 5c subi r30, 0xC0 ; 192 + 4a64: ff 4f sbci r31, 0xFF ; 255 return USB_Endpoint_SelectedFIFO->Position; else return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 4a46: 80 81 ld r24, Z - 4a48: f9 01 movw r30, r18 - 4a4a: ef 5b subi r30, 0xBF ; 191 - 4a4c: ff 4f sbci r31, 0xFF ; 255 - 4a4e: 40 81 ld r20, Z - 4a50: 90 e0 ldi r25, 0x00 ; 0 - 4a52: 84 1b sub r24, r20 - 4a54: 91 09 sbc r25, r1 - 4a56: 00 97 sbiw r24, 0x00 ; 0 - 4a58: 11 f5 brne .+68 ; 0x4a9e - { - if (Endpoint_BytesInEndpoint()) - 4a5a: 8f ef ldi r24, 0xFF ; 255 - 4a5c: 9f ef ldi r25, 0xFF ; 255 -int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - return -1; - - int16_t ReceivedByte = -1; - 4a5e: 40 91 31 23 lds r20, 0x2331 - * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. - */ - static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint16_t Endpoint_BytesInEndpoint(void) - { - if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4a62: 47 fd sbrc r20, 7 - 4a64: 29 c0 rjmp .+82 ; 0x4ab8 - 4a66: 20 5c subi r18, 0xC0 ; 192 - 4a68: 3f 4f sbci r19, 0xFF ; 255 - return USB_Endpoint_SelectedFIFO->Position; - else - return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); - 4a6a: d9 01 movw r26, r18 - 4a6c: 2c 91 ld r18, X + 4a66: 80 81 ld r24, Z + 4a68: f9 01 movw r30, r18 + 4a6a: ef 5b subi r30, 0xBF ; 191 + 4a6c: ff 4f sbci r31, 0xFF ; 255 4a6e: 40 81 ld r20, Z - 4a70: 30 e0 ldi r19, 0x00 ; 0 - 4a72: 24 1b sub r18, r20 - 4a74: 31 09 sbc r19, r1 - 4a76: 21 15 cp r18, r1 - 4a78: 31 05 cpc r19, r1 - if (Endpoint_IsOUTReceived()) + 4a70: 90 e0 ldi r25, 0x00 ; 0 + 4a72: 84 1b sub r24, r20 + 4a74: 91 09 sbc r25, r1 + 4a76: 00 97 sbiw r24, 0x00 ; 0 + 4a78: 11 f5 brne .+68 ; 0x4abe { if (Endpoint_BytesInEndpoint()) - ReceivedByte = Endpoint_Read_8(); - - if (!(Endpoint_BytesInEndpoint())) - 4a7a: 61 f4 brne .+24 ; 0x4a94 - 4a7c: 89 83 std Y+1, r24 ; 0x01 - 4a7e: 9a 83 std Y+2, r25 ; 0x02 - Endpoint_ClearOUT(); - 4a80: f1 da rcall .-2590 ; 0x4064 - 4a82: 89 81 ldd r24, Y+1 ; 0x01 - 4a84: 9a 81 ldd r25, Y+2 ; 0x02 - 4a86: 0f 90 pop r0 - 4a88: 0f 90 pop r0 - 4a8a: df 91 pop r29 - } - - return ReceivedByte; -} - 4a8c: cf 91 pop r28 - 4a8e: 08 95 ret - 4a90: 8f ef ldi r24, 0xFF ; 255 - 4a92: 9f ef ldi r25, 0xFF ; 255 - 4a94: 0f 90 pop r0 + 4a7a: 8f ef ldi r24, 0xFF ; 255 + 4a7c: 9f ef ldi r25, 0xFF ; 255 int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return -1; int16_t ReceivedByte = -1; - 4a96: 0f 90 pop r0 - 4a98: df 91 pop r29 - if (!(Endpoint_BytesInEndpoint())) - Endpoint_ClearOUT(); - } - - return ReceivedByte; -} - 4a9a: cf 91 pop r28 - 4a9c: 08 95 ret - 4a9e: f1 da rcall .-2590 ; 0x4082 - 4aa0: 90 e0 ldi r25, 0x00 ; 0 - 4aa2: 20 91 2d 23 lds r18, 0x232D - Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); - - if (Endpoint_IsOUTReceived()) - { - if (Endpoint_BytesInEndpoint()) - ReceivedByte = Endpoint_Read_8(); - 4aa6: 30 91 2e 23 lds r19, 0x232E - 4aaa: f9 01 movw r30, r18 - 4aac: ef 5b subi r30, 0xBF ; 191 - 4aae: ff 4f sbci r31, 0xFF ; 255 - 4ab0: 40 91 31 23 lds r20, 0x2331 - 4ab4: 47 ff sbrs r20, 7 - 4ab6: d7 cf rjmp .-82 ; 0x4a66 + 4a7e: 40 91 31 23 lds r20, 0x2331 * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. */ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) - 4ab8: 20 81 ld r18, Z - 4aba: 30 e0 ldi r19, 0x00 ; 0 - 4abc: dc cf rjmp .-72 ; 0x4a76 - 4abe: ef 5b subi r30, 0xBF ; 191 + 4a82: 47 fd sbrc r20, 7 + 4a84: 29 c0 rjmp .+82 ; 0x4ad8 + 4a86: 20 5c subi r18, 0xC0 ; 192 + 4a88: 3f 4f sbci r19, 0xFF ; 255 return USB_Endpoint_SelectedFIFO->Position; - 4ac0: ff 4f sbci r31, 0xFF ; 255 - 4ac2: 80 81 ld r24, Z - 4ac4: 90 e0 ldi r25, 0x00 ; 0 - 4ac6: c7 cf rjmp .-114 ; 0x4a56 + else + return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); + 4a8a: d9 01 movw r26, r18 + 4a8c: 2c 91 ld r18, X + 4a8e: 40 81 ld r20, Z + 4a90: 30 e0 ldi r19, 0x00 ; 0 + 4a92: 24 1b sub r18, r20 + 4a94: 31 09 sbc r19, r1 + 4a96: 21 15 cp r18, r1 + 4a98: 31 05 cpc r19, r1 + if (Endpoint_IsOUTReceived()) + { + if (Endpoint_BytesInEndpoint()) + ReceivedByte = Endpoint_Read_8(); -00004ac8 : - 4ac8: 08 95 ret + if (!(Endpoint_BytesInEndpoint())) + 4a9a: 61 f4 brne .+24 ; 0x4ab4 + 4a9c: 89 83 std Y+1, r24 ; 0x01 + 4a9e: 9a 83 std Y+2, r25 ; 0x02 + Endpoint_ClearOUT(); + 4aa0: f1 da rcall .-2590 ; 0x4084 + 4aa2: 89 81 ldd r24, Y+1 ; 0x01 + 4aa4: 9a 81 ldd r25, Y+2 ; 0x02 + 4aa6: 0f 90 pop r0 + 4aa8: 0f 90 pop r0 + 4aaa: df 91 pop r29 + } -00004aca <__mulsi3>: - 4aca: 62 9f mul r22, r18 - 4acc: d0 01 movw r26, r0 - 4ace: 73 9f mul r23, r19 - 4ad0: f0 01 movw r30, r0 - 4ad2: 82 9f mul r24, r18 - 4ad4: e0 0d add r30, r0 - 4ad6: f1 1d adc r31, r1 - 4ad8: 64 9f mul r22, r20 - 4ada: e0 0d add r30, r0 - 4adc: f1 1d adc r31, r1 - 4ade: 92 9f mul r25, r18 - 4ae0: f0 0d add r31, r0 - 4ae2: 83 9f mul r24, r19 - 4ae4: f0 0d add r31, r0 - 4ae6: 74 9f mul r23, r20 - 4ae8: f0 0d add r31, r0 - 4aea: 65 9f mul r22, r21 - 4aec: f0 0d add r31, r0 - 4aee: 99 27 eor r25, r25 - 4af0: 72 9f mul r23, r18 - 4af2: b0 0d add r27, r0 - 4af4: e1 1d adc r30, r1 - 4af6: f9 1f adc r31, r25 - 4af8: 63 9f mul r22, r19 - 4afa: b0 0d add r27, r0 - 4afc: e1 1d adc r30, r1 - 4afe: f9 1f adc r31, r25 - 4b00: bd 01 movw r22, r26 - 4b02: cf 01 movw r24, r30 - 4b04: 11 24 eor r1, r1 - 4b06: 08 95 ret + return ReceivedByte; +} + 4aac: cf 91 pop r28 + 4aae: 08 95 ret + 4ab0: 8f ef ldi r24, 0xFF ; 255 + 4ab2: 9f ef ldi r25, 0xFF ; 255 + 4ab4: 0f 90 pop r0 +int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return -1; -00004b08 : - 4b08: 8f 92 push r8 - 4b0a: 9f 92 push r9 - 4b0c: af 92 push r10 - 4b0e: bf 92 push r11 - 4b10: cf 92 push r12 - 4b12: df 92 push r13 - 4b14: ef 92 push r14 - 4b16: ff 92 push r15 - 4b18: cf 93 push r28 - 4b1a: df 93 push r29 - 4b1c: ec 01 movw r28, r24 - 4b1e: 88 81 ld r24, Y - 4b20: 99 81 ldd r25, Y+1 ; 0x01 - 4b22: aa 81 ldd r26, Y+2 ; 0x02 - 4b24: bb 81 ldd r27, Y+3 ; 0x03 - 4b26: 00 97 sbiw r24, 0x00 ; 0 - 4b28: a1 05 cpc r26, r1 - 4b2a: b1 05 cpc r27, r1 - 4b2c: 21 f4 brne .+8 ; 0x4b36 - 4b2e: 84 e2 ldi r24, 0x24 ; 36 - 4b30: 99 ed ldi r25, 0xD9 ; 217 - 4b32: ab e5 ldi r26, 0x5B ; 91 - 4b34: b7 e0 ldi r27, 0x07 ; 7 - 4b36: bc 01 movw r22, r24 - 4b38: cd 01 movw r24, r26 - 4b3a: 2d e1 ldi r18, 0x1D ; 29 - 4b3c: 33 ef ldi r19, 0xF3 ; 243 - 4b3e: 41 e0 ldi r20, 0x01 ; 1 - 4b40: 50 e0 ldi r21, 0x00 ; 0 - 4b42: 3d d3 rcall .+1658 ; 0x51be <__divmodsi4> - 4b44: 49 01 movw r8, r18 - 4b46: 5a 01 movw r10, r20 - 4b48: 27 ea ldi r18, 0xA7 ; 167 - 4b4a: 31 e4 ldi r19, 0x41 ; 65 - 4b4c: 40 e0 ldi r20, 0x00 ; 0 - 4b4e: 50 e0 ldi r21, 0x00 ; 0 - 4b50: bc df rcall .-136 ; 0x4aca <__mulsi3> - 4b52: 6b 01 movw r12, r22 - 4b54: 7c 01 movw r14, r24 - 4b56: c5 01 movw r24, r10 - 4b58: b4 01 movw r22, r8 - 4b5a: 2c ee ldi r18, 0xEC ; 236 - 4b5c: 34 ef ldi r19, 0xF4 ; 244 - 4b5e: 4f ef ldi r20, 0xFF ; 255 - 4b60: 5f ef ldi r21, 0xFF ; 255 - 4b62: b3 df rcall .-154 ; 0x4aca <__mulsi3> - 4b64: dc 01 movw r26, r24 - 4b66: cb 01 movw r24, r22 - 4b68: c8 0e add r12, r24 - 4b6a: d9 1e adc r13, r25 - 4b6c: ea 1e adc r14, r26 - 4b6e: fb 1e adc r15, r27 - 4b70: f7 fe sbrs r15, 7 - 4b72: 08 c0 rjmp .+16 ; 0x4b84 - 4b74: 8f ef ldi r24, 0xFF ; 255 - 4b76: 9f ef ldi r25, 0xFF ; 255 - 4b78: af ef ldi r26, 0xFF ; 255 - 4b7a: bf e7 ldi r27, 0x7F ; 127 - 4b7c: c8 0e add r12, r24 - 4b7e: d9 1e adc r13, r25 - 4b80: ea 1e adc r14, r26 - 4b82: fb 1e adc r15, r27 - 4b84: c8 82 st Y, r12 - 4b86: d9 82 std Y+1, r13 ; 0x01 - 4b88: ea 82 std Y+2, r14 ; 0x02 - 4b8a: fb 82 std Y+3, r15 ; 0x03 - 4b8c: c6 01 movw r24, r12 - 4b8e: 9f 77 andi r25, 0x7F ; 127 - 4b90: df 91 pop r29 - 4b92: cf 91 pop r28 - 4b94: ff 90 pop r15 - 4b96: ef 90 pop r14 - 4b98: df 90 pop r13 - 4b9a: cf 90 pop r12 - 4b9c: bf 90 pop r11 - 4b9e: af 90 pop r10 - 4ba0: 9f 90 pop r9 - 4ba2: 8f 90 pop r8 - 4ba4: 08 95 ret + int16_t ReceivedByte = -1; + 4ab6: 0f 90 pop r0 + 4ab8: df 91 pop r29 + if (!(Endpoint_BytesInEndpoint())) + Endpoint_ClearOUT(); + } -00004ba6 : - 4ba6: b0 cf rjmp .-160 ; 0x4b08 + return ReceivedByte; +} + 4aba: cf 91 pop r28 + 4abc: 08 95 ret + 4abe: f1 da rcall .-2590 ; 0x40a2 + 4ac0: 90 e0 ldi r25, 0x00 ; 0 + 4ac2: 20 91 2d 23 lds r18, 0x232D + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); -00004ba8 : - 4ba8: 8d e9 ldi r24, 0x9D ; 157 - 4baa: 90 e2 ldi r25, 0x20 ; 32 - 4bac: ad cf rjmp .-166 ; 0x4b08 + if (Endpoint_IsOUTReceived()) + { + if (Endpoint_BytesInEndpoint()) + ReceivedByte = Endpoint_Read_8(); + 4ac6: 30 91 2e 23 lds r19, 0x232E + 4aca: f9 01 movw r30, r18 + 4acc: ef 5b subi r30, 0xBF ; 191 + 4ace: ff 4f sbci r31, 0xFF ; 255 + 4ad0: 40 91 31 23 lds r20, 0x2331 + 4ad4: 47 ff sbrs r20, 7 + 4ad6: d7 cf rjmp .-82 ; 0x4a86 + * \return Total number of bytes in the currently selected Endpoint's FIFO buffer. + */ + static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Endpoint_BytesInEndpoint(void) + { + if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) + 4ad8: 20 81 ld r18, Z + 4ada: 30 e0 ldi r19, 0x00 ; 0 + 4adc: dc cf rjmp .-72 ; 0x4a96 + 4ade: ef 5b subi r30, 0xBF ; 191 + return USB_Endpoint_SelectedFIFO->Position; + 4ae0: ff 4f sbci r31, 0xFF ; 255 + 4ae2: 80 81 ld r24, Z + 4ae4: 90 e0 ldi r25, 0x00 ; 0 + 4ae6: c7 cf rjmp .-114 ; 0x4a76 -00004bae : - 4bae: a0 e0 ldi r26, 0x00 ; 0 - 4bb0: b0 e0 ldi r27, 0x00 ; 0 - 4bb2: 80 93 9d 20 sts 0x209D, r24 - 4bb6: 90 93 9e 20 sts 0x209E, r25 - 4bba: a0 93 9f 20 sts 0x209F, r26 - 4bbe: b0 93 a0 20 sts 0x20A0, r27 - 4bc2: 08 95 ret +00004ae8 : + 4ae8: 08 95 ret -00004bc4 : - 4bc4: fb 01 movw r30, r22 - 4bc6: dc 01 movw r26, r24 - 4bc8: 02 c0 rjmp .+4 ; 0x4bce - 4bca: 05 90 lpm r0, Z+ - 4bcc: 0d 92 st X+, r0 - 4bce: 41 50 subi r20, 0x01 ; 1 - 4bd0: 50 40 sbci r21, 0x00 ; 0 - 4bd2: d8 f7 brcc .-10 ; 0x4bca - 4bd4: 08 95 ret +00004aea <__mulsi3>: + 4aea: 62 9f mul r22, r18 + 4aec: d0 01 movw r26, r0 + 4aee: 73 9f mul r23, r19 + 4af0: f0 01 movw r30, r0 + 4af2: 82 9f mul r24, r18 + 4af4: e0 0d add r30, r0 + 4af6: f1 1d adc r31, r1 + 4af8: 64 9f mul r22, r20 + 4afa: e0 0d add r30, r0 + 4afc: f1 1d adc r31, r1 + 4afe: 92 9f mul r25, r18 + 4b00: f0 0d add r31, r0 + 4b02: 83 9f mul r24, r19 + 4b04: f0 0d add r31, r0 + 4b06: 74 9f mul r23, r20 + 4b08: f0 0d add r31, r0 + 4b0a: 65 9f mul r22, r21 + 4b0c: f0 0d add r31, r0 + 4b0e: 99 27 eor r25, r25 + 4b10: 72 9f mul r23, r18 + 4b12: b0 0d add r27, r0 + 4b14: e1 1d adc r30, r1 + 4b16: f9 1f adc r31, r25 + 4b18: 63 9f mul r22, r19 + 4b1a: b0 0d add r27, r0 + 4b1c: e1 1d adc r30, r1 + 4b1e: f9 1f adc r31, r25 + 4b20: bd 01 movw r22, r26 + 4b22: cf 01 movw r24, r30 + 4b24: 11 24 eor r1, r1 + 4b26: 08 95 ret -00004bd6 : - 4bd6: fb 01 movw r30, r22 - 4bd8: dc 01 movw r26, r24 - 4bda: 8d 91 ld r24, X+ - 4bdc: 05 90 lpm r0, Z+ - 4bde: 80 19 sub r24, r0 - 4be0: 01 10 cpse r0, r1 - 4be2: d9 f3 breq .-10 ; 0x4bda - 4be4: 99 0b sbc r25, r25 - 4be6: 08 95 ret +00004b28 : + 4b28: 8f 92 push r8 + 4b2a: 9f 92 push r9 + 4b2c: af 92 push r10 + 4b2e: bf 92 push r11 + 4b30: cf 92 push r12 + 4b32: df 92 push r13 + 4b34: ef 92 push r14 + 4b36: ff 92 push r15 + 4b38: cf 93 push r28 + 4b3a: df 93 push r29 + 4b3c: ec 01 movw r28, r24 + 4b3e: 88 81 ld r24, Y + 4b40: 99 81 ldd r25, Y+1 ; 0x01 + 4b42: aa 81 ldd r26, Y+2 ; 0x02 + 4b44: bb 81 ldd r27, Y+3 ; 0x03 + 4b46: 00 97 sbiw r24, 0x00 ; 0 + 4b48: a1 05 cpc r26, r1 + 4b4a: b1 05 cpc r27, r1 + 4b4c: 21 f4 brne .+8 ; 0x4b56 + 4b4e: 84 e2 ldi r24, 0x24 ; 36 + 4b50: 99 ed ldi r25, 0xD9 ; 217 + 4b52: ab e5 ldi r26, 0x5B ; 91 + 4b54: b7 e0 ldi r27, 0x07 ; 7 + 4b56: bc 01 movw r22, r24 + 4b58: cd 01 movw r24, r26 + 4b5a: 2d e1 ldi r18, 0x1D ; 29 + 4b5c: 33 ef ldi r19, 0xF3 ; 243 + 4b5e: 41 e0 ldi r20, 0x01 ; 1 + 4b60: 50 e0 ldi r21, 0x00 ; 0 + 4b62: 3d d3 rcall .+1658 ; 0x51de <__divmodsi4> + 4b64: 49 01 movw r8, r18 + 4b66: 5a 01 movw r10, r20 + 4b68: 27 ea ldi r18, 0xA7 ; 167 + 4b6a: 31 e4 ldi r19, 0x41 ; 65 + 4b6c: 40 e0 ldi r20, 0x00 ; 0 + 4b6e: 50 e0 ldi r21, 0x00 ; 0 + 4b70: bc df rcall .-136 ; 0x4aea <__mulsi3> + 4b72: 6b 01 movw r12, r22 + 4b74: 7c 01 movw r14, r24 + 4b76: c5 01 movw r24, r10 + 4b78: b4 01 movw r22, r8 + 4b7a: 2c ee ldi r18, 0xEC ; 236 + 4b7c: 34 ef ldi r19, 0xF4 ; 244 + 4b7e: 4f ef ldi r20, 0xFF ; 255 + 4b80: 5f ef ldi r21, 0xFF ; 255 + 4b82: b3 df rcall .-154 ; 0x4aea <__mulsi3> + 4b84: dc 01 movw r26, r24 + 4b86: cb 01 movw r24, r22 + 4b88: c8 0e add r12, r24 + 4b8a: d9 1e adc r13, r25 + 4b8c: ea 1e adc r14, r26 + 4b8e: fb 1e adc r15, r27 + 4b90: f7 fe sbrs r15, 7 + 4b92: 08 c0 rjmp .+16 ; 0x4ba4 + 4b94: 8f ef ldi r24, 0xFF ; 255 + 4b96: 9f ef ldi r25, 0xFF ; 255 + 4b98: af ef ldi r26, 0xFF ; 255 + 4b9a: bf e7 ldi r27, 0x7F ; 127 + 4b9c: c8 0e add r12, r24 + 4b9e: d9 1e adc r13, r25 + 4ba0: ea 1e adc r14, r26 + 4ba2: fb 1e adc r15, r27 + 4ba4: c8 82 st Y, r12 + 4ba6: d9 82 std Y+1, r13 ; 0x01 + 4ba8: ea 82 std Y+2, r14 ; 0x02 + 4baa: fb 82 std Y+3, r15 ; 0x03 + 4bac: c6 01 movw r24, r12 + 4bae: 9f 77 andi r25, 0x7F ; 127 + 4bb0: df 91 pop r29 + 4bb2: cf 91 pop r28 + 4bb4: ff 90 pop r15 + 4bb6: ef 90 pop r14 + 4bb8: df 90 pop r13 + 4bba: cf 90 pop r12 + 4bbc: bf 90 pop r11 + 4bbe: af 90 pop r10 + 4bc0: 9f 90 pop r9 + 4bc2: 8f 90 pop r8 + 4bc4: 08 95 ret -00004be8 : - 4be8: fb 01 movw r30, r22 - 4bea: dc 01 movw r26, r24 - 4bec: 41 50 subi r20, 0x01 ; 1 - 4bee: 50 40 sbci r21, 0x00 ; 0 - 4bf0: 48 f0 brcs .+18 ; 0x4c04 - 4bf2: 05 90 lpm r0, Z+ - 4bf4: 0d 92 st X+, r0 - 4bf6: 00 20 and r0, r0 - 4bf8: c9 f7 brne .-14 ; 0x4bec - 4bfa: 01 c0 rjmp .+2 ; 0x4bfe - 4bfc: 1d 92 st X+, r1 - 4bfe: 41 50 subi r20, 0x01 ; 1 - 4c00: 50 40 sbci r21, 0x00 ; 0 - 4c02: e0 f7 brcc .-8 ; 0x4bfc - 4c04: 08 95 ret +00004bc6 : + 4bc6: b0 cf rjmp .-160 ; 0x4b28 -00004c06 : - 4c06: fb 01 movw r30, r22 - 4c08: dc 01 movw r26, r24 - 4c0a: 02 c0 rjmp .+4 ; 0x4c10 - 4c0c: 01 90 ld r0, Z+ - 4c0e: 0d 92 st X+, r0 - 4c10: 41 50 subi r20, 0x01 ; 1 - 4c12: 50 40 sbci r21, 0x00 ; 0 - 4c14: d8 f7 brcc .-10 ; 0x4c0c - 4c16: 08 95 ret +00004bc8 : + 4bc8: 8d e9 ldi r24, 0x9D ; 157 + 4bca: 90 e2 ldi r25, 0x20 ; 32 + 4bcc: ad cf rjmp .-166 ; 0x4b28 -00004c18 : - 4c18: ae e0 ldi r26, 0x0E ; 14 - 4c1a: b0 e0 ldi r27, 0x00 ; 0 - 4c1c: e1 e1 ldi r30, 0x11 ; 17 - 4c1e: f6 e2 ldi r31, 0x26 ; 38 - 4c20: f7 c2 rjmp .+1518 ; 0x5210 <__prologue_saves__+0x1c> - 4c22: 0d 89 ldd r16, Y+21 ; 0x15 - 4c24: 1e 89 ldd r17, Y+22 ; 0x16 - 4c26: 8f 89 ldd r24, Y+23 ; 0x17 - 4c28: 98 8d ldd r25, Y+24 ; 0x18 - 4c2a: 2e e0 ldi r18, 0x0E ; 14 - 4c2c: 2c 83 std Y+4, r18 ; 0x04 - 4c2e: 09 83 std Y+1, r16 ; 0x01 - 4c30: 1a 83 std Y+2, r17 ; 0x02 - 4c32: 97 ff sbrs r25, 7 - 4c34: 02 c0 rjmp .+4 ; 0x4c3a - 4c36: 80 e0 ldi r24, 0x00 ; 0 - 4c38: 90 e8 ldi r25, 0x80 ; 128 - 4c3a: 01 97 sbiw r24, 0x01 ; 1 - 4c3c: 8d 83 std Y+5, r24 ; 0x05 - 4c3e: 9e 83 std Y+6, r25 ; 0x06 - 4c40: ae 01 movw r20, r28 - 4c42: 45 5e subi r20, 0xE5 ; 229 - 4c44: 5f 4f sbci r21, 0xFF ; 255 - 4c46: ce 01 movw r24, r28 - 4c48: 01 96 adiw r24, 0x01 ; 1 - 4c4a: 69 8d ldd r22, Y+25 ; 0x19 - 4c4c: 7a 8d ldd r23, Y+26 ; 0x1a - 4c4e: 11 d0 rcall .+34 ; 0x4c72 - 4c50: 4d 81 ldd r20, Y+5 ; 0x05 - 4c52: 5e 81 ldd r21, Y+6 ; 0x06 - 4c54: 57 fd sbrc r21, 7 - 4c56: 0a c0 rjmp .+20 ; 0x4c6c - 4c58: 2f 81 ldd r18, Y+7 ; 0x07 - 4c5a: 38 85 ldd r19, Y+8 ; 0x08 - 4c5c: 42 17 cp r20, r18 - 4c5e: 53 07 cpc r21, r19 - 4c60: 0c f4 brge .+2 ; 0x4c64 - 4c62: 9a 01 movw r18, r20 - 4c64: 02 0f add r16, r18 - 4c66: 13 1f adc r17, r19 - 4c68: f8 01 movw r30, r16 - 4c6a: 10 82 st Z, r1 - 4c6c: 2e 96 adiw r28, 0x0e ; 14 - 4c6e: e4 e0 ldi r30, 0x04 ; 4 - 4c70: e8 c2 rjmp .+1488 ; 0x5242 <__epilogue_restores__+0x1c> +00004bce : + 4bce: a0 e0 ldi r26, 0x00 ; 0 + 4bd0: b0 e0 ldi r27, 0x00 ; 0 + 4bd2: 80 93 9d 20 sts 0x209D, r24 + 4bd6: 90 93 9e 20 sts 0x209E, r25 + 4bda: a0 93 9f 20 sts 0x209F, r26 + 4bde: b0 93 a0 20 sts 0x20A0, r27 + 4be2: 08 95 ret -00004c72 : - 4c72: ad e0 ldi r26, 0x0D ; 13 - 4c74: b0 e0 ldi r27, 0x00 ; 0 - 4c76: ee e3 ldi r30, 0x3E ; 62 - 4c78: f6 e2 ldi r31, 0x26 ; 38 - 4c7a: bc c2 rjmp .+1400 ; 0x51f4 <__prologue_saves__> - 4c7c: 3c 01 movw r6, r24 - 4c7e: 6c 87 std Y+12, r22 ; 0x0c - 4c80: 7d 87 std Y+13, r23 ; 0x0d - 4c82: 5a 01 movw r10, r20 - 4c84: fc 01 movw r30, r24 - 4c86: 16 82 std Z+6, r1 ; 0x06 - 4c88: 17 82 std Z+7, r1 ; 0x07 - 4c8a: 83 81 ldd r24, Z+3 ; 0x03 - 4c8c: 81 ff sbrs r24, 1 - 4c8e: bb c1 rjmp .+886 ; 0x5006 - 4c90: 2e 01 movw r4, r28 - 4c92: 08 94 sec - 4c94: 41 1c adc r4, r1 - 4c96: 51 1c adc r5, r1 - 4c98: f3 01 movw r30, r6 - 4c9a: 93 81 ldd r25, Z+3 ; 0x03 - 4c9c: ec 85 ldd r30, Y+12 ; 0x0c - 4c9e: fd 85 ldd r31, Y+13 ; 0x0d - 4ca0: 93 fd sbrc r25, 3 - 4ca2: 85 91 lpm r24, Z+ - 4ca4: 93 ff sbrs r25, 3 - 4ca6: 81 91 ld r24, Z+ - 4ca8: ec 87 std Y+12, r30 ; 0x0c - 4caa: fd 87 std Y+13, r31 ; 0x0d - 4cac: 88 23 and r24, r24 - 4cae: 09 f4 brne .+2 ; 0x4cb2 - 4cb0: a6 c1 rjmp .+844 ; 0x4ffe - 4cb2: 85 32 cpi r24, 0x25 ; 37 - 4cb4: 41 f4 brne .+16 ; 0x4cc6 - 4cb6: 93 fd sbrc r25, 3 - 4cb8: 85 91 lpm r24, Z+ - 4cba: 93 ff sbrs r25, 3 - 4cbc: 81 91 ld r24, Z+ - 4cbe: ec 87 std Y+12, r30 ; 0x0c - 4cc0: fd 87 std Y+13, r31 ; 0x0d - 4cc2: 85 32 cpi r24, 0x25 ; 37 - 4cc4: 21 f4 brne .+8 ; 0x4cce - 4cc6: 90 e0 ldi r25, 0x00 ; 0 - 4cc8: b3 01 movw r22, r6 - 4cca: ef d1 rcall .+990 ; 0x50aa - 4ccc: e5 cf rjmp .-54 ; 0x4c98 - 4cce: ff 24 eor r15, r15 - 4cd0: ee 24 eor r14, r14 - 4cd2: 10 e0 ldi r17, 0x00 ; 0 - 4cd4: 10 32 cpi r17, 0x20 ; 32 - 4cd6: b0 f4 brcc .+44 ; 0x4d04 - 4cd8: 8b 32 cpi r24, 0x2B ; 43 - 4cda: 69 f0 breq .+26 ; 0x4cf6 - 4cdc: 8c 32 cpi r24, 0x2C ; 44 - 4cde: 28 f4 brcc .+10 ; 0x4cea - 4ce0: 80 32 cpi r24, 0x20 ; 32 - 4ce2: 51 f0 breq .+20 ; 0x4cf8 - 4ce4: 83 32 cpi r24, 0x23 ; 35 - 4ce6: 71 f4 brne .+28 ; 0x4d04 - 4ce8: 0b c0 rjmp .+22 ; 0x4d00 - 4cea: 8d 32 cpi r24, 0x2D ; 45 - 4cec: 39 f0 breq .+14 ; 0x4cfc - 4cee: 80 33 cpi r24, 0x30 ; 48 - 4cf0: 49 f4 brne .+18 ; 0x4d04 - 4cf2: 11 60 ori r17, 0x01 ; 1 - 4cf4: 2c c0 rjmp .+88 ; 0x4d4e - 4cf6: 12 60 ori r17, 0x02 ; 2 - 4cf8: 14 60 ori r17, 0x04 ; 4 - 4cfa: 29 c0 rjmp .+82 ; 0x4d4e - 4cfc: 18 60 ori r17, 0x08 ; 8 - 4cfe: 27 c0 rjmp .+78 ; 0x4d4e - 4d00: 10 61 ori r17, 0x10 ; 16 - 4d02: 25 c0 rjmp .+74 ; 0x4d4e - 4d04: 17 fd sbrc r17, 7 - 4d06: 2e c0 rjmp .+92 ; 0x4d64 - 4d08: 28 2f mov r18, r24 - 4d0a: 20 53 subi r18, 0x30 ; 48 - 4d0c: 2a 30 cpi r18, 0x0A ; 10 - 4d0e: 98 f4 brcc .+38 ; 0x4d36 - 4d10: 16 ff sbrs r17, 6 - 4d12: 08 c0 rjmp .+16 ; 0x4d24 - 4d14: 8f 2d mov r24, r15 - 4d16: 88 0f add r24, r24 - 4d18: f8 2e mov r15, r24 - 4d1a: ff 0c add r15, r15 - 4d1c: ff 0c add r15, r15 - 4d1e: f8 0e add r15, r24 - 4d20: f2 0e add r15, r18 - 4d22: 15 c0 rjmp .+42 ; 0x4d4e - 4d24: 8e 2d mov r24, r14 - 4d26: 88 0f add r24, r24 - 4d28: e8 2e mov r14, r24 - 4d2a: ee 0c add r14, r14 - 4d2c: ee 0c add r14, r14 - 4d2e: e8 0e add r14, r24 - 4d30: e2 0e add r14, r18 - 4d32: 10 62 ori r17, 0x20 ; 32 - 4d34: 0c c0 rjmp .+24 ; 0x4d4e - 4d36: 8e 32 cpi r24, 0x2E ; 46 - 4d38: 21 f4 brne .+8 ; 0x4d42 - 4d3a: 16 fd sbrc r17, 6 - 4d3c: 60 c1 rjmp .+704 ; 0x4ffe - 4d3e: 10 64 ori r17, 0x40 ; 64 - 4d40: 06 c0 rjmp .+12 ; 0x4d4e - 4d42: 8c 36 cpi r24, 0x6C ; 108 - 4d44: 11 f4 brne .+4 ; 0x4d4a - 4d46: 10 68 ori r17, 0x80 ; 128 - 4d48: 02 c0 rjmp .+4 ; 0x4d4e - 4d4a: 88 36 cpi r24, 0x68 ; 104 - 4d4c: 59 f4 brne .+22 ; 0x4d64 - 4d4e: ec 85 ldd r30, Y+12 ; 0x0c - 4d50: fd 85 ldd r31, Y+13 ; 0x0d - 4d52: 93 fd sbrc r25, 3 - 4d54: 85 91 lpm r24, Z+ - 4d56: 93 ff sbrs r25, 3 - 4d58: 81 91 ld r24, Z+ - 4d5a: ec 87 std Y+12, r30 ; 0x0c - 4d5c: fd 87 std Y+13, r31 ; 0x0d - 4d5e: 88 23 and r24, r24 - 4d60: 09 f0 breq .+2 ; 0x4d64 - 4d62: b8 cf rjmp .-144 ; 0x4cd4 - 4d64: 98 2f mov r25, r24 - 4d66: 95 54 subi r25, 0x45 ; 69 - 4d68: 93 30 cpi r25, 0x03 ; 3 - 4d6a: 18 f0 brcs .+6 ; 0x4d72 - 4d6c: 90 52 subi r25, 0x20 ; 32 - 4d6e: 93 30 cpi r25, 0x03 ; 3 - 4d70: 38 f4 brcc .+14 ; 0x4d80 - 4d72: 24 e0 ldi r18, 0x04 ; 4 - 4d74: 30 e0 ldi r19, 0x00 ; 0 - 4d76: a2 0e add r10, r18 - 4d78: b3 1e adc r11, r19 - 4d7a: 3f e3 ldi r19, 0x3F ; 63 - 4d7c: 39 83 std Y+1, r19 ; 0x01 - 4d7e: 0f c0 rjmp .+30 ; 0x4d9e - 4d80: 83 36 cpi r24, 0x63 ; 99 - 4d82: 31 f0 breq .+12 ; 0x4d90 - 4d84: 83 37 cpi r24, 0x73 ; 115 - 4d86: 81 f0 breq .+32 ; 0x4da8 - 4d88: 83 35 cpi r24, 0x53 ; 83 - 4d8a: 09 f0 breq .+2 ; 0x4d8e - 4d8c: 56 c0 rjmp .+172 ; 0x4e3a - 4d8e: 21 c0 rjmp .+66 ; 0x4dd2 - 4d90: f5 01 movw r30, r10 - 4d92: 80 81 ld r24, Z - 4d94: 89 83 std Y+1, r24 ; 0x01 - 4d96: 22 e0 ldi r18, 0x02 ; 2 - 4d98: 30 e0 ldi r19, 0x00 ; 0 - 4d9a: a2 0e add r10, r18 - 4d9c: b3 1e adc r11, r19 - 4d9e: 21 e0 ldi r18, 0x01 ; 1 - 4da0: c2 2e mov r12, r18 - 4da2: d1 2c mov r13, r1 - 4da4: 42 01 movw r8, r4 - 4da6: 13 c0 rjmp .+38 ; 0x4dce - 4da8: 92 e0 ldi r25, 0x02 ; 2 - 4daa: 29 2e mov r2, r25 - 4dac: 31 2c mov r3, r1 - 4dae: 2a 0c add r2, r10 - 4db0: 3b 1c adc r3, r11 - 4db2: f5 01 movw r30, r10 - 4db4: 80 80 ld r8, Z - 4db6: 91 80 ldd r9, Z+1 ; 0x01 - 4db8: 16 ff sbrs r17, 6 - 4dba: 03 c0 rjmp .+6 ; 0x4dc2 - 4dbc: 6f 2d mov r22, r15 - 4dbe: 70 e0 ldi r23, 0x00 ; 0 - 4dc0: 02 c0 rjmp .+4 ; 0x4dc6 - 4dc2: 6f ef ldi r22, 0xFF ; 255 - 4dc4: 7f ef ldi r23, 0xFF ; 255 - 4dc6: c4 01 movw r24, r8 - 4dc8: 65 d1 rcall .+714 ; 0x5094 - 4dca: 6c 01 movw r12, r24 - 4dcc: 51 01 movw r10, r2 - 4dce: 1f 77 andi r17, 0x7F ; 127 - 4dd0: 14 c0 rjmp .+40 ; 0x4dfa - 4dd2: 82 e0 ldi r24, 0x02 ; 2 - 4dd4: 28 2e mov r2, r24 - 4dd6: 31 2c mov r3, r1 - 4dd8: 2a 0c add r2, r10 - 4dda: 3b 1c adc r3, r11 - 4ddc: f5 01 movw r30, r10 - 4dde: 80 80 ld r8, Z - 4de0: 91 80 ldd r9, Z+1 ; 0x01 - 4de2: 16 ff sbrs r17, 6 - 4de4: 03 c0 rjmp .+6 ; 0x4dec - 4de6: 6f 2d mov r22, r15 - 4de8: 70 e0 ldi r23, 0x00 ; 0 - 4dea: 02 c0 rjmp .+4 ; 0x4df0 - 4dec: 6f ef ldi r22, 0xFF ; 255 - 4dee: 7f ef ldi r23, 0xFF ; 255 - 4df0: c4 01 movw r24, r8 - 4df2: 45 d1 rcall .+650 ; 0x507e - 4df4: 6c 01 movw r12, r24 - 4df6: 10 68 ori r17, 0x80 ; 128 - 4df8: 51 01 movw r10, r2 - 4dfa: 13 fd sbrc r17, 3 - 4dfc: 1a c0 rjmp .+52 ; 0x4e32 - 4dfe: 05 c0 rjmp .+10 ; 0x4e0a - 4e00: 80 e2 ldi r24, 0x20 ; 32 - 4e02: 90 e0 ldi r25, 0x00 ; 0 - 4e04: b3 01 movw r22, r6 - 4e06: 51 d1 rcall .+674 ; 0x50aa - 4e08: ea 94 dec r14 - 4e0a: 8e 2d mov r24, r14 - 4e0c: 90 e0 ldi r25, 0x00 ; 0 - 4e0e: c8 16 cp r12, r24 - 4e10: d9 06 cpc r13, r25 - 4e12: b0 f3 brcs .-20 ; 0x4e00 - 4e14: 0e c0 rjmp .+28 ; 0x4e32 - 4e16: f4 01 movw r30, r8 - 4e18: 17 fd sbrc r17, 7 - 4e1a: 85 91 lpm r24, Z+ - 4e1c: 17 ff sbrs r17, 7 - 4e1e: 81 91 ld r24, Z+ - 4e20: 4f 01 movw r8, r30 +00004be4 : + 4be4: fb 01 movw r30, r22 + 4be6: dc 01 movw r26, r24 + 4be8: 02 c0 rjmp .+4 ; 0x4bee + 4bea: 05 90 lpm r0, Z+ + 4bec: 0d 92 st X+, r0 + 4bee: 41 50 subi r20, 0x01 ; 1 + 4bf0: 50 40 sbci r21, 0x00 ; 0 + 4bf2: d8 f7 brcc .-10 ; 0x4bea + 4bf4: 08 95 ret + +00004bf6 : + 4bf6: fb 01 movw r30, r22 + 4bf8: dc 01 movw r26, r24 + 4bfa: 8d 91 ld r24, X+ + 4bfc: 05 90 lpm r0, Z+ + 4bfe: 80 19 sub r24, r0 + 4c00: 01 10 cpse r0, r1 + 4c02: d9 f3 breq .-10 ; 0x4bfa + 4c04: 99 0b sbc r25, r25 + 4c06: 08 95 ret + +00004c08 : + 4c08: fb 01 movw r30, r22 + 4c0a: dc 01 movw r26, r24 + 4c0c: 41 50 subi r20, 0x01 ; 1 + 4c0e: 50 40 sbci r21, 0x00 ; 0 + 4c10: 48 f0 brcs .+18 ; 0x4c24 + 4c12: 05 90 lpm r0, Z+ + 4c14: 0d 92 st X+, r0 + 4c16: 00 20 and r0, r0 + 4c18: c9 f7 brne .-14 ; 0x4c0c + 4c1a: 01 c0 rjmp .+2 ; 0x4c1e + 4c1c: 1d 92 st X+, r1 + 4c1e: 41 50 subi r20, 0x01 ; 1 + 4c20: 50 40 sbci r21, 0x00 ; 0 + 4c22: e0 f7 brcc .-8 ; 0x4c1c + 4c24: 08 95 ret + +00004c26 : + 4c26: fb 01 movw r30, r22 + 4c28: dc 01 movw r26, r24 + 4c2a: 02 c0 rjmp .+4 ; 0x4c30 + 4c2c: 01 90 ld r0, Z+ + 4c2e: 0d 92 st X+, r0 + 4c30: 41 50 subi r20, 0x01 ; 1 + 4c32: 50 40 sbci r21, 0x00 ; 0 + 4c34: d8 f7 brcc .-10 ; 0x4c2c + 4c36: 08 95 ret + +00004c38 : + 4c38: ae e0 ldi r26, 0x0E ; 14 + 4c3a: b0 e0 ldi r27, 0x00 ; 0 + 4c3c: e1 e2 ldi r30, 0x21 ; 33 + 4c3e: f6 e2 ldi r31, 0x26 ; 38 + 4c40: f7 c2 rjmp .+1518 ; 0x5230 <__prologue_saves__+0x1c> + 4c42: 0d 89 ldd r16, Y+21 ; 0x15 + 4c44: 1e 89 ldd r17, Y+22 ; 0x16 + 4c46: 8f 89 ldd r24, Y+23 ; 0x17 + 4c48: 98 8d ldd r25, Y+24 ; 0x18 + 4c4a: 2e e0 ldi r18, 0x0E ; 14 + 4c4c: 2c 83 std Y+4, r18 ; 0x04 + 4c4e: 09 83 std Y+1, r16 ; 0x01 + 4c50: 1a 83 std Y+2, r17 ; 0x02 + 4c52: 97 ff sbrs r25, 7 + 4c54: 02 c0 rjmp .+4 ; 0x4c5a + 4c56: 80 e0 ldi r24, 0x00 ; 0 + 4c58: 90 e8 ldi r25, 0x80 ; 128 + 4c5a: 01 97 sbiw r24, 0x01 ; 1 + 4c5c: 8d 83 std Y+5, r24 ; 0x05 + 4c5e: 9e 83 std Y+6, r25 ; 0x06 + 4c60: ae 01 movw r20, r28 + 4c62: 45 5e subi r20, 0xE5 ; 229 + 4c64: 5f 4f sbci r21, 0xFF ; 255 + 4c66: ce 01 movw r24, r28 + 4c68: 01 96 adiw r24, 0x01 ; 1 + 4c6a: 69 8d ldd r22, Y+25 ; 0x19 + 4c6c: 7a 8d ldd r23, Y+26 ; 0x1a + 4c6e: 11 d0 rcall .+34 ; 0x4c92 + 4c70: 4d 81 ldd r20, Y+5 ; 0x05 + 4c72: 5e 81 ldd r21, Y+6 ; 0x06 + 4c74: 57 fd sbrc r21, 7 + 4c76: 0a c0 rjmp .+20 ; 0x4c8c + 4c78: 2f 81 ldd r18, Y+7 ; 0x07 + 4c7a: 38 85 ldd r19, Y+8 ; 0x08 + 4c7c: 42 17 cp r20, r18 + 4c7e: 53 07 cpc r21, r19 + 4c80: 0c f4 brge .+2 ; 0x4c84 + 4c82: 9a 01 movw r18, r20 + 4c84: 02 0f add r16, r18 + 4c86: 13 1f adc r17, r19 + 4c88: f8 01 movw r30, r16 + 4c8a: 10 82 st Z, r1 + 4c8c: 2e 96 adiw r28, 0x0e ; 14 + 4c8e: e4 e0 ldi r30, 0x04 ; 4 + 4c90: e8 c2 rjmp .+1488 ; 0x5262 <__epilogue_restores__+0x1c> + +00004c92 : + 4c92: ad e0 ldi r26, 0x0D ; 13 + 4c94: b0 e0 ldi r27, 0x00 ; 0 + 4c96: ee e4 ldi r30, 0x4E ; 78 + 4c98: f6 e2 ldi r31, 0x26 ; 38 + 4c9a: bc c2 rjmp .+1400 ; 0x5214 <__prologue_saves__> + 4c9c: 3c 01 movw r6, r24 + 4c9e: 6c 87 std Y+12, r22 ; 0x0c + 4ca0: 7d 87 std Y+13, r23 ; 0x0d + 4ca2: 5a 01 movw r10, r20 + 4ca4: fc 01 movw r30, r24 + 4ca6: 16 82 std Z+6, r1 ; 0x06 + 4ca8: 17 82 std Z+7, r1 ; 0x07 + 4caa: 83 81 ldd r24, Z+3 ; 0x03 + 4cac: 81 ff sbrs r24, 1 + 4cae: bb c1 rjmp .+886 ; 0x5026 + 4cb0: 2e 01 movw r4, r28 + 4cb2: 08 94 sec + 4cb4: 41 1c adc r4, r1 + 4cb6: 51 1c adc r5, r1 + 4cb8: f3 01 movw r30, r6 + 4cba: 93 81 ldd r25, Z+3 ; 0x03 + 4cbc: ec 85 ldd r30, Y+12 ; 0x0c + 4cbe: fd 85 ldd r31, Y+13 ; 0x0d + 4cc0: 93 fd sbrc r25, 3 + 4cc2: 85 91 lpm r24, Z+ + 4cc4: 93 ff sbrs r25, 3 + 4cc6: 81 91 ld r24, Z+ + 4cc8: ec 87 std Y+12, r30 ; 0x0c + 4cca: fd 87 std Y+13, r31 ; 0x0d + 4ccc: 88 23 and r24, r24 + 4cce: 09 f4 brne .+2 ; 0x4cd2 + 4cd0: a6 c1 rjmp .+844 ; 0x501e + 4cd2: 85 32 cpi r24, 0x25 ; 37 + 4cd4: 41 f4 brne .+16 ; 0x4ce6 + 4cd6: 93 fd sbrc r25, 3 + 4cd8: 85 91 lpm r24, Z+ + 4cda: 93 ff sbrs r25, 3 + 4cdc: 81 91 ld r24, Z+ + 4cde: ec 87 std Y+12, r30 ; 0x0c + 4ce0: fd 87 std Y+13, r31 ; 0x0d + 4ce2: 85 32 cpi r24, 0x25 ; 37 + 4ce4: 21 f4 brne .+8 ; 0x4cee + 4ce6: 90 e0 ldi r25, 0x00 ; 0 + 4ce8: b3 01 movw r22, r6 + 4cea: ef d1 rcall .+990 ; 0x50ca + 4cec: e5 cf rjmp .-54 ; 0x4cb8 + 4cee: ff 24 eor r15, r15 + 4cf0: ee 24 eor r14, r14 + 4cf2: 10 e0 ldi r17, 0x00 ; 0 + 4cf4: 10 32 cpi r17, 0x20 ; 32 + 4cf6: b0 f4 brcc .+44 ; 0x4d24 + 4cf8: 8b 32 cpi r24, 0x2B ; 43 + 4cfa: 69 f0 breq .+26 ; 0x4d16 + 4cfc: 8c 32 cpi r24, 0x2C ; 44 + 4cfe: 28 f4 brcc .+10 ; 0x4d0a + 4d00: 80 32 cpi r24, 0x20 ; 32 + 4d02: 51 f0 breq .+20 ; 0x4d18 + 4d04: 83 32 cpi r24, 0x23 ; 35 + 4d06: 71 f4 brne .+28 ; 0x4d24 + 4d08: 0b c0 rjmp .+22 ; 0x4d20 + 4d0a: 8d 32 cpi r24, 0x2D ; 45 + 4d0c: 39 f0 breq .+14 ; 0x4d1c + 4d0e: 80 33 cpi r24, 0x30 ; 48 + 4d10: 49 f4 brne .+18 ; 0x4d24 + 4d12: 11 60 ori r17, 0x01 ; 1 + 4d14: 2c c0 rjmp .+88 ; 0x4d6e + 4d16: 12 60 ori r17, 0x02 ; 2 + 4d18: 14 60 ori r17, 0x04 ; 4 + 4d1a: 29 c0 rjmp .+82 ; 0x4d6e + 4d1c: 18 60 ori r17, 0x08 ; 8 + 4d1e: 27 c0 rjmp .+78 ; 0x4d6e + 4d20: 10 61 ori r17, 0x10 ; 16 + 4d22: 25 c0 rjmp .+74 ; 0x4d6e + 4d24: 17 fd sbrc r17, 7 + 4d26: 2e c0 rjmp .+92 ; 0x4d84 + 4d28: 28 2f mov r18, r24 + 4d2a: 20 53 subi r18, 0x30 ; 48 + 4d2c: 2a 30 cpi r18, 0x0A ; 10 + 4d2e: 98 f4 brcc .+38 ; 0x4d56 + 4d30: 16 ff sbrs r17, 6 + 4d32: 08 c0 rjmp .+16 ; 0x4d44 + 4d34: 8f 2d mov r24, r15 + 4d36: 88 0f add r24, r24 + 4d38: f8 2e mov r15, r24 + 4d3a: ff 0c add r15, r15 + 4d3c: ff 0c add r15, r15 + 4d3e: f8 0e add r15, r24 + 4d40: f2 0e add r15, r18 + 4d42: 15 c0 rjmp .+42 ; 0x4d6e + 4d44: 8e 2d mov r24, r14 + 4d46: 88 0f add r24, r24 + 4d48: e8 2e mov r14, r24 + 4d4a: ee 0c add r14, r14 + 4d4c: ee 0c add r14, r14 + 4d4e: e8 0e add r14, r24 + 4d50: e2 0e add r14, r18 + 4d52: 10 62 ori r17, 0x20 ; 32 + 4d54: 0c c0 rjmp .+24 ; 0x4d6e + 4d56: 8e 32 cpi r24, 0x2E ; 46 + 4d58: 21 f4 brne .+8 ; 0x4d62 + 4d5a: 16 fd sbrc r17, 6 + 4d5c: 60 c1 rjmp .+704 ; 0x501e + 4d5e: 10 64 ori r17, 0x40 ; 64 + 4d60: 06 c0 rjmp .+12 ; 0x4d6e + 4d62: 8c 36 cpi r24, 0x6C ; 108 + 4d64: 11 f4 brne .+4 ; 0x4d6a + 4d66: 10 68 ori r17, 0x80 ; 128 + 4d68: 02 c0 rjmp .+4 ; 0x4d6e + 4d6a: 88 36 cpi r24, 0x68 ; 104 + 4d6c: 59 f4 brne .+22 ; 0x4d84 + 4d6e: ec 85 ldd r30, Y+12 ; 0x0c + 4d70: fd 85 ldd r31, Y+13 ; 0x0d + 4d72: 93 fd sbrc r25, 3 + 4d74: 85 91 lpm r24, Z+ + 4d76: 93 ff sbrs r25, 3 + 4d78: 81 91 ld r24, Z+ + 4d7a: ec 87 std Y+12, r30 ; 0x0c + 4d7c: fd 87 std Y+13, r31 ; 0x0d + 4d7e: 88 23 and r24, r24 + 4d80: 09 f0 breq .+2 ; 0x4d84 + 4d82: b8 cf rjmp .-144 ; 0x4cf4 + 4d84: 98 2f mov r25, r24 + 4d86: 95 54 subi r25, 0x45 ; 69 + 4d88: 93 30 cpi r25, 0x03 ; 3 + 4d8a: 18 f0 brcs .+6 ; 0x4d92 + 4d8c: 90 52 subi r25, 0x20 ; 32 + 4d8e: 93 30 cpi r25, 0x03 ; 3 + 4d90: 38 f4 brcc .+14 ; 0x4da0 + 4d92: 24 e0 ldi r18, 0x04 ; 4 + 4d94: 30 e0 ldi r19, 0x00 ; 0 + 4d96: a2 0e add r10, r18 + 4d98: b3 1e adc r11, r19 + 4d9a: 3f e3 ldi r19, 0x3F ; 63 + 4d9c: 39 83 std Y+1, r19 ; 0x01 + 4d9e: 0f c0 rjmp .+30 ; 0x4dbe + 4da0: 83 36 cpi r24, 0x63 ; 99 + 4da2: 31 f0 breq .+12 ; 0x4db0 + 4da4: 83 37 cpi r24, 0x73 ; 115 + 4da6: 81 f0 breq .+32 ; 0x4dc8 + 4da8: 83 35 cpi r24, 0x53 ; 83 + 4daa: 09 f0 breq .+2 ; 0x4dae + 4dac: 56 c0 rjmp .+172 ; 0x4e5a + 4dae: 21 c0 rjmp .+66 ; 0x4df2 + 4db0: f5 01 movw r30, r10 + 4db2: 80 81 ld r24, Z + 4db4: 89 83 std Y+1, r24 ; 0x01 + 4db6: 22 e0 ldi r18, 0x02 ; 2 + 4db8: 30 e0 ldi r19, 0x00 ; 0 + 4dba: a2 0e add r10, r18 + 4dbc: b3 1e adc r11, r19 + 4dbe: 21 e0 ldi r18, 0x01 ; 1 + 4dc0: c2 2e mov r12, r18 + 4dc2: d1 2c mov r13, r1 + 4dc4: 42 01 movw r8, r4 + 4dc6: 13 c0 rjmp .+38 ; 0x4dee + 4dc8: 92 e0 ldi r25, 0x02 ; 2 + 4dca: 29 2e mov r2, r25 + 4dcc: 31 2c mov r3, r1 + 4dce: 2a 0c add r2, r10 + 4dd0: 3b 1c adc r3, r11 + 4dd2: f5 01 movw r30, r10 + 4dd4: 80 80 ld r8, Z + 4dd6: 91 80 ldd r9, Z+1 ; 0x01 + 4dd8: 16 ff sbrs r17, 6 + 4dda: 03 c0 rjmp .+6 ; 0x4de2 + 4ddc: 6f 2d mov r22, r15 + 4dde: 70 e0 ldi r23, 0x00 ; 0 + 4de0: 02 c0 rjmp .+4 ; 0x4de6 + 4de2: 6f ef ldi r22, 0xFF ; 255 + 4de4: 7f ef ldi r23, 0xFF ; 255 + 4de6: c4 01 movw r24, r8 + 4de8: 65 d1 rcall .+714 ; 0x50b4 + 4dea: 6c 01 movw r12, r24 + 4dec: 51 01 movw r10, r2 + 4dee: 1f 77 andi r17, 0x7F ; 127 + 4df0: 14 c0 rjmp .+40 ; 0x4e1a + 4df2: 82 e0 ldi r24, 0x02 ; 2 + 4df4: 28 2e mov r2, r24 + 4df6: 31 2c mov r3, r1 + 4df8: 2a 0c add r2, r10 + 4dfa: 3b 1c adc r3, r11 + 4dfc: f5 01 movw r30, r10 + 4dfe: 80 80 ld r8, Z + 4e00: 91 80 ldd r9, Z+1 ; 0x01 + 4e02: 16 ff sbrs r17, 6 + 4e04: 03 c0 rjmp .+6 ; 0x4e0c + 4e06: 6f 2d mov r22, r15 + 4e08: 70 e0 ldi r23, 0x00 ; 0 + 4e0a: 02 c0 rjmp .+4 ; 0x4e10 + 4e0c: 6f ef ldi r22, 0xFF ; 255 + 4e0e: 7f ef ldi r23, 0xFF ; 255 + 4e10: c4 01 movw r24, r8 + 4e12: 45 d1 rcall .+650 ; 0x509e + 4e14: 6c 01 movw r12, r24 + 4e16: 10 68 ori r17, 0x80 ; 128 + 4e18: 51 01 movw r10, r2 + 4e1a: 13 fd sbrc r17, 3 + 4e1c: 1a c0 rjmp .+52 ; 0x4e52 + 4e1e: 05 c0 rjmp .+10 ; 0x4e2a + 4e20: 80 e2 ldi r24, 0x20 ; 32 4e22: 90 e0 ldi r25, 0x00 ; 0 4e24: b3 01 movw r22, r6 - 4e26: 41 d1 rcall .+642 ; 0x50aa - 4e28: e1 10 cpse r14, r1 - 4e2a: ea 94 dec r14 - 4e2c: 08 94 sec - 4e2e: c1 08 sbc r12, r1 - 4e30: d1 08 sbc r13, r1 - 4e32: c1 14 cp r12, r1 - 4e34: d1 04 cpc r13, r1 - 4e36: 79 f7 brne .-34 ; 0x4e16 - 4e38: df c0 rjmp .+446 ; 0x4ff8 - 4e3a: 84 36 cpi r24, 0x64 ; 100 - 4e3c: 11 f0 breq .+4 ; 0x4e42 - 4e3e: 89 36 cpi r24, 0x69 ; 105 - 4e40: 49 f5 brne .+82 ; 0x4e94 - 4e42: f5 01 movw r30, r10 - 4e44: 17 ff sbrs r17, 7 - 4e46: 07 c0 rjmp .+14 ; 0x4e56 - 4e48: 80 81 ld r24, Z - 4e4a: 91 81 ldd r25, Z+1 ; 0x01 - 4e4c: a2 81 ldd r26, Z+2 ; 0x02 - 4e4e: b3 81 ldd r27, Z+3 ; 0x03 - 4e50: 24 e0 ldi r18, 0x04 ; 4 - 4e52: 30 e0 ldi r19, 0x00 ; 0 - 4e54: 08 c0 rjmp .+16 ; 0x4e66 - 4e56: 80 81 ld r24, Z - 4e58: 91 81 ldd r25, Z+1 ; 0x01 - 4e5a: aa 27 eor r26, r26 - 4e5c: 97 fd sbrc r25, 7 - 4e5e: a0 95 com r26 - 4e60: ba 2f mov r27, r26 - 4e62: 22 e0 ldi r18, 0x02 ; 2 - 4e64: 30 e0 ldi r19, 0x00 ; 0 - 4e66: a2 0e add r10, r18 - 4e68: b3 1e adc r11, r19 - 4e6a: 01 2f mov r16, r17 - 4e6c: 0f 76 andi r16, 0x6F ; 111 - 4e6e: b7 ff sbrs r27, 7 - 4e70: 08 c0 rjmp .+16 ; 0x4e82 - 4e72: b0 95 com r27 - 4e74: a0 95 com r26 - 4e76: 90 95 com r25 - 4e78: 81 95 neg r24 - 4e7a: 9f 4f sbci r25, 0xFF ; 255 - 4e7c: af 4f sbci r26, 0xFF ; 255 - 4e7e: bf 4f sbci r27, 0xFF ; 255 - 4e80: 00 68 ori r16, 0x80 ; 128 - 4e82: bc 01 movw r22, r24 - 4e84: cd 01 movw r24, r26 - 4e86: a2 01 movw r20, r4 - 4e88: 2a e0 ldi r18, 0x0A ; 10 - 4e8a: 30 e0 ldi r19, 0x00 ; 0 - 4e8c: 3a d1 rcall .+628 ; 0x5102 <__ultoa_invert> - 4e8e: d8 2e mov r13, r24 - 4e90: d4 18 sub r13, r4 - 4e92: 3e c0 rjmp .+124 ; 0x4f10 - 4e94: 85 37 cpi r24, 0x75 ; 117 - 4e96: 21 f4 brne .+8 ; 0x4ea0 - 4e98: 1f 7e andi r17, 0xEF ; 239 - 4e9a: 2a e0 ldi r18, 0x0A ; 10 - 4e9c: 30 e0 ldi r19, 0x00 ; 0 - 4e9e: 20 c0 rjmp .+64 ; 0x4ee0 - 4ea0: 19 7f andi r17, 0xF9 ; 249 - 4ea2: 8f 36 cpi r24, 0x6F ; 111 - 4ea4: a9 f0 breq .+42 ; 0x4ed0 - 4ea6: 80 37 cpi r24, 0x70 ; 112 - 4ea8: 20 f4 brcc .+8 ; 0x4eb2 - 4eaa: 88 35 cpi r24, 0x58 ; 88 - 4eac: 09 f0 breq .+2 ; 0x4eb0 - 4eae: a7 c0 rjmp .+334 ; 0x4ffe - 4eb0: 0b c0 rjmp .+22 ; 0x4ec8 - 4eb2: 80 37 cpi r24, 0x70 ; 112 - 4eb4: 21 f0 breq .+8 ; 0x4ebe - 4eb6: 88 37 cpi r24, 0x78 ; 120 - 4eb8: 09 f0 breq .+2 ; 0x4ebc - 4eba: a1 c0 rjmp .+322 ; 0x4ffe - 4ebc: 01 c0 rjmp .+2 ; 0x4ec0 - 4ebe: 10 61 ori r17, 0x10 ; 16 - 4ec0: 14 ff sbrs r17, 4 - 4ec2: 09 c0 rjmp .+18 ; 0x4ed6 - 4ec4: 14 60 ori r17, 0x04 ; 4 - 4ec6: 07 c0 rjmp .+14 ; 0x4ed6 - 4ec8: 14 ff sbrs r17, 4 - 4eca: 08 c0 rjmp .+16 ; 0x4edc - 4ecc: 16 60 ori r17, 0x06 ; 6 - 4ece: 06 c0 rjmp .+12 ; 0x4edc - 4ed0: 28 e0 ldi r18, 0x08 ; 8 - 4ed2: 30 e0 ldi r19, 0x00 ; 0 - 4ed4: 05 c0 rjmp .+10 ; 0x4ee0 - 4ed6: 20 e1 ldi r18, 0x10 ; 16 - 4ed8: 30 e0 ldi r19, 0x00 ; 0 - 4eda: 02 c0 rjmp .+4 ; 0x4ee0 - 4edc: 20 e1 ldi r18, 0x10 ; 16 - 4ede: 32 e0 ldi r19, 0x02 ; 2 - 4ee0: f5 01 movw r30, r10 - 4ee2: 17 ff sbrs r17, 7 - 4ee4: 07 c0 rjmp .+14 ; 0x4ef4 - 4ee6: 60 81 ld r22, Z - 4ee8: 71 81 ldd r23, Z+1 ; 0x01 - 4eea: 82 81 ldd r24, Z+2 ; 0x02 - 4eec: 93 81 ldd r25, Z+3 ; 0x03 - 4eee: 44 e0 ldi r20, 0x04 ; 4 - 4ef0: 50 e0 ldi r21, 0x00 ; 0 - 4ef2: 06 c0 rjmp .+12 ; 0x4f00 - 4ef4: 60 81 ld r22, Z - 4ef6: 71 81 ldd r23, Z+1 ; 0x01 - 4ef8: 80 e0 ldi r24, 0x00 ; 0 - 4efa: 90 e0 ldi r25, 0x00 ; 0 - 4efc: 42 e0 ldi r20, 0x02 ; 2 - 4efe: 50 e0 ldi r21, 0x00 ; 0 - 4f00: a4 0e add r10, r20 - 4f02: b5 1e adc r11, r21 - 4f04: a2 01 movw r20, r4 - 4f06: fd d0 rcall .+506 ; 0x5102 <__ultoa_invert> - 4f08: d8 2e mov r13, r24 - 4f0a: d4 18 sub r13, r4 - 4f0c: 01 2f mov r16, r17 - 4f0e: 0f 77 andi r16, 0x7F ; 127 - 4f10: 06 ff sbrs r16, 6 - 4f12: 09 c0 rjmp .+18 ; 0x4f26 - 4f14: 0e 7f andi r16, 0xFE ; 254 - 4f16: df 14 cp r13, r15 - 4f18: 30 f4 brcc .+12 ; 0x4f26 - 4f1a: 04 ff sbrs r16, 4 - 4f1c: 06 c0 rjmp .+12 ; 0x4f2a - 4f1e: 02 fd sbrc r16, 2 - 4f20: 04 c0 rjmp .+8 ; 0x4f2a - 4f22: 0f 7e andi r16, 0xEF ; 239 - 4f24: 02 c0 rjmp .+4 ; 0x4f2a - 4f26: 1d 2d mov r17, r13 - 4f28: 01 c0 rjmp .+2 ; 0x4f2c - 4f2a: 1f 2d mov r17, r15 - 4f2c: 80 2f mov r24, r16 - 4f2e: 90 e0 ldi r25, 0x00 ; 0 - 4f30: 04 ff sbrs r16, 4 - 4f32: 0c c0 rjmp .+24 ; 0x4f4c - 4f34: fe 01 movw r30, r28 - 4f36: ed 0d add r30, r13 - 4f38: f1 1d adc r31, r1 - 4f3a: 20 81 ld r18, Z - 4f3c: 20 33 cpi r18, 0x30 ; 48 - 4f3e: 11 f4 brne .+4 ; 0x4f44 - 4f40: 09 7e andi r16, 0xE9 ; 233 - 4f42: 09 c0 rjmp .+18 ; 0x4f56 - 4f44: 02 ff sbrs r16, 2 - 4f46: 06 c0 rjmp .+12 ; 0x4f54 - 4f48: 1e 5f subi r17, 0xFE ; 254 - 4f4a: 05 c0 rjmp .+10 ; 0x4f56 - 4f4c: 86 78 andi r24, 0x86 ; 134 - 4f4e: 90 70 andi r25, 0x00 ; 0 - 4f50: 00 97 sbiw r24, 0x00 ; 0 - 4f52: 09 f0 breq .+2 ; 0x4f56 - 4f54: 1f 5f subi r17, 0xFF ; 255 - 4f56: 80 2e mov r8, r16 - 4f58: 99 24 eor r9, r9 - 4f5a: 03 fd sbrc r16, 3 - 4f5c: 11 c0 rjmp .+34 ; 0x4f80 - 4f5e: 00 ff sbrs r16, 0 - 4f60: 0c c0 rjmp .+24 ; 0x4f7a - 4f62: fd 2c mov r15, r13 - 4f64: 1e 15 cp r17, r14 - 4f66: 48 f4 brcc .+18 ; 0x4f7a - 4f68: fe 0c add r15, r14 - 4f6a: f1 1a sub r15, r17 - 4f6c: 1e 2d mov r17, r14 - 4f6e: 05 c0 rjmp .+10 ; 0x4f7a - 4f70: 80 e2 ldi r24, 0x20 ; 32 - 4f72: 90 e0 ldi r25, 0x00 ; 0 - 4f74: b3 01 movw r22, r6 - 4f76: 99 d0 rcall .+306 ; 0x50aa - 4f78: 1f 5f subi r17, 0xFF ; 255 - 4f7a: 1e 15 cp r17, r14 - 4f7c: c8 f3 brcs .-14 ; 0x4f70 - 4f7e: 04 c0 rjmp .+8 ; 0x4f88 - 4f80: 1e 15 cp r17, r14 - 4f82: 10 f4 brcc .+4 ; 0x4f88 - 4f84: e1 1a sub r14, r17 - 4f86: 01 c0 rjmp .+2 ; 0x4f8a - 4f88: ee 24 eor r14, r14 - 4f8a: 84 fe sbrs r8, 4 - 4f8c: 0e c0 rjmp .+28 ; 0x4faa - 4f8e: 80 e3 ldi r24, 0x30 ; 48 - 4f90: 90 e0 ldi r25, 0x00 ; 0 - 4f92: b3 01 movw r22, r6 - 4f94: 8a d0 rcall .+276 ; 0x50aa - 4f96: 82 fe sbrs r8, 2 - 4f98: 1d c0 rjmp .+58 ; 0x4fd4 - 4f9a: 81 fe sbrs r8, 1 - 4f9c: 03 c0 rjmp .+6 ; 0x4fa4 - 4f9e: 88 e5 ldi r24, 0x58 ; 88 - 4fa0: 90 e0 ldi r25, 0x00 ; 0 - 4fa2: 10 c0 rjmp .+32 ; 0x4fc4 - 4fa4: 88 e7 ldi r24, 0x78 ; 120 - 4fa6: 90 e0 ldi r25, 0x00 ; 0 - 4fa8: 0d c0 rjmp .+26 ; 0x4fc4 - 4faa: c4 01 movw r24, r8 - 4fac: 86 78 andi r24, 0x86 ; 134 - 4fae: 90 70 andi r25, 0x00 ; 0 - 4fb0: 00 97 sbiw r24, 0x00 ; 0 - 4fb2: 81 f0 breq .+32 ; 0x4fd4 - 4fb4: 81 fc sbrc r8, 1 - 4fb6: 02 c0 rjmp .+4 ; 0x4fbc - 4fb8: 80 e2 ldi r24, 0x20 ; 32 - 4fba: 01 c0 rjmp .+2 ; 0x4fbe - 4fbc: 8b e2 ldi r24, 0x2B ; 43 - 4fbe: 07 fd sbrc r16, 7 - 4fc0: 8d e2 ldi r24, 0x2D ; 45 - 4fc2: 90 e0 ldi r25, 0x00 ; 0 - 4fc4: b3 01 movw r22, r6 - 4fc6: 71 d0 rcall .+226 ; 0x50aa - 4fc8: 05 c0 rjmp .+10 ; 0x4fd4 - 4fca: 80 e3 ldi r24, 0x30 ; 48 - 4fcc: 90 e0 ldi r25, 0x00 ; 0 - 4fce: b3 01 movw r22, r6 - 4fd0: 6c d0 rcall .+216 ; 0x50aa - 4fd2: fa 94 dec r15 - 4fd4: df 14 cp r13, r15 - 4fd6: c8 f3 brcs .-14 ; 0x4fca - 4fd8: da 94 dec r13 - 4fda: f2 01 movw r30, r4 - 4fdc: ed 0d add r30, r13 - 4fde: f1 1d adc r31, r1 - 4fe0: 80 81 ld r24, Z + 4e26: 51 d1 rcall .+674 ; 0x50ca + 4e28: ea 94 dec r14 + 4e2a: 8e 2d mov r24, r14 + 4e2c: 90 e0 ldi r25, 0x00 ; 0 + 4e2e: c8 16 cp r12, r24 + 4e30: d9 06 cpc r13, r25 + 4e32: b0 f3 brcs .-20 ; 0x4e20 + 4e34: 0e c0 rjmp .+28 ; 0x4e52 + 4e36: f4 01 movw r30, r8 + 4e38: 17 fd sbrc r17, 7 + 4e3a: 85 91 lpm r24, Z+ + 4e3c: 17 ff sbrs r17, 7 + 4e3e: 81 91 ld r24, Z+ + 4e40: 4f 01 movw r8, r30 + 4e42: 90 e0 ldi r25, 0x00 ; 0 + 4e44: b3 01 movw r22, r6 + 4e46: 41 d1 rcall .+642 ; 0x50ca + 4e48: e1 10 cpse r14, r1 + 4e4a: ea 94 dec r14 + 4e4c: 08 94 sec + 4e4e: c1 08 sbc r12, r1 + 4e50: d1 08 sbc r13, r1 + 4e52: c1 14 cp r12, r1 + 4e54: d1 04 cpc r13, r1 + 4e56: 79 f7 brne .-34 ; 0x4e36 + 4e58: df c0 rjmp .+446 ; 0x5018 + 4e5a: 84 36 cpi r24, 0x64 ; 100 + 4e5c: 11 f0 breq .+4 ; 0x4e62 + 4e5e: 89 36 cpi r24, 0x69 ; 105 + 4e60: 49 f5 brne .+82 ; 0x4eb4 + 4e62: f5 01 movw r30, r10 + 4e64: 17 ff sbrs r17, 7 + 4e66: 07 c0 rjmp .+14 ; 0x4e76 + 4e68: 80 81 ld r24, Z + 4e6a: 91 81 ldd r25, Z+1 ; 0x01 + 4e6c: a2 81 ldd r26, Z+2 ; 0x02 + 4e6e: b3 81 ldd r27, Z+3 ; 0x03 + 4e70: 24 e0 ldi r18, 0x04 ; 4 + 4e72: 30 e0 ldi r19, 0x00 ; 0 + 4e74: 08 c0 rjmp .+16 ; 0x4e86 + 4e76: 80 81 ld r24, Z + 4e78: 91 81 ldd r25, Z+1 ; 0x01 + 4e7a: aa 27 eor r26, r26 + 4e7c: 97 fd sbrc r25, 7 + 4e7e: a0 95 com r26 + 4e80: ba 2f mov r27, r26 + 4e82: 22 e0 ldi r18, 0x02 ; 2 + 4e84: 30 e0 ldi r19, 0x00 ; 0 + 4e86: a2 0e add r10, r18 + 4e88: b3 1e adc r11, r19 + 4e8a: 01 2f mov r16, r17 + 4e8c: 0f 76 andi r16, 0x6F ; 111 + 4e8e: b7 ff sbrs r27, 7 + 4e90: 08 c0 rjmp .+16 ; 0x4ea2 + 4e92: b0 95 com r27 + 4e94: a0 95 com r26 + 4e96: 90 95 com r25 + 4e98: 81 95 neg r24 + 4e9a: 9f 4f sbci r25, 0xFF ; 255 + 4e9c: af 4f sbci r26, 0xFF ; 255 + 4e9e: bf 4f sbci r27, 0xFF ; 255 + 4ea0: 00 68 ori r16, 0x80 ; 128 + 4ea2: bc 01 movw r22, r24 + 4ea4: cd 01 movw r24, r26 + 4ea6: a2 01 movw r20, r4 + 4ea8: 2a e0 ldi r18, 0x0A ; 10 + 4eaa: 30 e0 ldi r19, 0x00 ; 0 + 4eac: 3a d1 rcall .+628 ; 0x5122 <__ultoa_invert> + 4eae: d8 2e mov r13, r24 + 4eb0: d4 18 sub r13, r4 + 4eb2: 3e c0 rjmp .+124 ; 0x4f30 + 4eb4: 85 37 cpi r24, 0x75 ; 117 + 4eb6: 21 f4 brne .+8 ; 0x4ec0 + 4eb8: 1f 7e andi r17, 0xEF ; 239 + 4eba: 2a e0 ldi r18, 0x0A ; 10 + 4ebc: 30 e0 ldi r19, 0x00 ; 0 + 4ebe: 20 c0 rjmp .+64 ; 0x4f00 + 4ec0: 19 7f andi r17, 0xF9 ; 249 + 4ec2: 8f 36 cpi r24, 0x6F ; 111 + 4ec4: a9 f0 breq .+42 ; 0x4ef0 + 4ec6: 80 37 cpi r24, 0x70 ; 112 + 4ec8: 20 f4 brcc .+8 ; 0x4ed2 + 4eca: 88 35 cpi r24, 0x58 ; 88 + 4ecc: 09 f0 breq .+2 ; 0x4ed0 + 4ece: a7 c0 rjmp .+334 ; 0x501e + 4ed0: 0b c0 rjmp .+22 ; 0x4ee8 + 4ed2: 80 37 cpi r24, 0x70 ; 112 + 4ed4: 21 f0 breq .+8 ; 0x4ede + 4ed6: 88 37 cpi r24, 0x78 ; 120 + 4ed8: 09 f0 breq .+2 ; 0x4edc + 4eda: a1 c0 rjmp .+322 ; 0x501e + 4edc: 01 c0 rjmp .+2 ; 0x4ee0 + 4ede: 10 61 ori r17, 0x10 ; 16 + 4ee0: 14 ff sbrs r17, 4 + 4ee2: 09 c0 rjmp .+18 ; 0x4ef6 + 4ee4: 14 60 ori r17, 0x04 ; 4 + 4ee6: 07 c0 rjmp .+14 ; 0x4ef6 + 4ee8: 14 ff sbrs r17, 4 + 4eea: 08 c0 rjmp .+16 ; 0x4efc + 4eec: 16 60 ori r17, 0x06 ; 6 + 4eee: 06 c0 rjmp .+12 ; 0x4efc + 4ef0: 28 e0 ldi r18, 0x08 ; 8 + 4ef2: 30 e0 ldi r19, 0x00 ; 0 + 4ef4: 05 c0 rjmp .+10 ; 0x4f00 + 4ef6: 20 e1 ldi r18, 0x10 ; 16 + 4ef8: 30 e0 ldi r19, 0x00 ; 0 + 4efa: 02 c0 rjmp .+4 ; 0x4f00 + 4efc: 20 e1 ldi r18, 0x10 ; 16 + 4efe: 32 e0 ldi r19, 0x02 ; 2 + 4f00: f5 01 movw r30, r10 + 4f02: 17 ff sbrs r17, 7 + 4f04: 07 c0 rjmp .+14 ; 0x4f14 + 4f06: 60 81 ld r22, Z + 4f08: 71 81 ldd r23, Z+1 ; 0x01 + 4f0a: 82 81 ldd r24, Z+2 ; 0x02 + 4f0c: 93 81 ldd r25, Z+3 ; 0x03 + 4f0e: 44 e0 ldi r20, 0x04 ; 4 + 4f10: 50 e0 ldi r21, 0x00 ; 0 + 4f12: 06 c0 rjmp .+12 ; 0x4f20 + 4f14: 60 81 ld r22, Z + 4f16: 71 81 ldd r23, Z+1 ; 0x01 + 4f18: 80 e0 ldi r24, 0x00 ; 0 + 4f1a: 90 e0 ldi r25, 0x00 ; 0 + 4f1c: 42 e0 ldi r20, 0x02 ; 2 + 4f1e: 50 e0 ldi r21, 0x00 ; 0 + 4f20: a4 0e add r10, r20 + 4f22: b5 1e adc r11, r21 + 4f24: a2 01 movw r20, r4 + 4f26: fd d0 rcall .+506 ; 0x5122 <__ultoa_invert> + 4f28: d8 2e mov r13, r24 + 4f2a: d4 18 sub r13, r4 + 4f2c: 01 2f mov r16, r17 + 4f2e: 0f 77 andi r16, 0x7F ; 127 + 4f30: 06 ff sbrs r16, 6 + 4f32: 09 c0 rjmp .+18 ; 0x4f46 + 4f34: 0e 7f andi r16, 0xFE ; 254 + 4f36: df 14 cp r13, r15 + 4f38: 30 f4 brcc .+12 ; 0x4f46 + 4f3a: 04 ff sbrs r16, 4 + 4f3c: 06 c0 rjmp .+12 ; 0x4f4a + 4f3e: 02 fd sbrc r16, 2 + 4f40: 04 c0 rjmp .+8 ; 0x4f4a + 4f42: 0f 7e andi r16, 0xEF ; 239 + 4f44: 02 c0 rjmp .+4 ; 0x4f4a + 4f46: 1d 2d mov r17, r13 + 4f48: 01 c0 rjmp .+2 ; 0x4f4c + 4f4a: 1f 2d mov r17, r15 + 4f4c: 80 2f mov r24, r16 + 4f4e: 90 e0 ldi r25, 0x00 ; 0 + 4f50: 04 ff sbrs r16, 4 + 4f52: 0c c0 rjmp .+24 ; 0x4f6c + 4f54: fe 01 movw r30, r28 + 4f56: ed 0d add r30, r13 + 4f58: f1 1d adc r31, r1 + 4f5a: 20 81 ld r18, Z + 4f5c: 20 33 cpi r18, 0x30 ; 48 + 4f5e: 11 f4 brne .+4 ; 0x4f64 + 4f60: 09 7e andi r16, 0xE9 ; 233 + 4f62: 09 c0 rjmp .+18 ; 0x4f76 + 4f64: 02 ff sbrs r16, 2 + 4f66: 06 c0 rjmp .+12 ; 0x4f74 + 4f68: 1e 5f subi r17, 0xFE ; 254 + 4f6a: 05 c0 rjmp .+10 ; 0x4f76 + 4f6c: 86 78 andi r24, 0x86 ; 134 + 4f6e: 90 70 andi r25, 0x00 ; 0 + 4f70: 00 97 sbiw r24, 0x00 ; 0 + 4f72: 09 f0 breq .+2 ; 0x4f76 + 4f74: 1f 5f subi r17, 0xFF ; 255 + 4f76: 80 2e mov r8, r16 + 4f78: 99 24 eor r9, r9 + 4f7a: 03 fd sbrc r16, 3 + 4f7c: 11 c0 rjmp .+34 ; 0x4fa0 + 4f7e: 00 ff sbrs r16, 0 + 4f80: 0c c0 rjmp .+24 ; 0x4f9a + 4f82: fd 2c mov r15, r13 + 4f84: 1e 15 cp r17, r14 + 4f86: 48 f4 brcc .+18 ; 0x4f9a + 4f88: fe 0c add r15, r14 + 4f8a: f1 1a sub r15, r17 + 4f8c: 1e 2d mov r17, r14 + 4f8e: 05 c0 rjmp .+10 ; 0x4f9a + 4f90: 80 e2 ldi r24, 0x20 ; 32 + 4f92: 90 e0 ldi r25, 0x00 ; 0 + 4f94: b3 01 movw r22, r6 + 4f96: 99 d0 rcall .+306 ; 0x50ca + 4f98: 1f 5f subi r17, 0xFF ; 255 + 4f9a: 1e 15 cp r17, r14 + 4f9c: c8 f3 brcs .-14 ; 0x4f90 + 4f9e: 04 c0 rjmp .+8 ; 0x4fa8 + 4fa0: 1e 15 cp r17, r14 + 4fa2: 10 f4 brcc .+4 ; 0x4fa8 + 4fa4: e1 1a sub r14, r17 + 4fa6: 01 c0 rjmp .+2 ; 0x4faa + 4fa8: ee 24 eor r14, r14 + 4faa: 84 fe sbrs r8, 4 + 4fac: 0e c0 rjmp .+28 ; 0x4fca + 4fae: 80 e3 ldi r24, 0x30 ; 48 + 4fb0: 90 e0 ldi r25, 0x00 ; 0 + 4fb2: b3 01 movw r22, r6 + 4fb4: 8a d0 rcall .+276 ; 0x50ca + 4fb6: 82 fe sbrs r8, 2 + 4fb8: 1d c0 rjmp .+58 ; 0x4ff4 + 4fba: 81 fe sbrs r8, 1 + 4fbc: 03 c0 rjmp .+6 ; 0x4fc4 + 4fbe: 88 e5 ldi r24, 0x58 ; 88 + 4fc0: 90 e0 ldi r25, 0x00 ; 0 + 4fc2: 10 c0 rjmp .+32 ; 0x4fe4 + 4fc4: 88 e7 ldi r24, 0x78 ; 120 + 4fc6: 90 e0 ldi r25, 0x00 ; 0 + 4fc8: 0d c0 rjmp .+26 ; 0x4fe4 + 4fca: c4 01 movw r24, r8 + 4fcc: 86 78 andi r24, 0x86 ; 134 + 4fce: 90 70 andi r25, 0x00 ; 0 + 4fd0: 00 97 sbiw r24, 0x00 ; 0 + 4fd2: 81 f0 breq .+32 ; 0x4ff4 + 4fd4: 81 fc sbrc r8, 1 + 4fd6: 02 c0 rjmp .+4 ; 0x4fdc + 4fd8: 80 e2 ldi r24, 0x20 ; 32 + 4fda: 01 c0 rjmp .+2 ; 0x4fde + 4fdc: 8b e2 ldi r24, 0x2B ; 43 + 4fde: 07 fd sbrc r16, 7 + 4fe0: 8d e2 ldi r24, 0x2D ; 45 4fe2: 90 e0 ldi r25, 0x00 ; 0 4fe4: b3 01 movw r22, r6 - 4fe6: 61 d0 rcall .+194 ; 0x50aa - 4fe8: dd 20 and r13, r13 - 4fea: b1 f7 brne .-20 ; 0x4fd8 - 4fec: 05 c0 rjmp .+10 ; 0x4ff8 - 4fee: 80 e2 ldi r24, 0x20 ; 32 - 4ff0: 90 e0 ldi r25, 0x00 ; 0 - 4ff2: b3 01 movw r22, r6 - 4ff4: 5a d0 rcall .+180 ; 0x50aa - 4ff6: ea 94 dec r14 - 4ff8: ee 20 and r14, r14 - 4ffa: c9 f7 brne .-14 ; 0x4fee - 4ffc: 4d ce rjmp .-870 ; 0x4c98 - 4ffe: f3 01 movw r30, r6 - 5000: 86 81 ldd r24, Z+6 ; 0x06 - 5002: 97 81 ldd r25, Z+7 ; 0x07 - 5004: 02 c0 rjmp .+4 ; 0x500a - 5006: 8f ef ldi r24, 0xFF ; 255 - 5008: 9f ef ldi r25, 0xFF ; 255 - 500a: 2d 96 adiw r28, 0x0d ; 13 - 500c: e2 e1 ldi r30, 0x12 ; 18 - 500e: 0b c1 rjmp .+534 ; 0x5226 <__epilogue_restores__> + 4fe6: 71 d0 rcall .+226 ; 0x50ca + 4fe8: 05 c0 rjmp .+10 ; 0x4ff4 + 4fea: 80 e3 ldi r24, 0x30 ; 48 + 4fec: 90 e0 ldi r25, 0x00 ; 0 + 4fee: b3 01 movw r22, r6 + 4ff0: 6c d0 rcall .+216 ; 0x50ca + 4ff2: fa 94 dec r15 + 4ff4: df 14 cp r13, r15 + 4ff6: c8 f3 brcs .-14 ; 0x4fea + 4ff8: da 94 dec r13 + 4ffa: f2 01 movw r30, r4 + 4ffc: ed 0d add r30, r13 + 4ffe: f1 1d adc r31, r1 + 5000: 80 81 ld r24, Z + 5002: 90 e0 ldi r25, 0x00 ; 0 + 5004: b3 01 movw r22, r6 + 5006: 61 d0 rcall .+194 ; 0x50ca + 5008: dd 20 and r13, r13 + 500a: b1 f7 brne .-20 ; 0x4ff8 + 500c: 05 c0 rjmp .+10 ; 0x5018 + 500e: 80 e2 ldi r24, 0x20 ; 32 + 5010: 90 e0 ldi r25, 0x00 ; 0 + 5012: b3 01 movw r22, r6 + 5014: 5a d0 rcall .+180 ; 0x50ca + 5016: ea 94 dec r14 + 5018: ee 20 and r14, r14 + 501a: c9 f7 brne .-14 ; 0x500e + 501c: 4d ce rjmp .-870 ; 0x4cb8 + 501e: f3 01 movw r30, r6 + 5020: 86 81 ldd r24, Z+6 ; 0x06 + 5022: 97 81 ldd r25, Z+7 ; 0x07 + 5024: 02 c0 rjmp .+4 ; 0x502a + 5026: 8f ef ldi r24, 0xFF ; 255 + 5028: 9f ef ldi r25, 0xFF ; 255 + 502a: 2d 96 adiw r28, 0x0d ; 13 + 502c: e2 e1 ldi r30, 0x12 ; 18 + 502e: 0b c1 rjmp .+534 ; 0x5246 <__epilogue_restores__> -00005010 <__eerd_block_x32a4u>: - 5010: e0 ec ldi r30, 0xC0 ; 192 - 5012: f1 e0 ldi r31, 0x01 ; 1 - 5014: a7 85 ldd r26, Z+15 ; 0x0f - 5016: a7 fd sbrc r26, 7 - 5018: fd cf rjmp .-6 ; 0x5014 <__eerd_block_x32a4u+0x4> - 501a: a4 85 ldd r26, Z+12 ; 0x0c - 501c: a8 60 ori r26, 0x08 ; 8 - 501e: a4 87 std Z+12, r26 ; 0x0c - 5020: 60 50 subi r22, 0x00 ; 0 - 5022: 70 4f sbci r23, 0xF0 ; 240 - 5024: f0 cd rjmp .-1056 ; 0x4c06 +00005030 <__eerd_block_x32a4u>: + 5030: e0 ec ldi r30, 0xC0 ; 192 + 5032: f1 e0 ldi r31, 0x01 ; 1 + 5034: a7 85 ldd r26, Z+15 ; 0x0f + 5036: a7 fd sbrc r26, 7 + 5038: fd cf rjmp .-6 ; 0x5034 <__eerd_block_x32a4u+0x4> + 503a: a4 85 ldd r26, Z+12 ; 0x0c + 503c: a8 60 ori r26, 0x08 ; 8 + 503e: a4 87 std Z+12, r26 ; 0x0c + 5040: 60 50 subi r22, 0x00 ; 0 + 5042: 70 4f sbci r23, 0xF0 ; 240 + 5044: f0 cd rjmp .-1056 ; 0x4c26 -00005026 <__eewr_block_x32a4u>: - 5026: dc 01 movw r26, r24 - 5028: cb 01 movw r24, r22 - 502a: 02 c0 rjmp .+4 ; 0x5030 <__eewr_block_x32a4u+0xa> - 502c: 2d 91 ld r18, X+ - 502e: 05 d0 rcall .+10 ; 0x503a <__eewr_r18_x32a4u> - 5030: 41 50 subi r20, 0x01 ; 1 - 5032: 50 40 sbci r21, 0x00 ; 0 - 5034: d8 f7 brcc .-10 ; 0x502c <__eewr_block_x32a4u+0x6> - 5036: 08 95 ret +00005046 <__eewr_block_x32a4u>: + 5046: dc 01 movw r26, r24 + 5048: cb 01 movw r24, r22 + 504a: 02 c0 rjmp .+4 ; 0x5050 <__eewr_block_x32a4u+0xa> + 504c: 2d 91 ld r18, X+ + 504e: 05 d0 rcall .+10 ; 0x505a <__eewr_r18_x32a4u> + 5050: 41 50 subi r20, 0x01 ; 1 + 5052: 50 40 sbci r21, 0x00 ; 0 + 5054: d8 f7 brcc .-10 ; 0x504c <__eewr_block_x32a4u+0x6> + 5056: 08 95 ret -00005038 <__eewr_byte_x32a4u>: - 5038: 26 2f mov r18, r22 +00005058 <__eewr_byte_x32a4u>: + 5058: 26 2f mov r18, r22 -0000503a <__eewr_r18_x32a4u>: - 503a: e0 ec ldi r30, 0xC0 ; 192 - 503c: f1 e0 ldi r31, 0x01 ; 1 - 503e: 37 85 ldd r19, Z+15 ; 0x0f - 5040: 37 fd sbrc r19, 7 - 5042: fd cf rjmp .-6 ; 0x503e <__eewr_r18_x32a4u+0x4> - 5044: 34 85 ldd r19, Z+12 ; 0x0c - 5046: 37 7f andi r19, 0xF7 ; 247 - 5048: 34 87 std Z+12, r19 ; 0x0c - 504a: 37 85 ldd r19, Z+15 ; 0x0f - 504c: 31 ff sbrs r19, 1 - 504e: 09 c0 rjmp .+18 ; 0x5062 <__eewr_r18_x32a4u+0x28> - 5050: 36 e3 ldi r19, 0x36 ; 54 - 5052: 32 87 std Z+10, r19 ; 0x0a - 5054: 38 ed ldi r19, 0xD8 ; 216 - 5056: 34 bf out 0x34, r19 ; 52 - 5058: 31 e0 ldi r19, 0x01 ; 1 - 505a: 33 87 std Z+11, r19 ; 0x0b - 505c: 37 85 ldd r19, Z+15 ; 0x0f - 505e: 37 fd sbrc r19, 7 - 5060: fd cf rjmp .-6 ; 0x505c <__eewr_r18_x32a4u+0x22> - 5062: 33 e3 ldi r19, 0x33 ; 51 - 5064: 32 87 std Z+10, r19 ; 0x0a - 5066: 80 83 st Z, r24 - 5068: 91 83 std Z+1, r25 ; 0x01 - 506a: 12 82 std Z+2, r1 ; 0x02 - 506c: 24 83 std Z+4, r18 ; 0x04 - 506e: 25 e3 ldi r18, 0x35 ; 53 - 5070: 22 87 std Z+10, r18 ; 0x0a - 5072: 28 ed ldi r18, 0xD8 ; 216 - 5074: 31 e0 ldi r19, 0x01 ; 1 - 5076: 24 bf out 0x34, r18 ; 52 - 5078: 33 87 std Z+11, r19 ; 0x0b - 507a: 01 96 adiw r24, 0x01 ; 1 - 507c: 08 95 ret +0000505a <__eewr_r18_x32a4u>: + 505a: e0 ec ldi r30, 0xC0 ; 192 + 505c: f1 e0 ldi r31, 0x01 ; 1 + 505e: 37 85 ldd r19, Z+15 ; 0x0f + 5060: 37 fd sbrc r19, 7 + 5062: fd cf rjmp .-6 ; 0x505e <__eewr_r18_x32a4u+0x4> + 5064: 34 85 ldd r19, Z+12 ; 0x0c + 5066: 37 7f andi r19, 0xF7 ; 247 + 5068: 34 87 std Z+12, r19 ; 0x0c + 506a: 37 85 ldd r19, Z+15 ; 0x0f + 506c: 31 ff sbrs r19, 1 + 506e: 09 c0 rjmp .+18 ; 0x5082 <__eewr_r18_x32a4u+0x28> + 5070: 36 e3 ldi r19, 0x36 ; 54 + 5072: 32 87 std Z+10, r19 ; 0x0a + 5074: 38 ed ldi r19, 0xD8 ; 216 + 5076: 34 bf out 0x34, r19 ; 52 + 5078: 31 e0 ldi r19, 0x01 ; 1 + 507a: 33 87 std Z+11, r19 ; 0x0b + 507c: 37 85 ldd r19, Z+15 ; 0x0f + 507e: 37 fd sbrc r19, 7 + 5080: fd cf rjmp .-6 ; 0x507c <__eewr_r18_x32a4u+0x22> + 5082: 33 e3 ldi r19, 0x33 ; 51 + 5084: 32 87 std Z+10, r19 ; 0x0a + 5086: 80 83 st Z, r24 + 5088: 91 83 std Z+1, r25 ; 0x01 + 508a: 12 82 std Z+2, r1 ; 0x02 + 508c: 24 83 std Z+4, r18 ; 0x04 + 508e: 25 e3 ldi r18, 0x35 ; 53 + 5090: 22 87 std Z+10, r18 ; 0x0a + 5092: 28 ed ldi r18, 0xD8 ; 216 + 5094: 31 e0 ldi r19, 0x01 ; 1 + 5096: 24 bf out 0x34, r18 ; 52 + 5098: 33 87 std Z+11, r19 ; 0x0b + 509a: 01 96 adiw r24, 0x01 ; 1 + 509c: 08 95 ret -0000507e : - 507e: fc 01 movw r30, r24 - 5080: 05 90 lpm r0, Z+ - 5082: 61 50 subi r22, 0x01 ; 1 - 5084: 70 40 sbci r23, 0x00 ; 0 - 5086: 01 10 cpse r0, r1 - 5088: d8 f7 brcc .-10 ; 0x5080 - 508a: 80 95 com r24 - 508c: 90 95 com r25 - 508e: 8e 0f add r24, r30 - 5090: 9f 1f adc r25, r31 - 5092: 08 95 ret +0000509e : + 509e: fc 01 movw r30, r24 + 50a0: 05 90 lpm r0, Z+ + 50a2: 61 50 subi r22, 0x01 ; 1 + 50a4: 70 40 sbci r23, 0x00 ; 0 + 50a6: 01 10 cpse r0, r1 + 50a8: d8 f7 brcc .-10 ; 0x50a0 + 50aa: 80 95 com r24 + 50ac: 90 95 com r25 + 50ae: 8e 0f add r24, r30 + 50b0: 9f 1f adc r25, r31 + 50b2: 08 95 ret -00005094 : - 5094: fc 01 movw r30, r24 - 5096: 61 50 subi r22, 0x01 ; 1 - 5098: 70 40 sbci r23, 0x00 ; 0 - 509a: 01 90 ld r0, Z+ - 509c: 01 10 cpse r0, r1 - 509e: d8 f7 brcc .-10 ; 0x5096 - 50a0: 80 95 com r24 - 50a2: 90 95 com r25 - 50a4: 8e 0f add r24, r30 - 50a6: 9f 1f adc r25, r31 - 50a8: 08 95 ret +000050b4 : + 50b4: fc 01 movw r30, r24 + 50b6: 61 50 subi r22, 0x01 ; 1 + 50b8: 70 40 sbci r23, 0x00 ; 0 + 50ba: 01 90 ld r0, Z+ + 50bc: 01 10 cpse r0, r1 + 50be: d8 f7 brcc .-10 ; 0x50b6 + 50c0: 80 95 com r24 + 50c2: 90 95 com r25 + 50c4: 8e 0f add r24, r30 + 50c6: 9f 1f adc r25, r31 + 50c8: 08 95 ret -000050aa : - 50aa: 0f 93 push r16 - 50ac: 1f 93 push r17 - 50ae: cf 93 push r28 - 50b0: df 93 push r29 - 50b2: 8c 01 movw r16, r24 - 50b4: eb 01 movw r28, r22 - 50b6: 8b 81 ldd r24, Y+3 ; 0x03 - 50b8: 81 ff sbrs r24, 1 - 50ba: 1b c0 rjmp .+54 ; 0x50f2 - 50bc: 82 ff sbrs r24, 2 - 50be: 0d c0 rjmp .+26 ; 0x50da - 50c0: 2e 81 ldd r18, Y+6 ; 0x06 - 50c2: 3f 81 ldd r19, Y+7 ; 0x07 - 50c4: 8c 81 ldd r24, Y+4 ; 0x04 - 50c6: 9d 81 ldd r25, Y+5 ; 0x05 - 50c8: 28 17 cp r18, r24 - 50ca: 39 07 cpc r19, r25 - 50cc: 64 f4 brge .+24 ; 0x50e6 - 50ce: e8 81 ld r30, Y - 50d0: f9 81 ldd r31, Y+1 ; 0x01 - 50d2: 01 93 st Z+, r16 - 50d4: e8 83 st Y, r30 - 50d6: f9 83 std Y+1, r31 ; 0x01 - 50d8: 06 c0 rjmp .+12 ; 0x50e6 - 50da: e8 85 ldd r30, Y+8 ; 0x08 - 50dc: f9 85 ldd r31, Y+9 ; 0x09 - 50de: 80 2f mov r24, r16 - 50e0: 09 95 icall - 50e2: 00 97 sbiw r24, 0x00 ; 0 - 50e4: 31 f4 brne .+12 ; 0x50f2 - 50e6: 8e 81 ldd r24, Y+6 ; 0x06 - 50e8: 9f 81 ldd r25, Y+7 ; 0x07 - 50ea: 01 96 adiw r24, 0x01 ; 1 - 50ec: 8e 83 std Y+6, r24 ; 0x06 - 50ee: 9f 83 std Y+7, r25 ; 0x07 - 50f0: 02 c0 rjmp .+4 ; 0x50f6 - 50f2: 0f ef ldi r16, 0xFF ; 255 - 50f4: 1f ef ldi r17, 0xFF ; 255 - 50f6: c8 01 movw r24, r16 - 50f8: df 91 pop r29 - 50fa: cf 91 pop r28 - 50fc: 1f 91 pop r17 - 50fe: 0f 91 pop r16 - 5100: 08 95 ret +000050ca : + 50ca: 0f 93 push r16 + 50cc: 1f 93 push r17 + 50ce: cf 93 push r28 + 50d0: df 93 push r29 + 50d2: 8c 01 movw r16, r24 + 50d4: eb 01 movw r28, r22 + 50d6: 8b 81 ldd r24, Y+3 ; 0x03 + 50d8: 81 ff sbrs r24, 1 + 50da: 1b c0 rjmp .+54 ; 0x5112 + 50dc: 82 ff sbrs r24, 2 + 50de: 0d c0 rjmp .+26 ; 0x50fa + 50e0: 2e 81 ldd r18, Y+6 ; 0x06 + 50e2: 3f 81 ldd r19, Y+7 ; 0x07 + 50e4: 8c 81 ldd r24, Y+4 ; 0x04 + 50e6: 9d 81 ldd r25, Y+5 ; 0x05 + 50e8: 28 17 cp r18, r24 + 50ea: 39 07 cpc r19, r25 + 50ec: 64 f4 brge .+24 ; 0x5106 + 50ee: e8 81 ld r30, Y + 50f0: f9 81 ldd r31, Y+1 ; 0x01 + 50f2: 01 93 st Z+, r16 + 50f4: e8 83 st Y, r30 + 50f6: f9 83 std Y+1, r31 ; 0x01 + 50f8: 06 c0 rjmp .+12 ; 0x5106 + 50fa: e8 85 ldd r30, Y+8 ; 0x08 + 50fc: f9 85 ldd r31, Y+9 ; 0x09 + 50fe: 80 2f mov r24, r16 + 5100: 09 95 icall + 5102: 00 97 sbiw r24, 0x00 ; 0 + 5104: 31 f4 brne .+12 ; 0x5112 + 5106: 8e 81 ldd r24, Y+6 ; 0x06 + 5108: 9f 81 ldd r25, Y+7 ; 0x07 + 510a: 01 96 adiw r24, 0x01 ; 1 + 510c: 8e 83 std Y+6, r24 ; 0x06 + 510e: 9f 83 std Y+7, r25 ; 0x07 + 5110: 02 c0 rjmp .+4 ; 0x5116 + 5112: 0f ef ldi r16, 0xFF ; 255 + 5114: 1f ef ldi r17, 0xFF ; 255 + 5116: c8 01 movw r24, r16 + 5118: df 91 pop r29 + 511a: cf 91 pop r28 + 511c: 1f 91 pop r17 + 511e: 0f 91 pop r16 + 5120: 08 95 ret -00005102 <__ultoa_invert>: - 5102: fa 01 movw r30, r20 - 5104: aa 27 eor r26, r26 - 5106: 28 30 cpi r18, 0x08 ; 8 - 5108: 51 f1 breq .+84 ; 0x515e <__ultoa_invert+0x5c> - 510a: 20 31 cpi r18, 0x10 ; 16 - 510c: 81 f1 breq .+96 ; 0x516e <__ultoa_invert+0x6c> - 510e: e8 94 clt - 5110: 6f 93 push r22 - 5112: 6e 7f andi r22, 0xFE ; 254 - 5114: 6e 5f subi r22, 0xFE ; 254 - 5116: 7f 4f sbci r23, 0xFF ; 255 - 5118: 8f 4f sbci r24, 0xFF ; 255 - 511a: 9f 4f sbci r25, 0xFF ; 255 - 511c: af 4f sbci r26, 0xFF ; 255 - 511e: b1 e0 ldi r27, 0x01 ; 1 - 5120: 3e d0 rcall .+124 ; 0x519e <__ultoa_invert+0x9c> - 5122: b4 e0 ldi r27, 0x04 ; 4 - 5124: 3c d0 rcall .+120 ; 0x519e <__ultoa_invert+0x9c> - 5126: 67 0f add r22, r23 - 5128: 78 1f adc r23, r24 - 512a: 89 1f adc r24, r25 - 512c: 9a 1f adc r25, r26 - 512e: a1 1d adc r26, r1 - 5130: 68 0f add r22, r24 - 5132: 79 1f adc r23, r25 - 5134: 8a 1f adc r24, r26 - 5136: 91 1d adc r25, r1 - 5138: a1 1d adc r26, r1 - 513a: 6a 0f add r22, r26 - 513c: 71 1d adc r23, r1 - 513e: 81 1d adc r24, r1 - 5140: 91 1d adc r25, r1 - 5142: a1 1d adc r26, r1 - 5144: 20 d0 rcall .+64 ; 0x5186 <__ultoa_invert+0x84> - 5146: 09 f4 brne .+2 ; 0x514a <__ultoa_invert+0x48> - 5148: 68 94 set - 514a: 3f 91 pop r19 - 514c: 2a e0 ldi r18, 0x0A ; 10 - 514e: 26 9f mul r18, r22 - 5150: 11 24 eor r1, r1 - 5152: 30 19 sub r19, r0 - 5154: 30 5d subi r19, 0xD0 ; 208 - 5156: 31 93 st Z+, r19 - 5158: de f6 brtc .-74 ; 0x5110 <__ultoa_invert+0xe> - 515a: cf 01 movw r24, r30 - 515c: 08 95 ret - 515e: 46 2f mov r20, r22 - 5160: 47 70 andi r20, 0x07 ; 7 - 5162: 40 5d subi r20, 0xD0 ; 208 - 5164: 41 93 st Z+, r20 - 5166: b3 e0 ldi r27, 0x03 ; 3 - 5168: 0f d0 rcall .+30 ; 0x5188 <__ultoa_invert+0x86> - 516a: c9 f7 brne .-14 ; 0x515e <__ultoa_invert+0x5c> - 516c: f6 cf rjmp .-20 ; 0x515a <__ultoa_invert+0x58> - 516e: 46 2f mov r20, r22 - 5170: 4f 70 andi r20, 0x0F ; 15 - 5172: 40 5d subi r20, 0xD0 ; 208 - 5174: 4a 33 cpi r20, 0x3A ; 58 - 5176: 18 f0 brcs .+6 ; 0x517e <__ultoa_invert+0x7c> - 5178: 49 5d subi r20, 0xD9 ; 217 - 517a: 31 fd sbrc r19, 1 - 517c: 40 52 subi r20, 0x20 ; 32 - 517e: 41 93 st Z+, r20 - 5180: 02 d0 rcall .+4 ; 0x5186 <__ultoa_invert+0x84> - 5182: a9 f7 brne .-22 ; 0x516e <__ultoa_invert+0x6c> - 5184: ea cf rjmp .-44 ; 0x515a <__ultoa_invert+0x58> - 5186: b4 e0 ldi r27, 0x04 ; 4 - 5188: a6 95 lsr r26 - 518a: 97 95 ror r25 - 518c: 87 95 ror r24 - 518e: 77 95 ror r23 - 5190: 67 95 ror r22 - 5192: ba 95 dec r27 - 5194: c9 f7 brne .-14 ; 0x5188 <__ultoa_invert+0x86> - 5196: 00 97 sbiw r24, 0x00 ; 0 - 5198: 61 05 cpc r22, r1 - 519a: 71 05 cpc r23, r1 - 519c: 08 95 ret - 519e: 9b 01 movw r18, r22 - 51a0: ac 01 movw r20, r24 - 51a2: 0a 2e mov r0, r26 - 51a4: 06 94 lsr r0 - 51a6: 57 95 ror r21 - 51a8: 47 95 ror r20 - 51aa: 37 95 ror r19 - 51ac: 27 95 ror r18 - 51ae: ba 95 dec r27 - 51b0: c9 f7 brne .-14 ; 0x51a4 <__ultoa_invert+0xa2> - 51b2: 62 0f add r22, r18 - 51b4: 73 1f adc r23, r19 - 51b6: 84 1f adc r24, r20 - 51b8: 95 1f adc r25, r21 - 51ba: a0 1d adc r26, r0 +00005122 <__ultoa_invert>: + 5122: fa 01 movw r30, r20 + 5124: aa 27 eor r26, r26 + 5126: 28 30 cpi r18, 0x08 ; 8 + 5128: 51 f1 breq .+84 ; 0x517e <__ultoa_invert+0x5c> + 512a: 20 31 cpi r18, 0x10 ; 16 + 512c: 81 f1 breq .+96 ; 0x518e <__ultoa_invert+0x6c> + 512e: e8 94 clt + 5130: 6f 93 push r22 + 5132: 6e 7f andi r22, 0xFE ; 254 + 5134: 6e 5f subi r22, 0xFE ; 254 + 5136: 7f 4f sbci r23, 0xFF ; 255 + 5138: 8f 4f sbci r24, 0xFF ; 255 + 513a: 9f 4f sbci r25, 0xFF ; 255 + 513c: af 4f sbci r26, 0xFF ; 255 + 513e: b1 e0 ldi r27, 0x01 ; 1 + 5140: 3e d0 rcall .+124 ; 0x51be <__ultoa_invert+0x9c> + 5142: b4 e0 ldi r27, 0x04 ; 4 + 5144: 3c d0 rcall .+120 ; 0x51be <__ultoa_invert+0x9c> + 5146: 67 0f add r22, r23 + 5148: 78 1f adc r23, r24 + 514a: 89 1f adc r24, r25 + 514c: 9a 1f adc r25, r26 + 514e: a1 1d adc r26, r1 + 5150: 68 0f add r22, r24 + 5152: 79 1f adc r23, r25 + 5154: 8a 1f adc r24, r26 + 5156: 91 1d adc r25, r1 + 5158: a1 1d adc r26, r1 + 515a: 6a 0f add r22, r26 + 515c: 71 1d adc r23, r1 + 515e: 81 1d adc r24, r1 + 5160: 91 1d adc r25, r1 + 5162: a1 1d adc r26, r1 + 5164: 20 d0 rcall .+64 ; 0x51a6 <__ultoa_invert+0x84> + 5166: 09 f4 brne .+2 ; 0x516a <__ultoa_invert+0x48> + 5168: 68 94 set + 516a: 3f 91 pop r19 + 516c: 2a e0 ldi r18, 0x0A ; 10 + 516e: 26 9f mul r18, r22 + 5170: 11 24 eor r1, r1 + 5172: 30 19 sub r19, r0 + 5174: 30 5d subi r19, 0xD0 ; 208 + 5176: 31 93 st Z+, r19 + 5178: de f6 brtc .-74 ; 0x5130 <__ultoa_invert+0xe> + 517a: cf 01 movw r24, r30 + 517c: 08 95 ret + 517e: 46 2f mov r20, r22 + 5180: 47 70 andi r20, 0x07 ; 7 + 5182: 40 5d subi r20, 0xD0 ; 208 + 5184: 41 93 st Z+, r20 + 5186: b3 e0 ldi r27, 0x03 ; 3 + 5188: 0f d0 rcall .+30 ; 0x51a8 <__ultoa_invert+0x86> + 518a: c9 f7 brne .-14 ; 0x517e <__ultoa_invert+0x5c> + 518c: f6 cf rjmp .-20 ; 0x517a <__ultoa_invert+0x58> + 518e: 46 2f mov r20, r22 + 5190: 4f 70 andi r20, 0x0F ; 15 + 5192: 40 5d subi r20, 0xD0 ; 208 + 5194: 4a 33 cpi r20, 0x3A ; 58 + 5196: 18 f0 brcs .+6 ; 0x519e <__ultoa_invert+0x7c> + 5198: 49 5d subi r20, 0xD9 ; 217 + 519a: 31 fd sbrc r19, 1 + 519c: 40 52 subi r20, 0x20 ; 32 + 519e: 41 93 st Z+, r20 + 51a0: 02 d0 rcall .+4 ; 0x51a6 <__ultoa_invert+0x84> + 51a2: a9 f7 brne .-22 ; 0x518e <__ultoa_invert+0x6c> + 51a4: ea cf rjmp .-44 ; 0x517a <__ultoa_invert+0x58> + 51a6: b4 e0 ldi r27, 0x04 ; 4 + 51a8: a6 95 lsr r26 + 51aa: 97 95 ror r25 + 51ac: 87 95 ror r24 + 51ae: 77 95 ror r23 + 51b0: 67 95 ror r22 + 51b2: ba 95 dec r27 + 51b4: c9 f7 brne .-14 ; 0x51a8 <__ultoa_invert+0x86> + 51b6: 00 97 sbiw r24, 0x00 ; 0 + 51b8: 61 05 cpc r22, r1 + 51ba: 71 05 cpc r23, r1 51bc: 08 95 ret + 51be: 9b 01 movw r18, r22 + 51c0: ac 01 movw r20, r24 + 51c2: 0a 2e mov r0, r26 + 51c4: 06 94 lsr r0 + 51c6: 57 95 ror r21 + 51c8: 47 95 ror r20 + 51ca: 37 95 ror r19 + 51cc: 27 95 ror r18 + 51ce: ba 95 dec r27 + 51d0: c9 f7 brne .-14 ; 0x51c4 <__ultoa_invert+0xa2> + 51d2: 62 0f add r22, r18 + 51d4: 73 1f adc r23, r19 + 51d6: 84 1f adc r24, r20 + 51d8: 95 1f adc r25, r21 + 51da: a0 1d adc r26, r0 + 51dc: 08 95 ret -000051be <__divmodsi4>: - 51be: 97 fb bst r25, 7 - 51c0: 09 2e mov r0, r25 - 51c2: 05 26 eor r0, r21 - 51c4: 0e d0 rcall .+28 ; 0x51e2 <__divmodsi4_neg1> - 51c6: 57 fd sbrc r21, 7 - 51c8: 04 d0 rcall .+8 ; 0x51d2 <__divmodsi4_neg2> - 51ca: 45 d0 rcall .+138 ; 0x5256 <__udivmodsi4> - 51cc: 0a d0 rcall .+20 ; 0x51e2 <__divmodsi4_neg1> - 51ce: 00 1c adc r0, r0 - 51d0: 38 f4 brcc .+14 ; 0x51e0 <__divmodsi4_exit> +000051de <__divmodsi4>: + 51de: 97 fb bst r25, 7 + 51e0: 09 2e mov r0, r25 + 51e2: 05 26 eor r0, r21 + 51e4: 0e d0 rcall .+28 ; 0x5202 <__divmodsi4_neg1> + 51e6: 57 fd sbrc r21, 7 + 51e8: 04 d0 rcall .+8 ; 0x51f2 <__divmodsi4_neg2> + 51ea: 45 d0 rcall .+138 ; 0x5276 <__udivmodsi4> + 51ec: 0a d0 rcall .+20 ; 0x5202 <__divmodsi4_neg1> + 51ee: 00 1c adc r0, r0 + 51f0: 38 f4 brcc .+14 ; 0x5200 <__divmodsi4_exit> -000051d2 <__divmodsi4_neg2>: - 51d2: 50 95 com r21 - 51d4: 40 95 com r20 - 51d6: 30 95 com r19 - 51d8: 21 95 neg r18 - 51da: 3f 4f sbci r19, 0xFF ; 255 - 51dc: 4f 4f sbci r20, 0xFF ; 255 - 51de: 5f 4f sbci r21, 0xFF ; 255 +000051f2 <__divmodsi4_neg2>: + 51f2: 50 95 com r21 + 51f4: 40 95 com r20 + 51f6: 30 95 com r19 + 51f8: 21 95 neg r18 + 51fa: 3f 4f sbci r19, 0xFF ; 255 + 51fc: 4f 4f sbci r20, 0xFF ; 255 + 51fe: 5f 4f sbci r21, 0xFF ; 255 -000051e0 <__divmodsi4_exit>: - 51e0: 08 95 ret +00005200 <__divmodsi4_exit>: + 5200: 08 95 ret -000051e2 <__divmodsi4_neg1>: - 51e2: f6 f7 brtc .-4 ; 0x51e0 <__divmodsi4_exit> - 51e4: 90 95 com r25 - 51e6: 80 95 com r24 - 51e8: 70 95 com r23 - 51ea: 61 95 neg r22 - 51ec: 7f 4f sbci r23, 0xFF ; 255 - 51ee: 8f 4f sbci r24, 0xFF ; 255 - 51f0: 9f 4f sbci r25, 0xFF ; 255 - 51f2: 08 95 ret +00005202 <__divmodsi4_neg1>: + 5202: f6 f7 brtc .-4 ; 0x5200 <__divmodsi4_exit> + 5204: 90 95 com r25 + 5206: 80 95 com r24 + 5208: 70 95 com r23 + 520a: 61 95 neg r22 + 520c: 7f 4f sbci r23, 0xFF ; 255 + 520e: 8f 4f sbci r24, 0xFF ; 255 + 5210: 9f 4f sbci r25, 0xFF ; 255 + 5212: 08 95 ret -000051f4 <__prologue_saves__>: - 51f4: 2f 92 push r2 - 51f6: 3f 92 push r3 - 51f8: 4f 92 push r4 - 51fa: 5f 92 push r5 - 51fc: 6f 92 push r6 - 51fe: 7f 92 push r7 - 5200: 8f 92 push r8 - 5202: 9f 92 push r9 - 5204: af 92 push r10 - 5206: bf 92 push r11 - 5208: cf 92 push r12 - 520a: df 92 push r13 - 520c: ef 92 push r14 - 520e: ff 92 push r15 - 5210: 0f 93 push r16 - 5212: 1f 93 push r17 - 5214: cf 93 push r28 - 5216: df 93 push r29 - 5218: cd b7 in r28, 0x3d ; 61 - 521a: de b7 in r29, 0x3e ; 62 - 521c: ca 1b sub r28, r26 - 521e: db 0b sbc r29, r27 - 5220: cd bf out 0x3d, r28 ; 61 - 5222: de bf out 0x3e, r29 ; 62 - 5224: 09 94 ijmp +00005214 <__prologue_saves__>: + 5214: 2f 92 push r2 + 5216: 3f 92 push r3 + 5218: 4f 92 push r4 + 521a: 5f 92 push r5 + 521c: 6f 92 push r6 + 521e: 7f 92 push r7 + 5220: 8f 92 push r8 + 5222: 9f 92 push r9 + 5224: af 92 push r10 + 5226: bf 92 push r11 + 5228: cf 92 push r12 + 522a: df 92 push r13 + 522c: ef 92 push r14 + 522e: ff 92 push r15 + 5230: 0f 93 push r16 + 5232: 1f 93 push r17 + 5234: cf 93 push r28 + 5236: df 93 push r29 + 5238: cd b7 in r28, 0x3d ; 61 + 523a: de b7 in r29, 0x3e ; 62 + 523c: ca 1b sub r28, r26 + 523e: db 0b sbc r29, r27 + 5240: cd bf out 0x3d, r28 ; 61 + 5242: de bf out 0x3e, r29 ; 62 + 5244: 09 94 ijmp -00005226 <__epilogue_restores__>: - 5226: 2a 88 ldd r2, Y+18 ; 0x12 - 5228: 39 88 ldd r3, Y+17 ; 0x11 - 522a: 48 88 ldd r4, Y+16 ; 0x10 - 522c: 5f 84 ldd r5, Y+15 ; 0x0f - 522e: 6e 84 ldd r6, Y+14 ; 0x0e - 5230: 7d 84 ldd r7, Y+13 ; 0x0d - 5232: 8c 84 ldd r8, Y+12 ; 0x0c - 5234: 9b 84 ldd r9, Y+11 ; 0x0b - 5236: aa 84 ldd r10, Y+10 ; 0x0a - 5238: b9 84 ldd r11, Y+9 ; 0x09 - 523a: c8 84 ldd r12, Y+8 ; 0x08 - 523c: df 80 ldd r13, Y+7 ; 0x07 - 523e: ee 80 ldd r14, Y+6 ; 0x06 - 5240: fd 80 ldd r15, Y+5 ; 0x05 - 5242: 0c 81 ldd r16, Y+4 ; 0x04 - 5244: 1b 81 ldd r17, Y+3 ; 0x03 - 5246: aa 81 ldd r26, Y+2 ; 0x02 - 5248: b9 81 ldd r27, Y+1 ; 0x01 - 524a: ce 0f add r28, r30 - 524c: d1 1d adc r29, r1 - 524e: cd bf out 0x3d, r28 ; 61 - 5250: de bf out 0x3e, r29 ; 62 - 5252: ed 01 movw r28, r26 - 5254: 08 95 ret +00005246 <__epilogue_restores__>: + 5246: 2a 88 ldd r2, Y+18 ; 0x12 + 5248: 39 88 ldd r3, Y+17 ; 0x11 + 524a: 48 88 ldd r4, Y+16 ; 0x10 + 524c: 5f 84 ldd r5, Y+15 ; 0x0f + 524e: 6e 84 ldd r6, Y+14 ; 0x0e + 5250: 7d 84 ldd r7, Y+13 ; 0x0d + 5252: 8c 84 ldd r8, Y+12 ; 0x0c + 5254: 9b 84 ldd r9, Y+11 ; 0x0b + 5256: aa 84 ldd r10, Y+10 ; 0x0a + 5258: b9 84 ldd r11, Y+9 ; 0x09 + 525a: c8 84 ldd r12, Y+8 ; 0x08 + 525c: df 80 ldd r13, Y+7 ; 0x07 + 525e: ee 80 ldd r14, Y+6 ; 0x06 + 5260: fd 80 ldd r15, Y+5 ; 0x05 + 5262: 0c 81 ldd r16, Y+4 ; 0x04 + 5264: 1b 81 ldd r17, Y+3 ; 0x03 + 5266: aa 81 ldd r26, Y+2 ; 0x02 + 5268: b9 81 ldd r27, Y+1 ; 0x01 + 526a: ce 0f add r28, r30 + 526c: d1 1d adc r29, r1 + 526e: cd bf out 0x3d, r28 ; 61 + 5270: de bf out 0x3e, r29 ; 62 + 5272: ed 01 movw r28, r26 + 5274: 08 95 ret -00005256 <__udivmodsi4>: - 5256: a1 e2 ldi r26, 0x21 ; 33 - 5258: 1a 2e mov r1, r26 - 525a: aa 1b sub r26, r26 - 525c: bb 1b sub r27, r27 - 525e: fd 01 movw r30, r26 - 5260: 0d c0 rjmp .+26 ; 0x527c <__udivmodsi4_ep> +00005276 <__udivmodsi4>: + 5276: a1 e2 ldi r26, 0x21 ; 33 + 5278: 1a 2e mov r1, r26 + 527a: aa 1b sub r26, r26 + 527c: bb 1b sub r27, r27 + 527e: fd 01 movw r30, r26 + 5280: 0d c0 rjmp .+26 ; 0x529c <__udivmodsi4_ep> -00005262 <__udivmodsi4_loop>: - 5262: aa 1f adc r26, r26 - 5264: bb 1f adc r27, r27 - 5266: ee 1f adc r30, r30 - 5268: ff 1f adc r31, r31 - 526a: a2 17 cp r26, r18 - 526c: b3 07 cpc r27, r19 - 526e: e4 07 cpc r30, r20 - 5270: f5 07 cpc r31, r21 - 5272: 20 f0 brcs .+8 ; 0x527c <__udivmodsi4_ep> - 5274: a2 1b sub r26, r18 - 5276: b3 0b sbc r27, r19 - 5278: e4 0b sbc r30, r20 - 527a: f5 0b sbc r31, r21 +00005282 <__udivmodsi4_loop>: + 5282: aa 1f adc r26, r26 + 5284: bb 1f adc r27, r27 + 5286: ee 1f adc r30, r30 + 5288: ff 1f adc r31, r31 + 528a: a2 17 cp r26, r18 + 528c: b3 07 cpc r27, r19 + 528e: e4 07 cpc r30, r20 + 5290: f5 07 cpc r31, r21 + 5292: 20 f0 brcs .+8 ; 0x529c <__udivmodsi4_ep> + 5294: a2 1b sub r26, r18 + 5296: b3 0b sbc r27, r19 + 5298: e4 0b sbc r30, r20 + 529a: f5 0b sbc r31, r21 -0000527c <__udivmodsi4_ep>: - 527c: 66 1f adc r22, r22 - 527e: 77 1f adc r23, r23 - 5280: 88 1f adc r24, r24 - 5282: 99 1f adc r25, r25 - 5284: 1a 94 dec r1 - 5286: 69 f7 brne .-38 ; 0x5262 <__udivmodsi4_loop> - 5288: 60 95 com r22 - 528a: 70 95 com r23 - 528c: 80 95 com r24 - 528e: 90 95 com r25 - 5290: 9b 01 movw r18, r22 - 5292: ac 01 movw r20, r24 - 5294: bd 01 movw r22, r26 - 5296: cf 01 movw r24, r30 - 5298: 08 95 ret +0000529c <__udivmodsi4_ep>: + 529c: 66 1f adc r22, r22 + 529e: 77 1f adc r23, r23 + 52a0: 88 1f adc r24, r24 + 52a2: 99 1f adc r25, r25 + 52a4: 1a 94 dec r1 + 52a6: 69 f7 brne .-38 ; 0x5282 <__udivmodsi4_loop> + 52a8: 60 95 com r22 + 52aa: 70 95 com r23 + 52ac: 80 95 com r24 + 52ae: 90 95 com r25 + 52b0: 9b 01 movw r18, r22 + 52b2: ac 01 movw r20, r24 + 52b4: bd 01 movw r22, r26 + 52b6: cf 01 movw r24, r30 + 52b8: 08 95 ret -0000529a <_exit>: - 529a: f8 94 cli +000052ba <_exit>: + 52ba: f8 94 cli -0000529c <__stop_program>: - 529c: ff cf rjmp .-2 ; 0x529c <__stop_program> +000052bc <__stop_program>: + 52bc: ff cf rjmp .-2 ; 0x52bc <__stop_program> diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.map b/Firmware/Chameleon-Mini/Chameleon-Mini.map index 826547a..e897517 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.map +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.map @@ -539,7 +539,7 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .rela.plt *(.rela.plt) -.text 0x00000000 0x529e +.text 0x00000000 0x52be *(.vectors) .vectors 0x00000000 0x1fc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o 0x00000000 __vectors @@ -553,45 +553,45 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg 0x00000238 ConfigurationDescriptor 0x00000276 DeviceDescriptor .progmem.data 0x00000288 0x6f Bin/Configuration.o - .progmem.data 0x000002f7 0xc0 Bin/Button.o - .progmem.data 0x000003b7 0x64 Bin/Commands.o - .progmem.data 0x0000041b 0x22c Bin/CommandLine.o - 0x0000041b CommandTable - 0x00000648 . = ALIGN (0x2) - *fill* 0x00000647 0x1 00 - 0x00000648 __trampolines_start = . + .progmem.data 0x000002f7 0xe0 Bin/Button.o + .progmem.data 0x000003d7 0x64 Bin/Commands.o + .progmem.data 0x0000043b 0x22c Bin/CommandLine.o + 0x0000043b CommandTable + 0x00000668 . = ALIGN (0x2) + *fill* 0x00000667 0x1 00 + 0x00000668 __trampolines_start = . *(.trampolines) - .trampolines 0x00000648 0x0 linker stubs + .trampolines 0x00000668 0x0 linker stubs *(.trampolines*) - 0x00000648 __trampolines_end = . + 0x00000668 __trampolines_end = . *(.jumptables) *(.jumptables*) *(.lowtext) *(.lowtext*) - 0x00000648 __ctors_start = . + 0x00000668 __ctors_start = . *(.ctors) - 0x00000648 __ctors_end = . - 0x00000648 __dtors_start = . + 0x00000668 __ctors_end = . + 0x00000668 __dtors_start = . *(.dtors) - 0x00000648 __dtors_end = . + 0x00000668 __dtors_end = . SORT(*)(.ctors) SORT(*)(.dtors) *(.init0) - .init0 0x00000648 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x00000648 __init + .init0 0x00000668 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000668 __init *(.init0) *(.init1) *(.init1) *(.init2) - .init2 0x00000648 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init2 0x00000668 0xc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o *(.init2) *(.init3) *(.init3) *(.init4) - .init4 0x00000654 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) - 0x00000654 __do_copy_data - .init4 0x0000066a 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) - 0x0000066a __do_clear_bss + .init4 0x00000674 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_copy_data.o) + 0x00000674 __do_copy_data + .init4 0x0000068a 0x10 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_clear_bss.o) + 0x0000068a __do_clear_bss *(.init4) *(.init5) *(.init5) @@ -602,620 +602,620 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg *(.init8) *(.init8) *(.init9) - .init9 0x0000067a 0x6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + .init9 0x0000069a 0x6 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o *(.init9) *(.text) - .text 0x00000680 0x2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o - 0x00000680 __vector_38 - 0x00000680 __vector_104 - 0x00000680 __vector_63 - 0x00000680 __vector_28 - 0x00000680 __vector_67 - 0x00000680 __vector_1 - 0x00000680 __vector_119 - 0x00000680 __vector_32 - 0x00000680 __vector_75 - 0x00000680 __vector_71 - 0x00000680 __vector_91 - 0x00000680 __vector_62 - 0x00000680 __vector_77 - 0x00000680 __vector_102 - 0x00000680 __vector_24 - 0x00000680 __vector_12 - 0x00000680 __vector_55 - 0x00000680 __vector_69 - 0x00000680 __vector_81 - 0x00000680 __vector_90 - 0x00000680 __vector_46 - 0x00000680 __bad_interrupt - 0x00000680 __vector_122 - 0x00000680 __vector_72 - 0x00000680 __vector_114 - 0x00000680 __vector_6 - 0x00000680 __vector_110 - 0x00000680 __vector_31 - 0x00000680 __vector_92 - 0x00000680 __vector_35 - 0x00000680 __vector_78 - 0x00000680 __vector_74 - 0x00000680 __vector_117 - 0x00000680 __vector_39 - 0x00000680 __vector_107 - 0x00000680 __vector_3 - 0x00000680 __vector_105 - 0x00000680 __vector_98 - 0x00000680 __vector_23 - 0x00000680 __vector_68 - 0x00000680 __vector_30 - 0x00000680 __vector_73 - 0x00000680 __vector_45 - 0x00000680 __vector_25 - 0x00000680 __vector_93 - 0x00000680 __vector_61 - 0x00000680 __vector_11 - 0x00000680 __vector_54 - 0x00000680 __vector_99 - 0x00000680 __vector_13 - 0x00000680 __vector_17 - 0x00000680 __vector_19 - 0x00000680 __vector_56 - 0x00000680 __vector_7 - 0x00000680 __vector_49 - 0x00000680 __vector_123 - 0x00000680 __vector_41 - 0x00000680 __vector_86 - 0x00000680 __vector_100 - 0x00000680 __vector_101 - 0x00000680 __vector_64 - 0x00000680 __vector_88 - 0x00000680 __vector_109 - 0x00000680 __vector_43 - 0x00000680 __vector_27 - 0x00000680 __vector_5 - 0x00000680 __vector_113 - 0x00000680 __vector_33 - 0x00000680 __vector_76 - 0x00000680 __vector_115 - 0x00000680 __vector_47 - 0x00000680 __vector_52 - 0x00000680 __vector_37 - 0x00000680 __vector_95 - 0x00000680 __vector_103 - 0x00000680 __vector_96 - 0x00000680 __vector_89 - 0x00000680 __vector_108 - 0x00000680 __vector_4 - 0x00000680 __vector_44 - 0x00000680 __vector_82 - 0x00000680 __vector_106 - 0x00000680 __vector_118 - 0x00000680 __vector_51 - 0x00000680 __vector_9 - 0x00000680 __vector_2 - 0x00000680 __vector_21 - 0x00000680 __vector_15 - 0x00000680 __vector_66 - 0x00000680 __vector_36 - 0x00000680 __vector_79 - 0x00000680 __vector_58 - 0x00000680 __vector_70 - 0x00000680 __vector_29 - 0x00000680 __vector_60 - 0x00000680 __vector_121 - 0x00000680 __vector_40 - 0x00000680 __vector_85 - 0x00000680 __vector_94 - 0x00000680 __vector_126 - 0x00000680 __vector_8 - 0x00000680 __vector_26 - 0x00000680 __vector_48 - 0x00000680 __vector_124 - 0x00000680 __vector_116 - 0x00000680 __vector_112 - 0x00000680 __vector_111 - 0x00000680 __vector_80 - 0x00000680 __vector_14 - 0x00000680 __vector_84 - 0x00000680 __vector_57 - 0x00000680 __vector_53 - 0x00000680 __vector_10 - 0x00000680 __vector_50 - 0x00000680 __vector_16 - 0x00000680 __vector_59 - 0x00000680 __vector_18 - 0x00000680 __vector_97 - 0x00000680 __vector_20 - 0x00000680 __vector_42 - 0x00000680 __vector_87 - 0x00000680 __vector_65 - 0x00000680 __vector_120 - 0x00000682 . = ALIGN (0x2) + .text 0x000006a0 0x2 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x000006a0 __vector_38 + 0x000006a0 __vector_104 + 0x000006a0 __vector_63 + 0x000006a0 __vector_28 + 0x000006a0 __vector_67 + 0x000006a0 __vector_1 + 0x000006a0 __vector_119 + 0x000006a0 __vector_32 + 0x000006a0 __vector_75 + 0x000006a0 __vector_71 + 0x000006a0 __vector_91 + 0x000006a0 __vector_62 + 0x000006a0 __vector_77 + 0x000006a0 __vector_102 + 0x000006a0 __vector_24 + 0x000006a0 __vector_12 + 0x000006a0 __vector_55 + 0x000006a0 __vector_69 + 0x000006a0 __vector_81 + 0x000006a0 __vector_90 + 0x000006a0 __vector_46 + 0x000006a0 __bad_interrupt + 0x000006a0 __vector_122 + 0x000006a0 __vector_72 + 0x000006a0 __vector_114 + 0x000006a0 __vector_6 + 0x000006a0 __vector_110 + 0x000006a0 __vector_31 + 0x000006a0 __vector_92 + 0x000006a0 __vector_35 + 0x000006a0 __vector_78 + 0x000006a0 __vector_74 + 0x000006a0 __vector_117 + 0x000006a0 __vector_39 + 0x000006a0 __vector_107 + 0x000006a0 __vector_3 + 0x000006a0 __vector_105 + 0x000006a0 __vector_98 + 0x000006a0 __vector_23 + 0x000006a0 __vector_68 + 0x000006a0 __vector_30 + 0x000006a0 __vector_73 + 0x000006a0 __vector_45 + 0x000006a0 __vector_25 + 0x000006a0 __vector_93 + 0x000006a0 __vector_61 + 0x000006a0 __vector_11 + 0x000006a0 __vector_54 + 0x000006a0 __vector_99 + 0x000006a0 __vector_13 + 0x000006a0 __vector_17 + 0x000006a0 __vector_19 + 0x000006a0 __vector_56 + 0x000006a0 __vector_7 + 0x000006a0 __vector_49 + 0x000006a0 __vector_123 + 0x000006a0 __vector_41 + 0x000006a0 __vector_86 + 0x000006a0 __vector_100 + 0x000006a0 __vector_101 + 0x000006a0 __vector_64 + 0x000006a0 __vector_88 + 0x000006a0 __vector_109 + 0x000006a0 __vector_43 + 0x000006a0 __vector_27 + 0x000006a0 __vector_5 + 0x000006a0 __vector_113 + 0x000006a0 __vector_33 + 0x000006a0 __vector_76 + 0x000006a0 __vector_115 + 0x000006a0 __vector_47 + 0x000006a0 __vector_52 + 0x000006a0 __vector_37 + 0x000006a0 __vector_95 + 0x000006a0 __vector_103 + 0x000006a0 __vector_96 + 0x000006a0 __vector_89 + 0x000006a0 __vector_108 + 0x000006a0 __vector_4 + 0x000006a0 __vector_44 + 0x000006a0 __vector_82 + 0x000006a0 __vector_106 + 0x000006a0 __vector_118 + 0x000006a0 __vector_51 + 0x000006a0 __vector_9 + 0x000006a0 __vector_2 + 0x000006a0 __vector_21 + 0x000006a0 __vector_15 + 0x000006a0 __vector_66 + 0x000006a0 __vector_36 + 0x000006a0 __vector_79 + 0x000006a0 __vector_58 + 0x000006a0 __vector_70 + 0x000006a0 __vector_29 + 0x000006a0 __vector_60 + 0x000006a0 __vector_121 + 0x000006a0 __vector_40 + 0x000006a0 __vector_85 + 0x000006a0 __vector_94 + 0x000006a0 __vector_126 + 0x000006a0 __vector_8 + 0x000006a0 __vector_26 + 0x000006a0 __vector_48 + 0x000006a0 __vector_124 + 0x000006a0 __vector_116 + 0x000006a0 __vector_112 + 0x000006a0 __vector_111 + 0x000006a0 __vector_80 + 0x000006a0 __vector_14 + 0x000006a0 __vector_84 + 0x000006a0 __vector_57 + 0x000006a0 __vector_53 + 0x000006a0 __vector_10 + 0x000006a0 __vector_50 + 0x000006a0 __vector_16 + 0x000006a0 __vector_59 + 0x000006a0 __vector_18 + 0x000006a0 __vector_97 + 0x000006a0 __vector_20 + 0x000006a0 __vector_42 + 0x000006a0 __vector_87 + 0x000006a0 __vector_65 + 0x000006a0 __vector_120 + 0x000006a2 . = ALIGN (0x2) *(.text.*) .text.startup.main - 0x00000682 0x72 Bin/Chameleon-Mini.o - 0x00000682 main + 0x000006a2 0x72 Bin/Chameleon-Mini.o + 0x000006a2 main .text.CALLBACK_USB_GetDescriptor - 0x000006f4 0x6c Bin/LUFADescriptors.o - 0x000006f4 CALLBACK_USB_GetDescriptor + 0x00000714 0x6c Bin/LUFADescriptors.o + 0x00000714 CALLBACK_USB_GetDescriptor .text.__vector_default - 0x00000760 0xc Bin/System.o - 0x00000760 __vector_default + 0x00000780 0xc Bin/System.o + 0x00000780 __vector_default .text.SystemInit - 0x0000076c 0x74 Bin/System.o - 0x0000076c SystemInit + 0x0000078c 0x74 Bin/System.o + 0x0000078c SystemInit .text.SystemReset - 0x000007e0 0xe Bin/System.o - 0x000007e0 SystemReset + 0x00000800 0xe Bin/System.o + 0x00000800 SystemReset .text.SystemEnterBootloader - 0x000007ee 0xc Bin/System.o - 0x000007ee SystemEnterBootloader + 0x0000080e 0xc Bin/System.o + 0x0000080e SystemEnterBootloader .text.SystemStartUSBClock - 0x000007fa 0x36 Bin/System.o - 0x000007fa SystemStartUSBClock + 0x0000081a 0x36 Bin/System.o + 0x0000081a SystemStartUSBClock .text.SystemStopUSBClock - 0x00000830 0x1c Bin/System.o - 0x00000830 SystemStopUSBClock + 0x00000850 0x1c Bin/System.o + 0x00000850 SystemStopUSBClock .text.SystemInterruptInit - 0x0000084c 0xc Bin/System.o - 0x0000084c SystemInterruptInit + 0x0000086c 0xc Bin/System.o + 0x0000086c SystemInterruptInit .text.CodecInitDummy - 0x00000858 0x2 Bin/Configuration.o + 0x00000878 0x2 Bin/Configuration.o .text.CodecTaskDummy - 0x0000085a 0x2 Bin/Configuration.o + 0x0000087a 0x2 Bin/Configuration.o .text.ApplicationInitDummy - 0x0000085c 0x2 Bin/Configuration.o + 0x0000087c 0x2 Bin/Configuration.o .text.ApplicationResetDummy - 0x0000085e 0x2 Bin/Configuration.o + 0x0000087e 0x2 Bin/Configuration.o .text.ApplicationTaskDummy - 0x00000860 0x2 Bin/Configuration.o + 0x00000880 0x2 Bin/Configuration.o .text.ApplicationProcessDummy - 0x00000862 0x6 Bin/Configuration.o + 0x00000882 0x6 Bin/Configuration.o .text.ApplicationGetUidDummy - 0x00000868 0x2 Bin/Configuration.o + 0x00000888 0x2 Bin/Configuration.o .text.ApplicationSetUidDummy - 0x0000086a 0x2 Bin/Configuration.o + 0x0000088a 0x2 Bin/Configuration.o .text.ConfigurationSetById - 0x0000086c 0x52 Bin/Configuration.o - 0x0000086c ConfigurationSetById + 0x0000088c 0x52 Bin/Configuration.o + 0x0000088c ConfigurationSetById .text.ConfigurationInit - 0x000008be 0xc Bin/Configuration.o - 0x000008be ConfigurationInit + 0x000008de 0xc Bin/Configuration.o + 0x000008de ConfigurationInit .text.ConfigurationSetByName - 0x000008ca 0x90 Bin/Configuration.o - 0x000008ca ConfigurationSetByName + 0x000008ea 0x90 Bin/Configuration.o + 0x000008ea ConfigurationSetByName .text.ConfigurationGetList - 0x0000095a 0x74 Bin/Configuration.o - 0x0000095a ConfigurationGetList + 0x0000097a 0x74 Bin/Configuration.o + 0x0000097a ConfigurationGetList .text.RandomInit - 0x000009ce 0x2 Bin/Random.o - 0x000009ce RandomInit + 0x000009ee 0x2 Bin/Random.o + 0x000009ee RandomInit .text.RandomGetByte - 0x000009d0 0x6 Bin/Random.o - 0x000009d0 RandomGetByte + 0x000009f0 0x6 Bin/Random.o + 0x000009f0 RandomGetByte .text.RandomGetBuffer - 0x000009d6 0x2e Bin/Random.o - 0x000009d6 RandomGetBuffer + 0x000009f6 0x2e Bin/Random.o + 0x000009f6 RandomGetBuffer .text.RandomTick - 0x00000a04 0x10 Bin/Random.o - 0x00000a04 RandomTick + 0x00000a24 0x10 Bin/Random.o + 0x00000a24 RandomTick .text.BufferToHexString - 0x00000a14 0x7a Bin/Common.o - 0x00000a14 BufferToHexString + 0x00000a34 0x7a Bin/Common.o + 0x00000a34 BufferToHexString .text.HexStringToBuffer - 0x00000a8e 0x9e Bin/Common.o - 0x00000a8e HexStringToBuffer + 0x00000aae 0x9e Bin/Common.o + 0x00000aae HexStringToBuffer .text.MemoryInit - 0x00000b2c 0x10e Bin/Memory.o - 0x00000b2c MemoryInit + 0x00000b4c 0x10e Bin/Memory.o + 0x00000b4c MemoryInit .text.MemoryReadBlock - 0x00000c3a 0x116 Bin/Memory.o - 0x00000c3a MemoryReadBlock + 0x00000c5a 0x116 Bin/Memory.o + 0x00000c5a MemoryReadBlock .text.MemoryWriteBlock - 0x00000d50 0x2a8 Bin/Memory.o - 0x00000d50 MemoryWriteBlock + 0x00000d70 0x2a8 Bin/Memory.o + 0x00000d70 MemoryWriteBlock .text.MemoryClear - 0x00000ff8 0xcc Bin/Memory.o - 0x00000ff8 MemoryClear + 0x00001018 0xcc Bin/Memory.o + 0x00001018 MemoryClear .text.MemoryUploadBlock - 0x000010c4 0x5c Bin/Memory.o - 0x000010c4 MemoryUploadBlock + 0x000010e4 0x5c Bin/Memory.o + 0x000010e4 MemoryUploadBlock .text.MemoryDownloadBlock - 0x00001120 0x5e Bin/Memory.o - 0x00001120 MemoryDownloadBlock + 0x00001140 0x5e Bin/Memory.o + 0x00001140 MemoryDownloadBlock .text.ButtonInit - 0x0000117e 0xe Bin/Button.o - 0x0000117e ButtonInit + 0x0000119e 0xe Bin/Button.o + 0x0000119e ButtonInit .text.ButtonTick - 0x0000118c 0x1ba Bin/Button.o - 0x0000118c ButtonTick + 0x000011ac 0x1ba Bin/Button.o + 0x000011ac ButtonTick .text.ButtonGetActionList - 0x00001346 0x60 Bin/Button.o - 0x00001346 ButtonGetActionList + 0x00001366 0x60 Bin/Button.o + 0x00001366 ButtonGetActionList .text.ButtonSetActionById - 0x000013a6 0xc Bin/Button.o - 0x000013a6 ButtonSetActionById + 0x000013c6 0xc Bin/Button.o + 0x000013c6 ButtonSetActionById .text.ButtonGetActionByName - 0x000013b2 0x26 Bin/Button.o - 0x000013b2 ButtonGetActionByName + 0x000013d2 0x26 Bin/Button.o + 0x000013d2 ButtonGetActionByName .text.ButtonSetActionByName - 0x000013d8 0x92 Bin/Button.o - 0x000013d8 ButtonSetActionByName + 0x000013f8 0x92 Bin/Button.o + 0x000013f8 ButtonSetActionByName .text.SettingsLoad - 0x0000146a 0x10 Bin/Settings.o - 0x0000146a SettingsLoad + 0x0000148a 0x10 Bin/Settings.o + 0x0000148a SettingsLoad .text.SettingsSave - 0x0000147a 0x10 Bin/Settings.o - 0x0000147a SettingsSave + 0x0000149a 0x10 Bin/Settings.o + 0x0000149a SettingsSave .text.SettingsSetActiveById - 0x0000148a 0x1e Bin/Settings.o - 0x0000148a SettingsSetActiveById + 0x000014aa 0x1e Bin/Settings.o + 0x000014aa SettingsSetActiveById .text.SettingsCycle - 0x000014a8 0xda Bin/Settings.o - 0x000014a8 SettingsCycle + 0x000014c8 0xda Bin/Settings.o + 0x000014c8 SettingsCycle .text.SettingsGetActiveById - 0x00001582 0x6 Bin/Settings.o - 0x00001582 SettingsGetActiveById + 0x000015a2 0x6 Bin/Settings.o + 0x000015a2 SettingsGetActiveById .text.SettingsGetActiveByName - 0x00001588 0x14 Bin/Settings.o - 0x00001588 SettingsGetActiveByName + 0x000015a8 0x14 Bin/Settings.o + 0x000015a8 SettingsGetActiveByName .text.SettingsSetActiveByName - 0x0000159c 0x1e Bin/Settings.o - 0x0000159c SettingsSetActiveByName + 0x000015bc 0x1e Bin/Settings.o + 0x000015bc SettingsSetActiveByName .text.TerminalSendString - 0x000015ba 0xa Bin/Terminal.o - 0x000015ba TerminalSendString + 0x000015da 0xa Bin/Terminal.o + 0x000015da TerminalSendString .text.TerminalSendStringP - 0x000015c4 0x28 Bin/Terminal.o - 0x000015c4 TerminalSendStringP + 0x000015e4 0x28 Bin/Terminal.o + 0x000015e4 TerminalSendStringP .text.TerminalSendBlock - 0x000015ec 0xe Bin/Terminal.o - 0x000015ec TerminalSendBlock + 0x0000160c 0xe Bin/Terminal.o + 0x0000160c TerminalSendBlock .text.TerminalInit - 0x000015fa 0xa Bin/Terminal.o - 0x000015fa TerminalInit + 0x0000161a 0xa Bin/Terminal.o + 0x0000161a TerminalInit .text.TerminalTask - 0x00001604 0x42 Bin/Terminal.o - 0x00001604 TerminalTask + 0x00001624 0x42 Bin/Terminal.o + 0x00001624 TerminalTask .text.TerminalTick - 0x00001646 0x7e Bin/Terminal.o - 0x00001646 TerminalTick + 0x00001666 0x7e Bin/Terminal.o + 0x00001666 TerminalTick .text.EVENT_USB_Device_Connect - 0x000016c4 0xa Bin/Terminal.o - 0x000016c4 EVENT_USB_Device_Connect + 0x000016e4 0xa Bin/Terminal.o + 0x000016e4 EVENT_USB_Device_Connect .text.EVENT_USB_Device_Disconnect - 0x000016ce 0xa Bin/Terminal.o - 0x000016ce EVENT_USB_Device_Disconnect + 0x000016ee 0xa Bin/Terminal.o + 0x000016ee EVENT_USB_Device_Disconnect .text.EVENT_USB_Device_ConfigurationChanged - 0x000016d8 0x8 Bin/Terminal.o - 0x000016d8 EVENT_USB_Device_ConfigurationChanged + 0x000016f8 0x8 Bin/Terminal.o + 0x000016f8 EVENT_USB_Device_ConfigurationChanged .text.EVENT_USB_Device_ControlRequest - 0x000016e0 0x8 Bin/Terminal.o - 0x000016e0 EVENT_USB_Device_ControlRequest + 0x00001700 0x8 Bin/Terminal.o + 0x00001700 EVENT_USB_Device_ControlRequest .text.CommandGetVersion - 0x000016e8 0x5a Bin/Commands.o - 0x000016e8 CommandGetVersion + 0x00001708 0x5a Bin/Commands.o + 0x00001708 CommandGetVersion .text.CommandGetConfig - 0x00001742 0x4a Bin/Commands.o - 0x00001742 CommandGetConfig + 0x00001762 0x4a Bin/Commands.o + 0x00001762 CommandGetConfig .text.CommandSetConfig - 0x0000178c 0x10 Bin/Commands.o - 0x0000178c CommandSetConfig + 0x000017ac 0x10 Bin/Commands.o + 0x000017ac CommandSetConfig .text.CommandExecConfig - 0x0000179c 0xa Bin/Commands.o - 0x0000179c CommandExecConfig + 0x000017bc 0xa Bin/Commands.o + 0x000017bc CommandExecConfig .text.CommandGetUid - 0x000017a6 0x4c Bin/Commands.o - 0x000017a6 CommandGetUid + 0x000017c6 0x4c Bin/Commands.o + 0x000017c6 CommandGetUid .text.CommandSetUid - 0x000017f2 0xa8 Bin/Commands.o - 0x000017f2 CommandSetUid + 0x00001812 0xa8 Bin/Commands.o + 0x00001812 CommandSetUid .text.CommandGetReadOnly - 0x0000189a 0x1e Bin/Commands.o - 0x0000189a CommandGetReadOnly + 0x000018ba 0x1e Bin/Commands.o + 0x000018ba CommandGetReadOnly .text.CommandSetReadOnly - 0x000018b8 0x2c Bin/Commands.o - 0x000018b8 CommandSetReadOnly + 0x000018d8 0x2c Bin/Commands.o + 0x000018d8 CommandSetReadOnly .text.CommandExecUpload - 0x000018e4 0xa Bin/Commands.o - 0x000018e4 CommandExecUpload + 0x00001904 0xa Bin/Commands.o + 0x00001904 CommandExecUpload .text.CommandExecDownload - 0x000018ee 0xa Bin/Commands.o - 0x000018ee CommandExecDownload + 0x0000190e 0xa Bin/Commands.o + 0x0000190e CommandExecDownload .text.CommandExecReset - 0x000018f8 0x16 Bin/Commands.o - 0x000018f8 CommandExecReset + 0x00001918 0x16 Bin/Commands.o + 0x00001918 CommandExecReset .text.CommandExecUpgrade - 0x0000190e 0x16 Bin/Commands.o - 0x0000190e CommandExecUpgrade + 0x0000192e 0x16 Bin/Commands.o + 0x0000192e CommandExecUpgrade .text.CommandGetMemSize - 0x00001924 0x4e Bin/Commands.o - 0x00001924 CommandGetMemSize + 0x00001944 0x4e Bin/Commands.o + 0x00001944 CommandGetMemSize .text.CommandGetUidSize - 0x00001972 0x4a Bin/Commands.o - 0x00001972 CommandGetUidSize + 0x00001992 0x4a Bin/Commands.o + 0x00001992 CommandGetUidSize .text.CommandExecButton - 0x000019bc 0xa Bin/Commands.o - 0x000019bc CommandExecButton + 0x000019dc 0xa Bin/Commands.o + 0x000019dc CommandExecButton .text.CommandGetButton - 0x000019c6 0xa Bin/Commands.o - 0x000019c6 CommandGetButton + 0x000019e6 0xa Bin/Commands.o + 0x000019e6 CommandGetButton .text.CommandSetButton - 0x000019d0 0x10 Bin/Commands.o - 0x000019d0 CommandSetButton + 0x000019f0 0x10 Bin/Commands.o + 0x000019f0 CommandSetButton .text.CommandGetSetting - 0x000019e0 0xa Bin/Commands.o - 0x000019e0 CommandGetSetting + 0x00001a00 0xa Bin/Commands.o + 0x00001a00 CommandGetSetting .text.CommandSetSetting - 0x000019ea 0x10 Bin/Commands.o - 0x000019ea CommandSetSetting + 0x00001a0a 0x10 Bin/Commands.o + 0x00001a0a CommandSetSetting .text.CommandExecClear - 0x000019fa 0x6 Bin/Commands.o - 0x000019fa CommandExecClear + 0x00001a1a 0x6 Bin/Commands.o + 0x00001a1a CommandExecClear .text.CommandExecHelp - 0x00001a00 0x9a Bin/Commands.o - 0x00001a00 CommandExecHelp + 0x00001a20 0x9a Bin/Commands.o + 0x00001a20 CommandExecHelp .text.CommandGetRssi - 0x00001a9a 0x94 Bin/Commands.o - 0x00001a9a CommandGetRssi + 0x00001aba 0x94 Bin/Commands.o + 0x00001aba CommandGetRssi .text.CalcChecksum.constprop.0 - 0x00001b2e 0x14 Bin/XModem.o + 0x00001b4e 0x14 Bin/XModem.o .text.XModemReceive - 0x00001b42 0x30 Bin/XModem.o - 0x00001b42 XModemReceive + 0x00001b62 0x30 Bin/XModem.o + 0x00001b62 XModemReceive .text.XModemSend - 0x00001b72 0x26 Bin/XModem.o - 0x00001b72 XModemSend + 0x00001b92 0x26 Bin/XModem.o + 0x00001b92 XModemSend .text.XModemProcessByte - 0x00001b98 0x2b2 Bin/XModem.o - 0x00001b98 XModemProcessByte + 0x00001bb8 0x2b2 Bin/XModem.o + 0x00001bb8 XModemProcessByte .text.XModemTick - 0x00001e4a 0x5c Bin/XModem.o - 0x00001e4a XModemTick + 0x00001e6a 0x5c Bin/XModem.o + 0x00001e6a XModemTick .text.CommandLineProcessByte - 0x00001ea6 0x346 Bin/CommandLine.o - 0x00001ea6 CommandLineProcessByte + 0x00001ec6 0x346 Bin/CommandLine.o + 0x00001ec6 CommandLineProcessByte .text.CommandLineTick - 0x000021ec 0x2 Bin/CommandLine.o - 0x000021ec CommandLineTick + 0x0000220c 0x2 Bin/CommandLine.o + 0x0000220c CommandLineTick .text.StartDemod - 0x000021ee 0x3e Bin/ISO14443-2A.o + 0x0000220e 0x3e Bin/ISO14443-2A.o .text.__vector_34 - 0x0000222c 0x88 Bin/ISO14443-2A.o - 0x0000222c __vector_34 + 0x0000224c 0x88 Bin/ISO14443-2A.o + 0x0000224c __vector_34 .text.__vector_22 - 0x000022b4 0x148 Bin/ISO14443-2A.o - 0x000022b4 __vector_22 + 0x000022d4 0x148 Bin/ISO14443-2A.o + 0x000022d4 __vector_22 .text.__vector_83 - 0x000023fc 0x212 Bin/ISO14443-2A.o - 0x000023fc __vector_83 + 0x0000241c 0x212 Bin/ISO14443-2A.o + 0x0000241c __vector_83 .text.ISO14443ACodecInit - 0x0000260e 0x70 Bin/ISO14443-2A.o - 0x0000260e ISO14443ACodecInit + 0x0000262e 0x70 Bin/ISO14443-2A.o + 0x0000262e ISO14443ACodecInit .text.ISO14443ACodecTask - 0x0000267e 0xf2 Bin/ISO14443-2A.o - 0x0000267e ISO14443ACodecTask + 0x0000269e 0xf2 Bin/ISO14443-2A.o + 0x0000269e ISO14443ACodecTask .text.MifareClassicAppInit1K - 0x00002770 0x1a Bin/MifareClassic.o - 0x00002770 MifareClassicAppInit1K + 0x00002790 0x1a Bin/MifareClassic.o + 0x00002790 MifareClassicAppInit1K .text.MifareClassicAppInit4K - 0x0000278a 0x1a Bin/MifareClassic.o - 0x0000278a MifareClassicAppInit4K + 0x000027aa 0x1a Bin/MifareClassic.o + 0x000027aa MifareClassicAppInit4K .text.MifareClassicAppReset - 0x000027a4 0x8 Bin/MifareClassic.o - 0x000027a4 MifareClassicAppReset + 0x000027c4 0x8 Bin/MifareClassic.o + 0x000027c4 MifareClassicAppReset .text.MifareClassicAppTask - 0x000027ac 0x2 Bin/MifareClassic.o - 0x000027ac MifareClassicAppTask + 0x000027cc 0x2 Bin/MifareClassic.o + 0x000027cc MifareClassicAppTask .text.MifareClassicAppProcess - 0x000027ae 0x9bc Bin/MifareClassic.o - 0x000027ae MifareClassicAppProcess + 0x000027ce 0x9bc Bin/MifareClassic.o + 0x000027ce MifareClassicAppProcess .text.MifareClassicGetUid - 0x0000316a 0xc Bin/MifareClassic.o - 0x0000316a MifareClassicGetUid + 0x0000318a 0xc Bin/MifareClassic.o + 0x0000318a MifareClassicGetUid .text.MifareClassicSetUid - 0x00003176 0x42 Bin/MifareClassic.o - 0x00003176 MifareClassicSetUid + 0x00003196 0x42 Bin/MifareClassic.o + 0x00003196 MifareClassicSetUid .text.ISO14443AAppendCRCA - 0x000031b8 0x7c Bin/ISO14443-3A.o - 0x000031b8 ISO14443AAppendCRCA + 0x000031d8 0x7c Bin/ISO14443-3A.o + 0x000031d8 ISO14443AAppendCRCA .text.ISO14443ACheckCRCA - 0x00003234 0x9c Bin/ISO14443-3A.o - 0x00003234 ISO14443ACheckCRCA + 0x00003254 0x9c Bin/ISO14443-3A.o + 0x00003254 ISO14443ACheckCRCA .text.Crypto1LFSR - 0x000032d0 0xce Bin/Crypto1.o + 0x000032f0 0xce Bin/Crypto1.o .text.Crypto1FilterOutput - 0x0000339e 0x68 Bin/Crypto1.o - 0x0000339e Crypto1FilterOutput + 0x000033be 0x68 Bin/Crypto1.o + 0x000033be Crypto1FilterOutput .text.Crypto1Setup - 0x00003406 0x38c Bin/Crypto1.o - 0x00003406 Crypto1Setup + 0x00003426 0x38c Bin/Crypto1.o + 0x00003426 Crypto1Setup .text.Crypto1Auth - 0x00003792 0x7e Bin/Crypto1.o - 0x00003792 Crypto1Auth + 0x000037b2 0x7e Bin/Crypto1.o + 0x000037b2 Crypto1Auth .text.Crypto1Byte - 0x00003810 0x82 Bin/Crypto1.o - 0x00003810 Crypto1Byte + 0x00003830 0x82 Bin/Crypto1.o + 0x00003830 Crypto1Byte .text.Crypto1Nibble - 0x00003892 0x48 Bin/Crypto1.o - 0x00003892 Crypto1Nibble + 0x000038b2 0x48 Bin/Crypto1.o + 0x000038b2 Crypto1Nibble .text.Crypto1PRNG - 0x000038da 0xfc Bin/Crypto1.o - 0x000038da Crypto1PRNG + 0x000038fa 0xfc Bin/Crypto1.o + 0x000038fa Crypto1PRNG .text.USB_Device_ProcessControlRequest - 0x000039d6 0x2b0 Bin/DeviceStandardReq.o - 0x000039d6 USB_Device_ProcessControlRequest + 0x000039f6 0x2b0 Bin/DeviceStandardReq.o + 0x000039f6 USB_Device_ProcessControlRequest .text.USB_Event_Stub - 0x00003c86 0x2 Bin/Events.o - 0x00003c86 USB_Event_Stub - 0x00003c86 EVENT_USB_Device_Suspend - 0x00003c86 EVENT_USB_Device_StartOfFrame - 0x00003c86 EVENT_USB_Device_Reset - 0x00003c86 EVENT_USB_Device_WakeUp + 0x00003ca6 0x2 Bin/Events.o + 0x00003ca6 USB_Event_Stub + 0x00003ca6 EVENT_USB_Device_Suspend + 0x00003ca6 EVENT_USB_Device_StartOfFrame + 0x00003ca6 EVENT_USB_Device_Reset + 0x00003ca6 EVENT_USB_Device_WakeUp .text.USB_USBTask - 0x00003c88 0x28 Bin/USBTask.o - 0x00003c88 USB_USBTask + 0x00003ca8 0x28 Bin/USBTask.o + 0x00003ca8 USB_USBTask .text.Endpoint_Write_Stream_LE - 0x00003cb0 0xd8 Bin/EndpointStream_XMEGA.o - 0x00003cb0 Endpoint_Write_Stream_LE + 0x00003cd0 0xd8 Bin/EndpointStream_XMEGA.o + 0x00003cd0 Endpoint_Write_Stream_LE .text.Endpoint_Write_Control_Stream_LE - 0x00003d88 0x14a Bin/EndpointStream_XMEGA.o - 0x00003d88 Endpoint_Write_Control_Stream_LE + 0x00003da8 0x14a Bin/EndpointStream_XMEGA.o + 0x00003da8 Endpoint_Write_Control_Stream_LE .text.Endpoint_Write_Control_PStream_LE - 0x00003ed2 0x160 Bin/EndpointStream_XMEGA.o - 0x00003ed2 Endpoint_Write_Control_PStream_LE + 0x00003ef2 0x160 Bin/EndpointStream_XMEGA.o + 0x00003ef2 Endpoint_Write_Control_PStream_LE .text.Endpoint_ClearIN - 0x00004032 0x32 Bin/Endpoint_XMEGA.o - 0x00004032 Endpoint_ClearIN + 0x00004052 0x32 Bin/Endpoint_XMEGA.o + 0x00004052 Endpoint_ClearIN .text.Endpoint_ClearOUT - 0x00004064 0x1e Bin/Endpoint_XMEGA.o - 0x00004064 Endpoint_ClearOUT + 0x00004084 0x1e Bin/Endpoint_XMEGA.o + 0x00004084 Endpoint_ClearOUT .text.Endpoint_Read_8 - 0x00004082 0x1e Bin/Endpoint_XMEGA.o - 0x00004082 Endpoint_Read_8 + 0x000040a2 0x1e Bin/Endpoint_XMEGA.o + 0x000040a2 Endpoint_Read_8 .text.Endpoint_Write_8 - 0x000040a0 0x1e Bin/Endpoint_XMEGA.o - 0x000040a0 Endpoint_Write_8 + 0x000040c0 0x1e Bin/Endpoint_XMEGA.o + 0x000040c0 Endpoint_Write_8 .text.Endpoint_SelectEndpoint - 0x000040be 0x78 Bin/Endpoint_XMEGA.o - 0x000040be Endpoint_SelectEndpoint + 0x000040de 0x78 Bin/Endpoint_XMEGA.o + 0x000040de Endpoint_SelectEndpoint .text.Endpoint_StallTransaction - 0x00004136 0x38 Bin/Endpoint_XMEGA.o - 0x00004136 Endpoint_StallTransaction + 0x00004156 0x38 Bin/Endpoint_XMEGA.o + 0x00004156 Endpoint_StallTransaction .text.Endpoint_ClearSETUP - 0x0000416e 0x58 Bin/Endpoint_XMEGA.o - 0x0000416e Endpoint_ClearSETUP + 0x0000418e 0x58 Bin/Endpoint_XMEGA.o + 0x0000418e Endpoint_ClearSETUP .text.Endpoint_IsSETUPReceived - 0x000041c6 0x30 Bin/Endpoint_XMEGA.o - 0x000041c6 Endpoint_IsSETUPReceived + 0x000041e6 0x30 Bin/Endpoint_XMEGA.o + 0x000041e6 Endpoint_IsSETUPReceived .text.Endpoint_IsOUTReceived - 0x000041f6 0x30 Bin/Endpoint_XMEGA.o - 0x000041f6 Endpoint_IsOUTReceived + 0x00004216 0x30 Bin/Endpoint_XMEGA.o + 0x00004216 Endpoint_IsOUTReceived .text.Endpoint_IsINReady - 0x00004226 0x1a Bin/Endpoint_XMEGA.o - 0x00004226 Endpoint_IsINReady + 0x00004246 0x1a Bin/Endpoint_XMEGA.o + 0x00004246 Endpoint_IsINReady .text.Endpoint_ConfigureEndpoint_PRV - 0x00004240 0x9a Bin/Endpoint_XMEGA.o - 0x00004240 Endpoint_ConfigureEndpoint_PRV + 0x00004260 0x9a Bin/Endpoint_XMEGA.o + 0x00004260 Endpoint_ConfigureEndpoint_PRV .text.Endpoint_ConfigureEndpointTable - 0x000042da 0xd8 Bin/Endpoint_XMEGA.o - 0x000042da Endpoint_ConfigureEndpointTable + 0x000042fa 0xd8 Bin/Endpoint_XMEGA.o + 0x000042fa Endpoint_ConfigureEndpointTable .text.Endpoint_ClearEndpoints - 0x000043b2 0x70 Bin/Endpoint_XMEGA.o - 0x000043b2 Endpoint_ClearEndpoints + 0x000043d2 0x70 Bin/Endpoint_XMEGA.o + 0x000043d2 Endpoint_ClearEndpoints .text.Endpoint_ClearStatusStage - 0x00004422 0x2c Bin/Endpoint_XMEGA.o - 0x00004422 Endpoint_ClearStatusStage + 0x00004442 0x2c Bin/Endpoint_XMEGA.o + 0x00004442 Endpoint_ClearStatusStage .text.Endpoint_WaitUntilReady - 0x0000444e 0xa2 Bin/Endpoint_XMEGA.o - 0x0000444e Endpoint_WaitUntilReady + 0x0000446e 0xa2 Bin/Endpoint_XMEGA.o + 0x0000446e Endpoint_WaitUntilReady .text.USB_Disable - 0x000044f0 0x1a Bin/USBController_XMEGA.o - 0x000044f0 USB_Disable + 0x00004510 0x1a Bin/USBController_XMEGA.o + 0x00004510 USB_Disable .text.USB_ResetInterface - 0x0000450a 0x5c Bin/USBController_XMEGA.o - 0x0000450a USB_ResetInterface + 0x0000452a 0x5c Bin/USBController_XMEGA.o + 0x0000452a USB_ResetInterface .text.USB_Init - 0x00004566 0x54 Bin/USBController_XMEGA.o - 0x00004566 USB_Init + 0x00004586 0x54 Bin/USBController_XMEGA.o + 0x00004586 USB_Init .text.USB_INT_DisableAllInterrupts - 0x000045ba 0xe Bin/USBInterrupt_XMEGA.o - 0x000045ba USB_INT_DisableAllInterrupts + 0x000045da 0xe Bin/USBInterrupt_XMEGA.o + 0x000045da USB_INT_DisableAllInterrupts .text.USB_INT_ClearAllInterrupts - 0x000045c8 0xc Bin/USBInterrupt_XMEGA.o - 0x000045c8 USB_INT_ClearAllInterrupts + 0x000045e8 0xc Bin/USBInterrupt_XMEGA.o + 0x000045e8 USB_INT_ClearAllInterrupts .text.__vector_125 - 0x000045d4 0xe0 Bin/USBInterrupt_XMEGA.o - 0x000045d4 __vector_125 + 0x000045f4 0xe0 Bin/USBInterrupt_XMEGA.o + 0x000045f4 __vector_125 .text.CDC_Device_ProcessControlRequest - 0x000046b4 0x156 Bin/CDCClassDevice.o - 0x000046b4 CDC_Device_ProcessControlRequest + 0x000046d4 0x156 Bin/CDCClassDevice.o + 0x000046d4 CDC_Device_ProcessControlRequest .text.CDC_Device_ConfigureEndpoints - 0x0000480a 0x4c Bin/CDCClassDevice.o - 0x0000480a CDC_Device_ConfigureEndpoints + 0x0000482a 0x4c Bin/CDCClassDevice.o + 0x0000482a CDC_Device_ConfigureEndpoints .text.CDC_Device_SendString - 0x00004856 0x48 Bin/CDCClassDevice.o - 0x00004856 CDC_Device_SendString + 0x00004876 0x48 Bin/CDCClassDevice.o + 0x00004876 CDC_Device_SendString .text.CDC_Device_SendData - 0x0000489e 0x44 Bin/CDCClassDevice.o - 0x0000489e CDC_Device_SendData + 0x000048be 0x44 Bin/CDCClassDevice.o + 0x000048be CDC_Device_SendData .text.CDC_Device_SendByte - 0x000048e2 0x56 Bin/CDCClassDevice.o - 0x000048e2 CDC_Device_SendByte + 0x00004902 0x56 Bin/CDCClassDevice.o + 0x00004902 CDC_Device_SendByte .text.CDC_Device_Flush - 0x00004938 0x92 Bin/CDCClassDevice.o - 0x00004938 CDC_Device_Flush + 0x00004958 0x92 Bin/CDCClassDevice.o + 0x00004958 CDC_Device_Flush .text.CDC_Device_USBTask - 0x000049ca 0x34 Bin/CDCClassDevice.o - 0x000049ca CDC_Device_USBTask + 0x000049ea 0x34 Bin/CDCClassDevice.o + 0x000049ea CDC_Device_USBTask .text.CDC_Device_ReceiveByte - 0x000049fe 0xca Bin/CDCClassDevice.o - 0x000049fe CDC_Device_ReceiveByte + 0x00004a1e 0xca Bin/CDCClassDevice.o + 0x00004a1e CDC_Device_ReceiveByte .text.CDC_Device_Event_Stub - 0x00004ac8 0x2 Bin/CDCClassDevice.o - 0x00004ac8 EVENT_CDC_Device_ControLineStateChanged - 0x00004ac8 EVENT_CDC_Device_BreakSent - 0x00004ac8 CDC_Device_Event_Stub - 0x00004ac8 EVENT_CDC_Device_LineEncodingChanged - .text.libgcc 0x00004aca 0x3e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) - 0x00004aca __mulsi3 + 0x00004ae8 0x2 Bin/CDCClassDevice.o + 0x00004ae8 EVENT_CDC_Device_ControLineStateChanged + 0x00004ae8 EVENT_CDC_Device_BreakSent + 0x00004ae8 CDC_Device_Event_Stub + 0x00004ae8 EVENT_CDC_Device_LineEncodingChanged + .text.libgcc 0x00004aea 0x3e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_mulsi3.o) + 0x00004aea __mulsi3 .text.avr-libc - 0x00004b08 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) - 0x00004ba6 rand_r - 0x00004ba8 rand - 0x00004bae srand + 0x00004b28 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + 0x00004bc6 rand_r + 0x00004bc8 rand + 0x00004bce srand .text.avr-libc - 0x00004bc4 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) - 0x00004bc4 memcpy_P + 0x00004be4 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy_P.o) + 0x00004be4 memcpy_P .text.avr-libc - 0x00004bd6 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) - 0x00004bd6 strcmp_P + 0x00004bf6 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strcmp_P.o) + 0x00004bf6 strcmp_P .text.avr-libc - 0x00004be8 0x1e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) - 0x00004be8 strncpy_P + 0x00004c08 0x1e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strncpy_P.o) + 0x00004c08 strncpy_P .text.avr-libc - 0x00004c06 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) - 0x00004c06 memcpy + 0x00004c26 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + 0x00004c26 memcpy .text.avr-libc - 0x00004c18 0x5a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) - 0x00004c18 snprintf_P + 0x00004c38 0x5a c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + 0x00004c38 snprintf_P .text.avr-libc - 0x00004c72 0x39e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) - 0x00004c72 vfprintf + 0x00004c92 0x39e c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + 0x00004c92 vfprintf .text.avr-libc - 0x00005010 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) - 0x00005010 __eerd_block_x32a4u + 0x00005030 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eerd_block_atxmega32a4u.o) + 0x00005030 __eerd_block_x32a4u .text.avr-libc - 0x00005026 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) - 0x00005026 __eewr_block_x32a4u + 0x00005046 0x12 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_block_atxmega32a4u.o) + 0x00005046 __eewr_block_x32a4u .text.avr-libc - 0x00005038 0x46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) - 0x00005038 __eewr_byte_x32a4u - 0x0000503a __eewr_r18_x32a4u + 0x00005058 0x46 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(eewr_byte_atxmega32a4u.o) + 0x00005058 __eewr_byte_x32a4u + 0x0000505a __eewr_r18_x32a4u .text.avr-libc - 0x0000507e 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) - 0x0000507e strnlen_P + 0x0000509e 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen_P.o) + 0x0000509e strnlen_P .text.avr-libc - 0x00005094 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) - 0x00005094 strnlen + 0x000050b4 0x16 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(strnlen.o) + 0x000050b4 strnlen .text.avr-libc - 0x000050aa 0x58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) - 0x000050aa fputc + 0x000050ca 0x58 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + 0x000050ca fputc .text.avr-libc - 0x00005102 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) - 0x00005102 __ultoa_invert - .text.libgcc 0x000051be 0x36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) - 0x000051be __divmodsi4 - .text.libgcc 0x000051f4 0x32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) - 0x000051f4 __prologue_saves__ - .text.libgcc 0x00005226 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) - 0x00005226 __epilogue_restores__ - .text.libgcc 0x00005256 0x44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) - 0x00005256 __udivmodsi4 - 0x0000529a . = ALIGN (0x2) + 0x00005122 0xbc c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(ultoa_invert.o) + 0x00005122 __ultoa_invert + .text.libgcc 0x000051de 0x36 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_divmodsi4.o) + 0x000051de __divmodsi4 + .text.libgcc 0x00005214 0x32 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_prologue.o) + 0x00005214 __prologue_saves__ + .text.libgcc 0x00005246 0x30 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_epilogue.o) + 0x00005246 __epilogue_restores__ + .text.libgcc 0x00005276 0x44 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_udivmodsi4.o) + 0x00005276 __udivmodsi4 + 0x000052ba . = ALIGN (0x2) *(.fini9) - .fini9 0x0000529a 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) - 0x0000529a _exit - 0x0000529a exit + .fini9 0x000052ba 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) + 0x000052ba _exit + 0x000052ba exit *(.fini9) *(.fini8) *(.fini8) @@ -1234,11 +1234,11 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg *(.fini1) *(.fini1) *(.fini0) - .fini0 0x0000529a 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) + .fini0 0x000052ba 0x4 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmega2\libgcc.a(_exit.o) *(.fini0) - 0x0000529e _etext = . + 0x000052be _etext = . -.data 0x00802000 0xa2 load address 0x0000529e +.data 0x00802000 0xa2 load address 0x000052be 0x00802000 PROVIDE (__data_start, .) *(.data) .data 0x00802000 0x0 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2/crtx32a4u.o @@ -1366,8 +1366,8 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg COMMON 0x0080264a 0x63 Bin/USBController_XMEGA.o 0x0080264a USB_EndpointTable 0x008026ad PROVIDE (__bss_end, .) - 0x0000529e __data_load_start = LOADADDR (.data) - 0x00005340 __data_load_end = (__data_load_start + SIZEOF (.data)) + 0x000052be __data_load_start = LOADADDR (.data) + 0x00005360 __data_load_end = (__data_load_start + SIZEOF (.data)) .noinit 0x008026ad 0x0 0x008026ad PROVIDE (__noinit_start, .) @@ -1789,113 +1789,113 @@ LOAD c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avrxmeg .debug_frame 0x00001d98 0x4c c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) .debug_frame 0x00001de4 0x38 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) -.debug_str 0x00000000 0x769c +.debug_str 0x00000000 0x76b2 *(.debug_str) - .debug_str 0x00000000 0xc45 Bin/Chameleon-Mini.o - 0xd0a (size before relaxing) - .debug_str 0x00000c45 0x8cc Bin/LUFADescriptors.o - 0xb31 (size before relaxing) - .debug_str 0x00001511 0x767 Bin/System.o - 0xb5d (size before relaxing) - .debug_str 0x00001c78 0x2d0 Bin/Configuration.o - 0x559 (size before relaxing) - .debug_str 0x00001f48 0x3d Bin/Random.o - 0x13f (size before relaxing) - .debug_str 0x00001f85 0x56 Bin/Common.o - 0x167 (size before relaxing) - .debug_str 0x00001fdb 0x2a5 Bin/Memory.o - 0x778 (size before relaxing) - .debug_str 0x00002280 0x1c7 Bin/Button.o - 0x66d (size before relaxing) - .debug_str 0x00002447 0xb3 Bin/Settings.o - 0x476 (size before relaxing) - .debug_str 0x000024fa 0x6 Bin/LED.o - 0xf5 (size before relaxing) - .debug_str 0x00002500 0x1b0 Bin/Terminal.o - 0x60d (size before relaxing) - .debug_str 0x000026b0 0x3b9 Bin/Commands.o - 0xb8a (size before relaxing) - .debug_str 0x00002a69 0x192 Bin/XModem.o - 0x521 (size before relaxing) - .debug_str 0x00002bfb 0xe8 Bin/CommandLine.o - 0x4f4 (size before relaxing) - .debug_str 0x00002ce3 0x1a Bin/Codec.o - 0x265 (size before relaxing) - .debug_str 0x00002cfd 0x12b9 Bin/ISO14443-2A.o - 0x1a34 (size before relaxing) - .debug_str 0x00003fb6 0x236 Bin/MifareClassic.o - 0x4c7 (size before relaxing) - .debug_str 0x000041ec 0x41 Bin/ISO14443-3A.o - 0x15e (size before relaxing) - .debug_str 0x0000422d 0xe8 Bin/Crypto1.o - 0x1ec (size before relaxing) - .debug_str 0x00004315 0x474 Bin/HIDParser.o - 0x5f9 (size before relaxing) - .debug_str 0x00004789 0x22e Bin/ConfigDescriptors.o - 0x445 (size before relaxing) - .debug_str 0x000049b7 0x8f1 Bin/DeviceStandardReq.o - 0xfcf (size before relaxing) - .debug_str 0x000052a8 0x31 Bin/Events.o + .debug_str 0x00000000 0xc5b Bin/Chameleon-Mini.o + 0xd20 (size before relaxing) + .debug_str 0x00000c5b 0x8cc Bin/LUFADescriptors.o + 0xb47 (size before relaxing) + .debug_str 0x00001527 0x767 Bin/System.o + 0xb73 (size before relaxing) + .debug_str 0x00001c8e 0x2d0 Bin/Configuration.o + 0x56f (size before relaxing) + .debug_str 0x00001f5e 0x3d Bin/Random.o + 0x155 (size before relaxing) + .debug_str 0x00001f9b 0x56 Bin/Common.o + 0x17d (size before relaxing) + .debug_str 0x00001ff1 0x2a5 Bin/Memory.o + 0x78e (size before relaxing) + .debug_str 0x00002296 0x1c7 Bin/Button.o + 0x683 (size before relaxing) + .debug_str 0x0000245d 0xb3 Bin/Settings.o + 0x48c (size before relaxing) + .debug_str 0x00002510 0x6 Bin/LED.o 0x10b (size before relaxing) - .debug_str 0x000052d9 0x2b Bin/HostStandardReq.o - 0x105 (size before relaxing) - .debug_str 0x00005304 0x79 Bin/USBTask.o - 0x36c (size before relaxing) - .debug_str 0x0000537d 0x4a Bin/Device_XMEGA.o - 0x529 (size before relaxing) - .debug_str 0x000053c7 0x4c6 Bin/EndpointStream_XMEGA.o - 0x7ec (size before relaxing) - .debug_str 0x0000588d 0x3a9 Bin/Endpoint_XMEGA.o - 0xa44 (size before relaxing) - .debug_str 0x00005c36 0x2c Bin/Host_XMEGA.o - 0x106 (size before relaxing) - .debug_str 0x00005c62 0x32 Bin/PipeStream_XMEGA.o - 0x10c (size before relaxing) - .debug_str 0x00005c94 0x2c Bin/Pipe_XMEGA.o - 0x106 (size before relaxing) - .debug_str 0x00005cc0 0x198 Bin/USBController_XMEGA.o - 0xd7d (size before relaxing) - .debug_str 0x00005e58 0xad Bin/USBInterrupt_XMEGA.o - 0x804 (size before relaxing) - .debug_str 0x00005f05 0x236 Bin/AudioClassDevice.o - 0x5f3 (size before relaxing) - .debug_str 0x0000613b 0x32d Bin/CDCClassDevice.o - 0x944 (size before relaxing) - .debug_str 0x00006468 0x1ea Bin/HIDClassDevice.o - 0x904 (size before relaxing) - .debug_str 0x00006652 0x23a Bin/MassStorageClassDevice.o - 0x711 (size before relaxing) - .debug_str 0x0000688c 0x115 Bin/MIDIClassDevice.o - 0x60c (size before relaxing) - .debug_str 0x000069a1 0x269 Bin/PrinterClassDevice.o - 0x84c (size before relaxing) - .debug_str 0x00006c0a 0x6e5 Bin/RNDISClassDevice.o - 0xc5f (size before relaxing) - .debug_str 0x000072ef 0x3b Bin/AndroidAccessoryClassHost.o - 0x115 (size before relaxing) - .debug_str 0x0000732a 0x30 Bin/AudioClassHost.o - 0x10a (size before relaxing) - .debug_str 0x0000735a 0x2e Bin/CDCClassHost.o - 0x108 (size before relaxing) - .debug_str 0x00007388 0x2e Bin/HIDClassHost.o - 0x108 (size before relaxing) - .debug_str 0x000073b6 0x36 Bin/MassStorageClassHost.o - 0x110 (size before relaxing) - .debug_str 0x000073ec 0x2f Bin/MIDIClassHost.o - 0x109 (size before relaxing) - .debug_str 0x0000741b 0x32 Bin/PrinterClassHost.o - 0x10c (size before relaxing) - .debug_str 0x0000744d 0x30 Bin/RNDISClassHost.o - 0x10a (size before relaxing) - .debug_str 0x0000747d 0x35 Bin/StillImageClassHost.o - 0x10f (size before relaxing) - .debug_str 0x000074b2 0x6f c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) + .debug_str 0x00002516 0x1b0 Bin/Terminal.o + 0x623 (size before relaxing) + .debug_str 0x000026c6 0x3b9 Bin/Commands.o + 0xba0 (size before relaxing) + .debug_str 0x00002a7f 0x192 Bin/XModem.o + 0x537 (size before relaxing) + .debug_str 0x00002c11 0xe8 Bin/CommandLine.o + 0x50a (size before relaxing) + .debug_str 0x00002cf9 0x1a Bin/Codec.o + 0x27b (size before relaxing) + .debug_str 0x00002d13 0x12b9 Bin/ISO14443-2A.o + 0x1a4a (size before relaxing) + .debug_str 0x00003fcc 0x236 Bin/MifareClassic.o + 0x4dd (size before relaxing) + .debug_str 0x00004202 0x41 Bin/ISO14443-3A.o + 0x174 (size before relaxing) + .debug_str 0x00004243 0xe8 Bin/Crypto1.o + 0x202 (size before relaxing) + .debug_str 0x0000432b 0x474 Bin/HIDParser.o + 0x60f (size before relaxing) + .debug_str 0x0000479f 0x22e Bin/ConfigDescriptors.o + 0x45b (size before relaxing) + .debug_str 0x000049cd 0x8f1 Bin/DeviceStandardReq.o + 0xfe5 (size before relaxing) + .debug_str 0x000052be 0x31 Bin/Events.o + 0x121 (size before relaxing) + .debug_str 0x000052ef 0x2b Bin/HostStandardReq.o + 0x11b (size before relaxing) + .debug_str 0x0000531a 0x79 Bin/USBTask.o + 0x382 (size before relaxing) + .debug_str 0x00005393 0x4a Bin/Device_XMEGA.o + 0x53f (size before relaxing) + .debug_str 0x000053dd 0x4c6 Bin/EndpointStream_XMEGA.o + 0x802 (size before relaxing) + .debug_str 0x000058a3 0x3a9 Bin/Endpoint_XMEGA.o + 0xa5a (size before relaxing) + .debug_str 0x00005c4c 0x2c Bin/Host_XMEGA.o + 0x11c (size before relaxing) + .debug_str 0x00005c78 0x32 Bin/PipeStream_XMEGA.o + 0x122 (size before relaxing) + .debug_str 0x00005caa 0x2c Bin/Pipe_XMEGA.o + 0x11c (size before relaxing) + .debug_str 0x00005cd6 0x198 Bin/USBController_XMEGA.o + 0xd93 (size before relaxing) + .debug_str 0x00005e6e 0xad Bin/USBInterrupt_XMEGA.o + 0x81a (size before relaxing) + .debug_str 0x00005f1b 0x236 Bin/AudioClassDevice.o + 0x609 (size before relaxing) + .debug_str 0x00006151 0x32d Bin/CDCClassDevice.o + 0x95a (size before relaxing) + .debug_str 0x0000647e 0x1ea Bin/HIDClassDevice.o + 0x91a (size before relaxing) + .debug_str 0x00006668 0x23a Bin/MassStorageClassDevice.o + 0x727 (size before relaxing) + .debug_str 0x000068a2 0x115 Bin/MIDIClassDevice.o + 0x622 (size before relaxing) + .debug_str 0x000069b7 0x269 Bin/PrinterClassDevice.o + 0x862 (size before relaxing) + .debug_str 0x00006c20 0x6e5 Bin/RNDISClassDevice.o + 0xc75 (size before relaxing) + .debug_str 0x00007305 0x3b Bin/AndroidAccessoryClassHost.o + 0x12b (size before relaxing) + .debug_str 0x00007340 0x30 Bin/AudioClassHost.o + 0x120 (size before relaxing) + .debug_str 0x00007370 0x2e Bin/CDCClassHost.o + 0x11e (size before relaxing) + .debug_str 0x0000739e 0x2e Bin/HIDClassHost.o + 0x11e (size before relaxing) + .debug_str 0x000073cc 0x36 Bin/MassStorageClassHost.o + 0x126 (size before relaxing) + .debug_str 0x00007402 0x2f Bin/MIDIClassHost.o + 0x11f (size before relaxing) + .debug_str 0x00007431 0x32 Bin/PrinterClassHost.o + 0x122 (size before relaxing) + .debug_str 0x00007463 0x30 Bin/RNDISClassHost.o + 0x120 (size before relaxing) + .debug_str 0x00007493 0x35 Bin/StillImageClassHost.o + 0x125 (size before relaxing) + .debug_str 0x000074c8 0x6f c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(rand.o) 0xa8 (size before relaxing) - .debug_str 0x00007521 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) + .debug_str 0x00007537 0x88 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(snprintf_p.o) 0x12e (size before relaxing) - .debug_str 0x000075a9 0x9d c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) + .debug_str 0x000075bf 0x9d c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(vfprintf_std.o) 0x16b (size before relaxing) - .debug_str 0x00007646 0x56 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) + .debug_str 0x0000765c 0x56 c:/programme/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avrxmega2\libc.a(fputc.o) 0xfb (size before relaxing) .debug_loc 0x00000000 0xb6e8 diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.sym b/Firmware/Chameleon-Mini/Chameleon-Mini.sym index a97b4e7..c75c269 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.sym +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.sym @@ -331,338 +331,338 @@ 00000276 T DeviceDescriptor 00000288 t ConfigurationTable 000002f7 t ButtonActionTable -000003b7 t __c.6198 -000003f0 t __c.6200 -000003f7 t __c.6202 -000003fe t __c.6204 -00000404 t __c.6209 -00000407 t __c.6227 -0000040e t __c.6254 -00000411 t __c.6259 -00000414 t __c.6298 -0000041b T CommandTable -0000057b t __c.5994 -0000057e t __c.5996 -00000581 t StatusTable -00000648 T __ctors_end -00000648 T __ctors_start -00000648 T __dtors_end -00000648 T __dtors_start -00000648 W __init -00000648 T __trampolines_end -00000648 T __trampolines_start -00000654 T __do_copy_data -0000066a T __do_clear_bss -00000672 t .do_clear_bss_loop -00000674 t .do_clear_bss_start -00000680 T __bad_interrupt -00000680 W __vector_1 -00000680 W __vector_10 -00000680 W __vector_100 -00000680 W __vector_101 -00000680 W __vector_102 -00000680 W __vector_103 -00000680 W __vector_104 -00000680 W __vector_105 -00000680 W __vector_106 -00000680 W __vector_107 -00000680 W __vector_108 -00000680 W __vector_109 -00000680 W __vector_11 -00000680 W __vector_110 -00000680 W __vector_111 -00000680 W __vector_112 -00000680 W __vector_113 -00000680 W __vector_114 -00000680 W __vector_115 -00000680 W __vector_116 -00000680 W __vector_117 -00000680 W __vector_118 -00000680 W __vector_119 -00000680 W __vector_12 -00000680 W __vector_120 -00000680 W __vector_121 -00000680 W __vector_122 -00000680 W __vector_123 -00000680 W __vector_124 -00000680 W __vector_126 -00000680 W __vector_13 -00000680 W __vector_14 -00000680 W __vector_15 -00000680 W __vector_16 -00000680 W __vector_17 -00000680 W __vector_18 -00000680 W __vector_19 -00000680 W __vector_2 -00000680 W __vector_20 -00000680 W __vector_21 -00000680 W __vector_23 -00000680 W __vector_24 -00000680 W __vector_25 -00000680 W __vector_26 -00000680 W __vector_27 -00000680 W __vector_28 -00000680 W __vector_29 -00000680 W __vector_3 -00000680 W __vector_30 -00000680 W __vector_31 -00000680 W __vector_32 -00000680 W __vector_33 -00000680 W __vector_35 -00000680 W __vector_36 -00000680 W __vector_37 -00000680 W __vector_38 -00000680 W __vector_39 -00000680 W __vector_4 -00000680 W __vector_40 -00000680 W __vector_41 -00000680 W __vector_42 -00000680 W __vector_43 -00000680 W __vector_44 -00000680 W __vector_45 -00000680 W __vector_46 -00000680 W __vector_47 -00000680 W __vector_48 -00000680 W __vector_49 -00000680 W __vector_5 -00000680 W __vector_50 -00000680 W __vector_51 -00000680 W __vector_52 -00000680 W __vector_53 -00000680 W __vector_54 -00000680 W __vector_55 -00000680 W __vector_56 -00000680 W __vector_57 -00000680 W __vector_58 -00000680 W __vector_59 -00000680 W __vector_6 -00000680 W __vector_60 -00000680 W __vector_61 -00000680 W __vector_62 -00000680 W __vector_63 -00000680 W __vector_64 -00000680 W __vector_65 -00000680 W __vector_66 -00000680 W __vector_67 -00000680 W __vector_68 -00000680 W __vector_69 -00000680 W __vector_7 -00000680 W __vector_70 -00000680 W __vector_71 -00000680 W __vector_72 -00000680 W __vector_73 -00000680 W __vector_74 -00000680 W __vector_75 -00000680 W __vector_76 -00000680 W __vector_77 -00000680 W __vector_78 -00000680 W __vector_79 -00000680 W __vector_8 -00000680 W __vector_80 -00000680 W __vector_81 -00000680 W __vector_82 -00000680 W __vector_84 -00000680 W __vector_85 -00000680 W __vector_86 -00000680 W __vector_87 -00000680 W __vector_88 -00000680 W __vector_89 -00000680 W __vector_9 -00000680 W __vector_90 -00000680 W __vector_91 -00000680 W __vector_92 -00000680 W __vector_93 -00000680 W __vector_94 -00000680 W __vector_95 -00000680 W __vector_96 -00000680 W __vector_97 -00000680 W __vector_98 -00000680 W __vector_99 -00000682 T main -000006f4 T CALLBACK_USB_GetDescriptor -00000760 T __vector_default -0000076c T SystemInit -000007e0 T SystemReset -000007ee T SystemEnterBootloader -000007fa T SystemStartUSBClock -00000830 T SystemStopUSBClock -0000084c T SystemInterruptInit -00000858 t CodecInitDummy -0000085a t CodecTaskDummy -0000085c t ApplicationInitDummy -0000085e t ApplicationResetDummy -00000860 t ApplicationTaskDummy -00000862 t ApplicationProcessDummy -00000868 t ApplicationGetUidDummy -0000086a t ApplicationSetUidDummy -0000086c T ConfigurationSetById -000008be T ConfigurationInit -000008ca T ConfigurationSetByName -0000095a T ConfigurationGetList -000009ce T RandomInit -000009d0 T RandomGetByte -000009d6 T RandomGetBuffer -00000a04 T RandomTick -00000a14 T BufferToHexString -00000a8e T HexStringToBuffer -00000b2c T MemoryInit -00000c3a T MemoryReadBlock -00000d50 T MemoryWriteBlock -00000ff8 T MemoryClear -000010c4 T MemoryUploadBlock -00001120 T MemoryDownloadBlock -0000117e T ButtonInit -0000118c T ButtonTick -00001346 T ButtonGetActionList -000013a6 T ButtonSetActionById -000013b2 T ButtonGetActionByName -000013d8 T ButtonSetActionByName -0000146a T SettingsLoad -0000147a T SettingsSave -0000148a T SettingsSetActiveById -000014a8 T SettingsCycle -00001582 T SettingsGetActiveById -00001588 T SettingsGetActiveByName -0000159c T SettingsSetActiveByName -000015ba T TerminalSendString -000015c4 T TerminalSendStringP -000015ec T TerminalSendBlock -000015fa T TerminalInit -00001604 T TerminalTask -00001646 T TerminalTick -000016c4 T EVENT_USB_Device_Connect -000016ce T EVENT_USB_Device_Disconnect -000016d8 T EVENT_USB_Device_ConfigurationChanged -000016e0 T EVENT_USB_Device_ControlRequest -000016e8 T CommandGetVersion -00001742 T CommandGetConfig -0000178c T CommandSetConfig -0000179c T CommandExecConfig -000017a6 T CommandGetUid -000017f2 T CommandSetUid -0000189a T CommandGetReadOnly -000018b8 T CommandSetReadOnly -000018e4 T CommandExecUpload -000018ee T CommandExecDownload -000018f8 T CommandExecReset -0000190e T CommandExecUpgrade -00001924 T CommandGetMemSize -00001972 T CommandGetUidSize -000019bc T CommandExecButton -000019c6 T CommandGetButton -000019d0 T CommandSetButton -000019e0 T CommandGetSetting -000019ea T CommandSetSetting -000019fa T CommandExecClear -00001a00 T CommandExecHelp -00001a9a T CommandGetRssi -00001b2e t CalcChecksum.constprop.0 -00001b42 T XModemReceive -00001b72 T XModemSend -00001b98 T XModemProcessByte -00001e4a T XModemTick -00001ea6 T CommandLineProcessByte -000021ec T CommandLineTick -000021ee t StartDemod -0000222c T __vector_34 -000022b4 T __vector_22 -000023fc T __vector_83 -0000260e T ISO14443ACodecInit -0000267e T ISO14443ACodecTask -00002770 T MifareClassicAppInit1K -0000278a T MifareClassicAppInit4K -000027a4 T MifareClassicAppReset -000027ac T MifareClassicAppTask -000027ae T MifareClassicAppProcess +000003d7 t __c.6198 +00000410 t __c.6200 +00000417 t __c.6202 +0000041e t __c.6204 +00000424 t __c.6209 +00000427 t __c.6227 +0000042e t __c.6254 +00000431 t __c.6259 +00000434 t __c.6298 +0000043b T CommandTable +0000059b t __c.5994 +0000059e t __c.5996 +000005a1 t StatusTable +00000668 T __ctors_end +00000668 T __ctors_start +00000668 T __dtors_end +00000668 T __dtors_start +00000668 W __init +00000668 T __trampolines_end +00000668 T __trampolines_start +00000674 T __do_copy_data +0000068a T __do_clear_bss +00000692 t .do_clear_bss_loop +00000694 t .do_clear_bss_start +000006a0 T __bad_interrupt +000006a0 W __vector_1 +000006a0 W __vector_10 +000006a0 W __vector_100 +000006a0 W __vector_101 +000006a0 W __vector_102 +000006a0 W __vector_103 +000006a0 W __vector_104 +000006a0 W __vector_105 +000006a0 W __vector_106 +000006a0 W __vector_107 +000006a0 W __vector_108 +000006a0 W __vector_109 +000006a0 W __vector_11 +000006a0 W __vector_110 +000006a0 W __vector_111 +000006a0 W __vector_112 +000006a0 W __vector_113 +000006a0 W __vector_114 +000006a0 W __vector_115 +000006a0 W __vector_116 +000006a0 W __vector_117 +000006a0 W __vector_118 +000006a0 W __vector_119 +000006a0 W __vector_12 +000006a0 W __vector_120 +000006a0 W __vector_121 +000006a0 W __vector_122 +000006a0 W __vector_123 +000006a0 W __vector_124 +000006a0 W __vector_126 +000006a0 W __vector_13 +000006a0 W __vector_14 +000006a0 W __vector_15 +000006a0 W __vector_16 +000006a0 W __vector_17 +000006a0 W __vector_18 +000006a0 W __vector_19 +000006a0 W __vector_2 +000006a0 W __vector_20 +000006a0 W __vector_21 +000006a0 W __vector_23 +000006a0 W __vector_24 +000006a0 W __vector_25 +000006a0 W __vector_26 +000006a0 W __vector_27 +000006a0 W __vector_28 +000006a0 W __vector_29 +000006a0 W __vector_3 +000006a0 W __vector_30 +000006a0 W __vector_31 +000006a0 W __vector_32 +000006a0 W __vector_33 +000006a0 W __vector_35 +000006a0 W __vector_36 +000006a0 W __vector_37 +000006a0 W __vector_38 +000006a0 W __vector_39 +000006a0 W __vector_4 +000006a0 W __vector_40 +000006a0 W __vector_41 +000006a0 W __vector_42 +000006a0 W __vector_43 +000006a0 W __vector_44 +000006a0 W __vector_45 +000006a0 W __vector_46 +000006a0 W __vector_47 +000006a0 W __vector_48 +000006a0 W __vector_49 +000006a0 W __vector_5 +000006a0 W __vector_50 +000006a0 W __vector_51 +000006a0 W __vector_52 +000006a0 W __vector_53 +000006a0 W __vector_54 +000006a0 W __vector_55 +000006a0 W __vector_56 +000006a0 W __vector_57 +000006a0 W __vector_58 +000006a0 W __vector_59 +000006a0 W __vector_6 +000006a0 W __vector_60 +000006a0 W __vector_61 +000006a0 W __vector_62 +000006a0 W __vector_63 +000006a0 W __vector_64 +000006a0 W __vector_65 +000006a0 W __vector_66 +000006a0 W __vector_67 +000006a0 W __vector_68 +000006a0 W __vector_69 +000006a0 W __vector_7 +000006a0 W __vector_70 +000006a0 W __vector_71 +000006a0 W __vector_72 +000006a0 W __vector_73 +000006a0 W __vector_74 +000006a0 W __vector_75 +000006a0 W __vector_76 +000006a0 W __vector_77 +000006a0 W __vector_78 +000006a0 W __vector_79 +000006a0 W __vector_8 +000006a0 W __vector_80 +000006a0 W __vector_81 +000006a0 W __vector_82 +000006a0 W __vector_84 +000006a0 W __vector_85 +000006a0 W __vector_86 +000006a0 W __vector_87 +000006a0 W __vector_88 +000006a0 W __vector_89 +000006a0 W __vector_9 +000006a0 W __vector_90 +000006a0 W __vector_91 +000006a0 W __vector_92 +000006a0 W __vector_93 +000006a0 W __vector_94 +000006a0 W __vector_95 +000006a0 W __vector_96 +000006a0 W __vector_97 +000006a0 W __vector_98 +000006a0 W __vector_99 +000006a2 T main +00000714 T CALLBACK_USB_GetDescriptor +00000780 T __vector_default +0000078c T SystemInit +00000800 T SystemReset +0000080e T SystemEnterBootloader +0000081a T SystemStartUSBClock +00000850 T SystemStopUSBClock +0000086c T SystemInterruptInit +00000878 t CodecInitDummy +0000087a t CodecTaskDummy +0000087c t ApplicationInitDummy +0000087e t ApplicationResetDummy +00000880 t ApplicationTaskDummy +00000882 t ApplicationProcessDummy +00000888 t ApplicationGetUidDummy +0000088a t ApplicationSetUidDummy +0000088c T ConfigurationSetById +000008de T ConfigurationInit +000008ea T ConfigurationSetByName +0000097a T ConfigurationGetList +000009ee T RandomInit +000009f0 T RandomGetByte +000009f6 T RandomGetBuffer +00000a24 T RandomTick +00000a34 T BufferToHexString +00000aae T HexStringToBuffer +00000b4c T MemoryInit +00000c5a T MemoryReadBlock +00000d70 T MemoryWriteBlock +00001018 T MemoryClear +000010e4 T MemoryUploadBlock +00001140 T MemoryDownloadBlock +0000119e T ButtonInit +000011ac T ButtonTick +00001366 T ButtonGetActionList +000013c6 T ButtonSetActionById +000013d2 T ButtonGetActionByName +000013f8 T ButtonSetActionByName +0000148a T SettingsLoad +0000149a T SettingsSave +000014aa T SettingsSetActiveById +000014c8 T SettingsCycle +000015a2 T SettingsGetActiveById +000015a8 T SettingsGetActiveByName +000015bc T SettingsSetActiveByName +000015da T TerminalSendString +000015e4 T TerminalSendStringP +0000160c T TerminalSendBlock +0000161a T TerminalInit +00001624 T TerminalTask +00001666 T TerminalTick +000016e4 T EVENT_USB_Device_Connect +000016ee T EVENT_USB_Device_Disconnect +000016f8 T EVENT_USB_Device_ConfigurationChanged +00001700 T EVENT_USB_Device_ControlRequest +00001708 T CommandGetVersion +00001762 T CommandGetConfig +000017ac T CommandSetConfig +000017bc T CommandExecConfig +000017c6 T CommandGetUid +00001812 T CommandSetUid +000018ba T CommandGetReadOnly +000018d8 T CommandSetReadOnly +00001904 T CommandExecUpload +0000190e T CommandExecDownload +00001918 T CommandExecReset +0000192e T CommandExecUpgrade +00001944 T CommandGetMemSize +00001992 T CommandGetUidSize +000019dc T CommandExecButton +000019e6 T CommandGetButton +000019f0 T CommandSetButton +00001a00 T CommandGetSetting +00001a0a T CommandSetSetting +00001a1a T CommandExecClear +00001a20 T CommandExecHelp +00001aba T CommandGetRssi +00001b4e t CalcChecksum.constprop.0 +00001b62 T XModemReceive +00001b92 T XModemSend +00001bb8 T XModemProcessByte +00001e6a T XModemTick +00001ec6 T CommandLineProcessByte +0000220c T CommandLineTick +0000220e t StartDemod +0000224c T __vector_34 +000022d4 T __vector_22 +0000241c T __vector_83 +0000262e T ISO14443ACodecInit +0000269e T ISO14443ACodecTask +00002790 T MifareClassicAppInit1K +000027aa T MifareClassicAppInit4K +000027c4 T MifareClassicAppReset +000027cc T MifareClassicAppTask +000027ce T MifareClassicAppProcess 00002fff W __stack -0000316a T MifareClassicGetUid -00003176 T MifareClassicSetUid -000031b8 T ISO14443AAppendCRCA -00003234 T ISO14443ACheckCRCA -000032d0 t Crypto1LFSR -0000339e T Crypto1FilterOutput -00003406 T Crypto1Setup -00003792 T Crypto1Auth -00003810 T Crypto1Byte -00003892 T Crypto1Nibble -000038da T Crypto1PRNG -000039d6 T USB_Device_ProcessControlRequest -00003c86 W EVENT_USB_Device_Reset -00003c86 W EVENT_USB_Device_StartOfFrame -00003c86 W EVENT_USB_Device_Suspend -00003c86 W EVENT_USB_Device_WakeUp -00003c86 T USB_Event_Stub -00003c88 T USB_USBTask -00003cb0 T Endpoint_Write_Stream_LE -00003d88 T Endpoint_Write_Control_Stream_LE -00003ed2 T Endpoint_Write_Control_PStream_LE -00004032 T Endpoint_ClearIN -00004064 T Endpoint_ClearOUT -00004082 T Endpoint_Read_8 -000040a0 T Endpoint_Write_8 -000040be T Endpoint_SelectEndpoint -00004136 T Endpoint_StallTransaction -0000416e T Endpoint_ClearSETUP -000041c6 T Endpoint_IsSETUPReceived -000041f6 T Endpoint_IsOUTReceived -00004226 T Endpoint_IsINReady -00004240 T Endpoint_ConfigureEndpoint_PRV -000042da T Endpoint_ConfigureEndpointTable -000043b2 T Endpoint_ClearEndpoints -00004422 T Endpoint_ClearStatusStage -0000444e T Endpoint_WaitUntilReady -000044f0 T USB_Disable -0000450a T USB_ResetInterface -00004566 T USB_Init -000045ba T USB_INT_DisableAllInterrupts -000045c8 T USB_INT_ClearAllInterrupts -000045d4 T __vector_125 -000046b4 T CDC_Device_ProcessControlRequest -0000480a T CDC_Device_ConfigureEndpoints -00004856 T CDC_Device_SendString -0000489e T CDC_Device_SendData -000048e2 T CDC_Device_SendByte -00004938 T CDC_Device_Flush -000049ca T CDC_Device_USBTask -000049fe T CDC_Device_ReceiveByte -00004ac8 T CDC_Device_Event_Stub -00004ac8 W EVENT_CDC_Device_BreakSent -00004ac8 W EVENT_CDC_Device_ControLineStateChanged -00004ac8 W EVENT_CDC_Device_LineEncodingChanged -00004aca T __mulsi3 -00004b08 t do_rand -00004ba6 T rand_r -00004ba8 T rand -00004bae T srand -00004bc4 T memcpy_P -00004bd6 T strcmp_P -00004be8 T strncpy_P -00004c06 T memcpy -00004c18 T snprintf_P -00004c72 T vfprintf -00005010 T __eerd_block_x32a4u -00005026 T __eewr_block_x32a4u -00005038 T __eewr_byte_x32a4u -0000503a T __eewr_r18_x32a4u -0000507e T strnlen_P -00005094 T strnlen -000050aa T fputc -00005102 T __ultoa_invert -000051be T __divmodsi4 -000051d2 t __divmodsi4_neg2 -000051e0 t __divmodsi4_exit -000051e2 t __divmodsi4_neg1 -000051f4 T __prologue_saves__ -00005226 T __epilogue_restores__ -00005256 T __udivmodsi4 -00005262 t __udivmodsi4_loop -0000527c t __udivmodsi4_ep -0000529a T _exit -0000529a W exit -0000529c t __stop_program -0000529e A __data_load_start -0000529e T _etext -00005340 A __data_load_end +0000318a T MifareClassicGetUid +00003196 T MifareClassicSetUid +000031d8 T ISO14443AAppendCRCA +00003254 T ISO14443ACheckCRCA +000032f0 t Crypto1LFSR +000033be T Crypto1FilterOutput +00003426 T Crypto1Setup +000037b2 T Crypto1Auth +00003830 T Crypto1Byte +000038b2 T Crypto1Nibble +000038fa T Crypto1PRNG +000039f6 T USB_Device_ProcessControlRequest +00003ca6 W EVENT_USB_Device_Reset +00003ca6 W EVENT_USB_Device_StartOfFrame +00003ca6 W EVENT_USB_Device_Suspend +00003ca6 W EVENT_USB_Device_WakeUp +00003ca6 T USB_Event_Stub +00003ca8 T USB_USBTask +00003cd0 T Endpoint_Write_Stream_LE +00003da8 T Endpoint_Write_Control_Stream_LE +00003ef2 T Endpoint_Write_Control_PStream_LE +00004052 T Endpoint_ClearIN +00004084 T Endpoint_ClearOUT +000040a2 T Endpoint_Read_8 +000040c0 T Endpoint_Write_8 +000040de T Endpoint_SelectEndpoint +00004156 T Endpoint_StallTransaction +0000418e T Endpoint_ClearSETUP +000041e6 T Endpoint_IsSETUPReceived +00004216 T Endpoint_IsOUTReceived +00004246 T Endpoint_IsINReady +00004260 T Endpoint_ConfigureEndpoint_PRV +000042fa T Endpoint_ConfigureEndpointTable +000043d2 T Endpoint_ClearEndpoints +00004442 T Endpoint_ClearStatusStage +0000446e T Endpoint_WaitUntilReady +00004510 T USB_Disable +0000452a T USB_ResetInterface +00004586 T USB_Init +000045da T USB_INT_DisableAllInterrupts +000045e8 T USB_INT_ClearAllInterrupts +000045f4 T __vector_125 +000046d4 T CDC_Device_ProcessControlRequest +0000482a T CDC_Device_ConfigureEndpoints +00004876 T CDC_Device_SendString +000048be T CDC_Device_SendData +00004902 T CDC_Device_SendByte +00004958 T CDC_Device_Flush +000049ea T CDC_Device_USBTask +00004a1e T CDC_Device_ReceiveByte +00004ae8 T CDC_Device_Event_Stub +00004ae8 W EVENT_CDC_Device_BreakSent +00004ae8 W EVENT_CDC_Device_ControLineStateChanged +00004ae8 W EVENT_CDC_Device_LineEncodingChanged +00004aea T __mulsi3 +00004b28 t do_rand +00004bc6 T rand_r +00004bc8 T rand +00004bce T srand +00004be4 T memcpy_P +00004bf6 T strcmp_P +00004c08 T strncpy_P +00004c26 T memcpy +00004c38 T snprintf_P +00004c92 T vfprintf +00005030 T __eerd_block_x32a4u +00005046 T __eewr_block_x32a4u +00005058 T __eewr_byte_x32a4u +0000505a T __eewr_r18_x32a4u +0000509e T strnlen_P +000050b4 T strnlen +000050ca T fputc +00005122 T __ultoa_invert +000051de T __divmodsi4 +000051f2 t __divmodsi4_neg2 +00005200 t __divmodsi4_exit +00005202 t __divmodsi4_neg1 +00005214 T __prologue_saves__ +00005246 T __epilogue_restores__ +00005276 T __udivmodsi4 +00005282 t __udivmodsi4_loop +0000529c t __udivmodsi4_ep +000052ba T _exit +000052ba W exit +000052bc t __stop_program +000052be A __data_load_start +000052be T _etext +00005360 A __data_load_end 00802000 D TerminalHandle 00802000 D __data_start 0080201b d TerminalInitDelay