ZX-V Documentación English Pruébalo en el navegador

Compilar BASIC con ZX Basic

ZX Basic es un compilador de BASIC para el ZX Spectrum, de José Rodríguez (Boriel), muy usado para hacer juegos. Hay una versión con un target para ZX-V que convierte un programa en BASIC en un programa nativo (.zxv), como los del SDK en C: se carga con LOAD "nombre" y va unas 90 veces más rápido que el mismo programa en el BASIC de la máquina.

No es una versión oficial de ZX Basic: está en un fork, cronomantic/zxbasic, basado en la versión 1.19.0.

Qué BASIC es

ZX Basic no es el BASIC de ZX-V. Es el BASIC del Spectrum con añadidos de los BASIC modernos: tipos (UByte, Integer, Long, Float, String...), SUB y FUNCTION con variables locales, DO ... LOOP, #include, y no hacen falta números de línea. Un programa del Spectrum suele compilar tal cual: PRINT AT, INK, PLOT, DRAW, CIRCLE, BEEP, INKEY$, PEEK y POKE funcionan como allí, también con las direcciones de la pantalla (16384) y de las variables del sistema.

Lo propio de ZX-V (los modos, las dos páginas, los sprites, las figuras, el mando y los AY) está en la librería zxv.bas, con los mismos nombres que en el BASIC de ZX-V:

#include <zxv.bas>

GRABSTR 0, 4, "1111122112211111"
FOR x = 0 TO 240 STEP 16
    SPRITE 0, x, 80
NEXT x
BOX 4, 100, 20, 20, 20
Órdenes
MODE, PAGE, SCREEN, SCROLL, REMAP, WAIT Los modos, la página que se ve y en la que se dibuja (el doble buffer), el scroll, los cambios de color y el ritmo de 60 imágenes por segundo
PALETTE, PALETTERESET La paleta: cualquier color (rojo, verde y azul de 0 a 255) en cada uno de los 16, y otra vez los de siempre
GRAB, GRABSTR, SPRITE, HIT Los sprites, con espejo, otros colores o escalados, y los choques al píxel
BOX, DISC, POLY, CLIP, PIXEL Figuras rellenas, el recorte y el color de un píxel
KEY, JOY, SOUND, TIME Las teclas pulsadas, los mandos, los registros de los AY y el contador de frames
MUSICLOAD, MUSICPLAY, MUSICSTOP, MUSICPAUSE, MUSICCONTINUE, MUSIC La música de un tracker (un .pt3 de zxv-tracker...), de fondo mientras el programa sigue
SFXLOAD, SFX, SFXSTOP, SFXPLAYING Los efectos de sonido de un banco AYFX

Las diferencias con el BASIC de ZX-V: el sprite de una cadena es GRABSTR (GRAB n, ancho, a$ en el de ZX-V); KEY, JOY, HIT y PIXEL llevan paréntesis (KEY(9)); REMAP y SOUND van de par en par y PALETTE de color en color, solo en la tabla 0 (sin #t); REMAP y PALETTE solos son REMAPRESET y PALETTERESET; POLY admite hasta 8 puntos; y la música y los efectos se cargan con MUSICLOAD f$ y SFXLOAD f$ (LOAD f$ MUSIC y SFX en el de ZX-V), se tocan con MUSICPLAY, MUSICSTOP... y la función que dice si suena un efecto es SFXPLAYING.

SAVE, LOAD y VERIFY usan la tarjeta SD como el BASIC de ZX-V: sin extensión, la pantalla va en un .gfx (la de ZX-V, con sus colores si no son los de siempre) y CODE y DATA en un .bin, los bytes sin más; con la extensión .tap, en una cinta del Spectrum. Compilado con --enable-break, Esc para el programa y los errores dicen la línea. Lo demás, y las librerías que hay, está en su documentación del target.

Instalarlo

En Windows: descarga zxbasic-1.19.0-zxv.5-win64.zip de la página de la versión y descomprímelo donde quieras. Trae zxbc.exe, que no necesita Python.

En Linux y macOS: descarga el código de esa misma página (o clona la rama zxv del fork). Hace falta Python 3.14; el compilador es zxbc.py.

Además, en todos: el compilador de C de RISC-V, el mismo que usa el SDK. Cómo instalarlo está en la guía del SDK.

Tu primer programa

Guarda esto como hola.bas:

DIM x AS FLOAT
PAPER 1: INK 7: CLS
PRINT AT 10, 6; "Hola desde ZX Basic"
FOR x = 0 TO 255
    PLOT x, 40 + 30 * SIN(x / 20)
NEXT x

Compílalo:

zxbc --arch=zxv hola.bas

(zxbc.exe en Windows, python3 zxbc.py con el código.) Sale hola.zxv: cópialo a la tarjeta SD (en el emulador, a la carpeta que hace de tarjeta) y cárgalo con LOAD "hola". Al terminar, el informe (0 OK o el error) se queda abajo hasta que pulsas una tecla, como en el Spectrum.

Con --loading-screen titulo.png (o un .gfx con una pantalla), el .zxv lleva una pantalla de carga, como con elf2zxv.py --screen. La máquina la enseña mientras carga el programa.

Ojo con los tipos. Sin DIM, una variable toma el tipo más pequeño que le vale: aquí, sin la primera línea, x sería un UByte (de 0 a 255). Y entre enteros, / divide como enteros: x / 20 daría 0, 0, 0... 1, 1, 1, y la curva saldría a escalones. Y el FOR no acabaría nunca, porque un UByte no llega a pasar de 255. Declara como FLOAT lo que necesite decimales, y con un tipo más grande los contadores que lleguen al límite.

Un ejemplo

Stardust es un juego pequeño hecho con zxv.bas: doble buffer, sprites de cadenas, choques, teclado o mando y sonido, a 60 imágenes por segundo.

La licencia de tus programas

El compilador tiene la licencia AGPL 3, pero lo que va dentro de tus programas (el runtime y las librerías de ZX Basic, y las partes del SDK de ZX-V) es MIT: tus programas pueden tener la licencia que quieras, también cerrada.