Another late commit from bunch of updates I made over a month ago..

Most progress was on jtag lua statemachine code.  From what I recall I
tested and verified most state change possibilities with logic analyzer.
So they should be fairly good.  Possible I didn't test all later ones,
or things are partly unfinished, but my best guess is they're good.
Appears was able to erase MachXO CPLD.  Added time delay for run test.
Did some basic testing for gameboy power switching circuit.

Also just got STM8S001 CIC programming working for discrete boards via
A0.  Pretty sure I broke EXP0 in the process for SNES boards..  So need
to go back and fix that I think due to new means of changing swim pin.
This commit is contained in:
Paul blue asus 2018-02-13 14:36:43 -06:00
parent 3c359ac5ca
commit fafe706481
13 changed files with 2880 additions and 2043 deletions

View File

@ -36,6 +36,7 @@ STARTUP=$(BASE)/include_stm/startup_ARM$(CORE).S
# -Os -flto -ffunction-sections -fdata-sections to compile for code size
CFLAGS=$(ARCH_FLAGS) $(STARTUP_DEFS) -Os -flto -ffunction-sections -fdata-sections -g
#CFLAGS=$(ARCH_FLAGS) $(STARTUP_DEFS) -flto -ffunction-sections -fdata-sections -g
CXXFLAGS=$(CFLAGS)
# Link for code size

Binary file not shown.

View File

@ -1,4 +1,4 @@
:100000000C9476000C94950D0C9493000C94930032
:100000000C9476000C94030F0C9493000C949300C2
:100010000C9493000C9493000C9493000C94930014
:100020000C9493000C9493000C9493000C94930004
:100030000C9493000C9493000C9493000C949300F4
@ -13,31 +13,31 @@
:1000C00049006E00660069006E00690074006500FA
:1000D0004E00650073004C006900760065007300F7
:1000E0002E0063006F006D000403090411241FBE7D
:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E6EA93
:10010000FDE102C005900D92A630B107D9F723E0BA
:10011000A6E0B1E001C01D92AD3AB207E1F70E943E
:10012000A90E0C94D10E0C9400000F931F93CF9343
:10013000DF93EC01FB01D9010091470110914801C7
:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E4E996
:10010000F0E202C005900D92A630B107D9F723E0C6
:10011000A6E0B1E001C01D92AD3DB207E1F70E943B
:1001200017100C9448100C9400000F931F93CF935A
:10013000DF93EC01FB01D9010091490110914A01C3
:10014000888187FF09C08E818C93442399F00481B4
:10015000158180E883831DC08FEF8C938E818093FF
:100160003201442309F44BC070936403609363032A
:1001700080E9F0CFE0912001F09121018381883D59
:10018000A1F50481158180E88383E0912001F0913D
:1001900021011782E0912001F091210183818039B2
:1001A000F1F48A81813711F08034C9F4E09163035E
:1001B000F09164030480F581E02D8C818083E091CF
:1001C0006303F09164030480F581E02D8D818183C8
:1001D000E0916303F091640387818E5F8783C80198
:100160003401442309F44BC0709366036093650324
:1001700080E9F0CFE0912101F09122018381883D57
:10018000A1F50481158180E88383E0912101F0913C
:1001900022011782E0912101F091220183818039AF
:1001A000F1F48A81813711F08034C9F4E09165035C
:1001B000F09166030480F581E02D8C818083E091CD
:1001C0006503F09166030480F581E02D8D818183C4
:1001D000E0916503F091660387818E5F8783C80194
:1001E000DF91CF911F910F910895803D11F41C92E2
:1001F000CCCF8FEF8C9380E10E947A07C6CFE0913D
:100200002001F09121018381811106C0F0936403E4
:10021000E093630380E9B8CF883969F7E8CFE3E575
:10022000F1E08FEF819391E0E336F907D9F78093FE
:10023000460180932501809345018093240180939A
:10024000360180931301809335018093120181E080
:100250000C947A07CF93DF93FC0150E0CA01820F20
:1001F000CCCF8FEF8C9380E10E942D09C6CFE09188
:100200002101F09122018381811106C0F0936603E0
:10021000E093650380E9B8CF883969F7E8CFE5E571
:10022000F1E08FEF819391E0E536F907D9F78093FC
:100230004801809327018093470180932601809392
:10024000380180931401809337018093130181E07A
:100250000C942D09CF93DF93FC0150E0CA01820F6B
:10026000911D4197E4F52223E1F183818F3FD9F578
:1002700082818F3FD1F5DA01AD5ABE4FED0180E0AA
:1002700082818F3FD1F5DA01AB5ABE4FED0180E0AC
:1002800099919F3FA1F58F5F2813FACF6283138264
:10029000982F9295990F907E915096831782108691
:1002A0001182108211861286138614861586168690
@ -48,10 +48,10 @@
:1002F000F3CFCF93DF93DC01EB019A0112969C912F
:10030000129780ED890F803318F513968C9113970F
:10031000813041F0E8F08230A9F08330B1F085EB14
:10032000888346C0E2E2F1E0913509F476C048F5F1
:10032000888346C0E4E2F1E0913509F476C048F5EF
:10033000913309F449C078F49923B9F19033E1F18C
:1003400084EBEECFE3E3F1E0EFCFE0E1F1E0ECCFDF
:10035000E3E4F1E0E9CF933309F446C0E8F19035E6
:1003400084EBEECFE5E3F1E0EFCFE1E1F1E0ECCFDC
:10035000E5E4F1E0E9CF933309F446C0E8F19035E4
:1003600079F7188286E0898386818A8383818B83EB
:1003700087818C8380858D8382818E8387858F831F
:1003800017C0903808F05FC0903708F055C090361D
@ -61,55 +61,55 @@
:1003C0009C9191878287F3CF14968C911497159600
:1003D0009C9193878487EBCF14968C9114971596F4
:1003E0009C9195878687E3CF14968C918787DFCF82
:1003F000188281E089831496ED91FC911597ED5A4E
:1003F000188281E089831496ED91FC911597EB5A50
:10040000FE4F80818A83D4CF188281E08983E09176
:100410002001F09121018381F5CF188286E0898344
:100410002101F09122018381F5CF188286E0898342
:1004200081858A8382858B8383858C8384858D8374
:1004300085858E838685A3CF40E0BF01CD01DF9106
:10044000CF910C949500892F8770813049F0F8F096
:10045000823001F1833009F062CFE0E1F1E002C0C7
:10046000E2E2F1E0903808F4A3CF9838B0F0905968
:10045000823001F1833009F062CFE1E1F1E002C0C6
:10046000E4E2F1E0903808F4A3CF9838B0F0905966
:10047000983008F09DCF188213968C91139780873F
:1004800014968D919C9115979183808391CFE3E48D
:10049000F1E0E8CFE3E3F1E0E5CF14964C91149757
:1004800014968D919C9115979183808391CFE5E48B
:10049000F1E0E8CFE5E3F1E0E5CF14964C91149755
:1004A00015966C91159713962C91CF010E942A01F5
:1004B00037CF90914601809125018F3F79F481E0FB
:1004C0009F3F09F480E0909136019F3F09F083E05F
:1004D000909113019F3F09F084E0089582E0F3CFEB
:1004E000623059F421E08334920749F121E08232ED
:1004F000920789F483E491E00EC0633069F421E04F
:1005000083349207E1F021E082329207D9F021E0B2
:100510008333920779F308956430E9F721E0833457
:10052000920769F021E08232920761F021E0833383
:10053000920759F021E08031920769F7DBCF82E220
:1005400091E0089583E391E0089580E191E00895BA
:100550001F93CF93DF930E948007823D09F071C003
:100560000E9459028093060183E491E09093210157
:10057000809320010E948007823DA1F4D091060162
:100580008091200190912101C1E0CD1708F45FC056
:10059000909321018093200120E8FC01238380EDCA
:1005A0000E947A070E948007823F41F480EF0E94F8
:1005B0007A07E0912001F091210113820E948007C7
:1005C000C82F803DE1F48091200190912101FC0130
:1004B00037CF90914801809127018F3F79F481E0F7
:1004C0009F3F09F480E0909138019F3F09F083E05D
:1004D000909114019F3F09F084E0089582E0F3CFEA
:1004E000623059F421E08534920749F121E08432E9
:1004F000920789F485E491E00EC0633069F421E04D
:1005000085349207E1F021E084329207D9F021E0AE
:100510008533920779F308956430E9F721E0853453
:10052000920769F021E08432920761F021E085337F
:10053000920759F021E08131920769F7DBCF84E21D
:1005400091E0089585E391E0089581E191E00895B7
:100550001F93CF93DF930E943309823D09F071C04E
:100560000E9459028093060185E491E09093220154
:10057000809321010E943309823DA1F4D0910601AC
:100580008091210190912201C1E0CD1708F45FC054
:10059000909322018093210120E8FC01238380EDC8
:1005A0000E942D090E943309823F41F480EF0E948E
:1005B0002D09E0912101F091220113820E9433095B
:1005C000C82F803DE1F48091210190912201FC012E
:1005D00023812038A1F4609106010E94700290935B
:1005E000210180932001FC011782C3830E943F03F5
:1005F000E0912001F0912101882371F183830E9411
:100600008007182F803FC9F4C0912001D0912101AB
:1005E000220180932101FC011782C3830E943F03F3
:1005F000E0912101F0912201882371F183830E940F
:100600003309182F803FC9F4C0912101D0912201F4
:100610008B81883991F460910601CE010E947002AD
:100620009093210180932001FC0113821B83CE0152
:100630000E94E5048823C9F08B83DF91CF911F913D
:1006400008950E948007823F09F094CF89CF6D2FD3
:100620009093220180932101FC0113821B83CE0150
:100630000E941D058823C9F08B83DF91CF911F9104
:1006400008950E943309823F09F094CF89CF6D2F1E
:100650000E947002CF5F99CF208580819181820FA7
:10066000911D9183808388EDC9CF84EF8B8328858A
:1006700088819981820F911D99838883DECF0F93A2
:10068000CF93DF93EC01688179818985823111F103
:1006900030F4803169F08131A1F083EC05C0833101
:1006A000D9F08431D1F780E0DF91CF910F91089597
:1006B00060680FEF2E814A818C819D810E94E9063E
:1006C00007C00FEF2E814A818C819D810E942007F7
:1006B00060680FEF2E814A818C819D810E949C0889
:1006C00007C00FEF2E814A818C819D810E94D30843
:1006D0008F83E9CF6066EDCF8FEF84B9CB01880FB0
:1006E000892F881F990B919585B95F9A5F9814B8E7
:1006F00060680FEF2E814A818C819D810E94AD0A36
:1006F00060680FEF2E814A818C819D810E94600C81
:10070000E7CF7F928F929F92AF92BF92CF92DF926C
:10071000EF92FF920F931F93CF93DF936A015901DA
:10072000DA011796CC91D0E0E62EF12CFE2CEE24C7
@ -120,7 +120,7 @@
:100770009AE2F501099560EA85E595E5F5010995A7
:10078000CE0199274C018E289F28D6011496ED9111
:10079000FC911597E80FF91F6081C401F5010995D7
:1007A0000E94760CC401F8010995782EC401F80165
:1007A0000E94E40DC401F8010995782EC401F801F6
:1007B00009957812F5CF2196BBCF7F928F929F92A9
:1007C000AF92BF92CF92DF92EF92FF920F931F935F
:1007D000CF93DF936A015901DA011796CC91D0E0EB
@ -131,347 +131,394 @@
:10082000F501099565E58AEA9AE0F501099560EA1E
:1008300085E595E1F5010995CE0199274C018E28B2
:100840009F28D6011496ED91FC911597E80FF91F9A
:100850006081C401F50109950E94760CC401F8017C
:100850006081C401F50109950E94E40DC401F8010D
:100860000995782EC401F80109957812F5CF2196E3
:10087000BBCF4F925F926F927F928F929F92AF9277
:10088000BF92CF92DF92EF92FF920F931F93CF937D
:10089000DF93662E7A01E901DA0117965C90852CC8
:1008A000912CA89558986AEA8AEA9AE0F901099584
:1008B00065E585E595E0FE01099560E28AEA9AE042
:1008C000FE010995712C762C6624D70116968C9121
:1008D000169790E08815990520F517965C9260E9C7
:1008E00080E090E0FE01099560E080E090E0FE018C
:1008F000099560EF80E090E0FE010995589A80E04C
:10090000DF91CF911F910F91FF90EF90DF90CF90EB
:10091000BF90AF909F908F907F906F905F904F901F
:10092000089580EA0E94A00AC52CD12C5601A62861
:10093000B728D7011496ED91FC911597EC0DFD1D8C
:100940006081C501FE010995589AA8950E94760C10
:10095000C501F80109955898D7011496ED91FC91BD
:100960001597EC0DFD1D4080841541F0589A482ED6
:10097000C501F80109955898481213C0D70114967B
:100980008D919C911597C80ED91EF6018081481251
:1009900019C05394FFEF8F1A9F0A5198599A59988A
:1009A00094CF0000000000000000000000000000E4
:1009B00000000000000000000000589AC501F80186
:1009C0000995D5CF519A599A80CF0F931F93AC01B7
:1009D000FC01608171819185923159F030F4903140
:1009E00061F0913199F083EC05C09331B9F0943105
:1009F000D1F780E01F910F910895606804E216E03E
:100A000025E136E080E00E948103F3CF0CE416E09C
:100A100020E636E080E00E94DD03EBCF8FEF84B963
:100A2000CB01880F892F881F990B919585B95F9A03
:100A30005F9814B860680DE51AE02EE63AE080E0B1
:100A40000E943904D6CF14B88FEF85B93F9A4798E2
:100A500081B911B882B914B885B914B885B9389874
:100A6000409A3998419A3A98429A3C98449A3D98CB
:100A7000459A3E98469A53985B9A55985D9A3B984A
:100A8000439A3F98479A57985F9A50985898519828
:100A9000599A08950E942305399A419A389A4098A4
:100AA0003A9A429A3C9A449A3D9A459A14B88FEFE2
:100AB00085B914B885B914B885B93F9A479881B9F2
:100AC00012B884B915B8479A479814B808950E9487
:100AD0002305399A419A3C9A449A3D9A459A589AE4
:100AE000509A14B88FEF85B914B885B914B885B980
:100AF0003F9A479881B912B884B915B8479A479870
:100B000014B814B885B9579A5F9884B915B85F9A24
:100B10005F9814B80895823031F0833011F081303D
:100B2000A1F480E008955098589A88E08093820359
:100B300089E290E0909381038093800381E090E0CC
:100B400090937F0380937E03ECCF87E908955898B4
:100B5000509A000089B15098589880FD22C0509852
:100B6000589A59B149B1000039B10000000029B1CB
:100B700000000000000099B100000000000000002B
:100B800089B15098589850FD0EC040FD0EC030FD00
:100B90000EC020FD0EC090FD0EC080FD0EC080EE88
:100BA000089580EF089580E0089581E0089583E03E
:100BB000089586E008958AE008958FE008950F93E0
:100BC0001F93CF93DF931F92CDB7DEB78901823099
:100BD00009F130F4882381F08130C1F086E910C03A
:100BE0008330D9F08038D1F781E0F90180830E9409
:100BF000A705F80181830CC089830E9423058981A0
:100C00000F90DF91CF911F910F9108950E944A0597
:100C100080E0F6CF0E946705FBCF842F0F90DF9115
:100C2000CF911F910F910C948B0582B98FEF84B9EE
:100C300095B9479A479814B884B965B9509A5898A5
:100C40005098589A14B8089582B92FEF24B995B9DD
:100C5000479A479814B8409A97FD419800000000C1
:100C60000000000083B14098419A08955098589828
:100C700082B92FEF24B995B9479A479814B842988A
:100C800024B965B9409A97FD41980000000040984A
:100C9000419A429A14B80895811520E2920708F407
:100CA000906882B98FEF84B995B9479A479814B87C
:100CB0004498000000000000000083B1449A0895A9
:100CC000811520E2920708F4906882B98FEF84B909
:100CD00095B9479A479814B884B965B90000459802
:100CE0000000459A14B808958FEF84B994E095B93F
:100CF000479A479814B829B1207230E084B988E047
:100D000085B9479A479814B889B1807290E041E05C
:100D10002115310509F040E061E0009709F060E03D
:100D2000442311F0611116C051E0232B09F450E067
:100D300021E0892B09F420E0552311F021110CC08A
:100D4000662311F051110AC0442311F0211108C08B
:100D50008FEF089580E1089581E1089582E108957B
:100D600083E108950F931F93CF93C82FCA01890180
:100D7000C23001F130F4CC2391F0C130B9F0C0EAB7
:100D800010C0C238D1F0C338F1F0C138C1F721E04A
:100D9000F80120830E942406F801818309C00E9483
:100DA00015068C2FCF911F910F9108950E94600618
:100DB000C0E0F7CF0E943606FBCF21E0F801208388
:100DC0000E944C06E9CF81E0F90180830E947406FD
:100DD000E3CFEF92FF920F93CF93DF9300D01F9258
:100DE000CDB7DEB77C018FEF84B965B9479A4798D4
:100DF00014B8409A67FD419842B980E0011117C0CC
:100E00000000000093B1F701E80FF11D90834F5FE0
:100E100042B98F5F281790F74098419A0F900F9032
:100E20000F90DF91CF910F91FF90EF9008952B835A
:100E30004A8389830E94760C89814A812B81E2CF83
:100E4000EF92FF920F93CF93DF9300D01F92CDB715
:100E5000DEB77C01603208F460688FEF84B965B951
:100E6000479A479814B8449842B980E0011116C0D7
:100E70000000000093B1F701E80FF11D90834F5F70
:100E800042B98F5F281790F7449A0F900F900F90F8
:100E9000DF91CF910F91FF90EF9008952B834A83BC
:100EA00089830E94760C89814A812B81E3CFCF937D
:100EB000DF93FB01DC0112962C91222329F02034D0
:100EC00079F082ED808308C01082A0910201B09178
:100ED0000301EC018C818C93CF01DF91CF910895B8
:100EE000108281E08183A0910201B09103018C9175
:100EF0008283F2CFE0910201F09103018083089593
:100F0000E0910201F0910301808108950F931F93F6
:100F1000D901082F10E00831110508F0C2C2F8010C
:100F2000EC56F84F0C94CB0ECE07AC0709086408BA
:100F3000B008FC084809F309F809FD09000A040A89
:100F4000070A0F0A170A1B0A1E0A220A2B0A320A6C
:100F5000360A3E0A450A490A4631510508F0A3C23D
:100F6000FA01EB54F84F0C94CB0ECB07D107D50701
:100F7000D907DD07E107E507E907ED07F107F50701
:100F8000F907FD070108530A530A530A530A530A83
:100F9000530A530A05083898409A80E01F910F9130
:100FA00008953998419A80E0F9CF3A98429A80E0C2
:100FB000F5CF3B98439A80E0F1CF3C98449A80E08B
:100FC000EDCF3D98459A80E0E9CF3E98469A80E083
:100FD000E5CF3F98479A80E0E1CF5098589A80E05B
:100FE000DDCF5198599A80E0D9CF53985B9A80E031
:100FF000D5CF55985D9A80E0D1CF56985E9A80E023
:10100000CDCF57985F9A80E0C9CF5098589A80E02A
:10101000C5CF4631510508F048C2FA01EE5EF74FE0
:101020000C94CB0E28082C083008340838083C08EB
:101030004008440848084C085008540858085C0800
:10104000550A550A550A550A550A550A550A60089F
:101050003898409880E0A2CF3998419880E09ECFA0
:101060003A98429880E09ACF3B98439880E096CF98
:101070003C98449880E092CF3D98459880E08ECF90
:101080003E98469880E08ACF3F98479880E086CF88
:101090005098589880E082CF5198599880E07ECF40
:1010A00053985B9880E07ACF55985D9880E076CF32
:1010B00056985E9880E072CF57985F9880E06ECF28
:1010C0005098589880E06ACF4631510508F0EFC13A
:1010D000FA01E359F74F0C94CB0E83088608890870
:1010E0008C088F089208950898089B089E08A1080C
:1010F000A408A708AA08570A570A570A570A570AFE
:10110000570A570AAD08389A80E048CF399A80E0EC
:1011100045CF3A9A80E042CF3B9A80E03FCF3C9A5D
:1011200080E03CCF3D9A80E039CF3E9A80E036CFD8
:101130003F9A80E033CF509A80E030CF519A80E0E0
:101140002DCF539A80E02ACF559A80E027CF569A28
:1011500080E024CF579A80E021CF509A80E01ECFC4
:101160004631510508F0A5C1FA01E754F74F0C9438
:10117000CB0ECF08D208D508D808DB08DE08E10876
:10118000E408E708EA08ED08F008F308F608590A49
:10119000590A590A590A590A590A590AF908409824
:1011A00080E0FCCE419880E0F9CE429880E0F6CE17
:1011B000439880E0F3CE449880E0F0CE459880E0FC
:1011C000EDCE469880E0EACE479880E0E7CE58988A
:1011D00080E0E4CE599880E0E1CE5B9880E0DECEFE
:1011E0005D9880E0DBCE5E9880E0D8CE5F9880E0AE
:1011F000D5CE589880E0D2CE4631510508F05BC17B
:10120000FA01EB5FF64F0C94CB0E1B091E09210966
:10121000240927092A092D09300933093609390912
:101220003C093F0942095B0A5B0A5B0A5B0A5B0AED
:101230005B0A5B0A4509409A80E0B0CE419A80E0A3
:10124000ADCE429A80E0AACE439A80E0A7CE449ADF
:1012500080E0A4CE459A80E0A1CE469A80E09ECE62
:10126000479A80E09BCE589A80E098CE599A80E0C9
:1012700095CE5B9A80E092CE5D9A80E08FCE5E9AAA
:1012800080E08CCE5F9A80E089CE589A80E086CE4E
:1012900082E08C934631510508F0A2C0FA01ED5A64
:1012A000F64F0C94CB0E690972097B0984098D09EC
:1012B00096099F09A809B109BA09C309CC09D5093A
:1012C000DE09F009F009F009F009F009F009F00968
:1012D000E70986B1817011968C93119712961C9232
:1012E00080E05CCE86B1827090E012969C938E93E3
:1012F000119780E053CE86B1847090E012969C9353
:101300008E93119780E04ACE86B1887090E0129655
:101310009C938E93119780E041CE86B1807190E0CE
:1013200012969C938E93119780E038CE86B180728E
:1013300090E012969C938E93119780E02FCE86B109
:10134000807490E012969C938E93119780E026CE45
:1013500086B1807890E012969C938E93119780E0EE
:101360001DCE89B1817011968C93119712961C92A3
:1013700080E014CE89B1827090E012969C938E9397
:10138000119780E00BCE89B1887090E012969C9303
:101390008E93119780E002CE89B1807290E0129610
:1013A0009C938E93119780E0F9CD89B1807490E081
:1013B00012969C938E93119780E0F0CD89B180783E
:1013C00090E012969C938E93119780E0E7CD89B1BF
:1013D000817011968C93119712961C9280E0DECD4D
:1013E0001C928DE8DBCD14B88FEF85B980E0D6CDA7
:1013F00014B88FEF85B980E0D1CD14B880E0CECDA0
:101400008FEF84B980E0CACD45B980E0C7CD83B104
:1014100011968C93119781E08C9380E0BFCD14B826
:101420008FEF85B93F9A479881B980E0B7CD8FEFAC
:1014300082B980E0B3CD11B880E0B0CD8FEF81B933
:1014400080E0ACCD42B98FEF84B955B9479A47983F
:1014500014B880E0A3CD14B88FEF85B9579A5F9880
:1014600080E09CCD57985F9A80E098CD8FEF84B94B
:1014700045B95F9A5F9814B880E090CD14B88FEFAB
:1014800085B9579A5F9880E089CD57985F9A80E038
:1014900085CD8FEF84B945B95F9A5F9814B880E025
:1014A0007DCD8CE87BCD8DE879CD8DE877CD8DE84D
:1014B00075CD8DE873CD8DE871CD82B98FEF84B98C
:1014C00095B9479A479814B841984498000000008D
:1014D0000000000083B1449A419A089582B98FEFC9
:1014E00084B995B9479A479814B884B965B94598AD
:1014F00041980000000000000000459A419A14B88D
:101500000895CF93DF93952FE901813099F020F072
:10151000823059F08AEA06C09FEF94B945B95F9AC4
:101520005F9814B8DF91CF910895842F0E946E0ABE
:1015300080E0F8CF8883842F0E945D0A8983F8CFEA
:101540009FEF94B985B945984198000000000000CC
:101550000000459A419A14B80895EF92FF920F93B4
:10156000CF93DF9300D01F92CDB7DEB77C018FEF12
:1015700084B965B9479A479814B84498419842B9D4
:1015800080E0011119C0000000000000000093B1CC
:10159000F701E80FF11D90834F5F42B98F5F281765
:1015A00080F7449A419A0F900F900F90DF91CF915E
:1015B0000F91FF90EF9008952B834A8389830E94B7
:1015C000760C00000000000089814A812B81DFCF6A
:1015D00020E030E02817390709F4089500000000E2
:1015E0002F5F3F4FF7CFCF93DF934091820350E0BF
:1015F00020E030E060E084E00E94860780E190E037
:101600000E94E80A4091820350E020E030E060E070
:1016100085E00E948607C4E0D0E04091820350E05C
:1016200020E030E060E084E00E9486078EEC92E0EB
:101630000E94E80A4091820350E020E030E060E040
:1016400085E00E948607219741F7C4E0D0E084E658
:1016500091E00E94E80A4091820350E020E030E0EF
:1016600060E084E00E94860783E691E00E94E80A39
:101670004091820350E020E030E060E085E00E948D
:101680008607219721F7DF91CF910895409182033A
:1016900050E020E030E060E084E00E94860780E1D6
:1016A00090E00E94E80A4091820350E020E030E0A0
:1016B00060E085E00C94860781E00895482F90E073
:1016C000982F882720E0411103C0211180680895D8
:1016D00020953FEF340F4323F6CF80E090E008954C
:1016E0001F93CF93DF931F92CDB7DEB7182F892FAB
:1016F00069830E945E0B812F0E945E0B6981862F99
:101700000E945E0B81E00F90DF91CF911F910895B1
:101710000F931F93CF93DF931F92CDB7DEB789014D
:10172000823009F130F4882381F08130C1F082E801
:1017300010C08131E9F08132D1F781E0F901808375
:10174000CA010E94700BF80111C089830E94F30A3C
:1017500089810F90DF91CF911F910F9108950E9481
:10176000460B80E0F6CF81E0F90180838183F9CFD9
:1017700082E0F901808312821182F3CFCF93DF934D
:101780001F92CDB7DEB7DC018FEF80930701109277
:10179000080187E091E0909392038093910316965D
:1017A0008C91169789831196EC9111974E2F50E0EA
:1017B000FA013197E830F10508F06EC0EE51F44FB0
:1017C0000C94CB0EEA0BFA0B080C160C320C4C0CDA
:1017D000430C240C14964D915C91159728E031E050
:1017E00013966C91139712968C910E9486078093A2
:1017F000070144C014964D915C91159728E031E0A3
:1018000013966C91139712968C910E94DF05EFCF7F
:1018100014964D915C91159728E031E013966C91E8
:10182000139712968C910E94B206E1CF14964D91B7
:101830005C91159728E031E013966C9113971296FE
:101840008C910E94810AD3CF14964D915C9115978B
:1018500028E031E013966C91139712968C910E94B8
:10186000880BC5CFAE014F5F5F4F67E071E0CD01E0
:101870000E947901909392038093910389810F9044
:10188000DF91CF910895AE014F5F5F4F67E071E048
:10189000CD010E945707EECF80E8A9CFE091630306
:1018A000F0916403278144815581322F360F231331
:1018B00012C0E0916303F09164038781860F8783F0
:1018C00080913201861B8093320181110DC088E91D
:1018D000838381E00895FC017191CF01FA01E20F49
:1018E000F11D70832F5FE3CF80E00895CF93DF93E6
:1018F00060919303635067FD91C080919003CCE0A9
:10190000D0E0C81BD109C956DC4F80918F038D32BE
:1019100009F0CFC0683009F07FC083EC8093830367
:101920008AE58093050110920F018881807679F015
:10193000CE010E94BE0B8F3F09F466C09F819111BA
:1019400069C09E81981708F065C0892F63C02A81FD
:1019500010928C03998191110AC010928D032CE88A
:1019600033E082E03093920320939103E7CF9530E8
:1019700029F4209394032CE833E0F4CF963099F5C2
:101980009B81913059F48EE890E09093920380937C
:10199000910382E190E490930F01D0CF923019F43B
:1019A0008CE790E0F2CF9330A9F7211108C088EEC0
:1019B00090E0909392038093910384E0EBCF2130E9
:1019C00041F48EEB90E090939203809391038AE22E
:1019D000E1CF2230F9F680EA90E090939203809371
:1019E00091038EE1D7CF983059F0993019F42093B4
:1019F0009603C1CF81E09A3009F4BDCF80E0BBCF20
:101A000026E933E081E0AECF988197FD8E8190E8A2
:101A100090930F018093040110929303809105012C
:101A200084FF3AC0809104018F3FB1F1C82F893003
:101A300008F0C8E08C1B809304018091830398E830
:101A4000892780938303CC23D1F0809191039091D7
:101A5000920320910F0126FF3FC0A4E8B3E0FC01F0
:101A60002C2F34913D9331962150D9F701962FEFC9
:101A70002C0F820F911D90939203809391036C2FF2
:101A800084E893E00E94910DCC5FCC3019F08FEF89
:101A900080930401C093050184E199B1947131F4FC
:101AA0008150D9F71092940310928E03DF91CF9159
:101AB000089580910F0187FFAFCFCE010E944E0C99
:101AC0008F3F21F48EE180930501A6CF882309F48E
:101AD000A3CF10920401A0CFE4E8F3E0DC012C2FA7
:101AE0003D9131932150E1F7C1CFE9E6F0E08081EB
:101AF00082608083E89A0895A82FB92F80E090E053
:101B000041E050EA609530E009C02D918227979519
:101B1000879510F084279527305EC8F36F5FA8F390
:101B20000895EADF8D939D930895CF93CFB7CF9318
: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
:1008A000912CA8955898000000000000000000005E
:1008B0000000000000006AEA8AEA9AE0F90109955E
:1008C00065E585E595E0FE01099560E28AEA9AE032
:1008D000FE010995712C762C6624D70116968C9111
:1008E000169790E08815990520F517965C9260E9B7
:1008F00080E090E0FE01099560E080E090E0FE017C
:10090000099560EF80E090E0FE010995589A80E03B
:10091000DF91CF911F910F91FF90EF90DF90CF90DB
:10092000BF90AF909F908F907F906F905F904F900F
:10093000089580EA0E94530CC52CD12C5601A6289C
:10094000B728D7011496ED91FC911597EC0DFD1D7C
:100950006081C501FE010995589A00000000000061
:1009600000000000000000000000A8950E94E40DB7
:10097000C501F8010995589800000000000000002A
:100980000000000000000000D7011496ED91FC91DA
:100990001597EC0DFD1D40808415C1F0589A00009C
:1009A0000000000000000000000000000000482ED1
:1009B000C501F8010995589848121BC000000000B5
:1009C000000000000000000000000000D7011496A5
:1009D0008D919C911597C80ED91EF6018081481201
:1009E00029C05394FFEF8F1A9F0A5198599A59982A
:1009F00074CF0000000000000000000000000000B4
:100A000000000000000000000000000000000000E6
:100A100000000000000000000000589A00000000E4
:100A2000000000000000000000000000C501F80107
:100A30000995BDCF519A599A50CF0F931F93AC018E
:100A4000FC01608171819185923159F030F49031CF
:100A500061F0913199F083EC05C09331B9F0943194
:100A6000D1F780E01F910F910895606807ED17E0BE
:100A700028EC37E080E00E948103F3CF0FEF17E00E
:100A800023E138E080E00E94DD03EBCF8FEF84B9F3
:100A9000CB01880F892F881F990B919585B95F9A93
:100AA0005F9814B8606800E11CE021E23CE080E05F
:100AB0000E943904D6CF14B88FEF85B93F9A479872
:100AC00081B911B882B914B885B914B885B9389804
:100AD000409A3998419A3A98429A3C98449A3D985B
:100AE000459A3E98469A53985B9A55985D9A3B98DA
:100AF000439A3F98479A57985F9A509858985198B8
:100B0000599A08950E945B05399A419A389A4098FB
:100B10003A9A429A3C9A449A3D9A459A14B88FEF71
:100B200085B914B885B914B885B93F9A479881B981
:100B300012B884B915B8479A479814B808950E9416
:100B40005B05399A419A3C9A449A3D9A459A589A3B
:100B5000509A14B88FEF85B914B885B914B885B90F
:100B60003F9A479881B912B884B915B8479A4798FF
:100B700014B814B885B9579A5F9884B915B85F9AB4
:100B80005F9814B80895823081F0833061F081302D
:100B9000A1F40898109A1092B20380E290E090932A
:100BA000B1038093B00380E008955098589A88E08C
:100BB0008093B20389E290E0F2CF87E90895813013
:100BC00049F414B88FEF85B9579A5F980E94580678
:100BD00080E0089588E908955898509A000089B1F6
:100BE0005098589880FD22C05098589A59B149B1F0
:100BF000000039B10000000029B100000000000031
:100C000099B1000000000000000089B15098589888
:100C100050FD0EC040FD0EC030FD0EC020FD0EC0C8
:100C200090FD0EC080FD0EC080EE089580EF089507
:100C300080E0089581E0089583E0089586E00895B6
:100C40008AE008958FE008950F931F93CF93C82FE4
:100C5000842F8901C230F9F030F4CC2389F0C130FF
:100C6000B1F0C6E90FC0C430F1F0C0F0C038C9F728
:100C700081E0F90180830E94EC05F801818309C0BD
:100C80000E945B058C2FCF911F910F9108950E94B8
:100C90008205C0E0F7CF0E949F05FBCFCF911F9147
:100CA0000F910C94C305CF911F910F910C94DF0508
:100CB000109210018FEF84B915B85F9A5F9814B83D
:100CC0005098589A80E88093680310927603E7E77B
:100CD000F3E0119283E0E739F807D9F708956091BE
:100CE0007603813109F441C0109210019FEF94B94D
:100CF0009091100195B95F9A5F9814B820E070E068
:100D00003FEF8032C9F4E72FF0E0E958FC4F408113
:100D100050E0022E02C0559547950A94E2F740FF35
:100D200028C092E034B995B95F9A5F9814B82F5FE4
:100D3000283011F47F5F20E0492F446034B945B971
:100D40005F9A5F9814B8615034B995B95F9A5F980B
:100D500014B86111D6CF909310014093230134B998
:100D600015B85F9A5F9814B8089592E090931001B7
:100D7000BDCF90E0D7CF0F931F93CF93DF934091D8
:100D8000760310917703813109F461C0109210014C
:100D90009FEF94B99091100195B95F9A5F9814B83C
:100DA00020E030E05FEFA1E0B0E0803281F4E12F9D
:100DB000F0E0022E02C0F595E7950A94E2F7E0FF15
:100DC0004AC0916054B995B95F9A5F9814B860327F
:100DD000B1F4211105C0E32FF0E0E958FC4F108277
:100DE000489B0DC0E32FF0E0E958FC4F7081ED0106
:100DF000022E01C0CC0F0A94EAF77C2B7083792F66
:100E0000746054B975B95F9A5F9814B8415054B979
:100E100095B95F9A5F9814B82F5F283039F43F5F17
:100E2000E32FF0E0E958FC4F108120E04111BDCFE5
:100E300090931001709323018FEF84B915B85F9AD6
:100E40005F9814B8DF91CF911F910F91089591E0B1
:100E5000909310019DCF9E7FB5CF8091680383381A
:100E600001F5809169038630A9F188F4823019F187
:100E700020F48130C9F08EEE12C0833011F184303D
:100E8000D1F781E88093680360E281E11FC0883078
:100E900059F128F1803831F08F3F69F780EF809366
:100EA000680308950C94580681E88093680380E2F3
:100EB0000E946F060DC081E88093680360E080E2C5
:100EC00005C081E88093680360E280E10E94BB0670
:100ED00082E8E5CF81E88093680360E2F0CF81E8A3
:100EE0008093680380E1E4CF81E88093680381E127
:100EF000DFCFCF93DF93E901843061F138F48230A2
:100F0000E1F008F58130A1F087E80FC0873039F1B2
:100F100028F48530C9F74093760306C0883021F164
:100F2000803891F70E94580680E0DF91CF910895B4
:100F30009091690399838883F7CF4093690383E88D
:100F400080936803F1CF4093690383E8809368033B
:100F50000E942D0780916803898381E0ECCF409344
:100F6000770350937803E0CF809177038983809152
:100F700078038A83809179038B8380917A038C83B1
:100F800080917B038D8380917C038E8386E0D3CF19
:100F900082B98FEF84B995B9479A479814B884B944
:100FA00065B9509A58985098589A14B8089582B9CB
:100FB0002FEF24B995B9479A479814B8409A97FDEE
:100FC0004198000000000000000083B14098419A61
:100FD00008955098589882B92FEF24B995B9479A37
:100FE000479814B8429824B965B9409A97FD41983A
:100FF000000000004098419A429A14B80895811563
:1010000020E2920708F4906882B98FEF84B995B90D
:10101000479A479814B84498000000000000000068
:1010200083B1449A0895811520E2920708F49068EC
:1010300082B98FEF84B995B9479A479814B884B9A3
:1010400065B9000045980000459A14B808958FEFDF
:1010500084B994E095B9479A479814B829B1207299
:1010600030E084B988E085B9479A479814B889B1C7
:10107000807290E041E02115310509F040E061E027
:10108000009709F060E0442311F0611116C051E0AF
:10109000232B09F450E021E0892B09F420E05523AB
:1010A00011F021110CC0662311F051110AC0442324
:1010B00011F0211108C08FEF089580E1089581E1BA
:1010C000089582E1089583E108950F931F93CF93CC
:1010D000C82FCA018901C23001F130F4CC2391F04C
:1010E000C130B9F0C0EA10C0C238D1F0C338F1F055
:1010F000C138C1F721E0F80120830E94D707F80129
:10110000818309C00E94C8078C2FCF911F910F9136
:1011100008950E941308C0E0F7CF0E94E907FBCFB3
:1011200021E0F80120830E94FF07E9CF81E0F90167
:1011300080830E942708E3CFEF92FF920F93CF9313
:10114000DF9300D01F92CDB7DEB77C018FEF84B95B
:1011500065B9479A479814B8409A67FD419842B9D3
:1011600080E0011117C00000000093B1F701E80F03
:10117000F11D90834F5F42B98F5F281790F7409819
:10118000419A0F900F900F90DF91CF910F91FF90A8
:10119000EF9008952B834A8389830E94E40D89810F
:1011A0004A812B81E2CFEF92FF920F93CF93DF938F
:1011B00000D01F92CDB7DEB77C01603208F46068C2
:1011C0008FEF84B965B9479A479814B8449842B9E3
:1011D00080E0011116C00000000093B1F701E80F94
:1011E000F11D90834F5F42B98F5F281790F7449AA3
:1011F0000F900F900F90DF91CF910F91FF90EF9094
:1012000008952B834A8389830E94E40D89814A8152
:101210002B81E3CFCF93DF93FB01DC0112962C915E
:10122000222329F0203479F082ED808308C01082D7
:10123000A0910201B0910301EC018C818C93CF014C
:10124000DF91CF910895108281E08183A091020106
:10125000B09103018C918283F2CFE0910201F09171
:10126000030180830895E0910201F09103018081E0
:1012700008950F931F93D901082F10E0083111052D
:1012800008F0C2C2F801E95BF64F0C9442108109E4
:101290005F09BC09170A630AAF0AFB0AA60BAB0B6E
:1012A000B00BB30BB70BBA0BC20BCA0BCE0BD10BE7
:1012B000D50BDE0BE50BE90BF10BF80BFC0B463104
:1012C000510508F0A3C2FA01E859F64F0C944210F8
:1012D0007E09840988098C099009940998099C0958
:1012E000A009A409A809AC09B009B409060C060CA8
:1012F000060C060C060C060C060CB8093898409A29
:1013000080E01F910F9108953998419A80E0F9CFBC
:101310003A98429A80E0F5CF3B98439A80E0F1CF2B
:101320003C98449A80E0EDCF3D98459A80E0E9CF23
:101330003E98469A80E0E5CF3F98479A80E0E1CF1B
:101340005098589A80E0DDCF5198599A80E0D9CFD3
:1013500053985B9A80E0D5CF55985D9A80E0D1CFC5
:1013600056985E9A80E0CDCF57985F9A80E0C9CFBB
:101370005098589A80E0C5CF4631510508F048C2D0
:10138000FA01EB53F64F0C944210DB09DF09E30935
:10139000E709EB09EF09F309F709FB09FF09030A5C
:1013A000070A0B0A0F0A080C080C080C080C080C9A
:1013B000080C080C130A3898409880E0A2CF39989E
:1013C000419880E09ECF3A98429880E09ACF3B982F
:1013D000439880E096CF3C98449880E092CF3D9827
:1013E000459880E08ECF3E98469880E08ACF3F981F
:1013F000479880E086CF5098589880E082CF5198E7
:10140000599880E07ECF53985B9880E07ACF5598CA
:101410005D9880E076CF56985E9880E072CF5798BE
:101420005F9880E06ECF5098589880E06ACF463140
:10143000510508F0EFC1FA01E05EF54F0C9442103F
:10144000360A390A3C0A3F0A420A450A480A4B0A48
:101450004E0A510A540A570A5A0A5D0A0A0C0A0C23
:101460000A0C0A0C0A0C0A0C0A0C600A389A80E072
:1014700048CF399A80E045CF3A9A80E042CF3B9AF4
:1014800080E03FCF3C9A80E03CCF3D9A80E039CF6E
:101490003E9A80E036CF3F9A80E033CF509A80E08A
:1014A00030CF519A80E02DCF539A80E02ACF559AC1
:1014B00080E027CF569A80E024CF579A80E021CF52
:1014C000509A80E01ECF4631510508F0A5C1FA01BF
:1014D000E459F54F0C944210820A850A880A8B0A57
:1014E0008E0A910A940A970A9A0A9D0AA00AA30AE8
:1014F000A60AA90A0C0C0C0C0C0C0C0C0C0C0C0CF9
:101500000C0CAC0A409880E0FCCE419880E0F9CE0B
:10151000429880E0F6CE439880E0F3CE449880E095
:10152000F0CE459880E0EDCE469880E0EACE479830
:1015300080E0E7CE589880E0E4CE599880E0E1CE94
:101540005B9880E0DECE5D9880E0DBCE5E9880E048
:10155000D8CE5F9880E0D5CE589880E0D2CE463184
:10156000510508F05BC1FA01E854F54F0C944210A4
:10157000CE0AD10AD40AD70ADA0ADD0AE00AE30A57
:10158000E60AE90AEC0AEF0AF20AF50A0E0C0E0C5A
:101590000E0C0E0C0E0C0E0C0E0CF80A409A80E08D
:1015A000B0CE419A80E0ADCE429A80E0AACE439A76
:1015B00080E0A7CE449A80E0A4CE459A80E0A1CEF8
:1015C000469A80E09ECE479A80E09BCE589A80E073
:1015D00098CE599A80E095CE5B9A80E092CE5D9A43
:1015E00080E08FCE5E9A80E08CCE5F9A80E089CEDC
:1015F000589A80E086CE82E08C934631510508F0FF
:10160000A2C0FA01EA5FF44F0C9442101C0B250BA8
:101610002E0B370B400B490B520B5B0B640B6D0B06
:10162000760B7F0B880B910BA30BA30BA30BA30BC8
:10163000A30BA30BA30B9A0B86B1817011968C930D
:10164000119712961C9280E05CCE86B1827090E079
:1016500012969C938E93119780E053CE86B184703E
:1016600090E012969C938E93119780E04ACE86B1BB
:10167000887090E012969C938E93119780E041CEF3
:1016800086B1807190E012969C938E93119780E0C2
:1016900038CE86B1807290E012969C938E9311970B
:1016A00080E02FCE86B1807490E012969C938E934A
:1016B000119780E026CE86B1807890E012969C93B8
:1016C0008E93119780E01DCE89B1817011968C9315
:1016D000119712961C9280E014CE89B1827090E02E
:1016E00012969C938E93119780E00BCE89B18870EF
:1016F00090E012969C938E93119780E002CE89B170
:10170000807290E012969C938E93119780E0F9CDB1
:1017100089B1807490E012969C938E93119780E02B
:10172000F0CD89B1807890E012969C938E931197BA
:1017300080E0E7CD89B1817011968C931197129654
:101740001C9280E0DECD1C928DE8DBCD14B88FEFCB
:1017500085B980E0D6CD14B88FEF85B980E0D1CDC2
:1017600014B880E0CECD8FEF84B980E0CACD45B902
:1017700080E0C7CD83B111968C93119781E08C9353
:1017800080E0BFCD14B88FEF85B93F9A479881B9F3
:1017900080E0B7CD8FEF82B980E0B3CD11B880E0A3
:1017A000B0CD8FEF81B980E0ACCD42B98FEF84B975
:1017B00055B9479A479814B880E0A3CD14B88FEF75
:1017C00085B9579A5F9880E09CCD57985F9A80E0E2
:1017D00098CD8FEF84B945B95F9A5F9814B880E0CF
:1017E00090CD14B88FEF85B9579A5F9880E089CD76
:1017F00057985F9A80E085CD8FEF84B945B95F9A9D
:101800005F9814B880E07DCD8CE87BCD8DE879CDF4
:101810008DE877CD8DE875CD8DE873CD8DE871CDF0
:1018200082B98FEF84B995B9479A479814B841980F
:101830004498000000000000000083B1449A419ADF
:10184000089582B98FEF84B995B9479A479814B82B
:1018500084B965B945984198000000000000000077
:10186000459A419A14B80895CF93DF93952FE901D3
:10187000813099F020F0823059F08AEA06C09FEF5B
:1018800094B945B95F9A5F9814B8DF91CF910895E4
:10189000842F0E94210C80E0F8CF8883842F0E943F
:1018A000100C8983F8CF9FEF94B985B9459841987A
:1018B0000000000000000000459A419A14B8089505
:1018C000EF92FF920F93CF93DF9300D01F92CDB78B
:1018D000DEB77C018FEF84B965B9479A479814B891
:1018E0004498419842B980E0011119C000000000FD
:1018F0000000000093B1F701E80FF11D90834F5FE6
:1019000042B98F5F281780F7449A419A0F900F9041
:101910000F90DF91CF910F91FF90EF9008952B835F
:101920004A8389830E94E40D000000000000898141
:101930004A812B81DFCF880F991F880F991F20E0E4
:1019400030E02817390709F40895000000002F5FE0
:101950003F4FF7CF20E030E02817390709F408950A
:10196000000000002F5F3F4FF7CFCF93DF9380E160
:1019700090E00E949B0CC4E0D0E084EF91E00E94D4
:101980009B0C84EF91E00E949B0C2197B1F7C4E07F
:10199000D0E08AEF90E00E949B0C8AEF90E00E94DA
:1019A0009B0C2197B1F7DF91CF91089580E190E0F2
:1019B0000C949B0CCF93DF931F92CDB7DEB7F90148
:1019C000813171F038F48130C1F078F08230C9F0A3
:1019D00082E80FC08132A9F0823299F08231C1F7DA
:1019E00082E08083128211820AC089830E94B50C32
:1019F00089810F90DF91CF9108950E94D60C80E0ED
:101A0000F8CF81E080831182FACF482F90E0982FA1
:101A1000882720E0411103C0211180680895209596
:101A20003FEF340F4323F6CF80E090E0089580E04D
:101A3000089560E070E0CB010895CF93DF931F928B
:101A4000CDB7DEB7DC018FEF80930701109208015C
:101A500087E091E09093C2038093C10316968C9126
:101A6000169789831196EC9111974E2F50E0FA0149
:101A70003197E930F10508F07DC0EF5BF24F0C942F
:101A800042104A0D5A0D680D760DA00DBA0DB10D1C
:101A9000840D920D14964D915C91159728E031E0DC
:101AA00013966C91139712968C910E94390980932A
:101AB000070152C014964D915C91159728E031E0D2
:101AC00013966C91139712968C910E942406EFCF77
:101AD00014964D915C91159728E031E013966C9126
:101AE000139712968C910E946508E1CF14964D9140
:101AF0005C91159728E031E013966C91139712963C
:101B00008C910E94340CD3CF14964D915C91159713
:101B100028E031E013966C91139712968C910E94F5
:101B2000DA0CC5CF14964D915C91159728E031E001
:101B300013966C91139712968C910E947907B7CFE8
:101B4000AE014F5F5F4F67E071E0CD010E94790108
:101B50009093C2038093C10389810F90DF91CF914D
:101B60000895AE014F5F5F4F67E071E0CD010E94C5
:101B70000A09EECF80E89BCFE0916503F091660300
:101B8000278144815581322F360F231312C0E091F3
:101B90006503F09166038781860F87838091340106
:101BA000861B8093340181110DC088E9838381E015
:101BB0000895FC017191CF01FA01E20FF11D7083CC
:101BC0002F5FE3CF80E00895CF93DF936091C3034D
:101BD000635067FD91C08091C003CCE0D0E0C81B8A
:101BE000D109C953DC4F8091BF038D3209F0CFC0BA
:101BF000683009F07FC083EC8093B3038AE580935B
:101C0000050110920F018881807679F0CE010E9443
:101C10001D0D8F3F09F466C09F81911169C09E819F
:101C2000981708F065C0892F63C02A811092BC0301
:101C3000998191110AC01092BD032CEB33E082E030
:101C40003093C2032093C103E7CF953029F420934A
:101C5000C4032CEB33E0F4CF963099F59B8191309F
:101C600059F48EE890E09093C2038093C10382E11F
:101C700090E490930F01D0CF923019F48CE790E06C
:101C8000F2CF9330A9F7211108C088EE90E090932D
:101C9000C2038093C10384E0EBCF213041F48EEB8B
:101CA00090E09093C2038093C1038AE2E1CF223097
:101CB000F9F680EA90E09093C2038093C1038EE12D
:101CC000D7CF983059F0993019F42093C603C1CF7B
:101CD00081E09A3009F4BDCF80E0BBCF26EC33E041
:101CE00081E0AECF988197FD8E8190E890930F01AF
:101CF000809304011092C3038091050184FF3AC0D0
:101D0000809104018F3FB1F1C82F893008F0C8E0FD
:101D10008C1B809304018091B30398E889278093FA
:101D2000B303CC23D1F08091C1039091C2032091E1
:101D30000F0126FF3FC0A4EBB3E0FC012C2F349130
:101D40003D9331962150D9F701962FEF2C0F820F3A
:101D5000911D9093C2038093C1036C2F84EB93E099
:101D60000E94FF0ECC5FCC3019F08FEF80930401FE
:101D7000C093050184E199B1947131F48150D9F790
:101D80001092C4031092BE03DF91CF910895809109
:101D90000F0187FFAFCFCE010E94BC0D8F3F21F412
:101DA0008EE180930501A6CF882309F4A3CF10927A
:101DB0000401A0CFE4EBF3E0DC012C2F3D91319343
:101DC0002150E1F7C1CFE9E6F0E0808182608083B5
:101DD000E89A0895A82FB92F80E090E041E050EAFA
:101DE000609530E009C02D9182279795879510F076
:101DF00084279527305EC8F36F5FA8F30895EADF64
:101E00008D939D930895CF93CFB7CF93DF93C395D1
:101E10004C9BE9F74C9B0BC04C9B09C04C9B07C0EB
:101E20004C9B05C04C9B03C04C9B01C089C06F9369
:101E3000C091C003DD27C953DC4F2F9365E54C9B50
:101E400003C02F916F91E6CF0F931F934F9320E024
:101E500040E15F9309B1047104FB27F93F9350E01F
:101E60003BE039C0147140642F77012F5F5F1EC0C3
:101E7000406819B114712F7752501FC0406409B1E6
:101E80002F770471D1F15F5F00C023C0406219B1A8
:101E90002F77147191F15F5F00C025C00471102786
:101EA000515012F45D5F0000115027952C3F19B17D
:101EB000C8F614710127015027952C3FC8F6422718
:101EC000499309B1047110274F73115027952C3F86
:101ED000A8F64695469519B1147179F0012701507D
:101EE00027952C3F98F66B5A60F3315009B1B0F644
:101EF00000C011E01CBB002717C03B503195C31B2D
:101F0000D04011E01CBB0881033CF9F00B34E9F030
:101F10002091BE031981110F1213EDCF093651F133
:101F20000D3211F0013E39F70093C5033F915F91E7
:101F30004F911F910F912F916F91CCB3C0FD67CF3F
:101F4000DF91CF91CFBFCF9118952091C503222368
:101F500069F31091C303112339F534303AF130930A
:101F6000C3032093BF031091C0033BE0311B3093A8
:101F7000C0031CC00091C3030130B4F40AE53091E2
:101F8000050134FD14C000930501C3EBD3E013C079
:101F9000052710E000C000000BB91AC0052710E0AB
:101FA000221F1DC010E021C04AE502C032ED432FC0
:101FB000C4E1D0E032E01AB114615C9A0BB11AB9F5
:101FC00054E120E865E320FF05270BB92795179515
:101FD0001C3FF0F66695B8F7B1F720FF05270BB95F
:101FE000279517951C3FD0F62795179517FF0527BE
:101FF00000001C3F0BB9B0F629913A9519F70B7EFA
:102000001091C403110FC651D0400BB911F01093B9
:10201000BE0311E01CBB00611AB11B7E402F4B7E3A
:1020200054E05A95F1F70BB91AB94BB97FCF9EE03E
:1020300088E10FB6F894A895809360000FBE909346
:1020400060000E94E30E549A80E0815099F4549805
:1020500078940E945B0580EF80936803A8950E94A6
:10206000E40D0E94A80280916803803FB9F30E94AA
:102070002D07F4CFA895EFE9FFE03197F1F700C005
:102080000000E3CFEE0FFF1F0590F491E02D0994BF
:04209000F894FFCFF2
:0620940065019703FF5AED
: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

@ -170,33 +170,57 @@ void jtag_run_pbje()
pbje_status = PBJE_DONE;
break;
case PBJE_TDI_SCAN: //ignore TDO 256max
case PBJE_TDI_SCAN: //ignore TDO, end scan with exit 256max
pbje_status = PBJE_PROC;
pbje_scan( DATA0, 0 );
pbje_scan( DATA0, 0, 1 );
pbje_status = PBJE_DONE;
break;
case PBJE_TDO_SCAN0: //TDI = 0, TMS=0 256max
case PBJE_TDI_SCAN_HOLD: //ignore TDO, don't exit 256max
pbje_status = PBJE_PROC;
pbje_scan( FORCE0, DATA0 );
pbje_scan( DATA0, 0, 0 );
pbje_status = PBJE_DONE;
break;
case PBJE_TDO_SCAN1: //TDI = 1, TMS=0 256max
case PBJE_TDO_SCAN0: //TDI = 0, TMS=0 (last TMS=1) 256max
pbje_status = PBJE_PROC;
pbje_scan( FORCE1, DATA0 );
pbje_scan( FORCE0, DATA0, 1 );
pbje_status = PBJE_DONE;
break;
case PBJE_TDO_SCAN1: //TDI = 1, TMS=0 (last TMS=1) 256max
pbje_status = PBJE_PROC;
pbje_scan( FORCE1, DATA0, 1 );
pbje_status = PBJE_DONE;
break;
case PBJE_TDO_SCAN0_HOLD: //TDI = 0, TMS=0 256max
pbje_status = PBJE_PROC;
pbje_scan( FORCE0, DATA0, 0 );
pbje_status = PBJE_DONE;
break;
case PBJE_TDO_SCAN1_HOLD: //TDI = 1, TMS=0 256max
pbje_status = PBJE_PROC;
pbje_scan( FORCE1, DATA0, 0 );
pbje_status = PBJE_DONE;
break;
//case PBJE_HALF_SCAN: //TDI = first half of data array, TDO = second, TMS=0 128max
// pbje_status = PBJE_PROC;
// pbje_scan( DATA0, DATA1 );
// pbje_scan( DATA0, DATA1, 1 );
// pbje_status = PBJE_DONE;
// break;
case PBJE_FULL_SCAN: //TDI = entire data array, TDO dumped into array stomping TDI, TMS=0 256max
pbje_status = PBJE_PROC;
pbje_scan( DATA0, DATA0 );
pbje_scan( DATA0, DATA0, 1 );
pbje_status = PBJE_DONE;
break;
case PBJE_FULL_SCAN_HOLD: //TDI = entire data array, TDO dumped into array stomping TDI, TMS=0 256max
pbje_status = PBJE_PROC;
pbje_scan( DATA0, DATA0, 0 );
pbje_status = PBJE_DONE;
break;
@ -332,8 +356,9 @@ void pbje_state_change( uint8_t tms_data )
//tdi/tdo data in data array, ingored, or forced 0/1
//numclk contains number of tck clocks to perform
//PRE/POST: TCK is low, all signals low (limit 5v non-tolerance with original kazzos)
void pbje_scan( uint8_t tdi_data, uint8_t tdo_data )
void pbje_scan( uint8_t tdi_data, uint8_t tdo_data, uint8_t exit )
{
//numclk is a sticky value, don't modify!
uint8_t clk_count = pbje_numclk;
uint8_t cur_byte = 0;
@ -414,7 +439,22 @@ void pbje_scan( uint8_t tdi_data, uint8_t tdo_data )
}
}
clk_count--;
//clock in TMS & TDI value with rising edge of TCK
//on the last shift, if exiting, exit SHIFT-DR/IR so TMS must go high
//This will put statemachine in EXIT1-IR/DR state at the same time the last bit is shifted in
if( exit && (clk_count == 0)) {
#ifdef STM_INL6
TMS_HI();
#else
exp_byte |= TMS_MASK;
EXP_SET(exp_byte);
#endif
}
//clock TCK latching both TMS & TDI
#ifdef STM_INL6
TCK_HI();
#else
@ -423,8 +463,6 @@ void pbje_scan( uint8_t tdi_data, uint8_t tdo_data )
EXP_SET(exp_byte_temp);
#endif
//may need to slow between edges.. depending on max TCK frequency...
clk_count--;
//end cycle TDO shifted out on falling edge of TCK
#ifdef STM_INL6

View File

@ -81,6 +81,6 @@ void jtag_run_pbje();
#define DATA0 0x20 //0x2x -> data array
//#define DATA1 0x21
void pbje_state_change( uint8_t tms_data );
void pbje_scan( uint8_t tdi_data, uint8_t tdo_data );
void pbje_scan( uint8_t tdi_data, uint8_t tdo_data, uint8_t exit );
#endif

View File

@ -6,8 +6,31 @@ local jtag = {}
local dict = require "scripts.app.dict"
-- file constants
local pbje_loc --physical location of PBJE engine so this script known how to set engine registers
local cur_jtag_state
local clock = os.clock
local function sleep(n) -- seconds
local t0 = clock()
while clock() - t0 <= n do end
end
-- warning: clock can eventually wrap around for sufficiently large n
-- (whose value is platform dependent). Even for n == 1, clock() - t0
-- might become negative on the second that clock wraps.
-- local functions
-- initialize lua portions of JTAG
-- JTAG hardware port may be virtuatlized by placing PBJE "Paul's Basic JTAG Engine"
-- 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 )
pbje_loc = location
end
local function wait_pbje_done( num_polls, debug )
local status
@ -29,41 +52,464 @@ local function wait_pbje_done( num_polls, debug )
end
local function set_data_2B( data )
--check args
if( data > 0xFFFF )then
print("ERROR data:", data, "too large for set_data_2B")
return false
end
--set data based on pjbe location
if( pbje_loc == nil ) then
print("ERROR, pbje location must be initialized prior to setting registers")
elseif( pbje_loc == "INLRETRO" ) then
dict.jtag("SET_2B_DATA", data)
return true
else
print("ERROR, pbje location:", pbje_loc, "not recognized by set_data_2B function.")
end
--failed if got to this point without returning
return false
end
local function set_clk( num_clks )
--check args
if( num_clks == 256 ) then
num_clks = 0
elseif( num_clks > 255 or num_clks < 0 )then
print("ERROR num clks:", num_clks, "exceeds range of 1-256")
return false
end
--set num_clks based on pjbe location
if( pbje_loc == nil ) then
print("ERROR, pbje location must be initialized prior to setting registers")
elseif( pbje_loc == "INLRETRO" ) then
dict.jtag("SET_NUMCLK", num_clks)
return true
else
print("ERROR, pbje location:", pbje_loc, "not recognized by set_clk function.")
end
--failed if got to this point without returning
return false
end
local function set_run_get_cmd( command )
local rv
--check args
if not op_jtag[command] then
print("ERROR command:", command, "is not defined in shared_dict_jtag.h")
return false
end
--set command based on pjbe location
if( pbje_loc == nil ) then
print("ERROR, pbje location must be initialized prior to setting registers")
elseif( pbje_loc == "INLRETRO" ) then
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
return true
else
print("ERROR, pbje location:", pbje_loc, "not recognized by set_run_get_cmd function.")
end
--failed if got to this point without returning
return false
end
-- clocks JTAG statemachine with TMS set to 1 enough times to guarantee RESET state
-- prereq: JTAG PBJEngine must be initialized
local function reset_statemachine( debug )
local rv
--only takes 5 clocks with TMS high to force into RESET from any state
set_clk(8)
set_run_get_cmd("PBJE_CLOCK1") --no data needed for this opcode, forces TMS to 1
--we know the state machine is in RESET now
cur_jtag_state = "RESET"
end
-- current and next JTAG state must be stable (RESET, IDLE, PAUSE-DR/IR) or SHIFT-DR/IR
-- only exception is reset will blindly force RESET by clocking with TMS high
-- other gotcha is that the last TDI bit is latched when transitioning out of SHIFT-DR/IR
-- state. So data scans must go from shift to exit1 to complete. Therefore it doesn't make
-- sense to enter this function in a SHIFT-DR/IR state, doing so would scan in one bit when
-- exiting SHIFT state
local function goto_state( new_jtag_state )
local clk, tms
--if new state is RESET then, just blindly clock with TMS high
if( new_jtag_state == "RESET" ) then
reset_statemachine()
cur_jtag_state = "RESET"
return true
end
--current state is stored in cur_jtag_state
if( cur_jtag_state == "RESET" ) then
if( new_jtag_state == "IDLE" ) then
clk = 1
tms = 0 -- IDLE-RESET
elseif( new_jtag_state == "SHIFT_DR" ) then
clk = 4
tms = 0x02 -- SHIFT-CAP-SELDR-IDLE 0010
elseif( new_jtag_state == "SHIFT_IR" ) then
clk = 5
tms = 0x06 -- SHIFT-CAP-SELIR-SELDR-IDLE 00110
elseif( new_jtag_state == "PAUSE_DR" ) then
clk = 5
tms = 0x0a -- PAUSE-EX1-CAP-SELDR-IDLE 01010
elseif( new_jtag_state == "PAUSE_IR" ) then
clk = 6
tms = 0x16 -- PAUSE-EX1-CAP-SELIR-SELDR-IDLE 010110
else
print("ERROR!!! new JTAG state:", new_jtag_state, "isn't stable, nor shift state!!!")
return nil
end
elseif( cur_jtag_state == "IDLE" ) then
if( new_jtag_state == "IDLE" ) then
clk = 1
tms = 0 -- IDLE-IDLE
elseif( new_jtag_state == "SHIFT_DR" ) then
clk = 3
tms = 0x01 -- SHIFT-CAP-SELDR 001
elseif( new_jtag_state == "SHIFT_IR" ) then
clk = 4
tms = 0x03 -- SHIFT-CAP-SELIR-SELDR 0011
elseif( new_jtag_state == "PAUSE_DR" ) then
clk = 4
tms = 0x05 -- PAUSE-EX1-CAP-SELDR 0101
elseif( new_jtag_state == "PAUSE_IR" ) then
clk = 5
tms = 0x0b -- PAUSE-EX1-CAP-SELIR-SELDR 01011
else
print("ERROR!!! new JTAG state:", new_jtag_state, "isn't stable, nor shift state!!!")
return nil
end
elseif( cur_jtag_state == "EXIT1_DR" ) then
if( new_jtag_state == "IDLE" ) then
clk = 2
tms = 0x01 -- IDLE-UP 01
elseif( new_jtag_state == "SHIFT_DR" ) then
clk = 3
tms = 0x02 -- SHIFT-EX2-PAUSE 010
elseif( new_jtag_state == "SHIFT_IR" ) then
clk = 5
tms = 0x07 -- SHIFT-CAP-SELIR-SELDR-UP 0_0111
elseif( new_jtag_state == "PAUSE_DR" ) then
clk = 1
tms = 0x00 -- PAUSE 0
elseif( new_jtag_state == "PAUSE_IR" ) then
clk = 6
tms = 0x17 -- PAUSE-EX1-CAP-SELIR-SELDR-UP 01_0111
else
print("ERROR!!! new JTAG state:", new_jtag_state, "isn't stable, nor shift state!!!")
return nil
end
elseif( cur_jtag_state == "EXIT1_IR" ) then
if( new_jtag_state == "IDLE" ) then
clk = 2
tms = 0x01 -- IDLE-UP 01
elseif( new_jtag_state == "SHIFT_DR" ) then
clk = 4
tms = 0x03 -- SHIFT-CAP-SELIR-UP 0011
elseif( new_jtag_state == "SHIFT_IR" ) then
clk = 3
tms = 0x02 -- SHIFT-EX2-PAUSE 010
elseif( new_jtag_state == "PAUSE_DR" ) then
clk = 5
tms = 0x0b -- PAUSE-EX1-CAP-SELIR-UP 0_1011
elseif( new_jtag_state == "PAUSE_IR" ) then
clk = 1
tms = 0x00 -- PAUSE 0
else
print("ERROR!!! new JTAG state:", new_jtag_state, "isn't stable, nor shift state!!!")
return nil
end
elseif( cur_jtag_state == "SHIFT_DR" ) then
-- if( new_jtag_state == "IDLE" ) then
-- clk = 3
-- tms = 0x03 -- IDLE-UP-EX1 011
--
-- -- elseif( new_jtag_state == "SHIFT_DR" ) then
-- -- --nothing to do
--
-- elseif( new_jtag_state == "SHIFT_IR" ) then
-- clk = 6
-- tms = 0x0f -- SHIFT-CAP-SELIR-SELDR-UP-EX1 00_1111
--
-- elseif( new_jtag_state == "PAUSE_DR" ) then
-- clk = 2
-- tms = 0x01 -- PAUSE-EX1 01
--
-- elseif( new_jtag_state == "PAUSE_IR" ) then
-- clk = 7
-- tms = 0x2f -- PAUSE-EX1-CAP-SELIR-SELDR-UP-EX1 010_1111
-- else
--
print("ERROR!!! can't change state starting from SHIFT-IR/DR as a bit will be scanned in when exitting")
return nil
-- end
elseif( cur_jtag_state == "SHIFT_IR" ) then
-- if( new_jtag_state == "IDLE" ) then
-- clk = 3
-- tms = 0x03 -- IDLE-UP-EX1 011
--
-- elseif( new_jtag_state == "SHIFT_DR" ) then
-- clk = 5
-- tms = 0x07 -- SHIFT-CAP-SELIR-UP-EX1 0_0111
--
-- -- elseif( new_jtag_state == "SHIFT_IR" ) then
-- -- --nothing to do
--
-- elseif( new_jtag_state == "PAUSE_DR" ) then
-- clk = 6
-- tms = 0x17 -- PAUSE-EX1-CAP-SELIR-UP-EX1 01_0111
--
-- elseif( new_jtag_state == "PAUSE_IR" ) then
-- clk = 2
-- tms = 0x01 -- PAUSE-EX1 01
-- else
print("ERROR!!! can't change state starting from SHIFT-IR/DR as a bit will be scanned in when exitting")
return nil
-- end
elseif( cur_jtag_state == "PAUSE_DR" ) then
if( new_jtag_state == "IDLE" ) then
clk = 3
tms = 0x03 -- IDLE-UP-EX2 011
elseif( new_jtag_state == "SHIFT_DR" ) then
clk = 2
tms = 0x01 -- SHIFT-EX2 01
elseif( new_jtag_state == "SHIFT_IR" ) then
clk = 6
tms = 0x0f -- SHIFT-CAP-SELIR-SELDR-UP-EX2 00_1111
elseif( new_jtag_state == "PAUSE_DR" ) then
--nothing to do
elseif( new_jtag_state == "PAUSE_IR" ) then
clk = 7
tms = 0x2f -- PAUSE-EX1-CAP-SELIR-SELDR-UP_EX2 010_1111
else
print("ERROR!!! new JTAG state:", new_jtag_state, "isn't stable, nor pre-shift state!!!")
return nil
end
elseif( cur_jtag_state == "PAUSE_IR" ) then
if( new_jtag_state == "IDLE" ) then
clk = 3
tms = 0x03 -- IDLE-UP-EX2 011
elseif( new_jtag_state == "SHIFT_DR" ) then
clk = 5
tms = 0x07 -- SHIFT-CAP-SELDR-UP-EX2 0_0111
elseif( new_jtag_state == "SHIFT_IR" ) then
clk = 2
tms = 0x01 -- SHIFT-EX2 01
elseif( new_jtag_state == "PAUSE_DR" ) then
clk = 6
tms = 0x17 -- PAUSE-EX1-CAP-SELDR-UP_EX2 01_0111
elseif( new_jtag_state == "PAUSE_IR" ) then
--nothing to do
else
print("ERROR!!! new JTAG state:", new_jtag_state, "isn't stable, nor pre-shift state!!!")
return nil
end
else
print("ERROR!!! current JTAG state:", cur_jtag_state, "isn't stable, nor shift state!!!")
return nil
end
--set PJBE register values and give state change command
set_data_2B(tms)
set_clk(clk)
set_run_get_cmd("PBJE_STATE_CHG")
--update jtag state
cur_jtag_state = new_jtag_state
return true
end
-- return data scanned out
local function scan( 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")
data_out = dict.jtag("GET_6B_DATA")
--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")
--scan in with TDI high
elseif( data_in == "HIGH" and not data_out ) then
set_run_get_cmd("PBJE_TDO_SCAN1")
--scan in with TDI low
elseif( data_in == "LOW" and not data_out ) then
set_run_get_cmd("PBJE_TDO_SCAN0")
--scan in ignoring TDO
elseif( data_in and not data_out ) then
set_data_2B(data_in)
set_run_get_cmd("PBJE_TDI_SCAN")
--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")
data_out = dict.jtag("GET_6B_DATA")
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
if( state ~= "IDLE" and state ~= "RESET" and state ~= "PAUSE_DR" and state ~= "PAUSE_IR" ) then
print("ERROR! runtest must designate a stable state of IDLE, RESET, PAUSE-DR/IR")
return nil
end
--state arguement is required
--svf standard dictates this as a sticky value use last passed, IDLE is default
goto_state(state)
--currently require some number of TCK clocks to perform test
set_clk(clks)
if( state == "RESET") then
--RESET remains stable with TMS = 1
set_run_get_cmd("PBJE_CLOCK1")
else
--PAUSE & IDLE states remain stable with TMS = 0
set_run_get_cmd("PBJE_CLOCK0")
end
--ensure sufficient time has passed
--current firmware build for stm32 on inlretro6 consumes 400nsec per TCK & ~1msec between USB transfers
if( time ) then
--call sleep function for time number of seconds (support fractions)
sleep( time )
end
return true
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")
--dict.jtag("SET_3B_DATA", 0x0201, 0x03 )
--print("return data:", dict.jtag("GET_6B_DATA"))
--print(dict.jtag("SET_CMD", "PBJE_STATE_CHG"))
--print(dict.jtag("GET_CMD"))
--print(dict.jtag("GET_STATUS"))
--first put/verify jtag statemachine is in RESET
dict.jtag("SET_2B_DATA", 0xFFFF)
dict.jtag("SET_NUMCLK", 8)
rv = dict.jtag("SET_CMD_WAIT", "PBJE_STATE_CHG")
--verify command was done
if(rv ~= op_jtag["PBJE_DONE"]) then print("error JTAG not done, status: ", rv) end
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
--reset-DRshift c4 m0010
dict.jtag("SET_2B_DATA", 0x0002)
dict.jtag("SET_NUMCLK", 4)
rv = dict.jtag("SET_CMD_WAIT", "PBJE_STATE_CHG")
--verify command was done
if(rv ~= op_jtag["PBJE_DONE"]) then print("error JTAG not done, status: ", rv) end
goto_state("SHIFT_DR")
--scan out 32bit IDCODE while scanning in 1's to TDI
dict.jtag("SET_NUMCLK", 32)
dict.jtag("SET_CMD", "PBJE_TDO_SCAN1")
--verify done before updating PBJE values
jtag.wait_pbje_done( 4, true )
rv = scan( 32, "HIGH", true )
rv = dict.jtag("GET_6B_DATA")
print("return data:", string.format(" %X, ",rv))
if( rv == 0x1281043 ) then
-- Mach XO 256 01281043
@ -90,43 +536,155 @@ local function run_jtag( debug )
--
-- ! 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);
-- --change to SCAN-IR state
-- dict.jtag("SET_2B_DATA", 0x0006)
-- dict.jtag("SET_NUMCLK", 5)
-- dict.jtag("SET_CMD", "PBJE_STATE_CHG")
-- --verify done before updating PBJE values
-- jtag.wait_pbje_done( 4, true )
--
-- --scan in IDCODE instruction
-- dict.jtag("SET_2B_DATA", 0x0016)
-- dict.jtag("SET_NUMCLK", 8)
-- dict.jtag("SET_CMD", "PBJE_TDI_SCAN")
-- --verify done before updating PBJE values
-- jtag.wait_pbje_done( 4, true )
--
-- --change to SCAN-DR state
-- --shift-pause c2 m01
-- --IRpause-DRshift c5 m00111
-- --together c7 m001_1101 -> 0x1D
-- dict.jtag("SET_2B_DATA", 0x001D)
-- dict.jtag("SET_NUMCLK", 7)
-- dict.jtag("SET_CMD", "PBJE_STATE_CHG")
-- --verify done before updating PBJE values
-- jtag.wait_pbje_done( 4, true )
--
--
-- --scan out 32bit IDCODE while scanning in 1's to TDI
-- dict.jtag("SET_NUMCLK", 32)
-- dict.jtag("SET_CMD", "PBJE_TDO_SCAN1")
-- --verify done before updating PBJE values
-- jtag.wait_pbje_done( 4, true )
--
-- print("return data:", dict.jtag("GET_6B_DATA"))
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
@ -138,6 +696,7 @@ end
-- 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

View File

@ -5,6 +5,9 @@
-- initial function called from C main
function main ()
print("\n")
local dict = require "scripts.app.dict"
local cart = require "scripts.app.cart"
local nes = require "scripts.app.nes"
@ -48,6 +51,7 @@ function main ()
dict.io("IO_RESET")
dict.io("NES_INIT")
--[[
--NES detect mirroring to gain mapper info
nes.detect_mapper_mirroring(true)
--NES detect memories to gain more mapper/board info
@ -67,75 +71,86 @@ function main ()
dict.nes("NES_CPU_WR", 0x8000, 0x00)
nes.read_flashID_prgrom_exp0(true)
--try mapper 30 flash ID
--]]
jtag.run_jtag()
-- --Check for SWIM on A0
-- dict.io("IO_RESET")
--
-- dict.io("SWIM_INIT", "SWIM_ON_A0")
-- if swim.start(true) then
-- --SWIM is now established and running at HIGH SPEED
-- snes_swimcart = false --don't want to use SWIM pin to control flash /OE, use SNES RESET (EXP0) instead
--
-- -- swim.swim_test()
--
-- --swim.write_optn_bytes( true, true ) -- enable ROP, debug
--
-- --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
-- --local cic_file = assert(io.open("stm8_8KB_zero.bin", "rb"))
-- --local cic_file = assert(io.open("stm8_8KB_0xff.bin", "rb"))
-- local cic_file = assert(io.open("stm8_8KB_testpattern.bin", "rb"))
--
-- --write CIC file
-- swim.write_flash( cic_file )
--
-- --close CIC file
-- assert(cic_file:close())
--
-- -- 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
--
-- print("done flashing STM8 on A0")
--Check for SWIM on A0
--[[
dict.io("IO_RESET")
print("start swim")
dict.io("SWIM_INIT", "SWIM_ON_A0")
if swim.start(true) then
--SWIM is now established and running at HIGH SPEED
snes_swimcart = false --don't want to use SWIM pin to control flash /OE, use SNES RESET (EXP0) instead
-- swim.swim_test()
--swim.write_optn_bytes( true, true ) -- enable ROP, debug
--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
--local cic_file = assert(io.open("stm8_8KB_zero.bin", "rb"))
--local cic_file = assert(io.open("stm8_8KB_0xff.bin", "rb"))
--local cic_file = assert(io.open("stm8_8KB_testpattern.bin", "rb"))
local cic_file = assert(io.open("NESCIC.bin", "rb"))
--write CIC file
swim.write_flash( cic_file )
--close CIC file
assert(cic_file:close())
--set ROP & AFR0
swim.write_optn_bytes( false, true ) -- ROP not set, debug set
-- 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
print("done flashing STM8 on A0")
dict.io("IO_RESET")
-- --determined all that could about mapper board
-- --set rom types and sizes
-- --perform desired operation
--]]
-- --FLASHING:
-- --erase cart
-- erase.erase_nes( true )
-- --open file
-- local file
-- file = assert(io.open("inltest.bin", "rb"))
-- --determine if auto-doubling, deinterleaving, etc,
-- --needs done to make board compatible with rom
-- --flash cart
-- flash.flash_nes( file, true )
-- --close file
-- assert(file:close())
--determined all that could about mapper board
--set rom types and sizes
--perform desired operation
-- --DUMPING:
-- --create new file
-- local file
-- file = assert(io.open("dump.bin", "wb"))
-- --dump cart into file
-- dump.dump_nes( file, true )
-- --close file
-- assert(file:close())
--[[
--FLASHING:
--erase cart
erase.erase_nes( true )
--open file
local file
file = assert(io.open("inltest.bin", "rb"))
--determine if auto-doubling, deinterleaving, etc,
--needs done to make board compatible with rom
--flash cart
flash.flash_nes( file, true )
--close file
assert(file:close())
--DUMPING:
--create new file
local file
file = assert(io.open("dump.bin", "wb"))
--dump cart into file
dump.dump_nes( file, true )
--close file
assert(file:close())
--]]
-- dict.io("IO_RESET")

View File

@ -26,18 +26,29 @@
//should only be used for quick commands like state change, not for long scan in/outs
#define GET_STATUS 4 //RL=3 only the engine can write to status, ready only by host
#define SET_NUMCLK 5 //numclk is only writable by host, read only by engine
//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
//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
//DATA SCAN commands, these end with settting 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
#define PBJE_TDO_SCAN0 0x03 //TDI = 0, TMS=0 256max
#define PBJE_TDO_SCAN1 0x04 //TDI = 1, TMS=0 256max
#define PBJE_HALF_SCAN 0x05 //TDI = first half of data array, TDO = second, TMS=0 128max
//#define PBJE_HALF_SCAN 0x05 //TDI = first half of data array, TDO = second, TMS=0 128max
#define PBJE_FULL_SCAN 0x06 //TDI = entire data array, TDO dumped into array stomping TDI, TMS=0 256max
//Clocking commands, mostly used for RUNTEST type instructions when waiting for device to complete operation
#define PBJE_CLOCK0 0x07 //data not used, clock TMS=0 for NUMCLK
#define PBJE_CLOCK1 0x08 //data not used, clock TMS=1 for NUMCLK
#define PBJE_FREE_CLOCK0 0x09 //data not used, clock TMS=0 indefinely
@ -45,6 +56,13 @@
#define PBJE_LONG_CLOCK0 0x0B //data contains 32bit uint for number of clocks, TMS=0, numclk not used
#define PBJE_LONG_CLOCK1 0x0C //data contains 32bit uint for number of clocks, TMS=1, numclk not used
//These scans leave JTAG SM in SHIFT state so more bits can be shifted in later on
//this is because the last bit is shifted in when exiting SHIFT-IR/DR
#define PBJE_TDI_SCAN_HOLD 0x0D //ignore TDO 256max
#define PBJE_TDO_SCAN0_HOLD 0x0E //TDI = 0, TMS=0 256max
#define PBJE_TDO_SCAN1_HOLD 0x0F //TDI = 1, TMS=0 256max
#define PBJE_FULL_SCAN_HOLD 0x10 //TDI = entire data array, TDO dumped into array stomping TDI, TMS=0 256max
//Statuses & commands to get to the status
#define PBJE_INIT 0x80

View File

@ -103,7 +103,7 @@
// PC15 "AUDR" cart audio
#define C15_ 15
#define AUDR_ 15
// PC16 "CIN" CIC data in
// PC16 "CIN" CIC data in & GB power selector
#define C16_ 16
#define CIN_ 16
// PC17 "SWD" mcu debug