Empezando con z88dk

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Empezando con z88dk

Mensajepor Artaburu » Lun 09 Jul , 2007 10:29 am

Hace un mes o así me animé a probar con el C para el CPC usando el z88dk, algún avance he hecho y me gustaría compartirlo con todos, para que os animéis a usarlo que no es nada complicado y se consiguen cosas muy interesantes. Para empezar, un pequeño tutorial para hacer librerías para nuestro CPC:

Haciendo una librería para CPC.

Como ejemplo, voy a meter cómo dibujar un sprite en pantalla que tiene bastantes parámetros para pasar: Posición pantalla, sprite y dimensiones. Cada parámetro, independientemente de si es un char o un int ocupa 2 bytes. En caso de ser char, uno de los bytes será 0.

1. Crear el código. El nombre del fichero será el mismo que el de la rutina. En este caso:
imp_sp_normal.asm

Código: Seleccionar todo

XLIB imp_sp_normal


.imp_sp_normal ; dibujar en pantalla el sprite
; Entradas bc-> Alto Ancho
; de-> origen
; hl-> destino
; Se alteran hl, bc, de, af

ld hl,2
add hl,sp ; Los parámetros entran en la pila, a partir de la siguiente posición a la actual.
push hl
pop ix
ld l,(ix+0)
ld h,(ix+1)
ld a,(ix+2)
ld c,(ix+4)
ld e,(ix+6)
ld d,(ix+7)

defb $DD
LD H,c ;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE

ld (ancho+1),a

.loop_alto_2
.ancho
ld b,0
push hl
.loop_ancho_2
ld A,(DE)
ld (hl),a
inc de
inc hl
dec b
jp nz,loop_ancho_2
pop hl
defb $DD
dec H
ret z

ld A,H
add $08
ld H,A
sub $C0
jp nc,loop_alto_2
ld bc,$c050
add HL,BC
jp loop_alto_2
Como los parámetros se pasan por pila, los tengo que recoger y meterlos en los registros que voy a usar. En este caso, como son varios parámetros, uso el registro ix para acceder a ellos. Si fuera sólo uno lo haría usando HL que es más rápido.

2. Para compilar el código en una librería tengo que meter los componentes (nombres de las rutinas) en un archivo con el nombre de la librería:
libreria.lst

Código: Seleccionar todo

imp_sp_normal

3. Compilo la librería:

Código: Seleccionar todo

z80asm -v -xlibreria.lib @libreria.lst
4. Para usarla en un programa tengo que hacer el fichero de las cabeceras: libreria.h

Código: Seleccionar todo

#ifndef _CPCRSLIB_H
#define _CPCRSLIB_H
extern void __LIB__ imp_sp_normal(int *sprite, char *ancho, char *alto, int *posicion);
#endif
[i]_fin_[/i]
5. En el código fuente de mi programa tengo que incluir la librería: [b]ejemplo.c [/b]
[i]_inicio_[/i]
#include "libreria.h"

// Mi sprite:
extern char coche[8];
#asm
._coche
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
#endasm

main() {
int *sprite;
sprite=coche;
imp_sp_normal(sprite,4,2,0xC000);
}

6. Compilo mi ejemplo:

Código: Seleccionar todo

zcc +cpc -create-app -make-app -O3 -unsigned -o ejemplo.bin ejemplo.c -llibreria
7. Cargo mi fichero en un emulador y a jugar!

8. Si quisiera hacer una rutina que devolviera un valor, éste valor se tiene que asignar a HL antes de terminar la rutina. En el fichero de cabecera se indica qué valor se devuelve y en el código de mi programa se tiene que asignar a algo. Por ejemplo, si quisiera saber la última posición de la pantalla dibujada por la rutina de los sprites:
libreria.h

Código: Seleccionar todo

#ifndef _CPCRSLIB_H
#define _CPCRSLIB_H
extern int __LIB__ imp_sp_normal(int *sprite, char *ancho, char *alto, int *posicion);
#endif

ejemplo.c

Código: Seleccionar todo

#include "libreria.h"

// Mi sprite:
extern char coche[8];
#asm
._coche
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
#endasm

main() {
int *sprite;
int z;
sprite=coche;
z=imp_sp_normal(sprite,4,2,0xC000);
}
Salu2,
Arta

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Lun 09 Jul , 2007 12:23 pm

Hombre, que interesante, ya sabes que yo le eché un ojo hace tiempo al z88dk, yo hice pruebas mezclando asm y c en el mismo codigo, pero sin hacer una libreria como tú, que es mucho mejor desde luego.

La verdad que dedicando un buen rato a hacer una buena librería para el cpc en asm, despues sería facilisimo hacer juegos ya en c...

Lastima de tiempo :(


Saludos.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 09 Jul , 2007 12:44 pm

Hombre, que interesante, ya sabes que yo le eché un ojo hace tiempo al z88dk, yo hice pruebas mezclando asm y c en el mismo codigo, pero sin hacer una libreria como tú, que es mucho mejor desde luego.

La verdad que dedicando un buen rato a hacer una buena librería para el cpc en asm, despues sería facilisimo hacer juegos ya en c...

Lastima de tiempo :(


Saludos.
En realidad, yo sólo he hecho alguna pruebecilla pero zogo se está currando una librería de categoría.
¿Te acuerdas cómo pasabas valores entre c y asm cuando hiciste las pruebas?
Salu2,
Arta

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Lun 09 Jul , 2007 12:53 pm

En realidad, yo sólo he hecho alguna pruebecilla pero zogo se está currando una librería de categoría.
¿quien es zogo? ¿la va a integrar en z88dk o la librería va por libre? ¿o es privada?
¿Te acuerdas cómo pasabas valores entre c y asm cuando hiciste las pruebas?
Pues no acuerdo de nada para ser sincero, pero creo que ya lo tienes hecho en tu codigo, desde c tienes la variable "coche" y desde asm "_coche".

Saludos.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 09 Jul , 2007 1:03 pm

En realidad, yo sólo he hecho alguna pruebecilla pero zogo se está currando una librería de categoría.
¿quien es zogo? ¿la va a integrar en z88dk o la librería va por libre? ¿o es privada?
¿Te acuerdas cómo pasabas valores entre c y asm cuando hiciste las pruebas?
Pues no acuerdo de nada para ser sincero, pero creo que ya lo tienes hecho en tu codigo, desde c tienes la variable "coche" y desde asm "_coche".

Saludos.
Sí, pero si quiero usar una variable desde asm metido en c no se cómo hacerlo. Bueno sí se pero el problema es que me ubica temporalmente el valor en &0000 y se me casca el programa:

Código: Seleccionar todo

unsigned char x,y; // esto es lo que asigna en &0000 y &0001

void imprimir(void){
// unsigned char x,y;
char *direccion;

x=65;
y=66;
//direccion=cadena;
#asm
ld a,(_x)
call $bb5a
ld a,(_y)
call $bb5a
//ld hl,(_direccion)
//ld a,(hl)
//call $bb5a
#endasm
}
Salu2,
Arta

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Lun 09 Jul , 2007 1:23 pm

Sí, pero si quiero usar una variable desde asm metido en c no se cómo hacerlo. Bueno sí se pero el problema es que me ubica temporalmente el valor en &0000 y se me casca el programa:

Código: Seleccionar todo

unsigned char x,y; // esto es lo que asigna en &0000 y &0001

void imprimir(void){
// unsigned char x,y;
char *direccion;

x=65;
y=66;
//direccion=cadena;
#asm
ld a,(_x)
call $bb5a
ld a,(_y)
call $bb5a
//ld hl,(_direccion)
//ld a,(hl)
//call $bb5a
#endasm
}
Y has probado a cambiar esto:

Código: Seleccionar todo

unsigned char x,y;
por esto:

Código: Seleccionar todo

extern unsigned char x,y;

#asm
._x
defb $00
._y
defb $00
#endasm
Y dejar lo demás igual.

¿que hay del tal zogo?

Saludos.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 09 Jul , 2007 4:05 pm

Sí que he probado pero creo que tampoco me funciona. Lo vuelvo a probar porque ya no estoy seguro.

Zogo está haciendo una librería que se usará en los juegos de CEZ que se harán multiplataforma. No se si la liberará pero lo que ví de la librería está muy bien. De vez en cuando se pasa por aquí así que a ver qué nos cuenta.
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Mar 10 Jul , 2007 8:19 am

Nada, hace lo mismo. El problema creo que está en lo que ya puse, cuando asigna temporalmente un valor en C para luego meterlo en el acumulador en ASM, usa las posiciones a partir de &0000 y me parece que ahí casca el programa al ejecutarse :(
Pero es extraño, el mismo código en otro sitio sí funciona bien :?:
Salu2,
Arta

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Mar 10 Jul , 2007 10:04 am

Arta, ¿estas probando con la versión 1.6 o con la 1.7BETA?

Yo recuerdo que tuve problemas justo en lo mismo que tú y por eso (y falta de tiempo) abandoné el compilador. Esperemos que esté arreglado en la nueva versión, que por cierto libera oficialmente dentro de 5 días.

Si puedes, prueba con la 1.7BETA:

http://www.z88dk.org/cms/data/files/z88 ... 070624.zip


Saludos.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Mar 10 Jul , 2007 10:08 am

Arta, ¿estas probando con la versión 1.6 o con la 1.7BETA?

Yo recuerdo que tuve problemas justo en lo mismo que tú y por eso (y falta de tiempo) abandoné el compilador. Esperemos que esté arreglado en la nueva versión, que por cierto libera oficialmente dentro de 5 días.

Si puedes, prueba con la 1.7BETA:

http://www.z88dk.org/cms/data/files/z88 ... 070624.zip


Saludos.
Pues no, es una versión anterior, la 2.55. No sabía que había versión nueva :D ¡A por ella!
Muchas gracias.

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Mar 10 Jul , 2007 11:08 am

Pues no, es una versión anterior, la 2.55.
¿Querias decir la 1.55?

Bueno, a ver si con la nueva te rula bien, que me estas picando a probarlo y no tengo tiempo :cry:

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Mar 10 Jul , 2007 11:13 am

Perdón, sí. Me he bajado la nueva pero me dice el XP que no la puede ejecutar. ¿Te va a tí?
Salu2,
Arta

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Mar 10 Jul , 2007 11:56 am

Perdón, sí. Me he bajado la nueva pero me dice el XP que no la puede ejecutar. ¿Te va a tí?
Pues lo acabo de probar y no tiran en mi xp tampoco :cry: de todas formas, bajate la 1.6 que es más avanzada que la tuya y prueba a ver. Tendremos que esperar 5 días para probar la 1.7 :P


Saludos.

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Mié 11 Jul , 2007 9:08 am

Echa un ojo a esto Artaburu,
http://www.geocities.com/aralbrec/sprit ... m#ADVZ88DK

Y especialmente a esto:
http://www.geocities.com/aralbrec/spritepack/pacmen.zip

Es un ejemplo de z88dk+splib de spectrum, pero mezclan c y asm al parecer sin problemas, quizas aquí veas la solución. Ah, y mira como usan desde asm en el c llamadas a funciones de librería, interesante.

Saludos.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Mié 11 Jul , 2007 1:17 pm

Interesante, he intentado copiar lo que hace el pacmen ese pero sigo con problemas. Me está volviendo loco la asignación que hace la cosa esta. No se si tiene problemas con algunos nombres de variables o qué. Jarlll.
Salu2,
Arta


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic