Práctica 1. Manejo de recursos y elementos básicos

(Este enunciado será explicado en la primera clase que corresponda a cada grupo)



Objetivos didácticos:

- Realizar un primer programa COMPLEJO en ensamblador
- Aprender el uso de librerías
- Acceso tanto a servicios del S.O. y BIOS como a servicios propios
- Manejo del teclado, captura de teclas pulsadas
- Creación de ficheros Makefiles (PERO MAKEFILES DE VERDAD)
 

Objetivo de la Práctica:

Realizar un programa en ensamblador y dotarle de una protección de forma que sólo se pueda ejecutar si se dispone de un componente hardware conectado al puerto paralelo.

Descripción:
El alumno realizará un programa complejo en ensamblador, dividido en varias librerías (al menos deberá haber dos librerías diferentes). Este programa será el clásico juego de derribar una pared de ladrillos. Habrá una barra en la parte inferior de la pantalla que se desplazará horizontalmente. Dicho desplazamiento se realizará con dos teclas distintas, una para desplazamientos a la izquierda y otra para la derecha. En la parte superior de la pantalla habrá una serie de filas de ladrillos, entre 5 y 7, y cada fila contendrá el número de ladrillos que el alumno considere oportuno. Habrá una "pelota" que será la que haga desaparecer los ladrillos, que será manejada a través de la barra descrita.

El objetivo del juego es eliminar todos los ladrillos con una pelota que se desplazará por la pantalla y que rebotará en la barra.

La temporización, en esta práctica, se puede realizar utilizando bucles. Se valorará el uso de la interrupción 1Ch o del RTC, que sí se deberán utilizar en las siguientes prácticas.

El juego terminará cuando se hayan eliminado todos los ladrillos. Se deberá presentar continuamente en la pantalla el número de ladrillos eliminados. Si durante el juego se pulsa la tecla "P" el programa se detiene y si se pulsa "S" sigue en el mismo punto donde se detuvo. Se puede realizar utilizando el modo de texto.

OPCIONES PARA SUBIR NOTA

Para simplificar el desarrollo del proyecto, en esta primera práctica no se dispone aún del hardware, por lo que se entregará un Simulador de la memoria. El interfaz con dicho simulador será idéntico al que se utilizará cuando se disponga de la memoria, por lo que cualquier aplicación desarrollada será válida para la segunda práctica, momento en el que se contará con la memoria real. Dicho simulador será un programa residente cuyas funciones, descritas en el punto siguiente, serán accesibles a través de la INH 61h. El contenido real de la memoria estará en un fichero binario, de 512 posiciones, que se corresponde con el tamaño de la memoria. Este fichero deberá ser editado y modificado por el alumno, de manera que pueda editar el contenido que elija para su aplicación. Fichero binario vacío: descarga (descargar utilizando el botón derecho del ratón). NOTA: para su modificación se deberá utilizar un editor binario, los editores de texto tipo EDIT no valen. El fichero de memoria (que se deberá renombrar como el resto de ficheros a entregar, es decir, tipo 3a04p1.bin, por ejemplo) deberá estar en el mismo directorio donde se encuentre la aplicación.

                                                                                                                                                                       PC


DESCRIPCIÓN DE LAS FUNCIONES DEL SIMULADOR

Las funciones del Simulador de Memoria están accesibles a través de la INT 61h. Para acceder a cada uno de sus servicios se deberán inicializar los registros correspondientes. A continuación se describen dichos servicios:

Valores de Constantes:

   ERR   EQU 0FFH

   OK    EQU 00H

 

Función: STATUS AH=0 (Devuelve ID de driver)

  Respuesta: AX=ID (EE00)

 

Función: UNINSTALL AH=1 (Desinstala el programa y actualiza fichero binario)

  Respuesta: AH=OK

                  AL=??

 

Función: RDSR AH=2 (Lee el byte de estado)

  Respuesta: AH=OK

                  AL=BSTATUS

 

Función: WRSR AH=3 AL=Nuevo_status (Escribe byte de estado)

  Respuesta: AH=OK se pudo escribir. AH=ERR Escritura no permitida

 

Función: WREN AH=4 (Activa Latch de escritura)

  Respuesta: AH=OK

                  AL=??

 

Función: WRDI AH=5 (Desactiva Latch de escritura)

  Respuesta: AH=OK

                  AL=??

 

Función: READ AH=6 DI=Posición (Lee byte)

  Respuesta: AH=OK Se pudo, AH=ERR Fuera de tamaño o datos aún no disponibles

                  AL=Dato leído

 

Función: WRITE AH=7 AL=Contenido DI=Posición (Escribe byte)

  Respuesta: AH=OK Se pudo, AH=ERR Fuera de tamaño o escritura aún no disponibles

                  AL=??

 

Función: LED AH=8 AL=0 ó 1 (Encender / Apagar LED. En el simulador no tiene sentido, pero en la placa de la práctica 2 hay un diodo LED conectado a un pin del puerto paralelo.)

  Respuesta: AH=>OK

 

Función: CNAME AH=A DS:DI=Nombre Fichero (Indica el nombre del fichero binario que contiene los datos de la memoria. El nombre debe estar en formato ASCII-Z,terminar con el valor 0, y puede incluir la ruta completa de acceso, por ejemplo "D:\datos\binarios\memoria\3a07p1.bin",0)

  Respuesta: DS:DI=>OK

 


Modo de vídeo gráfico MCGA

Para inicializar el modo de vídeo MCGA (320x200x256) se utiliza una llamada a la interrupción 10h. Ahora hemos de comprender como gestiona el ordenador esos pixels que escribimos en pantalla.

La dirección A000:0000 es el principio del segmento de VideoRAM, es decir, es donde la MCGA guarda los datos de las imágenes gráficas que dibuja en el monitor. Si escribimos algún valor en este segmento, la próxima vez que la tarjeta gráfica redibuje la pantalla (lo hace entre 50 y 70 veces por segundo) el valor que hemos escrito aparecerá en pantalla en forma de punto.

Para pintar un pixel basta con escribir en la posición de memoria correspondiente, el índice de color que queremos para que la tarjeta gráfica lo represente durante el próximo retrazado. El modo MCGA es el modo gráfico más sencillo en este sentido pues es un modo de 8 bits por pixel.

Esto quiere decir que cada número del 0 al 255 se corresponde con un color. Por defecto, el 0 es el negro, el 1 el azul, y así hasta llegar al 255. Entre el 0 y el 255 disponemos de gamas de azules, verdes, amarillos, etc..., que componen la paleta por defecto de la MCGA.

Que este modo gráfico sea de un byte por pixel significa que al escribir un byte en este segmento de memoria, su equivalente en pantalla será un pixel, que aparecerá automáticamente en cuanto el haz de electrones pase por esa posición al refrescar la imagen. En la figura adjunta tenemos una representación de cómo está organizada la VideoRAM en el modo 13h (MCGA).

Como puede verse, al byte 0 le corresponde el pixel (0,0) (el primero de la pantalla); al byte 1 le corresponde el pixel (1,0), al byte número 320 le correspondería el pixel (0,1), (primer pixel de la línea 1, porque hay 320 pixels de resolución horizontal) y así hasta el byte 63.999 del segmento, que corresponde a la posición (319,199). Depende del offset en que coloquemos el byte, el punto aparecerá en distinta posición en el monitor (cada byte es un pixel individual en la pantalla).

El segmento de la VideoRAM se comporta en este modo de video como si fuera una larga línea de pixels de manera que al llegar al final de una línea horizontal de pantalla, el siguiente byte de la VideoMemoria es el que continúa en la siguiente línea de pantalla. De ahí el término direccionamiento lineal: es como si la pantalla fuera un array unidimensional desde 0 a 64.000 donde cada 320 bytes estamos situados en una nueva línea de pantalla (el byte 320 es el primer pixel de la segunda línea). Así, durante el retrazado la tarjeta únicamente tiene que dedicarse a leer bytes (todos ellos consecutivos) y representarlos en pantalla.

Algunos links sobre el modo MCGA

      Curso de programación gráfica

      Modos gráficos. El Universo Digital 


Plazo de entrega : La presentación y evaluación de esta práctica será la indicada en el calendario, según el grupo (ver calendario ). El nombre del fichero o ficheros a entregar será de la forma parejap1.asm, por ejemplo 3a28p1.asm. Si hay más de un fichero, nombrarlo con números sucesivos y añadir un .bat que los ensamble y linke.(3a28p11.asm, 3a28p12.asm,... 3a28p1.bat)



Ejercicios previos opcionales.

Estos ejercicios se proponen como un "entrenamiento" a la programación en ensamblador. La realización de estas rutinas será provechosa para la primer
a práctica, pues permitirá conocer  de forma sencilla como manejar ciertos dispositivos de manera independiente..


Página editada y mantenida por Guillermo Glez. de Rivera
  Volver
al projecto