Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 3873
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 32 veces
Gracias recibidas: 72 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor jltursan » 25 Jul 2018, 18:55

Y ya puestos, ¿por qué no usar sprites precompilados si lo que se busca es la velocidad apabullante?. Sí, el consumo de memoria se dispara; pero los resultados pueden ser interesantes si se dispone de ella.

Avatar de Usuario
explorer
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 250
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 50 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor explorer » 25 Jul 2018, 19:30

Pero eso te vale para ahorrarte los cálculos de (fondo & máscara or sprite) para todo el ancho del sprite, pero no te ahorras el cálculo del siguiente scanline para pintar la siguiente línea, si el sprite se mueve por toda la pantalla.

Si fuera una disposición completamente lineal, entonces sí que puedes poner una suma constante al final del pintado horizontal para posicionarte en la siguiente línea y seguir pintando, pero el Spectrum... se las trae.

Lo puedes usar en casos especiales... como por ejemplo en sprites que sabes que no se van a mover de su tercio de pantalla o de su fila horizontal. Los típicos enemigos que se mueven horizontalmente, disparos, pintado de fondos...

¿Es a esto a lo que te refieres?

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 3873
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 32 veces
Gracias recibidas: 72 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor jltursan » 25 Jul 2018, 20:57

Sí, el Spectrum no lo pone fácil :(

No concretaba el uso; pero efectivamente, tal como dices, los movimientos limitados a un tercio se beneficiarían de la técnica. Si hay cruce ya no puedes dejar precalculadas las posiciones. Siempre puedes complicar el algoritmo y cuando se efectue el cruce conmutar al mecanismo tradicional. Enrevesado; pero la mayor parte de los movimientos tendrían lugar dentro de un tercio.

La otra brutalidad que he llegado a ver es el empleo del "stack blasting"; pero eso ya es enrevesado de verdad, juraría que por la web vi el código del Cobra, que empleaba la técnica y sigue siendo de lo mejor.

No se que podría salir de la mezcla de ambas técnicas :D

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 620
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 14 veces
Gracias recibidas: 19 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 26 Jul 2018, 17:21

El tema de la disposición de los píxeles en la VRAM la verdad es que está muy muy bien montado, y está con vistas a dibujar en "modo texto" y de manera muy rápida y eficiente: si quieres dibujar un carácter, sólo tienes que incrementar el registro H una vez para cada scanline, y si quieres pasar al siguiente carácter, sólo tienes que incrementar el registro L. Así que para imágenes pequeñas, es decir, que no midan más de 8 filas, este método es ideal.

Pero no sólo eso, sino que ahorra mucha memoria. Téngase en cuén que tenemos 24 filas de 8 scanlines y 32 columnas, es decir:

24 x 8 x 32 = 6144 bytes, o direcciones de memoria a mapear. De esos 3 números, el que no es (2 EXP n) es el 24, por tanto le sobra bits. Así que ese 24, que es 8x3, podemos considerar que es (2 EXP 3) x 3, así que el 3 que no es múltiplo de 2 lo tenemos que meter en la parte más pesada del byte, y es lo que llamamos el tercio de pantalla. Este tercio puede tener 3 valores: 0, 1 ó 2. Por tanto, perdemos sólo una posibilidad, que es el valor 3. Si la pantalla tuviera 4 cuartos, uséase, 32 filas en vez de las 24 filas, otro gallo cantaría.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 620
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 14 veces
Gracias recibidas: 19 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 27 Jul 2018, 11:02

Madredediós... me acabo de releer y qué mal lo he contado, lo que pasa es que es muy difícil de entender si no se acompaña de imágenes y pantallazos, pero vaya, que sus aseguro que la VRAM del Spectrum está optimizada para ahorrar memoria y para agilidad en el modo texto.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 3873
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 32 veces
Gracias recibidas: 72 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor jltursan » 27 Jul 2018, 21:22

Leyendo tu mensaje ya no lo dudo :beer: ;)

Si es para que esté optimizada a la hora de trabajar en modo caracter, de siempre, la del MSX (o de cualquier máquina con el TMS9918 o primo). Si estará bien parida que cuando AMstrad decidió hacer un procesador de textos y dio a luz al PCW, esa fue la arquitectura de pantalla con que lo dotó, exceptuando color, claro.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 620
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 14 veces
Gracias recibidas: 19 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 29 Jul 2018, 01:16

AjAjAJJAjAJAA, pues a ver si va a ser eso, la noche que lo escribí me había zampado 2 pelotazos, pero vaya, lo normal :D
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 620
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 14 veces
Gracias recibidas: 19 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 06 Nov 2018, 01:15

Acabo de encontrar exácticamente el pispo código que el que propuso aquí explorer, es el escrito por el usuario R-Tape en este foro, lo que él llama "nextlinedown":

https://spectrumcomputing.co.uk/forums/ ... t=20#p3000


¿Tú lo pillaste de ahí? Si no, habéis escrito exácticamente la misma sub-rutina :D
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 250
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 50 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor explorer » 06 Nov 2018, 03:50

¡Ostras!, pues sí, ¡son iguales!

Y no, no la copié de ahí, simplemente le estuve pensando un rato cómo optimizarla. Fíjate que hice una primera versión el día 14 de julio y se me ocurrió la "idea feliz" el 16 de julio.

Quizás llegué a la misma solución porque el hardware de vídeo ya te lo condiciona. Quiero decir que con un hardware más versátil, hay más soluciones.

Y no, no es la única solución posible. Lo ideal es que no se hiciesen cálculos. Pero en informática, si no quieres hacer cálculos, los debes hacer antes y guardarlos en memoria. Por ejemplo, en forma de tablas.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 620
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 14 veces
Gracias recibidas: 19 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 06 Nov 2018, 09:58

Pues me parece alucinante que 2 personas por separado hayáis llegado a la mismísima solución, esto me produce la emoción de la sabiduría y la ciencia, jiji. Esto sisnifica que tié que ser así, y que está altamente optimizado :D
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados