Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: aorante en 01 de Junio de 2010, 04:48:03 pm



Título: Detectar VDP V9938
Publicado por: aorante en 01 de Junio de 2010, 04:48:03 pm
Hola compañeros!

Tengo una duda sobre hardware:

Tengo un yamaha MSX1 cx5MII que como el Spectravideo SVI-738, dispone del VDP V9938 de los MSX2.
En el proyecto en el que estoy metido (el PSGed), quiero detectar si es uno de estos ordenadores o un MSX2 (o sup), para cambiar la paleta de colores.

Como puedo detectarlo el tipo de VDP?

Tengo si es un modelo superior a la primera generación y he probado en el yamaha el cambio de paleta y funciona correctamente.

Pongo la rutina por si identificáis algún error o mejora (en formato SDCC):
Código:
void setPalette()
{
__asm

  ld hl,#PALETTE
  xor a
  di
  out (#0x99),a
  ld a,#144
  out (#0x99),a
  ld bc,#0x209A
  otir
  ei
  ret
 
PALETTE:
; RB,G
.db 0x00,0
.db 0x00,0 ; black
.db 0x33,3 ; medium green
.db 0x00,7 ; light green
.db 0x05,0 ; dark blue
.db 0x27,3 ; light blue
.db 0x60,0 ; dark red
.db 0x07,7 ; cyan
.db 0x70,0 ; medium red
.db 0x72,2 ; light red
.db 0x60,6 ; dark yellow
.db 0x74,7 ; light yellow
.db 0x11,6 ; dark green
.db 0x34,0 ; magenta
.db 0x55,5 ; gray
.db 0x77,7 ; white

__endasm;
}




Título: Re: Detectar VDP V9938
Publicado por: mohai en 01 de Julio de 2010, 05:15:16 pm
Si quieres detectar el chip de video que tiene un MSX, creo recordar que simplemente hay que leer un registro (creo que el 0), y uno de los bits te indica si es 9918/9928 o 9938.


Título: Re: Detectar VDP V9938
Publicado por: SapphiRe_MSX en 01 de Julio de 2010, 05:31:09 pm
Si quieres detectar el chip de video que tiene un MSX, creo recordar que simplemente hay que leer un registro (creo que el 0), y uno de los bits te indica si es 9918/9928 o 9938.

Ojalá fuera tan sencillo, pero no.

La diferencia entre el VDP del MSX1 y el del MSX2 es que el del MSX2 tiene más registros, así que lo que se puede hacer es intentar localizar si la BIOS del MSX se dedica a escribir en ellos... Esto es lo que hace, por ejemplo, Ramones en el tutorial de manejo del ratón que publicó hace tiempo por aquí.

Como no tengo tiempo y estoy perro, no tengo ganas de buscarlo aquí, así que os paso el enlace a la web de Konamito donde está: http://www.konamito.com/wp-content/uploads/2009/11/tutorial_armando4.rar


Título: Re: Detectar VDP V9938
Publicado por: aorante en 01 de Julio de 2010, 05:43:30 pm
Gracias Sapphire!

Aprovechando que Ramones estaba en la RU, hablamos del tema y me explico como lo resolvió para el Spectravideo SVI-738.
Es lo que dices tu, de buscar una cadena en la bios, donde se accede a estos registros.
En el caso del Yamaha CX5MII, que yo sepa, solo utiliza el V9938 para permitir las 80 columnas en screen 0.


Título: Re: Detectar VDP V9938
Publicado por: SapphiRe_MSX en 01 de Julio de 2010, 06:36:02 pm
Aprovechando que Ramones estaba en la RU, hablamos del tema y me explico como lo resolvió para el Spectravideo SVI-738.
Es lo que dices tu, de buscar una cadena en la bios, donde se accede a estos registros.

¿No te funciona?

Citar
En el caso del Yamaha CX5MII, que yo sepa, solo utiliza el V9938 para permitir las 80 columnas en screen 0.

Pues deberías buscar la cadena adecuada en tal caso :P


Título: Re: Detectar VDP V9938
Publicado por: aorante en 01 de Julio de 2010, 06:58:09 pm
No me he puesto con este tema, ya que busqué una opción alternativa: un menú de configuración donde se puede indicar la vdp usada (en ambos casos lo que hace es solamente cambiar la paleta).

Lo que no se es como responderá si se toca esta opción en un MSX sin el V9938. En el emulador se ven los sprites ok, pero el resto todo negro  :P

(http://3.bp.blogspot.com/_82S9Tngrad8/TCx2jsUuoCI/AAAAAAAAA3A/Rzm_oadWevA/s320/PSGed_v062a_0.png)


Título: Re: Detectar VDP V9938
Publicado por: Jon_Cortazar en 02 de Julio de 2010, 04:44:01 am
(http://3.bp.blogspot.com/_82S9Tngrad8/TCx2jsUuoCI/AAAAAAAAA3A/Rzm_oadWevA/s320/PSGed_v062a_0.png)

PINTAZA :o


Título: Re: Detectar VDP V9938
Publicado por: pitpan en 02 de Julio de 2010, 11:35:27 am
La solución para detectar si el procesador es superior a un TMS99xx consiste en verificar si la BIOS inicializa registros correspondientes a un V99X8. Si detectamos que es así, entonces puedes llamar directamente a uno de los comandos del VDP y te indicará un número de versión, que será 0 para V9938, 1 para V9958 y así sucesivamente, aunque haya poca sucesión.


Título: Re: Detectar VDP V9938
Publicado por: mohai en 07 de Julio de 2010, 08:01:00 pm
Se me ocurre otra manera, un poquito compleja, pero creo que funcionaría:

Activa el Screen 1.
Activa el bit M4 (Si es TMS9918, no hará nada, si es V99x8, activará el Screen 4).
Alinea 5 sprites en horizontal.
Espera una INT.
Lee el registro de estado 0.
¿Se ha activado el bit de 5º sprite? Si no es así, es V99x8.


Título: Re: Detectar VDP V9938
Publicado por: MsxKun en 07 de Julio de 2010, 08:20:06 pm
¿Se ha activado el bit de 5º sprite? Si no es así, es V99x8.

Pero es que ese bit al final no era 100% fiable...


Título: Re: Detectar VDP V9938
Publicado por: aorante en 07 de Julio de 2010, 09:41:34 pm
@mohai, el sistema me parece muy lioso, pero es muy ingenioso!!  :)
a lo mejor hay una forma más sencilla utilizando tu idea...
Gracias por el esfuerzo!


Título: Re: Detectar VDP V9938
Publicado por: mohai en 09 de Julio de 2010, 01:08:59 pm
¿Se ha activado el bit de 5º sprite? Si no es así, es V99x8.

Pero es que ese bit al final no era 100% fiable...
Ese bit no es exacto si intentas leerlo sin esperar al refresco de pantalla, por eso digo lo de esperar una INTerrupcion.


Título: Re: Detectar VDP V9938
Publicado por: mohai en 09 de Julio de 2010, 01:15:05 pm
¿Se ha activado el bit de 5º sprite? Si no es así, es V99x8.

Pero es que ese bit al final no era 100% fiable...
Ese bit no es exacto si intentas leerlo sin esperar al refresco de pantalla, por eso digo lo de esperar una INTerrupcion.

Gracias!
Se me ocurrió de repente.

Ahora mismo se me ocurre otra forma, usando el BIOS: Poner el modo 80 columnas (ignoro si el BIOS, aunque sea un MSX 1 lo soportaría...). Si devuelve un error, no hay V9938.

Seguro que hay otras maneras: Leer algún registro de estado del V9938 (se colgaría si es TMS9918?), intentar leer/escribir en una zona de VRAM mas allá de las 16 K, escribir/leer en los registros de de paleta ...

Desde luego la manera más fácil es leer el BIOS, pero en el caso de los Yamaha y Spectravídeos sin modificar, el BIOS dice que es MSX1. En estos casos sólo habría que contar con 16K de VRAM.


Título: Re: Detectar VDP V9938
Publicado por: aorante en 09 de Julio de 2010, 01:31:50 pm
Esto de las 80 columnas tiene muy buena pinta...
En el caso del Yamaha, desde basic si pone a 80 columnas funciona, pero como se hace en asm?


Título: Re: Detectar VDP V9938
Publicado por: MsxKun en 09 de Julio de 2010, 02:17:44 pm
¿Se ha activado el bit de 5º sprite? Si no es así, es V99x8.

Pero es que ese bit al final no era 100% fiable...
Ese bit no es exacto si intentas leerlo sin esperar al refresco de pantalla, por eso digo lo de esperar una INTerrupcion.

Es que aun asi creo recordar que Armando comento algo al respecto, que el se habia hecho una rutina de rotacion de sprites con ello y acabo descubriendo que no era siempre fiable... El topic deberia andar por aqui, a ver si lo encuentro...


Título: Re: Detectar VDP V9938
Publicado por: aorante en 26 de Noviembre de 2010, 02:40:20 pm
hace unos días que encontré este topic en los foros del MRC sobre el tema de la detección del VDP. NYYRIKKI da una forma de detectar varios VDP (V9938, TMS99XX y V9958)

http://es.msx.org/forumtopic10770.html


Título: Re: Detectar VDP V9938
Publicado por: aorante en 02 de Diciembre de 2010, 04:29:46 pm
Los que desarrolléis en SDCC la función (en ASM) quedaría así:

La función es una evolución de la desarrollada por marq de Lieves!Tuore (http://www.kameli.net/lt/) en su librería para desarrollo en SDCC para MSX y la dada por Nyyrikki en el foro de la MRC.
Lieves!Tuore es un grupo demoscene de MSX de Finlandia. 

/
Código:
/ identifica el tipo de VDP (6=TMS99XX. 0=V9938, 4=V9958)
char getVdp(void) // Thanks to Nyyrikki
{
__asm
  ; Read status register 1
di
ld A,#1
out (0x99),A
ld A,#0x8F
out (0x99),A
in A,(0x99)
push AF
xor A
out (0x99),A
ld A,#0x8f
out (0x99),A
pop AF
ei

; Return VDP number
and #0b00000110 ;110

ld L,A ; VDP number in register A

__endasm;


Título: Re: Detectar VDP V9938
Publicado por: Sd-Snatcher en 02 de Diciembre de 2010, 11:25:33 pm
¿Y la libreria SDCC de Lieves!Tuore donde se puede encontrar?


Título: Re: Detectar VDP V9938
Publicado por: aorante en 03 de Diciembre de 2010, 12:31:50 am
en la web del grupo, en varios de sus proyectos, ponen los fuentes que incluyen la librería, como en la demo Atsaas:
http://www.kameli.net/lt/prod.htm
http://www.kameli.net/lt/devel.html


Título: Re: Detectar VDP V9938
Publicado por: Sd-Snatcher en 03 de Diciembre de 2010, 01:03:37 am
Muchas gracias.