home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / clipper / rettig / source / _tr_hexa.asm < prev    next >
Assembly Source File  |  1990-10-21  |  3KB  |  101 lines

  1. ;  _TR_HEXA.ASM
  2. ;
  3. ;  by Ralph Davis, Leonard Zerman
  4. ;
  5. ; Placed in the public domain by Tom Rettig Associates, 10/22/1990.
  6. ;
  7. ;  Syntax:  HEX(numvar)   && numvar is a numeric variable
  8. ;
  9. ;  Function to convert long integer passed via the
  10. ;       C interface routine (HEX.C) to hexadecimal string
  11. ;
  12.  
  13.              PUBLIC __TR_HEXASM
  14.  
  15.  
  16. ;========================================================
  17. ; Useful macro
  18.  
  19. HEXCNVT      MACRO
  20.              AND     AL,0FH
  21.              ADD     AL,90H   ; Convert to ASCII hex digit
  22.              DAA
  23.              ADC     AL,40H
  24.              DAA
  25.              ENDM
  26. ;========================================================
  27. DGROUP GROUP  _DATA
  28. ;********************************************************
  29. _DATA SEGMENT WORD PUBLIC 'DATA'
  30.  
  31. HEXSTRING    DB      8 DUP (' '),0
  32.  
  33. _DATA ENDS
  34. ;********************************************************
  35.  
  36. ;********************************************************
  37. _TR_HEXA_TEXT SEGMENT  BYTE PUBLIC 'CODE'
  38.          ASSUME   CS:_TR_HEXA_TEXT,DS:_DATA
  39. ;--------------------------------------------------------
  40. __TR_HEXASM  PROC    FAR
  41.  
  42.              PUSH    BP
  43.              MOV     BP,SP
  44.              PUSH    DS
  45.              MOV     AX,DGROUP
  46.              MOV     DS,AX
  47.              PUSH    CX
  48.              PUSH    SI
  49.              MOV     SI,OFFSET DGROUP:HEXSTRING
  50.              MOV     AX,[BP+8]   ; load high byte into AX
  51.              MOV     BX,[BP+6]   ; and low byte into BX
  52.              OR      AX,AX       ; Is AX all zeroes?
  53.              JZ      CX4         ; Yes, process as 4-digit number
  54. TEST_BX_SN:  OR      BX,BX       ; Is sign bit of BX on?
  55.              JNS     CX8         ; No, so AX can't be sign extension
  56.              CMP     AX,0FFFFH   ; Yes--check if AX all 1 bits
  57.              JNE     CX8         ; AX not sign extension of BX
  58. CX4:         MOV     CX,4
  59.              CLC
  60. ROTATE_INT:
  61.              REPT    4
  62.              ROL     BX,1
  63.              ENDM
  64.              MOV     AL,BL
  65.              HEXCNVT
  66.              MOV     [SI],AL
  67.              INC     SI
  68.              LOOP    ROTATE_INT
  69.              JMP     SHORT EXIT
  70. CX8:         MOV     CX,8
  71.              CLC
  72. ROTATE_LONG:
  73.              REPT    4
  74.              RCL     BX,1     ; Shift MSB into lower nibble 
  75.              RCL     AX,1     ; of BX
  76.              ADC     BX,0     ; Move carry bit from AX into BX
  77.              ENDM
  78.              PUSHF
  79.              PUSH    AX
  80.              MOV     AL,BL
  81.              HEXCNVT
  82.              MOV     [SI],AL
  83.              INC     SI
  84.              POP     AX
  85.              POPF
  86.              LOOP    ROTATE_LONG
  87. EXIT:        MOV     BYTE PTR [SI],0
  88.              MOV     DX,DS
  89.              MOV     AX,OFFSET DGROUP:HEXSTRING
  90.              POP     SI
  91.              POP     CX
  92.              POP     DS
  93.              POP     BP
  94.              RET
  95. __TR_HEXASM       ENDP
  96. ;-------------------------------------------------------------
  97. _TR_HEXA_TEXT        ENDS
  98. ;***************************************************************
  99.              END
  100.  
  101.