Karoshi MSX Community
05 de Julio de 2021, 03:31:47 pm *
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]
  Imprimir  
Autor Tema: Modificar la BIOS  (Leído 6045 veces)
0 Usuarios y 1 Visitante están viendo este tema.
SapphiRe
Visitante
« : 06 de Abril de 2006, 12:36:51 pm »

Esta noche (como de costumbre) he estado despierto un buen rato y una de las paranoias que se me han ocurrido ha sido la siguiente:

Supongamos por un momento que tenemos un ordenador con RAM en la página 0 de algún slot. Supongamos, también, que copiamos la BIOS a esa página y ejecutamos el siguiente código:

Código:
       di
       ld a,$C9
       ld [$0038],a (vamos, que desactivamos la rutina de las interrupciones de la BIOS)
       IM 1
       ei
       ret

Es más, tendríamos también un buffer de, al menos, 2kb's en la zona donde la BIOS guarda la tabla de caracteres... suponiendo, claro, que no la vayamos a utilizar.

Teniendo un poco de cuidado y asegurándonos de no escribir nada más en esta "BIOS modificada" la preguntas son:

-¿Tenemos todas las funcionalidades de las llamadas a la BIOS?
-¿Habría algún problema con las interrupciones? ¿Ganaríamos mucho tiempo?
-¿Alguien se anima a probarlo?
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #1 : 06 de Abril de 2006, 01:25:24 pm »

Jeje, pues no es tal paranoia. O mucho me equivoco o la estructura del The Cure y del U:U se deben de parecer bastante, la diferencia radicará en que ellos no habrán copiado la BIOS sobre la RAM de la página 0, sino que se habrán limitado a implementar su propio servicio de interrupciones en $38.
Si quieres aprovechar la BIOS; pues haces lo que dices, y deberías poder trabajar perfectamente con ella. Como es lógico, perderás todo lo que hacía el servicio de interrupciones original; pero seguro que el resultado vale la pena.
Respecto al tiempo que ganarías; pues no es mucho, porque el gancho que se suele usar, el $FD9F, creo que no tiene antes tareas muy pesadas; pero seguro que te ahorras un par de lineas de barrido.
Y ante la duda, ya sabes, IM2  Grin

En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #2 : 06 de Abril de 2006, 01:56:49 pm »

Vale, reformulo la pregunta: y si NO usas nunca el gancho en $FD9F y sincronizas siempre con HALT's, ¿ganarías mucho? ¿Son muy pesadas las tareas que se hacen en la interrupción?
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #3 : 06 de Abril de 2006, 03:39:52 pm »

No creo que sean muy pesadas, pero desde luego hacen muchas cosas que no nos sirven a los desarrolladores de juegos... No quiero ni lectura del buffer de teclado! Viva el joystick, larga vida al teclado de mi MSX!
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #4 : 06 de Abril de 2006, 05:13:03 pm »

Citar
y si NO usas nunca el gancho en $FD9F y sincronizas siempre con HALT's, ¿ganarías mucho?

Puesssss, nada. Aunque no uses el gancho, la interrupción se va a seguir ejecutando. Las únicas soluciones son la que tú has comentado antes, parchear FD9A, pasar a modo IM2 o usar DI (en este último caso HALT no funcionaría muy bien Tongue)
Y como dice Robsy; pues no son demasiado pesadas, no; pero claro, la mayoría en un juego no se aprovechan para nada y no está la interrupción como para desperdiciar ciclos. No hablemos de cosas como que al toquetearte el registro de estado del VDP, te lo ponen a cero y te ves obligado a hacer chapucillas si tienes que andar detectando colisiones de sprites, 5 sprites en linea y cosas así. Angry
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #5 : 09 de Abril de 2006, 04:31:45 pm »

Hola de nuevo:

  He estado haciendo unas cuantas pruebecillas con las interrupciones (sí, he logrado que el ordenador se cuelgue de muy diversas formas) y al final he plasmado los resultados en forma de snippet. ¡Se ganan unas 16 líneas del raster!

Echadle un vistazo y ya me comentáis
--
SapphiRe
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #6 : 09 de Abril de 2006, 05:40:05 pm »

Aaaah, ahora sí, te ha quedado de lujo Sapph Wink.

Por si alguien necesita utilizar interrupciones mediante el gancho en FD9F (que ya no funcionará) se puede implementar un servicio personal añadiendo el código que necesitemos al principio de la misma rutina FD9APATCHCODE. Hay que llevar cuidado ya que esta rutina se invocará cada vez que haya una interrupción, no sólo la del VDP; por lo que si queremos conseguir una periodicidad en nuestra rutina de 1/50 o 1/60 deberemos comprobar antes que se trata de la interrupción del VDP y si es así ejecutar nuestro código.

Otra cosa, ¿en tus investigaciones has encontrado algo acerca de la obligatoriedad de la lectura del puerto de direcciones del VDP (in a,($99))?, es por si se puede eliminar de la interrupción... Huh

¡Buen trabajo!
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #7 : 09 de Abril de 2006, 06:08:15 pm »

Aaaah, ahora sí, te ha quedado de lujo Sapph Wink.

Gracias! Cheesy

Citar
Por si alguien necesita utilizar interrupciones mediante el gancho en FD9F (que ya no funcionará) se puede implementar un servicio personal añadiendo el código que necesitemos al principio de la misma rutina FD9APATCHCODE. Hay que llevar cuidado ya que esta rutina se invocará cada vez que haya una interrupción, no sólo la del VDP; por lo que si queremos conseguir una periodicidad en nuestra rutina de 1/50 o 1/60 deberemos comprobar antes que se trata de la interrupción del VDP y si es así ejecutar nuestro código.

Sí, eso lo hace la propia rutina de la BIOS, tiene un JP P tras el in a,[$99] que si no se ejecuta ya pasa al servicio de interrupción del VDP. De todas formas mi idea era eliminar la rutina de todo. He añadido un comentario en el snippet para activar nuevamente el gancho en FD9F... o donde se quiera, claro está Cheesy

¿Puedes poner un ejemplo de interrupción no generada por el VDP?

Citar
Otra cosa, ¿en tus investigaciones has encontrado algo acerca de la obligatoriedad de la lectura del puerto de direcciones del VDP (in a,($99))?, es por si se puede eliminar de la interrupción... Huh

Si prescindía de esta instrucción se saltaba siempre a 0038 al volver a activar las interrupciones. Al añadirlo no ha habido ningún problema.

Un saludo
--
SapphiRe
« Última modificación: 09 de Abril de 2006, 06:22:20 pm por SapphiRe » En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #8 : 09 de Abril de 2006, 06:28:04 pm »

Citar
¿Puedes poner un ejemplo de interrupción no generada por el VDP?

A poco que tengas un MSX vitaminado son la mayoría Grin. Por ejemplo, las de las tarjetas de sonido como la MoonSound o el propio interface MIDI, periféricos como el RS232, en fin, supongo que casi cualquier periférico va a generar sus propias interrupciones con la periodicidad que el componente imponga.

No he mirado el código en $38; pero supongo que la rutina de la BIOS pasará a ejecutar el gancho en FD9F cuando haya comprobado previamente que esa interrupción si que es una del VDP, comprobando el valor del bit 7 del registro de estado del VDP. Si no se trata de una interrupción del VDP se pondrá con otras cosas o acabará, no se lo que hace en realidad.

Citar
Si prescindía de esta instrucción se saltaba siempre a 0038 al volver a activar las interrupciones. Al añadirlo no ha habido ningún problema.

Que curioso...
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #9 : 09 de Abril de 2006, 06:38:00 pm »

No he mirado el código en $38; pero supongo que la rutina de la BIOS pasará a ejecutar el gancho en FD9F cuando haya comprobado previamente que esa interrupción si que es una del VDP, comprobando el valor del bit 7 del registro de estado del VDP. Si no se trata de una interrupción del VDP se pondrá con otras cosas o acabará, no se lo que hace en realidad.

Pues actualiza unas cuantas cosillas en la RAM. Lo suficiente como para que se desperdicien unas 16 líneas de raster en cada vblank.

Citar
Citar
Si prescindía de esta instrucción se saltaba siempre a 0038 al volver a activar las interrupciones. Al añadirlo no ha habido ningún problema.

Que curioso...

No es tan curioso, es la forma de resetear ese bit de interrupción: al leer el registro de estado del vdp se resetea el bit de interrupción. Si no se lee no se resetea y, al salir de la rutina, la interrupción vuelve a dispararse y se repite otra vez todo el proceso. El resultado es un bonito cuelgue Cheesy
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #10 : 09 de Abril de 2006, 06:42:52 pm »

 Grin

Ahora mismo se me había ocurrido la explicación y entraba para autocontestarme.... Tongue

Claro, si no lo pones a cero, la BIOS supone que el VDP está en un estado de perpetua excitación y se mete en un bucle sin fin Undecided. Una pena, habrá que seguir utilizando el DI/EI al hacer según que cosas con el VDP.
En línea

Doom dee doom dee doom
Páginas: [1]
  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!