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:

    1. BORIEL BASIC para ZX SPECTRUM con DUEFECTU – ZX SPECTRUM
    2. Compilador Boriel ZX Basic: Convirtiendo tus programas BASIC a código máquina

Y de haber comprado el libro de Duefectu:

Captura libro Juan Segura Durán "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:

    1. Descargaremos , instalaremos y comprobaremos que Python funciona.
    2. Probaremos el emulador de ZX Spectrum Fuse
    3. Haremos los mismo con el Compilador ZX Basic de Boriel.
    4. 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.
    5. 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.
    6. Para el segundo ejemplo probamos la versión Sinclair contra Boriel de un cielo lleno de estrellas (1000 puntos aleatorios           en pantalla)
    7. 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.
    8. 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.

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.

 

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

      1. Creamos una carpeta para pruebas dentro de nuestro directorio c:\zxbasic, llamada «pruebas»
      2. 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.
      3. Probamos a cargar sin ejecutar los ejemplos. (Usaremos Merge para cargar sin ejecutar). Así vemos listados, el visor de cinta, etc.

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

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:

 

Listado 100 números primos en Sinclair BASIC

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.

  1. 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
  2. Habiendo ya cargado el fichero TAP, pulsamos F8 para poner en marcha la casette emulada.
  3. En cuanto veamos que se está ejecutando el programa cargado, pulsamos nuevamente F8 para pausar la casette.
  4. Una vez terminada la ejecución, para limpiar la memoria pulsamos F5 y luego espacio (RESET en FUSE) .
  5. 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.

Captura Primos BASIC Sinclair

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

Captura Primos BASIC Boriel usando números en coma flotante..

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

Captura Primos BASIC Boriel usando números enteros.

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:

Listado de programa de 1000 estrellas en Sinclair BASIC

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.

  1. 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
  2. Habiendo ya cargado el fichero TAP, pulsamos F8 para poner en marcha la casette emulada.
  3. En cuanto veamos que se está ejecutando el programa cargado, pulsamos nuevamente F8 para pausar la casette.
  4. Una vez terminada la ejecución, para limpiar la memoria pulsamos F5 y luego espacio (RESET en FUSE) .
  5. 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.

Captura círculos BASIC Sinclair

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

 

Captura círculos BASIC Boriel

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:

Listado de programa de círculos concéntricos del centro hacía el borde en Sinclair BASIC

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.

  1. 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
  2. Habiendo ya cargado el fichero TAP, pulsamos F8 para poner en marcha la casette emulada.
  3. En cuanto veamos que se está ejecutando el programa cargado, pulsamos nuevamente F8 para pausar la casette.
  4. Una vez terminada la ejecución, para limpiar la memoria pulsamos F5 y luego espacio (RESET en FUSE) .
  5. 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.

Captura círculos BASIC Sinclair

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

 

Captura círculos BASIC Boriel.

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

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *