" 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