From 925d0670c45e1100e412070fa0ce2405604f219a Mon Sep 17 00:00:00 2001 From: Attila Veghelyi Date: Thu, 29 Jun 2023 16:24:54 +0200 Subject: Init repo --- progP32.c | 2454 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2454 insertions(+) create mode 100644 progP32.c (limited to 'progP32.c') diff --git a/progP32.c b/progP32.c new file mode 100644 index 0000000..9416eed --- /dev/null +++ b/progP32.c @@ -0,0 +1,2454 @@ +/** + * \file progP32.c - algorithms to program the PIC32 family of microcontrollers + * Copyright (C) 2019 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 + */ + + +#include "common.h" + +/*#ifdef _MSC_VER +void COpenProgDlg::CheckData(int a,int b,int addr,int *err) +#else +void CheckData(int a,int b,int addr,int *err) +#endif +{ + if(a!=b){ +#ifdef _MSC_VER + CString str; +#endif + PrintMessage(strings[S_NL]); + PrintMessage4(strings[S_CodeVError],addr,addr,a,b); //"Error writing address %4X: written %02X, read %02X\r\n" + (*err)++; + } +} +*/ +struct ID32{ + int id; + char *device; +} PIC32LIST[]={ + {0x0938053,"PIC32MX360F512L"}, + {0x0934053,"PIC32MX360F256L"}, + {0x092D053,"PIC32MX340F128L"}, + {0x092A053,"PIC32MX320F128L"}, + {0x0916053,"PIC32MX340F512H"}, + {0x0912053,"PIC32MX340F256H"}, + {0x090D053,"PIC32MX340F128H"}, + {0x090A053,"PIC32MX320F128H"}, + {0x0906053,"PIC32MX320F064H"}, + {0x0902053,"PIC32MX320F032H"}, + {0x0978053,"PIC32MX460F512L"}, + {0x0974053,"PIC32MX460F256L"}, + {0x096D053,"PIC32MX440F128L"}, + {0x0952053,"PIC32MX440F256H"}, + {0x0956053,"PIC32MX440F512H"}, + {0x094D053,"PIC32MX440F128H"}, + {0x0942053,"PIC32MX420F032H"}, + {0x04317053,"PIC32MX575F256H"}, + {0x0430B053,"PIC32MX675F256H"}, + {0x04303053,"PIC32MX775F256H"}, + {0x04309053,"PIC32MX575F512H"}, + {0x0430C053,"PIC32MX675F512H"}, + {0x04325053,"PIC32MX695F512H"}, + {0x0430D053,"PIC32MX775F512H"}, + {0x0430E053,"PIC32MX795F512H"}, + {0x04333053,"PIC32MX575F256L"}, + {0x04305053,"PIC32MX675F256L"}, + {0x04312053,"PIC32MX775F256L"}, + {0x0430F053,"PIC32MX575F512L"}, + {0x04311053,"PIC32MX675F512L"}, + {0x04341053,"PIC32MX695F512L"}, + {0x04307053,"PIC32MX775F512L"}, + {0x04307053,"PIC32MX795F512L"}, + {0x04400053,"PIC32MX534F064H"}, + {0x04401053,"PIC32MX564F064H"}, + {0x04403053,"PIC32MX564F128H"}, + {0x04405053,"PIC32MX664F064H"}, + {0x04407053,"PIC32MX664F128H"}, + {0x0440B053,"PIC32MX764F128H"}, + {0x0440C053,"PIC32MX534F064L"}, + {0x0440D053,"PIC32MX564F064L"}, + {0x0440F053,"PIC32MX564F128L"}, + {0x04411053,"PIC32MX664F064L"}, + {0x04413053,"PIC32MX664F128L"}, + {0x04417053,"PIC32MX764F128L"}, + {0x04A07053,"PIC32MX110F016B"}, + {0x04A09053,"PIC32MX110F016C"}, + {0x04A0B053,"PIC32MX110F016D"}, + {0x04A01053,"PIC32MX210F016B"}, + {0x04A03053,"PIC32MX210F016C"}, + {0x04A05053,"PIC32MX210F016D"}, + {0x04A06053,"PIC32MX120F032B"}, + {0x04A08053,"PIC32MX120F032C"}, + {0x04A0A053,"PIC32MX120F032D"}, + {0x04A00053,"PIC32MX220F032B"}, + {0x04A02053,"PIC32MX220F032C"}, + {0x04A04053,"PIC32MX220F032D"}, + {0x04D07053,"PIC32MX130F064B"}, + {0x04D09053,"PIC32MX130F064C"}, + {0x04D0B053,"PIC32MX130F064D"}, + {0x04D01053,"PIC32MX230F064B"}, + {0x04D03053,"PIC32MX230F064C"}, + {0x04D05053,"PIC32MX230F064D"}, + {0x04D06053,"PIC32MX150F128B"}, + {0x04D08053,"PIC32MX150F128C"}, + {0x04D0A053,"PIC32MX150F128D"}, + {0x04D00053,"PIC32MX250F128B"}, + {0x04D02053,"PIC32MX250F128C"}, + {0x04D04053,"PIC32MX250F128D"}, + {0x06610053,"PIC32MX170F256B"}, + {0x0661A053,"PIC32MX170F256D"}, + {0x06600053,"PIC32MX270F256B"}, + {0x0660A053,"PIC32MX270F256D"}, + {0x0660C053,"PIC32MX270F256DB"}, + {0x06703053,"PIC32MX130F256B"}, + {0x06705053,"PIC32MX130F256D"}, + {0x06700053,"PIC32MX230F256B"}, + {0x06702053,"PIC32MX230F256D"}, + {0x05600053,"PIC32MX330F064H"}, + {0x05601053,"PIC32MX330F064L"}, + {0x05704053,"PIC32MX350F256H"}, + {0x05705053,"PIC32MX350F256L"}, + {0x05602053,"PIC32MX430F064H"}, + {0x05603053,"PIC32MX430F064L"}, + {0x05706053,"PIC32MX450F256H"}, + {0x05707053,"PIC32MX450F256L"}, + {0x0570C053,"PIC32MX350F128H"}, + {0x0570D053,"PIC32MX350F128L"}, + {0x0570E053,"PIC32MX450F128H"}, + {0x0570F053,"PIC32MX450F128L"}, + {0x05808053,"PIC32MX370F512H"}, + {0x05809053,"PIC32MX370F512L"}, + {0x0580A053,"PIC32MX470F512H"}, + {0x0580B053,"PIC32MX470F512L"}, + {0x05710053,"PIC32MX450F256HB"}, + {0x05811053,"PIC32MX470F512LB"}, + {0x05103053,"PIC32MZ1024ECG064"}, + {0x05108053,"PIC32MZ1024ECH064"}, + {0x05130053,"PIC32MZ1024ECM064"}, + {0x05104053,"PIC32MZ2048ECG064"}, + {0x05109053,"PIC32MZ2048ECH064"}, + {0x05131053,"PIC32MZ2048ECM064"}, + {0x0510D053,"PIC32MZ1024ECG100"}, + {0x05112053,"PIC32MZ1024ECH100"}, + {0x0513A053,"PIC32MZ1024ECM100"}, + {0x0510E053,"PIC32MZ2048ECG100"}, + {0x05113053,"PIC32MZ2048ECH100"}, + {0x0513B053,"PIC32MZ2048ECM100"}, + {0x05117053,"PIC32MZ1024ECG124"}, + {0x0511C053,"PIC32MZ1024ECH124"}, + {0x05144053,"PIC32MZ1024ECM124"}, + {0x05118053,"PIC32MZ2048ECG124"}, + {0x0511D053,"PIC32MZ2048ECH124"}, + {0x05145053,"PIC32MZ2048ECM124"}, + {0x05121053,"PIC32MZ1024ECG144"}, + {0x05126053,"PIC32MZ1024ECH144"}, + {0x0514E053,"PIC32MZ1024ECM144"}, + {0x05122053,"PIC32MZ2048ECG144"}, + {0x05127053,"PIC32MZ2048ECH144"}, + {0x0514F053,"PIC32MZ2048ECM144"}, + {0x06A10053,"PIC32MX150F256H"}, + {0x06A11053,"PIC32MX150F256L"}, + {0x06A30053,"PIC32MX170F512H"}, + {0x06A31053,"PIC32MX170F512L"}, + {0x06A12053,"PIC32MX250F256H"}, + {0x06A13053,"PIC32MX250F256L"}, + {0x06A32053,"PIC32MX270F512H"}, + {0x06A33053,"PIC32MX270F512L"}, + {0x06A14053,"PIC32MX550F256H"}, + {0x06A15053,"PIC32MX550F256L"}, + {0x06A34053,"PIC32MX570F512H"}, + {0x06A35053,"PIC32MX570F512L"}, + {0x06A50053,"PIC32MX120F064H"}, + {0x06A00053,"PIC32MX130F128H"}, + {0x06A01053,"PIC32MX130F128L"}, + {0x06A02053,"PIC32MX230F128H"}, + {0x06A03053,"PIC32MX230F128L"}, + {0x06A04053,"PIC32MX530F128H"}, + {0x06A05053,"PIC32MX530F128L"}, + {0x07201053,"PIC32MZ0512EFE064"}, + {0x07206053,"PIC32MZ0512EFF064"}, + {0x0722E053,"PIC32MZ0512EFK064"}, + {0x07202053,"PIC32MZ1024EFE064"}, + {0x07207053,"PIC32MZ1024EFF064"}, + {0x0722F053,"PIC32MZ1024EFK064"}, + {0x07203053,"PIC32MZ1024EFG064"}, + {0x07208053,"PIC32MZ1024EFH064"}, + {0x07230053,"PIC32MZ1024EFM064"}, + {0x07204053,"PIC32MZ2048EFG064"}, + {0x07209053,"PIC32MZ2048EFH064"}, + {0x07231053,"PIC32MZ2048EFM064"}, + {0x0720B053,"PIC32MZ0512EFE100"}, + {0x07210053,"PIC32MZ0512EFF100"}, + {0x07238053,"PIC32MZ0512EFK100"}, + {0x0720C053,"PIC32MZ1024EFE100"}, + {0x07211053,"PIC32MZ1024EFF100"}, + {0x07239053,"PIC32MZ1024EFK100"}, + {0x0720D053,"PIC32MZ1024EFG100"}, + {0x07212053,"PIC32MZ1024EFH100"}, + {0x0723A053,"PIC32MZ1024EFM100"}, + {0x0720E053,"PIC32MZ2048EFG100"}, + {0x07213053,"PIC32MZ2048EFH100"}, + {0x0723B053,"PIC32MZ2048EFM100"}, + {0x07215053,"PIC32MZ0512EFE124"}, + {0x0721A053,"PIC32MZ0512EFF124"}, + {0x07242053,"PIC32MZ0512EFK124"}, + {0x07216053,"PIC32MZ1024EFE124"}, + {0x0721B053,"PIC32MZ1024EFF124"}, + {0x07243053,"PIC32MZ1024EFK124"}, + {0x07217053,"PIC32MZ1024EFG124"}, + {0x0721C053,"PIC32MZ1024EFH124"}, + {0x07244053,"PIC32MZ1024EFM124"}, + {0x07218053,"PIC32MZ2048EFG124"}, + {0x0721D053,"PIC32MZ2048EFH124"}, + {0x07245053,"PIC32MZ2048EFM124"}, + {0x0721F053,"PIC32MZ0512EFE144"}, + {0x07224053,"PIC32MZ0512EFF144"}, + {0x0724C053,"PIC32MZ0512EFK144"}, + {0x07220053,"PIC32MZ1024EFE144"}, + {0x07225053,"PIC32MZ1024EFF144"}, + {0x0724D053,"PIC32MZ1024EFK144"}, + {0x07221053,"PIC32MZ1024EFG144"}, + {0x07226053,"PIC32MZ1024EFH144"}, + {0x0724E053,"PIC32MZ1024EFM144"}, + {0x07222053,"PIC32MZ2048EFG144"}, + {0x07227053,"PIC32MZ2048EFH144"}, + {0x0724F053,"PIC32MZ2048EFM144"}, + {0x05F0C053,"PIC32MZ1025DAA169"}, + {0x05F0D053,"PIC32MZ1025DAB169"}, + {0x05F0F053,"PIC32MZ1064DAA169"}, + {0x05F10053,"PIC32MZ1064DAB169"}, + {0x05F15053,"PIC32MZ2025DAA169"}, + {0x05F16053,"PIC32MZ2025DAB169"}, + {0x05F18053,"PIC32MZ2064DAA169"}, + {0x05F19053,"PIC32MZ2064DAB169"}, + {0x05F42053,"PIC32MZ1025DAG169"}, + {0x05F43053,"PIC32MZ1025DAH169"}, + {0x05F45053,"PIC32MZ1064DAG169"}, + {0x05F46053,"PIC32MZ1064DAH169"}, + {0x05F4B053,"PIC32MZ2025DAG169"}, + {0x05F4C053,"PIC32MZ2025DAH169"}, + {0x05F4E053,"PIC32MZ2064DAG169"}, + {0x05F4F053,"PIC32MZ2064DAH169"}, + {0x05F78053,"PIC32MZ1025DAA176"}, + {0x05F79053,"PIC32MZ1025DAB176"}, + {0x05F7B053,"PIC32MZ1064DAA176"}, + {0x05F7C053,"PIC32MZ1064DAB176"}, + {0x05F81053,"PIC32MZ2025DAA176"}, + {0x05F82053,"PIC32MZ2025DAB176"}, + {0x05F84053,"PIC32MZ2064DAA176"}, + {0x05F85053,"PIC32MZ2064DAB176"}, + {0x05FAE053,"PIC32MZ1025DAG176"}, + {0x05FAF053,"PIC32MZ1025DAH176"}, + {0x05FB1053,"PIC32MZ1064DAG176"}, + {0x05FB2053,"PIC32MZ1064DAH176"}, + {0x05FB7053,"PIC32MZ2025DAG176"}, + {0x05FB8053,"PIC32MZ2025DAH176"}, + {0x05FBA053,"PIC32MZ2064DAG176"}, + {0x05FBB053,"PIC32MZ2064DAH176"}, + {0x05F5D053,"PIC32MZ1025DAA288"}, + {0x05F5E053,"PIC32MZ1025DAB288"}, + {0x05F60053,"PIC32MZ1064DAA288"}, + {0x05F61053,"PIC32MZ1064DAB288"}, + {0x05F66053,"PIC32MZ2025DAA288"}, + {0x05F67053,"PIC32MZ2025DAB288"}, + {0x05F69053,"PIC32MZ2064DAA288"}, + {0x05F6A053,"PIC32MZ2064DAB288"}, + {0x07800053,"PIC32MX154F128B"}, + {0x07804053,"PIC32MX154F128D"}, + {0x07808053,"PIC32MX155F128B"}, + {0x0780C053,"PIC32MX155F128D"}, + {0x07801053,"PIC32MX174F256B"}, + {0x07805053,"PIC32MX174F256D"}, + {0x07809053,"PIC32MX175F256B"}, + {0x0780D053,"PIC32MX175F256D"}, + {0x07802053,"PIC32MX254F128B"}, + {0x07806053,"PIC32MX254F128D"}, + {0x0780A053,"PIC32MX255F128B"}, + {0x0780E053,"PIC32MX255F128D"}, + {0x07803053,"PIC32MX274F256B"}, + {0x07807053,"PIC32MX274F256D"}, + {0x0780B053,"PIC32MX275F256B"}, + {0x0780F053,"PIC32MX275F256D"}, + {0x06211053,"PIC32MK0512GPD064"}, + {0x0620E053,"PIC32MK1024GPD064"}, + {0x06210053,"PIC32MK0512GPD100"}, + {0x0620D053,"PIC32MK1024GPD100"}, + {0x0620B053,"PIC32MK0512GPE064"}, + {0x06208053,"PIC32MK1024GPE064"}, + {0x0620A053,"PIC32MK0512GPE100"}, + {0x06207053,"PIC32MK1024GPE100"}, + {0x06205053,"PIC32MK0512MCF064"}, + {0x06202053,"PIC32MK1024MCF064"}, + {0x06201053,"PIC32MK0512MCF100"}, + {0x06201053,"PIC32MK1024MCF100"}, +}; + +void PIC32_ID(int id) +{ + char s[64]; + int i; + for(i=0;i500){ //limit number of lines printed + strcat(aux,"(...)\r\n"); + i=(dim +TCK=RB6 -> +TDO=RB5 <- +TMS=RB4 -> +MCLR=RB3 -> +*/ +//MCHP TAP INSTRUCTIONS (sent via JTAGSendCommand) +#define MTAP_COMMAND 0x07 //TDI and TDO connected to MCHP Command Shift register +#define MTAP_SW_MTAP 0x04 //Switch TAP controller to MCHP TAP controller +#define MTAP_SW_ETAP 0x05 //Switch TAP controller to EJTAG TAP controller +#define MTAP_IDCODE 0x01 //Select Chip Identification Data register +//MTAP_COMMAND DR COMMANDS (sent via xferData) +#define MCHP_STATUS 0x00 //NOP and return Status. +#define MCHP_ASSERT_RST 0xD1 //Requests the reset controller to assert device Reset. +#define MCHP_DE_ASSERT_RST 0xD0 //Removes the request for device Reset, which causes the reset controller + //to deassert device Reset if there is no other source requesting Reset (i.e., MCLR). +#define MCHP_ERASE 0xFC //Cause the Flash controller to perform a Chip Erase. +#define MCHP_FLASH_ENABLE 0xFE //Enables fetches and loads to the Flash (from the processor). +#define MCHP_FLASH_DISABLE 0xFD //Disables fetches and loads to the Flash (from the processor). +//EJTAG TAP INSTRUCTIONS +#define ETAP_ADDRESS 0x08 //Select Address register. +#define ETAP_DATA 0x09 //Select Data register. +#define ETAP_CONTROL 0x0A //Select EJTAG Control register. +#define ETAP_EJTAGBOOT 0x0C //Set EjtagBrk, ProbEn and ProbTrap to ‘1’ as the reset value. +#define ETAP_FASTDATA 0x0E //Selects the Data and Fastdata registers. + +void XferInstruction(int* j,int instruction){ +// fill buffer with XferInstruction (14 bytes) +// if j<0 use separate counter and perform IO directly (also wait for CPU ready) + int i=0,z,w0=0; + int IO=0; + if((int)j==-1){ + j=&i; + IO=1; + } + if(IO){ +// bufferU[(*j)++]=JTAG_SEND_CMD; +// bufferU[(*j)++]=MTAP_SW_ETAP; +// bufferU[(*j)++]=JTAG_SET_MODE; +// bufferU[(*j)++]=0x3E;//0x1F; + bufferU[(*j)++]=JTAG_SEND_CMD; + bufferU[(*j)++]=ETAP_CONTROL; + bufferU[(*j)++]=FLUSH; + for(;(*j)>24)&0xFF; + bufferU[(*j)++]=(instruction>>16)&0xFF; + bufferU[(*j)++]=(instruction>>8)&0xFF; + bufferU[(*j)++]=instruction&0xFF; + bufferU[(*j)++]=JTAG_SEND_CMD; + bufferU[(*j)++]=ETAP_CONTROL; + bufferU[(*j)++]=JTAG_XFER_DATA; + bufferU[(*j)++]=0x00; + bufferU[(*j)++]=0x00; + bufferU[(*j)++]=0xC0; + bufferU[(*j)++]=0x00; + if(IO){ + bufferU[(*j)++]=FLUSH; + for(;(*j)0x80000||dim<0){ + PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" + return; + } + //unsigned char *memExec=0; + //executiveArea*=2; + //if(executiveArea) memExec=(unsigned char *)malloc(executiveArea); + //for(i=0;i>8; + bufferU[j++]=10000&0xff; + bufferU[j++]=EN_VPP_VCC; //enter program mode + bufferU[j++]=0x0; + bufferU[j++]=WAIT_T2; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=SET_PORT_DIR; + bufferU[j++]=0x27; //RB7-6-4-3 output + bufferU[j++]=0xFF; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0x08; //MCLR=1 + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; //MCLR=0 + bufferU[j++]=0; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_SW_MTAP; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_COMMAND; + bufferU[j++]=JTAG_XFER_DATA; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=MCHP_STATUS; + bufferU[j++]=FLUSH; + for(;j>16)); //lui $t0, + XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0, + XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) + bufferU[j++]=FLUSH; + for(;j>16)); //lui $t0, + XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0, + XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) + XferInstruction(-1,0xae690000); //sw $t1, 0($s3) + XferInstruction(-1,0); //nop + j=0; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_FASTDATA; + bufferU[j++]=JTAG_XFER_F_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j>16)); //lui $t0, + XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0, + XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) + XferInstruction(-1,0xae690000); //sw $t1, 0($s3) + XferInstruction(-1,0); //nop + j=0; + +/* XferInstruction(&j,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(&j,0x3C080000+(i>>16)); //lui $t0, + XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0, + XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) + bufferU[j++]=FLUSH; + for(;j>16)); //lui $t0, + XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0, + XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) + XferInstruction(-1,0xae690000); //sw $t1, 0($s3) + XferInstruction(-1,0); //nop + j=0; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_FASTDATA; + bufferU[j++]=JTAG_XFER_F_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j>16)); //lui $t0, + XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0, + XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) + bufferU[j++]=FLUSH; + for(;j2){ //config area @ 0xF80000 + if(saveLog) fprintf(logfile,"\nCONFIG:\n"); + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x0F; + bufferU[j++]=0x80; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=REGOUT; + bufferU[j++]=FLUSH; + for(;j>8; + bufferU[j++]=2000&0xff; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; //MCLR=0 + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j2){ //only if separate config area + PrintMessage(strings[S_ConfigMem]); //"\r\nConfig Memory:\r\n" + if(config==3||config==4||config==6){ + PrintMessage1("0xF80000: FBS = 0x%02X\r\n",memCONFIG[0]); + if(config==4){ //0xF80000-16 + PrintMessage1("0xF80002: FSS = 0x%02X\r\n",memCONFIG[4]); + } + PrintMessage1("0xF80004: FGS = 0x%02X\r\n",memCONFIG[8]); + PrintMessage1("0xF80006: FOSCSEL = 0x%02X\r\n",memCONFIG[12]); + PrintMessage1("0xF80008: FOSC = 0x%02X\r\n",memCONFIG[16]); + PrintMessage1("0xF8000A: FWDT = 0x%02X\r\n",memCONFIG[20]); + PrintMessage1("0xF8000C: FPOR = 0x%02X\r\n",memCONFIG[24]); + PrintMessage1("0xF8000E: FICD = 0x%02X\r\n",memCONFIG[28]); + if(config==3){ //0xF80000-10 except 02 + PrintMessage1("0xF80010: FDS = 0x%02X\r\n",memCONFIG[32]); + } + else if(config==4){ //0xF80000-16 + PrintMessage1("0xF80010: UID0 = 0x%02X\r\n",memCONFIG[32]); + PrintMessage1("0xF80012: UID1 = 0x%02X\r\n",memCONFIG[36]); + PrintMessage1("0xF80014: UID2 = 0x%02X\r\n",memCONFIG[40]); + PrintMessage1("0xF80016: UID3 = 0x%02X\r\n",memCONFIG[44]); + } + } + else if(config==5){ //0xF80000-0C (16 bit) + PrintMessage2("0xF80000: FOSC = 0x%02X%02X\r\n",memCONFIG[1],memCONFIG[0]); + PrintMessage2("0xF80002: FWDT = 0x%02X%02X\r\n",memCONFIG[5],memCONFIG[4]); + PrintMessage2("0xF80004: FBORPOR = 0x%02X%02X\r\n",memCONFIG[9],memCONFIG[8]); + PrintMessage2("0xF80006: FBS = 0x%02X%02X\r\n",memCONFIG[13],memCONFIG[12]); + PrintMessage2("0xF80008: FSS = 0x%02X%02X\r\n",memCONFIG[17],memCONFIG[16]); + PrintMessage2("0xF8000A: FGS = 0x%02X%02X\r\n",memCONFIG[21],memCONFIG[20]); + PrintMessage2("0xF8000C: FICD = 0x%02X%02X\r\n",memCONFIG[25],memCONFIG[24]); + } + } + else{ + //last 2 program words + PrintMessage2("CONFIG1: 0x%04X\r\nCONFIG2: 0x%04X\r\n",(memCODE[dim-3]<<8)+memCODE[dim-4]\ + ,(memCODE[dim-7]<<8)+memCODE[dim-8]); + if(config==1){ //last 3 program words + PrintMessage1("CONFIG3: 0x%04X\r\n",(memCODE[dim-11]<<8)+memCODE[dim-12]); + } + if(config==2){ //last 4 program words + PrintMessage1("CONFIG4: 0x%04X\r\n",(memCODE[dim-15]<<8)+memCODE[dim-16]); + } + } + PrintMessage(strings[S_CodeMem]); //"\r\nCode memory:\r\n" + DisplayCODE24F(dim); + if(dim2){ + PrintMessage(strings[S_EEMem]); //"\r\nEEPROM memory:\r\n" + DisplayEE24F(); + } + if(executiveArea){ + char s[256],t[256]; + int d,valid,empty=1; + char* aux=(char*)malloc((dim/COL+1)*2*(16+COL*9)); + aux[0]=0; + s[0]=0; + empty=1; + PrintMessage(strings[S_ExeMem]); //"\r\nExecutive memory:\r\n" + for(i=0;i>4)&0xF; + int EEbaseAddr=0x1000-dim2; + int newTABLPAG=options&0x100000?1:0; + int err=0; + if(FWVersion<0x700){ + PrintMessage1(strings[S_FWver2old],"0.7.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(entry<2&&!CheckV33Regulator()){ //except 30Fxx which is on 5V + PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board + return; + } + if(saveLog){ + OpenLogFile(); + fprintf(logfile,"Write24Fx(%d,%d,%d,%d,%d,%.1f) (0x%X,0x%X,0x%X,0x%X,0x%X,%.3f)\n" + ,dim,dim2,options,appIDaddr,rowSize,wait,dim,dim2,options,appIDaddr,rowSize,wait); + } + dim*=2; //from words to bytes + if(dim>0x80000||dim<0){ + PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" + return; + } + if(dim2>0x1000||dim2<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + j=size; + if(j%(rowSize*4)){ //grow to an integer number of rows + size=(j/(rowSize*4)+1)*rowSize*4; + memCODE=(unsigned char*)realloc(memCODE,size); + for(;jsize) dim=size; + if(sizeEE<0x1000) dim2=0; + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Empty code area\r\n" + return; + } + if((entry==1)||(entry==2)){ //High voltage programming: 3.3V + 1.5V + R drop + margin + if(!StartHVReg(entry==2?12:6)){ //12V only for 30Fxx !!! + PrintMessage(strings[S_HVregErr]); //"HV regulator error\r\n" + return; + } + } + else StartHVReg(-1); //LVP: current limited to (5-0.7-3.6)/10k = 50uA + if(config>2){ //only if separate config area + PrintMessage(strings[S_ConfigMem]); //"\r\nConfig Memory:\r\n" + if(config==3||config==4||config==6){ + PrintMessage1("0xF80000: FBS = 0x%02X\r\n",memCONFIG[0]); + if(config==4){ //0xF80000-16 + PrintMessage1("0xF80002: FSS = 0x%02X\r\n",memCONFIG[4]); + } + PrintMessage1("0xF80004: FGS = 0x%02X\r\n",memCONFIG[8]); + PrintMessage1("0xF80006: FOSCSEL = 0x%02X\r\n",memCONFIG[12]); + PrintMessage1("0xF80008: FOSC = 0x%02X\r\n",memCONFIG[16]); + PrintMessage1("0xF8000A: FWDT = 0x%02X\r\n",memCONFIG[20]); + PrintMessage1("0xF8000C: FPOR = 0x%02X\r\n",memCONFIG[24]); + PrintMessage1("0xF8000E: FICD = 0x%02X\r\n",memCONFIG[28]); + if(config==3){ //0xF80000-10 except 02 + PrintMessage1("0xF80010: FDS = 0x%02X\r\n",memCONFIG[32]); + } + else if(config==4){ //0xF80000-16 + PrintMessage1("0xF80010: UID0 = 0x%02X\r\n",memCONFIG[32]); + PrintMessage1("0xF80012: UID1 = 0x%02X\r\n",memCONFIG[36]); + PrintMessage1("0xF80014: UID2 = 0x%02X\r\n",memCONFIG[40]); + PrintMessage1("0xF80016: UID3 = 0x%02X\r\n",memCONFIG[44]); + } + } + else if(config==5){ //0xF80000-0C (16 bit) + PrintMessage2("0xF80000: FOSC = 0x%02X%02X\r\n",memCONFIG[1],memCONFIG[0]); + PrintMessage2("0xF80002: FWDT = 0x%02X%02X\r\n",memCONFIG[5],memCONFIG[4]); + PrintMessage2("0xF80004: FBORPOR = 0x%02X%02X\r\n",memCONFIG[9],memCONFIG[8]); + PrintMessage2("0xF80006: FBS = 0x%02X%02X\r\n",memCONFIG[13],memCONFIG[12]); + PrintMessage2("0xF80008: FSS = 0x%02X%02X\r\n",memCONFIG[17],memCONFIG[16]); + PrintMessage2("0xF8000A: FGS = 0x%02X%02X\r\n",memCONFIG[21],memCONFIG[20]); + PrintMessage2("0xF8000C: FICD = 0x%02X%02X\r\n",memCONFIG[25],memCONFIG[24]); + } + } + else{ + //last 2 program words + PrintMessage2("CONFIG1: 0x%04X\r\nCONFIG2: 0x%04X\r\n",(memCODE[dim-3]<<8)+memCODE[dim-4]\ + ,(memCODE[dim-7]<<8)+memCODE[dim-8]); + if(config==1){ //last 3 program words + PrintMessage1("CONFIG3: 0x%04X\r\n",(memCODE[dim-11]<<8)+memCODE[dim-12]); + } + if(config==2){ //last 4 program words + PrintMessage1("CONFIG4: 0x%04X\r\n",(memCODE[dim-15]<<8)+memCODE[dim-16]); + } + } + unsigned int start=GetTickCount(); + bufferU[0]=0; + j=1; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=2000>>8; + bufferU[j++]=2000&0xff; + bufferU[j++]=EN_VPP_VCC; //enter program mode + bufferU[j++]=0x0; + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; + bufferU[j++]=WAIT_T2; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=EN_VPP_VCC; //VDD + VPP + bufferU[j++]=0x5; + if((entry==0)||(entry==3)){ //LVP: pulse on MCLR + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + } + else PrintMessage(strings[S_HVICSP]); //"High Voltage ICSP\r\n" + bufferU[j++]=WAIT_T3; + bufferU[j++]=TX16; + bufferU[j++]=2; + bufferU[j++]=0x4D; + bufferU[j++]=0x43; + bufferU[j++]=0x48; + bufferU[j++]=0x51; + bufferU[j++]=WAIT_T3; //min 1ms + bufferU[j++]=EN_VPP_VCC; //VDD + VPP + bufferU[j++]=0x5; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=30000>>8; + bufferU[j++]=30000&0xff; + bufferU[j++]=WAIT_T3; //min 25ms + if(entry==2){ //30Fx entry + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=EN_VPP_VCC; //VDD + VPP + bufferU[j++]=0x5; + bufferU[j++]=ICSP_NOP; + } + else{ + //Additional 5 clock cycles upon entering program mode + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + } + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j>12)&0xF); //MOV XXXX,W6 + bufferU[j++]=(appIDaddr>>4)&0xFF; + bufferU[j++]=((appIDaddr<<4)&0xF0)+6; + bufferU[j++]=0x20; //MOV #VISI,W7 + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0x96; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=2000>>8; + bufferU[j++]=2000&0xff; + bufferU[j++]=FLUSH; + for(;j>8; + //bulk erase command + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x24; //MOV XXXX,W10 + if(erase==0){ //0x4064 + bufferU[j++]=0x06; + bufferU[j++]=0x4A; + } + else if(erase==1){ //0x404F + bufferU[j++]=0x04; + bufferU[j++]=0xFA; + } + else if(erase>=2){ //0x407F + bufferU[j++]=0x07; + bufferU[j++]=0xFA; + } + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W0] (dummy write) + bufferU[j++]=0xBB; + bufferU[j++]=0x08; + bufferU[j++]=0x00; + if(erase>=2){ //30Fx, unlock and external timing + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + if(erase==3){ //200 ms timing + bufferU[j++]=FLUSH; + for(;j0?0x1A:0x4A; //0x4001/0x4004 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x04; //GOTO 0x200 + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j=dim) break; + } + if((i>>17)!=High){ //advance page + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20; + bufferU[j++]=(i>>21)&0xFF; + bufferU[j++]=(i>>13)&0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j>17; + } + bufferU[j++]=SIX_N; + bufferU[j++]=8; + bufferU[j++]=0x20+((i>>13)&0xF); //MOV i/2,W7 + bufferU[j++]=(i>>5)&0xFF; + bufferU[j++]=((i<<3)&0xF0)+7; + bufferU[j++]=0x20+((memCODE[i+1]>>4)&0xF); //MOV LSW0,W0 + bufferU[j++]=((memCODE[i+1]<<4)&0xF0)+((memCODE[i]>>4)&0xF); + bufferU[j++]=(memCODE[i]<<4)&0xF0; + bufferU[j++]=0x20+((memCODE[i+6]>>4)&0xF); //MOV MSB1:MSB0,W1 + bufferU[j++]=((memCODE[i+6]<<4)&0xF0)+((memCODE[i+2]>>4)&0xF); + bufferU[j++]=((memCODE[i+2]<<4)&0xF0)+1; + bufferU[j++]=0x20+((memCODE[i+5]>>4)&0xF); //MOV LSW1,W2 + bufferU[j++]=((memCODE[i+5]<<4)&0xF0)+((memCODE[i+4]>>4)&0xF); + bufferU[j++]=((memCODE[i+4]<<4)&0xF0)+2; + bufferU[j++]=0x20+((memCODE[i+9]>>4)&0xF); //MOV LSW2,W3 + bufferU[j++]=((memCODE[i+9]<<4)&0xF0)+((memCODE[i+8]>>4)&0xF); + bufferU[j++]=((memCODE[i+8]<<4)&0xF0)+3; + bufferU[j++]=0x20+((memCODE[i+14]>>4)&0xF); //MOV MSB3:MSB2,W4 + bufferU[j++]=((memCODE[i+14]<<4)&0xF0)+((memCODE[i+10]>>4)&0xF); + bufferU[j++]=((memCODE[i+10]<<4)&0xF0)+4; + bufferU[j++]=0x20+((memCODE[i+13]>>4)&0xF); //MOV LSW3,W5 + bufferU[j++]=((memCODE[i+13]<<4)&0xF0)+((memCODE[i+12]>>4)&0xF); + bufferU[j++]=((memCODE[i+12]<<4)&0xF0)+5; + bufferU[j++]=0xEB; //CLR W6 + bufferU[j++]=0x03; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_N; + bufferU[j++]=0x88; //Append 2 NOP + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7] + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[W7++] + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[++W7] + bufferU[j++]=0xEB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7++] + bufferU[j++]=0x1B; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7] + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[W7++] + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[++W7] + bufferU[j++]=0xEB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7++] + bufferU[j++]=0x1B; + bufferU[j++]=0xB6; + k++; + if(k==rowSize/4){ //Write row + if(erase>1){ //30Fx, unlock and external timing + bufferU[j++]=FLUSH; + for(;j0?0x1A:0x4A; //0x4001/0x4004 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + } + else{ //internal timing + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + k=0; + } + bufferU[j++]=FLUSH; + for(;j=dim) break; + if((i>>17)!=High){ //advance page + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20; + bufferU[j++]=(i>>21)&0xFF; + bufferU[j++]=(i>>13)&0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j>17; + } + bufferU[j++]=SIX; //MOV i/2,W6 + bufferU[j++]=0x20+((i>>13)&0xF); + bufferU[j++]=(i>>5)&0xFF; + bufferU[j++]=((i<<3)&0xF0)+6; + bufferU[j++]=SIX; //MOV #VISI,W7 + bufferU[j++]=0x20; + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0x96; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDH.B [W6++],[W7++] + bufferU[j++]=0xBA; + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=SIX_LONG; //TBLRDH.B [++W6],[W7--] + bufferU[j++]=0xBA; + bufferU[j++]=0xD3; + bufferU[j++]=0xD6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0x96; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDH.B [W6++],[W7++] + bufferU[j++]=0xBA; + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=SIX_LONG; //TBLRDH.B [++W6],[W7--] + bufferU[j++]=0xBA; + bufferU[j++]=0xD3; + bufferU[j++]=0xD6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j=max_err) break; + } + PrintStatusEnd(); + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" + if(err>=max_err){ + PrintMessage1(strings[S_MaxErr],err); //"Exceeded maximum number of errors (%d), write interrupted\r\n" + } +//****************** erase, write and verify EEPROM ******************** + if(dim2&&err>12; + if(eewrite==0){ //24FxxKAxx + bufferU[j++]=SIX; //MOV 0x4050,W10 + bufferU[j++]=0x24; + bufferU[j++]=0x05; + bufferU[j++]=0x0A; + bufferU[j++]=SIX; //MOV W10,NVMCON + bufferU[j++]=0x88; + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=SIX; //MOV 0x7F,W0 + bufferU[j++]=0x20; + bufferU[j++]=0x07; + bufferU[j++]=0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=SIX; //MOV EEbaseAddr,W0 + bufferU[j++]=0x2F; + bufferU[j++]=EEbaseAddr>>4; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX; //TBLWTL W0,[W0] + bufferU[j++]=0xBB; + bufferU[j++]=0x08; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP;/**/ + /* //Erase EEPROM + bufferU[j++]=SIX; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=SIX; //MOV 0x4004,W10 + bufferU[j++]=0x24; + bufferU[j++]=0x00; + bufferU[j++]=0x4A; + bufferU[j++]=SIX; //MOV W10,NVMCON + bufferU[j++]=0x88; + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j>4; + bufferU[j++]=((i<<4)&0xF0)+7; + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20+((memEE[i+1]>>4)&0xF); + bufferU[j++]=((memEE[i+1]<<4)&0xF0)+((memEE[i]>>4)&0xF); + bufferU[j++]=(memEE[i]<<4)&0xF0; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + if(eewrite==0){ //24FxxKAxx + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + else if(eewrite==1){ //30Fxxxx + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 0x4004,W10 + bufferU[j++]=0x00; + bufferU[j++]=0x4A; + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + bufferU[j++]=FLUSH; + for(;j>4; + bufferU[j++]=0x06; + bufferU[j++]=SIX; //MOV #VISI,W7 + bufferU[j++]=0x20; + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + int errE=0; + for(i=k2=EEbaseAddr;iDIMBUF-7||i==dim2-4){ + bufferU[j++]=FLUSH; + for(;j2&&config<5&&err>16; + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x20; //MOV 0xF8,W0 + bufferU[j++]=0x0F; + bufferU[j++]=0x80; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x24; //MOV 0x400x,W10 + bufferU[j++]=0x00; + if(confword==0)bufferU[j++]=0x0A; //0x4000 + else if(confword==1)bufferU[j++]=0x3A; //0x4003 + else if(confword==2)bufferU[j++]=0x4A; //0x4004 + else if(confword==3)bufferU[j++]=0x8A; //0x4008 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0,W7 + bufferU[j++]=0x00; + bufferU[j++]=0x07; + bufferU[j++]=0x04; //GOTO 0x200 + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + for(i=0;i<12;i++){ + //Write CONFIG + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20; + bufferU[j++]=(memCONFIG[i*4]>>4)&0xF; + bufferU[j++]=(memCONFIG[i*4]<<4)&0xF0; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + //if(memCONFIG[i*4]<0xFF){ //write if not empty + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + //} + bufferU[j++]=FLUSH; + for(;j=5&&err>12); + bufferU[j++]=(value>>4); + bufferU[j++]=(value<<4); + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + if(value<0xFFFF){ //write if not empty + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 0x400x,W10 + bufferU[j++]=0x00; + bufferU[j++]=0x8A; //0x4008 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + bufferU[j++]=FLUSH; + for(;j