Título: iniciar una screen sin BIOS Publicado por: aorante en 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 Título: Re:iniciar una screen sin BIOS Publicado por: Mortimer en 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... Título: Re:iniciar una screen sin BIOS Publicado por: Dioniso en 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.
Título: Re:iniciar una screen sin BIOS Publicado por: aorante en 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! Título: Re:iniciar una screen sin BIOS Publicado por: Dioniso en 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 (http://www.youtube.com/watch?v=7IHfQEAWa8M)como lo que te comento arriba. Espero que te sirva de algo. Título: Re:iniciar una screen sin BIOS Publicado por: aorante en 09 de Febrero de 2014, 01:10:08 pm Gracias Dioniso! :)
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. |