010:software

¡Esta es una revisión vieja del documento!


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:

DIR.	¡CODIGO	¡LISTADO		
			ORG FEFF	
FEFF	01 FF	DIR-OM	DEFW FF01	¡Dirección de
				comienzo
FFO!	F3	COMIENZO DI		
	F5		PUSH AF	¡Guarda registros
	E5		PUSH HL	
	D5		PUSH DE	
	C5		PUSH BC	
	21 91 FF		LD HL, TIME	¡Actualizar 1/50'avos
				de
	34		INC (HL)	¡segundo
	3E32		LD A,32	¡Si no se ha llegado
				a 50
	BE		CP (HL)	¡ir a la rutina de
				impresión
	20 1B		JR NZJMP	
	36 00		LD (HL),00	¡Poner 1/50'avos a
				cero
	23		INC HL	¡Sumar un segundo
	34		INC (HL)	
	3E 3C		LD A,3C	¡Si no se ha llegado
				a 60
	BE		CP (HL)	¡saltar a la rutina de
	2012		JR NZJMP	¡impresión
	36 00		LD (HL),00	¡Poner segundos a
				cero
	23		INC HL	
	34		INC (HL)	¡Sumar un minuto
	BE		CP (HL)	¡Si no se ha llegado
				a 60 ir
	20 OB		JR NZJMP	¡a la rutina de
				impresión
	36 00		LD (HL),00	¡poner minutos a
				cero
	23		INC HL	¡Sumar una hora
	34		INC (HL)	
	3E 18		LD A,18	¡Si no se llegado a
				24 horas
	BE		CP (HL)	¡saltar a la impresión
	20 02		JR NZJMP	
	36 00		LD (HL),00	¡Poner horas a cero
FF2A	21 94 FF	IMP	LD HLJIME+3	¡Cargar HL con la di-
				rección de las horas
	3E 17		LD A,17	¡Cargar XPOS con la
				posión
	32 90 FF		LD (XPOS),A	¡donde se imprimirá
				el
				¡primer caracter
	E5		PUSH HL	¡Llamada a la rutina
				de imprimir
	CD 52 FF		CALL COS	¡el contenido de HL
	3EOA		LD A,OA	¡Impresión del signo
	CD 6A FF			
			CALL CHR	
	E1		POP HL	
	2B		DEC HL	¡Llevar a HL la
				dirección
				¡de los minutos
	E5		PUSH HL	
	CD 52 FF		CALL COS	¡Imprimir el contenido
				de HL
	3EOA		LD A,OA	¡Imprimir •':"
	CD 6A FF		CALL CHR	
	E1		POP HL	
	2B		DEC HL	»Llevar a HL la direc-
				ción de los segundos
	CD 52 FF		CALL COS	
	C1		POP BC	»Restaurar el conteni-
				do de los
	D1		POP DE	¡registros
	E1		POP HL	
	F1		OPO AF	
	FF		RST38	¡Rutina ROM de lec-
				tura del
				¡teclado
	ED 4D		RETI	¡Retorno desde
FF52	E5			interrupción
		eos	PUSH HL	¡Esta rutina primero
				para el
				¡número binario con-
				tenido en
				¡HL a un número en
				BCD, también
				¡contenido en HL
MICROHOBBY 23
 
DIR.	IC0DIG0	¡LISTADO		
	7E		LD A, (HL)	
	26 FF		LD H,FF	Carga H con —1
FF56	24	R10	INC H	¡Cálculo del dígito en
				BCD
	D6 0A		SUB OA	¡más significativo
	30 FB		JR NC,R10	
	C6 0A		ADD A, OA	
	6F		LD L,A	¡Almacena el resto
				en L
	7C		LD A,H	
	E5		PUSH HL	
	CD 6A FF		CALL CHR	¡Imprime el contenido
				de H
	E1		POP HL	
	7D		LD A,L	
	CD 6A FF		CALL CHR	¡Imprime el contenido
				de L
	E1		POP HL	
	C9		RET	
FF6A	07	CHR	RLCA	»Multiplica por 8 el
				contenido
	07		RLCA	¡del acumulador
	07		RLCA	
	21 95 FF		LD HL,CARO	¡Cálculo de la
				dirección
	16 00		LD D,00	¡del primer byte del
	5F		LD E,A	¡carácter a imprimir y
				almacenar
	19		ADD HL,DE	»en DE
	E5		PUSH HL	
	D1		POP DE	
	3A 90 FF		LD A,(XPOS)	¡Cálculo de la direc-
				ción de
	6F		LD L,A	¡atributos
	26 58		LD H.58	
	36 38		LD (HL),38	¡Poner INK negro y
				PAPER blanco
	26 40		LD H,40	
	06 08		LD B,8	¡Colocación de 8
				bytes consecutivos
FF82	1A	ET1	LD A,(DE)	¡a partir de DE en la
	77		LD (HL),A	¡pantalla
	24		INC H	
	13		INC DE	
	10 Fa		DJNZ ET1	
	3A 90 FF		LD A,(XPOS)	¡Increntar la posición del
	3C		INCA	¡carácter a imprimir a
	32 90 FF		LD (XPOS),A	¡continuación en uno
	C9		RET	
FF90	00	XPOS	DEFB 00	¡Dirección de pantalla
				¡se imprimirá el
				próximo
				¡carácter
FF91	00 00 00 00	TIME	DEFB 00 00 00 00	¡Variables del tiempo
FF95	7C BA C6 C6	CARO	DEFB 7C BA C6 C6	¡Definición de los
	C6 C6 BA 7C		C6 C6 BA 7C	¡caracteres
	02 06 06 02	CAR1	DEFB 02 06 06 02	
	02 06 06 02		02 06 06 02	
	7C 3A 06 7A	CAR2	DEFB 7C 3A 06 7A	
	BC CO B8 7C		BC CO B8 7C	
	7C 3A 06 3A	CAR3	DEFB 7C 3A 06 3A	
	7A 06 3A 7C		7A 06 3A 7C	
	82 C6 C6 BA	CAR4	DEFB 82 C6 C6 BA	
	7A 06 06 02		7A 06 06 02	
	7C D8 CO BC	CAR5	DEFB 7C D8 CO BC	
	7A 06 3A 7C		7A 06 3A 7C	
	7C B8 CO BC	CAR6	DEFB 7C B8 CO BC	
	BA C6 BA 7C		BA C6 BA 7C	
	7C 3A 06 06	CAR7	DEFB 7C 3A 06 06	
	02 06 06 02		02 06 06 02	
	7C BA C6 BA	CAR8	DEFB 7C BA C6 BA	
	BA C6 BA 7C		BA C6 BA 7C	
	7C BA C6 BA	CAR9	DEFB 7C BA C6 BA	
	7A 06 3A 7C		7A 06 3A 7C	
	00 18 18 00	CARD	DEFB 00 18 18 00	
	00 18 18 00		00 18 18 00	
FFED	3E FE	ACTIVA	LD A,FE	¡Rutina de Activación
	ED 47		LD l,A	¡Carga I con la
				dirección
				¡de la interrupción
	ED 5E		IM 2	¡Modo de interrup-
				ción 2
	C9		RET	
  • 010/software.1291048132.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel