
Hoy os escribo esta entrada para hablaros del ZX Basic de Boriel, el cual conocí por casualidad navegando por la web. Después de profundizar un poco y de comprarme el libro de Juan Segura Durán (Duefectu), me ha parecido un compilador excelente.
Yo soy de aquellos que iban a los centros comerciales a teclear programas (de la microhobby) en los Spectrum que había en exposición en los centros comerciales de la época (entonces continente) y que aprendía a solucionar los errores que se generaban al teclear, o que estaban en los propios listados. También seguí los cursos y fichas de Basic Sinclair y de código máquina que publicaba semanalmente la revista (MH).
Una vez que conocí el ensamblador (código máquina), el hacer cualquier programa me pareció excesivamente complejo. De hecho llegue a tener un libro cuya temática era ensamblar listados en Basic. Se ganaba algo porque te saltabas muchas veces la pila del calculador de la ROM del ZX, pero la mayoría de las veces, siempre usabas llamadas a las mismas rutinas escritas en la ROM. Ciertamente se ganaba algo de espacio de RAM y velocidad, pero no era sustancial.
Después de haber visto alguno de los vídeos que hay en canales de YouTube:
Y de haber comprado el libro de Duefectu:

He quedado gratamente sorprendido de lo optimizado que está el compilador y del rendimiento que se llega a conseguir.
En esta entrada evidenciaré lo lento que es, y que de por sí ya era de todos los BASIC de los ordenadores de 8 bits de la época. Compararé con 3 ejemplos la diferencia de velocidad del Basic Sinclair con respecto al mismo programa compilado con el ZXBasic Boriel.
Siguiendo el libro de Defectu he usado el IDE que recomienda, pero para esta entrada usaremos solo la parte del compilador nativa en Python. Por lo dejamos que el usuario investigue o se compre el libro para profundizar. (Que conste que no tengo ningún tipo de beneficio por promocionar el libro, pero lo recomiendo si algún nostálgico quiere profundizar.)
Fases de este tutorial:
-
- Descargaremos , instalaremos y comprobaremos que Python funciona.
- Probaremos el emulador de ZX Spectrum Fuse
- Haremos los mismo con el Compilador ZX Basic de Boriel.
- Nos haremos con el fichero TAP (archivo de cinta de casette usado por los emuladores de Spectrum) que contiene todos los ejemplos usados, tanto los del Sinclair BASIC, como los ya compilados, y prácticamos un poco el uso del emulador.
- Iremos comprobando el primer ejemplo de cálculo de 100 números primos, en BASIC Sinclair, y luego lo comparamos con 2 versiones compiladas, una en coma flotante y otra usando números enteros.
- Para el segundo ejemplo probamos la versión Sinclair contra Boriel de un cielo lleno de estrellas (1000 puntos aleatorios en pantalla)
- Con el tercer ejemplo compararemos la versión Sinclair contra Boriel de una pantalla en la que llenaremos de círculos desde el centro hasta el borde, y comprobaremos lo eficiente que es la rutina CIRCLE de Boriel.
- Estaremos compilando desde la consola de Python; detalles de todo lo visto en vídeo colgado en YouTube.
1.- Instalación de Python:
El proceso es el siguiente (ver imágenes):
-
-
- Buscar en google la página de Python o usar este enlace
- Localizar la última versión para windows o usar está versión 3.13.1
- Ejecutar instalador descargado , marcando la opción de meter en PAth del sistema python.exe, el resto es siguiente, siguiente…
- Una vez terminada la instalación, buscamos símbolo del sistema o CMD y lo ejecutamos como administrador.
- En la consola tecleamos python.exe -V, esto nos dirá que versión se ha instalado y será una prueba de que ya tenemos Python el el sistema.
-
2.- Descargar e instalación del emulador Fuse:
El proceso es el siguiente (ver imágenes):
-
-
- Buscar en google la página de Python o usar este enlace
- Buscar la última versión para windows.
- Ejecutar instalador descargado, el resto es siguiente, siguiente…
- Una vez terminada la instalación, lo probamos.
-
fuse seleccionamos filtro_02
Elijo TV 3x, que multiplica x3 el tamaño actual y simula las líneas entrelazadas de la señal de TV PAL.
Opciones casette_02
Dejamos estas opciones por defecto y salvamos configuración como vimos anteriormente. Solo dejo habilitada la carga acelerada. Si quieres que sea como en el Speccy original, desmárcala y ten paciencia con las cargas.
Abrir archivo cinta (F7)
Vemos que con F7 podemos cargar un archivo de cinta (TAP). Usar la de los ejemplos, ver descargas al final.
Browse casette
Con browse mostramos el contenido del archivo, y un cursor para ver cual es el siguiente bloque a cargar. Con F( hacemos PLAY/PAUSE.
3.- Descarga e instalación del zxbasic (Boriel):
El proceso es el siguiente (ver imágenes):
-
-
- Buscar en google la página de Python o usar este enlace. Ha fecha de esta entrada, es la última versión para Windows.
- Solo hay que descomprimir el archivo y mover todo lo descomprimido a la carpeta que habíamos creado anteriormente (C:\zxbasic)
- Luego con el símbolo del sistema, accedemos a c:\zxbasic tecleando cd \zxbasic; y tecleamos python zxbc.py con los que nos aparecerá un breve descripción de la sintaxis.
-
enlace descarga zxbasic
El enlace de esta versión no está bien creado ya que no descarga nada. Copiamos el texto que si es el correcto.
enlace descarga zxbasic_2
El enlace de esta versión no está bien creado ya que no descarga nada. Copiamos el texto que si es el correcto.
zxbasic archivos ejecutables
Estos son 4 archivos mas importantes. 2 scripts en Python y 2 ejecutables. Nosotros llamaremos habitualmente solo al zxbc.py. Los .exe son útiles par configurar IDEs (entornos de desarrollo)
cmd como administrador
Buscamos CMD o línea de comandos, y lo abrimos. Como administrador preferiblemente, aunque no es obligatorio..
Si tecleamos en el terminal:
C:\zxbasic>python zxbc.py -h
Obtenemos la ayuda:
usage: zxbc.py [-h] [-d] [-O OPTIMIZE] [-o OUTPUT_FILE] [-T] [-t] [-A] [-E] [–parse-only]
[-f {asm,bin,ir,sna,tap,tzx,z80}] [-B] [-a] [-S ORG] [-e STDERR] [–array-base ARRAY_BASE]
[–string-base STRING_BASE] [-Z] [-H HEAP_SIZE] [–heap-address HEAP_ADDRESS] [–debug-memory]
[–debug-array] [–strict-bool] [–enable-break] [–explicit] [-D DEFINES] [-M MEMORY_MAP] [-i]
[-I INCLUDE_PATH] [–strict] [–headerless] [–version] [–append-binary APPEND_BINARY]
[–append-headless-binary APPEND_HEADLESS_BINARY] [-N] [–arch ARCH]
[–expect-warnings EXPECT_WARNINGS] [-W DISABLE_WARNING] [+W ENABLE_WARNING] [–hide-warning-codes]
[-F CONFIG_FILE] [–save-config SAVE_CONFIG]
PROGRAM
positional arguments:
PROGRAM BASIC program file
options:
-h, –help show this help message and exit
-d, –debug Enable verbosity/debugging output. Additional -d increase verbosity/debug level
-O, –optimize OPTIMIZE
Sets optimization level. 0 = None (default level is 2
-o, –output OUTPUT_FILE
Sets output file. Default is input filename with .bin extension
-T, –tzx Sets output format to .tzx (default is .bin).
-t, –tap Sets output format to .tap (default is .bin).
-A, –asm Sets output format to .asm. DEPRECATED. Use -f
-E, –emit-backend Emits backend code (IR) instead of ASM or binary.
–parse-only Only parses to check for syntax and semantic errors
-f, –output-format {asm,bin,ir,sna,tap,tzx,z80}
Output format
-B, –BASIC Creates a BASIC loader which loads the rest of the CODE. Requires -T ot -t
-a, –autorun Sets the program to be run once loaded
-S, –org ORG Start of machine code. By default 32768
-e, –errmsg STDERR Error messages file (standard error console by default)
–array-base ARRAY_BASE
Default lower index for arrays (0 by default)
–string-base STRING_BASE
Default lower index for strings (0 by default)
-Z, –sinclair Enable by default some more original ZX Spectrum Sinclair BASIC features: ATTR, SCREEN$, POINT
-H, –heap-size HEAP_SIZE
Sets heap size in bytes (default 4768 bytes)
–heap-address HEAP_ADDRESS
Sets the heap address.
–debug-memory Enables out-of-memory debug
–debug-array Enables array boundary checking
–strict-bool Enforce boolean values to be 0 or 1
–enable-break Enables program execution BREAK detection
–explicit Requires all variables and functions to be declared before used
-D, –define DEFINES Defines de given macro. Eg. -D MYDEBUG or -D NAME=Value
-M, –mmap MEMORY_MAP
Generate label memory map
-i, –ignore-case Ignore case. Makes variable and function names insensitive
-I, –include-path INCLUDE_PATH
Add colon separated list of directories to add to include path. e.g. -I dir1:dir2
–strict Enables strict mode. Force explicit type declaration
–headerless Header-less mode: omit asm prologue and epilogue
–version show program’s version number and exit
–append-binary APPEND_BINARY
Appends binary to tape file (only works with -t or -T)
–append-headless-binary APPEND_HEADLESS_BINARY
Appends binary to tape file (only works with -t or -T)
-N, –zxnext Enables ZX Next asm extended opcodes
–arch ARCH Target architecture (defaults is’zx48k’). Available architectures: zx48k,zxnext
–expect-warnings EXPECT_WARNINGS
Expects N warnings: first N warnings will be silenced
-W, –disable-warning DISABLE_WARNING
Disables warning WXXX (i.e. -W100 disables warning with code W100)
+W, –enable-warning ENABLE_WARNING
Enables warning WXXX (i.e. -W100 disables warning with code W100)
–hide-warning-codes Hides WXXX codes
-F, –config-file CONFIG_FILE
Loads config from config file
–save-config SAVE_CONFIG
Save options into a config file
C:\zxbasic>
4.- Descargar archivo de cinta (TAP) con los ejemplos:
El proceso es el siguiente (ver imágenes):
-
-
- Creamos una carpeta para pruebas dentro de nuestro directorio c:\zxbasic, llamada «pruebas»
- Descargamos el TAP en este enlace, con los ejemplos que veremos después. Descomprimimos el archivo y lo movemos a nuestra carpeta de pruebas. También descargamos un archivos con las fuentes de los 4 programas que haremos con zxbasic en este enlace. Luego descomprimimos y al igual que el TAP, lo movemos a la carpeta de pruebas.
- Probamos a cargar sin ejecutar los ejemplos. (Usaremos Merge para cargar sin ejecutar). Así vemos listados, el visor de cinta, etc.
-
nueva carpeta pruebas
En nuestra carpeta zxbasic, crearemos una nueva carpeta llamada por ejemplo «pruebas»
TAP descargado 2
Hacemos clic en el icono para acceder a la carpeta de descargas o lo buscamos manualmente.
TAP descargado descomprimir
Hacemos clic en el icono para acceder a la carpeta de descargas o lo buscamos manualmente.
TAP descargado descomprimir_2
No aparecerá la ruta recomendada, pero como no queremos que nos cree una subcarpeta, seleccionamos lo marcado en azul y lo borramos.
TAP descargado cortar
Ahora vemos el archivo extraído, como lo queremos en la carpeta de pruebas, lo marcamos para cortar o pulsamos con el archivo seleccionado, Ctrl+X
TAP descargado pegar_01
Navegamos hasta la ruta de la carpeta «C:zxbasicpruebas» y damos al icono de pegar o con el teclado CTRL+V
enlace ejemplos
Ahora repetimos el proceso para descargar, extraer, cortar y pegar el archivo con los textos del código fuente de los ejemplo. hacer clic con el BIR en el enlace marcado del párrafo anterior.
archivo comprimido ejemplos descargado
En nuestro navegador, aparece el archivo comprimido, ya descargado.
archivo comprimido ejemplos descargados_2
Hacemos clic en el icono para acceder a la carpeta de descargas o lo buscamos manualmente.
ejemplos descargados_descomprimir_1
Sobre el archivo, le damos a extraer todo con el BDR (botón derecho del ratón)
ejemplos descargados_descomprimir_2
No aparecerá la ruta recomendada, pero como no queremos que nos cree una subcarpeta, seleccionamos lo marcado en azul y lo borramos.
ejemplos descomprimidos
Ahora vemos los archivos extraídos, como los queremos en la carpeta de pruebas, los marcamos para cortar o pulsamos con el archivo seleccionado, Ctrl+X
ejemplos descomprimidos cortar
Ahora vemos los archivos extraídos, como los queremos en la carpeta de pruebas, los marcamos para cortar o pulsamos con el archivo seleccionado, Ctrl+X
ejemplos descomprimidos pegar_1
Navegamos hasta la ruta de la carpeta «C:zxbasicpruebas» y damos al icono de pegar o con el teclado CTRL+V
fuse_mostrar_contenido_TAP_01
En el emulador de cinta queremos visualizar el contenido de lo que acabamos de cargar. activamos media/tape/browse.
fuse_mostrar_contenido_TAP_02
Esto nos muestra todos los bloque grabados en la cinta. El cursor marca el fichero desde el que reproducir. Podemos hacer doble clic con el BIR para seleccionar otra parte de la cinta.
mostrar ayuda teclado
Ahora vamos a ver como teclear MERGE «» en el spectrum clásico de 48K con sus modos especiales de cursor y tokens en las teclas. Parta ello vamos a visualizar la ayuda del teclado.
4.1 Modos de teclado Spectrum 16/48/+

Para ayuda podemos usar el manual del usuario descargándolo aquí.
O las páginas del manual del BASIC del coleccionable de Microhobby que podeís descargar aquí.
Y leer las páginas 8 a 10.
De todos modos lo resumo:
Vemos que hay 40 teclas, 4 filas de 10 teclas.
Las últimas filas tienen el mismo funcionamiento, y la primera es ligeramente distinto.
Modos:
-
- K, modo por defecto, se escribe token blanco de la interior de la tecla. NEW, PLOT, SAVE, CLEAR etc. En la primera fila su efecto es teclear los números. (Números de línea de los programas para empezar.)
- Modo E directo, nos imprime los tokens en verde del exterior superior de las 3 filas de teclas inferiores; como SIN, COS, LEN, USR. En la primera fila tiene el comportamiento de enmascarar la escritura con los colores indicados en los números del 0 al 7. El modo E se activa y desactiva con SS+CS (Caps Shift), en el PC CTRL + mayúsculas.
- Modo E + SS (Symbol Shift), nos imprime los tokens en rojo del exterior inferior de las 4 filas de teclas inferiores, como ERASE, PAPER, CIRCLE, ~, ACS, {, } . El modo E se activa y desactiva con SS+CS (Caps Shift), en el PC CTRL + mayúsculas. Pero además de la tecla final hay que pulsar SS (Symbol Shift), CTRL en el PC.
- En el modo L se escriben números y letras minúsculas.
- El modo C nos permite escribir números y letras mayúsculas. El modo C se activa y desactiva con CS + 2, Mayúsculas + 2 en el PC, o bloqueo mayúsculas del PC.
- En cualquier modo excepto el E, la tecla SS permite escribir los símbolos y tokens (según la tecla) escritos sobre la tecla en rojo, como @, &, STOP, AND, THEN. Se aplica a las 4 filas.
- Las teclas CS + 5, 6, 7 u 8 son las flechas me nos permiten mover el cursor de edición, equivalentes a los códigos del joystick tipo Sinclair.
- La tecla CS + 1, nos permite bajar a editar a la zona de edición la línea señalada por el cursor de línea en los listados. y usar los cursores antes indicados para editar donde lo necesitemos:
- Las teclas CS + 2 y CS +4, activa y desactivan respectivamente la inversión de vídeo, es decir intercambian los colores de la tinta (ink) y papel (paper) mientras escribimos.
- Las teclas CS + 9, activan el modo G o gráfico, este nos permite escribir los gráficos de las teclas de los números 1 a 8 serigrafiados en blanco, y los UDG ó UGD en español (Gráficos Definidos de Usuario) si están pokeados (definidos)
- Las teclas CS + 0, es el delete, borra el token , texto o símbolo a la izquierda del cursor cuando editamos.
- Y por último, porque ya no recuerdo más, el BREAK, CS + Space, mayúsculas y espacio en el PC. Interrumpe la ejecución del BASIC de Sinclair. En el compilador zxbasic de Boriel no funcionaría por defecto, ya que es compilado; hay una opción en los argumentos del compilador que habilitarían la posibilidad de hacer BREAK.
4.2 Probemos la carga con MERGE «»
pantalla inicial zx spectrum 48k
Pantalla inicial del ZX una vez encendido, o después de un RESET, comandos NEW, USR 0, NMI o cuelgue por bug en código máquina.
modo K zx spectrum 48k
Al pulsar enter, se quita el mensaje de Sinclair, y aparece el cursor en modo K. En este modo aparecerían los comandos escritos en blanco sobre la propia tecla como NEW, SAVE, DIM…
modo E zx spectrum 48k
Pulsando Symbol Shift + Mayúsculas, cambiamos a modo E, si pulsamos otra vez, volvemos a modo K. El modo E sirve para escribir los tokens (comandos) escritos por fuera de las teclas, color verde en la parte superior, y rojo en la inferior. Para los rojos tenemos que pulsar la tecla correspondiente + symbol shift (SS).
MERGE en teclado zx spectrum 48k
Examinando donde está MERGE vemos está en la tecla T en modo E (exterior) y por debajo (rojo), por tanto ya tenemos el cursor en modo E, ahora hay que pulsar SS+T.
teclas modo E zx spectrum 48k
El modo E se obtiene con Symbol Shift y Caps Shift, en Fuse con el PC sería cualquier tecla Ctrl con cualquier tecla de mayúsculas.
teclas comillas en zx spectrum 48k
Con Symbol Shift y la P, obtenemos las comillas «»»»»»»», en el PC Symbol Shift es cualquier tecla CTRL.
zx spectrum 48k MERGE OK
Una vez finalizado el MERGE, nos informa que hay ido todo correcto y espera alguna pulsación del teclado.
teclas BREAK zx spectrum 48k
Combinación de teclas para hacer BREAK en Spectrum gomas. En el PC en fuse es cualquiera de las teclas mayúsculas y el espacio.
4.3 Alternativa para evitar usar los modos de teclado Spectrum 16/48/+. Usar FUSE como un Spectrum 128 o superior:
5.- Ejemplo nº1, 100 número primos Basic Sinclair versus ZXB (ZX Basic Boriel)
El BS en general, a mi me ha gustado siempre, desde que aprendí a programar con él usando los manuales de la revista MicroHobby. Después con el tiempo examinando otras máquinas, descubrí que era uno de los mas lentos en ejecución, aunque con su metodología de uso de tokens era muy eficiente en el ahorro de memoria. Sin embargo BASICs como los del MSX (con su CIRCLE mas rápido y SPRITES que creo que eran por hardware, sonido mejorado, disquetes teclado pro etc,) así como unos de los BASICs de 8 bits que mas me gustaba (el locomotive BASIC) implementado en los AMSTRAD, con 3 modos de video, mas colores y mejor rendimiento, mas instrucciones ; dejaban atrás al BASIC de Sinclair. Luego la adquisición de Sinclair por AMSTRAD no iba a ayudar, se harían competencia respecto a sus CPCs 464, 664, 6128.
Uno de los cuellos de botella del BS a mmi parecer es la poca optimización de las rutinas ROM, que han creado un interprete versátil y fácil de aprender pero con carencias y poco depurado. Creo que fue una reescritura del que tenia el Sinclair ZX81, con colores y sonido; salió con prisa.
Ver detalles de la ROM en este enlace.
Fruto de esto uno de los defectos es que todos los valores numéricos que procesa el Spectrum aunque fuesen enteros, 0 , 1 u otros siempre se operan y almacenan en la memoria como números en punto (coma) flotante; lo cual hace que se dediquen muchos ciclos de proceso a la pila del calculador; ralentizando cualquier cálculo.
Ahora cargaremos el ejemplo de los 100 números primos con SB (Sinclair Basic) veremos cuanto tarda, para después hacer lo propio compilando 2 versiones del mismo programa, uno en float (números en coma flotante) y otro con integers (enteros).
Veamos el listado SB:

En el listado, calculamos 100 números primos (definida la cantidad en L15) usando el método de la criba de Eratóstenes, L30 a L260. Las L5 y L2000 calculan la diferencia de tiempo usando unas variables del sistema que se usan como contadores de ciclos (FRAMES), el ZX refrescaba la pantalla y chequeaba las lecturas del teclado (ULA de Ferranti) cada 20ms , es decir 50 veces por segundo.
En L2010 se muestra el tiempo resultante y de hace un Pause 0, para no borrar nada en la pantalla hasta pulsar alguna tecla.
Aunque ya sabemos cargar con MERGE, lo apropiado es cargar con LOAD «», ya que MERGE tiene la propiedad de evitar la autoejecución de los programas BASIC.
Como vemos a continuación, el proceso es el siguiente para todos los ejemplos de la cinta, independientemente de si son SB o ZXB.
- Teclear LOAD «» y ENTER. (Tanto en modo 48K como en Spectrum 128K y superiores). LOAD = tecla J en modo K, y comillas salen con SS y P
- Habiendo ya cargado el fichero TAP, pulsamos F8 para poner en marcha la casette emulada.
- En cuanto veamos que se está ejecutando el programa cargado, pulsamos nuevamente F8 para pausar la casette.
- Una vez terminada la ejecución, para limpiar la memoria pulsamos F5 y luego espacio (RESET en FUSE) .
- Repetimos el punto 1, para cargar el siguiente programa.
Como podemos ver, en BS (BASIC SINCLAIR) el cálculo de los 100 primeros primos ha demorado 125 segundos.
Ahora para comparar, cargamos el siguiente programa de la cinta, o sea , reset, LOAD «» enter, F8 (marcha casette) , (cargando), F8 (pausa casette),(ejecutando).
Este es el listado fuente, como puede verse he mantenido los números de línea del SB, aunque en ZXB son opcionales.
Solo cambia en esencia L15 en la que DIM define las variables como Float.
5 LET ini=PEEK 23672+PEEK 23673*256+PEEK 23674*65536
10 BORDER 5: PAPER 5: CLS
15 DIM a,siguiente,primo,cont,lm,m as Float
20 LET a=100:REM INPUT «Cuantos numeros quieres calcular «;a
30 IF a=1 THEN PRINT 1;» «;:GO TO 2000
32 IF a=2 THEN PRINT 1;» «;2;» «;:GO TO 2000
33 IF a=3 THEN PRINT 1;» «;2;» «;3;» «;:GO TO 2000
34 IF a<=0 THEN GO TO 2000
35 LET siguiente=4
40 PRINT 1;» «;2;» «;3;» «;
45 LET primo=0
50 LET cont=4
60 LET lm=(INT (SQR siguiente))+1
100 FOR m=2 TO lm
120 IF (siguiente-(INT (siguiente/m))*m)=0 THEN LET primo=0: GO TO 200
140 NEXT m
160 LET primo=1:LET cont=cont+1
180 IF primo=1 THEN PRINT siguiente;» «;
200 LET siguiente=siguiente+1
240 IF cont>a THEN GO TO 2000
260 GO TO 60
2000 LET fin=PEEK 23672+PEEK 23673*256+PEEK 23674*65536
2010 PRINT AT 23,0;»tiempo = «;(fin-ini)/50;» segs.»
2020 PAUSE 0

Como vemos en la imagen anterior, la ejecución esta vez a pesar se usar Floats, que siguen usando las rutinas de cálculo de la ROM, a demorado 89 segundos, es decir unos 36 segundos. menos, lo cual es un mejora sustancial, debido a que ahora no funciona en el interprete de BASIC nativo, sino un compilado a código máquina, aunque si se usan rutinas de la ROM para el cálculo con Float, no se incluyen rutinas de cálculo con Float en ZXB , ya que haría grande el tamaño del código generado y la diferencia de rendimiento no sería sustancial.
Ahora para comparar, cargamos el siguiente programa de la cinta, o sea , reset, LOAD «» enter, F8 (marcha casette) , (cargando), F8 (pausa casette),(ejecutando).
Este es el listado fuente, como puede verse he mantenido los números de línea del SB, aunque en ZXB son opcionales.
Solo cambia en esencia L15 en la que DIM define las variables como Uinteger.
5 LET ini=PEEK 23672+PEEK 23673*256+PEEK 23674*65536
10 BORDER 5: PAPER 5: CLS
15 DIM a,siguiente,primo,cont,lm,m as Uinteger
20 LET a=100:REM INPUT «Cuantos numeros quieres calcular «;a
30 IF a=1 THEN PRINT 1;» «;:GO TO 2000
32 IF a=2 THEN PRINT 1;» «;2;» «;:GO TO 2000
33 IF a=3 THEN PRINT 1;» «;2;» «;3;» «;:GO TO 2000
34 IF a<=0 THEN GO TO 2000
35 LET siguiente=4
40 PRINT 1;» «;2;» «;3;» «;
45 LET primo=0
50 LET cont=4
60 LET lm=(INT (SQR siguiente))+1
100 FOR m=2 TO lm
120 IF (siguiente-(INT (siguiente/m))*m)=0 THEN LET primo=0: GO TO 200
140 NEXT m
160 LET primo=1:LET cont=cont+1
180 IF primo=1 THEN PRINT siguiente;» «;
200 LET siguiente=siguiente+1
240 IF cont>a THEN GO TO 2000
260 GO TO 60
2000 LET fin=PEEK 23672+PEEK 23673*256+PEEK 23674*65536
2010 PRINT AT 23,0;»tiempo = «;(fin-ini)/50;» segs.»
2020 PAUSE 0

Como vemos en la imagen anterior, la ejecución esta vez a demorado 65 segundos, es decir prácticamente la mitad de tiempo que con Float, lo cual es un mejora sustancial.
6.- Ejemplo nº2, 1000 puntos sobre fondo negro (Stars) Basic Sinclair versus ZXB (ZX Basic Boriel)
En esta ocasión vamos a comparar sobre todo capacidades gráficas.
Como antes procedemos a cargar el siguiente programa de la cinta en SB.
Veamos el listado SB:

En el listado, mostramos 1000 pixels en pantalla. El SB limita el área gráfica a una resolución de 256 pixels de ancho por 176 pixels de alto. Las L5 y L2000 calculan la diferencia de tiempo entre el inicio de la ejecución y el final.
En L2010 se muestra el tiempo resultante y de hace un Pause 0, para no borrar nada en la pantalla hasta pulsar alguna tecla.
- Teclear LOAD «» y ENTER. (Tanto en modo 48K como en Spectrum 128K y superiores). LOAD = tecla J en modo K, y comillas salen con SS y P
- Habiendo ya cargado el fichero TAP, pulsamos F8 para poner en marcha la casette emulada.
- En cuanto veamos que se está ejecutando el programa cargado, pulsamos nuevamente F8 para pausar la casette.
- Una vez terminada la ejecución, para limpiar la memoria pulsamos F5 y luego espacio (RESET en FUSE) .
- Repetimos el punto 1, para cargar el siguiente programa.
Como podemos ver, en BS (BASIC SINCLAIR) el cálculo y PLOTeo de 1000 estrellas ha demorado 64 segundos.
Ahora para comparar, cargamos el siguiente programa de la cinta, o sea , reset, LOAD «» enter, F8 (marcha casette) , (cargando), F8 (pausa casette),(ejecutando).
Este es el listado fuente, como puede verse he eliminado los números de línea del SB. Además no he definido ningún tipo de variable, por lo que ZXB ya se encarga de usar óptimamente la mas adecuada. Otra mejora que se observa, es que puedo hacer PLOT a toda la pantalla es decir a una resolución de 256 x 192 pixeles, cosa que SB no permite.
Hay que hacer notar al igual que con el programa de los primos de ZXB, que al no haber habilitado en los argumentos del compilador la opción permitir BREAK, la opción de pulsar CS + SPACE no funcionará.
let ini=peek 23674*65536+peek 23673*256+peek 23672
border 0
paper 0
ink 7
cls
FOR i = 0 TO 1000:
PLOT INK 1 + RND * 7; RND * 256, RND * 192
NEXT i
let fin=peek 23674*65536+peek 23673*256+peek 23672
print at 23,0;»tiempo =»;(fin-ini)/50;»segs»
pause 0
Como podemos ver, en ZXB el cálculo y PLOTeo de 1000 estrellas ha demorado «SOLO » 8 segundos. Es decir 8 veces más rápido.
7.-Ejemplo nº3, círculos concéntricos desde el centro de lapantalla, hasta el bordeBasic Sinclair versus ZXB (ZX Basic Boriel)
En esta ocasión vamos a comparar sobre todo capacidades gráficas.
Como antes procedemos a cargar el siguiente programa de la cinta en SB.
Veamos el listado SB:

En el listado, mostramos unos 87 circulos desde el centro de la pantalla hacia afuera. El SB limita el área gráfica a una resolución de 256 pixels de ancho por 176 pixels de alto. Las L5 y L2000 calculan la diferencia de tiempo entre el inicio de la ejecución y el final.
En L2010 se muestra el tiempo resultante y de hace un Pause 0, para no borrar nada en la pantalla hasta pulsar alguna tecla.
- Teclear LOAD «» y ENTER. (Tanto en modo 48K como en Spectrum 128K y superiores). LOAD = tecla J en modo K, y comillas salen con SS y P
- Habiendo ya cargado el fichero TAP, pulsamos F8 para poner en marcha la casette emulada.
- En cuanto veamos que se está ejecutando el programa cargado, pulsamos nuevamente F8 para pausar la casette.
- Una vez terminada la ejecución, para limpiar la memoria pulsamos F5 y luego espacio (RESET en FUSE) .
- Repetimos el punto 1, para cargar el siguiente programa.
Como podemos ver, en BS (BASIC SINCLAIR) el cálculo y dibujado de los 87 círculos ha demorado 65,8 segundos.
Ahora para comparar, cargamos el siguiente programa de la cinta, o sea , reset, LOAD «» enter, F8 (marcha casette) , (cargando), F8 (pausa casette),(ejecutando).
Este es el listado fuente, como puede verse he eliminado los números de línea del SB. Además no he definido ningún tipo de variable, por lo que ZXB ya se encarga de usar óptimamente la mas adecuada. Otra mejora que se observa, es que puedo hacer PLOT a toda la pantalla es decir a una resolución de 256 x 192 pixeles, cosa que SB no permite.
Hay que hacer notar al igual que con el programa de los primos de ZXB, que al no haber habilitado en los argumentos del compilador la opción permitir BREAK, la opción de pulsar CS + SPACE no funcionará.
Dim i as ubyte
Dim ini,fin as ulong
let ini=peek 23674*65536+peek 23673*256+peek 23672
border 0
paper 7
ink 0
cls
FOR i = 0 TO 95:
circle 127,95,i
NEXT i
let fin=peek 23674*65536+peek 23673*256+peek 23672
print at 23,0;»tiempo =»;(fin-ini)/50;»segs»
pause 0
Como podemos ver, en ZXB el dibujado de 96 círculos ha demorado «SOLO» 5 segundos. Es decir 12 veces más rápido. Además ha dibujado más círculos y mas grandes ya que ZXB no tiene los límites del tamaño de pantalla del SB, si no que tenemos el área gráfica completa de 256 x 192 píxeles.
Pero ¿Cómo lo ha hecho?. Haciendo un poco de memoria, yo recuerdo que los MSX ya dibujaban mas rápido las circunferencias que el Speccy, de hecho este hace todo el círculo con un sólo trazo continuo en sentido antihorario, lo mismo está haciendo uso de funciones trigonométricas; mientras que en el MSX se crean 8 sectores de arco que se dibujan al unísono aprovechando que todos estos sectores tienen simetrías entre sí.
ver vídeo:
Según he visto, permite en la misma instrucción elipses y arcos, ya que permite que imaginariamente el círculo se trace por fuera del área visible; en SB no lo permite. Creo que usa el algoritmo de BRESENHAM. Ver vídeo:
8.-Pruebas compilador Python
En esta ocasión vamos a comprobar todo lo hecho y algunos trucos desde la línea de comandos a la hora de ejecutar el compilador.
Todo esto lo vemos en el siguiente vídeo:
0 comentarios