
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
.DATA
     EXTRN     SCREEN_PTR:WORD     ;Puntero al car cter donde se encuentra
                                   ; el cursor
     EXTRN     SCREEN_X:BYTE, SCREEN_Y:BYTE
.CODE
;-----------------------------------------------------------------------;
; 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
 
     MOV  AL,DH          ;Obtiene el n£mero de fila
     MOV  BL,80          ;Multiplica por 80 caracteres por l¡nea
     MUL  BL             ;AX = fila * 80
     ADD  AL,DL          ;A¤ade columna
     ADC  AH,0           ;AX = fila * 80 + columna
     SHL  AX,1           ;Convierte a desplazamiento de byte
     MOV  SCREEN_PTR,AX  ;Salva el desplazamiento del cursor
     MOV  SCREEN_X,DL    ;Salva la posici¢n del cursor
     MOV  SCREEN_Y,DH
 
     POP  BX
     POP  AX
     RET
GOTO_XY        ENDP
 
     PUBLIC    CURSOR_RIGHT
.DATA
     EXTRN     SCREEN_PTR:WORD          ;Puntero al car cter donde se encuentra
                                        ; el cursor
     EXTRN     SCREEN_X:BYTE, SCREEN_Y:BYTE
.CODE
 
;-----------------------------------------------------------------------;
; 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                                                ;
; Escribe:     SCREEN_PTR, SCREEN_X, SCREEN_Y                           ;
;-----------------------------------------------------------------------;
CURSOR_RIGHT   PROC
     INC  SCREEN_PTR     ;Pasa a la siguiente posici¢n de car cter (palabra)
     INC  SCREEN_PTR     ;
     INC  SCREEN_X       ;Pasa a la columna siguiente
     CMP  SCREEN_X,79    ;Comprueba que la columna es <= 79
     JBE  OK
     CALL SEND_CRLF      ;Va a la l¡nea siguiente
OK:
     RET
CURSOR_RIGHT   ENDP
 
     PUBLIC    UPDATE_REAL_CURSOR
;------------------------------------------------------------------------;
; Este procedimiento mueve el cursor real a la posici¢n virtual actual   ;
; del cursor. Debe llamarse justo antes de esperar que se introduzca     ;
; algo a trav‚s del teclado.                                             ;
;------------------------------------------------------------------------;
UPDATE_REAL_CURSOR     PROC
     PUSH DX
     MOV  DL,SCREEN_X    ;Obtiene la posici¢n del cursor virtual
     MOV  DH,SCREEN_Y
     CALL GOTO_XY        ;Mueve el cursor real a esta posici¢n
     POP  DX
     RET
UPDATE_REAL_CURSOR     ENDP
 
 
     PUBLIC    UPDATE_VIRTUAL_CURSOR
;-----------------------------------------------------------------------;
; Este procedimiento actualiza la posici¢n del cursor virtual para que  ;
; coincida con la posici¢n del cursor real.                             ;
;-----------------------------------------------------------------------;
UPDATE_VIRTUAL_CURSOR  PROC
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV  AH,3                ;Pide la posici¢n del cursor
     XOR  BH,BH               ;En la p gina 0
     INT  10h                 ;Pone la posici¢n del cursor en DH, DL
     CALL GOTO_XY             ;Mueve el cursor virtual a esta posici¢n
     POP  DX
     POP  CX
     POP  BX
     POP  AX
     RET
UPDATE_VIRTUAL_CURSOR  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  DL,SCREEN_X
     MOV  DH,SCREEN_Y
     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.                              ;
;                                                                       ;
; Usa:         UPDATE_VIRTUAL_CURSOR                                    ;
;-----------------------------------------------------------------------;
SEND_CRLF PROC
     PUSH AX
     PUSH DX
     MOV  AH,2
     MOV  DL,CR
     INT  21h
     MOV  DL,LF
     INT  21h
     CALL UPDATE_VIRTUAL_CURSOR    ;Actualiza la posici¢n del cursor virtual
     POP  DX
     POP  AX
     RET
SEND_CRLF ENDP
 
 
     END

