Autor Tema: Mi biblioteca de funciones para Sprites en cc65. V.01  (Leído 16064 veces)

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« en: Mayo 12, 2010, 22:41:46 »
Hola.

Pues aquí os dejo la biblioteca de funciones que he hecho durante estos dias para facilitar el uso de sprites en cc65.

Todavía quedan muchas cosas por limar, optimizar, y cosas que me gustaría añadir, pero creo que como primera versión, cumple bastante bien su cometido.

Todavía no tienen ningún tipo de control de errores y me gustaría implementar una nueva función para la detección de colisiones o para creación de sprites multicolores, o para expandir sprites, etc... queda mucho por mejorar.

De momento son 4 funciones:

- Crear Sprite.
- Activar Sprite.
- Mover Sprite.
- Desactivar Sprites.

Espero que a la gente que esté empezando le pueda servir de utilidad. Creo que simplifican y ordenan bastante el trabajo. Y a la gente que no, espero que esto les pueda a animar a empezar a picarle el gusanillo de la programación para c64.

En el zip he incluído una pequeña documentación, aunque creo que son fáciles e intuitivas de usar, pero bueno. También va el código fuente de un pequeño ejemplo que usa la librería y el ejemplo ya compilado en .prg.

Yo aun tengo muchas dudas, pero si vamos poniendo nuestros pequeños granos de arena, podemos darle vida a esto. Si alguien la usa y tiene alguna duda, por aquí andamos.

Ni que decir tiene que se aceptan sugerencias, mejoras, modificaciones de la librería, etc...

Un saludo a todos!

Un imagen del pequeño ejemplo:



Como bien se puede ver, es Yuri Gagarin haciendo frente a una horda de alienigenas rebotadores anticomunistas, bien cabreados. En cuanto colisionen con él, se acabará el juego. Es en lo que derivó aquel ejemplo cutre del avioncillo. (Vale, prometo currarmelo un poco más para la próxima). Se juega con joystick en port 2.

Y aquí la libreria: http://www.megaupload.com/?d=7N65HQS0

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #1 en: Mayo 12, 2010, 23:35:19 »
Aquí el código de las funciones:

[code]
void mueveSprite(int x, int y,int numSprite)
{
   int potencia=1, i=0, vc=4096*13, xm;

   //bucle para hallar la potencia (Sprite)
      for(i=1;i<=numSprite;i++)    
      {
         potencia *= 2;
      }

      if(numSprite==0)
         potencia=1;

   
   //Usamos el registro para la x mayor de 255
   if (x>=256)
   {
      //x=x-256;
      POKE(vc+16,PEEK(vc+16)|potencia);
   }
   if(x<256){
      //POKE(vc+16,PEEK(vc+16));
      xm=255-potencia;
      POKE(vc+16,PEEK(vc+16)&xm);
   }

   POKE(vc+2*numSprite,x);
   POKE(vc+2*numSprite+1,y);
}



int activaSprite(int numSprite)
{
   //numsprite solo puede valer de 0 a 8
   if(numSprite>=8 || numSprite<0)
      return 1;
   else
   {
      int potencia=1, i=0, vc=4096*13;
      
      //Bucle para hallar la potencia
      for(i=1;i<=numSprite;i++)    
      {
         potencia *= 2;
      }

      if(numSprite==0)
         potencia=1;
      //Activael registro correspondiente
      POKE(vc+21,PEEK(vc+21)|potencia);
      return 0;
   }
}

void desactivarSprites(void)
{
   //Pone a 0 todoslos bits del registrode activacion.
   POKE((4096*13)+21,0);
}


void creaSprite(char *datosSprite, int color,int numSprite)
{
   int i=0,vc=4096*13;

   POKE(2040+numSprite,248+numSprite);

   for (i=0;i<=63;i++)   //relleno el sprite 0 leyendo datos del array sprite[]
   POKE((248*64)+i+(64*numSprite),datosSprite[i]);

   POKE(vc+39+numSprite,color);      //color del sprite 0



}
[/quote]

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #2 en: Mayo 13, 2010, 00:13:16 »
conio.inc!!! GENIAL!! Cuando pueda las voy a probar, pero no sabes cómo me estaba esperando alguna librería asi :) :)

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 649
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #3 en: Mayo 13, 2010, 11:58:01 »
Me alegra que la gente se anime a hacer sus pinitos en programación, lo ideal sería crear una pequeña comunidad en español donde pudiéramos compartir ideas, dudas y opiniones.

Yo estoy dispuesto a aportar dentro de mis conocimientos.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #4 en: Mayo 13, 2010, 12:11:48 »
Estaba pensando en mirar la librería de Spectrum que usan los mojones, quizas podríamos hacer una librería masomenos parecida y asi quizas tener la posiblidad de hacer alguna portabilidad de sus juegos... ¿o estoy delirando? :D

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #5 en: Mayo 14, 2010, 20:04:18 »
Josezpin, he leído sobre esa librería, pero no le echado un ojo, ni se como funciona. Estaría bien mirarla, aunque solo fuera para tomar ideas.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #6 en: Mayo 14, 2010, 21:20:15 »
Las librerías que hay para 8bits (Spectrum y Amstrad) parecen MUY completas, y por lo tanto me imagino que tendrá montones de funciones y cosas.

Así que veo algo irreal querer hacer apenas empezar algo asi, pero sí lo que me parece interesante sería poder usar la nomenclatura de las funciones, la forma de organizar la librería, etc..

Habría que ver cual es la que más conviene usar y ver qué se puede aprovechar.

cpcrslib, CPC Amstrad: http://www.amstrad.es/programacion/c Varios juegos desarrollados

splib2, Spectrum: http://www.speccy.org/foro/viewtopic.php?f=6&p=20774 Varios juegos desarrollados, esta discontinuada y la nueva version es SP1

SP1, Spectrum: http://www.z88dk.org/wiki/doku.php Continuacion de la splib2, aunque no sé si hay juegos españoles que la usan.

¡Hay para elegir!

Me resulta increíble que no exista NADA similar para C64, o bueno, seguro que existen, lo increíble es que no se hayan liberado o no sean conocidas

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #7 en: Mayo 18, 2010, 22:24:12 »
Me han prestado un casi-miniportatil, que he preparado para tener mis cosas aparte del trabajo, asi que lo he preparado con el CC65, emulador y demas cosas necesarias para el retrohobby :)

Y finalmente hoy pude probar esto que has hecho y de paso ver en que puedo aportar.

El  ejemplo va perfecto! Voy mirando el codigo y me vienen algunas preguntas mas bien genericas sobre C.

Y lo primero que me llamo la atencion es que haces unas operaciones y bucles para calcular las potencias, etc. Me imagino que sera para operar a nivel de bit. Lo poco que recuerdo de assembler es que esas operaciones son mucho mas directas, ya que el codigo maquina esta preparado para acceder de otra manera...
Otra cosa... de donde sale bordercolor, bgcolor, clrscr?? Me imagino que vienen en alguna de estas librerias... #include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <peekpoke.h>
#include <unistd.h>

De donde salen?? hay documentacion de esas librerias?

EDITO: vale, he encontrado sobre estas librerias: http://www.cc65.org/doc/funcref.html

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #8 en: Mayo 18, 2010, 23:25:39 »
Hola Josepzin.

Pues te comento.

Lo de la potencia es un poco chapucilla que hay que cambiar. Normalmente en C, existe una función llamada "pow" en la librería math.h, que te devuelve el valor de la potencia, pero aquí no encontré nada parecido, así que opté por hacerlo a lo bestia. En el programa, como bien has dicho, solamente las uso para saber qué bit hay que tocar, a partir del número de sprite. Es decir, que si a la función le llega el número de sprite 3, su bit será 2^3.

Seguramente en ensamblador sea mucho más directo, como dices. De hecho imagino que para que el programa esté mucho más optimizado, lo ideal sería utilizar rutinas de ensamblador en el cl65, pero todavía es un campo que me queda grande. Espero ponerme dentro de poco a verlo. :D

Las funciones que dices están en conio.h. Y ahí has encontrado la documentación, que está bastante bien echarle un ojo, aunque yo particularmente, como programador torpe que soy, echo de menos bastante ejemplos prácticos... Pero bueno, poco a poco y probando...

Un saludete!

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #9 en: Mayo 18, 2010, 23:28:15 »
...Por cierto. Que me alegra mucho que la pruebes, hehe.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 649
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #10 en: Mayo 19, 2010, 09:35:48 »
No estaría mal que de aquí pudiese surgir algún tipo de colaboración en forma de juego sencillo...  :D

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #11 en: Mayo 19, 2010, 10:52:10 »
Hola a todos

(Mi primer post aqui)

Yo he programado(en 2008) algo de una libreria para usar con cc65, pero las funcciones estan programadas en código máquina(se pueden llamar desde C claro). Mi intención era crear una libreria similar aquella de z88dk de spectrum.

Las funcciones que tengo implementas son(las cabezeras):

[code]
void init_irq(void);
void bitmap_mode(void);
void tile_mode(void);
void hires_mode(void);
void multicolor_mode(void);
void __fastcall__ set_vicBank(unsigned char bank);
void __fastcall__ set_bitmapPos(unsigned char pos);
void __fastcall__ set_charmemPos(unsigned char pos);
void __fastcall__ set_screenPos(unsigned char pos);
void __fastcall__ set_background(unsigned char cor);
void __fastcall__ set_border(unsigned char cor);
void __fastcall__ set_multicolor1(unsigned char cor);
void __fastcall__ set_multicolor2(unsigned char cor);
void __fastcall__ c64_PrintTile(unsigned char x, unsigned char y, unsigned char TileNum);
void __fastcall__ c64_CreateSpr(struct sprite *);
void __fastcall__ c64_SprMc(unsigned char mc1, unsigned char mc2);
void __fastcall__ c64_SprOnOff (struct sprite *);
void __fastcall__ c64_OnOff (struct sprite *);
void c64_SprEnable (struct sprite *);
void c64_SprColor (struct sprite *);
void c64_SprXexpand (struct sprite *);
void c64_SprYexpand (struct sprite *);
void c64_SprPattern (struct sprite *);
void c64_SprMcm (struct sprite *);
void __fastcall__ c64_MoveSpr(struct sprite *spr);[/quote]

Saludos

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 649
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #12 en: Mayo 19, 2010, 11:15:10 »
Hola Wood, bienvenido al foro aunque creo que sé quién eres...  :)

Un par de preguntas sobre tus funciones:

- ¿porqué algunas de ellas no las has definido como __fastcall__ ?
- comentas que las funciones están programadas en assembler, yo hasta ahora he definido variables en assembler y las he usado (exportado) en mi programa C pero nunca he probado lo contrario, es decir, pasar como parámetro una variable a una función en assembler, ¿podrías poner un ejemplo de código?

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #13 en: Mayo 19, 2010, 11:51:29 »
Bienvenido!! :)

A ver si terminamos ese nanako, y esas funciones nos vienen GENIAL!

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Mi biblioteca de funciones para Sprites en cc65. V.01
« Respuesta #14 en: Mayo 19, 2010, 11:55:41 »
Hola Carlos,

Yo ya te habia mencionado mi libreria en nuestras charlas MSNeras.

Un ejemplo de código:

fichero .h

[code]extern unsigned int screen;
extern unsigned int vicBank;

void __fastcall__ set_multicolor1(unsigned char cor);
[/quote]
fichero assembler:

[code];---------------------------------------------
;void __fastcall__ set_multicolor1(unsigned char);
;---------------------------------------------
         .export _set_multicolor1;
         
_set_multicolor1:   sta $d022
               rts

;---------------------------------------------------------------------------------
;variables, tables, data...
;---------------------------------------------------------------------------------
.export _screen, _vicBank

_vicBank:
.word $0000
_screen:
.word $0400[/quote]