215 lines
4.4 KiB
VimL
215 lines
4.4 KiB
VimL
" Vim Library for Editing .srec Files
|
|
" Maintainer: Alexander Fleck
|
|
" <alexander.fleck@gmx.net>
|
|
" License: This File is placed in the Public Domain.
|
|
" Revision | Date [DD.MM.YY] | Changes
|
|
" 00.01.00 | 05.07.09 | 01. Revision
|
|
" 00.01.10 | 29.03.10 | BugFix, in libsrec#CrCS()
|
|
" | | leading Zeros in Result
|
|
" 00.02.00 | 29.03.10 | Fun added, MkS5()
|
|
" 00.02.10 | 15.06.10 | BugFix, in libsrec#CrCS()
|
|
" | | wrong Source for CS
|
|
" 00.02.20 | | -
|
|
|
|
" create ByteCount
|
|
fun libsrec#CrBC(line)
|
|
let s:byco = ""
|
|
|
|
" Dictionary with Assumptions
|
|
let s:dict = { 0: '0F',
|
|
\ 1: '0F',
|
|
\ 2: '0F',
|
|
\ 3: '0F',
|
|
\ 4: '' ,
|
|
\ 5: '03',
|
|
\ 6: '' ,
|
|
\ 7: '05',
|
|
\ 8: '04',
|
|
\ 9: '03' }
|
|
|
|
let s:byco = s:dict[a:line[1]]
|
|
|
|
unlet s:dict
|
|
"unlet s:byco
|
|
return s:byco
|
|
endfun
|
|
|
|
" create ADdress
|
|
fun libsrec#CrAD(line)
|
|
let s:adrs = ""
|
|
" Number of Bytes for Address
|
|
let s:adby = ""
|
|
" Dictionary
|
|
let s:dict = { 0: 2,
|
|
\ 1: 2,
|
|
\ 2: 3,
|
|
\ 3: 4,
|
|
\ 4: 0,
|
|
\ 5: 2,
|
|
\ 6: 0,
|
|
\ 7: 4,
|
|
\ 8: 3,
|
|
\ 9: 2 }
|
|
|
|
let s:adby = s:dict[a:line[1]]
|
|
|
|
let s:n = 0
|
|
while 1
|
|
let s:n = s:n + 1
|
|
if s:n > s:adby
|
|
break
|
|
endif
|
|
let s:adrs = s:adrs . "00"
|
|
continue
|
|
endwhile
|
|
unlet s:n
|
|
|
|
unlet s:dict
|
|
unlet s:adby
|
|
"unlet s:adrs
|
|
return s:adrs
|
|
endfun
|
|
|
|
" create DAta
|
|
fun libsrec#CrDA(line)
|
|
let s:data = ""
|
|
" Number of Bytes for Data
|
|
let s:daby = ""
|
|
|
|
" get ByteCount from Line
|
|
let s:bchx = "0x" . a:line[2] . a:line[3]
|
|
" Dictionary
|
|
let s:dict = { 0: s:bchx - 3,
|
|
\ 1: s:bchx - 3,
|
|
\ 2: s:bchx - 4,
|
|
\ 3: s:bchx - 5,
|
|
\ 4: 0 ,
|
|
\ 5: 0 ,
|
|
\ 6: 0 ,
|
|
\ 7: 0 ,
|
|
\ 8: 0 ,
|
|
\ 9: 0 }
|
|
|
|
let s:daby = s:dict[a:line[1]]
|
|
|
|
let s:n = 0
|
|
while 1
|
|
let s:n = s:n + 1
|
|
if s:n > s:daby
|
|
break
|
|
endif
|
|
let s:data = s:data . "FF"
|
|
continue
|
|
endwhile
|
|
unlet s:n
|
|
|
|
unlet s:dict
|
|
unlet s:bchx
|
|
unlet s:daby
|
|
"unlet s:data
|
|
return s:data
|
|
endfun
|
|
|
|
" create CheckSum
|
|
fun libsrec#CrCS(line)
|
|
" CheckSum as a String
|
|
let s:chsu = ""
|
|
|
|
" get ByteCount from Line
|
|
let s:bchx = "0x" . a:line[2] . a:line[3]
|
|
|
|
if ((a:line[1] == "4") || (a:line[1] == "6"))
|
|
" there' s no S4 or S6
|
|
else
|
|
" CheckSum as a Value
|
|
let s:csby = 0
|
|
|
|
" add the Byte Values
|
|
let s:n = 0
|
|
while 1
|
|
let s:n = s:n + 1
|
|
if s:n > s:bchx
|
|
break
|
|
endif
|
|
let s:csby = s:csby + ("0x" . a:line[2*s:n] . a:line[2*s:n+1])
|
|
continue
|
|
endwhile
|
|
unlet s:n
|
|
|
|
" CheckSum is:
|
|
let s:csby = 255 - (s:csby % 256)
|
|
|
|
" convert to Hex Value,
|
|
" Hex String without "0x"
|
|
let s:hxva = "0123456789ABCDEF"
|
|
while s:csby
|
|
let s:chsu = s:hxva[s:csby % 16] . s:chsu
|
|
let s:csby = s:csby / 16
|
|
endwhile
|
|
|
|
" add missing Zeros
|
|
while strlen(s:chsu) < 2
|
|
let s:chsu = "0" . s:chsu
|
|
endwhile
|
|
" Exception Handling
|
|
if strlen(s:chsu) > 2
|
|
let s:chsu = "CS"
|
|
endif
|
|
|
|
unlet s:hxva
|
|
unlet s:csby
|
|
endif
|
|
|
|
unlet s:bchx
|
|
"unlet s:chsu
|
|
return s:chsu
|
|
endfun
|
|
|
|
" make S5 record
|
|
fun libsrec#MkS5(line)
|
|
let s:srec = ""
|
|
let s:line = ""
|
|
let s:srco = 0
|
|
let s:srad = ""
|
|
|
|
let s:srec = s:srec . "S5" . "03"
|
|
|
|
let s:n = 1
|
|
while (line2byte(s:n) != line2byte("."))
|
|
let s:line = getline(s:n)
|
|
if ((s:line[0] == "S") && ((s:line[1] == "1") || (s:line[1] == "2") || (s:line[1] == "3")))
|
|
let s:srco = s:srco + 1
|
|
endif
|
|
let s:n = s:n + 1
|
|
endwhile
|
|
unlet s:n
|
|
|
|
" convert to Hex Value,
|
|
" Hex String without "0x"
|
|
let s:hxva = "0123456789ABCDEF"
|
|
while s:srco
|
|
let s:srad = s:hxva[s:srco % 16] . s:srad
|
|
let s:srco = s:srco / 16
|
|
endwhile
|
|
|
|
" add missing Zeros
|
|
while strlen(s:srad) < 4
|
|
let s:srad = "0" . s:srad
|
|
endwhile
|
|
" Exception Handling
|
|
if strlen(s:srad) > 4
|
|
let s:srad = "AAAA"
|
|
endif
|
|
|
|
unlet s:hxva
|
|
|
|
let s:srec = s:srec . s:srad . libsrec#CrCS(s:srec . s:srad)
|
|
|
|
unlet s:srad
|
|
unlet s:srco
|
|
unlet s:line
|
|
"unlet s:srec
|
|
return s:srec
|
|
endfun
|
|
|