# 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 make all 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 2 Driver INT 61H
Generador Notas musicales por TMR y RTC Práctica 1
Teclado Electrónico
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
Práctica 2: Estructura Driver
Se accede mediante interrupción software: INT61H
Nos ofrece servicios, seleccionables por registro AH
Resto de registro para paso de parámetros
Configura vectores interrupción Deja parte residente en memoria Estructura Driver Parte 1: Instalación Parte 2: Residente en memoria Palabra de seguridad 0FECAH
PUSH DS MOV AX,CS MOV DS,AX MOV AX,DATO2 POP DS IRET Práctica 2: Segmento de datos Programa Principal Driver DATO2 DATO1 DS CS ES SS 1 MOV AX,DATO1 INT 61h …
MOV AX,DATO2
IRET 2 2 3
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 Amplificador y Filtro Puerto 61h 7 1 0 0 1 2 18.2Hz (INT 1CH) Puerto 42h
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
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
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)
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
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. 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
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.
int funcion_asm(char param1, int param2, long int param3)
; 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
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 } )
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(“Errorn”); // si no es 0xEE01 salgo else { driver_playnota(1); // toco una nota hasta que pare while (driver_estado() == 1) ; }
}
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
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.
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
Paso de parámetros de C a ASM Compilación:
testc.exe: testc.c libdriver.asm
tcc -v -ml -Ic:compilatcinclude -Lc:compilatclib testc.c libdriver.asm
Programa en C Librería ASM Compilador de C Depuración y modo FAR
Página anterior | Volver al principio del trabajo | Página siguiente |