45 lines
1.3 KiB
VimL
45 lines
1.3 KiB
VimL
" Paf file specification
|
|
" : (RecMark)
|
|
" 10 (RecLen)
|
|
" 0000 (Offset)
|
|
" 00 (RecTyp: 00=Data, 01=EndOfFile, 02=ExtendedSegmentAddress, 04=ExtendedLinearAddress, 10=EndOfDataBlock)
|
|
" xxx (Data)
|
|
" 00 (Checksum)
|
|
|
|
" Get number of current byte of data
|
|
function! s:GetDataByte()
|
|
let Pos = getpos('.')
|
|
let Column = Pos[2]
|
|
let FirstData = 10
|
|
let LastData = len(getline(line('.'))) - 2
|
|
if Column < FirstData
|
|
let Column = FirstData
|
|
endif
|
|
if Column > LastData
|
|
let Column = LastData
|
|
endif
|
|
let DataByte = eval('('.Column.'-'.FirstData.') / 2')
|
|
return DataByte
|
|
endfunction
|
|
|
|
" Adresse der aktuellen Zeile berechnen und in der Statusline anzeigen
|
|
command! PafGetAddress call PafGetAddress()
|
|
function! PafGetAddress()
|
|
let RE = ':\x\{2}\x\{4}02\(\x\{4}\)\x\{2}'
|
|
let line = search(RE, 'bcnW')
|
|
let ELAR = substitute(getline(line), RE, '0x\10', '')
|
|
let RE = ':\x\{2}\x\{4}04\(\x\{4}\)\x\{2}'
|
|
let line = search(RE, 'bcnW')
|
|
let ESAR = substitute(getline(line), RE, '0x\10000', '')
|
|
let RE = ':\x\{2}\(\x\{4}\)[01]0\x\+'
|
|
let line = line('.')
|
|
let LA = substitute(getline(line), RE, '0x\1', '')
|
|
let BYTE = s:GetDataByte()
|
|
let address = eval(ELAR + ESAR + LA + BYTE)
|
|
return printf('0x%08x', address)
|
|
endfunction
|
|
|
|
setlocal statusline=%{PafGetAddress()}
|
|
setlocal laststatus=2
|
|
|