50376472 Uso de Procedimientos y Macros Lenguaje Ensamblador

Embed Size (px)

Citation preview

Ingeniera en Sistemas ComputacionalesLENGUAJE ENSAMBLADOR

Uso de Procedimientos, Macros o Libreras y uso del altavoz de la computadora

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

ndice Contenido pgs.

Introduccin .............................................................................................................................................................. 3 Interfaz programable de perifricos (ppi) 8255....................................................................................................... 10 Temporizador 8253 u 8254....................................................................................................................... 12 Desarrollo y cdigo................................................................................................................................................... 18 Conclusiones ............................................................................................................................................................ 21 Referencias .............................................................................................................................................................. 22

Instituto Tecnolgico de la Laguna

Pag. 2

Lenguaje Ensamblador Introduccin.

Uso de Procedimientos, Macros y Libreras

MODULARIZACION Y PROGRAMACIN HIBRIDA Introduccin. La programacin modular es uno de los mtodos de diseo mas flexibles y poderosos para el mejoramiento de la productividad de un programa. Usando la programacin modular el problema se divide en mdulos, donde cada una de los cuales ejecuta una nica actividad o tarea y se codifican independientemente de otros mdulos. Cada uno de estos mdulos se analiza, se codifica y se prueba de preferencia por separado. Al trabajar con lenguaje ensamblador, la necesidad de la estructuracin es, si cabe, an es ms vital, puesto que cualquier tarea, por sencilla que parezca, puede requerir una gran lista de sentencias ejecutables. No hay que olvidar que estamos trabajando a un nivel muy bajo, ms que cualquier otro lenguaje al que est acostumbrado. Todo programa contiene un mdulo denominado programa principal que controla todo lo que sucede; si se transfiere el control a un submdulo, ste ejecuta su funcin y una vez que la termina, regresa el control al mdulo desde donde fue llamado. En muchos casos es el mdulo principal. Si la tarea asignada a cada submdulo es demasiado compleja, ste deber descomponerse en otros mdulos ms pequeos. Este proceso de descomposicin contina hasta que cada mdulo tenga una tarea especfica que ejecutar. Esta tarea puede ser: a) Entrada. b) Salida. c) Manipulacin de datos. d) Control de otros mdulos. e) Alguna combinacin de los anteriores. En el Lenguaje ENSAMBLADOR esta tcnica se puede llevar a cabo mediante Macros y Procedimientos. Procedimientos. Los lenguajes de alto nivel, al menos la mayora de ellos, permite codificar bloques de sentencias a los que se asigna un nombre, de tal forma que para ejecutar dichas sentencias, desde cualquier punto de la aplicacin basta con introducir ese identificador y, en caso necesario, facilita los parmetros adecuados. A estos bloques de sentencias, dependiendo del lenguaje, se les conoce como procedimientos, funciones o mtodos, segn los casos. En ensamblador se opera con direcciones, a pesar de que stas pueden estar representadas mediante etiquetas que hacen ms fcil nuestro trabajo. La transferencia mgica de parmetros, por la que unos valores facilitados tras un identificador aparecen como argumentos del procedimiento invocado, es algo que no existe. S tenemos a nuestra disposicin, no obstante, una instruccin capaz de saltar a una direccin dada guardando el actual valor del registro IP, de tal forma que sta puede recuperarse posteriormente para volver y continuar la ejecucin por el punto en el que se interrumpi. La instruccin que nos permite invocar a un procedimiento es CALL. Esta toma como parmetro un valor inmediato, la direccin a la que debe transferir el control, o bien indirecto a travs de un registro o un campo que contendr la direccin a la que tiene que apuntar IP a partir de ese momento. Aparentemente CALL es similar a la instruccin JMP, ya que transfiere la ejecucin a una direccin de forma incondicional. La diferencia es que, antes de que se produzca ese salto, CALL guarda en la pila el valor actual del registro IP, en caso de que el salto sea una direccin dentro del mismo segmento que indica CS, o bien, los valores de CS e IP, si el salto es a una direccin de otro segmento. El primer tipo de salto se denomina NEAR o cercano, mientras que el segundo se le conoce como salto FAR o lejano. En el primero se necesitan 16 bits, tan slo la direccin relativa al segmento que indica CS y en el segundo los 32 bits precisos para dar valor a CS e IP tras guardarlos en la pila. Una vez que se ha guardado el valor de IP o de CS e IP, se ejecutan las instrucciones que haya en la direccin indicada. Estas pueden efectuar, como es lgico, cualquier tarea, siempre que tengamos en cuenta que al llegar al final, justo antes de devolver el control, la pila debe encontrarse en la misma situacin en la que se encontraba al principio. Si hemos introducido valores, stos deben extraerse. Lo importante es que el puntero de la Instituto Tecnolgico de la Laguna Pag. 3

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

pila, en el momento de volver, est apuntando a los valores que introdujo en ella la instruccin CALL. Si la instruccin CALL guarda el actual puntero de instruccin y transfiere la ejecucin al procedimiento, la instruccin RET tiene el efecto inverso, recuperndose la direccin de la pila, devolvindola a CS e IP e incrementando ste ltimo para proceder a ejecutar la instruccin que sigue al CALL que invoc el procedimiento. La instruccin RET, por tanto, tambin es un salto incondicional, similar a JMP, con la diferencia de que la direccin a la que saltar debe estar almacenada en la pila, generalmente por una llamada previa a CALL. Teniendo en cuenta esto, entender lo importante que es que SS:SP conserven los valores que tenan al iniciar la ejecucin del procedimiento, porque, de no ser as, la instruccin RET podra transferir la ejecucin a un punto incorrecto y causar la cada del sistema. Cmo sabr la instruccin RET si debe recuperar de la pila slo el valor de IP o tambin el de CS? La respuesta es que depende de cmo se haya definido el procedimiento al que se invoc con CALL. MASM y TASM cuentan con un preprocesador que, a partir de ciertas palabras claves como PROC FAR o PROC NEAR, se encargan de generar las instrucciones ensamblador adecuadas. Sintaxis: etiqueta etiqueta Donde: etiqueta: constante: PROC [NEAR | FAR] secuencia de sentencias RET constante ENDP

Es un smbolo asignado como nombre al procedimiento, la distancia pude ser NEAR FAR, cualquier RET dentro del PROCEDIMIENTO automticamente toma la misma distancia. STACK se usa para pasar argumentos a un procedimiento, si se conoce el nmero de WORDS pasadas al STACK como argumentos, constante puede contener ese nmero, de tal forma de liberar esos argumentos despus de salir del procedimiento.

La etiqueta se usa para llamar al PROCEDIMIENTO con una instruccin CALL, entonces, la etiqueta contiene la direccin de inicio de la primera instruccin del procedimiento. Esta instruccin realiza su trabajo colocando en el STACK la direccin de la siguiente instruccin y transfiriendo el control a la direccin especificada por el operando. C:\USER>masm imp; C:\USER>masm binasib1; C:\USER>masm ensa34C; A continuacin como ya se tienen los archivos .OBJ se crea la librera MILIB.LIB, usando la siguiente instruccin: C:\USER>lib milib +binasib1 +imp, milib.lst; Nota: Se considera que ya hay un PATH definido, y para el archivo LIB.EXE se tiene considerado su localizacin en dicho PATH.

Instituto Tecnolgico de la Laguna

Pag. 9

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

INTERFAZ PROGRAMABLE DE PERIFERICOS (PPI) 8255El PPI 8255 es un dispositivo de E/S general, programable, capaz de controlar 24 lneas con diferentes configuraciones (entrada/salida) y en hasta 3 modos de operacin.

CONEXIONES DEL 8255 - D0..D7: Bus de datos bidireccional de 3 estados. - RESET: Esta seal borra el registro de control y todos los puertos (A, B y C) son colocados en modo entrada. - RD: Utilizada por la CPU para leer informacin de estado o datos procedentes del 8255. - WR: Utilizada por la CPU para enviar palabras de control o datos al 8255. - A0..A1: Lneas de direccin: permiten seleccionar uno de los tres puertos o el registro de control. - PA0..PA7: Puerto A: puerto de entrada/salida de 8 bits. - PB0..PB7: Puerto B: puerto de entrada/salida de 8 bits. - PC0..PC7: Puerto C: puerto de entrada/salida de 8 bits. DESCRIPCION DE SU FUNCIONAMIENTO Las dos lneas de direcciones definen cuatro puertos de E/S en el ordenador: los tres primeros permiten acceder a los puertos A, B y C; el cuarto sirve para leer o escribir la palabra de control. El 8255 est dividido en dos grupos internos: el grupo A, formado por el puerto A y los 4 bits ms significativos del puerto C; y el grupo B, constituido por el puerto B junto a los 4 bits menos significativos del puerto C. El puerto C est especialmente diseado para ser dividido en dos mitades y servir de apoyo a los puertos A y B en algunos sistemas. El 8255 soporta 3 modos de operacin: el modo 0 (entrada y salida bsica), el modo 1 (entrada y salida con seales de control) y el modo 2 (bus bidireccional de comunicaciones). La configuracin por defecto de los tres puertos estn configurados de en modo de entrada, y las 24 lineas estn configurados en 1. Esta configuracin puede ser alterada por el programador dependiendo los usos que le den. El modo para el puerto A y B se puede seleccionar por separado; el puerto C est dividido en dos mitades relacionadas con el puerto A y el B. Todos los registros de salida son reseteados ante un cambio de modo, incluyendo los biestables de estado. Las configuraciones de modos son muy flexibles y se acomodan a casi todas las necesidades posibles.

Instituto Tecnolgico de la Laguna

Pag. 10

Lenguaje Ensamblador MODOS DE OPERACIN DEL 8255

Uso de Procedimientos, Macros y Libreras

MODO 0 Esta configuracin implementa simples funciones de entrada/salida para cada bit de los 2 puertos de 8 bits y los 2 puertos de 4 bits; los datos son ledos y escritos sin ms, sin ningn tipo de control adicional. Los puertos pueden ser configurados de entrada (sin latch) o salida (los datos permanecen memorizados en un latch). MODO 1 Este modo es el strobed input/output (entrada/salida a travs de un protocolo de seales). Existen dos grupos (A y B) formados por los puertos A y B ms el puerto C, que es repartido a la mitad entre ambos grupos para gestionar las seales de control. Tanto si se configura de entrada como de salida, los datos permanecen en un latch. Con este modo es factible conectar dos 8255 entre s para realizar transferencias de datos en paralelo a una velocidad considerable, con posibilidad de generar interrupciones a la CPU en el momento en que los datos son recibidos o hay que enviar uno nuevo (consltese documentacin tcnica). MODO 2 En este modo se constituye un bus bidireccional de 8 bits, por el que los datos pueden ir en un sentido o en otro, siendo el flujo regulado de nuevo por seales de control a travs del puerto C. Este modo slo puede operar en el Grupo A. Tanto las entradas como salidas son almacenadas en latch. NOTA: Existen varias combinaciones posibles de estos modos, en las que las lneas del puerto C que no son empleadas como seales de control pueden actuar como entradas o salidas normales, quedando las lneas de control fuera del rea de influencia de los comandos que afectan a las restantes. DESCRIPCION DE LOS PUERTOS Puerto A (60h) Tiene una doble funcin: cuando el bit 7 del puerto B est a 1, el puerto A recibe el cdigo de rastreo de la tecla pulsada, que luego puede ser ledo desde la interrupcin del teclado. Si el bit 7 del puerto B est a 0, entonces el puerto A devuelve informacin sobre la configuracin del sistema en los PC (no en los XT): en el bit 0 (a 1 si hay disqueteras), bits 2..3 (nmero de bloques de 16 kb de memoria que obsoleto e intil!), bits 4..5 (tipo de pantalla: 11 MDA, 10 Color 80x25, 01 Color 40x25) y bits 6..7 (nmero de unidades de disco, si el bit 0=1). Puerto B (61h) Bit 0 (PC/XT: conectado a la lnea GATE del contador 2 del 8253), bit 1 (PC/XT: conectado al altavoz), bit 2 (slo PC: selecciona el contenido del puerto C), bit 3 (en XT: selecciona contenido del puerto C; en PC: a 0 para activar el motor del casete), bit 4 (PC/XT: a 0 para activar la RAM), bit 5 (PC/XT: a 0 para activar seales de error en el slot de expansin), bit 6 (PC/XT: a 1 activa la seal de reloj del teclado), bit 7 (en PC: empleado para seleccionar la funcin del puerto A; tanto en PC como en XT sirve adems para enviar una seal de reconocimiento al teclado). Puerto C (62h) Si el bit 2 del puerto B (PC) o el bit 3 del puerto B (XT) estn a 1: y En los PC: los bits 0..3: mitad inferior del 2 banco de conmutadores de la placa base (RAM en slots de expansin); bit 4 (entrada de casete). y En los XT: bit 1 (activo si coprocesador instalado), bits 2..3 (bancos de RAM en placa base). y En PC/XT: bit 5 (OUT del contador 2 del 8253), bit 6 (a 1 si comprobar errores en slots de expansin), bit 7 (1 si comprobar error de paridad). y Si el bit 2 del puerto B (PC) o el bit 3 del puerto B (XT) estn a 1: y En los PC: bits 0..3 parte alta del segundo banco de conmutadores de configuracin (no usada). y En los XT: bits 0..1 tipo de pantalla (11 MDA, 10 color 80x25, 01 color 40x25), bits 2..3 (n de disqueteras menos 1). y En PC/XT: los bits 4..7 estn igual que en el caso anterior (no dependen del bit 2 3 del puerto B).

Instituto Tecnolgico de la Laguna

Pag. 11

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

EL TEMPORIZADOR 8253 U 8254 El 8253/4 es un chip temporizador que puede ser empleado como reloj de tiempo real, contador de sucesos, generador de ritmo programable, generador de onda cuadrada, etc. En este captulo, la informacin vertida estar relacionada con el 8254 que equipa a los AT, algo ms potente que el 8253 de los PC/XT; sin embargo, las pocas diferencias sern comentadas cuando llegue el caso.

Este circuito integrado posee 3 contadores totalmente independientes, que pueden ser programados de 6 formas diferentes. D7..D0: BUS de datos bidireccional de 3 estados. CLK 0: CLOCK 0, entrada de reloj al contador 0. OUT 0: Salida del contador 0. GATE 0: Puerta de entrada al contador 0. CLK 1: CLOCK 1, entrada de reloj al contador 1. OUT 1: Salida del contador 1. GATE 1: Puerta de entrada al contador 1. CLK 2: CLOCK 2, entrada de reloj al contador 2. OUT 2: Salida del contador 2. GATE 2: Puerta de entrada al contador 2. A0..A1: Lneas de direccin para seleccionar uno de los tres contadores o el registro de la palabra de control. CS: Habilita la comunicacin con la CPU. WR: Permite al 8254 aceptar datos de la CPU. RD: Permite al 8254 enviar datos a la CPU.

El buffer del bus de datos, de 8 bits y tres estados, comunica el 8254 con la CPU. La lgica de lectura y escritura acepta entradas del bus y genera seales de control para las partes funcionales del 8254. Las lneas A0..A2 seleccionan uno de los tres contadores o el registro de la palabra de control, para poder leerlos o escribirlos. El registro de la palabra de control es seleccionado Cuando A0=A1=1, este registro slo puede ser escrito (se puede obtener informacin de estado, como se ver ms adelante, con el comando read-back del 8254, no disponible en el 8253). Los contadores 1, 2 y 3 son idnticos en su funcionamiento, por lo que slo se describir uno; son totalmente independientes y cada uno de ellos puede ser programado en una modalidad diferente. OPERACIONES DE ESCRITURA El 8254 es muy flexible a la hora de ser programado. Basta con tener en cuenta dos cosas: por un lado, escribir siempre primero la palabra de control, antes de enviar la cuenta inicial al contador. Por otro, dicha cuenta inicial debe seguir exactamente el formato seleccionado en la palabra de control (enviar slo byte bajo, enviar slo byte alto, o bien enviar ambos consecutivamente). Teniendo en cuenta que cada contador tiene su propio puerto y que la palabra de control indica el contador al que est asociada, no hay que seguir un orden especial a la hora de programar los contadores. Esto significa que, por ejemplo, se puede enviar la palabra de control de cada contador Instituto Tecnolgico de la Laguna Pag. 12

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

seguida de su cuenta inicial, o bien enviar todas las palabras de control para los 3 contadores y despus las 3 cuentas iniciales; tambin es vlida cualquier combinacin intermedia de estas secuencias (por ejemplo: enviar la palabra de control para el contador 0, despus la palabra de control para el contador 1, despus la parte baja de la cuenta para el contador 0, luego la parte baja de la cuenta para el contador 1, la parte alta de la cuenta para el contador 0, etc...). Un nuevo valor de cuenta inicial puede ser almacenado en un contador en cualquier momento, sin que ello afecte al modo en que ha sido programado (el resultado de esta operacin depender del modo, como se ver ms adelante). Si se programa el contador para leer/escribir la cuenta como dos bytes consecutivos (bajo y alto), el sentido comn indica que entre ambos envos/recepciones no conviene transferir el control a una subrutina que utilice ese mismo contador para evitar un resultado incorrecto. OPERACIONES DE LECTURA Existen tres posibles mtodos para leer el valor de un contador en el 8254. El primero es el comando Read-Back, slo disponible en el 8254 (y no en el 8253), como luego veremos. El segundo consiste en leer simplemente el contador accediendo a su puerto correspondiente: este mtodo requiere inhibir la entrada CLK al contador (por ejemplo, a travs de la lnea GATE o utilizando circuitera exterior de apoyo) con objeto de evitar leer la cuenta en medio de un proceso de actualizacin de la misma, lo que dara un resultado incorrecto. El tercer mtodo consiste en el comando de enclavamiento. MODOS DE OPERACIN DEL 8253 8254 MODO 0: Interrupt On Terminal Count (Interrupcin al final de la cuenta). Es empleado tpicamente para contar sucesos. Tras escribir la palabra de control, OUT est inicialmente en estado bajo, y permanecer as hasta que el contador alcance el cero: entonces se pone a 1 y no volver a bajar hasta que se escriba una nueva cuenta o una nueva palabra de control. La entrada GATE puesta a 0 permite inhibir la cuenta, sin afectar a OUT. El contador sigue evolucionando tras llegar a cero (0FFFFh, 0FFFEh, ...) por lo que lecturas posteriores del mismo devuelven valores pseudoaleatorios. Tras escribir la cuenta inicial y la palabra de control en el contador, la cuenta inicial ser cargada en el prximo pulso del reloj conectado (CLK), pulso que no decrementa el contador: para una cuenta inicial N, OUT permanecer a 0 durante N+1 pulsos del reloj tras escribir la cuenta inicial. Si se escribe una nueva cuenta en el contador, ser cargada en el prximo pulso del reloj y el contador comenzar a decrementarse; si se enva una cuenta de dos bytes, el primer byte enviado inhibe la cuenta y OUT es puesto a cero inmediatamente (sin esperar a CLK): tras escribir el segundo byte, la cuenta ser cargada en el siguiente pulso del reloj. Esto permite sincronizar la secuencia de conteo por software. Si se escribe una nueva cuenta mientras GATE=0, sta ser cargada en cualquier caso en el siguiente pulso del reloj: cuando GATE suba, OUT se pondr en alto tras N pulsos del reloj (y no N+1 en este caso). MODO 1: Hardware Retriggerable One-Shot (Monoestable programable). OUT ser inicialmente alta y bajar en el pulso de reloj que sigue al flanco de subida de GATE, permaneciendo en bajo hasta que el contador alcance el cero. Entonces, OUT sube y permanece activo hasta el pulso del reloj que siga al prximo flanco de subida de GATE. Tras escribir la palabra de control y la cuenta inicial, el contador est preparado. Un flanco de subida de GATE provoca la carga del contador (CR -< CE) y que OUT baje en el prximo pulso del reloj, comenzando el pulso OneShot de N ciclos de reloj de duracin; el contador vuelve a ser recargado si se produce un nuevo flanco de subida de GATE, de ah que OUT permanezca en bajo durante N pulsos de reloj tras la ltima vez que suceda esto. El pulso One-Shot puede repetirse sin necesidad de recargar el contador con el mismo valor. GATE no influye directamente en OUT. Si se escribe una nueva cuenta durante un pulso One-Shot, el One-Shot en curso no resulta afectado, a menos, lgicamente, que se produzca un nuevo flanco de subida de GATE: en ese caso, el contador sera recargado con el nuevo valor.

Instituto Tecnolgico de la Laguna

Pag. 13

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

MODO 2: Rate Generator (Generador de ritmo). En este modo, el contador funciona como un divisor por N. Es empleado tpicamente para las interrupciones de los relojes de tiempo real. OUT estar inicialmente en alto. Cuando el contador se decremente hasta el valor 1, OUT pasar a estado bajo durante un pulso del reloj; tras ello, volver a subir y el contador se recargar con la cuenta inicial, repitindose el proceso. Este modo es, por tanto, peridico, y la misma secuencia se repite indefinidamente. Para una cuenta inicial N, la secuencia se repite cada N ciclos de reloj (CLK). Si GATE=0 la cuenta descendiente se detiene: si GATE es bajado durante un pulso de salida, OUT sube inmediatamente. Un flanco de subida en GATE provoca una recarga del contador con el valor de cuenta inicial en el siguiente pulso del reloj (despus, como cabra esperar, OUT bajar tras los N pulsos del reloj correspondientes): GATE puede ser utilizado para sincronizar el contador. Tras escribir la palabra de control y la cuenta inicial, el contador ser cargado en el prximo pulso del reloj: OUT bajar N pulsos de reloj despus, lo que permite tambin una sincronizacin por software. Escribir un nuevo valor de cuenta durante el funcionamiento del contador no afecta a la actual secuencia de cuenta; si se recibe un flanco de subida de GATE antes del final del perodo el contador se recargar con ese nuevo valor de cuenta inicial tras el prximo pulso del reloj y volver a comenzar, en caso contrario se recargar con el nuevo valor tras finalizar con normalidad el ciclo en curso. MODO 3: Square Wave Mode (Generador de onda cuadrada). Este modo es empleado normalmente para la generacin de una seal de onda cuadrada. Este modo es similar al 2, con la diferencia de que la salida OUT conmuta al transcurrir la mitad de la cuenta: inicialmente est en alto, pero al pasar la mitad de la cuenta pasa a estado bajo hasta que la cuenta finaliza. Este modo es tambin peridico: la onda resultante para una cuenta inicial N tiene un perodo de N ciclos. Si GATE=0 la cuenta descendiente se detiene: si GATE es bajado durante un pulso de salida, OUT sube inmediatamente sin esperar ningn CLK. Un flanco de subida en GATE provoca una recarga del contador con el valor de cuenta inicial en el siguiente pulso del reloj: GATE puede ser utilizado para sincronizar el contador. Tras escribir la palabra de control y la cuenta inicial, el contador ser cargado en el prximo pulso del reloj: tambin puede ser sincronizado por software. Escribir un nuevo valor de cuenta durante el funcionamiento del contador no afecta a la actual secuencia de cuenta; si se recibe un flanco de subida de GATE antes del final del medio-perodo el contador se recargar con ese nuevo valor de cuenta inicial tras el prximo pulso del reloj y volver a comenzar, en caso contrario se recargar con el nuevo valor tras finalizar con normalidad el medio-ciclo en curso. Para valores de cuenta impares, la duracin a nivel alto de OUT ser un perodo de reloj mayor que la duracin a nivel bajo. MODO 4: Software Triggered Mode (Pulso Strobe iniciado por software). OUT est en alto al principio; cuando la cuenta inicial expira, OUT baja durante un pulso de reloj y luego vuelve a subir. El proceso se inicia cuando se escribe la cuenta inicial. GATE=0 inhibe el contador y GATE=1 lo habilita; GATE no influye en OUT. Tras escribir la palabra de control y la cuenta inicial, el contador ser cargado en el prximo pulso del reloj: como ese pulso no decrementa el contador, para una cuanta inicial N, OUT no bajar hasta N+1 pulsos de CLK. Si se escribe una nueva cuenta durante el proceso, se cargar en el prximo pulso CLK y continuar el proceso de cuenta con la nueva cuenta escrita; si la cuenta es de 2 bytes, al escribir el primero no se altera el funcionamiento del contador hasta que se enve el segundo. MODO 5: Hardware Triggered Strobe (Pulso Strobe iniciado por hardware). OUT estar en alto al principio: con el flanco de subida de la seal GATE, el contador comienza a decrementar la cuenta. Cuando llega a cero, OUT baja durante un pulso CLK y luego vuelve a subir. Despus de escribir la palabra de control y la cuenta inicial, el contador no ser cargado hasta el pulso de reloj posterior al flanco de subida de GATE. Este pulso CLK no decrementa el contador: por ello, ante una cuenta inicial N, OUT no bajar hasta que pasen N+1 pulsos de reloj. GATE no afecta a OUT. Instituto Tecnolgico de la Laguna Pag. 14

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Libreras

Si una nueva cuenta inicial es escrita durante el proceso, la actual secuencia del contador no ser alterada; si se produce un flanco de subida en GATE antes de que la nueva cuenta sea escrita pero despus de que expire la cuenta actual, el contador ser cargado con la nueva cuenta en el prximo pulso del reloj. EL 8254 EN LA PC Todos los AT y PS/2 llevan instalado un 8254 o algo equivalente; los PC/XT van equipados con un 8253, algo menos verstil; los PS/2 ms avanzados tienen un temporizador con un cuarto contador ligado a la interrupcin no enmascarable, si bien no lo consideraremos aqu. Todos los contadores van conectados a un reloj que oscila a una frecuencia de 1.193.180 ciclos por segundo (casi 1,2 Mhz). La direccin base en el espacio de E/S del ordenador elegida por IBM cuando dise el PC es la 40h. Por tanto, los tres contadores son accedidos, respectivamente, a travs de los puertos 40h, 41h y 42h; la palabra de control se enva al puerto 43h. La seal GATE de los contadores 0 y 1 est siempre a 1; en el contador 2 es seleccionable el nivel de la lnea GATE a travs de bit 0 del puerto E/S 61h. La BIOS programa por defecto el contador 0 en el modo 3 (generador de onda cuadrada) y el contador 1 en el modo 2 (generador de ritmo); el usuario normalmente programa el contador 2 en el modo 2 3. La salida del contador 0 est conectada a IRQ 0 (ligado a la INT 8, que a su vez invoca a INT 1Ch); este contador est programado por defecto con el valor cero (equivalente a 65536), por lo que la cadencia de los pulsos es de 1.193.180/65.536 = 18,2 veces por segundo, valor que determina la precisin del reloj del sistema, ciertamente demasiado baja. Se puede modificar el valor de recarga de este contador en un programa, llamando a la vieja INT 8 cada 1/18,2 segundos para no alterar el funcionamiento normal del ordenador, si bien no es conveniente instalar programas residentes que cambien permanentemente esta especificacin: los programas del usuario esperan encontrarse el temporizador a la habitual y poco til frecuencia de 18,2 interrupciones/segundo. La salida del contador 1 controla el refresco de memoria en todas las mquinas, su valor normal para el divisor es 18; aumentndolo se puede acelerar el funcionamiento del ordenador, con el riesgo -eso s- de un fallo en la memoria, detectado por los chips de paridad -si los hay-, que provoca generalmente el bloqueo del equipo. De todas maneras, en los PC/XT se puede aumentar entre 19 y 1000 sin demasiados riesgos, acelerndose en ocasiones hasta casi un 10% la velocidad de proceso del equipo. En los AT la ganancia de velocidad es mucho menor y adems este es un punto demasiado sensible que conviene no tocar para no correr riesgos, aunque se podra bajar hasta un valor 2-17 para ralentizar el sistema. Sin embargo, no es conveniente alterar esta especificacin porque, como se ver ms adelante, hay un mtodo para realizar retardos (empleado por la BIOS y algunas aplicaciones) que se vera afectado. La salida del contador 2 puede estar conectado al altavoz del ordenador para producir sonido; alternativamente puede emplearse para temporizar. Es el nico contador que queda realmente libre para el usuario, lo que suele dar quebraderos de cabeza a la hora de producir sonido.

TEMPORIZACIONLos contadores 0 y 1, especialmente este ltimo, ya estn ocupados por el sistema; en la prctica el nico disponible es el 2. Este contador ha sido conectado con el doble propsito de temporizar y de generar sonido. Para emplearlo en las temporizaciones, es preciso habilitar la puerta GATE activando el bit 0 del puerto 61h; tambin hay que asegurarse de que la salida del contador no est conectada al altavoz (a menos que se desee msica mientras se cronometra) poniendo a 0 el bit 1 del mismo puerto (61h): IN AL,61h AND AL,11111101b OR AL,00000001b JMP SHORT $+2 OUT 61h,AL ; borrar bit 1 (conexin contador 2 con el altavoz) ; activar bit 0 (lnea GATE del contador 2) ; estado de espera para E/S

Instituto Tecnolgico de la Laguna

Pag. 15

Lenguaje Ensamblador SNTESIS DE SONIDO.

Uso de Procedimientos, Macros y Libreras

La produccin de sonido es uno de los puntos ms dbiles de las computadoras compatibles, que slo superan por muy escaso margen a alguno de los micros legendarios de los 80, si bien las tarjetas de sonido han solventado el problema. Pero aqu nos conformaremos con describir la programacin del altavoz. En todos los PCs existen dos mtodos diferentes para generar sonido, con la utilizacin del 8254 o sin l, que veremos por separado. CONTROL DIRECTO DEL ALTAVOZ El altavoz del ordenador est ligado en todas las mquinas al bit 1 del puerto E/S 61h. Si se hace cambiar este bit (mantenindolo durante cierto tiempo alto y durante cierto tiempo bajo, repitiendo el proceso a gran velocidad) se puede generar una onda cuadrada de sonido. Cuanto ms deprisa se realice el proceso, mayor ser la frecuencia del sonido. Por fortuna, la baja calidad del altavoz del PC redondea la onda cuadrada y produce un sonido algo ms musical de forma involuntaria. No existe, en cualquier caso, control sobre el volumen, que dada la calidad del altavoz tambin est en funcin de la frecuencia. Este mtodo de produccin de sonido tiene varios inconvenientes. Por un lado, la frecuencia con que se hace vibrar al bit que lo produce, si no se tiene mucho cuidado, est a menudo ms o menos ligada a la capacidad de proceso de la computadora: esto significa que el sonido es ms grave en mquinas lentas y ms agudo en las rpidas. Esto es particularmente grave y evidente cuando las temporizaciones se hacen con ciclos de retardo con registros de la CPU: la frecuencia del sonido est totalmente ligado a de la velocidad de la mquina en que se produce. Es por ello que el pitido de error que produce el teclado es a menudo distinto entre computadoras, aunque tengan el mismo teclado instalado. Antes de comenzar a producir el sonido con este mtodo hay que bajar la lnea GATE del 8254, ya que cuando est en alto y se activa tambin el bit 1 del puerto E/S 61h, el temporizador es el encargado de producir el sonido (este es el segundo mtodo, como veremos). Por tanto, es preciso poner primero a cero el bit 0 del mismo puerto (61h): CLI ; evitar posible INT 8, entre otras IN AL,61h AND AL,11111110b JMP SHORT $+2 ; estado de espera para E/S OUT 61h,AL ; bajar GATE del contador 2 del 8254 MOV CX,100h ; 256 vueltas otro_ciclo: PUSH CX IN AL,61h XOR AL,2 ; invertir bit 1 JMP SHORT $+2 OUT 61h,AL MOV CX,300 ; constante de retardo retardo: LOOP retardo POP CX LOOP otro_ciclo STI CONTROL DEL ALTAVOZ MEDIANTE EL TEMPORIZADOR El otro mtodo posible consiste en emplear el contador 2 del temporizador conectado al altavoz; as, enviando el perodo del sonido (1.193.180/frecuencia en Hz) a dicho contador (programado en modo 3), ste se encarga de generar el sonido. Esto permite obtener sonidos idnticos en todos los ordenadores. Existe el pequeo problema de que la duracin del sonido ha de ser mltiplo de 1/18,2 segundos si se desea utilizar el reloj del sistema para determinarla (un bucle de retardo sera, una vez ms, dependiente de la mquina) ya que el contador 2 est ahora ocupado en la produccin de sonido y no se puede usar para temporizar (al menos, no sin hacer malabarismos). Alternativamente, se podra evaluar la velocidad de la CPU para ajustar las constantes de retardo o aumentar la velocidad de la interrupcin peridica. Para emplear este sistema, primero se prepara el contador 2 para temporizar (poniendo a 1 el bit 0 del puerto 61h) y luego se conecta su salida al altavoz (poniendo a 1 el bit 1 del puerto 61h). Al final, conviene borrar ambos bits de nuevo. Ahora no es preciso inhibir las interrupciones para garantizar la calidad del sonido:

Instituto Tecnolgico de la Laguna

Pag. 16

Lenguaje Ensamblador Este diseo esta aplicado en el ;----------------- Macro IniciarBocina--------------iniBoc macro IN AL, 61H