350 likes | 531 Views
ETC-II. Laboratorio de Estructura y Tecnología de Computadores Proyecto Piano. Universidad Autónoma de Madrid Escuela Politécnica Superior. Septiembre-2009. Introducción. Programar en Ensamblador x86 un Teclado electrónico para MSDOS Objetivos: Aprender a programar el entorno 8086
E N D
ETC-II Laboratorio de Estructura y Tecnología de Computadores Proyecto Piano Universidad Autónoma de Madrid Escuela Politécnica Superior Septiembre-2009
Introducción Programar en Ensamblador x86 un Teclado electrónico para MSDOS Objetivos: Aprender a programar el entorno 8086 Aprender a realizar un driver Aprender la interacción con los recursos hardware Aprender la interacción entre C y Lenguaje ensamblador Conocimientos: Programación y depuración 8086 Funcionamiento de interrupciones software Comunicación con programas residentes Timer del PC (interrupción 0x1C , generación de sonidos) RTC Uso de la pila para paso de parámetros Septiembre-2009
Introducción • Generación de un sonido mediante el altavoz del PC: • El altavoz del PC está conectado al bit 1 del Puerto 61H (xxxx-xxox) • Cambiando el estado del bit a ciertas frecuencias se produce una señal audible. • Según la frecuencia, tenemos un sonido (nota) u otro. • Dos opciones: • Bucle con espera activa y acceso directo al altavoz • Usar el Timer 0 para generar la señal cuadrada automáticamente PC Señal Eléctrica conectada al altavoz Onda sonora Septiembre-2009
Escala musical temperada 12 Relación entre una nota y la siguiente 2 f 2f Septiembre-2009
Estructura Proyecto Teclado Electrónico Práctica 1 Mandamos la nota Servicios Int 61H Práctica 2 Driver INT 61H Generador Notas musicales por TMR y RTC Practica 3 Programa en C para leer canciones de fichero Librería en ASM que hace de interfaz entre C y el driver Mandamos la nota Septiembre-2009
Práctica 1 Práctica 1: Diseño del teclado Hacer un programa en ensamblador que dibuja un teclado en la pantalla (modo QVGA / VGA) y que detecta las teclas introducidas por el usuario. Este programa llamará al driver ‘sonido.com’ que se encargará de reproducir las notas por el altavoz. Este driver se proporcionará a los alumnos. Septiembre-2009
Práctica 1 objetivos • Práctica 1: Objetivos • Detectar instalación correcta del driver: • Vector interrupción distinto de cero. • Comprobación palabra clave. • Comprobación Identificador del driver. • Dibujar el teclado (Texto o QVGA) • Leer teclas asignadas y mandar orden al simulador • Leer el estado del simulador para mostrar el estado del teclado • Implementar funciones duración y tono. • Usar Makefile y Depurador (TD) • Opcional: • Melodías pre-seleccionadas • Teclado ampliado • Sonidos a otras escalas • Efectos… Septiembre-2009
Práctica 1 Ejemplo Driver en memoria Estado nota Lo gestiona el simulador pero lo lee el programa Septiembre-2009
Práctica 1 entregables Práctica 1: Entregables Programa: piano.asm Fichero: Makefile Librerias: Opcionales (VGA/Texto , Teclado, …) Práctica 1 Teclado Electrónico Simulador Drvmio.com INT 61H Generador Notas musicales Septiembre-2009
Práctica 1: Estructura Driver Estructura Driver Se accede mediante interrupción software: INT61H Nos ofrece servicios, seleccionables por registro AH Resto de registro para paso de parámetros Parte 2: Residente en memoria Palabra de seguridad 0FECAH Configura vector Deja parte residente en memoria Parte 1: Instalación Septiembre-2009
Práctica 1: Servicios del Driver Septiembre-2009
Práctica 1: Comprobación Driver 1º Comprobamos que hay algo en memoria Memoria 2 bytes Tabla Interrupciones 0 Int #0 2 2º 4 Servicios Driver Int #1 6 0FECAH +3 Offset 184H Int #61H Segmento 186H IRET 3º Comprobamos Servicio Identificación MOV AH, 0 INT 61H CMP AX,0EE01H Septiembre-2009
Práctica 1: Librerías • Una librería mantiene una estructura muy parecida a la de un programa normal, pero con algunas características especiales: • Es un archivo fuente .ASM que generalmente sólo lleva la definición del segmento de código, ya que comparte pila y segmento de datos con el programa principal que llama a las funciones de la misma. • Las funciones que queramos exportar o hacer visibles se declaran como PUBLIC en el archivo fuente de la librería. • Los programas que quieran llamar a esas funciones las tendrán que declarar como EXTERN • Una librería se compila con el TASM primero y una vez obtenido el .OBJ se encapsula en un fichero .LIB mediante el comando TLIB. Septiembre-2009
Ejemplo de libreria Solo segmento de código No hay punto de entrada GetKey es accesible el resto no Septiembre-2009
Ejemplo de librería: compilación • tasm /zi teclado.asm • para generar el fichero teclado.obj (suponiendo que el archivo que contiene la libreria se llame teclado.asm) • tlib teclado.lib -+teclado.obj • para generar el fichero teclado.lib que es la librería encapsulada. El -+ indica re-emplazo, es decir, si dentro del archivo teclado.lib ya existe una función GetKey procede a su reemplazo por la nueva versión. En caso de que no exista la añade directamente. • tlink /v program.obj teclado.lib • Una vez que se tiene el archivo teclado.lib se podrá compilar cualquier programa que use funciones de la librería. Septiembre-2009
Ejemplo de libreria Programa.asm Indico función externa Llamada a la función. Cómo si fuese una interna Septiembre-2009
La herramienta make entorno de compilación, nos permite hacer la compilación de un programa más sencilla permitir definir en un fichero una serie de reglas o pasos de compilación para que a partir de una serie de archivos fuente se obtenga el fichero o ficheros ejecutables. Las reglas está contenidas en un fichero que tiene que llamarse Makefile y que será llamado por defecto al ejecutar el comando make. Cuidado, Makefile sin extensión. Un ejemplo sencillo de fichero Makefile es: test.exe: test.obj tlink /v test.obj test.obj: test.asm tasm /zi test.asm clean: del *.obj del test.exe Si tecleamos make clean, nos aseguramos de partir de un punto limpio Makefiles
# Ejemplo de fichero Makefile all: drvmio.com test.exe drvmio.com: drvmio.obj TLINK /t /v drvmio.obj test.exe: test.obj teclado.lib TLINK /V test.obj teclado.lib .asm.obj: TASM /zi $< .obj.lib: TLIB $&.lib -+$< clean: del *.obj del *.map del *.exe del *.lib del *.com Makefiles Si ponemos makeall se ejecutan todos estos procesos Proyecto 1: drvmio.com Proyecto 2: test.exe Reglas de construcción genéricas Limpieza
Práctica 2 Práctica 2: Diseño driver generador de notas Hacer un driver que use el TMR2 y el RTC para generar un tono a la frecuencia de cada nota musical. Este driver sustituirá al proporcionado en la práctica anterior. Opcional: Que el driver saque sonidos por el puerto paralelo Práctica 1 Teclado Electrónico Práctica 2 Driver INT 61H Generador Notas musicales por TMR y RTC Septiembre-2009
Práctica 2: Interrupciones involucradas • Interrupción 61h: Driver • Acceso a las funciones del driver desde programas externos • Interrupción software. No PIC, no EOI, IRET, síncrona. • Hay que instalar la interrupción • Interrupción 70h: Reloj Tiempo Real (RTC) • Cada vez que suene una nota se activará para medir el tiempo que tiene que sonar. Cuando salte ‘n-veces’ la interrupción desactivaremos el sonido. • Hay que instalar la interrupción y configurar los PIC, los registros A y B del RTC con la interrupción PIE del mismo. • Interrupción hardware: PIC, EOI, IRET, asíncrona • Interrupción 1Ch: Generada por el TMR (INT 08h) • Se llama 18.2/seg y nos servirá para hacer efecto gráfico. Se configura al instalar el driver, y se desactiva al desinstalar el driver. Hay que instalar la interrupción. • Pseudo-software: No PIC, no EOI, IRET, asíncrona Septiembre-2009
Práctica 2: Estructura Driver Estructura Driver Se accede mediante interrupción software: INT61H Nos ofrece servicios, seleccionables por registro AH Resto de registro para paso de parámetros Parte 2: Residente en memoria Palabra de seguridad 0FECAH Configura vectores interrupción Deja parte residente en memoria Parte 1: Instalación Septiembre-2009
Práctica 2: Segmento de datos MOV AX,DATO1 INT 61h … PUSH DS MOV AX,CS MOV DS,AX MOV AX,DATO2 POP DS IRET MOV AX,DATO2 IRET 2 Programa Principal DATO1 Driver DATO2 1 3 2 DS CS ES SS Septiembre-2009
Práctica 2: El Temporizador (TMR 8253) El Chip 8253 contiene tres temporizadores de 16-bits Lo vamos a usar para generar sonidos. Registros internos (Accesibles directamente en los puertos siguientes): 40h : Contador 0 -> controla el reloj sistema -> INT8 -> INT 1Ch 41h : Contador 1-> Refresco memoria RAM 42h : Contador 2 -> Generación de tonos en el altavoz 43h : Registro de control Se accede a ellos mediante las instrucciones IN/OUT 18.2Hz (INT 1CH) 0 1 Amplificador y Filtro 2 Puerto 42h Puerto 61h 7 1 0 Septiembre-2009
Práctica 2: Temporizador Registro de Control SC1..SC0: Seleccionan el contador que vamos a configurar 0 0 : Contador 0 0 1 : Contador 1 1 0 : Contador 2 1 1 : Sin uso RL1..RL0: Modo de acceso a los contadores 0 0 : Captura de la cuenta en un latch (leer sin para contador) 0 1 : Leer/Escribir el byte más significativo 1 0 : Leer/Escribir el byte menos significativo 1 1 : Leer/Escribir ambos bytes (primero menos significativo) M2..M0: Modo de funcionamiento (x11 -> Aestable, generador de onda cuadrada) BCD: Cuenta en modo BCD Septiembre-2009
Práctica 2: Reloj en Tiempo Real (RTC) • El Chip MC146818 mantiene la hora del sistema cuando esta apagado • Lo vamos a usar para temporizar la duración del sonido. Usaremos su capacidad de generar interrupciones hardware. • Tiene 64 registros internos, de los cuales nosotros vamos a usar: • Registro A (Dirección 10): Configuración general (Frecuencia) • Frec. Osc. = 32.768khz • Registro B (Dirección 11): Configuración interrupciones (PIE). PIE=1, SQWE=0 • Registro C (Dirección 12): Estado (PIE). Con leer se borran los flags. • El acceso a sus registros internos se hace indirectamente a través del puerto 70h y 71h mediante instrucciones IN/OUT. • Para realizar lectura: • Se escribe (OUT) en el puerto 70h la dirección de la posición que se desea leer. • Se realiza una lectura en el puerto 71h. • Para realizar una escritura • Se escribe (OUT) en el puerto 70h la dirección de la posición que se desea escribir • Se escribe (OUT) en el puerto 71h el dato que se quiere escribir Septiembre-2009
Práctica 2: Controlador Interrupciones (PIC) Direcciones del PIC-0 (maestro): 20h y 21h Direcciones del PIC-1 (esclavo): A0h y A1h Interrupciones PIC-0: 08h (IR0), 09h (IR1)…0Fh (IR7) Interrupciones PIC-1: 70h (IR8), 71h (IR9)…7Fh (IR15) Septiembre-2009
Práctica 2: Controlador Interrupciones (PIC) • El RTC genera la interrupción 70h que proviene del PIC-esclavo. • Para poderla recibir tenemos que configurar el PIC maestro y el esclavo. • Para indicar que hemos recibido una interrupción tenemos que mandar EOI no especifico (OCW2 = 020h) al PIC esclavo y maestro. • Configuración: • PIC Maestro: • 21h: Máscara de interrupción (habilitar entrada IR2 – esclavo) • 20h: Mandar comandos (EOI no específico OCW2) • PIC esclavo: • A1h: Máscara de interrupción (habilitar entrada IR0 – RTC) • A0h: Mandar comandos (EOI no específico OCW2) • Ejemplo: • IN AL, 021h ; Leo máscara interrupción del PIC maestro • AND AL, 0FBh ; Pongo a cero (habilito) entrada del PIC esclavo • OUT 021h,AL ; Guardo el valor en la máscara Septiembre-2009
Práctica 3 Práctica 3: Interacción de Ensamblador con el Lenguaje C Hacer un programa en C y una librería intermedia que llame al driver anterior y reproduzca canciones escritas en un fichero. Opcional: Tener un teclado y poder reproducir y guardar canciones. Practica 3 Driver INT 61H Generador Notas musicales por TMR y RTC Programa en C para leer canciones de fichero Librería en ASM que hace de interfaz entre C y el driver Septiembre-2009
Paso de parámetros de C a ASM Paso de parámetros de C a ASM El paso de parámetros se realizará por lo PILA. intfuncion_asm(charparam1, intparam2, long intparam3) ; Lectura de Param2 PUSH BP ; BP como índice MOV BP,SP MOV AX, SS:[BP+8] ; AX=Param2 … POP BP ; equilibrado PILA RET +2 +2 +2 +2 Septiembre-2009
Paso de parámetros de ASM a C • Paso de ASM a C • El paso de parámetros se realiza por DX:AX • int funcion_asm(int param1, int param2, int param3) • Retorno de 16 bits en AX • Retorno de 32 bits en DX:AX • Ejemplo: • Un entero se devuelve en AX • Un puntero se devuelve en DX (segmento):AX (offset) • ; Función en Ensamblador • PUSH BP • MOV BP,SP • MOV AX, [BP+8] ; AX = Param2 • POP BP • RET • Esta función devuelve el valor de PARAM2 ( { return param2 } ) Septiembre-2009
Paso de parámetros de C a ASM Ejemplo implementación de la práctica: Fichero 1: Programa en C #include “libdriver.h” void main() { int id; id = driver_identificador(); // obtener el identificador if (id!=0xEE01) { printf(“Error\n”); // si no es 0xEE01 salgo else { driver_playnota(1); // toco una nota hasta que pare while (driver_estado() == 1) ; } } Septiembre-2009
Paso de parámetros de C a ASM fichero 2 : libdriver.h (Usado para compilar en C) int driver_identificador(); void driver_playnota(unsigned int); int driver_estado() ; fichero 3 : libdriver.asm (Librería puente) _LIBDRIVER segment assume cs:_LIBDRIVER db 10h DUP (?) (… código de las funciones ---) _LIBDRIVER ends public _driver_identificador public _driver_playnota public _driver_estado end Septiembre-2009
Paso de parámetros de C a ASM ;------------------------------------ ; int driver_identificador() ;------------------------------------ _driver_identificador PROC FAR push bp mov ah,0 ; función identificación del driver int 61h ; Resultado en AX pop bp ret ; En AX esta el valor de indentificacion _driver_identificador ENDP (*) PUSH BP, POP BP no haría falta dado que en este caso no tenemos que acceder a la pila para buscar parámetros. Es una función que solo devuelve un valor (**) Es necesario poner “_” para que C pueda encontrar las funciones de la librería. Septiembre-2009
Paso de parámetros de C a ASM ; int driver_playnota(int nota) ; stack-4 -> offset retorno ; stack-2 -> segmento retorno (Si lo definimos como NEAR no se guarda el CS) ; stack -> nota ; por AX devuelvo el resultado _driver_playnota PROC FAR push bp mov bp,sp ; para acceder a la PILA mov ax,ss:[bp+6] ; saco la posición a leer de la PILA mov ah,2 ; función Play Nota (En AL está la NOTA) int 61h xor al,al ; En AH =0 si no hay Error pop bp ret _driver_playnota ENDP Septiembre-2009
Paso de parámetros de C a ASM Compilación: testc.exe: testc.c libdriver.asm tcc -v -ml -Ic:\compila\tc\include -Lc:\compila\tc\lib testc.c libdriver.asm Librería ASM Programa en C Depuración y modo FAR Compilador de C Septiembre-2009