Karoshi MSX Community
05 de Julio de 2021, 03:28:56 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: iniciar una screen sin BIOS  (Leído 3537 veces)
0 Usuarios y 1 Visitante están viendo este tema.
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« : 15 de Enero de 2014, 09:40:49 pm »

Hola compañeros!

Estoy haciendo una libreria de funciones para acceso al TMS9918 desde C y tengo una versión que utiliza la BIOS del MSX y otra que accede directamente al VDP pensando en soft para MSXDOS pero quiero aprovechar para que sirva para poder portar o desarrollar con otras plataformas (colecovision, SG1000, etc...).

Lo único que me falta es la inicialización de un modo de pantalla.
Hace un tiempo, creo que por aquí ley que alguien lo hacia mirando lo que escribe la BIOS en el screen interesado, para luego utilizarlos escribiendo esos valores en los registros.
¿Es correcta esta forma?
¿puede dar algún problema con algún modelo de MSX o en un MSX2 o superior?

Gracias y un saludo!

Estos son los valores de los 6 primeros registros del VDP, que proporciona la configuración de MSX básica del BlueMSX:
Código:
SCRVDPDATA:
.db 0x00,0xF0,0x00,0x00,0x01,0x00,0x00   ;sc0   
.db 0x00,0xE0,0x06,0x80,0x00,0x36,0x07   ;sc1
.db 0x02,0xE0,0x06,0xFF,0x03,0x36,0x07   ;sc2
.db 0x00,0xE8,0x02,0x00,0x00,0x36,0x07   ;sc3
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #1 : 15 de Enero de 2014, 10:58:23 pm »

Funcionará en un MSX1, pero para estar seguro de que también lo hará en un MSX2 o superior creo que tendrías que inicializar también el resto de sus registros del VDP.

Y otra cosa que quizás tengas que tener en cuenta es que la BIOS además de tocar estos registros también prepara la VRAM, por ejemplo si haces un CALL INIGRP (Screen 2), la tabla de nombres de cada tercio se carga con bytes consecutivos (00,01,02...FF), se borran las tablas de nombres y atributos, las de sprites... Cuando programé el emulador que simula la BIOS con rutinas nativas todavía no lo sabía y simplemente modificaba los registros y rellenaba todo de ceros, y algunos juegos se veían rotos porque asumían que había otra cosa en la VRAM.

Pero esto ya depende de cómo tengas enfocada la librería, si quieres que se parezca a la BIOS, quieres que sea rápida y que cada uno se prepara su vram, quieres poner la limpieza en otra función separada...
En línea
Dioniso
Visitante
« Respuesta #2 : 15 de Enero de 2014, 11:51:39 pm »

Efectivamente, Mortimer. Y si haces cosas como screensplit en MSX1 (por ejemplo entre screen 2 y screen 3) el MSX se hace la picha un lío. En según qué casos no basta con cambiar dos o tres registros del VDP.
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #3 : 16 de Enero de 2014, 11:07:13 am »

Veo que es más complicado de lo que pensaba..
De momento lo dejaré haciendo una llamada interslot a la BIOS.

Gracias!
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
Dioniso
Visitante
« Respuesta #4 : 08 de Febrero de 2014, 10:29:30 pm »

Hola de nuevo, aorante.

Tenía pendiente hacer unas pruebas para ver cómo cambiar de SCREEN en cualquier momento. Ya lo tengo.

A ver, puedes cambiar de SCREEN sin problemas del modo que te comento más abajo pero la VRAM la tendrás que inicializar aparte, aunque no es necesario para cambiar de SCREEN. Si no lo haces es como si tuvieras el TILE cero por toda la pantalla o algún resultado aleatorio. Para SCREEN 2, por ejemplo, bastaría con hacer un bucle que escriba tres veces del TILE 0 al 255. Por ejemplo copiar los 256 TILES en RAM y copiarlo tres veces a VRAM. Algo como:

Código:
ld b,0
xor a
ld hl,ram_256bytes
mojoneitor:
ld (hl),a
inc hl
inc a
djnz mojoneitor

Lo de cambiar de SCREEN con los 6 primeros registros del VDP: por supuesto que funciona. A mí me pasa en MSX 1 que si lo hago así, a lo brusco, cuando tengo SCREEN 2 y hago un SCREEN SPLIT y pongo SCREEN 3 cuando el RASTER va por la ordenada 50 y luego espero y cuando el RASTER va por la ordenada 180 le meto otro SCREEN SPLIT y le vuelvo a poner SCREEN 2 pues me sale basura en la pantalla, gráficos corruptos.

El modo correcto sería cambiar el VDP y los valores espejo en RAM:

-El valor que mandas al registro 0 del VDP lo mandas también a la dirección $F3DF en RAM.
-El valor que mandas al registro 1 del VDP lo mandas también a la dirección $F3E0 en RAM.
-El valor que mandas al registro 2 del VDP lo mandas también a la dirección $F3E1 en RAM.
-El valor que mandas al registro 3 del VDP lo mandas también a la dirección $F3E2 en RAM.
-El valor que mandas al registro 4 del VDP lo mandas también a la dirección $F3E3 en RAM.
etc ...

Así podrías hacer algo como lo que te comento arriba.

Espero que te sirva de algo.
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #5 : 09 de Febrero de 2014, 01:10:08 pm »

Gracias Dioniso!  Smiley

Lo que he decidido es hacer una libreria solo para MSX y otra para portar a otros sistemas como colecovision o SG-1000. En esta última es donde tendré que hacer lo que dices, para que la función de inicialización de pantalla, tenga los mismos efectos que la de la BIOS del MSX.
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
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!