; FLASH 49LF008, by cederom@tlen.pl www.cederom.blok.net.pl ; based on 49LF004 algorithm ; Var CheckSum:Word; VAR ChipStart : LongWord; VAR ChipStop : LongWord; VAR BufferStart: LongWord; VAR Data:Byte; Frame(10,10,210,280) Button('/Blank' ,20, 20,112,35,'IconDeviceBlank',Blank); Frame(10,59,210,2) Button('/Read' ,20, 65,112,35,'IconDeviceRead',READ); Frame(10,104,210,2) Button('/Program',20,110,112,35,'IconDeviceProgram',Program); Frame(10,149,210,2) Button('/Verify' ,20,155,112,35,'IconDeviceVerify',verify); Frame(10,194,210,2) Button('/Auto' ,20,200,112,35,'IconDeviceAuto',auto); Frame(10,239,210,2) Button('/Erase' ,20,245,112,35,'IconDeviceErase',Erase); equ Check=1; equ unCheck=0; Var CheckAutoErase:Byte; Var CheckAutoVerify:Byte; Var CheckProgramVerify:Byte; Var OverWrite:Byte; Var ErrCounter:Byte; Var IgnoreErrors:Byte; CheckBox('Verify',140,119,CheckProgramVerify,1); CheckBox('Erase' ,140,198,CheckAutoErase,1); CheckBox('Verify',140,220,CheckAutoVerify,1); Frame(590,165,185,80) CheckBox('Overwrite',600,175,OverWrite,0); CheckBox('Ignore errors', 600, 190, IgnoreErrors,0); Frame(590,10,185,147) EditHEX('Chip Start' ,100,705, 25,58,25,ChipStart,0,0,ChipStop); Frame(590,59,185,2) EditHEX('Chip Stop' ,100,705, 72,58,25,ChipStop,_GLOBALSIZE-1,0,_GLOBALSIZE-1); Frame(590,104,185,2) EditHEX('Buffer Start',100,705,119,58,25,BufferStart,0,0,_GLOBALBUFFERSIZE-1); TextFrame(230,10,350,210,T1); ProgressRect(230,230,350,15,P1); AdresMask(20,19,18,17,16,15,14,13,12,11,38); DataMask(21,22,23,25,26,27,28,29); EQU VCC1=40; EQU VCC2=33; EQU GND1=24; EQU GND2=36; EQU RC=39; EQU IC=37; EQU OE=32; EQU WE=31; EQU RESET=5; EQU RESET1=9; VAR ADRESChip:LongWord; VAR ADRESMemory:LongWord; VAR Blanked:LongWord; VAR DataTemp:Byte; VAR Verify:LongWord; BODY ;******************************************************* Var XAdres:LongWord; Procedure(ADRESOUTX) PinH(RC) AdresOut(XAdres) PinL(RC) Let XAdres shr 11 AdresOut(XAdres) PinH(RC) EndProc; var CData:Word; var CAdres:LongWord; Procedure(Out) PinH(RC, OE, WE) Let XAdres=CAdres AdresOut(XAdres) PinL(RC) Let XAdres shr 11 AdresOut(XAdres) PinL(WE) DataOut(CData) PinH(RC) PinH(WE) EndProc; Var IDManuf:Byte; Var IDDevice:Byte; Procedure(IDent) Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 090h; Out Let XAdres=0; AdresOutX DataOut($FF) PinL(OE) DataIn(IDManuf); PinH(OE); Let XAdres=1; AdresOutX DataOut($FF) PinL(OE) DataIn(IDDevice); PinH(OE); Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 0F0h; Out DataOut($FF) EndProc; var DataVer:Byte; var VCounter:Word; Procedure(FWrite) Let ErrCounter=0 Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 0A0h; Out Let CAdres= AdresChip; Let CData = Data; Out Let VCounter=0; DataOut(0FFh) @Petla: PinL(OE) DataIn(DataVer) PinH(OE) Inc(ErrCounter) if ErrCounter=25 then exit; if DataVer<>Data then goto Petla EndProc; Procedure(FErase) Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 080h; Out Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 010h; Out DataOut($FF) @Petla: PinL(OE) DataIn(DataVer) PinH(OE) if DataVer<>0FFh then goto Petla Loop(100) EndProc; ;******************************************************* Procedure(POWER_ON); TEXT(T1,'/Maroon/Waiting...#//'); RESET LEDON VCCSET(270) ; otherwise programing wont work properly! PULLUP5V ; otherwise programing wont work properly! VCC(VCC1, VCC2) PINL(GND1,GND2) Let XAdres=$FFFFFFFF; AdresOut(XAdres) DATAOUT($FF) PINH(IC,OE,WE) ;we VCCON; PINL(RESET, RESET1) loop(1) pinh(reset, reset1) loop(1) Ident; if IDManuf=_GLOBALMANUFCODE then begin if IDDevice=_GLOBALDEVICECODE then TEXT(T1,'/Blue/ID Detect !//#'); end; EndProc; ;******************************************************* Procedure(POWER_OFF); Progress(P1,0); RESET EndProc; ;******************************************************* Procedure(BLANK); TEXT(T1,'#BLANK '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; Let Blanked=0; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin Let XAdres=AdresChip; AdresOutX; PINL(OE) DATAIN(Data); PINH(OE) IF DATA<>$FF THEN Inc(Blanked); Progress(P1,AdresChip); end; if blanked<>0 then begin TEXT(T1,'/Red//Under/WARNING !// CHIP NOT BLANK.#') TEXT(T1,'/Navy blue/') TEXTHEX(T1,Blanked) TEXT(T1,' //byte <> FFh.#') POWER_OFF Halt end; TEXT(T1,'/Under/OK!// CHIP BLANK#') POWER_OFF EndProc; ;******************************************************* Procedure(READ); TEXT(T1,'#READ '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; LET Blanked=0; Let CheckSum=0; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin Let XAdres=AdresChip; AdresOutX; PinL(OE) DATAIN(Data); PinH(OE) MEMORYOUT(ADRESMemory,Data); Let CheckSum+Data; IF DATA<>$FF THEN Inc(Blanked); INC(ADRESMemory); Progress(P1,AdresChip); end; if blanked<>0 then begin TEXT(T1,'/Navy blue/') TEXTHEX(T1,Blanked) TEXT(T1,'// byte <> FFh. ') end; Text(T1,'/Under/OK!//') Text(T1,' Crc='); TextHex(T1,CheckSum); Text(T1,'h#'); POWER_OFF EndProc; ;******************************************************* Var AdrError:LongWord; Var DataBufferError:Word; Var DataChipError:Word; Var MarkError:Byte Equ Marked = 1; Equ NotMarked = 0; Procedure(Verify); TEXT(T1,'#VERIFY '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; Let Verify=0; Let MarkError=NotMarked; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin Let XAdres=AdresChip; AdresOutX; PINL(OE) DATAIN(Data); PINH(OE) CompareOut(AdresMemory,Data); MemoryIn(AdresMemory,DataTemp); IF DATA<>DataTemp THEN begin Inc(Verify); if MarkError=NotMarked then begin Let AdrError=AdresChip; Let DataBufferError=DataTemp; Let DataChipError=Data; Let MarkError=Marked; end; end; INC(AdresMemory); Progress(P1,AdresChip); end; if verify<>0 then begin TEXT(T1,'/Red//Under/ERROR !// Verify #') TEXT(T1,'/Navy blue/') TEXTHEX(T1,Verify) TEXT(T1,' //byte bad value#') TEXT(T1,'First error:#') TEXT(T1,'ChipAdres ChipData MemoryData#/Navy blue/') TEXTHEX(T1,AdrError) TEXT(T1,'h ') TEXTHEX(T1,DataChipError) TEXT(T1,'h ') TEXTHEX(T1,DataBufferError) TEXT(T1,'h #//') POWER_OFF exit end TEXT(T1,'/Under/OK!// CHIP Verify#') POWER_OFF EndProc; ;******************************************************* var Counter:Byte; procedure(Impuls); Let Counter=1 for Counter to 5 do begin FWrite; if DataVer=Data then exit; text(t1, 'program error, retry...#') PinL(reset, reset1) loop(10) PinH(reset, reset1) loop(10) end; EndProc; ;******************************************************* var Counter1:Word; procedure(Erase); TEXT(T1,'#ERASE '); POWER_ON Let ADRESCHIP=0; PROGRESSMAX(P1,_GLOBALSIZE-1); PROGRESSMIN(P1,0); FErase; TEXT(T1,'/Under/OK!// CHIP Erased#') POWER_OFF EndProc; ;******************************************************* procedure(ProgramLoop); TEXT(T1,'#PROGRAM '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin MEMORYIN(AdresMemory,Data); Impuls; if IgnoreErrors=0 then begin if DataVer<>Data then begin Text(T1,'/Red//Under/Error!//#'); TEXT(T1,'ChipAdres ChipData MemoryData#') Text(T1,'/Navy blue/'); TEXTHEX(T1,AdresChip) TEXT(T1,'h ') TEXTHEX(T1,DataVer) TEXT(T1,'h ') TEXTHEX(T1,Data) TEXT(T1,'h #//') POWER_OFF Halt; end; end if IgnoreErrors=1 then Loop(10) INC(ADRESMemory); Progress(P1,AdresChip); end; TEXT(T1,'/Under/OK!// CHIP Program#') POWER_OFF EndProc; procedure(Program); ProgramLoop; if CheckProgramVerify=Check then Verify EndProc; ;******************************************************* procedure(Auto) TEXT(T1,'#AUTO '); if CheckAutoErase=Check then Erase ProgramLoop; if CheckAutoVerify=Check then Verify Serialize; TEXT(T1,'#/Under/OK!// AUTO#') endproc ;******************************************************* end. ; FLASH 49LF008, by cederom@tlen.pl www.cederom.blok.net.pl ; based on 49LF004 algorithm ; Var CheckSum:Word; VAR ChipStart : LongWord; VAR ChipStop : LongWord; VAR BufferStart: LongWord; VAR Data:Byte; Frame(10,10,210,280) Button('/Blank' ,20, 20,112,35,'IconDeviceBlank',Blank); Frame(10,59,210,2) Button('/Read' ,20, 65,112,35,'IconDeviceRead',READ); Frame(10,104,210,2) Button('/Program',20,110,112,35,'IconDeviceProgram',Program); Frame(10,149,210,2) Button('/Verify' ,20,155,112,35,'IconDeviceVerify',verify); Frame(10,194,210,2) Button('/Auto' ,20,200,112,35,'IconDeviceAuto',auto); Frame(10,239,210,2) Button('/Erase' ,20,245,112,35,'IconDeviceErase',Erase); equ Check=1; equ unCheck=0; Var CheckAutoErase:Byte; Var CheckAutoVerify:Byte; Var CheckProgramVerify:Byte; Var OverWrite:Byte; Var ErrCounter:Byte; Var IgnoreErrors:Byte; CheckBox('Verify',140,119,CheckProgramVerify,1); CheckBox('Erase' ,140,198,CheckAutoErase,1); CheckBox('Verify',140,220,CheckAutoVerify,1); Frame(590,165,185,80) CheckBox('Overwrite',600,175,OverWrite,0); CheckBox('Ignore errors', 600, 190, IgnoreErrors,0); Frame(590,10,185,147) EditHEX('Chip Start' ,100,705, 25,58,25,ChipStart,0,0,ChipStop); Frame(590,59,185,2) EditHEX('Chip Stop' ,100,705, 72,58,25,ChipStop,_GLOBALSIZE-1,0,_GLOBALSIZE-1); Frame(590,104,185,2) EditHEX('Buffer Start',100,705,119,58,25,BufferStart,0,0,_GLOBALBUFFERSIZE-1); TextFrame(230,10,350,210,T1); ProgressRect(230,230,350,15,P1); AdresMask(20,19,18,17,16,15,14,13,12,11,38); DataMask(21,22,23,25,26,27,28,29); EQU VCC1=40; EQU VCC2=33; EQU GND1=24; EQU GND2=36; EQU RC=39; EQU IC=37; EQU OE=32; EQU WE=31; EQU RESET=5; EQU RESET1=9; VAR ADRESChip:LongWord; VAR ADRESMemory:LongWord; VAR Blanked:LongWord; VAR DataTemp:Byte; VAR Verify:LongWord; BODY ;******************************************************* Var XAdres:LongWord; Procedure(ADRESOUTX) PinH(RC) AdresOut(XAdres) PinL(RC) Let XAdres shr 11 AdresOut(XAdres) PinH(RC) EndProc; var CData:Word; var CAdres:LongWord; Procedure(Out) PinH(RC, OE, WE) Let XAdres=CAdres AdresOut(XAdres) PinL(RC) Let XAdres shr 11 AdresOut(XAdres) PinL(WE) DataOut(CData) PinH(RC) PinH(WE) EndProc; Var IDManuf:Byte; Var IDDevice:Byte; Procedure(IDent) Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 090h; Out Let XAdres=0; AdresOutX DataOut($FF) PinL(OE) DataIn(IDManuf); PinH(OE); Let XAdres=1; AdresOutX DataOut($FF) PinL(OE) DataIn(IDDevice); PinH(OE); Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 0F0h; Out DataOut($FF) EndProc; var DataVer:Byte; var VCounter:Word; Procedure(FWrite) Let ErrCounter=0 Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 0A0h; Out Let CAdres= AdresChip; Let CData = Data; Out Let VCounter=0; DataOut(0FFh) @Petla: PinL(OE) DataIn(DataVer) PinH(OE) Inc(ErrCounter) if ErrCounter=25 then exit; if DataVer<>Data then goto Petla EndProc; Procedure(FErase) Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 080h; Out Let CAdres= 5555h; Let CData = 0AAh; Out Let CAdres= 2AAAh; Let CData = 055h; Out Let CAdres= 5555h; Let CData = 010h; Out DataOut($FF) @Petla: PinL(OE) DataIn(DataVer) PinH(OE) if DataVer<>0FFh then goto Petla Loop(100) EndProc; ;******************************************************* Procedure(POWER_ON); TEXT(T1,'/Maroon/Waiting...#//'); RESET LEDON VCCSET(270) ; otherwise programing wont work properly! PULLUP5V ; otherwise programing wont work properly! VCC(VCC1, VCC2) PINL(GND1,GND2) Let XAdres=$FFFFFFFF; AdresOut(XAdres) DATAOUT($FF) PINH(IC,OE,WE) ;we VCCON; PINL(RESET, RESET1) loop(1) pinh(reset, reset1) loop(1) Ident; if IDManuf=_GLOBALMANUFCODE then begin if IDDevice=_GLOBALDEVICECODE then TEXT(T1,'/Blue/ID Detect !//#'); end; EndProc; ;******************************************************* Procedure(POWER_OFF); Progress(P1,0); RESET EndProc; ;******************************************************* Procedure(BLANK); TEXT(T1,'#BLANK '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; Let Blanked=0; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin Let XAdres=AdresChip; AdresOutX; PINL(OE) DATAIN(Data); PINH(OE) IF DATA<>$FF THEN Inc(Blanked); Progress(P1,AdresChip); end; if blanked<>0 then begin TEXT(T1,'/Red//Under/WARNING !// CHIP NOT BLANK.#') TEXT(T1,'/Navy blue/') TEXTHEX(T1,Blanked) TEXT(T1,' //byte <> FFh.#') POWER_OFF Halt end; TEXT(T1,'/Under/OK!// CHIP BLANK#') POWER_OFF EndProc; ;******************************************************* Procedure(READ); TEXT(T1,'#READ '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; LET Blanked=0; Let CheckSum=0; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin Let XAdres=AdresChip; AdresOutX; PinL(OE) DATAIN(Data); PinH(OE) MEMORYOUT(ADRESMemory,Data); Let CheckSum+Data; IF DATA<>$FF THEN Inc(Blanked); INC(ADRESMemory); Progress(P1,AdresChip); end; if blanked<>0 then begin TEXT(T1,'/Navy blue/') TEXTHEX(T1,Blanked) TEXT(T1,'// byte <> FFh. ') end; Text(T1,'/Under/OK!//') Text(T1,' Crc='); TextHex(T1,CheckSum); Text(T1,'h#'); POWER_OFF EndProc; ;******************************************************* Var AdrError:LongWord; Var DataBufferError:Word; Var DataChipError:Word; Var MarkError:Byte Equ Marked = 1; Equ NotMarked = 0; Procedure(Verify); TEXT(T1,'#VERIFY '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; Let Verify=0; Let MarkError=NotMarked; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin Let XAdres=AdresChip; AdresOutX; PINL(OE) DATAIN(Data); PINH(OE) CompareOut(AdresMemory,Data); MemoryIn(AdresMemory,DataTemp); IF DATA<>DataTemp THEN begin Inc(Verify); if MarkError=NotMarked then begin Let AdrError=AdresChip; Let DataBufferError=DataTemp; Let DataChipError=Data; Let MarkError=Marked; end; end; INC(AdresMemory); Progress(P1,AdresChip); end; if verify<>0 then begin TEXT(T1,'/Red//Under/ERROR !// Verify #') TEXT(T1,'/Navy blue/') TEXTHEX(T1,Verify) TEXT(T1,' //byte bad value#') TEXT(T1,'First error:#') TEXT(T1,'ChipAdres ChipData MemoryData#/Navy blue/') TEXTHEX(T1,AdrError) TEXT(T1,'h ') TEXTHEX(T1,DataChipError) TEXT(T1,'h ') TEXTHEX(T1,DataBufferError) TEXT(T1,'h #//') POWER_OFF exit end TEXT(T1,'/Under/OK!// CHIP Verify#') POWER_OFF EndProc; ;******************************************************* var Counter:Byte; procedure(Impuls); Let Counter=1 for Counter to 5 do begin FWrite; if DataVer=Data then exit; text(t1, 'program error, retry...#') PinL(reset, reset1) loop(10) PinH(reset, reset1) loop(10) end; EndProc; ;******************************************************* var Counter1:Word; procedure(Erase); TEXT(T1,'#ERASE '); POWER_ON Let ADRESCHIP=0; PROGRESSMAX(P1,_GLOBALSIZE-1); PROGRESSMIN(P1,0); FErase; TEXT(T1,'/Under/OK!// CHIP Erased#') POWER_OFF EndProc; ;******************************************************* procedure(ProgramLoop); TEXT(T1,'#PROGRAM '); POWER_ON; Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart); for AdresChip to ChipStop do begin MEMORYIN(AdresMemory,Data); Impuls; if IgnoreErrors=0 then begin if DataVer<>Data then begin Text(T1,'/Red//Under/Error!//#'); TEXT(T1,'ChipAdres ChipData MemoryData#') Text(T1,'/Navy blue/'); TEXTHEX(T1,AdresChip) TEXT(T1,'h ') TEXTHEX(T1,DataVer) TEXT(T1,'h ') TEXTHEX(T1,Data) TEXT(T1,'h #//') POWER_OFF Halt; end; end if IgnoreErrors=1 then Loop(10) INC(ADRESMemory); Progress(P1,AdresChip); end; TEXT(T1,'/Under/OK!// CHIP Program#') POWER_OFF EndProc; procedure(Program); ProgramLoop; if CheckProgramVerify=Check then Verify EndProc; ;******************************************************* procedure(Auto) TEXT(T1,'#AUTO '); if CheckAutoErase=Check then Erase ProgramLoop; if CheckAutoVerify=Check then Verify Serialize; TEXT(T1,'#/Under/OK!// AUTO#') endproc ;******************************************************* end.