010:software

No renderer 'odt' found for mode 'odt'

Microhobby 10. Año II, del 8 al 14 de enero de 1985

Tal vez hayamos leído en alguna revista o libro, o alquien nos ha comentado algo sobre las «interrupciones». Pero, ¿qué es eso?; ¿para qué sirve? y sobre todo ¿cómo se utilizan las interrupciones?

En primer lugar hay que explicar cuál es el concepto de interrupción y para ello nada mejor que un ejemplo:

Supongamos que está sentado frente a su Spectrum programado (o más posiblemente jugando a alguno de los juegos que esta revista publica) y, en ese momento se oye una voz que nos grita desde el pasillo: ¡La cena está lista!

Entonces nosotros atenderemos la «interrupción», es decir, cenaremos, y muy posiblemente, seguiremos luego con nuestra tarea, ¡si no nos «desconectan», claro!

Pues bien, el Z-80 puede atender a tareas que reclaman su atención, ejecutarlas y luego seguir con lo que estaba haciendo antes. Y esto es lo que hace nuestro Spectrum cuando por ejemplo, lee el teclado: cincuenta veces por segundo, el ordenador para lo que esté haciendo, luego lee el teclado y aumenta en uno el conjunto de tres bytes formado por la variable del sistema FRAMES y, después sigue ejecutando el programa interrumpido.

El Z-80 dispone de dos tipos de interrupciones: una enmascarable y otra no enmascarable. Cada una de estas interrupciones está asociada con una «patita» del Z-80. Una interrupción enmascarable es aquella que se puede desactivar o activar a voluntad del programador y esto se hace con las instrucciones DI y EI respectivamente. Es decir, si en medio de un programa se pone la instrucción DI, a partir de ese momento no se atenderán las llamadas producidas por la activación de la «patita» correspondiente. Las interrupciones volverán a atenderse cuando se ejecute la instrucción EI. Una interrupción no enmascarable se atenderá siempre que se active. A partir de ahora, sólo tomaremos en cuenta las interrupciones enmascarables, que son las únicas que se pueden utilizar con el Spectrum.

El Z-80 tiene tres modos de ejecutar las interrupciones de las cuales el Spectrum sólo nos permite utilizar dos, estos modos se conmutan entre sí con las instrucciones IM1 y IM2.

El Spectrum está normalmente en el modo 1. En este modo siempre se ejecuta una instrucción de RST 38. Es decir, como cada cincuentavo de segundo se produce una interrupción, esto hace que siempre se ejecute un salto a la rutina en ROM que comienza en la dirección 0038h., y es esta rutina la que se encarga de leer el teclado y de actualizar FRAMES.

Veamos cómo se utiliza el modo 2. En este caso lo primero que hace el Z-80 es formar una dirección con el registro I y con los datos que, en ese momento, estén presentes en el bus de datos. En el caso del Spectrum este último byte tendrá siempe el valor FFh en ese momento. Luego, el Z-80 irá a esa dirección, formará una nueva dirección con el contenido de esos dos bytes consecutivos y comenzará a ejecutar el programa a partir de dicha dirección. Por ejemplo:

  • El registro I contiene el valor FEh.
  • La dirección FEFFh tiene D0h
  • La dirección FF00h tiene 4Ah

El Z-80 ejecutaría un salto a la dirección 4AD0h y retornaría al programa interrumpido, cuando se encuentre con la instrucción RETI (Retorno desde interrupción).

Veamos un ejemplo de utilización del sistema de interrupciones en el Spectrum. El programa permite tener un reloj en la esquina superior derecha y la ventaja de hacerlo usando las interrupciones es que nos permite estar realizando otra tarea mientras el reloj funciona independientemente. De todas formas hay que hacer notar que el reloj se parará con aquellos programas que desactiven las interrupciones, como por ejemplo, las rutinas de LOAD y SAVE, pero el reloj continuará después de terminada estas rutinas. Otra «pega» es que si hacemos NEW deberemos volver a inicializar el reloj haciendo RANDOMIZE USR 65517.

Las direcciones que interesan son:

  • 65426d …… Aquí se almacenan los segundos.
  • 65427d …… Minutos.
  • 65428d …… Horas.

Haciendo POKE en estas direcciones pondremos en hora el reloj. El reloj comenzará a marchar cuando se ejecute el programa almacenado en la dirección 65517 (rutina de activación).

Este es el listado del programa BASIC que carga todo el programa: K y Enter.

Listado ASM

  • 010/software.txt
  • Última modificación: d/m/Y H:i
  • por miguel