Autor Tema: Programacion grafica con cc65  (Leído 13145 veces)

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Programacion grafica con cc65
« en: Febrero 04, 2009, 13:28:08 »
Hola a todos,

Me he decidido a empezar a programar algunas cosillas con graficos del c64 (sprites, bitmaps, ....) con vistas a hacer un juego algún día.

Como controlo mas bien poco (entre cero y nada) de ensamblador del 6502/6510 estoy usando lenguaje C con el compilador cc65 (http://www.cc65.org/) éste compilador además de soportar C también trae su propio cross-assembler por lo que poco a poco intentaré ir portando alguna de las rutinas de C a asm por motivos de rendimiento.

El caso es que la documentación sobre usar cc65 con gráficos es mas bien escasa, la mayoría de tutoriales que he visto son directamente en assembler.

Entre esto y que aún estoy entiendiendo la arquitectura de memoria/registros del C64 pues estoy bastante perdido. Hasta ahora ya he conseguido hacer cosillas con sprites pero me ha sido imposible, por ejemplo, cargar un bitmap.

Me gustaría saber si hay mas gente que use esta herramienta para programar con el c64 o al menos que controle de programación gráfica y me pueda echar una mano con alguna de mis dudas... :wink:

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Programacion grafica con cc65
« Respuesta #1 en: Marzo 14, 2010, 23:59:20 »
A ver si aprovecho el "subidón" de Retromadrid para poner el primer ladrillo y empezar a mirar el tema de la programación.

Siguiendo tus consejos, me he descargado el C65 y voy a mirar el hello.c a ver que tal... seguro que ya te preguntaré algunas cosas jeje
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #2 en: Marzo 15, 2010, 08:58:51 »
Hola Jose, antes de nada decir que fué un placer conocerte.

Como puedes ver ese post ya tiene más de un año y algo he aprendido desde entonces :wink: , todas las dudas básicas que tenía sobre programación gráfica ya las tengo mas o menos resueltas. Es verdad que no estoy para hacer un 'Deus ex Machina' o un 'Mayhem in Monsterland' pero al menos en lo que se refiere a sprites, modos bitmap y char, incluso las interrupciones raster pues mas o menos me defiendo...

El cc65 está muy bien, además es una herramienta que se sigue actualizando sacando nuevas versiones que corrigen bugs, etc...

La mejor página para aprender estos temas, y sin duda la que más me ha ayudado, es la C64 Codebase: http://codebase64.org/doku.php?id=start

Cualquier duda que tengas al respecto, pregúntala por aquí e intentaré echarte una mano si puedo.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Programacion grafica con cc65
« Respuesta #3 en: Marzo 16, 2010, 23:42:39 »
Obviamente también para mi fue un placer :)

Vi la antiguedad del hilo pero me pareció el lugar indicado para plantear el tema.

La web de codebase64 parece tener mucha información, me la quedo.

Primera pregunta basica sobre el entorno de trabajo:
1 - ¿cómo lo has organizado? Las carpetas de cc65, las carpetas de tus proyectos, etc.
2 - ¿Usaste el instalador de CC65 para Windows o descargaste los archivos en tu propia carpeta?
3 - Para compilar/ejecutar ¿usas un .bat? Creo que me dijiste que usas el Scite...

En fin, todo lo que me puedas orientar sobre el entorno básico de trabajo, que me cuesta bastante empezar desde cero... :S
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Programacion grafica con cc65
« Respuesta #4 en: Marzo 17, 2010, 00:57:45 »
¡Tengo mi primer "hola mundo"!!

Aunque tengo mil dudas básicas, al menos ya pude ver algo... Carlos, me interesa saber como te has creado tu espacio de trabajo, cualquier cosa que me puedas decir al respecto será bienvenida.

Ahora sólo me queda aprender C... :p
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 144
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #5 en: Marzo 17, 2010, 03:27:43 »
Yo llegué a compilar algún programa hecho en C, además de algunos ejemplos que venían con cc65, siempre sin salirme de las librerias Stdio o Stdlib.

Creo que se puede depurar con el emulador VICE, pero no lo he probado porque siempre he hecho pequeños ejemplos... y también es interesante leer la documentación para saber como optimizar bien el código (por ejemplo, inicializar las variables a la hora de la declaración, evitar usar tipos de datos "long", etc...).

Pero es verdad que en la parte gráfica no especifica nada. ¿Existe alguna manera de controlar sprites sin recurrir a ninguna sentencia en ensamblador ni a peeks o pokes?

He mirado la página que has puesto, Carlos (que está muy bien, por cierto), pero solo veo explicaciones con ensamblador.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #6 en: Marzo 17, 2010, 08:49:28 »
Coño, nunca había visto tanto movimiento en el subforo de programación  :lol: , intentaré responder a todo.

josepzin, mi entorno de trabajo me lo he montado de la siguiente manera:

- Uso el scite como IDE de desarrollo, puedes usar el que más te guste (el notepad++, Crimson Editor e incluso el Visual Studio) yo quería uno que fuese lo más sencillo posible y el scite lo es (incluso ni necesita instalación). A partir de aquí lo más cómodo es configurar unas macros para el editor (decirle que tiene que ejecutar exactamente cuando compilas, linkas, ...) lo suyo es configurar tres: una para compilar de C a ASM, otra para compilar de ASM a código objeto y la tercera para linkar todo.

- Como suite de compilación uso, evidentemente, el cc65 (actualmente uso la versión 2.13.0 aunque ya ha salido la 2.13.2). Las utilidades que uso son cc65 (compilador de C), ca65 (de assembler) y ld65 (linker). Las diferencias entre usar el instalador de la versión para Windows o descargar y descomprimir el zip es que el primero ya te crea las variables de entorno necesarias para trabajar mientras que en el segundo lo tienes que hacer a mano. Yo me suelo bajar el zip porque ya sé cuales son las variables que hay que poner.

- Como 'entorno de ejecución' uso el WinVice, es el más cómodo y el mejor emulador.

Y poco más, el resto es crearte el directorio de tu proyecto y empezar a probar, no se me ocurre mucho más que contarte...

Dr. Fred, la depuración es lo más jodido ya que no existe un debugger como en los compiladores actuales, se que hay gente que usa el monitor que trae el Vice para hacerlo pero yo ahí me pierdo. La depuración la hago de modo artesanal, sacando por pantalla valores de variables y cosas así hasta dar con el problema... un coñazo vamos!

De la parte gráfica no hay una documentación específica como tal. Hay que entender los conceptos de cómo funcionan las cosas (ahí la codebase64 es muy útil) y después la mayoría de las cosas se pueden controlar desde C. ¿Para controlar los sprites sin recurrir a ensamblador? pues lo mejor es usar las macros PEEK y POKE que trae el cc65 y que no son más que punteros a las direcciones de memoria que le especifiques, es la forma más eficiente técnicamente hablando de hacerlo. Si tu pregunta va mas bien por si existen algún tipo de librerías que te permitan hacer el trabajo con sprites, la respuesta es no (que yo sepa) pero si sabes C no es demasiado difícil montarte unas.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Programacion grafica con cc65
« Respuesta #7 en: Marzo 18, 2010, 00:06:44 »
Gracias Carlos, aunque sean cosas obvias, a mi me son útiles.

Por ejemplo, primero me había bajado el CC65 en zip, porque mientras menos cosas instaladas mejor, pero viendo que no me funcionaba tuve que usar el instalador. No tengo idea cuales son las variables de entorno que hay que crear... a ver si miro la documentacion.

Luego, de C no sé nada, en su epoca supe Turbo Pascal y Assembler, pero de eso hace demasiado tiempo, y veo que no estoy familiarizado con los conceptos de C, por ejemplo lo de "linkar" es nuevo para mi.

He visto un ejemplo de hello.c que usa un include text.s, no sabía que ese archivo hay que agregarlo cuando se hace el link (ld65)

Entonces ¿a la hora de linkar cada programa puede ser distinto, dependiendo de los includes?

Me estoy mirando este curso de C como para tener una mínima idea del tema: http://c.conclase.net/curso/index.php?cap=002#inicio

Yo sé programar en PHP, Javascript, Actionscript y alguno mas. Todos lenguajes de "alto nivel", que no necesitan declarar nada (o casi)

Ya te preguntaré mas cosas... jeje
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 144
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #8 en: Marzo 18, 2010, 06:27:54 »
Aaaah, había visto esas funciones de Peek y Poke. Voy a ver si hago algún pequeño ejemplo... y hacer una librería de manejo de sprites, no sería una mala idea, la verdad.

Josepzin, el enlazado (linkar), no es algo exclusivo de C. A veces se utiliza el término compilar para referirse a todo (es decir compilado+linkar), pero en realidad el proceso de compilar es la "traducción" de tu programa fuente escrito en C (o el lenguaje que sea) a código máquina, lo cual no produce un ejecutable, sino un programa objeto (normalmente con extensión .o) y luego ya vendría la parte de enlazado, donde se "incluyen" las funciones utilizadas en tu código fuente, produciendo un ejecutable.

Normalmente, los entornos de desarrollo integrados, lo hacen todo automáticamente, por lo que no vemos este proceso.

De todas maneras, si sabes ensamblador, seguro que C no resulta ningún problema para ti y puede ser usado tanto a bajo como a alto nivel.

Sobre lo de Text.s, creo que es un archivo escrito en ensamblador, donde se define la cadena "Hello World". Yo he probado a quitarlo y definir la cadena directamente en el archivo fuente de C, y sin problemas.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #9 en: Marzo 18, 2010, 13:58:12 »
Dr. Fred lo ha explicado perfectamente, el proceso de compilado + linkado es común a todos los lenguajes de programación (hablo de los lenguajes compilados obviamente los interpretados no) al menos hasta que yo programaba de modo profesional (ahora con .NET y todas estas nuevas cosas no tengo ni idea).

Aquí hay un enlace que lo explica muy claramente: http://www.cc65.org/doc/intro-1.html#ss1.3

Como os he comentado el cc65 no es únicamente un compilador de C sino una suite que incluye varios módulos: el cc65 (compilador de C), el ca65 (cross-assembler) y el ld65 (linker), además de otras utilidades como el cl65 que te hace el compilado, ensamblado y linkado en un único paso (aunque a mi me gusta mas hacerlo por separado para detectar errores más facilmente y porque soy algo masoquista :lol: ).

Cuando escribimos un programa en C primero lanzamos el cc65 para transformarlo en código ensamblador del 6510 (ficheros de extensión .s) posteriormente lanzamos el ca65 (para transformarlo de ensamblador a código objeto) y finalmente el ld65 (para linkarlo con las librerías necesarias y generar el ejecutable). Hay gente que programa directamente en ensamblador y para ello sólo usa el ca65 (como cualquier otro cross-assembler para C64 como el KickAss, el ACME, ...) y prescinde totalmente del cc65 al no usar código C de ningún tipo.

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 144
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #10 en: Marzo 19, 2010, 22:56:05 »
He hecho un pequeño ejemplo con un sprite que se mueve por la pantalla a través del joystick (usando las funciones que proporciona cc65 para el joystick). La verdad es que el resultado de lujo. Os dejo aquí el código:

[code]
#include <conio.h>
#include <stdlib.h>
#include <peekpoke.h>
#include <joystick.h>

int main (void)
{
unsigned char i=0;
unsigned char a[11]={0,-1,1,0,0,-1,1,0,0,-1,1}; //array de posiciones del joystick
unsigned char b[11]={0,0,0,0,-1,-1,-1,0,1,1,1};
unsigned char sprite[64]={0,24,0,0,24,0,0,
                   60,0,0,60,0,0,60,0,
                   0,60,0,0,36,0,0,36,
                   0,0,36,0,16,102,8,16,
                   189,8,17,126,136,18,255,72,
                   29,255,184,30,60,120,0,60,
                   0,0,60,0,0,60,0,0,
                   60,0,0,126,0,0,255,0}; //Array con los datos de los puntos del Sprite 0 (un avión ^^)
unsigned char c,x=150,y=100,j=0;
int vc=53248;

joy_load_driver ("c64-stdjoy.joy"); //carga el driver del joystick

bordercolor (0);   //borde negro
bgcolor (0);      //fondo negro
clrscr();         //limpia pantalla

POKE(2040,13);      //asigno puntero del Sprite 0

for (i=0;i<=64;i++)   //relleno el sprite 0 leyendo datos del array sprite[]
   POKE(832+i,sprite[i]);

POKE(vc+21,255);   //activa sprite 0
POKE(vc+39,7);      //color del sprite 0 (amarillo)
   


while (j==0)      //bucle infinito
{
   POKE(vc,x);      //posicion x de sprite 0
   POKE(vc+1,y);

   c=joy_read(1);   //devuelve posición del joystick

   x=x+b[c];      //recalcula las coordenadas de X e Y
   y=y+a[c];
   
}


    return EXIT_SUCCESS;
}
[/quote]

Al ser pequeño, no lo he estructurado en funciones, ni nada.

Una cosa es que he notado que me da un warning de que la variable vc es un long... pero no se me ocurre otra manera de definirlo, a no ser que sea haciendo un casting. De momento lo acepta y la usa bien en el programa, aunque advierte de que manejar longs lo ralentiza.

Otra duda que se me ocurre es que (aunque aquí no lo he utilizado), en la colisión de Sprites, necesitaría hacer un AND lógico en el byte del registro de colisión (el 53278). ¿Esto en C cómo lo haría? ¿Con el operador &&?

Bueno, creo que de momento el experimento ha salido satisfactorio. He probado a hacer el programa directamente en basic y claro está, el de código máquina se ejecuta muchísimo más rápido.

Aquí os dejo el archivo por si quereis probarlo en algún emulador (yo utilizo VICE). Se utiliza con el joystick en el puerto 2.

http://www.megaupload.com/?d=UQ2FKZ3B


Por cierto, he descubierto un programa muy interesante para observar el valor de todos los registros de memoria que está muy curioso. Se llama ICU64 y lo he probado con el VICE. Echadle un ojo en este video:

http://www.youtube.com/watch?v=tjcvR5McmSg

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #11 en: Marzo 20, 2010, 14:49:54 »
Vaya, pues lo he ejecutado con el VICE y a mi no me carga nada...

Sobre el warning que comentas, es porque has inicializado una variable int con un valor que está fuera de su rango por eso te la convierte automaticamente en long. Defínela como unsigned int y ya está.

El AND lógico (a nivel de bits) se hace con el operador & , el otro (con el operador &&) es el AND de comparación.

NicoGalis

  • Commodore Master
  • *****
  • Mensajes: 269
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #12 en: Marzo 20, 2010, 16:29:29 »
Me gustaria ver el resultado de la prueba, pero a mi tampoco me carga nada Dr.Fred

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 144
    • Ver Perfil
Programacion grafica con cc65
« Respuesta #13 en: Marzo 20, 2010, 17:16:28 »
Ups, pues teneís razón. Es porque se necesita tener el driver del joystick en la misma carpeta. Os lo cuelgo aquí:

http://www.megaupload.com/?d=QMT3IWLV

Lo cuelgo también por rapidshare: http://rapidshare.com/files/365900015/c64-stdjoy.joy.html


Con los dos archivos en la misma carpeta, ya debería ejecutaroslo.  :)

Huuummmm.... y no existe alguna manera de que este driver pueda venir integrado ya en el fichero todo en uno?

Bueno, gracias Carlos por resolverme las dudas. Seguiré probando cosas.

Un saludo!

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Programacion grafica con cc65
« Respuesta #14 en: Marzo 20, 2010, 20:22:47 »
Dr.Fred: tu sprite es un MIG-21 :)
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com