CR   EQU  13             ;Retorno de carro
LF   EQU  10             ;Salto de l¡nea

.MODEL    SMALL
.CODE

     PUBLIC    CLEAR_SCREEN
;-----------------------------------------------------------------------;
; Este procedimiento borra la pantalla completa.                        ;
;-----------------------------------------------------------------------;
CLEAR_SCREEN   PROC
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     XOR  AL,AL          ;Deja en blanco toda la pantalla
     XOR  CX,CX          ;La esquina superior izquierda est  en (0,0)
     MOV  DH,24          ;La l¡nea inferior de la pantalla es la l¡nea 24
     MOV  DL,79          ;El borde derecho est  en la columna 79
     MOV  BH,7           ;Usa atributo normal para los espacios en blanco
     MOV  AH,6           ;Llama a la funci¢n SCROLL-UP
     INT  10h            ;Limpia la ventana
     POP  DX
     POP  CX
     POP  BX
     POP  AX
     RET
CLEAR_SCREEN   ENDP


     PUBLIC    GOTO_XY
;-----------------------------------------------------------------------;
; Este procedimiento mueve el cursor                                    ;
;                                                                       ;
; A la entrada: DH     Fila (Y)                                         ;
;               DL     Columna (X)                                      ;
;-----------------------------------------------------------------------;
GOTO_XY        PROC
     PUSH AX
     PUSH BX
     MOV  BH,0           ;Visualiza la p gina 0
     MOV  AH,2           ;Llamada a SET CURSOR POSITION
     INT  10h
     POP  BX
     POP  AX
     RET
GOTO_XY        ENDP

     PUBLIC    CURSOR_RIGHT
;-----------------------------------------------------------------------;
; Este procedimiento mueve el cursor una posici¢n a la derecha o a la   ;
; siguiente l¡nea si el cursor estaba al final de una l¡nea.            ;
;                                                                       ;
; Usa:         SEND_CRLF                                                ;
;-----------------------------------------------------------------------;
CURSOR_RIGHT   PROC
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV  AH,3           ;Lee la posici¢n en que se encuentra el cursor
     MOV  BH,0           ;En la p gina 0
     INT  10h            ;Lee la posici¢n del cursor
     MOV  AH,2           ;Establece la nueva posici¢n del cursor
     INC  DL             ;Pone la columna en la siguiente posici¢n
     CMP  DL,79          ;Comprueba que la columna es <= 79
     JBE  OK
     CALL SEND_CRLF      ;Va a la l¡nea siguiente
     JMP  DONE
OK:  INT  10h
DONE:     POP  DX
     POP  CX
     POP  BX
     POP  AX
     RET
CURSOR_RIGHT   ENDP

     PUBLIC    CLEAR_TO_END_OF_LINE
;-----------------------------------------------------------------------;
; Este procedimiento borra la l¡nea desde la posici¢n en que se encuen- ;
; tra el cursor hasta el final de esa l¡nea.                            ;
;-----------------------------------------------------------------------;
CLEAR_TO_END_OF_LINE   PROC
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV  AH,3           ;Lee la posici¢n en que se encuentra el cursor
     XOR  BH,BH          ; en la p gina 0
     INT  10h            ;Ahora pone (X,Y) en DL, DH
     MOV  AH,6           ;Preparado para borrar hasta el final de la l¡nea
     XOR  AL,AL          ;Limpia la pantalla
     MOV  CH,DH          ;Todo en la misma l¡nea
     MOV  CL,DL          ;Comienza en la posici¢n del cursor
     MOV  DL,79          ;y para al final de la l¡nea
     MOV  BH,7           ;Usa el atributo normal
     INT  10h
     POP  DX
     POP  CX
     POP  BX
     POP  AX
     RET
CLEAR_TO_END_OF_LINE   ENDP

     PUBLIC    SEND_CRLF
;-----------------------------------------------------------------------;
; Este procedimiento simplemente env¡a un retorno de carro y un salto   ;
; de l¡nea a la pantalla usando rutinas del DOS, de forma que el des-   ;
; plazamiento de la pantalla sea correcto.                              ;
;-----------------------------------------------------------------------;
SEND_CRLF PROC
     PUSH AX
     PUSH DX
     MOV  AH,2
     MOV  DL,CR
     INT  21h
     MOV  DL,LF
     INT  21h
     POP  DX
     POP  AX
     RET
SEND_CRLF ENDP


     END
