Код
uses CRT;
const
      h15 = '0123456789ABCDEF';
var
      hold_in, dec_str, hex_str: string;
      hex_digits: array [0..15] of Char;
      ch: Char;
      k: Integer;
procedure initialize;
var
      j: Word;
      temp: string [Length(h15)];
begin
      temp := h15;
      for j := 0 to 15 do hex_digits[j] := temp[j + 1];
end;
procedure get_decimal(var dec_str: string );
var
      k: Word;
begin
      repeat
            WriteLn('Введите строку десятичных цифр:');
            ReadLn(dec_str);
            if dec_str = '' then
                  Halt;
            {Удалить недесятичные символы}
            for k := Length(dec_str) downto 1 do
                  if not (dec_str[k] in ['0'..'9']) then
                        Delete(dec_str, k, 1);
            {Удалить нули в старших разрядах}
            while (Length(dec_str) > 1) and (dec_str[1] = '0') do
                  Delete(dec_str, 1, 1);
            if Length(dec_str) > 0 then
                  Exit;
            WriteLn('Ошибка при вводе, повторите');
            WriteLn;
      until false;
end;
procedure convert(var dec_str, hex_str: string );
var
      remainder: Integer;
procedure divide_by_16;
{Строка dec_str, состоящая из десятичных цифр, делится на 16.
Остаток далее будет преобразован в следующую шестнадцатеричную цифру.
Частное преобразуется в строку dec_str}
var
      j, k,
      dividend: Word;
      error: Integer;
begin
      remainder := 0; {0 <= remainder <= 15}
      for j := 1 to Length(dec_str) do
      begin
            if KeyPressed then
                  Halt;
            Val(dec_str[j], k, error);
            dividend:= 10*remainder + k;
            {0 <= dividend<= 159}
            remainder := dividend mod 16;
            {0 <= remainder <= 15}
            dec_str[j] := hex_digits[dividend div 16];
      end;
      Delete(dec_str, 1, 1);
end;{divide_by_16}
begin
      hex_str := '';
      while Length(dec_str) > 0 do
      begin
            if KeyPressed then Halt;
            divide_by_16;
            hex_str := hex_digits[remainder] + hex_str;
      end;
end;{convert}
begin
      initialize;
      repeat
            get_decimal(dec_str);
            hold_in := dec_str;
            convert(dec_str, hex_str);
            k := Length(hold_in) - 2;
            while k > 1 do
            begin
                  Insert(',', hold_in, k);
                  Dec(k, 3);
            end;
            Write(hold_in, ' = $');
            while Length(hex_str) mod 4 <> 0 do
            hex_str := '0' + hex_str;
            k := Length(hex_str) - 3;
            while k > 1 do
            begin
                  Insert(' ', hex_str, k);
                  Dec(k, 4);
            end;
            WriteLn(hex_str); WriteLn;
            WriteLn('Для продолжения работы нажмите <Enter>, а для окончания <Esc>');
            ch := ReadKey;
            if ch = #27 then Break;
            WriteLn;
      until false;
end.
Это перевод из 10-тичной в 16-ричную
Другие делаются аналогично.