Descargar

Estructura y Tecnología de Computadores (página 2)

Enviado por Pablo Turmero


Partes: 1, 2
edu.red

# 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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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)

edu.red

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

edu.red

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

edu.red

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

edu.red

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 } )

edu.red

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) ; }

}

edu.red

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

edu.red

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.

edu.red

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

edu.red

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

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente