diff --git a/firmware/build_stm6/inlretro_stm.axf b/firmware/build_stm6/inlretro_stm.axf index 00d5d0f..b56f48e 100644 Binary files a/firmware/build_stm6/inlretro_stm.axf and b/firmware/build_stm6/inlretro_stm.axf differ diff --git a/firmware/build_stm6/inlretro_stm.bin b/firmware/build_stm6/inlretro_stm.bin new file mode 100644 index 0000000..2066bae Binary files /dev/null and b/firmware/build_stm6/inlretro_stm.bin differ diff --git a/firmware/build_stm6/inlretro_stm.elf b/firmware/build_stm6/inlretro_stm.elf index d6b3fe8..090123c 100644 Binary files a/firmware/build_stm6/inlretro_stm.elf and b/firmware/build_stm6/inlretro_stm.elf differ diff --git a/firmware/build_stm6/inlretro_stm.hex b/firmware/build_stm6/inlretro_stm.hex index e248d48..7ab4fd3 100644 --- a/firmware/build_stm6/inlretro_stm.hex +++ b/firmware/build_stm6/inlretro_stm.hex @@ -1,744 +1,1500 @@ :020000040800F2 -:2000000000180020050800083505000839050008000000000000000000000000000000000B -:200020000000000000000000000000003505000800000000000000003505000835050008FA -:20004000350500083505000835050008350500083505000835050008350500083505000890 -:20006000350500083505000835050008350500083505000835050008350500083505000870 -:20008000350500083505000835050008350500083505000835050008350500083505000850 -:2000A0003505000835050008350500083505000835050008350500083505000899010008D0 -:2000C000284B10B51A88284B12041B881A43274B198849084900885A254908801988023164 -:2000E00089B21980198849084900885A214908801988023189B21980198849084900885A58 -:200100001D49088019881D48023189B21980198849084900895A1A4A11801A881949023299 -:2001200092B21A801C880288944213D902881C880832121B92B20A80028892B21A801249CB -:20014000124B0A881343124A1A40302353409BB20B8010BD0F4804881A889442E6D30823DA -:200160000B80ECE70C6000400A600040046000404C6000404E6000405060004002600040BB -:20018000526000401A600040005C00408080FFFFBF8FFFFF006000409449F8B50B88944C30 -:2001A000002B3AD00A88934B9A4234D100230225914A924F1380924A1380924A1380924A66 -:2001C0001380924A1380924AD08FA843D087D08F013DA843D0878F481735FB8705808E48C1 -:2001E000343505808D480835058080258C486D01058080258B4805808020FB878A4B000614 -:2002000023808A4B18608023D08FDB000343D387874B884A1A8000230B8023881BB2002BE2 -:2002200000DBC4E02388844A774F134080221343238023881B0500D49CE0804D7F232A78E6 -:2002400011009943714B1980E9886B4B198000216C4B19803B88FF318B4313433B806023D6 -:200260001A4208D08022764B12051B8828009B189847634B188060232A78134052B2002A87 -:200280004DDA002B14D16A78062A0FD16A88110A02291AD003291BD0012920D1694B1226F5 -:2002A000694A99B21180694A1B0C1380544B1E802288674B1343674A1A40C0239B01534036 -:2002C0009BB22380FFF7FCFE47E05E4B1233E6E7D2B2012A0FD0002A03D0022A15D01E00A2 -:2002E000E4E7584B584A243399B21180574A1B0C13800426DAE7534B534A283399B2118003 -:20030000524A1B0C1380544ED0E74E4B4E4A7C3399B211804D4A1B0C1380504EC6E7002BAB -:2003200009D16B78052B06D13A886B88D2B21B0213439BB23B8000212388494A1340494A00 -:2003400013439BB22380484B198023881A43474B1A40474B5A4092B22280284BDB8F5B05E8 -:2003600007D580222F4B1A800023244AD3872E4B2380F8BD60213B880B40402BEDD13B88B4 -:200380001342EAD1264A3B4B2C481B881188802212059B18C9B298472288324B13432D4AED -:2003A0001A40C0239B0153409BB22380D5E7802223881342D1D023882F490B4080210902C8 -:2003C0000B432380114B1B88934200D17AE7FF200D4B19888143C0D01988090A0A4311495F -:2003E0000A801A8802401A80B7E7C0460E600040005C00403CA5000000600040065C0040E4 -:2004000002600040046000400660004008600040025C0040505C0040186000401C6000404A -:200420001E6000404C5C00402032000000E100E0585C00400080FFFF8F0F000054600040FF -:20044000106000407C0400080A6000400C6000408081FFFF8FBFFFFF2A0300001E03000075 -:200460008F8EFFFF8080FFFF1A600040BFBFFFFF30300000126000400F8FFFFF120100026A -:20048000FF000008C016DC05030201020001090212000101008032090400000000000000B7 -:2004A000040309042A0349006E00660069006E006900740065004E00650073004C006900EA -:2004C0007600650073002E0063006F006D0000000000000000000000000000000000000061 -:2004E0000000000000000000000000000000000000000000000000001E0349004E004C00F8 -:20050000200052006500740072006F002D00500072006F00670000000000000000000000EA -:200520000000000000000000000000000000000000000000FEE7FFFF004801E02301ADDE00 -:20054000FEE7C04602B4714649084900095C49008E4402BC7047C046411D00000061656129 -:2005600062690001130000000536532D4D00060C074D09011901FFFF03B47146490840000D -:200580004900095A49008E4403BC7047411D00000061656162690001130000000536532DFF -:2005A0004D00060C074D09011901FFFF70470A4B0A4A10B55A600A4A5A600122DC681442BC -:2005C000FCD11A6101220180D9681142FCD12022DA6060321A6110BD002002402301674546 -:2005E000AB89EFCDFF2370B53C4C23804378C588102B00D06FE0C37881888078384E01383C -:200600007269082800D964E0FFF79CFF0563632B3B3149515F008B1E8E227D2B19D8314B58 -:200620007360314B73600123F2681A42FCD102233361802389021B05C9184223716133613E -:20064000C046413BF2681A40FCD12023F360603333612270254BA2B2240CE8B25A819C81C2 -:2006600070BD58001018FFF7A2FF0022F1E78E22012BEED8180480231B05C01840181C4926 -:20068000F1E7042363707369A37073691B0AE37073691B0C237173691B0E6371E5E70223E4 -:2006A00063701388A37013881B0AE370DDE78E22012BCED880221B0412059B18591802233F -:2006C00063700B88A3700B88EEE70A4B0A4ADA60CBE78B22BDE780232370BBE7F80600205D -:2006E0000020024023016745AB89EFCD00600040FFFF000000ED00E00400FA05FFFFFFFF6E -:20070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:20072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF164B174A9BB21382164B9BB253826846B4 -:200780001C300F4A0F4B0430043001681140C91AFAD1094A094B043801681140C91AF2D147 -:2007A0007B460A3303600438013303600CE00A4B0A4A1A60FBE7C0460000FFFF0000000808 -:2007C000FFFFFF0F0000000100207047E505000800600040AD05000800300040AAAA000025 -:2007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:200800004156303309490A4A0A4B9B1A03DD043BC858D050FBDC0849084A0020521A02DDEA -:20082000043A8850FCDC03F017F90000405800080000002030040020300400203807002000 -:2008400070B50E4B1A68537A55685C18E4B2A3420ED1537A0A48CB1853720378591AC9B210 -:2008600001700020814202D198230130D37070BD06780130EE540133DBB2E8E794040020BC -:2008800098040020FF23F0B5C04C85B0238083790200009340780138102801D901F03EFE30 -:2008A000FFF76AFE1100D4059B08460AE30C3C0E280E730B190C640CC40C850AD30A110B23 -:2008C000400B3C0EC70C907891888C231D2826D8FFF752FE1E0028001E011802E40283036C -:2008E0000E04CA04E604F204FA0402050B05140522052A0532053A05AA05AA05AA054A05E2 -:200900005F057605CC02D8023F058D059605A105B0239F4A5B0351690B43536100232370AD -:2009200000F0C2FE152901D900F081FD0800FFF723FE160023002E007E05390044004F00AC -:200940007E055C006900730080007E057E058D009A00A700B400C100CE00D800E2009023D8 -:20096000DB051A688B490A401A608022D96852030A43DA600023D2E790230122DB051968AB -:2009800091431960D9680A43DA600023C7E790230422DB05196891431960D9680A43DA6022 -:2009A0000023BCE790231022DB05196891431960D9680A43DA600023B1E790234022DB0566 -:2009C000196891431960D9680A43DA600023A6E79023DB051A6870490A401A608022D9685C -:2009E000D2040A43DA60002399E79023DB051A686A490A401A608022D96852010A43DA60AE -:200A000000238CE70422664B196891431960D9680A43DA60002382E79023DB051A68614988 -:200A20000A401A608022D968D2050A43DA60002375E79023DB051A685B490A401A60802213 -:200A4000D968D2020A43DA60002368E79023DB051A6856490A401A608022D96852000A438E -:200A6000DA6000235BE79023DB051A6850490A401A608022D968D2000A43DA6000234EE7D1 -:200A80009023DB051A684B490A401A608022D968D2010A43DA60002341E79023DB051A684C -:200AA0003D490A401A608022D968D2040A43DA60002334E79023DB051A683F490A401A600D -:200AC0008022D96852050A43DA60002327E70122334B196891431960D9680A43DA600023CA -:200AE0001DE71022354B196891431960D9680A43DA60002313E79023DB051A682C490A40B9 -:200B00001A608022D968D2000A43DA60002306E7152901D900F08EFC0800FFF72DFD16003F -:200B200021002C008B0451005C0067008B0472007D00870092008B048B049D00A800B30018 -:200B4000BE00C900D400DE00E8009023DB051968104801401960DA680240DA600023DEE6A9 -:200B600090230121DB051A688A431A60DA688A43DA600023D3E690230421DB051A688A43CB -:200B80001A60DA688A43DA600023C8E60007002000100240FFFFEFFFFFFFFFFBFFEFFFFF78 -:200BA00000040048FFFFFFBFFFFFFBFFFFFEFFFFFFFBFFFFFFBFFFFFFFFFFFEF000C004846 -:200BC00090231021DB051A688A431A60DA688A43DA600023A3E690234021DB051A688A4350 -:200BE0001A60DA688A43DA60002398E69023DB051968CE4801401960DA680240DA600023CC -:200C00008DE69023DB051968C94801401960DA680240DA60002382E60421C64B1A688A43B4 -:200C20001A60DA688A43DA60002378E69023DB051968C14801401960DA680240DA600023B8 -:200C40006DE69023DB051968BC4801401960DA680240DA60002362E69023DB051968B84832 -:200C600001401960DA680240DA60002357E69023DB051968B34801401960DA680240DA6015 -:200C800000234CE69023DB051968AF4801401960DA680240DA60002341E69023DB0519681E -:200CA000A24801401960DA680240DA60002336E69023DB051968A54801401960DA68024054 -:200CC000DA6000232BE601219A4B1A688A431A60DA688A43DA60002321E610219C4B1A68C9 -:200CE0008A431A60DA688A43DA60002317E69023DB051968934801401960DA680240DA60DD -:200D000000230CE6152900D997E30800FFF734FC16001F00270095032F0037003F009503CE -:200D20004800510058006100950395036A0073007C0085008E0097009E00A5009022802396 -:200D4000D20511685B030B4313600023E7E590220123D20511680B4313600023DFE59022B5 -:200D60000423D20511680B4313600023D7E590221023D20511680B4313600023CFE59022DD -:200D80004023D20511680B4313600023C7E590228023D2051168DB040B4313600023BEE505 -:200DA00090228023D20511685B010B4313600023B5E504235F4A11680B4313600023AEE5F4 -:200DC00090228023D2051168DB050B4313600023A5E590228023D2051168DB020B431360DD -:200DE00000239CE590228023D20511685B000B431360002393E590228023D2051168DB0073 -:200E00000B43136000238AE590228023D2051168DB010B431360002381E590228023D20588 -:200E20001168DB040B431360002378E590228023D20511685B050B43136000236FE50123B8 -:200E40003C4A11680B431360002368E51023404A11680B431360002361E590228023D205D6 -:200E60001168DB000B431360002358E58D23082900D054E590224023D20551680B4353606D -:200E800000234CE58D23082900D048E59022D205536838318B435360002340E5152900D993 -:200EA000CEE20800FFF768FB16001D002300CC0229002F003500CC023C0056005B00620053 -:200EC000CC02CC0269006F0075007B00820089008E00930090238022DB05D2009A6200235C -:200EE0001DE590230122DB059A62002317E590230222DB059A62002311E590230422DB059A -:200F00009A6200230BE590230822DB059A62002305E590238022DB0592019A620023FEE433 -:200F200090234022DB059A620023F8E4FFFFFFFBFFEFFFFF00040048FFFFFFBFFFFFFBFFDD -:200F4000FFFEFFFFFFFBFFFFFFBFFFFFFFFFFFEF000C00480222CD4B9A620023DFE49023D1 -:200F60008022DB0512029A620023D8E490238022DB0592009A620023D1E490231022DB05A0 -:200F80009A620023CBE490232022DB059A620023C5E490238022DB059A620023BFE490233C -:200FA0008022DB0592019A620023B8E490238022DB05D2019A620023B1E40122B34B9A6288 -:200FC0000023ACE40422B24B9A620023A7E490232022DB059A620023A1E4152900D932E2ED -:200FE0000800FFF7C9FA16001D002300300229002F00350030023C00420047004E003002A4 -:20100000300255005B00610067006E0075007A007F0090238022DB05D2009A6100237EE4C3 -:2010200090230122DB059A61002378E490230222DB059A61002372E490230422DB059A61A1 -:2010400000236CE490230822DB059A61002366E490238022DB0592019A6100235FE490231C -:201060004022DB059A61002359E40222874B9A61002354E490238022DB0512029A61002320 -:201080004DE490238022DB0592009A61002346E490231022DB059A61002340E49023202214 -:2010A000DB059A6100233AE490238022DB059A61002334E490238022DB0592019A610023C3 -:2010C0002DE490238022DB05D2019A61002326E401226E4B9A61002321E404226C4B9A61F8 -:2010E00000231CE490232022DB059A61002316E402236370152900D9B1E00800FFF722FA26 -:201100000B151EAF273039AF434C545DAFAF677079828C969EA690238022DB051B69D20042 -:20112000134063800023FFF7FAFB90230122DB051B69134063800023FFF7F1FB902302221F -:20114000DB051B69134063800023FFF7E8FB90230422DB051B69134063800023FFF7DFFB93 -:2011600090230822DB051B69134063800023FFF7D6FB90238022DB051B699201134063808C -:201180000023FFF7CCFB90234022DB051B69134063800023FFF7C3FB02223C4B1B69134067 -:2011A00063800023FFF7BBFB9023DB051B69DB0BDB0363800023FFF7B2FB90238022DB05C4 -:2011C0001B699200134063800023FFF7A8FB90231022DB051B69134063800023FFF79FFBD5 -:2011E00090232022DB051B69134063800023FFF796FB90238022DB051B69134063800023A4 -:20120000FFF78DFB90238022DB051B699201134063800023FFF783FB90238022DB051B697E -:20122000D201134063800023FFF779FB0122174B1B69134063800023FFF771FB0422144BCF -:201240001B69134063800023FFF769FB90232022DB051B69134063800023FFF760FB002331 -:2012600063708D33FFF75BFB80230A4ADB0251690B435361054B08491A680A401A60D968D7 -:20128000064A0A43DA600023FFF749FB00040048000C004800100240FFFFAAAA000055552C -:2012A000BB4BBC491A680A401A60D968BA4A0A43DA600023FFF733FBB54AB64913680B4006 -:2012C00013600023FFF72BFBB14AB34B11680B4313600023FFF723FBAD4A09025369DBB2A7 -:2012E000194351610023FFF71AFBA94B1B691B0AA370012363700023FFF711FB8023A74A52 -:201300001B0351690B435361A54AA64B11680B4313600023FFF703FBA14AA24BD1680B4363 -:20132000D3600023FFF7FBFA9D4A9F4913680B4013600023FFF7F3FA994A9A4B11680B43CF -:2013400013600023FFF7EBFA954B59610023FFF7E6FA01236370924B1A69A2701B691B0A77 -:20136000E3700023FFF7DBFAC0238C4ADB0251690B435361864A8D4B11680B431360902246 -:20138000A023D20511685B030B4313600023FFF7C6FA7F4A854BD1680B43D3609023A0217B -:2013A000DB05D86849030143D96011688048014011601A687F490A401A600023FFF7AFFA81 -:2013C000FF2573488B0042692B407B4DC9002A40134343619022C020D205C0005369014072 -:2013E00076480340194351610023FFF798FA0121674B1A680A431A6099620023FFF78FFA79 -:201400000122634B196891431960D9680A43DA600023FFF784FA0122614B59615C4B9A61A3 -:201420009A620023FFF77BFA0023FFF778FA8D23FFF775FA8D23FFF772FA8D23FFF76FFA61 -:201440008D23FFF76CFA8D23FFF769FA95789388052D00D1DBE135D8022D00D16FE107D854 -:20146000002D00D11AE1012D00D125E1962519E1032D00D14CE2042DF8D1DBB29825012B1A -:2014800000D00FE190224E4BD2051A6006220A214C4B1A703E4B4C4A13604C4A11704C4A3D -:2014A000013113604B4A11704B4A13600C224B4B1A70B023394A5B0351690B43536101F0BA -:2014C00093FF98E1082D00D1FBE100D98CE0062D00D1B8E1072DC9D102F052F8902301205F -:2014E000DB051A6802431A601022986119680A4304211A60802299611C68D20122431A6061 -:2015000080229A6180221C68520122431A6040229A611C68214319600221996119680A432D -:201520001A6008229A6180221C4912034C6922431B4C4A6125681B4A2A432260144A156808 -:2015400005431560842590626561002590619062802065611C68C005204318608020000239 -:201560009862C0204C69C002204348610F2011680140116019681A4801401960D06819497D -:201580000143D160A022D96852030A43DA6089E000040048FFFFAAAA0000555500100240F4 -:2015A0000008004855555555AAAAAAAA50550000AFAAFFFFFFFFEBFF03FF0000FFF9000001 -:2015C00024070020280700201C070020200700202C070020300700201407002018070020C3 -:2015E000FFFFC3FF505555550A2D00D1FAE000D203E1802D00D039E79023012540208026C8 -:20160000DB05657098621A68760132431A60C046D2491C691A6804400A401A60DA680A4077 -:20162000DA60F022002C36D11A680A401A60DA683243DA601A6994461A690192C0461A69F8 -:201640000292C046C0461A690392C046C046C0461F69C046C046C046C0461E691A680A40CD -:201660001A60DA681140D96063462200034212D1019B2A0003420ED10299023201420AD15A -:2016800003990332014206D10432074203D1D632064200D0D13AB24B9A70ACE0B14A1370D0 -:2016A00001F06EFFAE4C2570AF4B0098A2B2240C5A819C8105B0F0BD01F062FF9023DB05E8 -:2016C0009D611A6815438022D2001D609A628022196852030A431A60022204219A611A6840 -:2016E0000A431A601022996119680A431A6008229A61196838320A431A6080239B49DB0274 -:201700004A699B4D13439B4A4B6113682B401360D468994B1C43D460106828401060D068B3 -:201720000343D36080234A691B0313434B61934B934A19680A431A6000255D61B2E701F04A -:201740001FFF90230121DB051A6888480A431A60102299611968864E0A431A6004224021CE -:201760009A611A680A431A6008229A6180229961196852010A431A6080224169D2020A435C -:201780007C4942610A6832400A60CD687A4A1543CD600C6834400C60CC682243CA6080225C -:2017A0004469120322434261744A754C15682C43002514605561C0224469D202224342613A -:2017C0000868704A02430A60A0221868520302431A606D484A6902404A615A696B490A40C4 -:2017E0005A615FE790238022DB051968D2010A431A6080229A61002554E790238022DB0566 -:201800001968D2010A431A6080229A62F3E701F0B7FE90230121DB051A680A431A6010225F -:20182000996119680A431A60042240219A611A680A431A6008229A618022186852010243BC -:201840001A60996159E701F09BFE90230121DB051A68474D0A431A601022996119680A43BE -:201860001A6004229A6119683C3211431960082199619A629A6180233C49DB024A691343E9 -:201880003C4A4B6113682B401360D4683A4B1C43D460106828401060D0680343D3608023C5 -:2018A0004A691B0313434B61344B354A1968384811431960196801401960D9680A43DA6086 -:2018C0003AE701F05DFE90230121DB051A680A431A6004229961196811431960196811435A -:2018E0001960102118680143196040219A611A680A431A6080229D611868520102431A602A -:2019000099618023194A1B0351690B435361CBE7DBB2022B42D00025032B00D1C2E69735D7 -:20192000012B00D0BEE68022002510491203486902434A61114A116899431160D16819437B -:20194000D160516819435160936111680B431360104B1D70104B1A60A4E6C046FFEFFFFF29 -:2019600000070020080700200060004000100240FFFFAAAA00040048000055550008004887 -:20198000555555555055000003FF0000FFF90000AAAAAAAA100700200C070020B023C14A64 -:2019A0005B03516940200B4353619022D2051368BD490B4013608023D1685B011943D16020 -:2019C000516801435160906111680B4308211360B64B1970B64B1A600DE79678D778958892 -:2019E000112E00D104E156D8082E00D1FBE019D8042E00D1D4E00BD8012E00D19CE0002EAD -:201A000000D18DE0022E00D19BE0A023FEF787FF062E00D18BE000D8BDE03900280001F097 -:201A20001DFB81E00C2E00D1E7E009D80A2E00D1C5E000D8BEE03900280001F0FBF973E0BD -:201A40000E2E00D1C0E000D2C8E00F2E00D1C0E0102EDAD1AA21974801F02EF955219648B2 -:201A600001F02AF9A021934801F026F93900280001F022F9A020914B0002197801F01CF904 -:201A8000280001F015FA0600C046280001F010FA8642F5D148E0252E00D177E01AD8202E7E -:201AA00000D182E00BD8132E00D1B0E000D2A9E0142EAAD13900280001F0A6FA34E0222E00 -:201AC00044D074D3232E00D106E17D4B242E9CD11D7029E0822E00D1D1E00AD8802E00D1F2 -:201AE0009AE000D9C4E00023262E01D1FEF717FF8BE7852E00D1C8E008D8842E00D084E730 -:201B000001232800637001F003F8B6E0862E00D1C0E0872E00D078E701236370684BB7E0DA -:201B20003900280001F0E6FA0023FEF7F8FE3900280001F0BBFAF7E73900280001F004F832 -:201B4000F2E73900280001F0B7F8EDE75D4B02225D6190235C49DB059A6208685B4A3F02C3 -:201B600002430A604A692DB2D2B217434F61002D01DA01229A62C046C04601229A6192189B -:201B80009A610B68524A13400B60CDE73900280001F062F8C8E73900280000F091FFC3E7E3 -:201BA0003900280001F03EFEBEE7444B90E7494B1D80B9E73900280001F0FAFAB4E7390001 -:201BC000280001F027F8AFE73900280001F06CFEAAE73900280001F037FEA5E73900280076 -:201BE00001F0B4FAA0E73900280000F0F1FF9BE73900280001F0E4F896E73900280001F0FF -:201C000099F891E73900280001F0C4F98CE73900280001F099F987E7012190236170DB0561 -:201C20001868214E30401860DA6802203240DA608022D2009A629961986122484561C04644 -:201C4000C0462DB29A61002D00DA9962C046C046C046C046C046C046902280211A4BD205EF -:201C6000C9001B69916201211B0A9161A3705BE701232800637001F01BF9A07054E7012303 -:201C80002800637000F088FFF7E7012363700B4B1B78EBE7022363700E4B1B88A3701B0A16 -:201CA000E37041E700100240FFEFFFFF100700200C070020AAFA000055F500008C04002063 -:201CC000A3040020000800480004004800005555FFFFAAAA36040020B94B9D4202D88023EB -:201CE0001B021D43902700F011FD6B1CFF339BB20193FF05B34BB44E5D613268B34B0002BC -:201D00001343FF2233607369134018437061C0460823BB6200F0FAFC08230135BB61019B11 -:201D2000ADB29D42E6D13368A94A13403360FBE69078D1789588AA23062801D9FEF7EFFD35 -:201D4000FEF700FC042A1B2226322000FF209E49AB004A6903409F48ED00024013434B61F0 -:201D60009022C021D205C90053690D409A490B401D4355610023FEF7D2FD0022280000F0C2 -:201D8000DDFCF7E70122F9E7280000F01DFEF1E7280000F0F1FDEDE7012300216370280064 -:201DA00000F0FCFCA070E5E701216170F7E790789388002829D0012844D1D178814A536144 -:201DC000C022D2019B187E4A9BB2934202D89023DB0598627C4B7D4A1868090202431A6072 -:201DE0005A69D2B20A435A6190220821D2059162C046C046C0469161073991611A6874497A -:201E00000A401A600023FEF78AFD01216D4A6170536190220420D2059062C020C0011B188E -:201E200067489BB2834200D89162C046C046C046C0460121644B1B6991611B0A033191616C -:201E4000A370DFE7AF23FEF76AFD9578022D0CD0032D2BD0002D33D10223637001F04AFCD8 -:201E6000A070000AE070FFF71EFC95885B4BD0781D805B4B5B4A1870524B000219680A4300 -:201E800051491A600E68514A32430A605D614A69D2B202434A6190220121D20591621A6839 -:201EA00051490A401A600025FFF7FDFB90230122DB059A61444A464913680B401360F2E7D1 -:201EC000B025FFF7F0FB91780023012901D1FEF726FD99421FD0B133022901D0FEF71FFD51 -:201EE0008421012593883748194342694161364992B28D618D6242610422802113409022C5 -:201F00000902D205002B03D091610023FEF707FD9162FEF704FD01236370A933A3700B00F9 -:201F2000FEF7FDFC9078938804282BD8FEF70AFB182A03080C002D4A13800023FEF7EFFC01 -:201F4000180001F057F9F8E790230222DB059A61C046C046C046C046C046013A9A61ECE770 -:201F6000902202230421D20563709162C046C046C046C046134B1B699161A3709BB21B0A57 -:201F8000E370DAE7B223FEF7CAFC9578D0789188112D00D198E007D8012D69D0002D27D03E -:201FA000022D77D0822660E0212D00D180E0222D00D184E0122DF5D102231020637086E02D -:201FC000FF1F0000000800480004004800005555FFFFAAAA03FF0000FFF900008A040020A3 -:201FE0008804002055555555AAAAAAAAA00400200127BB4B04261B7810209F40FA43B94B3A -:020000040800F2 -:2020000001921D68AF626B6813406B6000F073FBAF616B683B436B60FA20400000F06BFB6C -:20202000FA20AF626B68019A400013406B6000F062FBAF616B68013E3B43B6B26B60002E5B -:20204000EAD10436FA2000F056FBAF626B68019AFA2013406B6000F04EFBAF616B68013E1E -:202060003B43B6B26B60002EECD12670FFF71CFB9B4A9C4B12781E689540B562736810204E -:20208000AB43736000F037FBB56173682B4373600026EAE70123924A637012789249934029 -:2020A000904A9BB21268002002F07AFAA070EFE7012302000020637001F01EFCF6E70123EE -:2020C000020063701020F7E702230020637001F06DFC6080DCE793789188042B1ED007D8E8 -:2020E000022B20D025D8012B13D08723FEF717FC072B27D004D8052BF7D17C4B197005E0D3 -:20210000082B24D0802BF0D101F06EF90023FEF706FC774A1278A2706370F7E7754B1B7859 -:20212000A3700123F8E78322714B1970714B1A70ECE76F4B6F4D197083232B7001F0C4F998 -:202140002B78EDE76C4B1970090A5970DEE76A4B1A78A2705A78E2709A782271DA786271E0 -:202160001A79A2715B79E3710623D5E79078D578023891888A230A2801D9FEF7D0FBFEF796 -:20218000E1F9060B11161D24303C414950005B4B19800023FEF7C3FB584B1B881B040B43DE -:2021A0009847F6E7FEF7E4FA0300FEF7B8FB544803689AB20B0413430360EAE7504A1368E4 -:2021C0001B0C1B040B431360E3E7042363704C4B1B681A0AA370E2701A0C1B0E22716371DB -:2021E000D7E70223464A637012684B00D3181A88A2701B881B0AE370CBE7414B6D001B68EC -:20220000E952C6E73E4A4B001168CB18136002226270ECE73A4B6D001A6855191D60298063 -:20222000B7E7012363700233A370B2E78823FEF776FB93789188022B09D0032B0ED0012BB5 -:2022400010D1304A090411600023FEF768FB2D4A13681B0C1B040B431360F5E70122294BBE -:202260001A60F1E78323FEF75AFB91780B00303B2F2B1AD8D078032814D8FEF763F9161873 -:202280000211214B512900D19AE045D8312974D00FD8002954D0302968D0B423FEF73FFB74 -:2022A0001A4BEFE7B523FEF73AFB194BEAE7194BE8E733296FD067D35029EED1C022D200B8 -:2022C00022801A7AA270DA78E2705A7A22719A7A62719A78A2715B7CE371FFF7E5F9C0469A -:2022E000100700200C07002004000200E5040020C4040020E6040020C50400203404002032 -:20230000300400209C0400206004002074040020380400204C0400207F2900D984E0702943 -:202320005DD260293CD0612943D05229B5D180221B889200A3701B0A2280E370FFF7B4F994 -:20234000FF22874BCA5401311029FBD10123854A5B425380844A5380844A5380844A5380EF -:202360000122844B1A700023FEF7D9FA9288110AD9721A730023FEF7D2FA9288110A597304 -:202380009A730023FEF7CBFA9288110AD9731A740023FEF7C4FA92885A740023FEF7BFFAB5 -:2023A00080235B00238093886D4AD35CA370FFF77BF980235B0023806F4B1B68DB78F5E7F1 -:2023C000C022D2002280DA7AA2701A7BE2705A7B22719A7B6271DA7BA2711B7C7CE7614BFC -:2023E00015785C68644B1868C3787F2D00D998E0624D009E2E70002B0FD000250095982BB3 -:2024000000D194E004E000250095D02B00D18EE0584B10351D70FF2304E0594B1860902355 -:20242000C3706F33009382E00720084003281AD8FEF788F81C1E02174C4B802901D2FFF775 -:2024400033F9872916D97031C9B2072901D9FFF72BF900212170D178997292881A80FFF7C1 -:2024600023F9434BE9E7B523FEF759FA3D4BE4E73D4BE2E79088D178C6B28D19BE22102D82 -:202480002CDC0432002929D0DD78033AFF2D25D19D780132FF2D21D10022D7B2B94220D824 -:2024A000384D0022AC464F01013F1F727701000A67449870DA705A729A721A80DA721A7398 -:2024C0005A739A73DA731A745A745F60244B9D19A8540132D3B28B42FAD300222270FFF79D -:2024E000E3F80132B7181E4D013FEF5DFF2FD4D0C122F3E79378002B04D0402B08D0D22337 -:20250000FEF70DFA237092881A4B1A70FFF7CCF880235B002380174B1B7847E78023FEF70D -:20252000FEF9D82B00D06EE780234468C37000234372C378902B01D0FFF7B6F8712901D04C -:20254000FFF7B2F80E4B91881B685868017092885968120A4A705A7A02325A72FFF7A4F89E -:20256000E7040020380400204C0400206004002074040020A4040020900400209804002030 -:2025800094040020F8040020F0B51C4D040005A8067868690902C0B20843686190200421F3 -:2025A000C00581622900002A01D101328262FF2500204A692D022A401A43114F4A61C04639 -:2025C000C046C046C046C046C046C046C046C046C0463A690133120A22544A69DBB22A40B2 -:2025E00001301A43C0B24A61B042E8D990230422DB059A61033A9A61F0BDC046000800488E -:2026000000040048F0B5184C050060690E02C0B23043606180269020F600C00549B28661EE -:20262000002901DA01218162FF2661693602314011436161C04600200C4FC046C0463969B4 -:202640000132090A29546169D2B2314001301143C0B261619842F0D990238022DB05D20095 -:202660009A6201229A61F0BD0008004800040048F0B5174C05000E0060691F2925D880212D -:2026800031430902C0B20143616190210420FF26C905886261693602314011436161C04602 -:2026A00000200C4FC04639690132090A29546169D2B2314001301143C0B261619842F1D918 -:2026C00090230422DB059A61F0BDC0B20902DAE70008004800040048002302000002002A6E -:2026E00004D1002B01D0802318437047DB43511EDBB20A40F3E70023800080B2C046C04635 -:2027000001339BB29842F9D17047FFFF30B50722012409490868450D43086B404340C50F4B -:20272000DBB26B40013A23404000D2B21843002AF1D10860C0B230BD9C040020134B10B50E -:202740005861134B13481C680902204318605869C0B20143596190210820C9058862002AB1 -:2027600001D101328A62C046C046C046C046C046C046C046C04690220821D2059161073954 -:2027800091611A6804490A401A6010BD000800480004004800005555FFFFAAAA0F4B58613C -:2027A0009023DB05002901D101229A6204229A62C046C046C046C046C046C046C046C0461A -:2027C000C046C046C046C046C046054908699A61000A033AC0B29A617047C0460008004860 -:2027E00000040048F7B504000E004D7AC046C046C046C046C046C046C046C046C0460022B0 -:20280000AA215848FFF79AFF002255215648FFF795FF2402002220215248FFF78FFF23B282 -:202820000193EBB20093337AAB4216D28020009B0022737290210002FFF780FF0022802026 -:2028400011000002FFF77AFF80200022F0210002FFF774FFC0460020FEBD444B444A196839 -:2028600008200A43FF211A605A690A40A02109020A435A6190220121D20590629162C046D2 -:20288000C046C046C046FF24906191611A6839492C400A401A60019B009A1C437368A4B226 -:2028A000995C20000022FFF749FFC046C046C046C046C046C046C046C046C046C046002146 -:2028C0002000FFF76BFF0700C046C046C046C046C046C046C046C046C0467368009A9B5CCF -:2028E000834217D0C046C046C046C046C046C046C046C046C04600212000FFF74FFFB84277 -:202900000BD1C046C046C046C046C046C046C046C046C0460135ADB283E7C046C046C04694 -:20292000C046C046C046C046C046C046C046C046C046C046C046C046C046C046C046C04637 -:20294000C046C046C046C046C046C046C046C046C046C046C04600212000FFF71FFF0700D9 -:20296000C9E7C046AA8A0000558500000004004800005555FFFFAAAA70B504000D000022F3 -:20298000AA210F48FFF7DAFE002255210D48FFF7D5FE0022A0210A48FFF7D0FE002229004D -:2029A0002000FFF7CBFE00212000FFF7F7FE0500C04600212000FFF7F1FEA842F3D170BD00 -:2029C000AA8A00005585000070B504000D000022AA210F48FFF7B2FE002255210D48FFF7E6 -:2029E000ADFE0022A0210A48FFF7A8FE002229002000FFF7A3FE00212000FFF7CFFE050050 -:202A0000C04600212000FFF7C9FEA842F3D170BD55550000AA2A0000C90152080A43FF21C8 -:202A2000F0B585B00293234B0500586912B209021140C0B20143902459610121E405A162A1 -:202A40000331A162FF213F2658690902D2B2084010435861B4460020174F01930391C04668 -:202A6000C046C046C046C046C046C046C0466346396926698908F6089E4319403143295498 -:202A80003E69411C019BC9B2360A6E545969039B01321940D2B2019B114359610230029B30 -:202AA000C0B28342DBD20423A361033BA36105B0F0BDC046000800480004004800207047EA -:202AC0000F4B30B59022586180230124D205DB0093620C4B94621D680B48090228431860CA -:202AE0005869C0B201435961C04608219162C04691611968054801401960946130BDC0461B -:202B0000000800480004004800005555FFFFAAAA0B4B10B580215861902301220424DB05CA -:202B2000C90099619A629C62C046C046C046054800699C61000A9962C0B29A6110BDC046CE -:202B400000080048000400480E4B984202D880231B0218430C4B0D4A58610D4B0902186867 -:202B600002431A605A69D2B211435961C04690220821D2059162C04691611A6805490A4084 -:202B80001A607047FF1F0000000800480000555500040048FFFFAAAA0A4B984202D88023A2 -:202BA0001B021843084B042258619023DB059A62C046C046C046C046044908699A61000A01 -:202BC000C0B27047FF1F0000000800480004004870B504000D000D48AA21FFF7B5FF55219C -:202BE0000B48FFF7B1FFA0210848FFF7ADFF29002000FFF7A9FF2000FFF7CEFF0500C04654 -:202C00002000FFF7C9FFA842F5D170BD55150000AA1A000070B504000D000D48AA21FFF77F -:202C200093FF55210B48FFF78FFFA0210848FFF78BFF29002000FFF787FF2000FFF7ACFF9E -:202C40000500C0462000FFF7A7FFA842F5D170BD55150000AA0A000030B580239024DB009B -:202C6000E405A361104B114A58610223A362104B09021D6800B22A431A605A69D2B21143AF -:202C80005961002801DA0121A162C046C0460121A1614918A1611968064801401960802393 -:202CA000DB00A36230BDC046000800480000555500040048FFFFAAAA9023DB0530B51C68AD -:202CC000174D09022C401C60DA68164C2A40DA60154A506102229A62144A00B215682C4329 -:202CE00014605469E4B221435161002801DA012199628021C9009961C046C046C046C0465B -:202D0000C046C046C046C046C04699620121996149189961136806490B40136030BDC046A8 -:202D2000FFEFFFFF000055550008004800040048FFFFAAAAF7B505001C4B01911E781C4B68 -:202D400074001F8820213C19A4B22000FFF7B4FFAA211848FFF7F8FEA01B80B21021FFF778 -:202D6000ABFF55211448FFF7EFFE20212000FFF7A3FFA0210F48FFF7E7FE104B1878464394 -:202D80000101BE19C9B2B0B2FFF796FF01992800FFF7DAFE2800FFF7FFFE0400C046280015 -:202DA000FFF7FAFEA042F5D1F7BDC046A30400203604002055150000AA0A00008C040020D4 -:202DC00070B50400B0200E0000020A21FFF774FFC0200A210002FFF76FFFAA211248FFF7CA -:202DE000B3FE55211148FFF7AFFEA0210E48FFF7ABFEB0200E4B00021D782900FFF75CFFC0 -:202E0000C02029000002FFF757FF31002000FFF79BFE2000FFF7C0FE0500C0462000FFF786 -:202E2000BBFEA842F5D170BD55150000AA0A00008C040020F8B505000E00194B02211C8843 -:202E4000A71CBFB23800FFF737FFAA211548FFF77BFE601C80B20121FFF72EFF5521124880 -:202E6000FFF772FE02213800FFF726FFA0210D48FFF76AFE0D4B19786418A0B2FFF71CFF3A -:202E800031002800FFF760FE2800FFF785FE0400C0462800FFF780FEA042F5D1F8BDC046DB -:202EA0003604002055150000AA0A00008C0400200B4B5861902300B2DB05002801DA012270 -:202EC0009A628022D2009A61C046C046C046C046044908699A620122000AC0B29A61704764 -:202EE000000800480004004870B504000D00A021FFF7B2FE29002000FFF7AEFE2000FFF798 -:202F0000D7FF0500C0462000FFF7D2FFA842F5D170BD70B50400A0200D00C0015421FFF7EA -:202F2000CBFEA0212000FFF797FE29002000FFF793FE2000FFF7BCFF0500C0462000FFF79A -:202F4000B7FFA842F5D170BD70B50400A0200D000D4BC0011978FFF7AFFEAA210B48FFF787 -:202F6000ABFE55210A48FFF7A7FEA0210748FFF7A3FE29002000FFF79FFE2000FFF798FF15 -:202F8000A842FAD170BDC0468C04002055D50000AAAA000070B50400C0200D0000020121E1 -:202FA000FFF78AFEAA211548FFF786FEC02000210002FFF781FE55211148FFF77DFEC02059 -:202FC00001210002FFF778FEA0210C48FFF774FEC0200C4B00021978FFF76EFE290020006F -:202FE000FFF76AFE2000FFF763FF0500C0462000FFF75EFFA842F5D170BDC04655950000B0 -:20300000AAAA00008C04002070B504000D001048AA21FFF751FE55210E48FFF74DFEA02140 -:203020000B48FFF749FE29002000FFF745FEA020094B00021978FFF73FFE2000FFF738FF57 -:203040000500C0462000FFF733FFA842F5D170BD55D50000AAEA00008C04002070B50400A9 -:203060000D001048AA21FFF727FE55210E48FFF723FEA0210B48FFF71FFE29002000FFF7BC -:203080001BFE802002210002FFF716FE2000FFF70FFF0500C0462000FFF70AFFA842F5D14A -:2030A00070BDC04655D50000AAAA00000D4B0E4A58610E4B0902186802431A605A69D2B20C -:2030C0001143902259618021D20510684901014311604021916291611A6805490A401A6067 -:2030E0007047C046000800480000555500040048FFFFAAAA104B114A10B558611068104B74 -:2031000009020343136053690E4CDBB21943902351618021DB051868490108431860402019 -:203120009862186820401860D8680143D960136805490B40136010BD000800480004004890 -:2031400000005555FFEFFFFFFFFFAAAA70B505000E00134B00211C882000FFF7ADFDAA21A1 -:203160001048FFF7C7FF55210F48FFF7C3FFA0210C48FFF7BFFF0D4B19786418A0B2FFF740 -:203180009BFD31002800FFF7B5FF2800FFF790FE0400C0462800FFF78BFEA042F5D170BD62 -:2031A0003604002055550000AA2A00008C04002070B504000D000D48AA21FFF79BFF55212B -:2031C0000B48FFF797FFA0210848FFF793FF29002000FFF78FFF2000FFF76AFE0500C04621 -:2031E0002000FFF765FEA842F5D170BD55550000AA2A0000902270B50225D2059561C0462A -:20320000C046C046C046C046C04601240D4B94611E680D49314319600C4909885961C046AF -:2032200095625861C04694621A6809490A401A60C046C046C046C046C046C046C046C0461A -:2032400070BDC0460008004855555555A0040020AAAAAAAAF0B58BB00992012208911100E3 -:20326000354B02901F78354B1B780493344B1D68344B1B789940344B01911868334BA962F2 -:203280001B789A40029B102B4FD18262012421002F4B05941B6806932E4B1B7899408BB24E -:2032A000210007932C4B1B689C462C4B1B789940002303911900029C202C05D1049E059CC1 -:2032C0001E41264236D08261089C202C0FD1002B01D11A4C6354069C2669079C264206D042 -:2032E000164C665C059C9C402643144C6654099C013FFFB2002C03D0002F01D1019CAC616A -:203300006446039E0133DBB2A661A662082B05D101310A4BC9B25B5C04930023002FCAD14C -:20332000019B8262AB620BB0F0BD029B112BADD18261ABE78262C7E7E5040020C504002048 -:203340002C070020300700201C070020200700202407002028070020140700201807002025 -:20336000F7B501221A4B1C781A4B19681A4B1B789A40102826D18A6201263500174B01965D -:203380001B680093164B1B789D400023AC461D0020280DD1134E019F765D1E413E4215D056 -:2033A0008A610133DBB2082B02D100230135EDB26646009F013CE4B2BE61BE62002CE7D122 -:2033C0008A62F7BD1128D7D18A61D5E78A62E8E7E50400202C07002030070020140700201C -:2033E00018070020C5040020F0B52C4B85B01B78019301231E00019A1F009640284A116870 -:20340000284A8E62127802921A000298824094466046254A12689062244805782448AF4017 -:2034200000689D408762046803941C00AC402500039C254305604568019CBD4345609C40F7 -:203440001D00A54008681C00284308604868B04348601068029999408C40210001436046FD -:20346000116051688143134851600078124A984083401268116899431160D1680B43D360E9 -:2034800080220E4B1A70002319000D4A13700D4A99540133202BFBD105B0F0BD3007002049 -:2034A0002C070020200700201C07002018070020140700202807002024070020E604002011 -:2034C000E5040020C504002010B52B4B1B78082B4ED013D8294C032B39D006D8012B28D042 -:2034E000022B2AD0254BEE223AE0062B3AD03DD8042BF7D101222021112021E00F2B28D0FC -:2035000008D81E4C0D2B1FD000220E2BEAD12021102015E0802B06D0184CFF2B06D0102B9E -:20352000E0D100221FE0FFF75FFF10BDF0232370FBE72020FFF714FF04E00122002120205F -:20354000FFF788FE8223F2E700221100F7E70122DDE7002220211120FFF77CFE8222074B7F -:203560001A70E2E7012220210800E9E71020E1E71120FFF7F5FEF1E7C4040020E6040020E0 -:20358000BC224D4BD203996AF0B50A439A629A6A4A490A409A62B022596952030A435A6121 -:2035A00019009023464ADB051278102A03D100221A609A60DA601A684248012402401A607A -:2035C0008022D868D2010243DA601A683E483F4F02401A608022D868520302430420DA608B -:2035E0001A68A2431A60DA682243DA601A6882431A60DA680243DA6010221D6895431D607B -:20360000DD682A43DA6040221D6895431D60DD682A43DA601A682E4D2A401A608022DD68CE -:20362000D2042A43DA601A682A4D2A401A608022DD68D2052A43DA601A68274D2A408025C6 -:203640001A60DA68ED022A43DA60244A1668A6431660D6683443D4601E683E401E60DC681E -:203660003C40DC6080234C691B0323434B611C4B1C4C1E681C4F26431E601E683E401E60E1 -:20368000DE683443DC604B691D434D611368174D2B401360D468164B1C43D46011682940A0 -:2036A0001160D1680B43D360136883431360D3681843D060F0BDC04600100240FFFFA1FFC2 -:2036C00008070020FFBFFFFFFFFFEFFFFFEFFFFFFFFFFFFBFFFFFFBFFFFFFBFF000400482F -:2036E0000008004855555555AAAAAAAAFFFFAAAA000055550D480E4A038810B50D4993425A -:2037000002D10A7801320A7090220424D205013394620380084B18699461084C0B786269DE -:203720001B02D2B2134380B2636110BD8A040020FFFF0000880400200008004800040048DB -:20374000F7B50D00042701924C7A000203B2A6B200932B7AB34202D26C720020FEBD0098CB -:203760006B682043195D80B2019B98476B681A5D094B824205D01A683A431A6002229A6121 -:20378000E7E71A680134BA431A60DA6801363A43DA60E4B2B6B2DCE700040048F7B50D0037 -:2037A0001600FF27000203B24C7A01932A7AE3B2A24202D26B720020FEBD20006A683840A9 -:2037C000D15C019B0134184380B2B047A4B2EDE7022907D10F4B104A984218D0904209D118 -:2037E000180007E0032906D10A4B0B490B4A98420BD1080070470429FCD1064B064A9842DF -:2038000005D006499042F4D0054A8842E6D11000F0E7C046380400204C04002060040020E1 -:203820007404002070B506000D0005243000013CFFF73EFBE4B229003000FFF73DFA6D0862 -:20384000002CF3D170BDFFFF70B50400A0200D0000020221FFF7E6FFAA211048FFF774F9D1 -:2038600055210F48FFF770F9A0210C48FFF76CF9A0200C4B00021978FFF7D4FF29002000F0 -:20388000FFF762F92000FFF787F90500C0462000FFF782F9A842F5D170BDC0465515000058 -:2038A000AA0A00008C04002070B50400C0200D0000020521FFF7B6FFAA210D48FFF7FCF9B0 -:2038C00055210C48FFF7F8F9A0210948FFF7F4F929002000FFF7F0F92000FFF7E9FA05001C -:2038E000C0462000FFF7E4FAA842F5D170BDC04655550000AAAA0000F7B501230225294F7E -:2039000001923A780091054393400421A020264E2D049BB229433268C00100F041FE0400E5 -:2039200001283DD13B7809209C4005437830A3B232682900FF3000F033FE040001282FD113 -:203940003B7832689C402900A3B2002000F028FE0400012824D1009B180AFEF7BDFE3B7848 -:2039600032689C402900A3B200F01AFE0400012816D16B461878FEF7AFFE22003B78290056 -:203980009A4093B2326800F00BFE0198FEF7A4FE3B7832689C402900A3B200F001FE0400AB -:2039A000E0B2FEBD100700200C070020F7B501230225274F00903A780191054393400421CF -:2039C000C020244E2D049BB229433268800100F0E7FD0400012838D109231D433B78C02067 -:2039E0009C403268A3B22900400000F0D9FD040001282AD13B7832689C402900A3B20020DE -:203A000000F0CEFD040001281FD1019B180AFEF763FE3B7832689C402900A3B200F0C0FD66 -:203A20000400012811D16B461879FEF755FE22003B789A4093B2009A14430922E1B209043D -:203A40001143326800F0ACFD0400A0B2FEBDC046100700200C070020C64BC74AF0B51A601D -:203A6000C64A8BB01A6002225A60A02212019A600493049BDB68002BFBD19022049BC0490A -:203A800012031960BF4B186802431A6080220991920219681142FCD0012259680A435A60F4 -:203AA0008022596852020A435A608022596852030A435A608022196852040A431A608022A7 -:203AC000920419681142FCD01121AF4AAF4C11605A680E398A43110002220A435A60802265 -:203AE000196B0A431A638022D96912040A43DA61A74BE381BC231B689847A64B6382A64B98 -:203B0000238262B6FFF73CFDF022A44B1A70049B099AA34E1A603278202311009943D229AC -:203B20001BD1A049A048C978C3780224FF2904D1FF3B1C00631E9C41E4B29C4BDB78FF2B7B -:203B400000D003249A4BDB78FF2B00D00424994B994F1C703860D22A58D03378F22B05D162 -:203B60000022023B3370944B1B68DA703578D02D00D04FE2904E3068C378802B00D049E295 -:203B80008C4B1978FFF724FE00233060C570068804004372C07AF5B21038222800D937E211 -:203BA000FCF7EAFCA301C50106020A0236023602360236023602360236023602360236027E -:203BC0003602360237008C00DF00E40010011A0121015D0173017B01360236023602360273 -:203BE0003602360282019A0044002100FFF7F0FD01230135EDB2A542F7D3002B00D03860B3 -:203C000080223B68DA70D0233370A6E700230125F1E7E17B0F2900D91DE209013143237A4A -:203C2000A278C9B26068FEF7EDFC53E0E17B0F2900D910E2636809019C46237AA2780293B4 -:203C40005E4B0E4376B25969F0B2C9B20002014359611F00002E03DA90210120C9058862AF -:203C6000FF2559692D02294011435961C046902080260023C005F60005958661C046C046F1 -:203C8000C046C046C046C046C046C046C04665464B4901320969D2B2090AE9548662796978 -:203CA000059D01332940114379610299DBB29942E3D20122866282616372DDE03C23E17BA4 -:203CC0000A009A4300D0C6E1237AA27829436068FEF7CEFC6072CFE0E17B3C230A009A43B9 -:203CE00000D0B8E1636829439C46237AA5780293324B5A691F292FD8802001430902D2B2F1 -:203D00000A435A61FF27902104265A693F023A40C9052A435A618E628E61C046C046C04635 -:203D2000002205978E62C046C046C0466746244801350069EDB2000AB8545869059F384079 -:203D4000284358618E61C046C04601320298D2B29042E7D262728FE0D2B209021143596188 -:203D6000D0E7237AA278E17B29435BE7E17B3F23A6E7C04600300040CCCC000055550000C8 -:203D8000AAAA00000010024000200240006000403CA5FFFF4108000885080008E6040020AC -:203DA000A40400204C040020380400206004002074040020A2040020900400200008004889 -:203DC00000040048227AE17BA3780092002229436068FEF7D9FB7DE7E17B227AA3782943F0 -:203DE00000920122F4E79D4BE17B586929430E02C0B230436568A278277A586190200426B2 -:203E00006031C005C9B286621E001F2901D801218162FF2059690002014011435961C0466D -:203E20008F4900238C46C046C046C046C046C046C046C046614609690132090AE954716915 -:203E4000D2B2014001331143DBB271619F42EAD290220421D2059161033991612CE7002513 -:203E6000267A67687608FFF745FC0135EDB238800237AE42F7D265727A4B1B6819889A7ACB -:203E800052181A80D822DA70C4E0E17B237AA27829436068FEF7C0FD1CE7E17B237A2943D5 -:203EA0000131A278FF31F4E7A3786668277A002B02D12802FFF79EF9684A902000230425BE -:203EC0009446C0058562C046C046C046C0466246116985618AB2120AF2545A1C0233D2B26F -:203EE000DBB2B1549F42EDD2E6E6E37B1E2B0BD1C020B6092233F1B200029D43FEF7DCFEF9 -:203F0000237AA27880212FE71C2BB5D1A0208121C001FEF7D1FE8020F609F1B20002FEF746 -:203F2000CBFEA0200021C001FEF7C6FEA4E7E37BFE2BA1D17609F1B24B48FEF705FE1F21EC -:203F4000636829409C46454B09025A69A678D2B20A43277A80215A619022C900D2059161BD -:203F60000121FF209162033191625A690002024032435A61C0460022394D0290C0466046C3 -:203F800029690136090A815459690298F6B2014001323143D2B259619742EFD290230421D4 -:203FA000DB0599618021C900996201219961D1E6237AA2786021D7E6E37B002B20D18033CD -:203FC000F6091D43F3B20393FF20039B24499B004A6903402548024013434B61C02090214A -:203FE000039BC905C000DB004A6903402048024013434B61227AA378290000920022E7E6B7 -:020000040800F2 -:20400000012BE1D140217604760E31430391DBE7C323E370174B1D78F02D00D0A3E2114E98 -:204020003468E378982B00D09DE2134B20001978FFF7CEFB00233060C370E07AE5701038CC -:204040002678042800D98CE2FCF796FA180052011F022702E600C423DBE7C0460008004832 -:204060000004004890040020FF3F000003FF0000FFF90000A4040020A2040020E37B002BF1 -:2040800006D130008038C0B2DD4A2100FFF758FBE37B012B06D130008038C0B2D94A21005F -:2040A000FFF77CFBE37B022B06D130008038C0B2D54A2100FFF772FBE37B042B06D13000A0 -:2040C0008038C0B2D14A2100FFF73AFBE37BFC2B06D130008038C0B2CD4A2100FFF730FB40 -:2040E000E37B0A2B06D130008038C0B2C94A2100FFF726FBE37BFD2B15D13F2023883040CB -:204100009B0905936B4680261B7D06430793677ABBB2029333021BB20893237A029A934203 -:2041200000D380E06772E37B1E2B06D130008038C0B2B94A2100FFF703FBE37B0C2B17D106 -:204140001F20304080260643C0202588A5216D09EDB2C001FEF7B0FD2900B048FEF7ACFD37 -:20416000677A35023D43237ABB4200D3A3E06772E37B1C2B21D1AA21A948FEF76DFD5521B6 -:20418000A848FEF769FD2021A548FEF765FD30008038A54A2100C0B2FFF7D2FA80209021D2 -:2041A0000002FEF759FD802000210002FEF754FD8020F0210002FEF74FFDE37B1F2B21D11B -:2041C000AA219A48FEF748FD55219948FEF744FD20219648FEF740FD30007038954A210042 -:2041E000C0B2FFF7ADFA902090210002FEF734FD902000210002FEF72FFD9020F021000270 -:20420000FEF72AFDE37B6F2B06D130008038C0B2894A2100FFF794FAF4232288E370A37AB0 -:204220009B1823809FE100218448FEF745FDAA218348FEF73BFF55218248FEF737FFA02193 -:204240007F48FEF733FF6B46187D7F4B0799C01880B2FEF731FD089D63683D43ADB2D95D0E -:204260002800FEF723FFC0462800FEF721FE06902800FEF71DFE069B8342F4D1636806995A -:20428000DA5D724B8A420FD1029A1968013292B20292042291431960D96801370A43DA60E3 -:2042A0000222FFB29A6238E7042219680A431A6002229A6131E7AA216548FEF7FDFC55218D -:2042C0006448FEF7F9FCA0216148FEF7F5FC63682800D95DFEF7F0FCC0462800FEF7E8FDE6 -:2042E00002902800FEF7E4FD029B8342F4D13AE7E37B002B04D1584A21003000FFF74EFA57 -:20430000E37B012B04D1554A21003000FFF746FAE37B032B04D1524A21003000FFF73EFA9C -:20432000E37B042B04D14F4A21003000FFF736FAE37B0A2B04D14C4A21003000FFF72EFA9E -:20434000E37B0B2B04D1494A21003000FFF726FAE37BFE2B00D05FE7218845484909C9B25A -:20436000FEF7F2FBAA214348657AFEF7A9FB55214148FEF7A5FB3F482021FEF7A1FB1F2061 -:2043800030400302AFB20593237ABB420DD2657290210020FEF794FB00210800FEF790FB61 -:2043A000F0210020FEF78CFB36E7059EA0212E433000FEF785FB63683000595DFEF780FB98 -:2043C000C0463000FEF7A4FB02903000FEF7A0FB029B8342F4D1636802995A5D1B4B8A424B -:2043E0004CD104211A6801358A431A60DA6801370A43DA600222EDB2BFB29A62C4E7C0469A -:20440000B1310008A93800084D3100085D300008BD2A000809300008952F0008FFFF0000B4 -:20442000AA8A000055850000132F0008AA9A000055950000E92E0008492F000869FD0000F1 -:2044400055550000AA2A000069FDFFFF0004004855D50000AAAA0000152C000849380008DE -:20446000352E0008D12B0008C12D0008352D0008FF3F0000AA0A00005505000004211A687A -:204480000A431A6002229A617EE7300060303D4A2100C0B2FFF782F9BEE6E37B042B06D17E -:2044A00030008038C0B2384A2100FFF777F9E37B052B04D1344A21003000FFF76FF9E37BAB -:2044C000062B06D130008038C0B2304A2100FFF765F9E37B072B04D12C4A21003000FFF769 -:2044E0005DF9E37B002B1CD1FF2280331E4323882748DB09DBB29D0041692A40254DDB0032 -:2045000029400A4342619022C020D205C00051690340214801400B43536121003000FEF72A -:2045200061F9E37B012B00D076E62388184A5B04580E40230343FF209B00516903401548DC -:2045400001400B4390215361C9054B69124A30001A4080239B0013434B612100FEF742F96E -:204560005AE6C323E3700D4B1B78F02B01D1FFF7CEFA832B01D0FFF7CAFAFEF7A5FFFFF764 -:20458000C6FAC046B92C0008C9290008792900080004004803FF0000FFF90000E604002074 -:2045A000F0B5474680B4061C081C000C102801D5162700E004270007000F8046FF200140B1 -:2045C0005468251C1D439C43F60313850AD5C046C046C046C046C046C046C046948013835B -:2045E000958002E0012000F081F801390AD4381C00F07CF8C046948013839580C046C04699 -:204600007600E2E7381C013800F070F8948013839580042000F06AF8108A184001D0FF205F -:2046200061E0C046C046C046C046C046C04694809580108A184055D001200226B04552D075 -:204640000921168A1E40FCD1012000F04FF89480C0469580C04603E0C046C046C046C046DD -:20466000948095807600108A1840EFF300804000C00F0643381C023800F038F89480958018 -:20468000022000F033F80139EAD513859480012000F02CF813839580301C8021022399406D -:2046A0000E401BD1002341085E4149085E4149085E4149085E4149085E4149085E414908B4 -:2046C0005E4149085E4149085E41760808D34008FF21084048400002013004E00E2002E0A3 -:2046E000092000E0002080BCB846F0BD0138FDD17047C04603685A0003D45B005B08C018B4 -:204700007047802212061343F9E7C046F0B557464E46DE464546E0B5814683B092460029D7 -:2047200025D04B1E9B46002701935B46FB18DC0FE4184B466410E5005E193000FFF7DAFF84 -:20474000019B8046A3420BD0280008304844FFF7D1FFD04506D80138504509D2671CE4E79B -:20476000504505D9A74202D0631E9B46DDE70026300003B03CBC90469946A246AB46F0BDA9 -:20478000012809D0022805D0002801D0002070470248FCE70248FAE70248F8E7754E0008FC -:2047A0008D4E0008814E000830B5234B83B005008C1E002B26D001A9200000E000BF002858 -:2047C0001CD001992200FFF7A1FF041E16D0FFF791FF6368A864012B2AD0201D002B23DBAA -:2047E000FFF788FF0023E8642B650368002B0FDBFFF780FF2861002003B030BD00230920B3 -:204800002B61F9E70D480E49091AC9100191D9E71801000FFFF7B4FF2861431E9841082373 -:20482000404298430930E7E70123E8642B65DCE7002305202B61DFE70000000070570008E8 -:2048400040580008036810B50400DA0705D448309B070ED500F06CFC23685A070ED51A0785 -:2048600013D5DB0604D42000D130FF3000F06CFC10BD00F059FC23685A07F0D42000D0300D -:2048800000F05AFC23681A07EBD420005130FF3000F056FC2368E4E70368002B00D01B1866 -:2048A00018007047092070477047C04670B504000D0008E02B6C2A0063612100012023691B -:2048C0009847082807D1296C2000FFF76DFF0028F0D000F083FE0728FBD10020296CFFF7DB -:2048E000E3FF281D00F00AFCF0B5CE46474680B5C3682E4C9846A544836906001400043179 -:20490000402205A8994600F071FE002304AD049323E0F0222B6C5200736129007CA800F0D0 -:2049200065FE7CAA31003369200098478A9B07006B6403934B460095019332003300210051 -:204940000120C04700281FD1F0227CA95200280000F04CFE0024082F1FD1296C3000FFF726 -:2049600023FF611E8C41070009340028D1D0AB6B10216B644B462143019300953300320023 -:204980000120C047002800D009273800F5239B009D440CBC90469946F0BD072FF4D12000B6 -:2049A000296CFFF781FF05A800F0A8FB2CFCFFFF406C704770B5CB6BFAB00B6404000E009D -:2049C0004022043103A800F011FE01235B42029306E002AA210023699847050008280AD112 -:2049E000129B200019000193FFF7DEFE0028F0D009207AB070BD02A8FFF724FF062DF7D145 -:204A000031002000FFF752FF10B58261DA6BC1601A6419000022FFF767FF10BD436970B53D -:204A20000B64C36804000D00002B15D10A002369010002209847072807D0082803D12900EF -:204A40002000FFF733FF00F0C9FD0020296CFFF72BFF281D00F052FB0122FFF745FF00F0B4 -:204A6000BDFDC046C36810B5002B05D0CB6B00220B64FFF739FF10BDFFF79CFFFBE7C0464B -:204A80007047C046836810B5002B02D001000120984710BD012906D0002906D00339022081 -:204AA000012900D970470120FCE7002B08D10F2A06D8920082185268009B00201A60F1E72A -:204AC0000220EFE700B585B003AB0A00009300210023FFF7DFFF039805B000BD012906D084 -:204AE000002906D003390220012900D970470120FCE7002B08D10F2A06D8009B92001B68D0 -:204B0000821853600020F1E70220EFE700B585B003AB039200930A0000230021FFF7DEFF77 -:204B200005B000BD70B51A4CD36BA544136406000D0019A8111D402200F058FD01235B4270 -:204B4000189314E00C2118A802AAFFF7DFFF290018A8B047002812D1069B18AA02A9083018 -:204B600001939847040005280AD0092807D0289B02A819000193FFF717FE0028E2D0092483 -:204B800018A8FFF75FFE200090239B009D4470BDC0FDFFFFF0B5DE4657464E464546E0B5B1 -:204BA000160003220D0011008BB01F000193EB6C01401C1D009107A91B688B460894002F7D -:204BC0006BD01A0C1B045946079302230B72FD3313409B004A72E418009B022B00D1AC6BF4 -:204BE0002B6DDB0747D4002305930833034002932768002F00D112E1019B022B49D0638803 -:204C0000278898460434012340469A469843AB6C0F21994681443000FFF754FF002181451F -:204C200006D8390053469943494488428941494243465A0002231340012217403B43012BBD -:204C40003AD0002B30D0022B1BD12368009A5F007F08002A67D1002906D0029A002A00D103 -:204C60007CE0002F00D1A9E0002B00DA04340137BF00E419BCE75946300000F00BFB00288E -:204C800010D009200BB03CBC90469946A246AB46F0BD636808349846B5E71B0207935B4644 -:204CA0001A8199E70820EDE7009B002B02D0002900D08DE004349BE7009B002B1AD100294B -:204CC00016D02368DF0F63689A1CDAD02A0058320692013300D1BDE0201DFFF7DDFD06AB9E -:204CE00001003A00280000E000BF002800D082E008347DE70D2130002F6AFFF7E3FE874221 -:204D0000F6D1AB6A9C42F3D12000FFF7F3FC0F2102003000FFF7FAFE30002A000021FFF74F -:204D2000F5FE0720AEE72B6A0D2130009846FFF7C9FE804501D0236896E7AB6A9C42FAD1DA -:204D40000023EB6204332B63231DAF626B632368002B00DA86E00123059388E7002F2DD0B2 -:204D600058239C46AC4463460393231D99460023984606AB220004933B004C464746B246CB -:204D800098462E00914603E004342F00454542D0039B20000693FFF77FFD049B01000022BF -:204DA00030007D1C00E000BF0028EDD04346B84635004C4656461F009845BCD10D213000D5 -:204DC000FFF780FE069B28626B62AC62062059E72000FFF78FFC04340700AC63280000E0FC -:204DE00000BF002800D14CE730003A000F21FFF78DFE072046E707000D213000FFF762FE9E -:204E00002862022F2BD1069BEB622B002C336B62AC62062036E735004C465646CEE759468E -:204E2000300000F037FA002800D02AE7059B002B00D137E70F213000FFF744FE0E21020095 -:204E40003000FFF763FE3000094A0F21FFF75EFE072017E70D213000FFF734FE2862069BF0 -:204E60006B62D5E738000130800020184DE7C0460000000010B50023FFF78CFE10BDC04613 -:204E800010B50123FFF786FE10BDC04610B50223FFF780FE10BDC046F0B5CE46474680B530 -:204EA0000500C3B014001E00012955D000294BD0032922D0042949D1002B47D1102A45D8B6 -:204EC000102203681A4200D0F1E020AF380000F03DF900230120A96B02009A40144203D0AE -:204EE0000E689A00BE5004310133042BF4D13800A96300F029F9002029E0032B26D114047B -:204F0000230C160C9846F318102B1FD8082203681A4200D098E020AF380000F013F9424661 -:204F2000AB6BF6001C00002A08D0D400F21A1C19BA181968D15004339C42FAD1AC63380097 -:204F400000F0FEF8002002E0002B24D0022043B00CBC90469946F0BD130C14049846240CC6 -:204F6000012E2ED0052EF1D11B19202BEED842460F2A70D9A146002C7ED1AA6B4346AA63B3 -:204F80000F2B00D89AE04B46002BDBD0684600F0D3F80020DBE700231004A96B000C013645 -:204FA00032009A40104204D00F689A00AA18576004310133102BF3D10020A304C7D4A9635F -:204FC000C5E71B19102BC1D843460F2BBED82B681E4206D00322280093432B60483000F0E5 -:204FE000A5F820AF380000F0A1F8AA6B002C24D04346DB00FF180023994664000023A400A7 -:20500000D158F95004339C42FAD14B4612196F46002B0FD04046102800D210204B46D90099 -:2050200000231038C0003818D458C45004339942FAD15218012EA1D120AF04323800AA6383 -:2050400000F072F8002082E7934303605130FF3000F078F85FE7102B3BD9102252429146F2 -:2050600099442B68194208D0022228008B4313432B60483000F05EF82B6804221A4221D1CD -:2050800043460F2B03D820AF380000F053F86F46380000F053F810244346AA6BE41A002C0C -:2050A000B8DD434620AFDB006400FF18A6E793430360D130FF3000F049F806E720A800F0E1 -:2050C00037F860E7280093432B60D03000F036F8D6E72B680B4207D0022228008B431343CF -:2050E0002B60483000F026F820AF380000F022F8A146AA6B002C00D07AE73FE7011C34318D -:2051000038C9043B9C461D60A646011C20313CC990469946A246AB46011C0831FCC941683F -:205120000068E54600BDC0467047C0467047C0467047C0467047C0467047C0467047C046AB -:205140007047C0467047C0467047C0467047C04601B401A801B585B0FFB408A841464A4698 -:2051600053465C4665463EC001A83EC80F98009000230CB401A9FFF71DFC109B12B01847FD -:2051800001B401A801B585B0FFB408A841464A4653465C4665463EC001A83EC80F98009082 -:2051A00000230CB401A9FFF739FC109B12B0184701B401A801B585B0FFB408A841464A46A8 -:2051C00053465C4665463EC001A83EC80F98009000230CB401A9FFF745FC109B12B0184775 -:2051E00001B401A801B585B0FFB408A841464A4653465C4665463EC001A83EC80F98009022 -:2052000000230CB401ABFFF7FFFB109B12B0184701B401A801B585B0FFB408A841464A4680 -:2052200053465C4665463EC001A83EC80F98009000230CB401AAFFF775FC109B12B01847E3 -:20524000027A0300002A0BD1427A002A0FD0013A42724268111D416003211268017202E0A9 -:20526000013A02720268100E12021A607047B020FCE7C04600B585B003AB00930C2200237D -:205280000021FFF707FC039805B000BD10B5FFF7F1FF10BDF0B557464E464546DE460023C7 -:2052A000E0B587B003930F339846083B994680231B0306000F009A463800FFF7C1FF0400A2 -:2052C000B02800D1C3E003062AD5030042469343DBB2802B00D171E0902B3DD0A02B00D15B -:2052E00085E0B02B50D0C02B00D196E003004A469343DBB2D02B0AD15346024001321A43E5 -:20530000052301213000FFF7C7FD0028D4D00924200007B03CBC90469946A246AB46F0BD56 -:20532000FF23820013401D1D05AB9B4600930D22002300213000FFF7ADFB630620D4059BDA -:205340009C46654405955B460D220093002100233000FFF7C3FBAFE7833B03400D2BD6D028 -:2053600005AD02400095002300213000FFF792FB009500230D2200213000FFF7AFFB9BE753 -:20538000059B5D1B0595DEE7B12874D0B22800D1CFE0B32800D184E0FC230340B42BB6D048 -:2053A0004A465346024001321A43012101233000FFF772FD002800D17EE7A8E704023800EC -:2053C000FFF73EFF802520432D02A8429FD004010005020C002300213000FFF75DFD002806 -:2053E00095D12C4200D167E70123039364E7FF234A461B011900824311410A001A40030749 -:2054000002D58023DB011A43002300213000FFF743FD002800D14FE779E7C6284CD0C728A7 -:205420005ED003004A469343DBB2C02B6DD0C82872D0C92800D06AE73800FFF701FFF0239B -:2054400002031B03134042460240013257E7039B0024002B00D05BE705AD00950E22002104 -:205460003000FFF717FB009500230F2200213000FFF734FB4CE73800FFF7E2FE002800D15B -:2054800045E7030042469343DBB2002B00D03EE7020000213000FFF7FFFC002800D10BE7A3 -:2054A00035E73800FFF7CCFEF02302031B03134042460240013277E73800FFF7C1FEF023F4 -:2054C00002031B0313404246024001321A43032303213000FFF7E0FC002800D1ECE616E7E8 -:2054E0003800FFF7ADFE021E00D110E7030041468B43DBB2002B00D009E704213000FFF7D0 -:20550000CBFC002800D1D7E601E74346A0221C40013412032243DAE73800FFF791FE4346C9 -:2055200002009A43D2B210321840120301300243E6E605AB00939B460D2200230021300050 -:20554000FFF7A8FA3800FFF77BFE030618D57F25B03C059B2840A0409C466044059038004B -:205560000734FFF76DFE0306F3D481217F23890003408C46A340059A62449B180593E2E6A2 -:205580000224F2E7030000B5DB6C85B05A680800120201921A0001A908324A6003220A721E -:2055A000DB794B72FFF776FE05B000BD10B5FFF76DFE806C10BDC04610B5FFF767FEC26CCB -:2055C000D3799B000833D01810BDC04610B500F005F8C04610B5FFF7F9FFC04610B5062092 -:2055E00000F076F8012000F0A5F8C046F0B50F2A37D90D0005430C000300AD0735D1150078 -:20560000103D2D092E013618103627681F6067685F60A7689F60E7681034DF601033B34290 -:20562000F3D10F2401352D01491914404519032C1DD90023CE58EE500433E61A032EF9D816 -:205640000323043CA4080134A4001A402D190919002A05D00023CC5CEC5401339342FAD13F -:20566000F0BD0500002AF5D1FAE70500F2E72200F8E7C04670B505000C001F2922D8B72370 -:205680009B00C358002B0ED08A009B181A68002A09D0012A10D0511C10D000212000196077 -:2056A0009047002070BD280000F030F822000100280000F017F8F5E70020F3E716230360CA -:2056C0000120EFE71623036001204042EAE7C04610B5034B01001868FFF7CCFF10BDC04695 -:2056E00000000020002370B5074C050008001100236000F017F8431C00D070BD2368002B3D -:20570000FBD02B60F9E7C0463407002010B500F001F810BD58220120014B40421A607047DD -:205720003407002058220120014B40421A60704734070020FEE7C046F8B5C046F8B5C046C8 -:2057400074B20181B0AB308000000000800A0181B0B0ABF0000000003F020181B0AB3080C1 -:205760000000000080060181B0B0ABF00000000030EEFF7FB0B0B0807CEFFF7F0100000010 -:2057800028F0FF7FB0A90280BCF0FF7FB0B0A88008F1FF7F0100000014F1FF7FB0B0AA8061 -:2057A00048F1FF7F9CFFFF7F08F2FF7F0100000004F2FF7FAA3F398050F2FF7FB0B0A88042 -:2057C0005CF2FF7FB0B0AA809CF2FF7FB0B0A880B0F2FF7F01000000ACF2FF7FB0B0A8801A -:2057E000B4F2FF7F010000003CF3FF7FAA0FB280A4F3FF7F58FFFF7F7CF6FF7FB0B0A8808A -:2058000098F6FF7F54FFFF7FF4F8FF7F0100000064FAFF7F0084048074FAFF7FB0B0A880E8 -:2058200074FAFF7F40FFFF7F5CFDFF7F008404807CFDFF7FB0B0A88094FDFF7F0100000051 -:20584000080000200000000000000000F40200205C030020C40300200000000000000000A4 -:20586000000000000000000000000000000000000000000000000000000000000000000028 -:20588000000000000000000000000000000000000000000000000000000000000000000008 -:2058A0000000000000000000000000000000000000000000000000000000000000000000E8 -:2058C0000000000000000000000000000000000000000000000000000000000000000000C8 -:2058E0000000000000000000000000000000000001000000000000000E33CDAB34126DE655 -:20590000ECDE05000B000000000000000000000000000000000000000000000000000000AD -:20592000000000000000000000000000000000000000000000000000000000000000000067 -:20594000000000000000000000000000000000000000000000000000000000000000000047 -:20596000000000000000000000000000000000000000000000000000000000000000000027 -:20598000000000000000000000000000000000000000000000000000000000000000000007 -:2059A0000000000000000000000000000000000000000000000000000000000000000000E7 -:2059C0000000000000000000000000000000000000000000000000000000000000000000C7 -:2059E0000000000000000000000000000000000000000000000000000000000000000000A7 -:205A0000000000000000000000000000000000000000000000000000000000000000000086 -:205A2000000000000000000000000000000000000000000000000000000000000000000066 -:205A4000000000000000000000000000000000000000000000000000000000000000000046 -:205A6000000000000000000000000000000000000000000000000000000000000000000026 -:205A8000000000000000000000000000000000000000000000000000000000000000000006 -:205AA0000000000000000000000000000000000000000000000000000000000000000000E6 -:205AC0000000000000000000000000000000000000000000000000000000000000000000C6 -:205AE0000000000000000000000000000000000000000000000000000000000000000000A6 -:205B0000000000000000000000000000000000000000000000000000000000000000000085 -:205B2000000000000000000000000000000000000000000000000000000000000000000065 -:205B4000000000000000000000000000000000000000000000000000000000000000000045 -:205B6000000000000000000000000000000000000000000000000000000000000000000025 -:205B8000000000000000000000000000000000000000000000000000000000000000000005 -:205BA0000000000000000000000000000000000000000000000000000000000000000000E5 -:205BC0000000000000000000000000000000000000000000000000000000000000000000C5 -:205BE0000000000000000000000000000000000000000000000000000000000000000000A5 -:205C0000000000000000000000000000000000000000000000000000000000000000000084 -:205C2000000000000000000000000000000000000000000000000000000000000000000064 -:205C4000000000000000000000000000000000000000000000000000000000000000000044 +:10000000001800200508000835050008390500081B +:1000100000000000000000000000000000000000E0 +:10002000000000000000000000000000350500088E +:10003000000000000000000035050008350500083C +:1000400035050008350500083505000835050008A8 +:100050003505000835050008350500083505000898 +:100060003505000835050008350500083505000888 +:100070003505000835050008350500083505000878 +:100080003505000835050008350500083505000868 +:100090003505000835050008350500083505000858 +:1000A0003505000835050008350500083505000848 +:1000B00035050008350500083505000899010008D8 +:1000C000284B10B51A88284B12041B881A43274B5B +:1000D000198849084900885A254908801988023139 +:1000E00089B21980198849084900885A214908802D +:1000F0001988023189B21980198849084900885A3B +:100100001D49088019881D48023189B21980198853 +:1001100049084900895A1A4A11801A881949023235 +:1001200092B21A801C880288944213D902881C88D3 +:100130000832121B92B20A80028892B21A801249C7 +:10014000124B0A881343124A1A40302353409BB281 +:100150000B8010BD0F4804881A889442E6D3082308 +:100160000B80ECE70C6000400A6000400460004037 +:100170004C6000404E600040506000400260004013 +:10018000526000401A600040005C00408080FFFF29 +:10019000BF8FFFFF006000409449F8B50B88944C76 +:1001A000002B3AD00A88934B9A4234D1002302257F +:1001B000914A924F1380924A1380924A1380924A36 +:1001C0001380924A1380924AD08FA843D087D08F51 +:1001D000013DA843D0878F481735FB8705808E489F +:1001E000343505808D480835058080258C486D01A3 +:1001F000058080258B4805808020FB878A4B000680 +:1002000023808A4B18608023D08FDB000343D38781 +:10021000874B884A1A8000230B8023881BB2002B4F +:1002200000DBC4E02388844A774F134080221343C5 +:10023000238023881B0500D49CE0804D7F232A78EF +:1002400011009943714B1980E9886B4B198000218B +:100250006C4B19803B88FF318B4313433B806023F9 +:100260001A4208D08022764B12051B8828009B1862 +:100270009847634B188060232A78134052B2002AB3 +:100280004DDA002B14D16A78062A0FD16A88110A38 +:1002900002291AD003291BD0012920D1694B12262B +:1002A000694A99B21180694A1B0C1380544B1E8015 +:1002B0002288674B1343674A1A40C0239B0153406F +:1002C0009BB22380FFF7FCFE47E05E4B1233E6E76C +:1002D000D2B2012A0FD0002A03D0022A15D01E0064 +:1002E000E4E7584B584A243399B21180574A1B0C03 +:1002F00013800426DAE7534B534A283399B211800E +:10030000524A1B0C1380544ED0E74E4B4E4A7C335E +:1003100099B211804D4A1B0C1380504EC6E7002B3A +:1003200009D16B78052B06D13A886B88D2B21B02B3 +:1003300013439BB23B8000212388494A1340494A1A +:1003400013439BB22380484B198023881A43474BA1 +:100350001A40474B5A4092B22280284BDB8F5B05F4 +:1003600007D580222F4B1A800023244AD3872E4B97 +:100370002380F8BD60213B880B40402BEDD13B88AA +:100380001342EAD1264A3B4B2C481B881188802215 +:1003900012059B18C9B298472288324B13432D4A45 +:1003A0001A40C0239B0153409BB22380D5E7802293 +:1003B00023881342D1D023882F490B408021090282 +:1003C0000B432380114B1B88934200D17AE7FF2017 +:1003D0000D4B19888143C0D01988090A0A43114975 +:1003E0000A801A8802401A80B7E7C0460E600040B3 +:1003F000005C00403CA5000000600040065C00403E +:100400000260004004600040066000400860004058 +:10041000025C0040505C0040186000401C600040DE +:100420001E6000404C5C00402032000000E100E013 +:10043000585C00400080FFFF8F0F000054600040B8 +:10044000106000407C0400080A6000400C6000401E +:100450008081FFFF8FBFFFFF2A0300001E03000003 +:100460008F8EFFFF8080FFFF1A600040BFBFFFFF3D +:1004700030300000126000400F8FFFFF12010002B9 +:10048000FF000008C016DC0503020102000109029A +:100490001200010100803209040000000000000089 +:1004A000040309042A0349006E00660069006E0017 +:1004B0006900740065004E00650073004C0069001F +:1004C0007600650073002E0063006F006D00000071 +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000001E0349004E004C00F8 +:10050000200052006500740072006F002D00500042 +:1005100072006F0067000000000000000000000093 +:1005200000000000000000000000000000000000CB +:1005300000000000FEE7FFFF004801E02301ADDE00 +:10054000FEE7C04602B4714649084900095C49000B +:100550008E4402BC7047C046411D000000616561C9 +:1005600062690001130000000536532D4D00060C92 +:10057000074D09011901FFFF03B471464908400006 +:100580004900095A49008E4403BC7047411D0000D0 +:100590000061656162690001130000000536532D9A +:1005A0004D00060C074D09011901FFFF70470A4B6A +:1005B0000A4A10B55A600A4A5A600122DC6814429D +:1005C000FCD11A6101220180D9681142FCD120229C +:1005D000DA6060321A6110BD0020024023016745D5 +:1005E000AB89EFCDFF2370B53C4C23804378C588A1 +:1005F000102B00D06FE0C37881888078384E0138A6 +:100600007269082800D964E0FFF79CFF0563632B3B +:100610003B3149515F008B1E8E227D2B19D8314B07 +:100620007360314B73600123F2681A42FCD10223DC +:100630003361802389021B05C9184223716133612C +:10064000C046413BF2681A40FCD12023F36060337E +:1006500033612270254BA2B2240CE8B25A819C81EE +:1006600070BD58001018FFF7A2FF0022F1E78E229C +:10067000012BEED8180480231B05C01840181C4914 +:10068000F1E7042363707369A37073691B0AE37055 +:1006900073691B0C237173691B0E6371E5E70223F9 +:1006A00063701388A37013881B0AE370DDE78E2242 +:1006B000012BCED880221B0412059B185918022347 +:1006C00063700B88A3700B88EEE70A4B0A4ADA6066 +:1006D000CBE78B22BDE780232370BBE7F806002021 +:1006E0000020024023016745AB89EFCD0060004048 +:1006F000FFFF000000ED00E00400FA05FFFFFFFF30 +:10070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10071000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10073000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10077000164B174A9BB21382164B9BB253826846A4 +:100780001C300F4A0F4B0430043001681140C91A65 +:10079000FAD1094A094B043801681140C91AF2D14B +:1007A0007B460A3303600438013303600CE00A4BD4 +:1007B0000A4A1A60FBE7C0460000FFFF000000087D +:1007C000FFFFFF0F0000000100207047E505000853 +:1007D00000600040AD05000800300040AAAA0000FB +:1007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10080000FFFFFFFF09490A4A0A4B9B1A03DD043B1D +:10081000C858D050FBDC0849084A0020521A02DDB3 +:10082000043A8850FCDC03F083F9000060590008AA +:100830000000002030040020300400203807002091 +:1008400070B50E4B1A68537A55685C18E4B2A3422F +:100850000ED1537A0A48CB1853720378591AC9B289 +:1008600001700020814202D198230130D37070BD05 +:1008700006780130EE540133DBB2E8E7940400203F +:1008800098040020FF23F0B5C04C85B02380837905 +:100890000200009340780138102801D901F046FE8B +:1008A000FFF76AFE1100D4057708360AEB0C440EF8 +:1008B000300E7D0B080C6C0CCC0C8F0ADD0A1B0B68 +:1008C0004A0B440ECF0C907891888C231D2826D893 +:1008D000FFF752FE1E0028001E011802E4028303E7 +:1008E0000E04CA04E604F204FA0402050B0514051A +:1008F00022052A0532053A05AA05AA05AA054A05D0 +:100900005F057605CC02D8023F058D059605A10549 +:10091000B0239F4A5B0351690B435361002323704B +:1009200000F062FE152901D900F081FD0800FFF7F3 +:1009300023FE160023002E007E05390044004F00E0 +:100940007E055C006900730080007E057E058D00D9 +:100950009A00A700B400C100CE00D800E2009023A6 +:10096000DB051A688B490A401A608022D968520355 +:100970000A43DA600023D2E790230122DB051968DD +:1009800091431960D9680A43DA600023C7E79023CE +:100990000422DB05196891431960D9680A43DA60BB +:1009A0000023BCE790231022DB05196891431960EE +:1009B000D9680A43DA600023B1E790234022DB05BF +:1009C000196891431960D9680A43DA600023A6E7E1 +:1009D0009023DB051A6870490A401A608022D968A2 +:1009E000D2040A43DA60002399E79023DB051A68F2 +:1009F0006A490A401A608022D96852010A43DA60C3 +:100A000000238CE70422664B196891431960D9686A +:100A10000A43DA60002382E79023DB051A68614904 +:100A20000A401A608022D968D2050A43DA6000239E +:100A300075E79023DB051A685B490A401A6080223B +:100A4000D968D2020A43DA60002368E79023DB0505 +:100A50001A6856490A401A608022D96852000A432F +:100A6000DA6000235BE79023DB051A6850490A40EF +:100A70001A608022D968D2000A43DA6000234EE768 +:100A80009023DB051A684B490A401A608022D96816 +:100A9000D2010A43DA60002341E79023DB051A689C +:100AA0003D490A401A608022D968D2040A43DA60BC +:100AB000002334E79023DB051A683F490A401A6097 +:100AC0008022D96852050A43DA60002327E7012211 +:100AD000334B196891431960D9680A43DA600023DF +:100AE0001DE71022354B196891431960D9680A43F4 +:100AF000DA60002313E79023DB051A682C490A40CB +:100B00001A608022D968D2000A43DA60002306E71F +:100B1000152901D900F08EFC0800FFF72DFD160005 +:100B200021002C008B0451005C0067008B047200D4 +:100B30007D00870092008B048B049D00A800B30009 +:100B4000BE00C900D400DE00E8009023DB05196870 +:100B5000104801401960DA680240DA600023DEE6DE +:100B600090230121DB051A688A431A60DA688A43F8 +:100B7000DA600023D3E690230421DB051A688A4358 +:100B80001A60DA688A43DA600023C8E600070020AA +:100B900000100240FFFFEFFFFFFFFFFBFFEFFFFF33 +:100BA00000040048FFFFFFBFFFFFFBFFFFFEFFFF4A +:100BB000FFFBFFFFFFBFFFFFFFFFFFEF000C004841 +:100BC00090231021DB051A688A431A60DA688A4389 +:100BD000DA600023A3E690234021DB051A688A43EC +:100BE0001A60DA688A43DA60002398E69023DB050E +:100BF0001968CE4801401960DA680240DA600023C3 +:100C00008DE69023DB051968C94801401960DA6850 +:100C10000240DA60002382E60421C64B1A688A4348 +:100C20001A60DA688A43DA60002378E69023DB05ED +:100C30001968C14801401960DA680240DA6000238F +:100C40006DE69023DB051968BC4801401960DA683D +:100C50000240DA60002362E69023DB051968B84899 +:100C600001401960DA680240DA60002357E69023F9 +:100C7000DB051968B34801401960DA680240DA60A0 +:100C800000234CE69023DB051968AF48014019604A +:100C9000DA680240DA60002341E69023DB05196838 +:100CA000A24801401960DA680240DA60002336E6A3 +:100CB0009023DB051968A54801401960DA680240F5 +:100CC000DA6000232BE601219A4B1A688A431A60E6 +:100CD000DA688A43DA60002321E610219C4B1A6807 +:100CE0008A431A60DA688A43DA60002317E69023A1 +:100CF000DB051968934801401960DA680240DA6040 +:100D000000230CE6152900D997E30800FFF734FC0F +:100D100016001F00270095032F0037003F009503A2 +:100D20004800510058006100950395036A00730064 +:100D30007C0085008E0097009E00A50090228023F5 +:100D4000D20511685B030B4313600023E7E5902293 +:100D50000123D20511680B4313600023DFE59022C5 +:100D60000423D20511680B4313600023D7E59022BA +:100D70001023D20511680B4313600023CFE59022A6 +:100D80004023D20511680B4313600023C7E590226E +:100D90008023D2051168DB040B4313600023BEE5FA +:100DA00090228023D20511685B010B43136000235E +:100DB000B5E504235F4A11680B4313600023AEE5D9 +:100DC00090228023D2051168DB050B4313600023BA +:100DD000A5E590228023D2051168DB020B43136046 +:100DE00000239CE590228023D20511685B000B4311 +:100DF0001360002393E590228023D2051168DB0065 +:100E00000B43136000238AE590228023D2051168EA +:100E1000DB010B431360002381E590228023D20580 +:100E20001168DB040B431360002378E590228023D4 +:100E3000D20511685B050B43136000236FE50123A6 +:100E40003C4A11680B431360002368E51023404AB5 +:100E500011680B431360002361E590228023D205C3 +:100E60001168DB000B431360002358E58D2308292C +:100E700000D054E590224023D20551680B435360C3 +:100E800000234CE58D23082900D048E59022D205A7 +:100E9000536838318B435360002340E5152900D94E +:100EA000CEE20800FFF768FB16001D002300CC020D +:100EB00029002F003500CC023C0056005B00620088 +:100EC000CC02CC0269006F0075007B0082008900B3 +:100ED0008E00930090238022DB05D2009A620023CB +:100EE0001DE590230122DB059A62002317E590237C +:100EF0000222DB059A62002311E590230422DB0520 +:100F00009A6200230BE590230822DB059A620023F6 +:100F100005E590238022DB0592019A620023FEE41E +:100F200090234022DB059A620023F8E4FFFFFFFBD9 +:100F3000FFEFFFFF00040048FFFFFFBFFFFFFBFFC5 +:100F4000FFFEFFFFFFFBFFFFFFBFFFFFFFFFFFEF06 +:100F5000000C00480222CD4B9A620023DFE490236C +:100F60008022DB0512029A620023D8E490238022BB +:100F7000DB0592009A620023D1E490231022DB0566 +:100F80009A620023CBE490232022DB059A6200239F +:100F9000C5E490238022DB059A620023BFE49023FE +:100FA0008022DB0592019A620023B8E4902380221C +:100FB000DB05D2019A620023B1E40122B34B9A62AD +:100FC0000023ACE40422B24B9A620023A7E49023EE +:100FD0002022DB059A620023A1E4152900D932E220 +:100FE0000800FFF7C9FA16001D002300300229008F +:100FF0002F00350030023C00420047004E00300216 +:10100000300255005B00610067006E0075007A00D9 +:101010007F0090238022DB05D2009A6100237EE4CA +:1010200090230122DB059A61002378E490230222B9 +:10103000DB059A61002372E490230422DB059A61A8 +:1010400000236CE490230822DB059A61002366E408 +:1010500090238022DB0592019A6100235FE49023B4 +:101060004022DB059A61002359E40222874B9A61F2 +:10107000002354E490238022DB0512029A610023AE +:101080004DE490238022DB0592009A61002346E420 +:1010900090231022DB059A61002340E49023202254 +:1010A000DB059A6100233AE490238022DB059A61F4 +:1010B000002334E490238022DB0592019A6100230F +:1010C0002DE490238022DB05D2019A61002326E4DF +:1010D00001226E4B9A61002321E404226C4B9A6139 +:1010E00000231CE490232022DB059A61002316E4F0 +:1010F00002236370152900D9B1E00800FFF722FA36 +:101100000B151EAF273039AF434C545DAFAF67703E +:1011100079828C969EA690238022DB051B69D200E3 +:10112000134063800023FFF7FAFB90230122DB05C5 +:101130001B69134063800023FFF7F1FB9023022219 +:10114000DB051B69134063800023FFF7E8FB902356 +:101150000422DB051B69134063800023FFF7DFFBDC +:1011600090230822DB051B69134063800023FFF7EF +:10117000D6FB90238022DB051B699201134063801C +:101180000023FFF7CCFB90234022DB051B691340B3 +:1011900063800023FFF7C3FB02223C4B1B69134013 +:1011A00063800023FFF7BBFB9023DB051B69DB0B90 +:1011B000DB0363800023FFF7B2FB90238022DB0573 +:1011C0001B699200134063800023FFF7A8FB902364 +:1011D0001022DB051B69134063800023FFF79FFB90 +:1011E00090232022DB051B69134063800023FFF757 +:1011F00096FB90238022DB051B691340638000234C +:10120000FFF78DFB90238022DB051B6992011340C1 +:1012100063800023FFF783FB90238022DB051B699B +:10122000D201134063800023FFF779FB0122174BA3 +:101230001B69134063800023FFF771FB0422144BEA +:101240001B69134063800023FFF769FB9023202272 +:10125000DB051B69134063800023FFF760FB00235D +:1012600063708D33FFF75BFB80230A4ADB02516911 +:101270000B435361054B08491A680A401A60D96844 +:10128000064A0A43DA600023FFF749FB00040048DE +:10129000000C004800100240FFFFAAAA00005555AC +:1012A000D54BD6491A680A401A60D968D44A0A430D +:1012B000DA600023FFF733FBCF4AD04913680B40B5 +:1012C00013600023FFF72BFBCB4ACD4B11680B4378 +:1012D00013600023FFF723FBC74A09025369DBB2FF +:1012E000194351610023FFF71AFBC34B1B691B0A0B +:1012F000A370012363700023FFF711FB8023C14A11 +:101300001B0351690B435361BF4AC04B11680B4328 +:1013100013600023FFF703FBBB4ABC4BD1680B43B0 +:10132000D3600023FFF7FBFAB74AB94913680B40B3 +:1013300013600023FFF7F3FAB34AB44B11680B4371 +:1013400013600023FFF7EBFAAF4B59610023FFF75F +:10135000E6FA01236370AC4B1A69A2701B691B0A81 +:10136000E3700023FFF7DBFAC023A64ADB025169D2 +:101370000B435361A04AA74B11680B4313609022A3 +:10138000A023D20511685B030B4313600023FFF712 +:10139000C6FA994A9F4BD1680B43D3609023A02192 +:1013A000DB05D86849030143D96011689A480140B8 +:1013B00011601A6899490A401A600023FFF7AFFAD2 +:1013C000FF258D488B0042692B40954DC9002A406E +:1013D000134343619022C020D205C00053690140ED +:1013E00090480340194351610023FFF798FA012107 +:1013F000814B1A680A431A6099620023FFF78FFA3B +:1014000001227D4B196891431960D9680A43DA605B +:101410000023FFF784FA01227B4B5961764B9A61D6 +:101420009A620023FFF77BFA0023FFF778FA8D23F7 +:10143000FFF775FA8D23FFF772FA8D23FFF76FFA26 +:101440008D23FFF76CFA8D23FFF769FA957893885F +:10145000052D00D19BE119D8022D00D12FE107D82D +:10146000002D00D1BAE0012D00D1E5E09625B9E0CC +:10147000032D00D10CE2042DF8D1DBB2012B00D1F9 +:101480004AE2022B00D168E29825ABE0082D00D19A +:10149000D7E14AD8062D00D195E1072DE6D102F01B +:1014A000DBF890230120DB051A68002502431A604F +:1014B0001022986119680A4304211A6080229961F8 +:1014C0001C68D20122431A6080229A6180221C6823 +:1014D000520122431A6040229A611C68214319601C +:1014E0000221996119680A431A6008229A618022D0 +:1014F000444912034C6922434A614349434A0C68F8 +:1015000022430A603C4A14680443146084249062B5 +:101510004C619061906280224D611968D2050A4346 +:101520001A60802212029A625CE00A2D00D119E151 +:1015300000D222E1802D99D19023012540208026E0 +:10154000DB05657098621A68760132431A60C046FE +:1015500035491C691A6804400A401A60DA680A4072 +:10156000DA60F022002C36D11A680A401A60DA6874 +:101570003243DA601A6994461A690192C0461A69C0 +:101580000292C046C0461A690392C046C046C04691 +:101590001F69C046C046C046C0461E691A680A4058 +:1015A0001A60DA681140D96063462200034212D102 +:1015B000019B2A0003420ED10299023201420AD154 +:1015C00003990332014206D10432074203D1D632D5 +:1015D000064200D0D13A154B9A70CCE0144A1370F1 +:1015E00002F03AF8114C2570124B0098A2B2240C6C +:1015F0005A819C8105B0F0BD00040048FFFFAAAAF3 +:10160000000055550010024000080048555555553A +:10161000AAAAAAAA50550000AFAAFFFFFFFFEBFF3E +:1016200003FF0000FFF90000FFEFFFFF00070020AD +:10163000080700200060004002F00EF89023DB0550 +:101640009D611A6815438022D2001D609A62802233 +:10165000196852030A431A60022204219A611A6827 +:101660000A431A601022996119680A431A60082215 +:101670009A61196838320A431A608023DF49DB0215 +:101680004A69DF4D1343DF4A4B6113682B401360F7 +:10169000D468DD4B1C43D460106828401060D068CB +:1016A0000343D36080234A691B0313434B61D74B29 +:1016B000D74A19680A431A6000255D6192E701F074 +:1016C000CBFF90230121DB051A68CC480A431A603E +:1016D000102299611968CA4E0A431A6004224021F7 +:1016E0009A611A680A431A6008229A6180229961F5 +:1016F000196852010A431A6080224169D2020A43E2 +:10170000C04942610A6832400A60CD68BE4A15434A +:10171000CD600C6834400C60CC682243CA608022E3 +:101720004469120322434261B84AB94C15682C43FC +:10173000002514605561C0224469D20222434261EF +:101740000868B44A02430A60A022186852030243A0 +:101750001A60B1484A6902404A615A69AF490A4071 +:101760005A613FE790238022DB051968D2010A43C2 +:101770001A6080229A61002534E790238022DB05DD +:101780001968D2010A431A6080229A62F3E701F0D5 +:1017900063FF90230121DB051A680A431A601022B7 +:1017A000996119680A431A60042240219A611A68F3 +:1017B0000A431A6008229A61802218685201024383 +:1017C0001A60996159E701F047FF90230121DB0579 +:1017D0001A688B4D0A431A601022996119680A43EE +:1017E0001A6004229A6119683C3211431960082179 +:1017F00099619A629A6180238049DB024A691343A6 +:10180000804A4B6113682B401360D4687E4B1C43A5 +:10181000D460106828401060D0680343D3608023F0 +:101820004A691B0313434B61784B794A19687C481A +:1018300011431960196801401960D9680A43DA60D8 +:101840003AE701F009FF90230121DB051A680A43FA +:101850001A600422996119681143196019681143CB +:101860001960102118680143196040219A611A68B3 +:101870000A431A6080229D611868520102431A606F +:10188000996180235D4A1B0351690B435361CBE788 +:10189000DBB2022B21D00025032B00D1A2E6973525 +:1018A000012B00D09EE6802200255449120348698E +:1018B00002434A61554A116899431160D16819433E +:1018C000D160516819435160936111680B431360F3 +:1018D000544B1D70544B1A6084E6B023474A5B0397 +:1018E000516940200B4353619022D20513684F4940 +:1018F0000B4013608023D1685B011943D1605168AC +:1019000001435160906111680B4306211360454B00 +:101910001970454B1A602EE79022454BD2051A608C +:1019200006220221434B1A70364B434A1360434A46 +:101930001170434A01311360424A1170424A1360E8 +:10194000424B2E4A1D70B02351695B030B43536118 +:1019500001F0B6FD01F0B4FD0DE790223449D20547 +:101960000A6034490B700321334B1A60334B1970F2 +:10197000334B49181A60334B1970334B1A600122EC +:10198000324B1A70B0231D4A5B0351690B435361FC +:10199000E0E79678D7789588112E00D132E100D90A +:1019A00081E0082E00D128E119D8042E00D101E1F0 +:1019B0000BD8012E00D1C9E0002E00D1BAE0022ED2 +:1019C00000D1C8E0A023FEF7AAFF062E00D1B8E0A0 +:1019D00000D8EAE03900280001F0ACFBAEE00C2EA4 +:1019E00000D114E134D80A2E00D1F2E000D8EBE0A7 +:1019F0003900280001F08AFAA0E0C0460010024039 +:101A0000FFFFAAAA0004004800005555000800483E +:101A1000555555555055000003FF0000FFF90000D3 +:101A2000AAAAAAAA100700200C070020FFEFFFFFB8 +:101A300024070020280700201C0700202007002082 +:101A40002C07002030070020140700201807002072 +:101A50000E2E00D1C2E000D2CAE00F2E00D1C2E0AB +:101A6000102EAFD1AA21C84801F092F95521C748DC +:101A700001F08EF9A021C44801F08AF9390028004C +:101A800001F086F9A020C24B0002197801F080F91C +:101A9000280001F079FA0600C046280001F074FA27 +:101AA0008642F5D14AE0252E00D179E01CD8202EBF +:101AB00000D184E00CD8132E00D1B2E000D2ABE00C +:101AC000142E00D07EE73900280001F009FB35E034 +:101AD000222E45D075D3232E00D1EDE0AD4B242E20 +:101AE00000D06FE71D7029E0822E00D1D1E00AD826 +:101AF000802E00D19AE000D9C4E00023262E01D127 +:101B0000FEF70DFF5EE7852E00D1C8E008D8842ED1 +:101B100000D057E701232800637001F065F8B6E0B4 +:101B2000862E00D1C0E0872E00D04BE701236370E2 +:101B3000984BB7E03900280001F048FB0023FEF77E +:101B4000EEFE3900280001F01DFBF7E73900280000 +:101B500001F066F8F2E73900280001F019F9EDE725 +:101B60008D4B02225D6190238C49DB059A620868E7 +:101B70008B4A3F0202430A604A692DB2D2B2174330 +:101B80004F61002D01DA01229A62C046C04601224F +:101B90009A6192189A610B68824A13400B60CDE7F4 +:101BA0003900280001F0C4F8C8E73900280000F027 +:101BB000F3FFC3E73900280001F0A0FEBEE7744B35 +:101BC00090E7794B1D80B9E73900280001F05CFBF4 +:101BD000B4E73900280001F089F8AFE739002800A0 +:101BE00001F0CEFEAAE73900280001F099FEA5E732 +:101BF0003900280001F016FBA0E73900280001F0A9 +:101C000053F89BE73900280001F046F996E73900C0 +:101C1000280001F0FBF891E73900280001F026FACE +:101C20008CE73900280001F0FBF987E701219023B8 +:101C30006170DB0518685D4E30401860DA6802207C +:101C40003240DA608022D2009A62996198615248EB +:101C50004561C046C0462DB29A61002D00DA9962F6 +:101C6000C046C046C046C046C046C04690228021FD +:101C70004A4BD205C9001B69916201211B0A91617F +:101C8000A3705BE701232800637001F07DF9A07069 +:101C900054E701232800637000F0EAFFF7E701230F +:101CA00063703B4B1B78EBE7022363703E4B1B8852 +:101CB000A3701B0AE37041E73D4B9D4202D880238D +:101CC0001B021D43902700F01BFD6B1CFF339BB2D2 +:101CD0000193FF05304B314E5D613268304B00029D +:101CE0001343FF2233607369134018437061C04689 +:101CF0000823BB6200F004FD08230135BB61019B92 +:101D0000ADB29D42E6D13368264A1340336015E7F1 +:101D10009078D1789588AA23062801D9FEF7FFFD8F +:101D2000FEF710FC042A1B22264C2000FF201B4932 +:101D3000AB004A6903401F48ED00024013434B616A +:101D40009022C021D205C90053690D401A490B40A9 +:101D50001D4355610023FEF7E2FD0022280000F03C +:101D6000E7FCF7E70122F9E7280000F099FEF1E728 +:101D7000280000F06DFEEDE70123002163702800CC +:101D800000F006FDA070E5E7AAFA000055F5000096 +:101D90008C040020A3040020000800480004004830 +:101DA00000005555FFFFAAAA36040020FFEFFFFFF1 +:101DB000FF1F000003FF0000FFF900000121617018 +:101DC000DDE790789388002829D0012844D1D17884 +:101DD000CB4A5361C022D2019B18CA4A9BB293429C +:101DE00002D89023DB059862C74BC84A18680902DD +:101DF00002431A605A69D2B20A435A6190220821FA +:101E0000D2059162C046C046C046916107399161D2 +:101E10001A68BF490A401A600023FEF780FD0121BD +:101E2000B74A6170536190220420D2059062C020AD +:101E3000C0011B18B3489BB2834200D89162C046D0 +:101E4000C046C046C0460121AF4B1B6991611B0AC9 +:101E500003319161A370DFE7AF23FEF760FD957852 +:101E6000022D0CD0032D2BD0002D33D10223637013 +:101E700001F0ACFCA070000AE070FFF7B4FB95889D +:101E8000A44BD0781D80A44BA44A18709C4B000230 +:101E900019680A439C491A600E689C4A32430A60DA +:101EA0005D614A69D2B202434A6190220121D205A2 +:101EB00091621A689A490A401A600025FFF793FB5D +:101EC00090230122DB059A618F4A914913680B40E8 +:101ED0001360F2E7B025FFF786FB91780023012914 +:101EE00001D1FEF71CFD99421FD0B133022901D068 +:101EF000FEF715FD84210125938881481943426925 +:101F00004161814992B28D618D62426104228021DA +:101F1000134090220902D205002B03D091610023C7 +:101F2000FEF7FDFC9162FEF7FAFC01236370A93312 +:101F3000A3700B00FEF7F3FC9078938804282BD84D +:101F4000FEF700FB182A03080C00764A13800023D2 +:101F5000FEF7E5FC180001F0B9F9F8E7902302223A +:101F6000DB059A61C046C046C046C046C046013A3D +:101F70009A61ECE7902202230421D20563709162FA +:101F8000C046C046C046C0465D4B1B699161A37008 +:101F90009BB21B0AE370DAE7B223FEF7C0FC957828 +:101FA000D0789188112D7ED007D8012D4FD0002DEB +:101FB0000DD0022D5DD0822646E0212D67D0222D46 +:101FC0006CD0122DF7D10223102063706EE0012730 +:101FD000554B04261B7810209F40FA43534B019227 +:101FE0001D68AF626B6813406B6000F07EFBAF61F1 +:101FF0006B683B436B60FA20400000F076FBFA20F0 +:10200000AF626B68019A400013406B6000F06DFB9B +:10201000AF616B68013E3B43B6B26B60002EEAD104 +:102020000436FA2000F061FBAF626B68019AFA2077 +:1020300013406B6000F059FBAF616B68013E3B439E +:10204000B6B26B60002EECD12670FFF7CDFA364A9F +:10205000364B12781E689540B56273681020AB430A +:10206000736000F042FBB56173682B437360002618 +:10207000EAE701232C4A637012782D4993402B4ADA +:102080009BB21268002002F01BFBA070EFE7012357 +:1020900002000020637001F09BFCF6E701230200C0 +:1020A00063701020F7E702230020637001F0EAFC60 +:1020B0006080DCE79078D1780138938808285AD876 +:1020C000FEF740FA050D150B3C593F454F00194BE3 +:1020D0001B78A3700123637006E0174BF8E7154ADD +:1020E00013708322144B1A700023FEF718FC114A58 +:1020F000114D137083232B7001F052FA2B78E8E70F +:1021000000080048FF1F000000040048000055556B +:10211000FFFFAAAA8A0400208804002055555555BF +:10212000AAAAAAAAA0040020100700200C070020D9 +:1021300004000200C4040020E6040020C14A137019 +:10214000D2E7C14A535452181B0A5370CCE70023FC +:10215000BD4A5218D05CE11801338870082BF9D1C0 +:10216000B9E70223B8499A1E8A5CE2540133222B54 +:10217000F9D1023BAFE78723FEF7D1FB9078D57802 +:10218000023891888A230A2801D9FEF7C8FBFEF796 +:10219000D9F9060B11161D24303C41495000AB4BB8 +:1021A00019800023FEF7BBFBA84B1B881B040B43C5 +:1021B0009847F6E7FEF7DCFA0300FEF7B0FBA44809 +:1021C00003689AB20B0413430360EAE7A04A13685A +:1021D0001B0C1B040B431360E3E7042363709C4B4D +:1021E0001B681A0AA370E2701A0C1B0E227163712D +:1021F000D7E70223964A637012684B00D3181A88F7 +:10220000A2701B881B0AE370CBE7914B6D001B6823 +:10221000E952C6E78E4A4B001168CB1813600222C0 +:102220006270ECE78A4B6D001A6855191D602980B1 +:10223000B7E7012363700233A370B2E78823FEF788 +:102240006EFB93789188022B09D0032B0ED0012BC3 +:1022500010D1804A090411600023FEF760FB7D4A1B +:1022600013681B0C1B040B431360F5E70122794B29 +:102270001A60F1E78323FEF752FB91780B00303BA5 +:102280002F2B1AD8D078032814D8FEF75BF916182C +:102290000211714B512900D17DE028D8312957D046 +:1022A0000FD8002937D030294BD0B423FEF737FBA5 +:1022B0006A4BEFE7B523FEF732FB694BEAE7694B60 +:1022C000E8E7332952D04AD35029EED1C022D200B8 +:1022D00022801A7AA270DA78E2705A7A22719A7A97 +:1022E00062719A78A2715B7CE371FFF77DF97F29B7 +:1022F00000D984E070295DD260293CD0612943D0A7 +:102300005229D2D180221B889200A3701B0A2280FE +:10231000E370FFF769F9FF22534BCA5401311029CA +:10232000FBD101234E4A5B4253804E4A53804A4AB6 +:1023300053804A4A538001224C4B1A700023FEF707 +:10234000EEFA9288110AD9721A730023FEF7E7FA9F +:102350009288110A59739A730023FEF7E0FA928863 +:10236000110AD9731A740023FEF7D9FA92885A74A5 +:102370000023FEF7D4FA80235B00238093883A4A37 +:10238000D35CA370FFF730F980235B002380384BC8 +:102390001B68DB78F5E7C022D2002280DA7AA270CF +:1023A0001A7BE2705A7B22719A7B6271DA7BA2718E +:1023B0001B7C99E72A4B15785C682D4B1868C3780D +:1023C0007F2D00D9B5E02B4D009E2E70002B0FD035 +:1023D00000250095982B00D1B1E004E00025009580 +:1023E000D02B00D1ABE0214B10351D70FF2304E052 +:1023F000214B18609023C3706F3300939FE0072038 +:10240000084003281AD8FEF79DF8393B0217124BF3 +:10241000802901D2FFF7E8F8872933D97031C9B292 +:10242000072901D9FFF7E0F800212170D1789972CE +:1024300092881A80FFF7D8F8084BE9E7B523FEF732 +:102440006EFAC046E5040020C504002034040020D4 +:10245000300400209C04002060040020740400204C +:10246000380400204C040020E7040020A4040020CD +:102470009004002098040020940400203C4BC7E7FF +:102480003C4BC5E79088D178C6B28D19BE22102D7D +:102490002CDC0432002929D0DD78033AFF2D25D128 +:1024A0009D780132FF2D21D10022D7B28F4220D357 +:1024B000314D0022AC464F01013F1F727701000AE7 +:1024C00067449870DA705A729A721A80DA721A73C4 +:1024D0005A739A73DA731A745A745F60274B9D1992 +:1024E000A8540132D3B28B42FAD300222270FFF7F4 +:1024F0007BF80132B718214D013FEF5DFF2FD4D09B +:10250000C122F3E79378002B04D0402B08D0D223CC +:10251000FEF705FA23709288194B1A70FFF764F8DA +:1025200080235B002380164B1B782AE78023FEF76D +:10253000F6F9D82B00D051E780234468C3700023FC +:102540004372C378902B01D0FFF74EF8712901D068 +:10255000FFF74AF80B4B91881B6858680170928806 +:102560005968120A4A705A7A02325A72FFF73CF8D6 +:10257000380400204C040020F8040020E704002068 +:10258000A404002094040020F0B5194D040005A80F +:10259000067868690902C0B2084368619020042186 +:1025A000C00581622900002A01D101328262FF2523 +:1025B00000204A692D022A401A430E4F4A61C04644 +:1025C000C046C046C0463A690133120A22544A69DD +:1025D000DBB22A4001301A43C0B24A61B042EED9A0 +:1025E00090230422DB059A61033A9A61F0BDC0464C +:1025F0000008004800040048F0B5184C0500606968 +:102600000E02C0B23043606180269020F600C00503 +:1026100049B28661002901DA01218162FF266169E0 +:102620003602314011436161C04600200C4FC04664 +:10263000C04639690132090A29546169D2B2314070 +:1026400001301143C0B261619842F0D990238022D9 +:10265000DB05D2009A6201229A61F0BD00080048B1 +:1026600000040048F0B5174C05000E0060691F29F2 +:1026700025D8802131430902C0B201436161902114 +:102680000420FF26C9058862616936023140114382 +:102690006161C04600200C4FC04639690132090A09 +:1026A00029546169D2B2314001301143C0B2616135 +:1026B0009842F1D990230422DB059A61F0BDC0B2A3 +:1026C0000902DAE70008004800040048002302007D +:1026D0000002002A04D1002B01D080231843704748 +:1026E000DB43511EDBB20A40F3E70023800080B2D7 +:1026F000C046C04601339BB29842F9D17047FFFFF4 +:1027000030B50722012409490868450D43086B408C +:102710004340C50FDBB26B40013A23404000D2B2C8 +:102720001843002AF1D10860C0B230BD9C040020DB +:10273000134B10B55861134B13481C680902204312 +:1027400018605869C0B20143596190210820C90539 +:102750008862002A01D101328A62C046C046C04662 +:10276000C046C046C046C046C04690220821D20599 +:102770009161073991611A6804490A401A6010BDD5 +:10278000000800480004004800005555FFFFAAAAB1 +:102790000F4B58619023DB05002901D101229A6279 +:1027A00004229A62C046C046C046C046C046C046E3 +:1027B000C046C046C046C046C046C046C0460549A1 +:1027C00008699A61000A033AC0B29A617047C0462C +:1027D0000008004800040048F7B504000E004D7AD8 +:1027E000C046C046C046C046C046C046C046C046B9 +:1027F000C0460022AA215848FFF79AFF002255211F +:102800005648FFF795FF2402002220215248FFF787 +:102810008FFF23B20193EBB20093337AAB4216D20F +:102820008020009B0022737290210002FFF780FF3E +:102830000022802011000002FFF77AFF8020002292 +:10284000F0210002FFF774FFC0460020FEBD444B9C +:10285000444A196808200A43FF211A605A690A404D +:10286000A02109020A435A6190220121D2059062F7 +:102870009162C046C046C046C046FF249061916147 +:102880001A6839492C400A401A60019B009A1C437F +:102890007368A4B2995C20000022FFF749FFC0468C +:1028A000C046C046C046C046C046C046C046C046F8 +:1028B000C04600212000FFF76BFF0700C046C0465E +:1028C000C046C046C046C046C046C046C046736803 +:1028D000009A9B5C834217D0C046C046C046C046A3 +:1028E000C046C046C046C046C04600212000FFF793 +:1028F0004FFFB8420BD1C046C046C046C046C04696 +:10290000C046C046C046C0460135ADB283E7C046AA +:10291000C046C046C046C046C046C046C046C04687 +:10292000C046C046C046C046C046C046C046C04677 +:10293000C046C046C046C046C046C046C046C04667 +:10294000C046C046C046C046C04600212000FFF732 +:102950001FFF0700C9E7C046AA8A0000558500008E +:102960000004004800005555FFFFAAAAF7B50F0064 +:1029700003024D7A00933B7AECB2AB4202D27C72F6 +:102980000020FEBD0022AA211B48FFF7D1FE002235 +:1029900055211A48FFF7CCFE009BEEB21E430022E1 +:1029A00025213000FFF7C4FE00221F213000FFF771 +:1029B000BFFE2300203301937B680022195D009B3A +:1029C000181980B2FFF7B4FE019B0134A342F3D182 +:1029D000002229213000FFF7ABFE00210098FFF70D +:1029E000D7FE002104000098FFF7D2FEC0468442C3 +:1029F000F3D12035ADB2BEE7AA8A000055850000AC +:102A000070B504000D000022AA210F48FFF790FEC8 +:102A1000002255210D48FFF78BFE0022A0210A4815 +:102A2000FFF786FE002229002000FFF781FE00212B +:102A30002000FFF7ADFE0500C04600212000FFF793 +:102A4000A7FEA842F3D170BDAA8A000055850000F8 +:102A500070B504000D000022AA210F48FFF768FEA0 +:102A6000002255210D48FFF763FE0022A0210A48ED +:102A7000FFF75EFE002229002000FFF759FE00212B +:102A80002000FFF785FE0500C04600212000FFF76B +:102A90007FFEA842F3D170BDAA8A000055850000D0 +:102AA00070B504000D000022AA210F48FFF740FE78 +:102AB000002255210D48FFF73BFE0022A0210A48C5 +:102AC000FFF736FE002229002000FFF731FE00212B +:102AD0002000FFF75DFE0500C04600212000FFF743 +:102AE00057FEA842F3D170BD55550000AA2A000038 +:102AF000C90152080A43FF21F0B585B00293234B68 +:102B00000500586912B209021140C0B20143902475 +:102B100059610121E405A1620331A162FF213F2631 +:102B200058690902D2B2084010435861B4460020E7 +:102B3000174F01930391C046C046C046C046C046E9 +:102B4000C046C046C0466346396926698908F6080A +:102B50009E431940314329543E69411C019BC9B22F +:102B6000360A6E545969039B01321940D2B2019B57 +:102B7000114359610230029BC0B28342DBD204236D +:102B8000A361033BA36105B0F0BDC0460008004847 +:102B900000040048002070470F4B30B59022586168 +:102BA00080230124D205DB0093620C4B94621D68E4 +:102BB0000B480902284318605869C0B201435961A3 +:102BC000C04608219162C0469161196805480140DC +:102BD0001960946130BDC0460008004800040048F8 +:102BE00000005555FFFFAAAA0B4B10B58021586174 +:102BF000902301220424DB05C90099619A629C623A +:102C0000C046C046C046054800699C61000A9962FA +:102C1000C0B29A6110BDC0460008004800040048D8 +:102C20000E4B984202D880231B0218430C4B0D4ACE +:102C300058610D4B0902186802431A605A69D2B2F2 +:102C400011435961C04690220821D2059162C046C5 +:102C500091611A6805490A401A607047FF1F000019 +:102C6000000800480000555500040048FFFFAAAACC +:102C70000A4B984202D880231B021843084B0422B7 +:102C800058619023DB059A62C046C046C046C046E4 +:102C9000044908699A61000AC0B27047FF1F00002A +:102CA000000800480004004870B504000D000D48FD +:102CB000AA21FFF7B5FF55210B48FFF7B1FFA0216F +:102CC0000848FFF7ADFF29002000FFF7A9FF20000B +:102CD000FFF7CEFF0500C0462000FFF7C9FFA8425E +:102CE000F5D170BD55150000AA1A000070B504009A +:102CF0000D000D48AA21FFF793FF55210B48FFF760 +:102D00008FFFA0210848FFF78BFF29002000FFF765 +:102D100087FF2000FFF7ACFF0500C0462000FFF74B +:102D2000A7FFA842F5D170BD55150000AA0A000002 +:102D300030B580239024DB00E405A361104B114AD9 +:102D400058610223A362104B09021D6800B22A4396 +:102D50001A605A69D2B211435961002801DA01217F +:102D6000A162C046C0460121A1614918A16119684C +:102D70000648014019608023DB00A36230BDC046D5 +:102D8000000800480000555500040048FFFFAAAAAB +:102D90009023DB0530B51C68174D09022C401C60E0 +:102DA000DA68164C2A40DA60154A506102229A62AB +:102DB000144A00B215682C4314605469E4B22143EC +:102DC0005161002801DA012199628021C9009961CD +:102DD000C046C046C046C046C046C046C046C046C3 +:102DE000C0469962012199614918996113680649A1 +:102DF0000B40136030BDC046FFEFFFFF000055558C +:102E00000008004800040048FFFFAAAAF7B5050023 +:102E10001C4B01911E781C4B74001F8820213C190B +:102E2000A4B22000FFF7B4FFAA211848FFF7F8FE6C +:102E3000A01B80B21021FFF7ABFF55211448FFF70C +:102E4000EFFE20212000FFF7A3FFA0210F48FFF78E +:102E5000E7FE104B187846430101BE19C9B2B0B263 +:102E6000FFF796FF01992800FFF7DAFE2800FFF729 +:102E7000FFFE0400C0462800FFF7FAFEA042F5D18D +:102E8000F7BDC046A30400203604002055150000FD +:102E9000AA0A00008C04002070B50400B0200E00C7 +:102EA00000020A21FFF774FFC0200A210002FFF789 +:102EB0006FFFAA211248FFF7B3FE55211148FFF713 +:102EC000AFFEA0210E48FFF7ABFEB0200E4B000274 +:102ED0001D782900FFF75CFFC02029000002FFF7E2 +:102EE00057FF31002000FFF79BFE2000FFF7C0FED8 +:102EF0000500C0462000FFF7BBFEA842F5D170BD1B +:102F000055150000AA0A00008C040020F8B5050041 +:102F10000E00194B02211C88A71CBFB23800FFF716 +:102F200037FFAA211548FFF77BFE601C80B2012104 +:102F3000FFF72EFF55211248FFF772FE02213800DD +:102F4000FFF726FFA0210D48FFF76AFE0D4B197809 +:102F50006418A0B2FFF71CFF31002800FFF760FEE5 +:102F60002800FFF785FE0400C0462800FFF780FE1A +:102F7000A042F5D1F8BDC04636040020551500002A +:102F8000AA0A00008C0400200B4B5861902300B269 +:102F9000DB05002801DA01229A628022D2009A61C0 +:102FA000C046C046C046C046044908699A6201222C +:102FB000000AC0B29A617047000800480004004847 +:102FC00070B504000D00A021FFF7B2FE290020001B +:102FD000FFF7AEFE2000FFF7D7FF0500C046200038 +:102FE000FFF7D2FFA842F5D170BD70B50400A02054 +:102FF0000D00C0015421FFF7CBFEA0212000FFF7F8 +:1030000097FE29002000FFF793FE2000FFF7BCFF8A +:103010000500C0462000FFF7B7FFA842F5D170BDFC +:1030200070B50400A0200D000D4BC0011978FFF70A +:10303000AFFEAA210B48FFF7ABFE55210A48FFF768 +:10304000A7FEA0210748FFF7A3FE29002000FFF7F5 +:103050009FFE2000FFF798FFA842FAD170BDC0463E +:103060008C04002055D50000AAAA000070B5040009 +:10307000C0200D0000020121FFF78AFEAA21154899 +:10308000FFF786FEC02000210002FFF781FE5521D8 +:103090001148FFF77DFEC02001210002FFF778FEF6 +:1030A000A0210C48FFF774FEC0200C4B00021978D9 +:1030B000FFF76EFE29002000FFF76AFE2000FFF7F1 +:1030C00063FF0500C0462000FFF75EFFA842F5D170 +:1030D00070BDC04655950000AAAA00008C040020CF +:1030E00070B504000D001048AA21FFF751FE5521CC +:1030F0000E48FFF74DFEA0210B48FFF749FE2900BF +:103100002000FFF745FEA020094B00021978FFF7C9 +:103110003FFE2000FFF738FF0500C0462000FFF704 +:1031200033FFA842F5D170BD55D50000AAEA0000D2 +:103130008C04002070B504000D001048AA21FFF790 +:1031400027FE55210E48FFF723FEA0210B48FFF76D +:103150001FFE29002000FFF71BFE80200221000235 +:10316000FFF716FE2000FFF70FFF0500C046200006 +:10317000FFF70AFFA842F5D170BDC04655D5000043 +:10318000AAAA00000D4B0E4A58610E4B090218689E +:1031900002431A605A69D2B21143902259618021C8 +:1031A000D20510684901014311604021916291618B +:1031B0001A6805490A401A607047C046000800486E +:1031C0000000555500040048FFFFAAAA104B114A01 +:1031D00010B558611068104B09020343136053691E +:1031E0000E4CDBB21943902351618021DB05186836 +:1031F0004901084318604020986218682040186010 +:10320000D8680143D960136805490B40136010BDAD +:10321000000800480004004800005555FFEFFFFF7C +:10322000FFFFAAAA70B505000E00134B00211C88F1 +:103230002000FFF7ADFDAA211048FFF7C7FF552179 +:103240000F48FFF7C3FFA0210C48FFF7BFFF0D4B4E +:1032500019786418A0B2FFF79BFD31002800FFF732 +:10326000B5FF2800FFF790FE0400C0462800FFF7D6 +:103270008BFEA042F5D170BD3604002055550000EC +:10328000AA2A00008C04002070B504000D000D482F +:10329000AA21FFF79BFF55210B48FFF797FFA021BD +:1032A0000848FFF793FF29002000FFF78FFF200059 +:1032B000FFF76AFE0500C0462000FFF765FEA84242 +:1032C000F5D170BD55550000AA2A0000902270B5B6 +:1032D0000225D2059561C046C046C046C046C046DC +:1032E000C04601240D4B94611E680D49314319609D +:1032F0000C4909885961C04695625861C04694627C +:103300001A6809490A401A60C046C046C046C0460D +:10331000C046C046C046C04670BDC0460008004812 +:1033200055555555A0040020AAAAAAAAF0B58BB0FD +:103330000992012208911100354B02901F78354BFC +:103340001B780493344B1D68344B1B789940344BE5 +:1033500001911868334BA9621B789A40029B102B8D +:103360004FD18262012421002F4B05941B680693E4 +:103370002E4B1B7899408BB2210007932C4B1B6876 +:103380009C462C4B1B789940002303911900029C0A +:10339000202C05D1049E059C1E41264236D0826118 +:1033A000089C202C0FD1002B01D11A4C6354069C91 +:1033B0002669079C264206D0164C665C059C9C40FC +:1033C0002643144C6654099C013FFFB2002C03D0E5 +:1033D000002F01D1019CAC616446039E0133DBB236 +:1033E000A661A662082B05D101310A4BC9B25B5C0C +:1033F00004930023002FCAD1019B8262AB620BB001 +:10340000F0BD029B112BADD18261ABE78262C7E7B1 +:10341000E5040020C50400202C0700203007002010 +:103420001C07002020070020240700202807002078 +:103430001407002018070020F7B501221A4B1C784A +:103440001A4B19681A4B1B789A40102826D18A62A9 +:1034500001263500174B01961B680093164B1B780D +:103460009D400023AC461D0020280DD1134E019F26 +:10347000765D1E413E4215D08A610133DBB2082BD6 +:1034800002D100230135EDB26646009F013CE4B253 +:10349000BE61BE62002CE7D18A62F7BD1128D7D188 +:1034A0008A61D5E78A62E8E7E50400202C0700205E +:1034B000300700201407002018070020C504002052 +:1034C000F0B52C4B85B01B78019301231E00019AA7 +:1034D0001F009640284A1168284A8E62127802928C +:1034E0001A000298824094466046254A126890620B +:1034F000244805782448AF4000689D4087620468EE +:1035000003941C00AC402500039C254305604568DE +:10351000019CBD4345609C401D00A54008681C00FF +:10352000284308604868B043486010680299994091 +:103530008C4021000143604611605168814313486B +:1035400051600078124A984083401268116899438C +:103550001160D1680B43D360002319000D4A13702A +:103560000D4A99540133202BFBD180220B4B1A704A +:1035700005B0F0BD300700202C07002020070020F8 +:103580001C0700201807002014070020280700202F +:1035900024070020E5040020C5040020E6040020E4 +:1035A00010B52B4B1B78082B4ED013D8294C032B6E +:1035B00039D006D8012B28D0022B2AD0254BEE2259 +:1035C0003AE0062B3AD03DD8042BF7D10122202136 +:1035D000112021E00F2B28D008D81E4C0D2B1FD016 +:1035E00000220E2BEAD12021102015E0802B06D0DE +:1035F000184CFF2B06D0102BE0D100221FE0FFF764 +:103600005FFF10BDF0232370FBE72020FFF714FFBE +:1036100004E0012200212020FFF788FE8223F2E748 +:1036200000221100F7E70122DDE70022202111200E +:10363000FFF77CFE8222074B1A70E2E7012220216D +:103640000800E9E71020E1E71120FFF7F5FEF1E7B8 +:10365000C4040020E6040020BC224D4BD203996A2A +:10366000F0B50A439A629A6A4A490A409A62B022BD +:10367000596952030A435A6119009023464ADB05EF +:103680001278102A03D100221A609A60DA601A6850 +:103690004248012402401A608022D868D2010243C5 +:1036A000DA601A683E483F4F02401A608022D868AC +:1036B000520302430420DA601A68A2431A60DA68EF +:1036C0002243DA601A6882431A60DA680243DA60D9 +:1036D00010221D6895431D60DD682A43DA60402290 +:1036E0001D6895431D60DD682A43DA601A682E4D17 +:1036F0002A401A608022DD68D2042A43DA601A6800 +:103700002A4D2A401A608022DD68D2052A43DA60F9 +:103710001A68274D2A4080251A60DA68ED022A438C +:10372000DA60244A1668A6431660D6683443D4602B +:103730001E683E401E60DC683C40DC6080234C69B3 +:103740001B0323434B611C4B1C4C1E681C4F264320 +:103750001E601E683E401E60DE683443DC604B69BC +:103760001D434D611368174D2B401360D468164BF1 +:103770001C43D460116829401160D1680B43D360A9 +:10378000136883431360D3681843D060F0BDC0460C +:1037900000100240FFFFA1FF08070020FFBFFFFF4E +:1037A000FFFFEFFFFFEFFFFFFFFFFFFBFFFFFFBF8D +:1037B000FFFFFBFF00040048000800485555555521 +:1037C000AAAAAAAAFFFFAAAA000055550D480E4AA8 +:1037D000038810B50D49934202D10A7801320A706C +:1037E00090220424D205013394620380084B1869A7 +:1037F0009461084C0B7862691B02D2B2134380B209 +:10380000636110BD8A040020FFFF000088040020CF +:103810000008004800040048F7B50D000427019295 +:103820004C7A000203B2A6B200932B7AB34202D2C2 +:103830006C720020FEBD00986B682043195D80B259 +:10384000019B98476B681A5D094B824205D01A6844 +:103850003A431A6002229A61E7E71A680134BA43D0 +:103860001A60DA6801363A43DA60E4B2B6B2DCE7ED +:1038700000040048F7B50D001600FF27000203B250 +:103880004C7A01932A7AE3B2A24202D26B720020F0 +:10389000FEBD20006A683840D15C019B01341843AA +:1038A00080B2B047A4B2EDE7022907D10F4B104A0E +:1038B000984218D0904209D1180007E0032906D198 +:1038C0000A4B0B490B4A98420BD108007047042958 +:1038D000FCD1064B064A984205D006499042F4D0E6 +:1038E000054A8842E6D11000F0E7C04638040020BF +:1038F0004C040020600400207404002070B5060011 +:103900000D0005243000013CFFF73EFBE4B2290026 +:103910003000FFF73DFA6D08002CF3D170BDFFFFBA +:1039200070B50400A0200D0000020221FFF7E6FFA1 +:10393000AA211048FFF774F955210F48FFF770F9D5 +:10394000A0210C48FFF76CF9A0200C4B000219785D +:10395000FFF7D4FF29002000FFF762F92000FFF7EE +:1039600087F90500C0462000FFF782F9A842F5D18B +:1039700070BDC04655150000AA0A00008C04002046 +:1039800070B50400C0200D0000020521FFF7B6FF4E +:10399000AA210D48FFF7FCF955210C48FFF7F8F96B +:1039A000A0210948FFF7F4F929002000FFF7F0F9FA +:1039B0002000FFF7E9FA0500C0462000FFF7E4FA0F +:1039C000A842F5D170BDC04655550000AAAA000016 +:1039D000F7B501230225294F01923A78009105435A +:1039E00093400421A020264E2D049BB22943326827 +:1039F000C00100F065FE040001283DD13B7809209C +:103A00009C4005437830A3B232682900FF3000F0B3 +:103A100057FE040001282FD13B7832689C402900D2 +:103A2000A3B2002000F04CFE0400012824D1009B2A +:103A3000180AFEF74BFE3B7832689C402900A3B27F +:103A400000F03EFE0400012816D16B461878FEF700 +:103A50003DFE22003B7829009A4093B2326800F084 +:103A60002FFE0198FEF732FE3B7832689C40290019 +:103A7000A3B200F025FE0400E0B2FEBD1007002056 +:103A80000C070020F7B501230225274F00903A7854 +:103A90000191054393400421C020244E2D049BB284 +:103AA00029433268800100F00BFE0400012838D160 +:103AB00009231D433B78C0209C403268A3B22900F3 +:103AC000400000F0FDFD040001282AD13B78326857 +:103AD0009C402900A3B2002000F0F2FD0400012860 +:103AE0001FD1019B180AFEF7F1FD3B7832689C401C +:103AF0002900A3B200F0E4FD0400012811D16B46B7 +:103B00001879FEF7E3FD22003B789A4093B2009AC1 +:103B100014430922E1B209041143326800F0D0FDD8 +:103B20000400A0B2FEBDC046100700200C07002014 +:103B3000C64BC74AF0B51A60C64A8BB01A6002225B +:103B40005A60A02212019A600493049BDB68002B48 +:103B5000FBD19022049BC04912031960BF4B186827 +:103B600002431A6080220991920219681142FCD026 +:103B7000012259680A435A608022596852020A4356 +:103B80005A608022596852030A435A608022196899 +:103B900052040A431A608022920419681142FCD030 +:103BA0001121AF4AAF4C11605A680E398A43110097 +:103BB00002220A435A608022196B0A431A63802248 +:103BC000D96912040A43DA61A74BE381BC231B685D +:103BD0009847A64B6382A64B238262B6FFF73CFD53 +:103BE000F022A44B1A70049B099AA34E1A603278F3 +:103BF000202311009943D2291BD1A049A048C9789C +:103C0000C3780224FF2904D1FF3B1C00631E9C41A2 +:103C1000E4B29C4BDB78FF2B00D003249A4BDB787B +:103C2000FF2B00D00424994B994F1C703860D22A86 +:103C300058D03378F22B05D10022023B3370944BDD +:103C40001B68DA703578D02D00D04FE2904E306886 +:103C5000C378802B00D049E28C4B1978FFF724FE03 +:103C600000233060C570068804004372C07AF5B244 +:103C70001038222800D937E2FCF77EFCA301C501E9 +:103C800006020A02360236023602360236023602D0 +:103C900036023602360236023602360237008C0011 +:103CA000DF00E40010011A0121015D0173017B01B5 +:103CB00036023602360236023602360282019A0097 +:103CC00044002100FFF7F0FD01230135EDB2A542CC +:103CD000F7D3002B00D0386080223B68DA70D02305 +:103CE0003370A6E700230125F1E7E17B0F2900D916 +:103CF0001DE209013143237AA278C9B26068FEF758 +:103D00007BFC53E0E17B0F2900D910E263680901D5 +:103D10009C46237AA27802935E4B0E4376B2596991 +:103D2000F0B2C9B20002014359611F00002E03DA4C +:103D300090210120C9058862FF2559692D0229407B +:103D400011435961C046902080260023C005F6002B +:103D500005958661C046C046C046C046C046C046BE +:103D6000C046C046C04665464B4901320969D2B2D9 +:103D7000090AE95486627969059D01332940114396 +:103D800079610299DBB29942E3D2012286628261B3 +:103D90006372DDE03C23E17B0A009A4300D0C6E178 +:103DA000237AA27829436068FEF75CFC6072CFE05A +:103DB000E17B3C230A009A4300D0B8E163682943C1 +:103DC0009C46237AA5780293324B5A691F292FD833 +:103DD000802001430902D2B20A435A61FF27902191 +:103DE00004265A693F023A40C9052A435A618E6245 +:103DF0008E61C046C046C046002205978E62C0460E +:103E0000C046C0466746244801350069EDB2000A45 +:103E1000B8545869059F3840284358618E61C046A0 +:103E2000C04601320298D2B29042E7D262728FE06D +:103E3000D2B2090211435961D0E7237AA278E17B1B +:103E400029435BE7E17B3F23A6E7C0460030004003 +:103E5000CCCC000055550000AAAA0000001002407A +:103E600000200240006000403CA5FFFF4108000820 +:103E700085080008E6040020A40400204C0400206B +:103E8000380400206004002074040020A2040020F4 +:103E9000900400200008004800040048227AE17BDA +:103EA000A3780092002229436068FEF76DFB7DE74E +:103EB000E17B227AA378294300920122F4E79D4B0B +:103EC000E17B586929430E02C0B230436568A2788D +:103ED000277A5861902004266031C005C9B28662F5 +:103EE0001E001F2901D801218162FF2059690002AB +:103EF000014011435961C0468F4900238C46C0469A +:103F0000C046C046C046C046C046C0466146096974 +:103F10000132090AE9547169D2B2014001331143F7 +:103F2000DBB271619F42EAD290220421D2059161F5 +:103F3000033991612CE70025267A67687608FFF738 +:103F400045FC0135EDB238800237AE42F7D26572DA +:103F50007A4B1B6819889A7A52181A80D822DA701C +:103F6000C4E0E17B237AA27829436068FEF7C0FDB4 +:103F70001CE7E17B237A29430131A278FF31F4E782 +:103F8000A3786668277A002B02D12802FFF79EF9F2 +:103F9000684A9020002304259446C0058562C046E7 +:103FA000C046C046C0466246116985618AB2120A9F +:103FB000F2545A1C0233D2B2DBB2B1549F42EDD25A +:103FC000E6E6E37B1E2B0BD1C020B6092233F1B20B +:103FD00000029D43FEF7DCFE237AA27880212FE7C2 +:103FE0001C2BB5D1A0208121C001FEF7D1FE80207D +:103FF000F609F1B20002FEF7CBFEA0200021C001BD +:10400000FEF7C6FEA4E7E37BFE2BA1D17609F1B251 +:104010004B48FEF705FE1F21636829409C46454B2F +:1040200009025A69A678D2B20A43277A80215A61D6 +:104030009022C900D20591610121FF2091620331D4 +:1040400091625A690002024032435A61C04600221E +:10405000394D0290C046604629690136090A8154EB +:1040600059690298F6B2014001323143D2B2596126 +:104070009742EFD290230421DB0599618021C9008A +:10408000996201219961D1E6237AA2786021D7E66D +:10409000E37B002B20D18033F6091D43F3B2039359 +:1040A000FF20039B24499B004A69034025480240A6 +:1040B00013434B61C0209021039BC905C000DB0066 +:1040C0004A6903402048024013434B61227AA37897 +:1040D000290000920022E7E6012BE1D1402176047D +:1040E000760E31430391DBE7C323E370174B1D7852 +:1040F000F02D00D0C5E2114E3468E378982B00D043 +:10410000BFE2134B20001978FFF7CEFB002330608D +:10411000C370E07AE57010382678042800D9AEE242 +:10412000FCF72AFA180052011F022702E600C423F6 +:10413000DBE7C04600080048000400489004002067 +:10414000FF3F000003FF0000FFF90000A40400206F +:10415000A2040020E37B002B06D130008038C0B2DF +:10416000DD4A2100FFF758FBE37B012B06D130002D +:104170008038C0B2D94A2100FFF77CFBE37B022BD9 +:1041800006D130008038C0B2D54A2100FFF772FB5B +:10419000E37B042B06D130008038C0B2D14A210025 +:1041A000FFF73AFBE37BFC2B06D130008038C0B22E +:1041B000CD4A2100FFF730FBE37B0A2B06D130000C +:1041C0008038C0B2C94A2100FFF726FBE37BFD2BF4 +:1041D00015D13F20238830409B0905936B468026EC +:1041E0001B7D06430793677ABBB2029333021BB26F +:1041F0000893237A029A934200D380E06772E37BAC +:104200001E2B06D130008038C0B2B94A2100FFF71A +:1042100003FBE37B0C2B17D11F2030408026064385 +:10422000C0202588A5216D09EDB2C001FEF7B0FDC3 +:104230002900B048FEF7ACFD677A35023D43237A8A +:10424000BB4200D3A3E06772E37B1C2B21D1AA21E0 +:10425000A948FEF76DFD5521A848FEF769FD20210C +:10426000A548FEF765FD30008038A54A2100C0B2A0 +:10427000FFF7D2FA802090210002FEF759FD80203E +:1042800000210002FEF754FD8020F0210002FEF71D +:104290004FFDE37B1F2B21D1AA219A48FEF748FD51 +:1042A00055219948FEF744FD20219648FEF740FD30 +:1042B00030007038954A2100C0B2FFF7ADFA902067 +:1042C00090210002FEF734FD902000210002FEF74D +:1042D0002FFD9020F0210002FEF72AFDE37B6F2BDB +:1042E00006D130008038C0B2894A2100FFF794FA25 +:1042F000F4232288E370A37A9B182380C1E1002174 +:104300008448FEF745FDAA218348FEF73BFF55216F +:104310008248FEF737FFA0217F48FEF733FF6B4648 +:10432000187D7F4B0799C01880B2FEF731FD089DBC +:1043300063683D43ADB2D95D2800FEF723FFC04658 +:104340002800FEF721FE06902800FEF71DFE069BC2 +:104350008342F4D163680699DA5D724B8A420FD1C9 +:10436000029A1968013292B20292042291431960B2 +:10437000D96801370A43DA600222FFB29A6238E74D +:10438000042219680A431A6002229A6131E7AA21BD +:104390006548FEF7FDFC55216448FEF7F9FCA021B5 +:1043A0006148FEF7F5FC63682800D95DFEF7F0FC74 +:1043B000C0462800FEF7E8FD02902800FEF7E4FD65 +:1043C000029B8342F4D13AE7E37B002B04D1584AA5 +:1043D00021003000FFF74EFAE37B012B04D1554A50 +:1043E00021003000FFF746FAE37B032B04D1524A49 +:1043F00021003000FFF73EFAE37B042B04D14F4A43 +:1044000021003000FFF736FAE37B0A2B04D14C4A37 +:1044100021003000FFF72EFAE37B0B2B04D1494A31 +:1044200021003000FFF726FAE37BFE2B00D05FE788 +:10443000218845484909C9B2FEF7F2FBAA21434841 +:10444000657AFEF7A9FB55214148FEF7A5FB3F48D9 +:104450002021FEF7A1FB1F2030400302AFB20593DD +:10446000237ABB420DD2657290210020FEF794FBA7 +:1044700000210800FEF790FBF0210020FEF78CFBE6 +:1044800036E7059EA0212E433000FEF785FB6368CA +:104490003000595DFEF780FBC0463000FEF7A4FBFC +:1044A00002903000FEF7A0FB029B8342F4D16368C8 +:1044B00002995A5D1B4B8A424CD104211A6801357E +:1044C0008A431A60DA6801370A43DA600222EDB2E1 +:1044D000BFB29A62C4E7C046893200088139000839 +:1044E0002532000835310008952B0008E13000081E +:1044F0006D300008FFFF0000AA8A0000558500000B +:10450000EB2F0008AA9A000055950000C12F000863 +:104510002130000869FD000055550000AA2A00005E +:1045200069FDFFFF0004004855D50000AAAA00005D +:10453000ED2C0008213900080D2F0008A92C0008D7 +:10454000992E00080D2E0008FF3F0000AA0A000067 +:104550005505000004211A680A431A6002229A6174 +:104560007EE7300060304E4A2100C0B2FFF782F98A +:10457000BEE6E37B042B06D130008038C0B2494A46 +:104580002100FFF777F9E37B052B04D1454A210091 +:104590003000FFF76FF9E37B062B06D1300080383F +:1045A000C0B2414A2100FFF765F9E37B072B04D134 +:1045B0003D4A21003000FFF75DF9E37B0A2B06D16D +:1045C00030008038C0B2394A2100FFF725F9E37B7B +:1045D0000B2B04D1354A21003000FFF71DF9E37B96 +:1045E000082B05D130008038C0B22100FEF7BEF99B +:1045F000E37B092B03D121003000FEF7B7F9E37B01 +:10460000002B1CD1FF2280331E4323882848DB095E +:10461000DBB29D0041692A40264DDB0029400A4358 +:1046200042619022C020D205C00051690340224857 +:1046300001400B43536121003000FEF7CDF8E37BCE +:10464000012B00D054E62388194A5B04580E4023FE +:104650000343FF209B0051690340164801400B4370 +:1046600090215361C9054B69134A30001A408023D9 +:104670009B0013434B612100FEF7AEF838E6C323DD +:10468000E3700E4B1B78F02B01D1FFF7ACFA832BB4 +:1046900001D0FFF7A8FAFEF783FFFFF7A4FAC046A0 +:1046A000912D0008A12A0008512A0008012A0008BB +:1046B0000004004803FF0000FFF90000E6040020AA +:1046C000F0B5474680B4061C081C000C102801D524 +:1046D000162700E004270007000F8046FF20014056 +:1046E0005468251C1D439C43F60313850AD5C04618 +:1046F000C046C046C046C046C046C04694801383EC +:10470000958002E0012000F081F801390AD4381CBC +:1047100000F07CF8C046948013839580C046C04664 +:104720007600E2E7381C013800F070F894801383BB +:104730009580042000F06AF8108A184001D0FF200C +:1047400061E0C046C046C046C046C046C0469480F0 +:104750009580108A184055D001200226B04552D0CD +:104760000921168A1E40FCD1012000F04FF89480E8 +:10477000C0469580C04603E0C046C046C046C0461D +:10478000948095807600108A1840EFF300804000F6 +:10479000C00F0643381C023800F038F8948095802A +:1047A000022000F033F80139EAD513859480012006 +:1047B00000F02CF813839580301C8021022399404F +:1047C0000E401BD1002341085E4149085E41490863 +:1047D0005E4149085E4149085E4149085E41490819 +:1047E0005E4149085E4149085E41760808D34008A9 +:1047F000FF21084048400002013004E00E2002E0A2 +:10480000092000E0002080BCB846F0BD0138FDD191 +:104810007047C04603685A0003D45B005B08C018A9 +:104820007047802212061343F9E7C046F0B5574699 +:104830004E46DE464546E0B5814683B092460029A5 +:1048400025D04B1E9B46002701935B46FB18DC0FCF +:10485000E4184B466410E5005E193000FFF7DAFFFC +:10486000019B8046A3420BD0280008304844FFF744 +:10487000D1FFD04506D80138504509D2671CE4E77E +:10488000504505D9A74202D0631E9B46DDE70026AE +:10489000300003B03CBC90469946A246AB46F0BD02 +:1048A000012809D0022805D0002801D00020704737 +:1048B0000248FCE70248FAE70248F8E7954F00088B +:1048C000AD4F0008A14F000830B5234B83B0050061 +:1048D0008C1E002B26D001A9200000E000BF00287C +:1048E0001CD001992200FFF7A1FF041E16D0FFF78C +:1048F00091FF6368A864012B2AD0201D002B23DBC5 +:10490000FFF788FF0023E8642B650368002B0FDBAB +:10491000FFF780FF2861002003B030BD002309208D +:104920002B61F9E70D480E49091AC9100191D9E721 +:104930001801000FFFF7B4FF2861431E98410823B8 +:10494000404298430930E7E70123E8642B65DCE740 +:10495000002305202B61DFE70000000090580008CD +:1049600060590008036810B50400DA0705D4483020 +:104970009B070ED500F06CFC23685A070ED51A076A +:1049800013D5DB0604D42000D130FF3000F06CFCDE +:1049900010BD00F059FC23685A07F0D42000D03035 +:1049A00000F05AFC23681A07EBD420005130FF3086 +:1049B00000F056FC2368E4E70368002B00D01B18C6 +:1049C00018007047092070477047C04670B5040052 +:1049D0000D0008E02B6C2A0063612100012023698F +:1049E0009847082807D1296C2000FFF76DFF0028A1 +:1049F000F0D000F083FE0728FBD10020296CFFF7E0 +:104A0000E3FF281D00F00AFCF0B5CE46474680B50E +:104A1000C3682E4C9846A5448369060014000431EF +:104A2000402205A8994600F071FE002304AD0493CE +:104A300023E0F0222B6C5200736129007CA800F067 +:104A400065FE7CAA31003369200098478A9B0700E5 +:104A50006B6403934B4600950193320033002100B1 +:104A60000120C04700281FD1F0227CA95200280055 +:104A700000F04CFE0024082F1FD1296C3000FFF7F6 +:104A800023FF611E8C41070009340028D1D0AB6B95 +:104A900010216B644B462143019300953300320093 +:104AA0000120C047002800D009273800F5239B00CB +:104AB0009D440CBC90469946F0BD072FF4D12000D0 +:104AC000296CFFF781FF05A800F0A8FB2CFCFFFF75 +:104AD000406C704770B5CB6BFAB00B6404000E00ED +:104AE0004022043103A800F011FE01235B4202932F +:104AF00006E002AA210023699847050008280AD188 +:104B0000129B200019000193FFF7DEFE0028F0D071 +:104B100009207AB070BD02A8FFF724FF062DF7D157 +:104B200031002000FFF752FF10B58261DA6BC160DF +:104B30001A6419000022FFF767FF10BD436970B5C2 +:104B40000B64C36804000D00002B15D10A00236913 +:104B5000010002209847072807D0082803D1290020 +:104B60002000FFF733FF00F0C9FD0020296CFFF79C +:104B70002BFF281D00F052FB0122FFF745FF00F03C +:104B8000BDFDC046C36810B5002B05D0CB6B00221D +:104B90000B64FFF739FF10BDFFF79CFFFBE7C04632 +:104BA0007047C046836810B5002B02D00100012079 +:104BB000984710BD012906D0002906D003390220EC +:104BC000012900D970470120FCE7002B08D10F2AEA +:104BD00006D8920082185268009B00201A60F1E704 +:104BE0000220EFE700B585B003AB0A000093002177 +:104BF0000023FFF7DFFF039805B000BD012906D0B1 +:104C0000002906D003390220012900D9704701206C +:104C1000FCE7002B08D10F2A06D8009B92001B68E6 +:104C2000821853600020F1E70220EFE700B585B05D +:104C300003AB039200930A0000230021FFF7DEFF7D +:104C400005B000BD70B51A4CD36BA54413640600C3 +:104C50000D0019A8111D402200F058FD01235B42F0 +:104C6000189314E00C2118A802AAFFF7DFFF29000F +:104C700018A8B047002812D1069B18AA02A908302C +:104C800001939847040005280AD0092807D0289BDB +:104C900002A819000193FFF717FE0028E2D00924AB +:104CA00018A8FFF75FFE200090239B009D4470BD75 +:104CB000C0FDFFFFF0B5DE4657464E464546E0B51F +:104CC000160003220D0011008BB01F000193EB6C46 +:104CD00001401C1D009107A91B688B460894002FFA +:104CE0006BD01A0C1B045946079302230B72FD3339 +:104CF00013409B004A72E418009B022B00D1AC6B5E +:104D00002B6DDB0747D40023059308330340029340 +:104D10002768002F00D112E1019B022B49D0638844 +:104D2000278898460434012340469A469843AB6C42 +:104D30000F21994681443000FFF754FF002181453F +:104D400006D839005346994349448842894149422B +:104D500043465A0002231340012217403B43012BD4 +:104D60003AD0002B30D0022B1BD12368009A5F0071 +:104D70007F08002A67D1002906D0029A002A00D1B4 +:104D80007CE0002F00D1A9E0002B00DA04340137C9 +:104D9000BF00E419BCE75946300000F00BFB0028C7 +:104DA00010D009200BB03CBC90469946A246AB46B9 +:104DB000F0BD636808349846B5E71B0207935B466D +:104DC0001A8199E70820EDE7009B002B02D000290B +:104DD00000D08DE004349BE7009B002B1AD1002902 +:104DE00016D02368DF0F63689A1CDAD02A00583285 +:104DF0000692013300D1BDE0201DFFF7DDFD06ABBB +:104E000001003A00280000E000BF002800D082E046 +:104E100008347DE70D2130002F6AFFF7E3FE87425B +:104E2000F6D1AB6A9C42F3D12000FFF7F3FC0F21CF +:104E300002003000FFF7FAFE30002A000021FFF7E1 +:104E4000F5FE0720AEE72B6A0D2130009846FFF7EC +:104E5000C9FE804501D0236896E7AB6A9C42FAD12F +:104E60000023EB6204332B63231DAF626B63236863 +:104E7000002B00DA86E00123059388E7002F2DD070 +:104E800058239C46AC4463460393231D9946002354 +:104E9000984606AB220004933B004C464746B24678 +:104EA00098462E00914603E004342F00454542D039 +:104EB000039B20000693FFF77FFD049B0100002267 +:104EC00030007D1C00E000BF0028EDD04346B8460E +:104ED00035004C4656461F009845BCD10D21300088 +:104EE000FFF780FE069B28626B62AC62062059E7E2 +:104EF0002000FFF78FFC04340700AC63280000E0BB +:104F000000BF002800D14CE730003A000F21FFF726 +:104F10008DFE072046E707000D213000FFF762FEF7 +:104F20002862022F2BD1069BEB622B002C336B6285 +:104F3000AC62062036E735004C465646CEE7594669 +:104F4000300000F037FA002800D02AE7059B002B3C +:104F500000D137E70F213000FFF744FE0E21020099 +:104F60003000FFF763FE3000094A0F21FFF75EFEB5 +:104F7000072017E70D213000FFF734FE2862069B5B +:104F80006B62D5E738000130800020184DE7C0463D +:104F90000000000010B50023FFF78CFE10BDC046D6 +:104FA00010B50123FFF786FE10BDC04610B50223E1 +:104FB000FFF780FE10BDC046F0B5CE46474680B52F +:104FC0000500C3B014001E00012955D000294BD0A4 +:104FD000032922D0042949D1002B47D1102A45D8D2 +:104FE000102203681A4200D0F1E020AF380000F030 +:104FF0003DF900230120A96B02009A40144203D01E +:105000000E689A00BE5004310133042BF4D13800ED +:10501000A96300F029F9002029E0032B26D114040C +:10502000230C160C9846F318102B1FD8082203687F +:105030001A4200D098E020AF380000F013F9424641 +:10504000AB6BF6001C00002A08D0D400F21A1C1921 +:10505000BA181968D15004339C42FAD1AC633800B5 +:1050600000F0FEF8002002E0002B24D0022043B024 +:105070000CBC90469946F0BD130C14049846240CC1 +:10508000012E2ED0052EF1D11B19202BEED8424631 +:105090000F2A70D9A146002C7ED1AA6B4346AA6381 +:1050A0000F2B00D89AE04B46002BDBD0684600F06F +:1050B000D3F80020DBE700231004A96B000C0136B5 +:1050C00032009A40104204D00F689A00AA18576024 +:1050D00004310133102BF3D10020A304C7D4A963FA +:1050E000C5E71B19102BC1D843460F2BBED82B6820 +:1050F0001E4206D00322280093432B60483000F064 +:10510000A5F820AF380000F0A1F8AA6B002C24D03D +:105110004346DB00FF180023994664000023A400E7 +:10512000D158F95004339C42FAD14B4612196F46BC +:10513000002B0FD04046102800D210204B46D9003B +:1051400000231038C0003818D458C4500433994292 +:10515000FAD15218012EA1D120AF04323800AA632F +:1051600000F072F8002082E7934303605130FF3073 +:1051700000F078F85FE7102B3BD91022524291469D +:1051800099442B68194208D0022228008B4313430C +:105190002B60483000F05EF82B6804221A4221D1BF +:1051A00043460F2B03D820AF380000F053F86F466A +:1051B000380000F053F810244346AA6BE41A002C80 +:1051C000B8DD434620AFDB006400FF18A6E7934339 +:1051D0000360D130FF3000F049F806E720A800F066 +:1051E00037F860E7280093432B60D03000F036F8A2 +:1051F000D6E72B680B4207D0022228008B431343CB +:105200002B60483000F026F820AF380000F022F87C +:10521000A146AA6B002C00D07AE73FE7011C34318D +:1052200038C9043B9C461D60A646011C20313CC980 +:1052300090469946A246AB46011C0831FCC941681C +:105240000068E54600BDC0467047C0467047C0468E +:105250007047C0467047C0467047C0467047C0465A +:105260007047C0467047C0467047C0467047C0464A +:1052700001B401A801B585B0FFB408A841464A466B +:1052800053465C4665463EC001A83EC80F98009054 +:1052900000230CB401A9FFF71DFC109B12B01847A6 +:1052A00001B401A801B585B0FFB408A841464A463B +:1052B00053465C4665463EC001A83EC80F98009024 +:1052C00000230CB401A9FFF739FC109B12B018475A +:1052D00001B401A801B585B0FFB408A841464A460B +:1052E00053465C4665463EC001A83EC80F980090F4 +:1052F00000230CB401A9FFF745FC109B12B018471E +:1053000001B401A801B585B0FFB408A841464A46DA +:1053100053465C4665463EC001A83EC80F980090C3 +:1053200000230CB401ABFFF7FFFB109B12B0184732 +:1053300001B401A801B585B0FFB408A841464A46AA +:1053400053465C4665463EC001A83EC80F98009093 +:1053500000230CB401AAFFF775FC109B12B018478C +:10536000027A0300002A0BD1427A002A0FD0013AB8 +:1053700042724268111D416003211268017202E00D +:10538000013A02720268100E12021A607047B020D1 +:10539000FCE7C04600B585B003AB00930C220023A8 +:1053A0000021FFF707FC039805B000BD10B5FFF71B +:1053B000F1FF10BDF0B557464E464546DE46002388 +:1053C000E0B587B003930F339846083B9946802396 +:1053D0001B0306000F009A463800FFF7C1FF0400C8 +:1053E000B02800D1C3E003062AD503004246934308 +:1053F000DBB2802B00D171E0902B3DD0A02B00D1EF +:1054000085E0B02B50D0C02B00D196E003004A4677 +:105410009343DBB2D02B0AD15346024001321A43E8 +:10542000052301213000FFF7C7FD0028D4D009244F +:10543000200007B03CBC90469946A246AB46F0BD62 +:10544000FF23820013401D1D05AB9B4600930D22D8 +:10545000002300213000FFF7ADFB630620D4059B3D +:105460009C46654405955B460D2200930021002370 +:105470003000FFF7C3FBAFE7833B03400D2BD6D0D3 +:1054800005AD02400095002300213000FFF792FB9C +:10549000009500230D2200213000FFF7AFFB9BE7B2 +:1054A000059B5D1B0595DEE7B12874D0B22800D1BD +:1054B000CFE0B32800D184E0FC230340B42BB6D066 +:1054C0004A465346024001321A430121012330006B +:1054D000FFF772FD002800D17EE7A8E7040238003C +:1054E000FFF73EFF802520432D02A8429FD00401F4 +:1054F0000005020C002300213000FFF75DFD0028AD +:1055000095D12C4200D167E70123039364E7FF2381 +:105510004A461B011900824311410A001A40030741 +:1055200002D58023DB011A43002300213000FFF75E +:1055300043FD002800D14FE779E7C6284CD0C728A3 +:105540005ED003004A469343DBB2C02B6DD0C8281F +:1055500072D0C92800D06AE73800FFF701FFF023B6 +:1055600002031B03134042460240013257E7039BEC +:105570000024002B00D05BE705AD00950E22002132 +:105580003000FFF717FB009500230F2200213000A9 +:10559000FFF734FB4CE73800FFF7E2FE002800D1AC +:1055A00045E7030042469343DBB2002B00D03EE7C1 +:1055B000020000213000FFF7FFFC002800D10BE7BC +:1055C00035E73800FFF7CCFEF02302031B0313403E +:1055D00042460240013277E73800FFF7C1FEF02370 +:1055E00002031B0313404246024001321A430323C5 +:1055F00003213000FFF7E0FC002800D1ECE616E7BD +:105600003800FFF7ADFE021E00D110E7030041464F +:105610008B43DBB2002B00D009E704213000FFF7F9 +:10562000CBFC002800D1D7E601E74346A0221C406E +:10563000013412032243DAE73800FFF791FE4346B4 +:1056400002009A43D2B210321840120301300243D2 +:10565000E6E605AB00939B460D22002300213000B7 +:10566000FFF7A8FA3800FFF77BFE030618D57F2561 +:10567000B03C059B2840A0409C4660440590380003 +:105680000734FFF76DFE0306F3D481217F238900E1 +:1056900003408C46A340059A62449B180593E2E6BA +:1056A0000224F2E7030000B5DB6C85B05A680800FD +:1056B000120201921A0001A908324A6003220A72FA +:1056C000DB794B72FFF776FE05B000BD10B5FFF732 +:1056D0006DFE806C10BDC04610B5FFF767FEC26C52 +:1056E000D3799B000833D01810BDC04610B500F028 +:1056F00005F8C04610B5FFF7F9FFC04610B5062003 +:1057000000F076F8012000F0A5F8C046F0B50F2AA9 +:1057100037D90D0005430C000300AD0735D1150046 +:10572000103D2D092E013618103627681F60676856 +:105730005F60A7689F60E7681034DF601033B34292 +:10574000F3D10F2401352D01491914404519032CBB +:105750001DD90023CE58EE500433E61A032EF9D893 +:105760000323043CA4080134A4001A402D1909198C +:10577000002A05D00023CC5CEC5401339342FAD1CB +:10578000F0BD0500002AF5D1FAE70500F2E7220096 +:10579000F8E7C04670B505000C001F2922D8B723D2 +:1057A0009B00C358002B0ED08A009B181A68002A51 +:1057B00009D0012A10D0511C10D0002120001960FE +:1057C0009047002070BD280000F030F82200010052 +:1057D000280000F017F8F5E70020F3E71623036030 +:1057E0000120EFE71623036001204042EAE7C046AC +:1057F00010B5034B01001868FFF7CCFF10BDC04681 +:1058000000000020002370B5074C050008001100BF +:10581000236000F017F8431C00D070BD2368002BF4 +:10582000FBD02B60F9E7C0463407002010B500F02C +:1058300001F810BD58220120014B40421A60704708 +:105840003407002058220120014B40421A60704763 +:1058500034070020FEE7C046F8B5C046F8B5C0469C +:1058600074B20181B0AB308000000000800A018179 +:10587000B0B0ABF0000000003F020181B0AB30805F +:105880000000000080060181B0B0ABF00000000015 +:1058900030EEFF7FB0B0B0807CEFFF7F01000000F2 +:1058A00028F0FF7FB0A90280BCF0FF7FB0B0A880D5 +:1058B00008F1FF7F0100000014F1FF7FB0B0AA8063 +:1058C00048F1FF7F9CFFFF7F08F2FF7F010000008F +:1058D00004F2FF7FAA3F398050F2FF7FB0B0A8806A +:1058E0005CF2FF7FB0B0AA809CF2FF7FB0B0A880CE +:1058F000B0F2FF7F01000000ACF2FF7FB0B0A880E3 +:10590000B4F2FF7F010000003CF3FF7FAA0FB280DA +:10591000A4F3FF7F58FFFF7F7CF6FF7FB0B0A88025 +:1059200098F6FF7F54FFFF7FF4F8FF7F010000002F +:1059300064FAFF7F0084048074FAFF7FB0B0A8800F +:1059400074FAFF7F40FFFF7F5CFDFF7F00840480CF +:105950007CFDFF7FB0B0A88094FDFF7F01000000B8 +:10596000080000200000000000000000F4020020F9 +:105970005C030020C40300200000000000000000C1 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A100001000000000000000E33CDAB34126DE633 +:105A2000ECDE05000B00000000000000000000009C +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:0400000508000805E2 :00000001FF diff --git a/firmware/build_stm6/inlretro_stm.map b/firmware/build_stm6/inlretro_stm.map index 54f71c6..ace8471 100644 --- a/firmware/build_stm6/inlretro_stm.map +++ b/firmware/build_stm6/inlretro_stm.map @@ -1,7 +1,7 @@ Archive member included to satisfy reference by file (symbol) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o (__aeabi_unwind_cpp_pr0) + C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o (__aeabi_unwind_cpp_pr0) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(libunwind.o) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) (restore_core_regs) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) @@ -51,9 +51,9 @@ c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) (_exit) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) - C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o (__gnu_thumb1_case_uqi) + C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o (__gnu_thumb1_case_uqi) c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) - C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o (__gnu_thumb1_case_uhi) + C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o (__gnu_thumb1_case_uhi) Allocating common symbols Common symbol size file @@ -133,39 +133,41 @@ Discarded input sections .ARM.exidx 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o .ARM.attributes 0x00000000 0x1b c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o - .text 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .data 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .bss 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .stack 0x00000000 0xc00 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .heap 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .debug_line 0x00000000 0x7c C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .debug_info 0x00000000 0x22 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .debug_abbrev 0x00000000 0x12 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o + .text 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .stack 0x00000000 0xc00 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .heap 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .debug_line 0x00000000 0x7c C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .debug_info 0x00000000 0x22 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .debug_abbrev 0x00000000 0x12 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o .debug_aranges - 0x00000000 0x28 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .debug_str 0x00000000 0x70 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .debug_ranges 0x00000000 0x20 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o + 0x00000000 0x28 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .debug_str 0x00000000 0x68 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .debug_ranges 0x00000000 0x20 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o .ARM.attributes - 0x00000000 0x1b C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o - .text 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .data 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .text 0x00000000 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .data 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .bss 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .ARM.extab 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .ARM.exidx 0x00000000 0x8 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .debug_line 0x00000000 0x49 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .debug_info 0x00000000 0x26 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .debug_abbrev 0x00000000 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o + 0x00000000 0x1b C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o + .text 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.snes_3v_buffer_wr + 0x00000000 0x2 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text 0x00000000 0x4 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .ARM.extab 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .ARM.exidx 0x00000000 0x8 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .debug_line 0x00000000 0x49 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .debug_info 0x00000000 0x26 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .debug_abbrev 0x00000000 0x14 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o .debug_aranges - 0x00000000 0x20 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .debug_str 0x00000000 0x6d C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o + 0x00000000 0x20 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .debug_str 0x00000000 0x65 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o .ARM.attributes - 0x00000000 0x21 C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o - .data 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o - .bss 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o - .ARM.extab 0x00000000 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o + 0x00000000 0x21 C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o + .ARM.extab 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) .debug_frame 0x00000000 0x2b4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) @@ -428,10 +430,10 @@ Linker script and memory map LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crti.o LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crtbegin.o LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o -LOAD C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o -LOAD C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o -LOAD C:\Users\PAUL_D~1\AppData\Local\Temp\ccYiu3Ln.o -LOAD C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o +LOAD C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o +LOAD C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o +LOAD C:\Users\paul\AppData\Local\Temp\cc0qRkgb.o +LOAD C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o START GROUP LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a @@ -445,17 +447,17 @@ END GROUP LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crtend.o LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crtn.o -.text 0x08000000 0x5740 +.text 0x08000000 0x5860 *(.isr_vector) - .isr_vector 0x08000000 0xc0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o + .isr_vector 0x08000000 0xc0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o 0x08000000 __isr_vector *(.usb_driver) - .usb_driver 0x080000c0 0x3bc C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .usb_driver 0x080000c0 0x3bc C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o 0x08000198 USB_IRQHandler *(.usb_desc) - .usb_desc 0x0800047c 0xb8 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .usb_desc 0x0800047c 0xb8 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *(.hardfault) - .hardfault 0x08000534 0x2 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o + .hardfault 0x08000534 0x2 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o 0x08000534 TIM1_CC_IRQHandler 0x08000534 TSC_IRQHandler 0x08000534 ADC1_COMP_IRQHandler @@ -494,7 +496,7 @@ LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eab 0x08000534 USART1_IRQHandler 0x08000534 TIM1_BRK_UP_TRG_COM_IRQHandler *fill* 0x08000536 0x2 ff - .hardfault 0x08000538 0xc C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .hardfault 0x08000538 0xc C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o 0x08000538 HardFault_Handler *_thumb1_case_uqi.o() .text 0x08000544 0x14 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) @@ -510,11 +512,11 @@ LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eab 0x0800058c 0x1e c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) *(.fw_update) *fill* 0x080005aa 0x2 ff - .fw_update 0x080005ac 0x150 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .fw_update 0x080005ac 0x150 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o 0x00000770 . = 0x770 *fill* 0x080006fc 0x74 ff *(.fw_up_main) - .fw_up_main 0x08000770 0x70 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .fw_up_main 0x08000770 0x70 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o 0x00000800 . = 0x800 *fill* 0x080007e0 0x20 ff *(.appver) @@ -522,187 +524,191 @@ LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eab *fill* 0x08000800 0x4 ff *(.reset_handler) .reset_handler - 0x08000804 0x3c C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o + 0x08000804 0x3c C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o 0x08000804 Reset_Handler *(.usbFuncWrite) - .usbFuncWrite 0x08000840 0x44 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .usbFuncWrite 0x08000840 0x44 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *(.usbFuncSetup) - .usbFuncSetup 0x08000884 0x1d04 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .usbFuncSetup 0x08000884 0x1d04 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *(.text*) .text.snes_page_rd_poll.constprop.29 - 0x08002588 0x7c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002588 0x70 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_cpu_page_rd_poll.constprop.28 - 0x08002604 0x6c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080025f8 0x6c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_ppu_page_rd_poll.constprop.25 - 0x08002670 0x68 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002664 0x68 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.append_pairity - 0x080026d8 0x1e C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080026cc 0x1e C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.delay_us - 0x080026f6 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - *fill* 0x0800270a 0x2 ff - .text.lfsr_32 0x0800270c 0x30 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .text.snes_wr 0x0800273c 0x60 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .text.snes_rd 0x0800279c 0x48 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .text.write_page_snes.constprop.34 - 0x080027e4 0x194 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080026ea 0x14 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + *fill* 0x080026fe 0x2 ff + .text.lfsr_32 0x08002700 0x30 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.snes_wr 0x08002730 0x60 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.snes_rd 0x08002790 0x48 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.write_page_snes.constprop.35 + 0x080027d8 0x194 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.write_page_buffer.constprop.34 + 0x0800296c 0x94 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.snes_3v_verify_wr + 0x08002a00 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.snes_3v_flash_wr - 0x08002978 0x50 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002a50 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.snes_5v_flash_wr - 0x080029c8 0x50 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002aa0 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.genesis_page_rd - 0x08002a18 0xa4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002af0 0xa4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc3s_prgrom_flash_wr - 0x08002abc 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002b94 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_dualport_wr - 0x08002ac0 0x50 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002b98 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_dualport_rd - 0x08002b10 0x38 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002be8 0x38 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_ppu_wr - 0x08002b48 0x50 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002c20 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_ppu_rd - 0x08002b98 0x38 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002c70 0x38 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc3_chrrom_flash_wr - 0x08002bd0 0x44 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002ca8 0x44 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nrom_chrrom_flash_wr - 0x08002c14 0x44 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002cec 0x44 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_m2_high_wr - 0x08002c58 0x60 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002d30 0x60 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_cpu_wr - 0x08002cb8 0x7c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002d90 0x7c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.cdream_chrrom_flash_wr - 0x08002d34 0x8c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002e0c 0x8c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc4_chrrom_flash_wr - 0x08002dc0 0x74 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002e98 0x74 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.cnrom_chrrom_flash_wr - 0x08002e34 0x7c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002f0c 0x7c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nes_cpu_rd - 0x08002eb0 0x38 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002f88 0x38 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.tssop_prgrom_flash_wr - 0x08002ee8 0x2a C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002fc0 0x2a C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.a53_tssop_prgrom_flash_wr - 0x08002f12 0x36 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08002fea 0x36 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.gtrom_prgrom_flash_wr - 0x08002f48 0x4c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003020 0x4c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.map30_prgrom_flash_wr - 0x08002f94 0x74 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x0800306c 0x74 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc4_prgrom_flash_wr - 0x08003008 0x54 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080030e0 0x54 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc3_prgrom_flash_wr - 0x0800305c 0x50 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003134 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.disc_push_exp0_prgrom_wr - 0x080030ac 0x48 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003184 0x48 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.discrete_exp0_prgrom_wr - 0x080030f4 0x58 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080031cc 0x58 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.unrom_prgrom_flash_wr - 0x0800314c 0x64 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003224 0x64 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.nrom_prgrom_flash_wr - 0x080031b0 0x44 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003288 0x44 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.n64_latch_addr - 0x080031f4 0x60 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080032cc 0x60 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.pbje_scan - 0x08003254 0x10c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x0800332c 0x10c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.pbje_state_change - 0x08003360 0x88 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003438 0x88 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.jtag_init_pbje - 0x080033e8 0xe0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080034c0 0xe0 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.jtag_run_pbje.part.0 - 0x080034c8 0xb8 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080035a0 0xb8 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.io_reset - 0x08003580 0x174 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .text.gba_rd 0x080036f4 0x4c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003658 0x174 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .text.gba_rd 0x080037cc 0x4c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.write_page_verify - 0x08003740 0x5c C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003818 0x5c C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.write_page - 0x0800379c 0x34 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003874 0x34 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.get_next_buff - 0x080037d0 0x54 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080038a8 0x54 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc1_wr.constprop.12 - 0x08003824 0x22 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - *fill* 0x08003846 0x2 ff + 0x080038fc 0x22 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + *fill* 0x0800391e 0x2 ff .text.mmc1_chrrom_flash_wr - 0x08003848 0x60 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003920 0x60 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.mmc1_prgrom_flash_wr - 0x080038a8 0x50 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003980 0x50 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.swim_wotf - 0x080038f8 0xb4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x080039d0 0xb4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.swim_rotf - 0x080039ac 0xac C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x08003a84 0xac C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .text.startup.main - 0x08003a58 0xb48 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - 0x08003a58 main - .text 0x080045a0 0x154 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o - 0x080045a0 swim_xfr - .text 0x080046f4 0xa08 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - 0x080049b0 _Unwind_GetCFA - 0x080049b4 __gnu_Unwind_RaiseException - 0x08004a08 __gnu_Unwind_ForcedUnwind - 0x08004a1c __gnu_Unwind_Resume - 0x08004a64 __gnu_Unwind_Resume_or_Rethrow - 0x08004a80 _Unwind_Complete - 0x08004a84 _Unwind_DeleteException - 0x08004a94 _Unwind_VRS_Get - 0x08004adc _Unwind_VRS_Set - 0x08004b24 __gnu_Unwind_Backtrace - 0x08004e74 __aeabi_unwind_cpp_pr0 - 0x08004e80 __aeabi_unwind_cpp_pr1 - 0x08004e8c __aeabi_unwind_cpp_pr2 - 0x08004e98 _Unwind_VRS_Pop - .text 0x080050fc 0x144 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(libunwind.o) - 0x080050fc __restore_core_regs - 0x080050fc restore_core_regs - 0x08005128 __gnu_Unwind_Restore_VFP - 0x0800512c __gnu_Unwind_Save_VFP - 0x08005130 __gnu_Unwind_Restore_VFP_D - 0x08005134 __gnu_Unwind_Save_VFP_D - 0x08005138 __gnu_Unwind_Restore_VFP_D_16_to_31 - 0x0800513c __gnu_Unwind_Save_VFP_D_16_to_31 - 0x08005140 __gnu_Unwind_Restore_WMMXD - 0x08005144 __gnu_Unwind_Save_WMMXD - 0x08005148 __gnu_Unwind_Restore_WMMXC - 0x0800514c __gnu_Unwind_Save_WMMXC - 0x08005150 ___Unwind_RaiseException - 0x08005150 _Unwind_RaiseException - 0x08005180 _Unwind_Resume - 0x08005180 ___Unwind_Resume - 0x080051b0 _Unwind_Resume_or_Rethrow - 0x080051b0 ___Unwind_Resume_or_Rethrow - 0x080051e0 _Unwind_ForcedUnwind - 0x080051e0 ___Unwind_ForcedUnwind - 0x08005210 ___Unwind_Backtrace - 0x08005210 _Unwind_Backtrace - .text 0x08005240 0x39c c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) - 0x08005294 __gnu_unwind_execute - 0x08005584 __gnu_unwind_frame - 0x080055ac _Unwind_GetRegionStart - 0x080055b8 _Unwind_GetLanguageSpecificData - 0x080055cc _Unwind_GetDataRelBase - 0x080055d4 _Unwind_GetTextRelBase - .text.abort 0x080055dc 0x10 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - 0x080055dc abort - .text.memcpy 0x080055ec 0x88 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - 0x080055ec memcpy + 0x08003b30 0xb90 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + 0x08003b30 main + .text 0x080046c0 0x154 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o + 0x080046c0 swim_xfr + .text 0x08004814 0xa08 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) + 0x08004ad0 _Unwind_GetCFA + 0x08004ad4 __gnu_Unwind_RaiseException + 0x08004b28 __gnu_Unwind_ForcedUnwind + 0x08004b3c __gnu_Unwind_Resume + 0x08004b84 __gnu_Unwind_Resume_or_Rethrow + 0x08004ba0 _Unwind_Complete + 0x08004ba4 _Unwind_DeleteException + 0x08004bb4 _Unwind_VRS_Get + 0x08004bfc _Unwind_VRS_Set + 0x08004c44 __gnu_Unwind_Backtrace + 0x08004f94 __aeabi_unwind_cpp_pr0 + 0x08004fa0 __aeabi_unwind_cpp_pr1 + 0x08004fac __aeabi_unwind_cpp_pr2 + 0x08004fb8 _Unwind_VRS_Pop + .text 0x0800521c 0x144 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(libunwind.o) + 0x0800521c __restore_core_regs + 0x0800521c restore_core_regs + 0x08005248 __gnu_Unwind_Restore_VFP + 0x0800524c __gnu_Unwind_Save_VFP + 0x08005250 __gnu_Unwind_Restore_VFP_D + 0x08005254 __gnu_Unwind_Save_VFP_D + 0x08005258 __gnu_Unwind_Restore_VFP_D_16_to_31 + 0x0800525c __gnu_Unwind_Save_VFP_D_16_to_31 + 0x08005260 __gnu_Unwind_Restore_WMMXD + 0x08005264 __gnu_Unwind_Save_WMMXD + 0x08005268 __gnu_Unwind_Restore_WMMXC + 0x0800526c __gnu_Unwind_Save_WMMXC + 0x08005270 ___Unwind_RaiseException + 0x08005270 _Unwind_RaiseException + 0x080052a0 _Unwind_Resume + 0x080052a0 ___Unwind_Resume + 0x080052d0 _Unwind_Resume_or_Rethrow + 0x080052d0 ___Unwind_Resume_or_Rethrow + 0x08005300 _Unwind_ForcedUnwind + 0x08005300 ___Unwind_ForcedUnwind + 0x08005330 ___Unwind_Backtrace + 0x08005330 _Unwind_Backtrace + .text 0x08005360 0x39c c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) + 0x080053b4 __gnu_unwind_execute + 0x080056a4 __gnu_unwind_frame + 0x080056cc _Unwind_GetRegionStart + 0x080056d8 _Unwind_GetLanguageSpecificData + 0x080056ec _Unwind_GetDataRelBase + 0x080056f4 _Unwind_GetTextRelBase + .text.abort 0x080056fc 0x10 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + 0x080056fc abort + .text.memcpy 0x0800570c 0x88 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + 0x0800570c memcpy .text._raise_r - 0x08005674 0x5c c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - 0x08005674 _raise_r - .text.raise 0x080056d0 0x14 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - 0x080056d0 raise - .text._kill_r 0x080056e4 0x28 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - 0x080056e4 _kill_r + 0x08005794 0x5c c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x08005794 _raise_r + .text.raise 0x080057f0 0x14 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x080057f0 raise + .text._kill_r 0x08005804 0x28 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + 0x08005804 _kill_r .text._getpid_r - 0x0800570c 0x8 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - 0x0800570c _getpid_r - .text._getpid 0x08005714 0x10 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - 0x08005714 _getpid - .text._kill 0x08005724 0x10 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - 0x08005724 _kill - .text._exit 0x08005734 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - 0x08005734 _exit + 0x0800582c 0x8 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + 0x0800582c _getpid_r + .text._getpid 0x08005834 0x10 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + 0x08005834 _getpid + .text._kill 0x08005844 0x10 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + 0x08005844 _kill + .text._exit 0x08005854 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + 0x08005854 _exit *(.init) - .init 0x08005738 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crti.o - 0x08005738 _init + .init 0x08005858 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crti.o + 0x08005858 _init *(.fini) - .fini 0x0800573c 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crti.o - 0x0800573c _fini + .fini 0x0800585c 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crti.o + 0x0800585c _fini *crtbegin.o(.ctors) *crtbegin?.o(.ctors) *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) @@ -716,42 +722,42 @@ LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eab *(.rodata*) *(.eh_frame*) -.glue_7 0x08005740 0x0 - .glue_7 0x08005740 0x0 linker stubs +.glue_7 0x08005860 0x0 + .glue_7 0x08005860 0x0 linker stubs -.glue_7t 0x08005740 0x0 - .glue_7t 0x08005740 0x0 linker stubs +.glue_7t 0x08005860 0x0 + .glue_7t 0x08005860 0x0 linker stubs -.vfp11_veneer 0x08005740 0x0 - .vfp11_veneer 0x08005740 0x0 linker stubs +.vfp11_veneer 0x08005860 0x0 + .vfp11_veneer 0x08005860 0x0 linker stubs -.v4_bx 0x08005740 0x0 - .v4_bx 0x08005740 0x0 linker stubs +.v4_bx 0x08005860 0x0 + .v4_bx 0x08005860 0x0 linker stubs -.iplt 0x08005740 0x0 - .iplt 0x08005740 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o +.iplt 0x08005860 0x0 + .iplt 0x08005860 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o -.ARM.extab 0x08005740 0x30 +.ARM.extab 0x08005860 0x30 *(.ARM.extab* .gnu.linkonce.armextab.*) - .ARM.extab 0x08005740 0x24 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - .ARM.extab 0x08005764 0xc c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) - 0x08005770 __exidx_start = . + .ARM.extab 0x08005860 0x24 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .ARM.extab 0x08005884 0xc c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) + 0x08005890 __exidx_start = . -.ARM.exidx 0x08005770 0xd0 +.ARM.exidx 0x08005890 0xd0 *(.ARM.exidx* .gnu.linkonce.armexidx.*) - .ARM.exidx 0x08005770 0x8 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o + .ARM.exidx 0x08005890 0x8 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o 0x10 (size before relaxing) - .ARM.exidx 0x08005778 0x98 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .ARM.exidx 0x08005898 0x98 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) 0xd8 (size before relaxing) - .ARM.exidx 0x08005810 0x30 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) + .ARM.exidx 0x08005930 0x30 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m\libgcc.a(pr-support.o) 0x48 (size before relaxing) - 0x08005840 __exidx_end = . - 0x08005840 __etext = ALIGN (0x4) + 0x08005960 __exidx_end = . + 0x08005960 __etext = ALIGN (0x4) -.rel.dyn 0x08005840 0x0 - .rel.iplt 0x08005840 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o +.rel.dyn 0x08005960 0x0 + .rel.iplt 0x08005960 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o -.data 0x20000000 0x430 load address 0x08005840 +.data 0x20000000 0x430 load address 0x08005960 0x20000000 __data_start__ = . *(vtable) *(.data*) @@ -779,77 +785,77 @@ LOAD c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eab *(.fastrun) 0x20000430 __data_end__ = . -.igot.plt 0x20000430 0x0 load address 0x08005c70 - .igot.plt 0x20000430 0x0 C:\Users\PAUL_D~1\AppData\Local\Temp\ccOm59Pi.o +.igot.plt 0x20000430 0x0 load address 0x08005d90 + .igot.plt 0x20000430 0x0 C:\Users\paul\AppData\Local\Temp\ccOqsUkN.o -.bss 0x20000430 0x308 load address 0x08005c70 +.bss 0x20000430 0x308 load address 0x08005d90 0x20000430 . = ALIGN (0x4) 0x20000430 __bss_start__ = . *(.bss*) - .bss.addr_ptr 0x20000430 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.addrh 0x20000434 0x2 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.addr_ptr 0x20000430 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.addrh 0x20000434 0x2 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.bank_table - 0x20000436 0x2 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.buff0 0x20000438 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.buff1 0x2000044c 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.buff2 0x20000460 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.buff3 0x20000474 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x20000436 0x2 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.buff0 0x20000438 0x14 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.buff1 0x2000044c 0x14 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.buff2 0x20000460 0x14 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.buff3 0x20000474 0x14 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.cur_addr_hi - 0x20000488 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x20000488 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000489 0x1 .bss.cur_addr_lo - 0x2000048a 0x2 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.cur_bank 0x2000048c 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x2000048a 0x2 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.cur_bank 0x2000048c 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x2000048d 0x3 - .bss.cur_buff 0x20000490 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.cur_buff 0x20000490 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.cur_usb_load_buff - 0x20000494 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x20000494 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.incoming_bytes_remain - 0x20000498 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x20000498 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000499 0x3 - .bss.lfsr 0x2000049c 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.n64_bank 0x200004a0 0x2 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.num_buff.5134 - 0x200004a2 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.lfsr 0x2000049c 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.n64_bank 0x200004a0 0x2 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.num_buff.5143 + 0x200004a2 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.num_prg_banks - 0x200004a3 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004a3 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.oper_info_struct - 0x200004a4 0x20 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004a4 0x20 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.pbje_command - 0x200004c4 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004c4 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.pbje_data - 0x200004c5 0x20 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004c5 0x20 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.pbje_numclk - 0x200004e5 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004e5 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.pbje_status - 0x200004e6 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004e6 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.raw_bank_status - 0x200004e7 0x10 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004e7 0x10 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x200004f7 0x1 .bss.raw_buffer16 - 0x200004f8 0x200 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.rv16.4756 - 0x200006f8 0x8 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.rv16.5054 - 0x20000700 0x8 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x200004f8 0x200 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.rv16.4759 + 0x200006f8 0x8 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.rv16.5063 + 0x20000700 0x8 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .bss.stm_debug_disable - 0x20000708 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x20000708 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000709 0x3 .bss.swim_base - 0x2000070c 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.swim_pin 0x20000710 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x2000070c 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.swim_pin 0x20000710 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000711 0x3 - .bss.tck_base 0x20000714 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.tck_pin 0x20000718 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.tck_base 0x20000714 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.tck_pin 0x20000718 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000719 0x3 - .bss.tdi_base 0x2000071c 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.tdi_pin 0x20000720 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.tdi_base 0x2000071c 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.tdi_pin 0x20000720 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000721 0x3 - .bss.tdo_base 0x20000724 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.tdo_pin 0x20000728 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.tdo_base 0x20000724 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.tdo_pin 0x20000728 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *fill* 0x20000729 0x3 - .bss.tms_base 0x2000072c 0x4 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .bss.tms_pin 0x20000730 0x1 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .bss.tms_base 0x2000072c 0x4 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .bss.tms_pin 0x20000730 0x1 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o *(COMMON) *fill* 0x20000731 0x3 COMMON 0x20000734 0x4 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) @@ -876,45 +882,45 @@ OUTPUT(build_stm/inlretro_stm.elf elf32-littlearm) .ARM.attributes 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m/crti.o .ARM.attributes - 0x0000001e 0x2f C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x0000001e 0x2f C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .ARM.attributes - 0x0000004d 0x21 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o + 0x0000004d 0x21 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o .comment 0x00000000 0x7f - .comment 0x00000000 0x7f C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + .comment 0x00000000 0x7f C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o 0x80 (size before relaxing) -.debug_info 0x00000000 0x57e5 - .debug_info 0x00000000 0x57bf C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .debug_info 0x000057bf 0x26 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o +.debug_info 0x00000000 0x5b65 + .debug_info 0x00000000 0x5b3f C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .debug_info 0x00005b3f 0x26 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o -.debug_abbrev 0x00000000 0x6ba - .debug_abbrev 0x00000000 0x6a6 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .debug_abbrev 0x000006a6 0x14 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o +.debug_abbrev 0x00000000 0x6c9 + .debug_abbrev 0x00000000 0x6b5 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .debug_abbrev 0x000006b5 0x14 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o -.debug_loc 0x00000000 0x8e80 - .debug_loc 0x00000000 0x8e80 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o +.debug_loc 0x00000000 0x910b + .debug_loc 0x00000000 0x910b C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o -.debug_aranges 0x00000000 0x218 +.debug_aranges 0x00000000 0x230 .debug_aranges - 0x00000000 0x1f8 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o + 0x00000000 0x210 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .debug_aranges - 0x000001f8 0x20 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o + 0x00000210 0x20 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o -.debug_ranges 0x00000000 0xe08 - .debug_ranges 0x00000000 0xe08 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o +.debug_ranges 0x00000000 0xe20 + .debug_ranges 0x00000000 0xe20 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o -.debug_line 0x00000000 0x1bfa - .debug_line 0x00000000 0x1b07 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - .debug_line 0x00001b07 0xf3 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o +.debug_line 0x00000000 0x1c72 + .debug_line 0x00000000 0x1b7f C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + .debug_line 0x00001b7f 0xf3 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o -.debug_str 0x00000000 0x12b2 - .debug_str 0x00000000 0x1249 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o - 0x1384 (size before relaxing) - .debug_str 0x00001249 0x69 C:\Users\PAUL_D~1\AppData\Local\Temp\cc21n1gw.o +.debug_str 0x00000000 0x12e0 + .debug_str 0x00000000 0x127f C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o + 0x13b2 (size before relaxing) + .debug_str 0x0000127f 0x61 C:\Users\paul\AppData\Local\Temp\ccCWXcVB.o -.debug_frame 0x00000000 0x658 - .debug_frame 0x00000000 0x658 C:\Users\PAUL_D~1\AppData\Local\Temp\ccu17E4l.ltrans0.ltrans.o +.debug_frame 0x00000000 0x6a8 + .debug_frame 0x00000000 0x6a8 C:\Users\paul\AppData\Local\Temp\ccGCpWvS.ltrans0.ltrans.o .stabstr 0x00000000 0x76 .stabstr 0x00000000 0x76 c:/arm/gcc-arm-none-eabi-7-2018-q2-update-win32/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) diff --git a/firmware/source/flash.c b/firmware/source/flash.c index e6d3943..fe83742 100644 --- a/firmware/source/flash.c +++ b/firmware/source/flash.c @@ -56,6 +56,66 @@ uint8_t write_page_verify( uint8_t addrH, buffer *buff, write_rv_funcptr wr_func return SUCCESS; } +uint8_t write_page_buffer( uint8_t addrH, buffer *buff, write_funcptr_pg wr_func ) +{ + uint16_t cur = buff->cur_byte; + uint8_t n = buff->cur_byte; + uint8_t i; + uint8_t rv; + uint8_t rv1; +// uint8_t read; +// + + uint16_t addr = addrH<<8; + + + while ( cur <= buff->last_idx ) { + + // wr_func( ((addrH<<8)| n), &(buff->data[n]) ); + //write function returns when it's complete or errors out + + //unlock and write data + snes_wr(0x8AAA, 0xAA, 0); + snes_wr(0x8555, 0x55, 0); + //write buffer write to SA + snes_wr(addr|n, 0x25, 0); + //write number of words - 1 to SA + snes_wr(addr|n, 31, 0); + + //write first data to first address, then write others to their address + //snes_wr(addr|n, data, 0); + + //write 31 more bytes of data + for (i=0;i<32;i++) { + snes_wr(addr+i+n, buff->data[n+i], 0); + } + + //write program buffer command + snes_wr(addr|n, 0x29, 0); + + //LED_IP_PU(); + //LED_LO(); + //LED_OP(); + //LED_HI(); + + do { + rv = snes_rd(addr, 0); + rv1 = snes_rd(addr, 0); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + //wdt_reset(); + ////} while (rv != snes_rd(addr, 0)); + } while (rv != rv1); + + //n++; + n +=32; + cur += 32; + } + buff->cur_byte = n; + + //TODO error check/report + return SUCCESS; +} + //only used by cninja currently.. uint8_t write_page_cninja( uint8_t bank, uint8_t addrH, uint16_t unlock1, uint16_t unlock2, buffer *buff, write_funcptr wr_func, read_funcptr rd_func ) @@ -569,6 +629,22 @@ uint8_t flash_buff( buffer *buff ) { //HIROM banks start at $XX:0000 write_page( addrH, buff, snes_3v_flash_wr); } + if (buff->mapper == LOROM_3V_VERIFY) { + //LOROM banks start at $XX:8000 + write_page_verify( addrH+0x80, buff, snes_3v_verify_wr); + } + if (buff->mapper == HIROM_3V_VERIFY) { + //HIROM banks start at $XX:0000 + write_page_verify( addrH, buff, snes_3v_verify_wr); + } + if (buff->mapper == LOROM_3V_PAGE) { + //LOROM banks start at $XX:8000 + write_page_buffer( addrH+0x80, buff, snes_3v_buffer_wr); + } + if (buff->mapper == HIROM_3V_PAGE) { + //HIROM banks start at $XX:0000 + write_page_buffer( addrH, buff, snes_3v_buffer_wr); + } if (buff->mapper == LOROM) { addrH |= 0x80; //$8000 LOROM space diff --git a/firmware/source/io.c b/firmware/source/io.c index c475ef3..7393794 100644 --- a/firmware/source/io.c +++ b/firmware/source/io.c @@ -476,7 +476,7 @@ void sega_init() // HADDR_ENABLE(); // HADDR_IP(); // HADDR_PU(); - DATA16_ENABLE(); + //TODO ERROR DATA16_ENABLE(); // DATA16_IP(); // DATA16_PU(); @@ -582,7 +582,7 @@ uint8_t swim_init( uint8_t swim_lane ) EXP0_HI(); //set output high (deasserted) EXP0_OP(); //enable as output to have above take effect #endif - swim_pin = EXP0_; + swim_pin = EXP0; swim_base = EXP0bank; //swim_mask = 1<>8; + //GET & SET ARRAY DATA, miscdata defines first byte index + case SET_2B_DATA: pbje_data[miscdata] = operand; + pbje_data[miscdata+1] = operand>>8; break; - case GET_6B_DATA: rdata[RD0] = pbje_data[0]; - rdata[RD1] = pbje_data[1]; - rdata[RD2] = pbje_data[2]; - rdata[RD3] = pbje_data[3]; - rdata[RD4] = pbje_data[4]; - rdata[RD5] = pbje_data[5]; - rdata[RD_LEN] = 6; + case GET_8B_DATA: //copy over 8B of data starting at miscdata index + for (temp=RD0; temp<(RD0+8); temp++) { + rdata[temp] = pbje_data[temp-RD0+miscdata]; + } + + rdata[RD_LEN] = 8; + break; + case GET_32B_DATA: + //copy over 32B of data + for (temp=RD0; temp<(RD0+32); temp++) { + rdata[temp] = pbje_data[temp-RD0]; + } + + rdata[RD_LEN] = 32; break; @@ -100,6 +115,7 @@ uint8_t jtag_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t * } +//NOTE! MUST INITIALIZE JTAG in io.c before calling!!!! void jtag_init_pbje() { uint8_t i; @@ -125,15 +141,11 @@ void jtag_init_pbje() exp_byte = 0; EXP_SET(exp_byte); #endif + //enable TDO as input TDO_IP_PU(); - //PBJE initialization - //set status & command to INIT - pbje_status = PBJE_INIT; - //only the host writes to command - //pbje_command = PBJE_INIT; //set NUM_CLK to max this engine can clock based on DATA_ARRAY bit size pbje_numclk = 0; //byte variable, 0 -> 256 @@ -143,6 +155,13 @@ void jtag_init_pbje() pbje_data[i] = 0; } + //SET STATE LAST to signal complete + //PBJE initialization + //set status & command to INIT + pbje_status = PBJE_INIT; + //only the host writes to command + //pbje_command = PBJE_INIT; + } //actual JTAG engine diff --git a/firmware/source/pinport_al.h b/firmware/source/pinport_al.h index 27ad045..668474d 100644 --- a/firmware/source/pinport_al.h +++ b/firmware/source/pinport_al.h @@ -19,7 +19,8 @@ #define NES_CONN //famicom isn't actually present but a pin adapter should work #endif -#if defined(STM_INL6) || defined(STM_INL6_PROTO) +//#if defined(STM_INL6) || defined(STM_INL6_PROTO) +#if defined(STM_INL6) #define NES_CONN //includes famicom as definitions are effectively the same #define SNES_CONN #define SEGA_CONN @@ -27,6 +28,14 @@ #define N64_CONN #endif +#if defined(STM_INL6_PROTO) + #define NES_CONN //includes famicom as definitions are effectively the same + #define SNES_CONN +// #define SEGA_CONN //don't feel like fixing these definitions right now.. + #define GB_CONN + #define N64_CONN +#endif + #ifdef AVR_CORE #include "avr_gpio.h" #include @@ -1510,7 +1519,7 @@ void software_AXL_CLK(); // // --------------------------------------------------------------------------------------- -#if defined (STM_INL6_PROTO) || defined(STM_INL6) +#if STM_INL6_PROTO // PE0 "A0" mcupinC0 #define E0bank GPIOC @@ -1533,10 +1542,36 @@ void software_AXL_CLK(); #define E4 (12U) -#endif //STM_INL6 & PROTO +#endif //STM_INL6_PROTO + +#ifdef STM_INL6 + + // PE0 "A0" mcupinC0 + #define E0bank GPIOC + #define E0 (0U) + + // PE1 "D0" mcupinB8 + #define E1bank GPIOB + #define E1 (8U) + + // PE2 "D8" mcupinB2 + #define E2bank GPIOB + #define E2 (2U) + + // PE3 "D9" mcupinB3 + #define E3bank GPIOB + #define E3 (3U) + + // PE4 "D10" mcupinB4 + #define E4bank GPIOB + #define E4 (4U) + +#endif //STM_INL6 + #ifdef STM_NES //TODO BLINDLY COPIED FROM STM6, will not work AS-IS +//TODO actually do this // PE0 "A0" mcupinB2 // TODO!!! diff --git a/firmware/source/snes.c b/firmware/source/snes.c index 8732b31..4e5ca10 100644 --- a/firmware/source/snes.c +++ b/firmware/source/snes.c @@ -258,12 +258,13 @@ uint8_t snes_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t romsel, uint8_t } //gameboy needed some extra NOPS - NOP(); - NOP(); - NOP(); - NOP(); - NOP(); - NOP(); + //I cut these back out because didn't want the delay in SNES +// NOP(); +// NOP(); +// NOP(); +// NOP(); +// NOP(); +// NOP(); //latch data DATA_RD(data[i]); @@ -338,5 +339,67 @@ void snes_3v_flash_wr( uint16_t addr, uint8_t data ) return; } +/* Desc:SNES 3v ROM FLASH VERIFY Write + * NOTE: /ROMSEL is always taken low + * NOTE: if the byte isn't erased it will stop over current value + * NOTE: doesn't hang if write fails, just returns, goal is to be fast + * Pre: snes_init() setup of io pins + * desired bank must already be selected + * Post:Byte written and ready for another write + * Rtn: None + */ +uint8_t snes_3v_verify_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + snes_wr(0x8AAA, 0xAA, 0); + snes_wr(0x8555, 0x55, 0); + snes_wr(0x8AAA, 0xA0, 0); + snes_wr(addr, data, 0); + + do { + rv = snes_rd(addr, 0); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != snes_rd(addr, 0)); + + return rv; +} + +/* Desc:SNES 3v ROM FLASH BUFFER Write 32Bytes at a time + * NOTE: /ROMSEL is always taken low + * NOTE: if the byte isn't erased it will stop over current value + * NOTE: doesn't hang if write fails, just returns, goal is to be fast + * Pre: snes_init() setup of io pins + * desired bank must already be selected + * Post:Byte written and ready for another write + * Rtn: None + */ +void snes_3v_buffer_wr( uint16_t addr, uint8_t *data ) +{ + + /* TODO, actually implement this, currently everything is done on flash.c side + uint8_t rv; + + //unlock and write data + snes_wr(0x8AAA, 0xAA, 0); + snes_wr(0x8555, 0x55, 0); + //write buffer write to SA + snes_wr(addr, 0x25, 0); + //write number of words - 1 to SA + + //write first data to first address + snes_wr(addr, data[1], 0); + + do { + rv = snes_rd(addr, 0); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != snes_rd(addr, 0)); + + return; + */ +} + #endif //SNES_CONN diff --git a/firmware/source/snes.h b/firmware/source/snes.h index 92a95a2..09bb28a 100644 --- a/firmware/source/snes.h +++ b/firmware/source/snes.h @@ -14,5 +14,7 @@ uint8_t snes_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t romsel, uint8_t void snes_5v_flash_wr( uint16_t addr, uint8_t data ); void snes_3v_flash_wr( uint16_t addr, uint8_t data ); +uint8_t snes_3v_verify_wr( uint16_t addr, uint8_t data ); +void snes_3v_buffer_wr( uint16_t addr, uint8_t *data ); #endif diff --git a/firmware/source/types.h b/firmware/source/types.h index c20ff0f..3d37104 100644 --- a/firmware/source/types.h +++ b/firmware/source/types.h @@ -15,6 +15,7 @@ typedef struct setup_packet{ //typedef void (*write_funcptr) ( uint8_t addrH, uint8_t addrL, uint8_t data ); //typedef uint8_t (*read_funcptr) ( uint8_t addrH, uint8_t addrL ); typedef void (*write_funcptr) ( uint16_t addr, uint8_t data ); +typedef void (*write_funcptr_pg) ( uint16_t addr, uint8_t *data ); typedef uint8_t (*write_rv_funcptr) ( uint16_t addr, uint8_t data ); typedef uint8_t (*read_funcptr) ( uint16_t addr ); typedef void (*write_snes_funcptr) ( uint16_t addr, uint8_t data, uint8_t romsel ); diff --git a/firmware/source_stm_only/usb_descriptors.h b/firmware/source_stm_only/usb_descriptors.h index c52907a..2b31f7a 100644 --- a/firmware/source_stm_only/usb_descriptors.h +++ b/firmware/source_stm_only/usb_descriptors.h @@ -278,6 +278,7 @@ USBDESC const uint16_t string2_desc[STRING2_DESC_LEN] = { // 1 bDescriptorType 1 Constant String Descriptor (0x03) ((uint16_t)DESC_TYPE_STRING<<8 | STRING2_DESC_LEN), // 2 bString n Unicode Unicode Encoded String -'I','N','L',' ','R','e','t','r','o','-','P','r','o','g'}; +'I','N','L',' ','R','e','t','r','o','-','P','r','o','g'}; //normal +//'I','N','L',' ','R','e','t','r','o','-','P','r','o','4'}; //numbered devices for mutliple on one machine #endif diff --git a/host/scripts/app/ciccom.lua b/host/scripts/app/ciccom.lua index fdb789a..d3c491d 100644 --- a/host/scripts/app/ciccom.lua +++ b/host/scripts/app/ciccom.lua @@ -5,12 +5,18 @@ local ciccom = {} -- import required modules local dict = require "scripts.app.dict" local time = require "scripts.app.time" +local help = require "scripts.app.help" -- file constants --local resetpin = "AFL" --v2.0 --local datapin = "GBP" --v2.0 -local resetpin = "SWC" --v2.0N -local datapin = "FREE" --v2.0N +--local resetpin = "SWC" --v2.0N +--local datapin = "FREE" --v2.0N + +--SNES v3.3 +local resetpin = "AFL" --v2.0 +local datapin = "SWC" --v2.0 +--TODO move clock pin to a define & have the reset/data defines set based on the device -- local functions local function start( debug ) @@ -63,125 +69,72 @@ local function start( debug ) dict.pinport( "CTL_SET_HI", resetpin) --CIC is now waiting for data to be clocked in using CIC CLK & KEY_DATA_OUT + --CIC will latch data on rising edges of CLK return end +local function output_bit7(byte, debug) + + if (byte & 0x80 == 0x80) then --output one/high + if debug then print ("output 1/HI") end + dict.pinport( "CTL_SET_HI", datapin) + dict.pinport( "ADDR_SET", 1) + dict.pinport( "ADDR_SET", 0) + + else --output zero/low + if debug then print ("output 0/LO") end + dict.pinport( "CTL_SET_LO", datapin) + dict.pinport( "ADDR_SET", 1) + dict.pinport( "ADDR_SET", 0) + end +end + +local function byte_to_ciccom(byte, debug) + + local cnt = 8 + + while cnt > 0 do + if debug then print("outputting bit7 of:", help.hex(byte)) end + output_bit7(byte, debug) + byte = (byte << 1) & 0xFF + cnt = cnt - 1 + end + +end + +local function char_to_ciccom( char, debug) + byte_to_ciccom(string.byte(char), debug) +end + local function set_opcode(opcode) --KEY DATA IN is clocked in on rising edges of CIC CLK --"M" 0x4D (0b0100_1101 needs to be written to CIC to cause it to toggle mirroring --MSbit is latched first - if opcode == "M" then - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) + char_to_ciccom(opcode) - end - --now that "M" is written to CIC, end OPCODE write sequence by taking CIC RESET LO + --now that opcode (ie "M") is written to CIC, end OPCODE write sequence by taking CIC RESET LO dict.pinport( "CTL_SET_LO", resetpin) end -local function write(data) +local function write(data, debug) + --debug = true --now send operand "V" (0x56) or "H" (0x48) - - if data == "H" then - --HORIZONTAL - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - elseif data == "V" then - - --VERTICAL - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_HI", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) - - dict.pinport( "CTL_SET_LO", datapin) - dict.pinport( "ADDR_SET", 1) - dict.pinport( "ADDR_SET", 0) + if debug then print("ciccom write is type:", type(data)) end + if type(data) == 'number' then + if debug then print("writting number/byte") end + byte_to_ciccom(data, debug) + else + if debug then print("writting character") end + char_to_ciccom(data, debug) end end @@ -197,6 +150,8 @@ end ciccom.start = start ciccom.set_opcode = set_opcode ciccom.write = write +ciccom.byte_to_ciccom = byte_to_ciccom +ciccom.char_to_ciccom = char_to_ciccom ciccom.wotf = wotf ciccom.rotf = rotf diff --git a/host/scripts/app/files.lua b/host/scripts/app/files.lua index b39046f..e5cb714 100644 --- a/host/scripts/app/files.lua +++ b/host/scripts/app/files.lua @@ -9,6 +9,23 @@ local help = require "scripts.app.help" -- local functions +-- file must already be open for writting in binary mode +-- read from something like the cart and get a number +-- send that number here to write to the file in binary (interpret as an ascii char) +local function wr_bin_byte(file, data) + data = data & 0x00FF --negative and overly large ints need trimmed to 8bits + file:write(string.char( data )) +end + +--always forget how to read a byte from a file even though it's super simple... +--file must already be open for reading in binary mode +local function rd_bin_byte(file, debug) + + --TODO test & support reading more than 1 byte + local num_bytes = 1 + + return string.byte(file:read(num_bytes)) +end --compare the two files return true if identical --files should be closed prior to calling, files are closed after compared @@ -84,6 +101,106 @@ local function compare(filename1, filename2, size_must_equal, debug) end +--reads file until finds a line that includes the token string +--the line with the token is consumed, the next line that you read from the +--file will be the line that follows the line with the token +--Created to find L00000 line in jedec files +--RETURN: the line in string format that matched the token +--addition of returning the string allows for verification of the user code +local function readtill_line(file, token, debug) + + --local temp = string.byte(file:read(10)) + local temp_line = "notnil" --= file:read("*line") + local line_num = 0 + if debug then print("finding:", token) end + + --while line_num < 100 do + local found_token = false + while not found_token do + + temp_line = file:read("*line") + line_num = line_num + 1 + -- if debug then print("line num", line_num, "reads:", temp_line) end + + if temp_line then + if string.find(temp_line, token) then + if debug then print("found token in line num", line_num, "reads:", temp_line) end + found_token = true + end + else + print("reached end of file, could not find token", token) + return nil + end + + end +-- temp = file:read("*line") +-- if debug then print("next line:", temp) end + + return temp_line + +end + +local function nextline(file) + return file:read("*line") +end + +--read 3 lines from jedec file and convert from binary to hex string +--input: +--10111111111001111111000111111111111111111111111111111110001111110000111110100000 +--00011110110000110001100010000111111111111000110001111100000111111111100000111111 +--111111111111 +--output: +--FFFFC1FF83E31FFE118C37805F0FC7FFFFFFF8FE7FD +local function jedec_3ln_2hexstr(file, debug) + local line1 = nextline(file) + local line2 = nextline(file) + local line3 = nextline(file) + if debug then print(line1) print(line2) print(line3) end + + local line1_len = string.len(line1) - 1 + local line2_len = string.len(line2) - 1 + local line3_len = string.len(line3) - 1 + --these strings have extra newline character at the end + if debug then print("line 1,2,3 lengths:", line1_len, line2_len, line3_len) end + + line1 = string.sub(line1, 1, line1_len) + line2 = string.sub(line2, 1, line2_len) + line3 = string.sub(line3, 1, line3_len) + if debug then print(line1) print(line2) print(line3) end + + --contatenate all the lines together + --local padding = "1111" -- 172bits = 22.5 Bytes, pad with extra "F" + local padding = "" -- 172bits = 43 Nibbles no padding needed + local bin_line = padding .. line1 .. line2 .. line3 + local bin_len = line1_len + line2_len + line3_len + string.len(padding) + if debug then print("bin len", bin_len, "bin data", bin_line) end + +-- print(tonumber(line3,2)) + + --create a hex string that starts with last bit from 3rd line + local temp_nibble + local hex_str = "" + while bin_len > 0 do + --need to reverse the bit order + --temp_nibble = string.sub(bin_line, bin_len, bin_len) .. + -- string.sub(bin_line, bin_len-1, bin_len-1) .. + -- string.sub(bin_line, bin_len-2, bin_len-2) .. + -- string.sub(bin_line, bin_len-3, bin_len-3) + temp_nibble = string.reverse(string.sub(bin_line, bin_len-3, bin_len)) + + --temp_nibble = tonumber(string.sub(bin_line, bin_len-3, bin_len), 2) --2 is base (binary) + temp_nibble = tonumber(temp_nibble, 2) --2 is base (binary) + if debug then print("decimal", temp_nibble) end + temp_nibble =string.format("%1.1X", temp_nibble) + hex_str = hex_str .. temp_nibble + if debug then print("hex", temp_nibble) end + bin_len = bin_len - 4 + end + + if debug then print("hex string:", hex_str) end + + return hex_str +end -- global variables so other modules can use them @@ -93,6 +210,11 @@ end -- functions other modules are able to call files.compare = compare +files.wr_bin_byte = wr_bin_byte +files.rd_bin_byte = rd_bin_byte +files.readtill_line = readtill_line +files.nextline = nextline +files.jedec_3ln_2hexstr = jedec_3ln_2hexstr -- return the module's table return files diff --git a/host/scripts/app/help.lua b/host/scripts/app/help.lua index bd76ebe..2e7dcbe 100644 --- a/host/scripts/app/help.lua +++ b/host/scripts/app/help.lua @@ -13,6 +13,7 @@ local function hex(data) end + -- global variables so other modules can use them diff --git a/host/scripts/app/swim.lua b/host/scripts/app/swim.lua index 9f90123..3959299 100644 --- a/host/scripts/app/swim.lua +++ b/host/scripts/app/swim.lua @@ -4,6 +4,8 @@ local swim = {} -- import required modules local dict = require "scripts.app.dict" +local files = require "scripts.app.files" +local help = require "scripts.app.help" --local buffers = require "scripts.app.buffers" -- file constants @@ -164,6 +166,36 @@ local function unlock_flash(hspeed) wotf(0x5062, 0xAE, hspeed) end +local function fast_flash_mode(hspeed) + --set to fast flash mode + --;2. Write 0x10 in FLASH_CR2 (FPRG bit active), and 0xEF in FLASH_NCR2 (NFPRG bit + -- ;active). + -- mov FLASH_CR2, #0x10 + -- mov FLASH_NCR2, #0xEF + wotf(0x505B, 0x10, hspeed) + wotf(0x505C, 0xEF, hspeed) +end + +local function wait_till_eop_set(hspeed, debug) + + local timeout = 0 + + local result, data = rotf(0x505f, hspeed, false ) + + while ((data & 0x04) ~= 0x04) do + result, data = rotf(0x505f, hspeed, false ) + if debug then print("FLASH_IAPSR EOP bit wasn't set, polling again.") end + + timeout = timeout+1 + + if (timeout == 20) then + print("EOP was never set after", timeout, "attempts. I quit..") + return + end + end +end + + local function lock_flash_eeprom(hspeed) --lock eeprom: --Reset bit 3 (DUL) @@ -536,6 +568,89 @@ local function write_optn_bytes(rop, debug) if debug then print("done with option byte programming") end end +--erase 64Byte blocks starting at addr +--have to call separately for eeprom/flash, addr desides which to unlock +local function erase_blocks(addr, num_blocks, debug) + + --TODO take this arg from calling function + local hspeed = true + + local block_num = 0 + local readdata = 0 + local readresult = 0 + + if addr < 0x8000 then + unlock_eeprom(true) + else --flash + unlock_flash(true) + end + + if debug then print("SWIM erasing", num_blocks, "* 64Byte blocks starting at:", help.hex(addr)) end + + while (block_num < num_blocks) do + + + --enable block erase + wotf(0x505B, 0x20, hspeed) + wotf(0x505C, 0xDF, hspeed) + + --write 0x00 to first 4 bytes of the block + wotf(addr, 0x00, hspeed) + wotf(addr+1, 0x00, hspeed) + wotf(addr+2, 0x00, hspeed) + wotf(addr+3, 0x00, hspeed) + + --poll EOP + wait_till_eop_set(hspeed) + + --next block + block_num = block_num+1 + addr = addr + 64 + end + +end + +local function erase_flash(debug) + erase_blocks(0x8000, 128, true) +end + +local function erase_eeprom(debug) + + --TODO take arg of device type, for now assume S003 + --erase_blocks(0x4000, 2, true) --S001/3 + erase_blocks(0x4000, 10, true)--S103 +end + +local function read_memory(file, addr, num_bytes, debug) + + local toprint = debug + local buff_size = 1 + local byte_num = 0 + local readdata = 0 + local readresult = 0 + if debug then print("SWIM Dumping", num_bytes, "starting at:", help.hex(addr)) end + + while (byte_num < num_bytes) do + local toprint = false + readresult, readdata = rotf(addr+byte_num, true, toprint ) + byte_num = byte_num+1 + files.wr_bin_byte(file, readdata) + end + +end + +local function dump_flash(file, debug) + read_memory(file, 0x8000, 8*1024, true) +end + +local function dump_eeprom(file, debug) + --TODO flag for S001/3 or S103 + --for now just assume 640Bytes like S103 + read_memory(file, 0x4000, 640, true) +end + + +--takes ~37sec to flash entire 8KB, recommend calling fastblock below if flashing entire chip local function write_flash(file, debug) unlock_flash(true) @@ -567,6 +682,58 @@ local function write_flash(file, debug) lock_flash_eeprom(true) end + +--erases then writes 8KByte of STM8 flash +--currently writes entire 8KB of flash, file must be exactly 8KByte +--testing in high speed mode single byte rotf: 5.5sec (same as dump speed) +--flashing the entire chip takes 37 seconds in single byte mode +--does not verify as flashing, recommend dumping and comparing files +local function write_flash_fastblock(file, debug) + + --erase_blocks(0x8000, 128, true) + erase_flash() + + unlock_flash(true) + + local toprint = debug + local buff_size = 1 + local byte_num = 0 + local readdata = 0 + local readresult = 0 + print("Programming STM8 CIC flash") + + --for byte in file:lines(buff_size) do + while (byte_num < 0x2000) do + + --set to fast mode for each block + fast_flash_mode(true) + --write 64 bytes, then poll EOP + local byteinblock = 0 + + while byteinblock<64 do + + local byte = file:read(1) + --local byte = files.rd_bin_byte(file) + local data = string.unpack("B", byte, 1) + -- print(data) + wotf(0x8000+byte_num, data, true, toprint) + --wotf(0x8000+byte_num, 0xFF, true, true) + -- readresult, readdata = rotf(0x8000+byte_num, true, toprint ) + -- if readdata ~= data then + -- print("ERROR flashing byte number", byte_num, "to STM8 CIC", data, readdata) + -- end + byte_num = byte_num + 1 + byteinblock = byteinblock + 1 + end + + --poll EOP till it's set + wait_till_eop_set(true) + end + + print("Done with STM8 CIC flash") + lock_flash_eeprom(true) +end + local function snes_v3_prgm(debug) --dict.pinport("CTL_IP_PU", "SNES_RST") --reset_swim() @@ -604,6 +771,13 @@ end -- functions other modules are able to call swim.start = start swim.write_flash = write_flash +swim.write_flash_fastblock = write_flash_fastblock +swim.read_memory = read_memory +swim.dump_flash = dump_flash +swim.dump_eeprom = dump_eeprom +swim.erase_blocks = erase_blocks +swim.erase_flash = erase_flash +swim.erase_eeprom = erase_eeprom swim.write_optn_bytes = write_optn_bytes swim.disable_ROP_erase = disable_ROP_erase swim.printCSR = printCSR diff --git a/host/scripts/gb/romonly.lua b/host/scripts/gb/romonly.lua index 4644d17..974c233 100644 --- a/host/scripts/gb/romonly.lua +++ b/host/scripts/gb/romonly.lua @@ -5,7 +5,7 @@ local romonly = {} local dict = require "scripts.app.dict" local dump = require "scripts.app.dump" local files = require "scripts.app.files" -local jtag = require "scripts.app.jtag" +local jtag = require "scripts.jtag.jtag" -- file constants local mapname = "ROMONLY" diff --git a/host/scripts/jtag/jtag.lua b/host/scripts/jtag/jtag.lua new file mode 100644 index 0000000..ccdc7c4 --- /dev/null +++ b/host/scripts/jtag/jtag.lua @@ -0,0 +1,193 @@ + +-- create the module's table +local jtag = {} + +-- import required modules +local dict = require "scripts.app.dict" +local files = require "scripts.app.files" +local time = require "scripts.app.time" + +local pbje = require "scripts.jtag.pbje" + +--set cpld to which ever device is being used +--local cpld = require "scripts.jtag.lc4000v" +local cpld = require "scripts.jtag.machXO256" + + +local function check_IDCODE(debug) + + local idcode_len = 32 --hex digits + + --first put/verify jtag statemachine is in RESET + pbje.goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --let's just put in IDCODE mode + ---[[ + --Mach XO verify ID code +-- ! Check the IDCODE +-- +-- ! Shift in IDCODE(0x16) instruction +-- SIR 8 TDI (16); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x16) + + --return to default state after SIR + --doesn't appear to actually be needed +-- pbje.goto_state("PAUSE_IR") + +-- SDR 32 TDI (FFFFFFFF) +-- TDO (01281043) +-- MASK (FFFFFFFF); + --pbje.goto_state("SHIFT_DR") + --rv = pbje.scan( 32, "HIGH", true) + --print("return data:", string.format(" %X, ",rv)) + --]] + + + + --change to SCAN-DR state + pbje.goto_state("SHIFT_DR") + + --scan out 32bit IDCODE while scanning in 1's to TDI + rv = pbje.scan( 32, "HIGH", true ) + if debug then print("return data:", string.format("%X",rv)) end + rv = string.format("%16.16X",rv) + if debug then print(rv) end + rv = string.sub(rv, ((64-idcode_len)/4)+1, 64/4) + + --print("return data:", string.format(" %X, ",rv)) + print("read idcode:", rv) + + --if( rv == 0x1281043 ) then + if( rv == "01281043" ) then + -- Mach XO 256 01281043 + -- 4032v (01805043) + -- 4064v (01809043) + -- + -- 9536xl + -- //Loading device with 'idcode' instruction. + -- SIR 8 TDI (fe) SMASK (ff) ; + -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; + -- + -- 9572xl + -- //Loading device with 'idcode' instruction. + -- SIR 8 TDI (fe) SMASK (ff) ; + -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9604093) MASK (0fffffff) ; + -- test read gives 59604093 + print("IDCODE matches MACHXO-256") + --elseif ( rv==0x01805043 ) then + elseif ( rv=="01805043" ) then + print("IDCODE matches LC4032V") + --elseif ( rv==0x01809043 ) then + elseif ( rv=="01809043" ) then + print("IDCODE matches LC4064V") + else + print("no match for IDCODE") + end + + --xilinx IDCODE command is different + --//Loading device with 'idcode' instruction. + --SIR 8 TDI (fe) SMASK (ff) ; + --SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; +-- pbje.goto_state("SHIFT_IR") +-- pbje.scan( 8, 0xfe) +-- pbje.goto_state("SHIFT_DR") +-- rv = pbje.scan( 32, "HIGH", true) +-- print("return data:", string.format(" %X, ",rv)) + +end + + + +local function run_jtag( debug ) + + local rv + + --setup lua portion of jtag engine + pbje.init("INLRETRO") + + --initialize JTAG port on USB device + dict.io("JTAG_INIT", "JTAG_ON_EXP0_3") --NES + --dict.io("JTAG_INIT", "JTAG_ON_SNES_CTL") --SNES + + --open jedec file + local filename = "ignore/TKROM_prod_p512_w8_crom256_v4_0_0_currelease.jed" + --local filename = "ignore/8mb_v2_0p.jed" + + --first put/verify jtag statemachine is in RESET + pbje.goto_state("RESET") + + check_IDCODE() + + + --cpld.erase() + ---[[ + + + --program CPLD + local jed_file = assert(io.open(filename, "rb")) + + + --find and consume the "L00000" start of usemap token in jedec file + files.readtill_line(jed_file, "L00000", false) + check_IDCODE() + cpld.program(jed_file, false) + + --close jedec file + assert(jed_file:close()) + --]] + + + --verify programming + --open jedec file + --local jed_file = assert(io.open("ignore/8mb_v2_0p.jed", "rb")) + --local jed_file = assert(io.open("ignore/TKROM_prod_p512_w8_crom256_v4_0_0_currelease.jed", "rb")) + local jed_file = assert(io.open(filename, "rb")) + + --check_IDCODE() + --find and consume the "L00000" start of usemap token in jedec file + files.readtill_line(jed_file, "L00000") + --jed file needs to be read up to and consumed the L00000 command line so only the bit stream follows + cpld.verify(jed_file, false) + + --close jedec file + assert(jed_file:close()) + + --[[ + + --secure CPLD + cpld.secure() + + --can usercode be verified when secured..? NOPE! + --verify programming + --open jedec file + local jed_file = assert(io.open("ignore/8mb_v2_0p.jed", "rb")) + + check_IDCODE() + --find and consume the "L00000" start of usemap token in jedec file + files.readtill_line(jed_file, "L00000") + --jed file needs to be read up to and consumed the L00000 command line so only the bit stream follows + cpld.verify(jed_file, false) + + --close jedec file + assert(jed_file:close()) + + --]] + +end + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +jtag.wait_pbje_done = wait_pbje_done +jtag.run_jtag = run_jtag +--jtag.sleep = sleep + +-- return the module's table +return jtag diff --git a/host/scripts/jtag/lc4000v.lua b/host/scripts/jtag/lc4000v.lua new file mode 100644 index 0000000..df96151 --- /dev/null +++ b/host/scripts/jtag/lc4000v.lua @@ -0,0 +1,702 @@ + +-- create the module's table +local lc4000v = {} + +-- import required modules +local time = require "scripts.app.time" +local dict = require "scripts.app.dict" +local files = require "scripts.app.files" + +local pbje = require "scripts.jtag.pbje" + +--TODO this should report error/success if matches expected for this device +local function check_idcode(debug) + + local idcode_len = 32 --hex digits + + --first put/verify jtag statemachine is in RESET + pbje.goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --let's just put in IDCODE mode + ---[[ + --Mach XO verify ID code +-- ! Check the IDCODE +-- +-- ! Shift in IDCODE(0x16) instruction +-- SIR 8 TDI (16); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x16) + + --return to default state after SIR + --doesn't appear to actually be needed +-- pbje.goto_state("PAUSE_IR") + +-- SDR 32 TDI (FFFFFFFF) +-- TDO (01281043) +-- MASK (FFFFFFFF); + --pbje.goto_state("SHIFT_DR") + --rv = pbje.scan( 32, "HIGH", true) + --print("return data:", string.format(" %X, ",rv)) + --]] + + + + --change to SCAN-DR state + pbje.goto_state("SHIFT_DR") + + --scan out 32bit IDCODE while scanning in 1's to TDI + rv = pbje.scan( 32, "HIGH", true ) + if debug then print("return data:", string.format("%X",rv)) end + rv = string.format("%16.16X",rv) + if debug then print(rv) end + rv = string.sub(rv, ((64-idcode_len)/4)+1, 64/4) + + --print("return data:", string.format(" %X, ",rv)) + print("read idcode:", rv) + + --if( rv == 0x1281043 ) then + if( rv == "01281043" ) then + -- Mach XO 256 01281043 + -- 4032v (01805043) + -- 4064v (01809043) + -- + -- 9536xl + -- //Loading device with 'idcode' instruction. + -- SIR 8 TDI (fe) SMASK (ff) ; + -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; + -- + -- 9572xl + -- //Loading device with 'idcode' instruction. + -- SIR 8 TDI (fe) SMASK (ff) ; + -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9604093) MASK (0fffffff) ; + -- test read gives 59604093 + print("IDCODE matches MACHXO-256") + --elseif ( rv==0x01805043 ) then + elseif ( rv=="01805043" ) then + print("IDCODE matches LC4032V") + --elseif ( rv==0x01809043 ) then + elseif ( rv=="01809043" ) then + print("IDCODE matches LC4064V") + else + print("no match for IDCODE") + end + + --xilinx IDCODE command is different + --//Loading device with 'idcode' instruction. + --SIR 8 TDI (fe) SMASK (ff) ; + --SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; +-- pbje.goto_state("SHIFT_IR") +-- pbje.scan( 8, 0xfe) +-- pbje.goto_state("SHIFT_DR") +-- rv = pbje.scan( 32, "HIGH", true) +-- print("return data:", string.format(" %X, ",rv)) + +end + + +local function done_exit(debug) + --! Program DONE bit + -- + --! Shift in ISC PROGRAM DONE(0x2F) instruction + --SIR 8 TDI (2F); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x2F) + --RUNTEST IDLE 5 TCK 5.00E-002 SEC; + pbje.runtest( "IDLE", 5, 0.05 ) + +--IDK why this is done twice?! it's in original svf, so whatever.. + --! Shift in ISC PROGRAM DONE(0x2F) instruction + --SIR 8 TDI (2F); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x2F) + --RUNTEST IDLE 5 TCK 5.00E-002 SEC; + pbje.runtest( "IDLE", 5, 0.05 ) + + --! Shift in ISC DISABLE(0x1E) instruction + --SIR 8 TDI (1E); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1E) + --RUNTEST IDLE 5 TCK 2.00E-001 SEC; + pbje.runtest( "IDLE", 5, 0.2 ) + + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xFF) + --RUNTEST IDLE 32 TCK 1.00E-002 SEC; + pbje.runtest( "IDLE", 32, 0.01) + + --! Shift in IDCODE(0x16) instruction + check_idcode() + --SIR 8 TDI (16) + -- TDO (1D) + -- MASK (FF); + -- + -- + --! Exit the programming mode + -- + --! Shift in ISC DISABLE(0x1E) instruction + --SIR 8 TDI (1E); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1E) + --RUNTEST IDLE 3 TCK 2.00E-001 SEC; + pbje.runtest( "IDLE", 3, 0.2) +end + + +local function erase(debug) + + ---[[ LATTICE LC4032V + -- ERASE THE CHIP + --! Program Bscan register + -- + --! Shift in Preload(0x1C) instruction + --SIR 8 TDI (1C); + --SDR 68 TDI (00000000000000000); + --THIS MATTERS! tried machxo boundary scan of all high, and it didn't erase + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x1c) + pbje.goto_state("SHIFT_DR") + pbje.scan( 68, "LOW") + + -- + -- + --! Enable the programming mode + -- + --! Shift in ISC ENABLE(0x15) instruction + --SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x15) + pbje.runtest( "IDLE", 3, 0.1 ) + --RUNTEST IDLE 3 TCK 2.00E-002 SEC; + -- + -- + --! Shift in ISC ERASE(0x03) instruction + --SIR 8 TDI (03); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x03) + pbje.runtest( "IDLE", 3, 0.1 ) + --RUNTEST IDLE 3 TCK 1.00E-001 SEC; + + --! Shift in DISCHARGE(0x14) instruction + --SIR 8 TDI (14); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x14) + pbje.runtest( "IDLE", 3, 0.1 ) + --RUNTEST IDLE 3 TCK 1.00E-002 SEC; + -- + + + --]] + + +-- ! Read the status bit +-- +-- ! Shift in READ STATUS(0xB2) instruction +-- SIR 8 TDI (B2); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0xb2) + pbje.runtest( "IDLE", 5 ) +-- RUNTEST IDLE 5 TCK 1.00E-003 SEC; +-- SDR 1 TDI (0) +-- TDO (0); + pbje.goto_state("SHIFT_DR") + rv = pbje.scan( 1, "LOW", true) % 2 --mask out all but the last bit + if( rv == 0 ) then + print("status bit clear as expected, for erasure") --seems the LC4032v has this bit as well. + else + print("ERROR status bit was set, think this indicates not erased...") --don't think it erased, or not yet done.? + end + +end + +local function check_usercode(expected, len, debug) + + --first put/verify jtag statemachine is in RESET + pbje.goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --! Verify USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x17) + --SDR 32 TDI (FFFFFFFF) + -- TDO (000005DE); + --change to SCAN-DR state + pbje.goto_state("SHIFT_DR") + + --scan out 32bit IDCODE while scanning in 1's to TDI + rv = pbje.scan( len, "HIGH", true ) + if debug then print("return data:", string.format(" %X, ",rv)) end + rv = string.format("%8.8X",rv) + + --rv = string.sub(rv, ((64-len)/4)+1, 64) + --rv = string.sub(rv, 9, 16) + rv = string.sub(rv, ((64-len)/4)+1, 64/4) + + if debug then print("read usercode:", rv) end +-- expected = string.format("%8.8X",expected) + if debug then print("expected usercode:", expected) end + + if rv == expected then + if debug then print("verified usercode") end + return true + else + if debug then print("usercode didn't match expected") end + return false + end + + --return rv +end + + +--len in bits +local function prgm_usercode(usercode, len, debug) + + + --first put/verify jtag statemachine is in RESET +-- goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --! Program USERCODE + -- + --! Shift in ISC PROGRAM USERCODE(0x1A) instruction + --SIR 8 TDI (1A); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x1A) + --SDR 32 TDI (000005DE); + pbje.goto_state("SHIFT_DR") +-- while len > 4 do +-- scan_hold( 16, tonumber(string.sub(usercode,len-3,len),16) ) +-- len = len - 4 +-- end +-- scan( 16, tonumber(string.sub(usercode,1,len),16) ) + + --scan in 16Bytes at a time + local send_data + local user_len = len/4 --4bits per hex char + while user_len > 4 do --4chars * 4bits/hexchar = 16bits will run 10x 16bits = 160bits + send_data = string.sub(usercode, user_len-3, user_len) + if debug then print("sending 16bits:", send_data) end + pbje.scan_hold(16, tonumber(send_data,16) ) + user_len = user_len - 4 + end + --16bits remain + send_data = string.sub(usercode, 1, user_len) + pbje.scan(user_len*4, tonumber(send_data,16)) + + --RUNTEST IDLE 3 TCK 1.30E-002 SEC; + pbje.runtest( "IDLE", 3, 0.013) + +end + + +local function program_fuse_line(jed_file, debug) + + + --ispLEVER .jed files have 3 lines per fuse address + local rowdata = files.jedec_3ln_2hexstr(jed_file, false) + local fuse_len = string.len(rowdata) --4bits per hex character + if debug then print(fuse_len*4, "bits total, data:", rowdata) end + +--! SHIFT IN DATA ROW = 1 + pbje.goto_state("SHIFT_DR") +--SDR 172 TDI (FFFFC1FF83E31FFE118C37805F0FC7FFFFFFF8FE7FD); + + --need to scan in fuse stream now + + --if the data is all FF we can shift with TDI set to speed up process + --when testing SNES v2.0P2 prototype, this saved ~1sec of flash time 3.5->2.5sec + if rowdata == "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" then + if debug then print("row is all FF") end + pbje.scan(fuse_len*4, "HIGH") --4bits per hex char + --scan(172, "HIGH") + --RUNTEST IDLE 3 TCK 1.30E-002 SEC; + pbje.runtest( "IDLE", 3, 0.013) --appear to actually need this delay.. + return --nothing else needed + end + + --scan in 16Bytes at a time + local send_data + local FFFF_count --number of chunks that are 0xFFFF + local next_data --look ahead for speed up of high FFFF data + while fuse_len > 4 do --4chars * 4bits/hexchar = 16bits will run 10x 16bits = 160bits + send_data = string.sub(rowdata, fuse_len-3, fuse_len) + if debug then print("sending 16bits:", send_data) end + --if the data is all FF we can shift with TDI set to speed up process + --this didn't give any speedup probably because it's still a data transfer of same size + --to get actual speed up would have to look ahead, and see how many FFFF chunks there are and combine + --this is all working now, and maximizes TDI "HIGH" clockings without transferring data + --but it didn't give much speed up on the LC4032V SNES board, thinking it might give better speed up on MachXO256 + --LC4032V sometimes got down to 2.1sec from 2.5sec, but not consistent + if send_data == "FFFF" then + if debug then print("found 0xFFFF block") end + FFFF_count = 1 + fuse_len = fuse_len - 4 + + next_data = string.sub(rowdata, fuse_len-3, fuse_len) + --look ahead to see if next 16bits are also high + while next_data == "FFFF" and fuse_len > 4 do + if debug then print("found more than 1 0xFFFF block") end + FFFF_count = FFFF_count + 1 + fuse_len = fuse_len - 4 + next_data = string.sub(rowdata, fuse_len-3, fuse_len) + -- if next_data ~= "FFFF" then + -- FFFF_count = FFFF_count - 1 + -- end + end + + --send total count that was 0xFFFF + if debug then print("found", FFFF_count, "total FFFF blocks") end + --REPORTING uncomment to get idea of how much savings there ends up being + --if FFFF_count > 1 then print(FFFF_count, "total FFFF blocks") end + --most are only 3-4 not a lot of savings on LC4032V + pbje.scan_hold(16*FFFF_count, "HIGH") --scan 16 bits with TDI forced high + --fuse_len = fuse_len - 4*FFFF_count + else + pbje.scan_hold(16, tonumber(send_data,16) ) + fuse_len = fuse_len - 4 + end + end + --12bits remain + send_data = string.sub(rowdata, 1, fuse_len) + pbje.scan(fuse_len*4, tonumber(send_data,16)) + +--RUNTEST IDLE 3 TCK 1.30E-002 SEC; + pbje.runtest( "IDLE", 3, 0.013) --appear to actually need this delay.. + + +end + + +--erase & program the device +local function program(jed_file, debug) +--! Program Bscan register +-- +--! Shift in Preload(0x1C) instruction +--SIR 8 TDI (1C); +--SDR 68 TDI (00000000000000000); +-- +-- +--! Enable the programming mode +-- +--! Shift in ISC ENABLE(0x15) instruction +--SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x15) +--RUNTEST IDLE 3 TCK 2.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.02 ) +-- +-- +--! Erase the device + erase() +-- +--! Shift in ISC ERASE(0x03) instruction +--SIR 8 TDI (03); +--RUNTEST IDLE 3 TCK 1.00E-001 SEC; +--! Shift in DISCHARGE(0x14) instruction +--SIR 8 TDI (14); +--RUNTEST IDLE 3 TCK 1.00E-002 SEC; +-- +-- +--! Full Address Program Fuse Map +-- +--! Shift in ISC ADDRESS INIT(0x21) instruction +--SIR 8 TDI (21); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x21) +--STATE IDLE; + pbje.goto_state("IDLE") + +--! Shift in ISC PROGRAM INCR(0x27) instruction +--SIR 8 TDI (27); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x27) + + + --Now we need to program 100 lines 172bits/line (LC4032V) + local fuse_lines = 100 + local errors = 0 + time.start() + while fuse_lines > 0 do + program_fuse_line(jed_file, false) + fuse_lines = fuse_lines-1 + end + + time.report(172*100/8/1024) --172 bits/line, 100 lines, 8bit/byte, 1024byte/KB + +--! SHIFT IN DATA ROW = 1 +--SDR 172 TDI (FFFFC1FF83E31FFE118C37805F0FC7FFFFFFF8FE7FD); +--RUNTEST IDLE 3 TCK 1.30E-002 SEC; + +--! Shift in Data Row = 2 +--SDR 172 TDI (FFFFC1FF83E31FFE118C7F807F0FC7FFFFFFF8FE7FF); +--RUNTEST IDLE 3 TCK 1.30E-002 SEC; + + + + --! Verify USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + --SDR 32 TDI (FFFFFFFF) + -- TDO (000005DE); + --need to read expected user code from jedec file + local filecode = files.readtill_line(jed_file, "UH") + if debug then print("file usercode line:", filecode) end + filecode = string.sub(filecode, 3, 10) + if debug then print("hex usercode:", filecode) end + + prgm_usercode(filecode, 32, true) + + + --local usercode = check_usercode(0x000005DE, 32) + if check_usercode(filecode, 32) then + print("SUCCESS! VERIFIED USER CODE") + else + print("FAILED! USER CODE VERIFICATION") + end + + --The svf file leaves CPLD in this state while verifying, but + --the verify svf proves we should be able to leave this state during verification steps + + + done_exit(debug) + +end + +local function secure(debug) +--! Enable the programming mode +-- +--! Shift in ISC ENABLE(0x15) instruction +--SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x15) +--RUNTEST IDLE 3 TCK 2.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.02) + +--! Secure device +-- +--! Shift in ISC PROGRAM SECURITY(0x09) instruction +--SIR 8 TDI (09); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x09) +--RUNTEST IDLE 3 TCK 5.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.05) + pbje.goto_state("IDLE") +--STATE IDLE; +-- + done_exit(debug) +end + + +local function verify_fuse_line(jed_file, debug) + + --! Shift Out Data Row = 1 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + pbje.goto_state("SHIFT_DR") + -- TDO (FFFFC1FF83E31FFE118C37805F0FC7FFFFFFF8FE7FD); + -- FFFFFF8FE7FD, + -- FC7FFFFFFF8FE7FD + local dout + local read_str + dout = pbje.scan_hold( 64, "LOW", true) + read_str = string.format("%16.16X",dout) + if debug then print("return data:", string.format(" %16.16X, ",dout)) end + dout = pbje.scan_hold( 64, "LOW", true) + read_str = string.format("%16.16X",dout) .. read_str + if debug then print("return data:", string.format(" %16.16X, ",dout)) end + dout = pbje.scan( 44, "LOW", true) + if debug then print("return data:", string.format(" %16.16X, ",dout)) end + --print("return data:", string.sub(string.format("%16.16X", dout) , 6, 16)) + if debug then print("return data:", string.sub(string.format("%16.16X", dout) , ((64-44)/4)+1, (64/4))) end + read_str = string.sub(string.format("%16.16X", dout) , ((64-44)/4)+1, (64/4)) .. read_str + if debug then print(read_str) end + + -- + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 3, 0.001) +-- goto_state("SHIFT_DR") +-- --! Shift Out Data Row = 2 + + --ispLEVER .jed files have 3 lines per fuse address + local tempdata = files.jedec_3ln_2hexstr(jed_file, false) + if debug then print (tempdata) end + if string.match(tempdata, read_str) and (string.len(tempdata) == string.len(read_str)) then + if debug then print("verified line!") end + return true + else + if debug then print("failed to verify line") end + return false + end + +-- tempdata = files.jedec_3ln_2hexstr(jed_file, false) +-- print (tempdata) +-- tempdata = files.jedec_3ln_2hexstr(jed_file, false) +-- print (tempdata) +-- tempdata = files.jedec_3ln_2hexstr(jed_file, false) +-- print (tempdata) + + -- + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; +-- runtest( "IDLE", 3, 0.001) +-- goto_state("SHIFT_DR") +-- --! Shift Out Data Row = 2 +-- dout = pbje.scan_hold( 64, "LOW", true) +-- print("return data:", string.format(" %X, ",dout)) +-- dout = pbje.scan_hold( 64, "LOW", true) +-- print("return data:", string.format(" %X, ",dout)) +-- dout = pbje.scan( 44, "LOW", true) +-- print("return data:", string.format(" %X, ",dout)) + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (FFFFC1FF83E31FFE118C7F807F0FC7FFFFFFF8FE7FF); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 3 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (BFFFC1FF83E31FFE118C7E807F0FC7FFFFFFF8FE7FF); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 4 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (FFFFC1FF83E31FFE118C6F807F0FC7FFFFFFF8FE7FB); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 5 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (FFFFC1FF83E31FFE118C7F807F0FC7FFFFFFF8FE7FF); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + -- .... +end + + +local function verify(jed_file, debug) + --! Check the IDCODE + -- + --! Shift in IDCODE(0x16) instruction + --SIR 8 TDI (16); + --STATE IDLE; + --SDR 32 TDI (FFFFFFFF) + -- TDO (01805043) + -- MASK (0FFFFFFF); + check_idcode() + + -- + --! Program Bscan register + -- + --! Shift in Preload(0x1C) instruction + --SIR 8 TDI (1C); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x1C) + --SDR 68 TDI (00000000000000000); + pbje.goto_state("SHIFT_DR") + pbje.scan( 68, "LOW") +--local function scan( numbits, data_in, data_out, debug ) + -- + -- + --! Enable the programming mode + -- + --! Shift in ISC ENABLE(0x15) instruction + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x15) + --SIR 8 TDI (15); + --RUNTEST IDLE 3 TCK 2.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.02 ) + -- + -- + --! Full Address Verify Fuse Map + -- + --! Shift in ISC ADDRESS SHIFT(0x01) instruction + --SIR 8 TDI (01); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x01) + --SDR 100 TDI (8000000000000000000000000); + pbje.goto_state("SHIFT_DR") +-- HERE + pbje.scan_hold( 84, "LOW") + pbje.scan( 16, 0x8000) + + --! Shift in ISC READ INCR(0x2A) instruction + --SIR 8 TDI (2A); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x2A) + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 3, 0.001) + + + + --Now we need to read and verify 100 lines 172bits/line (LC4032V) + local fuse_lines = 100 + local errors = 0 + time.start() + while fuse_lines > 0 do + if not verify_fuse_line(jed_file, false) then + print("FAILED TO VERIFY LINE", fuse_lines) + errors = errors+1 + end + fuse_lines = fuse_lines-1 + end + + if errors == 0 then + print("SUCCESSFULLY Verified all fuse lines!") + else + print(errors, "errors were found when trying to verify all fuse lines. FAILED!") + end + time.report(172*100/8/1024) --172 bits/line, 100 lines, 8bit/byte, 1024byte/KB + + --! Verify USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + --SDR 32 TDI (FFFFFFFF) + -- TDO (000005DE); + --need to read expected user code from jedec file + local filecode = files.readtill_line(jed_file, "UH") + if debug then print("file usercode line:", filecode) end + filecode = string.sub(filecode, 3, 10) + if debug then print("hex usercode:", filecode) end + --local usercode = check_USERCODE(0x000005DE, 32) + if check_usercode(filecode, 32) then + print("SUCCESS! VERIFIED USER CODE") + else + print("FAILED! USER CODE VERIFICATION") + end + + done_exit(debug) + + -- + -- + --! Exit the programming mode + -- + --! Shift in ISC DISABLE(0x1E) instruction + --SIR 8 TDI (1E); + --RUNTEST IDLE 3 TCK 2.00E-001 SEC; + -- + -- + -- + --! Shift in IDCODE(0x16) instruction + --SIR 8 TDI (16) + -- TDO (1D) + -- MASK (FF); + + check_idcode() +end + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +lc4000v.done_exit = done_exit +lc4000v.erase = erase +lc4000v.program = program +lc4000v.verify = verify +lc4000v.secure = secure + + +-- return the module's table +return lc4000v + diff --git a/host/scripts/jtag/machXO256.lua b/host/scripts/jtag/machXO256.lua new file mode 100644 index 0000000..e46de8a --- /dev/null +++ b/host/scripts/jtag/machXO256.lua @@ -0,0 +1,1010 @@ + +-- create the module's table +local machXO256 = {} + +-- import required modules +local time = require "scripts.app.time" +local dict = require "scripts.app.dict" +local files = require "scripts.app.files" + +local pbje = require "scripts.jtag.pbje" + +--TODO this should report error/success if matches expected for this device +local function check_idcode(debug) + + local idcode_len = 32 --hex digits + + --first put/verify jtag statemachine is in RESET + pbje.goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --let's just put in IDCODE mode + ---[[ + --Mach XO verify ID code +-- ! Check the IDCODE +-- +-- ! Shift in IDCODE(0x16) instruction +-- SIR 8 TDI (16); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x16) + + --return to default state after SIR + --doesn't appear to actually be needed +-- pbje.goto_state("PAUSE_IR") + +-- SDR 32 TDI (FFFFFFFF) +-- TDO (01281043) +-- MASK (FFFFFFFF); + --pbje.goto_state("SHIFT_DR") + --rv = pbje.scan( 32, "HIGH", true) + --print("return data:", string.format(" %X, ",rv)) + --]] + + + + --change to SCAN-DR state + pbje.goto_state("SHIFT_DR") + + --scan out 32bit IDCODE while scanning in 1's to TDI + rv = pbje.scan( 32, "HIGH", true ) + if debug then print("return data:", string.format("%X",rv)) end + rv = string.format("%16.16X",rv) + if debug then print(rv) end + rv = string.sub(rv, ((64-idcode_len)/4)+1, 64/4) + + --print("return data:", string.format(" %X, ",rv)) + print("read idcode:", rv) + + --if( rv == 0x1281043 ) then + if( rv == "01281043" ) then + -- Mach XO 256 01281043 + -- 4032v (01805043) + -- 4064v (01809043) + -- + -- 9536xl + -- //Loading device with 'idcode' instruction. + -- SIR 8 TDI (fe) SMASK (ff) ; + -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; + -- + -- 9572xl + -- //Loading device with 'idcode' instruction. + -- SIR 8 TDI (fe) SMASK (ff) ; + -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9604093) MASK (0fffffff) ; + -- test read gives 59604093 + print("IDCODE matches MACHXO-256") + --elseif ( rv==0x01805043 ) then + elseif ( rv=="01805043" ) then + print("IDCODE matches LC4032V") + --elseif ( rv==0x01809043 ) then + elseif ( rv=="01809043" ) then + print("IDCODE matches LC4064V") + else + print("no match for IDCODE") + end + + --xilinx IDCODE command is different + --//Loading device with 'idcode' instruction. + --SIR 8 TDI (fe) SMASK (ff) ; + --SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; +-- pbje.goto_state("SHIFT_IR") +-- pbje.scan( 8, 0xfe) +-- pbje.goto_state("SHIFT_DR") +-- rv = pbje.scan( 32, "HIGH", true) +-- print("return data:", string.format(" %X, ",rv)) + +end + + +local function done_exit(debug) + --! Program DONE bit + -- + --! Shift in ISC PROGRAM DONE(0x2F) instruction + --SIR 8 TDI (2F); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x2F) + --RUNTEST IDLE 5 TCK 5.00E-002 SEC; + pbje.runtest( "IDLE", 5, 0.05 ) + --SDR 1 TDI (0) + -- TDO (1); + pbje.goto_state("SHIFT_DR") pbje.scan( 1, "LOW") + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF) + -- TDO (1D); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xFF) + -- + -- + --! Exit the programming mode + -- + --! Shift in ISC DISABLE(0x1E) instruction + --SIR 8 TDI (1E); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1E) + --RUNTEST IDLE 5 TCK 5.00E-002 SEC; + pbje.runtest( "IDLE", 5, 0.05 ) + + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xFF) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001 ) + -- + -- + --! Verify SRAM DONE Bit + -- + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF) + -- TDO (1D); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xFF) + +end + +local function check_status(debug) +--! Read the status bit +-- +--! Shift in READ STATUS(0xB2) instruction +--SIR 8 TDI (B2); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xB2) +--RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.7 ) +--SDR 1 TDI (0) +-- TDO (0); + pbje.goto_state("SHIFT_DR") + rv = pbje.scan( 1, 0x0, true) % 2 --mask out all but the last bit + if( rv == 0) then + print("MachXO-256 status bit clear as expected") + else + print("MachXO-256 status bit WAS NOT clear as expected") + end + + return rv +end + +local function erase(debug) + + + --MACH XO 256 + --! Program Bscan register + -- + --! Shift in Preload(0x1C) instruction + --SIR 8 TDI (1C); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1C) + --SDR 160 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + pbje.goto_state("SHIFT_DR") pbje.scan( 160, "HIGH") + --the HIGHZ instruction seems more fitting... 0x18 + + +-- ! MACH-XO Erase the device +-- ! Enable the programming mode +-- +-- ! Shift in ISC ENABLE(0x15) instruction +-- SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x15) +-- RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5) + +-- ! Shift in ISC SRAM ENABLE(0x55) instruction +-- SIR 8 TDI (55); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x55) +-- RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5 ) + +-- ! Shift in ISC ERASE(0x03) instruction +-- SIR 8 TDI (03); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x03) +-- RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5 ) + +-- ! Shift in ISC ENABLE(0x15) instruction +-- SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x15) +-- RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5 ) + +-- ! Shift in ISC ERASE(0x03) instruction +-- SIR 8 TDI (03); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x03) +-- RUNTEST IDLE 5 TCK 1.00E+001 SEC; + pbje.runtest( "IDLE", 5, 1 ) --seems to fail if under ~0.5sec + --pbje.runtest( "IDLE", 5, 0.7 ) +-- SDR 1 TDI (0) +-- TDO (1); TDO must be set + pbje.goto_state("SHIFT_DR") + rv = pbje.scan( 1, 0x0, true) % 2 --mask out all but the last bit + if( rv == 1) then + print("MachXO-256 CPLD erasure success!!!") + else + print("failed to erase MachXO-256 CPLD") + end + --]] + + check_status() + +end + +local function check_usercode(expected, len, debug) + + --first put/verify jtag statemachine is in RESET + pbje.goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --! Verify USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x17) + --SDR 32 TDI (FFFFFFFF) + -- TDO (000005DE); + --change to SCAN-DR state + pbje.goto_state("SHIFT_DR") + + --scan out 32bit IDCODE while scanning in 1's to TDI + rv = pbje.scan( len, "HIGH", true ) + if debug then print("return data:", string.format(" %X, ",rv)) end + rv = string.format("%8.8X",rv) + + --rv = string.sub(rv, ((64-len)/4)+1, 64) + --rv = string.sub(rv, 9, 16) + rv = string.sub(rv, ((64-len)/4)+1, 64/4) + + if debug then print("read usercode:", rv) end +-- expected = string.format("%8.8X",expected) + if debug then print("expected usercode:", expected) end + + if rv == expected then + if debug then print("verified usercode") end + return true + else + if debug then print("usercode didn't match expected") end + return false + end + + --return rv +end + + +--TODO don't think this works +--len in bits +local function prgm_usercode(usercode, len, debug) + --! Program USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x17) + --SDR 32 TDI (00000000); + pbje.goto_state("SHIFT_DR") --pbje.scan( 32, usercode) + --scan in 16Bytes at a time + local send_data + local user_len = len/4 --4bits per hex char + while user_len > 4 do --4chars * 4bits/hexchar = 16bits will run 10x 16bits = 160bits + send_data = string.sub(usercode, user_len-3, user_len) + if debug then print("sending 16bits:", send_data) end + pbje.scan_hold(16, tonumber(send_data,16) ) + user_len = user_len - 4 + end + --16bits remain + send_data = string.sub(usercode, 1, user_len) + pbje.scan(user_len*4, tonumber(send_data,16)) + + + --! Shift in ISC PROGRAM USERCODE(0x1A) instruction + --SIR 8 TDI (1A); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1A) + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + pbje.runtest("IDLE", 5, 0.01) + -- + -- + --! Read the status bit + -- + --! Shift in READ STATUS(0xB2) instruction + --SIR 8 TDI (B2); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --SDR 1 TDI (0) + -- TDO (0); + check_status(); + + + --first put/verify jtag statemachine is in RESET +-- goto_state("RESET") + + --by default jtag should be in IDCODE or BYPASS if IDCODE not present + --The TDI pin doesn't even have to be working to scan out IDCODE by this means + + --[[ + --! Program USERCODE + -- + --! Shift in ISC PROGRAM USERCODE(0x1A) instruction + --SIR 8 TDI (1A); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x1A) + --SDR 32 TDI (000005DE); + pbje.goto_state("SHIFT_DR") +-- while len > 4 do +-- scan_hold( 16, tonumber(string.sub(usercode,len-3,len),16) ) +-- len = len - 4 +-- end +-- scan( 16, tonumber(string.sub(usercode,1,len),16) ) + + --scan in 16Bytes at a time + local send_data + local user_len = len/4 --4bits per hex char + while user_len > 4 do --4chars * 4bits/hexchar = 16bits will run 10x 16bits = 160bits + send_data = string.sub(usercode, user_len-3, user_len) + if debug then print("sending 16bits:", send_data) end + pbje.scan_hold(16, tonumber(send_data,16) ) + user_len = user_len - 4 + end + --16bits remain + send_data = string.sub(usercode, 1, user_len) + pbje.scan(user_len*4, tonumber(send_data,16)) + + --RUNTEST IDLE 3 TCK 1.30E-002 SEC; + pbje.runtest( "IDLE", 3, 0.013) + --]] + +end + +local function end_row_flash() + --! Shift in LSCC PROGRAM INCR RTI(0x67) instruction + --SIR 8 TDI (67); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x67) + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + pbje.runtest( "IDLE", 5, 0.01) + --STATE DRPAUSE; + pbje.goto_state("PAUSE_DR") + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x02) + +end + +local function program_fuse_line(jed_file, debug) + + + --ispLEVER .jed files have 3 lines per fuse address + local rowdata = files.jedec_3ln_2hexstr(jed_file, false) + local fuse_len = string.len(rowdata) --4bits per hex character + if debug then print(fuse_len*4, "bits total, data:", rowdata) end + +--! SHIFT IN DATA ROW = 1 + --pbje.goto_state("SHIFT_DR") +--SDR 172 TDI (FFFFC1FF83E31FFE118C37805F0FC7FFFFFFF8FE7FD); + + --need to scan in fuse stream now + --! Shift in Row = 1 + --SDR 192 TDI (FFF7BFF3DEFFCEEFFF3BBFFCEEFFF3DFFFFDEFFF3BBFFCFF); + pbje.goto_state("SHIFT_DR") + + + --Now we need to program 295 lines 192bits/line (machXO-256) + + --if the data is all FF we can shift with TDI set to speed up process + --when testing SNES v2.0P2 prototype, this saved ~1sec of flash time 3.5->2.5sec + --NES machXO-256 was 10-12sec flash, & 3-6sec verify without any TDI=1 speedup + --when grouping of 16bit FFFF chunks got ~1sec speedup on NES MachXO-256 down to 9-11sec flash time + ---[[ + if rowdata == "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" then --48*4 = 192bits all set + --for MMC3 file this only happens for a single line.. + if debug then print("row is all FF") end + pbje.scan(fuse_len*4, "HIGH") --4bits per hex char + --scan(172, "HIGH") + --RUNTEST IDLE 3 TCK 1.30E-002 SEC; + --pbje.runtest( "IDLE", 3, 0.013) --appear to actually need this delay.. + --print("found row all FFFF...") + end_row_flash() + return --nothing else needed + end + --]] + + --scan in 16Bytes at a time + local send_data + local FFFF_count --number of chunks that are 0xFFFF + local next_data --look ahead for speed up of high FFFF data + while fuse_len > 4 do --4chars * 4bits/hexchar = 16bits will run 11x 16bits = 176bits + send_data = string.sub(rowdata, fuse_len-3, fuse_len) + if debug then print("sending 16bits:", send_data) end + --if the data is all FF we can shift with TDI set to speed up process + --this didn't give any speedup probably because it's still a data transfer of same size + --to get actual speed up would have to look ahead, and see how many FFFF chunks there are and combine + --this is all working now, and maximizes TDI "HIGH" clockings without transferring data + --but it didn't give much speed up on the LC4032V SNES board, thinking it might give better speed up on MachXO256 + --LC4032V sometimes got down to 2.1sec from 2.5sec, but not consistent + ---[[ + if send_data == "FFFF" then + if debug then print("found 0xFFFF block") end + FFFF_count = 1 + fuse_len = fuse_len - 4 + + next_data = string.sub(rowdata, fuse_len-3, fuse_len) + --look ahead to see if next 16bits are also high + while next_data == "FFFF" and fuse_len > 4 do + if debug then print("found more than 1 0xFFFF block") end + FFFF_count = FFFF_count + 1 + fuse_len = fuse_len - 4 + next_data = string.sub(rowdata, fuse_len-3, fuse_len) + -- if next_data ~= "FFFF" then + -- FFFF_count = FFFF_count - 1 + -- end + end + + --send total count that was 0xFFFF + if debug then print("found", FFFF_count, "total FFFF blocks") end + --REPORTING uncomment to get idea of how much savings there ends up being + --if FFFF_count > 1 then print(FFFF_count, "total FFFF blocks") end + --most are only 3-4 not a lot of savings on LC4032V + --machXO gives a little speed up here, to 9-11sec from 10-12sec + pbje.scan_hold(16*FFFF_count, "HIGH") --scan 16 bits with TDI forced high + --fuse_len = fuse_len - 4*FFFF_count + else + --]] + pbje.scan_hold(16, tonumber(send_data,16) ) + fuse_len = fuse_len - 4 + end + end + --16bits remain + send_data = string.sub(rowdata, 1, fuse_len) + if debug then print("sending", fuse_len*4, "bits:", send_data) end + pbje.scan(fuse_len*4, tonumber(send_data,16)) + + + end_row_flash() + +end + + +--erase & program the device +local function program(jed_file, debug) + --! Program Bscan register + -- + --! Shift in Preload(0x1C) instruction + --SIR 8 TDI (1C); + --pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1C) + --SDR 160 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + --pbje.goto_state("SHIFT_DR") pbje.scan( 160, "HIGH") + -- + -- + --! Enable the programming mode + -- + --! Shift in ISC ENABLE(0x15) instruction + --SIR 8 TDI (15); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + -- + -- + --! Erase the device + -- + --! Shift in ISC SRAM ENABLE(0x55) instruction + --SIR 8 TDI (55); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift in ISC ERASE(0x03) instruction + --SIR 8 TDI (03); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift in ISC ENABLE(0x15) instruction + --SIR 8 TDI (15); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift in ISC ERASE(0x03) instruction + --SIR 8 TDI (03); + --RUNTEST IDLE 5 TCK 1.00E+001 SEC; + --SDR 1 TDI (0) + -- TDO (1); + -- + -- + --! Read the status bit + -- + --! Shift in READ STATUS(0xB2) instruction + --SIR 8 TDI (B2); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --SDR 1 TDI (0) + -- TDO (0); + -- +--all of above done in erase + -- + --! Program Fuse Map + -- + --! Shift in INIT ADDRESS(0x21) instruction + --SIR 8 TDI (21); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + --! Shift in Row = 1 + --SDR 192 TDI (FFF7BFF3DEFFCDEFFF3BBFFCFCFFF3DFFFFDEFFF37BFFCFF); + --! Shift in LSCC PROGRAM INCR RTI(0x67) instruction + --SIR 8 TDI (67); + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + --STATE DRPAUSE; + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + --! Shift in Row = 2 + --SDR 192 TDI (FFF7BFF3DEFFCDEFFF37BFFCF7FFFF7BFFCDEFFF37BFFCFF); + --! Shift in LSCC PROGRAM INCR RTI(0x67) instruction + --SIR 8 TDI (67); + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + --STATE DRPAUSE; + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + --! Shift in Row = 3 + + erase() + + --should still be in ISC enable mode + --! Program Fuse Map + -- + --! Shift in INIT ADDRESS(0x21) instruction + --SIR 8 TDI (21); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x21) + + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001) + + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xFF) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001) + + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x02) + + --! Shift in Row = 1 + --SDR 192 TDI (FFF7BFF3DEFFCEEFFF3BBFFCEEFFF3DFFFFDEFFF3BBFFCFF); + --! Shift in LSCC PROGRAM INCR RTI(0x67) instruction + --SIR 8 TDI (67); + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + --STATE DRPAUSE; + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + + --Now we need to program 295 lines 192bits/line (machXO-256) + local fuse_lines = 295 + --local fuse_lines = 2 + local errors = 0 + time.start() + while fuse_lines > 0 do + program_fuse_line(jed_file, false) + fuse_lines = fuse_lines-1 + end + + time.report(192*295/8/1024) --192 bits/line, 295 lines, 8bit/byte, 1024byte/KB + +--! SHIFT IN DATA ROW = 1 +--SDR 172 TDI (FFFFC1FF83E31FFE118C37805F0FC7FFFFFFF8FE7FD); +--RUNTEST IDLE 3 TCK 1.30E-002 SEC; + +--! Shift in Data Row = 2 +--SDR 172 TDI (FFFFC1FF83E31FFE118C7F807F0FC7FFFFFFF8FE7FF); +--RUNTEST IDLE 3 TCK 1.30E-002 SEC; + + + --! Shift in Row = 2 + --SDR 192 TDI (FFF7BFF3DEFFCEEFFF37BFFCF7FFFFBBFFCEEFFF37BFFCFF); + --! Shift in LSCC PROGRAM INCR RTI(0x67) instruction + --SIR 8 TDI (67); + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + --STATE DRPAUSE; + --! Shift in DATA SHIFT(0x02) instruction + --SIR 8 TDI (02); + --! Shift in Row = 3 + + + + +---[[ + + --! Shift in LSCC PROGRAM INCR RTI(0x67) instruction + --SIR 8 TDI (67); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x67) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001) + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + pbje.runtest( "IDLE", 5, 0.01) + --STATE DRPAUSE; + pbje.goto_state("PAUSE_DR") + -- + -- + --! Program USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + --SDR 32 TDI (00000000); + --! Shift in ISC PROGRAM USERCODE(0x1A) instruction + --SIR 8 TDI (1A); + --RUNTEST IDLE 5 TCK 1.00E-002 SEC; + -- + -- + --! Read the status bit + -- + --! Shift in READ STATUS(0xB2) instruction + --SIR 8 TDI (B2); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --SDR 1 TDI (0) + -- TDO (0); + -- + -- + --! Verify Fuse Map + + + --need to read expected user code from jedec file + debug = true + local filecode = files.readtill_line(jed_file, "U0") + if debug then print("file usercode line:", filecode) end + filecode = string.sub(filecode, 3, 10) + if debug then print("hex usercode:", filecode) end + + prgm_usercode(filecode, 32, true) + + + --local usercode = check_usercode(0x000005DE, 32) + if check_usercode(filecode, 32, true) then + print("SUCCESS! VERIFIED USER CODE") + else + print("FAILED! USER CODE VERIFICATION") + end + + --The svf file leaves CPLD in this state while verifying, but + --the verify svf proves we should be able to leave this state during verification steps + + --]] + + check_status() + + done_exit(debug) + +end + + + +--! Secure device +-- +--! Shift in ISC PROGRAM SECURITY(0x09) instruction +--SIR 8 TDI (09); +--RUNTEST IDLE 5 TCK 5.00E-002 SEC; +--STATE IDLE; +-- +-- +--! Read the status bit +-- +--! Shift in READ STATUS(0xB2) instruction +--SIR 8 TDI (B2); +--RUNTEST IDLE 5 TCK 1.00E-003 SEC; +--SDR 1 TDI (0) +-- TDO (0); +-- + +--TODO this is still just LC4000V version +local function secure(debug) +--! Enable the programming mode +-- +--! Shift in ISC ENABLE(0x15) instruction +--SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x15) +--RUNTEST IDLE 3 TCK 2.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.02) + +--! Secure device +-- +--! Shift in ISC PROGRAM SECURITY(0x09) instruction +--SIR 8 TDI (09); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x09) +--RUNTEST IDLE 3 TCK 5.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.05) + pbje.goto_state("IDLE") +--STATE IDLE; +-- + done_exit(debug) +end + + +local function verify_fuse_line(jed_file, debug) + --! Shift Out Data Row = 1 + --SDR 192 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + -- TDO (FFF7BFF3DEFFCDEFFF3BBFFCFCFFF3DFFFFDEFFF37BFFCFF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + + --! Shift Out Data Row = 1 + --SDR 192 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + -- TDO (FFF7BFF3DEFFCEEFFF3BBFFCEEFFF3DFFFFDEFFF3BBFFCFF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 2 + --SDR 192 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + -- TDO (FFF7BFF3DEFFCEEFFF37BFFCF7FFFFBBFFCEEFFF37BFFCFF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 3 + + + pbje.goto_state("SHIFT_DR") + --192 bits, shift out 64 * 3 = 192 + + local read_str + --first 64bits + dout = pbje.scan_hold( 64, "HIGH", true) + read_str = string.format("%16.16X",dout) + if debug then print("return data:", string.format(" %16.16X, ",dout)) end + + --second 64bits (now 128total) + dout = pbje.scan_hold( 64, "HIGH", true) + read_str = string.format("%16.16X",dout) .. read_str + if debug then print("return data:", string.format(" %16.16X, ",dout)) end + + --last 64bits (192 total) + dout = pbje.scan( 64, "HIGH", true) + if debug then print("return data:", string.format(" %16.16X, ",dout)) end + --print("return data:", string.sub(string.format("%16.16X", dout) , 6, 16)) + --if debug then print("return data:", string.sub(string.format("%16.16X", dout) , ((64-44)/4)+1, (64/4))) end + --read_str = string.sub(string.format("%16.16X", dout) , ((64-44)/4)+1, (64/4)) .. read_str + read_str = string.format("%16.16X",dout) .. read_str + if debug then print(read_str) end + + --! Shift Out Data Row = 2 + --SDR 192 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + -- TDO (FFF7BFF3DEFFCEEFFF37BFFCF7FFFFBBFFCEEFFF37BFFCFF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001) + + --ispLEVER .jed files have 3 lines per fuse address + local tempdata = files.jedec_3ln_2hexstr(jed_file, false) + if debug then print (tempdata) end + if string.match(tempdata, read_str) and (string.len(tempdata) == string.len(read_str)) then + if debug then print("verified line!") end + return true + else + if debug then print("failed to verify line") end + return false + end + +-- tempdata = files.jedec_3ln_2hexstr(jed_file, false) +-- print (tempdata) +-- tempdata = files.jedec_3ln_2hexstr(jed_file, false) +-- print (tempdata) +-- tempdata = files.jedec_3ln_2hexstr(jed_file, false) +-- print (tempdata) + + -- + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; +-- runtest( "IDLE", 3, 0.001) +-- goto_state("SHIFT_DR") +-- --! Shift Out Data Row = 2 +-- dout = pbje.scan_hold( 64, "LOW", true) +-- print("return data:", string.format(" %X, ",dout)) +-- dout = pbje.scan_hold( 64, "LOW", true) +-- print("return data:", string.format(" %X, ",dout)) +-- dout = pbje.scan( 44, "LOW", true) +-- print("return data:", string.format(" %X, ",dout)) + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (FFFFC1FF83E31FFE118C7F807F0FC7FFFFFFF8FE7FF); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 3 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (BFFFC1FF83E31FFE118C7E807F0FC7FFFFFFF8FE7FF); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 4 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (FFFFC1FF83E31FFE118C6F807F0FC7FFFFFFF8FE7FB); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 5 + --SDR 172 TDI (0000000000000000000000000000000000000000000) + -- TDO (FFFFC1FF83E31FFE118C7F807F0FC7FFFFFFF8FE7FF); + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + -- .... +end + + +--TODO finish usercode verification portion +local function verify(jed_file, debug) + + --! Check the IDCODE + -- + check_idcode() + --! Shift in IDCODE(0x16) instruction + --SIR 8 TDI (16); + --SDR 32 TDI (FFFFFFFF) + -- TDO (01281043) + -- MASK (FFFFFFFF); + -- + -- + --! Program Bscan register + -- + --! Shift in Preload(0x1C) instruction + --SIR 8 TDI (1C); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x1C) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001 ) + --SDR 160 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + pbje.goto_state("SHIFT_DR") pbje.scan( 160, "HIGH") + -- + -- + --! Enable the programming mode + -- + --! Shift in ISC ENABLE(0x15) instruction + --SIR 8 TDI (15); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x15) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001 ) + -- + -- + --! Verify Fuse Map + -- + --! Shift in LSCC RESET ADDRESS(0x21) instruction + --SIR 8 TDI (21); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x21) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001 ) + + --! Shift in BYPASS(0xFF) instruction + --SIR 8 TDI (FF); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0xFF) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001 ) + + --! Shift in LSCC READ INCR RTI(0x6A) instruction + --SIR 8 TDI (6A); + pbje.goto_state("SHIFT_IR") pbje.scan( 8, 0x6A) + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 5, 0.001 ) + + --! Shift Out Data Row = 1 + --SDR 192 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + -- TDO (FFF7BFF3DEFFCDEFFF3BBFFCFCFFF3DFFFFDEFFF37BFFCFF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 2 + --SDR 192 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + -- TDO (FFF7BFF3DEFFCDEFFF37BFFCF7FFFF7BFFCDEFFF37BFFCFF); + --RUNTEST IDLE 5 TCK 1.00E-003 SEC; + --! Shift Out Data Row = 3 + + + --Now we need to read and verify 100 lines 172bits/line (LC4032V) + --local fuse_lines = 2 + local fuse_lines = 295 + local errors = 0 + time.start() + while fuse_lines > 0 do + if not verify_fuse_line(jed_file, false) then + print("FAILED TO VERIFY LINE", fuse_lines) + errors = errors+1 + end + fuse_lines = fuse_lines-1 + end + + if errors == 0 then + print("SUCCESSFULLY Verified all fuse lines!") + else + print(errors, "errors were found when trying to verify all fuse lines. FAILED!") + end + time.report(192*295/8/1024) --192 bits/line, 295 lines, 8bit/byte, 1024byte/KB + + +--[[LC4000V + --! Check the IDCODE + -- + --! Shift in IDCODE(0x16) instruction + --SIR 8 TDI (16); + --STATE IDLE; + --SDR 32 TDI (FFFFFFFF) + -- TDO (01805043) + -- MASK (0FFFFFFF); + check_idcode() + + -- + --! Program Bscan register + -- + --! Shift in Preload(0x1C) instruction + --SIR 8 TDI (1C); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x1C) + --SDR 68 TDI (00000000000000000); + pbje.goto_state("SHIFT_DR") + pbje.scan( 68, "LOW") +--local function scan( numbits, data_in, data_out, debug ) + -- + -- + --! Enable the programming mode + -- + --! Shift in ISC ENABLE(0x15) instruction + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x15) + --SIR 8 TDI (15); + --RUNTEST IDLE 3 TCK 2.00E-002 SEC; + pbje.runtest( "IDLE", 3, 0.02 ) + -- + -- + --! Full Address Verify Fuse Map + -- + --! Shift in ISC ADDRESS SHIFT(0x01) instruction + --SIR 8 TDI (01); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x01) + --SDR 100 TDI (8000000000000000000000000); + pbje.goto_state("SHIFT_DR") +-- HERE + pbje.scan_hold( 84, "LOW") + pbje.scan( 16, 0x8000) + + --! Shift in ISC READ INCR(0x2A) instruction + --SIR 8 TDI (2A); + pbje.goto_state("SHIFT_IR") + pbje.scan( 8, 0x2A) + --RUNTEST IDLE 3 TCK 1.00E-003 SEC; + pbje.runtest( "IDLE", 3, 0.001) + + + + --Now we need to read and verify 100 lines 172bits/line (LC4032V) + local fuse_lines = 100 + local errors = 0 + time.start() + while fuse_lines > 0 do + if not verify_fuse_line(jed_file, false) then + print("FAILED TO VERIFY LINE", fuse_lines) + errors = errors+1 + end + fuse_lines = fuse_lines-1 + end + + if errors == 0 then + print("SUCCESSFULLY Verified all fuse lines!") + else + print(errors, "errors were found when trying to verify all fuse lines. FAILED!") + end + time.report(172*100/8/1024) --172 bits/line, 100 lines, 8bit/byte, 1024byte/KB + + --! Verify USERCODE + -- + --! Shift in READ USERCODE(0x17) instruction + --SIR 8 TDI (17); + --SDR 32 TDI (FFFFFFFF) + -- TDO (000005DE); + --need to read expected user code from jedec file + local filecode = files.readtill_line(jed_file, "UH") + if debug then print("file usercode line:", filecode) end + filecode = string.sub(filecode, 3, 10) + if debug then print("hex usercode:", filecode) end + --local usercode = check_USERCODE(0x000005DE, 32) + if check_usercode(filecode, 32) then + print("SUCCESS! VERIFIED USER CODE") + else + print("FAILED! USER CODE VERIFICATION") + end + + --]] + done_exit(debug) + + -- + -- + --! Exit the programming mode + -- + --! Shift in ISC DISABLE(0x1E) instruction + --SIR 8 TDI (1E); + --RUNTEST IDLE 3 TCK 2.00E-001 SEC; + -- + -- + -- + --! Shift in IDCODE(0x16) instruction + --SIR 8 TDI (16) + -- TDO (1D) + -- MASK (FF); + + check_idcode() +end + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +machXO256.done_exit = done_exit +machXO256.erase = erase +machXO256.program = program +machXO256.verify = verify +machXO256.secure = secure + + +-- return the module's table +return machXO256 + diff --git a/host/scripts/app/jtag.lua b/host/scripts/jtag/pbje.lua similarity index 69% rename from host/scripts/app/jtag.lua rename to host/scripts/jtag/pbje.lua index e28db90..8055277 100644 --- a/host/scripts/app/jtag.lua +++ b/host/scripts/jtag/pbje.lua @@ -1,9 +1,19 @@ +-- PAUL'S BASIC JTAG ENGINE +-- this module keeps track of JTAG statemachine current state +-- so it can then know how to get to a different state +-- This module is responsible for generating the TMS, TCK, TDI, TDO +-- pin toggling sequences necessary and send basic commands over +-- to the PBJE running on the INLretro, or the cartridge mcu +-- The actual engine running on the INLretro/cartridge is pretty dumb +-- but has the hardware/physical interface, and the 'intelligence' resides here. -- create the module's table -local jtag = {} +local pbje = {} -- import required modules local dict = require "scripts.app.dict" +local files = require "scripts.app.files" +local time = require "scripts.app.time" -- file constants local pbje_loc --physical location of PBJE engine so this script known how to set engine registers @@ -25,7 +35,7 @@ end -- inside the board itself (ie CIC mcu) instead of on the inlretro programmer -- in these types of cases, want the jtag high level functions to be independent of -- where the PBJE engine is located physically. -local function init_jtag_lua( location ) +local function init( location ) pbje_loc = location @@ -119,6 +129,7 @@ local function set_run_get_cmd( command ) print("ERROR, pbje location must be initialized prior to setting registers") elseif( pbje_loc == "INLRETRO" ) then + --TODO provide flag if don't want to wait on immediate processing (for long data streams) rv = dict.jtag("SET_CMD_WAIT", command) --verify command was done if(rv ~= op_jtag["PBJE_DONE"]) then print("error JTAG not done, status: ", rv) end @@ -405,12 +416,22 @@ local function scan( numbits, data_in, data_out, debug ) --scan out with TDI high if( data_in == "HIGH" and data_out ) then set_run_get_cmd("PBJE_TDO_SCAN1") - data_out = dict.jtag("GET_6B_DATA") + data_out = dict.jtag("GET_8B_DATA") +-- if numbits <= 6*8 then +-- data_out = dict.jtag("GET_8B_DATA") +-- else +-- data_out = dict.jtag("GET_32B_DATA") +-- end --scan out with TDI low elseif( data_in == "LOW" and data_out ) then set_run_get_cmd("PBJE_TDO_SCAN0") - data_out = dict.jtag("GET_6B_DATA") + data_out = dict.jtag("GET_8B_DATA") +-- if numbits <= 6*8 then +-- data_out = dict.jtag("GET_8B_DATA") +-- else +-- data_out = dict.jtag("GET_32B_DATA") +-- end --scan in with TDI high elseif( data_in == "HIGH" and not data_out ) then @@ -422,6 +443,7 @@ local function scan( numbits, data_in, data_out, debug ) --scan in ignoring TDO elseif( data_in and not data_out ) then + --TODO support more than 16/64bits by calling TDI_SCAN_HOLD set_data_2B(data_in) set_run_get_cmd("PBJE_TDI_SCAN") @@ -429,7 +451,12 @@ local function scan( numbits, data_in, data_out, debug ) elseif( data_in and data_out ) then set_data_2B(data_in) set_run_get_cmd("PBJE_FULL_SCAN") - data_out = dict.jtag("GET_6B_DATA") + data_out = dict.jtag("GET_8B_DATA") +-- if numbits <= 6*8 then +-- data_out = dict.jtag("GET_8B_DATA") +-- else +-- data_out = dict.jtag("GET_32B_DATA") +-- end else print("ERROR, bad arguements to jtag scan function") @@ -450,6 +477,83 @@ local function scan( numbits, data_in, data_out, debug ) end +--similar to scan above, but it doesn't exit SHIFT-DR state so we can call it over and over again +local function scan_hold( numbits, data_in, data_out, debug ) + + --check to ensure current state is SHIFT-IR/DR + if not( cur_jtag_state == "SHIFT_IR" or cur_jtag_state == "SHIFT_DR") then + print("ERROR, jtag state must be SHIFT-IR/DR in order to scan data in/out") + return nil + end + + + --TODO analyze numbits to determine if needs to be split into several shorter scans + --currently all scans exit at end of shift + set_clk(numbits) + + --scan out with TDI high + if( data_in == "HIGH" and data_out ) then + set_run_get_cmd("PBJE_TDO_SCAN1_HOLD") + data_out = dict.jtag("GET_8B_DATA") +-- if numbits <= 6*8 then +-- data_out = dict.jtag("GET_8B_DATA") +-- else +-- data_out = dict.jtag("GET_32B_DATA") +-- end + + --scan out with TDI low + elseif( data_in == "LOW" and data_out ) then + set_run_get_cmd("PBJE_TDO_SCAN0_HOLD") + data_out = dict.jtag("GET_8B_DATA") +-- if numbits <= 6*8 then +-- data_out = dict.jtag("GET_8B_DATA") +-- else +-- data_out = dict.jtag("GET_32B_DATA") +-- end + + --scan in with TDI high + elseif( data_in == "HIGH" and not data_out ) then + set_run_get_cmd("PBJE_TDO_SCAN1_HOLD") + + --scan in with TDI low + elseif( data_in == "LOW" and not data_out ) then + set_run_get_cmd("PBJE_TDO_SCAN0_HOLD") + + --scan in ignoring TDO + elseif( data_in and not data_out ) then + --TODO support more than 16/64bits by calling TDI_SCAN_HOLD + set_data_2B(data_in) + set_run_get_cmd("PBJE_TDI_SCAN_HOLD") + + --scan in data and capture scan out + elseif( data_in and data_out ) then + set_data_2B(data_in) + set_run_get_cmd("PBJE_FULL_SCAN_HOLD") + data_out = dict.jtag("GET_8B_DATA") + -- if numbits <= 6*8 then + -- data_out = dict.jtag("GET_8B_DATA") + -- else + -- data_out = dict.jtag("GET_32B_DATA") + -- end + + else + print("ERROR, bad arguements to jtag scan function") + return nil + end + +-- --currently all scans exit at end of shift +-- --state has now shifted to EXIT1 +-- if( cur_jtag_state == "SHIFT_IR" ) then +-- cur_jtag_state = "EXIT1_IR" +-- elseif( cur_jtag_state == "SHIFT_DR" ) then +-- cur_jtag_state = "EXIT1_DR" +-- end + + --TODO only return the number of bits scanned, mask away everything else + return data_out + +end + local function runtest( state, clks, time, debug ) --check that state is a stable state @@ -487,206 +591,6 @@ local function runtest( state, clks, time, debug ) end -local function run_jtag( debug ) - - - local rv - - --setup lua portion of jtag engine - init_jtag_lua("INLRETRO") - - --initialize JTAG port on USB device - dict.io("JTAG_INIT", "JTAG_ON_EXP0_3") - - --first put/verify jtag statemachine is in RESET - goto_state("RESET") - - --by default jtag should be in IDCODE or BYPASS if IDCODE not present - --The TDI pin doesn't even have to be working to scan out IDCODE by this means - - --change to SCAN-DR state - goto_state("SHIFT_DR") - - --scan out 32bit IDCODE while scanning in 1's to TDI - rv = scan( 32, "HIGH", true ) - - print("return data:", string.format(" %X, ",rv)) - if( rv == 0x1281043 ) then - -- Mach XO 256 01281043 - -- 4032v (01805043) - -- 4064v (01809043) - -- - -- 9536xl - -- //Loading device with 'idcode' instruction. - -- SIR 8 TDI (fe) SMASK (ff) ; - -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; - -- - -- 9572xl - -- //Loading device with 'idcode' instruction. - -- SIR 8 TDI (fe) SMASK (ff) ; - -- SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9604093) MASK (0fffffff) ; - -- test read gives 59604093 - print("IDCODE matches MACHXO-256") - else - print("no match for IDCODE") - end - - --Mach XO verify ID code --- ! Check the IDCODE --- --- ! Shift in IDCODE(0x16) instruction --- SIR 8 TDI (16); - goto_state("SHIFT_IR") - scan( 8, 0x16) - - --return to default state after SIR - --doesn't appear to actually be needed --- goto_state("PAUSE_IR") - --- SDR 32 TDI (FFFFFFFF) --- TDO (01281043) --- MASK (FFFFFFFF); - goto_state("SHIFT_DR") - rv = scan( 32, "HIGH", true) - print("return data:", string.format(" %X, ",rv)) - - - --xilinx IDCODE command is different - --//Loading device with 'idcode' instruction. - --SIR 8 TDI (fe) SMASK (ff) ; - --SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9602093) MASK (0fffffff) ; --- goto_state("SHIFT_IR") --- scan( 8, 0xfe) --- goto_state("SHIFT_DR") --- rv = scan( 32, "HIGH", true) --- print("return data:", string.format(" %X, ",rv)) - - - --MACH XO 256 - --! Program Bscan register - -- - --! Shift in Preload(0x1C) instruction - --SIR 8 TDI (1C); - --SDR 160 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); - --the HIGHZ instruction seems more fitting... 0x18 - goto_state("SHIFT_IR") - scan( 8, 0x1c) - goto_state("SHIFT_DR") - scan( 160, "HIGH") - - --- ! Enable the programming mode --- --- ! Shift in ISC ENABLE(0x15) instruction --- SIR 8 TDI (15); - goto_state("SHIFT_IR") - scan( 8, 0x15) --- RUNTEST IDLE 5 TCK 1.00E-003 SEC; - runtest( "IDLE", 5 ) - --- --- --- ! Erase the device --- --- ! Shift in ISC SRAM ENABLE(0x55) instruction --- SIR 8 TDI (55); - goto_state("SHIFT_IR") - scan( 8, 0x55) - runtest( "IDLE", 5 ) --- RUNTEST IDLE 5 TCK 1.00E-003 SEC; --- --- ! Shift in ISC ERASE(0x03) instruction --- SIR 8 TDI (03); - goto_state("SHIFT_IR") - scan( 8, 0x03) - runtest( "IDLE", 5 ) --- RUNTEST IDLE 5 TCK 1.00E-003 SEC; --- --- ! Shift in ISC ENABLE(0x15) instruction --- SIR 8 TDI (15); - goto_state("SHIFT_IR") - scan( 8, 0x15) - runtest( "IDLE", 5 ) --- RUNTEST IDLE 5 TCK 1.00E-003 SEC; --- --- ! Shift in ISC ERASE(0x03) instruction --- SIR 8 TDI (03); - goto_state("SHIFT_IR") - scan( 8, 0x03) - --runtest( "IDLE", 5, 1 ) --seems to fail if under ~0.5sec - runtest( "IDLE", 5, 0.7 ) --- RUNTEST IDLE 5 TCK 1.00E+001 SEC; --- SDR 1 TDI (0) --- TDO (1); TDO must be set - goto_state("SHIFT_DR") - rv = scan( 1, 0x0, true) % 2 --mask out all but the last bit - if( rv == 1) then - print("MachXO-256 CPLD erasure success!!!") - else - print("failed to erase MachXO-256 CPLD") - end - - --- ! Read the status bit --- --- ! Shift in READ STATUS(0xB2) instruction --- SIR 8 TDI (B2); - goto_state("SHIFT_IR") - scan( 8, 0xb2) - runtest( "IDLE", 5 ) --- RUNTEST IDLE 5 TCK 1.00E-003 SEC; --- SDR 1 TDI (0) --- TDO (0); - goto_state("SHIFT_DR") - rv = scan( 1, "LOW", true) % 2 --mask out all but the last bit - if( rv == 0 ) then - print("status bit clear as expected") - else - print("ERROR status bit was set, not sure what this means...") - end - - ---! Program Fuse Map --- ---! Shift in INIT ADDRESS(0x21) instruction ---SIR 8 TDI (21); ---RUNTEST IDLE 5 TCK 1.00E-003 SEC; ---! Shift in BYPASS(0xFF) instruction ---SIR 8 TDI (FF); ---RUNTEST IDLE 5 TCK 1.00E-003 SEC; ---! Shift in DATA SHIFT(0x02) instruction ---SIR 8 TDI (02); ---! Shift in Row = 1 ---SDR 192 TDI (FFF7BFF3DEFFCEEFFF3BBFFCEEFFF3DFFFFDEFFF3BBFFCFF); ---! Shift in LSCC PROGRAM INCR RTI(0x67) instruction ---SIR 8 TDI (67); ---RUNTEST IDLE 5 TCK 1.00E-002 SEC; ---STATE DRPAUSE; ---! Shift in DATA SHIFT(0x02) instruction ---SIR 8 TDI (02); ---! Shift in Row = 2 ---SDR 192 TDI (FFF7BFF3DEFFCEEFFF37BFFCF7FFFFBBFFCEEFFF37BFFCFF); ---! Shift in LSCC PROGRAM INCR RTI(0x67) instruction ---SIR 8 TDI (67); ---RUNTEST IDLE 5 TCK 1.00E-002 SEC; ---STATE DRPAUSE; ---! Shift in DATA SHIFT(0x02) instruction ---SIR 8 TDI (02); ---! Shift in Row = 3 ---SDR 192 TDI (FFBFFFFFDEFFCFFFFFFBBFFCFFFFFF5FFFCFFFFFFFFFFFFF); ---! Shift in LSCC PROGRAM INCR RTI(0x67) instruction ---SIR 8 TDI (67); ---RUNTEST IDLE 5 TCK 1.00E-002 SEC; ---STATE DRPAUSE; ---! Shift in DATA SHIFT(0x02) instruction ---SIR 8 TDI (02); ---! Shift in Row = 4 ---SDR 192 TDI (FFFFFFFFDEFFCFFFFFFBBFFCFFFFFFBBFFCFFFFFFFFFFFFF); --- --- .... - -end - -- global variables so other modules can use them @@ -694,9 +598,13 @@ end -- functions other modules are able to call -jtag.wait_pbje_done = wait_pbje_done -jtag.run_jtag = run_jtag -jtag.sleep = sleep +--jtag.wait_pbje_done = wait_pbje_done +pbje.sleep = sleep +pbje.init = init +pbje.goto_state = goto_state +pbje.scan = scan +pbje.scan_hold = scan_hold +pbje.runtest = runtest -- return the module's table -return jtag +return pbje diff --git a/host/scripts/sega/genesis_v2.lua b/host/scripts/sega/genesis_v2.lua new file mode 100644 index 0000000..3e88f61 --- /dev/null +++ b/host/scripts/sega/genesis_v2.lua @@ -0,0 +1,365 @@ + +-- create the module's table +local genesis_v2 = {} + +-- import required modules +local dict = require "scripts.app.dict" +local dump = require "scripts.app.dump" + +-- file constants + +-- local functions + + +-- Desc: attempt to read flash rom ID +-- Pre: snes_init() been called to setup i/o +-- Post:Address left on bus memories disabled +-- Rtn: true if proper flash ID found +local function rom_manf_id( debug ) + + local rv + --enter software mode A11 is highest address bit that needs to be valid + --datasheet not exactly explicit, A11 might not need to be valid + --part has A-1 (negative 1) since it's in byte mode, meaning the part's A11 is actually A12 + --exit software mode/reset chip incase locked up + dict.sega("SET_ADDR", 0x0555) + dict.sega("SEGA_WR", 0x00AA) + + dict.bootload("SET_PTR_HI", 0x4800) + dict.bootload("SET_PTR_LO", 0x0000) + + rv = dict.bootload("RD_PTR_OFFSET", 0x0001) --read upper half word of register + print("PORT A hi:", string.format("%X", rv)) + rv = dict.bootload("RD_PTR_OFFSET", 0x0000) + print("PORT A lo:", string.format("%X", rv)) + rv = dict.bootload("RD_PTR_OFFSET", 0x0401) --read upper half word of register + print("PORT B hi:", string.format("%X", rv)) + rv = dict.bootload("RD_PTR_OFFSET", 0x0400) + print("PORT B lo:", string.format("%X", rv)) + + rv = dict.bootload("RD_PTR_OFFSET", 0x0414) --ODR PORTB + print("PORT B ODR:", string.format("%X", rv)) + rv = dict.bootload("RD_PTR_OFFSET", 0x0014) --ODR PORTA + print("PORT A ODR:", string.format("%X", rv)) + + rv = dict.bootload("RD_PTR_OFFSET", 0x0410) + print("PORT B IDR:", string.format("%X", rv)) + rv = dict.bootload("RD_PTR_OFFSET", 0x0010) + print("PORT A IDR:", string.format("%X", rv)) + + + dict.sega("SET_ADDR", 0x02AA) + dict.sega("SEGA_WR", 0x0055) + + dict.sega("SET_ADDR", 0x0555) + dict.sega("SEGA_WR", 0x0090) + +-- --WR $AAA:AA $555:55 $AAA:AA +-- dict.sega("SNES_SET_BANK", 0x00) +-- +-- dict.sega("SNES_ROM_WR", 0x8AAA, 0xAA) +-- dict.sega("SNES_ROM_WR", 0x8555, 0x55) +-- dict.sega("SNES_ROM_WR", 0x8AAA, 0x90) + + --read manf ID + local manf_id = dict.sega("SEGA_RD", 0x0000) --0x01 Cypress Manf ID + -- 0xBF SST Manf ID + if debug then print("attempted read SNES ROM manf ID:", string.format("%X", manf_id)) end + + --read prod ID + local prod_id = dict.sega("SEGA_RD", 0x0001) --0x7E Prod ID S29GL + --SST x16 0x235D or 0x235C product ID + if debug then print("attempted read SNES ROM prod ID:", string.format("%X", prod_id)) end + +-- local density_id = dict.sega("SEGA_RD", 0x801C) --density 0x10=8MB 0x1A=4MB +-- if debug then print("attempted read SNES density ID: ", string.format("%X", density_id)) end +-- +-- local boot_sect = dict.sega("SEGA_RD", 0x801E) --boot sector 0x00=top 0x01=bottom +-- if debug then print("attempted read SNES boot sect ID:", string.format("%X", boot_sect)) end +-- +-- --exit software +-- dict.sega("SNES_ROM_WR", 0x8000, 0xF0) +-- +-- --return true if detected flash chip +-- if (manf_id == 0x01 and prod_id == 0x49) then +-- print("2MB flash detected") +-- return true +-- elseif (manf_id == 0x01 and prod_id == 0x7E) then +-- print("4-8MB flash detected") +-- return true +-- else +-- return false +-- end + +end + +local function unsupported(operation) + print("\nUNSUPPORTED OPERATION: \"" .. operation .. "\" not implemented yet for Sega Genesis.\n") +end + +-- Compute Genesis checksum from a file, which can be compared with header value. +local function checksum_rom(filename) + local file = assert(io.open(filename, "rb")) + local sum = 0 + -- Skip header + file:read(0x200) + while true do + -- Add up remaining 16-bit words + local bytes = file:read(2) + if not bytes then break end + sum = sum + string.unpack(">i2", bytes) + end + -- Only use the lower bits. + return sum & 0xFFFF +end + +--/ROMSEL is always low for this dump +local function dump_rom( file, rom_size_KB, debug ) + + local KB_per_bank = 128 -- A1-16 = 64K address space, 2Bytes per address + local addr_base = 0x0000 -- control signals are manually controlled + + + local num_reads = rom_size_KB / KB_per_bank + local read_count = 0 + + while (read_count < num_reads) do + + if debug then print( "Dumping ROM part ", read_count + 1, " of ", num_reads) end + + -- A "large" Genesis ROM is 24 banks, many are 8 and 16 - status every 4 is reasonable. + -- The largest published Genesis game is Super Street Fighter 2, which is 40 banks! + -- TODO: Accessing banks in games that are >4MB require using a mapper. + -- See: https://plutiedev.com/beyond-4mb + + if (read_count % 4 == 0) then + print("dumping ROM bank: ", read_count, " of ", num_reads - 1) + end + + -- Select desired bank. + dict.sega("SET_BANK", read_count) + + dump.dumptofile(file, KB_per_bank/2, addr_base, "GENESIS_ROM_PAGE0", debug) + dump.dumptofile(file, KB_per_bank/2, addr_base, "GENESIS_ROM_PAGE1", debug) + + read_count = read_count + 1 + end + +end + +-- Helper to extract fields in internal header. +local function extract_field_from_string(data, start_offset, length) + -- 1 is added to Offset to handle lua strings being 1-based. + return string.sub(data, start_offset + 1, start_offset + length) +end + +-- Populates table with internal header contents from dumped data. +local function extract_header(header_data) + -- https://plutiedev.com/rom-header + -- https://en.wikibooks.org/wiki/Genesis_Programming#ROM_header + + -- TODO: Decode publisher from t-series in build field + -- https://segaretro.org/Third-party_T-series_codes + + local addr_console_name = 0x100 + local addr_build_date = 0x110 + local addr_domestic_name = 0x120 + local addr_intl_name = 0x150 + local addr_type_serial_version = 0x180 + local addr_checksum = 0x18E + local addr_device_support = 0x190 + local addr_rom_addr_range = 0x1A0 + local addr_ram_addr_range = 0x1A8 + local addr_sram_support = 0x1B0 + local addr_modem_support = 0x1BC + local addr_region_support = 0x1F0 + + local len_console_name = 16 + local len_build_date = 16 + local len_name = 48 + local len_type_serial_version = 14 + local len_checksum = 2 + local len_device_support = 16 + local len_addr_range = 8 + local len_sram_support = 12 + local len_modem_support = 12 + local len_region_support = 3 + + local header = { + console_name = extract_field_from_string(header_data, addr_console_name, len_console_name), + -- TODO: Decode T-Value and build info. + build_date = extract_field_from_string(header_data, addr_build_date, len_build_date), + domestic_name = extract_field_from_string(header_data, addr_domestic_name, len_name), + international_name = extract_field_from_string(header_data, addr_intl_name, len_name), + -- TODO: Decode Type, serial and revision. + type_serial_version = extract_field_from_string(header_data, addr_type_serial_version, len_type_serial_version), + checksum = string.unpack(">i2", extract_field_from_string(header_data, addr_checksum, len_checksum)), + -- TODO: Decode device support. + io_device_support = extract_field_from_string(header_data, addr_device_support, len_device_support), + -- TODO: Decode SRAM support. + sram_support = extract_field_from_string(header_data, addr_sram_support, len_sram_support), + -- TODO: Decode modem support. + modem_support = extract_field_from_string(header_data, addr_modem_support, len_modem_support), + -- TODO: Decode region support. + region_support = extract_field_from_string(header_data, addr_region_support, len_region_support), + } + -- ROM range can be used to autodetect the rom size. + local rom_range = extract_field_from_string(header_data, addr_rom_addr_range, len_addr_range) + local rom_start = string.unpack(">i4", string.sub(rom_range, 1, 4)) + local rom_end = string.unpack(">i4", string.sub(rom_range,5, 8)) + header["rom_size"] = (rom_end - rom_start + 1) / 1024 + + -- These should be the same in every cart according to docs, but decode in case its not. (64 Kb) + local ram_range = extract_field_from_string(header_data, addr_ram_addr_range, len_addr_range) + local ram_start = string.unpack(">i4", string.sub(ram_range, 1, 4)) + local ram_end = string.unpack(">i4", string.sub(ram_range,5, 8)) + header["ram_size"] = (ram_end - ram_start + 1) / 1024 + + return header +end + +-- Make a human-friendly text representation of ROM Size. +local function str_rom_size(rom_size_kb) + local mbit = rom_size_kb / 128 + if mbit < 1 then + mbit = "<1" + end + return "" .. rom_size_kb .. " kB (".. mbit .." mbit)" +end + +-- Prints parsed header contents to stdout. +local function print_header(genesis_header) + print("Console Name: \t" .. genesis_header["console_name"]) + print("Domestic Name: \t" .. genesis_header["domestic_name"]) + print("Release Date: \t" .. genesis_header["build_date"]) + print("Rom Size: \t" .. str_rom_size(genesis_header["rom_size"])) + print("Serial/Version: " .. genesis_header["type_serial_version"]) + print("Checksum: \t" .. hexfmt(genesis_header["checksum"])) +end + +-- Reads and parses internal ROM header from first page of data. +local function read_header() + dict.sega("SET_BANK", 0) + + local page0_data = "" + dump.dumptocallback( + function (data) + page0_data = page0_data .. data + end, + 64, 0x0000, "GENESIS_ROM_PAGE0", false + ) + local header_data = string.sub(page0_data, 1, 0x201) + local genesis_header = extract_header(header_data) + return genesis_header +end + +-- Test that cartridge is readable by looking for valid entries in internal header. +local function test(genesis_header) + local valid = false + -- Trailing spaces are required! Field length is 16 characters. + if genesis_header["console_name"] == "SEGA GENESIS " then valid = true end + if genesis_header["console_name"] == "SEGA MEGA DRIVE " then valid = true end + return valid +end + +--Cart should be in reset state upon calling this function +--this function processes all user requests for this specific board/mapper +local function process(process_opts, console_opts) + local file + + -- Initialize device i/o for SEGA + dict.io("IO_RESET") + dict.io("SEGA_INIT") +-- local genesis_header = read_header() + + if process_opts["test"] then + -- If garbage data is in the header, it's a waste of time trying to proceed doing anything else. + -- local valid_header = test(genesis_header) + -- if valid_header ~= true then print("Unreadable cartridge - exiting! (Try cleaning cartridge connector?)") end + -- assert(valid_header) + -- print_header(genesis_header) + + print("geny flash cart test") + dict.sega("SET_BANK", 0) + print(dict.sega("SEGA_RD", 0x0120)) + print(dict.sega("SEGA_RD", 0x0122)) + print(dict.sega("SEGA_RD", 0x0124)) + print(dict.sega("SEGA_RD", 0x0090)) --read "SONIC" from 0x0120 >> 1 + print(dict.sega("SEGA_RD", 0x0091)) + print(dict.sega("SEGA_RD", 0x0092)) + + + --dict.sega("SET_ADDR", 0) + + rom_manf_id(true) + + end + + -- TODO: dump the ram to file + if dumpram then + unsupported("dumpram") + end + + -- Dump the cart to dumpfile. + if process_opts["read"] then + + -- If ROM size wasn't provided, attempt to use value in internal header. + local rom_size = console_opts["rom_size_kbyte"] + if rom_size == 0 then + print("ROM Size not provided, " .. str_rom_size(genesis_header["rom_size"]) .. " detected.") + rom_size = genesis_header["rom_size"] + end + + print("\nDumping SEGA ROM...") + file = assert(io.open(process_opts["dump_filename"], "wb")) + + --dump cart into file + dump_rom(file, rom_size, false) + + --close file + assert(file:close()) + print("DONE Dumping SEGA ROM") + print("Computing checksum...") + local checksum = checksum_rom(process_opts["dump_filename"]) + if checksum == genesis_header["checksum"] then + print("CHECKSUM OK! DUMP SUCCESS!") + else + print("CHECKSUM MISMATCH - BAD DUMP! (Try cleaning cartridge connector?)") + end + end + + -- TODO: erase the cart + if process_opts["erase"] then + unsupported("erase") + end + + -- TODO: write to wram on the cart + if writeram then + unsupported("writeram") + end + + -- TODO: program flashfile to the cart + if process_opts["program"] then + unsupported("program") + end + + -- TODO: verify flashfile is on the cart + if process_opts["verify"] then + unsupported("verify") + end + + dict.io("IO_RESET") +end + + +-- global variables so other modules can use them +-- NONE + +-- call functions desired to run when script is called/imported +-- NONE + +-- functions other modules are able to call +genesis_v2.process = process + +-- return the module's table +return genesis_v2 diff --git a/shared/shared_dict_buffer.h b/shared/shared_dict_buffer.h index cc3fd6d..618e424 100644 --- a/shared/shared_dict_buffer.h +++ b/shared/shared_dict_buffer.h @@ -181,6 +181,7 @@ #define MM2 253 #define DPROM 254 //just a random mapper number for whatever I need it for + #define MMC3S 252 // UNKNOWN 255 don't assign to something meaningful //operand LSB mapper variant #define NOVAR 0 @@ -197,6 +198,12 @@ #define LOROM_3VOLT 6 #define HIROM_3VOLT 7 + #define LOROM_3V_PAGE 8 + #define HIROM_3V_PAGE 9 + + #define LOROM_3V_VERIFY 10 //same as 3VOLT above, but verifies each byte while writing + #define HIROM_3V_VERIFY 11 + //set function //miscdata: buffer number diff --git a/shared/shared_dict_io.h b/shared/shared_dict_io.h index 50c5ccc..0e6a4ec 100644 --- a/shared/shared_dict_io.h +++ b/shared/shared_dict_io.h @@ -63,7 +63,8 @@ //communications with #define JTAG_INIT 4 // don't define 0x00 to protect from forgetting to pass jtag lane - #define JTAG_ON_EXP0_3 0x01 //Most NES carts with CPLDs + #define JTAG_ON_EXP0_3 0x01 //Most NES carts with CPLDs EXP0-TDO, EXP1-TDI, EXP2-TMS, EXP3-TCK + #define JTAG_ON_SNES_CTL 0x02 //SNES v2.0proto2 SYSCLK-TCK, RESET/EXP0-TMS, WR-TDI, RD-TDO diff --git a/shared/shared_dict_jtag.h b/shared/shared_dict_jtag.h index 405bbd3..d8ba8cf 100644 --- a/shared/shared_dict_jtag.h +++ b/shared/shared_dict_jtag.h @@ -31,15 +31,20 @@ //set to zero if would like 256 clocks to be performed //range is 1-255, 0 equates to 256 clocks -#define SET_2B_DATA 7 -#define GET_6B_DATA 8 //RL=8 +#define SET_2B_DATA 7 //miscdata defines the first byte index + //0=first 2 bytes (16bits) of DATA array + //if undefined, should be 0 (first 2 bytes) + +#define GET_8B_DATA 8 //RL=10 max lua int, miscdata gives offset of first byte +#define GET_32B_DATA 9 //RL=34 //PBJE Paul's Basic Jtag engine commands & status' #define PBJE_STATE_CHG 0x01 //data array holds TMS values to clock values bit packed, TDI undefined +//TMS s bit packed, better for USB data compression (contrary to notes) -//DATA SCAN commands, these end with settting TMS to 1 to exit SHIFT-IR/DR completing the SCAN. +//DATA SCAN commands, these end with setting TMS to 1 to exit SHIFT-IR/DR completing the SCAN. //If need to make multiple smaller scans to make up one big scan, this would be the last scan, "HOLD" scans //lower down would be the first to second to last scans #define PBJE_TDI_SCAN 0x02 //ignore TDO 256max @@ -64,14 +69,16 @@ #define PBJE_FULL_SCAN_HOLD 0x10 //TDI = entire data array, TDO dumped into array stomping TDI, TMS=0 256max +//TODO, why don't we get unknown opcode when accidentally sending a command as an opcode..? ie dict.jtag("PBJE_INIT") +//that freezes instead of sending back unknown opcode, because it is known you idiot!... //Statuses & commands to get to the status -#define PBJE_INIT 0x80 +#define PBJE_INIT 0x80 //STATE ONLY! DON'T USE AS COMMAND!!l init with io dict, this is the state only #define PBJE_PROC 0x81 #define PBJE_DONE 0x82 #define PBJE_CMD_RX 0x83 #define PBJE_UNKN_CMD 0xEE -#define PBJE_OFF 0xF0 -#define PBJE_SHUTDOWN 0xFF +#define PBJE_OFF 0xF0 //STATE: mcu isn't running the PBJE +#define PBJE_SHUTDOWN 0xFF //COMMAND: tell mcu to shutoff PBJE