ZX Spectrum: escribir en pantalla con POKE

Foro dedicado a la programación en todo tipo de sistemas clásicos.
oscarbraindead
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 150
Registrado: 05 Oct 2012, 17:42
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo GameBoy
Primera consola: Atari 2600
Gracias dadas: 8 veces
Gracias recibidas: 2 veces

ZX Spectrum: escribir en pantalla con POKE

Mensajepor oscarbraindead » 23 Ago 2018, 08:03

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.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor Bubu » 23 Ago 2018, 09:37

¡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?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 253
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 12 veces
Gracias recibidas: 132 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor chernandezba » 23 Ago 2018, 11:17

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
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor Bubu » 23 Ago 2018, 11:56

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

oscarbraindead
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 150
Registrado: 05 Oct 2012, 17:42
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo GameBoy
Primera consola: Atari 2600
Gracias dadas: 8 veces
Gracias recibidas: 2 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor oscarbraindead » 23 Ago 2018, 13:48

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!

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1442
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 9 veces
Gracias recibidas: 209 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor BlackHole » 23 Ago 2018, 15:45

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.

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 398
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 dadas: 2 veces
Gracias recibidas: 138 veces
Contactar:

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor explorer » 23 Ago 2018, 15:56

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...

oscarbraindead
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 150
Registrado: 05 Oct 2012, 17:42
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo GameBoy
Primera consola: Atari 2600
Gracias dadas: 8 veces
Gracias recibidas: 2 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor oscarbraindead » 23 Ago 2018, 16:32

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...

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor Bubu » 23 Ago 2018, 16:41

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
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: ZX Spectrum: escribir en pantalla con POKE

Mensajepor Namek » 23 Ago 2018, 17:01

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


Volver a “Programación”

¿Quién está conectado?

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