diff --git a/AsProgrammer/AsProgrammer.exe b/AsProgrammer/AsProgrammer.exe
new file mode 100644
index 0000000..ecda637
Binary files /dev/null and b/AsProgrammer/AsProgrammer.exe differ
diff --git a/AsProgrammer/CH341DLL.DLL b/AsProgrammer/CH341DLL.DLL
new file mode 100644
index 0000000..c9f2eb1
Binary files /dev/null and b/AsProgrammer/CH341DLL.DLL differ
diff --git a/AsProgrammer/Devices/FuseBits.xml b/AsProgrammer/Devices/FuseBits.xml
new file mode 100644
index 0000000..23de1ca
--- /dev/null
+++ b/AsProgrammer/Devices/FuseBits.xml
@@ -0,0 +1,435 @@
+
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ TA0SEL,BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ TA0SEL,BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ TA0SEL,BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BOOTRST,BOOTSZ0,BOOTSZ1,,PSCRV,PSC0RB,PSC1RB,PSC2RB
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BOOTRST,BOOTSZ0,BOOTSZ1,,PSCRV,PSC0RB,,PSC2RB
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ ,,,,,,,
+ ,,,,,,,
+ ,,,,,,,
+ ,LB1,LB2,,,,,
+
+
+ ,,,,,,,
+ ,,,,,,,
+ ,,,,,,,
+ ,LB1,LB2,,,,,
+
+
+ ,,,,,,,
+ RCEN,,,,,,,
+ ,,,,,,,
+ ,LB2,LB1,,,,,
+
+
+ ,,,,,,,
+ ,,,,,,,
+ ,,,,,,,
+ ,LB2,LB1,,,,,
+
+
+ ,,,,,,,
+ ,,,,,,,
+ ,,,,,,,
+ ,LB2,LB1,,,,,
+
+
+ ,,,,,,,
+ ,,,,,,,
+ ,,,,,,,
+ ,LB2,LB1,,,,,
+
+
+ ,,,,,,,
+ ,,,,,,,
+ ,,,,,,,
+ ,LB2,LB1,,,,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,HWBE,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,RSTDSBL,DWEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,HWBE,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,HWBE,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ WDTON,M103C,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,RSTDSBL,DWEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,HWBE,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ ,,,,,,,
+ CKSEL0,CKSEL1,CKSEL2,,SUT,,BOOTRST,
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ ,BODLEVEL0,BODLEVEL1,BODLEVEL2,M161C,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,,,,,
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,,,BODEN,BODLEVEL
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BOOTRST,BOOTSZ0,BOOTSZ1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BOOTRST,BOOTSZ0,BOOTSZ1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ ,BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,RSTDSBL,DWEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,HWBE,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,SPIEN,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,SPIEN,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ JTAGEN,OCDEN,,,,,,
+ CKSEL,SUT0,SUT1,BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ WDTON,M103C,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,JTAGEN,OCDEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ RSTDISBL,BODLEVEL0,BODLEVEL1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,WDTON,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,WDTON,,RSTDSBL,DWEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,HWBE,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,WDTON,S8515C
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,,WDTON,S8535C
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,BODEN,BODLEVEL
+ ,,,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BOOTRST,BOOTSZ0,BOOTSZ1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ BOOTRST,BOOTSZ0,BOOTSZ1,,,,,
+ LB1,LB2,BLB01,BLB02,BLB11,BLB12,,
+
+
+ ,,,,,,,
+ CKSEL0,CKSEL1,CKSEL2,RSTDISBL,FSTRT,,,
+ ,,,,,,,
+ ,LB1,LB2,,,,,
+
+
+ ,,,,,,,
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,RSTDISBL,SPIEN,BODEN,BODLEVEL
+ ,,,,,,,
+ ,LB1,LB2,,,,,
+
+
+ RSTDISBL,BODLEVEL0,BODLEVEL1,DWEN,SELFPRGEN,,,
+ CKSEL0,CKSEL1,SUT0,SUT1,CKDIV8,WDTON,EESAVE,
+ ,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ ,,,,,,,
+ CKSEL0,CKSEL1,,,RSTDISBL,SPIEN,BODEN,BODLEVEL
+ ,,,,,,,
+ ,LB1,LB2,,,,,
+
+
+ RSTDISBL,BODLEVEL0,BODLEVEL1,BODLEVEL2,WDTON,,EESAVE,DWEN
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODEN,BODLEVEL,EESAVE,,RSTDISBL,,,
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOPT,PLLCK
+ ,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,CKSEL2,CKSEL3,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
+ BODLEVEL0,BODLEVEL1,BODLEVEL2,EESAVE,WDTON,,DWEN,RSTDISBL
+ CKSEL0,CKSEL1,,,SUT0,SUT1,CKOUT,CKDIV8
+ SELFPRGEN,,,,,,,
+ LB1,LB2,,,,,,
+
+
diff --git a/AsProgrammer/Devices/StatBits.xml b/AsProgrammer/Devices/StatBits.xml
new file mode 100644
index 0000000..451b82a
--- /dev/null
+++ b/AsProgrammer/Devices/StatBits.xml
@@ -0,0 +1,224 @@
+
+
+
+
+
+ S0,S1,S2,S3,S4,S5,S6,S7
+ S8,S9,S10,S11,S12,S13,S14,S15
+ S16,S17,S18,S19,S20,S21,S22,S23
+
+
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,TB,SRP0
+ ,,,,,,,
+ ,,,,,,,
+
+
+
+
+ SP,Comp,Inv,BP0,BP1,BP2,,BPRWD
+ QE,,,,ECC-E,,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,ECC-S0,ECC-S1,CRBSY,
+
+
+ ,,,BP0,BP1,BP2,,BPRWD
+ QE,,,,ECC-E,,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,ECC-S0,ECC-S1,,
+
+
+ SP,Comp,Inv,BP0,BP1,BP2,,BPRWD
+ QE,,,,,,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,,,CRBSY,
+
+
+ SP,Comp,Inv,BP0,BP1,BP2,,BPRWD
+ QE,,,,,,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,,,,
+
+
+ SP,Comp,Inv,BP0,BP1,BP2,,BPRWD
+ QE,,,,,,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,,,,
+
+
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ,,WPS,,,DRV0,DRV1,HOLD/RST
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ADS,ADP,WPS,,,DRV0,DRV1,
+
+
+ BUSY,WEL,BP0,BP1,BP2,TB,SEC,SRP0
+ SRP1,QE,,LB1,LB2,LB3,CMP,SUS
+ ADS,ADP,WPS,,,DRV0,DRV1,
+
+
+ SRP1,WP-E,TB,BP0,BP1,BP2,BP3,SRP0
+ ,,,BUF,ECC-E,SR1-L,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,ECC-0,ECC-1,LUT-F,
+
+
+ SRP1,WP-E,TB,BP0,BP1,BP2,BP3,SRP0
+ ,,,BUF,ECC-E,SR1-L,OTP-E,OTP-L
+ BUSY,WEL,E-FAIL,P-FAIL,ECC-0,ECC-1,LUT-F,
+
+
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,,,,,,
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,SUS2,LB1,LB2,LB3,CMP,SUS1
+ ,,,,HPF,DRV0,DRV1,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,SUS2,LB1,LB2,LB3,CMP,SUS1
+ ,,,,HPF,DRV0,DRV1,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,SUS2,LB1,LB2,LB3,CMP,SUS1
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,SUS2,LB1,LB2,LB3,CMP,SUS1
+ ,,,,,,,
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,BP4,SRP0
+ SRP1,QE,SUS2,EN4B,LB2,LB3,CMP,SUS1
+ ,,,,,,,
+
+
+
+
+ BUSY,WEL,BP0,BP1,BP2,BP3,AAI,BPL
+ ,,,,,,,
+ ,,,,,,,
+
+
+
+
+
+
+ BUSY,WEL,BP0,BP1,,,,
+
+
+ BUSY,WEL,BP0,BP1,,,,SRWD
+
+
+ BUSY,WEL,BP0,BP1,,,,SRWD
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AsProgrammer/Drivers/CH341A/CH341A_setup.png b/AsProgrammer/Drivers/CH341A/CH341A_setup.png
new file mode 100644
index 0000000..84e96e8
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/CH341A_setup.png differ
diff --git a/AsProgrammer/Drivers/CH341A/CH341DLL.DLL b/AsProgrammer/Drivers/CH341A/CH341DLL.DLL
new file mode 100644
index 0000000..c9f2eb1
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/CH341DLL.DLL differ
diff --git a/AsProgrammer/Drivers/CH341A/CH341W64.SYS b/AsProgrammer/Drivers/CH341A/CH341W64.SYS
new file mode 100644
index 0000000..d890020
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/CH341W64.SYS differ
diff --git a/AsProgrammer/Drivers/CH341A/CH341WDM.CAT b/AsProgrammer/Drivers/CH341A/CH341WDM.CAT
new file mode 100644
index 0000000..9193156
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/CH341WDM.CAT differ
diff --git a/AsProgrammer/Drivers/CH341A/CH341WDM.INF b/AsProgrammer/Drivers/CH341A/CH341WDM.INF
new file mode 100644
index 0000000..df5f7ab
--- /dev/null
+++ b/AsProgrammer/Drivers/CH341A/CH341WDM.INF
@@ -0,0 +1,178 @@
+; CH341WDM.INF
+; Driver for CH341 (USB=>EPP/I2C/SPI... chip) V2.2
+; WDM for Windows 98/Me/2000/XP/Server2003/Vista/64bit Vista/Server2008/Win7/64bit Win7
+; Copyright (C) W.ch 2001-2009
+;
+
+[Version]
+Signature = "$Chicago$"
+Class = WCH
+ClassGuid = {77989ADF-06DB-4025-92E8-40D902C03B0A}
+Provider = %WinChipHead%
+DriverVer = 06/05/2009, 2.2.2009.06
+CatalogFile.NT = CH341WDM.CAT
+
+[ControlFlags]
+ExcludeFromSelect = USB\VID_1A86&PID_5512
+ExcludeFromSelect = USB\VID_4348&PID_5512
+;ExcludeFromSelect = USB\VID_1A86&PID_7523
+;ExcludeFromSelect = USB\VID_1A86&PID_5523
+;ExcludeFromSelect = USB\VID_4348&PID_5523
+;ExcludeFromSelect = USB\VID_4348&PID_5523&REV_0250
+
+[ClassInstall32]
+Addreg = WCHReg
+
+[ClassInstall]
+Addreg = WCHReg
+
+[WCHReg]
+HKR, , , 0, %ClassName%
+HKR, , Icon, , -5
+HKR, , NoInstallClass, , 1
+
+[Manufacturer]
+%WinChipHead% = WinChipHead,NT,NTamd64,NTia64
+
+[WinChipHead]
+%CH341A.DeviceDesc% = CH341.Install, USB\VID_1A86&PID_5512
+%CH341.DeviceDesc% = CH341.Install, USB\VID_4348&PID_5512
+;%CH340SER.DeviceDesc% = CH341.Install, USB\VID_1A86&PID_7523
+;%CH341ASER.DeviceDesc% = CH341.Install, USB\VID_1A86&PID_5523
+;%CH341SER.DeviceDesc% = CH341.Install, USB\VID_4348&PID_5523
+;%CH340SER.DeviceDesc% = CH341.Install, USB\VID_4348&PID_5523&REV_0250
+
+[WinChipHead.NT]
+%CH341A.DeviceDesc% = CH341.Install.NT, USB\VID_1A86&PID_5512
+%CH341.DeviceDesc% = CH341.Install.NT, USB\VID_4348&PID_5512
+;%CH340SER.DeviceDesc% = CH341.Install.NT.NTamd64, USB\VID_1A86&PID_7523
+;%CH341ASER.DeviceDesc% = CH341.Install.NT, USB\VID_1A86&PID_5523
+;%CH341SER.DeviceDesc% = CH341.Install.NT, USB\VID_4348&PID_5523
+;%CH340SER.DeviceDesc% = CH341.Install.NT, USB\VID_4348&PID_5523&REV_0250
+
+[WinChipHead.NTamd64]
+%CH341A.DeviceDesc% = CH341.Install.NTamd64, USB\VID_1A86&PID_5512
+%CH341.DeviceDesc% = CH341.Install.NTamd64, USB\VID_4348&PID_5512
+;%CH340SER.DeviceDesc% = CH341.Install.NTamd64, USB\VID_1A86&PID_7523
+;%CH341ASER.DeviceDesc% = CH341.Install.NTamd64, USB\VID_1A86&PID_5523
+;%CH341SER.DeviceDesc% = CH341.Install.NTamd64, USB\VID_4348&PID_5523
+;%CH340SER.DeviceDesc% = CH341.Install.NTamd64, USB\VID_4348&PID_5523&REV_0250
+
+[WinChipHead.NTia64]
+%CH341A.DeviceDesc% = CH341.Install.NTia64, USB\VID_1A86&PID_5512
+%CH341.DeviceDesc% = CH341.Install.NTia64, USB\VID_4348&PID_5512
+;%CH340SER.DeviceDesc% = CH341.Install.NTia64, USB\VID_1A86&PID_7523
+;%CH341ASER.DeviceDesc% = CH341.Install.NTia64, USB\VID_1A86&PID_5523
+;%CH341SER.DeviceDesc% = CH341.Install.NTia64, USB\VID_4348&PID_5523
+;%CH340SER.DeviceDesc% = CH341.Install.NTia64, USB\VID_4348&PID_5523&REV_0250
+
+[CH341.Install]
+CopyFiles = CH341.CopyFiles.SYS, CH341.CopyFiles.DLL
+AddReg = CH341.9X.AddReg, CH341.AddReg
+
+[CH341.Install.NT]
+CopyFiles = CH341.CopyFiles.SYS, CH341.CopyFiles.DLL
+AddReg = CH341.NT.AddReg, CH341.AddReg
+
+[CH341.Install.NTamd64]
+CopyFiles = CH341.CopyFiles.SYSA64, CH341.CopyFiles.DLL
+AddReg = CH341.NT.AddReg, CH341.AddReg
+
+[CH341.Install.NTia64]
+CopyFiles = CH341.CopyFiles.SYSI64, CH341.CopyFiles.DLL
+AddReg = CH341.NT.AddReg, CH341.AddReg
+
+[CH341.CopyFiles.SYS]
+CH341WDM.SYS, , , 2
+
+[CH341.CopyFiles.SYSA64]
+CH341W64.SYS, , , 2
+
+[CH341.CopyFiles.SYSI64]
+;CH341I64.SYS, , , 2
+
+[CH341.CopyFiles.DLL]
+CH341DLL.DLL, , , 2
+
+[CH341.9X.AddReg]
+HKR, , DevLoader, , *NTKERN
+HKR, , NTMPDriver, , CH341WDM.SYS
+
+[CH341.NT.AddReg]
+
+[CH341.AddReg]
+HKLM, SOFTWARE\WinChipHead\IC\CH341, WDM, 0x00010001, 0x00000022
+HKLM, SOFTWARE\WinChipHead\IC\CH341, DLL, 0x00010001, 0x00000021
+HKLM, SOFTWARE\WinChipHead\IC\CH341, Function, , "USB=>Parallel"
+
+[CH341.Install.NT.Services]
+AddService = CH341, 2, CH341.Service
+
+[CH341.Install.NTamd64.Services]
+AddService = CH341_A64, 2, CH341.ServiceA64
+
+[CH341.Install.NTia64.Services]
+AddService = CH341_I64, 2, CH341.ServiceI64
+
+[CH341.Service]
+DisplayName = "CH341WDM"
+ServiceType = 1
+StartType = 3
+ErrorControl = 1
+ServiceBinary = %10%\System32\Drivers\CH341WDM.SYS
+
+[CH341.ServiceA64]
+DisplayName = "CH341WDM_A64"
+ServiceType = 1
+StartType = 3
+ErrorControl = 1
+ServiceBinary = %10%\System32\Drivers\CH341W64.SYS
+
+[CH341.ServiceI64]
+DisplayName = "CH341WDM_I64"
+ServiceType = 1
+StartType = 3
+ErrorControl = 1
+ServiceBinary = %10%\System32\Drivers\CH341I64.SYS
+
+[DestinationDirs]
+DefaultDestDir = 10, System32\Drivers
+CH341.CopyFiles.DLL = 11
+CH341.CopyFiles.SYS = 10, System32\Drivers
+CH341.CopyFiles.SYSA64 = 10, System32\Drivers
+;CH341.CopyFiles.SYSI64 = 10, System32\Drivers
+
+[SourceDisksFiles]
+CH341WDM.SYS = 1
+CH341DLL.DLL = 1
+CH341W64.SYS = 1
+;CH341I64.SYS = 1
+
+[SourceDisksNames]
+1 = %DISK_NAME%, CH341WDM.SYS, ,
+
+[SourceDisksNames.amd64]
+1 = %DISK_NAME%, CH341W64.SYS, ,
+
+[SourceDisksNames.ia64]
+1 = %DISK_NAME%, CH341I64.SYS, ,
+
+[Strings]
+ClassName = "Interface"
+WinChipHead = "wch.cn"
+CH341.DeviceDesc = "USB-EPP/I2C... CH341"
+CH341A.DeviceDesc = "USB-EPP/I2C... CH341A"
+CH341SER.DeviceDesc = "USB-SERIAL CH341"
+CH340SER.DeviceDesc = "USB-SERIAL CH340"
+CH341ASER.DeviceDesc = "USB-SERIAL CH341A"
+DISK_NAME = "CH341 Parallel Installation Disk"
+
+[Strings.0804]
+ClassName = "ⲿӿ"
+WinChipHead = "wch.cn"
+CH341.DeviceDesc = "USB-EPP/I2C... CH341"
+CH341A.DeviceDesc = "USB-EPP/I2C... CH341A"
+CH341SER.DeviceDesc = "USB-SERIAL CH341"
+CH340SER.DeviceDesc = "USB-SERIAL CH340"
+CH341ASER.DeviceDesc = "USB-SERIAL CH341A"
+DISK_NAME = "CH341 Parallel Installation Disk"
diff --git a/AsProgrammer/Drivers/CH341A/CH341WDM.SYS b/AsProgrammer/Drivers/CH341A/CH341WDM.SYS
new file mode 100644
index 0000000..dbb47da
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/CH341WDM.SYS differ
diff --git a/AsProgrammer/Drivers/CH341A/DRVSETUP64/DRVSETUP64.exe b/AsProgrammer/Drivers/CH341A/DRVSETUP64/DRVSETUP64.exe
new file mode 100644
index 0000000..e262ef7
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/DRVSETUP64/DRVSETUP64.exe differ
diff --git a/AsProgrammer/Drivers/CH341A/SETUP.EXE b/AsProgrammer/Drivers/CH341A/SETUP.EXE
new file mode 100644
index 0000000..e3b8cca
Binary files /dev/null and b/AsProgrammer/Drivers/CH341A/SETUP.EXE differ
diff --git a/AsProgrammer/Drivers/ch341_jumper.jpg b/AsProgrammer/Drivers/ch341_jumper.jpg
new file mode 100644
index 0000000..9541f5c
Binary files /dev/null and b/AsProgrammer/Drivers/ch341_jumper.jpg differ
diff --git a/AsProgrammer/Khan Dish Network.txt b/AsProgrammer/Khan Dish Network.txt
new file mode 100644
index 0000000..9725af9
--- /dev/null
+++ b/AsProgrammer/Khan Dish Network.txt
@@ -0,0 +1,34 @@
+
+This file has been downloaded from khandishnetwork.com
+
+For More Software and Video Tutorials visit our website and youtube channel:
+
+
+ ### khandishnetwork.com ###
+
+
+ANDROID APP: https://play.google.com/store/apps/details?id=com.softwarebox.app
+
+
+Youtube Channel:
+
+ https://www.youtube.com/Ikram dirujii
+
+
+Facebook Page:
+
+ https://facebook.com/groups/khandishnetwork
+
+
+
+ )|(
+ (o o)
+ +-------------------------------ooO--(_)--oo-------------------------------------+
+ | |
+ | |
+ | All the files available on khandishnetwork.com are kept for educational |
+ | purpose only! |
+ | Nobody is responsible for any of the files stored on khandishnetwork.com, |
+ | their content can damage your system! |
+ | |
+ +--------------------------------------------------------------------------------+
\ No newline at end of file
diff --git a/AsProgrammer/Pinouts/ISP.gif b/AsProgrammer/Pinouts/ISP.gif
new file mode 100644
index 0000000..73b221d
Binary files /dev/null and b/AsProgrammer/Pinouts/ISP.gif differ
diff --git a/AsProgrammer/Pinouts/KB901x/kb9012pins.txt b/AsProgrammer/Pinouts/KB901x/kb9012pins.txt
new file mode 100644
index 0000000..09dcde3
--- /dev/null
+++ b/AsProgrammer/Pinouts/KB901x/kb9012pins.txt
@@ -0,0 +1,8 @@
+kb9012 -> UsbAsp
+
+59 EDI_CS -> CS(RST)
+60 EDI_CLK -> SCK
+61 EDI_DIN -> MOSI
+62 EDI_DO -> MISO
+
+42 TP_PLL_LOCK -> GND
\ No newline at end of file
diff --git a/AsProgrammer/Pinouts/schemeI2C.gif b/AsProgrammer/Pinouts/schemeI2C.gif
new file mode 100644
index 0000000..69968f2
Binary files /dev/null and b/AsProgrammer/Pinouts/schemeI2C.gif differ
diff --git a/AsProgrammer/Pinouts/schemeMW.gif b/AsProgrammer/Pinouts/schemeMW.gif
new file mode 100644
index 0000000..4fae3f9
Binary files /dev/null and b/AsProgrammer/Pinouts/schemeMW.gif differ
diff --git a/AsProgrammer/Pinouts/schemeSPI25.gif b/AsProgrammer/Pinouts/schemeSPI25.gif
new file mode 100644
index 0000000..874c823
Binary files /dev/null and b/AsProgrammer/Pinouts/schemeSPI25.gif differ
diff --git a/AsProgrammer/Pinouts/schemeSPI25_to_93Cxx.gif b/AsProgrammer/Pinouts/schemeSPI25_to_93Cxx.gif
new file mode 100644
index 0000000..71a2f18
Binary files /dev/null and b/AsProgrammer/Pinouts/schemeSPI25_to_93Cxx.gif differ
diff --git a/AsProgrammer/Pinouts/schemeSPI45.gif b/AsProgrammer/Pinouts/schemeSPI45.gif
new file mode 100644
index 0000000..39c3613
Binary files /dev/null and b/AsProgrammer/Pinouts/schemeSPI45.gif differ
diff --git a/AsProgrammer/chiplist.xml b/AsProgrammer/chiplist.xml
new file mode 100644
index 0000000..5f98f77
--- /dev/null
+++ b/AsProgrammer/chiplist.xml
@@ -0,0 +1,1002 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_25AA010A page="16" size="128" spicmd="95"/>
+ <_25AA020A page="16" size="256" spicmd="95"/>
+ <_25AA040 page="16" size="512" spicmd="95"/>
+ <_25AA040A page="16" size="512" spicmd="95"/>
+ <_25AA080 page="16" size="1024" spicmd="95"/>
+ <_25AA080A page="16" size="1024" spicmd="95"/>
+ <_25AA080B page="32" size="1024" spicmd="95"/>
+ <_25AA080C page="16" size="1024" spicmd="95"/>
+ <_25AA080D page="32" size="1024" spicmd="95"/>
+ <_25AA1024 page="256" size="131072" spicmd="95"/>
+ <_25AA128 page="64" size="16384" spicmd="95"/>
+ <_25AA160 page="16" size="2048" spicmd="95"/>
+ <_25AA160A page="16" size="2048" spicmd="95"/>
+ <_25AA160B page="32" size="2048" spicmd="95"/>
+ <_25AA256 page="64" size="32768" spicmd="95"/>
+ <_25AA320 page="32" size="4096" spicmd="95"/>
+ <_25AA512 page="128" size="65536" spicmd="95"/>
+ <_25AA640 page="32" size="8192" spicmd="95"/>
+ <_25C040 page="16" size="512" spicmd="95"/>
+ <_25C080 page="16" size="1024" spicmd="95"/>
+ <_25C160 page="16" size="2048" spicmd="95"/>
+ <_25C320 page="32" size="4096" spicmd="95"/>
+ <_25C640 page="32" size="8192" spicmd="95"/>
+ <_25LC010A page="16" size="128" spicmd="95"/>
+ <_25LC020A page="16" size="256" spicmd="95"/>
+ <_25LC040 page="16" size="512" spicmd="95"/>
+ <_25LC040A page="16" size="512" spicmd="95"/>
+ <_25LC080 page="16" size="1024" spicmd="95"/>
+ <_25LC080A page="16" size="1024" spicmd="95"/>
+ <_25LC080B page="32" size="1024" spicmd="95"/>
+ <_25LC080C page="16" size="1024" spicmd="95"/>
+ <_25LC080D page="32" size="1024" spicmd="95"/>
+ <_25LC128 page="64" size="16384" spicmd="95"/>
+ <_25LC160 page="16" size="2048" spicmd="95"/>
+ <_25LC160A page="16" size="2048" spicmd="95"/>
+ <_25LC160B page="32" size="2048" spicmd="95"/>
+ <_25LC320 page="32" size="4096" spicmd="95"/>
+ <_25LC640 page="32" size="8192" spicmd="95"/>
+ <_25LC256 page="64" size="32768" spicmd="95"/>
+ <_25LC512 page="128" size="65536" spicmd="95"/>
+ <_25LC1024 page="256" size="131072" spicmd="95"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_24LC515 page="64" size="65536" addrtype="5"/>
+ <_24LC1025 page="128" size="131072" addrtype="6"/>
+ <_24LC1026 page="128" size="131072" addrtype="6"/>
+
+
+
+
+
+
+ <_24C01 page="8" size="128" addrtype="1"/>
+ <_24C02 page="8" size="256" addrtype="1"/>
+ <_24C04 page="16" size="512" addrtype="2"/>
+ <_24C08 page="16" size="1024" addrtype="3"/>
+ <_24C16 page="16" size="2048" addrtype="4"/>
+ <_24C32 page="32" size="4096" addrtype="5"/>
+ <_24C64 page="32" size="8192" addrtype="5"/>
+ <_24C128 page="64" size="16384" addrtype="5"/>
+ <_24C256 page="64" size="32768" addrtype="5"/>
+ <_24C512 page="128" size="65536" addrtype="5"/>
+ <_24C1024 page="256" size="131072" addrtype="6"/>
+ <_24C2048 page="256" size="262144" addrtype="7"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AsProgrammer/lang/en.po b/AsProgrammer/lang/en.po
new file mode 100644
index 0000000..537c7bd
--- /dev/null
+++ b/AsProgrammer/lang/en.po
@@ -0,0 +1,681 @@
+#English
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: avrfuses.fus_str_msg
+msgid "AVR Fuses and Bit Lock "
+msgstr ""
+
+#: msgstr.str_45page_powerof2
+msgid "Page size is power of 2!"
+msgstr "Page size is power of 2!"
+
+#: msgstr.str_45page_std
+msgid "Default page size is set"
+msgstr "Default page size is set"
+
+#: msgstr.str_avr_init_error
+msgid "AVR initialisation failed"
+msgstr ""
+
+#: msgstr.str_block_en
+msgid "Possible protection is enabled. Press \"Unprotect\" and check datasheet"
+msgstr "Possible protection is enabled. Press \"Unprotect\" and check datasheet"
+
+#: msgstr.str_buff_empty
+msgid "No data in buffer"
+msgstr ""
+
+#: msgstr.str_changed
+msgid "Modified"
+msgstr "Modified"
+
+#: msgstr.str_changed_spi_speed
+msgid "Lower AVR SPI Speed"
+msgstr ""
+
+#: msgstr.str_check_settings
+msgid "Check settings"
+msgstr "Check settings"
+
+#: msgstr.str_choose_avr
+msgid "Choose an AVR Component in list"
+msgstr ""
+
+#: msgstr.str_choose_ic
+msgid "Choose a Component in list"
+msgstr ""
+
+#: msgstr.str_combo_warn
+msgid "IC will be erased and programmed. Continue?"
+msgstr "IC will be erased and programmed. Continue?"
+
+#: msgstr.str_connection_error
+msgid "Connecting Error "
+msgstr "Connecting Error "
+
+#: msgstr.str_curr_hw
+msgid "Current programmer: "
+msgstr "Current programmer: "
+
+#: msgstr.str_dlg_filechgd
+msgid "file modified"
+msgstr ""
+
+#: msgstr.str_dlg_fileext
+msgid "File |*.bin;*.hex|File |*.bin|File |*.hex|Files |*.*"
+msgstr ""
+
+#: msgstr.str_dlg_savefile
+msgid "Save changes?"
+msgstr "Save changes?"
+
+#: msgstr.str_done
+msgid "Done"
+msgstr "Done"
+
+#: msgstr.str_erase_notice
+msgid "The process can take more than a minute on large flash memories!"
+msgstr "The process can take more than a minute on large flash memories!"
+
+#: msgstr.str_erasing_flash
+msgid "Erasing memory..."
+msgstr "Erasing memory..."
+
+#: msgstr.str_fail
+msgid "Unsuccess"
+msgstr ""
+
+#: msgstr.str_goto_addr
+msgctxt "msgstr.str_goto_addr"
+msgid "Goto address"
+msgstr "Goto address"
+
+#: msgstr.str_chip_no_answer
+msgid "IC not responding"
+msgstr ""
+
+#: msgstr.str_id_unknown
+msgid "(Unknown ID)"
+msgstr "(Unknown ID)"
+
+#: msgstr.str_mini_eeprom_support
+msgid "This firmware do not support I2C and 93Cxx"
+msgstr "This firmware do not support I2C and 93Cxx"
+
+#: msgstr.str_new_sreg
+msgid "New SREG: "
+msgstr "New SREG: "
+
+#: msgstr.str_not_found_hex
+msgid "Value not found"
+msgstr "Value not found"
+
+#: msgstr.str_no_eeprom_support
+msgid "This firmware do not support memory programming"
+msgstr "This firmware do not support memory programming"
+
+#: msgstr.str_no_hardw_support
+msgid "This hardware is not supported!"
+msgstr ""
+
+#: msgstr.str_old_sreg
+msgid "Old SREG: "
+msgstr "Old SREG: "
+
+#: msgstr.str_reading_flash
+msgid "Reading memory..."
+msgstr "Reading memory..."
+
+#: msgstr.str_script_no_section
+msgid "There is no section: "
+msgstr "There is no section: "
+
+#: msgstr.str_script_run_section
+msgid "Runs section: "
+msgstr "Runs section: "
+
+#: msgstr.str_script_sel_section
+msgid "Select section"
+msgstr "Select section"
+
+#: msgstr.str_search_hex
+msgid "Search HEX value"
+msgstr "Search HEX value"
+
+#: msgstr.str_sel_chip
+msgid "Selected CHIP: "
+msgstr ""
+
+#: msgstr.str_set_speed_error
+msgid "Error setting SPI speed"
+msgstr "Error setting SPI speed"
+
+#: msgstr.str_size
+msgid "Size: "
+msgstr "Size: "
+
+#: msgstr.str_specify_hex
+msgid "Use HEX numbers"
+msgstr "Use HEX numbers"
+
+#: msgstr.str_start_erase
+msgid "Erase IC?"
+msgstr "Erase IC?"
+
+#: msgstr.str_start_write
+msgid "Start programming?"
+msgstr ""
+
+#: msgstr.str_time
+msgid "Execution time: "
+msgstr "Execution time: "
+
+#: msgstr.str_success
+msgid "Success"
+msgstr ""
+
+#: msgstr.str_usb_timeout
+msgid "USB_control_msg timeout!"
+msgstr "USB_control_msg timeout!"
+
+#: msgstr.str_user_cancel
+msgid "Canceled by user"
+msgstr "Canceled by user"
+
+#: msgstr.str_using_script
+msgid "Script: "
+msgstr "Script: "
+
+#: msgstr.str_verify
+msgid "Verify memory..."
+msgstr "Verify memory..."
+
+#: msgstr.str_verify_error
+msgid "Verification error on address: "
+msgstr "Verification error on address: "
+
+#: msgstr.str_writing_flash
+msgid "Programming memory..."
+msgstr "Programming memory..."
+
+#: msgstr.str_writing_flash_wchk
+msgid "Programming memory(verifying)..."
+msgstr "Programming memory(verifying)..."
+
+#: msgstr.str_wrong_bytes_read
+msgid "Number of bytes readed not equal IC size"
+msgstr "Number of bytes readed not equal IC size"
+
+#: msgstr.str_wrong_bytes_write
+msgid "Number of written bytes not equal IC size"
+msgstr "Number of written bytes not equal IC size"
+
+#: msgstr.str_wrong_file_size
+msgid "File size larger than IC size"
+msgstr "File size larger than IC size"
+
+#: search.sfound
+msgid "Found: "
+msgstr ""
+
+#: search.sreplaced
+msgid "Replaced: "
+msgstr ""
+
+#: tavrfusesform.btcancel.caption
+msgctxt "tavrfusesform.btcancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tavrfusesform.btfusecalc.caption
+msgid "Fus Calc"
+msgstr ""
+
+#: tavrfusesform.btloaddeffuses.caption
+msgid "Load Default"
+msgstr ""
+
+#: tavrfusesform.btreadfuses.caption
+msgid "Read"
+msgstr ""
+
+#: tavrfusesform.btwritefuses.caption
+msgid "Write"
+msgstr ""
+
+#: tavrfusesform.fuseextgroup.caption
+msgid "Extended Fuse Byte"
+msgstr ""
+
+#: tavrfusesform.fusehighgroup.caption
+msgid "Fuse High Byte"
+msgstr ""
+
+#: tavrfusesform.fuselockgroup.caption
+msgid "Lock Bit Byte"
+msgstr ""
+
+#: tavrfusesform.fuselockgroup.hint
+msgctxt "tavrfusesform.fuselockgroup.hint"
+msgid "Read Only"
+msgstr ""
+
+#: tavrfusesform.fuselowgroup.caption
+msgid "Fuse Low Byte"
+msgstr ""
+
+#: tavrfusesform.lockencheckbox.caption
+msgid "Locked"
+msgstr ""
+
+#: tfillbuffform.bt16bits.caption
+msgid "Value (16Bits):"
+msgstr ""
+
+#: tfillbuffform.bt8bits.caption
+msgid "Value (8Bits):"
+msgstr ""
+
+#: tfillbuffform.btcancel.caption
+msgid "Cancel"
+msgstr ""
+
+#: tfillbuffform.btfillbuff.caption
+msgid "OK"
+msgstr ""
+
+#: tfillbuffform.btincr.caption
+msgid "Incremental values (00..FF)"
+msgstr ""
+
+#: tfillbuffform.btrandom.caption
+msgid "Random values"
+msgstr ""
+
+#: tfillbuffform.caption
+msgid "Fill Buffer"
+msgstr ""
+
+#: tfillbuffform.groupbox1.caption
+msgid "HEX Values"
+msgstr ""
+
+#: tfillbuffform.groupbox2.caption
+msgid "Limits"
+msgstr ""
+
+#: tfillbuffform.label2.caption
+msgid "Start Address:"
+msgstr "From:"
+
+#: tfillbuffform.label3.caption
+msgid "End Address:"
+msgstr "To:"
+
+#: tmainform.appbutton.hint
+msgid "Access Protection Page (APP)"
+msgstr ""
+
+#: tmainform.autoblankcheck.caption
+msgid "Blank Check"
+msgstr ""
+
+#: tmainform.autocheck.caption
+msgid "Verify"
+msgstr ""
+
+#: tmainform.autoclear.caption
+msgid "Erase"
+msgstr ""
+
+#: tmainform.autowrite.caption
+msgctxt "tmainform.autowrite.caption"
+msgid "Write"
+msgstr ""
+
+#: tmainform.avreepromtbutton.caption
+msgctxt "tmainform.avreepromtbutton.caption"
+msgid "EEPROM"
+msgstr ""
+
+#: tmainform.avrfusesbutton.caption
+msgctxt "tmainform.avrfusesbutton.caption"
+msgid "Fuses"
+msgstr ""
+
+#: tmainform.blankcheckmenuitem.caption
+msgid "BlankCheck"
+msgstr "Blank check"
+
+#: tmainform.buffermenuitem.caption
+msgid "Buffer"
+msgstr ""
+
+#: tmainform.buttonblock.hint
+msgid "Unprotect"
+msgstr "Unprotect"
+
+#: tmainform.buttoncancel.hint
+msgid "Cancel"
+msgstr "Cancel"
+
+#: tmainform.buttonerase.hint
+msgid "Erase IC"
+msgstr "Erase IC"
+
+#: tmainform.buttonopenfile.hint
+msgid "Open File"
+msgstr "Open File"
+
+#: tmainform.buttonread.hint
+msgctxt "tmainform.buttonread.hint"
+msgid "Read IC"
+msgstr "Read IC"
+
+#: tmainform.buttonreadid.hint
+msgid "Detect IC"
+msgstr "Detect Chip"
+
+#: tmainform.buttonsavefile.hint
+msgctxt "tmainform.buttonsavefile.hint"
+msgid "Save File"
+msgstr "Save"
+
+#: tmainform.buttonverify.hint
+msgid "Verify IC"
+msgstr "Verify IC"
+
+#: tmainform.buttonwrite.hint
+msgctxt "tmainform.buttonwrite.hint"
+msgid "Write IC"
+msgstr "Programm IC"
+
+#: tmainform.checkbox_i2c_a2.hint
+msgctxt "tmainform.checkbox_i2c_a2.hint"
+msgid "Set device address"
+msgstr ""
+
+#: tmainform.checkbox_i2c_byteread.caption
+msgid "R/W Byte by Byte"
+msgstr "R/W Byte by Byte"
+
+#: tmainform.checkbox_i2c_byteread.hint
+msgid "Read & Write, Byte by Byte"
+msgstr "Byte by Byte reading/writing"
+
+#: tmainform.clearlogmenuitem.caption
+msgid "Clear"
+msgstr "Clear"
+
+#: tmainform.comboaddrtype.hint
+msgid "Type of addressing"
+msgstr "Type of addressing"
+
+#: tmainform.comboboxavrspeed.hint
+msgid "AVR SPI frequency"
+msgstr ""
+
+#: tmainform.combochipsize.hint
+msgid "IC size in bytes"
+msgstr "IC size in bytes"
+
+#: tmainform.combomwbitlen.hint
+msgid "Address Lenght in bits"
+msgstr "Lenght of address in bits"
+
+#: tmainform.combopagesize.hint
+msgid "Write Page size"
+msgstr "Write Page size"
+
+#: tmainform.copylogmenuitem.caption
+msgctxt "tmainform.copylogmenuitem.caption"
+msgid "Copy"
+msgstr "Copy"
+
+#: tmainform.i2cavancedbutton.caption
+msgid "i2cAvanced"
+msgstr ""
+
+#: tmainform.labelpage.caption
+msgid "Page"
+msgstr "Page"
+
+#: tmainform.labelsize.caption
+msgid "Size"
+msgstr "Size"
+
+#: tmainform.labeltypead.caption
+msgid "Address type"
+msgstr "Address type"
+
+#: tmainform.i2cadvancedbutton.hint
+msgid "I2C advanced settings access"
+msgstr ""
+
+#: tmainform.labeladlength.caption
+msgid "Address lenght"
+msgstr "Address lenght"
+
+#: tmainform.labelspicmd.caption
+msgid "SPI Family"
+msgstr "SPI Family"
+
+#: tmainform.label_i2c_devaddr.caption
+msgid "Device address"
+msgstr "Device address"
+
+#: tmainform.menuarduinospiclock.caption
+msgid "Clock"
+msgstr "Clock"
+
+#: tmainform.menuavrispspiclock.caption
+msgid "Clock"
+msgstr "Clock"
+
+#: tmainform.menuchip.caption
+msgid "IC"
+msgstr "IC"
+
+#: tmainform.menuclearbuff.caption
+msgid "Clear the Buffer"
+msgstr "Clear Buffer(FF)"
+
+#: tmainform.menucopytoclip.caption
+msgctxt "tmainform.menucopytoclip.caption"
+msgid "Copy"
+msgstr "Copy"
+
+#: tmainform.menufile.caption
+msgid "File"
+msgstr "File"
+
+#: tmainform.menufileopen.caption
+msgid "Open"
+msgstr "Open"
+
+#: tmainform.menufilesave.caption
+msgid "Save"
+msgstr "Save"
+
+#: tmainform.menufillbuffer.caption
+msgid "Fill the Buffer"
+msgstr "Fill the Buffer"
+
+#: tmainform.menufindchip.caption
+msgctxt "tmainform.menufindchip.caption"
+msgid "Search"
+msgstr "Search"
+
+#: tmainform.menufindreplace.caption
+msgid "Search/Replace"
+msgstr ""
+
+#: tmainform.menugotooffset.caption
+msgctxt "tmainform.menugotooffset.caption"
+msgid "Goto address"
+msgstr "Goto address"
+
+#: tmainform.menuignorebusybit.caption
+msgid "Dont verify Busy bit"
+msgstr "Dont verify Busy bit"
+
+#: tmainform.menuitembenchmark.caption
+msgid "Benchmark"
+msgstr ""
+
+#: tmainform.menuitemeditsreg.caption
+msgid "Edit SREG"
+msgstr ""
+
+#: tmainform.menuitemhardware.caption
+msgid "Hardware"
+msgstr "Hardware"
+
+#: tmainform.menuitemreadsreg.caption
+msgid "Read SREG"
+msgstr "Read SREG"
+
+#: tmainform.menuloaddev.caption
+msgid "Load last device when starts"
+msgstr ""
+
+#: tmainform.menumicrowire.caption
+msgid "Microwire (soft)"
+msgstr ""
+
+#: tmainform.menumwclock.caption
+msgctxt "tmainform.menumwclock.caption"
+msgid "Clock"
+msgstr "Clock"
+
+#: tmainform.menuoptions.caption
+msgid "Options"
+msgstr "Options"
+
+#: tmainform.menupastefromclip.caption
+msgid "Paste"
+msgstr ""
+
+#: tmainform.menuskipff.caption
+msgid "Skip FF"
+msgstr "Skip FF"
+
+#: tmainform.menuspiclock.caption
+msgctxt "tmainform.menuspiclock.caption"
+msgid "Clock"
+msgstr "Clock"
+
+#: tmainform.mwswapbutton.caption
+msgid "Swap <-->"
+msgstr ""
+
+#: tmainform.mwswapbutton.hint
+msgid "Swap High and Low Bytes"
+msgstr ""
+
+#: tmainform.scriptsmenuitem.caption
+msgid "Скрипты"
+msgstr "Scripts"
+
+#: tmainform.swapbytes.caption
+msgid "Swap High and Low Bytes"
+msgstr ""
+
+#: tmainform.unprotbutton.caption
+msgid "UnProt"
+msgstr ""
+
+#: tmainform.unprotbutton.hint
+msgid "Removes protections in APP"
+msgstr ""
+
+#: tsearchform.caption
+msgctxt "tsearchform.caption"
+msgid "Search"
+msgstr "Search"
+
+#: tsearchform.casesensecheckbox.caption
+msgid "case sensitive"
+msgstr "case sensitive"
+
+#: tsearchform.findbutton.caption
+msgid "Search"
+msgstr "Search"
+
+#: tsearchform.hexcheckbox.caption
+msgid "Search HEX"
+msgstr "Search HEX"
+
+#: tsearchform.rcancelbutton.caption
+msgctxt "tsearchform.rcancelbutton.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tsearchform.replaceallbutton.caption
+msgid "Repl. All"
+msgstr "Repl. All"
+
+#: tsearchform.replacebutton.caption
+msgctxt "tsearchform.replacebutton.caption"
+msgid "Replace"
+msgstr "Replace"
+
+#: tsearchform.replacecheckbox.caption
+msgctxt "tsearchform.replacecheckbox.caption"
+msgid "Replace:"
+msgstr "Replace:"
+
+#: tsearchform.searchlabel.caption
+msgid "Search:"
+msgstr "Search:"
+
+#: tsregeditform.buttonreadsreg.caption
+msgctxt "tsregeditform.buttonreadsreg.caption"
+msgid "Read"
+msgstr "Read"
+
+#: tsregeditform.buttonwritesreg.caption
+msgctxt "tsregeditform.buttonwritesreg.caption"
+msgid "Write"
+msgstr "Write"
+
+#: tchipsearchform.caption
+msgid "Search IC"
+msgstr "Search IC"
+
+#: tchipsearchform.label1.caption
+msgid "Content:"
+msgstr "Content:"
+
+#: tchipsearchform.ChipSearchSelectButton.caption
+msgid "Select IC"
+msgstr "Select IC"
+
+#: msgstr.str_dlg_filechgd
+msgid "File modified"
+msgstr "File modified"
+
+#: tscripteditform.menuitemfile.caption
+msgid "File"
+msgstr "File"
+
+#: tscripteditform.menuitemopen.caption
+msgid "Open"
+msgstr "Open"
+
+#: tscripteditform.menuitemrun.caption
+msgid "Execute"
+msgstr "Execute"
+
+#: tscripteditform.menuitemsave.caption
+msgid "Save"
+msgstr "Save"
+
+#: tscripteditform.menuitemsaveas.caption
+msgid "Save as..."
+msgstr "Save as..."
+
+#: tscripteditform.menuitemsection.caption
+msgid "Section ="
+msgstr "Section ="
diff --git a/AsProgrammer/lang/fr.po b/AsProgrammer/lang/fr.po
new file mode 100644
index 0000000..7151d72
--- /dev/null
+++ b/AsProgrammer/lang/fr.po
@@ -0,0 +1,681 @@
+#French
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: avrfuses.fus_str_msg
+msgid "AVR Fuses and Bit Lock "
+msgstr ""
+
+#: msgstr.str_45page_powerof2
+msgid "Page size is power of 2!"
+msgstr "La taille de la page est définie sur un multiple de deux!"
+
+#: msgstr.str_45page_std
+msgid "Page size is power of 2!"
+msgstr "La taille de page par défaut est définie."
+
+#: msgstr.str_avr_init_error
+msgid "AVR initialisation failed"
+msgstr "Echec initialisation AVR"
+
+#: msgstr.str_block_en
+msgid "Possible protection is enabled. Press \"Unprotect\" and check datasheet"
+msgstr "Peut-être protection en écriture. Cliquez sur "Supprimer la protection" et vérifiez la fiche technique."
+
+#: msgstr.str_buff_empty
+msgid "No data in buffer"
+msgstr "Buffer vide"
+
+#: msgstr.str_changed
+msgid "Modified"
+msgstr "Changé(s)"
+
+#: msgstr.str_changed_spi_speed
+msgid "Lower AVR SPI Speed"
+msgstr "Abaissement fréquence SPI AVR"
+
+#: msgstr.str_check_settings
+msgid "Check settings"
+msgstr "Vérifier les paramètres"
+
+#: msgstr.str_choose_avr
+msgid "Choose an AVR Component in list"
+msgstr "Choisissez un AVR"
+
+#: msgstr.str_choose_ic
+msgid "Choose a Component in list"
+msgstr "Choisissez un composant"
+
+#: msgstr.str_combo_warn
+msgid "IC will be erased and programmed. Continue?"
+msgstr "La puce sera effacée et écrasée. Continuer?"
+
+#: msgstr.str_connection_error
+msgid "Connecting Error "
+msgstr "Erreur de connexion "
+
+#: msgstr.str_curr_hw
+msgid "Current programmer: "
+msgstr "Programmeur actuel: "
+
+#: msgstr.str_dlg_filechgd
+msgid "file modified"
+msgstr "Fichier modifié"
+
+#: msgstr.str_dlg_fileext
+msgid "File |*.bin;*.hex|File |*.bin|File |*.hex|Files |*.*"
+msgstr "Fichier |*.bin;*.hex|Fichier |*.bin|Fichier |*.hex|Fichiers |*.*"
+
+#: msgstr.str_dlg_savefile
+msgid "Save changes?"
+msgstr "Sauvegarder les changements?""
+
+#: msgstr.str_done
+msgid "Done"
+msgstr "Fait"
+
+#: msgstr.str_erase_notice
+msgid "The process can take more than a minute on large flash memories!"
+msgstr "Le processus peut prendre plus d’une minute sur de grandes mémoires flash!"
+
+#: msgstr.str_erasing_flash
+msgid "Erasing memory..."
+msgstr "Effacement..."
+
+#: msgstr.str_fail
+msgid "Unsuccess"
+msgstr "Echec"
+
+#: msgstr.str_goto_addr
+msgctxt "msgstr.str_goto_addr"
+msgid "Goto address"
+msgstr "Aller à l'addresse"
+
+#: msgstr.str_chip_no_answer
+msgid "IC not responding"
+msgstr "La puce ne répond pas"
+
+#: msgstr.str_id_unknown
+msgid "(Unknown ID)"
+msgstr "(ID Iconnu)"
+
+#: msgstr.str_mini_eeprom_support
+msgid "This firmware do not support I2C and 93Cxx"
+msgstr "Ce firmware ne supporte pas I2C et 93Cxx!"
+
+#: msgstr.str_new_sreg
+msgid "New SREG: "
+msgstr "Nouveau SREG: "
+
+#: msgstr.str_not_found_hex
+msgid "Value not found"
+msgstr "Valeur non trouvée"
+
+#: msgstr.str_no_eeprom_support
+msgid "This firmware do not support memory programming"
+msgstr "Ce firmware n'est pas supporté!"
+
+#: msgstr.str_no_hardw_support
+msgid "This hardware is not supported!"
+msgstr "Ce matériel n'est pas supporté!"
+
+#: msgstr.str_old_sreg
+msgid "Old SREG: "
+msgstr "Ancien SREG: "
+
+#: msgstr.str_reading_flash
+msgid "Reading memory..."
+msgstr "Lecture memoire..."
+
+#: msgstr.str_script_no_section
+msgid "There is no section: "
+msgstr "Il n'y a pas de section: "
+
+#: msgstr.str_script_run_section
+msgid "Runs section: "
+msgstr "Section en cours: "
+
+#: msgstr.str_script_sel_section
+msgid "Select section"
+msgstr "Choisissez une section"
+
+#: msgstr.str_search_hex
+msgid "Search HEX value"
+msgstr "Recherche valeur HEX"
+
+#: msgstr.str_sel_chip
+msgid "Selected CHIP: "
+msgstr "CHIP sélectionné: "
+
+#: msgstr.str_set_speed_error
+msgid "Error setting SPI speed"
+msgstr "Erreur de réglage de la vitesse SPI"
+
+#: msgstr.str_size
+msgid "Size: "
+msgstr "Taille: "
+
+#: msgstr.str_specify_hex
+msgid "Use HEX numbers"
+msgstr "Spécifiez les nombres hexadécimaux"
+
+#: msgstr.str_start_erase
+msgid "Erase IC?"
+msgstr "Effacement IC?"
+
+#: msgstr.str_start_write
+msgid "Start programming?"
+msgstr "Commencer la programmation?"
+
+#: msgstr.str_time
+msgid "Execution time: "
+msgstr "Délai d'exécution: "
+
+#: msgstr.str_success
+msgid "Success"
+msgstr "Succès"
+
+#: msgstr.str_usb_timeout
+msgid "USB_control_msg timeout!"
+msgstr "USB_control_msg est tombé en fin de timeout!"
+
+#: msgstr.str_user_cancel
+msgid "Canceled by user"
+msgstr "Interrompu par l'utilisateur"
+
+#: msgstr.str_using_script
+msgid "Canceled by user"
+msgstr "Script utilisé: "
+
+#: msgstr.str_verify
+msgid "Verify memory..."
+msgstr "Verification memoire..."
+
+#: msgstr.str_verify_error
+msgid "Verification error on address: "
+msgstr "Erreur de comparaison à: "
+
+#: msgstr.str_writing_flash
+msgid "Programming memory..."
+msgstr "Ecriture memoire..."
+
+#: msgstr.str_writing_flash_wchk
+msgid "Programming memory(verifying)..."
+msgstr "Ecriture memoire(verification)..."
+
+#: msgstr.str_wrong_bytes_read
+msgid "Number of bytes readed not equal IC size"
+msgstr "Le nombre d'octets lus n'est pas égal à la taille de la puce"
+
+#: msgstr.str_wrong_bytes_write
+msgid "Number of written bytes not equal IC size"
+msgstr "Le nombre d'octets écrits n'est pas égal à la taille de la puce"
+
+#: msgstr.str_wrong_file_size
+msgid "File size larger than IC size"
+msgstr "Taille de fichier supérieure à la taille de la puce"
+
+#: search.sfound
+msgid "Found: "
+msgstr "Trouvé: "
+
+#: search.sreplaced
+msgid "Replaced: "
+msgstr "Remplacé"
+
+#: tavrfusesform.btcancel.caption
+msgctxt "tavrfusesform.btcancel.caption"
+msgid "Cancel"
+msgstr "Abandon"
+
+#: tavrfusesform.btfusecalc.caption
+msgid "Fus Calc"
+msgstr ""
+
+#: tavrfusesform.btloaddeffuses.caption
+msgid "Load Default"
+msgstr ""
+
+#: tavrfusesform.btreadfuses.caption
+msgid "Read"
+msgstr "Lecture"
+
+#: tavrfusesform.btwritefuses.caption
+msgid "Write"
+msgstr "Ecriture"
+
+#: tavrfusesform.fuseextgroup.caption
+msgid "Extended Fuse Byte"
+msgstr ""
+
+#: tavrfusesform.fusehighgroup.caption
+msgid "Fuse High Byte"
+msgstr ""
+
+#: tavrfusesform.fuselockgroup.caption
+msgid "Lock Bit Byte"
+msgstr ""
+
+#: tavrfusesform.fuselockgroup.hint
+msgctxt "tavrfusesform.fuselockgroup.hint"
+msgid "Read Only"
+msgstr "Lecture seule"
+
+#: tavrfusesform.fuselowgroup.caption
+msgid "Fuse Low Byte"
+msgstr ""
+
+#: tavrfusesform.lockencheckbox.caption
+msgid "Locked"
+msgstr ""
+
+#: tfillbuffform.bt16bits.caption
+msgid "Value (16Bits):"
+msgstr "Valeur (16Bits):"
+
+#: tfillbuffform.bt8bits.caption
+msgid "Value (8Bits):"
+msgstr "Valeur (8Bits):"
+
+#: tfillbuffform.btcancel.caption
+msgid "Cancel"
+msgstr "Abandon"
+
+#: tfillbuffform.btfillbuff.caption
+msgid "OK"
+msgstr ""
+
+#: tfillbuffform.btincr.caption
+msgid "Incremental values (00..FF)"
+msgstr "Valeurs incrémentales (00..FF)"
+
+#: tfillbuffform.btrandom.caption
+msgid "Random values"
+msgstr "Valeurs aléatoires"
+
+#: tfillbuffform.caption
+msgid "Fill Buffer"
+msgstr "Emplir le Buffer"
+
+#: tfillbuffform.groupbox1.caption
+msgid "HEX Values"
+msgstr ""
+
+#: tfillbuffform.groupbox2.caption
+msgid "Limits"
+msgstr ""
+
+#: tfillbuffform.label2.caption
+msgid "Start Address:"
+msgstr "Addresse debut:"
+
+#: tfillbuffform.label3.caption
+msgid "End Address:"
+msgstr "Addresse Fin:"
+
+#: tmainform.appbutton.hint
+msgid "Access Protection Page (APP)"
+msgstr ""
+
+#: tmainform.autoblankcheck.caption
+msgid "Blank Check"
+msgstr "Test effacement"
+
+#: tmainform.autocheck.caption
+msgid "Verify"
+msgstr "Verifier"
+
+#: tmainform.autoclear.caption
+msgid "Erase"
+msgstr "Effacement"
+
+#: tmainform.autowrite.caption
+msgctxt "tmainform.autowrite.caption"
+msgid "Write"
+msgstr "Ecrire"
+
+#: tmainform.avreepromtbutton.caption
+msgctxt "tmainform.avreepromtbutton.caption"
+msgid "EEPROM"
+msgstr ""
+
+#: tmainform.avrfusesbutton.caption
+msgctxt "tmainform.avrfusesbutton.caption"
+msgid "Fuses"
+msgstr ""
+
+#: tmainform.blankcheckmenuitem.caption
+msgid "BlankCheck"
+msgstr "Vérification effacement"
+
+#: tmainform.buffermenuitem.caption
+msgid "Buffer"
+msgstr ""
+
+#: tmainform.buttonblock.hint
+msgid "Unprotect"
+msgstr "Supprimer la protection"
+
+#: tmainform.buttoncancel.hint
+msgid "Cancel"
+msgstr "Abandonner"
+
+#: tmainform.buttonerase.hint
+msgid "Erase IC"
+msgstr "Effacement IC"
+
+#: tmainform.buttonopenfile.hint
+msgid "Open File"
+msgstr "Ouvrir"
+
+#: tmainform.buttonread.hint
+msgctxt "tmainform.buttonread.hint"
+msgid "Read IC"
+msgstr "Lecture IC"
+
+#: tmainform.buttonreadid.hint
+msgid "Detect IC"
+msgstr "Detecter Chip"
+
+#: tmainform.buttonsavefile.hint
+msgctxt "tmainform.buttonsavefile.hint"
+msgid "Save File"
+msgstr "Sauver"
+
+#: tmainform.buttonverify.hint
+msgid "Verify IC"
+msgstr "Verification IC"
+
+#: tmainform.buttonwrite.hint
+msgctxt "tmainform.buttonwrite.hint"
+msgid "Write IC"
+msgstr "Programmer IC"
+
+#: tmainform.checkbox_i2c_a2.hint
+msgctxt "tmainform.checkbox_i2c_a2.hint"
+msgid "Set device address"
+msgstr ""
+
+#: tmainform.checkbox_i2c_byteread.caption
+msgid "R/W Byte by Byte"
+msgstr "Lect. Ecr. par octet"
+
+#: tmainform.checkbox_i2c_byteread.hint
+msgid "Read & Write, Byte by Byte"
+msgstr "Lecture/écriture octet par octet"
+
+#: tmainform.clearlogmenuitem.caption
+msgid "Clear"
+msgstr "Effacer"
+
+#: tmainform.comboaddrtype.hint
+msgid "Type of addressing"
+msgstr "Type d'adressage mémoire"
+
+#: tmainform.comboboxavrspeed.hint
+msgid "AVR SPI frequency"
+msgstr "Fréquence SPI AVR"
+
+#: tmainform.combochipsize.hint
+msgid "IC size in bytes"
+msgstr "Taille IC en bytes"
+
+#: tmainform.combomwbitlen.hint
+msgid "Address Lenght in bits"
+msgstr "Longueur d'adresse en bits"
+
+#: tmainform.combopagesize.hint
+msgid "Write Page size"
+msgstr "Taille de la page en écriture"
+
+#: tmainform.copylogmenuitem.caption
+msgctxt "tmainform.copylogmenuitem.caption"
+msgid "Copy"
+msgstr "Copier"
+
+#: tmainform.i2cavancedbutton.caption
+msgid "i2cAvanced"
+msgstr ""
+
+#: tmainform.labelpage.caption
+msgid "Page"
+msgstr "Page"
+
+#: tmainform.labelsize.caption
+msgid "Size"
+msgstr "Taille"
+
+#: tmainform.labeltypead.caption
+msgid "Address type"
+msgstr "Type d'adresse"
+
+#: tmainform.i2cadvancedbutton.hint
+msgid "I2C advanced settings access"
+msgstr "Accès aux paramètres avancés I2C"
+
+#: tmainform.labeladlength.caption
+msgid "Address lenght"
+msgstr "Longueur adresse"
+
+#: tmainform.labelspicmd.caption
+msgid "SPI Family"
+msgstr "SPI famille"
+
+#: tmainform.label_i2c_devaddr.caption
+msgid "Device address"
+msgstr "Device Address"
+
+#: tmainform.menuarduinospiclock.caption
+msgid "Clock"
+msgstr "Fréquence"
+
+#: tmainform.menuavrispspiclock.caption
+msgid "Clock"
+msgstr "Fréquence"
+
+#: tmainform.menuchip.caption
+msgid "IC"
+msgstr "IC"
+
+#: tmainform.menuclearbuff.caption
+msgid "Clear the Buffer"
+msgstr "RaZ Buffer"
+
+#: tmainform.menucopytoclip.caption
+msgctxt "tmainform.menucopytoclip.caption"
+msgid "Copy"
+msgstr "Copier"
+
+#: tmainform.menufile.caption
+msgid "File"
+msgstr "Fichier"
+
+#: tmainform.menufileopen.caption
+msgid "Open"
+msgstr "Ouvrir"
+
+#: tmainform.menufilesave.caption
+msgid "Save"
+msgstr "Sauver"
+
+#: tmainform.menufillbuffer.caption
+msgid "Fill the Buffer"
+msgstr "Emplir le Buffer"
+
+#: tmainform.menufindchip.caption
+msgctxt "tmainform.menufindchip.caption"
+msgid "Search"
+msgstr "Recherche"
+
+#: tmainform.menufindreplace.caption
+msgid "Search/Replace"
+msgstr "Trouver/Rempl."
+
+#: tmainform.menugotooffset.caption
+msgctxt "tmainform.menugotooffset.caption"
+msgid "Goto address"
+msgstr "Aller à l'adresse"
+
+#: tmainform.menuignorebusybit.caption
+msgid "Dont verify Busy bit"
+msgstr "Ne pas vérifier le Busy bit"
+
+#: tmainform.menuitembenchmark.caption
+msgid "Benchmark"
+msgstr ""
+
+#: tmainform.menuitemeditsreg.caption
+msgid "Edit SREG"
+msgstr "Edition SREG"
+
+#: tmainform.menuitemhardware.caption
+msgid "Hardware"
+msgstr "Matériel"
+
+#: tmainform.menuitemreadsreg.caption
+msgid "Read SREG"
+msgstr "Lecture SREG"
+
+#: tmainform.menuloaddev.caption
+msgid "Load last device when starts"
+msgstr "Utiliser le dernier composant au démarrage"
+
+#: tmainform.menumicrowire.caption
+msgid "Microwire (soft)"
+msgstr ""
+
+#: tmainform.menumwclock.caption
+msgctxt "tmainform.menumwclock.caption"
+msgid "Clock"
+msgstr "Frequence"
+
+#: tmainform.menuoptions.caption
+msgid "Options"
+msgstr "Options"
+
+#: tmainform.menupastefromclip.caption
+msgid "Paste"
+msgstr "Coller"
+
+#: tmainform.menuskipff.caption
+msgid "Skip FF"
+msgstr "Ne pas écrire les FF"
+
+#: tmainform.menuspiclock.caption
+msgctxt "tmainform.menuspiclock.caption"
+msgid "Clock"
+msgstr "Fréqence"
+
+#: tmainform.mwswapbutton.caption
+msgid "Swap <-->"
+msgstr ""
+
+#: tmainform.mwswapbutton.hint
+msgid "Swap High and Low Bytes"
+msgstr "Permuter les bytes H et L"
+
+#: tmainform.scriptsmenuitem.caption
+msgid "Скрипты"
+msgstr "Scripts"
+
+#: tmainform.swapbytes.caption
+msgid "Swap High and Low Bytes"
+msgstr "Permuter les bytes H et L"
+
+#: tmainform.unprotbutton.caption
+msgid "UnProt"
+msgstr ""
+
+#: tmainform.unprotbutton.hint
+msgid "Removes protections in APP"
+msgstr "Raz protections APP"
+
+#: tsearchform.caption
+msgctxt "tsearchform.caption"
+msgid "Search"
+msgstr "Recherche"
+
+#: tsearchform.casesensecheckbox.caption
+msgid "case sensitive"
+msgstr "Sensible à la case"
+
+#: tsearchform.findbutton.caption
+msgid "Search"
+msgstr "Trouver"
+
+#: tsearchform.hexcheckbox.caption
+msgid "Search HEX"
+msgstr "Recherche HEX"
+
+#: tsearchform.rcancelbutton.caption
+msgctxt "tsearchform.rcancelbutton.caption"
+msgid "Cancel"
+msgstr "Abandon"
+
+#: tsearchform.replaceallbutton.caption
+msgid "Repl. All"
+msgstr "Rempl. Tout"
+
+#: tsearchform.replacebutton.caption
+msgctxt "tsearchform.replacebutton.caption"
+msgid "Replace"
+msgstr "Remplacer"
+
+#: tsearchform.replacecheckbox.caption
+msgctxt "tsearchform.replacecheckbox.caption"
+msgid "Replace"
+msgstr "Remplacer"
+
+#: tsearchform.searchlabel.caption
+msgid "Search:"
+msgstr "Rechercher:"
+
+#: tsregeditform.buttonreadsreg.caption
+msgctxt "tsregeditform.buttonreadsreg.caption"
+msgid "Read"
+msgstr "Lire"
+
+#: tsregeditform.buttonwritesreg.caption
+msgctxt "tsregeditform.buttonwritesreg.caption"
+msgid "Write"
+msgstr "Ecrire"
+
+#: tchipsearchform.caption
+msgid "Search IC"
+msgstr "Recherche IC"
+
+#: tchipsearchform.label1.caption
+msgid "Content:"
+msgstr "Le marquage contient:"
+
+#: tchipsearchform.ChipSearchSelectButton.caption
+msgid "Select IC"
+msgstr "Selectionner IC"
+
+#: msgstr.str_dlg_filechgd
+msgid "File"
+msgstr "Fichier modifié"
+
+#: tscripteditform.menuitemfile.caption
+msgid "File"
+msgstr "Fichier"
+
+#: tscripteditform.menuitemopen.caption
+msgid "Open"
+msgstr "Ouvrir"
+
+#: tscripteditform.menuitemrun.caption
+msgid "Execute"
+msgstr "Executer"
+
+#: tscripteditform.menuitemsave.caption
+msgid "Save"
+msgstr "Enregistrer"
+
+#: tscripteditform.menuitemsaveas.caption
+msgid "Save as..."
+msgstr "Enregistrer sous..."
+
+#: tscripteditform.menuitemsection.caption
+msgid "Section ="
+msgstr "Section ="
diff --git a/AsProgrammer/lang/ru.po b/AsProgrammer/lang/ru.po
new file mode 100644
index 0000000..22e8754
--- /dev/null
+++ b/AsProgrammer/lang/ru.po
@@ -0,0 +1,681 @@
+#Русский
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: avrfuses.fus_str_msg
+msgid "AVR Fuses and Bit Lock "
+msgstr ""
+
+#: msgstr.str_45page_powerof2
+msgid "Page size is power of 2!"
+msgstr "Установлен размер страницы кратный двум!"
+
+#: msgstr.str_45page_std
+msgid "Default page size is set"
+msgstr "Установлен стандартный размер страницы"
+
+#: msgstr.str_avr_init_error
+msgid "AVR initialisation failed"
+msgstr "Ошибка инициализации AVR"
+
+#: msgstr.str_block_en
+msgid "Possible protection is enabled. Press \"Unprotect\" and check datasheet"
+msgstr "Возможно включена защита на запись. Нажмите кнопку \"Снять защиту\" и сверьтесь с даташитом"
+
+#: msgstr.str_buff_empty
+msgid "No data in buffer"
+msgstr "Нет данных в буфере"
+
+#: msgstr.str_changed
+msgid "Modified"
+msgstr "Изменен"
+
+#: msgstr.str_changed_spi_speed
+msgid "Lower AVR SPI Speed"
+msgstr "Более низкая скорость AVR SPI"
+
+#: msgstr.str_check_settings
+msgid "Check settings"
+msgstr "Проверьте настройки"
+
+#: msgstr.str_choose_avr
+msgid "Choose an AVR Component in list"
+msgstr "выберите AVR в списке"
+
+#: msgstr.str_choose_ic
+msgid "Choose a Component in list"
+msgstr "выберите компонент в списке"
+
+#: msgstr.str_combo_warn
+msgid "IC will be erased and programmed. Continue?"
+msgstr "Чип будет стерт и перезаписан. Продолжить?"
+
+#: msgstr.str_connection_error
+msgid "Connecting Error "
+msgstr "Ошибка подключения к "
+
+#: msgstr.str_curr_hw
+msgid "Current programmer: "
+msgstr "Используется программатор: "
+
+#: msgstr.str_dlg_filechgd
+msgid "file modified"
+msgstr "файл изменён"
+
+#: msgstr.str_dlg_fileext
+msgid "File |*.bin;*.hex|File |*.bin|File |*.hex|Files |*.*"
+msgstr "файл |*.bin;*.hex|файл |*.bin|файл |*.hex|файлы |*.*"
+
+#: msgstr.str_dlg_savefile
+msgid "Save changes?"
+msgstr "Сохранить изменения?"
+
+#: msgstr.str_done
+msgid "Done"
+msgstr "Готово"
+
+#: msgstr.str_erase_notice
+msgid "The process can take more than a minute on large flash memories!"
+msgstr "Процесс может длиться больше минуты на больших флешках!"
+
+#: msgstr.str_erasing_flash
+msgid "Erasing memory..."
+msgstr "Стираю флэшку..."
+
+#: msgstr.str_fail
+msgid "Unsuccess"
+msgstr "неуспех"
+
+#: msgstr.str_goto_addr
+msgctxt "msgstr.str_goto_addr"
+msgid "Goto address"
+msgstr "Перейти по адресу"
+
+#: msgstr.str_chip_no_answer
+msgid "IC not responding"
+msgstr "Микросхема не отвечает"
+
+#: msgstr.str_id_unknown
+msgid "(Unknown ID)"
+msgstr "(Неизвестно)"
+
+#: msgstr.str_mini_eeprom_support
+msgid "This firmware do not support I2C and 93Cxx"
+msgstr "Данная версия прошивки не поддерживает I2C и MW!"
+
+#: msgstr.str_new_sreg
+msgid "New SREG: "
+msgstr "Стало Sreg: "
+
+#: msgstr.str_not_found_hex
+msgid "Value not found"
+msgstr "Значение не найдено"
+
+#: msgstr.str_no_eeprom_support
+msgid "This firmware do not support memory programming"
+msgstr "Данная версия прошивки не поддерживается!"
+
+#: msgstr.str_no_hardw_support
+msgid "This hardware is not supported!"
+msgstr "Это оборудование не поддерживается!"
+
+#: msgstr.str_old_sreg
+msgid "Old SREG: "
+msgstr "Было Sreg: "
+
+#: msgstr.str_reading_flash
+msgid "Reading memory..."
+msgstr "Читаю флэшку..."
+
+#: msgstr.str_script_no_section
+msgid "There is no section: "
+msgstr "Нет секции: "
+
+#: msgstr.str_script_run_section
+msgid "Runs section: "
+msgstr "Выполняется секция: "
+
+#: msgstr.str_script_sel_section
+msgid "Select section"
+msgstr "Выберите секцию"
+
+#: msgstr.str_search_hex
+msgid "Search HEX value"
+msgstr "Поиск HEX значения"
+
+#: msgstr.str_sel_chip
+msgid "Selected CHIP: "
+msgstr "выбранный микросхема: "
+
+#: msgstr.str_set_speed_error
+msgid "Error setting SPI speed"
+msgstr "Ошибка установки скорости SPI"
+
+#: msgstr.str_size
+msgid "Size: "
+msgstr "Размер: "
+
+#: msgstr.str_specify_hex
+msgid "Use HEX numbers"
+msgstr "Укажите шестнадцатеричные числа"
+
+#: msgstr.str_start_erase
+msgid "Erase IC?"
+msgstr "Точно стереть чип?"
+
+#: msgstr.str_start_write
+msgid "Start programming?"
+msgstr "Начать запись?"
+
+#: msgstr.str_time
+msgid "Execution time: "
+msgstr "Время выполнения: "
+
+#: msgstr.str_success
+msgid "Success"
+msgstr "успех"
+
+#: msgstr.str_usb_timeout
+msgid "USB_control_msg timeout!"
+msgstr "USB_control_msg отвалился по таймауту!"
+
+#: msgstr.str_user_cancel
+msgid "Canceled by user"
+msgstr "Прервано пользователем"
+
+#: msgstr.str_using_script
+msgid "Script: "
+msgstr "Используется скрипт: "
+
+#: msgstr.str_verify
+msgid "Verify memory..."
+msgstr "Проверяю флэшку..."
+
+#: msgstr.str_verify_error
+msgid "Verification error on address: "
+msgstr "Ошибка сравнения по адресу: "
+
+#: msgstr.str_writing_flash
+msgid "Записываю флэшку..."
+msgstr "Записываю флэшку..."
+
+#: msgstr.str_writing_flash_wchk
+msgid "Programming memory..."
+msgstr "Записываю флэшку с проверкой..."
+
+#: msgstr.str_wrong_bytes_read
+msgid "Number of bytes readed not equal IC size"
+msgstr "Количество прочитанных байт не равно размеру флэшки"
+
+#: msgstr.str_wrong_bytes_write
+msgid "Number of written bytes not equal IC size"
+msgstr "Количество записанных байт не равно размеру флэшки"
+
+#: msgstr.str_wrong_file_size
+msgid "File size larger than IC size"
+msgstr "Размер файла больше размера чипа"
+
+#: search.sfound
+msgid "Found: "
+msgstr "найденный: "
+
+#: search.sreplaced
+msgid "Replaced: "
+msgstr "Заменены: "
+
+#: tavrfusesform.btcancel.caption
+msgctxt "tavrfusesform.btcancel.caption"
+msgid "Cancel"
+msgstr "отменить"
+
+#: tavrfusesform.btfusecalc.caption
+msgid "Fus Calc"
+msgstr ""
+
+#: tavrfusesform.btloaddeffuses.caption
+msgid "Load Default"
+msgstr "умолчанию"
+
+#: tavrfusesform.btreadfuses.caption
+msgid "Read"
+msgstr "Читать"
+
+#: tavrfusesform.btwritefuses.caption
+msgid "Write"
+msgstr "Записать"
+
+#: tavrfusesform.fuseextgroup.caption
+msgid "Extended Fuse Byte"
+msgstr ""
+
+#: tavrfusesform.fusehighgroup.caption
+msgid "Fuse High Byte"
+msgstr ""
+
+#: tavrfusesform.fuselockgroup.caption
+msgid "Lock Bit Byte"
+msgstr ""
+
+#: tavrfusesform.fuselockgroup.hint
+msgctxt "tavrfusesform.fuselockgroup.hint"
+msgid "Read Only"
+msgstr "Режим только для чтения"
+
+#: tavrfusesform.fuselowgroup.caption
+msgid "Fuse Low Byte"
+msgstr ""
+
+#: tavrfusesform.lockencheckbox.caption
+msgid "Locked"
+msgstr ""
+
+#: tfillbuffform.bt16bits.caption
+msgid "Value (16Bits):"
+msgstr "значени (16Bits):"
+
+#: tfillbuffform.bt8bits.caption
+msgid "Value (8Bits):"
+msgstr "значени (8Bits):"
+
+#: tfillbuffform.btcancel.caption
+msgid "Cancel"
+msgstr "отменить"
+
+#: tfillbuffform.btfillbuff.caption
+msgid "OK"
+msgstr ""
+
+#: tfillbuffform.btincr.caption
+msgid "Incremental values (00..FF)"
+msgstr "Добавочные значения (00..FF)"
+
+#: tfillbuffform.btrandom.caption
+msgid "Random values"
+msgstr "Случайные значения"
+
+#: tfillbuffform.caption
+msgid "Fill Buffer"
+msgstr "Заполнить буфер"
+
+#: tfillbuffform.groupbox1.caption
+msgid "HEX Values"
+msgstr ""
+
+#: tfillbuffform.groupbox2.caption
+msgid "Limits"
+msgstr ""
+
+#: tfillbuffform.label2.caption
+msgid "Start Address:"
+msgstr "Начальный адрес:"
+
+#: tfillbuffform.label3.caption
+msgid "End Address:"
+msgstr "Конечный адрес:"
+
+#: tmainform.appbutton.hint
+msgid "Access Protection Page (APP)"
+msgstr ""
+
+#: tmainform.autoblankcheck.caption
+msgid "Blank Check"
+msgstr "Проверка на чистоту"
+
+#: tmainform.autocheck.caption
+msgid "Verify"
+msgstr "Сравнить содержимое"
+
+#: tmainform.autoclear.caption
+msgid "Erase"
+msgstr "Стереть"
+
+#: tmainform.autowrite.caption
+msgctxt "tmainform.autowrite.caption"
+msgid "Write"
+msgstr "Записать"
+
+#: tmainform.avreepromtbutton.caption
+msgctxt "tmainform.avreepromtbutton.caption"
+msgid "EEPROM"
+msgstr ""
+
+#: tmainform.avrfusesbutton.caption
+msgctxt "tmainform.avrfusesbutton.caption"
+msgid "Fuses"
+msgstr ""
+
+#: tmainform.blankcheckmenuitem.caption
+msgid "BlankCheck"
+msgstr "Проверка на чистоту"
+
+#: tmainform.buffermenuitem.caption
+msgid "Buffer"
+msgstr "буфер"
+
+#: tmainform.buttonblock.hint
+msgid "Unprotect"
+msgstr "Снять защиту"
+
+#: tmainform.buttoncancel.hint
+msgid "Cancel"
+msgstr "Прервать текущею операцию"
+
+#: tmainform.buttonerase.hint
+msgid "Erase IC"
+msgstr "Стереть"
+
+#: tmainform.buttonopenfile.hint
+msgid "Open File"
+msgstr "Открыть файл"
+
+#: tmainform.buttonread.hint
+msgctxt "tmainform.buttonread.hint"
+msgid "Read IC"
+msgstr "Читать чип"
+
+#: tmainform.buttonreadid.hint
+msgid "Detect IC"
+msgstr "Определить чип"
+
+#: tmainform.buttonsavefile.hint
+msgctxt "tmainform.buttonsavefile.hint"
+msgid "Save File"
+msgstr "Сохранить файл"
+
+#: tmainform.buttonverify.hint
+msgid "Verify IC"
+msgstr "Сравнить содержимое"
+
+#: tmainform.buttonwrite.hint
+msgctxt "tmainform.buttonwrite.hint"
+msgid "Write IC"
+msgstr "Записать"
+
+#: tmainform.checkbox_i2c_a2.hint
+msgctxt "tmainform.checkbox_i2c_a2.hint"
+msgid "Set device address"
+msgstr "Установить адрес устройства"
+
+#: tmainform.checkbox_i2c_byteread.caption
+msgid "R/W Byte by Byte"
+msgstr "Побайтовое чтение"
+
+#: tmainform.checkbox_i2c_byteread.hint
+msgid "Read & Write, Byte by Byte"
+msgstr "Читать байт за байтом"
+
+#: tmainform.clearlogmenuitem.caption
+msgid "Clear"
+msgstr "Очистить"
+
+#: tmainform.comboaddrtype.hint
+msgid "Type of addressing"
+msgstr "Тип адресации к памяти"
+
+#: tmainform.comboboxavrspeed.hint
+msgid "AVR SPI frequency"
+msgstr "SPI AVR частота"
+
+#: tmainform.combochipsize.hint
+msgid "IC size in bytes"
+msgstr "Размер чипа в байтах"
+
+#: tmainform.combomwbitlen.hint
+msgid "Address Lenght in bits"
+msgstr "Длинна адреса в битах"
+
+#: tmainform.combopagesize.hint
+msgid "Write Page size"
+msgstr "Размер страницы в письменном виде"
+
+#: tmainform.copylogmenuitem.caption
+msgctxt "tmainform.copylogmenuitem.caption"
+msgid "Copy"
+msgstr "Копировать"
+
+#: tmainform.i2cavancedbutton.caption
+msgid "i2cAvanced"
+msgstr ""
+
+#: tmainform.labelpage.caption
+msgid "Page"
+msgstr "Страница"
+
+#: tmainform.labelsize.caption
+msgid "Size"
+msgstr "Размер"
+
+#: tmainform.labeltypead.caption
+msgid "Address type"
+msgstr "Тип адреса"
+
+#: tmainform.i2cadvancedbutton.hint
+msgid "I2C advanced settings access"
+msgstr "Доступ к расширенным настройкам I2C"
+
+#: tmainform.labeladlength.caption
+msgid "Address lenght"
+msgstr "Длина адреса"
+
+#: tmainform.labelspicmd.caption
+msgid "SPI Family"
+msgstr "Команды SPI"
+
+#: tmainform.label_i2c_devaddr.caption
+msgid "Device address"
+msgstr "Адрес устройства"
+
+#: tmainform.menuarduinospiclock.caption
+msgid "Clock"
+msgstr "Частота"
+
+#: tmainform.menuavrispspiclock.caption
+msgid "Clock"
+msgstr "Частота"
+
+#: tmainform.menuchip.caption
+msgid "IC"
+msgstr "Микросхема"
+
+#: tmainform.menuclearbuff.caption
+msgid "Clear the Buffer"
+msgstr "Очистить буфер"
+
+#: tmainform.menucopytoclip.caption
+msgctxt "tmainform.menucopytoclip.caption"
+msgid "Copy"
+msgstr "Копировать"
+
+#: tmainform.menufile.caption
+msgid "File"
+msgstr "файл"
+
+#: tmainform.menufileopen.caption
+msgid "Open"
+msgstr "Открыть"
+
+#: tmainform.menufilesave.caption
+msgid "Save"
+msgstr "Сохранить"
+
+#: tmainform.menufillbuffer.caption
+msgid "Fill the Buffer""
+msgstr "Заполните буфер"
+
+#: tmainform.menufindchip.caption
+msgctxt "tmainform.menufindchip.caption"
+msgid "Search"
+msgstr "Поиск"
+
+#: tmainform.menufindreplace.caption
+msgid "Search/Replace"
+msgstr "Поиск"
+
+#: tmainform.menugotooffset.caption
+msgctxt "tmainform.menugotooffset.caption"
+msgid "Goto address"
+msgstr "Перейти по адресу"
+
+#: tmainform.menuignorebusybit.caption
+msgid "Dont verify Busy bit"
+msgstr "Не проверять Busy бит"
+
+#: tmainform.menuitembenchmark.caption
+msgid "Benchmark"
+msgstr ""
+
+#: tmainform.menuitemeditsreg.caption
+msgid "Edit SREG"
+msgstr "Изменить SREG"
+
+#: tmainform.menuitemhardware.caption
+msgid "Hardware"
+msgstr "Программатор"
+
+#: tmainform.menuitemreadsreg.caption
+msgid "Read SREG"
+msgstr "Прочитать SREG"
+
+#: tmainform.menuloaddev.caption
+msgid "Load last device when starts"
+msgstr "Используйте последний чип при запуске"
+
+
+#: tmainform.menumicrowire.caption
+msgid "Microwire (soft)"
+msgstr ""
+
+#: tmainform.menumwclock.caption
+msgctxt "tmainform.menumwclock.caption"
+msgid "Clock"
+msgstr "Частота"
+
+#: tmainform.menuoptions.caption
+msgid "Options"
+msgstr "Настройки"
+
+#: tmainform.menupastefromclip.caption
+msgid "Paste"
+msgstr "вставить"
+
+#: tmainform.menuskipff.caption
+msgid "Skip FF"
+msgstr "Не писать FF"
+
+#: tmainform.menuspiclock.caption
+msgctxt "tmainform.menuspiclock.caption"
+msgid "Clock"
+msgstr "Частота"
+
+#: tmainform.mwswapbutton.caption
+msgid "Swap <-->"
+msgstr ""
+
+#: tmainform.mwswapbutton.hint
+msgid "Swap High and Low Bytes"
+msgstr "Поменять местами байты High и Low"
+
+#: tmainform.scriptsmenuitem.caption
+msgid "Скрипты"
+msgstr "Скрипты"
+
+#: tmainform.swapbytes.caption
+msgid "Swap High and Low Bytes"
+msgstr "Поменять местами байты в буфере"
+
+#: tmainform.unprotbutton.caption
+msgid "UnProt"
+msgstr ""
+
+#: tmainform.unprotbutton.hint
+msgid "Removes protections in APP"
+msgstr "Снять защиту"
+
+#: tsearchform.caption
+msgctxt "tsearchform.caption"
+msgid "Search"
+msgstr "Поиск"
+
+#: tsearchform.casesensecheckbox.caption
+msgid "case sensitive"
+msgstr "Учитывать регистр"
+
+#: tsearchform.findbutton.caption
+msgid "Search"
+msgstr "Найти"
+
+#: tsearchform.hexcheckbox.caption
+msgid "Search HEX"
+msgstr "Искать HEX значение"
+
+#: tsearchform.rcancelbutton.caption
+msgctxt "tsearchform.rcancelbutton.caption"
+msgid "Cancel"
+msgstr "Прервать"
+
+#: tsearchform.replaceallbutton.caption
+msgid "Repl. All"
+msgstr "Отв. все"
+
+#: tsearchform.replacebutton.caption
+msgctxt "tsearchform.replacebutton.caption"
+msgid "Replace"
+msgstr "Заменить"
+
+#: tsearchform.replacecheckbox.caption
+msgid "Replace:"
+msgstr "Заменить:"
+
+#: tsearchform.searchlabel.caption
+msgid "Search:"
+msgstr "Искать:"
+
+#: tsregeditform.buttonreadsreg.caption
+msgctxt "tsregeditform.buttonreadsreg.caption"
+msgid "Read"
+msgstr "Прочитать"
+
+#: tsregeditform.buttonwritesreg.caption
+msgctxt "tsregeditform.buttonwritesreg.caption"
+msgid "Write"
+msgstr "Записать"
+
+#: tchipsearchform.caption
+msgid "Search IC"
+msgstr "Поиск микросхемы"
+
+#: tchipsearchform.label1.caption
+msgid "Content:"
+msgstr "Маркировка содержит:"
+
+#: tchipsearchform.ChipSearchSelectButton.caption
+msgid "Select IC"
+msgstr "Выбрать микросхему"
+
+#: msgstr.str_dlg_filechgd
+msgid "File modified"
+msgstr "файл изменён"
+
+#: tscripteditform.menuitemfile.caption
+msgid "File"
+msgstr "Файл"
+
+#: tscripteditform.menuitemopen.caption
+msgid "Open"
+msgstr "Открыть"
+
+#: tscripteditform.menuitemrun.caption
+msgid "Execute"
+msgstr "Выполнить"
+
+#: tscripteditform.menuitemsave.caption
+msgid "Save"
+msgstr "Сохранить"
+
+#: tscripteditform.menuitemsaveas.caption
+msgid "Save as..."
+msgstr "Сохранить как..."
+
+#: tscripteditform.menuitemsection.caption
+msgid "Section ="
+msgstr "Секция ="
diff --git a/AsProgrammer/libusb0.dll b/AsProgrammer/libusb0.dll
new file mode 100644
index 0000000..6e475b9
Binary files /dev/null and b/AsProgrammer/libusb0.dll differ
diff --git a/AsProgrammer/scripts/GD25Q64_128_SecRegisters.pas b/AsProgrammer/scripts/GD25Q64_128_SecRegisters.pas
new file mode 100644
index 0000000..d810ccb
--- /dev/null
+++ b/AsProgrammer/scripts/GD25Q64_128_SecRegisters.pas
@@ -0,0 +1,176 @@
+// designed for GIGADEVICE GD25Q64 and GD25Q128
+// READ / WRITE / ERASE Security REGISTERS
+// script can be adapted for other brand and models by changing 'RegSize' value in each section
+{$ READ_JEDEC_ID}
+begin
+ ID:= CreateByteArray(3);
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read JEDEC ID');
+
+ // read ID to test installation
+ SPIWrite (0, 1, $9F);
+ SPIRead(1, 3, ID);
+
+ logprint('Read ID: ' + inttohex((GetArrayItem(ID, 0)),2)+ inttohex((GetArrayItem(ID, 1)),2)+ inttohex((GetArrayItem(ID, 2)),2));
+ LogPrint ('End read JEDEC ID');
+ SPIExitProgMode ();
+end
+
+{$ READ_SECURITY_REGISTER_1_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read GD25Q64_128 security register #1');
+ RegSize :=1024;
+ // read register 1
+ SPIWrite (0, 5, $48, $00, $10, $00, $00);
+ SPIReadToEditor (1, RegSize);
+
+ LogPrint ('End read GD25Q64_128 security register #1');
+ SPIExitProgMode ();
+end
+
+{$ READ_SECURITY_REGISTER_2_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read GD25Q64_128 security register #2');
+ RegSize :=1024;
+ // read register 2
+ SPIWrite (0, 5, $48, $00, $20, $00, $00);
+ SPIReadToEditor (1, RegSize);
+
+ LogPrint ('End read GD25Q64_128 security register #2');
+ SPIExitProgMode ();
+end
+
+{$ READ_SECURITY_REGISTER_3_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read GD25Q64_128 security register #3');
+ RegSize :=1024;
+ // read register 3
+ SPIWrite (0, 5, $48, $00, $30, $00, $00);
+ SPIReadToEditor (1, RegSize);
+
+ LogPrint ('End read GD25Q64_128 security register #3');
+ SPIExitProgMode ();
+end
+
+{$ ERASE_SECURITY_REGISTER_1_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start Erase GD25Q64_128 security register #1');
+ // write enable
+ SPIWrite (1, 1, $06);
+ // erase register 1
+ SPIWrite (1, 4, $44, $00, $10, $00);
+
+ LogPrint ('End Erase GD25Q64_128 security register #1');
+ SPIExitProgMode ();
+end
+
+{$ ERASE_SECURITY_REGISTER_2_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start Erase GD25Q64_128 security register #2');
+
+ // write enable
+ SPIWrite (1, 1, $06);
+ // erase register 2
+ SPIWrite (1, 4, $44, $00, $20, $00);
+
+ LogPrint ('End Erase GD25Q64_128 security register #2');
+ SPIExitProgMode ();
+end
+
+{$ ERASE_SECURITY_REGISTER_3_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start Erase GD25Q64_128 security register #3');
+
+ // write enable
+ SPIWrite (1, 1, $06);
+ // erase register 3
+ SPIWrite (1, 4, $44, $00, $30, $00);
+
+ LogPrint ('End Erase GD25Q64_128 security register #3');
+ SPIExitProgMode ();
+end
+
+{$ WRITE_SECURITY_REGISTER_1_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start write GD25Q64_128 security register #1');
+ RegSize :=1024;
+ sreg := 0;
+
+ // write enable
+ SPIWrite (1, 1, $06);
+
+ // write register 1
+ SPIWrite (0, 4, $42, $00, $10, $00);
+ SPIWriteFromEditor(1, Regsize, 0);
+
+ //Busy
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+
+ // write disable
+ SPIWrite (1, 1, $04);
+ LogPrint ('End write GD25Q64_128 security register #1');
+ SPIExitProgMode ();
+end
+
+{$ WRITE_SECURITY_REGISTER_2_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start write GD25Q64_128 security register #2');
+ RegSize :=1024;
+ sreg := 0;
+
+ // write enable
+ SPIWrite (1, 1, $06);
+
+ // write register 2
+ SPIWrite (0, 4, $42, $00, $20, $00);
+ SPIWriteFromEditor(1, Regsize, 0);
+
+ //Busy
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+
+ // write disable
+ SPIWrite (1, 1, $04);
+ LogPrint ('End write GD25Q64_128 security register #2');
+ SPIExitProgMode ();
+end
+
+{$ WRITE_SECURITY_REGISTER_3_GD25Q64_128}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start write GD25Q64_128 security register #3');
+ RegSize :=1024;
+ sreg := 0;
+
+ // write enable
+ SPIWrite (1, 1, $06);
+
+ // write register 3
+ SPIWrite (0, 4, $42, $00, $30, $00);
+ SPIWriteFromEditor(1, Regsize, 0);
+
+ //Busy
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+
+ // write disable
+ SPIWrite (1, 1, $04);
+ LogPrint ('End write GD25Q64_128 security register #3');
+ SPIExitProgMode ();
+end
+
diff --git a/AsProgrammer/scripts/README.TXT b/AsProgrammer/scripts/README.TXT
new file mode 100644
index 0000000..5d5c5b6
--- /dev/null
+++ b/AsProgrammer/scripts/README.TXT
@@ -0,0 +1,456 @@
+
+ 1. Description
+ -------------------
+
+ The module PASCALC.DCU is the Pascal-like language interpreter for Delphi.
+ The basic differences from standard Pascal the following:
+
+ - All variables stored as variants.
+
+ - It's no need to declare variables, labels and functions. PASCALC creates
+ variables dynamically on first assignment. Variable type depends on the
+ last value assigned, type checking is not carried out.
+
+ - Expressions syntax:
+
+ Arithmetic operators: +, -, *, /, ^ (power), SHL, SHL
+ Bitwise operators: BITOR,BITAND,BITXOR,BITNOT
+ Logical operators: >, <, >=, <=, =, <>, AND, OR, NOT,
+ constants TRUE and FALSE.
+ Operators precedence standard, you can use parentheses.
+
+
+ - Statements supported:
+ BEGIN... END
+ IF... THEN... ELSE
+ CASE
+ FOR... TO/DOWNTO... DO
+ WHILE... DO
+ REPEAT... UNTIL
+ BREAK
+ CONTINUE
+ GOTO
+ EXIT
+ USES
+ INCLUDE
+
+ - All reserved words are declared in interface section as string array.
+ You can change them to anyone others. All identifiers should be different
+ (except assignment and equation, they may be the same).
+
+ - Multi-dimensional arrays supported. Array items are variables whose names
+ consist from array name and indexes (in brackets). Array items properties
+ same as the simple variables. It's no need to declare arrays. Array index
+ continuity is not requred. It's possible to access string as char array.
+ You can assign chars or numbers in range 0..255 to string characters.
+ Array name should be unique, simple variable MyArr and array item MyArr[1]
+ can't exist at the same time. This rule allows to distinguish access to
+ 1-st character of string variable MyArr (MyArr[1]) from the accees to
+ the first item of array MyArr. To access character of string array item,
+ character index should be written in brackets after item name, for example
+ MyArr[1,2][3].
+
+ - All build-in functions are user-defined. Module pasfunc.pas contain
+ example of PASCALC implementations for common Delphi functions. You can use
+ this functions and write your own implementations for necessary functions.
+ There is no need to declare parameters for user-defined functions, therefore
+ it's types and amount are not limited. If necessary you can provide type
+ checking inside function code. Interpreter calculates all parameter values
+ and creates temporary values list (TVarList). Names of var-parameters in this
+ list are 'VAR', otherwise 'VALUE'. After function call interpreter updates
+ values for var-parameters. Function result type not checked, one function can
+ return number as well as string. Functions can be called as procedures (without
+ result usage).
+
+ - Procedures and functions (in sense of the subroutines on interpreter language)
+ are supported. The function heading specifies only names of formal parameters,
+ without parameters types and pass method (var or value). Also, function's result
+ types are not declared. To return function result you should assign value to
+ variable "result".
+
+ If actual parameter is variable (not expression), it considered as var-parameter.
+ In this case assigning new value to this parameter inside procedure or function
+ will affect the actual parameter variable.
+
+ At the same time, all interpreter global variables inside a function or procedures
+ looks like local variables, with the same initial values as global ones.
+ You can change this values inside procedures (functions), but it's don't affect
+ the global variables. All new variables created inside procedures and functions
+ are local, and will be destroyed after exiting.
+ Therefore, it is possible to use any names for local variables, without conflicts
+ with the global variables.
+
+ For libraries implementation, it is possible to use operators USES and INCLUDE.
+
+ Syntax: USES 'filename';
+ INCLUDE 'filename';
+
+ INCLIDE and USES are parsed by pre-processor before script execution.
+ INCLUDE inserts text from file 'filename' into the script, USES loads
+ procedures and functions declarations.
+
+
+ 2. License
+ ----------
+
+ This software is provided as it is, without any kind of warranty given.
+ The author can not be held responsible for any kind of damage, problems etc,
+ arised from using this software. PASCALC interpreter is shareware product.
+ Unregistered version has no time or functionality limitations, but can
+ show info screen.
+
+ If you want get source code, you should register PASCALC and get registration code.
+ Use your registration code as password for source archive (Source\pascsrc.zip).
+
+ Address for online registration (price $20):
+ https://www.regnow.com/softsell/nph-softsell.cgi?item=2608-2
+
+ You can modify PASCALC source code as you need, distribute executable files
+ compiled with PASCALC source. But you can't distribute original or modified
+ PASCALC source code, .DCU units or libraries based on PASCALC source code.
+
+
+ 3. PASCALC inteface
+ -------------------
+
+
+unit pascalc;
+
+{$F+,B-,R-}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Math;
+
+type TToken =
+ (tEMPTY, tVR, tCON, tTRUE, tFALSE,
+ tEQU, tOR, tAND, tNOT, tXOR,
+ tCOMMA, tLBL, tNEQ, tGT, tLS,
+ tGTE, tLSE, tADD, tSUB, tMUL,
+ tDIV, tPWR, tLBR, tRBR, tLARR,
+ tRARR, tSEMI, tREM, tREMB, tREME,
+ tASSIGN, tBEGIN, tEND, tIF, tTHEN,
+ tELSE, tFOR, tTO, tDOWNTO, tDO,
+ tWHILE, tREPEAT, tUNTIL, tBREAK, tCONTINUE,
+ tEXIT, tGOTO, tSHL, tSHR, tPROC,
+ tFUNCT, tUSES, tINCLUDE, tCASE, tOF,
+ tCOMMA2);
+
+type TTokenSet = set of TToken;
+
+const
+ ResWords : array[TToken] of string[10] =
+ ('', '', '', 'TRUE', 'FALSE',
+ '=', 'OR', 'AND', 'NOT', 'XOR',
+ ',', ':', '<>', '>', '<',
+ '>=', '<=', '+', '-', '*',
+ '/', '^', '(', ')', '[',
+ ']', ';', '//', '{', '}',
+ ':=', 'BEGIN', 'END', 'IF', 'THEN',
+ 'ELSE', 'FOR', 'TO', 'DOWNTO', 'DO',
+ 'WHILE', 'REPEAT', 'UNTIL', 'BREAK', 'CONTINUE',
+ 'EXIT', 'GOTO', 'SHL', 'SHR', 'PROCEDURE',
+ 'FUNCTION', 'USES', 'INCLUDE', 'CASE', 'OF',
+ '..');
+
+const
+ Alpha : set of char = ['_','0'..'9','a'..'z','A'..'Z',''..'','',''..'',''];
+ StrDelimiter : char = '''';
+ DecimalPoint : char = '.';
+ TokenDelimiter : char = #127;
+
+
+type TVar = record
+ Name : string;
+ Value : variant;
+end;
+
+type TPVar = ^TVar;
+
+type TVarList = class (TList)
+ destructor Destroy; override;
+ procedure ClearAll;
+ function AddVar(V:TVar) : boolean;
+ function AddValue(N:string; V:variant) : boolean;
+ function VarExist(N:string):boolean;
+ function VarIndex(N:string):integer;
+ function VarByName(N:string;var V:TVar) : boolean;
+ function SetVar(V:TVar) : boolean;
+ function SetValue(N:string; V:variant) : boolean;
+ procedure CopyTo(VL:TVarList);
+end;
+
+type TPVarList = ^TVarList;
+
+type PProcessProc = procedure;
+
+type PFunction = function(Sender:TObject; var A:TVarList; var R:TVar) : boolean;
+
+type TFunc = record
+ Name : string;
+ Func : Pointer;
+end;
+
+type TPFunc = ^TFunc;
+
+type TFuncList = class (TList)
+ destructor Destroy; override;
+ procedure ClearAll;
+ function AddFunction(N:string; F:Pointer) : boolean;
+end;
+
+type TProcedure = record
+ Name : string;
+ Body : string;
+ Params : string;
+ Result : boolean;
+end;
+
+type TPProcedure = ^TProcedure;
+
+type TProcList = class(TList)
+ destructor Destroy; override;
+ procedure ClearAll;
+ function AddProc(Proc:TProcedure):boolean;
+ function ProcIndex(Name:string):integer;
+ function ProcByName(Name:string; var Proc:TProcedure):boolean;
+end;
+
+
+type TPasCalc = class
+ constructor Create;
+ destructor Destroy; override;
+ procedure ClearVars;
+ function VarCount : integer;
+ function VarIndex(N:string) : integer;
+ function VarByName(N:string; var V:TVar) : boolean;
+ function VarByIndex(I:integer; var V:TVar) : boolean;
+ function SetVar(V:TVar) : boolean;
+ function SetValue(N:string; V:variant):boolean;
+ procedure ClearFuncs;
+ function SetFunction(N:string; F:Pointer) : boolean;
+ procedure SetProcessProc(P:Pointer);
+ function Parse(S:string) : string;
+ function Calculate(S:string; var R:TVar) : boolean;
+ function Execute(S:string):boolean;
+ private
+ Expr : string;
+ ExprIndex : integer;
+ Token : string;
+ TokenCode : TToken;
+
+ BlockLevel : integer;
+ BlockCmd : TToken;
+ GotoLabel : string;
+
+ VarList : TVarList;
+ FuncList : TFuncList;
+ ProcList : TProcList;
+
+ ProcessProc : PProcessProc;
+
+ LastString : string;
+ LastParsed : string;
+
+ procedure Clear;
+ procedure Process;
+ procedure Error(Msg,Line:string; Code:integer);
+ procedure Level1(var R:TVar);
+ procedure Level2(var R:TVar);
+ procedure Level3(var R:TVar);
+ procedure Level4(var R:TVar);
+ procedure Level5(var R:TVar);
+ procedure Level6(var R:TVar);
+ procedure Level7(var R:TVar);
+ procedure Level8(var R:TVar);
+ procedure Arith(o : TToken; var R,H:TVar);
+ procedure Unary(o : TToken; var R:TVar);
+ function GetIndex(S:string; var Index:integer; var T:TToken) : string;
+ function GetFuncParams(S:string; var Index:integer) : string;
+ function FindFunc(N:string) : integer;
+ function FindArray(N:string) : boolean;
+ procedure SetVarDirect(var R:TVar);
+ function CallFunc(N:string; A:string; var V:TVar) : boolean;
+ function CallProc(N:string; A:string; var V:TVar) : boolean;
+ function GetTextToken(S: string; var Index : integer; var Code : TToken) : string;
+ function TokenStr(T:TToken;S:string) : string;
+ function GetToken(S:string; var Index : integer; var Code : TToken) : string;
+ function GetTokenCode(S: string; var Index:integer; var Code:TToken) : integer;
+ function GetTokenLine(S:string; var Index:integer; var Code:TToken;
+ StopToken:TTokenSet) : string;
+ function NextToken(S:string; Index:integer) : TToken;
+ function GetOperator(Txt:string; var Index : integer; EndToken:TTokenSet) : string;
+ function ParseOperator(Txt:string; var Cmd,Line,Lbl : string) : TToken;
+ function DelRemarks(S:string) : string;
+ function UnParse(S:string; Show:boolean) : string;
+ function PreProcess(Txt:string):string;
+ function Calc(S:string; var R:TVar) : boolean;
+ procedure Exec(Txt:string);
+ procedure DoSet(CmdLine,Cmd,Line:string);
+ procedure DoIf(CmdLine,Line:string);
+ procedure DoBegin(CmdLine,Line:string);
+ procedure DoFor(CmdLine,Line:string);
+ procedure DoBreak(CmdLine,Line:string);
+ procedure DoContinue(CmdLine,Line:string);
+ procedure DoExit(CmdLine,Line:string);
+ procedure DoWhile(CmdLine,Line:string);
+ procedure DoRepeat(CmdLine,Line:string);
+ procedure DoGoto(CmdLine,Line:string);
+ procedure DoCase(CmdLine,Line:string);
+ public
+ Stop : boolean;
+ ErrCode : integer;
+ ErrMsg : string;
+ ErrLine : string;
+ end;
+
+
+
+ 4. Functions (unit PASFUNC.PAS)
+ ------------------------------
+
+ // String functions
+
+ Val
+ IntToStr
+ StrToInt
+ FloatToStr
+ StrToFloat
+ Copy
+ Pos
+ Length
+ Insert
+ Delete
+ Trim
+ TrimLeft
+ TrimRight
+ UpperCase
+ LowerCase
+ Format
+
+ // DateTime functions
+
+ Now
+ Date
+ Time
+ DateToStr
+ StrToDate
+ TimeToStr
+ StrToTime
+ FormatDateTime
+ DayOfWeek
+ IncMonth
+ DecodeDate
+ DecodeTime
+ EncodeDate
+ EncodeTime
+ YearDays
+ YearFrac
+
+ // Math functions
+ Abs
+ Int
+ Frac
+ Round
+ Ceil
+ Floor
+ Trunc
+ Sin
+ Cos
+ Tan
+ ArcSin
+ ArcCos
+ ArcTan
+ Exp
+ Ln
+ IntPower
+ Sqr
+ Sqrt
+ Min
+ Max
+ Inc
+ Dec
+
+ // Variable handling functions.
+ // Allows get or set variable value by calculated variable name.
+
+ SetVar
+ GetVar
+
+ // Misc functions
+
+ Decode (simular with the Oracle Decode function)
+
+
+ 5. Interpreter usage
+ --------------------
+
+ See usage example in demo program (demo.dpr). At first you should write
+ user-defined functions you want to use in scripts and expressions. Function
+ should set result value (field Value of variable R:TVar) and return true.
+ On errors (wrong parameters, etc) function should return false. In your
+ program you should create an instance of TPasCalc class.
+ Then associate functions with names (TPasCalc.SetFunction).
+ To register pasfunc.pas function library, call SetFunctions.
+ You can set predefined variables (TPasCalc.SetVarNum or TPasCalc.SetVarStr).
+ Method TPasCalc.Calculate evaluates expression and returns result in variable
+ R:TVar. Method TPasCalc.Execute executes script and fills variable list.
+ You can access variables using TPasCalc.VarCount, TPasCalc.VarByIndex or
+ TPasCalc.VarByName methods. TPasCalc.ErrCode, TPasCalc.ErrMsg and
+ TPasCalc.ErrLine indicates last error code, error message and line that
+ raises error. Variable list not cleared in Calculate and Execute methods.
+ You can reset all variables using TPasCalc.ClearVars. TPasCalc.ClearFuncs
+ resets function list. Method TPasCalc.SetProcessProc sets pointer to
+ user-defined callback procedure. Interpreter calls this procedure in internal
+ cycles. In this procedure you can check some condition (timeout for example)
+ and break execution by assigning TPasCalc.Stop:=TRUE. It is useful to call
+ Application.ProcessMessages in this procedure. If callback procedure not
+ assigned, interpreter uses Process method instead. Process method performs
+ only messages processing.
+ To improve perfomance you can prepare script using Parse method, and then
+ execute previously prepared script.
+
+
+ 6. Error codes
+ --------------
+
+ 0 - O.K.
+ 1 - Error in expression
+ 2 - Unpaired parentheses
+ 3 - Variable not found
+ 4 - Invalid variable/function/procedure name
+ 5 - Invalid typecast
+ 6 - Invalidstring constant
+ 7 - Incorrect function call
+ 8 - Function not found
+ 9 - Invalid operator
+ 10 - END expected
+ 11 - Too many END
+ 12 - TO or DOWNTO expected
+ 13 - FOR-loop variable expected
+ 14 - DO expected
+ 15 - BREAK outside a loop
+ 16 - UNTIL expected
+ 17 - Too many UNTIL
+ 18 - Label not found
+ 19 - Index out of range
+ 20 - Value out of range
+ 21 - ']' expected
+ 22 - Too many '['
+ 23 - Division by zero
+ 24 - Variable or array name duplicated
+ 25 - File pen error
+ 26 - Function must return result
+ 27 - CASE without OF
+ 28 - Too many ELSE in CASE statement
+ 29 - Case range expected
+
+
+ 7. Author
+ ---------
+
+ Alex Boiko
+ alexboiko@mtu-net.ru
+ http://alexboiko.da.ru
+ http://alexboiko.chat.ru
diff --git a/AsProgrammer/scripts/README_RU.TXT b/AsProgrammer/scripts/README_RU.TXT
new file mode 100644
index 0000000..b690b62
--- /dev/null
+++ b/AsProgrammer/scripts/README_RU.TXT
@@ -0,0 +1,463 @@
+ 1.
+ -----------
+
+ pascalc.dcu Pascal -
+ Delphi. :
+
+ - Variant,
+ .
+
+ - ,
+ .
+ , .
+ , .
+ 0..255
+ ( 1).
+
+ - :
+ : +, -, *, /, ^ ( ), SHL, SHR
+ : BITOR,BITAND,BITXOR,BITNOT
+ : >, <, >=, <=, =, <>, AND, OR, NOT, TRUE FALSE.
+ T . .
+
+ - :
+ BEGIN ... END
+ IF ... THEN ... ELSE
+ CASE
+ FOR ... TO/DOWNTO ... DO
+ WHILE ... DO
+ REPEAT ... UNTIL
+ CONTINUE
+ BREAK
+ GOTO
+ EXIT
+ USES
+ INCLUDE
+
+ - interface .
+ ,
+ . .
+ .
+ .
+
+ - , .
+
+ . ,
+ .
+ ( MyArr MyArr[1]).
+ ,
+ .
+ , .
+ .
+ .
+ ( )
+ - . ,
+ . MyArr[1][2] 2-
+ 1- MyArr. MyArr[1]
+ MyArr, .
+ ,
+ .
+
+ - user-defined. M pasfunc.pas
+ Delphi.
+ demo-. ,
+
+ . ,
+ ( write ).
+
+ .
+ .
+ , VAR-,
+
+ .
+ . pasfunc.pas
+ (- Max, Min). ,
+ .
+
+ - .
+ .
+ ,
+ .
+ "result".
+ ,
+ VAR-
+ .
+ , ,
+
+ . , ,
+
+ . ,
+ , / . ,
+ ,
+ .
+
+ USES INCLUDE.
+ : USES ' ';
+ INCLUDE ' ';
+
+ USES INCLUDE ,
+ . INCLUDE . USES
+ ,
+ .
+
+
+ 2. .
+ ------------
+
+ PASCALC " ".
+ , .
+ .
+ , , ,
+ ( ) .
+
+ http://alexboiko.da.ru
+ http://alexboiko.chat.ru
+
+
+ 3. :
+ -----------------------------------
+
+unit pascalc;
+
+{$F+,B-,R-}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Math;
+
+type TToken =
+ (tEMPTY, tVR, tCON, tTRUE, tFALSE,
+ tEQU, tOR, tAND, tNOT, tXOR,
+ tCOMMA, tLBL, tNEQ, tGT, tLS,
+ tGTE, tLSE, tADD, tSUB, tMUL,
+ tDIV, tPWR, tLBR, tRBR, tLARR,
+ tRARR, tSEMI, tREM, tREMB, tREME,
+ tASSIGN, tBEGIN, tEND, tIF, tTHEN,
+ tELSE, tFOR, tTO, tDOWNTO, tDO,
+ tWHILE, tREPEAT, tUNTIL, tBREAK, tCONTINUE,
+ tEXIT, tGOTO, tSHL, tSHR, tPROC,
+ tFUNCT, tUSES, tINCLUDE, tCASE, tOF,
+ tCOMMA2);
+
+type TTokenSet = set of TToken;
+
+const
+ ResWords : array[TToken] of string[10] =
+ ('', '', '', 'TRUE', 'FALSE',
+ '=', 'OR', 'AND', 'NOT', 'XOR',
+ ',', ':', '<>', '>', '<',
+ '>=', '<=', '+', '-', '*',
+ '/', '^', '(', ')', '[',
+ ']', ';', '//', '{', '}',
+ ':=', 'BEGIN', 'END', 'IF', 'THEN',
+ 'ELSE', 'FOR', 'TO', 'DOWNTO', 'DO',
+ 'WHILE', 'REPEAT', 'UNTIL', 'BREAK', 'CONTINUE',
+ 'EXIT', 'GOTO', 'SHL', 'SHR', 'PROCEDURE',
+ 'FUNCTION', 'USES', 'INCLUDE', 'CASE', 'OF',
+ '..');
+
+const
+ Alpha : set of char = ['_','0'..'9','a'..'z','A'..'Z',''..'','',''..'',''];
+ StrDelimiter : char = '''';
+ DecimalPoint : char = '.';
+ TokenDelimiter : char = #127;
+
+
+type TVar = record
+ Name : string;
+ Value : variant;
+end;
+
+type TPVar = ^TVar;
+
+type TVarList = class (TList)
+ destructor Destroy; override;
+ procedure ClearAll;
+ function AddVar(V:TVar) : boolean;
+ function AddValue(N:string; V:variant) : boolean;
+ function VarExist(N:string):boolean;
+ function VarIndex(N:string):integer;
+ function VarByName(N:string;var V:TVar) : boolean;
+ function SetVar(V:TVar) : boolean;
+ function SetValue(N:string; V:variant) : boolean;
+ procedure CopyTo(VL:TVarList);
+end;
+
+type TPVarList = ^TVarList;
+
+type PProcessProc = procedure;
+
+type PFunction = function(Sender:TObject; var A:TVarList; var R:TVar) : boolean;
+
+type TFunc = record
+ Name : string;
+ Func : Pointer;
+end;
+
+type TPFunc = ^TFunc;
+
+type TFuncList = class (TList)
+ destructor Destroy; override;
+ procedure ClearAll;
+ function AddFunction(N:string; F:Pointer) : boolean;
+end;
+
+type TProcedure = record
+ Name : string;
+ Body : string;
+ Params : string;
+ Result : boolean;
+end;
+
+type TPProcedure = ^TProcedure;
+
+type TProcList = class(TList)
+ destructor Destroy; override;
+ procedure ClearAll;
+ function AddProc(Proc:TProcedure):boolean;
+ function ProcIndex(Name:string):integer;
+ function ProcByName(Name:string; var Proc:TProcedure):boolean;
+end;
+
+
+type TPasCalc = class
+ constructor Create;
+ destructor Destroy; override;
+ procedure ClearVars;
+ function VarCount : integer;
+ function VarIndex(N:string) : integer;
+ function VarByName(N:string; var V:TVar) : boolean;
+ function VarByIndex(I:integer; var V:TVar) : boolean;
+ function SetVar(V:TVar) : boolean;
+ function SetValue(N:string; V:variant):boolean;
+ procedure ClearFuncs;
+ function SetFunction(N:string; F:Pointer) : boolean;
+ procedure SetProcessProc(P:Pointer);
+ function Parse(S:string) : string;
+ function Calculate(S:string; var R:TVar) : boolean;
+ function Execute(S:string):boolean;
+ private
+ Expr : string;
+ ExprIndex : integer;
+ Token : string;
+ TokenCode : TToken;
+
+ BlockLevel : integer;
+ BlockCmd : TToken;
+ GotoLabel : string;
+
+ VarList : TVarList;
+ FuncList : TFuncList;
+ ProcList : TProcList;
+
+ ProcessProc : PProcessProc;
+
+ LastString : string;
+ LastParsed : string;
+
+ procedure Clear;
+ procedure Process;
+ procedure Error(Msg,Line:string; Code:integer);
+ procedure Level1(var R:TVar);
+ procedure Level2(var R:TVar);
+ procedure Level3(var R:TVar);
+ procedure Level4(var R:TVar);
+ procedure Level5(var R:TVar);
+ procedure Level6(var R:TVar);
+ procedure Level7(var R:TVar);
+ procedure Level8(var R:TVar);
+ procedure Arith(o : TToken; var R,H:TVar);
+ procedure Unary(o : TToken; var R:TVar);
+ function GetIndex(S:string; var Index:integer; var T:TToken) : string;
+ function GetFuncParams(S:string; var Index:integer) : string;
+ function FindFunc(N:string) : integer;
+ function FindArray(N:string) : boolean;
+ procedure SetVarDirect(var R:TVar);
+ function CallFunc(N:string; A:string; var V:TVar) : boolean;
+ function CallProc(N:string; A:string; var V:TVar) : boolean;
+ function GetTextToken(S: string; var Index : integer; var Code : TToken) : string;
+ function TokenStr(T:TToken;S:string) : string;
+ function GetToken(S:string; var Index : integer; var Code : TToken) : string;
+ function GetTokenCode(S: string; var Index:integer; var Code:TToken) : integer;
+ function GetTokenLine(S:string; var Index:integer; var Code:TToken;
+ StopToken:TTokenSet) : string;
+ function NextToken(S:string; Index:integer) : TToken;
+ function GetOperator(Txt:string; var Index : integer; EndToken:TTokenSet) : string;
+ function ParseOperator(Txt:string; var Cmd,Line,Lbl : string) : TToken;
+ function DelRemarks(S:string) : string;
+ function UnParse(S:string; Show:boolean) : string;
+ function PreProcess(Txt:string):string;
+ function Calc(S:string; var R:TVar) : boolean;
+ procedure Exec(Txt:string);
+ procedure DoSet(CmdLine,Cmd,Line:string);
+ procedure DoIf(CmdLine,Line:string);
+ procedure DoBegin(CmdLine,Line:string);
+ procedure DoFor(CmdLine,Line:string);
+ procedure DoBreak(CmdLine,Line:string);
+ procedure DoContinue(CmdLine,Line:string);
+ procedure DoExit(CmdLine,Line:string);
+ procedure DoWhile(CmdLine,Line:string);
+ procedure DoRepeat(CmdLine,Line:string);
+ procedure DoGoto(CmdLine,Line:string);
+ procedure DoCase(CmdLine,Line:string);
+ public
+ Stop : boolean;
+ ErrCode : integer;
+ ErrMsg : string;
+ ErrLine : string;
+ end;
+
+
+ 4. (unit PASFUNC.PAS)
+ ------------------------------
+
+ //
+
+ Val
+ IntToStr
+ StrToInt
+ FloatToStr
+ StrToFloat
+ Copy
+ Pos
+ Length
+ Insert
+ Delete
+ Trim
+ TrimLeft
+ TrimRight
+ UpperCase
+ LowerCase
+ Format
+
+ //
+
+ Now
+ Date
+ Time
+ DateToStr
+ StrToDate
+ TimeToStr
+ StrToTime
+ FormatDateTime
+ DayOfWeek
+ IncMonth
+ DecodeDate
+ DecodeTime
+ EncodeDate
+ EncodeTime
+
+ //
+
+ Abs
+ Int
+ Frac
+ Round
+ Ceil
+ Floor
+ Trunc
+ Sin
+ Cos
+ Tan
+ ArcSin
+ ArcCos
+ ArcTan
+ Exp
+ Ln
+ IntPower
+ Sqr
+ Sqrt
+ Min
+ Max
+ Inc
+ Dec
+
+ // PASCALC .
+ // .
+
+ SetVar
+ GetVar
+
+
+ 5.
+ -------------------------------
+
+ demo-.
+ pasfunc.pas,
+ c , .
+ Value R:TVar true.
+ ( )
+ false.
+
+ TPasCalc. SetProcessProc
+
+ . .
+ ,
+ (Application.ProcessMessages ). ,
+ Process, .
+
+ TPasCalc.SetFunction
+ . pasfunc.pas
+ SetFunctions.
+ SetVarNum SetVarStr.
+
+ Calculate
+ R:TVar, Execute
+ . VarCount, VarByIndex
+ VarByName .
+ ErrCode. ErrMsg ErrLine
+ .
+
+ Calculate Execute
+ .
+ ClearVars.
+ ClearFuncs.
+ , true TPasCalc.Stop.
+
+
+ Parse, .
+ Calculate Execute.
+
+
+ 6. (ErrCode)
+ ------------------------
+
+ 0 - O.K.
+ 1 -
+ 2 -
+ 3 -
+ 4 -
+ 5 -
+ 6 - a
+ 7 -
+ 8 -
+ 9 -
+ 10 - END
+ 11 - END
+ 12 - TO DOWNTO
+ 13 -
+ 14 - DO
+ 15 - BREAK
+ 16 - UNTIL
+ 17 - UNTIL
+ 18 -
+ 19 -
+ 20 -
+ 21 - ']'
+ 22 - '['
+ 23 - 0
+ 24 - /
+ 25 -
+ 26 -
+ 27 - OF CASE
+ 28 - ELSE CASE
+ 29 - CASE
+
+
+ 7. :
+ ---------
+
+
+ alexboiko@mtu-net.ru
+ http://alexboiko.da.ru
diff --git a/AsProgrammer/scripts/blockerase.pas b/AsProgrammer/scripts/blockerase.pas
new file mode 100644
index 0000000..7620497
--- /dev/null
+++ b/AsProgrammer/scripts/blockerase.pas
@@ -0,0 +1,24 @@
+{$erase} //секция будет выполняться при нажатии кнопки "стереть"
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+
+ BlockSize := 65536; //Размер блока
+ sreg := 0;
+ ProgressBar(0, (_IC_SIZE / BlockSize)-1, 0);
+
+ for i:=0 to (_IC_SIZE / BlockSize)-1 do
+ begin
+ SPIWrite(1, 1, $06); //wren
+ SPIWrite(1, 4, $D8, i,0,0); //BE
+
+ //Busy?
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+ ProgressBar(1);
+ end;
+
+ ProgressBar(0, 0, 0);
+ SPIExitProgMode();
+end
diff --git a/AsProgrammer/scripts/i2c_example.pas b/AsProgrammer/scripts/i2c_example.pas
new file mode 100644
index 0000000..9abe321
--- /dev/null
+++ b/AsProgrammer/scripts/i2c_example.pas
@@ -0,0 +1,59 @@
+{$read}
+//reading 24c08
+begin
+ ChipSize := 1024;
+ MemAddr := 0;
+ ReadBuff := CreateByteArray(ChipSize);
+ DevAddr := $A8;
+
+ if _IC_Name = '' then
+ begin
+ ShowMessage ('Choose a component in list');
+ exit;
+ end;
+
+ I2CEnterProgMode;
+
+ I2CReadWrite(DevAddr, 1, ChipSize, MemAddr, ReadBuff);
+ ReadToEditor(ChipSize, 0, ReadBuff);
+
+ I2CExitProgMode;
+end
+
+{$write}
+function I2CIsBusy(DevAdr): boolean;
+begin
+ I2CStart;
+ Result := not I2CWriteByte(DevAdr);
+ I2CStop;
+end;
+//writing 24c08
+begin
+ ChipSize := 1024;
+ MemAddr := 0;
+ WriteByte := 0;
+ DevAddr := $A0;
+ if _IC_Name = '' then
+ begin
+ ShowMessage ('Choose a component in list');
+ exit;
+ end;
+ ProgressBar(0, _IC_SIZE-1, 0);
+
+ I2CEnterProgMode;
+
+ for i:=0 to ChipSize-1 do
+ begin
+ WriteFromEditor(1, i, WriteByte);
+ I2CReadWrite(DevAddr, 2, 0, MemAddr, WriteByte);
+ while I2CIsBusy(DevAddr) do
+ MemAddr := MemAddr + 1;
+ if MemAddr = 256 then DevAddr := $A2;
+ if MemAddr = 512 then DevAddr := $A4;
+ if MemAddr = 768 then DevAddr := $A6;
+ ProgressBar(1);
+ end;
+
+ I2CExitProgMode;
+ ProgressBar(0, 0, 0);
+end
diff --git a/AsProgrammer/scripts/script_func.html b/AsProgrammer/scripts/script_func.html
new file mode 100644
index 0000000..6c1117d
--- /dev/null
+++ b/AsProgrammer/scripts/script_func.html
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+ Секции |
+
+
+ {$read} |
+ Код секции выполняется при нажатии кнопки чтении памяти |
+
+
+ {$write} |
+ Код секции выполняется при нажатии кнопки записи памяти |
+
+
+ {$erase} |
+ Код секции выполняется при нажатии кнопки стирания памяти |
+
+
+ {$verify} |
+ Код секции выполняется при нажатии кнопки сравнения памяти |
+
+
+ {$unlock} |
+ Код секции выполняется при нажатии кнопки снятия защиты |
+
+
+ Предопределенные переменные |
+
+
+ _IC_Name |
+ Название текущей выбранной микросхемы |
+
+
+ _IC_Size |
+ Размер, в байтах, текущей выбранной микросхемы |
+
+
+ _IC_Page |
+ Размер страницы, в байтах, текущей выбранной микросхемы |
+
+
+ _SPI_SPEED_MAX |
+ Максимально возможная частота для SPISetSpeed |
+
+
+ Основные функции |
+
+
+ ShowMessage(text); |
+
+ Аналог ShowMessage
+ |
+
+
+ LogPrint(text, color); |
+
+ Выводит сообщение в лог
+ Параметры:
+ text текст сообщения
+ Необязательные параметры:
+ color цвет bgr
+ |
+
+
+ IntToHex(value, digits): string; |
+
+ Аналог IntToHex
+ |
+
+
+ ProgressBar(inc, max, pos); |
+
+ Устанавливает состояние ProgressBar
+ Параметры:
+ inc насколько увиличить позицию
+ Необязательные параметры:
+ max максимальная позиция ProgressBar
+ pos устанавливает конкретную позицию ProgressBar
+ |
+
+
+ CreateByteArray(size): variant; |
+
+ Создает массив с типом элементов varbyte
+ |
+
+
+ GetArrayItem(array, index): variant; |
+
+ Возвращает значение элемента массива
+ |
+
+
+ SetArrayItem(array, index, value); |
+
+ Устанавливает значение элемента массива
+ |
+
+
+ ReadToEditor(size, position, buffer, ...); |
+
+ Записывает данные из буфера в редактор размером size в позицию position
+ |
+
+
+ WriteFromEditor(size, position, buffer, ...); |
+
+ Записывает данные из редактора размером size с позиции position
+ |
+
+
+ GetEditorDataSize: longword; |
+
+ Возвращает размер данных в редакторе
+ |
+
+
+ Работа с SPI |
+
+
+ SPIEnterProgMode(speed): boolean; |
+
+ Инициализирует состояние пинов для SPI и устанавливает частоту SPI
+ Параметры:
+ speed
+ _SPI_SPEED_MAX = AvrIsp 8(4) MHz / USbAsp 3 MHz
+ Если частота не установлена возвращает false
+ Игнорируется для устройств с фиксированной частотой
+ |
+
+
+ SPIExitProgMode(); |
+
+ Отключает пины SPI
+ |
+
+
+ SPIRead(cs, size, buffer, ...): integer; |
+
+ Читает данные в буфер
+ Параметры:
+ cs если cs=1 отпускать Chip Select после чтения данных
+ size размер данных в байтах
+ buffer переменные для хранения данных или массив созданный CreateByteArray
+ Возвращает количество прочитанных байт
+ |
+
+
+ SPIWrite(cs, size, buffer, ...): integer; |
+
+ Записывает данные из буфера
+ Параметры:
+ cs если cs=1 отпускать Chip Select после записи данных
+ size размер данных в байтах
+ buffer переменные с данными или массив созданный CreateByteArray
+ Возвращает количество записанных байт
+ |
+
+
+ SPIReadToEditor(cs, size): integer; |
+
+ Читает данные в редактор
+ Параметры:
+ cs если cs=1 отпускать Chip Select после чтения данных
+ size размер данных в байтах
+ Возвращает количество прочитанных байт
+ |
+
+
+ SPIWriteFromEditor(cs, size, position): integer; |
+
+ Записывает данные из редактора размером size с позиции position
+ Параметры:
+ cs если cs=1 отпускать Chip Select после записи данных
+ size размер данных в байтах
+ position позиция в редакторе
+ Возвращает количество записанных байт
+ |
+
+
+ Работа с I2C |
+
+
+ I2CEnterProgMode(); |
+
+ Инициализирует состояние пинов
+ |
+
+
+
+ I2cExitProgMode(); |
+
+ Отключает пины
+ |
+
+
+
+ I2CReadWrite(DevAddr, wsize, rsize, wbuffer, rbuffer): integer; |
+
+ Записывает/читае данные из буферов
+ Параметры:
+ DevAddr адрес устройства
+ size размер данных в байтах
+ buffer переменные с данными или массив созданный CreateByteArray
+ Возвращает количество записанных + прочитанных байт
+ *Если rsize=0 можно опустить параметр rbuffer
+ |
+
+
+ I2CStart(); |
+
+ Используется вместе с I2CReadByte и I2CWriteByte
+ |
+
+
+
+ I2CStop(); |
+
+ Используется вместе с I2CReadByte и I2CWriteByte
+ |
+
+
+
+ I2CReadByte(ack: boolean): byte; |
+
+ Читает байт данных и отправляет ack/nack
+ |
+
+
+
+ I2CWriteByte(data): boolean; |
+
+ Записывает байт данных и возвращает ack/nack
+ |
+
+
+
+
+
diff --git a/AsProgrammer/scripts/w25q32FV_64FV_128FV_SecRegisters.pas b/AsProgrammer/scripts/w25q32FV_64FV_128FV_SecRegisters.pas
new file mode 100644
index 0000000..bc41491
--- /dev/null
+++ b/AsProgrammer/scripts/w25q32FV_64FV_128FV_SecRegisters.pas
@@ -0,0 +1,192 @@
+// designed for WINBOND W25Q32FV/JV W25Q64FV/JV W25Q128FV/JV (not BV serie)
+// READ / WRITE / ERASE Security REGISTERS
+// script can be adapted for other brand and models by changing 'RegSize' value in each section
+{$ READ_JEDEC_ID}
+begin
+ ID:= CreateByteArray(3);
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read JEDEC ID');
+
+ // read ID to test installation
+ SPIWrite (0, 1, $9F);
+ SPIRead(1, 3, ID);
+
+ logprint('Read ID: ' + inttohex((GetArrayItem(ID, 0)),2)+ inttohex((GetArrayItem(ID, 1)),2)+ inttohex((GetArrayItem(ID, 2)),2));
+ LogPrint ('End read JEDEC ID');
+ SPIExitProgMode ();
+end
+
+{$ READ_UNIQUE_ID}
+begin
+ UID:= CreateByteArray(8);
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read UNIQUE ID');
+
+ // read 64bits UNIQUE ID
+ SPIWrite (0, 5, $4B, $00, $00, $00, $00);
+ SPIRead(1, 8, UID);
+
+ logprint('Read UID: ' + inttohex((GetArrayItem(UID, 0)),2)+ inttohex((GetArrayItem(UID, 1)),2)+ inttohex((GetArrayItem(UID, 2)),2)+ inttohex((GetArrayItem(UID, 3)),2)
+ + inttohex((GetArrayItem(UID, 4)),2)+ inttohex((GetArrayItem(UID, 5)),2)+ inttohex((GetArrayItem(UID, 6)),2)+ inttohex((GetArrayItem(UID, 7)),2));
+ LogPrint ('End read UNIQUE ID');
+ SPIExitProgMode ();
+end
+
+{$ READ_SECURITY_REGISTER_1}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read security register #1');
+ RegSize := 256;
+ // read register 1
+ SPIWrite (0, 5, $48, $00, $10, $00, $00);
+ SPIReadToEditor (1, RegSize);
+
+ LogPrint ('End read security register #1');
+ SPIExitProgMode ();
+end
+
+{$ READ_SECURITY_REGISTER_2}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read security register #2');
+ RegSize := 256;
+ // read register 2
+ SPIWrite (0, 5, $48, $00, $20, $00, $00);
+ SPIReadToEditor (1, RegSize);
+
+ LogPrint ('End read security register #2');
+ SPIExitProgMode ();
+end
+
+{$ READ_SECURITY_REGISTER_3}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read security register #3');
+ RegSize := 256;
+ // read register 3
+ SPIWrite (0, 5, $48, $00, $30, $00, $00);
+ SPIReadToEditor (1, RegSize);
+
+ LogPrint ('End read security register #3');
+ SPIExitProgMode ();
+end
+
+{$ ERASE_SECURITY_REGISTER_1}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start Erase security register #1');
+ // write enable
+ SPIWrite (1, 1, $06);
+ // erase register 1
+ SPIWrite (1, 4, $44, $00, $10, $00);
+
+ LogPrint ('End Erase security register #1');
+ SPIExitProgMode ();
+end
+
+{$ ERASE_SECURITY_REGISTER_2}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start Erase security register #2');
+
+ // write enable
+ SPIWrite (1, 1, $06);
+ // erase register 2
+ SPIWrite (1, 4, $44, $00, $20, $00);
+
+ LogPrint ('End Erase security register #2');
+ SPIExitProgMode ();
+end
+
+{$ ERASE_SECURITY_REGISTER_3}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start Erase security register #3');
+
+ // write enable
+ SPIWrite (1, 1, $06);
+ // erase register 3
+ SPIWrite (1, 4, $44, $00, $30, $00);
+
+ LogPrint ('End Erase security register #3');
+ SPIExitProgMode ();
+end
+
+{$ WRITE_SECURITY_REGISTER_1}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start write security register #1');
+ RegSize := 256;
+ sreg := 0;
+
+ // write enable
+ SPIWrite (1, 1, $06);
+
+ // write register 1
+ SPIWrite (0, 4, $42, $00, $10, $00);
+ SPIWriteFromEditor(1, Regsize, 0);
+
+ //Busy
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+
+ // write disable
+ SPIWrite (1, 1, $04);
+ LogPrint ('End write security register #1');
+ SPIExitProgMode ();
+end
+
+{$ WRITE_SECURITY_REGISTER_2}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start write security register #2');
+ RegSize := 256;
+ sreg := 0;
+
+ // write enable
+ SPIWrite (1, 1, $06);
+
+ // write register 2
+ SPIWrite (0, 4, $42, $00, $20, $00);
+ SPIWriteFromEditor(1, Regsize, 0);
+
+ //Busy
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+
+ // write disable
+ SPIWrite (1, 1, $04);
+ LogPrint ('End write security register #2');
+ SPIExitProgMode ();
+end
+
+{$ WRITE_SECURITY_REGISTER_3}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start write security register #3');
+ RegSize := 256;
+ sreg := 0;
+
+ // write enable
+ SPIWrite (1, 1, $06);
+
+ // write register 3
+ SPIWrite (0, 4, $42, $00, $30, $00);
+ SPIWriteFromEditor(1, Regsize, 0);
+
+ //Busy
+ repeat
+ SPIWrite(0, 1, $05);
+ SPIRead(1, 1, sreg);
+ until((sreg and 1) <> 1);
+
+ // write disable
+ SPIWrite (1, 1, $04);
+ LogPrint ('End write security register #3');
+ SPIExitProgMode ();
+end
+
diff --git a/AsProgrammer/scripts/w25q32FV_64FV_128FV_read_SFDP.pas b/AsProgrammer/scripts/w25q32FV_64FV_128FV_read_SFDP.pas
new file mode 100644
index 0000000..0797026
--- /dev/null
+++ b/AsProgrammer/scripts/w25q32FV_64FV_128FV_read_SFDP.pas
@@ -0,0 +1,55 @@
+// designed for WINBOND W25Q32FV/JV W25Q64FV/JV W25Q128FV/JV (not BV serie)
+// READ the 3 Serial Flash Discoverable Parameter (SFDP) REGISTERS
+// note: W25Q32FV have only one SFDP register
+// script can be adapted for other brand and models by changing 'RegSize' value in each section
+{$ READ_JEDEC_ID}
+begin
+ ID:= CreateByteArray(3);
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read JEDEC ID');
+
+ // read ID to test installation
+ SPIWrite (0, 1, $9F);
+ SPIRead(1, 3, ID);
+
+ logprint('Read ID: ' + inttohex((GetArrayItem(ID, 0)),2)+ inttohex((GetArrayItem(ID, 1)),2)+ inttohex((GetArrayItem(ID, 2)),2));
+ LogPrint ('End read JEDEC ID');
+ SPIExitProgMode ();
+end
+
+{$ Read_SFDP_Register_1}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read SFDP Register #1');
+ RegSize := 256;
+ // read register 1
+ SPIWrite (0, 5, $5A, $00, $10, $00, $00);
+ SPIReadToEditor (1, RegSize);
+ LogPrint ('End read SFDP Register #1');
+ SPIExitProgMode ();
+end
+
+
+{$ Read_SFDP_Register_2}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read SFDP Register #2');
+ RegSize := 256;
+ // read register 2
+ SPIWrite (0, 5, $5A, $00, $20, $00, $00);
+ SPIReadToEditor (1, RegSize);
+ LogPrint ('End read SFDP Register #2');
+ SPIExitProgMode ();
+end
+
+{$ Read_SFDP_Register_3}
+begin
+ if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
+ LogPrint ('Start read SFDP Register #3');
+ RegSize := 256;
+ // read register 3
+ SPIWrite (0, 5, $5A, $00, $30, $00, $00);
+ SPIReadToEditor (1, RegSize);
+ LogPrint ('End read SFDP Register #3');
+ SPIExitProgMode ();
+end
diff --git a/AsProgrammer/settings.xml b/AsProgrammer/settings.xml
new file mode 100644
index 0000000..6e7b86e
--- /dev/null
+++ b/AsProgrammer/settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+