Pues acá hay uno esperando que la portes al completo para trastear con ella y el SDCC. ¡Ánimo, fiera!Bueno, pues tengo la cpcrslib al 70% ya para SDCC, "solo" me falta la parte del mapa de tiles.
Empezando con SDCC
- Mode 2
- 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
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.
Re: Empezando con SDCC
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
Arta
- Mode 2
- 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
¡¡Guay!!
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.
Re: Empezando con SDCC
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.
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
Arta
Re: Empezando con SDCC
Canastos... esto va a parecer un rosario de pegas
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
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
Arta
Re: Empezando con SDCC
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:
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?
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);
¿Se os ocurre alguna idea?
Salu2,
Arta
Arta
- robcfg
- Master of The Forum
- Mensajes: 1306
- Registrado: Jue 03 Abr , 2008 5:32 pm
- Ubicación: Estocolmo
- Contactar:
Re: Empezando con SDCC
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.
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.
Re: Empezando con SDCC
Gracias robcfg.
Declaro en libreria.lib:
en code.c:
Y luego hago la llamada:
Pero me da error todo el rato (juego con el * y cada vez da un error diferente), no me compila.
Declaro en libreria.lib:
Código: Seleccionar todo
void cpc_PutMaskSprite(struct sprite *pSprite, int *posicion);
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;
Código: Seleccionar todo
cpc_PutMaskSprite(*sprite01,0xc150);
Salu2,
Arta
Arta
Re: Empezando con SDCC
La llamada tiene que ser:Y luego hago la llamada:Pero me da error todo el rato (juego con el * y cada vez da un error diferente), no me compila.Código: Seleccionar todo
cpc_PutMaskSprite(*sprite01,0xc150);
Código: Seleccionar todo
cpc_PutMaskSprite(&sprite01,0xc150);
Re: Empezando con SDCC
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
Arta
Re: Empezando con SDCC
Hola Arta,
A mi me funciona asi
Saludos
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);
}
Re: Empezando con SDCC
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:
y en code.c:
Os dejo lo que llevo de librería por si se os ocurre algo.
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__ */
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);
}
- Adjuntos
-
- cpcrslib.rar
- (6.54 KiB) Descargado 117 veces
Salu2,
Arta
Arta
Re: Empezando con SDCC
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.
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.
Re: Empezando con SDCC
Pues sí, ahora creo que ya sí que funciona. Estoy probando y pinta bien. ¡Pondré las conclusiones!
Salu2,
Arta
Arta
Re: Empezando con SDCC
Pues esta es la conclusión:
cpcrslib.lib
code.c
¡Muchísimas gracias a todos por vuestra ayuda!
cpcrslib.lib
Código: Seleccionar todo
void cpc_PutMaskSp(int *sprite, char alto, char ancho, int *posicion);
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);
...
Salu2,
Arta
Arta
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |