.MODEL    SMALL
.CODE

TEST_WRITE_HEX PROC
     MOV  DL,3Fh              ;Prueba con 3Fh
     CALL WRITE_HEX
     INT  20h                 ;Regreso al DOS
TEST_WRITE_HEX ENDP

     PUBLIC    WRITE_HEX
;-----------------------------------------------------------------------;
; Este procedimiento convierte el byte que se halla en el registro DL   ;
; en hexadecimal y escribe los dos dĄgitos hexadecimales en la posi-    ;
; ci˘n actual del cursor.                                               ;
;                                                                       ;
; A la entrada:        DL     Byte a convertir a hexadecimal            ;
;                                                                       ;
; Usa:         WRITE_HEX_DIGIT                                          ;
;-----------------------------------------------------------------------;
WRITE_HEX PROC              ;Punto de entrada
     PUSH CX                ;Salva los registros usados en este procedimiento
     PUSH DX
     MOV  DH,DL             ;Hace una copia del byte
     MOV  CX,4              ;Pone el nibble superior en DL
     SHR  DL,CL
     CALL WRITE_HEX_DIGIT   ;Escribe el primer dĄgito hexadecimal
     MOV  DL,DH             ;Poen el nibble inferior en DL
     AND  DL,0Fh            ;Suprime el nibble superior
     CALL WRITE_HEX_DIGIT   ;Escribe el segundo dĄgito hexadecimal
     POP  DX
     POP  CX
     RET
WRITE_HEX ENDP

     PUBLIC    WRITE_HEX_DIGIT
;-----------------------------------------------------------------------;
; Este procedimiento convierte los 4 bits bajos de DL en un dĄgito he-  ;
; xadecimal, y lo imprime en la pantalla.                               ;
;                                                                       ;
; A la entrada: DL  Los cuatro bits bajos contienen el nŁmero que se va ;
;                   a imprimir en hexadecimal.                          ;
;                                                                       ;
; Usa:         WRITE_CHAR                                               ;
;-----------------------------------------------------------------------;
WRITE_HEX_DIGIT    PROC
     PUSH DX                 ;Salva los registros usados
     CMP  DL,10              ;¨Es este nibble < 10?
     JAE  HEX_LETTER         ;No, convertir en una letra
     ADD  DL,"0"             ;SĄ, convertir en un dĄgito
     JMP  Short WRITE_DIGIT  ;Ahora escribe este car cter
HEX_LETTER:
     ADD  DL,"A"-10          ;Convertir en letra hexadecimal
WRITE_DIGIT:
     CALL WRITE_CHAR         ;Escribe la letra en la pantalla
     POP  DX                 ;Restablece el valor antiguo de DX
     RET
WRITE_HEX_DIGIT          ENDP

     PUBLIC    WRITE_CHAR
;-----------------------------------------------------------------------;
; Este procedimiento imprime un car cter en la pantalla usando la lla-  ;
; mada de funci˘n del DOS.                                              ;
;                                                                       ;
; A la entrada:  DL    El byte que se va a imprimir en la pantalla.     ;
;-----------------------------------------------------------------------;
WRITE_CHAR     PROC
     PUSH AX
     MOV  AH,2           ;Llamada para imprimir caracters
     INT  21h            ;Car cter de salida en el registro DL
     POP  AX             ;Restablece el valor antiguoque est  en AX
     RET                 ;y regresa
WRITE_CHAR     ENDP

     END  TEST_WRITE_HEX

