Página 1 de 3

ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 08:03
por oscarbraindead
Hola a todos,
a colación del hilo que hizo Bubu sobre cómo crear los laberintos del Berzerk; me dio la tontuna y me puse a probar a hacer algo parecido a Berzerk en Spectrum. No sé programar en ensamblador y, como lo quiero escribir directamente en el spectrum (en el zxuno) no puedo usar Z88dk. He hecho alguna prueba y el pintado en pantalla, a base de PRINT AT, es lento. Muy lento. Hace la torta de años me pareció leer que se podía escribir en pantalla con POKE (moviendo valores directamente a la memoria de video, supongo). He bicheado por internet y no he visto cómo escribir un UDG o un carácter normal. Por ejemplo escribir una X en una fila/columna determinada... una especie de PRINT AT con POKE, que supongo que será más rápido... ¿Se puede hacer? ¿Alguna pista?

Muchas gracias!
Saludos.

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 09:37
por Bubu
¡Buen día, oscarbraindead!

Lo que vas a hacer es muy chuli y me encantaría verlo evolucionar. Bueno, dices que PRINT AT es muy leeeeento, pero es porque... ¡¡todo en BASIC es leeeeento!! Y no, no hay ninguna forma de hacer un POKE y que te escriba direstamente en pantalla un dibujo o GDU. Y es que la pantalla del Spectrum no está basada en tilesets, sino en scanlines, quiere decir esto que para pintar un carácter o GDU en Spectrum hay que meter en memoria una a una las 8 scanlines, sí o sí. Pero p.ej. en Gameboy tú metes el número 25 en la VRAM, y ya te dibuja el dibujo nº 25, porque antes has definido en otra zona de memoria que el 25 es tal dibujo.

En fins, que no hay manera. De todas formas yo creo que dibujar el laberinto es bastante rápido en BASIC, ¿nor? ¿o lo que tú quieres hacer es el juego completo y que el personaje y los robots se desplacen al píxel?

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 11:17
por chernandezba
Si sólo vas a usar basic, lo mas rápido sin lugar a dudas, es el print, no hay mas que eso
Si pretendes escribir en pantalla en basic mediante pokes, va ser horriblemente lento
Supongo que sabes que tienes unos cuantos udg definibles (desde la letra A a la U) si no recuerdo mal, que te permite crear tus propios gráficos de 8x8 para usar con Print.
Luego ten en cuenta que las lineas de programa en basic se ejecutan siempre mas rápido las primeras que las últimas, básicamente porque para saltar a una línea concreta tiene que seguir una a una, todas las anteriores, hasta llegar a la indicada. Por tanto esos print , para que vayan lo mas rápido posible, es conveniente meterlos en las primeras lineas del basic

Incluso sin dejar de usar basic, podrías utilizar alguno de los compiladores de basic que te compilan a código máquina, como el de Hisoft:
http://www.worldofspectrum.org/infoseek ... id=0008249

Esto te permite acelerar tu programa entre 3 o 4 veces mas rápido, para que te hagas una idea, pero lógicamente depende del tipo de programa, se podrá optimizar y acelerar mas o no.

Estas pruebas tuyas me recuerdan a muchos de nosotros hace años, empezando a conocer el Spectrum y aprender Basic. Pero luego te dabas cuenta que el basic tiene limitaciones (de velocidad, principalmente) que hacía que acabases aprendiendo assembler para superar esas limitaciones, cosa que te recomiendo.... ;)

Saludos

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 11:56
por Bubu
Esta parte no la entiendo yo:

chernandezba escribió:Luego ten en cuenta que las lineas de programa en basic se ejecutan siempre mas rápido las primeras que las últimas, básicamente porque para saltar a una línea concreta tiene que seguir una a una, todas las anteriores, hasta llegar a la indicada. Por tanto esos print , para que vayan lo mas rápido posible, es conveniente meterlos en las primeras lineas del basic



Eso es como decir que un coche que va a 100Km/h recorre más rápido el 1er kilómetro que el 2º. No, lo que hace es que lo recorre antes, pero no más rápido, ¿nor?

oscarbraindead, ¿tú lo que quieres hacer en BASIC es sólo dibujar los laberintos, o hacer el juego entero? Si es el laberinto solamente, PRINT te irá de lujo. Si es el juego entero, tendrás que tener en cuén que los muñecos, disparos, etc, se moverán de 8 en 8 píxeles, useáse, que van a dar saltos los sprites, y así PRINT tamién te irá de lujo.

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 13:48
por oscarbraindead
Hola a todos,
perdonad por no haber contestado antes... os he leído pero no podía escribir.
Lo que he comenzado e intento hacer es el juego completo, en BASIC. Tendrá, como ha apuntado Bubu, que moverse de 8 en 8 píxeles...
Miraré los compiladores que indica chernandezba porque con el intérprete del Spectrum, malamente... ya lo usé en su día y, aunque no era un bólido, me pareció un poco más rápido. También puede ser que yo haya empeorado programando desde hace 30 y pico años...
Decididamente, probaré el compilador de Hisoft a ver qué consigo y os cuento. Si la mejora de velocidad respecto al intérprete es de 3 ó 4 veces, creo que sería más que suficiente.
¡Os mantendré informados de los retrocesos del juego! ¡Jajajajaj!
¡Muchas gracias!

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 15:45
por BlackHole
Luego está el Boriel ZXBasic, un programa de PC que tengo yo también pendiente probar, y que genera también código máquina Z80 ejecutable en un Spectrum. Al ser externo, no tienes las restricciones de memoria y tamaño máximo de programa que te podrías encontrar al cargar un compilador en la máquina real. Además, se integra bien con los emuladores y entre compilar y lanzar lo compilado tarda 2 segundos.

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 15:56
por explorer
Y si se hiciera una pequeña rutina que imitara ese POKE, ¿sería más rápida que el PRINT AT?

La podría meter en el programa en BASIC con los clásicos DATA, READ...

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 16:32
por oscarbraindead
BlackHole escribió:Luego está el Boriel ZXBasic, un programa de PC que tengo yo también pendiente probar, y que genera también código máquina Z80 ejecutable en un Spectrum. Al ser externo, no tienes las restricciones de memoria y tamaño máximo de programa que te podrías encontrar al cargar un compilador en la máquina real. Además, se integra bien con los emuladores y entre compilar y lanzar lo compilado tarda 2 segundos.


Sí, el ZXBasic de Boriel lo he probado un poco y está muy bien, pero la idea es hacerlo directamente desde el spectrum/zxuno...

explorer escribió:Y si se hiciera una pequeña rutina que imitara ese POKE, ¿sería más rápida que el PRINT AT?
La podría meter en el programa en BASIC con los clásicos DATA, READ...


Sería una posibilidad aunque se escapa a mi conocimiento y no sé el rendimiento cómo mejoraría.

Gracias por las ideas!

Como curiosidad he zascandileado un poco con el HiSoft Basic. Un programa que itera del 0 al 2000 con un FOR y escribe en pantalla el número por el que va con PRINT AT, en BASIC sin compilar tarda 37 segundos, una vez compilado lo realiza en 22 segundos.
No está mal...

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 16:41
por Bubu
Efestivamente eso sería más rápido, pues la nueva rutina no tendría que hacer los tediosos chequeos de números, sintaxis, etc, que sí hace el intérprete BASIC, pero la idea de oscarbraindead era usar sólo el BASIC, no el ensamblador. por cierto, hace poco el compi IvanZx me descubrió esta maravilla:

https://www.youtube.com/watch?v=3uJjLeSnOzo

Tela marinera. Lo que pasa es veo la máquina mucho más difícil que este clon, nu sé por qué.

oscarbraindead, yo creo que lo primero que tendrías que hacer es diseñar el apartado gráfico, y a partir de ahí ya pogramar en el lenguaje que sea. Respecto a la rutina de pintar, te podría preparar como dice explorer un PRINT murrápido en código máquina, pero nu sé si es lo que quieres, o prefieres currártelo tú en BASIC, tú dirás ;)
El PRINT murrápido funcionaría de la siguiente manera:

Código: Seleccionar todo

POKE 60000, X
POKE 60001, Y
POKE 60002, N
RANDOMIZE USR 60003


donde X=fila, Y=columna, N=carácter del tileset

Re: ZX Spectrum: escribir en pantalla con POKE

Publicado: 23 Ago 2018, 17:01
por Namek
Bubu escribió:Efestivamente eso sería más rápido, pues la nueva rutina no tendría que hacer los tediosos chequeos de números, sintaxis, etc, que sí hace el intérprete BASIC, pero la idea de oscarbraindead era usar sólo el BASIC, no el ensamblador. por cierto, hace poco el compi IvanZx me descubrió esta maravilla:

https://www.youtube.com/watch?v=3uJjLeSnOzo

Tela marinera. Lo que pasa es veo la máquina mucho más difícil que este clon, nu sé por qué.

oscarbraindead, yo creo que lo primero que tendrías que hacer es diseñar el apartado gráfico, y a partir de ahí ya pogramar en el lenguaje que sea. Respecto a la rutina de pintar, te podría preparar como dice explorer un PRINT murrápido en código máquina, pero nu sé si es lo que quieres, o prefieres currártelo tú en BASIC, tú dirás ;)
El PRINT murrápido funcionaría de la siguiente manera:

Código: Seleccionar todo

POKE 60000, X
POKE 60001, Y
POKE 60002, N
RANDOMIZE USR 60003


donde X=fila, Y=columna, N=carácter del tileset

Llamadme loco, pero me da a mi que 3 POKEs y un RANDOMIZE USR van a tardar casi lo mismo que un PRINT AT... :-k