Empezando con SDCC

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re: Empezando con SDCC

Mensajepor Mode 2 » Mar 24 Abr , 2012 10:58 pm

Bueno, pues tengo la cpcrslib al 70% ya para SDCC, "solo" me falta la parte del mapa de tiles.
Pues acá hay uno esperando que la portes al completo para trastear con ella y el SDCC. ¡Ánimo, fiera! ;-)
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.

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

Re: Empezando con SDCC

Mensajepor Artaburu » Mar 24 Abr , 2012 11:02 pm

Pues a esperar unos días más. A ver si para la semana que viene me da tiempo y luego ya jugamos con el SDCC que también me apetece explotarlo un poco.
Salu2,
Arta

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re: Empezando con SDCC

Mensajepor Mode 2 » Mar 24 Abr , 2012 11:07 pm

¡¡Guay!! 8)
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.

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

Re: Empezando con SDCC

Mensajepor Artaburu » Sab 28 Abr , 2012 11:35 am

Vaya, otra "pega" del SDCC es que no tiene una forma de incluir binarios directamente, no tiene nada similar a INCBIN "fichero.bin" así que hay que darle una vuelta para poder incorporarlo.
Existen unos programas que convierten un binario en un array de datos para C que se puede utilizar, por ejemplo el BIN2C.EXE pero el formato que genera hay que arreglarlo para que nos sirva. Por ahora solo he conseguido que funcione convirtiéndolo a ASM.
Salu2,
Arta

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

Re: Empezando con SDCC

Mensajepor Artaburu » Sab 28 Abr , 2012 1:13 pm

Canastos... esto va a parecer un rosario de pegas :D
Me he encontrado que si quiero enviar un texto al estilo printf("hola mundo"); pero a otra rutina cpc_printString("Hola mundo"; No va. El código que genera apunta en HL a $0048 como si hubiera dejado el texto "Hola mundo" ahí pero en realidad no pone nada en $0048.
Si defino una cadena externa sí que lo hace bien, pero es un poco incómodo definir las cadenas previamente a utilizarlas :(
Salu2,
Arta

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

Re: Empezando con SDCC

Mensajepor Artaburu » Dom 29 Abr , 2012 5:23 pm

Ains...
esta me ha matado porque no consigo avanzar, posiblemente haya forma de hacerlo pero mi C no es muy profundo.
Resulta que en SDCC no se pueden pasar estructuras como argumentos y yo tengo un montón de funciones que van con structucturas en los parámetros. ¿Alguna idea?
Por ejemplo:

Código: Seleccionar todo

void cpc_PutMaskSprite(int *sprite, int *posicion);
sprite es una estructura de sprites y cuando la envío desde C el compilador dice que SDCC no permite pasar estructuras por parámetros.
¿Se os ocurre alguna idea?
Salu2,
Arta

Avatar de Usuario
robcfg
Master of The Forum
Master of The Forum
Mensajes: 1306
Registrado: Jue 03 Abr , 2008 5:32 pm
Ubicación: Estocolmo
Contactar:

Re: Empezando con SDCC

Mensajepor robcfg » Dom 29 Abr , 2012 6:11 pm

Estas declarando los parametros como puntero a enteros y luego pasando una estructura.

En el caso de sprite, si la estructura se llama asi, deberia aparecer en la declaracion de funcion como sprite *pSprite y no como int *sprite.

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

Re: Empezando con SDCC

Mensajepor Artaburu » Dom 29 Abr , 2012 8:22 pm

Gracias robcfg.

Declaro en libreria.lib:

Código: Seleccionar todo

void cpc_PutMaskSprite(struct sprite *pSprite, int *posicion);
en code.c:

Código: Seleccionar todo

struct sprite { // minimun sprite structure
int sp0; //2 bytes 01
int sp1; //2 bytes 23
int coord0; //2 bytes 45 current superbuffer address
int coord1; //2 bytes 67 old superbuffer address
unsigned char cx, cy; //2 bytes 89 current coordinates
unsigned char ox, oy; //2 bytes 1011 old coordinates
unsigned char move1; // los bits 4,3,2 definen el tipo de dibujo!!
unsigned char move; // in this example, to know the movement direction of the sprite
};
struct sprite sprite00, sprite01;
Y luego hago la llamada:

Código: Seleccionar todo

cpc_PutMaskSprite(*sprite01,0xc150);
Pero me da error todo el rato (juego con el * y cada vez da un error diferente), no me compila.
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:

Re: Empezando con SDCC

Mensajepor Mochilote » Dom 29 Abr , 2012 9:18 pm

Y luego hago la llamada:

Código: Seleccionar todo

cpc_PutMaskSprite(*sprite01,0xc150);
Pero me da error todo el rato (juego con el * y cada vez da un error diferente), no me compila.
La llamada tiene que ser:

Código: Seleccionar todo

cpc_PutMaskSprite(&sprite01,0xc150);
Saludos.

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

Re: Empezando con SDCC

Mensajepor Artaburu » Dom 29 Abr , 2012 9:34 pm

Tampoco, me dice lo siguiente:

Código: Seleccionar todo

code.c:124: error 78: incompatible types
from type 'struct sprite near* auto'
to type 'struct sprite generic* fixed'
Salu2,
Arta

Avatar de Usuario
zogo
Me voy lanzando
Me voy lanzando
Mensajes: 43
Registrado: Lun 03 Jul , 2006 2:53 pm

Re: Empezando con SDCC

Mensajepor zogo » Dom 29 Abr , 2012 9:48 pm

Hola Arta,

A mi me funciona asi

Código: Seleccionar todo

struct sprite { // minimun sprite structure
int sp0; //2 bytes 01
int sp1; //2 bytes 23
int coord0; //2 bytes 45 current superbuffer address
int coord1; //2 bytes 67 old superbuffer address
unsigned char cx, cy; //2 bytes 89 current coordinates
unsigned char ox, oy; //2 bytes 1011 old coordinates
unsigned char move1; // los bits 4,3,2 definen el tipo de dibujo!!
unsigned char move; // in this example, to know the movement direction of the sprite
};

struct sprite sprite00, sprite01;

void cpc_PutMaskSprite(struct sprite *spr,unsigned int addr) {
spr->cx = 0;

}

void main(void) {
cpc_PutMaskSprite(&sprite00, 0xc000);
}
Saludos

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

Re: Empezando con SDCC

Mensajepor Artaburu » Dom 29 Abr , 2012 10:01 pm

Gracias a todos.
Efectivamente, metiendo la función en el código sí que la acepta (tal como hace zogo) pero declarando la función en cpcrslib.h me da el error que he puesto antes.

cpcrslib.h:

Código: Seleccionar todo

#ifndef __cpcrslib_h__
#define __cpcrslib_h__

void cpc_PutMaskSprite(struct sprite *spr,unsigned int *addr);

void cpc_UnExo(int *origen, int *destino);
void cpc_Uncrunch(int *origen, int *destino);


void cpc_SetMode( char color);
void cpc_SetModo( char x);
void cpc_SetColour(unsigned char num, char color);
void cpc_SetInk(unsigned char num, char color);
void cpc_SetBorder( char color);
unsigned char cpc_Random(void);

void cpc_ClrScr(void);

void cpc_PutSprite(int *sprite, int *posicion);
void cpc_PutSp(int *sprite, char *height, char *width, int *address);
void cpc_PutSpriteXOR(int *sprite, int *posicion);
void cpc_PutSpXOR(int *sprite, char *height, char *width, int *address);
void cpc_PutSpriteTr(int *sprite, int *posicion);
void cpc_PutSpTr(int *sprite, char *height, char *width, int *address);
void cpc_GetSp(int *sprite, char alto, char ancho, int *posicion);

void cpc_PutMaskSp(int *sprite, char alto, char ancho, int *posicion);




void cpc_RRI(unsigned int pos, unsigned char w, unsigned char h);
void cpc_RLI(unsigned int pos, unsigned char w, unsigned char h);


int cpc_AnyKeyPressed(void);
void cpc_ScanKeyboard(void);
char cpc_TestKeyF(char number);
void cpc_DeleteKeys(void);
void cpc_AssignKey(unsigned char tecla, int valor);
unsigned char cpc_TestKey(unsigned char tecla);
void cpc_RedefineKey(unsigned char tecla);

int cpc_GetScrAddress(char x, char y);

void cpc_PrintStr(int *cadena);

void cpc_EnableFirmware(void);
void cpc_DisableFirmware(void);

void cpc_PrintGphStr(int *text, int *destino);
void cpc_PrintGphStrM1(int *text, int *destino);
void cpc_PrintGphStr2X(int *text, int *destino);
void cpc_PrintGphStrM12X(int *text, int *destino);

void cpc_PrintGphStrXY(int *text, char a, char b);
void cpc_PrintGphStrXYM1(int *text, char a, char b);
void cpc_PrintGphStrXY2X(int *text, char a, char b);
void cpc_PrintGphStrXYM12X(int *text, char a, char b);
void cpc_SetInkGphStr(char a, char b);
void cpc_SetInkGphStrM1(char a, char b);

void cpc_PrintGphStrStd(char color, int *cadena, int *destino);
void cpc_PrintGphStrStdXY(char color, int *cadena, char x, char y);

#endif /* __cpcrslib_h__ */
y en code.c:

Código: Seleccionar todo

#include <stdio.h>
#include <cpcrslib.h>

extern int buffer[];
extern int sp_1[];
extern int sp_2[];
extern int tintas[];

struct sprite { // minimun sprite structure
int sp0; //2 bytes 01
int sp1; //2 bytes 23
int coord0; //2 bytes 45 current superbuffer address
int coord1; //2 bytes 67 old superbuffer address
unsigned char cx, cy; //2 bytes 89 current coordinates
unsigned char ox, oy; //2 bytes 1011 old coordinates
unsigned char move1; // los bits 4,3,2 definen el tipo de dibujo!!
unsigned char move; // in this example, to know the movement direction of the sprite
};


void dummy(void){
__asm
_buffer:
//defs 30
.db #0,#0,#0,#0,#0,#0
.db #0,#0,#0,#0,#0,#0
.db #0,#0,#0,#0,#0,#0
.db #0,#0,#0,#0,#0,#0
.db #0,#0,#0,#0,#0,#0

_sp_1:
//.db #4,#16 //sprite dimensions in bytes withd,# height
.db #0xFF,#0x00,#0x00,#0xCF,#0x00,#0xCF,#0xFF,#0x00 //data: mask,# sprite,# mask,# sprite...
.db #0xAA,#0x45,#0x00,#0x3C,#0x00,#0x3C,#0x55,#0x8A
.db #0x00,#0x8A,#0x00,#0x55,#0x00,#0xAA,#0x00,#0x45
.db #0x00,#0x8A,#0x00,#0x20,#0x00,#0x00,#0x00,#0x65
.db #0x00,#0x28,#0x00,#0x55,#0x00,#0xAA,#0x00,#0x14
.db #0x00,#0x7D,#0x00,#0xBE,#0x00,#0xFF,#0x00,#0xBE
.db #0xAA,#0x14,#0x00,#0xFF,#0x00,#0xBE,#0x55,#0x28
.db #0xAA,#0x00,#0x00,#0x3C,#0x00,#0x79,#0x55,#0x00
.db #0x00,#0x51,#0x00,#0x51,#0x00,#0xA2,#0x55,#0xA2
.db #0x00,#0xF3,#0x00,#0x10,#0x00,#0x20,#0x00,#0xF3
.db #0x00,#0xF3,#0x00,#0x51,#0x00,#0xA2,#0x00,#0xF3
.db #0x55,#0x28,#0x00,#0x0F,#0x00,#0x0F,#0xAA,#0x14
.db #0xFF,#0x00,#0x55,#0x0A,#0xAA,#0x05,#0xFF,#0x00
.db #0x55,#0x02,#0x55,#0x28,#0xAA,#0x14,#0xAA,#0x01
.db #0x00,#0x03,#0x55,#0x02,#0xAA,#0x01,#0x00,#0x03
.db #0xFF,#0x00,#0xFF,#0x00,#0xFF,#0x00,#0xFF,#0x00
_sp_2:
.db #4,#22
.db #0xFF,#0x00,#0xFF,#0x00,#0xFF,#0x00,#0xFF,#0x00
.db #0xFF,#0x00,#0x00,#0xCC,#0x00,#0xCC,#0xFF,#0x00
.db #0xFF,#0x00,#0xAA,#0x44,#0x55,#0x88,#0xFF,#0x00
.db #0xFF,#0x00,#0xAA,#0x44,#0x55,#0x88,#0xFF,#0x00
.db #0xFF,#0x00,#0xAA,#0x44,#0x55,#0x88,#0xFF,#0x00
.db #0xFF,#0x00,#0x00,#0xCF,#0x00,#0xCF,#0xFF,#0x00
.db #0xAA,#0x45,#0x00,#0xCF,#0x00,#0xCF,#0x55,#0x8A
.db #0xAA,#0x45,#0x00,#0xE5,#0x00,#0xDA,#0x55,#0x8A
.db #0xAA,#0x45,#0x00,#0xCF,#0x00,#0xCF,#0x55,#0x8A
.db #0xAA,#0x45,#0x00,#0xCF,#0x00,#0xCF,#0x55,#0x8A
.db #0xAA,#0x45,#0x00,#0xCF,#0x00,#0xCF,#0x55,#0x8A
.db #0xAA,#0x45,#0x00,#0xCF,#0x00,#0xCF,#0x55,#0x8A
.db #0xFF,#0x00,#0x00,#0xCF,#0x00,#0xCF,#0xFF,#0x00
.db #0xAA,#0x01,#0x00,#0x03,#0x00,#0x03,#0x55,#0x02
.db #0x00,#0xA9,#0x00,#0x03,#0x00,#0x03,#0x00,#0x56
.db #0x00,#0xA9,#0x00,#0x03,#0x00,#0x03,#0x00,#0x56
.db #0xAA,#0x01,#0x00,#0x03,#0x00,#0x03,#0x55,#0x02
.db #0xAA,#0x01,#0x00,#0x03,#0x00,#0x03,#0x55,#0x02
.db #0xAA,#0x01,#0x00,#0x06,#0x00,#0x09,#0x55,#0x02
.db #0xFF,#0x00,#0x00,#0x0C,#0x00,#0x0C,#0xFF,#0x00
.db #0xFF,#0x00,#0x00,#0x0C,#0x00,#0x0C,#0xFF,#0x00
.db #0xFF,#0x00,#0x00,#0x0C,#0x00,#0x0C,#0xFF,#0x00

// There is a tool called Sprot that allows to generate masked sprites for z88dk.
// ask for it: www.amstrad.es/forum/


_tintas: //firmware inks
.db #0,#13,#1,#6,#26,#24,#15,#8,#10,#22,#14,#3,#18,#4,#11,#25
__endasm;
}

void set_colours(void) {
unsigned char x;
for (x=0;x<16;x++){
cpc_SetInk(x,tintas[x]);
}
cpc_SetBorder(0);
}


void main(void){

//unsigned char a;

struct sprite sprite01;

set_colours();

cpc_SetModo(0);

cpc_DisableFirmware();
// All the sprite values are initilized
/* sprite00.sp1=*sp_1;
sprite00.sp0=*sp_1;
sprite00.ox=50;
sprite00.oy=70;
sprite00.cx=50;
sprite00.cy=70;
sprite00.move1=3;


sprite01->sp1=*sp_2;
sprite01->sp0=*sp_2;
sprite01->ox=50;
sprite01->oy=106;
sprite01->cx=50;
sprite01->cy=106;
sprite01->move=1;
sprite01->move1=3;*/

// void cpc_PutMaskSp(int *sprite, char alto, char ancho, int *posicion);
//cpc_PutMaskSp(sp_1,16,4,0xc150);
cpc_PutMaskSprite(&sprite01,0xc150);


}
Os dejo lo que llevo de librería por si se os ocurre algo.
Adjuntos
cpcrslib.rar
(6.54 KiB) Descargado 117 veces
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:

Re: Empezando con SDCC

Mensajepor Mochilote » Lun 30 Abr , 2012 9:24 am

Supongo que el problema está en que en el momento de incluir cpcrslib.h, no sabe todavía que es la estructura sprite. Imagino que se soluciona metiendo la estructura

struct sprite { // minimun sprite structure
int sp0; //2 bytes 01
int sp1; //2 bytes 23
int coord0; //2 bytes 45 current superbuffer address
int coord1; //2 bytes 67 old superbuffer address
unsigned char cx, cy; //2 bytes 89 current coordinates
unsigned char ox, oy; //2 bytes 1011 old coordinates
unsigned char move1; // los bits 4,3,2 definen el tipo de dibujo!!
unsigned char move; // in this example, to know the movement direction of the sprite
};

al comienzo de cpcrslib.h, o bien en code.c, justo antes de hacer el #include <cpcrslib.h>.

Saludos.

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

Re: Empezando con SDCC

Mensajepor Artaburu » Lun 30 Abr , 2012 3:53 pm

Pues sí, ahora creo que ya sí que funciona. Estoy probando y pinta bien. ¡Pondré las conclusiones! =D>
Salu2,
Arta

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

Re: Empezando con SDCC

Mensajepor Artaburu » Lun 30 Abr , 2012 4:32 pm

Pues esta es la conclusión:
cpcrslib.lib

Código: Seleccionar todo

void cpc_PutMaskSp(int *sprite, char alto, char ancho, int *posicion);
code.c

Código: Seleccionar todo

...
struct sprite { // minimun sprite structure
int *sp0; //2 bytes 01
int *sp1; //2 bytes 23
int coord0; //2 bytes 45 current superbuffer address
int coord1; //2 bytes 67 old superbuffer address
unsigned char cx, cy; //2 bytes 89 current coordinates
unsigned char ox, oy; //2 bytes 1011 old coordinates
unsigned char move1; // los bits 4,3,2 definen el tipo de dibujo!!
unsigned char move; // in this example, to know the movement direction of the sprite
} sprite01; // si no pongo aquí sprite01 y lo pongo en main() no lo direcciona bien el compilador


#include <cpcrslib.h>
...

cpc_PutMaskSprite(&sprite01,0xc000);
...
¡Muchísimas gracias a todos por vuestra ayuda!
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