¿Dónde se almacenan los sprites hardware?

Pagina 1/2
| 2

Door AxelStone

Prophet (2703)

afbeelding van AxelStone

14-01-2015, 19:49

Buena señores, otra pregunta: ¿dónde se almacenan los sprites hardware? Supongo que en la VRAM pero ¿cómo se lo que están ocupando y cuánto tengo disponible aún para definir sprites?

Es que con los sprites software es fácil, se meten en páginas de VRAM y cada página es un tilesheet, así es fácil saber si he llenado o no la página, pero con sprites hardware no tengo claro cuándo he "llenado la página" y en qué página está.

Hablamos de Basic / turbo Basic. Gracias!

Aangemeld of registreer om reacties te plaatsen

Van Warchild

Paragon (1271)

afbeelding van Warchild

14-01-2015, 21:53

AxelStone, yo lo primero me miraría la documentación disponible, que es muy completa. Será donde encuentres la información exacta (por ejemplo, en este caso la posición de los sprites depende del modo de pantalla). Estoy seguro de que en cuanto le eches un vistazo a cómo funciona la vram y cómo se distribuye la memoria según el modo, lo tendrás más claro.
Igualmente con los sprites. El patrón de un sprite de 16x16 son 32 bytes. En MSX2 tienen un color por línea, que son 16 bytes para cada uno... todas estas cosas (registros, comandos del VDP...) las podrás ver en varios documentos que hablan de la VRAM. The Red Book, el MSX Top Secret... hay varios y vale la pena leerlos enteros (luego lo que uno entienda y lo que no, es otra cosa, pero así al menos todo te suena y sabrás donde está la info). También en internet hay info, yo para consultas más rápidas hasta MSX2 miro aquí:

http://problemkaputt.de/portar.htm

Van AxelStone

Prophet (2703)

afbeelding van AxelStone

15-01-2015, 08:20

Si tiene pinta que debo pararme a leer un poco, más que nada como dices para que todo me suente y hacerme una idea mejor de cómo funciona todo por dentro. Imagino que la página de hanssoten es una buena parada, me he bajado más de una cosilla de allí.

Hagamos una pausa con el Turbo Basic y leamos un poquillo. Gracias.

Van AxelStone

Prophet (2703)

afbeelding van AxelStone

29-02-2016, 13:20

Refloto este hilo, me hará falta para lo que ando tramando. Si mal no recuerdo alguien del foro consiguió hacer un "backup" de los sprites (copiar su zona de VRAM). ¿Podría refrescarnos la memoria? Smile Gracias.

P.D.: no he dicho nada, estoy leyendo la documentación y creo que lo entiendo.

Van Kai Magazine

Paragon (1303)

afbeelding van Kai Magazine

29-02-2016, 18:51

Axel, yo estoy en la misma tesitura. Me estoy peleando para aprender a manejar los sprites de hardware mas allá de sus posibilidades habituales.
Se algunas cosillas basicas, y algunos conceptos, pero estoy lejos de dominarlo bien.
Se que los sprites en basic, de serie se almacenan debajo de la linea 211, de la 212 a la 255, en cada pagina.
De serie puedes tener 32 patrones definidos, pero aquellos que dominan los sprites de hardware (como artrag y daemos) redefinen esos 32 patrones en tiempo real a super velocidad, haciendo uso del equivalente en ASM del comando BASE.
El comando BASE es el que define en que posicion de la vram empiezan los patrones de los sprites.
Lo que hacen estos genios es, tener varios grupos de patrones cargados en la vram, y redefinirlos instantaneamente con el comando BASE (bueno, su equivalente en ASM).
Estoy trasteando para ver si logro hacer lo mismo desde turbo basic, y tener chorrocientos fotogramas de sprites en memoria (fijate en la nave del uridium de msx2, usa esa tecnica. Basicamente lo se porque me lo explicó Artrag).
Se puede guardar y cargar la zona donde se almacenan los sprites usando el comando Bsave "sprites.sc5",s seguido de la coordenada de inicio y final de la vram que quieres almacenar, y haces un bload"",s para cargarlos. Si los tienes todos juntitos y apiladitos, haces un BASE y te cambian todas las definiciones de sprites instantaneamente. Tambien puedes hacer un copy (de la zona de fotogramas extra, a la zona de sprites activa definida por el comando BASE), no es tan rapido pero te permite seleccionar que sprites quieres redefinir, en lugar de redefinirlos todos.
Lo que me falta es saber las coordenadas de inicio y final exactas (en screen 5, por ejemplo), porque en la zona oculta de la pantalla almacena otros datos como la paleta de colores...
Te agradeceria que fueramos intercambiando avances acerca de los sprites de Hardware, ya que pregunté hace unas semanas en el foro ingles acerca de lo mismo, y la respuesta fué la misma tambien...
Yo lo que necesito es un listado de ejemplo usando estas funciones arriba descritas, para poder hacer un shooter con scroll suave en msx2, y a partir de ahí puedo avanzar.
Ya he intentado estudiarme toda la arquitectura del msx y intentar entender algo y no lo pillo, no es lo mio. Lo mio es hacer videojuegos. Dame los comandos adecuados, y te hago los videojuegos, pero no me hagais re-descubrir cosas que ya hace años que estan inventadas... Es una perdida para todos...

Van AxelStone

Prophet (2703)

afbeelding van AxelStone

01-03-2016, 13:07

Justo por eso pregunto Kai, como nos paremos en lo básico estamos muertos. La idea es precisamente lo que hacen Daemos y ARTRAG (parece que al final todos pensamos lo mismo), de lo contrario te quedas sin patrones enseguida, 32 patrones son muy pocos. Yo estoy siguiendo la documentación técnica del V9938, échale un ojo por si ayuda.

Por desgracia lo de "dame los comandos" no es tan simple, lo tengo comprobado. Al final cada uno tiene necesidades más o menos propias y acabas haciendo rutinas justamente eso, propias. A día de hoy ya he tenido que picarme en MSX-C el equivalente a BLOAD y otros comandos que en BASIC ya tenía, pero qué le vamos a hacer Question .

Me daré una vuelta por el foro inglés a ver lo que dicen los gurús. Gracias.

Van Guillian

Prophet (3235)

afbeelding van Guillian

01-03-2016, 15:23

Si necesitáis muchos sprites distintos podéis hacer dos cosas:
- Cambiar el "puntero" del VDP a la tabla de patrones de sprites modificando el R#6 del VDP
- Copiar/actualizar los patrones de los sprites que necesitéis cambiar, haciendo un "copy" o una transferencia de datos a la VRAM.

Si necesitáis cambiar muchos sprites de golpe, la primera opción es la más recomendable. Ganas en velocidad, pero pierdes espacio en la VRAM. Este fue el sistema que usé en el Sonyc para poder hacer todas las animaciones y movimientos del personaje.

Si solo necesitáis cambiar unos pocos sprites, con una transferencia de datos os podría valer. Pero como estáis redefiniendo varios sprites en tiempo de ejecución, tenéis que tener cuidado cuándo lo hacéis y cuánto tarda, porque si os pilla el pintado de la pantalla el sprite saldría "raro".

Otra cosa a tener en cuenta es que al cambiar la forma del sprite posiblemente también tendréis que cambiar la tabla de colores. Esta tabla no tiene un puntero propio, sino que viene fijada por la posición de la tabla de atributos. Yo esto lo hacía con un "copy" si mal no recuerdo (tendría que mirar lo detalles, pues han pasado 20 años ^^!)

Van Kai Magazine

Paragon (1303)

afbeelding van Kai Magazine

01-03-2016, 15:45

Muchas gracias Manuel, como siempre, estas al pie del cañon para ayudar Smile
Como bien sabes, las direcciones de memoria (hardware) y yo no nos llevamos bien, y por mucho que me leo la documentacion oficial, no lo pillo...
Me sería de enorme ayuda algun listado simple de ejemplo, con algunos rems de documentacion. Nada, 10 lineas. A partir de aqui si que puedo trastear y extrapolar, pero si no se por donde empezar, me puedo pasar dias/semanas/meses leyendo y experimentando y es un tiempo que puedo invertir mejor en desarrollar...cuando otros ya lo sabeis "del tiron".
A eso me referia cuando pedia ayuda.
Entiendo que han pasado 20 años y que te puede llevar unas horas refrescarlo, pero si lo pudieses hacer te lo agradecería mucho (a mi me puede llevar meses y al final ni siquiera conseguirlo).
Me encantaría hacer un juego estilo Gradius 3 con SCC y efectos sampleados y voces. El scroll suave ya lo tengo, asi como todo lo demas. Lo he intentado con sprites por software pero es un desastre. Tienen que ser sprites de HW si o si.
Tengo musicas, graficos, medio motor... Lo que me faltan son los sprites por HW.
Todos podemos salir ganando: yo por conseguirlo al fin, tu por los cartuchos que me tendrás que vender, otros desarrolladores por poder experimentar con esta tecnica, y el resto de la comunidad por tener un juego nuevo.
Se que estas super liado, pero veo que eres el unico que puede/quiere ayudar (por eso te hago chantaje emocional y presion social en este mensaje Evil que mala leche tengo) pero es una espina que tengo clavada hace tropecientos años y ver la luz al final del tunel me da nuevas esperanzas.
Asi que;
por favor? porfa porfa porfa...

Van AxelStone

Prophet (2703)

afbeelding van AxelStone

01-03-2016, 18:43

Gracias Manuel yo había pensado en la 2da opción ya que es actualización selectiva, si muevo el puntero tendría que cambiar todos los sprites. Experimento un poco y ya cuento resultados. Wink

Van Guillian

Prophet (3235)

afbeelding van Guillian

01-03-2016, 21:11

Eso es, con la primera opción se cambian todos los sprites de golpe. Por lo tanto habría que tener repetidos los que sean comunes en todos los bancos.

Un ejemplo simple para ver como funciona el cambio de dirección de la tabla de patrones de los sprites:

10 SCREEN 5,2
20 S=BASE(29)
30 FOR I=0 TO 31
40 READ R$
50 D=VAL("&H"+R$)
60 VPOKE S+I,D
70 VPOKE 0+I,D XOR 255
71 VPOKE &H800+I,RND(1)*255
80 NEXT
90 PUT SPRITE 0,(100,100),15,0
100 A$=INPUT$(1)
110 VDP(6)=0
120 A$=INPUT$(1)
122 VDP(6)=1
123 A$=INPUT$(1)
130 DATA 00,00,0F,38,40,C0,9E,BC,B8,C0,61,30,0C,03,00,00
140 DATA 00,00,C0,38,0C,02,62,72,36,04,CC,08,08,F0,00,00

BASE(29) nos da la dirección en la que se encuentran por defecto en SCRENN 5 (#7800)
En la línea 60 defino el sprite en la tabla actual
En la 70 defino el sprite invertido pero en la dirección #0000 de la VRAM (equivalente al banco o bloque de sprites 0)
En la 71 defino un sprite al azar en la dirección #0800 (banco/bloque 1)
En la 90 pongo el sprite
En la 110 cambio la dirección de la tabla y la pongo en #0000, donde está el sprite invertido.
En la 122 la pongo en #0800, donde está el sprite aleatorio.

El R#6 permite fijar los bits A16-A11 de la tabla de patrones de los prites. Por eso va en bloques de #800 bytes.

Van Kai Magazine

Paragon (1303)

afbeelding van Kai Magazine

01-03-2016, 21:25

BRUTAL!
Muchas gracias Manuel!
Si no fuera porque me tengo que levantar a las 7 de la mañana me pasaría la noche experimentando Tongue

Eres un crack!
Gracias!!

Pagina 1/2
| 2