summaryrefslogtreecommitdiffstats
path: root/deviceRW.c
diff options
context:
space:
mode:
Diffstat (limited to 'deviceRW.c')
-rw-r--r--deviceRW.c1248
1 files changed, 1248 insertions, 0 deletions
diff --git a/deviceRW.c b/deviceRW.c
new file mode 100644
index 0000000..127a7b6
--- /dev/null
+++ b/deviceRW.c
@@ -0,0 +1,1248 @@
+/*
+ * deviceRW.c - Read-write calls for various devices
+ * Copyright (C) 2010-2022 Alberto Maccioni
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
+ * or see <http://www.gnu.org/licenses/>
+ */
+
+//configure for GUI or command-line
+#include "common.h"
+#include "progP12.h"
+#include "progP16.h"
+#include "progP18.h"
+#include "progP24.h"
+#include "progEEPROM.h"
+#include "progAVR.h"
+//#include "progP32.h"
+
+#ifdef __GTK_H__
+#define _GTKGUI
+#endif
+
+#include "deviceRW.h"
+
+char* devices[]={
+"10F200","10F202","10F204","10F206","10F220","10F222",
+"10F320","10F322",
+"12C508","12C508A","12C509","12C509A","12F508","12F509","12F510","12F519",
+"12F609","12F615","12F617","12F629","12F635","12C671","12C672","12CE673","12CE674","12F675","12F683",
+"12F752",
+"12F529T39","12F529T48",
+"12F1501","12F1571","12F1572","12F1612","12F1822","12F1840",
+"16F505","16F506","16F526","16F527","16F54","16F57","16F570","16F59",
+"16F610","16F616","16F627","16F627A","16F628","16F628A","16F630","16F631",
+"16F636","16F639","16F648A","16F676","16F677","16F684","16F685","16F687",
+"16F688","16F689","16F690",
+"16F707","16F716","16F72","16F720","16F721","16F722","16F722A","16F723","16F723A",
+"16F724","16F726","16F727","16F73","16F737","16F74","16F747","16F753","16F76",
+"16F767","16F77","16F777","16F785",
+"16F818","16F819","16C83","16F83","16F83A","16C84","16F84","16F84A","16F87","16F870","16F871","16F872",
+"16F873","16F873A","16F874","16F874A","16F876","16F876A","16F877","16F877A",
+"16F88","16F882","16F883","16F884","16F886","16F887",
+"16F913","16F914","16F916","16F917","16F946",
+"16F1454","16F1455","16F1459",
+"16F1503","16F1507","16F1508","16F1509","16F1512","16F1513","16F1516","16F1517","16F1518","16F1519",
+"16F1526","16F1527","16LF1554","16LF1559","16F1574","16F1575","16F1578","16F1579",
+"16F1613","16F1614","16F1615","16F1618","16F1619",
+"16F1703","16F1704","16F1705","16F1707","16F1708","16F1709","16F1713","16F1716","16F1717","16F1718","16F1719",
+"16F1764","16F1765","16F1768","16F1769","16F1773","16F1776","16F1777","16F17784","16F1779",
+"16F1782","16F1783","16F1784","16F1786","16F1787","16F1788","16F1789",
+"16F1823","16F1824","16F1825","16F1826","16F1827","16F1828","16F1829","16F1847",
+"16LF1902","16LF1903","16LF1904","16LF1906","16LF1907",
+"16F1933","16F1934","16F1936","16F1937","16F1938","16F1939","16F1946","16F1947",
+"16F15213","16F15214","16F15223""16F15224","16F15225","16F15243","16F15244","16F15245",
+"16F15254","16F15255","16F15256","16F15274","16F15275","16F15276",
+"16F15313","16F15323","16F15324","16F15325","16F15344","16F15345","16F15354","16F15355","16F15356",
+"16F15375","16F15376","16F15385","16F15386",
+"16F17114","16F17115","16F17124","16F17125","16F17126","16F17144","16F17145","16F17146",
+"16F17154","16F17155","16F17156","16F17174","16F17175","16F17176",
+"16F18013","16F18014","16F18015","16F18023","16F18024","16F18025","16F18026","16F18044","16F18045","16F18046",
+"16F18054","16F18055","16F18056","16F18074","16F18075","16F18076",
+"16F18114","16F18115","16F18124","16F18125","16F18126","16F18144","16F18145","16F18146",
+"16F18154","16F18155","16F18156","16F18174","16F18175","16F18176",
+"16F18313","16F18323","16F18324","16F18325","16F18326","16F18344","16F18345","16F18346",
+"16F18424","16F18425","16F18426","16F18444","16F18445","16F18446","16F18455","16F18456",
+"16F18854","16F18855","16F18856","16F18857","16F18875","16F18876","16F18877",
+"16F19155","16F19156","16F19175","16F19176","16F19185","16F19186","16F19195","16F19196","16F19197",
+"18F04Q40","18F04Q41","18F05Q40","18F05Q41","18F06Q40","18F06Q41","18F14Q40","18F14Q41","18F15Q40","18F15Q41","18F16Q40","18F16Q41",
+"18F242","18F248","18F252","18F258","18F442","18F448","18F452","18F458",
+"18F1220","18F1230","18F1320","18F1330","18F13K22","18F13K50","18F14K22","18F14K50",
+"18F2220","18F2221","18F2320","18F23K20","18F23K22","18F2321","18F2331","18F2410",
+"18F24J10","18F24J11","18F2420","18F24K20","18F24K22","18F2423","18F2431","18F2439",
+"18F2450","18F24J50","18F24K50","18F2455","18F2458","18F24Q71","18F2480",
+"18F2510","18F25J10","18F25J11","18F2515","18F2520","18F25K20","18F25K22","18F2523",
+"18F2525","18F2539","18F25K42","18F25Q43","18F2550","18F25J50","18F25K50","18F2553","18F25Q71","18F2580","18F25K80","18F25K83","18F2585",
+"18F2610","18F26J11","18F26J13","18F2620","18F26K20","18F26K22","18F26K42","18F26Q43","18F26J50","18F26K50",
+"18F26J53","18F26Q71","18F2680","18F26K80","18F2682","18F26K83","18F26Q83","18F26Q84","18F2685",
+"18F27J13","18F27K42","18F27Q43","18F27J53","18F27Q83","18F27Q84",
+"18F4220","18F4221","18F4320","18F43K20","18F43K22","18F4321","18F4331",
+"18F4410","18F44J10","18F44J11","18F4420","18F44K20","18F44K22","18F4423","18F4431",
+"18F4439","18F4450","18F44J50","18F4455","18F4458","18F44Q71","18F4480",
+"18F4510","18F45J10","18F45J11","18F4515","18F4520","18F45K20","18F45K22","18F4523",
+"18F4525","18F4539","18F45K42","18F45Q43","18F4550","18F45J50","18F45K50","18F4553","18F45Q71","18F4580","18F45K80","18F4585",
+"18F4610","18F46J11","18F46J13","18F4620","18F46K20","18F46K22","18F46K42","18F46Q43","18F46J50","18F46K50",
+"18F46J53","18F46Q71","18F4680","18F46K80","18F4682","18F46Q83","18F46Q84","18F4685",
+"18F47J13","18F47K42","18F47Q43","18F47J53","18F47Q83","18F47Q84",
+"18F54Q71","18F55K42","18F55Q43","18F55Q71","18F56K42","18F56Q43","18F56Q71","18F56Q83","18F56Q84","18F57K42","18F57Q43","18F57Q83","18F57Q84",
+"18F63J11","18F63J90","18F64J11","18F64J90",
+"18F65J10","18F65J11","18F65J15","18F65J50","18F65J90","18F65K80",
+"18F66J10","18F66J11","18F66J15","18F66J16","18F66J50","18F66J55","18F66J60","18F66J65","18F66J90","18F66J93",
+"18F67J10","18F67J11","18F67J50","18F67J60","18F66K80","18F67J90","18F67J93",
+"18F83J11","18F83J90","18F84J11","18F84J90","18F85J10","18F85J11","18F85J15","18F85J50","18F85J90",
+"18F8520","18F86J10","18F86J11","18F86J15","18F86J16","18F86J50","18F86J55","18F86J60","18F86J65",
+"18F86J72","18F86J90","18F86J93",
+"18F8722","18F87J10","18F87J11","18F87J50","18F87J60","18F87J72","18F87J90","18F87J93",
+"18F96J60","18F96J65","18F97J60",
+"24F04KA200","24F04KA201",
+"24F08KA101","24F08KA102",
+"24F16KA101","24F16KA102",
+"24FJ16GA002","24FJ16GA004",
+"24FJ32GA002","24FJ32GA004","24FJ32GA102","24FJ32GA104",
+"24FJ32GB002","24FJ32GB004",
+"24FJ48GA002","24FJ48GA004",
+"24FJ64GA002","24FJ64GA004","24FJ64GA006","24FJ64GA008","24FJ64GA010",
+"24FJ64GA102","24FJ64GA104","24FJ64GA306","24FJ64GA308","24FJ64GA310",
+"24FJ64GB002","24FJ64GB004","24FJ64GB106","24FJ64GB108","24FJ64GB110",
+"24FJ64GC006","24FJ64GC008","24FJ64GC010",
+"24FJ96GA006","24FJ96GA008","24FJ96GA010",
+"24FJ128GA006","24FJ128GA008","24FJ128GA010","24FJ128GA106","24FJ128GA108","24FJ128GA110",
+"24FJ128GA306","24FJ128GA308","24FJ128GA310",
+"24FJ128GB106","24FJ128GB108","24FJ128GB110","24FJ128GB206","24FJ128GB210",
+"24FJ128GC006","24FJ128GC008","24FJ128GC010",
+"24FJ128DA106","24FJ128DA110","24FJ128DA206","24FJ128DA210",
+"24FJ192GA106","24FJ192GA108","24FJ192GA110",
+"24FJ192GB106","24FJ192GB108","24FJ192GB110",
+"24FJ256GA106","24FJ256GA108","24FJ256GA110",
+"24FJ256GB106","24FJ256GB108","24FJ256GB110",
+"24FJ256GB206","24FJ256GB210",
+"24FJ256DA106","24FJ256DA110","24FJ256DA206","24FJ256DA210",
+"24EP32GP202","24EP32GP203","24EP32GP204",
+"24EP32MC202","24EP32MC203","24EP32MC204",
+"24EP64GP202","24EP64GP203","24EP64GP204","24EP64GP206",
+"24EP64MC202","24EP64MC203","24EP64MC204","24EP64MC206",
+"24EP128GP202","24EP128GP204","24EP128GP206",
+"24EP128MC202","24EP128MC204","24EP128MC206",
+"24EP256GP202","24EP256GP204","24EP256GP206",
+"24EP256MC202","24EP256MC204","24EP256MC206",
+"24EP512GP202","24EP512GP204","24EP512GP206",
+"24EP512MC202","24EP512MC204","24EP512MC206",
+"24HJ12GP201","24HJ12GP202",
+"24HJ16GP304",
+"24HJ32GP202","24HJ32GP204","24HJ32GP302","24HJ32GP304",
+"24HJ64GP202","24HJ64GP204","24HJ64GP206","24HJ64GP210","24HJ64GP502",
+"24HJ64GP504","24HJ64GP506","24HJ64GP510",
+"24HJ128GP202","24HJ128GP204","24HJ128GP206","24HJ128GP210",
+"24HJ128GP306","24HJ128GP310","24HJ128GP502","24HJ128GP504","24HJ128GP506","24HJ128GP510",
+"24HJ256GP206","24HJ256GP210","24HJ256GP610",
+"30F1010","30F2010","30F2011","30F2012","30F2020","30F2023",
+"30F3010","30F3011","30F3012","30F3013","30F3014",
+"30F4011","30F4012","30F4013",
+"30F5011","30F5013","30F5015","30F5016",
+"30F6010","30F6011","30F6012","30F6013","30F6014","30F6015",
+//"32MX270F256",
+"33FJ06GS101","33FJ06GS102","33FJ06GS202",
+"33FJ12GP201","33FJ12GP202","33FJ12MC201","33FJ12MC202",
+"33FJ16GP304","33FJ16GS402","33FJ16GS404","33FJ16GS502","33FJ16GS504","33FJ16MC304",
+"33FJ32GP202","33FJ32GP204","33FJ32GP302","33FJ32GP304",
+"33FJ32GS406","33FJ32GS606","33FJ32GS608","33FJ32GS610",
+"33FJ32MC202","33FJ32MC204","33FJ32MC302","33FJ32MC304",
+"33FJ64GP202","33FJ64GP204","33FJ64GP206","33FJ64GP306","33FJ64GP310",
+"33FJ64GP706","33FJ64GP708","33FJ64GP710","33FJ64GP802","33FJ64GP804",
+"33FJ64GS406","33FJ64GS606","33FJ64GS608","33FJ64GS610",
+"33FJ64MC202","33FJ64MC204","33FJ64MC506","33FJ64MC508","33FJ64MC510",
+"33FJ64MC706","33FJ64MC710","33FJ64MC802","33FJ64MC804",
+"33FJ128GP202","33FJ128GP204","33FJ128GP206","33FJ128GP306","33FJ128GP310","33FJ128GP706",
+"33FJ128GP708","33FJ128GP710","33FJ128GP802","33FJ128GP804",
+"33FJ128MC202","33FJ128MC204","33FJ128MC506","33FJ128MC510","33FJ128MC706","33FJ128MC708",
+"33FJ128MC710","33FJ128MC802","33FJ128MC804",
+"33FJ256GP506","33FJ256GP510","33FJ256GP710",
+"33FJ256MC510","33FJ256MC710",
+"33EP32GP502","33EP32GP503","33EP32GP504",
+"33EP32MC202","33EP32MC203","33EP32MC204","33EP32MC502","33EP32MC503","33EP32MC504",
+"33EP64GP502","33EP64GP503","33EP64GP504","33EP64GP506",
+"33EP64MC202","33EP64MC203","33EP64MC204","33EP64MC206","33EP64MC502","33EP64MC503","33EP64MC504","33EP64MC506",
+"33EP128GP502","33EP128GP504","33EP128GP506",
+"33EP128MC202","33EP128MC204","33EP128MC206","33EP128MC502","33EP128MC504","33EP128MC506",
+"33EP256GP502","33EP256GP504","33EP256GP506",
+"33EP256MC202","33EP256MC204","33EP256MC206","33EP256MC502","33EP256MC504","33EP256MC506",
+"33EP512GP502","33EP512GP504","33EP512GP506",
+"33EP512MC202","33EP512MC204","33EP512MC206","33EP512MC502","33EP512MC504","33EP512MC506",
+"AT90S1200","AT90S2313",
+"AT90S8515","AT90S8535","ATmega48","ATmega8","ATmega88","ATmega8515",
+"ATmega8535","ATmega16","ATmega164","ATmega168","ATmega32","ATmega324",
+"ATmega328","ATmega64","ATmega644","ATmega1284",
+"ATtiny11","ATtiny12","ATtiny13",
+"ATtiny2313","ATtiny24","ATtiny25","ATtiny26","ATtiny261","ATtiny4313","ATtiny44","ATtiny45",
+"ATtiny461","ATtiny48","ATtiny84","ATtiny85","ATtiny88","ATtiny861",
+"2400","2401","2402","2404","2408","2416","2432","2464","24128","24256","24512","241024","241025",
+"25010","25020","25040","25080","25160","25320","25640","25128","25256","25512","251024",
+"95010","95020","95040","95080","95160","95320","95640","95128","95256","95512","95M01","95M02",
+"251005","252005","254005","258005","251605",
+"25X05","25X10","25X20","25X40","25X80","25X16","25X32","25X64","25X128","25Q40",
+"93S46","93x46","93x46A","93S56","93x56","93x56A","93S66","93x66", "93x66A","93x76","93x76A","93x86","93x86A",
+"DS2430","DS2431","DS2433","DS28EC20","DS1820",
+"11010","11020","11040","11080","11160"
+};
+
+int Ndevices=sizeof(devices)/sizeof(char*);
+
+struct DEVICES DEVLIST[]={
+//-------------PIC10-16---------------------------------------------------------
+ {"10F200,10F204,10F220",
+ PIC12,13.0,0,Read12F5xx,{0x100,5},0x40,Write12F5xx,{0x100,0xFF},0}, //256
+ {"10F320",
+ PIC16,9.0,1,Read16Fxxx,{0x100,0,10,0},0x80,Write12F6xx,{0x100,0,-10},0}, //256, vpp, 3.3V
+ {"12C508,12C508A",
+ PIC12,13.0,0,Read12F5xx,{0x200,4},0x40,Write12C5xx,{0x200,0},0}, //512
+ {"12F508,10F202,10F206,10F222",
+ PIC12,13.0,0,Read12F5xx,{0x200,5},0x40,Write12F5xx,{0x200,0x1FF},0}, //512
+ {"16F54",
+ PIC12,13.0,0,Read12F5xx,{0x200,4},0x40,Write12F5xx,{0x200,-1},0}, //512, no osccal
+ {"10F322",
+ PIC16,9.0,1,Read16Fxxx,{0x200,0,10,0},0x80,Write12F6xx,{0x200,0,-10},0}, //512, vpp, 3.3V
+ {"12C509,12C509A",
+ PIC12,13.0,0,Read12F5xx,{0x400,4},0x40,Write12C5xx,{0x400,0},0}, //1K
+ {"12F509,12F510,16F505,16F506",
+ PIC12,13.0,0,Read12F5xx,{0x400,5},0x40,Write12F5xx,{0x400,0x3FF},0}, //1K
+ {"12F519,16F526,16F527",
+ PIC12,13.0,0,Read12F5xx,{0x440,8},0x60,Write12F5xx,{0x440,0x3FF},0}, //1K + 64
+ {"12F529T39,12F529T48",
+ PIC12,13.0,0,Read12F5xx,{0x640,8},0x78,Write12F5xx,{0x640,0x5FF},0}, //1.5K + 64
+ {"16F57,16F59",
+ PIC12,13.0,0,Read12F5xx,{0x800,4},0x40,Write12F5xx,{0x800,-1},0}, //2K
+ {"16F570",
+ PIC12,13.0,0,Read12F5xx,{0x840,8},0x70,Write12F5xx,{0x840,0x7FF},0}, //2K + 64
+ {"16C83,16F83,16F83A",
+ PIC16,13.0,0,Read16Fxxx,{0x200,0x40,8,1},0x10,Write16F8x,{0x200,0x40,-10},0}, //512, 64, vdd
+ {"12C671,12CE673",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0,0,0},0x100,0,{},0}, //1K, vpp
+ {"12F1501",
+ PIC16,8.5,1,Read16F1xxx,{0x400,0,11,0},0x100,Write16F1xxx,{0x400,0,0},0}, //1K, vpp, 3.3V
+ {"12F1571",
+ PIC16,8.5,1,Read16F1xxx,{0x400,0,12,0},0x200,Write16F1xxx,{0x400,0,0},0}, //1K, vpp, 3.3V
+ {"12F609,12F615,16F610",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0,9,0},0x40,Write12F61x,{0x400,0,0},0}, //1K, vpp, cal1
+ {"12F752",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0,10,0},0x80,Write12F61x,{0x400,0,0},0}, //1K, vpp, cal1
+ {"16C84,16F84,16F84A",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0x40,8,1},0x10,Write16F8x,{0x400,0x40,-10},0}, //1K, 64, vdd
+ {"12F635",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0x80,10,0},0x80,Write12F6xx,{0x400,0x80,-10},0}, //1K, 128, vpp, cal1 + cal2
+ {"16F631",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0x80,9,0},0x80,Write12F6xx,{0x400,0x80,-10},0}, //1K, 128, vpp, cal1
+ {"12F629,12F675,16F630,16F676",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0x80,8,0},0x20,Write12F62x,{0x400,0x80,-10},0}, //1K, 128, vpp
+ {"16F627",
+ PIC16,13.0,0,Read16Fxxx,{0x400,-0x80,8,0},0x10,Write16F62x,{0x400,0x80,-10},0}, //1K, 128, vpp, ee@0x2200
+ {"16F627A",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0x80,8,0},0x10,Write12F6xx,{0x400,0x80,-10},0}, //1K, 128, vpp
+ {"16F818",
+ PIC16,13.0,0,Read16Fxxx,{0x400,0x80,8,2},0x10,Write16F81x,{0x400,0x80,-10},0}, //1K, 128, vdd short delay
+ {"16F72",
+ PIC16,8.5,1,Read16Fxxx,{0x800,0,8,1},0x20,Write16F7x,{0x800,0,-10},0}, //2K, vdd, 3.3V
+ {"16F720,16F722,16F722A",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0,11,0},0x100,Write16F72x,{0x800,0,0},0}, //2K, vpp, config1-2 + cal1-2, 3.3V
+ {"12C672,12CE674",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0,0,0},0x100,0,{},0}, //2K, vpp
+ {"16F716",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0,8,2},8,Write16F71x,{0x800,1,-10},0}, //2K, vdd
+ {"16F616,12F617",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0,9,0},0x40,Write12F61x,{0x800,0,0},0}, //2K, vpp, cal1
+ {"16F753",
+ PIC16,12.5,0,Read16Fxxx,{0x800,0,10,0},0x80,Write12F61x,{0x800,0,0},0}, //2K, vpp, cal1
+ {"16LF1902,16F1503,16F1507,16F1512",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0,11,0},0x200,Write16F1xxx,{0x800,0,0},0}, //2K, vpp, 3.3V
+ {"12F1572",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0,12,0},0x200,Write16F1xxx,{0x800,0,0},0}, //2K, vpp, 3.3V
+ {"16F1703,16F1707",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0,13,0},0x200,Write16F1xxx,{0x800,0,0},0}, //2K, vpp, 3.3V
+ {"12F1612,16F1613",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0,13,4},0x200,Write16F1xxx,{0x800,0,4},0}, //2K, vpp, 3.3V
+ {"16F15213,16F15223,16F15243,16F15313,16F15323",
+ PIC16,8.5,1,Read16F18xxx,{0x800,0,0,0},0,Write16F18xxx,{0x800,0,0},0}, //2K, vpp, 3.3V, 8b commands
+ {"16F870,16F871,16F872",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x40,8,1},0x100,Write16F87x,{0x800,0x40,-10},0}, //2K, 64, vdd
+ {"16F628",
+ PIC16,13.0,0,Read16Fxxx,{0x800,-0x80,8,0},0x10,Write16F62x,{0x800,0x80,-10},0}, //2K, 128, vpp, ee@0x2200
+ {"16F628A",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x80,8,0},0x10,Write12F6xx,{0x800,0x80,-10},0}, //2K, 128, vpp
+ {"16F882",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x80,10,0},0x80,Write16F88x,{0x800,0x80,-10},0}, //2K, 128, vpp, config2 + cal1
+ {"16F819",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x100,8,2},0x10,Write16F81x,{0x800,0x100,-10},0}, //2K, 256, vdd short delay
+ {"12F683,16F684",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x100,9,0},0x40,Write12F6xx,{0x800,0x100,-10},0}, //2K, 256, vpp, cal1
+ {"16F636,16F639,16F785",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x100,10,0},0x40,Write12F6xx,{0x800,0x100,-10},0}, //2K, 256, vpp, cal1 + cal2
+ {"16F677,16F687",
+ PIC16,13.0,0,Read16Fxxx,{0x800,0x100,9,0},0x80,Write12F6xx,{0x800,0x100,-10},0}, //2K, 256, vpp, cal1
+ {"12F1822,16F1823,16F1826",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0x100,11,0},0x200,Write16F1xxx,{0x800,0x100,0},0}, //2K, 256, vpp, 3.3V
+ {"16F1782",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0x100,19,0},0x200,Write16F1xxx,{0x800,0x100,0},0}, //2K, 256, vpp, 3.3V
+ {"16F18313,16F18323",
+ PIC16,8.5,1,Read16F1xxx,{0x800,0x100,11,0x1C},0x20,Write16F1xxx,{0x800,0x100,0x1C},0}, //2K, 256, vpp, 3.3V, new cmd
+ {"16F18013,16F18023",
+ PIC16,8.5,1,Read16F18xxx,{0x800,1,0,0},0,Write16F18xxx,{0x800,0x100,0},0}, //2K, 256, vpp, 3.3V, 8b commands
+ {"16F73,16F74",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0,8,1},0x20,Write16F7x,{0x1000,0,-10},0}, //4K, vdd
+ {"16F737,16F747",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0,9,2},9,Write16F7x,{0x1000,1,-10},0}, //4K, vdd short/no delay
+ {"16F721,16F723,16F723A,16F724",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0,11,0},0x100,Write16F72x,{0x1000,0,0},0}, //4K, vpp, config1-2 + cal1-2, 3.3V
+ {"16LF1903,16LF1904,16F1508,16F1513,16LF1554",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,11,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F1574,16F1578",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,12,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F1704,16F1708",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,13,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F1614,16F1618",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,13,4},0x200,Write16F1xxx,{0x1000,0,4},0}, //4K, vpp, 3.3V
+ {"16F1713",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,17,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F1783,16F1784",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,19,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F1764,16F1768",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,20,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F1773",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0,24,0},0x200,Write16F1xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V
+ {"16F15214,16F15224,16F15244,16F15254,16F15274,16F15324,16F15344,16F15354",
+ PIC16,8.5,1,Read16F18xxx,{0x1000,0,0,0},0,Write16F18xxx,{0x1000,0,0},0}, //4K, vpp, 3.3V, 8b commands
+ {"16F873A,16F874A",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x80,8,1},0x100,Write16F87xA,{0x1000,0x80,1},0}, //4K, 128, vdd
+ {"16F873,16F874",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,-0x80,8,1},0x100,Write16F87x,{0x1000,-0x80,-10},0}, //4K, 128, vdd, ee@0x2200
+ {"16F685,16F689,16F690",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x100,9,0},0x80,Write12F6xx,{0x1000,0x100,-10},0}, //4K, 256, vpp, cal1
+ {"16F688",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x100,9,0},0x40,Write12F6xx,{0x1000,0x100,-10},0}, //4K, 256, vpp, cal1
+ {"16F883,16F884",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x100,10,0},0x80,Write16F88x,{0x1000,0x100,-10},0}, //4K, 256, vpp, config2 + cal1
+ {"16F648A",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x100,8,0},0x10,Write12F6xx,{0x1000,0x100,-10},0}, //4K, 256, vpp
+ {"16F87,16F88",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x100,9,2},0x10,Write16F81x,{0x1000,0x100,-10},0}, //4K, 256, vdd short delay
+ {"16F913,16F914",
+ PIC16,13.0,0,Read16Fxxx,{0x1000,0x100,10,0},0x40,Write12F6xx,{0x1000,0x100,-10},0}, //4K, 256, vpp, cal1 + cal2
+ {"16F1933,16F1934,16F1824,16F1827,16F1828,12F1840",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0x100,11,0},0x200,Write16F1xxx,{0x1000,0x100,0},0}, //4K, 256, vpp, 3.3V
+ {"16F18324,16F18344",
+ PIC16,8.5,1,Read16F1xxx,{0x1000,0x100,11,0x1C},0x20,Write16F1xxx,{0x1000,0x100,0x1C},0}, //4K, 256, vpp, 3.3V, new cmd
+ {"16F17114,16F17124,16F17144,16F17154,16F17174,16F18014,16F18024,16F18044,16F18054,16F18074,16F18114,16F18124,16F18144,\
+ 16F18154,16F18174,16F18424,16F18444",
+ PIC16,8.5,1,Read16F18xxx,{0x1000,1,0,0},0,Write16F18xxx,{0x1000,0x100,0},0}, //4K, 256, vpp, 3.3V, 8b commands
+ {"16F18854",
+ PIC16,8.5,1,Read16F18xxx,{0x1000,0x100,0,0x10},0,Write16F18xxx,{0x1000,0x100,0x10},0}, //4K, 256, vpp, 3.3V, 8b commands no DIA
+ {"16F76,16F77",
+ PIC16,13.0,0,Read16Fxxx,{0x2000,0,8,1},0x20,Write16F7x,{0x2000,0,-10},0}, //8K, vdd
+ {"16F767,16F777",
+ PIC16,13.0,0,Read16Fxxx,{0x2000,0,9,2},0x40,Write16F7x,{0x2000,1,-10},0}, //8K, vdd short delay
+ {"16F726,16F727,16F707",
+ PIC16,8.5,1,Read16Fxxx,{0x2000,0,11,0},0x100,Write16F72x,{0x2000,0,0},0}, //8K, vpp, config1-2 + cal1-2, 3.3V
+ {"16LF1906,16LF1907,16F1509,16F1454,16F1455,16F1459,16F1516,16F1517,16F1526,16LF1559",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,11,0},0x200,Write16F1xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V
+ {"16F1575,16F1579",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,12,0},0x200,Write16F1xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V
+ {"16F1705,16F1709",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,13,0},0x200,Write16F1xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V
+ {"16F1615,16F1619",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,13,4},0x200,Write16F1xxx,{0x2000,0,4},0}, //8K, vpp, 3.3V
+ {"16F1716,16F1717",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,17,0},0x200,Write16F1xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V
+ {"16F1765,16F1769",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,20,0},0x200,Write16F1xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V
+ {"16F1776,16F1777",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0,24,0},0x200,Write16F1xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V
+ {"16F15225,16F15245,16F15255,16F15275,16F15325,16F15345,16F15355,16F15375,16F15385",
+ PIC16,8.5,1,Read16F18xxx,{0x2000,0,0,0},0,Write16F18xxx,{0x2000,0,0},0}, //8K, vpp, 3.3V, 8b commands
+ {"16F876A,16F877A",
+ PIC16,13.0,0,Read16Fxxx,{0x2000,0x100,8,1},0x100,Write16F87xA,{0x2000,0x100,1},0}, //8K, 256, vdd
+ {"16F876,16F877",
+ PIC16,13.0,0,Read16Fxxx,{0x2000,-0x100,8,1},0x100,Write16F87x,{0x2000,-0x100,-10},0}, //8K, 256, vdd, ee@0x2200
+ {"16F886,16F887",
+ PIC16,11.0,0,Read16Fxxx,{0x2000,0x100,10,0},0x80,Write16F88x,{0x2000,0x100,-10},0}, //8K, 256, vpp, config2 + cal1
+ {"16F916,16F917,16F946",
+ PIC16,13.0,0,Read16Fxxx,{0x2000,0x100,10,0},0x40,Write12F6xx,{0x2000,0x100,-10},0}, //8K, 256, vpp, cal1 + cal2
+ {"16F1936,16F1937,16F1946,16F1825,16F1829,16F1847",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0x100,11,0},0x200,Write16F1xxx,{0x2000,0x100,0},0}, //8K, 256, vpp, 3.3V
+ {"16F1786,16F1787",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0x100,19,0},0x200,Write16F1xxx,{0x2000,0x100,0},0}, //8K, 256, vpp, 3.3V
+ {"16F18325,16F18345",
+ PIC16,8.5,1,Read16F1xxx,{0x2000,0x100,11,0x1C},0x20,Write16F1xxx,{0x2000,0x100,0x1C},0}, //8K, 256, vpp, 3.3V, new cmd
+ {"16F17115,16F17125,16F17145,16F17155,16F17175,16F18015,16F18025,16F18045,16F18055,16F18075,16F18115,16F18125,16F18145,16F18155,16F18175,\
+ 16F18425,16F18445,16F18455,16F19155,16F19175,16F19185,16F19195",
+ PIC16,8.5,1,Read16F18xxx,{0x2000,1,0,0},0,Write16F18xxx,{0x2000,0x100,0},0}, //8K, 256, vpp, 3.3V, 8b commands
+ {"16F18855,16F18875",
+ PIC16,8.5,1,Read16F18xxx,{0x2000,0x100,0,0x10},0,Write16F18xxx,{0x2000,0x100,0x10},0}, //8K, 256, vpp, 3.3V, 8b commands no DIA
+ {"16F1518,16F1519,16F1527",
+ PIC16,8.5,1,Read16F1xxx,{0x4000,0,11,0},0x200,Write16F1xxx,{0x4000,0,0},0}, //16K, vpp, 3.3V
+ {"16F1718,16F1719",
+ PIC16,8.5,1,Read16F1xxx,{0x4000,0,17,0},0x200,Write16F1xxx,{0x4000,0,0},0}, //16K, vpp, 3.3V
+ {"16F1778,16F1779",
+ PIC16,8.5,1,Read16F1xxx,{0x4000,0,24,0},0x200,Write16F1xxx,{0x4000,0,0},0}, //16K, vpp, 3.3V
+ {"16F15256,16F15276,16F15356,16F15376,16F15386",
+ PIC16,8.5,1,Read16F18xxx,{0x4000,0,0,0},0,Write16F18xxx,{0x4000,0,0},0}, //16K, vpp, 3.3V, 8b commands
+ {"16F1938,16F1939,16F1947",
+ PIC16,8.5,1,Read16F1xxx,{0x4000,0x100,11,0},0x200,Write16F1xxx,{0x4000,0x100,0},0}, //16K, 256, vpp, 3.3V
+ {"16F1788,16F1789",
+ PIC16,8.5,1,Read16F1xxx,{0x4000,0x100,19,0},0x200,Write16F1xxx,{0x4000,0x100,0},0}, //16K, 256, vpp, 3.3V
+ {"16F18326,16F18346",
+ PIC16,8.5,1,Read16F1xxx,{0x4000,0x100,11,0x1C},0x20,Write16F1xxx,{0x4000,0x100,0x1C},0}, //16K, 256, vpp, 3.3V, new cmd
+ {"16F17126,16F17146,16F17156,16F17176,16F18026,16F18046,16F18056,16F18076,16F18126,16F18146,16F18156,16F18176,\
+ 16F18426,16F18446,16F18456,16F19156,16F19176,16F19186,16F19196",
+ PIC16,8.5,1,Read16F18xxx,{0x4000,1,0,0},0,Write16F18xxx,{0x4000,0x100,0},0}, //16K, 256, vpp, 3.3V, 8b commands
+ {"16F18856,16F18876",
+ PIC16,8.5,1,Read16F18xxx,{0x4000,0x100,0,0x10},0,Write16F18xxx,{0x4000,0x100,0x10},0}, //16K, 256, vpp, 3.3V, 8b commands no DIA
+ {"16F19197",
+ PIC16,8.5,1,Read16F18xxx,{0x8000,1,0,0},0,Write16F18xxx,{0x8000,0x100,0},0}, //32K, 256, vpp, 3.3V, 8b commands
+ {"16F18857,16F18877",
+ PIC16,8.5,1,Read16F18xxx,{0x8000,0x100,0,0x10},0,Write16F18xxx,{0x8000,0x100,0x10},0}, //32K, 256, vpp, 3.3V, 8b commands no DIA
+//-------------PIC18---------------------------------------------------------
+// Read18Fx options:
+// bit [3:0]
+// 0 = vdd before vpp (12V)
+// 1 = vdd before vpp (9V)
+// 2 = low voltage entry with 32 bit key
+// bit [7:4]
+// 0 = normal control registers address
+// 1 = new control registers address (18FxxK80)
+//
+// Write18Fx options:
+// bit [3:0]
+// 0 = vdd before vpp (12V)
+// 1 = vdd before vpp (9V)
+// 2 = low voltage entry with 32 bit key
+// bit [7:4]
+// 0 = normal eeprom write algoritm
+// 1 = with unlock sequence 55 AA
+// bit [11:8]
+// 0 = 15ms erase delay, 1ms code write time, 5ms EE write, 5ms config write
+// 1 = 550ms erase delay, 1.2ms code write time, no config or EEPROM
+// 2 = 550ms erase delay, 3.4ms code write time, no config or EEPROM
+// 3 = separate block erase with 5ms delay, 1ms code write, 5ms EE write, 5ms config write
+// + new control registers address (18FxxK80)
+ {"18F1230",
+ PIC18,12,0,Read18Fx,{0x1000,0x80,0},0,Write18Fx,{0x1000,0x80,8,0x0F0F,0x8787,0},0}, //4K, 128, 8
+ {"18F2221,18F4221",
+ PIC18,12,0,Read18Fx,{0x1000,0x100,0},0,Write18Fx,{0x1000,0x100,8,0x3F3F,0x8F8F,0},0}, //4K, 256, 8
+ {"18F1220,18F2220,18F4220",
+ PIC18,12,0,Read18Fx,{0x1000,0x100,0},0,Write18Fx,{0x1000,0x100,8,0x10000,0x80,0x10},0}, //4K, 256, 8, EE with unlock
+ {"18F63J11,18F63J90,18F83J11,18F83J90",
+ PIC18,-1,1,Read18Fx,{0x2000,0,2},0,Write18Fx,{0x2000,0,64,0x0101,0x8080,0x202},0}, //8K, 0, 64, LV
+ {"18F1330",
+ PIC18,12,0,Read18Fx,{0x2000,0x80,0},0,Write18Fx,{0x2000,0x80,8,0x0F0F,0x8787,0},0}, //8K, 128, 8
+ {"18F2321,18F4321",
+ PIC18,12,0,Read18Fx,{0x2000,0x100,0},0,Write18Fx,{0x2000,0x100,8,0x3F3F,0x8F8F,0},0}, //8K, 256, 8
+ {"18F1320,18F2320,18F4320,18F2331,18F4331",
+ PIC18,12,0,Read18Fx,{0x2000,0x100,0},0,Write18Fx,{0x2000,0x100,8,0x10000,0x80,0x10},0}, //8K, 256, 8, EE with unlock
+ {"18F13K50,18F13K22",
+ PIC18,8.5,1,Read18Fx,{0x2000,0x100,1},0,Write18Fx,{0x2000,0x100,8,0x0F0F,0x8F8F,1},0}, //8K, 256, 8, 9V
+ {"18F23K20,18F43K20",
+ PIC18,8.5,1,Read18Fx,{0x2000,0x100,1},0,Write18Fx,{0x2000,0x100,16,0x0F0F,0x8F8F,1},0}, //8K, 256, 16, 9V
+ {"18F23K22,18F43K22",
+ PIC18,8.5,1,Read18Fx,{0x2000,0x100,1},0,Write18Fx,{0x2000,0x100,64,0x0F0F,0x8F8F,1},0}, //8K, 256, 64, 9V
+ {"18F2439,18F4439",
+ PIC18,12,0,Read18Fx,{0x3000,0x100,0},0,Write18Fx,{0x3000,0x100,8,0x10000,0x80,0x10},0}, //12K, 256, 8, EE with unlock
+ {"18F2410,18F4410",
+ PIC18,12,0,Read18Fx,{0x4000,0,0},0,Write18Fx,{0x4000,0,32,0x3F3F,0x8F8F,0},0}, //16K, 0, 32
+ {"18F24J10,18F44J10,18F64J11,18F64J90,18F84J11,18F84J90",
+ PIC18,-1,1,Read18Fx,{0x4000,0,2},0,Write18Fx,{0x4000,0,64,0x0101,0x8080,0x202},0}, //16K, 0, 64, LV
+ {"18F24J11,18F24J50,18F44J11,18F44J50",
+ PIC18,-1,1,Read18Fx,{0x4000,0,2},0,Write18Fx,{0x4000,0,64,0x0101,0x8080,0x102},0}, //16K, 0, 64, LV
+ {"18F2420,18F2423,18F4420,18F4423,18F2480,18F4480",
+ PIC18,12,0,Read18Fx,{0x4000,0x100,0},0,Write18Fx,{0x4000,0x100,32,0x3F3F,0x8F8F,0},0}, //16K, 256, 32
+ {"18F2431,18F4431,18F242,18F248,18F442,18F448",
+ PIC18,12,0,Read18Fx,{0x4000,0x100,0},0,Write18Fx,{0x4000,0x100,8,0x10000,0x80,0x10},0}, //16K, 256, 8, EE with unlock
+ {"18F2450,18F4450",
+ PIC18,12,0,Read18Fx,{0x4000,0,0},0,Write18Fx,{0x4000,0,16,0x3F3F,0x8F8F,0},0}, //16K, 0, 16
+ {"18F14K50,18F14K22",
+ PIC18,8.5,1,Read18Fx,{0x4000,0x100,1},0,Write18Fx,{0x4000,0x100,16,0x0F0F,0x8F8F,1},0}, //16K, 256, 16, 9V
+ {"18F24K20,18F44K20",
+ PIC18,8.5,1,Read18Fx,{0x4000,0x100,1},0,Write18Fx,{0x4000,0x100,32,0x0F0F,0x8F8F,1},0}, //16K, 256, 32, 9V
+ {"18F24K22,18F44K22,18F24K50",
+ PIC18,8.5,1,Read18Fx,{0x4000,0x100,1},0,Write18Fx,{0x4000,0x100,64,0x0F0F,0x8F8F,1},0}, //16K, 256, 64, 9V
+ {"18F04Q40,18F14Q40,18F04Q41,18F14Q41,18F24Q71,18F44Q71,18F54Q71",
+ PIC18,8.5,1,Read18FKx,{0x4000,1,0x10},0,Write18FKx,{0x4000,0x200,0x10,0,0,0},0}, //16K, 256, --, LV
+ {"18F2455,18F2458,18F4455,18F4458",
+ PIC18,12,0,Read18Fx,{0x6000,0x100,0},0,Write18Fx,{0x6000,0x100,32,0x3F3F,0x8F8F,0},0}, //24K, 256, 32
+ {"18F2539,18F4539",
+ PIC18,12,0,Read18Fx,{0x6000,0x100,0},0,Write18Fx,{0x6000,0x100,8,0x10000,0x80,0x10},0}, //24K, 256, 8, EE with unlock
+ {"18F2510,18F4510",
+ PIC18,12,0,Read18Fx,{0x8000,0,0},0,Write18Fx,{0x8000,0,32,0x3F3F,0x8F8F,0},0}, //32K, 0, 32
+ {"18F25J10,18F45J10,18F65J10,18F65J11,18F65J50,18F65J90,18F85J10,18F85J11,18F85J50,18F85J90",
+ PIC18,-1,1,Read18Fx,{0x8000,0,2},0,Write18Fx,{0x8000,0,64,0x0101,0x8080,0x202},0}, //32K, 0, 64, LV
+ {"18F25J11,18F25J50,18F45J11,18F45J50",
+ PIC18,-1,1,Read18Fx,{0x8000,0,2},0,Write18Fx,{0x8000,0,64,0x0101,0x8080,0x102},0}, //32K, 0, 64, LV
+ {"18F252,18F258,18F452,18F458",
+ PIC18,12,0,Read18Fx,{0x8000,0x100,0},0,Write18Fx,{0x8000,0x100,8,0x10000,0x80,0x10},0}, //32K, 256, 8, EE with unlock
+ {"18F2550,18F2553,18F4550,18F4553,18F2520,18F2523,18F4520,18F4523,18F2580,18F4580",
+ PIC18,12,0,Read18Fx,{0x8000,0x100,0},0,Write18Fx,{0x8000,0x100,32,0x3F3F,0x8F8F,0},0}, //32K, 256, 32
+ {"18F25K20,18F45K20",
+ PIC18,8.5,1,Read18Fx,{0x8000,0x100,1},0,Write18Fx,{0x8000,0x100,32,0x0F0F,0x8F8F,1},0}, //32K, 256, 32, 9V
+ {"18F25K22,18F45K22,18F25K50,18F45K50",
+ PIC18,8.5,1,Read18Fx,{0x8000,0x100,1},0,Write18Fx,{0x8000,0x100,64,0x0F0F,0x8F8F,1},0}, //32K, 256, 64, 9V
+ {"18F25K42,18F45K42,18F55K42",
+ PIC18,8.5,1,Read18FKx,{0x8000,1,0},0,Write18FKx,{0x8000,0x100,0,0,0,0},0}, //32K, 256, --, LV
+ {"18F05Q40,18F15Q40,18F05Q41,18F15Q41,18F25Q71,18F45Q71,18F55Q71",
+ PIC18,8.5,1,Read18FKx,{0x8000,1,0x10},0,Write18FKx,{0x8000,0x200,0x10,0,0,0},0}, //32K, 256, --, LV
+ {"18F25K80,18F45K80,18F65K80",
+ PIC18,8.5,1,Read18Fx,{0x8000,0x400,0x13},0,Write18Fx,{0x8000,0x400,64,0,0,0x303},0}, //32K, 1K, 64, 9V, xxK80
+ {"18F8520",
+ PIC18,12,0,Read18Fx,{0x8000,0x400,0},0,Write18Fx,{0x8000,0x400,8,0x10000,0x0080,0x10},0},//32K, 1K, 8, EE with unlock
+ {"18F25Q43,18F45Q43,18F55Q43",
+ PIC18,8.5,1,Read18FKx,{0x8000,1,0x10},0,Write18FKx,{0x8000,0x400,0x10,0,0,0},0}, //32K, 1k, --, LV
+ {"18F25K83",
+ PIC18,8.5,1,Read18FKx,{0x8000,1,0},0,Write18FKx,{0x8000,0x400,0,0,0,0},0}, //32K, 1k, --, LV
+ {"18F2515,18F4515",
+ PIC18,12,0,Read18Fx,{0xC000,0,0},0,Write18Fx,{0xC000,0,64,0x3F3F,0x8F8F,0},0}, //48K, 0, 64
+ {"18F65J15,18F85J15",
+ PIC18,-1,1,Read18Fx,{0xC000,0,2},0,Write18Fx,{0xC000,0,64,0x0101,0x8080,0x202},0}, //48K, 0, 64, LV
+ {"18F2525,18F2585,18F4525,18F4585",
+ PIC18,12,0,Read18Fx,{0xC000,0x400,0},0,Write18Fx,{0xC000,0x400,64,0x3F3F,0x8F8F,0},0}, //48K, 1K, 64
+ {"18F2610,18F4610",
+ PIC18,12,0,Read18Fx,{0x10000,0,0},0,Write18Fx,{0x10000,0,64,0x3F3F,0x8F8F,0},0}, //64K, 0, 64
+ {"18F26J11,18F26J13,18F26J50,18F26J53,18F46J11,18F46J13,18F46J50,18F46J53",
+ PIC18,-1,1,Read18Fx,{0x10000,0,2},0,Write18Fx,{0x10000,0,64,0x0101,0x8080,0x102},0}, //64K, 0, 64, LV
+ {"18F66J60,18F86J60,18F96J60,18F66J10,18F66J11,18F66J50,18F66J90,18F66J93,18F86J10,18F86J11,18F86J50,18F86J72,18F86J90,18F86J93",
+ PIC18,-1,1,Read18Fx,{0x10000,0,2},0,Write18Fx,{0x10000,0,64,0x0101,0x8080,0x202},0}, //64K, 0, 64, LV
+ {"18F2620,18F2680,18F4620,18F4680",
+ PIC18,12,0,Read18Fx,{0x10000,0x400,0},0,Write18Fx,{0x10000,0x400,64,0x3F3F,0x8F8F,0},0},//64K, 1K, 64
+ {"18F26K20,18F46K20,18F26K22,18F46K22,18F26K50,18F46K50",
+ PIC18,12,0,Read18Fx,{0x10000,0x100,1},0,Write18Fx,{0x10000,0x100,64,0x0F0F,0x8F8F,1},0},//64K, 256, 64, 9V
+ {"18F06Q40,18F16Q40,18F06Q41,18F16Q41,18F26Q71,18F46Q71,18F56Q71",
+ PIC18,8.5,1,Read18FKx,{0x10000,1,0x10},0,Write18FKx,{0x10000,0x200,0x10,0,0,0},0}, //64K, 256, --, LV
+ {"18F26K80,18F46K80,18F66K80",
+ PIC18,8.5,1,Read18Fx,{0x10000,0x400,0x13},0,Write18Fx,{0x10000,0x400,64,0,0,0x303},0}, //64K, 1K, 64, 9V, xxK80
+ {"18F26Q43,18F46Q43,18F56Q43",
+ PIC18,8.5,1,Read18FKx,{0x10000,1,0x10},0,Write18FKx,{0x10000,0x400,0x10,0,0,0},0}, //64K, 1k, --, LV
+ {"18F26K42,18F46K42,18F56K42,18F26K83",
+ PIC18,8.5,1,Read18FKx,{0x10000,1,0},0,Write18FKx,{0x10000,0x400,0,0,0,0},0}, //64K, 1k, --, LV
+ {"18F26Q83,18F26Q84,18F46Q83,18F46Q84,18F56Q83,18F56Q84",
+ PIC18,8.5,1,Read18FKx,{0x10000,1,0x20},0,Write18FKx,{0x10000,0x400,0x20,0,0,0},0}, //64K, 1k, --, LV
+ {"18F2682,18F4682",
+ PIC18,12,0,Read18Fx,{0x14000,0x400,0},0,Write18Fx,{0x14000,0x400,64,0x3F3F,0x8F8F,0},0},//80K, 1K, 64
+ {"18F66J65,18F86J65,18F96J65,18F66J15,18F66J16,18F66J55,18F86J15,18F86J16,18F86J55",
+ PIC18,-1,1,Read18Fx,{0x18000,0,2},0,Write18Fx,{0x18000,0,64,0x0101,0x8080,0x202},0}, //96K, 0, 64, LV
+ {"18F2685,18F4685",
+ PIC18,12,0,Read18Fx,{0x18000,0x400,0},0,Write18Fx,{0x18000,0x400,64,0x3F3F,0x8F8F,0},0},//96K, 1K, 64
+ {"18F27J13,18F27J53,18F47J13,18F47J53,18F67J10,18F87J10",
+ PIC18,-1,1,Read18Fx,{0x20000,0,2},0,Write18Fx,{0x20000,0,64,0x0101,0x8080,0x102},0}, //128K, 0, 64, LV
+ {"18F67J60,18F87J60,18F97J60,18F67J11,18F67J50,18F67J90,18F67J93,18F87J11,18F87J50,18F87J72,18F87J90,18F87J93",
+ PIC18,-1,1,Read18Fx,{0x20000,0,2},0,Write18Fx,{0x20000,0,64,0x0101,0x8080,0x202},0}, //128K, 0, 64, LV
+ {"18F8722",
+ PIC18,12,0,Read18Fx,{0x20000,0x400,0},0,Write18Fx,{0x20000,0x400,64,0xFFFF,0x8787,0},0},//128K, 1K, 64
+ {"18F27Q43,18F47Q43,18F57Q43",
+ PIC18,8.5,1,Read18FKx,{0x20000,1,0x10},0,Write18FKx,{0x20000,0x400,0x10,0,0,0},0}, //128K, 1k, --, LV
+ {"18F27K42,18F47K42,18F57K42",
+ PIC18,8.5,1,Read18FKx,{0x20000,1,0},0,Write18FKx,{0x20000,0x400,0,0,0,0},0}, //128K, 1k, --, LV
+ {"18F27Q83,18F27Q84,18F47Q83,18F47Q84,18F57Q83,18F57Q84",
+ PIC18,8.5,1,Read18FKx,{0x20000,1,0x20},0,Write18FKx,{0x20000,0x400,0x20,0,0,0},0}, //128K, 1k, --, LV
+//-------------PIC24---------------------------------------------------------
+// options:
+// bit [3:0]
+// 0 = low voltage ICSP entry
+// 1 = High voltage ICSP entry (6V)
+// 2 = High voltage ICSP entry (12V) + PIC30F sequence (additional NOPs)
+// 3 = low voltage ICSP entry (5V power supply)
+// bit [7:4]
+// 0 = config area in the last 2 program words
+// 1 = config area in the last 3 program words
+// 2 = config area in the last 4 program words
+// 3 = 0xF80000 to 0xF80010 except 02 (24F)
+// 4 = 0xF80000 to 0xF80016 (24H-33F)
+// 5 = 0xF80000 to 0xF8000C (x16 bit, 30F)
+// 6 = 0xF80000 to 0xF8000E (30FSMPS)
+// bit [11:8]
+// 0 = code erase word is 0x4064, row write is 0x4004
+// 1 = code erase word is 0x404F, row write is 0x4001
+// 2 = code erase word is 0x407F, row write is 0x4001, 55AA unlock and external timing (2 ms)
+// 3 = code erase word is 0x407F, row write is 0x4001, 55AA unlock and external timing (200 ms)
+// bit [15:12]
+// 0 = eeprom erase word is 0x4050, write word is 0x4004
+// 1 = eeprom erased with bulk erase, write word is 0x4004
+// 2 = eeprom erased with special sequence, write word is 0x4004
+// bit [19:16]
+// 0 = config write is 0x4000
+// 1 = config write is 0x4003
+// 2 = config write is 0x4004
+// 3 = config write is 0x4008
+ {"24F04KA200,24F04KA201",
+ PIC24,6,1,Read24Fx,{0xB00,0,0x31,0x05BE},0x800,Write24Fx,{0xB00,0,0x20031,0x05BE,32},2.0}, //1.375KW, HV
+ {"24F08KA101,24F08KA102",
+ PIC24,6,1,Read24Fx,{0x1600,0x200,0x31,0x05BE},0x800,Write24Fx,{0x1600,0x200,0x20031,0x05BE,32},2.0}, //2.75KW, HV, 512
+ {"24F16KA101,24F16KA102",
+ PIC24,6,1,Read24Fx,{0x2C00,0x200,0x31,0x05BE},0x800,Write24Fx,{0x2C00,0x200,0x20031,0x05BE,32},2.0}, //5.5KW, HV, 512
+ {"24FJ16GA002,24FJ16GA004",
+ PIC24,-1,1,Read24Fx,{0x2C00,0,0,0x05BE},0x800,Write24Fx,{0x2C00,0,0x10100,0x05BE,64},2.0}, //5.5KW
+ {"24FJ32GA002,24FJ32GA004",
+ PIC24,-1,1,Read24Fx,{0x5800,0,0,0x05BE},0x800,Write24Fx,{0x5800,0,0x10100,0x05BE,64},2.0}, //11KW
+ {"24FJ32GA102,24FJ32GA104,24FJ32GB002,24FJ32GB004",
+ PIC24,-1,1,Read24Fx,{0x5800,0,0x20,0x07F0},0x800,Write24Fx,{0x5800,0,0x10120,0x07F0,64},2.0}, //11KW 4 Config Word
+ {"24FJ48GA002,24FJ48GA004",
+ PIC24,-1,1,Read24Fx,{0x8400,0,0,0x05BE},0x800,Write24Fx,{0x8400,0,0x10100,0x05BE,64},2.0}, //16.5KW
+ {"24FJ64GA002,24FJ64GA004,24FJ64GA006,24FJ64GA008,24FJ64GA010",
+ PIC24,-1,1,Read24Fx,{0xAC00,0,0,0x05BE},0x800,Write24Fx,{0xAC00,0,0x10100,0x05BE,64},2.0}, //22KW
+ {"24FJ64GA102,24FJ64GA104,24FJ64GB002,24FJ64GB004",
+ PIC24,-1,1,Read24Fx,{0xAC00,0,0x20,0x07F0},0x800,Write24Fx,{0xAC00,0,0x10120,0x07F0,64},2.0}, //22KW 4 Config Word
+ {"24FJ64GA306,24FJ64GA308,24FJ64GA310,24FJ64GC006,24FJ64GC008,24FJ64GC010",
+ PIC24,-1,1,Read24Fx,{0xAC00,0,0x120,0x07F0},0x800,Write24Fx,{0xAC00,0,0x110120,0x07F0,64},2.0}, //22KW 4 Config Word new TABLPAG
+ {"24FJ64GB106,24FJ64GB108,24FJ64GB110",
+ PIC24,-1,1,Read24Fx,{0xAC00,0,0x10,0x07F0},0x800,Write24Fx,{0xAC00,0,0x10110,0x07F0,64},2.0}, //22KW 3 Config Word
+ {"24FJ96GA006,24FJ96GA008,24FJ96GA010",
+ PIC24,-1,1,Read24Fx,{0x10000,0,0,0x05BE},0x800,Write24Fx,{0x10000,0,0x10100,0x05BE,64},2.0}, //32KW
+ {"24FJ128GA006,24FJ128GA008,24FJ128GA010",
+ PIC24,-1,1,Read24Fx,{0x15800,0,0,0x05BE},0x800,Write24Fx,{0x15800,0,0x10100,0x05BE,64},2.0}, //44KW
+ {"24FJ128GA106,24FJ128GA108,24FJ128GA110,24FJ128GB106,24FJ128GB108,24FJ128GB110",
+ PIC24,-1,1,Read24Fx,{0x15800,0,0x10,0x07F0},0x800,Write24Fx,{0x15800,0,0x10110,0x07F0,64},2.0}, //44KW 3 Config Word
+ {"24FJ128GA306,24FJ128GA308,24FJ128GA310,24FJ128GB206,24FJ128GB210,24FJ128GC006,24FJ128GC008,\
+24FJ128GC010,24FJ128DA106,24FJ128DA110,24FJ128DA206,24FJ128DA210",
+ PIC24,-1,1,Read24Fx,{0x15800,0,0x120,0x07F0},0x800,Write24Fx,{0x15800,0,0x110120,0x07F0,64},2.0}, //44KW 4 Config Word new TABLPAG
+ {"24FJ192GA106,24FJ192GA108,24FJ192GA110,24FJ192GB106,24FJ192GB108,24FJ192GB110",
+ PIC24,-1,1,Read24Fx,{0x20C00,0,0x10,0x07F0},0x800,Write24Fx,{0x20C00,0,0x10110,0x07F0,64},2.0}, //68KW 3 Config Word
+ {"24FJ256GA106,24FJ256GA108,24FJ256GA110,24FJ256GB106,24FJ256GB108,24FJ256GB110",
+ PIC24,-1,1,Read24Fx,{0x2AC00,0,0x10,0x07F0},0x800,Write24Fx,{0x2AC00,0,0x10110,0x07F0,64},2.0}, //88KW 3 Config Word
+ {"24FJ256DA106,24FJ256DA110,24FJ256DA206,24FJ256DA210,24FJ256GB206,24FJ256GB210",
+ PIC24,-1,1,Read24Fx,{0x2AC00,0,0x120,0x07F0},0x800,Write24Fx,{0x2AC00,0,0x110120,0x07F0,64},2.0}, //88KW 4 Config Word new TABLPAG
+ {"33FJ06GS101,33FJ06GS102,33FJ06GS202",
+ PIC24,-1,1,Read24Fx,{0x1000,0,0x40,0x07F0},0x800,Write24Fx,{0x1000,0,0x00140,0x07F0,64},2.0}, //2KW
+ {"24HJ12GP201,24HJ12GP202,33FJ12GP201,33FJ12GP202,33FJ12MC201,33FJ12MC202",
+ PIC24,-1,1,Read24Fx,{0x2000,0,0x40,0x07F0},0x800,Write24Fx,{0x2000,0,0x00140,0x07F0,64},2.0}, //4KW
+ {"24HJ16GP304,33FJ16GP304,33FJ16GS402,33FJ16GS404,33FJ16GS502,33FJ16GS504,33FJ16MC304",
+ PIC24,-1,1,Read24Fx,{0x2C00,0,0x40,0x07F0},0x800,Write24Fx,{0x2C00,0,0x00140,0x07F0,64},2.0}, //5.5KW
+ {"24HJ32GP202,24HJ32GP204,24HJ32GP302,24HJ32GP304,33FJ32GP202,33FJ32GP204,33FJ32GP302,\
+33FJ32GP304,33FJ32GS406,33FJ32GS606,33FJ32GS608,33FJ32GS610,33FJ32MC202,33FJ32MC204,33FJ32MC302,33FJ32MC304",
+ PIC24,-1,1,Read24Fx,{0x5800,0,0x40,0x07F0},0x1000,Write24Fx,{0x5800,0,0x00140,0x07F0,64},2.0}, //11KW
+ {"24HJ64GP202,24HJ64GP204,24HJ64GP206,24HJ64GP210,24HJ64GP502,24HJ64GP504,24HJ64GP506,24HJ64GP510,\
+33FJ64GP202,33FJ64GP204,33FJ64GP206,33FJ64GP306,33FJ64GP310,33FJ64GP706,33FJ64GP708,33FJ64GP710,33FJ64GP802,\
+33FJ64GP804,33FJ64GS406,33FJ64GS606,33FJ64GS608,33FJ64GS610,33FJ64MC202,33FJ64MC204,33FJ64MC506,33FJ64MC508,33FJ64MC510,\
+33FJ64MC706,33FJ64MC710,33FJ64MC802,33FJ64MC804",
+ PIC24,-1,1,Read24Fx,{0xAC00,0,0x40,0x07F0},0x1000,Write24Fx,{0xAC00,0,0x00140,0x07F0,64},2.0}, //22KW
+ {"24HJ128GP202,24HJ128GP204,24HJ128GP206,24HJ128GP210,24HJ128GP306,24HJ128GP310,24HJ128GP502,\
+24HJ128GP504,24HJ128GP506,24HJ128GP510,\
+33FJ128GP202,33FJ128GP204,33FJ128GP206,33FJ128GP306,33FJ128GP310,33FJ128GP706,33FJ128GP708,33FJ128GP710,\
+33FJ128GP802,33FJ128GP804,33FJ128MC202,33FJ128MC204,33FJ128MC506,33FJ128MC510,33FJ128MC706,33FJ128MC708,\
+33FJ128MC710,33FJ128MC802,33FJ128MC804",
+ PIC24,-1,1,Read24Fx,{0x15800,0,0x40,0x07F0},0x1000,Write24Fx,{0x15800,0,0x00140,0x07F0,64},2.0}, //44KW
+ {"24HJ256GP206,24HJ256GP210,24HJ256GP610,\
+33FJ256GP506,33FJ256GP510,33FJ256GP710,33FJ256MC510,33FJ256MC710",
+ PIC24,-1,1,Read24Fx,{0x2AC00,0,0x40,0x07F0},0x1000,Write24Fx,{0x2AC00,0,0x00140,0x07F0,64},2.0}, //88KW
+ {"24EP32GP202,24EP32GP203,24EP32GP204,33EP32GP502,33EP32GP503,33EP32GP504,\
+24EP32MC202,24EP32MC203,24EP32MC204,33EP32MC202,33EP32MC203,33EP32MC204,33EP32MC502,33EP32MC503,33EP32MC504",
+ PIC24,-1,1,Read24Ex,{0x5800,0,0,0x0FF0},0x1000,Write24Ex,{0x5800,0,0,0,0,0},2.0}, //11KW 10 Config Word
+ {"24EP64GP202,24EP64GP203,24EP64GP204,24EP64GP206,33EP64GP502,33EP64GP503,33EP64GP504,33EP64GP506,\
+24EP64MC202,24EP64MC203,24EP64MC204,24EP64MC206,33EP64MC202,33EP64MC203,33EP64MC204,33EP64MC206,\
+33EP64MC502,33EP64MC503,33EP64MC504,33EP64MC506",
+ PIC24,-1,1,Read24Ex,{0xB000,0,0,0x0FF0},0x1000,Write24Ex,{0xB000,0,0,0,0,0},2.0}, //22.5KW 10 Config Word
+ {"24EP128GP202,24EP128GP204,24EP128GP206,33EP128GP502,33EP128GP504,33EP128GP506,\
+24EP128MC202,24EP128MC204,24EP128MC206,33EP128MC202,33EP128MC204,33EP128MC206,\
+33EP128MC502,33EP128MC504,33EP128MC506",
+ PIC24,-1,1,Read24Ex,{0x15800,0,0,0x0FF0},0x1000,Write24Ex,{0x15800,0,0,0,0,0},2.0}, //44KW 10 Config Word
+ {"24EP256GP202,24EP256GP204,24EP256GP206,33EP256GP502,33EP256GP504,33EP256GP506,\
+24EP256MC202,24EP256MC204,24EP256MC206,33EP256MC202,33EP256MC204,33EP256MC206,\
+33EP256MC502,33EP256MC504,33EP256MC506",
+ PIC24,-1,1,Read24Ex,{0x2B000,0,0,0x0FF0},0x1000,Write24Ex,{0x2B000,0,0,0,0,0},2.0}, //88KW 10 Config Word
+ {"24EP512GP202,24EP512GP204,24EP512GP206,33EP512GP502,33EP512GP504,33EP512GP506,\
+24EP512MC202,24EP512MC204,24EP512MC206,33EP512MC202,33EP512MC204,33EP512MC206,\
+33EP512MC502,33EP512MC504,33EP512MC506",
+ PIC24,-1,1,Read24Ex,{0x56000,0,0,0x0FF0},0x1000,Write24Ex,{0x56000,0,0,0,0,0},2.0}, //175KW 10 Config Word
+ {"30F1010",
+ PIC24,-1,0,Read24Fx,{0x1000,0,0x63,0x05BE},0x600,Write24Fx,{0x1000,0,0x30263,0x05BE,32},2.0}, //1KW, LV5V
+ {"30F2020,30F2023",
+ PIC24,-1,0,Read24Fx,{0x2000,0,0x63,0x05BE},0x600,Write24Fx,{0x2000,0,0x30263,0x05BE,32},2.0}, //2KW, LV5V
+ {"30F2010",
+ PIC24,12,0,Read24Fx,{0x2000,0x400,0x52,0x05BE},0x600,Write24Fx,{0x2000,0x400,0x31252,0x05BE,32},2.0}, //4KW, 1K, HV12
+ {"30F2011,30F2012",
+ PIC24,12,0,Read24Fx,{0x2000,0,0x52,0x05BE},0x600,Write24Fx,{0x2000,0,0x31252,0x05BE,32},2.0}, //4KW, HV12
+ {"30F3010,30F3011,30F3012,30F3013,30F3014",
+ PIC24,12,0,Read24Fx,{0x4000,0x400,0x52,0x05BE},0x600,Write24Fx,{0x4000,0x400,0x31252,0x05BE,32},2.0}, //8KW, 1K, HV12
+ {"30F4011,30F4012,30F4013",
+ PIC24,12,0,Read24Fx,{0x8000,0x400,0x52,0x05BE},0x600,Write24Fx,{0x8000,0x400,0x31252,0x05BE,32},2.0}, //16KW, 1K, HV12
+ {"30F5011,30F5013,30F5015,30F5016",
+ PIC24,12,0,Read24Fx,{0xB000,0x400,0x52,0x05BE},0x600,Write24Fx,{0xB000,0x400,0x31252,0x05BE,32},2.0}, //22KW, 1K, HV12
+ {"30F6011,30F6013",
+ PIC24,12,0,Read24Fx,{0x16000,0x800,0x52,0x05BE},0x600,Write24Fx,{0x16000,0x800,0x31252,0x05BE,32},2.0}, //44KW, 2K, HV12
+ {"30F6010,30F6012,30F6014,30F6015",
+ PIC24,12,0,Read24Fx,{0x18000,0x1000,0x52,0x05BE},0x600,Write24Fx,{0x18000,0x1000,0x31252,0x05BE,32},2.0}, //49KW, 4K, HV12
+//-------------PIC32---------------------------------------------------------
+// options:
+// {"32MX270F256",
+// PIC32,-1,1,Read32x,{0x40000,0},0x800,0,{0,0,0,0,0},0.0}, //256K
+//-------------ATMEL---------------------------------------------------------
+ {"AT90S1200",
+ AVR,-1,0,ReadAT,{0x400,0x40,0},0,WriteAT,{0x400,0x40,0,0},0}, //1K, 64
+ {"ATtiny11",
+ AVR,12,0,ReadAT_HV,{0x400,0,LOCK+FUSE+CAL},0,WriteAT_HV,{0x400,0,0,0},0}, //1K, HV
+ {"ATtiny12",
+ AVR,12,0,ReadAT_HV,{0x400,0x40,LOCK+FUSE+CAL},0,WriteAT_HV,{0x400,0x40,0,0},0}, //1K, 64, HV
+ {"ATtiny13",
+ AVR,12,0,ReadAT_HV,{0x400,0x40,LOCK+FUSE+FUSE_H+CAL},0,WriteAT_HV,{0x400,0x40,16,0},0}, //1K, 64, HV
+ {"AT90S2313",
+ AVR,-1,0,ReadAT,{0x800,0x80,0},0,WriteAT,{0x800,0x80,0,0},0}, //2K, 128
+ {"ATtiny2313",
+ AVR,-1,0,ReadAT,{0x800,0x80,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x800,0x80,16,0},0},//2K, 128
+ {"ATtiny24,ATtiny25",
+ AVR,12,0,ReadAT_HV,{0x800,0x80,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteAT_HV,{0x800,0x80,16,0},0}, //2K, 128, HV
+ {"ATtiny26",
+ AVR,-1,0,ReadAT,{0x800,0x80,LOCK+FUSE+FUSE_H+CAL},0,WriteATmega,{0x800,0x80,16,0},0}, //2K, 128
+ {"ATtiny261",
+ AVR,-1,0,ReadAT,{0x800,0x80,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x800,0x80,16,0},0}, //2K, 128
+ {"ATtiny44,ATtiny45",
+ AVR,12,0,ReadAT_HV,{0x1000,0x100,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteAT_HV,{0x1000,0x100,32,0},0}, //4K, 256, HV
+ {"ATtiny461,ATtiny4313,ATmega48",
+ AVR,-1,0,ReadAT,{0x1000,0x100,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x1000,0x100,32,0},0}, //4K, 256
+ {"ATtiny48",
+ AVR,-1,0,ReadAT,{0x1000,0x40,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x1000,0x40,32,0},0}, //4K, 64
+ {"ATtiny88",
+ AVR,-1,0,ReadAT,{0x2000,0x40,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x2000,0x40,32,0},0}, //8K, 64
+ {"AT90S8515,AT90S8535",
+ AVR,-1,0,ReadAT,{0x2000,0x100,0},0,WriteAT,{0x2000,0x100,0,0},0}, //8K, 256
+ {"ATmega8,ATmega8515,ATmega8535",
+ AVR,-1,0,ReadAT,{0x2000,0x200,LOCK+FUSE+FUSE_H+CAL},0,WriteATmega,{0x2000,0x200,32,0},0}, //8K, 512
+ {"ATmega88,ATtiny861",
+ AVR,-1,0,ReadAT,{0x2000,0x200,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x2000,0x200,32,0},0}, //8K, 512
+ {"ATtiny84,ATtiny85",
+ AVR,12,0,ReadAT_HV,{0x2000,0x200,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteAT_HV,{0x2000,0x200,32,0},0}, //8K, 512, HV
+ {"ATmega16",
+ AVR,-1,0,ReadAT,{0x4000,0x200,LOCK+FUSE+FUSE_H+CAL},0,WriteATmega,{0x4000,0x200,64,0},0}, //16K, 512
+ {"ATmega164,ATmega168",
+ AVR,-1,0,ReadAT,{0x4000,0x200,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x4000,0x200,64,0},0}, //16K, 512
+ {"ATmega32",
+ AVR,-1,0,ReadAT,{0x8000,0x400,LOCK+FUSE+FUSE_H+CAL},0,WriteATmega,{0x8000,0x400,64,0},0}, //32K, 1K
+ {"ATmega324,ATmega328",
+ AVR,-1,0,ReadAT,{0x8000,0x400,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x8000,0x400,64,0},0}, //32K, 1K
+ {"ATmega64,ATmega644",
+ AVR,-1,0,ReadAT,{0x10000,0x800,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x10000,0x800,128,0},0}, //64K, 2K
+ {"ATmega1284",
+ AVR,-1,0,ReadAT,{0x20000,0x1000,LOCK+FUSE+FUSE_H+FUSE_X+CAL},0,WriteATmega,{0x20000,0x1000,128,0},0},//128K, 4K
+//-------------I2C---------------------------------------------------------
+ {"2400",
+ I2CEE,-1,0,ReadI2C,{0x10,0},0,WriteI2C,{0x10,0,1},0}, //16, 1B addr.
+ {"2401",
+ I2CEE,-1,0,ReadI2C,{0x80,0},0,WriteI2C,{0x80,0,8},0}, //128, 1B addr.
+ {"2402",
+ I2CEE,-1,0,ReadI2C,{0x100,0},0,WriteI2C,{0x100,0,8},0}, //256, 1B addr.
+ {"2404",
+ I2CEE,-1,0,ReadI2C,{0x200,0},0,WriteI2C,{0x200,0,16},0}, //512, 1B addr.
+ {"2408",
+ I2CEE,-1,0,ReadI2C,{0x400,0},0,WriteI2C,{0x400,0,16},0}, //1K, 1B addr.
+ {"2416",
+ I2CEE,-1,0,ReadI2C,{0x800,0},0,WriteI2C,{0x800,0,16},0}, //2K, 1B addr.
+ {"2432",
+ I2CEE,-1,0,ReadI2C,{0x1000,1},0,WriteI2C,{0x1000,1,32},0}, //4K, 2B addr.
+ {"2464",
+ I2CEE,-1,0,ReadI2C,{0x2000,1},0,WriteI2C,{0x2000,1,32},0}, //8K, 2B addr.
+ {"24128",
+ I2CEE,-1,0,ReadI2C,{0x4000,1},0,WriteI2C,{0x4000,1,64},0}, //16K, 2B addr.
+ {"24256",
+ I2CEE,-1,0,ReadI2C,{0x8000,1},0,WriteI2C,{0x8000,1,64},0}, //32K, 2B addr.
+ {"24512",
+ I2CEE,-1,0,ReadI2C,{0x10000,1},0,WriteI2C,{0x10000,1,128},0}, //64K, 2B addr.
+ {"241024",
+ I2CEE,-1,0,ReadI2C,{0x20000,0x201},0,WriteI2C,{0x20000,0x201,256},0}, //128K, 2B addr.
+ {"241025",
+ I2CEE,-1,0,ReadI2C,{0x20000,0x841},0,WriteI2C,{0x20000,0x841,128},0}, //128K, 2B addr.
+//-------------Microwire EEPROM---------------------------------------------------------
+ {"93S46",
+ UWEE,-1,0,Read93x,{0x80,6,0},0,Write93Sx,{0x80,6,8},0}, //128, 6b addr, 4W page
+ {"93x46",
+ UWEE,-1,0,Read93x,{0x80,6,0},0,Write93Cx,{0x80,6,0},0}, //128, 6b addr
+ {"93x46A",
+ UWEE,-1,0,Read93x,{0x80,7,1},0,Write93Cx,{0x80,7,1},0}, //128, 6b addr x8
+ {"93S56",
+ UWEE,-1,0,Read93x,{0x100,8,0},0,Write93Sx,{0x100,8,8},0}, //256, 8b addr, 4W page
+ {"93x56",
+ UWEE,-1,0,Read93x,{0x100,8,0},0,Write93Cx,{0x100,8,0},0}, //256, 8b addr
+ {"93x56A",
+ UWEE,-1,0,Read93x,{0x100,9,1},0,Write93Cx,{0x100,9,1},0}, //256, 8b addr x8
+ {"93S66",
+ UWEE,-1,0,Read93x,{0x200,8,0},0,Write93Sx,{0x200,8,8},0}, //512, 8b addr, 4W page
+ {"93x66",
+ UWEE,-1,0,Read93x,{0x200,8,0},0,Write93Cx,{0x200,8,0},0}, //512, 8b addr
+ {"93x66A",
+ UWEE,-1,0,Read93x,{0x200,9,1},0,Write93Cx,{0x200,9,1},0}, //512, 8b addr x8
+ {"93x76",
+ UWEE,-1,0,Read93x,{0x400,10,0},0,Write93Cx,{0x400,10,0},0}, //1k, 10b addr
+ {"93x76A",
+ UWEE,-1,0,Read93x,{0x400,11,1},0,Write93Cx,{0x400,11,1},0}, //1k, 10b addr x8
+ {"93x86",
+ UWEE,-1,0,Read93x,{0x800,10,0},0,Write93Cx,{0x800,10,0},0}, //2k, 10b addr
+ {"93x86A",
+ UWEE,-1,0,Read93x,{0x800,11,1},0,Write93Cx,{0x800,11,1},0}, //2k, 10b addr x8
+//-------------SPI---------------------------------------------------------
+ {"25010,95010",
+ SPIEE,-1,0,Read25xx,{0x80},0,Write25xx,{0x80,16},0}, //128
+ {"25020,95020",
+ SPIEE,-1,0,Read25xx,{0x100},0,Write25xx,{0x100,16},0}, //256
+ {"25040,95040",
+ SPIEE,-1,0,Read25xx,{0x200},0,Write25xx,{0x200,16},0}, //512
+ {"25080,95080",
+ SPIEE,-1,0,Read25xx,{0x400},0,Write25xx,{0x400,16},0}, //1K
+ {"25160,95160",
+ SPIEE,-1,0,Read25xx,{0x800},0,Write25xx,{0x800,16},0}, //2K
+ {"25320,95320",
+ SPIEE,-1,0,Read25xx,{0x1000},0,Write25xx,{0x1000,32},0}, //4K
+ {"25640,95640",
+ SPIEE,-1,0,Read25xx,{0x2000},0,Write25xx,{0x2000,32},0}, //8K
+ {"25128,95128",
+ SPIEE,-1,0,Read25xx,{0x4000},0,Write25xx,{0x4000,64},0}, //16K
+ {"25256,95256",
+ SPIEE,-1,0,Read25xx,{0x8000},0,Write25xx,{0x8000,64},0}, //32K
+ {"25512,95512",
+ SPIEE,-1,0,Read25xx,{0x10000},0,Write25xx,{0x10000,128},0}, //64K
+ {"251024,95M01",
+ SPIEE,-1,0,Read25xx,{0x20000},0,Write25xx,{0x20000,256},0}, //128K
+ {"95M02",
+ SPIEE,-1,0,Read25xx,{0x40000},0,Write25xx,{0x40000,256},0}, //256K
+ {"25X05",
+ SPIEE,-1,0,Read25xx,{0x10000},0,Write25xx,{0x10000,0x1000+256},0}, //64K flash 3.3V
+ {"251005,25X10",
+ SPIEE,-1,0,Read25xx,{0x20000},0,Write25xx,{0x20000,0x1000+256},0}, //128K flash 3.3V
+ {"252005,25X20",
+ SPIEE,-1,0,Read25xx,{0x40000},0,Write25xx,{0x40000,0x1000+256},0}, //256K flash 3.3V
+ {"254005,25X40",
+ SPIEE,-1,0,Read25xx,{0x80000},0,Write25xx,{0x80000,0x1000+256},0}, //512K flash 3.3V
+ {"25Q40",
+ SPIEE,-1,0,Read25xx,{0x80000},0,Write25xx,{0x80000,0x3000+256},0}, //512K flash 3.3V STATUS2
+ {"258005,25X80",
+ SPIEE,-1,0,Read25xx,{0x100000},0,Write25xx,{0x100000,0x1000+256},0},//1M flash 3.3V
+ {"251605,25X16",
+ SPIEE,-1,0,Read25xx,{0x200000},0,Write25xx,{0x200000,0x1000+256},0},//2M flash 3.3V
+ {"25X32",
+ SPIEE,-1,0,Read25xx,{0x400000},0,Write25xx,{0x400000,0x1000+256},0},//4M flash 3.3V
+ {"25X64",
+ SPIEE,-1,0,Read25xx,{0x800000},0,Write25xx,{0x800000,0x1000+256},0},//8M flash 3.3V
+ {"25X128",
+ SPIEE,-1,0,Read25xx,{0x1000000},0,Write25xx,{0x1000000,0x1000+256},0},//16M flash 3.3V
+//-------------One wire devices---------------------------------------------------------
+ {"DS2430",
+ OWEE,-1,0,ReadOneWireMem,{0x20,1},0,WriteOneWireMem,{0x20,1},0}, //32
+ {"DS2431",
+ OWEE,-1,0,ReadOneWireMem,{0x80,2},0,WriteOneWireMem,{0x80,0},0}, //128
+ {"DS2433",
+ OWEE,-1,0,ReadOneWireMem,{0x200,0},0,WriteOneWireMem,{0x200,1},0}, //512
+ {"DS28EC20",
+ OWEE,-1,0,ReadOneWireMem,{0xA00,2},0,WriteOneWireMem,{0xA00,1},0}, //2560
+ {"DS1820",
+ OWEE,-1,0,ReadDS1820,{-10},0,0,{0},0}, //digital thermometer
+//-------------UNIO devices---------------------------------------------------------
+ {"11010",
+ UNIOEE,-1,0,Read11xx,{0x80},0,Write11xx,{0x80,16},0}, //128
+ {"11020",
+ UNIOEE,-1,0,Read11xx,{0x100},0,Write11xx,{0x100,16},0}, //256
+ {"11040",
+ UNIOEE,-1,0,Read11xx,{0x200},0,Write11xx,{0x200,16},0}, //512
+ {"11080",
+ UNIOEE,-1,0,Read11xx,{0x400},0,Write11xx,{0x400,16},0}, //1k
+ {"11160",
+ UNIOEE,-1,0,Read11xx,{0x800},0,Write11xx,{0x800,16},0} //2k
+};
+
+int NDEVLIST = (sizeof(DEVLIST)/sizeof(struct DEVICES));
+
+//Add all devices to the appropriate structure
+#ifndef _GTKGUI
+void AddDevices(char *list){ //make sure list is long enough
+ int i;
+ static char last[8]="";
+ for(i=0;i<sizeof(devices)/sizeof(char*);i++){
+ if(last[0]) strcat(list,", ");
+ if(strncmp(devices[i],last,2)){
+ strcat(list,"\n");
+ last[0]=devices[i][0];
+ last[1]=devices[i][1];
+ last[2]=0;
+ }
+ strcat(list,devices[i]);
+ }
+}
+#endif
+
+//Make a list of all supported devices (insert \n between types)
+char* ListDevices(){
+ int i,len=0,l;
+ static char last[8]="";
+ char* list=0;
+ for(i=0;i<Ndevices;i++){
+ l=strlen(devices[i]);
+ if(!last[0]){
+ list=realloc(list,len+l+1);
+ strcpy(list+len,devices[i]);
+ len+=l;
+ }
+ else{
+ list=realloc(list,len+l+3);
+ if(strncmp(devices[i],last,2)) strcpy(list+len,",\n");
+ else strcpy(list+len,", ");
+ strcpy(list+len+2,devices[i]);
+ len+=l+2;
+ }
+ last[0]=devices[i][0];
+ last[1]=devices[i][1];
+ last[2]=0;
+ }
+ return list;
+}
+
+#ifdef DEBUG
+//Check that all devices in the list have a read/write function
+void CheckDevices(){
+ int i;
+ for(i=0;i<Ndevices;i++){
+ if(GetDevType(devices[i])<0){
+ printf("Can't find %s\n",devices[i]);fflush(stdout);
+ }
+ }
+ printf("OK %d devices\n",Ndevices);fflush(stdout);
+}
+#endif
+
+
+void Read(char* dev,int ee,int r)
+{
+ int i,j;
+ int params[5];
+ char *str=0,*tok;
+#ifdef DEBUG
+ CheckDevices();
+#endif
+ //parse all device names until "dev" is found,
+ //then execute the read function with the right number of parameters
+ for(i=0;i<sizeof(DEVLIST)/sizeof(DEVLIST[0]);i++){
+ if(str) free(str);
+ str=malloc(strlen(DEVLIST[i].device)+1);
+ strcpy(str,DEVLIST[i].device);
+ for(tok=strtok(str,",");tok;tok=strtok(NULL,",")){ //compare every device name
+ if(!strcmp(dev,tok)){ //proceed if found
+ for(j=0;j<4;j++) params[j]=DEVLIST[i].ReadParam[j];
+ if(DEVLIST[i].V33>0){ //3.3V required
+ if(!CheckV33Regulator()){
+ PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board
+ return;
+ }
+ }
+ if(hvreg!=DEVLIST[i].HV) hvreg=StartHVReg(DEVLIST[i].HV)>0?DEVLIST[i].HV:0;
+ if(DEVLIST[i].ReadPtr==0){
+ PrintMessage(strings[S_nodev_r]); //"Device not supported for reading\r\n");
+ return;
+ }
+ switch(DEVLIST[i].family){ //call read function with the right number of arguments (better ways to do it???)
+ case PIC12:
+ if(r) params[1]=DEVLIST[i].ResArea; //modify reserved area parameter
+ (*DEVLIST[i].ReadPtr)(params[0],params[1]);
+ break;
+ case PIC16:
+ if(r) params[2]=DEVLIST[i].ResArea; //modify reserved area parameter
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].ReadPtr)(params[0],params[1],params[2],params[3]);
+ break;
+ case PIC18:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].ReadPtr)(params[0],params[1],params[2]);
+ break;
+ case PIC24:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].ReadPtr)(params[0],params[1],params[2],params[3],r?DEVLIST[i].ResArea:0);
+ break;
+ case PIC32:
+// if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].ReadPtr)(params[0],params[1]);
+ break;
+ case AVR:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].ReadPtr)(params[0],params[1],params[2]);
+ break;
+ case I2CEE:
+ (*DEVLIST[i].ReadPtr)(params[0],params[1]);
+ break;
+ case UWEE:
+ (*DEVLIST[i].ReadPtr)(params[0],params[1],params[2]);
+ break;
+ case SPIEE:
+ (*DEVLIST[i].ReadPtr)(params[0]);
+ break;
+ case OWEE:
+ if(params[0]==-10) (*DEVLIST[i].ReadPtr)();
+ else (*DEVLIST[i].ReadPtr)(params[0],params[1]);
+ break;
+ case UNIOEE:
+ (*DEVLIST[i].ReadPtr)(params[0]);
+ break;
+ default:
+ PrintMessage(strings[S_nodev_r]); //"Device not supported for reading\r\n");
+ }
+ return;
+ }
+ }
+ }
+ PrintMessage(strings[S_nodev_r]); //"Device not supported for reading\r\n");
+}
+
+
+void Write(char* dev,int ee)
+{
+ int i,j;
+ int params[6];
+ char *str=0,*tok;
+ //parse all device names until "dev" is found,
+ //then execute the write function with the right number of parameters
+ for(i=0;i<sizeof(DEVLIST)/sizeof(DEVLIST[0]);i++){
+ if(str) free(str);
+ str=malloc(strlen(DEVLIST[i].device)+1);
+ strcpy(str,DEVLIST[i].device);
+ for(tok=strtok(str,",");tok;tok=strtok(NULL,",")){ //compare every device name
+ if(!strcmp(dev,tok)){ //proceed if found
+ for(j=0;j<6;j++) params[j]=DEVLIST[i].WriteParam[j];
+ if(DEVLIST[i].V33>0){ //3.3V required
+ if(!CheckV33Regulator()){
+ PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board
+ return;
+ }
+ }
+ if(hvreg!=DEVLIST[i].HV) hvreg=StartHVReg(DEVLIST[i].HV)>0?DEVLIST[i].HV:0;
+ if(DEVLIST[i].WritePtr==0){
+ PrintMessage(strings[S_nodev_w]); //"Device not supported for writing\r\n");
+ return;
+ }
+ switch(DEVLIST[i].family){ //call write function with the right number of arguments (better ways to do it???)
+ case PIC12:
+ (*DEVLIST[i].WritePtr)(params[0],params[1]);
+ break;
+ case PIC16:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ if(params[2]==-10) (*DEVLIST[i].WritePtr)(params[0],params[1]);
+ else (*DEVLIST[i].WritePtr)(params[0],params[1],params[2]);
+ break;
+ case PIC18:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].WritePtr)(params[0],params[1],params[2],params[3],params[4],params[5]);
+ break;
+ case PIC24:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].WritePtr)(params[0],params[1],params[2],params[3],params[4],DEVLIST[i].WriteParamD);
+ break;
+ case AVR:
+ if(!ee) params[1]=0; //clear eeprom parameter
+ (*DEVLIST[i].WritePtr)(params[0],params[1],params[2],params[3]);
+ break;
+ case I2CEE:
+ (*DEVLIST[i].WritePtr)(params[0],params[1],params[2]);
+ break;
+ case UWEE:
+ (*DEVLIST[i].WritePtr)(params[0],params[1],params[2]);
+ break;
+ case SPIEE:
+ (*DEVLIST[i].WritePtr)(params[0],params[1]);
+ break;
+ case OWEE:
+ (*DEVLIST[i].WritePtr)(params[0],params[1]);
+ break;
+ case UNIOEE:
+ (*DEVLIST[i].WritePtr)(params[0],params[1]);
+ break;
+ default:
+ PrintMessage(strings[S_nodev_w]); //"Device not supported for writing\r\n");
+ }
+ return;
+ }
+ }
+ }
+ PrintMessage(strings[S_nodev_w]); //"Device not supported for writing\r\n");
+}
+
+///Search the device type
+int GetDevType(const char* dev)
+{
+ int i,type=-1;
+ char *str=0,*tok;
+ //parse all device names until "dev" is found
+ for(i=0;i<sizeof(DEVLIST)/sizeof(DEVLIST[0]);i++){
+ if(str) free(str);
+ str=malloc(strlen(DEVLIST[i].device)+1);
+ strcpy(str,DEVLIST[i].device);
+ for(tok=strtok(str,",");tok;tok=strtok(NULL,",")){ //compare every device name
+ if(!strcmp(dev,tok)){ //proceed if found
+ type=DEVLIST[i].family;
+ tok=0;
+ i=sizeof(DEVLIST)/sizeof(DEVLIST[0]);
+ }
+ }
+ }
+ free(str);
+ return type;
+}
+
+/// Determine the group of a specific device
+enum group_t nameToGroup(const char *devName) {
+ if(!strncmp(devName,"10F",3)||!strncmp(devName,"12F",3)||!strncmp(devName,"12C",3))
+ return G_PIC_10_12;
+ if(!strncmp(devName,"16F",3)||!strncmp(devName,"16LF",4)||!strncmp(devName,"16C",3))
+ return G_PIC_16;
+ if(!strncmp(devName,"18F",3))
+ return G_PIC_18;
+ if(!strncmp(devName,"24F",3)||!strncmp(devName,"24H",3)||!strncmp(devName,"24E",3))
+ return G_PIC_24;
+ if(!strncmp(devName,"30F",3)||!strncmp(devName,"33F",3)||!strncmp(devName,"33E",3))
+ return G_PIC_30_33;
+ if(!strncmp(devName,"AT",2))
+ return G_ATMEL;
+ if(!strncmp(devName,"24",2)||!strncmp(devName,"25",2)||!strncmp(devName,"93",2)|| \
+ !strncmp(devName,"95",2)||!strncmp(devName,"11",2)||!strncmp(devName,"DS",2))
+ return G_EEPROM;
+ PrintMessage1("can't determine group of device '%s'\n",devName);
+ return -1;
+}
+
+/// Copies the device info from the passed devlist entry into the passed DevInfo
+/// Does NOT populate fields 'device' and 'group' as these are device-specific
+void populateDevInfo(struct DevInfo *info, const struct DEVICES *devlistEntry) {
+ char str2[256],str3[64],strF[32];
+ info->family=devlistEntry->family;
+ info->HV=devlistEntry->HV;
+ info->V33=devlistEntry->V33;
+ info->size=devlistEntry->ReadParam[0];
+ info->sizeEE=devlistEntry->ReadParam[1];
+ str2[0]=0;
+ double x=info->size/1024.0;
+ if(x-(int)x) sprintf(strF,"%.1f",x);
+ else sprintf(strF,"%d",(int)x);
+ switch(info->family){
+ case -1:
+ sprintf(str2,"?? ");
+ break;
+ case PIC12:
+ sprintf(str2,"PIC12, ");
+ if(info->size<1024) sprintf(str3,"%dW FLASH",info->size);
+ else sprintf(str3,"%sKW FLASH",strF);
+ strcat(str2,str3);
+ break;
+ case PIC16:
+ sprintf(str2,"PIC16, ");
+ if(info->size<1024) sprintf(str3,"%dW FLASH",info->size);
+ else sprintf(str3,"%sKW FLASH",strF);
+ strcat(str2,str3);
+ if(info->sizeEE){
+ int ee=info->sizeEE;
+ if(ee<0) ee=-ee;
+ sprintf(str3," + %dB EEPROM",ee);
+ strcat(str2,str3);
+ }
+ break;
+ case PIC18:
+ sprintf(str2,"PIC18, ");
+ if(info->size<1024) sprintf(str3,"%dB FLASH ",info->size);
+ else sprintf(str3,"%sKB FLASH ",strF);
+ strcat(str2,str3);
+ if(info->sizeEE){
+ sprintf(str3,"+ %dB EEPROM ",info->sizeEE);
+ strcat(str2,str3);
+ }
+ break;
+ case PIC24:
+ sprintf(str2,"PIC24, ");
+ if(info->size<1024) sprintf(str3,"%dW FLASH",info->size);
+ else sprintf(str3,"%sKW FLASH",strF);
+ strcat(str2,str3);
+ if(info->sizeEE){
+ sprintf(str3," + %dB EEPROM",info->sizeEE);
+ strcat(str2,str3);
+ }
+ break;
+ case PIC32:
+ sprintf(str2,"PIC32, ");
+ if(info->size<1024) sprintf(str3,"%dW FLASH",info->size);
+ else sprintf(str3,"%sKW FLASH",strF);
+ strcat(str2,str3);
+ if(info->sizeEE){
+ sprintf(str3," + %dB EEPROM",info->sizeEE);
+ strcat(str2,str3);
+ }
+ break;
+ case AVR:
+ sprintf(str2,"AVR, ");
+ if(info->size<1024) sprintf(str3,"%dB FLASH",info->size);
+ else sprintf(str3,"%sKB FLASH",strF);
+ strcat(str2,str3);
+ if(info->sizeEE){
+ sprintf(str3," + %dB EEPROM",info->sizeEE);
+ strcat(str2,str3);
+ }
+ break;
+ case I2CEE:
+ if(info->size<1024) sprintf(str2,"%s, %dB",strings[I_I2CMEM],info->size); //I2C Memory
+ else sprintf(str2,"%s, %sKB",strings[I_I2CMEM],strF); //I2C Memory
+ break;
+ case SPIEE:
+ if(info->size<1024) sprintf(str2,"%s, %dB",strings[I_SPIMEM],info->size); //SPI Memory
+ else sprintf(str2,"%s, %sKB",strings[I_SPIMEM],strF); //SPI Memory
+ break;
+ case UWEE:
+ if(info->size<1024) sprintf(str2,"%s, %dB",strings[I_UWMEM],info->size); //Microwire Memory
+ else sprintf(str2,"%s,%sKB",strings[I_UWMEM],strF);
+ break;
+ case OWEE:
+ if(info->size<0) sprintf(str2,strings[I_OWDEV]); //OneWire device
+ else if(info->size<1024) sprintf(str2,"%s, %dB",strings[I_OWMEM],info->size); //OneWire Memory
+ else sprintf(str2,"%s, %sKB",strings[I_OWMEM],strF);
+ break;
+ case UNIOEE:
+ if(info->size<1024) sprintf(str2,"%s, %dB",strings[I_UNIOMEM],info->size); //UNI/O Memory
+ else sprintf(str2,"%s, %sKB",strings[I_UNIOMEM],strF);
+ break;
+ }
+ if(info->HV>0){
+ sprintf(str3,", %.1fV",info->HV);
+ strcat(str2,str3);
+ }
+ if(info->V33){
+ strcat(str2,", ");
+ strcat(str2,strings[I_3V3REQUIRED]); // 3.3V adapter
+ }
+ info->features=malloc(strlen(str2)+1);
+ strcpy(info->features,str2);
+}
+
+
+///Search and return device info
+struct DevInfo GetDevInfo(const char* dev)
+{
+ int i;
+ char *str=0,*tok;
+ struct DevInfo info;
+ info.device=0;
+ info.family=-1;
+ info.HV=-1;
+ info.V33=-1;
+ info.size=-1;
+ info.sizeEE=-1;
+ info.features=0;
+ //parse all device names until "dev" is found
+ for(i=0;i<NDEVLIST;i++){
+ str=malloc(strlen(DEVLIST[i].device)+1);
+ strcpy(str,DEVLIST[i].device);
+ for(tok=strtok(str,",");tok;tok=strtok(NULL,",")){ //compare every device name
+ if(!strcmp(dev,tok)){ //proceed if found
+ info.device=malloc(strlen(tok)+1);
+ strcpy(info.device,tok);
+ info.group=nameToGroup(info.device);
+ populateDevInfo(&info, &(DEVLIST[i]));
+ free(str);
+ return info;
+ }
+ }
+ free(str);
+ }
+ return info;
+}