Periféricos e Interfaces Curso 2010 – 2011 ______________________________________________________________________ Práctica 1: Sencillo Juego en Ensamblador El objetivo de esta práctica es aprender a programar usando el ensamblador 8086 y, en particular, aprender a utilizar las interrupciones de la BIOS y de MSDOS para permitir que el programa interactúe con periféricos de entrada y salida. Los periféricos que se utilizarán serán el teclado y la pantalla del PC debido a la familiaridad de los alumnos con su manejo. La práctica consistirá en diseñar una versión sencilla del popular juego Arkanoid. Al comenzar, el programa solicitará el nombre del jugador. Tras esto, el programa mostrará por pantalla un pequeño entorno rectangular delimitado por una línea y el nombre del jugador en una esquina, junto con su puntuación y el número de vidas restantes. Durante la partida, el jugador controla una plataforma que se moverá lateralmente por la parte baja del entorno de juego. Con esta plataforma, el jugador debe impedir que una bola que rebota en vertical salga del entorno de juego. El jugador perderá una vida con cada fallo y, si llega a cero, concluirá la partida, mostrándose una pantalla de final con la puntuación alcanzada. En la parte superior de la pantalla habrá una serie de bloques. Cada vez que la bola rebote contra uno de ellos será destruido, sumando un punto. La partida también concluirá si se destruyen todos los bloques. Resulta importante destacar que la belleza estética no es una característica primordial de esta práctica. El objetivo es demostrar un cierto dominio de la programación ensamblador y del manejo de las interrupciones para interactuar con los periféricos de E/S. Por ejemplo, una forma sencilla de crear el espacio de juego es delimitar un recuadro y pintarlo de un color distinto al resto de la pantalla, evitándose tener que dibujar los bordes. Además, la plataforma, la bola y los bloques pueden crearse simplemente usando caracteres del teclado que se consideren apropiados; el movimiento puede realizarse borrando caracteres y volviéndolos a escribir en otra parte. Tampoco es necesario elaborar animaciones complejas para la destrucción de los bloques, basta con que desaparezcan. Periféricos e Interfaces Curso 2010 – 2011 ______________________________________________________________________ Se valorará cualquier mejora que se aplique a este diseño inicial. Hay muchas opciones posibles, aunque no serán exigidas para aprobar: • Variaciones en la velocidad de la bola. • Variaciones en el tamaño de la plataforma. • Bloques especiales (que haya que golpear varias veces, que cambien la dirección de rebote, que aumenten el número de vidas…) • Y un largo etcétera. Al concluir el periodo establecido para la realización de la práctica, los alumnos defenderán el programa realizado ante el profesor en el laboratorio durante las fechas determinadas para cada convocatoria. También presentarán el programa, correctamente estructurado y comentado, junto con una memoria que detalle su funcionamiento interno y el proceso de desarrollo que se ha llevado a cabo, así como los problemas que pudieran haber surgido durante el trabajo, las soluciones adoptadas y, en general, el porqué de las decisiones de diseño tomadas. Una correcta ortografía y gramática se considera indispensable para la escritura de la memoria. Este documento tendrá un máximo de diez páginas y será entregado en formato electrónico (preferiblemente PDF) siguiendo el procedimiento indicado para ello por el profesorado de la asignatura. En la memoria se hará especial hincapié en las interrupciones utilizadas por el programa, describiendo su funcionamiento y los usos concretos que se les han dado. Además, se valorará especialmente el apartado de conclusiones del trabajo, donde los alumnos expondrán sus opiniones, fruto de la experiencia, acerca del ensamblador 8086, la programación en este entorno y la interacción con los periféricos por medio de interrupciones. En ningún caso se incorporará a la memoria el código fuente, ya sea en su totalidad o en parte. Como se ha mencionado anteriormente, el programa se entregará por separado y debidamente comentado, por lo que incorporarlo a la memoria sería equivalente a presentarlo por duplicado y, por tanto, se consideraría un relleno injustificado. Por supuesto, también se considerará inapropiado copiar cualquier parte de este enunciado para utilizarlo en la memoria. La nota final de la práctica se establecerá en función de la defensa realizada por los alumnos en el laboratorio y de la calidad de la memoria presentada de acuerdo con el siguiente baremo: • Defensa: 6 puntos o Funcionamiento correcto del programa completo: 2 puntos o Explicaciones acertadas y dominio del tema: 2 puntos o Limpieza y estructuración del código: 1 punto o Ampliaciones y mejoras: 1 punto • Memoria: 4 puntos 1 punto o Presentación, gramática y ortografía: 1 punto o Descripción del funcionamiento del programa: 1 punto o Descripción del uso de las interrupciones: 1 punto o Conclusiones y valoración personal: Periféricos e Interfaces Curso 2010 – 2011 ______________________________________________________________________ La Pantalla del PC Las imágenes de la pantalla del PC están compuestas por unidades llamadas píxel. El adaptador o controlador de pantalla es un circuito que sirve de interfaz entre el procesador y la pantalla. Este controlador dispone de puertos que permiten la comunicación entre el procesador y la pantalla, así como de una memoria que contiene el valor de cada píxel. Según el adaptador, la memoria puede funcionar en modo gráfico o en modo texto, en el que sólo se representan caracteres. Cuando funciona en modo texto, la pantalla es como una matriz de 80 columnas por 25 filas donde cada celda de la matriz representa un carácter. Esta matriz es almacenada en la memoria de pantalla por filas, codificándose cada carácter en una palabra de 16 bits que contiene el código ASCII en el byte menos significativo, mientras que el byte más significativo contiene el atributo de visualización. El valor normal del atributo es “gris sobre negro”, que se codifica 07h. En esta figura se muestra la relación existente entre la pantalla y la memoria del controlador de pantalla. Para visualizar un carácter en la posición (i,j) de la pantalla debe escribirse su código ASCII y el atributo correspondiente en la celda (i,j) de la matriz que representa la pantalla. Puesto que la matriz está almacenada por filas en posiciones consecutivas de memoria, la celda (i,j) corresponderá a la palabra 80*i+j de la memoria de pantalla, esto es, el código ASCII y el atributo de visualización se almacenarán en los bytes: dir_memoria_pantalla + 2 * (80 * i + j) dir_memoria_pantalla + 2 * (80 * i + j) + 1 Periféricos e Interfaces Curso 2010 – 2011 ______________________________________________________________________ El Teclado del PC El controlador del teclado del PC está explorando continuamente la matriz de teclas. Cuando se detecta la pulsación de una tecla, el código de pulsación de la tecla se almacena en una memoria. Este código es un número de 8 bits que tendrá el bit más significativo a cero. Si una tecla permanece pulsada más de medio segundo, el controlador colocará repetidamente su código en la memoria. Cuando se detecta la liberación de una tecla, el código de liberación de la tecla se almacena en la memoria del controlador. Este código es idéntico al de pulsación, pero con el bit más significativo a uno. La memoria de teclas actúa como una cola con capacidad para un número concreto de códigos. Siempre que la memoria de teclas no esté vacía, el controlador colocará el código más antiguo de los almacenados en ella en un registro que ocupa la dirección 60h del espacio de direcciones de entrada/salida, activando una interrupción para que el procesador se percate de que tiene un carácter disponible. Es importante tener en cuenta que el código de pulsación/liberación de cada tecla no tiene nada que ver con el código ASCII del carácter correspondiente. El número de teclados existentes en el mercado es muy grande y, aunque para muchas teclas el código es siempre el mismo, cada teclado puede utilizar códigos diferentes para ciertas teclas específicas. Periféricos e Interfaces Curso 2010 – 2011 ______________________________________________________________________ Algunas Interrupciones Útiles Interrupción 10h de la BIOS, función 00h Establecer el modo de video de la pantalla. Interrupción 10h de la BIOS, función 01h Modificar el ancho del cursor (útil para ocultarlo). Interrupción 10h de la BIOS, función 02h Situar el cursor en un punto de la pantalla. Interrupción 10h de la BIOS, función 03h Obtener la posición del cursor en la pantalla. Interrupción 10h de la BIOS, función 06h Limpiar o desplazar hacia abajo la pantalla (o un rectángulo dentro de la pantalla). Interrupción 10h de la BIOS, función 07h Limpiar o desplazar hacia arriba la pantalla (o un rectángulo dentro de la pantalla). Interrupción 16h de BIOS, función 00h Obtener el código ASCII asociado a una pulsación de teclado sin esperar por ella. Interrupción 16h de BIOS, función 01h Detectar si se ha pulsado una tecla. Interrupción 1Ah de BIOS, función 00h Obtener el valor actual del reloj del procesador (útil para generar números aleatorios). Interrupción 21h de MSDOS, función 01h Esperar por una pulsación de teclado y obtener el código ASCII asociado. Interrupción 21h de MSDOS, función 02h Escribir un carácter en pantalla. Interrupción 21h de MSDOS, función 08h Esperar por una pulsación de teclado y obtener el código ASCII asociado sin mostrarlo por la pantalla (sin eco). Interrupción 21h de MSDOS, función 09h Mostrar una ristra de caracteres almacenada en memoria por pantalla. Interrupción 21h de MSDOS, función 0Bh Detectar si se ha pulsado una tecla. Interrupción 21h de MSDOS, función 4Ch Terminar el programa y devolver el control al Sistema Operativo. Periféricos e Interfaces Curso 2010 – 2011 ______________________________________________________________________ Bibliografía Recomendada 8088-8086/8087 – Programación Ensamblador en Entorno MS DOS M.A. Rodríguez Roselló. Anaya. 80386/80286 Programación en Lenguaje Ensamblador. W.H. Murray y C.H. Papas. McGraw-Hill. Lenguajes ensambladores. R. Martínez Tomás. Paraninfo. Turbo Assembler 3.0 User’s Guide. Borland.