Un compilador de ZX Spectrum BASIC

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

baltasarq
rst 0
Mensajes: 1
Registrado: Lun Feb 02, 2009 1:46 pm

Re: Un compilador de ZX Spectrum BASIC

Mensaje por baltasarq » Lun Feb 02, 2009 1:56 pm

Hola !

Quiero compilar una aventura hecha en un Spectrum+ (es decir, en el Sinclair BASIC) para que vaya más rápido. Desgraciadamente, el parsing resulta demasiado lento, debido al manejo de cadenas.

Este compilador parecía la mejor solución: compilar el código BASIC en un tap para el speccy en código máquina.

Sin embargo, no parece que soporte en absoluto el BASIC del spectrum. Es más, no entiendo pq lleva este nombre (sería más bien un compilador de 8 bits para un dialecto basic propio). He visto en un ejemplo de la wiki en inglés lo siguiente (o algo parecido):

Código: Seleccionar todo

10 if  line > 1
20 print "hola"
30 print "adios"
40 end if


Ya sé que los números de línea son opcionales en este compilador, pero no en Sinclair Basic.

Que en el BASIC del spectrum sería:

Código: Seleccionar todo

10 if  line > 1 then print "hola":print "adios"


Se que es más potente lo primero para poder poner else's y cosas así, pero me sorprende que se le llame zxbasic a ésto. Es decir, mi problema es que por lo que he visto en la documentación, el Sinclair Basic no está soportado, ¿es así, o me he llevado una idea errónea?

¿Puedo compilar mi programa con mínimas modificaciones, y a ser posible, mantener la compatibilidad con el Speccy?

Gracias a todos, y en especial al creador de la herramienta.

Salud !

Baltasar

sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por sromero » Lun Feb 02, 2009 4:30 pm

baltasarq escribió:Sin embargo, no parece que soporte en absoluto el BASIC del spectrum. Es más, no entiendo pq lleva este nombre (sería más bien un compilador de 8 bits para un dialecto basic propio).

(...)

Se que es más potente lo primero para poder poner else's y cosas así, pero me sorprende que se le llame zxbasic a ésto.


Hombre. Es un compilador de BASIC para el ZX Spectrum... ¿por qué no puede llamarse ZX Basic? :)

El problema sería si se llamara "Sinclair Basic Compiler", ¿no? Porque no podrías compilar el Sinclair Basic. :-?

saludos!

Oceano
rst 0
Mensajes: 2
Registrado: Lun Feb 02, 2009 6:09 pm

Bresenham para líneas resuelto.

Mensaje por Oceano » Lun Feb 02, 2009 6:11 pm

Si vas a esta web:

http://proyectosroboticos.es.tl

encontrarás las soluciones para aplicar el algoritmo de bresenham en 2D, 3D y 4D. En este último caso, se trata de usar los 3 ejes XYZ y otro auxiliar.

Saludos.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Feb 02, 2009 6:12 pm

Exacto. Es un compilador de BASIC estándar para ZX Spectrum. Yo creo que el nombre es perfecto :D

Oceano
rst 0
Mensajes: 2
Registrado: Lun Feb 02, 2009 6:09 pm

Bresenham 2D, 3D y 4D resuelto para líneas.

Mensaje por Oceano » Lun Feb 02, 2009 6:17 pm

Si vas a esta web:

http://proyectosroboticos.es.tl

encontrarás las soluciones para aplicar el algoritmo de bresenham en 2D, 3D y 4D. En este último caso, se trata de usar los 3 ejes XYZ y otro auxiliar.

Saludos.

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Gandulf » Lun Feb 02, 2009 6:21 pm

3 ejes XYZ y otro auxiliar

¡Jarl! Eso es una rutina exotérica :lol:
Un saludo,

Gandulf

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por mcleod_ideafix » Lun Feb 02, 2009 9:59 pm

compiuter escribió:He retomado el compilador con la idea de hacer una cosilla para los juegos caca 2009 y me he encontrado con que no esta implementado SCREEN$, me he bajado la rom desensamblada y estoy mirando de pushear los datos y con asm end asm hacer un call a la rutina de rom, pero no lo consigo, si algun alma carita<ativa me ayuda, muchas gracias de antemano. :roll: :)


Aquí la tienes:

Código: Seleccionar todo

S_SCRNS_BC              equ 2538h
STK_FETCH               equ 2BF1h

                        ;Entrada: B=columna (0-31)
                        ;         C=fila (0-23)
                        ;Salida:  A=codigo ASCII del caracter encontrado, o 0 si no se encontró.
Screens                 proc
                        call S_SCRNS_BC  ;llamamos a S_SCRNS pero pasando la parte en que coge los datos del stack del calculador
                        call STK_FETCH   ;cogemos de la pila del calculador el resultado
                        ld a,b
                        or c
                        ret z       ;si es una cadena nula (longitud 0), pues nada, no hay caracter
                        ld a,(de)   ;en otro caso, coge el primer carácter de la cadena
                        ret
                        endp


Una vez cargada, la he usado con este pequeño programa-demo, que escanea lo que hay en las primeras 96 posiciones de pantalla, e imprime lo que haya en ellas.

Código: Seleccionar todo

CHAN_OPEN               equ 1601h

                        org 32768

Demo                    proc
                        ld a,-2
                        call CHAN_OPEN
                       
                        ld bc,0000h
                        ld e,96
BucScrDemo              push de
                        push bc
                        call Screens
                        pop bc
                        pop de
                        rst 10h
                        inc b
                        ld a,b
                        cp 32
                        jr nz,NoResetCol
                        ld b,0
                        inc c
NoResetCol              dec e
                        jr nz,BucScrDemo
                        ret
                        endp


Para probarlo, se puede usar este código en BASIC

Código: Seleccionar todo

10 LOAD ""CODE
20 FOR n=32 TO 127: PRINT CHR$ n;: NEXT n: PRINT: PRINT: PRINT
30 RANDOMIZE USR 32768


El BASIC genera todos los caracteres reconocibles por SCREEN$. La rutina los escanea, y los reproduce tres líneas más para abajo, para comprobar que lo ha hecho bien.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
compiuter
Sabreman
Mensajes: 337
Registrado: Vie May 18, 2007 9:00 pm
Ubicación: Palma de Mallorca

Re: Un compilador de ZX Spectrum BASIC

Mensaje por compiuter » Lun Feb 02, 2009 11:02 pm

Muchas gracias por la rutina, nada es imposible para tí, para mí era un reto tremendo, y ya la tengo ahí, además me parece un gran avance para el diseño de futuros juegos, en plan juegos facilones, ya que screen$ se supone que es más lenta que attr. Yo me había planteado poner un byte diferente sobre cada caracter a comprobar y usar ese truco, pero con tu rutina es mucho mas directo, mil gracias. :shock: :D
Yo es que cuando vi que se liaba a coger datos del calculador enseguida me puse a pensar en la mantisa esa y me dió miedo, esa parte de las matemáticas la tengo poco trillada y lo que he leido de ese tipo de numeración es en los libros de ensamblador, de todos modos si se puede saltar esa parte, es todo mucho mas sencillo, ahora en zxbasic, se pueden hacer sub-funciones facilmente para averiguar los códigos que hay en pantalla.
Última edición por compiuter el Lun Feb 02, 2009 11:32 pm, editado 1 vez en total.

juanjo
rst 0
Mensajes: 31
Registrado: Dom Ene 18, 2009 6:03 pm

Re: Un compilador de ZX Spectrum BASIC

Mensaje por juanjo » Lun Feb 02, 2009 11:05 pm

Muy interesante este proyecto. Me lo he bajado y he probado los programas de prueba, por algo se empieza :)

Por cierto me he leido el hilo de cabo a rabo :shock:

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por mcleod_ideafix » Mar Feb 03, 2009 12:17 am

compiuter escribió:Yo es que cuando vi que se liaba a coger datos del calculador enseguida me puse a pensar en la mantisa esa y me dió miedo, esa parte de las matemáticas la tengo poco trillada y lo que he leido de ese tipo de numeración es en los libros de ensamblador...


La parte del calculador es la última que aprendí de la ROM del Spectrum. De hecho, el último programa que escribí integramente en un Spectrum (es decir, usando el GENS para escribir el fuente, ensamblar, salvar a cinta, etc.) sin usar un PC para nada, fue un programa que calculaba en "tiempo real" una FFT (pongo entre comillas lo de tiempo real porque en realidad, cada cálculo tardaba varios segundos :D )

Muchos años después (aquello lo escribí en el 92) me interesé de nuevo por el asunto, y lo que averigüé lo dejé por escrito en este hilo.
Web: ZX Projects | Twitter: @zxprojects

juanjo
rst 0
Mensajes: 31
Registrado: Dom Ene 18, 2009 6:03 pm

BUG report

Mensaje por juanjo » Mar Feb 03, 2009 1:07 am

Estoy haciendo un programita de particulas que se mueven en zx basic y me he encontrado con problemas. Me parece que los arrays de tipo Fixed dan problemas al usarlos en la parte derecha de una asignacion, o como parametros en una llamada (a PLOT por ejemplo). Este sencillo codigo fuente da un error extraño.

Código: Seleccionar todo

DIM a(10) as Fixed

DIM b as Fixed

LET b = a(3)


El error es: partis.bas:17: Error: Undefined label '__LOAD32'

El tipo de 'b' es igual, ocurre solo cuando el tipo del array es fixed.
En cambio si modifico la ultima linea por LET a(3) = b va bien.

El numero de linea del error se sale del archivo, ademas.

EDIT: Ver mas abajo, este bug creo que lo he resuelto
Última edición por juanjo el Mar Feb 03, 2009 3:43 am, editado 1 vez en total.

juanjo
rst 0
Mensajes: 31
Registrado: Dom Ene 18, 2009 6:03 pm

Re: Un compilador de ZX Spectrum BASIC

Mensaje por juanjo » Mar Feb 03, 2009 1:48 am

Otra cosa que he visto es que un if vacio

Código: Seleccionar todo

a=10
IF a=10 THEN
END IF


hace que casque el compilador (IndexError: list index out of range)
Última edición por juanjo el Mar Feb 03, 2009 10:36 pm, editado 1 vez en total.

juanjo
rst 0
Mensajes: 31
Registrado: Dom Ene 18, 2009 6:03 pm

Re: BUG report

Mensaje por juanjo » Mar Feb 03, 2009 3:42 am

Bueno, he averiguado mas cosas, y he visto otro bug:

El error de los arrays con fixed esta en el fichero __array.py, donde llama a __LOAD32, la funcion assembler se llama en realidad __ILOAD32 (esto era facil de ver)
Lo he cambiado y funciona

Pero luego mi programita me ha llevado a otro error, que acotandolo he llegado a este trozo de codigo erroneo, tambien con Fixed (con Float no pasa):

Código: Seleccionar todo

DIM a as Fixed

a = -0.3

print a
print a*a


El segundo print deberia imprimir un valor positivo pequeño, pero da -20000 y pico.
Con a = -0.5 da correcto, asi como con a = -10.5 por ejemplo.
Pero con la mayoria de decimales como a = -0.3 ó a = -10.3 (o mas 'raros') da -20000 y pico (varia pero esta en torno a esa cifra)

Ah se me olvidaba, estoy usando la version 1.0.3, tanto la version para windows como la version sin compilar

Avatar de Usuario
compiuter
Sabreman
Mensajes: 337
Registrado: Vie May 18, 2007 9:00 pm
Ubicación: Palma de Mallorca

Re: Un compilador de ZX Spectrum BASIC

Mensaje por compiuter » Mar Feb 03, 2009 9:01 pm

Tengo un prototipo de funcion para SCREEN$.

Código: Seleccionar todo

'====================
'=SCRINS=============
'====================
CLS
print "ABC"
print "DEF"
Scrins(1,2)
print "NMIadd-23728=";PEEK 23728
print "EsElCaracter:";CHR$(PEEK 23728)
stop
'-----------------------------
FUNCTION FASTCALL Scrins(paramHL AS Uinteger,paramDE AS Uinteger)
 asm
   PreScreens:
    ld c,l ;pilla p1-HL-Fila=1
    pop hl ;recup ret
    pop de ;pilla p2-DE-Columna=2
    push hl ;repone ret
    ld b,e ;cargamos b con Columna
    ;c ya la habiamos cargado con Fila
    ;LANZAMOS RUTINA
   S_SCRNS_BC equ 2538h
   STK_FETCH equ 2BF1h
    ;Entrada: B=columna (0-31)
    ;         C=fila (0-23)
    ;Salida:  A=codigo ASCII del
    ;caracter encontrado,
    ;o 0 si no se encontró.
   Screens:
   ;proc
    call S_SCRNS_BC ;llamamos
    ;a S_SCRNS pero pasando la
    ;parte en que coge los datos
    ;del stack del calculador
    call STK_FETCH ;cogemos de
    ;la pila del calculador el resultado
    ld a,b
    or c
    ret z ;si es una cadena
    ;nula (longitud 0), pues
    ;nada, no hay caracter
    ld a,(de)   ;en otro caso,
    ld hl,23728 ;23728-29 nmi-add nousadas48k
    ld (hl),a
    ;ld b,a
    ;coge el primer carácter de la cadena
    ret
    ;endp
 end asm
End Function
'-----------------------------
end

La duda que me surje ahora es si podría hacerse al estilo de Let L=usr 55000 y que devolviera en L el valor del registro B, supongo que sí, aunque a lo mejor el código resultante no sería tan versátil.

sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por sromero » Mar Feb 03, 2009 10:52 pm

Juanjo: la verdad es que se agradecen usuarios que prueben a fondo y saquen bugs.

A ver si Boriel lee tus mensajes y te encuentra solución a los bugs.

Un saludo!
NoP / Compiler

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Ahrefs [Bot] y 2 invitados