Utilización de interrupciones IM 2

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Utilización de interrupciones IM 2

Notapor Bubu el Mie Dic 26, 2007 4:27 am

Buenas (diosss, son las 3 y cuarto de la madrugada, de la noche de navidad, y yo aquí preguntando por interrupciones en modo 2, estoy mu malito)

Bueno, que resulta que el tema de las interrupciones no lo manejo muy bien que digamos, y me gustaría que me doctaráis un poquito. Veréis, tengo un pogramita que colorea rápida y aleatoriamente cada celda de la pantalla:

Código: Seleccionar todo
org 50000
ld a, 0
ld hl, 0
mas
ld de, 22528
ld bc, 768
ldir
inc a
cp #20
jr nz, sigue
xor a
sigue
ld h, a
ld l,0
jr mas


Me gustaría saber qué he de añadir para que mientras este pograma hace su trabajo, pueda a la vez leer el teclado, y si pulso alguna tecla se cambie el borde de color, p.ej. así:

Código: Seleccionar todo
org 60000 (o ande sea)
jarl
in a, (#FE)
cpl
out (#FE), a
jr jarl


¿Cómo se haría esto con interrupciones? Es decir, ¿cómo se ejecutaría el pograma 1 y que en cada interrupción se llame al pograma 2?
Bubu
Freddy Hardest
 
Mensajes: 544
Registrado: Mie Oct 31, 2007 1:15 am

Re: Utilización de interrupciones IM 2

Notapor mcleod_ideafix el Mie Dic 26, 2007 5:35 am

Código: Seleccionar todo
org 60000 (o ande sea)
jarl
in a, (#FE)
cpl
out (#FE), a
jr jarl


Basicamente tú quieres que esto se haga en cada interrupción, ¿no? Pues nada, lo convertimos a un gestor de interrupciones:
Código: Seleccionar todo
      org 65000
      ld a,253
      ld i,a
      im 2
      ret
      org 65023
      dw interrup

interrup:
      di
      push af
      in a, (#FE)
      cpl
      and #1F
      out (#FE), a
      pop af
      rst #38
      ei
      reti


El código en 65000 se encarga de instalar el gestor de interrupción, que comienza en 65023 (I*256+255). Se desactivan las interrupciones, se guardan los registros afectados (AF en este caso) y se ejecuta tu código. Al final, y para que se pueda seguir usando esta interrupción desde BASIC, llamamos a la antigua interrupción, usando RST #38. Por último, habilitamos interrupciones y volvemos con RETI (RETorno de Interrupción).

Ojo que mientras estés en el editor, no podrás apreciar el efecto que quieres, ya que la ROM restaura el color original del borde al reproducir el "clic" de las teclas.
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3982
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Utilización de interrupciones IM 2

Notapor Bubu el Mie Dic 26, 2007 6:09 pm

Funciona perfestamente, pero con alguna modificación. El byte alto de la dirección se almacena en I, pero el byte bajo es desconocido, por lo que hay que crear una tabla de 256 direcciones, todas la misma, y además con el byte alto y bajo igual:

Código: Seleccionar todo
org 50000

; indico dónde está mi dirección a saltar (en #EAxx)
di
ld a, #EA
ld i, a
im 2
ei

; pograma principal
ld a, 0
ld hl, 0
mas
ld de, 22528
ld bc, 768
ldir
inc a
cp #20
jr nz, sigue
xor a
sigue
ld h, a
ld l,0
jr mas

; aquí almaceno la dirección de mi interrupción (F2F2)
org #EA00
ds 514, #F2


; este es el código a ejecutar en cada interrupción
org #F2F2
di
push af
in a, (#FE)
cpl
out (#FE), a
pop af
ei
reti




¿No hay que gestionar así la interrupción, con 256 veces la dirección, y esta dirección que tenga el byte alto y bajo iguales?
Bubu
Freddy Hardest
 
Mensajes: 544
Registrado: Mie Oct 31, 2007 1:15 am

Re: Utilización de interrupciones IM 2

Notapor Gandulf el Mie Dic 26, 2007 6:45 pm

La forma ultrasegura de hacerlo es esa que tu dices, pero en la práctica puedes asumir que el vector será I*256 + 255. De todas formas si te sobran 256 bytes te haces la tabla y listo. Seguro que lo explica mil veces mejor McLeod, pero en teoría el valor podría ser distinto de 255 si un periférico conectado al bus del spectrum no funcionase de la forma estandar.
Un saludo,

Gandulf
Gandulf
Nonamed
 
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Utilización de interrupciones IM 2

Notapor Bubu el Mie Dic 26, 2007 6:50 pm

Efestiviwonder, si en lugar de una tabla utilizo sólo un vector, también carbura:

Código: Seleccionar todo
org 50000

; indico dónde está mi dirección a saltar (en #EAFF)
di
ld a, #EA
ld i, a
im 2
ei

; pograma principal
ld a, 0
ld hl, 0
mas
ld de, 22528
ld bc, 768
ldir
inc a
cp #20
jr nz, sigue
xor a
sigue
ld h, a
ld l,0
jr mas

; aquí almaceno la dirección de mi interrupción (EB01)
org #EAFF
dw #EB01


; este es el código a ejecutar en cada interrupción
org #EB01
di
push af
in a, (#FE)
cpl
out (#FE), a
pop af
ei
reti


Yo nu sé si será muy común eso de que en lugar de IIFF sea IIxx, pero yo me voy a fiar y voy a utilizar siempre el del vector único, mientras nu se demuestre lo contrario. Así que, gracias a ambos 2. Ahora, ¡¡ a picarrrr !!
Bubu
Freddy Hardest
 
Mensajes: 544
Registrado: Mie Oct 31, 2007 1:15 am

Re: Utilización de interrupciones IM 2

Notapor Bubu el Lun Dic 31, 2007 2:21 am

Ahora me gustaría profundizar un poco más en esto de las interrupciones (toma ya). ¿Cada cuántos t-estados, o segundos, se ejecuta una interrupción?
Bubu
Freddy Hardest
 
Mensajes: 544
Registrado: Mie Oct 31, 2007 1:15 am

Re: Utilización de interrupciones IM 2

Notapor na_th_an el Lun Dic 31, 2007 5:08 am

Una vez por frame, o sea, 50 veces por segundo (cada 20 ms).
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Utilización de interrupciones IM 2

Notapor Metalbrain el Lun Dic 31, 2007 10:16 am

Bubu escribió:Ahora me gustaría profundizar un poco más en esto de las interrupciones (toma ya). ¿Cada cuántos t-estados, o segundos, se ejecuta una interrupción?


En estados, 69888 en un Spectrum 48k y 70908 en un Spectrum 128k.
SevenuP se escribe con u minúscula y P mayúscula.
Avatar de Usuario
Metalbrain
Freddy Hardest
 
Mensajes: 584
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla

Re: Utilización de interrupciones IM 2

Notapor Bubu el Mar Ene 01, 2008 4:52 am

1 por frame, 50 por segundo será en PAL, ¿no? ¿en NTSC igual?
Bueno, como quiera que sea, aquí, en Uropa, 50 veces por segundo es mu rápido. Da tiempo a hacer cositas. A ver qué se me ocurre...
Bubu
Freddy Hardest
 
Mensajes: 544
Registrado: Mie Oct 31, 2007 1:15 am

Re: Utilización de interrupciones IM 2

Notapor na_th_an el Mar Ene 01, 2008 4:51 pm

Que yo sepa, todos los Spectrum son PAL (y como mucho SECAM en Francia) :D
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Utilización de interrupciones IM 2

Notapor mcleod_ideafix el Mar Ene 01, 2008 6:50 pm

Y los Timex 2068? Supongo que NTSC...
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3982
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Utilización de interrupciones IM 2

Notapor na_th_an el Mar Ene 01, 2008 9:57 pm

Si, son NTSC, pero yo hablaba de Spectrum-Spectrum de los de toa la vida. Clones habrá de su padre y de su madre :) Es difícil que un juego de Spectrum funcione tal cual sin modificar en un Timex si no tienes el cartucho de emulación. A fin de cuentas, lo que quería venir a decir es que no es necesario preocuparse de PAL/NTSC cuando se programa para Spectrum (al igual que ocurre si se programa para MSX, por ejemplo), ya que de entrada habría que modificar el juego para hacerlo funcionar en el clon yanki por otras razones.
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Utilización de interrupciones IM 2

Notapor mcleod_ideafix el Mie Ene 02, 2008 12:15 am

Ah! Es que no sabía que Timex 2068 son semi-incompatibles y que necesitan un cartucho de emulación. Tengo un día que encender el que tengo y mirarlo... :D (no lo he encendido por la pereza de buscar un transformador 220V-125V).
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3982
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Utilización de interrupciones IM 2

Notapor na_th_an el Mie Ene 02, 2008 2:32 pm

Son bastante compatibles, pero muchos juegos necesitan adaptarse porque, a saber:

* La ROM es completamente diferente. Por eso es necesario el cartucho de emulación que lo que tiene es una ROM de Spectrum y poco más.
* Los puertos del AY son diferentes a los de un 128K, y creo que además no sirven algunos trucos que juegan con el bus flotante y la decodificación incompleta de los puertos de E/S.
* Cambian algunas variables del sistema.
* Tiene modos gráficos diferentes que ocupan hasta 12Kb, por lo que la zona de BASIC se mueve.

Supongo que si el juego está en CM, no usa la ROM, y reside a partir de $8000 funcionará del tirón. Sin embargo, he visto adaptaciones a Timex de muchos juegos comerciales. Estas versiones no funcionan en un Spectrum real, al igual que las originales no funcionan en un Timex.

http://www.worldofspectrum.org/warajevo ... ml#timtaps

Mira entre los snapshots el Cybernoid, por ejemplo.

¿Tienes un Timex? Podrías intentar convertirlo en un Spectrum SE, que mola un huevo.
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Utilización de interrupciones IM 2

Notapor mcleod_ideafix el Mie Ene 02, 2008 6:09 pm

na_th_an escribió:¿Tienes un Timex? Podrías intentar convertirlo en un Spectrum SE, que mola un huevo.

Psche... no sé, he visto las especificaciones del SE y no es algo que me entusiasme. Aparte, que como sólo tengo uno, no quiero "contaminarlo" con retoques hard. Cuando tenga otro, quizás me anime.
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3982
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Siguiente

Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 1 invitado