bit more of an attempt , steve can you check the logic ,cleanup ,
Code:
Flash_Byte_Modify:
' assumes address , length ( upto 256bytes )
' assumes sector 0 is not protected
' assumes selectted sector is not protected
Flash_Addr_Copy.byte3 = Data_Length ' save the selected address & length
Flash_Addr_Copy.byte2 = SDC_Sector
Flash_Addr_Copy.byte1 = SDC_Page
Flash_Addr_Copy.byte0 = SDC_Byte
SDC_sector = 0
gosub Flash_Sec_Erase ' erase sector 0
SDC_sector = 0 ' use sector 0,instead of given sector , but use given page, byte length
gosub Flash_write ' Write the the changed data to sector 0
if Flash_Addr_Copy.byte1 = 0 then ' find the pages to copy - copy all pages/ bytes above 0 for given sector
for SDC_Page = 1 to 255 ' read all pages above 0 of selected sector
SDC_Sector = Flash_Addr_Copy.byte2 ' of read selected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Read ' read 255 bytes at a time
SDC_Sector = 0 ' use sector 0 aselected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Write ' write
next SDC_Page
endif
if Flash_Addr_Copy.byte1 = 255 then ' find the pages to copy - copy all pages/ bytes below given page/ byte of sector
for SDC_Page = 0 to 254 ' read all pages below 255 of selected sector
SDC_Sector = Flash_Addr_Copy.byte2 ' of read selected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Read ' read 255 bytes at a time
SDC_Sector = 0 ' use sector 0 aselected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Write ' write
next SDC_Page
endif
if Flash_Addr_Copy.byte1 >0 and Flash_Addr_Copy.byte1 < 254 then ' find the pages to copy - copy all pages/ bytes below given page/ byte of sector
for SDC_Page = 0 to Flash_Addr_Copy.byte1 - 1 ' read all pages from 0 to selected page -1
SDC_Sector = Flash_Addr_Copy.byte2 ' of read selected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Read ' read 255 bytes at a time
SDC_Sector = 0 ' use sector 0 aselected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Write ' write
next SDC_Page
endif
for SDC_Page = Flash_Addr_Copy.byte1 + 1 to 255 ' read all pages from selected page + 1 to 255
SDC_Sector = Flash_Addr_Copy.byte2 ' of read selected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Read ' read 255 bytes at a time
SDC_Sector = 0 ' use sector 0 aselected sector
SDC_byte = 0 ' bytes 0 - 255
Data_Length = 255 ' all bytes
gosub Flash_Write ' write
next SDC_Page
endif
endif
if Flash_Addr_Copy.byte0 + Flash_Addr_Copy.byte3 < 255 then ' if the start byte + data length of the data changed is < 255 bytes ,
' then copy bytes below the selected changed data
SDC_Sector = Flash_Addr_Copy.byte2 ' read selected sector
SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page
SDC_byte = 0 ' start address bytes 0 to
Data_Length = Flash_Addr_Copy.byte0 - 1 ' selected byte - 1 ( length)
gosub Flash_Read ' read
SDC_Sector = 0 ' use sector 0 aselected sector
SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page
SDC_byte = 0 ' start address bytes 0 to
Data_Length = Flash_Addr_Copy.byte0 - 1 ' selected byte - 1 ( length)
gosub Flash_Write ' write
' then copy bytes above the selected changed data
SDC_Sector = Flash_Addr_Copy.byte2 ' read selected sector
SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page
SDC_byte = Flash_Addr_Copy.byte0 + Flash_Addr_Copy.byte3 ' start address bytes above given address and length
Data_Length = 255 - SDC_byte ' data above changed bytes ( length = 255 bytes - given addrees + given length )
gosub Flash_Read ' read the data
SDC_Sector = 0 ' use sector 0
SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page
SDC_byte = Flash_Addr_Copy.byte0 + Flash_Addr_Copy.byte3 ' start address bytes above given address and length
Data_Length = 255 - SDC_byte ' data above changed bytes ( length = 255 bytes - given addrees + given length )
gosub Flash_Write ' write the data
endif
' Sector 0 should now have a complete copy of the data + changed data from the orginal selected sector
SDC_sector = Flash_Addr_Copy.byte2
gosub Flash_Sec_Erase ' erase orginal sector
for SDC_PAGE = 0 to 255 ' copy sector 0 pages to selected sector 0 ( 256bytes at a time)
SDC_Sector = 0 ' use sector 0
SDC_byte = 0
Data_Length = 255
gosub Flash_Read ' read the data
SDC_Sector = Flash_Addr_Copy.byte2 ' use selected sector
SDC_byte = 0
Data_Length = 255
next SDC_PAGE
SDC_sector = 0 ' clean up sector 0
gosub Flash_Sec_Erase ' erase orginal sector
return
Bookmarks