[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]

    (*
    ===========================================================================
     BBS: Canada Remote Systems
    Date: 09-16-93 (08:30)             Number: 27395
    From: HELGE HELGESEN               Refer#: NONE
      To: KURTIS LINDQVIST              Recvd: NO
    Subj: Longint to HEX                 Conf: (552) R-TP
    ---------------------------------------------------------------------------
    Here's a simple - unoptimized - function to convert a
    longint to hex.
    *)
    function LongInt2Str(no: longint): string; assembler;
    const
      Digits: array[0..$f] of char =
        ( '0', '1', '2', '3', '4' ,'5', '6', '7', '8', '9', 'A', 'B', 'C',
          'D', 'E', 'F'
        );
    asm
      les  di, @Result { get address to result }
      mov  al, 8 { size of result }
      stosb
      lea  bx, Digits { get adress to digit table }
      mov  dx, word ptr no+2
      mov  cx, 2
    @1:
      mov  al, dh
      shr  al, 4
      xlat
      stosb
      mov  al, dh
      and  al, 15
      xlat
      stosb
      mov  al, dl
      shr  al, 4
      xlat
      stosb
      mov  al, dl
      and  al, 15
      xlat
      stosb
      mov  dx, word ptr no
      loop @1
    end;
    ---
     þ RM 1.2 00308 þ C program run.  C program crash.  C programmer quit
     * Midnight Sun BBS, Norway +47 81 84545 HST/DS, 9 Gb
     * PostLink(tm) v1.07  MIDNIGHT (#602) : RelayNet(tm)
    ===========================================================================
     BBS: Canada Remote Systems
    Date: 09-16-93 (20:19)             Number: 27393
    From: PHIL NICKELL                 Refer#: NONE
      To: KURTIS LINDQVIST              Recvd: NO
    Subj: Longint to HEX                 Conf: (552) R-TP
    ---------------------------------------------------------------------------
    KL³Allright, I have been struggling with this problem for awhile but I give up.
      ³A friend of mine wrote a unit that would convert a longint to a HEX number in
      ³string. This is for a program that stores one file for each user (it's an ord
      ³door), the name of the file is equal to the HEX number representing the

     I'll include two functions named HEXLONG that produce identical
     results.  The first is pure classic Turbo Pascal, the second is a Turbo
     Pascal Assembler function that is blinding-speed vs size optimized.
     You pass them a longint value, they return an 8 byte string.  Voila.
     Take your pick.

    (* Return a 8 byte ascii string of the hex value of the longint
       argument *)
    FUNCTION  Hexlong (argument : longint): namestr;
       var i      :longint;
           res    :namestr;
       Const
           HexTable  :array[0..15] of char = '0123456789ABCDEF';
      begin
        res[0] := #8;
        for i := 0 to 7 do
          res[8-i] := HexTable[ argument shr (i shl 2) and $f];
        hexlong := res;
      end;

    FUNCTION  Hexlong (argument : longint): namestr; Assembler;
      asm
         cld
         les    di,@result
         mov    al,8                   { store string length }
         stosb
         mov    cl, 4                  { shift count }

         mov    dx,Word Ptr Argument+2 { hi word }
         call   @1                     { convert dh to ascii }
         mov    dh, dl                 { lo byte of hi word }
         call   @1                     { convert dh to ascii }
         mov    dx,Word Ptr Argument   { lo word }
         call   @1                     { convert dh to ascii }
         mov    dh, dl                 { lo byte of lo word }
         call   @1                     { convert dh to ascii }
         jmp    @2

       @1:
         mov    al, dh                 { 1 byte }
         and    al, 0fh                { low nybble }
         add    al, 90h
         daa
         adc    al, 40h
         daa
         mov    ah, al                 { store }
         mov    al, dh                 { 1 byte }
         shr    al, cl                 { get high nybble }
         add    al, 90h
         daa
         adc    al, 40h
         daa
         stosw                         { move characters to result }
         retn                          { return near }
       @2:
      end;

    begin
      Writeln( Hexlong($1234ABCD) );
    end.
    ---
     þ SLMR 2.1a þ doesn't take a rocket scientist to be a rocket scientist
     þ KMail 3.00d Twin Peaks (303)-651-0225 þ Home of KMail þ
     þ RNET 2.00b: þ Twin Peaks BBS þ (303)-651-0225, Longmont, Co.
     * The DC Information Exchange (703)836-0748
     * PostLink(tm) v1.07  DCINFO (#16) : MetroLink(tm)

[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]