CODINGAMSTRAD SEMANAL ★ REJOJ POR INTERRUPCIONES ★

Rejoj por interrupciones
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Todos sabemos que nuestro Amstrad es capaz de generar interrupciones, pero por lo general no todos conocen su funcionamiento. En este artículo realizaremos una aproximación a este interesante asunto, utilizando un tema ya casi más tópico que clásico: la implementación de un reloj al que hemos incluido, como novedad, nada más y nada menos que cinco alarmas.

Desde el momento en que encendemos nuestro Amstrad, el microprocesador empieza a ejecutar un programa escrito en lenguaje Máquina, contenido en la ROM, que es el que nos permite acceder al lenguaje Basic y, por lo tanto, trabajar con el ordenador.

Además, el microprocesador se encarga de detener este programa principal a intervalos regulares, marcados por el reloj interno, para realizar una serie de tareas secundarias como pueden ser leer el teclado, controlar el sonido, manejar el parpadeo de los colores en la pantalla, etc.

A este proceso de interrumpir un programa principal, para ejecutar una rutina secundaria a intervalos regulares, se le denomina Interrupción.

El programa principal puede ser tanto un programa realizado en Basic como uno en Código Máquina. La única diferencia entre ambos tipos es la elevada velocidad con que se ejecutan las interrupciones en Código Máquina, dándonos la sensación de que en realidad se están ejecutando varias tareas a la vez.

A la vez que ejetutamos nuestros programas, disponemos de un reloj ton cinto alarmas programables

Cuando se genera una interrupción, el proceso principal se abandona temporalmente, guardando todas sus variables, y se pasa a realizar las tareas secundarias. Cuando éstas hayan finalizado, se reanuda la ejecución de la tarea principal en el punto donde se había dejado.

Desde el Basic se pueden generar interrupciones mediante los comandos Every o/y After, pero tienen el inconveniente de que sólo se ejecutan cuando corremos el programa, al contrario que desde el lenguaje Máquina, en el que a partir de que las activemos se estarán ejecutando hasta que realicemos la operación contraria.

Un ejemplo muy claro de cómo funcionan las interrupciones es creando un reloj en la pantalla totalmente independiente del programa que resida en memoria; también se puede encontrar otro ejemplo en el programa publicado en esta misma revista, en el número 95, que servía para crear un buffer de impresora.

Con este programa, además de disponer de un reloj tenemos acceso a cinco alarmas programables.

El manejo es muy sencillo, gracias a la creación de una única RSX que controla todas las acciones del reloj.

Para poner en marcha y en hora el reloj, basta con la orden:

lRELOJ,h,m

en la que «h» es la hora del día, que debe estar comprendida entre 1 y 24, y «m» son los minutos, que estarán entre 0 y 59. Es muy importante que ambos parámetros se ajusten a estos valores, ya que la rutina no comprueba si los valores que se le dan son admisibles o no. Si al poner en funcionamiento el reloj nos hemos equivocado en algo, para corregirlo basta con volver a ejecutar la misma orden corrigiendo el valor erróneo.

Así se gestionan las interrupciones

Para crear una interrupción desde Código Máquina se pueden utilizar las facilidades que nos ofrece el sistema operativo del Amstrad. Lo primero que tenemos que hacer es crear la interrupción mediante la llamada: CALL &BCEF que necesita los siguientes parámetros en los registros: En HL hay una zona de siete bytes que sirven para la gestión interna de la interrupción, que contiene el tipo de interrupción así como una dirección de referencia.

El B contiene la clase del suceso, este byte está compuesto por los siguientes parámetros:

BIT 0. Si vale cero quiere decir que pertenece a una ROM del sistema. Si vale uno, que la rutina se encuentra en la RAM.

BIT 1,4. Estos tres bits sólo sirven para sucesos y son indiferentes para las interrupciones.

BIT 5. Siempre hay que ponerlo con valor cero.

BIT 6. Para una interrupción urgente se pone a uno y si vale cero quiere decir que es normal.

BIT 7. Si está a uno es una interrupción y si vale cero es un suceso.

En C tenemos que poner el número de la ROM sí la rutina está en ROM, en el caso de que esté en la RAM no es necesario dar ningún valor.

El DE contiene la dirección de entrada de la interrupción que se va a ejecutar.

Una vez que hemos creado la interrupción hay que avisar al sistema para que ejecute la rutina, esto se realiza mediante otra llamada: CALL &BCE9 que necesita los siguiente parámetros:

En HL la dirección de un almacenamiento de seis bytes para el trabajo interno de la rutina.

El BC contiene la recarga de la cuenta; es decir, el tiempo en cincuentavos de segundo con la que se va a repetir la interrupción.

En DE está la cuenta inicial, que al igual que en BC está en cincuentavos de segundo, y marca el tiempo que ha de transcurrir desde que hagamos la llamada hasta que se ejecute la interrupción por primera vez.

Si deseamos que la interrupción no se vuelva a ejecutar tenemos que hacer la siguiente llamada: CALL &BCEC que necesita los siguientes parámetros:

El HL debe contener la dirección del almacenamiento de seis bytes facilitados en la rutina anterior.

En cuanto se ha ejecutado esta orden, la interrupción ya no se vuelve a ejecutar más, a no ser que la activemos nuevamente.

Cuando se ejecuta una interrupción, el sistema operativo se encarga de preservar todos los registros para poder continuar, cuando ésta finalice, con el programa principal. También hay que tener en cuenta que si una interrupción dura excesivamente, se puede acumular más trabajo que el que puede realizar el microprocesador, y se puede producir una pérdida del control de la máquina.

Hay que destacar que mientras se usa el disco o el cassette el servicio de interrupciones se cancela temporalmente, por lo que el reloj que os presentamos a continuación se puede retrasar, eso sí, muy ligeramente al usar el disco y descaradamente al utilizar la cinta.

Desde este instante el reloj está funcionando, y para comprobarlo bastaría con ejecutar:

|RELOJ

con lo que obtendremos en la pantalla el valor de la hora y los minutos.

En el caso de que le interese localizar la salida del reloj a una misma coordenada de la pantalla, basta con teclear:

LOCATE x,y:|RELOJ

y el reloj aparecerá en las coordenadas x, y de la ventana número siete; en el caso de que esta ventana no esté definida, las coordenadas serán las correspondientes al total de la pantalla.

Para que el reloj desaparezca de la pantalla hay que volver a teclear la orden:

|RELOJ

Para programar una de las cinco alarmas de las que disponemos, basta con ejecutar un:

|RELOJ, al, h ,m

donde «al» puede tomar los valores del 0 al 4, uno para cada alarma, y «h» y «m» son las horas y minutos a las que queremos que nos avise.

Para «h» y «m» valen las mismas normas que para el caso de poner en hora el reloj, con la única diferencia de que si «h» toma el valor cero, esa alarma se desactiva. Para corregir una alarma sirve esta misma orden, como en el caso de poner en marcha el reloj.

Cuando el reloj llega a una alarma cambia el color del borde de la pantalla a blanco y hace sonar un «beep», esperando a que desactivemos la alarma al pulsar la tecla Control. A partir de ahora ésta queda desactivada, y se puede utilizar para otra alarma.

Cómo cargar el Reloj.

Copiar el programa cargador y ejecutarlo, en el caso de que no aparezcan errores se procede a salvarlo con la siguiente orden:

SAVE ‘‘RELOJ'',B,&A000,&186

Para ver su funcionamiento deberemos cargarlo en memoria de la siguiente forma:

MEMORY &9FFF:LOAD''reloj.bin'',&A000

y después hacer:

CALL &A000

para tener disponibles las RSX.

Para los más curiosos ofrecemos a continuación el listado del programa desensamblado, del que estamos seguros sacarán un buen partido.

AS

★ PUBLISHERS: Hobby Press , Amstrad Semanal
★ YEAR: 1987
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: AMSTRAD SEMANAL 1987
★ AUTOR: Alberto Suñer
 



★ AMSTRAD CPC ★ DOWNLOAD ★
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.74-desktop/c
Page créée en 747 millisecondes et consultée 79 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.