.MODEL    SMALL,C

.CODE

;-----------------------------------------------------------------------;
; Este procedimiento borra toda la pantalla.                            ;
;-----------------------------------------------------------------------;
CLEAR_SCREEN   PROC
     XOR  AL,AL               ;Deja en blanco toda la ventana
     XOR  CX,CX               ;La esquina superior izquierda esta en (0,0)
     MOV  DH,24               ;La l¡nea inferior de la pantalla es la l¡nea 24
     MOV  DL,79               ;El borde derecha est  en la columna 79
     MOV  BH,7                ;Usa el atributo normal para espacios en blanco
     MOV  AH,6                ;Llama a la funci¢n SCROLL-UP
     INT  10h                 ;Borra la ventana
     RET
CLEAR_SCREEN   ENDP

;------------------------------------------------------------------------;
; Este procedimiento escribe una secuencia de caracteres en la pantalla. ;
; La secuencia debe terminar por        DB   0                           ;
;                                                                        ;
;    write_string(string);                                               ;
;    char *string;                                                       ;
;------------------------------------------------------------------------;
WRITE_STRING   PROC    USES SI, STRING:PTR BYTE
     PUSHF                    ;Salva el indicador de direcci¢n
     CLD                      ;Pone la direcci¢n para incremento (adelante)
     MOV  SI,STRING           ;Pone la direcci¢n en SI para LODSB

STRING_LOOP:
     LODSB                    ;Pone un car cter en el registro AL
     OR   AL,AL               ;¨Hemos encontrado ya el 0?
     JZ   END_OF_STRING       ;S¡, hemos terminado con la secuencia
     MOV  AH,14               ;Pide la funci¢n de escritura de car cter
     XOR  BH,BH               ;Escribe en la p gina 0
     INT  10h                 ;Escribe un car cter en la pantalla
     JMP  STRING_LOOP

END_OF_STRING:
     POPF                     ;Restablece el indicador de direcci¢n
     RET
WRITE_STRING   ENDP

;------------------------------------------------------------------------;
; Este procedimiento mueve el cursor                                     ;
;                                                                        ;
;    goto_xy(x, y);                                                      ;
;    int  x, y;                                                          ;
;------------------------------------------------------------------------;
GOTO_XY        PROC    X:WORD, Y:WORD
     MOV  AH,2                     ;Llamada para SET CURSOR POSITION
     MOV  BH,0                     ;P gina de pantalla 0
     MOV  DH,BYTE PTR (Y)          ;Obtiene el n£mero de l¡neas (0..N)
     MOV  DL,BYTE PTR (X)          ;Obtiene el n£mero de columna (0..79)
     INT  10h                      ;Mueve el cursor
     RET
GOTO_XY        ENDP
;------------------------------------------------------------------------;
; Este procedimiento lee teclas del teclado.                             ;
;                                                                        ;
; tecla = read_key();                                                    ;
;------------------------------------------------------------------------;
READ_KEY  PROC
     XOR  AH,AH               ;Solicita la funci¢n de lectura del teclado
     INT  16h                 ;Lee el c¢digo de caracter/barrido del teclado
     OR   AL,AL               ;¨Es este un c¢digo ampliado?
     JZ   EXTENDED_CODE       ;S¡
NOT_EXTENDED:
     XOR  AH,AH               ;Devuelve solo el c¢digo ASCII
     JMP  DONE_READING

EXTENDED_CODE:
     MOV  AL,AH               ;Pone el c¢digo de barrido en AL
     MOV  AH,1                ;C¢digo ampliado de se¤al
DONE_READING:
     RET
READ_KEY  ENDP

     END
