;---------------------------------------------------------------
; Universidad del Valle de Guatemala
; Programación en Assembler
; Laboratorio 4
; Josue Rendon 08168
;---------------------------------------------------------------
;---------------------------------------------------------------

TITLE P09DOSAS (COM) Exhibe los caracteres ASCII 00H-FFh
	.MODEL SMALL
	.STACK 64
	
	.DATA
	MENSJ DB 'Escriba el mensaje a despelgar: ', '$' 
	MENSJ2 DB 10,'Presione 0 para regresar y 1 para salir. Que quiere? ', '$' 
	ENTRADA	DB	20 DUP (‘  ‘), '$'
	
	LISTA  LABEL BYTE                    ; inicio de la lista de parametros
	MAXLEN DB    10                       ; numero maximo de caracteres de entrada
	ACTLEN DB    ?                       ; numero real de caracteres de entrada
	CAMPO  DB    10 DUP (' ')             ; caracteres introducidos del teclado	 
	PAGINA DB 	?
	COLOR2 DB 71H;
	COLOR1 DB 17H;
	
;----tabla de direcciones--------------------------------------------------------------------
	TABLA		DW	IRPAG0
				DW	SALIR	

;---------------------------------------------------------------
;	Procedimiento principal
;---------------------------------------------------------------
	.CODE
MAIN	PROC NEAR
	MOV AX,@data	; Iniciar registros de segmento
	MOV DS, AX
	MOV ES, AX
	
	MOV PAGINA,0	;iniciamos en pagina 0
	CALL CAMBIAR_PAGINA
	
	CALL SCREEN		; Pintar pantalla
	CALL VENTANA	; Hacer ventana en el centro
	CALL CURSORCERO;

	MOV	AH, 09H		; escribir mensaje
	LEA	DX, MENSJ
	INT	21H
	
	CALL LEER		;leer desde teclado 
	
	CALL CURSOR 	; establece el cursor en la ventana del centro
	
	MOV	AH, 09H		;escribir mensaje
	LEA	DX, ENTRADA
	INT	21H
				
	MOV PAGINA,1	; no cambiamos a pagina 1
	CALL CAMBIAR_PAGINA
	
	MOV COLOR2,57H	; Cambio de colores
	CALL SCREEN		; Pintar pantalla
	MOV COLOR1,22H	; Cambio de colores
	CALL VENTANA	; Hacer ventana de 5 lineas
	CALL CURSORCERO;
	
	INGRESO:
	
	MOV	AH, 09H		;escribir mensaje
	LEA	DX, MENSJ2
	INT	21H
	
	MOV AH, 01h		;captura un valor del teclado
    INT 21h			

    SUB AL, 48      ;restamos al caracter el ASCII de 0 para convertirlo en un numero	
			
	CMP AL, 0 		;Programación defensiva... (Rango 0 a 1)
	JB	INGRESO
	CMP	AL, 1
	JA 	INGRESO
	
	ADD AL,1		;se le agrega 1 a AL para que el menu funcione
	CALL SALTOS
	
	CALL SALIR

MAIN	ENDP

;---------------------------------------------------------------
; Ventana al centro 
;---------------------------------------------------------------
VENTANA	PROC NEAR
	MOV AX,060CH	; 5 líneas
	MOV BH,COLOR1		; Atributo: 
	MOV CX,081EH	; Posicion superior
	MOV DX,143CH	; Posicion inferior
	INT 10H			
	RET
VENTANA	ENDP

;---------------------------------------------------------------
; Paint All Screen
;---------------------------------------------------------------
SCREEN	PROC NEAR
	MOV AX,0600H	; toda la pantalla
	MOV BH,COLOR2	; Atributo: 
	MOV CX,0000H	; Posicion izquierda superior
	MOV DX,184FH	; Posicion derecha inferior
	INT 10H			
	RET
SCREEN	ENDP

;---------------------------------------------------------------
;	Fijar cursor en la ventana
;---------------------------------------------------------------
CURSOR	PROC NEAR
	MOV AH, 02H		; Petición para colocar el cursor
	MOV BH, PAGINA	; Número de página
	MOV DH, 09		; Fila 9
	MOV DL, 30		; Columna 30
	INT 10H
	RET
CURSOR	ENDP

;---------------------------------------------------------------
;	Fijar cursor 0,0
;---------------------------------------------------------------
CURSORCERO	PROC NEAR
	MOV AH, 02H		; Petición para colocar el cursor
	MOV BH, PAGINA	; Número de página
	MOV DH, 00		; Fila 9
	MOV DL, 00		; Columna 0
	INT 10H
	RET
CURSORCERO	ENDP

;---------------------------------------------------------------
;Procedimiento para Escribir
;---------------------------------------------------------------
LEER PROC NEAR
	MOV AH, 3FH	 ; Petición
	MOV BX, 00	 ; Manejador para teclado
	MOV CX, 20	 ; Máximo 20 caracteres
	LEA DX, ENTRADA; Carga la dirección 
	INT 21H		 ; Llama al DOS
	RET
LEER ENDP

;---------------------------------------------------------------
;Procedimiento para cambiar de pagina
;---------------------------------------------------------------
CAMBIAR_PAGINA	PROC NEAR
	MOV AH, 05H
	MOV AL, PAGINA
	INT	10H
	RET
CAMBIAR_PAGINA	ENDP

;---------------------------------------------------------------
;Procedimiento para salir
;---------------------------------------------------------------
SALIR PROC NEAR
	MOV AX,4C00H	; Salir a DOS
	INT 21H
SALIR ENDP 

;---------------------------------------------------------------
;Procedimiento para cambiar a pagina 0
;---------------------------------------------------------------
IRPAG0 PROC NEAR
	MOV PAGINA,0	; no cambiamos a pagina 0
	CALL CAMBIAR_PAGINA
	
	MOV AH, 01h		;captura un valor del teclado
    INT 21h			;y se guarda en AL

	MOV AX,4C00H	; Salir a DOS
	INT 21H
	
IRPAG0 ENDP

;---------------------------------------------------------------
;Menu
;---------------------------------------------------------------
SALTOS	PROC 	NEAR
		XOR	BX, BX	  	; pone a 0 registro BX
		SUB AL,1		; restar 1
		MOV BL, AL 		; obtener el codigo
		SHL	BX, 01	  	; mult. Por 2
		JMP	[TABLA+BX] 	; salta a la tabla
SALTOS	ENDP

	END MAIN
