Committing working build that was used for flashing STM8 SNES v3.1

boards for SF2 builds.  Not necessarily the most clean, but it was
stable and worked well.

Need to get swim comms working on other board designs.
Need to come up with better swim activation with more exact timing.
Still need to implement swim comms on avr, hopefully that doesn't prove
to be too much of a PITA...  Not looking forward to that.  Can probably
only handle low speed, and faking pullup may not work as well without
time on it's side @ 16Mhz...
This commit is contained in:
Paul blue asus 2017-12-20 09:28:01 -06:00
parent b7364b964c
commit 535b45be27
16 changed files with 2061 additions and 1718 deletions

Binary file not shown.

View File

@ -1,4 +1,4 @@
:100000000C9476000C94560C0C9493000C94930072 :100000000C9476000C94950D0C9493000C94930032
:100010000C9493000C9493000C9493000C94930014 :100010000C9493000C9493000C9493000C94930014
:100020000C9493000C9493000C9493000C94930004 :100020000C9493000C9493000C9493000C94930004
:100030000C9493000C9493000C9493000C949300F4 :100030000C9493000C9493000C9493000C949300F4
@ -13,10 +13,10 @@
:1000C00049006E00660069006E00690074006500FA :1000C00049006E00660069006E00690074006500FA
:1000D0004E00650073004C006900760065007300F7 :1000D0004E00650073004C006900760065007300F7
:1000E0002E0063006F006D000403090411241FBE7D :1000E0002E0063006F006D000403090411241FBE7D
:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E8E299 :1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E6EA93
:10010000FBE102C005900D92A630B107D9F723E0BC :10010000FDE102C005900D92A630B107D9F723E0BA
:10011000A6E0B1E001C01D92A83AB207E1F70E9443 :10011000A6E0B1E001C01D92AD3AB207E1F70E943E
:100120006A0D0C94920D0C9400000F931F93CF93C3 :10012000A90E0C94D10E0C9400000F931F93CF9343
:10013000DF93EC01FB01D9010091470110914801C7 :10013000DF93EC01FB01D9010091470110914801C7
:10014000888187FF09C08E818C93442399F00481B4 :10014000888187FF09C08E818C93442399F00481B4
:10015000158180E883831DC08FEF8C938E818093FF :10015000158180E883831DC08FEF8C938E818093FF
@ -29,13 +29,13 @@
:1001C0006303F09164030480F581E02D8D818183C8 :1001C0006303F09164030480F581E02D8D818183C8
:1001D000E0916303F091640387818E5F8783C80198 :1001D000E0916303F091640387818E5F8783C80198
:1001E000DF91CF911F910F910895803D11F41C92E2 :1001E000DF91CF911F910F910895803D11F41C92E2
:1001F000CCCF8FEF8C9380E10E943F07C6CFE09178 :1001F000CCCF8FEF8C9380E10E947A07C6CFE0913D
:100200002001F09121018381811106C0F0936403E4 :100200002001F09121018381811106C0F0936403E4
:10021000E093630380E9B8CF883969F7E8CFE3E575 :10021000E093630380E9B8CF883969F7E8CFE3E575
:10022000F1E08FEF819391E0E336F907D9F78093FE :10022000F1E08FEF819391E0E336F907D9F78093FE
:10023000460180932501809345018093240180939A :10023000460180932501809345018093240180939A
:10024000360180931301809335018093120181E080 :10024000360180931301809335018093120181E080
:100250000C943F07CF93DF93FC0150E0CA01820F5B :100250000C947A07CF93DF93FC0150E0CA01820F20
:10026000911D4197E4F52223E1F183818F3FD9F578 :10026000911D4197E4F52223E1F183818F3FD9F578
:1002700082818F3FD1F5DA01AD5ABE4FED0180E0AA :1002700082818F3FD1F5DA01AD5ABE4FED0180E0AA
:1002800099919F3FA1F58F5F2813FACF6283138264 :1002800099919F3FA1F58F5F2813FACF6283138264
@ -83,355 +83,395 @@
:10052000920769F021E08232920761F021E0833383 :10052000920769F021E08232920761F021E0833383
:10053000920759F021E08031920769F7DBCF82E220 :10053000920759F021E08031920769F7DBCF82E220
:1005400091E0089583E391E0089580E191E00895BA :1005400091E0089583E391E0089580E191E00895BA
:100550001F93CF93DF930E944507823D09F071C03E :100550001F93CF93DF930E948007823D09F071C003
:100560000E9459028093060183E491E09093210157 :100560000E9459028093060183E491E09093210157
:10057000809320010E944507823DA1F4D09106019D :10057000809320010E948007823DA1F4D091060162
:100580008091200190912101C1E0CD1708F45FC056 :100580008091200190912101C1E0CD1708F45FC056
:10059000909321018093200120E8FC01238380EDCA :10059000909321018093200120E8FC01238380EDCA
:1005A0000E943F070E944507823F41F480EF0E946E :1005A0000E947A070E948007823F41F480EF0E94F8
:1005B0003F07E0912001F091210113820E9445073D :1005B0007A07E0912001F091210113820E948007C7
:1005C000C82F803DE1F48091200190912101FC0130 :1005C000C82F803DE1F48091200190912101FC0130
:1005D00023812038A1F4609106010E94700290935B :1005D00023812038A1F4609106010E94700290935B
:1005E000210180932001FC011782C3830E944003F4 :1005E000210180932001FC011782C3830E943F03F5
:1005F000E0912001F0912101882371F183830E9411 :1005F000E0912001F0912101882371F183830E9411
:100600004507182F803FC9F4C0912001D0912101E6 :100600008007182F803FC9F4C0912001D0912101AB
:100610008B81883991F460910601CE010E947002AD :100610008B81883991F460910601CE010E947002AD
:100620009093210180932001FC0113821B83CE0152 :100620009093210180932001FC0113821B83CE0152
:100630000E94D2048823D1F08B83DF91CF911F9148 :100630000E94E5048823C9F08B83DF91CF911F913D
:1006400008950E944507823F09F094CF89CF6D2F0E :1006400008950E948007823F09F094CF89CF6D2FD3
:100650000E947002CF5F99CF88ED838320858081CF :100650000E947002CF5F99CF208580819181820FA7
:100660009181820F911D91838083C9CF84EF8B8309 :10066000911D9183808388EDC9CF84EF8B8328858A
:10067000288588819981820F911D99838883DDCF98 :1006700088819981820F911D99838883DECF0F93A2
:100680000F93CF93DF93EC01688179818985823163 :10068000CF93DF93EC01688179818985823111F103
:1006900011F130F4803169F08131A1F083EC05C0B3 :1006900030F4803169F08131A1F083EC05C0833101
:1006A0008331D9F08431D1F780E0DF91CF910F9180 :1006A000D9F08431D1F780E0DF91CF910F91089597
:1006B000089560680FEF2E814A818C819D810E9490 :1006B00060680FEF2E814A818C819D810E94E9063E
:1006C000AE0607C00FEF2E814A818C819D810E946A :1006C00007C00FEF2E814A818C819D810E942007F7
:1006D000E5068F83E9CF6066EDCF8FEF84B9CB015C :1006D0008F83E9CF6066EDCF8FEF84B9CB01880FB0
:1006E000880F892F881F990B919585B95F9A5F981C :1006E000892F881F990B919585B95F9A5F9814B8E7
:1006F00014B860680FEF2E814A818C819D810E9421 :1006F00060680FEF2E814A818C819D810E94AD0A36
:10070000720AE7CF7F928F929F92AF92BF92CF9261 :10070000E7CF7F928F929F92AF92BF92CF92DF926C
:10071000DF92EF92FF920F931F93CF93DF936A01C3 :10071000EF92FF920F931F93CF93DF936A015901DA
:100720005901DA011796CC91D0E0E62EF12CFE2C7F :10072000DA011796CC91D0E0E62EF12CFE2CEE24C7
:10073000EE24D60116968C91169790E08C179D07A3 :10073000D60116968C91169790E08C179D0788F439
:1007400088F41796CC9380E0DF91CF911F910F91A1 :100740001796CC9380E0DF91CF911F910F91FF908E
:10075000FF90EF90DF90CF90BF90AF909F908F90E1 :10075000EF90DF90CF90BF90AF909F908F907F9061
:100760007F9008956AEA85E595E5F501099565E5C7 :1007600008956AEA85E595E5F501099565E58AEA62
:100770008AEA9AE2F501099560EA85E595E5F501D1 :100770009AE2F501099560EA85E595E5F5010995A7
:100780000995CE0199274C018E289F28D6011496F1 :10078000CE0199274C018E289F28D6011496ED9111
:10079000ED91FC911597E80FF91F6081C401F501F7 :10079000FC911597E80FF91F6081C401F5010995D7
:1007A00009950E94370BC401F8010995782EC40100 :1007A0000E94760CC401F8010995782EC401F80165
:1007B000F80109957812F5CF2196BBCF7F928F92E1 :1007B00009957812F5CF2196BBCF7F928F929F92A9
:1007C0009F92AF92BF92CF92DF92EF92FF920F93E0 :1007C000AF92BF92CF92DF92EF92FF920F931F935F
:1007D0001F93CF93DF936A015901DA011796CC91E9 :1007D000CF93DF936A015901DA011796CC91D0E0EB
:1007E000D0E0E62EF12CFE2CEE24D60116968C914C :1007E000E62EF12CFE2CEE24D60116968C9116974F
:1007F000169790E08C179D0788F41796CC9380E0AD :1007F00090E08C179D0788F41796CC9380E0DF91EA
:10080000DF91CF911F910F91FF90EF90DF90CF90EC :10080000CF911F910F91FF90EF90DF90CF90BF900D
:10081000BF90AF909F908F907F9008956AEA85E592 :10081000AF909F908F907F9008956AEA85E595E16B
:1008200095E1F501099565E58AEA9AE0F5010995F2 :10082000F501099565E58AEA9AE0F501099560EA1E
:1008300060EA85E595E1F5010995CE0199274C011E :1008300085E595E1F5010995CE0199274C018E28B2
:100840008E289F28D6011496ED91FC911597E80FFC :100840009F28D6011496ED91FC911597E80FF91F9A
:10085000F91F6081C401F50109950E94370BC4019D :100850006081C401F50109950E94760CC401F8017C
:10086000F8010995782EC401F80109957812F5CFA1 :100860000995782EC401F80109957812F5CF2196E3
:100870002196BBCF4F925F927F928F929F92AF92C1 :10087000BBCF4F925F926F927F928F929F92AF9277
:10088000BF92CF92DF92EF92FF920F931F93CF937D :10088000BF92CF92DF92EF92FF920F931F93CF937D
:10089000DF93A62E6A01E901DA011796EC90F12C9C :10089000DF93662E7A01E901DA0117965C90852CC8
:1008A000A89558986AEA8AEA9AE0F901099565E5F7 :1008A000912CA89558986AEA8AEA9AE0F901099584
:1008B00085E595E0FE01099560E28AEA9AE0FE018D :1008B00065E585E595E0FE01099560E28AEA9AE042
:1008C0000995B12CBA2CAA24D60116968C911697AC :1008C000FE010995712C762C6624D70116968C9121
:1008D00090E08E159F0518F51796EC9260E980E080 :1008D000169790E08815990520F517965C9260E9C7
:1008E00090E0FE01099560E080E090E0FE0109954E :1008E00080E090E0FE01099560E080E090E0FE018C
:1008F00060EF80E090E0FE010995589A80E0DF917A :1008F000099560EF80E090E0FE010995589A80E04C
:10090000CF911F910F91FF90EF90DF90CF90BF900C :10090000DF91CF911F910F91FF90EF90DF90CF90EB
:10091000AF909F908F907F905F904F90089580EA66 :10091000BF90AF909F908F907F906F905F904F901F
:100920000E94650A2701552442018A289B28D60186 :10092000089580EA0E94A00AC52CD12C5601A62861
:100930001496ED91FC911597E40DF51D6081C401AD :10093000B728D7011496ED91FC911597EC0DFD1D8C
:10094000FE010995589AA8950E94370BC401F80139 :100940006081C501FE010995589AA8950E94760C10
:100950000995782E5898D6011496ED91FC9115972B :10095000C501F80109955898D7011496ED91FC91BD
:10096000E40DF51D8081781639F0589AC401F8011C :100960001597EC0DFD1D4080841541F0589A482ED6
:1009700009955898781204C0FFEFEF1AFF0AA4CF28 :10097000C501F80109955898481213C0D70114967B
:100980000000000000000000000000000000000067 :100980008D919C911597C80ED91EF6018081481251
:100990000000000000000000589AC401F801099509 :1009900019C05394FFEF8F1A9F0A5198599A59988A
:1009A000782EE4CF0F931F93AC01FC01608171811D :1009A00094CF0000000000000000000000000000E4
:1009B0009185923159F030F4903161F0913199F094 :1009B00000000000000000000000589AC501F80186
:1009C00083EC05C09331B9F09431D1F780E01F91E9 :1009C0000995D5CF519A599A80CF0F931F93AC01B7
:1009D0000F910895606809EE15E02AED35E080E09A :1009D000FC01608171819185923159F030F4903140
:1009E0000E948203F3CF01E116E025E236E080E0C9 :1009E00061F0913199F083EC05C09331B9F0943105
:1009F0000E94DE03EBCF8FEF84B9CB01880F892FE4 :1009F000D1F780E01F910F910895606804E216E03E
:100A0000881F990B919585B95F9A5F9814B86068B3 :100A000025E136E080E00E948103F3CF0CE416E09C
:100A100002E21AE023E33AE080E00E943A04D6CFF3 :100A100020E636E080E00E94DD03EBCF8FEF84B963
:100A200014B88FEF85B93F9A479881B911B882B948 :100A2000CB01880F892F881F990B919585B95F9A03
:100A300014B885B914B885B93898409A3998419A4C :100A30005F9814B860680DE51AE02EE63AE080E0B1
:100A40003A98429A3C98449A3D98459A3E98469ADC :100A40000E943904D6CF14B88FEF85B93F9A4798E2
:100A500053985B9A55985D9A3B98439A3F98479A6A :100A500081B911B882B914B885B914B885B9389874
:100A600057985F9A509858985198599A08950E94AB :100A6000409A3998419A3A98429A3C98449A3D98CB
:100A70001005399A419A389A40983A9A429A3C9A83 :100A7000459A3E98469A53985B9A55985D9A3B984A
:100A8000449A3D9A459A14B88FEF85B914B885B940 :100A8000439A3F98479A57985F9A50985898519828
:100A900014B885B93F9A479881B912B884B915B886 :100A9000599A08950E942305399A419A389A4098A4
:100AA000479A479814B808950E941005399A419AB8 :100AA0003A9A429A3C9A449A3D9A459A14B88FEFE2
:100AB0003C9A449A3D9A459A509A589A14B88FEFA6 :100AB00085B914B885B914B885B93F9A479881B9F2
:100AC00085B914B885B914B885B93F9A479881B9E2 :100AC00012B884B915B8479A479814B808950E9487
:100AD00012B884B915B8479A479814B814B885B9AC :100AD0002305399A419A3C9A449A3D9A459A589AE4
:100AE000579A5F9884B915B85F9A5F9814B80895BB :100AE000509A14B88FEF85B914B885B914B885B980
:100AF0005898509A000089B15098589880FD22C0AB :100AF0003F9A479881B912B884B915B8479A479870
:100B00005098589A59B149B1000039B1000000001D :100B000014B814B885B9579A5F9884B915B85F9A24
:100B100029B100000000000099B1000000000000B1 :100B10005F9814B80895823031F0833011F081303D
:100B2000000089B15098589850FD0EC040FD0EC08D :100B2000A1F480E008955098589A88E08093820359
:100B300030FD0EC020FD0EC090FD0EC080FD0EC029 :100B300089E290E0909381038093800381E090E0CC
:100B400080EE089580EF089580E0089581E0089593 :100B400090937F0380937E03ECCF87E908955898B4
:100B500083E0089586E008958AE008958FE008957F :100B5000509A000089B15098589880FD22C0509852
:100B60000F931F93CF93DF931F92CDB7DEB7890109 :100B6000589A59B149B1000039B10000000029B1CB
:100B7000813089F030F0823091F0803899F086E948 :100B700000000000000099B100000000000000002B
:100B800004C089830E94100589810F90DF91CF9165 :100B800089B15098589850FD0EC040FD0EC030FD00
:100B90001F910F9108950E94370580E0F6CF0E94C3 :100B90000EC020FD0EC090FD0EC080FD0EC080EE88
:100BA0005405FBCF81E0F90180830E947805F801AC :100BA000089580EF089580E0089581E0089583E03E
:100BB0008183F3CF82B98FEF84B995B9479A47986B :100BB000089586E008958AE008958FE008950F93E0
:100BC00014B884B965B9509A58985098589A14B87E :100BC0001F93CF93DF931F92CDB7DEB78901823099
:100BD000089582B92FEF24B995B9479A479814B868 :100BD00009F130F4882381F08130C1F086E910C03A
:100BE000409A97FD4198000000000000000083B18A :100BE0008330D9F08038D1F781E0F90180830E9409
:100BF0004098419A08955098589882B92FEF24B997 :100BF000A705F80181830CC089830E9423058981A0
:100C000095B9479A479814B8429824B965B9409A5B :100C00000F90DF91CF911F910F9108950E944A0597
:100C100097FD4198000000004098419A429A14B80C :100C100080E0F6CF0E946705FBCF842F0F90DF9115
:100C20000895811520E2920708F4906882B98FEF49 :100C2000CF911F910F910C948B0582B98FEF84B9EE
:100C300084B995B9479A479814B8449800000000C1 :100C300095B9479A479814B884B965B9509A5898A5
:100C40000000000083B1449A0895811520E29207C4 :100C40005098589A14B8089582B92FEF24B995B9DD
:100C500008F4906882B98FEF84B995B9479A47989C :100C5000479A479814B8409A97FD419800000000C1
:100C600014B884B965B9000045980000459A14B8D5 :100C60000000000083B14098419A08955098589828
:100C700008958FEF84B994E095B9479A479814B8CE :100C700082B92FEF24B995B9479A479814B842988A
:100C800029B1207230E084B988E085B9479A479845 :100C800024B965B9409A97FD41980000000040984A
:100C900014B889B1807290E041E02115310509F066 :100C9000419A429A14B80895811520E2920708F407
:100CA00040E061E0009709F060E0442311F0611139 :100CA000906882B98FEF84B995B9479A479814B87C
:100CB00016C051E0232B09F450E021E0892B09F400 :100CB0004498000000000000000083B1449A0895A9
:100CC00020E0552311F021110CC0662311F05111C1 :100CC000811520E2920708F4906882B98FEF84B909
:100CD0000AC0442311F0211108C08FEF089580E16C :100CD00095B9479A479814B884B965B90000459802
:100CE000089581E1089582E1089583E108950F93C5 :100CE0000000459A14B808958FEF84B994E095B93F
:100CF0001F93CF93C82FCA018901C23001F130F48C :100CF000479A479814B829B1207230E084B988E047
:100D0000CC2391F0C130B9F0C0EA10C0C238D1F0A4 :100D000085B9479A479814B889B1807290E041E05C
:100D1000C338F1F0C138C1F721E0F80120830E9407 :100D10002115310509F040E061E0009709F060E03D
:100D2000E905F801818309C00E94DA058C2FCF9173 :100D2000442311F0611116C051E0232B09F450E067
:100D30001F910F9108950E942506C0E0F7CF0E94F1 :100D300021E0892B09F420E0552311F021110CC08A
:100D4000FB05FBCF21E0F80120830E941106E9CFCB :100D4000662311F051110AC0442311F0211108C08B
:100D500081E0F90180830E943906E3CFEF92FF9290 :100D50008FEF089580E1089581E1089582E108957B
:100D60000F93CF93DF9300D01F92CDB7DEB77C01F6 :100D600083E108950F931F93CF93C82FCA01890180
:100D70008FEF84B965B9479A479814B8409A67FDD0 :100D7000C23001F130F4CC2391F0C130B9F0C0EAB7
:100D8000419842B980E0011117C00000000093B102 :100D800010C0C238D1F0C338F1F0C138C1F721E04A
:100D9000F701E80FF11D90834F5F42B98F5F28176D :100D9000F80120830E942406F801818309C00E9483
:100DA00090F74098419A0F900F900F90DF91CF915C :100DA00015068C2FCF911F910F9108950E94600618
:100DB0000F91FF90EF9008952B834A8389830E94BF :100DB000C0E0F7CF0E943606FBCF21E0F801208388
:100DC000370B89814A812B81E2CFEF92FF920F93FB :100DC0000E944C06E9CF81E0F90180830E947406FD
:100DD000CF93DF9300D01F92CDB7DEB77C01603296 :100DD000E3CFEF92FF920F93CF93DF9300D01F9258
:100DE00008F460688FEF84B965B9479A479814B8DA :100DE000CDB7DEB77C018FEF84B965B9479A4798D4
:100DF000449842B980E0011116C00000000093B190 :100DF00014B8409A67FD419842B980E0011117C0CC
:100E0000F701E80FF11D90834F5F42B98F5F2817FC :100E00000000000093B1F701E80FF11D90834F5FE0
:100E100090F7449A0F900F900F90DF91CF910F9120 :100E100042B98F5F281790F74098419A0F900F9032
:100E2000FF90EF9008952B834A8389830E94370BAC :100E20000F90DF91CF910F91FF90EF9008952B835A
:100E300089814A812B81E3CFCF93DF93FB01DC01D2 :100E30004A8389830E94760C89814A812B81E2CF83
:100E400012962C91222329F0203479F082ED8083B0 :100E4000EF92FF920F93CF93DF9300D01F92CDB715
:100E500008C01082A0910201B0910301EC018C81C5 :100E5000DEB77C01603208F460688FEF84B965B951
:100E60008C93CF01DF91CF910895108281E081832F :100E6000479A479814B8449842B980E0011116C0D7
:100E7000A0910201B09103018C918283F2CFE091A5 :100E70000000000093B1F701E80FF11D90834F5F70
:100E80000201F091030180830895E0910201F09145 :100E800042B98F5F281790F7449A0F900F900F90F8
:100E90000301808108950F931F93D901082F10E05B :100E9000DF91CF910F91FF90EF9008952B834A83BC
:100EA0000831110508F0C2C2F801E75AF84F0C9456 :100EA00089830E94760C89814A812B81E3CFCF937D
:100EB0008C0D93077107CE0729087508C1080D0925 :100EB000DF93FB01DC0112962C91222329F02034D0
:100EC000B809BD09C209C509C909CC09D409DC0999 :100EC00079F082ED808308C01082A0910201B09178
:100ED000E009E309E709F009F709FB09030A0A0A2F :100ED0000301EC018C818C93CF01DF91CF910895B8
:100EE0000E0A4631510508F0A3C2FA01E658F84F40 :100EE000108281E08183A0910201B09103018C9175
:100EF0000C948C0D900796079A079E07A207A607E9 :100EF0008283F2CFE0910201F09103018083089593
:100F0000AA07AE07B207B607BA07BE07C207C607E9 :100F0000E0910201F0910301808108950F931F93F6
:100F1000180A180A180A180A180A180A180ACA0712 :100F1000D901082F10E00831110508F0C2C2F8010C
:100F20003898409A80E01F910F9108953998419A1E :100F2000EC56F84F0C94CB0ECE07AC0709086408BA
:100F300080E0F9CF3A98429A80E0F5CF3B98439A07 :100F3000B008FC084809F309F809FD09000A040A89
:100F400080E0F1CF3C98449A80E0EDCF3D98459AFF :100F4000070A0F0A170A1B0A1E0A220A2B0A320A6C
:100F500080E0E9CF3E98469A80E0E5CF3F98479AF7 :100F5000360A3E0A450A490A4631510508F0A3C23D
:100F600080E0E1CF5098589A80E0DDCF5198599AAF :100F6000FA01EB54F84F0C94CB0ECB07D107D50701
:100F700080E0D9CF53985B9A80E0D5CF55985D9AA1 :100F7000D907DD07E107E507E907ED07F107F50701
:100F800080E0D1CF56985E9A80E0CDCF57985F9A97 :100F8000F907FD070108530A530A530A530A530A83
:100F900080E0C9CF5098589A80E0C5CF46315105BE :100F9000530A530A05083898409A80E01F910F9130
:100FA00008F048C2FA01E952F84F0C948C0DED0795 :100FA00008953998419A80E0F9CF3A98429A80E0C2
:100FB000F107F507F907FD070108050809080D08FD :100FB000F5CF3B98439A80E0F1CF3C98449A80E08B
:100FC0001108150819081D0821081A0A1A0A1A0A10 :100FC000EDCF3D98459A80E0E9CF3E98469A80E083
:100FD0001A0A1A0A1A0A1A0A25083898409880E04C :100FD000E5CF3F98479A80E0E1CF5098589A80E05B
:100FE000A2CF3998419880E09ECF3A98429880E00D :100FE000DDCF5198599A80E0D9CF53985B9A80E031
:100FF0009ACF3B98439880E096CF3C98449880E005 :100FF000D5CF55985D9A80E0D1CF56985E9A80E023
:1010000092CF3D98459880E08ECF3E98469880E0FC :10100000CDCF57985F9A80E0C9CF5098589A80E02A
:101010008ACF3F98479880E086CF5098589880E0D4 :10101000C5CF4631510508F048C2FA01EE5EF74FE0
:1010200082CF5198599880E07ECF53985B9880E0AA :101020000C94CB0E28082C083008340838083C08EB
:101030007ACF55985D9880E076CF56985E9880E09C :101030004008440848084C085008540858085C0800
:1010400072CF57985F9880E06ECF5098589880E0A4 :10104000550A550A550A550A550A550A550A60089F
:101050006ACF4631510508F0EFC1FA01EE5CF74F57 :101050003898409880E0A2CF3998419880E09ECFA0
:101060000C948C0D48084B084E085108540857083A :101060003A98429880E09ACF3B98439880E096CF98
:101070005A085D0860086308660869086C086F080C :101070003C98449880E092CF3D98459880E08ECF90
:101080001C0A1C0A1C0A1C0A1C0A1C0A1C0A7208DC :101080003E98469880E08ACF3F98479880E086CF88
:10109000389A80E048CF399A80E045CF3A9A80E08C :101090005098589880E082CF5198599880E07ECF40
:1010A00042CF3B9A80E03FCF3C9A80E03CCF3D9AD4 :1010A00053985B9880E07ACF55985D9880E076CF32
:1010B00080E039CF3E9A80E036CF3F9A80E033CF50 :1010B00056985E9880E072CF57985F9880E06ECF28
:1010C000509A80E030CF519A80E02DCF539A80E043 :1010C0005098589880E06ACF4631510508F0EFC13A
:1010D0002ACF559A80E027CF569A80E024CF579A9E :1010D000FA01E359F74F0C94CB0E83088608890870
:1010E00080E021CF509A80E01ECF4631510508F0B4 :1010E0008C088F089208950898089B089E08A1080C
:1010F000A5C1FA01E258F74F0C948C0D940897089B :1010F000A408A708AA08570A570A570A570A570AFE
:101100009A089D08A008A308A608A908AC08AF087B :10110000570A570AAD08389A80E048CF399A80E0EC
:10111000B208B508B808BB081E0A1E0A1E0A1E0A35 :1011100045CF3A9A80E042CF3B9A80E03FCF3C9A5D
:101120001E0A1E0A1E0ABE08409880E0FCCE4198A6 :1011200080E03CCF3D9A80E039CF3E9A80E036CFD8
:1011300080E0F9CE429880E0F6CE439880E0F3CE8E :101130003F9A80E033CF509A80E030CF519A80E0E0
:10114000449880E0F0CE459880E0EDCE469880E06F :101140002DCF539A80E02ACF559A80E027CF569A28
:10115000EACE479880E0E7CE589880E0E4CE5998F0 :1011500080E024CF579A80E021CF509A80E01ECFC4
:1011600080E0E1CE5B9880E0DECE5D9880E0DBCE73 :101160004631510508F0A5C1FA01E754F74F0C9438
:101170005E9880E0D8CE5F9880E0D5CE589880E029 :10117000CB0ECF08D208D508D808DB08DE08E10876
:10118000D2CE4631510508F05BC1FA01E653F74F64 :10118000E408E708EA08ED08F008F308F608590A49
:101190000C948C0DE008E308E608E908EC08EF0879 :10119000590A590A590A590A590A590AF908409824
:1011A000F208F508F808FB08FE0801090409070918 :1011A00080E0FCCE419880E0F9CE429880E0F6CE17
:1011B000200A200A200A200A200A200A200A0A09F6 :1011B000439880E0F3CE449880E0F0CE459880E0FC
:1011C000409A80E0B0CE419A80E0ADCE429A80E075 :1011C000EDCE469880E0EACE479880E0E7CE58988A
:1011D000AACE439A80E0A7CE449A80E0A4CE459A56 :1011D00080E0E4CE599880E0E1CE5B9880E0DECEFE
:1011E00080E0A1CE469A80E09ECE479A80E09BCEDA :1011E0005D9880E0DBCE5E9880E0D8CE5F9880E0AE
:1011F000589A80E098CE599A80E095CE5B9A80E02C :1011F000D5CE589880E0D2CE4631510508F05BC17B
:1012000092CE5D9A80E08FCE5E9A80E08CCE5F9A1F :10120000FA01EB5FF64F0C94CB0E1B091E09210966
:1012100080E089CE589A80E086CE82E08C93463179 :10121000240927092A092D09300933093609390912
:10122000510508F0A2C0FA01E85EF64F0C948C0D4F :101220003C093F0942095B0A5B0A5B0A5B0A5B0AED
:101230002E0937094009490952095B0964096D09FA :101230005B0A5B0A4509409A80E0B0CE419A80E0A3
:1012400076097F09880991099A09A309B509B509A1 :10124000ADCE429A80E0AACE439A80E0A7CE449ADF
:10125000B509B509B509B509B509AC0986B18170FB :1012500080E0A4CE459A80E0A1CE469A80E09ECE62
:1012600011968C93119712961C9280E05CCE86B1F9 :10126000479A80E09BCE589A80E098CE599A80E0C9
:10127000827090E012969C938E93119780E053CEEB :1012700095CE5B9A80E092CE5D9A80E08FCE5E9AAA
:1012800086B1847090E012969C938E93119780E0C3 :1012800080E08CCE5F9A80E089CE589A80E086CE4E
:101290004ACE86B1887090E012969C938E931197F7 :1012900082E08C934631510508F0A2C0FA01ED5A64
:1012A00080E041CE86B1807190E012969C938E933F :1012A000F64F0C94CB0E690972097B0984098D09EC
:1012B000119780E038CE86B1807290E012969C93B0 :1012B00096099F09A809B109BA09C309CC09D5093A
:1012C0008E93119780E02FCE86B1807490E01296B5 :1012C000DE09F009F009F009F009F009F009F00968
:1012D0009C938E93119780E026CE86B1807890E023 :1012D000E70986B1817011968C93119712961C9232
:1012E00012969C938E93119780E01DCE89B18170E8 :1012E00080E05CCE86B1827090E012969C938E93E3
:1012F00011968C93119712961C9280E014CE89B1AE :1012F000119780E053CE86B1847090E012969C9353
:10130000827090E012969C938E93119780E00BCEA2 :101300008E93119780E04ACE86B1887090E0129655
:1013100089B1887090E012969C938E93119780E02B :101310009C938E93119780E041CE86B1807190E0CE
:1013200002CE89B1807290E012969C938E931197B1 :1013200012969C938E93119780E038CE86B180728E
:1013300080E0F9CD89B1807490E012969C938E93F1 :1013300090E012969C938E93119780E02FCE86B109
:10134000119780E0F0CD89B1807890E012969C935F :10134000807490E012969C938E93119780E026CE45
:101350008E93119780E0E7CD89B1817011968C93BF :1013500086B1807890E012969C938E93119780E0EE
:10136000119712961C9280E0DECD1C928DE8DBCDA9 :101360001DCE89B1817011968C93119712961C92A3
:1013700014B88FEF85B980E0D6CD14B88FEF85B95A :1013700080E014CE89B1827090E012969C938E9397
:1013800080E0D1CD14B880E0CECD8FEF84B980E07D :10138000119780E00BCE89B1887090E012969C9303
:10139000CACD45B980E0C7CD83B111968C93119722 :101390008E93119780E002CE89B1807290E0129610
:1013A00081E08C9380E0BFCD14B88FEF85B93F9A70 :1013A0009C938E93119780E0F9CD89B1807490E081
:1013B000479881B980E0B7CD8FEF82B980E0B3CD97 :1013B00012969C938E93119780E0F0CD89B180783E
:1013C00011B880E0B0CD8FEF81B980E0ACCD42B9EB :1013C00090E012969C938E93119780E0E7CD89B1BF
:1013D0008FEF84B955B9479A479814B880E0A3CDE8 :1013D000817011968C93119712961C9280E0DECD4D
:1013E00014B88FEF85B9579A5F9880E09CCD5798D5 :1013E0001C928DE8DBCD14B88FEF85B980E0D6CDA7
:1013F0005F9A80E098CD8FEF84B945B95F9A5F9886 :1013F00014B88FEF85B980E0D1CD14B880E0CECDA0
:1014000014B880E090CD14B88FEF85B9579A5F98E3 :101400008FEF84B980E0CACD45B980E0C7CD83B104
:1014100080E089CD57985F9A80E085CD8FEF84B9C1 :1014100011968C93119781E08C9380E0BFCD14B826
:1014200045B95F9A5F9814B880E07DCD8CE87BCD9C :101420008FEF85B93F9A479881B980E0B7CD8FEFAC
:101430008DE879CD8DE877CD8DE875CD8DE873CDCC :1014300082B980E0B3CD11B880E0B0CD8FEF81B933
:101440008DE871CD82B98FEF84B995B9479A4798E5 :1014400080E0ACCD42B98FEF84B955B9479A47983F
:1014500014B841984498000000000000000083B1D7 :1014500014B880E0A3CD14B88FEF85B9579A5F9880
:10146000449A419A089582B98FEF84B995B9479A01 :1014600080E09CCD57985F9A80E098CD8FEF84B94B
:10147000479814B884B965B94598419800000000B0 :1014700045B95F9A5F9814B880E090CD14B88FEFAB
:1014800000000000459A419A14B80895CF93DF9365 :1014800085B9579A5F9880E089CD57985F9A80E038
:10149000952FE901813099F020F0823059F08AEAE5 :1014900085CD8FEF84B945B95F9A5F9814B880E025
:1014A00006C09FEF94B945B95F9A5F9814B8DF9171 :1014A0007DCD8CE87BCD8DE879CD8DE877CD8DE84D
:1014B000CF910895842F0E94330A80E0F8CF88836B :1014B00075CD8DE873CD8DE871CD82B98FEF84B98C
:1014C000842F0E94220A8983F8CF9FEF94B985B9AF :1014C00095B9479A479814B841984498000000008D
:1014D000459841980000000000000000459A419A9C :1014D0000000000083B1449A419A089582B98FEFC9
:1014E00014B80895EF92FF920F93CF93DF9300D03B :1014E00084B995B9479A479814B884B965B94598AD
:1014F0001F92CDB7DEB77C018FEF84B965B9479AEB :1014F00041980000000000000000459A419A14B88D
:10150000479814B84498419842B980E0011119C035 :101500000895CF93DF93952FE901813099F020F072
:10151000000000000000000093B1F701E80FF11D8A :10151000823059F08AEA06C09FEF94B945B95F9AC4
:1015200090834F5F42B98F5F281780F7449A419AA2 :101520005F9814B8DF91CF910895842F0E946E0ABE
:101530000F900F900F90DF91CF910F91FF90EF9050 :1015300080E0F8CF8883842F0E945D0A8983F8CFEA
:1015400008952B834A8389830E94370B0000000093 :101540009FEF94B985B945984198000000000000CC
:10155000000089814A812B81DFCFCF93DF931F92D7 :101550000000459A419A14B80895EF92FF920F93B4
:10156000CDB7DEB7FC018FEF809307011092080121 :10156000CF93DF9300D01F92CDB7DEB77C018FEF12
:1015700087E091E090938D0380938C03868189832B :1015700084B965B9479A479814B84498419842B9D4
:101580008181833049F130F4813091F08230D9F09B :1015800080E0011119C0000000000000000093B1CC
:1015900080E816C0853091F140F18730C9F7AE017F :10159000F701E80FF11D90834F5F42B98F5F281765
:1015A0004F5F5F4F67E071E0CF010E941C072EC0C4 :1015A00080F7449A419A0F900F900F90DF91CF915E
:1015B0004481558128E031E0638182810E944B079C :1015B0000F91FF90EF9008952B834A8389830E94B7
:1015C0008093070127C04481558128E031E0638181 :1015C000760C00000000000089814A812B81DFCF6A
:1015D00082810E94B005F4CF4481558128E031E03A :1015D00020E030E02817390709F4089500000000E2
:1015E000638182810E947706EBCF4481558128E098 :1015E0002F5F3F4FF7CFCF93DF934091820350E0BF
:1015F00031E0638182810E94460AE2CFAE014F5FF3 :1015F00020E030E060E084E00E94860780E190E037
:101600005F4F67E071E0CF010E94790190938D03F5 :101600000E94E80A4091820350E020E030E060E070
:1016100080938C0389810F90DF91CF910895E091A1 :1016100085E00E948607C4E0D0E04091820350E05C
:101620006303F0916403278144815581322F360F83 :1016200020E030E060E084E00E9486078EEC92E0EB
:10163000231312C0E0916303F09164038781860F46 :101630000E94E80A4091820350E020E030E060E040
:10164000878380913201861B8093320181110DC006 :1016400085E00E948607219741F7C4E0D0E084E658
:1016500088E9838381E00895FC017191CF01FA014B :1016500091E00E94E80A4091820350E020E030E0EF
:10166000E20FF11D70832F5FE3CF80E00895CF93E9 :1016600060E084E00E94860783E691E00E94E80A39
:10167000DF9360918E03635067FD91C080918B036F :101670004091820350E020E030E060E085E00E948D
:10168000CCE0D0E0C81BD109CE56DC4F80918A0354 :101680008607219721F7DF91CF910895409182033A
:101690008D3209F0CFC0683009F07FC083EC8093B1 :1016900050E020E030E060E084E00E94860780E1D6
:1016A0007E038AE58093050110920F018881807680 :1016A00090E00E94E80A4091820350E020E030E0A0
:1016B00079F0CE010E94AD0A8F3F09F466C09F8188 :1016B00060E085E00C94860781E00895482F90E073
:1016C000911169C09E81981708F065C0892F63C089 :1016C000982F882720E0411103C0211180680895D8
:1016D0002A8110928703998191110AC01092880380 :1016D00020953FEF340F4323F6CF80E090E008954C
:1016E00027E833E082E030938D0320938C03E7CF2B :1016E0001F93CF93DF931F92CDB7DEB7182F892FAB
:1016F000953029F420938F0327E833E0F4CF963018 :1016F00069830E945E0B812F0E945E0B6981862F99
:1017000099F59B81913059F48EE890E090938D0388 :101700000E945E0B81E00F90DF91CF911F910895B1
:1017100080938C0382E190E490930F01D0CF9230BC :101710000F931F93CF93DF931F92CDB7DEB789014D
:1017200019F48CE790E0F2CF9330A9F7211108C0AB :10172000823009F130F4882381F08130C1F082E801
:1017300088EE90E090938D0380938C0384E0EBCF50 :1017300010C08131E9F08132D1F781E0F901808375
:10174000213041F48EEB90E090938D0380938C03D5 :10174000CA010E94700BF80111C089830E94F30A3C
:101750008AE2E1CF2230F9F680EA90E090938D039F :1017500089810F90DF91CF911F910F9108950E9481
:1017600080938C038EE1D7CF983059F0993019F4DB :10176000460B80E0F6CF81E0F90180838183F9CFD9
:1017700020939103C1CF81E09A3009F4BDCF80E07E :1017700082E0F901808312821182F3CFCF93DF934D
:10178000BBCF21E933E081E0AECF988197FD8E8118 :101780001F92CDB7DEB7DC018FEF80930701109277
:1017900090E890930F018093040110928E03809142 :10179000080187E091E0909392038093910316965D
:1017A000050184FF3AC0809104018F3FB1F1C82F39 :1017A0008C91169789831196EC9111974E2F50E0EA
:1017B000893008F0C8E08C1B8093040180917E037F :1017B000FA013197E830F10508F06EC0EE51F44FB0
:1017C00098E8892780937E03CC23D1F080918C0305 :1017C0000C94CB0EEA0BFA0B080C160C320C4C0CDA
:1017D00090918D0320910F0126FF3FC0AFE7B3E04A :1017D000430C240C14964D915C91159728E031E050
:1017E000FC012C2F34913D9331962150D9F701966D :1017E00013966C91139712968C910E9486078093A2
:1017F0002FEF2C0F820F911D90938D0380938C03FC :1017F000070144C014964D915C91159728E031E0A3
:101800006C2F8FE793E00E94520CCC5FCC3019F024 :1018000013966C91139712968C910E94DF05EFCF7F
:101810008FEF80930401C093050184E199B1947125 :1018100014964D915C91159728E031E013966C91E8
:1018200031F48150D9F710928F0310928903DF9120 :10182000139712968C910E94B206E1CF14964D91B7
:10183000CF91089580910F0187FFAFCFCE010E9415 :101830005C91159728E031E013966C9113971296FE
:101840000F0B8F3F21F48EE180930501A6CF8823F3 :101840008C910E94810AD3CF14964D915C9115978B
:1018500009F4A3CF10920401A0CFEFE7F3E0DC017D :1018500028E031E013966C91139712968C910E94B8
:101860002C2F3D9131932150E1F7C1CFE9E6F0E013 :10186000880BC5CFAE014F5F5F4F67E071E0CD01E0
:10187000808182608083E89A0895A82FB92F80E044 :101870000E947901909392038093910389810F9044
:1018800090E041E050EA609530E009C02D91822758 :10188000DF91CF910895AE014F5F5F4F67E071E048
:101890009795879510F084279527305EC8F36F5F82 :10189000CD010E945707EECF80E8A9CFE091630306
:1018A000A8F30895EADF8D939D930895CF93CFB762 :1018A000F0916403278144815581322F360F231331
:1018B000CF93DF93C3954C9BE9F74C9B0BC04C9B9C :1018B00012C0E0916303F09164038781860F8783F0
:1018C00009C04C9B07C04C9B05C04C9B03C04C9B64 :1018C00080913201861B8093320181110DC088E91D
:1018D00001C089C06F93C0918B03DD27CE56DC4FCA :1018D000838381E00895FC017191CF01FA01E20F49
:1018E0002F9365E54C9B03C02F916F91E6CF0F932B :1018E000F11D70832F5FE3CF80E00895CF93DF93E6
:1018F0001F934F9320E040E15F9309B1047104FB13 :1018F00060919303635067FD91C080919003CCE0A9
:1019000027F93F9350E03BE039C0147140642F77D2 :10190000D0E0C81BD109C956DC4F80918F038D32BE
:10191000012F5F5F1EC0406819B114712F775250BC :1019100009F0CFC0683009F07FC083EC8093830367
:101920001FC0406409B12F770471D1F15F5F00C01F :101920008AE58093050110920F018881807679F015
:1019300023C0406219B12F77147191F15F5F00C02D :10193000CE010E94BE0B8F3F09F466C09F819111BA
:1019400025C004711027515012F45D5F0000115042 :1019400069C09E81981708F065C0892F63C02A81FD
:1019500027952C3F19B1C8F614710127015027951E :1019500010928C03998191110AC010928D032CE88A
:101960002C3FC8F64227499309B1047110274F73E1 :1019600033E082E03093920320939103E7CF9530E8
:10197000115027952C3FA8F64695469519B114713C :1019700029F4209394032CE833E0F4CF963099F5C2
:1019800079F00127015027952C3F98F66B5A60F3A8 :101980009B81913059F48EE890E09093920380937C
:10199000315009B1B0F600C011E01CBB002717C0E0 :10199000910382E190E490930F01D0CF923019F43B
:1019A0003B503195C31BD04011E01CBB0881033C68 :1019A0008CE790E0F2CF9330A9F7211108C088EEC0
:1019B000F9F00B34E9F0209189031981110F12130A :1019B00090E0909392038093910384E0EBCF2130E9
:1019C000EDCF093651F10D3211F0013E39F7009398 :1019C00041F48EEB90E090939203809391038AE22E
:1019D00090033F915F914F911F910F912F916F91C4 :1019D000E1CF2230F9F680EA90E090939203809371
:1019E000CCB3C0FD67CFDF91CF91CFBFCF9118951A :1019E00091038EE1D7CF983059F0993019F42093B4
:1019F00020919003222369F310918E03112339F56E :1019F0009603C1CF81E09A3009F4BDCF80E0BBCF20
:101A000034303AF130938E0320938A0310918B0384 :101A000026E933E081E0AECF988197FD8E8190E8A2
:101A10003BE0311B30938B031CC000918E030130DF :101A100090930F018093040110929303809105012C
:101A2000B4F40AE53091050134FD14C000930501BA :101A200084FF3AC0809104018F3FB1F1C82F893003
:101A3000CEE7D3E013C0052710E000C000000BB9CB :101A300008F0C8E08C1B809304018091830398E830
:101A40001AC0052710E0221F1DC010E021C04AE582 :101A4000892780938303CC23D1F0809191039091D7
:101A500002C032ED432FC4E1D0E032E01AB114618C :101A5000920320910F0126FF3FC0A4E8B3E0FC01F0
:101A60005C9A0BB11AB954E120E865E320FF052721 :101A60002C2F34913D9331962150D9F701962FEFC9
:101A70000BB9279517951C3FF0F66695B8F7B1F7A7 :101A70002C0F820F911D90939203809391036C2FF2
:101A800020FF05270BB9279517951C3FD0F6279502 :101A800084E893E00E94910DCC5FCC3019F08FEF89
:101A9000179517FF052700001C3F0BB9B0F62991D9 :101A900080930401C093050184E199B1947131F4FC
:101AA0003A9519F70B7E10918F03110FC651D04054 :101AA0008150D9F71092940310928E03DF91CF9159
:101AB0000BB911F01093890311E01CBB00611AB13E :101AB000089580910F0187FFAFCFCE010E944E0C99
:101AC0001B7E402F4B7E54E05A95F1F70BB91AB9A3 :101AC0008F3F21F48EE180930501A6CF882309F48E
:101AD0004BB97FCF9EE088E10FB6F894A89580932C :101AD000A3CF10920401A0CFE4E8F3E0DC012C2FA7
:101AE00060000FBE909360000E94360C549A80E014 :101AE0003D9131932150E1F7C1CFE9E6F0E08081EB
:101AF000815051F4549878940E941005A8950E9442 :101AF00082608083E89A0895A82FB92F80E090E053
:101B0000370B0E94A802FACFA895EFE9FFE03197C2 :101B000041E050EA609530E009C02D918227979519
:101B1000F1F700C00000ECCFEE0FFF1F0590F4912D :101B1000879510F084279527305EC8F36F5FA8F390
:081B2000E02D0994F894FFCFB9 :101B20000895EADF8D939D930895CF93CFB7CF9318
:061B280063016503FF5A92 :101B3000DF93C3954C9BE9F74C9B0BC04C9B09C0B2
:101B40004C9B07C04C9B05C04C9B03C04C9B01C0E9
:101B500089C06F93C0919003DD27C956DC4F2F9346
:101B600065E54C9B03C02F916F91E6CF0F931F93B8
:101B70004F9320E040E15F9309B1047104FB27F922
:101B80003F9350E03BE039C0147140642F77012F40
:101B90005F5F1EC0406819B114712F7752501FC08B
:101BA000406409B12F770471D1F15F5F00C023C099
:101BB000406219B12F77147191F15F5F00C025C0A9
:101BC00004711027515012F45D5F000011502795E9
:101BD0002C3F19B1C8F614710127015027952C3FED
:101BE000C8F64227499309B1047110274F73115069
:101BF00027952C3FA8F64695469519B1147179F0B2
:101C00000127015027952C3F98F66B5A60F331500D
:101C100009B1B0F600C011E01CBB002717C03B5053
:101C20003195C31BD04011E01CBB0881033CF9F087
:101C30000B34E9F020918E031981110F1213EDCFAF
:101C4000093651F10D3211F0013E39F70093950339
:101C50003F915F914F911F910F912F916F91CCB355
:101C6000C0FD67CFDF91CF91CFBFCF911895209165
:101C70009503222369F310919303112339F534302E
:101C80003AF13093930320938F03109190033BE03C
:101C9000311B309390031CC0009193030130B4F4C6
:101CA0000AE53091050134FD14C000930501C3E835
:101CB000D3E013C0052710E000C000000BB91AC024
:101CC000052710E0221F1DC010E021C04AE502C018
:101CD00032ED432FC4E1D0E032E01AB114615C9AD6
:101CE0000BB11AB954E120E865E320FF05270BB9D1
:101CF000279517951C3FF0F66695B8F7B1F720FFCA
:101D000005270BB9279517951C3FD0F627951795F2
:101D100017FF052700001C3F0BB9B0F629913A9533
:101D200019F70B7E10919403110FC651D0400BB9D7
:101D300011F010938E0311E01CBB00611AB11B7EE1
:101D4000402F4B7E54E05A95F1F70BB91AB94BB9B5
:101D50007FCF9EE088E10FB6F894A895809360004D
:101D60000FBE909360000E94750D549A80E08150E0
:101D700051F4549878940E942305A8950E94760CFB
:101D80000E94A802FACFA895EFE9FFE03197F1F79A
:101D900000C00000ECCFEE0FFF1F0590F491E02D86
:061DA0000994F894FFCF46
:061DA60063016503FF5A12
:00000001FF :00000001FF

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -106,6 +106,10 @@ speed_dir:
//;mov speed, #4 //;4 = 1.25usec bit time delay variable //;mov speed, #4 //;4 = 1.25usec bit time delay variable
//;mov speed, #22 //;mov speed, #22
//;TODO should probably disable interrupts while transferring data via SWIM as it's timing sensitive
//; haven't touched this code in awhile and can't get myself to make this update right now..
//; may want something similar when entering swim activation
//; set pushpull and opendrain to values we can write to otyper register //; set pushpull and opendrain to values we can write to otyper register
//; to quickly change direction of the SWIM pin only //; to quickly change direction of the SWIM pin only
ldr pushpull, [swim_base, #OTYPER] ldr pushpull, [swim_base, #OTYPER]

View File

@ -105,6 +105,11 @@ uint8_t write_page_chr( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr
} }
//#define PRGM_MODE() swim_wotf(SWIM_HS, 0x500F, 0x40)
//#define PLAY_MODE() swim_wotf(SWIM_HS, 0x500F, 0x00)
#define PRGM_MODE() EXP0_LO()
#define PLAY_MODE() EXP0_HI()
uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr wr_func, read_funcptr rd_func ) uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr wr_func, read_funcptr rd_func )
{ {
uint16_t cur = buff->cur_byte; uint16_t cur = buff->cur_byte;
@ -119,7 +124,19 @@ uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcpt
//set to program mode for first entry //set to program mode for first entry
EXP0_LO(); //EXP0_LO();
//swim_wotf(SWIM_HS, 0x500F, 0x40)
PRGM_MODE();
//; TODO I don't think all these NOPs are actually needed, but they work and don't seem to significantly affect program time on stm32
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
//enter unlock bypass mode //enter unlock bypass mode
wr_func( 0x0AAA, 0xAA ); wr_func( 0x0AAA, 0xAA );
@ -161,7 +178,16 @@ uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcpt
//and optimizing flash routine to get time down. //and optimizing flash routine to get time down.
//exit program mode //exit program mode
EXP0_HI(); // EXP0_HI();
PLAY_MODE();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
//pre-fetch next byte of data //pre-fetch next byte of data
//cur_data = buff->data[n+1]; //cur_data = buff->data[n+1];
#ifdef AVR_CORE #ifdef AVR_CORE
@ -183,21 +209,66 @@ uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcpt
usbPoll(); usbPoll();
read = rd_func((addrH<<8)|n); read = rd_func((addrH<<8)|n);
//prepare for upcoming write cycle, or allow for a polling read //prepare for upcoming write cycle, or allow for a polling read
EXP0_LO(); //EXP0_LO();
PRGM_MODE();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
//First check if already outputting final data //First check if already outputting final data
if (read != buff->data[n] ) { if (read != buff->data[n] ) {
//if not, lets see if toggle is occuring //if not, lets see if toggle is occuring
EXP0_HI(); //EXP0_HI();
PLAY_MODE();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
while( read != rd_func((addrH<<8)|n) ){ while( read != rd_func((addrH<<8)|n) ){
EXP0_LO(); //EXP0_LO();
PRGM_MODE();
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
EXP0_HI(); NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
//EXP0_HI();
PLAY_MODE();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
read = rd_func((addrH<<8)|n); read = rd_func((addrH<<8)|n);
} }
//prepare for upcoming write cycle //prepare for upcoming write cycle
EXP0_LO(); //EXP0_LO();
PRGM_MODE();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
} }
// //IDK why, but AVR will exit early sometimes // //IDK why, but AVR will exit early sometimes
@ -236,7 +307,8 @@ uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcpt
wr_func( 0x0000, 0xF0 ); wr_func( 0x0000, 0xF0 );
//exit program mode //exit program mode
EXP0_HI(); //EXP0_HI();
PLAY_MODE();
return SUCCESS; return SUCCESS;

View File

@ -4,6 +4,7 @@
#include "pinport.h" #include "pinport.h"
#include "types.h" #include "types.h"
#include "nes.h" #include "nes.h"
#include "swim.h"
#include "shared_dictionaries.h" #include "shared_dictionaries.h"
#include "shared_errors.h" #include "shared_errors.h"

View File

@ -181,6 +181,7 @@ void snes_init()
//disable SRAM and put cart in PLAY mode //disable SRAM and put cart in PLAY mode
EXP0_HI(); EXP0_HI();
EXP0_OP(); EXP0_OP();
//if SWIM is active, EXP0 must be set to pullup prior to SWIM transfers
//other control pins are inputs or unused, leave as IP pullup from reset //other control pins are inputs or unused, leave as IP pullup from reset

View File

@ -5,6 +5,7 @@ local dump = {}
-- import required modules -- import required modules
local dict = require "scripts.app.dict" local dict = require "scripts.app.dict"
local buffers = require "scripts.app.buffers" local buffers = require "scripts.app.buffers"
local snes = require "scripts.app.snes"
-- file constants -- file constants
@ -246,9 +247,12 @@ local function dump_snes( file, mapping, debug )
if debug then print("dumping cart") end if debug then print("dumping cart") end
--start with reset and init --start with reset and init
dict.io("IO_RESET") --dict.io("IO_RESET")
dict.io("SNES_INIT") dict.io("SNES_INIT")
--set cart in play mode
snes.play_mode()
--setup buffers and manager --setup buffers and manager
dict.operation("SET_OPERATION", op_buffer["RESET"] ) dict.operation("SET_OPERATION", op_buffer["RESET"] )
--reset buffers first --reset buffers first
@ -319,10 +323,12 @@ local function dump_snes( file, mapping, debug )
file:write( dict.buffer_payload_in( buff_size )) file:write( dict.buffer_payload_in( buff_size ))
-- print("dumped page:", i) -- print("dumped page:", i)
if ( (i % (1024*1024/buff_size/16)) == 0) then --if ( (i % (1024*1024/buff_size/16)) == 0) then
if ( (i % (4*2024*1024/buff_size/16)) == 0) then
local tdelta = os.clock() - tlast local tdelta = os.clock() - tlast
print("time delta:", tdelta, "seconds, speed:", (1024/16/tdelta), "KBps"); print("time delta:", tdelta, "seconds, speed:", (1024/16/tdelta), "KBps");
print("dumped part:", i/1024, "of 16 \n") --print("dumped part:", i/1024, "of 16 \n")
print("dumped part:", i/(4*1024), "of 4 \n")
tlast = os.clock(); tlast = os.clock();
end end
end end
@ -354,7 +360,7 @@ local function dump_snes( file, mapping, debug )
--reset io at end --reset io at end
dict.operation("SET_OPERATION", op_buffer["RESET"] ) dict.operation("SET_OPERATION", op_buffer["RESET"] )
dict.buffer("RAW_BUFFER_RESET") dict.buffer("RAW_BUFFER_RESET")
dict.io("IO_RESET") -- dict.io("IO_RESET")
return true return true
end end

View File

@ -4,6 +4,8 @@ local erase = {}
-- import required modules -- import required modules
local dict = require "scripts.app.dict" local dict = require "scripts.app.dict"
--local swim = require "scripts.app.swim"
local snes = require "scripts.app.snes"
-- file constants -- file constants
@ -61,14 +63,14 @@ local function erase_snes(debug)
print("erasing SNES takes about 30sec"); print("erasing SNES takes about 30sec");
dict.io("IO_RESET") -- dict.io("IO_RESET")
dict.io("SNES_INIT") dict.io("SNES_INIT")
--WR $AAA:AA $555:55 $AAA:AA --WR $AAA:AA $555:55 $AAA:AA
dict.snes("SNES_SET_BANK", 0x00) dict.snes("SNES_SET_BANK", 0x00)
--put cart in program mode --put cart in program mode
dict.pinport("CTL_SET_LO", "SNES_RST") snes.prgm_mode()
dict.snes("SNES_ROM_WR", 0x0AAA, 0xAA) dict.snes("SNES_ROM_WR", 0x0AAA, 0xAA)
dict.snes("SNES_ROM_WR", 0x0555, 0x55) dict.snes("SNES_ROM_WR", 0x0555, 0x55)
@ -78,7 +80,7 @@ local function erase_snes(debug)
dict.snes("SNES_ROM_WR", 0x0AAA, 0x10) dict.snes("SNES_ROM_WR", 0x0AAA, 0x10)
--exit program mode --exit program mode
dict.pinport("CTL_SET_HI", "SNES_RST") snes.play_mode()
rv = dict.snes("SNES_ROM_RD", 0x0000) rv = dict.snes("SNES_ROM_RD", 0x0000)
@ -92,13 +94,16 @@ local function erase_snes(debug)
print(i, " done erasing snes.\n"); print(i, " done erasing snes.\n");
--put cart in program mode --put cart in program mode
dict.pinport("CTL_SET_LO", "SNES_RST") -- swim.start()
snes.prgm_mode()
--reset flash --reset flash
dict.snes("SNES_ROM_WR", 0x0000, 0xF0) dict.snes("SNES_ROM_WR", 0x0000, 0xF0)
--return to PLAY mode --return to PLAY mode
dict.pinport("CTL_SET_HI", "SNES_RST") print("erase play")
snes.play_mode()
print("erase play")
end end

View File

@ -5,6 +5,7 @@ local flash = {}
-- import required modules -- import required modules
local dict = require "scripts.app.dict" local dict = require "scripts.app.dict"
local buffers = require "scripts.app.buffers" local buffers = require "scripts.app.buffers"
local snes = require "scripts.app.snes"
-- file constants -- file constants
@ -390,7 +391,7 @@ local function flash_snes( file, debug )
if debug then print("flashing cart") end if debug then print("flashing cart") end
-- //start with reset and init -- //start with reset and init
dict.io("IO_RESET") -- dict.io("IO_RESET")
dict.io("SNES_INIT") dict.io("SNES_INIT")
-- //start operation at reset -- //start operation at reset
@ -420,7 +421,7 @@ local function flash_snes( file, debug )
dict.buffer("SET_MAP_N_MAPVAR", (op_buffer["LOROM"]<<8 | op_buffer["NOVAR"]), buff1 ) dict.buffer("SET_MAP_N_MAPVAR", (op_buffer["LOROM"]<<8 | op_buffer["NOVAR"]), buff1 )
--set cart in program mode --set cart in program mode
dict.pinport("CTL_SET_LO", "SNES_RST") snes.prgm_mode()
print("\n\nsetting operation STARTFLASH"); print("\n\nsetting operation STARTFLASH");
-- //inform buffer manager to start dumping operation now that buffers are initialized -- //inform buffer manager to start dumping operation now that buffers are initialized
@ -451,10 +452,15 @@ local function flash_snes( file, debug )
if ( i == 2048*1024/buff_size) then break end if ( i == 2048*1024/buff_size) then break end
-- if ( i == 32*1024/buff_size) then break end -- if ( i == 32*1024/buff_size) then break end
i = i + 1 i = i + 1
if ( (i % (2048*1024/buff_size/16)) == 0) then -- if ( (i % (2048*1024/buff_size/16)) == 0) then
-- local tdelta = os.clock() - tlast
-- print("time delta:", tdelta, "seconds, speed:", (2048/16/tdelta), "KBps");
-- print("flashed part:", i/512, "of 16 \n")
-- tlast = os.clock();
if ( (i % (4*2048*1024/buff_size/16)) == 0) then
local tdelta = os.clock() - tlast local tdelta = os.clock() - tlast
print("time delta:", tdelta, "seconds, speed:", (2048/16/tdelta), "KBps"); print("time delta:", tdelta, "seconds, speed:", (4*2048/16/tdelta), "KBps");
print("flashed part:", i/512, "of 16 \n") print("flashed part:", i/(4*512), "of 4 \n")
tlast = os.clock(); tlast = os.clock();
end end
end end
@ -480,10 +486,10 @@ local function flash_snes( file, debug )
dict.operation("SET_OPERATION", op_buffer["RESET"] ) dict.operation("SET_OPERATION", op_buffer["RESET"] )
--set cart in play mode --set cart in play mode
dict.pinport("CTL_SET_HI", "SNES_RST") snes.play_mode()
dict.buffer("RAW_BUFFER_RESET") dict.buffer("RAW_BUFFER_RESET")
dict.io("IO_RESET") -- dict.io("IO_RESET")
end end

View File

@ -4,13 +4,38 @@ local snes = {}
-- import required modules -- import required modules
local dict = require "scripts.app.dict" local dict = require "scripts.app.dict"
local swim = require "scripts.app.swim"
-- file constants -- file constants
local RESET_VECT_HI = 0xFFFD local RESET_VECT_HI = 0xFFFD
local RESET_VECT_LO = 0xFFFC local RESET_VECT_LO = 0xFFFC
-- global variables so other modules can use them
snes_swimcart = nil
-- local functions -- local functions
local function prgm_mode(debug)
if debug then print("going to program mode, swim:", snes_swimcart) end
if snes_swimcart then
print("ERROR cart got set to swim mode somehow!!!")
-- swim.snes_v3_prgm(debug)
else
dict.pinport("CTL_SET_LO", "SNES_RST")
end
end
local function play_mode(debug)
if debug then print("going to play mode, swim:", snes_swimcart) end
if snes_swimcart then
-- swim.snes_v3_play(debug)
print("ERROR cart got set to swim mode somehow!!!")
else
dict.pinport("CTL_SET_HI", "SNES_RST")
end
end
-- Desc:read reset vector from passed in bank -- Desc:read reset vector from passed in bank
-- Pre: snes_init() been called to setup i/o -- Pre: snes_init() been called to setup i/o
-- Post:Address left on bus memories disabled -- Post:Address left on bus memories disabled
@ -18,7 +43,7 @@ local RESET_VECT_LO = 0xFFFC
local function read_reset_vector( bank, debug ) local function read_reset_vector( bank, debug )
--ensure cart is in play mode --ensure cart is in play mode
dict.pinport("CTL_SET_HI", "SNES_RST") play_mode()
--first set SNES bank A16-23 --first set SNES bank A16-23
dict.snes("SNES_SET_BANK", bank) dict.snes("SNES_SET_BANK", bank)
@ -49,14 +74,15 @@ local function read_flashID( debug )
dict.snes("SNES_SET_BANK", 0x00) dict.snes("SNES_SET_BANK", 0x00)
--put cart in program mode --put cart in program mode
dict.pinport("CTL_SET_LO", "SNES_RST") --v3.0 boards don't use EXP0 for program mode, must use SWIM via CIC
prgm_mode()
dict.snes("SNES_ROM_WR", 0x0AAA, 0xAA) dict.snes("SNES_ROM_WR", 0x0AAA, 0xAA)
dict.snes("SNES_ROM_WR", 0x0555, 0x55) dict.snes("SNES_ROM_WR", 0x0555, 0x55)
dict.snes("SNES_ROM_WR", 0x0AAA, 0x90) dict.snes("SNES_ROM_WR", 0x0AAA, 0x90)
--exit program mode --exit program mode
dict.pinport("CTL_SET_HI", "SNES_RST") play_mode()
--read manf ID --read manf ID
local manf_id = dict.snes("SNES_ROM_RD", 0x0000) local manf_id = dict.snes("SNES_ROM_RD", 0x0000)
@ -71,14 +97,13 @@ local function read_flashID( debug )
if debug then print("attempted read SNES boot sect ID:", string.format("%X", boot_sect)) end if debug then print("attempted read SNES boot sect ID:", string.format("%X", boot_sect)) end
--put cart in program mode --put cart in program mode
dict.pinport("CTL_SET_LO", "SNES_RST") prgm_mode()
--exit software --exit software
dict.snes("SNES_ROM_WR", 0x0000, 0xF0) dict.snes("SNES_ROM_WR", 0x0000, 0xF0)
--exit program mode --exit program mode
dict.pinport("CTL_SET_HI", "SNES_RST") play_mode()
--return true if detected flash chip --return true if detected flash chip
if (manf_id == 0x01 and prod_id == 0x49) then if (manf_id == 0x01 and prod_id == 0x49) then
@ -89,8 +114,6 @@ local function read_flashID( debug )
end end
-- global variables so other modules can use them
-- call functions desired to run when script is called/imported -- call functions desired to run when script is called/imported
@ -98,6 +121,8 @@ end
-- functions other modules are able to call -- functions other modules are able to call
snes.read_reset_vector = read_reset_vector snes.read_reset_vector = read_reset_vector
snes.read_flashID = read_flashID snes.read_flashID = read_flashID
snes.prgm_mode = prgm_mode
snes.play_mode = play_mode
-- return the module's table -- return the module's table
return snes return snes

View File

@ -27,6 +27,7 @@ ECODE.HERR = 0x09
local cur_CSR = 0x00 local cur_CSR = 0x00
local SWIM_CSR = 0x7F80 local SWIM_CSR = 0x7F80
local DEF_MAX_NAK = 8
-- local functions -- local functions
local function get_key_for_value( t, value ) local function get_key_for_value( t, value )
@ -38,12 +39,12 @@ local function get_key_for_value( t, value )
return nil return nil
end end
local function system_reset() local function system_reset( debug )
--TODO if cur_CSR has bit 2 set, SWIM must be reactivated --TODO if cur_CSR has bit 2 set, SWIM must be reactivated
if dict.swim("SWIM_SRST") ~= ECODE.ACK then if dict.swim("SWIM_SRST") ~= ECODE.ACK then
print("ERROR unable to reset STM8 core") if debug then print("ERROR unable to reset STM8 core") end
else else
-- print("reset stm8 core") -- print("reset stm8 core")
end end
@ -58,6 +59,7 @@ local function reset_swim()
dict.swim("WOTF", SWIM_CSR, cur_CSR) dict.swim("WOTF", SWIM_CSR, cur_CSR)
end end
local function rotf(addr, hspeed, debug) local function rotf(addr, hspeed, debug)
local result = ECODE.NAK local result = ECODE.NAK
@ -93,39 +95,60 @@ local function rotf(addr, hspeed, debug)
return result, data return result, data
end end
local function wotf(addr, data, hspeed, debug) local function wotf(addr, data, hspeed, debug, maxnaks)
local result = ECODE.NAK local result = ECODE.NAK
local tries = 8 local tries = DEF_MAX_NAK
local resets = 3 local resets = 3
--allow calling function to increase max allowed NAKs
if maxnaks then
tries = maxnaks
end
local opcode = "WOTF" local opcode = "WOTF"
if hspeed then if hspeed then
opcode = "WOTF_HS" opcode = "WOTF_HS"
end end
while result ~= "ACK" and tries > 0 do while result ~= "ACK" and tries >= 0 do
result = dict.swim(opcode, addr, data) result = dict.swim(opcode, addr, data)
result = get_key_for_value( ECODE, result) result = get_key_for_value( ECODE, result)
if debug then print("wotf", string.format(" %X: %X, result ", addr, data), result) end if debug then print("wotf", string.format(" %X: %X, result ", addr, data), result) end
if result == "NORESP" then if result == "NORESP" then
reset_swim() reset_swim()
end end
if tries == 0 then tries = tries - 1
print("ERROR max tries exceeded") if tries < 0 then
print("ERROR max tries exceeded, resetting stm8")
reset_swim() reset_swim()
resets = resets - 1 resets = resets - 1
if resets > 0 then if resets > 0 then
tries = 5 tries = 5
print(" FAIL! max resets exceeded!!!!!")
end end
end end
tries = tries - 1
end end
--return the result of the final transfer --return the result of the final transfer
return result return result
end end
local function stop_and_reset()
--switch to low speed if was in high
dict.swim("SWIM_RESET")
--set bit 2 so SWIM module is also reset on system reset
cur_CSR = 0xA4
-- wotf(SWIM_CSR, cur_CSR)
--must rewrite current value of SWIM_CSR register as HIGHSPEED is cleared during SWIM RESET
wotf(SWIM_CSR, cur_CSR)
--print("resetting SWIM")
dict.swim("SWIM_SRST")
end
local function unlock_eeprom(hspeed) local function unlock_eeprom(hspeed)
--Write 0xAE then 56h in --Write 0xAE then 56h in
--FLASH_DUKR (0x00 5064)(1)(2) --FLASH_DUKR (0x00 5064)(1)(2)
@ -195,53 +218,54 @@ local function swim_test()
-- print("rotf :", string.format("%X %X", dict.swim("ROTF_HS", 0x4000))) -- print("rotf :", string.format("%X %X", dict.swim("ROTF_HS", 0x4000)))
-- --
-- --need to unlock the eeprom first! -- --need to unlock the eeprom first!
unlock_eeprom(true) -- unlock_eeprom(true)
-- --Write 0xAE then 56h in ---- --Write 0xAE then 56h in
-- --FLASH_DUKR (0x00 5064)(1)(2) ---- --FLASH_DUKR (0x00 5064)(1)(2)
-- print("wotf :", dict.swim("WOTF_HS", 0x5064, 0xAE)) ---- print("wotf :", dict.swim("WOTF_HS", 0x5064, 0xAE))
-- print("wotf :", dict.swim("WOTF_HS", 0x5064, 0x56)) ---- print("wotf :", dict.swim("WOTF_HS", 0x5064, 0x56))
---- --write data
-- rotf(0x4000, true)
-- wotf(0x4000, 0xDE, true)
-- wotf(0x4001, 0xAD, true)
-- wotf(0x4002, 0xBE, true)
-- wotf(0x4003, 0xEF, true)
---- print("wotf :", dict.swim("WOTF_HS", 0x4000, 0x00))
----
---- --lock eeprom
---- --Reset bit 3 (DUL)
-- lock_flash_eeprom(true)
---- --in FLASH_IAPSR (0x00 505F)
---- print("wotf :", dict.swim("WOTF_HS", 0x505F, 0x00))
----
---- print("rotf :", string.format("%X %X", dict.swim("ROTF_HS", 0x4000)))
-- rotf(0x4000, true)
-- rotf(0x4001, true)
-- rotf(0x4002, true)
-- rotf(0x4003, true)
--
----read then write to flash
---- print("rotf :", string.format("%X %X", dict.swim("ROTF_HS", 0x8028)))
--
-- --need to unlock the flash first!
-- unlock_flash(true)
-- --write data -- --write data
rotf(0x4000, true) -- print("WRITE DATA")
wotf(0x4000, 0xDE, true) -- local byte_addr = 0x8028
wotf(0x4001, 0xAD, true) -- local data = 0xFF
wotf(0x4002, 0xBE, true) -- while byte_addr < 0x8030 do
wotf(0x4003, 0xEF, true) -- wotf(byte_addr, data, true, true)
-- print("wotf :", dict.swim("WOTF_HS", 0x4000, 0x00))
-- --
-- --lock eeprom -- byte_addr = byte_addr + 1
-- --Reset bit 3 (DUL) ---- data = data + 0x11
lock_flash_eeprom(true)
-- --in FLASH_IAPSR (0x00 505F)
-- print("wotf :", dict.swim("WOTF_HS", 0x505F, 0x00))
-- --
-- print("rotf :", string.format("%X %X", dict.swim("ROTF_HS", 0x4000))) -- end
rotf(0x4000, true) -- --lock flash/eeprom
rotf(0x4001, true) -- lock_flash_eeprom(true)
rotf(0x4002, true) -- --read it back
rotf(0x4003, true)
--read then write to flash
-- print("rotf :", string.format("%X %X", dict.swim("ROTF_HS", 0x8028)))
--need to unlock the flash first!
unlock_flash(true)
--write data
print("WRITE DATA")
local byte_addr = 0x8028
local data = 0xFF
while byte_addr < 0x8030 do
wotf(byte_addr, data, true, true)
byte_addr = byte_addr + 1
-- data = data + 0x11
end
--lock flash/eeprom
lock_flash_eeprom(true)
--read it back
print("READ BACK DATA") print("READ BACK DATA")
local byte_addr = 0x8028 local byte_addr = 0x0200
while byte_addr < 0x8030 do while byte_addr < 0x0280 do
rotf(byte_addr, true, true) rotf(byte_addr, true, true)
byte_addr = byte_addr + 1 byte_addr = byte_addr + 1
@ -275,12 +299,12 @@ local function swim_test()
--indicate to logic analyzer that test sequence above is complete --indicate to logic analyzer that test sequence above is complete
-- dict.pinport("CTL_SET_LO", "EXP0") -- dict.pinport("CTL_SET_LO", "EXP0")
dict.io("IO_RESET") -- dict.io("IO_RESET")
end end
local function start() local function start( debug )
dict.io("IO_RESET") dict.io("IO_RESET")
@ -297,7 +321,7 @@ local function start()
--bit 7: masks internal reset sources (like WDT..?) --bit 7: masks internal reset sources (like WDT..?)
cur_CSR = 0xA0 cur_CSR = 0xA0
if wotf(SWIM_CSR, cur_CSR) == "ACK" then if wotf(SWIM_CSR, cur_CSR) == "ACK" then
print("Successfully established SWIM comms") if debug then print("Successfully established SWIM comms") end
else else
print("Unable to establish SWIM comms") print("Unable to establish SWIM comms")
return false return false
@ -315,7 +339,7 @@ local function start()
--reset the STM8 core --reset the STM8 core
-- dict.swim("SWIM_SRST") -- dict.swim("SWIM_SRST")
system_reset() system_reset( true )
--the STM8 core is now stalled @ reset vector --the STM8 core is now stalled @ reset vector
--can read/write to any address on STM8 core --can read/write to any address on STM8 core
@ -323,6 +347,8 @@ local function start()
--bit 2: SWIM is reset (exits active mode) when chip reset --bit 2: SWIM is reset (exits active mode) when chip reset
--this forces successful SWIM entry on each execution of script --this forces successful SWIM entry on each execution of script
--TODO if this bit is enabled bunch of other code here needs updated to re-establish SWIM
--via this routine when system is reset
-- cur_CSR = cur_CSR | 0x04 -- cur_CSR = cur_CSR | 0x04
-- wotf(SWIM_CSR, cur_CSR) -- wotf(SWIM_CSR, cur_CSR)
@ -341,8 +367,84 @@ local function printCSR()
print(cur_CSR) print(cur_CSR)
end end
local function write_optn_bytes(debug) local function disable_ROP_erase(debug)
local toprint = nil-- debug
local maxnak = 20
if debug then print("disabling ROP and erasing STM8 CIC") end
unlock_eeprom(true)
--FLASH_CR2 and FLASH_NCR2 must be enabled to permit option byte writing
--DEF_8BIT_REG_AT(FLASH_CR2,0x505b); default 0x00
--DEF_8BIT_REG_AT(FLASH_NCR2,0x505c); default 0xFF
--BIT 7: OPT/NOPT
if debug then print("enabling optn byte writes") end
wotf(0x505B, 0x80, true, toprint, maxnak)
wotf(0x505C, 0x7F, true, toprint, maxnak)
--enable READ OUT PROTECTION
--0x4800 Read-out protection (ROP)
--0x00 by default, set to 0xAA to prevent reading out flash & eeprom
if debug then print("reading ROP byte") end
if debug then rotf(0x4800, true, debug) end
if debug then print("clearing ROP byte") end
wotf(0x4800, 0x00, true, toprint, maxnak)
--after clearing ROP, system must be reset
--getting error that option bytes aren't complimentary
--seems they get completely erased and we should now flash them
--to be complimentary
--go ahead and write proper "erased" complimentary data prior to system reset
--option bytes seem to take awhile to write, increase max
if debug then print("writing compliment option bytes") end
--ROP wotf(0x4800, 0x00, true, toprint)
wotf(0x4801, 0x00, true, toprint, maxnak)
wotf(0x4802, 0xFF, true, toprint, maxnak)
wotf(0x4803, 0x00, true, toprint, maxnak)
wotf(0x4804, 0xFF, true, toprint, maxnak)
wotf(0x4805, 0x00, true, toprint, maxnak)
wotf(0x4806, 0xFF, true, toprint, maxnak)
wotf(0x4807, 0x00, true, toprint, maxnak)
wotf(0x4808, 0xFF, true, toprint, maxnak)
wotf(0x4809, 0x00, true, toprint, maxnak)
wotf(0x480A, 0xFF, true, toprint, maxnak)
--disable option byte writing
if debug then print("disabling option byte writting") end
wotf(0x505B, 0x00, true, toprint, maxnak)
wotf(0x505C, 0xFF, true, toprint, maxnak)
if debug then print("locking eeprom") end
lock_flash_eeprom(true)
-- if debug then print("read back option bytes")
-- rotf(0x4800, true, true)
-- rotf(0x4801, true, true)
-- rotf(0x4802, true, true)
-- rotf(0x4803, true, true)
-- rotf(0x4804, true, true)
-- rotf(0x4805, true, true)
-- rotf(0x4806, true, true)
-- rotf(0x4807, true, true)
-- rotf(0x4808, true, true)
-- rotf(0x4809, true, true)
-- rotf(0x480A, true, true)
-- end
--need to reset the chip to reload option bytes
--after clearing ROP, system must be reset
if debug then print("resetting STM8") end
system_reset( false )
--TODO swim may need re-established if SWIM_CSR RST bit is set
-- start()
if debug then print("done erasing chip, ROP disabled") end
end
local function write_optn_bytes(rop, debug)
local maxnak = 20
local toprint = nil--debug local toprint = nil--debug
if debug then print("programming option bytes") end if debug then print("programming option bytes") end
unlock_eeprom(true) unlock_eeprom(true)
@ -351,8 +453,8 @@ local function write_optn_bytes(debug)
--DEF_8BIT_REG_AT(FLASH_CR2,0x505b); default 0x00 --DEF_8BIT_REG_AT(FLASH_CR2,0x505b); default 0x00
--DEF_8BIT_REG_AT(FLASH_NCR2,0x505c); default 0xFF --DEF_8BIT_REG_AT(FLASH_NCR2,0x505c); default 0xFF
--BIT 7: OPT/NOPT --BIT 7: OPT/NOPT
wotf(0x505B, 0x80, true, toprint) wotf(0x505B, 0x80, true, toprint, maxnak)
wotf(0x505C, 0x7F, true, toprint) wotf(0x505C, 0x7F, true, toprint, maxnak)
--need to enable AFR0 for TIM1 timer input pins --need to enable AFR0 for TIM1 timer input pins
--AFR0 Alternate function remapping option 0(2) --AFR0 Alternate function remapping option 0(2)
@ -363,12 +465,24 @@ local function write_optn_bytes(debug)
-- OPT2 AFR7 AFR6 AFR5 AFR4 AFR3 AFR2 AFR1 AFR0 0x00 -- OPT2 AFR7 AFR6 AFR5 AFR4 AFR3 AFR2 AFR1 AFR0 0x00
--0x4804 NOPT2 NAFR7 NAFR6 NAFR5 NAFR4 NAFR3 NAFR2 NAFR1 NAFR0 0xFF --0x4804 NOPT2 NAFR7 NAFR6 NAFR5 NAFR4 NAFR3 NAFR2 NAFR1 NAFR0 0xFF
if debug then print("ENABLING AFR0 for TIM1") end if debug then print("ENABLING AFR0 for TIM1") end
wotf(0x4803, 0x01, true, toprint) wotf(0x4803, 0x01, true, toprint, maxnak)
wotf(0x4804, 0xFE, true, toprint) wotf(0x4804, 0xFE, true, toprint, maxnak)
print("optn byte write enabled")
--enable READ OUT PROTECTION
--0x4800 Read-out protection (ROP)
--0x00 by default, set to 0xAA to prevent reading out flash & eeprom
if rop then
wotf(0x4800, 0xAA, true, toprint, maxnak)
print("Read out Protection enabled")
else
print("Read out Protection isn't enabled, CIC code can be stolen!")
end
--disable option byte writing --disable option byte writing
wotf(0x505B, 0x00, true, toprint) wotf(0x505B, 0x00, true, toprint, maxnak)
wotf(0x505C, 0xFF, true, toprint) wotf(0x505C, 0xFF, true, toprint, maxnak)
print("optn byte write disabled")
lock_flash_eeprom(true) lock_flash_eeprom(true)
if debug then print("done with option byte programming") end if debug then print("done with option byte programming") end
@ -405,6 +519,33 @@ local function write_flash(file, debug)
lock_flash_eeprom(true) lock_flash_eeprom(true)
end end
local function snes_v3_prgm(debug)
--dict.pinport("CTL_IP_PU", "SNES_RST")
--reset_swim()
-- print("curCSR", cur_CSR)
--start()
-- print("curCSR", cur_CSR)
--SNES v3 boards route Flash /OE to STM8 pin 3 PD6
--(PD_ODR,0x500f);
--(PD_IDR,0x5010);
--(PD_DDR,0x5011);
--(PD_CR1,0x5012);
--(PD_CR2,0x5013);
wotf(0x5012, 0x40, true, debug) --PD6 is input with pullup, if changed to output via DDR it will be push pull
wotf(0x5011, 0x40, true, debug) --PD6 is push-pull output now
wotf(0x500F, 0x40, true, debug) --PD6 high, program mode
end
local function snes_v3_play(debug)
--dict.pinport("CTL_IP_PU", "SNES_RST")
--reset_swim()
--start()
wotf(0x5012, 0x40, true, debug) --PD6 is input with pullup, if changed to output via DDR it will be push pull
wotf(0x5011, 0x40, true, debug) --PD6 is push-pull output now
wotf(0x500F, 0x00, true, debug) --PD6 low, play mode
end
-- global variables so other modules can use them -- global variables so other modules can use them
@ -416,9 +557,14 @@ end
swim.start = start swim.start = start
swim.write_flash = write_flash swim.write_flash = write_flash
swim.write_optn_bytes = write_optn_bytes swim.write_optn_bytes = write_optn_bytes
swim.disable_ROP_erase = disable_ROP_erase
swim.printCSR = printCSR swim.printCSR = printCSR
swim.wotf = wotf swim.wotf = wotf
swim.rotf = rotf swim.rotf = rotf
swim.swim_test = swim_test
swim.snes_v3_prgm = snes_v3_prgm
swim.snes_v3_play = snes_v3_play
swim.stop_and_reset = stop_and_reset
-- return the module's table -- return the module's table
return swim return swim

View File

@ -39,8 +39,8 @@ function main ()
-- debug = true -- debug = true
-- rv = cart.detect(debug) -- rv = cart.detect(debug)
-- local force_cart = true local force_cart = true
-- cart_console = "SNES" cart_console = "SNES"
if (force_cart or cart.detect_console(true)) then if (force_cart or cart.detect_console(true)) then
if cart_console == "NES" or cart_console == "Famicom" then if cart_console == "NES" or cart_console == "Famicom" then
@ -100,14 +100,17 @@ function main ()
elseif cart_console == "SNES" then elseif cart_console == "SNES" then
if swim.start() then snes_swimcart = nil
if swim.start(true) then
--SWIM is now established and running at HIGH SPEED --SWIM is now established and running at HIGH SPEED
--swim.printCSR() snes_swimcart = false --don't want to use SWIM pin to control flash /OE, use SNES RESET (EXP0) instead
--check if ROP set, allow clearing ROP and erasing CIC --check if ROP set, allow clearing ROP and erasing CIC
--blindly erase STM8 CIC for now by disabling ROP
swim.disable_ROP_erase(true)
--open CIC file --open CIC file
local cic_file = assert(io.open("SNESCIC.bin", "rb")) local cic_file = assert(io.open("SNESCIC_flashmode.bin", "rb"))
--write CIC file --write CIC file
swim.write_flash( cic_file ) swim.write_flash( cic_file )
@ -115,15 +118,12 @@ function main ()
--close CIC file --close CIC file
assert(cic_file:close()) assert(cic_file:close())
--write option bytes -- reset STM8 CIC and end SWIM comms to it can execute what we just flashed
swim.write_optn_bytes( true ) swim.stop_and_reset()
--set ROP byte
else else
print("ERROR problem with STM8 CIC") print("ERROR problem with STM8 CIC")
end end
dict.io("IO_RESET") dict.io("IO_RESET")
dict.io("SNES_INIT") dict.io("SNES_INIT")
@ -143,17 +143,16 @@ function main ()
if snes.read_reset_vector(0, true) ~= 0xFFFF then if snes.read_reset_vector(0, true) ~= 0xFFFF then
erase.erase_snes( false ) erase.erase_snes( false )
end end
if snes.read_reset_vector(1, true) ~= 0xFFFF then if snes.read_reset_vector( 1, true) ~= 0xFFFF then
erase.erase_snes( false ) erase.erase_snes( false )
end end
if snes.read_reset_vector(20, true) ~= 0xFFFF then if snes.read_reset_vector( 20, true) ~= 0xFFFF then
erase.erase_snes( false ) erase.erase_snes( false )
end end
if snes.read_reset_vector(63, true) ~= 0xFFFF then if snes.read_reset_vector( 63, true) ~= 0xFFFF then
erase.erase_snes( false ) erase.erase_snes( false )
end end
--FLASHING: --FLASHING:
--erase cart --erase cart
-- erase.erase_snes( false ) -- erase.erase_snes( false )
@ -173,19 +172,50 @@ function main ()
--close file --close file
assert(file:close()) assert(file:close())
--DUMPING: --flash final CIC code
--create new file if swim.start(true) then
local file --SWIM is now established and running at HIGH SPEED
file = assert(io.open("snesdump.bin", "wb")) --swim.printCSR()
--dump cart into file snes_swimcart = false
dump.dump_snes( file, snes_mapping, true ) --print("main swimcart", snes_swimcart)
--close file --check if ROP set, allow clearing ROP and erasing CIC
assert(file:close()) --blindly erase STM8 CIC for now by disabling ROP
-- swim.disable_ROP_erase(true)
--open CIC file
local cic_file = assert(io.open("SNESCIC.bin", "rb"))
--write CIC file
swim.write_flash( cic_file )
--close CIC file
assert(cic_file:close())
--write option bytes
-- enable ROP, debug
swim.write_optn_bytes( true, true )
-- reset STM8 CIC and end SWIM comms to it can execute what we just flashed
swim.stop_and_reset()
else
print("ERROR problem with STM8 CIC")
end
-- --DUMPING:
-- --create new file
-- local file
-- file = assert(io.open("snesdump.bin", "wb"))
-- --dump cart into file
-- -- swim.start()
-- dump.dump_snes( file, snes_mapping, true )
--
-- --close file
-- assert(file:close())
--trick to do this at end while debugging so don't have to wait for it before starting --trick to do this at end while debugging so don't have to wait for it before starting
erase.erase_snes( false ) -- erase.erase_snes( false )
dict.io("IO_RESET") dict.io("IO_RESET")