.MODEL    SMALL
.CODE

     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
     PUSH DX
     CMP  DL,32          ;¨Est  el car cter delante de un espacio?
     JAE  IS_PRINTABLE   ;No, imprimir tal cual
     MOV  DL,'.'         ;SĄ, sustituir por un punto
IS_PRINTABLE:
     MOV  AH,2           ;Llamada para escribir el car cter
     INT  21h            ;Escribe el caracter contenido en el registro DL
     POP  DX             ;Restablece el valor antiguo de DX
     POP  AX             ;Restablece el valor antiguo de AX
     RET                 ;Y regresa
WRITE_CHAR     ENDP

     PUBLIC    WRITE_DECIMAL
;-----------------------------------------------------------------------;
; Este procedimiento escribe en la pantalla, en notaci˘n decimal, un    ;
; nŁmero sin signo de 16 bits.                                          ;
;                                                                       ;
; A la entrada:        DX     N : nŁmero sin signo de 16 bits.          ;
;                                                                       ;
; Usa:    WRITE_HEX_DIGIT                                               ;
;-----------------------------------------------------------------------;
WRITE_DECIMAL  PROC
     PUSH AX             ;Salva los registros que se usan en el programa
     PUSH CX
     PUSH DX
     PUSH SI
     MOV  AX,DX
     MOV  SI,10          ;Divide entre 10 usando SI
     XOR  CX,CX          ;Contador de los dĄgitos que hay en la pila
NON_ZERO:
     XOR  DX,DX          ;Pone a 0 la palabra m s alta de N
     DIV  SI             ;Calcula N/10 y (N mod 10)
     PUSH DX             ;Mueve un dĄgito a la pila
     INC  CX             ;A¤adido un dĄgito m s
     OR   AX,AX          ;¨Es N = 0 ya?
     JNE  NON_ZERO       ;No, continuar
WRITE_DIGIT_LOOP:
     POP  DX             ;Pone los dĄgitos en orden inverso
     CALL WRITE_HEX_DIGIT
     LOOP WRITE_DIGIT_LOOP
END_DECIMAL:
     POP  SI
     POP  DX
     POP  CX
     POP  AX
     RET
WRITE_DECIMAL  ENDP

     END
