Lenguaje de programación para Z80 útil para Spectrum

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

Moderador: Sir Cilve Sinclair

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Dom Ene 13, 2008 7:31 pm

Hola. Existe un nuevo lenguaje de programación para microprocesador Z80, ccz80, basado en C, sencillo de aprender y utilizar y rápido en ejecución. Con librerías apropiadas se puede programar para Spectrum desde Windows. Sólo existe una pequeño problema ahora mismo y es que como yo no soy muy experto en Spectrum, las librerías para este ordenador que ahora mismo tiene el lenguaje ccz80 son muy mejorables, pero confio en que me ayudeis para crear una buena librería de funciones (el lenguaje permite escribirlas en ensamblador fácilmente), o bien la creeis para vosotros mismos. La información sobre ccz80 está en http://perso.orange.es/emilio.guerrerog . Gracias.

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

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por mcleod_ideafix » Lun Ene 14, 2008 10:42 pm

Ostras! Tiene muy buena pinta... pero no veo ninguna documentación que indiqué cómo escribir programas en este lenguaje... Sólo veo dos ejemplos, y como la librería para Spectrum es todo ensamblador en línea, no clarifica las cosas. ¿Dónde está el resto de la documentación? ¿Es GPL?
Web: ZX Projects | Twitter: @zxprojects

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Mar Ene 15, 2008 8:24 am

La documentación del lenguaje está en la sección Downloads, junto con los enlaces al compilador y las librerías.
Está la documentación del lenguaje estándar y también la de la librería del Spectrum, entre otras. Luego es cuestión de usar en el programa las funciones de la librería estándar, la de Spectrum u otras que quieras crear y escribir en el propio programa que estés haciendo o en un fichero aparte que incluyas en el programa principal con la sentencia "include". Reconozco que la librería de funciones para Spectrum es pobre, porque no conozco mucho este sistema (aunque lo he intentado, pero por ahora no he llegado a mucho).
Como otro ejemplo de programa, por si viene bien otro más, ahí va uno que pide dos números y los suma:

Código: Seleccionar todo

include "spectrum.ccz80"; // Incluye la librería para Spectrum, con todas las funciones que incorpora
array byte texto[16]; // Declara un array de 16 bytes (en este caso para almacenar una cadena de hasta 15 caracteres)
word a, b; // Declara dos variables para los sumandos
cls(); // Función de librería Spectrum para borrar la pantalla
stream(1); // Función de la librería Spectrum para establecer el cauce a la zona inferior de la pantalla
prints("Introduzca primer sumando: "); // Función de la librería Spectrum para mostrar un texto (en el cauce establecido previamente)
input(texto); // Función de la librería Spectrum para leer por teclado un texto y almacenarlo en la variable dada como parámetro
a = atow(texto); // Función de la librería estándar (no la de Spectrum, pero se usan igual) para convertir el texto introducido en un valor de tipo word
prints("\rIntroduzca segundo sumando: "); // Función de la librería Spectrum para mostrar un texto (en el cauce establecido previamente)
input(texto); // Para leer el texto para el segundo sumando (sobreescribiendo el texto anteriormente leido)
b = atow(texto); // Hacer b igual al valor del texto
stream(2); // Establecer el cauce a la pantalla principal
printw(a);
prints(" + ");
printw(b);
prints(" = ");
printw(a + b);
return; // Finalizar programa y regresar a BASIC


Luego sería cuestión de seguir las instrucciones que están en la documentación para grabarlo, compilarlo, ensamblarlo y ejecutarlo en el emulador.
Última edición por Dinoneno el Jue Ene 17, 2008 7:03 pm, editado 1 vez en total.

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

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por mcleod_ideafix » Mar Ene 15, 2008 5:43 pm

Estupendo! Dame unos días (que estoy de mudanza) y lo probaré a base de bien. A ver si puedo trasladar el Fire! de C a este C-Z80 :)
Web: ZX Projects | Twitter: @zxprojects

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Jue Abr 03, 2008 7:01 pm

Y ahora la versión 2.0.0, con ensamblador incluído para obtener directamente un fichero ejecutable. También funciones inline para mayor rapidez en funciones pequeñas con uno o ningún parámetro.

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

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por mcleod_ideafix » Jue Abr 03, 2008 8:31 pm

Mooooooooooooooola aún más (huy! acabo de ver que puse un post prometiendo que iba a usarlo para portar el Fire :oops: ) Siento el descuidoooooooo
Web: ZX Projects | Twitter: @zxprojects

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Mié Oct 29, 2008 7:22 pm


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

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por mcleod_ideafix » Jue Oct 30, 2008 10:23 am

Gracias! :)
Web: ZX Projects | Twitter: @zxprojects

anjuel
Manic Miner
Mensajes: 296
Registrado: Mar May 08, 2007 9:14 am
Ubicación: Torreznoslandia
Contactar:

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por anjuel » Jue Oct 30, 2008 11:48 am

Muchísimas gracias! ;-)
(_\_) (_|_) (_/_) (_|_) ILLO KE HEHEHEHEHEHEEEHEHEHEHE!!
http://www.mojontwins.com

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Mié Ago 05, 2009 7:57 pm

Nueva versión del compilador: ccz80 2.0.7:
http://www.telefonica.net/web2/emiliogu ... z80sp.html

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Mar Abr 13, 2010 9:01 pm

ccz80 3.0.0

La principal novedad es que permite definir macros para utilizar en cualquier expresión. Esto permite por ejemplo usar tablas mediante índices, estructuras, tablas de estructuras, definir funciones cuyo contenido sea una fórmula y otras utilizaciones.

Ejemplo para usar tablas:

include "spectrum.ccz80"; // o bien "cpc464.ccz80" o "msx.ccz80"
define longitud = 10;
array byte datos[longitud];
define tabla(i) = (*(datos + i));
byte n;
for (n = 0; n < longitud; ++n) tabla(n) = n + 1;
for (n = 0; n < longitud; ++n) { printb(tabla(n)); printc(' '); }
pause(0); // Para CPC o MSX eliminar esta línea
return;

Ejemplo de función fórmula:

include "spectrum.ccz80"; // o bien "cpc464.ccz80" o "msx.ccz80"
define media(a, b, c) = ((a + b + c) / 3);
printw(media(1, 7, 10));
pause(0); // Para CPC o MSX eliminar esta línea
return;

http://www.telefonica.net/web2/emiliogu ... z80sp.html

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

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por mcleod_ideafix » Vie Abr 16, 2010 6:49 pm

Hola! Ya que el lenguaje está tan cercano al C, ¿cabría la posibilidad de añadir punteros? Algo he visto para el tratamiento de vectores y tablas, pero lo que busco es poder definir variables que apunten a una zona de memoria en concreto y así "pokear" y "peekear" memoria como si fuera C.

CORRIJO: no leí bien el PDF con la descripción del lenguaje. Aparentemente se puede usar un word como puntero. Voy a probar!...

Mientras tanto, para hacer un pequeño benchmark, he escrito estas funciones, que no he visto en la librería estándar de ccz80:

Código: Seleccionar todo

function byte pokeb(word, byte)
{
  "ld   ix,2",
  "add  ix,sp",
  "ld   a,(ix+1)",
  "ld   l,(ix+2)",
  "ld   h,(ix+3)",
  "ld   (hl),a",
  "ret"
}

function byte pokew(word, word)
{
  "ld   ix,2",
  "add  ix,sp",
  "ld   l,(ix+2)",
  "ld   h,(ix+3)",
  "ld   a,(ix+0)",
  "ld   (hl),a",
  "inc  hl",
  "ld   a,(ix+1)",
  "ld   (hl),a",
  "ret"
}

function inline byte peekb(word)
{
  "ld a,(hl)"
}

function inline word peekw(word)
{
  "ld e,(hl)",
  "inc hl",
  "ld d,(hl)",
  "ex de,hl"
}

La función pokew seguramente se pueda escribir para que se ejecute más rápida (usando quizás instrucciones del estilo de EX (SP),HL ), pero bueno, lo que es funcionar, funciona.

Con estas funciones, he escrito un pequeño programa, para incluir a CCZ80 en el ranking que a lo tonto a lo tonto, se ha hecho en este otro hilo.

El programa es éste:

Código: Seleccionar todo

byte y;
word tf,x;

pokew(23672,0);

for (y = 0; y <= 175; ++y)
{
  for (x = 0; x <=255 ; ++x)
  {
    plot(x,y);
  }
}

tf=peekb(23672)+256*peekb(23673);
stream(1);
at(1,0);
printw(tf);
pause(0);
return;

Su ejecución tarda 500 "retrazos verticales". El hecho con el compilador de Boriel, que es éste:

Código: Seleccionar todo

DIM y as ubyte
DIM x as uinteger
DIM tf as uinteger

poke 23672,0
poke 23673,0

FOR y = 16 TO 191
  FOR x = 0 TO 255
      PLOT x,y
  NEXT x

NEXT y
tf=peek(23672)+256*peek(23673)
print at 23,0;tf
pause 0

Se ejecuta en 498 "retrazos verticales". Practicamente el mismo tiempo (50 milisegundos de diferencia).
Usando PEEKW en lugar de la expresión con PEEKB en CCZ80 no acelera la cosa (se ve que la multiplicación y la suma no toman practicamente nada de tiempo).

UPDATE: usando punteros, he reescrito el programa en CCZ80:

Código: Seleccionar todo

byte y;
word tf,x;

tf=23672;
**tf=0;

for (y = 0; y <= 175; ++y)
{
  for (x = 0; x <=255 ; ++x)
  {
    plot(x,y);
  }
}

stream(1);
at(1,0);
printw(**tf);
pause(0);
return;

Y ahora tarda 499 "retrazos verticales" :D

Con lo que se ve que tanto CCZ80 como ZX Basic son dos opciones muy a tener en cuenta para programar :)

Tengo que hacer benchmarks usando el SDCC... a ver si pillo tiempo, pero me da a mi que los resultados van a estar muy muy ajustados a lo que dan estos dos compiladores.
Web: ZX Projects | Twitter: @zxprojects

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Vie Abr 16, 2010 8:29 pm

Buena programación la de pokeb, pokew, peekb y peekw, poco más se puede optimizar. Sin embargo, esas funciones no son necesarias, por en ccz80 usando el operador * o ** se puede acceder y escribir en cualquier posición de memoria, con mayor velocidad que mediante la función. Ejemplos:

Código: Seleccionar todo

*12345 = 10; // Equivale a pokeb(12345, 10)
**12345 = 1000; // Equivale a pokew(12345, 1000)
byte n; n = *12345; // Equivale a n = peekb(12345);
word m; m = **12345; // Como puede suponerse ya, equivale a m = peekw(12345);


Te dejo a ti que pruebes el programa modificado usando estos conceptos, a ver qué rápido va.

Por cierto, que con la versión 3.0.0 se pueden crear macros equivalentes a las funciones, por si así se hace más legible el programa:

Código: Seleccionar todo

define pokeb(direccion, valor) = (*direccion = valor);
define pokew(direccion, valor) = (**direccion = valor);
define peekb(direccion) = (*direccion);
define peekw(direccion) = (**direccion);


Y el uso de estas macros sería idéntico al de las funciones que has escrito.
Prueba todo esto porque lo he escrito directamente aquí, sin probarlo por falta de tiempo. Ya contarás qué tal ha funcionado y si no me he equivocado en algo.

EDITO: Perdona mcleod_ideafix, no había visto que habías reescrito con punteros el programa, usando lo que he puesto al principio de esta respuesta. De cualquier forma, ahí queda como explicación de lo que has hecho.

Dinoneno
rst 0
Mensajes: 18
Registrado: Dom Ene 13, 2008 6:52 pm

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por Dinoneno » Jue Ene 06, 2011 8:28 am

Regalo de Reyes: nuevo IDE para ccz80.

http://www.ccz80.tk

Avatar de Usuario
radastan
Phantomas
Mensajes: 2201
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Lenguaje de programación para Z80 útil para Spectrum

Mensaje por radastan » Jue Ene 06, 2011 11:11 am

La descarga no va, me baja un fichero de 29 KB.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 5 invitados