function convert_hk, rec, mnem, raw_value=raw_value, qstop=qstop, $
    read_dbase=read_dbase, infil=infil, force_rd=force_rd, $
    insim=insim, nostring=nostring
;
;
common convert_hk_blk1, ootc, blktc, lvt_param, lvt_tx, lvt_txs, ca, cas
common convert_hk_blk2, hk1, hk2, schk, pdde, pdco, pca, pcdi
common convert_hk_blk3, schk1, schk2, schk3, schk4, map2pack
common convert_hk_blk4, last_convert
;
qinsim = keyword_set(insim)
if (n_elements(last_convert) eq 0) then last_convert = -99
if (qinsim ne last_convert) then force_rd = 1       ;switched from CCS to/from INSIM mode - need new database
if ((n_elements(ootc) eq 0) or keyword_set(force_rd)) then begin
    print, 'Reading .HIS database file'
    if (n_elements(infil) eq 0) then begin
;   if (keyword_set(insim)) then infil = '$MDI_CAL_INFO/READ_HIST.DBS' $
;               else infil = '$MDI_CAL_INFO/READ_HIST.CCS'
    if (keyword_set(insim)) then infil = '$MDI_CAL_INFO/READ_HIST.INSIM' $
                else infil = '$MDI_CAL_INFO/READ_HIST.EOF'
    end
    rd_hist_dbase, ootc, blktc, lvt_param, lvt_tx, lvt_txs, ca, cas, $
                hk1, hk2, schk, pdde, pdco, pca, pcdi, $
        schk1, schk2, schk3, schk4, map2pack, infil=infil
end
last_convert = qinsim
;
if (keyword_set(read_dbase)) then return, -1
;
nam = string(lvt_param.st$name)
ss = where(nam eq mnem)
if (ss(0) eq -1) then begin
    print, 'Mnemonic not recognized: ' + mnem
    return, -1
end else begin
    case map2pack(ss(0)) of
     1: mask_off = hk1      ;out of MDI packet
     2: mask_off = schk     ;out of INSIM 14 byte S/C packet
     4: mask_off = schk1        ;out of S/C 1
     8: mask_off = schk2        ;out of S/C 2
    16: mask_off = schk3        ;out of S/C 3
    32: mask_off = schk4        ;out of S/C 4
    endcase
    ;
    nam2 = string(mask_off.st$name)
    ss2 = where(nam2 eq mnem)
    i1 = ss2(0)
    mask_off = mask_off(i1)
end

i2 = mask_off.lvt_idx
i3 = lvt_param(i2).pc_idx
;
val = 0L
nbits_set = 0
;for ibyte=1,4 do begin
for ibyte=4,1,-1 do begin
    status = execute('off = mask_off.offby' + strtrim(ibyte,2) )
    status = execute('mask = mask_off.mask' + strtrim(ibyte,2) )
    if (off ge 0) and (mask ne 0) then begin
    val0 = rec.hk(off)
    nbits_set0 = 8
    if (mask ne 255) and (mask gt 0) then begin
        bits, mask, barr
        ss = where(barr, nbits_set0)
        shift0 = 2L^ss(0)
        val0 = (val0 and mask) / shift0
    end
    val = val + val0 * 2L^nbits_set
    nbits_set = nbits_set + nbits_set0
    end
end
;
if (n_elements(val) gt 1) then val = reform(val)
if (keyword_set(raw_value)) then return, val
;
case lvt_param(i2).type of
    1: begin        ;----- analog
        i4 = pca(i3).curve_idx
        ca0 = ca(i4)
        ;
        xarr1 = cas( ca0.first_idx: ca0.last_idx).x_val
        yarr1 = cas( ca0.first_idx: ca0.last_idx).y_val
        xarr2 = indgen(2L^nbits_set)
        yarr2 = interpol(yarr1, xarr1, xarr2)
        val = yarr2(val)
       end
    2: begin        ;----- digital
        i4 = pcdi(i3).tx_idx
        if (i4 ge 0) and (not keyword_set(nostring)) then begin
            i5 = lvt_tx(i4).first_idx
            i6 = lvt_tx(i4).last_idx
            table = [string(lvt_txs(i5:i6).st$str_txs), '???']
            nnn = n_elements(table)-1
            val = table(val < nnn)
        end
    end
    4:          ;----- counter
    8:          ;----- register
endcase
;
if (keyword_set(qstop)) then stop
return, val
end