# 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 |