Karoshi MSX Community
06 de Julio de 2021, 12:30:34 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: Problemilla interruptil ;)  (Leído 5770 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« : 17 de Abril de 2007, 09:28:20 pm »

Aquí os dejo una muestra de mi primera experiencia con las interrupciones: un cursor (sprite) que parpadea cada x pasos:

Citar
;----------------------------------------------
PARPADEO:
; Functions to be executed during every V-blank
;----------------------------------------------
; NOTE: all the registers are being PUSHed and
; POPed in this example. Do only PUSH/POP the
; registers affected by the routines to improve
; code speed and size.
;----------------------------------------------
; Disable interrupts
di
; Store all registers into the stack
push af
push bc
push de
push hl
push ix
push iy
; Interruption procedures

   ld   a,[PASOS_CURSOR]
   inc   a
   ld   [PASOS_CURSOR],a
   cp   25
   jp   nz,@@sig1
   ld   hl,6915
   ld   a,1
   call   VPOKE
   jp   @@sig3
@@sig1:
   cp   50
   jp   nz,@@sig3
   xor   a
   ld   [PASOS_CURSOR],a
   ld   hl,6915
   ld   a,8
   call   VPOKE
@@sig3:


; Retrieve all the registers from the stack
pop iy
pop ix
pop hl
pop de
pop bc
pop af
; Enable interrupts
ei
; Return from interruption
ret
;----------------------------------------------

El caso es que desde que lo incluí en el programa tengo "reseteos" de vez en cuando y no se me ocurre otra cosa más que tenga relación con esto. ¿Qué hago mal, plis?  Smiley
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #1 : 17 de Abril de 2007, 09:42:08 pm »

Pues probablemente es debido a que si VPOKE = WRTVRM, al volver de la llamada te encontrarás conque te han habilitado las interrupciones.
LLeva ojo con el código que metas en una interrupción ya que muchas llamadas a la BIOS vuelven con las interrupciones habilitadas. En estos casos y paro no andar habilitando y deshabilitando constantemente lo mejor es hacerlo todo a pelo; así sabrás perfectamente lo que se hace y lo que no se hace  Smiley
En línea

Doom dee doom dee doom
WYZ
Visitante
« Respuesta #2 : 17 de Abril de 2007, 10:14:19 pm »

Prueba esto que dice JL (al que tengo en los altares):


Código:
;----------------------------------------------
PARPADEO:
; Functions to be executed during every V-blank
;----------------------------------------------
; NOTE: all the registers are being PUSHed and
; POPed in this example. Do only PUSH/POP the
; registers affected by the routines to improve
; code speed and size.
;----------------------------------------------
; Disable interrupts
di
; Store all registers into the stack
push af
push bc
push de
push hl
push ix
push iy
; Interruption procedures

   ld   a,[PASOS_CURSOR]
   inc   a
   ld   [PASOS_CURSOR],a
   cp   25
   jp   nz,@@sig1
   ld   hl,6915
   
   call   INIVPOKE
   ld   a,1
   OUT    [$98],A
   jp   @@sig3
@@sig1:
   cp   50
   jp   nz,@@sig3
   xor   a
   ld   [PASOS_CURSOR],a
   ld   hl,6915
   
   call   INIVPOKE
   ld   a,8
   OUT    [$98],A
@@sig3:


; Retrieve all the registers from the stack
pop iy
pop ix
pop hl
pop de
pop bc
pop af
; Enable interrupts
ei
; Return from interruption
ret
;----------------------------------------------

INIVPOKE:       LD      A,L
                OUT     [099H],A
                LD      A,H
                OR      01000000B
                OUT     [099H],A
                RET
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #3 : 17 de Abril de 2007, 10:28:41 pm »

Prueba esto que dice JL (al que tengo en los altares):


Código:
;----------------------------------------------
PARPADEO:
; Functions to be executed during every V-blank
;----------------------------------------------
; NOTE: all the registers are being PUSHed and
; POPed in this example. Do only PUSH/POP the
; registers affected by the routines to improve
; code speed and size.
;----------------------------------------------
; Disable interrupts
di
; Store all registers into the stack
push af
push bc
push de
push hl
push ix
push iy
; Interruption procedures

   ld   a,[PASOS_CURSOR]
   inc   a
   ld   [PASOS_CURSOR],a
   cp   25
   jp   nz,@@sig1
   ld   hl,6915
   
   call   INIVPOKE
   ld   a,1
   OUT    [$98],A
   jp   @@sig3
@@sig1:
   cp   50
   jp   nz,@@sig3
   xor   a
   ld   [PASOS_CURSOR],a
   ld   hl,6915
   
   call   INIVPOKE
   ld   a,8
   OUT    [$98],A
@@sig3:


; Retrieve all the registers from the stack
pop iy
pop ix
pop hl
pop de
pop bc
pop af
; Enable interrupts
ei
; Return from interruption
ret
;----------------------------------------------

INIVPOKE:       LD      A,L
                OUT     [099H],A
                LD      A,H
                OR      01000000B
                OUT     [099H],A
                RET

¡Gracias!
La llamada VPOKE es a la rutina 4dh, no recuerdo si era esa, pero me suena que sí, JL. WYZ, ¿eso de INIVPOKE se supone que es como el VPOKE pero con las interrupciones deshabilitadas?
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #4 : 17 de Abril de 2007, 10:31:05 pm »

Gracias por el consejo de la BIOS, procuraré no usarla en una interrupción.

Por cierto, toda la tela de las MSX-club de que si no se usan rutinas de detección de puertos, que si la compatibilidad, etc. y luego desensamblando la rutina LDIRVM te das cuenta de que usa los puertos 99h y 98h  Tongue
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
WYZ
Visitante
« Respuesta #5 : 17 de Abril de 2007, 10:34:17 pm »

INIVPOKE, al que verás por ahí abajo al scrolear el code, es una rutina para iniciar la escritura en VRAM. Prueba a hace estas cositas que vinen en el PORTAR (tremendo documento), es como tunearse un BIOS.
En línea
SapphiRe
Visitante
« Respuesta #6 : 18 de Abril de 2007, 11:57:11 am »

Por cierto, toda la tela de las MSX-club de que si no se usan rutinas de detección de puertos, que si la compatibilidad, etc. y luego desensamblando la rutina LDIRVM te das cuenta de que usa los puertos 99h y 98h  Tongue

Si, bueno, pero esa rutina está en una BIOS determinada para un ordenador determinado que, con una probabilidad del 100%, tendrá los puertos del VDP en esas direcciones. Si un MSX no tuviera los puertos en esas direcciones, su BIOS tendría las direcciones correspondientes en las rutinas de acceso al VDP.

Los consejos de la MSX-Club están orientados a aquellos que (como yo Tongue) pasan de la BIOS y hacen sus propias rutinas de acceso al VDP. Entonces SÍ es necesario detectar los puertos del VDP.

Un saludo
--
Sph.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #7 : 18 de Abril de 2007, 02:36:55 pm »

Es decir, lo que explica Sap es que la BIOS no tiene porqué leerse a sí misma, porque cada BIOS se adapta para el hardware de la máquina en la que se instala. De algún modo, la BIOS puede estar segura sobre dónde están ubicados los puertos. Sin embargo, los pobres desarrolladores que hacemos software para más de una configuración de hardware deberíamos tener muy en cuenta dichas recomendaciones.

En el libro "MSX TECHNICAL DATABOOK" hay una sección de "errores a evitar". Interesante.
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #8 : 18 de Abril de 2007, 02:42:47 pm »

Le echaré un vistazo a esa sección, gracias. (A ver si hago un pleno al qunice)  Wink
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #9 : 18 de Abril de 2007, 03:06:18 pm »

Y hablando de BIOS, de hecho lo único que hay que respetar cuando se dice aquello de "hay que usar la BIOS" es la tabla de vectores que está al principio, a partir de ahí, como ya se ha comentado, la BIOS puede ser de su padre y de su madre  Tongue

De hecho, un ordenador lo suficientemente parecido (Z80), sólo necesitaria definirse esa tabla de vectores para poder empezar a ejecutar bastante software (que fuese BIOS "friendly" claro) de MSX.

Citar
En el libro "MSX TECHNICAL DATABOOK" hay una sección de "errores a evitar". Interesante.

Me lo apunto para una lectura inmediata... Cheesy

Citar
Prueba esto que dice JL (al que tengo en los altares)

WYZ > Spank <JL en el altar
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #10 : 18 de Abril de 2007, 03:07:32 pm »

Citar
En el libro "MSX TECHNICAL DATABOOK" hay una sección de "errores a evitar". Interesante.

Me lo apunto para una lectura inmediata... Cheesy

Ya somos dos, me lo descargaré en la DS en .txt y lo iré leyendo en el metro Cheesy
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #11 : 18 de Abril de 2007, 04:36:43 pm »

Si tienes una versión en TXT, que rule. Sólo tengo el PDF monstruoso, que no creo que te entre "bien" en la DS. Sad
En línea
SapphiRe
Visitante
« Respuesta #12 : 18 de Abril de 2007, 06:32:35 pm »

Si tienes una versión en TXT, que rule. Sólo tengo el PDF monstruoso, que no creo que te entre "bien" en la DS. Sad

Pues no, creía que era el que tenías en TXT (lo confundí con el Red Book).

En cuanto a lo de que entre o no en la DS... bueno, si el DSOrganize lee PDF's no habría problema, ya que tengo 1GB de almacenamiento... y siempre se pueden partir los PDF en páginas Grin
En línea
WYZ
Visitante
« Respuesta #13 : 18 de Abril de 2007, 09:39:58 pm »


Citar
Prueba esto que dice JL (al que tengo en los altares)

WYZ > Spank <JL en el altar

Vale, vale! no me pegues tanto que ha sido pecado venial. Solo quería tentarlo para que Darth callese al lado oscuro.
Darth, leease usted lo que significan los bytes $0006 y $0007 del offset del BIOS y modifique esos puertos del VDP.

En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #14 : 18 de Abril de 2007, 11:15:23 pm »

¡Pero si yo no quiero tocar nada raro, hombre de Dios!  Grin Gracias y le echaré un vistazo, pero por ahora dejo los experimentos para más tarde. Sólo había cogido la rutina LDIRVM de la BIOS y la había cambiado de forma que en vez de 50 ciclos consumiese 31, pero eso sí, 100% compatible. La cosa es que veo por ahí rutinas que anuncian 16 ciclos y más esa de Robsy de 2,8 Kb (la baba se me cae)  Shocked y me preguntaba qué es lo que las hace tan rápidas, el hecho de sustituir los bucles por OTIRes que ya lo hacen por sí mismos o si había algo más. Bueno, la de Edu supongo que rozará la magia negra, esperemos que algún día caiga, jejejeje Wink
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!