Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: e_sedes en 24 de Marzo de 2009, 07:18:46 pm



Título: LDIRVM desde DOS
Publicado por: e_sedes en 24 de Marzo de 2009, 07:18:46 pm
Pues eso, que he empezado a trastear un poco con el DOS y encuentro problemas con esta rutina. Uso la función 001Ch del DOS y va bien con otras referidas al VDP, como CHGMOD, FILVRM, WRTVDP, INIGRP o WRTVRM, por ejemplo. Todas van como debieran. Pero a la hora de usar LDIRVM la cosa no chuta. Pasa la cantidad de bytes indicada al sitio indicado, pero lo que pasa no tiene nada que ver con la fuente.  ??? ¿Hay que tener algo en cuenta en especial con esta rutina?

Estoy usando AsMSX y probando en el BlueMSX, tanto MSX1 como MSX2.

un saludo.


Título: Re: LDIRVM desde DOS
Publicado por: pitpan en 24 de Marzo de 2009, 08:37:20 pm
Te doy una pista: ¿verdad que los datos que tienes que copiar están por debajo de la posición 4000h de memoria? Ten en cuenta que cuando activas con una llamada la rutina LDIRVM, la página 0 (0000h-3FFFh) apunta al slot 0-0 (o el que corresponda) con las 16 KB de BIOS.

Resumo el chorizo de arriba: estás copiando el contenido de la BIOS a VRAM y no los datos que tú quieres. ¿Cómo solucionarlo? Pasar los datos a copiar a una posición por encima de 4000h con un LDIR de forma previa y después llamar a LDIRVM tal y como lo vienes haciendo.

A mi también me pasó en su momento :(


Título: Re: LDIRVM desde DOS
Publicado por: SapphiRe_MSX en 24 de Marzo de 2009, 10:21:49 pm
A mi también me pasó en su momento :(

y a mí... ;D ;D


Título: Re: LDIRVM desde DOS
Publicado por: e_sedes en 24 de Marzo de 2009, 11:39:09 pm
Ostras! Pues es verdad! Ya me podía yo comer el tarro que no me daba cuenta. Con lo obvio que parece, jeje. Gracias!


Título: Re: LDIRVM desde DOS
Publicado por: pitpan en 25 de Marzo de 2009, 09:22:18 am
Son las típicas cosas que te dejan pegado al ordenador durante horas tratando de depurar un error inexistente. Y al descubrir uno la solución, el pensamiento que se te enciende con luces de neón en plena meninge es: "DUH!".

De todos modos, muy bien si ya has aprendido a usar las llamadas de la BIOS desde MSX-DOS a través de CALSLT. Aunque si no recuerdo mal, el asMSX tiene una macro para hacer todo el proceso (LD IY,[EXPTBL]; LD IX,RUTINA; CALL CALSLT) de una vez. A mi me costó lo mío llegar hasta aquí ;)

Y sigo sin usar MSX-DOS :(

Insisto: el peor proceso de depuración al que me he sometido fue durante el desarrollo del GRIEL'S QUEST. Forzaba un modo mixto (!) y ponía el bit que indica en los registros del VDP si están instaladas 4 o 16 KB. Como los valores a escribir en los registros los había copiado, no entré en su análisis, y buscaba escrituras espurias a VRAM. Lo que sucedía era que la VRAM superior a 1000h no era refrescada y al cabo de un tiempo, se degradaba su contenido, por lo que los gráficos se corrompían de forma continuada incluso sin escribir ni un byte a VRAM. Fueron muchas horas las que perdí hasta que me di cuenta. Además, para hacerlo fácil, en muchos MSX sí que funcionaba bien porque la VDP ignoraba este bit (clónicos del TMS, todos los V99xx, etc.).


Título: Re: LDIRVM desde DOS
Publicado por: j4mk3 en 25 de Marzo de 2009, 12:26:36 pm
Como newbie de Karoshi no acabo de entender como e_sedes usa esas rutinas:

Cuando arranco en modo MSX-DOS, tengo los 64ks de RAM, el programa empieza en 0100h. Eso es dirección de primeros bytes, osea pilla en la pagina 0. Si dentro de mi codigo cambio la pagina 0 al slot 0, para tener la BIOS y acceder a sus rutinas,...¿ no deberia colgarse mi programa ya que el PC esta indicando una posición de pagina 0 ?
Seguramente entienda mal las llamadas a BIOS des de DOS  ???


Título: Re: LDIRVM desde DOS
Publicado por: pitpan en 25 de Marzo de 2009, 12:32:06 pm
Las llamadas inter-slot (interslot calls) gestionan todo esto. Es decir, hay una función de MSX-DOS que se ocupa de gestionar la llamada y el retorno al estado original. Evidentemente, si desde un código en página 0 se cambia "a pelo" el slot de la misma página, el resultado no será bueno.
Pero en el caso de una llamada inter-slot, el propio sistema operativo se encarga de tomar las medidas necesarias para devolver la ejecución al punto adecuado del programa una vez restituida la página oportuna.

Si no he sido suficientemente claro, plantéame un ejemplo y lo diseccionaremos aquí entre todos para aclarar los conceptos.


Título: Re: LDIRVM desde DOS
Publicado por: SapphiRe_MSX en 25 de Marzo de 2009, 12:58:27 pm
Evidentemente, si desde un código en página 0 se cambia "a pelo" el slot de la misma página, el resultado no será bueno.

Pues yo cambio "a pelo" el contenido de la página 1 (un mapper de cartucho, no el slot) desde la propia página 1 y funciona perfectamente... Con eso quiero decir que se puede hacer ese tipo de cambios, pero que hay que tener MUCHO cuidado con lo que se hace... no es recomendable.

Por si tenéis curiosidad, me refiero a esto: http://z80st-software.blogspot.com/2008/12/48k-lineales-en-el-cartucho-flash-de.html


Título: Re: LDIRVM desde DOS
Publicado por: j4mk3 en 25 de Marzo de 2009, 04:15:50 pm
Me he leido tu articulo...
Y mi nivel hace que aún entienda solo la mitad de lo q leo :) Pero estoy contento de saber de lo q hablar que ya es mucho para mi.

Me tengo q mirar eso de las llamardas interslot a ver q tal, que aunque aun no se cuanto va a ocupar la produccion que tenemos entremanos, mejor estar prevenido por si hay q "switchear" paginas por falta de espacio.

Y volviendo al tema : ¿ Siempre LDIRVM coge los bytes del mismo slot donde esté la BIOS ?
lo pregunto por esta frase de pitpan :
"...apunta al slot 0-0 (o el que corresponda) con las 16 KB de BIOS." Pero esto no me parece posible, porque según tengo entendido la BIOS y la RAM no están en el mismo slot. La Bios es 0 y la RAM es 1 o otro no ?

Quizas parece q no me he leido los tutoriales del tema que hay en el foro de desarrollo, pero os doy fe que si  ::) quizas estoy un poco empanao y aun no veo la luz al final del camino.


Título: Re: LDIRVM desde DOS
Publicado por: SapphiRe_MSX en 25 de Marzo de 2009, 04:27:20 pm
Y volviendo al tema : ¿ Siempre LDIRVM coge los bytes del mismo slot donde esté la BIOS ?

No. LDIRVM coge los bytes de la memoria tal y como esté en el momento de llamar a la rutina, sin tocar para lada los slots.

Citar
lo pregunto por esta frase de pitpan :
"...apunta al slot 0-0 (o el que corresponda) con las 16 KB de BIOS." Pero esto no me parece posible, porque según tengo entendido la BIOS y la RAM no están en el mismo slot. La Bios es 0 y la RAM es 1 o otro no ?

Claro. Cuando haces una llamada inter-slot a la BIOS, la BIOS se pone en su sitio (slot 0-0 en la página 0) y luego si llamas a LDIRVM, tendrás la página 0 posicionada ahí. A eso se refería Pitpan.


Título: Re: LDIRVM desde DOS
Publicado por: e_sedes en 26 de Marzo de 2009, 12:54:06 am
De todos modos, muy bien si ya has aprendido a usar las llamadas de la BIOS desde MSX-DOS a través de CALSLT. Aunque si no recuerdo mal, el asMSX tiene una macro para hacer todo el proceso (LD IY,[EXPTBL]; LD IX,RUTINA; CALL CALSLT) de una vez. A mi me costó lo mío llegar hasta aquí ;)
Pues si, uso .CALLBIOS del asMSX  ;)
Pues yo cambio "a pelo" el contenido de la página 1 (un mapper de cartucho, no el slot) desde la propia página 1 y funciona perfectamente... Con eso quiero decir que se puede hacer ese tipo de cambios, pero que hay que tener MUCHO cuidado con lo que se hace... no es recomendable.
Si es que os va el vicio cosa mala  ;D ;)


Título: Re: LDIRVM desde DOS
Publicado por: pitpan en 26 de Marzo de 2009, 09:57:39 am
Resumo muy rápido:

LDIRVM sólo puede leer de la memoria visible al procesador. Si estamos ejecutando LDIRVM, eso quiere decir que en la página 0 (0000h-3FFFh) tenemos la BIOS. Por lo tanto, los datos a copiar deberán encontrarse siempre en las páginas 1 a 3 (4000h-FFFFh), salvo que queramos copiar parte de la BIOS a VRAM. En realidad, esto último no es tan extraño, porque nos podría interesar copiar el juego de caracteres de la BIOS, que se encuentra almacenado en la misma BIOS ;)

Otro apunte: aunque no es lo habitual, en algunos ordenadores, BIOS y RAM están en un mismo slot, aunque, evidentemente, en páginas diferentes. Por ejemplo, el extrañísimo Pioneer PX7 tiene en 0-0 la BIOS, en 0-1 el BASIC, y en 0-2 y 0-3 RAM. En 1-1 tiene una extensión del BASIC para hacer algunos efectos en plan PowerPoint básicos. Y los slots 2 y 3 asignados a las ranuras de cartucho. Efectivamente, se trata de un pedazo de ordenador que incomprensiblemente viene con sólo 32 KB de RAM :(


Título: Re: LDIRVM desde DOS
Publicado por: k0ga en 13 de Abril de 2009, 08:36:44 pm
A mi también me pasó en su momento :(

y a mí... ;D ;D


A mi lo que me paso fue poner el codigo de la irq en la pagina 0 xD