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

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Utilización de interrupciones IM 2

Mensaje por Bubu » Mié Dic 26, 2007 3: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?

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Utilización de interrupciones IM 2

Mensaje por mcleod_ideafix » Mié Dic 26, 2007 4: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

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: Utilización de interrupciones IM 2

Mensaje por Bubu » Mié Dic 26, 2007 5: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?

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

Re: Utilización de interrupciones IM 2

Mensaje por Gandulf » Mié Dic 26, 2007 5: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

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: Utilización de interrupciones IM 2

Mensaje por Bubu » Mié Dic 26, 2007 5: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: Mié Oct 31, 2007 12:15 am

Re: Utilización de interrupciones IM 2

Mensaje por Bubu » Lun Dic 31, 2007 1: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?

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

Mensaje por na_th_an » Lun Dic 31, 2007 4:08 am

Una vez por frame, o sea, 50 veces por segundo (cada 20 ms).

Avatar de Usuario
Metalbrain
Freddy Hardest
Mensajes: 592
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla
Contactar:

Re: Utilización de interrupciones IM 2

Mensaje por Metalbrain » Lun Dic 31, 2007 9: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.

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: Utilización de interrupciones IM 2

Mensaje por Bubu » Mar Ene 01, 2008 3: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...

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

Mensaje por na_th_an » Mar Ene 01, 2008 3:51 pm

Que yo sepa, todos los Spectrum son PAL (y como mucho SECAM en Francia) :D

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Utilización de interrupciones IM 2

Mensaje por mcleod_ideafix » Mar Ene 01, 2008 5:50 pm

Y los Timex 2068? Supongo que NTSC...
Web: ZX Projects | Twitter: @zxprojects

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

Mensaje por na_th_an » Mar Ene 01, 2008 8: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
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Utilización de interrupciones IM 2

Mensaje por mcleod_ideafix » Mar Ene 01, 2008 11:15 pm

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
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

Mensaje por na_th_an » Mié Ene 02, 2008 1: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
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Utilización de interrupciones IM 2

Mensaje por mcleod_ideafix » Mié Ene 02, 2008 5: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

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados