diff --git a/DAPLink.uvoptx b/DAPLink.uvoptx
index b56536b..f8a3acf 100644
--- a/DAPLink.uvoptx
+++ b/DAPLink.uvoptx
@@ -153,7 +153,40 @@
-
+
+
+ 0
+ 0
+ 249
+ 1
+ 2812
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ D:\寰帶鍒跺櫒\DAPLink\src\DAP_config.h
+
+ \\DAPLink\src/DAP/DAP.c\249
+
+
+ 1
+ 0
+ 1481
+ 1
+ 4930
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ D:\寰帶鍒跺櫒\DAPLink\src\DAP\DAP.c
+
+ \\DAPLink\src/DAP/DAP.c\1481
+
+
0
@@ -213,7 +246,7 @@
APP
- 1
+ 0
0
0
0
@@ -301,7 +334,7 @@
2
7
1
- 1
+ 0
0
0
.\src\DAP\JTAG_DP.c
@@ -324,7 +357,7 @@
- CSL/StdPD
+ SWD_host
0
0
0
@@ -336,14 +369,34 @@
0
0
0
+ .\src\SWD_host\SWD_host.c
+ SWD_host.c
+ 0
+ 0
+
+
+
+
+ CSL/StdPD
+ 0
+ 0
+ 0
+ 0
+
+ 4
+ 10
+ 1
+ 0
+ 0
+ 0
.\src\CSL\NUCM480_StdPeriph_Driver\clk.c
clk.c
0
0
- 3
- 10
+ 4
+ 11
1
0
0
@@ -354,8 +407,8 @@
0
- 3
- 11
+ 4
+ 12
1
0
0
@@ -366,8 +419,8 @@
0
- 3
- 12
+ 4
+ 13
1
0
0
@@ -378,8 +431,8 @@
0
- 3
- 13
+ 4
+ 14
1
0
0
@@ -390,8 +443,8 @@
0
- 3
- 14
+ 4
+ 15
1
0
0
@@ -402,8 +455,8 @@
0
- 3
- 15
+ 4
+ 16
1
0
0
@@ -414,8 +467,8 @@
0
- 3
- 16
+ 4
+ 17
1
0
0
@@ -426,8 +479,8 @@
0
- 3
- 17
+ 4
+ 18
1
0
0
@@ -438,8 +491,8 @@
0
- 3
- 18
+ 4
+ 19
1
0
0
@@ -458,8 +511,8 @@
0
0
- 4
- 19
+ 5
+ 20
1
0
0
@@ -470,8 +523,8 @@
0
- 4
- 20
+ 5
+ 21
2
0
0
diff --git a/DAPLink.uvprojx b/DAPLink.uvprojx
index b83827b..63ac65c 100644
--- a/DAPLink.uvprojx
+++ b/DAPLink.uvprojx
@@ -339,7 +339,7 @@
- .\src;.\src\DAP;.\src\CSL\CMSIS\CoreSupport;.\src\CSL\CMSIS\DeviceSupport;.\src\CSL\NUCM480_StdPeriph_Driver
+ .\src;.\src\DAP;.\src\SWD_host;.\src\CSL\CMSIS\CoreSupport;.\src\CSL\CMSIS\DeviceSupport;.\src\CSL\NUCM480_StdPeriph_Driver
@@ -430,6 +430,16 @@
+
+ SWD_host
+
+
+ SWD_host.c
+ 1
+ .\src\SWD_host\SWD_host.c
+
+
+
CSL/StdPD
@@ -561,4 +571,13 @@
+
+
+
+ DAPLink
+ 1
+
+
+
+
diff --git a/out/DAPLink.bin b/out/DAPLink.bin
index 1ae0c10..799ab47 100644
Binary files a/out/DAPLink.bin and b/out/DAPLink.bin differ
diff --git a/out/DAPLink.hex b/out/DAPLink.hex
index 661e304..384f599 100644
--- a/out/DAPLink.hex
+++ b/out/DAPLink.hex
@@ -1,63 +1,63 @@
:020000040000FA
-:10000000104E0020312B0000712B0000732B0000DC
-:10001000752B0000772B0000792B000000000000FA
-:100020000000000000000000000000007B2B00002A
-:100030007D2B0000000000007F2B0000812B0000C2
-:10004000832B0000832B0000832B0000832B0000F8
-:10005000832B0000832B0000832B0000832B0000E8
-:10006000832B0000832B0000832B0000832B0000D8
-:10007000832B0000832B0000832B0000832B0000C8
-:10008000832B0000832B0000832B0000832B0000B8
-:10009000832B0000832B0000832B0000832B0000A8
-:1000A000832B0000832B0000832B0000832B000098
-:1000B000832B0000832B0000832B0000832B000088
-:1000C000832B0000832B0000832B0000832B000078
-:1000D000832B0000832B0000832B0000832B000068
-:1000E000832B0000832B0000832B0000832B000058
-:1000F000832B0000832B0000832B0000832B000048
-:1001000087080000832B0000832B0000832B000056
-:10011000832B000041040000832B0000832B000090
-:10012000832B0000832B0000832B0000832B000017
-:10013000832B0000832B0000832B0000832B000007
-:10014000832B0000832B0000832B0000832B0000F7
-:10015000832B0000832B0000832B0000832B0000E7
-:10016000832B0000832B0000832B0000832B0000D7
-:10017000832B0000832B0000832B0000832B0000C7
-:10018000832B0000832B0000832B0000832B0000B7
-:10019000832B0000832B0000832B0000832B0000A7
-:1001A000832B0000832B0000832B0000832B000097
-:1001B000832B0000832B0000DFF810D002F0FEFC40
-:1001C00000480047CD020000AFF30080104E002031
+:10000000204E0020ED3600002D3700002F37000075
+:1000100031370000333700003537000000000000A2
+:100020000000000000000000000000003737000062
+:1000300039370000000000003B3700003D3700006A
+:100040003F3700003F3700003F3700003F370000D8
+:100050003F3700003F3700003F3700003F370000C8
+:100060003F3700003F3700003F3700003F370000B8
+:100070003F3700003F3700003F3700003F370000A8
+:100080003F3700003F3700003F3700003F37000098
+:100090003F3700003F3700003F3700003F37000088
+:1000A0003F3700003F3700003F3700003F37000078
+:1000B0003F3700003F3700003F3700003F37000068
+:1000C0003F3700003F3700003F3700003F37000058
+:1000D0003F3700003F3700003F3700003F37000048
+:1000E0003F3700003F3700003F3700003F37000038
+:1000F0003F3700003F3700003F3700003F37000028
+:10010000870800003F3700003F3700003F370000FE
+:100110003F370000410400003F3700003F37000038
+:100120003F3700003F3700003F3700003F370000F7
+:100130003F3700003F3700003F3700003F370000E7
+:100140003F3700003F3700003F3700003F370000D7
+:100150003F3700003F3700003F3700003F370000C7
+:100160003F3700003F3700003F3700003F370000B7
+:100170003F3700003F3700003F3700003F370000A7
+:100180003F3700003F3700003F3700003F37000097
+:100190003F3700003F3700003F3700003F37000087
+:1001A0003F3700003F3700003F3700003F37000077
+:1001B0003F3700003F370000DFF810D003F0EEFAC1
+:1001C00000480047CD020000AFF30080204E002021
:1001D00010B500F0ACF84FF08044606B5C4908400B
:1001E0006063606B5B4908436063E06A20F0030072
:1001F00040F48270E062D4F8200220F0F00040F079
-:100200003000C4F82002544801F0E5FB0020C4F897
-:10021000000100225149524802F058F900F092F9C9
-:1002200000F0C6FA02F063F9BDE81040352000F096
-:1002300073B810B5012211464A4801F001FF4FF092
+:100200003000C4F82002544802F0C3F90020C4F8BA
+:10021000000100225149524802F036FF00F092F9E5
+:1002200000F0C6FA02F041FFBDE81040352000F0B2
+:1002300073B810B5012211464A4802F0DFFC4FF0B6
:100240008040816B21F0FF018163816B41F0770178
-:100250008163454C00221146204601F08AFB20466E
-:1002600001F0B9FB414C4FF4E131204601F037FF7A
+:100250008163454C00221146204602F068F9204691
+:1002600002F097F9414C4FF4E131204602F015FDC0
:10027000616841F013016160BDE81040302000F07A
:100280004BB870B500F053F84FF08044E06D20F4A7
-:100290007F40E065E06D40F42A40E065012001F018
-:1002A000B5FD012001F054FC314D284601F067FDF9
+:100290007F40E065E06D40F42A40E065012002F017
+:1002A00093FB012002F032FA314D284602F045FB63
:1002B0001121C4F834120021C4F800112D490D6039
:1002C0002D482E49B5FBF0F0086070BDFFF7D9FF4F
-:1002D000FFF7AFFF01F082F8FFF77AFF214C012210
-:1002E00040341146204601F05FFE012202212046E3
-:1002F00001F05AFE224D1D4C2E1D00F0CAF900F0EF
+:1002D000FFF7AFFF01F09FF8FFF77AFF214C0122F3
+:1002E00040341146204602F03DFC01220221204606
+:1002F00002F038FC224D1D4C2E1D00F0CAF900F012
:1003000013FBA06940F34070401C2860A06940F3D3
:100310000070401C3060F0E700F01F0201219140A6
:100320004009800000F1E020C0F80011704710B5CE
:100330005921880716228823C0F80011C0F800212F
:10034000C0F80031D0F80041002CF5D010BD0000FD
:10035000FFFF00F00000EE0E1B00004093050000C0
-:10036000542C000040400040123C8C770020074095
-:1003700000B0710B7401002040420F007801002092
+:100360003438000040400040123C8C7700200740A9
+:1003700000B0710B8001002040420F00840100207A
:100380008048004070B5034601251878072815D02D
:10039000F34C607818B16068A268904210D0F148C0
-:1003A000626800EB82100A46194602F0F5FB6068AD
+:1003A000626800EB82100A46194603F0D3F96068D0
:1003B000401C60606068102803D004E0EA480570C3
:1003C00070BD002060606068A1688842F8D16570E7
:1003D00070BD10B5E5480068E5490844E34C241DAC
@@ -71,13 +71,13 @@
:10045000042068606869C00704D0286940F4FA6025
:10046000286103E0286920F080002861E00715D0AA
:1004700001206860F00705D0286940F4FA6028611F
-:1004800002F0C6FAB00703D5286920F010002861F1
+:1004800003F0A4F8B00703D5286920F01000286114
:10049000700703D5286940F4FA602861200701D568
:1004A00008206860A0074CD5002C10DA4FF00040FF
:1004B0006860AE482438016841F001010160AB4832
-:1004C0001438016841F00101016002F010FAE00304
-:1004D00004D54FF48030686002F035FAA0030DD5E2
-:1004E0004FF40030686002F074FAA4484178202983
+:1004C0001438016841F00101016002F0EEFFE00321
+:1004D00004D54FF48030686003F013F8A0030DD505
+:1004E0004FF40030686003F052F8A44841782029A6
:1004F00004D10079012801D100F077F9600304D517
:100500004FF480206860FFF79AFF200304D54FF472
:1005100000206860FFF75DFFE00202D54FF4801015
@@ -88,13 +88,13 @@
:100560000871183A11608149203908607F4941209B
:10057000083908607D494820103908607B492120EE
:10058000083108607949882008604020091D08600A
-:1005900070477CB5684601F0BCFF9DF80000784CC0
+:1005900070477CB5684602F09AFD9DF80000784CE3
:1005A0000006A4F1040529D59DF80100012809D011
:1005B000022807D0032805D0212807D0002000F00A
:1005C000B9F87CBD002000F0B5F87CBD9DF80400B2
:1005D000012808D16A48083800686549072208449C
:1005E000684900F098F8206840F0800020600720FB
-:1005F00028600021084601F091FF7CBD9DF80100B4
+:1005F00028600021084602F06FFD7CBD9DF80100D7
:1006000000260B2820D004DC09280AD00A2804D1AF
:1006100014E020282FD022281AD0002000F08AF8D9
:100620007CBD9DF803000328FAD1554810300168BD
@@ -103,10 +103,10 @@
:100650009DF80400012808D19DF802009DF80310C0
:1006600040EA01204849A1F80C04206840F08000CD
:1006700020602E607CBD9DF80400012803D1072175
-:10068000404801F04BFF206840F0800020602E6061
+:10068000404802F029FD206840F0800020602E6084
:100690007CBD70B5324CA0686168884201D1607839
:1006A000B0B3344DE068A26805EB80112D4800EB33
-:1006B000821000F002FEA068401C102800D100202B
+:1006B000821000F023FEA068401C102800D100200A
:1006C000A060A16862680020914200D1607021782A
:1006D00081B12070E06805EB801124481038006873
:1006E000234A1044402200F016F8204940200C39DB
@@ -117,9 +117,9 @@
:10073000F5D118BD0021124B03EB0112126802F033
:100740000F02824208D10E48001D00EB0110016823
:1007500041F0020101607047491C0C29ECD370473D
-:1007600010010020A00100202B01002030050C40CA
-:1007700000010C40A005002000000C406C0100208E
-:1007800008050C4024010020A0090020BB490020DE
+:1007600010010020AC0100202B01002030050C40BE
+:1007700000010C40AC05002000000C407801002076
+:1007800008050C4024010020AC090020BB490020D2
:10079000A1F84E047047BA480168BA488180B84948
:1007A000091F0968B84A114401600121C1807047DE
:1007B000B34942201C390860B149C8202439086077
@@ -134,7 +134,7 @@
:100840000222F1E70322EFE7002308E0082306E095
:10085000182304E0282302E0382300E00023317944
:1008600059B101290BD002290BD000210091316828
-:1008700001F0D1FCC5F80041F8BD0021F6E70421E4
+:1008700002F0AFFAC5F80041F8BD0021F6E7042107
:10088000F4E70421F2E770B5824BD8697B4AC007D0
:100890004FF400754FF000041AD1D869C00617D480
:1008A00019E01868C1B2B2F80002A84210D2B2F83A
@@ -166,572 +166,762 @@
:100A4000431CA2F80834104490F806020860B2F87B
:100A50000804A84201D3A2F80844012080F31088BA
:100A6000B2F80604401EA2F80604002080F31088A5
-:100A7000486840F002004860BDE8F881A009002005
-:100A800064050C40F00D002000010C4004E000E083
-:100A9000A00B0020002007402401002070B54FF07B
-:100AA000402501220221284601F07EFAFE49012458
-:100AB0000C6001221146284601F076FAFA49091F16
-:100AC0000C6001220421284601F06EFA2846BDE898
-:100AD00070400122042101F067BA10B54FF04024A4
-:100AE00000220221204601F05FFA20460022BDE8E4
-:100AF0001040012101F058BAEFE7002070470022B2
-:100B0000062824D006DC052821D2DFE800F02020CA
-:100B100020200C00F0280DD0FD2818D0FE2813D07E
-:100B2000FF2814D10AE0E14802680A6000790871E0
-:100B300005220CE011200870012208E04020087016
-:100B400000204870022202E01020087001221046A6
-:100B500070474FF47A414843401EFDD170470278F8
-:100B6000407842EA00208001401EFDD10870D04844
-:100B7000704710B5CC4B02781B1DCD4C002A05D018
-:100B8000012A08D0FF200870204610BD407800F0F0
-:100B90000100186003E0407800F0010018600020B8
-:100BA0000870204610BD70B50D460478002C00D1A9
-:100BB0000124012C04D000242C704FF0011070BDD2
-:100BC000BC4901200870FFF769FFF5E770B50446DE
-:100BD000B84900250D70FFF780FF2570012070BD1A
-:100BE00010B50446FFF789FF6070002020700220D6
-:100BF00010BDF0B5037842788478C57844EA0524BE
-:100C0000057940792D0445EA00600443A64DD607D6
-:100C10004FF001074FF0000004D0DE0701D02F6035
-:100C200000E02860A44E5FEA827C05D55FEA837C01
-:100C300001D5376000E0306064B3A04FBC4200D9FA
-:100C40003C464FF0E027B86104EB4404A4017C610A
-:100C500005243C61D40702D02C689C4214D194072F
-:100C600003D53468B4EB530F0ED1540702D5B0EB63
-:100C7000930F09D1940602D5B0EB531F04D114068B
-:100C800007D5B0EBD31F04D03C69C4F30044002C5B
-:100C9000E0D038612868326840EA4200087088482D
-:100CA000F0BD30B50278437842EA03228378C078F9
-:100CB0001B0443EA006002438248002A08D0824DA8
-:100CC00000247C4BAA4206D301225A705A600FE0DE
-:100CD000FF220A7030BD5C707C4D1544B5FBF2F20A
-:100CE000022A03D90325B2FBF5F200E001225A6083
-:100CF0000C7030BD70B50D4610F8014B0146002C4C
-:100D000001D14FF48074204600F07AFB0020287057
-:100D1000E41DE008401C0004401C70BD0078654ADA
-:100D200000F003035B1C1375C0F3800050750020B6
-:100D300008704FF00110704710B5FF220A700122B1
-:100D4000012410F8013B0AE010F8011B01F03F01FB
-:100D500001B94021C91DC90808440A44521C5B1E40
-:100D6000591CF1D1204662F31F4010BD0078FF22CC
-:100D70000A70401C0004401C7047FF2008704FF0B0
-:100D80000110704710B54B4A03781372437884788A
-:100D900043EA04235381C378007943EA0020908119
-:100DA000002008704A4810BD2DE9F04F87B0044676
-:100DB00006940020049005918D1CDFF818A10021F5
-:100DC0008AF80010002703916678A41C002E69D0D1
-:100DD00014F8018B5FEA887165D587B33548B0F8A0
-:100DE0000A9008F0110001280DD101A9404600F039
-:100DF000A2FD022815D1B9F1010912D39AF8001009
-:100E00000029F2D00DE001A90E2000F094FD022887
-:100E100006D1B9F1010903D39AF800100029F2D0E4
-:100E2000002701283ED1019929700199090A6970AA
-:100E30000199090CA9700199090EE9702D1D5FEA4D
-:100E4000C8616AD520786178E27840EA0120A1780B
-:100E5000090441EA026108430290241D1548B0F8D4
-:100E60000CB05FEAC87011D01248B0F80A900021A7
-:100E7000404600F060FD022806D1B9F1010903D314
-:100E80009AF800100029F2D001280BD10948B0F8D7
-:100E90000A9001A9404600F04EFD022821D1B9F187
-:100EA000010919E0B6E06EE004480040702C000033
-:100EB00001000200F80D002000480040C0C62D00CF
-:100EC0000100060001000400006CDC02FFD7B80539
-:100ED000010005002B01002003D39AF8001000291F
-:100EE000D7D001280DD1F949019A09691140029A18
-:100EF000914206D0BBF1010B03D39AF800100029F0
-:100F0000C4D0F249019A09691140029A914201D074
-:100F100040F0100001287DD132E0EC49B1F80A9090
-:100F20005FEAC87111D05FBB0021404600F003FDAD
-:100F3000022806D1B9F1010903D39AF8001000295B
-:100F4000F2D0012872D101271AE001A9404600F031
-:100F5000F2FC022806D1B9F1010903D39AF8001076
-:100F60000029F2D0012861D1019929700199090A5B
-:100F700069700199090CA9700199090EE9702D1D7C
-:100F80000021039148E0F7B1D048B0F80A9001A9D8
-:100F90000E2000F0D0FC022806D1B9F1010903D3DC
-:100FA0009AF800100029F2D001283FD1019828704A
-:100FB0000198000A68700198000CA8700198000E52
-:100FC000E8702D1D002720786178E27840EA012042
-:100FD000A178090441EA026108430190241D5FEAF7
-:100FE000886103D5B9490861012015E0B748B0F818
-:100FF0000A9001A9404600F09EFC022806D1B9F1F2
-:10100000010903D39AF800100029F2D001280DD16C
-:10101000012100E00AE003910499491C04919AF827
-:10102000001019B9761E002E7FF4D2AE5EB114F80E
-:10103000011B8A0703D5C90602D5241D00E0241D23
-:10104000761E002EF3D101282FD1EFB19F4846899B
-:1010500001A90E2000F06FFC022806D1761E711C3B
-:1010600003D09AF800100029F2D001281DD101996F
-:1010700029700199090A69700199090CA9700199EF
-:10108000090EE9702D1D10E0039971B18F48468952
-:1010900000210E2000F04FFC022806D1761E711CA4
-:1010A00003D09AF800100029F2D0DDE90412117083
-:1010B000059948700598291A069807B0201A41EA40
-:1010C0000040BDE8F08F30B504464278801C002A0D
-:1010D0000BD010F8013B9D0703D5DB0602D5001DA0
-:1010E00000E0001D521E002AF3D100220A704A704F
-:1010F000001B0004801C30BD744A1278012A00D005
-:10110000E1E751E62DE9F84F044600260020894624
-:10111000CF1CDFF8BCA100218AF80010641C2178E4
-:10112000627841EA0225A41C002D74D014F8018BCA
-:10113000DFF898B15FEA88715BD55FEAC87135D096
-:10114000BBF80A400021404600F0F5FB022806D11A
-:10115000641E611C03D09AF800100029F2D0012807
-:1011600059D123E025B95FEAC87001D04FF00E08CD
-:10117000BBF80A406946404600F0DDFB022806D174
-:10118000641E611C03D09AF800100029F2D00128D7
-:1011900041D1009939700099090A79700099090CB8
-:1011A000B9700099090EF9703F1D761C6D1E691CFF
-:1011B000D8D130E020786178E27840EA0120A17847
-:1011C000090441EA026108430090241D3F48B0F839
-:1011D0000AB06946404600F0AEFB022806D1BBF1DA
-:1011E000010B03D39AF800100029F2D0012812D184
-:1011F000761C6D1E681CDDD13448448900210E2008
-:1012000000F099FB022806D1641E611C03D09AF8F5
-:1012100000100029F2D089F80060310A89F8011025
-:1012200089F80200A7EB0900BDE8F88F10B5044665
-:101230002648007801280AD000200870487088707D
-:101240000320E178890706D540F4802010BD2046B0
-:10125000FFF758FFF5E76178A27841EA02210422FE
-:1012600002EB810140EA014010BD38B50C464178DF
-:10127000827841EA0222C1780079090441EA0060DB
-:10128000024300926946002000F055FB00202070C8
-:10129000012038BD10B50D4A1278012A05D0FF2073
-:1012A0000870012040F4A02010BDFFF7DEFFF9E731
-:1012B000FF2008704FF00110704710B50278A2F1BE
-:1012C00080031F2B06D8FFF7F3FF10BDF80D002099
-:1012D0002B01002001F8012B0C4610F8011B1729E7
-:1012E00057D2DFE801F00C14181C44484C5650202B
-:1012F000245656565656282C3034383C4000007838
-:10130000611CFFF7FCFB207000F10210DDE72146B5
-:10131000FFF72FFC3AE02146FFF745FC36E0204678
-:10132000FFF754FC32E02146FFF719FC2EE020467F
-:10133000FFF756FC2AE02146FFF75BFC26E021463A
-:10134000FFF7AFFC22E02146FFF7D4FC1EE0214668
-:10135000FFF7E4FC1AE02146FFF7EEFC16E0214619
-:10136000FFF704FD12E02146FFF707FD0EE02146DE
-:10137000FFF708FD0AE02146FFF7BEFE06E0214622
-:10138000FFF754FF02E02146FFF784FF00F1011050
-:101390009BE7FF2004F8010C4FF0011095E72DE9C1
-:1013A000F04102787F2A02D0BDE8F04185E70A705B
-:1013B0004478851C4C708E1C4FF0021708E03146B3
-:1013C0002846FFF77AFF074405EB104580B2064434
-:1013D000641E601CF3D13846BDE8F0810748002147
-:1013E0000170417016224260017264224281818143
-:1013F0000161012202754175FFF77EBBF80D0020E7
-:101400002DE9F04100220023FF4CFE4E00274FF053
-:10141000010C06F10408656815E013B911F8012BF9
-:101420000823D40702D0C6F800C000E03760C8F82F
-:1014300000702C46641EFDD1C8F800C02C46641E06
-:10144000FDD152085B1E401E441CE6D1BDE8F08170
-:101450002DE9F05F834689460120DFF8A883C8F8AC
-:10146000000008F1040500262E6001272F60C8F84F
-:1014700000B02E602F604FEA5B00C8F800002E60BD
-:101480002F600BEB00014FEA9B00C8F800002E60B4
-:101490002F6001444FEADB00C8F800002E602F6087
-:1014A0000844C8F800002E602F60C8F800602E6065
-:1014B0002F60C8F800702E602F60002201214FF0CD
-:1014C000402000F071FDDFF840A39AF814100800E6
-:1014D00004D02E602F60491E0029FAD12E60D8F862
-:1014E00000102F602E60D8F800202F6041EA4202E1
-:1014F0002E60D8F800102F6042EA8104012C12D02F
-:10150000022C62D0042C60D0213020B12E602F60DC
-:10151000401E0028FAD100F014FA0120C8F800009B
-:10152000E0B2BDE8F09F5FEA8B7125D50022002173
-:1015300020202E60D8F800302F601944520842EA6B
-:10154000C372401E0028F4D12E60D8F800002F602E
-:101550004140C80700D00824B9F1000F01D0C9F8F4
-:1015600000209AF8140020B12E602F60401E002841
-:10157000FAD100F0E6F918E020B12E602F60401E8D
-:101580000028FAD100F0DDF9D9F80000002220216E
-:10159000C8F800002E602F6002444008491E002950
-:1015A000F6D1C8F800202E602F609AF8080038B1F4
-:1015B0000021C8F800102E602F60401E0028FAD1CC
-:1015C0000120C8F80000E0B2ABE79AF8151041B16D
-:1015D0005FEA8B7105D521212E602F60491E0029FD
-:1015E000FAD120B12E602F60401E0028FAD100F001
-:1015F000A8F99AF8150058B15FEA8B7008D400205A
-:10160000C8F8000021202E602F60401E0028FAD16B
-:101610000120C8F80000E0B283E72DE9F05F8246C0
-:101620008B4600220120774E3060371D4FF00008B6
-:10163000C7F80080DFF8D091D9F804000146491EB0
-:10164000FDD101243C600146491EFDD1C6F800A031
-:10165000C7F800800146491EFDD13C600146491E85
-:10166000FDD102EB0A034FEA5A023260C7F800804C
-:101670000146491EFDD13C600146491EFDD113447F
-:101680004FEA9A023260C7F800800146491EFDD138
-:101690003C600146491EFDD113444FEADA02326034
-:1016A000C7F800800146491EFDD13C600146491E35
-:1016B000FDD199183160C7F800800146491EFDD15F
-:1016C0003C600146491EFDD13160C7F800800146EB
-:1016D000491EFDD13C600146491EFDD1012131600A
-:1016E000C7F800800146491EFDD13C60401EFDD177
-:1016F000002201214FF0402000F056FC99F81430F0
-:1017000019000DD0D9F80450C7F800802846401EB3
-:10171000FDD13C602A46521EFDD15B1E002BF3D149
-:10172000C7F80080D9F804000246521EFDD1326885
-:101730003C6003465B1EFDD1C7F8008003465B1E7C
-:10174000FDD133683C6005466D1EFDD142EA43027F
-:10175000C7F8008003465B1EFDD133683C60054638
-:101760006D1EFDD142EA8305012D17D0022D7DD0DB
-:10177000042D7BD0213159B1C7F800800246521E9A
-:10178000FDD13C600246521EFDD1491E0029F3D115
-:1017900000F0D7F801203060E8B2C2E65FEA8A7252
-:1017A00043D54FF0000C00232022C7F800800146EB
-:1017B000491EFDD1D6F800A03C600146491EFDD16E
-:1017C00053444FEA5C0141EACA7C521E002AECD124
-:1017D0003A46C7F80080CE460146491EFDD1316821
-:1017E0001460401EFDD14B40D80700D00825BBF146
-:1017F000000F01D0CBF800C09EF8143093B1DEF892
-:1018000004C003E000480040F80D0020C2F800804A
-:101810006046401EFDD114606146491EFDD15B1E2D
-:10182000002BEED100F08DF831E059B1C7F80080FF
-:101830000246521EFDD13C600246521EFDD1491E99
-:101840000029F3D100F07DF8DBF800004FF0000C28
-:101850002023D9F804203060C7F800801146491EC3
-:10186000FDD13C601146491EFDD100E026E08444D4
-:1018700040085B1E002BEED1C6F800C03946C7F801
-:1018800000801046401EFDD10C60521EFDD199F81B
-:10189000081079B100203060D9F80420C7F8008022
-:1018A0001046401EFDD13C601046401EFDD1491E31
-:1018B0000029F3D101203060E8B232E699F8152012
-:1018C0007AB15FEA8A720CD52123C7F800800246FC
-:1018D000521EFDD13C600246521EFDD15B1E002B04
-:1018E000F3D159B1C7F800800246521EFDD13C60C9
-:1018F0000246521EFDD1491E0029F3D100F021F805
-:1019000099F8150098B15FEA8A7010D40020306011
-:101910002121D9F80420C7F800801046401EFDD1CF
-:101920003C601046401EFDD1491E0029F3D1012024
-:101930003060E8B2F5E5064A5278002A00D087E523
-:101940006BE6012211464FF0402000F02DBB000055
-:10195000F80D002000F01F0201219140C943F84A10
-:10196000800F02EB800002680A4002607047F54871
-:10197000F0E770B510F47F3F14D0C0F38143022B21
-:1019800023D06FEA9044A40722D0ED4C1C3404EB22
-:1019900083031C68C0F38725C0F34416B540AC43ED
-:1019A00014431C60420E52070ED0E54BC0F3017287
-:1019B0000C3303EB82021468C0F34263C0F304509B
-:1019C00083409C430C43146070BDDD4B2833E0E73B
-:1019D000DB4B2C33DDE700F01F0201219140D84A98
-:1019E000800F02EB800002680A430260704710B566
-:1019F000044641EA4210D24940F010005C310860D0
-:101A0000D04B1846FFF7E7FF2146BDE81040002203
-:101A10001846AEE7CC48016841F004010160C848AF
-:101A2000001F016841F08001016030BF7047C64867
-:101A3000016821F004010160C148001F016821F024
-:101A40008001016030BF7047BD48001F0068C007BB
-:101A500001D0BE48704700207047B948001F006899
-:101A6000800702D54FF4004070470020704710B542
-:101A700001F00CF84FF08041D1F834024207B4482D
-:101A800019D0D1F8342202F00702012A15D0D1F87A
-:101A9000342202F00702022A12D0D1F8342202F0D6
-:101AA0000702032A0FD0D1F8341201F007010429EC
-:101AB0000CD0006810BD006810BD0068400810BD63
-:101AC0000068800810BD0068C00810BD00680009EB
-:101AD00010BD10B500F0DAFF4FF08041D1F83402AC
-:101AE00010F0700F9A4819D0D1F83422C2F30212C4
-:101AF000012A15D0D1F83422C2F30212022A12D0E0
-:101B0000D1F83422C2F30212032A0FD0D1F83412D2
-:101B1000C1F3021104290CD0006810BD006810BD8B
-:101B20000068400810BD0068800810BD0068C0084B
-:101B300010BD0068000910BD10B500F0A7FF844873
-:101B4000006810BD10B500F0A1FF8148006810BD0D
-:101B500030B505467F490124A20705E0081EA1F122
-:101B6000010101DC002404E0D2F8503235EA030020
-:101B7000F4D1204630BD2DE9F04107460E46704CA9
-:101B8000241F206D00F01005206840F00400206044
-:101B90001020FFF7DDFF206940F007002061206A78
-:101BA00020F00F0232432262206920F007013943FE
-:101BB0002161A4F5007400F069FF002D05D1D4F86F
-:101BC000000220F00400C4F80002BDE8F08108B56E
-:101BD000002061A10968009159493C31096811F45C
-:101BE000A02F13D159488A0310D4C1F381321DF8B4
-:101BF0000220C1F30800801CC1F34421491C574B4B
-:101C0000584311FB02F1B0FBF1F0C00008BD4C4895
-:101C10003C30016841F48031016070472DE9F84F94
-:101C200004460D46FFF7F3FFDFF8209104B3444864
-:101C3000001F016841F0040101601020FFF788FFD8
-:101C40004FF40020009046484649284488426BD80B
-:101C50004FF0FF3100274FF000080026AB4601236C
-:101C6000A9B3032B45D0042B0ED0022B0FD010E0CC
-:101C70003348001F016841F0010101600120FFF7B6
-:101C800067FF00200090DEE74FEA8B0501E04FEA96
-:101C90004B05022269B3B9FBF2F0334CDFF8C8C040
-:101CA0000444CCF1000C644520D80224DFF8BCE0E9
-:101CB000C0F35D0A0AFB04F0DFF8A4C08444F445D5
-:101CC0000FD8B0EB950F03D9A0EB950C02E013E011
-:101CD000C0EB950C8C4504D261461746A0461E46C3
-:101CE00021B1641C40F201208442E3D9521C202A15
-:101CF000D0D95B1C042BB3D90098711E40EA813106
-:101D0000781E41EA4020A8F1020108430C493C3109
-:101D100008600420FFF71CFF7E43B9FBF6F000FBD0
-:101D200008F04000BDE8F88F4CB1054810493C3040
-:101D300001600420FFF70CFFBDE8F84F47E719E00A
-:101D4000040200400600C05710ED00E0001BB70081
-:101D50007401002080F5200001020204C0C62D009D
-:101D6000800F05FD8074D21A00F7C2FFC0687804A6
-:101D70001E420800854844F21E210160D9E770B573
-:101D800006464FF08044D4F8500200F01005804819
-:101D9000864200D9064604F50074206840F004002D
-:101DA00020601020FFF7D4FE206940F0070020617A
-:101DB000206A20F00F0020622068A4F50074C0079C
-:101DC00005D031460020FFF729FF064609E03146DD
-:101DD0004FF40020FFF722FF0646D4F8500200F02F
-:101DE000100500210220FFF7C6FE2DB9D4F800022D
-:101DF00020F00400C4F80002304670BD6349303959
-:101E00000A6822F0380202430A6070475F4940398D
-:101E10000A6802430A6070475C4940390A68824395
-:101E20000A60704730B54FF0E022002414610428A6
-:101E30000DD0564D303D2B6823F0380303432B6003
-:101E400051619461106940F00300106130BD106968
-:101E500040F004001061F3E74FF0E021002008613A
-:101E6000704730B504464FF08045042C01D0052C56
-:101E700008D1D5F8000240F00800C5F8000208209B
-:101E8000FFF766FED5F8900220F007002043C5F862
-:101E9000900230BD3D4950310A6822F4403202437D
-:101EA0000A607047394854300068704730B5374C85
-:101EB000603404EB8000046840F2F715AC4344EA58
-:101EC00001111143194341F00101016030BD1FB5FB
-:101ED000304991E81C00C9688DE81C0003912E4A26
-:101EE0009106904205D1D1F8180200F0010004B02B
-:101EF00010BD2A4A904204D1D1F81802C0F3400024
-:101F0000F5E7274A904204D1D1F81802C0F3002027
-:101F1000EDE7244A904204D1D1F81802C0F34020E2
-:101F2000E5E7410E490710D0C0F301725DF82210B9
-:101F3000164A303A11440968C0F34262C0F30450B3
-:101F40008240114021FA00F0D1E70020CFE71FB511
-:101F50001049D1E905340A69C9698DE81C0003916B
-:101F600010F47F3F10D0C0F381425DF82210074A81
-:101F7000203A11440968C0F38722C0F3441082401C
-:101F8000114021FA00F0B2E70020B0E74002004023
-:101F900000B0710B782C0000100000A2110010A2FC
-:101FA000120080A2130090A2F0B50023012703269F
-:101FB00007FA03F48C4309D105685C0006FA04FCB7
-:101FC00025EA0C0502FA04F4254305605B1C102B7E
-:101FD000EED3F0BD10B5836901248C40A343140EE9
-:101FE0008C4023438361C3694FF001148C4022F07D
-:101FF0007F42A3438A401343C36110BD826901231A
-:102000008B409A438261C2694FF001138B409A431F
-:10201000C2617047F0B500230127032607FA03F4D5
-:102020000C4209D0856A5C0006FA04FC25EA0C051E
-:1020300002FA04F4254385625B1C102BEED3F0BD3D
-:10204000F0B500230127032607FA03F40C4209D058
-:10205000056B5C0006FA04FC25EA0C0502FA04F4A0
-:10206000254305635B1C102BEED3F0BD4A0503D559
-:1020700070228261082282610A0503D5426942F01A
-:10208000010242618A0401D5F94A82614A0401D5FC
-:102090001F224264090404D58021C16140F20F313E
-:1020A00081637047002141607047416821F44051CD
-:1020B0004160704742688A4342607047016941F459
-:1020C00000710161416941F480714161416841F4ED
-:1020D00040514160704742680A43426070472DE9B1
-:1020E000FF4104460F4600250026E24890E80E0016
-:1020F000C0688DE80E000390DF494FF080408C42AD
-:1021000008D1D0F81412C1F30165D0F82002C0F351
-:10211000032639E0D9498C4208D1D0F81412C1F312
-:102120008165D0F82002C0F303362DE0D4498C42FB
-:1021300008D1D0F81C12C1F30165D0F8300200F0CC
-:102140000F0621E0CF498C4208D1D0F81C12C1F310
-:102150008165D0F83002C0F3031615E0CA498C42FD
-:1021600008D1D0F81C12C1F30175D0F83002C0F3C9
-:10217000032609E0C5498C4206D1D0F81C128D0F08
-:10218000D0F83002C0F30336002020630320E06063
-:10219000A068BF490840A060E846012D02D1FFF7C2
-:1021A00016FD0190002F17D058F82510761CB1FBB2
-:1021B000F6F000EB5700B0FBF7F0801EB0F5803F63
-:1021C0000CD3B1FBF6F000EBC700B0FBF7F06FF0FB
-:1021D000010101EB10106062BDE8FF8140F040504A
-:1021E0006062F9E7F0B50446002600204FF0804712
-:1021F0000EE0002304E05B1CBB4201D3012602E099
-:10220000A5696D04F7D4012E04D023680B54401C3B
-:102210009042EED3F0BD2DE9FF5F0446DDF838A013
-:102220000F4690469946002500269248D0E905239E
-:102230000169C0698DE80E0003908F494FF080401E
-:102240008C4208D1D0F81412C1F30165D0F82002F5
-:10225000C0F3032639E089498C4208D1D0F8141222
-:10226000C1F38165D0F82002C0F303362DE0844924
-:102270008C4208D1D0F81C12C1F30165D0F83002AD
-:1022800000F00F0621E07F498C4208D1D0F81C12E3
-:10229000C1F38165D0F83002C0F3031615E07A4926
-:1022A0008C4208D1D0F81C12C1F30175D0F830026D
-:1022B000C0F3032609E075498C4206D1D0F81C1200
-:1022C0008D0FD0F83002C0F30336EB46012D02D15A
-:1022D000FFF77DFC0190DFB15BF82510761CB1FBA8
-:1022E000F6F000EB5700B0FBF7F0801EB0F5803F32
-:1022F0000BD3B1FBF6F000EBC700B0FBF7F06FF0CB
-:10230000010101EB1010606202E040F04050606299
-:1023100048EA090848EA0A08C4F80C80BDE8FF9FAB
-:10232000026A22F0FF020A430262416841F400613E
-:10233000416070472DE9FF4704460F46904600254F
-:1023400000264C48D0E90923016AC06A8DE80E00D6
-:10235000039002202063484940078C4208D1D0F8FE
-:102360001412C1F30165D0F82002C0F3032639E04E
-:1023700042498C4208D1D0F81412C1F38165D0F8DB
-:102380002002C0F303362DE03D498C4208D1D0F83D
-:102390001C12C1F30165D0F8300200F00F0621E0F5
-:1023A00038498C4208D1D0F81C12C1F38165D0F8AD
-:1023B0003002C0F3031615E033498C4208D1D0F83F
-:1023C0001C12C1F30175D0F83002C0F3032609E0F6
-:1023D0002E498C4206D1D0F81C128D0FD0F8300255
-:1023E000C0F30336E946012D02D1FFF7F0FB01905F
-:1023F00087B159F82500761CB0FBF6F000EBC7005A
-:10240000B0FBF7F06FF0010101EB1010090C8842EE
-:1024100000D26062B8F1000F09D0A06A20F020005D
-:10242000A062A06A40F00200A062BDE8FF87A06A37
-:1024300040F04000A062A06A20F00200A062F4E731
-:1024400010B503230363C36A124C2340C362C36AFB
-:1024500041EA02610B43C36210BD01230363C36AF7
-:1024600023F0CF03C362C36A11430B43C3627047B7
-:1024700001000001982C00000000074000100740F8
-:102480000020074000300740004007400050074050
-:102490000FFFF0FFFFF8FF00F0B504460026002014
-:1024A0004FF080470EE0002304E05B1CBB4201D3E9
-:1024B000012602E0A569ED00F7D5012E04D00B5CE2
-:1024C0002360401C9042EED1F0BD0000F74BD86372
-:1024D000D9621A630068C0791862F5484FF4DA616E
-:1024E00040F8041CC16F41F00101C1677047F0481A
-:1024F0001438D0F8901021F00101C0F890104FF47A
-:10250000FA61016140F20F11416002680A43026002
-:102510007047E6490822403100F0A1BAE34A9060D2
-:10252000002010615161106AE249086070472DE98E
-:10253000F04103460D46DD4C216ADE48DD4ADC4FA2
-:102540000C38143AEC37061F8D4213D9216A19440E
-:102550006160216A691AE160016841F080010160EF
-:1025600010683844226A194600F079FA206A30600F
-:10257000BDE8F08100216160E160016841F0800107
-:102580000160106838442A46194600F068FA356040
-:10259000EEE730B4C54B4033D87900029979014455
-:1025A000C248C44CC34DDA78083C0835C06B0F2ACA
-:1025B00028D006DC012A15D0022A19D0032A07D117
-:1025C0003BE0BA4B4033212A1B7921D0222A29D063
-:1025D000206840F002002060286840F00200286077
-:1025E00030BC7047122900D31221006830BC9EE72E
-:1025F0004068C278837803EB0222914200D31146EF
-:1026000030BC94E70C2900D30C21006930BC8EE764
-:10261000092900D30921826952F82320406830BC7F
-:10262000104484E7426952F823208A4200D81146B8
-:10263000C06850F8230030BC79E79A78042A08D2A1
-:10264000806850F8220002788A4200D8114630BCD7
-:102650006DE7206840F002002060286840F002002A
-:102660002860BDE72DE9F05F904A00255560D560F0
-:1026700002F14009494699F800308F4E0879DFF899
-:102680003CC2DFF83CB249785FEA036A00F00F070A
-:102690004FF0010806F104046FD5DFF814A2A6F18B
-:1026A00004090AF1EC0AD1B3062921D008290FD078
-:1026B0000A2924D0DCF8000040F00200CCF8000029
-:1026C000DBF8000040F00200CBF80000BDE8F09F0E
-:1026D000D9F800005044D1690170206840F08000B2
-:1026E0002060C6F80080BDE8F05F0021084615E7CD
-:1026F000FFF74FFFBDE8F05F002108460EE7D9F86D
-:1027000000005044516A0170206840F08000206051
-:10271000C6F80080BDE8F05F00210846FEE6FFE74E
-:10272000802B04D0812B14D0822B17D031E00020D5
-:10273000D16B4968C9794B0600D50120890603D5BC
-:102740001178490640EA1160D9F800105144087028
-:102750001FE0D9F80000504405701AE0D9F80000D5
-:1027600000EB0A03002004EB00110A6802F00F02DC
-:10277000BA4203D10CEB001103E01BE0401C0C2813
-:10278000F1D3086810F0020F01D0012000E0002012
-:102790001870D9F800004649ED31084405702068EA
-:1027A00040F08000206002203060BDE8F05F002132
-:1027B0000846B3E63D4840300529807841D004DC26
-:1027C000012913D0032904D14CE0092940D00B2959
-:1027D0006BD0DCF8000040F00200CCF80000DBF821
-:1027E000000040F00200CBF800006FE710B10128B4
-:1027F00020D020E00020D2F838C02D4A143A02EB55
-:102800000011D1F8083503F00F03BB420ED108FACE
-:1028100000F313EA0C0F09D101F5A1614B6823F015
-:1028200002034B600B6823F080030B60401C0C28F4
-:10283000E5D300E01570206840F08000206035602E
-:1028400044E79061206840F08000206035603DE7FB
-:10285000D061506B00B18047206840F0800020605C
-:10286000356033E7190709D1032807D199F8031018
-:1028700021B914490B6843F006030B6010B101281D
-:1028800022D023E0002004EB0011096801F00F01C1
-:10289000B94206D10CEB0010016841F00201016061
-:1028A00014E0401C0C28EED310E015E02C010020B1
-:1028B00014000C4014050C4004050C400C050C40A1
-:1028C0001C050C4000D0044082F80080206840F0D5
-:1028D000800020603560F9E65062116B09B1506AE2
-:1028E0008847206840F0800020603560EEE610B533
-:1028F00008226249624800F0B2F86148007810F09E
-:10290000600011D05E494039202810D0402814D0F2
-:102910005C48016841F0020101605A4810300168CA
-:1029200041F00201016010BDBDE810409AE6C86A9E
-:102930000028F8D0BDE810400047886A0028F2D08F
-:10294000BDE8104000472DE9F0414D4C403CE068A7
-:102950004C4D0026083D002827D0E368276A214611
-:10296000281F464A4968BB420FD900681044226AB2
-:1029700000F075F8206A2860216A60680844606089
-:10298000E068216A401AE060F2E500681044E268FD
-:1029900000F065F8E0682860E068216A884201D1AB
-:1029A000012060706660E660E2E53548017851B963
-:1029B0004078052807D134498868A269904202D03E
-:1029C00008B9A069886060780028DDD02E60667044
-:1029D000CEE570B52A4C403C20696169884216D228
-:1029E000284E08363568301F0068244901442A46BD
-:1029F000A06800F034F8A0682844A060206928444A
-:102A0000206120696169884201D2206A306070BD0E
-:102A100010B51B48002240384260C26082600261EB
-:102A200042618263026442640020174B03EB001191
-:102A3000D1F8084524F08004C1F80845401C0C2852
-:102A4000F4D39A6010BD0E494039886270470C4932
-:102A50004039486370470A4940398863704718B560
-:102A60000023009306E0009B009CCB5C0355009B79
-:102A70005B1C0093521E531CF5D118BD00010C4085
-:102A80006C0100200C050C4000000C4010B5FFF755
-:102A90009EF8214A90604FF08043D3F8101201F065
-:102AA0000701022903D002F10C0050F82100D3F8ED
-:102AB000201201F00F01491CB0FBF1F01060174922
-:102AC00008444900B0FBF1F0506010BD1448C16CDF
-:102AD00021F00F0141F00801C1641248D0F89010B4
-:102AE00041F48021C0F89010016841F002010160BA
-:102AF0000D490A6802F0F7320A604A6802F0F732BC
-:102B00004A60016821F0020101600848016821F073
-:102B1000F0010160704700007401002020A107004F
-:102B200000C0004008020040041104404041004041
-:102B300014484FF0590101604FF0160101604FF049
-:102B4000880101601048416841F4804141600F48AC
-:102B5000416841F002014160416841F00401416077
-:102B60000B48804707484FF00001016009480047C3
-:102B7000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE72D
-:102B8000FEE7FEE700010040000200400070004048
-:102B9000CD2A0000B901000040EA01039B0703D0E1
-:102BA00009E008C9121F08C0042AFAD203E011F88C
-:102BB000013B00F8013B521EF9D27047064C074D0D
-:102BC00006E0E06840F0010394E8070098471034FD
-:102BD000AC42F6D3FDF7F4FAC82C0000E82C000054
-:102BE00070B58C1810F8015B15F0070301D110F8CF
-:102BF000013B2A1106D110F8012B03E010F8016BFC
-:102C000001F8016B5B1EF9D12B0705D40023521E7E
-:102C10000DD401F8013BFAE710F8013BCB1A921CE6
-:102C200003E013F8015B01F8015B521EF9D5A142E4
-:102C3000D8D3002070BD02E008C8121F08C1002AC6
-:102C4000FAD170477047002001E001C1121F002A2D
-:102C5000FBD170471D0000202F000020D000002075
-:102C6000E000002004010020EC000020F80000201B
-:102C7000312E313000000000000000000400000090
-:102C8000080000000C00000000000000040000002C
-:102C90000800000010000000001BB700000000004A
-:102CA00000800000001BB700001BB7000000000000
-:102CB00000800000001BB700001BB70000000000F0
-:102CC00000800000001BB700E82C0000000000207E
-:102CD000A0010000E02B0000DC2D0000A00100207E
-:102CE000704C0000462C00001206100BFF0901A1D9
-:102CF0000119012940151326FF16750895408129F1
-:102D00000F129114C0120132021640160421501401
-:102D1000010102150109026B230301246409043334
-:102D2000020315092110011401221D160705810354
-:102D3000402D01070501071008080B0102020201DE
-:102D40001B09041E29091305241D10010524521C0A
-:102D50000424020E10090601020705820308150A61
-:102D600009040233020A2E0705830240072A0307DB
-:102D700010080403090412035812491256124E1285
-:102D800031123912381237141E034D1A340A123018
-:102D900012201243124D1A53201253122D124412B4
-:102DA000413250229A1B209E041AB0047169081106
-:102DB000B21DB2121C050F0CB82B1002EC19DC016D
-:102DC000122AC21602210809202271131BB75A0CBD
-:0C2DD00008390462800B10102728000056
+:100A7000486840F002004860BDE8F881AC090020F9
+:100A800064050C40FC0D002000010C4004E000E077
+:100A9000AC0B0020002007402401002070B54FF06F
+:100AA000402501220221284602F05CF8FE4901247B
+:100AB0000C6001221146284602F054F8FA49091F39
+:100AC0000C6001220421284602F04CF82846BDE8BB
+:100AD00070400122042102F045B810B54FF04024C7
+:100AE00000220221204602F03DF820460022BDE807
+:100AF0001040012102F036B8EFE710B5EB49EC48A1
+:100B000001F021F9012010BD0022062824D006DCC6
+:100B1000052821D2DFE800F0202020200C00F0285A
+:100B20000DD0FD2818D0FE2813D0FF2814D10AE0DC
+:100B3000E04802680A600079087105220CE0112083
+:100B40000870012208E0402008700020487002224E
+:100B500002E0102008700122104670474FF47A41DD
+:100B60004843401EFDD170470278407842EA002099
+:100B70008001401EFDD10870CF48704710B5CA4BA8
+:100B800002781B1DCC4C002A05D0012A08D0FF207A
+:100B90000870204610BD407800F00100186003E0A6
+:100BA000407800F00100186000200870204610BD59
+:100BB00070B50D460478002C00D10124012C04D01E
+:100BC00000242C704FF0011070BDBC49012008704A
+:100BD000FFF764FFF5E770B50446B84900250D70CE
+:100BE000FFF77BFF2570012070BD10B50446FFF7AD
+:100BF00084FF607000202070022010BD2DE9F047B6
+:100C00008946057844788178C27841EA02260179DC
+:100C10004079090441EA00600643DFF88C82E1076D
+:100C20004FF001004FF0000706D0E90702D0C8F8E6
+:100C3000000001E0C8F80070DFF884A2A10706D523
+:100C4000A90702D5CAF8000001E0CAF80070200622
+:100C500005D5E80918B99549954801F074F876B3B7
+:100C60009848864200D906464FF0E0218F6106EB96
+:100C700046008001486105200861E00703D0D8F8EC
+:100C80000000A84215D1A00704D5DAF80000B0EBA7
+:100C9000550F0ED1600702D5B7EB950F09D1A0060D
+:100CA00002D5B7EB551F04D1200607D5B7EBD51FEA
+:100CB00004D00869C0F300400028DED00F61D8F8E6
+:100CC0000000DAF8001040EA410089F800007E4890
+:100CD000BDE8F08730B50278437842EA0322837892
+:100CE000C0781B0443EA006002437848002A08D019
+:100CF000774D0024714BAA4206D301225A705A60E4
+:100D00000FE0FF220A7030BD5C70724D1544B5FBD8
+:100D1000F2F2022A03D90325B2FBF5F200E0012228
+:100D20005A600C7030BD70B50D4610F8014B01468D
+:100D3000002C01D14FF48074204600F07FFB00208E
+:100D40002870E41DE008401C0004401C70BD0078C1
+:100D50005A4A00F003035B1C1375C0F38000507502
+:100D6000002008704FF00110704710B5FF220A7084
+:100D70000122012410F8013B0AE010F8011B01F0E8
+:100D80003F0101B94021C91DC90808440A44521C49
+:100D90005B1E591CF1D1204662F31F4010BD007844
+:100DA000FF220A70401C0004401C7047FF2008709E
+:100DB0004FF00110704710B5404A03781372437822
+:100DC000847843EA04235381C378007943EA0020FE
+:100DD000908100200870404810BD2DE9F04F87B089
+:100DE000044606940020049005918D1CDFF8ECA0C9
+:100DF00000218AF80010002703916678A41C002EB9
+:100E000051D014F8018B5FEA887169D587B32B48FC
+:100E1000B0F80A9008F0110001280DD101A9404650
+:100E200000F0A7FD022815D1B9F1010912D39AF8F3
+:100E300000100029F2D00DE001A90E2000F099FD6C
+:100E4000022806D1B9F1010903D39AF8001000294C
+:100E5000F2D00027012826D1019929700199090AA9
+:100E600069700199090CA9700199090EE9702D1D8D
+:100E70005FEAC8616ED520786178E27840EA0120A7
+:100E8000A178090441EA026108430290241D0B483D
+:100E9000B0F80CB05FEAC87030D00848B0F80A90DB
+:100EA000002140461DE0A7E0044800400400FA0588
+:100EB0000CED00E05038000001000200040E00209C
+:100EC00000480040C0C62D000100060001000400DB
+:100ED000006CDC02FFD7B805010005002B010020E3
+:100EE0006EE000F046FD022806D1B9F1010903D3F6
+:100EF0009AF800100029D3D001287DD1F948B0F824
+:100F00000A9001A9404600F034FD022806D1B9F14B
+:100F1000010903D39AF800100029F2D001280DD15D
+:100F2000F049019A09691140029A914206D0BBF139
+:100F3000010B03D39AF800100029DFD0E949019A88
+:100F400009691140029A914201D040F01000012835
+:100F500052D132E0E349B1F80A905FEAC87111D08A
+:100F60005FBB0021404600F004FD022806D1B9F124
+:100F7000010903D39AF800100029F2D0012872D198
+:100F800001271AE001A9404600F0F3FC022806D12F
+:100F9000B9F1010903D39AF800100029F2D0012811
+:100FA00061D1019929700199090A69700199090CA7
+:100FB000A9700199090EE9702D1D0021039148E0E7
+:100FC00007B3C848B0F80A9001A90E2000F0D1FC80
+:100FD000022806D1B9F1010903D39AF800100029BB
+:100FE000F2D001283FD1019828700198000A68705A
+:100FF0000198000CA87000E035E00198000EE87040
+:101000002D1D002720786178E27840EA0120A17840
+:10101000090441EA026108430190241D5FEA8861E6
+:1010200003D5B0490861012013E0AE48B0F80A903A
+:1010300001A9404600F09DFC022806D1B9F1010942
+:1010400003D39AF800100029F2D001280BD1012116
+:1010500003910499491C04919AF8001019B9761E5D
+:10106000002E7FF4CEAE5EB114F8011B8A0703D5C3
+:10107000C90602D5241D00E0241D761E002EF3D1E2
+:1010800001282FD1EFB19748468901A90E2000F021
+:1010900070FC022806D1761E711C03D09AF800104D
+:1010A0000029F2D001281DD1019929700199090A5E
+:1010B00069700199090CA9700199090EE9702D1D3B
+:1010C00010E0039971B18748468900210E2000F095
+:1010D00050FC022806D1761E711C03D09AF800102D
+:1010E0000029F2D0DDE904121170059948700598C5
+:1010F000291A069807B0201A41EA0040BDE8F08F8F
+:1011000030B504464278801C002A0BD010F8013B11
+:101110009D0703D5DB0602D5001D00E0001D521E11
+:10112000002AF3D100220A704A70001B0004801CC0
+:1011300030BD6C4A1278012A00D0E1E74DE62DE976
+:10114000F84F0446002600208946CF1CDFF898A1FE
+:1011500000218AF80010641C2178627841EA022597
+:10116000A41C002D74D014F8018BDFF878B15FEA6D
+:1011700088715BD55FEAC87135D0BBF80A400021A1
+:10118000404600F0F6FB022806D1641E611C03D025
+:101190009AF800100029F2D0012859D123E025B98E
+:1011A0005FEAC87001D04FF00E08BBF80A406946EC
+:1011B000404600F0DEFB022806D1641E611C03D00D
+:1011C0009AF800100029F2D0012841D10099397015
+:1011D0000099090A79700099090CB9700099090EF3
+:1011E000F9703F1D761C6D1E691CD8D130E0207847
+:1011F0006178E27840EA0120A178090441EA0261BD
+:1012000008430090241D3748B0F80AB069464046AC
+:1012100000F0AFFB022806D1BBF1010B03D39AF813
+:1012200000100029F2D0012812D1761C6D1E681C16
+:10123000DDD12C48448900210E2000F09AFB0228C1
+:1012400006D1641E611C03D09AF800100029F2D068
+:1012500089F80060310A89F8011089F80200A7EBCB
+:101260000900BDE8F88F10B504461E480078012833
+:101270000AD000200870487088700320E178890740
+:1012800006D540F4802010BD2046FFF758FFF5E753
+:101290006178A27841EA0221042202EB810140EA4E
+:1012A000014010BD38B50C464178827841EA0222EF
+:1012B000C1780079090441EA00600243009269465E
+:1012C000002000F056FB00202070012038BD10B532
+:1012D000044A1278012A09D0FF200870012040F446
+:1012E000A02010BD040E00202B010020FFF7DAFF24
+:1012F000F5E7FF2008704FF00110704710B5027835
+:10130000A2F180031F2B02D8FFF7F3FFE9E701F8F2
+:10131000012B0C4610F8011B172957D2DFE801F00A
+:101320000C14181C44484C565020245656565656F9
+:10133000282C3034383C40000078611CFFF7E4FB77
+:10134000207000F10210CCE72146FFF717FC3AE0CD
+:101350002146FFF72DFC36E02046FFF73CFC32E04B
+:101360002146FFF701FC2EE02046FFF73EFC2AE075
+:101370002146FFF743FC26E02146FFF7ABFC22E0C5
+:101380002146FFF7D0FC1EE02146FFF7E0FC1AE003
+:101390002146FFF7EAFC16E02146FFF700FD12E0C8
+:1013A0002146FFF703FD0EE02146FFF704FD0AE0AA
+:1013B0002146FFF7BEFE06E02146FFF754FF02E09C
+:1013C0002146FFF784FF00F101108AE7FF2004F8AF
+:1013D000010C4FF0011084E72DE9F04102787F2ADB
+:1013E00002D0BDE8F04189E70A704478851C4C7052
+:1013F0008E1C4FF0021708E031462846FFF77EFFAB
+:10140000074405EB104580B20644641E601CF3D10E
+:101410003846BDE8F081084800210170417016226D
+:101420004260017264224281818101610122027560
+:101430004175FFF761BB0000040E00202DE9F0416B
+:1014400000220023FF4CFE4E00274FF0010C06F156
+:101450000408656815E013B911F8012B0823D407B7
+:1014600002D0C6F800C000E03760C8F800702C4613
+:10147000641EFDD1C8F800C02C46641EFDD1520880
+:101480005B1E401E441CE6D1BDE8F0812DE9F05FF3
+:10149000834689460120DFF8A883C8F8000008F1D8
+:1014A000040500262E6001272F60C8F800B02E60CA
+:1014B0002F604FEA5B00C8F800002E602F600BEB36
+:1014C00000014FEA9B00C8F800002E602F60014425
+:1014D0004FEADB00C8F800002E602F600844C8F80F
+:1014E00000002E602F60C8F800602E602F60C8F8E2
+:1014F00000702E602F60002201214FF0402001F08B
+:1015000031FBDFF840A39AF81410080004D02E60D5
+:101510002F60491E0029FAD12E60D8F800102F60E4
+:101520002E60D8F800202F6041EA42022E60D8F8E1
+:1015300000102F6042EA8104012C12D0022C62D0EC
+:10154000042C60D0213020B12E602F60401E002876
+:10155000FAD100F014FA0120C8F80000E0B2BDE8AA
+:10156000F09F5FEA8B7125D50022002120202E609C
+:10157000D8F800302F601944520842EAC372401E66
+:101580000028F4D12E60D8F800002F604140C80731
+:1015900000D00824B9F1000F01D0C9F800209AF852
+:1015A000140020B12E602F60401E0028FAD100F0F8
+:1015B000E6F918E020B12E602F60401E0028FAD115
+:1015C00000F0DDF9D9F8000000222021C8F8000061
+:1015D0002E602F6002444008491E0029F6D1C8F849
+:1015E00000202E602F609AF8080038B10021C8F85A
+:1015F00000102E602F60401E0028FAD10120C8F88C
+:101600000000E0B2ABE79AF8151041B15FEA8B71C8
+:1016100005D521212E602F60491E0029FAD120B165
+:101620002E602F60401E0028FAD100F0A8F99AF829
+:10163000150058B15FEA8B7008D40020C8F800008C
+:1016400021202E602F60401E0028FAD10120C8F80A
+:101650000000E0B283E72DE9F05F82468B4600226E
+:101660000120774E3060371D4FF00008C7F800802A
+:10167000DFF8D091D9F804000146491EFDD10124BC
+:101680003C600146491EFDD1C6F800A0C7F80080A5
+:101690000146491EFDD13C600146491EFDD102EBC9
+:1016A0000A034FEA5A023260C7F800800146491E19
+:1016B000FDD13C600146491EFDD113444FEA9A0218
+:1016C0003260C7F800800146491EFDD13C600146EA
+:1016D000491EFDD113444FEADA023260C7F8008098
+:1016E0000146491EFDD13C600146491EFDD19918B5
+:1016F0003160C7F800800146491EFDD13C600146BB
+:10170000491EFDD13160C7F800800146491EFDD158
+:101710003C600146491EFDD101213160C7F80080BF
+:101720000146491EFDD13C60401EFDD10022012131
+:101730004FF0402001F016FA99F8143019000DD03E
+:10174000D9F80450C7F800802846401EFDD13C60FF
+:101750002A46521EFDD15B1E002BF3D1C7F8008034
+:10176000D9F804000246521EFDD132683C6003469F
+:101770005B1EFDD1C7F8008003465B1EFDD13368B8
+:101780003C6005466D1EFDD142EA4302C7F8008069
+:1017900003465B1EFDD133683C6005466D1EFDD1DE
+:1017A00042EA8305012D17D0022D7DD0042D7BD078
+:1017B000213159B1C7F800800246521EFDD13C606C
+:1017C0000246521EFDD1491E0029F3D100F0D7F880
+:1017D00001203060E8B2C2E65FEA8A7243D54FF07A
+:1017E000000C00232022C7F800800146491EFDD1CD
+:1017F000D6F800A03C600146491EFDD153444FEA93
+:101800005C0141EACA7C521E002AECD13A46C7F874
+:101810000080CE460146491EFDD131681460401E4D
+:10182000FDD14B40D80700D00825BBF1000F01D0F7
+:10183000CBF800C09EF8143093B1DEF804C003E08A
+:1018400000480040040E0020C2F800806046401EA0
+:10185000FDD114606146491EFDD15B1E002BEED107
+:1018600000F08DF831E059B1C7F800800246521EF1
+:10187000FDD13C600246521EFDD1491E0029F3D124
+:1018800000F07DF8DBF800004FF0000C2023D9F8C1
+:1018900004203060C7F800801146491EFDD13C602D
+:1018A0001146491EFDD100E026E0844440085B1E3D
+:1018B000002BEED1C6F800C03946C7F800801046AC
+:1018C000401EFDD10C60521EFDD199F8081079B16F
+:1018D00000203060D9F80420C7F800801046401E70
+:1018E000FDD13C601046401EFDD1491E0029F3D1B8
+:1018F00001203060E8B232E699F815207AB15FEA4B
+:101900008A720CD52123C7F800800246521EFDD1F1
+:101910003C600246521EFDD15B1E002BF3D159B133
+:10192000C7F800800246521EFDD13C600246521E9E
+:10193000FDD1491E0029F3D100F021F899F81500D6
+:1019400098B15FEA8A7010D4002030602121D9F864
+:101950000420C7F800801046401EFDD13C601046B0
+:10196000401EFDD1491E0029F3D101203060E8B2AC
+:10197000F5E5064A5278002A00D087E56BE6012299
+:1019800011464FF0402001F0EDB80000040E002099
+:1019900070B54FF0402501220221284601F0E2F8FF
+:1019A000FD4901240C6001221146284601F0DAF8B5
+:1019B000F949091F0C6001220421284601F0D2F8E0
+:1019C0002846BDE870400122042101F0CBB810B5D3
+:1019D0004FF0402400220221204601F0C3F82046A7
+:1019E0000022BDE81040012101F0BCB8EB494FF4E2
+:1019F0007A620968B1FBF2F14143002001E000BFC7
+:101A0000401C8842FBD3704710B5002305E0DC0082
+:101A100021FA04F4C4545B1CDBB29342F7D310BD2B
+:101A200070B505460E46002431462846FFF7A1FF53
+:101A3000022803D1641CE4B20A2CF5D370BD10B5A2
+:101A4000FFF7E9FCFFF7A4FF012010BD10B5FFF779
+:101A5000BEFF012010BD38B50C4600F00C00801C04
+:101A60006946FFF7DDFF002222609DF8031042EA7D
+:101A7000016121609DF8022041EA024121609DF848
+:101A8000012041EA022121609DF8002011432160DC
+:101A9000012800D0002038BD38B5082806D1C04A3A
+:101AA00013688B4201D1012038BD116000F00C0495
+:101AB00004226846FFF7A8FF69462046FFF7B0FFFB
+:101AC0000128F1D0002038BD38B505460C4605F098
+:101AD0007F4105F0F00001430820FFF7DDFF18B358
+:101AE00005F00C05ED1C69462846FFF799FF69468D
+:101AF0002846FFF795FF002222609DF8031042EA76
+:101B0000016121609DF8022041EA024121609DF8B7
+:101B1000012041EA022121609DF80020114321604B
+:101B2000012800D0002038BD002038BD38B504465B
+:101B30000D4604F07F4104F0F00001430820FFF758
+:101B4000ABFF08B14CB901E0002038BD94484168B2
+:101B5000A94201D1012038BD456004F00C04641C89
+:101B6000042229466846FFF74FFF69462046FFF7E3
+:101B700057FF012801D0002038BD0E200021FFF7BB
+:101B80004FFF0128F8D0002038BDF8B507460D46B4
+:101B9000002A13D0960883490020FFF7C7FF78B1C9
+:101BA0000524042239466846FFF72EFF6946204681
+:101BB000FFF736FF012805D00020F8BD0020F8BD52
+:101BC0000020F8BD0D27002409E029463846FFF71C
+:101BD00027FF012801D00020F8BD2D1D641CB44250
+:101BE000F3D30E200021FFF71BFF0128F4D00020C3
+:101BF000F8BDF8B507460D46002A13D09608694986
+:101C00000020FFF793FF78B1052404223946684687
+:101C1000FFF7FAFE69462046FFF702FF012805D0CC
+:101C20000020F8BD0020F8BD0020F8BD0F270021DE
+:101C30003846FFF7F5FE012801D00020F8BD00244A
+:101C4000761E09E029463846FFF7EAFE012801D052
+:101C50000020F8BD2D1D641CB442F3D30E2029468C
+:101C6000FFF7DEFE0128F4D00020F8BD1CB50C46BD
+:101C70000146042201A8FFF7C7FE052001A9FFF7CE
+:101C8000CFFE012801D000201CBD0F206946FFF7C0
+:101C9000C7FE012801D000201CBD0E206946FFF7B9
+:101CA000BFFE002222609DF8031042EA016121601C
+:101CB0009DF8022041EA024121609DF8012041EA9D
+:101CC000022121609DF80020114321600128E3D00A
+:101CD00000201CBD38B50C46014604226846FFF7BB
+:101CE00093FE05206946FFF79BFE012801D00020E6
+:101CF00038BD042221466846FFF786FE0D2069465E
+:101D0000FFF78EFE012801D0002038BD0E200021F3
+:101D1000FFF786FE012801D0002038BD012038BD24
+:101D200070B504460D461F490020FFF7FFFE30B195
+:101D300029462046FFF79AFF18B1012070BD002008
+:101D400070BD002070BD70B504460D4615490020D9
+:101D5000FFF7ECFE30B129462046FFF7BBFF18B174
+:101D6000012070BD002070BD002070BD38B5054653
+:101D70000C460C490020891EFFF7D8FEA0B1694629
+:101D80002846FFF773FF88B1A807C20E0098D0401D
+:101D90002070012038BD0000044800408001002070
+:101DA00030010020520000230020F3E70020F1E77B
+:101DB00070B505460C46F7490020FFF7B7FE48B15D
+:101DC000A807C00E04FA00F12846FFF783FF18B1F8
+:101DD000012070BD002070BD002070BD2DE9F041D4
+:101DE00005460E46144607E031462846FFF7BEFF7B
+:101DF00040B16D1C761C641E0CB1A807F4D1DFF84D
+:101E0000988314E00020BDE8F081D8F80000411E5E
+:101E10002940471ABC4201D224F003073A46314612
+:101E20002846FFF7E6FE28B13D443E44E41B032C60
+:101E3000EBD809E00020E6E731462846FFF796FF99
+:101E400030B16D1C761C641E002CF5D10120DAE740
+:101E50000020D8E72DE9F04105460E46144607E07C
+:101E600031782846FFF7A4FF40B16D1C761C641E34
+:101E70000CB1A807F4D1DFF8208313E00020C2E7FB
+:101E8000D8F80000411E2940471ABC4201D224F074
+:101E900003073A4631462846FFF777FE28B13D440E
+:101EA0003E44E41B032CEBD809E00020ABE731787B
+:101EB0002846FFF77DFF30B16D1C761C641E002C98
+:101EC000F5D101209FE700209DE773B50646002469
+:101ED0006425B2480199FFF736FF48B1AF4846F490
+:101EE0008031001FFFF72FFF20B1AC4E083E10E0FD
+:101EF00000207CBD00207CBD01A93046FFF710FF0B
+:101F000020B10198C00303D501207CBD00207CBD19
+:101F1000641CAC42F0DB00207CBD38B505460021D6
+:101F20000820FFF7B9FD70B30024204655F82410AF
+:101F3000FFF7CBFF40B3641C042CF6D30920696A79
+:101F4000FFF7C3FF28B30D24204655F82410FFF7F0
+:101F5000BCFF00B3641C102CF6D31020296CFFF7D3
+:101F6000B4FFD0B18D488E490838FFF7ECFEB0B110
+:101F700069460420FFF76FFD98B1009810F0A00F9C
+:101F800011D0002006E700E001E0002002E7002079
+:101F900000E70020FEE60020FCE60020FAE6002034
+:101FA000F8E60020F6E60120F4E62DE9F0410E46C1
+:101FB0000024642501467948001FFFF7C4FE10B1D4
+:101FC000764F083F0AE000201DE731463846FFF70C
+:101FD000A7FE48B13068C00302D4641CAC42F4DBF5
+:101FE000AC4203D100200EE700200CE731466B48DD
+:101FF000FFF796FE08B1012005E7002003E7F8B5DA
+:10200000684D0024654E083E0CE069463046FFF7F7
+:1020100087FE20B10098800303D50120F8BD002081
+:10202000F8BD641CAC42F0D30020F8BD2DE9F043AC
+:1020300091B00446DDE91878894615461E464421CC
+:10204000684601F0A0FB009501960297CDF80C8040
+:1020500060680990A0680D9020680E90CDF83C90C3
+:102060004FF0807010906846FFF757FF68B1FFF798
+:10207000C6FF60B169460020FFF797FF48B100989E
+:1020800048B1002011B0BDE8F0830020FAE700203D
+:10209000F8E70020F6E70120F4E71CB500206A46C7
+:1020A000FF211154401CC0B20828FAD369463320DE
+:1020B000FFF7C4F901201CBD08B58DF80000000A27
+:1020C0008DF8010069461020FFF7B8F9012008BD1E
+:1020D0001CB504460020019001A90820FFF7AEF9C5
+:1020E00069460020FFF7B7FC012801D000201CBD85
+:1020F0009DF800009DF803109DF8012040EA016062
+:102100009DF80210090441EA0221084320600120E1
+:102110001CBD08B500200090FFF7BFFF68B14EF26C
+:102120009E70FFF7C9FF50B1FFF7B7FF48B168468F
+:10213000FFF7CEFF38B1012008BD002008BD002008
+:1021400008BD002008BD002008BDF8B500200090A3
+:10215000002464251049401E091D08604860FFF7EF
+:102160006EFCFFF7D6FF90B11E210020FFF794FC14
+:10217000D0B100210820FFF78FFCB8B14FF0A0418B
+:102180000420FFF789FC98B14FF020461CE00020A6
+:10219000F8BD0000500000232C010020F8ED00E005
+:1021A00001005FA040420F000020F1E70020EFE7B0
+:1021B0000020EDE769460420FFF74DFC50B100997F
+:1021C00036EA010002D0641CAC42F3DBAC4203D11E
+:1021D0000020DDE70020DBE7C9490420FFF75CFCB5
+:1021E00030B100210820FFF757FC18B10120CFE7DC
+:1021F0000020CDE70020CBE7002806D1C1480168C8
+:10220000C14A01F4E06111439DE57047F8B5054608
+:102210000224062D01D0FFF712FCBC49B94E4F1C19
+:10222000E436072D7DD2DFE805F00417085D6387EB
+:10223000A2000120FFF7E0FF95E00120FFF7DCFF9F
+:102240001420FFF7D3FB0020FFF7D6FF1420FFF781
+:10225000CDFBFFF7FBFB86E0FFF777FF08B13546C4
+:1022600013E0002094E7641E64B2002C01DC00201F
+:102270008EE70120FFF7C0FF1420FFF7B7FB002017
+:10228000FFF7BAFF1420FFF7B1FB39462846FFF7E6
+:102290005AFD0028E7D09B4C0121F0342046FFF77F
+:1022A00052FDC8B10120FFF7A7FF1420FFF79EFBE6
+:1022B0000020FFF7A1FF1420FFF798FB694628468E
+:1022C000FFF72EFD50B100988003F7D5002120467E
+:1022D000FFF739FD20B146E0002059E7002057E71D
+:1022E000002055E73046FFF72EFD78BB00204FE772
+:1022F000FFF70FFFB0B11E210020FFF7CDFB98B113
+:1023000000210820FFF7C8FB80B14FF0A041042056
+:10231000FFF7C2FB60B139463046FFF714FD48B104
+:1023200021E02AE0002033E7002031E700202FE7FA
+:1023300000202DE700202BE7FFF707FF38B1734996
+:102340003046C91CFFF7FFFC18B104E00BE0002089
+:102350001EE700201CE769463046FFF7E1FC20B18C
+:1023600000988003F7D5012012E7002010E73046DF
+:10237000FFF7E9FC18B1FFF769FB002008E7002030
+:1023800006E7F8B50446062C01D0FFF758FB5F4E70
+:102390005C4DF61CF11EE435072C7DD2DFE804F01D
+:1023A00004170860668CA6000120FFF725FF99E05E
+:1023B0000120FFF721FF1420FFF718FB0020FFF793
+:1023C0001BFF1420FFF712FBFFF740FB8AE0FFF72B
+:1023D000BCFE30B12C4631462046FFF7B4FC10B1AC
+:1023E00003E00020D4E60020D2E669462046FFF74D
+:1023F00097FC48B300988003F7D5424D0121F03592
+:102400002846FFF7A0FC08B33E4E69463046FFF76A
+:1024100087FCE8B1009800F4E0613B480143304696
+:10242000FFF791FCB0B11420FFF7E0FA69462046AF
+:10243000FFF776FC80B100988003F7D5002128468D
+:10244000FFF781FC50B14DE00020A1E600209FE69F
+:1024500000209DE600209BE6002099E6002097E6FC
+:102460002846FFF770FC80BB002091E6FFF751FE85
+:10247000C0B11E210020FFF70FFBA8B100210820EA
+:10248000FFF70AFB90B14FF0A0410420FFF704FBD7
+:1024900070B11E49491C00E02EE02846FFF753FCAE
+:1024A00040B11FE0002073E6002071E600206FE6D7
+:1024B00000206DE600206BE6FFF747FE30B13146A5
+:1024C0002846FFF740FC18B104E00BE000205FE66F
+:1024D00000205DE669462846FFF722FC20B10098FF
+:1024E0008003F7D5012053E6002051E62846FFF788
+:1024F0002AFC18B1FFF7AAFA002049E6002047E6B7
+:10250000000F00500CED00E00400FA0500005FA091
+:1025100000F01F0201219140C943F84A800F02EBED
+:10252000800002680A4002607047F548F0E770B525
+:1025300010F47F3F14D0C0F38143022B23D06FEA05
+:102540009044A40722D0ED4C1C3404EB83031C6898
+:10255000C0F38725C0F34416B540AC4314431C6058
+:10256000420E52070ED0E54BC0F301720C3303EB61
+:1025700082021468C0F34263C0F3045083409C435A
+:102580000C43146070BDDD4B2833E0E7DB4B2C338C
+:10259000DDE700F01F0201219140D84A800F02EBD5
+:1025A000800002680A430260704710B5044641EAA1
+:1025B0004210D24940F010005C310860D04B184600
+:1025C000FFF7E7FF2146BDE8104000221846AEE7BE
+:1025D000CC48016841F004010160C848001F01684F
+:1025E00041F08001016030BF7047C648016821F0AA
+:1025F00004010160C148001F016821F080010160F1
+:1026000030BF7047BD48001F0068C00701D0BE48FA
+:10261000704700207047B948001F0068800702D546
+:102620004FF4004070470020704710B501F00CF8DF
+:102630004FF08041D1F834024207B44819D0D1F8A4
+:10264000342202F00702012A15D0D1F8342202F018
+:102650000702022A12D0D1F8342202F00702032A1C
+:102660000FD0D1F8341201F0070104290CD0006812
+:1026700010BD006810BD0068400810BD00688008EB
+:1026800010BD0068C00810BD0068000910BD10B57D
+:1026900000F0DAFF4FF08041D1F8340210F0700FF3
+:1026A0009A4819D0D1F83422C2F30212012A15D067
+:1026B000D1F83422C2F30212022A12D0D1F8342205
+:1026C000C2F30212032A0FD0D1F83412C1F302115F
+:1026D00004290CD0006810BD006810BD00684008D7
+:1026E00010BD0068800810BD0068C00810BD0068FB
+:1026F000000910BD10B500F0A7FF8448006810BDA8
+:1027000010B500F0A1FF8148006810BD30B5054646
+:102710007F490124A20705E0081EA1F1010101DCA7
+:10272000002404E0D2F8503235EA0300F4D1204608
+:1027300030BD2DE9F04107460E46704C241F206D38
+:1027400000F01005206840F0040020601020FFF722
+:10275000DDFF206940F007002061206A20F00F02B1
+:1027600032432262206920F0070139432161A4F538
+:10277000007400F069FF002D05D1D4F8000220F0AC
+:102780000400C4F80002BDE8F08108B5002061A192
+:102790000968009159493C31096811F4A02F13D1FF
+:1027A00059488A0310D4C1F381321DF80220C1F3C5
+:1027B0000800801CC1F34421491C574B584311FBAE
+:1027C00002F1B0FBF1F0C00008BD4C483C3001689C
+:1027D00041F48031016070472DE9F84F04460D4601
+:1027E000FFF7F3FFDFF8209104B34448001F0168AE
+:1027F00041F0040101601020FFF788FF4FF4002032
+:10280000009046484649284488426BD84FF0FF3133
+:1028100000274FF000080026AB460123A9B3032B85
+:1028200045D0042B0ED0022B0FD010E03348001FF0
+:10283000016841F0010101600120FFF767FF0020FE
+:102840000090DEE74FEA8B0501E04FEA4B050222DC
+:1028500069B3B9FBF2F0334CDFF8C8C00444CCF1E3
+:10286000000C644520D80224DFF8BCE0C0F35D0A08
+:102870000AFB04F0DFF8A4C08444F4450FD8B0EBA1
+:10288000950F03D9A0EB950C02E013E0C0EB950C7B
+:102890008C4504D261461746A0461E4621B1641CF1
+:1028A00040F201208442E3D9521C202AD0D95B1C7B
+:1028B000042BB3D90098711E40EA8131781E41EA99
+:1028C0004020A8F1020108430C493C310860042073
+:1028D000FFF71CFF7E43B9FBF6F000FB08F0400059
+:1028E000BDE8F88F4CB1054810493C300160042028
+:1028F000FFF70CFFBDE8F84F47E719E0040200407E
+:102900000600C05710ED00E0001BB700800100205A
+:1029100080F5200001020204C0C62D00800F05FDD5
+:102920008074D21A00F7C2FFC06878041E42080003
+:10293000854844F21E210160D9E770B506464FF084
+:102940008044D4F8500200F010058048864200D937
+:10295000064604F50074206840F004002060102052
+:10296000FFF7D4FE206940F007002061206A20F0C4
+:102970000F0020622068A4F50074C00705D031461E
+:102980000020FFF729FF064609E031464FF40020FA
+:10299000FFF722FF0646D4F8500200F01005002190
+:1029A0000220FFF7C6FE2DB9D4F8000220F0040083
+:1029B000C4F80002304670BD634930390A6822F01D
+:1029C000380202430A6070475F4940390A6802438F
+:1029D0000A6070475C4940390A6882430A60704760
+:1029E00030B54FF0E0220024146104280DD0564D7C
+:1029F000303D2B6823F0380303432B605161946111
+:102A0000106940F00300106130BD106940F004000F
+:102A10001061F3E74FF0E02100200861704730B506
+:102A200004464FF08045042C01D0052C08D1D5F880
+:102A3000000240F00800C5F800020820FFF766FE1B
+:102A4000D5F8900220F007002043C5F8900230BD71
+:102A50003D4950310A6822F4403202430A6070470F
+:102A6000394854300068704730B5374C603404EB57
+:102A70008000046840F2F715AC4344EA01111143A9
+:102A8000194341F00101016030BD1FB5304991E8A3
+:102A90001C00C9688DE81C0003912E4A91069042E3
+:102AA00005D1D1F8180200F0010004B010BD2A4A87
+:102AB000904204D1D1F81802C0F34000F5E7274A4C
+:102AC000904204D1D1F81802C0F30020EDE7244A67
+:102AD000904204D1D1F81802C0F34020E5E7410E3E
+:102AE000490710D0C0F301725DF82210164A303A3F
+:102AF00011440968C0F34262C0F30450824011409F
+:102B000021FA00F0D1E70020CFE71FB51049D1E945
+:102B100005340A69C9698DE81C00039110F47F3FF0
+:102B200010D0C0F381425DF82210074A203A1144C8
+:102B30000968C0F38722C0F344108240114021FA93
+:102B400000F0B2E70020B0E74002004000B0710B97
+:102B500058380000100000A2110010A2120080A23C
+:102B6000130090A2F0B500230127032607FA03F40F
+:102B70008C4309D105685C0006FA04FC25EA0C05C3
+:102B800002FA04F4254305605B1C102BEED3F0BD64
+:102B900010B5836901248C40A343140E8C40234359
+:102BA0008361C3694FF001148C4022F07F42A3433C
+:102BB0008A401343C36110BD826901238B409A434D
+:102BC0008261C2694FF001138B409A43C261704722
+:102BD000F0B500230127032607FA03F40C4209D0BD
+:102BE000856A5C0006FA04FC25EA0C0502FA04F486
+:102BF000254385625B1C102BEED3F0BDF0B500239E
+:102C00000127032607FA03F40C4209D0056B5C0088
+:102C100006FA04FC25EA0C0502FA04F425430563D0
+:102C20005B1C102BEED3F0BD4A0503D570228261E8
+:102C3000082282610A0503D5426942F0010242611D
+:102C40008A0401D5F94A82614A0401D51F224264EF
+:102C5000090404D58021C16140F20F3181637047BE
+:102C6000002141607047416821F440514160704744
+:102C700042688A4342607047016941F40071016112
+:102C8000416941F480714161416841F440514160C2
+:102C9000704742680A43426070472DE9FF4104468D
+:102CA0000F4600250026E24890E80E00C0688DE837
+:102CB0000E000390DF494FF080408C4208D1D0F8DD
+:102CC0001412C1F30165D0F82002C0F3032639E0E5
+:102CD000D9498C4208D1D0F81412C1F38165D0F8DB
+:102CE0002002C0F303362DE0D4498C4208D1D0F83D
+:102CF0001C12C1F30165D0F8300200F00F0621E08C
+:102D0000CF498C4208D1D0F81C12C1F38165D0F8AC
+:102D10003002C0F3031615E0CA498C4208D1D0F83E
+:102D20001C12C1F30175D0F83002C0F3032609E08C
+:102D3000C5498C4206D1D0F81C128D0FD0F8300254
+:102D4000C0F30336002020630320E060A068BF4981
+:102D50000840A060E846012D02D1FFF716FD019062
+:102D6000002F17D058F82510761CB1FBF6F000EBB9
+:102D70005700B0FBF7F0801EB0F5803F0CD3B1FBDD
+:102D8000F6F000EBC700B0FBF7F06FF0010101EBCC
+:102D900010106062BDE8FF8140F040506062F9E7CA
+:102DA000F0B50446002600204FF080470EE00023D7
+:102DB00004E05B1CBB4201D3012602E0A5696D045F
+:102DC000F7D4012E04D023680B54401C9042EED35C
+:102DD000F0BD2DE9FF5F0446DDF838A00F469046B0
+:102DE0009946002500269248D0E905230169C0696B
+:102DF0008DE80E0003908F494FF080408C4208D13F
+:102E0000D0F81412C1F30165D0F82002C0F30326F4
+:102E100039E089498C4208D1D0F81412C1F3816598
+:102E2000D0F82002C0F303362DE084498C4208D14B
+:102E3000D0F81C12C1F30165D0F8300200F00F0683
+:102E400021E07F498C4208D1D0F81C12C1F3816582
+:102E5000D0F83002C0F3031615E07A498C4208D14D
+:102E6000D0F81C12C1F30175D0F83002C0F303266C
+:102E700009E075498C4206D1D0F81C128D0FD0F8AC
+:102E80003002C0F30336EB46012D02D1FFF77DFC83
+:102E90000190DFB15BF82510761CB1FBF6F000EB7A
+:102EA0005700B0FBF7F0801EB0F5803F0BD3B1FBAD
+:102EB000F6F000EBC700B0FBF7F06FF0010101EB9B
+:102EC0001010606202E040F04050606248EA090879
+:102ED00048EA0A08C4F80C80BDE8FF9F026A22F0A5
+:102EE000FF020A430262416841F400614160704799
+:102EF0002DE9FF4704460F469046002500264C4822
+:102F0000D0E90923016AC06A8DE80E00039002200F
+:102F10002063484940078C4208D1D0F81412C1F30D
+:102F20000165D0F82002C0F3032639E042498C4203
+:102F300008D1D0F81412C1F38165D0F82002C0F393
+:102F400003362DE03D498C4208D1D0F81C12C1F364
+:102F50000165D0F8300200F00F0621E038498C42BC
+:102F600008D1D0F81C12C1F38165D0F83002C0F34B
+:102F7000031615E033498C4208D1D0F81C12C1F376
+:102F80000175D0F83002C0F3032609E02E498C42C7
+:102F900006D1D0F81C128D0FD0F83002C0F30336E2
+:102FA000E946012D02D1FFF7F0FB019087B159F8F6
+:102FB0002500761CB0FBF6F000EBC700B0FBF7F085
+:102FC0006FF0010101EB1010090C884200D2606221
+:102FD000B8F1000F09D0A06A20F02000A062A06A1A
+:102FE00040F00200A062BDE8FF87A06A40F0400008
+:102FF000A062A06A20F00200A062F4E710B50323EB
+:103000000363C36A124C2340C362C36A41EA02618C
+:103010000B43C36210BD01230363C36A23F0CF03D4
+:10302000C362C36A11430B43C362704701000001CE
+:1030300078380000000007400010074000200740DB
+:103040000030074000400740005007400FFFF0FFEE
+:10305000FFF8FF00F0B50446002600204FF080473F
+:103060000EE0002304E05B1CBB4201D3012602E01A
+:10307000A569ED00F7D5012E04D00B5C2360401C40
+:103080009042EED1F0BD0000F74BD863D9621A63CD
+:103090000068C0791862F5484FF4DA6140F8041C02
+:1030A000C16F41F00101C1677047F0481438D0F892
+:1030B000901021F00101C0F890104FF4FA61016105
+:1030C00040F20F11416002680A4302607047E6490E
+:1030D0000822403100F0A1BAE34A9060002010615C
+:1030E0005161106AE249086070472DE9F0410346DA
+:1030F0000D46DD4C216ADE48DD4ADC4F0C38143ABF
+:10310000EC37061F8D4213D9216A19446160216A88
+:10311000691AE160016841F080010160106838447B
+:10312000226A194600F079FA206A3060BDE8F08121
+:1031300000216160E160016841F080010160106878
+:1031400038442A46194600F068FA3560EEE730B494
+:10315000C54B4033D879000299790144C248C44C28
+:10316000C34DDA78083C0835C06B0F2A28D006DC3E
+:10317000012A15D0022A19D0032A07D13BE0BA4B05
+:103180004033212A1B7921D0222A29D0206840F0FF
+:1031900002002060286840F00200286030BC7047C0
+:1031A000122900D31221006830BC9EE74068C27823
+:1031B000837803EB0222914200D3114630BC94E79E
+:1031C0000C2900D30C21006930BC8EE7092900D3FB
+:1031D0000921826952F82320406830BC104484E7FA
+:1031E000426952F823208A4200D81146C06850F83C
+:1031F000230030BC79E79A78042A08D2806850F816
+:10320000220002788A4200D8114630BC6DE720685F
+:1032100040F002002060286840F002002860BDE70E
+:103220002DE9F05F904A00255560D56002F1400914
+:10323000494699F800308F4E0879DFF83CC2DFF834
+:103240003CB249785FEA036A00F00F074FF00108CB
+:1032500006F104046FD5DFF814A2A6F104090AF1FF
+:10326000EC0AD1B3062921D008290FD00A2924D08D
+:10327000DCF8000040F00200CCF80000DBF80000B1
+:1032800040F00200CBF80000BDE8F09FD9F8000044
+:103290005044D1690170206840F080002060C6F879
+:1032A0000080BDE8F05F0021084615E7FFF74FFFFB
+:1032B000BDE8F05F002108460EE7D9F80000504451
+:1032C000516A0170206840F080002060C6F80080DC
+:1032D000BDE8F05F00210846FEE6FFE7802B04D042
+:1032E000812B14D0822B17D031E00020D16B49689C
+:1032F000C9794B0600D50120890603D51178490606
+:1033000040EA1160D9F80010514408701FE0D9F864
+:103310000000504405701AE0D9F8000000EB0A03E1
+:10332000002004EB00110A6802F00F02BA4203D138
+:103330000CEB001103E01BE0401C0C28F1D30868E3
+:1033400010F0020F01D0012000E000201870D9F821
+:1033500000004649ED3108440570206840F08000C7
+:10336000206002203060BDE8F05F00210846B3E62F
+:103370003D4840300529807841D004DC012913D034
+:10338000032904D14CE0092940D00B296BD0DCF88B
+:10339000000040F00200CCF80000DBF8000040F034
+:1033A0000200CBF800006FE710B1012820D020E028
+:1033B0000020D2F838C02D4A143A02EB0011D1F89F
+:1033C000083503F00F03BB420ED108FA00F313EAED
+:1033D0000C0F09D101F5A1614B6823F002034B608A
+:1033E0000B6823F080030B60401C0C28E5D300E041
+:1033F0001570206840F080002060356044E79061DF
+:10340000206840F08000206035603DE7D061506B5F
+:1034100000B18047206840F080002060356033E7CD
+:10342000190709D1032807D199F8031021B91449C4
+:103430000B6843F006030B6010B1012822D023E093
+:10344000002004EB0011096801F00F01B94206D118
+:103450000CEB0010016841F00201016014E0401C17
+:103460000C28EED310E015E03801002014000C40C9
+:1034700014050C4004050C400C050C401C050C40C8
+:1034800000D0044082F80080206840F08000206076
+:103490003560F9E65062116B09B1506A88472068BF
+:1034A00040F0800020603560EEE610B508226249E9
+:1034B000624800F0B2F86148007810F0600011D066
+:1034C0005E494039202810D0402814D05C4801685B
+:1034D00041F0020101605A481030016841F00201D8
+:1034E000016010BDBDE810409AE6C86A0028F8D017
+:1034F000BDE810400047886A0028F2D0BDE81040BF
+:1035000000472DE9F0414D4C403CE0684C4D002611
+:10351000083D002827D0E368276A2146281F464A2D
+:103520004968BB420FD900681044226A00F075F860
+:10353000206A2860216A606808446060E068216A47
+:10354000401AE060F2E500681044E26800F065F8B7
+:10355000E0682860E068216A884201D1012060703B
+:103560006660E660E2E53548017851B940780528A3
+:1035700007D134498868A269904202D008B9A0698D
+:10358000886060780028DDD02E606670CEE570B56A
+:103590002A4C403C20696169884216D2284E083680
+:1035A0003568301F0068244901442A46A06800F0AD
+:1035B00034F8A0682844A06020692844206120696C
+:1035C0006169884201D2206A306070BD10B51B4825
+:1035D000002240384260C2608260026142618263C0
+:1035E000026442640020174B03EB0011D1F8084538
+:1035F00024F08004C1F80845401C0C28F4D39A60DC
+:1036000010BD0E494039886270470C494039486303
+:1036100070470A4940398863704718B50023009302
+:1036200006E0009B009CCB5C0355009B5B1C009359
+:10363000521E531CF5D118BD00010C40780100202A
+:103640000C050C4000000C4010B5FFF79EF8214A15
+:1036500090604FF08043D3F8101201F00701022967
+:1036600003D002F10C0050F82100D3F8201201F031
+:103670000F01491CB0FBF1F01060174908444900E4
+:10368000B0FBF1F0506010BD1448C16C21F00F0187
+:1036900041F00801C1641248D0F8901041F4802133
+:1036A000C0F89010016841F0020101600D490A68FC
+:1036B00002F0F7320A604A6802F0F7324A600168A5
+:1036C00021F0020101600848016821F0F001016069
+:1036D000704700008001002020A1070000C00040CA
+:1036E00008020040041104404041004014484FF0DB
+:1036F000590101604FF0160101604FF0880101602F
+:103700001048416841F4804141600F48416841F0F0
+:1037100002014160416841F0040141600B4880476B
+:1037200007484FF00001016009480047FEE7FEE747
+:10373000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE761
+:103740000001004000020040007000408936000087
+:10375000B901000040EA01039B0703D009E008C952
+:10376000121F08C0042AFAD203E011F8013B00F846
+:10377000013B521EF9D27047D2B201E000F8012B92
+:10378000491EFBD270470022F6E710B513460A46E1
+:1037900004461946FFF7F0FF204610BD064C074DC2
+:1037A00006E0E06840F0010394E807009847103411
+:1037B000AC42F6D3FCF704FDA8380000C83800007E
+:1037C00070B58C1810F8015B15F0070301D110F8E3
+:1037D000013B2A1106D110F8012B03E010F8016B10
+:1037E00001F8016B5B1EF9D12B0705D40023521E93
+:1037F0000DD401F8013BFAE710F8013BCB1A921CFB
+:1038000003E013F8015B01F8015B521EF9D5A142F8
+:10381000D8D3002070BD02E008C8121F08C1002ADA
+:10382000FAD170477047002001E001C1121F002A41
+:10383000FBD170471D0000202F000020D000002089
+:10384000E000002004010020EC000020F80000202F
+:10385000312E3130000000000000000004000000A4
+:10386000080000000C000000000000000400000040
+:103870000800000010000000001BB700000000005E
+:1038800000800000001BB700001BB7000000000014
+:1038900000800000001BB700001BB7000000000004
+:1038A00000800000001BB700C838000000000020A6
+:1038B000AC010000C0370000BC390000AC010020A2
+:1038C000744C0000263800001206100BFF0901A1FD
+:1038D0000119012940151326FF1675089540812905
+:1038E0000F129114C0120132021640160421501416
+:1038F000010102150109026B230301246409043349
+:10390000020315092110011401221D160705810368
+:10391000402D01070501071008080B0102020201F2
+:103920001B09041E29091305241D10010524521C1E
+:103930000424020E10090601020705820308150A75
+:1039400009040233020A2E0705830240072A0307EF
+:1039500010080403090412035812491256124E1299
+:1039600031123912381237141E034D1A340A12302C
+:1039700012201243124D1A53201253122D124412C8
+:10398000413250229A1B209E041AB004716908111A
+:10399000B21DB2121C050F0CB82B1002EC19DC0181
+:1039A000122AC2162208022A10192E0126131BB74A
+:0C39B0005A0C08390462800B1010272804
:04000005000001B93D
:00000001FF
diff --git a/src/DAP_config.h b/src/DAP_config.h
index 051b569..5605479 100644
--- a/src/DAP_config.h
+++ b/src/DAP_config.h
@@ -215,8 +215,13 @@ static __inline uint32_t PIN_nRESET_IN(void)
return 0;
}
+extern uint8_t swd_write_word(uint32_t addr, uint32_t val);
static __inline void PIN_nRESET_OUT(uint32_t bit)
{
+ if(bit == 0)
+ {
+ swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk));
+ }
}
@@ -243,9 +248,12 @@ static void DAP_SETUP(void)
}
+extern uint8_t swd_write_word(uint32_t addr, uint32_t val);
static uint32_t RESET_TARGET(void)
{
- return 0; // change to '1' when a device reset sequence is implemented
+ swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk));
+
+ return 1; // change to '1' when a device reset sequence is implemented
}
diff --git a/src/SWD_host/SWD_flash.c b/src/SWD_host/SWD_flash.c
new file mode 100644
index 0000000..dec3c6d
--- /dev/null
+++ b/src/SWD_host/SWD_flash.c
@@ -0,0 +1,90 @@
+/**
+ * @file SWD_flash.c
+ * @brief Program target flash through SWD
+ */
+#include "swd_host.h"
+#include "SWD_flash.h"
+
+
+extern const program_target_t flash_algo;
+
+
+error_t target_flash_init(uint32_t flash_start, uint32_t func)
+{
+ if(func == 0)
+ {
+ if (0 == swd_set_target_state_hw(RESET_PROGRAM)) {
+ return ERROR_RESET;
+ }
+
+ // Download flash programming algorithm to target and initialise.
+ if (0 == swd_write_memory(flash_algo.algo_start, (uint8_t *)flash_algo.algo_blob, flash_algo.algo_size)) {
+ return ERROR_ALGO_DL;
+ }
+ }
+ else
+ {
+ if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.init, flash_start, 0, func, 0)) {
+ return ERROR_INIT;
+ }
+ }
+
+ return ERROR_SUCCESS;
+}
+
+error_t target_flash_uninit(uint32_t func)
+{
+ if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.init, func, 0, 0, 0)) {
+ return ERROR_UNINIT;
+ }
+
+ return ERROR_SUCCESS;
+}
+
+error_t target_flash_program_page(uint32_t addr, const uint8_t *buf, uint32_t size)
+{
+ while (size > 0) {
+ uint32_t write_size = size > flash_algo.program_buffer_size ? flash_algo.program_buffer_size : size;
+
+ // Write page to buffer
+ if (!swd_write_memory(flash_algo.program_buffer, (uint8_t *)buf, write_size)) {
+ return ERROR_ALGO_DATA_SEQ;
+ }
+
+ // Run flash programming
+ if (swd_flash_syscall_exec(&flash_algo.sys_call_s,
+ flash_algo.program_page,
+ addr,
+ flash_algo.program_buffer_size,
+ flash_algo.program_buffer,
+ 0)) {
+ return ERROR_WRITE;
+ }
+
+ addr += write_size;
+ buf += write_size;
+ size -= write_size;
+ }
+
+ return ERROR_SUCCESS;
+}
+
+error_t target_flash_erase_sector(uint32_t addr)
+{
+ if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.erase_sector, addr, 0, 0, 0)) {
+ return ERROR_ERASE_SECTOR;
+ }
+
+ return ERROR_SUCCESS;
+}
+
+error_t target_flash_erase_chip(void)
+{
+ error_t status = ERROR_SUCCESS;
+
+ if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.erase_chip, 0, 0, 0, 0)) {
+ return ERROR_ERASE_ALL;
+ }
+
+ return status;
+}
diff --git a/src/SWD_host/SWD_flash.h b/src/SWD_host/SWD_flash.h
new file mode 100644
index 0000000..37c7342
--- /dev/null
+++ b/src/SWD_host/SWD_flash.h
@@ -0,0 +1,38 @@
+#ifndef __SWD_FLASH_H__
+#define __SWD_FLASH_H__
+
+#include
+
+
+typedef enum {
+ /* Shared errors */
+ ERROR_SUCCESS = 0,
+ ERROR_FAILURE,
+ ERROR_INTERNAL,
+
+ /* Target flash errors */
+ ERROR_RESET,
+ ERROR_ALGO_DL,
+ ERROR_ALGO_DATA_SEQ,
+ ERROR_INIT,
+ ERROR_UNINIT,
+ ERROR_SECURITY_BITS,
+ ERROR_UNLOCK,
+ ERROR_ERASE_SECTOR,
+ ERROR_ERASE_ALL,
+ ERROR_WRITE,
+
+ // Add new values here
+
+ ERROR_COUNT
+} error_t;
+
+
+error_t target_flash_init(uint32_t flash_start, uint32_t func);
+error_t target_flash_uninit(uint32_t func);
+error_t target_flash_program_page(uint32_t addr, const uint8_t *buf, uint32_t size);
+error_t target_flash_erase_sector(uint32_t addr);
+error_t target_flash_erase_chip(void);
+
+
+#endif // __SWD_FLASH_H__
diff --git a/src/SWD_host/SWD_host.c b/src/SWD_host/SWD_host.c
new file mode 100644
index 0000000..2038f68
--- /dev/null
+++ b/src/SWD_host/SWD_host.c
@@ -0,0 +1,1095 @@
+/**
+ * @file SWDd_host.c
+ * @brief Host driver for accessing the DAP
+ */
+#include "swd_host.h"
+
+#include "DAP_config.h"
+#include "DAP.h"
+#include "debug_cm.h"
+
+uint32_t Flash_Page_Size = 4096;
+
+extern uint32_t Flash_Page_Size;
+
+
+#define NVIC_Addr (0xe000e000)
+#define DBG_Addr (0xe000edf0)
+
+// AP CSW register, base value
+#define CSW_VALUE (CSW_RESERVED | CSW_MSTRDBG | CSW_HPROT | CSW_DBGSTAT | CSW_SADDRINC)
+
+// SWD register access
+#define SWD_REG_AP (1)
+#define SWD_REG_DP (0)
+#define SWD_REG_R (1<<1)
+#define SWD_REG_W (0<<1)
+#define SWD_REG_ADR(a) (a & 0x0c)
+
+#define DCRDR 0xE000EDF8
+#define DCRSR 0xE000EDF4
+#define DHCSR 0xE000EDF0
+#define REGWnR (1 << 16)
+
+#define MAX_SWD_RETRY 10
+#define MAX_TIMEOUT 1000000 // Timeout for syscalls on target
+
+#define SCB_AIRCR_PRIGROUP_Pos 8
+#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos)
+
+
+typedef struct {
+ uint32_t select;
+ uint32_t csw;
+} DAP_STATE;
+
+typedef struct {
+ uint32_t r[16];
+ uint32_t xpsr;
+} DEBUG_STATE;
+
+static DAP_STATE dap_state;
+
+static uint8_t swd_read_core_register(uint32_t n, uint32_t *val);
+static uint8_t swd_write_core_register(uint32_t n, uint32_t val);
+
+
+void delaymS(uint32_t ms)
+{
+ uint32_t cnt = SystemCoreClock/4/1000 * ms;
+
+ for(uint32_t i = 0; i < cnt; i++) __NOP();
+}
+
+
+static void int2array(uint8_t *res, uint32_t data, uint8_t len)
+{
+ uint8_t i = 0;
+
+ for(i = 0; i < len; i++) {
+ res[i] = (data >> 8 * i) & 0xFF;
+ }
+}
+
+static uint8_t swd_transfer_retry(uint32_t req, uint32_t *data)
+{
+ uint8_t i, ack;
+
+ for (i = 0; i < MAX_SWD_RETRY; i++) {
+ ack = SWD_Transfer(req, data);
+
+ if (ack != DAP_TRANSFER_WAIT) {
+ return ack;
+ }
+ }
+
+ return ack;
+}
+
+
+uint8_t swd_init(void)
+{
+ DAP_Setup();
+ PORT_SWD_SETUP();
+
+ return 1;
+}
+
+uint8_t swd_off(void)
+{
+ PORT_OFF();
+
+ return 1;
+}
+
+// Read debug port register.
+uint8_t swd_read_dp(uint8_t adr, uint32_t *val)
+{
+ uint32_t tmp_in;
+ uint8_t tmp_out[4];
+ uint8_t ack;
+ uint32_t tmp;
+
+ tmp_in = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(adr);
+ ack = swd_transfer_retry(tmp_in, (uint32_t *)tmp_out);
+
+ *val = 0;
+ tmp = tmp_out[3];
+ *val |= (tmp << 24);
+ tmp = tmp_out[2];
+ *val |= (tmp << 16);
+ tmp = tmp_out[1];
+ *val |= (tmp << 8);
+ tmp = tmp_out[0];
+ *val |= (tmp << 0);
+
+ return (ack == 0x01);
+}
+
+// Write debug port register
+uint8_t swd_write_dp(uint8_t adr, uint32_t val)
+{
+ uint32_t req;
+ uint8_t data[4];
+ uint8_t ack;
+
+ switch (adr) {
+ case DP_SELECT:
+ if (dap_state.select == val) {
+ return 1;
+ }
+
+ dap_state.select = val;
+ break;
+
+ default:
+ break;
+ }
+
+ req = SWD_REG_DP | SWD_REG_W | SWD_REG_ADR(adr);
+ int2array(data, val, 4);
+ ack = swd_transfer_retry(req, (uint32_t *)data);
+
+ return (ack == 0x01);
+}
+
+// Read access port register.
+uint8_t swd_read_ap(uint32_t adr, uint32_t *val)
+{
+ uint8_t tmp_in, ack;
+ uint8_t tmp_out[4];
+ uint32_t tmp;
+ uint32_t apsel = adr & 0xff000000;
+ uint32_t bank_sel = adr & APBANKSEL;
+
+ if (!swd_write_dp(DP_SELECT, apsel | bank_sel)) {
+ return 0;
+ }
+
+ tmp_in = SWD_REG_AP | SWD_REG_R | SWD_REG_ADR(adr);
+ // first dummy read
+ swd_transfer_retry(tmp_in, (uint32_t *)tmp_out);
+ ack = swd_transfer_retry(tmp_in, (uint32_t *)tmp_out);
+
+ *val = 0;
+ tmp = tmp_out[3];
+ *val |= (tmp << 24);
+ tmp = tmp_out[2];
+ *val |= (tmp << 16);
+ tmp = tmp_out[1];
+ *val |= (tmp << 8);
+ tmp = tmp_out[0];
+ *val |= (tmp << 0);
+
+ return (ack == 0x01);
+}
+
+// Write access port register
+uint8_t swd_write_ap(uint32_t adr, uint32_t val)
+{
+ uint8_t data[4];
+ uint8_t req, ack;
+ uint32_t apsel = adr & 0xff000000;
+ uint32_t bank_sel = adr & APBANKSEL;
+
+ if (!swd_write_dp(DP_SELECT, apsel | bank_sel)) {
+ return 0;
+ }
+
+ switch (adr) {
+ case AP_CSW:
+ if (dap_state.csw == val) {
+ return 1;
+ }
+
+ dap_state.csw = val;
+ break;
+
+ default:
+ break;
+ }
+
+ req = SWD_REG_AP | SWD_REG_W | SWD_REG_ADR(adr);
+ int2array(data, val, 4);
+
+ if (swd_transfer_retry(req, (uint32_t *)data) != 0x01) {
+ return 0;
+ }
+
+ req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
+ ack = swd_transfer_retry(req, NULL);
+
+ return (ack == 0x01);
+}
+
+
+// Write 32-bit word aligned values to target memory using address auto-increment.
+// size is in bytes.
+static uint8_t swd_write_block(uint32_t address, uint8_t *data, uint32_t size)
+{
+ uint8_t tmp_in[4], req;
+ uint32_t size_in_words;
+ uint32_t i, ack;
+
+ if (size == 0) {
+ return 0;
+ }
+
+ size_in_words = size / 4;
+
+ // CSW register
+ if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) {
+ return 0;
+ }
+
+ // TAR write
+ req = SWD_REG_AP | SWD_REG_W | (1 << 2);
+ int2array(tmp_in, address, 4);
+
+ if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) {
+ return 0;
+ }
+
+ // DRW write
+ req = SWD_REG_AP | SWD_REG_W | (3 << 2);
+
+ for (i = 0; i < size_in_words; i++) {
+ if (swd_transfer_retry(req, (uint32_t *)data) != 0x01) {
+ return 0;
+ }
+
+ data += 4;
+ }
+
+ // dummy read
+ req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
+ ack = swd_transfer_retry(req, NULL);
+ return (ack == 0x01);
+}
+
+// Read 32-bit word aligned values from target memory using address auto-increment.
+// size is in bytes.
+static uint8_t swd_read_block(uint32_t address, uint8_t *data, uint32_t size)
+{
+ uint8_t tmp_in[4], req, ack;
+ uint32_t size_in_words;
+ uint32_t i;
+
+ if (size == 0) {
+ return 0;
+ }
+
+ size_in_words = size / 4;
+
+ if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) {
+ return 0;
+ }
+
+ // TAR write
+ req = SWD_REG_AP | SWD_REG_W | AP_TAR;
+ int2array(tmp_in, address, 4);
+
+ if (swd_transfer_retry(req, (uint32_t *)tmp_in) != DAP_TRANSFER_OK) {
+ return 0;
+ }
+
+ // read data
+ req = SWD_REG_AP | SWD_REG_R | AP_DRW;
+
+ // initiate first read, data comes back in next read
+ if (swd_transfer_retry(req, NULL) != 0x01) {
+ return 0;
+ }
+
+ for (i = 0; i < (size_in_words - 1); i++) {
+ if (swd_transfer_retry(req, (uint32_t *)data) != DAP_TRANSFER_OK) {
+ return 0;
+ }
+
+ data += 4;
+ }
+
+ // read last word
+ req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
+ ack = swd_transfer_retry(req, (uint32_t *)data);
+ return (ack == 0x01);
+}
+
+// Read target memory.
+static uint8_t swd_read_data(uint32_t addr, uint32_t *val)
+{
+ uint8_t tmp_in[4];
+ uint8_t tmp_out[4];
+ uint8_t req, ack;
+ uint32_t tmp;
+ // put addr in TAR register
+ int2array(tmp_in, addr, 4);
+ req = SWD_REG_AP | SWD_REG_W | (1 << 2);
+
+ if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) {
+ return 0;
+ }
+
+ // read data
+ req = SWD_REG_AP | SWD_REG_R | (3 << 2);
+
+ if (swd_transfer_retry(req, (uint32_t *)tmp_out) != 0x01) {
+ return 0;
+ }
+
+ // dummy read
+ req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
+ ack = swd_transfer_retry(req, (uint32_t *)tmp_out);
+ *val = 0;
+ tmp = tmp_out[3];
+ *val |= (tmp << 24);
+ tmp = tmp_out[2];
+ *val |= (tmp << 16);
+ tmp = tmp_out[1];
+ *val |= (tmp << 8);
+ tmp = tmp_out[0];
+ *val |= (tmp << 0);
+ return (ack == 0x01);
+}
+
+// Write target memory.
+static uint8_t swd_write_data(uint32_t address, uint32_t data)
+{
+ uint8_t tmp_in[4];
+ uint8_t req, ack;
+ // put addr in TAR register
+ int2array(tmp_in, address, 4);
+ req = SWD_REG_AP | SWD_REG_W | (1 << 2);
+
+ if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) {
+ return 0;
+ }
+
+ // write data
+ int2array(tmp_in, data, 4);
+ req = SWD_REG_AP | SWD_REG_W | (3 << 2);
+
+ if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) {
+ return 0;
+ }
+
+ // dummy read
+ req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
+ ack = swd_transfer_retry(req, NULL);
+ return (ack == 0x01) ? 1 : 0;
+}
+
+// Read 32-bit word from target memory.
+/* static */ uint8_t swd_read_word(uint32_t addr, uint32_t *val)
+{
+ if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) {
+ return 0;
+ }
+
+ if (!swd_read_data(addr, val)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// Write 32-bit word to target memory.
+/* static */ uint8_t swd_write_word(uint32_t addr, uint32_t val)
+{
+ if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) {
+ return 0;
+ }
+
+ if (!swd_write_data(addr, val)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// Read 8-bit byte from target memory.
+static uint8_t swd_read_byte(uint32_t addr, uint8_t *val)
+{
+ uint32_t tmp;
+
+ if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE8)) {
+ return 0;
+ }
+
+ if (!swd_read_data(addr, &tmp)) {
+ return 0;
+ }
+
+ *val = (uint8_t)(tmp >> ((addr & 0x03) << 3));
+ return 1;
+}
+
+// Write 8-bit byte to target memory.
+static uint8_t swd_write_byte(uint32_t addr, uint8_t val)
+{
+ uint32_t tmp;
+
+ if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE8)) {
+ return 0;
+ }
+
+ tmp = val << ((addr & 0x03) << 3);
+
+ if (!swd_write_data(addr, tmp)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// Read unaligned data from target memory.
+// size is in bytes.
+uint8_t swd_read_memory(uint32_t address, uint8_t *data, uint32_t size)
+{
+ uint32_t n;
+
+ // Read bytes until word aligned
+ while ((size > 0) && (address & 0x3)) {
+ if (!swd_read_byte(address, data)) {
+ return 0;
+ }
+
+ address++;
+ data++;
+ size--;
+ }
+
+ // Read word aligned blocks
+ while (size > 3) {
+ // Limit to auto increment page size
+ n = Flash_Page_Size - (address & (Flash_Page_Size - 1));
+
+ if (size < n) {
+ n = size & 0xFFFFFFFC; // Only count complete words remaining
+ }
+
+ if (!swd_read_block(address, data, n)) {
+ return 0;
+ }
+
+ address += n;
+ data += n;
+ size -= n;
+ }
+
+ // Read remaining bytes
+ while (size > 0) {
+ if (!swd_read_byte(address, data)) {
+ return 0;
+ }
+
+ address++;
+ data++;
+ size--;
+ }
+
+ return 1;
+}
+
+// Write unaligned data to target memory.
+// size is in bytes.
+uint8_t swd_write_memory(uint32_t address, uint8_t *data, uint32_t size)
+{
+ uint32_t n = 0;
+
+ // Write bytes until word aligned
+ while ((size > 0) && (address & 0x3)) {
+ if (!swd_write_byte(address, *data)) {
+ return 0;
+ }
+
+ address++;
+ data++;
+ size--;
+ }
+
+ // Write word aligned blocks
+ while (size > 3) {
+ // Limit to auto increment page size
+ n = Flash_Page_Size - (address & (Flash_Page_Size - 1));
+
+ if (size < n) {
+ n = size & 0xFFFFFFFC; // Only count complete words remaining
+ }
+
+ if (!swd_write_block(address, data, n)) {
+ return 0;
+ }
+
+ address += n;
+ data += n;
+ size -= n;
+ }
+
+ // Write remaining bytes
+ while (size > 0) {
+ if (!swd_write_byte(address, *data)) {
+ return 0;
+ }
+
+ address++;
+ data++;
+ size--;
+ }
+
+ return 1;
+}
+
+// Execute system call.
+static uint8_t swd_write_debug_state(DEBUG_STATE *state)
+{
+ uint32_t i, status;
+
+ if (!swd_write_dp(DP_SELECT, 0)) {
+ return 0;
+ }
+
+ // R0, R1, R2, R3
+ for (i = 0; i < 4; i++) {
+ if (!swd_write_core_register(i, state->r[i])) {
+ return 0;
+ }
+ }
+
+ // R9
+ if (!swd_write_core_register(9, state->r[9])) {
+ return 0;
+ }
+
+ // R13, R14, R15
+ for (i = 13; i < 16; i++) {
+ if (!swd_write_core_register(i, state->r[i])) {
+ return 0;
+ }
+ }
+
+ // xPSR
+ if (!swd_write_core_register(16, state->xpsr)) {
+ return 0;
+ }
+
+ if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN)) {
+ return 0;
+ }
+
+ // check status
+ if (!swd_read_dp(DP_CTRL_STAT, &status)) {
+ return 0;
+ }
+
+ if (status & (STICKYERR | WDATAERR)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t swd_read_core_register(uint32_t n, uint32_t *val)
+{
+ int i = 0, timeout = 100;
+
+ if (!swd_write_word(DCRSR, n)) {
+ return 0;
+ }
+
+ // wait for S_REGRDY
+ for (i = 0; i < timeout; i++) {
+ if (!swd_read_word(DHCSR, val)) {
+ return 0;
+ }
+
+ if (*val & S_REGRDY) {
+ break;
+ }
+ }
+
+ if (i == timeout) {
+ return 0;
+ }
+
+ if (!swd_read_word(DCRDR, val)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t swd_write_core_register(uint32_t n, uint32_t val)
+{
+ int i = 0, timeout = 100;
+
+ if (!swd_write_word(DCRDR, val)) {
+ return 0;
+ }
+
+ if (!swd_write_word(DCRSR, n | REGWnR)) {
+ return 0;
+ }
+
+ // wait for S_REGRDY
+ for (i = 0; i < timeout; i++) {
+ if (!swd_read_word(DHCSR, &val)) {
+ return 0;
+ }
+
+ if (val & S_REGRDY) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static uint8_t swd_wait_until_halted(void)
+{
+ // Wait for target to stop
+ uint32_t val, i, timeout = MAX_TIMEOUT;
+
+ for (i = 0; i < timeout; i++) {
+ if (!swd_read_word(DBG_HCSR, &val)) {
+ return 0;
+ }
+
+ if (val & S_HALT) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+uint8_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4)
+{
+ DEBUG_STATE state = {{0}, 0};
+ // Call flash algorithm function on target and wait for result.
+ state.r[0] = arg1; // R0: Argument 1
+ state.r[1] = arg2; // R1: Argument 2
+ state.r[2] = arg3; // R2: Argument 3
+ state.r[3] = arg4; // R3: Argument 4
+ state.r[9] = sysCallParam->static_base; // SB: Static Base
+ state.r[13] = sysCallParam->stack_pointer; // SP: Stack Pointer
+ state.r[14] = sysCallParam->breakpoint; // LR: Exit Point
+ state.r[15] = entry; // PC: Entry Point
+ state.xpsr = 0x01000000; // xPSR: T = 1, ISR = 0
+
+ if (!swd_write_debug_state(&state)) {
+ return 0;
+ }
+
+ if (!swd_wait_until_halted()) {
+ return 0;
+ }
+
+ if (!swd_read_core_register(0, &state.r[0])) {
+ return 0;
+ }
+
+ // Flash functions return 0 if successful.
+ if (state.r[0] != 0) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// SWD Reset
+static uint8_t swd_reset(void)
+{
+ uint8_t tmp_in[8];
+ uint8_t i = 0;
+
+ for (i = 0; i < 8; i++) {
+ tmp_in[i] = 0xff;
+ }
+
+ SWJ_Sequence(51, tmp_in);
+ return 1;
+}
+
+// SWD Switch
+static uint8_t swd_switch(uint16_t val)
+{
+ uint8_t tmp_in[2];
+ tmp_in[0] = val & 0xff;
+ tmp_in[1] = (val >> 8) & 0xff;
+ SWJ_Sequence(16, tmp_in);
+ return 1;
+}
+
+// SWD Read ID
+static uint8_t swd_read_idcode(uint32_t *id)
+{
+ uint8_t tmp_in[1];
+ uint8_t tmp_out[4];
+ tmp_in[0] = 0x00;
+ SWJ_Sequence(8, tmp_in);
+
+ if (swd_read_dp(0, (uint32_t *)tmp_out) != 0x01) {
+ return 0;
+ }
+
+ *id = (tmp_out[3] << 24) | (tmp_out[2] << 16) | (tmp_out[1] << 8) | tmp_out[0];
+ return 1;
+}
+
+
+static uint8_t JTAG2SWD()
+{
+ uint32_t tmp = 0;
+
+ if (!swd_reset()) {
+ return 0;
+ }
+
+ if (!swd_switch(0xE79E)) {
+ return 0;
+ }
+
+ if (!swd_reset()) {
+ return 0;
+ }
+
+ if (!swd_read_idcode(&tmp)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+uint8_t swd_init_debug(void)
+{
+ uint32_t tmp = 0;
+ int i = 0;
+ int timeout = 100;
+ // init dap state with fake values
+ dap_state.select = 0xffffffff;
+ dap_state.csw = 0xffffffff;
+ swd_init();
+
+ // call a target dependant function
+ // this function can do several stuff before really initing the debug
+ //target_before_init_debug();
+
+ if (!JTAG2SWD()) {
+ return 0;
+ }
+
+ if (!swd_write_dp(DP_ABORT, STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR)) {
+ return 0;
+ }
+
+ // Ensure CTRL/STAT register selected in DPBANKSEL
+ if (!swd_write_dp(DP_SELECT, 0)) {
+ return 0;
+ }
+
+ // Power up
+ if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ)) {
+ return 0;
+ }
+
+ for (i = 0; i < timeout; i++) {
+ if (!swd_read_dp(DP_CTRL_STAT, &tmp)) {
+ return 0;
+ }
+ if ((tmp & (CDBGPWRUPACK | CSYSPWRUPACK)) == (CDBGPWRUPACK | CSYSPWRUPACK)) {
+ // Break from loop if powerup is complete
+ break;
+ }
+ }
+ if (i == timeout) {
+ // Unable to powerup DP
+ return 0;
+ }
+
+ if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ | TRNNORMAL | MASKLANE)) {
+ return 0;
+ }
+
+ // call a target dependant function:
+ // some target can enter in a lock state, this function can unlock these targets
+ //target_unlock_sequence();
+
+ if (!swd_write_dp(DP_SELECT, 0)) {
+ return 0;
+ }
+
+ return 1;
+}
+/*
+__attribute__((weak)) void swd_set_target_reset(uint8_t asserted)
+{
+ (asserted) ? PIN_nRESET_OUT(0) : PIN_nRESET_OUT(1);
+}
+*/
+void swd_set_target_reset(uint8_t asserted)
+{
+ /* ļжԴ˺ʹö asserted=1 ãʱ asserted=0 ãΪֻһֻڵڶεô˺ʱִλ */
+ if(asserted == 0)
+ {
+ swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk));
+ }
+}
+
+uint8_t swd_set_target_state_hw(TARGET_RESET_STATE state)
+{
+ uint32_t val;
+ int8_t ap_retries = 2;
+ /* Calling swd_init prior to entering RUN state causes operations to fail. */
+ if (state != RUN) {
+ swd_init();
+ }
+
+ switch (state) {
+ case RESET_HOLD:
+ swd_set_target_reset(1);
+ break;
+
+ case RESET_RUN:
+ swd_set_target_reset(1);
+ delaymS(20);
+ swd_set_target_reset(0);
+ delaymS(20);
+ swd_off();
+ break;
+
+ case RESET_PROGRAM:
+ if (!swd_init_debug()) {
+ return 0;
+ }
+
+ // Enable debug
+ while(swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN) == 0) {
+ if( --ap_retries <=0 )
+ return 0;
+ // Target is in invalid state?
+ swd_set_target_reset(1);
+ delaymS(20);
+ swd_set_target_reset(0);
+ delaymS(20);
+ }
+
+ // Enable halt on reset
+ if (!swd_write_word(DBG_EMCR, VC_CORERESET)) {
+ return 0;
+ }
+
+ // Reset again
+ swd_set_target_reset(1);
+ delaymS(20);
+ swd_set_target_reset(0);
+ delaymS(20);
+
+ do {
+ if (!swd_read_word(DBG_HCSR, &val)) {
+ return 0;
+ }
+ } while ((val & S_HALT) == 0);
+
+ // Disable halt on reset
+ if (!swd_write_word(DBG_EMCR, 0)) {
+ return 0;
+ }
+
+ break;
+
+ case NO_DEBUG:
+ if (!swd_write_word(DBG_HCSR, DBGKEY)) {
+ return 0;
+ }
+
+ break;
+
+ case DEBUG:
+ if (!JTAG2SWD()) {
+ return 0;
+ }
+
+ if (!swd_write_dp(DP_ABORT, STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR)) {
+ return 0;
+ }
+
+ // Ensure CTRL/STAT register selected in DPBANKSEL
+ if (!swd_write_dp(DP_SELECT, 0)) {
+ return 0;
+ }
+
+ // Power up
+ if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ)) {
+ return 0;
+ }
+
+ // Enable debug
+ if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN)) {
+ return 0;
+ }
+
+ break;
+
+ case HALT:
+ if (!swd_init_debug()) {
+ return 0;
+ }
+
+ // Enable debug and halt the core (DHCSR <- 0xA05F0003)
+ if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN | C_HALT)) {
+ return 0;
+ }
+
+ // Wait until core is halted
+ do {
+ if (!swd_read_word(DBG_HCSR, &val)) {
+ return 0;
+ }
+ } while ((val & S_HALT) == 0);
+ break;
+
+ case RUN:
+ if (!swd_write_word(DBG_HCSR, DBGKEY)) {
+ return 0;
+ }
+ swd_off();
+
+ default:
+ return 0;
+ }
+
+ return 1;
+}
+
+uint8_t swd_set_target_state_sw(TARGET_RESET_STATE state)
+{
+ uint32_t val;
+
+ /* Calling swd_init prior to enterring RUN state causes operations to fail. */
+ if (state != RUN) {
+ swd_init();
+ }
+
+ switch (state) {
+ case RESET_HOLD:
+ swd_set_target_reset(1);
+ break;
+
+ case RESET_RUN:
+ swd_set_target_reset(1);
+ delaymS(20);
+ swd_set_target_reset(0);
+ delaymS(20);
+ swd_off();
+ break;
+
+ case RESET_PROGRAM:
+ if (!swd_init_debug()) {
+ return 0;
+ }
+
+ // Enable debug and halt the core (DHCSR <- 0xA05F0003)
+ if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN | C_HALT)) {
+ return 0;
+ }
+
+ // Wait until core is halted
+ do {
+ if (!swd_read_word(DBG_HCSR, &val)) {
+ return 0;
+ }
+ } while ((val & S_HALT) == 0);
+
+ // Enable halt on reset
+ if (!swd_write_word(DBG_EMCR, VC_CORERESET)) {
+ return 0;
+ }
+
+ // Perform a soft reset
+ if (!swd_read_word(NVIC_AIRCR, &val)) {
+ return 0;
+ }
+
+ if (!swd_write_word(NVIC_AIRCR, VECTKEY | (val & SCB_AIRCR_PRIGROUP_Msk) | SYSRESETREQ)) {
+ return 0;
+ }
+
+ delaymS(20);
+
+ do {
+ if (!swd_read_word(DBG_HCSR, &val)) {
+ return 0;
+ }
+ } while ((val & S_HALT) == 0);
+
+ // Disable halt on reset
+ if (!swd_write_word(DBG_EMCR, 0)) {
+ return 0;
+ }
+
+ break;
+
+ case NO_DEBUG:
+ if (!swd_write_word(DBG_HCSR, DBGKEY)) {
+ return 0;
+ }
+
+ break;
+
+ case DEBUG:
+ if (!JTAG2SWD()) {
+ return 0;
+ }
+
+ if (!swd_write_dp(DP_ABORT, STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR)) {
+ return 0;
+ }
+
+ // Ensure CTRL/STAT register selected in DPBANKSEL
+ if (!swd_write_dp(DP_SELECT, 0)) {
+ return 0;
+ }
+
+ // Power up
+ if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ)) {
+ return 0;
+ }
+
+ // Enable debug
+ if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN)) {
+ return 0;
+ }
+
+ break;
+
+ case HALT:
+ if (!swd_init_debug()) {
+ return 0;
+ }
+
+ // Enable debug and halt the core (DHCSR <- 0xA05F0003)
+ if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN | C_HALT)) {
+ return 0;
+ }
+
+ // Wait until core is halted
+ do {
+ if (!swd_read_word(DBG_HCSR, &val)) {
+ return 0;
+ }
+ } while ((val & S_HALT) == 0);
+ break;
+
+ case RUN:
+ if (!swd_write_word(DBG_HCSR, DBGKEY)) {
+ return 0;
+ }
+ swd_off();
+
+ default:
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/src/SWD_host/SWD_host.h b/src/SWD_host/SWD_host.h
new file mode 100644
index 0000000..31e313b
--- /dev/null
+++ b/src/SWD_host/SWD_host.h
@@ -0,0 +1,39 @@
+#ifndef SWDHOST_CM_H
+#define SWDHOST_CM_H
+
+#include
+
+#include "flash_blob.h"
+
+
+typedef enum {
+ RESET_HOLD, // Hold target in reset
+ RESET_PROGRAM, // Reset target and setup for flash programming.
+ RESET_RUN, // Reset target and run normally
+ NO_DEBUG, // Disable debug on running target
+ DEBUG, // Enable debug on running target
+ HALT, // Halt the target without resetting it
+ RUN // Resume the target without resetting it
+} TARGET_RESET_STATE;
+
+
+uint8_t swd_init(void);
+uint8_t swd_off(void);
+uint8_t swd_init_debug(void);
+uint8_t swd_read_dp(uint8_t adr, uint32_t *val);
+uint8_t swd_write_dp(uint8_t adr, uint32_t val);
+uint8_t swd_read_ap(uint32_t adr, uint32_t *val);
+uint8_t swd_write_ap(uint32_t adr, uint32_t val);
+uint8_t swd_read_memory(uint32_t address, uint8_t *data, uint32_t size);
+uint8_t swd_write_memory(uint32_t address, uint8_t *data, uint32_t size);
+uint8_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4);
+void swd_set_target_reset(uint8_t asserted);
+uint8_t swd_set_target_state_hw(TARGET_RESET_STATE state);
+uint8_t swd_set_target_state_sw(TARGET_RESET_STATE state);
+
+
+uint8_t swd_read_word(uint32_t addr, uint32_t *val);
+uint8_t swd_write_word(uint32_t addr, uint32_t val);
+
+
+#endif
diff --git a/src/SWD_host/debug_ca.h b/src/SWD_host/debug_ca.h
new file mode 100644
index 0000000..edf45ce
--- /dev/null
+++ b/src/SWD_host/debug_ca.h
@@ -0,0 +1,286 @@
+/**
+ * @file debug_ca.h
+ * @brief Access to ARM DAP (Cortex-A) using CMSIS-DAP protocol
+ *
+ * DAPLink Interface Firmware
+ * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef DEBUG_CA_H
+#define DEBUG_CA_H
+
+#include "DAP.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Abort Register definitions
+#define DAPABORT 0x00000001 // DAP Abort
+#define STKCMPCLR 0x00000002 // Clear STICKYCMP Flag (SW Only)
+#define STKERRCLR 0x00000004 // Clear STICKYERR Flag (SW Only)
+#define WDERRCLR 0x00000008 // Clear WDATAERR Flag (SW Only)
+#define ORUNERRCLR 0x00000010 // Clear STICKYORUN Flag (SW Only)
+
+// Debug Control and Status definitions
+#define ORUNDETECT 0x00000001 // Overrun Detect
+#define STICKYORUN 0x00000002 // Sticky Overrun
+#define TRNMODE 0x0000000C // Transfer Mode Mask
+#define TRNNORMAL 0x00000000 // Transfer Mode: Normal
+#define TRNVERIFY 0x00000004 // Transfer Mode: Pushed Verify
+#define TRNCOMPARE 0x00000008 // Transfer Mode: Pushed Compare
+#define STICKYCMP 0x00000010 // Sticky Compare
+#define STICKYERR 0x00000020 // Sticky Error
+#define READOK 0x00000040 // Read OK (SW Only)
+#define WDATAERR 0x00000080 // Write Data Error (SW Only)
+#define MASKLANE 0x00000F00 // Mask Lane Mask
+#define MASKLANE0 0x00000100 // Mask Lane 0
+#define MASKLANE1 0x00000200 // Mask Lane 1
+#define MASKLANE2 0x00000400 // Mask Lane 2
+#define MASKLANE3 0x00000800 // Mask Lane 3
+#define TRNCNT 0x001FF000 // Transaction Counter Mask
+#define CDBGRSTREQ 0x04000000 // Debug Reset Request
+#define CDBGRSTACK 0x08000000 // Debug Reset Acknowledge
+#define CDBGPWRUPREQ 0x10000000 // Debug Power-up Request
+#define CDBGPWRUPACK 0x20000000 // Debug Power-up Acknowledge
+#define CSYSPWRUPREQ 0x40000000 // System Power-up Request
+#define CSYSPWRUPACK 0x80000000 // System Power-up Acknowledge
+
+// Debug Select Register definitions
+#define CTRLSEL 0x00000001 // CTRLSEL (SW Only)
+#define APBANKSEL 0x000000F0 // APBANKSEL Mask
+#define APSEL 0xFF000000 // APSEL Mask
+
+// Access Port Register Addresses
+#define AP_CSW 0x00 // Control and Status Word
+#define AP_TAR 0x04 // Transfer Address
+#define AP_DRW 0x0C // Data Read/Write
+#define AP_BD0 0x10 // Banked Data 0
+#define AP_BD1 0x14 // Banked Data 1
+#define AP_BD2 0x18 // Banked Data 2
+#define AP_BD3 0x1C // Banked Data 3
+#define AP_ROM 0xF8 // Debug ROM Address
+#define AP_IDR 0xFC // Identification Register
+
+// AP Control and Status Word definitions
+#define CSW_SIZE 0x00000007 // Access Size: Selection Mask
+#define CSW_SIZE8 0x00000000 // Access Size: 8-bit
+#define CSW_SIZE16 0x00000001 // Access Size: 16-bit
+#define CSW_SIZE32 0x00000002 // Access Size: 32-bit
+#define CSW_ADDRINC 0x00000030 // Auto Address Increment Mask
+#define CSW_NADDRINC 0x00000000 // No Address Increment
+#define CSW_SADDRINC 0x00000010 // Single Address Increment
+#define CSW_PADDRINC 0x00000020 // Packed Address Increment
+#define CSW_DBGSTAT 0x00000040 // Debug Status
+#define CSW_TINPROG 0x00000080 // Transfer in progress
+#define CSW_HPROT 0x02000000 // User/Privilege Control
+#define CSW_MSTRTYPE 0x20000000 // Master Type Mask
+#define CSW_MSTRCORE 0x00000000 // Master Type: Core
+#define CSW_MSTRDBG 0x60000000 // Master Type: Debug
+#define CSW_RESERVED 0x01000000 // Reserved Value
+
+// Core Debug Register Address Offsets
+#define DBG_OFS 0x0DF0 // Debug Register Offset inside NVIC
+#define DBG_HCSR_OFS 0x00 // Debug Halting Control & Status Register
+#define DBG_CRSR_OFS 0x04 // Debug Core Register Selector Register
+#define DBG_CRDR_OFS 0x08 // Debug Core Register Data Register
+#define DBG_EMCR_OFS 0x0C // Debug Exception & Monitor Control Register
+
+// Core Debug Register Addresses
+#define DBG_HCSR (DBG_Addr + DBG_HCSR_OFS)
+#define DBG_CRSR (DBG_Addr + DBG_CRSR_OFS)
+#define DBG_CRDR (DBG_Addr + DBG_CRDR_OFS)
+#define DBG_EMCR (DBG_Addr + DBG_EMCR_OFS)
+
+// Debug Halting Control and Status Register definitions
+#define C_DEBUGEN 0x00000001 // Debug Enable
+#define C_HALT 0x00000002 // Halt
+#define C_STEP 0x00000004 // Step
+#define C_MASKINTS 0x00000008 // Mask Interrupts
+#define C_SNAPSTALL 0x00000020 // Snap Stall
+#define S_REGRDY 0x00010000 // Register R/W Ready Flag
+#define S_HALT 0x00020000 // Halt Flag
+#define S_SLEEP 0x00040000 // Sleep Flag
+#define S_LOCKUP 0x00080000 // Lockup Flag
+#define S_RETIRE_ST 0x01000000 // Sticky Retire Flag
+#define S_RESET_ST 0x02000000 // Sticky Reset Flag
+#define DBGKEY 0xA05F0000 // Debug Key
+
+// Debug Exception and Monitor Control Register definitions
+#define VC_CORERESET 0x00000001 // Reset Vector Catch
+#define VC_MMERR 0x00000010 // Debug Trap on MMU Fault
+#define VC_NOCPERR 0x00000020 // Debug Trap on No Coprocessor Fault
+#define VC_CHKERR 0x00000040 // Debug Trap on Checking Error Fault
+#define VC_STATERR 0x00000080 // Debug Trap on State Error Fault
+#define VC_BUSERR 0x00000100 // Debug Trap on Bus Error Fault
+#define VC_INTERR 0x00000200 // Debug Trap on Interrupt Error Fault
+#define VC_HARDERR 0x00000400 // Debug Trap on Hard Fault
+#define MON_EN 0x00010000 // Monitor Enable
+#define MON_PEND 0x00020000 // Monitor Pend
+#define MON_STEP 0x00040000 // Monitor Step
+#define MON_REQ 0x00080000 // Monitor Request
+#define TRCENA 0x01000000 // Trace Enable (DWT, ITM, ETM, TPIU)
+
+// NVIC: Interrupt Controller Type Register
+#define NVIC_ICT (NVIC_Addr + 0x0004)
+#define INTLINESNUM 0x0000001F // Interrupt Line Numbers
+
+// NVIC: CPUID Base Register
+#define NVIC_CPUID (NVIC_Addr + 0x0D00)
+#define CPUID_PARTNO 0x0000FFF0 // Part Number Mask
+#define CPUID_REVISION 0x0000000F // Revision Mask
+#define CPUID_VARIANT 0x00F00000 // Variant Mask
+
+// NVIC: Application Interrupt/Reset Control Register
+#define NVIC_AIRCR (NVIC_Addr + 0x0D0C)
+#define VECTRESET 0x00000001 // Reset Cortex-M (except Debug)
+#define VECTCLRACTIVE 0x00000002 // Clear Active Vector Bit
+#define SYSRESETREQ 0x00000004 // Reset System (except Debug)
+#define VECTKEY 0x05FA0000 // Write Key
+
+// NVIC: Debug Fault Status Register
+#define NVIC_DFSR (NVIC_Addr + 0x0D30)
+#define HALTED 0x00000001 // Halt Flag
+#define BKPT 0x00000002 // BKPT Flag
+#define DWTTRAP 0x00000004 // DWT Match
+#define VCATCH 0x00000008 // Vector Catch Flag
+#define EXTERNAL 0x00000010 // External Debug Request
+
+// Debug registers
+#define DEBUG_REGSITER_BASE (0x80030000)
+
+#define DBGDIDR (DEBUG_REGSITER_BASE + (0 * 4)) // Debug ID
+#define DBGWFAR (DEBUG_REGSITER_BASE + (6 * 4)) // Watchpoint Fault Address
+#define DBGVCR (DEBUG_REGSITER_BASE + (7 * 4)) // Vector Catch
+#define DBGECR (DEBUG_REGSITER_BASE + (9 * 4)) // Event Catch
+#define DBGDTRRX (DEBUG_REGSITER_BASE + (32 * 4)) // Host to Target Data Transfer
+#define DBGITR (DEBUG_REGSITER_BASE + (33 * 4)) // WO Instruction Transfer
+#define DBGDSCR (DEBUG_REGSITER_BASE + (34 * 4)) // Debug Status and Control
+#define DBGDTRTX (DEBUG_REGSITER_BASE + (35 * 4)) // Target to Host Data Transfer
+#define DBGDRCR (DEBUG_REGSITER_BASE + (36 * 4)) // Debug Run Control
+#define DBGEACR (DEBUG_REGSITER_BASE + (37 * 4)) // External Auxiliary Control
+#define DBGPCSR (DEBUG_REGSITER_BASE + (40 * 4)) // Program Counter Sampling
+#define DBGCIDSR (DEBUG_REGSITER_BASE + (41 * 4)) // Context ID Sampling
+#define DBGVIDSR (DEBUG_REGSITER_BASE + (42 * 4)) // Virtualization ID Sampling
+#define DBGBVR0 (DEBUG_REGSITER_BASE + (64 * 4)) // Breakpoint Value
+#define DBGBVR1 (DEBUG_REGSITER_BASE + (65 * 4)) // Breakpoint Value
+#define DBGBVR2 (DEBUG_REGSITER_BASE + (66 * 4)) // Breakpoint Value
+#define DBGBVR3 (DEBUG_REGSITER_BASE + (67 * 4)) // Breakpoint Value
+#define DBGBVR4 (DEBUG_REGSITER_BASE + (68 * 4)) // Breakpoint Value
+#define DBGBVR5 (DEBUG_REGSITER_BASE + (69 * 4)) // Breakpoint Value
+#define DBGBVR6 (DEBUG_REGSITER_BASE + (70 * 4)) // Breakpoint Value
+#define DBGBVR7 (DEBUG_REGSITER_BASE + (71 * 4)) // Breakpoint Value
+#define DBGBVR8 (DEBUG_REGSITER_BASE + (72 * 4)) // Breakpoint Value
+#define DBGBVR9 (DEBUG_REGSITER_BASE + (73 * 4)) // Breakpoint Value
+#define DBGBVR10 (DEBUG_REGSITER_BASE + (74 * 4)) // Breakpoint Value
+#define DBGBVR11 (DEBUG_REGSITER_BASE + (75 * 4)) // Breakpoint Value
+#define DBGBVR12 (DEBUG_REGSITER_BASE + (76 * 4)) // Breakpoint Value
+#define DBGBVR13 (DEBUG_REGSITER_BASE + (77 * 4)) // Breakpoint Value
+#define DBGBVR14 (DEBUG_REGSITER_BASE + (78 * 4)) // Breakpoint Value
+#define DBGBVR15 (DEBUG_REGSITER_BASE + (79 * 4)) // Breakpoint Value
+#define DBGBCR0 (DEBUG_REGSITER_BASE + (80 * 4)) // Breakpoint Control
+#define DBGBCR1 (DEBUG_REGSITER_BASE + (81 * 4)) // Breakpoint Control
+#define DBGBCR2 (DEBUG_REGSITER_BASE + (82 * 4)) // Breakpoint Control
+#define DBGBCR3 (DEBUG_REGSITER_BASE + (83 * 4)) // Breakpoint Control
+#define DBGBCR4 (DEBUG_REGSITER_BASE + (84 * 4)) // Breakpoint Control
+#define DBGBCR5 (DEBUG_REGSITER_BASE + (85 * 4)) // Breakpoint Control
+#define DBGBCR6 (DEBUG_REGSITER_BASE + (86 * 4)) // Breakpoint Control
+#define DBGBCR7 (DEBUG_REGSITER_BASE + (87 * 4)) // Breakpoint Control
+#define DBGBCR8 (DEBUG_REGSITER_BASE + (88 * 4)) // Breakpoint Control
+#define DBGBCR9 (DEBUG_REGSITER_BASE + (89 * 4)) // Breakpoint Control
+#define DBGBCR10 (DEBUG_REGSITER_BASE + (90 * 4)) // Breakpoint Control
+#define DBGBCR11 (DEBUG_REGSITER_BASE + (91 * 4)) // Breakpoint Control
+#define DBGBCR12 (DEBUG_REGSITER_BASE + (92 * 4)) // Breakpoint Control
+#define DBGBCR13 (DEBUG_REGSITER_BASE + (93 * 4)) // Breakpoint Control
+#define DBGBCR14 (DEBUG_REGSITER_BASE + (94 * 4)) // Breakpoint Control
+#define DBGBCR15 (DEBUG_REGSITER_BASE + (95 * 4)) // Breakpoint Control
+#define DBGWVR0 (DEBUG_REGSITER_BASE + (96 * 4)) // Watchpoint Value
+#define DBGWVR1 (DEBUG_REGSITER_BASE + (97 * 4)) // Watchpoint Value
+#define DBGWVR2 (DEBUG_REGSITER_BASE + (98 * 4)) // Watchpoint Value
+#define DBGWVR3 (DEBUG_REGSITER_BASE + (99 * 4)) // Watchpoint Value
+#define DBGWVR4 (DEBUG_REGSITER_BASE + (100 * 4)) // Watchpoint Value
+#define DBGWVR5 (DEBUG_REGSITER_BASE + (101 * 4)) // Watchpoint Value
+#define DBGWVR6 (DEBUG_REGSITER_BASE + (102 * 4)) // Watchpoint Value
+#define DBGWVR7 (DEBUG_REGSITER_BASE + (103 * 4)) // Watchpoint Value
+#define DBGWVR8 (DEBUG_REGSITER_BASE + (104 * 4)) // Watchpoint Value
+#define DBGWVR9 (DEBUG_REGSITER_BASE + (105 * 4)) // Watchpoint Value
+#define DBGWVR10 (DEBUG_REGSITER_BASE + (106 * 4)) // Watchpoint Value
+#define DBGWVR11 (DEBUG_REGSITER_BASE + (107 * 4)) // Watchpoint Value
+#define DBGWVR12 (DEBUG_REGSITER_BASE + (108 * 4)) // Watchpoint Value
+#define DBGWVR13 (DEBUG_REGSITER_BASE + (109 * 4)) // Watchpoint Value
+#define DBGWVR14 (DEBUG_REGSITER_BASE + (110 * 4)) // Watchpoint Value
+#define DBGWVR15 (DEBUG_REGSITER_BASE + (111 * 4)) // Watchpoint Value
+#define DBGWCR0 (DEBUG_REGSITER_BASE + (112 * 4)) // Watchpoint Control
+#define DBGWCR1 (DEBUG_REGSITER_BASE + (113 * 4)) // Watchpoint Control
+#define DBGWCR2 (DEBUG_REGSITER_BASE + (114 * 4)) // Watchpoint Control
+#define DBGWCR3 (DEBUG_REGSITER_BASE + (115 * 4)) // Watchpoint Control
+#define DBGWCR4 (DEBUG_REGSITER_BASE + (116 * 4)) // Watchpoint Control
+#define DBGWCR5 (DEBUG_REGSITER_BASE + (117 * 4)) // Watchpoint Control
+#define DBGWCR6 (DEBUG_REGSITER_BASE + (118 * 4)) // Watchpoint Control
+#define DBGWCR7 (DEBUG_REGSITER_BASE + (119 * 4)) // Watchpoint Control
+#define DBGWCR8 (DEBUG_REGSITER_BASE + (120 * 4)) // Watchpoint Control
+#define DBGWCR9 (DEBUG_REGSITER_BASE + (121 * 4)) // Watchpoint Control
+#define DBGWCR10 (DEBUG_REGSITER_BASE + (122 * 4)) // Watchpoint Control
+#define DBGWCR11 (DEBUG_REGSITER_BASE + (123 * 4)) // Watchpoint Control
+#define DBGWCR12 (DEBUG_REGSITER_BASE + (124 * 4)) // Watchpoint Control
+#define DBGWCR13 (DEBUG_REGSITER_BASE + (125 * 4)) // Watchpoint Control
+#define DBGWCR14 (DEBUG_REGSITER_BASE + (126 * 4)) // Watchpoint Control
+#define DBGWCR15 (DEBUG_REGSITER_BASE + (127 * 4)) // Watchpoint Control
+#define DBGBXVR0 (DEBUG_REGSITER_BASE + (144 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR1 (DEBUG_REGSITER_BASE + (145 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR2 (DEBUG_REGSITER_BASE + (146 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR3 (DEBUG_REGSITER_BASE + (147 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR4 (DEBUG_REGSITER_BASE + (148 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR5 (DEBUG_REGSITER_BASE + (149 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR6 (DEBUG_REGSITER_BASE + (150 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR7 (DEBUG_REGSITER_BASE + (151 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR8 (DEBUG_REGSITER_BASE + (152 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR9 (DEBUG_REGSITER_BASE + (153 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR10 (DEBUG_REGSITER_BASE + (154 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR11 (DEBUG_REGSITER_BASE + (155 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR12 (DEBUG_REGSITER_BASE + (156 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR13 (DEBUG_REGSITER_BASE + (157 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR14 (DEBUG_REGSITER_BASE + (158 * 4)) // Breakpoint Extended Valueb
+#define DBGBXVR15 (DEBUG_REGSITER_BASE + (159 * 4)) // Breakpoint Extended Valueb
+#define DBGOSLAR (DEBUG_REGSITER_BASE + (192 * 4)) // OS Lock Access
+#define DBGOSLSR (DEBUG_REGSITER_BASE + (193 * 4)) // OS Lock Status
+#define DBGPRCR (DEBUG_REGSITER_BASE + (196 * 4)) // Powerdown and Reset Control
+#define DBGPRSR (DEBUG_REGSITER_BASE + (197 * 4)) // Powerdown and Reset Status
+#define DBGITCTRL (DEBUG_REGSITER_BASE + (960 * 4)) // Integration Mode Control
+#define DBGCLAIMSET (DEBUG_REGSITER_BASE + (1000 * 4)) // Claim Tag Set
+#define DBGCLAIMCLR (DEBUG_REGSITER_BASE + (1001 * 4)) // Claim Tag Clear
+#define DBGLAR (DEBUG_REGSITER_BASE + (1004 * 4)) // Lock Access
+#define DBGLSR (DEBUG_REGSITER_BASE + (1005 * 4)) // Lock Status
+#define DBGAUTHSTATUS (DEBUG_REGSITER_BASE + (1006 * 4)) // Authentication Status
+#define DBGDEVID2 (DEBUG_REGSITER_BASE + (1008 * 4)) // Debug Device ID 2
+#define DBGDEVID1 (DEBUG_REGSITER_BASE + (1009 * 4)) // Debug Device ID 1
+#define DBGDEVID (DEBUG_REGSITER_BASE + (1010 * 4)) // Debug Device ID
+#define DBGDEVTYPE (DEBUG_REGSITER_BASE + (1011 * 4)) // Device Type
+#define DBGPID0 (DEBUG_REGSITER_BASE + (1012 * 4)) // Debug Peripheral ID
+#define DBGPID1 (DEBUG_REGSITER_BASE + (1013 * 4)) // Debug Peripheral ID
+#define DBGPID2 (DEBUG_REGSITER_BASE + (1014 * 4)) // Debug Peripheral ID
+#define DBGPID3 (DEBUG_REGSITER_BASE + (1015 * 4)) // Debug Peripheral ID
+#define DBGPID4 (DEBUG_REGSITER_BASE + (1016 * 4)) // Debug Peripheral ID
+#define DBGCID0 (DEBUG_REGSITER_BASE + (1020 * 4)) // Debug Component ID
+#define DBGCID1 (DEBUG_REGSITER_BASE + (1021 * 4)) // Debug Component ID
+#define DBGCID2 (DEBUG_REGSITER_BASE + (1022 * 4)) // Debug Component ID
+#define DBGCID3 (DEBUG_REGSITER_BASE + (1023 * 4)) // Debug Component ID
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/SWD_host/debug_cm.h b/src/SWD_host/debug_cm.h
new file mode 100644
index 0000000..631b8f5
--- /dev/null
+++ b/src/SWD_host/debug_cm.h
@@ -0,0 +1,143 @@
+/**
+ * @file debug_cm.h
+ * @brief Access to ARM DAP (Cortex-M) using CMSIS-DAP protocol
+ */
+#ifndef DEBUG_CM_H
+#define DEBUG_CM_H
+
+#include "DAP.h"
+
+
+// Abort Register definitions
+#define DAPABORT 0x00000001 // DAP Abort
+#define STKCMPCLR 0x00000002 // Clear STICKYCMP Flag (SW Only)
+#define STKERRCLR 0x00000004 // Clear STICKYERR Flag (SW Only)
+#define WDERRCLR 0x00000008 // Clear WDATAERR Flag (SW Only)
+#define ORUNERRCLR 0x00000010 // Clear STICKYORUN Flag (SW Only)
+
+// Debug Control and Status definitions
+#define ORUNDETECT 0x00000001 // Overrun Detect
+#define STICKYORUN 0x00000002 // Sticky Overrun
+#define TRNMODE 0x0000000C // Transfer Mode Mask
+#define TRNNORMAL 0x00000000 // Transfer Mode: Normal
+#define TRNVERIFY 0x00000004 // Transfer Mode: Pushed Verify
+#define TRNCOMPARE 0x00000008 // Transfer Mode: Pushed Compare
+#define STICKYCMP 0x00000010 // Sticky Compare
+#define STICKYERR 0x00000020 // Sticky Error
+#define READOK 0x00000040 // Read OK (SW Only)
+#define WDATAERR 0x00000080 // Write Data Error (SW Only)
+#define MASKLANE 0x00000F00 // Mask Lane Mask
+#define MASKLANE0 0x00000100 // Mask Lane 0
+#define MASKLANE1 0x00000200 // Mask Lane 1
+#define MASKLANE2 0x00000400 // Mask Lane 2
+#define MASKLANE3 0x00000800 // Mask Lane 3
+#define TRNCNT 0x001FF000 // Transaction Counter Mask
+#define CDBGRSTREQ 0x04000000 // Debug Reset Request
+#define CDBGRSTACK 0x08000000 // Debug Reset Acknowledge
+#define CDBGPWRUPREQ 0x10000000 // Debug Power-up Request
+#define CDBGPWRUPACK 0x20000000 // Debug Power-up Acknowledge
+#define CSYSPWRUPREQ 0x40000000 // System Power-up Request
+#define CSYSPWRUPACK 0x80000000 // System Power-up Acknowledge
+
+// Debug Select Register definitions
+#define CTRLSEL 0x00000001 // CTRLSEL (SW Only)
+#define APBANKSEL 0x000000F0 // APBANKSEL Mask
+#define APSEL 0xFF000000 // APSEL Mask
+
+// Access Port Register Addresses
+#define AP_CSW 0x00 // Control and Status Word
+#define AP_TAR 0x04 // Transfer Address
+#define AP_DRW 0x0C // Data Read/Write
+#define AP_BD0 0x10 // Banked Data 0
+#define AP_BD1 0x14 // Banked Data 1
+#define AP_BD2 0x18 // Banked Data 2
+#define AP_BD3 0x1C // Banked Data 3
+#define AP_ROM 0xF8 // Debug ROM Address
+#define AP_IDR 0xFC // Identification Register
+
+// AP Control and Status Word definitions
+#define CSW_SIZE 0x00000007 // Access Size: Selection Mask
+#define CSW_SIZE8 0x00000000 // Access Size: 8-bit
+#define CSW_SIZE16 0x00000001 // Access Size: 16-bit
+#define CSW_SIZE32 0x00000002 // Access Size: 32-bit
+#define CSW_ADDRINC 0x00000030 // Auto Address Increment Mask
+#define CSW_NADDRINC 0x00000000 // No Address Increment
+#define CSW_SADDRINC 0x00000010 // Single Address Increment
+#define CSW_PADDRINC 0x00000020 // Packed Address Increment
+#define CSW_DBGSTAT 0x00000040 // Debug Status
+#define CSW_TINPROG 0x00000080 // Transfer in progress
+#define CSW_HPROT 0x02000000 // User/Privilege Control
+#define CSW_MSTRTYPE 0x20000000 // Master Type Mask
+#define CSW_MSTRCORE 0x00000000 // Master Type: Core
+#define CSW_MSTRDBG 0x20000000 // Master Type: Debug
+#define CSW_RESERVED 0x01000000 // Reserved Value
+
+// Core Debug Register Address Offsets
+#define DBG_OFS 0x0DF0 // Debug Register Offset inside NVIC
+#define DBG_HCSR_OFS 0x00 // Debug Halting Control & Status Register
+#define DBG_CRSR_OFS 0x04 // Debug Core Register Selector Register
+#define DBG_CRDR_OFS 0x08 // Debug Core Register Data Register
+#define DBG_EMCR_OFS 0x0C // Debug Exception & Monitor Control Register
+
+// Core Debug Register Addresses
+#define DBG_HCSR (DBG_Addr + DBG_HCSR_OFS)
+#define DBG_CRSR (DBG_Addr + DBG_CRSR_OFS)
+#define DBG_CRDR (DBG_Addr + DBG_CRDR_OFS)
+#define DBG_EMCR (DBG_Addr + DBG_EMCR_OFS)
+
+// Debug Halting Control and Status Register definitions
+#define C_DEBUGEN 0x00000001 // Debug Enable
+#define C_HALT 0x00000002 // Halt
+#define C_STEP 0x00000004 // Step
+#define C_MASKINTS 0x00000008 // Mask Interrupts
+#define C_SNAPSTALL 0x00000020 // Snap Stall
+#define S_REGRDY 0x00010000 // Register R/W Ready Flag
+#define S_HALT 0x00020000 // Halt Flag
+#define S_SLEEP 0x00040000 // Sleep Flag
+#define S_LOCKUP 0x00080000 // Lockup Flag
+#define S_RETIRE_ST 0x01000000 // Sticky Retire Flag
+#define S_RESET_ST 0x02000000 // Sticky Reset Flag
+#define DBGKEY 0xA05F0000 // Debug Key
+
+// Debug Exception and Monitor Control Register definitions
+#define VC_CORERESET 0x00000001 // Reset Vector Catch
+#define VC_MMERR 0x00000010 // Debug Trap on MMU Fault
+#define VC_NOCPERR 0x00000020 // Debug Trap on No Coprocessor Fault
+#define VC_CHKERR 0x00000040 // Debug Trap on Checking Error Fault
+#define VC_STATERR 0x00000080 // Debug Trap on State Error Fault
+#define VC_BUSERR 0x00000100 // Debug Trap on Bus Error Fault
+#define VC_INTERR 0x00000200 // Debug Trap on Interrupt Error Fault
+#define VC_HARDERR 0x00000400 // Debug Trap on Hard Fault
+#define MON_EN 0x00010000 // Monitor Enable
+#define MON_PEND 0x00020000 // Monitor Pend
+#define MON_STEP 0x00040000 // Monitor Step
+#define MON_REQ 0x00080000 // Monitor Request
+#define TRCENA 0x01000000 // Trace Enable (DWT, ITM, ETM, TPIU)
+
+// NVIC: Interrupt Controller Type Register
+#define NVIC_ICT (NVIC_Addr + 0x0004)
+#define INTLINESNUM 0x0000001F // Interrupt Line Numbers
+
+// NVIC: CPUID Base Register
+#define NVIC_CPUID (NVIC_Addr + 0x0D00)
+#define CPUID_PARTNO 0x0000FFF0 // Part Number Mask
+#define CPUID_REVISION 0x0000000F // Revision Mask
+#define CPUID_VARIANT 0x00F00000 // Variant Mask
+
+// NVIC: Application Interrupt/Reset Control Register
+#define NVIC_AIRCR (NVIC_Addr + 0x0D0C)
+#define VECTRESET 0x00000001 // Reset Cortex-M (except Debug)
+#define VECTCLRACTIVE 0x00000002 // Clear Active Vector Bit
+#define SYSRESETREQ 0x00000004 // Reset System (except Debug)
+#define VECTKEY 0x05FA0000 // Write Key
+
+// NVIC: Debug Fault Status Register
+#define NVIC_DFSR (NVIC_Addr + 0x0D30)
+#define HALTED 0x00000001 // Halt Flag
+#define BKPT 0x00000002 // BKPT Flag
+#define DWTTRAP 0x00000004 // DWT Match
+#define VCATCH 0x00000008 // Vector Catch Flag
+#define EXTERNAL 0x00000010 // External Debug Request
+
+
+#endif
diff --git a/src/SWD_host/flash_blob.h b/src/SWD_host/flash_blob.h
new file mode 100644
index 0000000..36e74d6
--- /dev/null
+++ b/src/SWD_host/flash_blob.h
@@ -0,0 +1,33 @@
+#ifndef FLASH_BLOB_H
+#define FLASH_BLOB_H
+
+#include
+
+
+typedef struct {
+ uint32_t breakpoint;
+ uint32_t static_base;
+ uint32_t stack_pointer;
+} program_syscall_t;
+
+typedef struct {
+ const uint32_t init;
+ const uint32_t uninit;
+ const uint32_t erase_chip;
+ const uint32_t erase_sector;
+ const uint32_t program_page;
+ const program_syscall_t sys_call_s;
+ const uint32_t program_buffer;
+ const uint32_t algo_start;
+ const uint32_t algo_size;
+ const uint32_t *algo_blob;
+ const uint32_t program_buffer_size;
+} program_target_t;
+
+typedef struct {
+ const uint32_t start;
+ const uint32_t size;
+} sector_info_t;
+
+
+#endif