Autor Tema: Programando para C64 en C++  (Leído 9228 veces)

SirArthur

  • Commodore Master
  • *****
  • Mensajes: 210
  • No.. yo no me lo hago en los cementerios ;)
    • Ver Perfil
Programando para C64 en C++
« en: Julio 14, 2016, 10:25:55 »
Me he topado con este video que me ha dejado ojiplático o_O No se si alguno de los que aquí lleváis montones de tiempo programando para el C64 habíais visto esto o se os había ocurrido intentarlo. Se trata de programar PARA Commodore 64 en el lenguaje C++ Se que hay algun tipo de C para C64,pero C++ es bastante diferente. Aunque está basado en C, y hay muchísimas cosas "compatibles" es un lenguaje que necesita más recursos de inicio, por lo que tener un compilador C++ en C64 supongo que es imposible. Aunque no me he puesto a mirar y podría estar diciendo una burrada.

¿Asi es que como se hace? Pues a ver.. si lo he entendido bien sería algo así. Se hace en un PC ,en el video usa linux pero imagino que podrá valer en windows. Se escribe el código en C++ y se obtiene como veis en el vídeo el equivalente en ensamblador para x86. El truco está que desde el programa C++, el sujeto que hace este video hace llamadas directas a memoria a las posiciones que son las que quisieras manejar/manipular/leer en el C64, es decir, lo equivalente a pokes y peeks para leer o escribir. Si eso se ejecutara en un PC seguramente sería catástrofe al acceder a posiciones protegidas o vete a saber, pero ese código no funcionará finalmente en un PC Una vez obtenido el equivalente del programa C++ en ensamblador x86 parece que usa un compiler o herramienta especial "x86-to-6502" que hace el trabajo duro de transformar el ensamblador x86 a código máquina del 6502, y hace que el resultado lo saque por pantalla. Entonces copia ese texto y lo pega en el programa Turbo Macro 1.2 de C64,usando emulador claro. Finalmente se ejecuta y tachán.. funciona..

Alguno dira.. pues vaya currada para solo unas líneas que podrías hacer directamente en C64. Sí, cierto. Pero con (mucho) tiempo y ganas se podría crear un IDE en PC que pudieras programar directamente en C++, y pulsando un botoncito automáticamente haría todo el proceso anterior y se visualizaría en el emulador. NO es lo mismo que por ejemplo el CBM prg Studio, en el CBM hay que programar en Basic o en ensamblador del 6502. Aqui solo programarías en C++ que quitada la barrera inicial de entender lo de los objetos es un lenguaje tremendamente potente

Así en poco tiempo podrias hacerte tus propias librerías chulas C++ para manejar puertos, joysticks, zonas de memoria, sprites, crear objetos de soldado, de nave, de bala.. Reutilizarlas, mejorarlas, Yo creo que los que sepáis C++ sabéis a qué me refiero.

Bueno pues ahí lo dejo.. no se si alguien algún día le gustaria tomar este proyecto, no se si ya hay algo en marcha o a medias o finalizado pero me gustaria saber vuestra opinión :)

Un ejemplo sencillo y de lo que podría ser en C++ crear un nuevo soldadito y mostrarlo por pantalla en la posición 50,80 ya con atributos de resistencia,velocidad y todo lo que se ocurriera :)
Soldado patoso = new Soldado(20,5);//Soldado (int Resistencia,int velocidad)
patoso.show(50,80);

y aqui matamos al soldado patoso XD
patoso.death();

https://www.youtube.com/watch?v=nLv_INgaLq8

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11844
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Programando para C64 en C++
« Respuesta #1 en: Julio 14, 2016, 14:06:32 »
No tengo tiempo de ver el video ahora, pero comento porque algo estuve jugando con C para C64.

El principal problema que le veo a esto es que el código generado seguro que no está nada optimizado para el 64, no porque esté mal hecho sino porque al querer hacer cosas como uno las haría en un lenguaje de alto nivel, ya con eso la estás cagando ;)

Me imagino que implementar una programación orientada a objetos debe generar un montón de código extra sólo para que ese ejemplo del soldado que has puesto sea entendido, cuando hacer lo mismo en ensamblador, usando la "lógica" de un sistema de 8 bits con poca memoria, ocuparía el 1% y sería más rápido.

Igual estoy hablando sin conocimientos suficientes... a lo Aigor :P

Lo que comentas del IDE, creo que es mas o menos lo que se hace con CC65 (o cualquier cruzado), editas en un Notepad++, le das a F5 y tienes el emulador corriendo con lo que has hecho.
En el camino el emulador generó varios archivos, compiló, enlazó y yo que sé más :P

Hace mucho hice una entrada sobre CC65: https://josepzin.blogspot.com/2010/08/tutorial-instalacion-entorno-C-para-C64.html

Algún día lo retomaré :'(

Portiella

  • Commodoremaníaco
  • ****
  • Mensajes: 109
  • SYS 0
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #2 en: Julio 14, 2016, 17:09:47 »
Te comento, toda la vida he trabajado en C y C++ y muchos años en ensamblador (C64, Amiga e Intel) y he mirado los primeros minutos del video hasta donde empieza a hacer una función de memoria y te diré que la herramienta tiene muy buena pinta, parece muy buena pero creo que es útil para la enseñanza.

En el ejemplo enseñan como crear una función/subrutina para asignar una valor a una dirección de memoria, esto en el mundo real para hacer un juego es imposible! sería muy lento, ningún juego se movería con soltura, te explico, realizar una llamada JSR/CALL implica un montón de ciclos, aumentar el stack(pila), reducir el stack (al acabar) y en muchos casos si la función retorna un valor perder un registro.
Otro ejemplo que he visto es controlar el joystick y los bits, hacer una función para eso es estar tirando los ciclos a la basura.

Está muy bien para enseñar y jugar con esa herramienta, pero nada mas.

SirArthur

  • Commodore Master
  • *****
  • Mensajes: 210
  • No.. yo no me lo hago en los cementerios ;)
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #3 en: Julio 16, 2016, 09:36:13 »
Ya me parecía demasiado idílico XD A ver yo tb he programado años en C y C++ y como dije en el mensaje soy consciente que C++ exige de inicio más recursos que C. Lo que me faltaba por cuadrar era ver si esto podría ser práctico. Imaginaba que no podría estar optimizado al ser algo tan automático. Si quisiéramos apurar al límite no queda más remedio que ir directamente al ensamblador en C64. Pensaba que quizá aunque fuera con algo de desaprovechamiento podría ser útil para algun juego sencillo. Esta claro tal como me habéis dicho que de esta forma se genera demasiado código extra,desperdiciando ciclos,memoria etc.. con lo cual no es útil en ninguna forma salvo como curiosidad o algun programa tremendamente sencillo. Entendido,si el C64 tuviera 20 mhz igual si valdría XD

Gracias a ambos y me miraré lo del CC65 Jose, la CPCtelera funciona por esa misma vía del C y mira que de juegos salen. A ver si alguien se atreviera a crear algo parecido :)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11844
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Programando para C64 en C++
« Respuesta #4 en: Julio 16, 2016, 12:08:49 »
Los juegos mojonos para c64 están hechos usando cc65,  aunque usando ensamblador para mover gráficos.

A ver si @Wood nos puede dar detalles.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 649
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #5 en: Julio 18, 2016, 09:40:40 »
Yo en su día también programé en C usando el famoso cc65, hasta que me pasé al ensamblador (aunque llevo un par de años sin tocar una línea de código).

Se pueden hacer cosas chulas, incluso juegos que no estén basados en mover gráficos de forma eficiente. En Atari por ejemplo que comparte procesador, hay juegos muy buenos como el His Dark Majesty: http://hdm.atari.pl/

Todo lo que han comentado del grado de optimización que te permite un ensamblador respecto al C es muy cierto, pero siempre existe la posibilidad de usar macros (el mejor para eso es el KickAss) y tener esa especie de lenguaje de alto nivel pero seguir programando en assembler.

SirArthur

  • Commodore Master
  • *****
  • Mensajes: 210
  • No.. yo no me lo hago en los cementerios ;)
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #6 en: Julio 20, 2016, 10:47:24 »
Correcto.. Muy bien pues ahi voy.. Teniendo en cuenta que la posibilidad de: usar C o crear y usar macros en ensamblador existe.. ¿No se podría hacer una especie por ejemplo de Lua para C64? Un lenguaje terriblemente sencillo que directamente trasladara cada comando a su correspondiente equivalencia como macro de ensamblador. Se muy bien que sería terriblemente complejo y si no se hace bien acabarías con un código enorme que sería imposible siquiera de ejecutar. Pero es otra posibilidad. No se podrían hacer superjuegazos optimizados hasta el límite pero si algo incluso mejor que seuck y herramientas del mismo tipo al ser más flexible y tener más posibilidades. Y ojo.. lo que es para herramientas y programas podria servir perfectamente también


Pero bueno todo esto son fantasías animadas de ayer y hoy mientras alguien no se ponga a hacerlo.. :P

Portiella

  • Commodoremaníaco
  • ****
  • Mensajes: 109
  • SYS 0
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #7 en: Julio 20, 2016, 12:54:10 »
Partes del error de que algo en C (o cualquier lenguaje) es convertible a ensamblador de una sola forma.
Cuando compilas un lenguaje el compilador convierte a código máquina pero hay muchas formas de convertir, no siempre interesa usar macros, no siempre interesa convertir de la misma forma, para eso está el programador y la picaresca humana.
Por ejemplo, los compiladores en los bucles pequeños siempre suelen hacer el contador del bucle con el mismo registro (por ejemplo Y), ¿que pasa si ese registro lo estás usando? pues que se guarda en el stack o en una dirección de RAM. Si se programa a pelo el programador verá si está libre el registro X y lo usará, y si no está libre tal vez se puede replantear cambiar un poco el código para que lo esté.
Es el arte de programar, un compilador nunca puede llegar al nivel de optimización de un buen programador, aunque los compiladores modernos hacen maravillas.

SirArthur

  • Commodore Master
  • *****
  • Mensajes: 210
  • No.. yo no me lo hago en los cementerios ;)
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #8 en: Julio 21, 2016, 11:50:53 »
No he hecho apenas nada en ensamblador pero si mucho en varios lenguajes de programación y hasta un programador novato sabe que hay millones de caminos que llevan a Roma, millones de formas mejores,peores,optimizadas o con bugs de hacer las cosas. Y a eso le añadimos las diferentes herramientas que uses, en este caso los compiladores. Creo que lo ves desde la óptica donde te gustaria tenerlo todo optimizado, sin bugs y rapidísimo. Eso sería ya en una versión final si es que tal cosa fuera posible. Yo no iba tan lejos. Eso ya di por obvio en el primer post que era imposible y fantasioso conseguir una traslación así y que lo ideal siempre va a ser hacerlo directamente en ensamblador en C64(y aun asi si se programa mal estamos en las mismas). Pero para cosas muy sencillas,aunque no estuviera optimizado, aunque fuera algo lento y muy mejorable si se hiciera directamente al ensamblador, podría crearse algo que diera juegos al nivel de SEUCK pero con la posibilidad añadida de poder crear más diferentes tipos de juegos al poder programar y no tener que usar una herramienta fácil pero encorsetada como es SEUCK.

El hecho es que se ha usado ya C en juegos para Commodore 64. Eso es un hecho tal como ha dicho Carlos o Jose sobre los juegos mojonos Aunque haya sido parcialmente y luego haya habido retoques, arreglos, etc al código final.. Si existe algo como la CPCtelera en CPC ¿por que no iba a poder hacerse en C64? Pasos ya hay ;)

Scooter

  • Commodorista
  • ***
  • Mensajes: 89
  • SYS 0
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #9 en: Julio 31, 2016, 15:50:44 »
A mi desde luego el invento de compilar en x86 y luego traducirlo a 6502 no me parece que de un código eficiente ni por asomo. A lo mejor me equivoco, claro.

Enviado desde mi fnac 5.7 mediante Tapatalk


riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Programando para C64 en C++
« Respuesta #10 en: Julio 31, 2016, 16:41:34 »
creo que es más que nada una demostración de que ciertas cosas que se pueden hacer en c++ sin que genere una cantidad de código gigante.

como demo, es interesante. pero como "producto" no creo que mucha gente se anime a usar c++17 para hacer algo de verdad en la c64... especialmente teniendo a cc65.

Es bueno saber que los compiladores modernos de c++ optimizan bien el código... no lo digo para usarlo en la c64, sino para los que usamos c++ para trabajar.

SirArthur

  • Commodore Master
  • *****
  • Mensajes: 210
  • No.. yo no me lo hago en los cementerios ;)
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #11 en: Agosto 21, 2016, 10:16:20 »
Eficiente es imposible que sea. Eficiente siempre será hacerlo directamente y estrujando hasta el último bit.. Es eso.. un ejemplo que para cierto tipo de cosas podria servir. ¿Desperdiciarías recursos al ir por esta vía? Esta claro Pero igual no hacen falta TODOS los recursos ni toda la memoria para hacer cierto tipo de programas o incluso juegos.

Tienes toda la razon Riq, sobre la optimización y sobre que la casi totalidad de gente que use C++17 no va a perder tiempo en crear cosas para C64 :o

Canseco

  • Commodorero
  • **
  • Mensajes: 47
  • SYS 0
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #12 en: Agosto 22, 2016, 16:02:57 »
En la wiki del compilador cc65 hay varios ejemplos de programas hechos con C y/o ensamblador:

https://github.com/cc65/wiki/wiki/Applications-written-in-C-or-C-with-assembler

Parece que lo usan para los menus, programas e incluso sistemas operativos como Contiki o LUnix. Supongo que les llevaria demasiado tiempo hacerlo todo en ensamblador.

Por cierto, esta el SEUCK Redux, un motor nuevo, con muchas mejoras que puede leer los datos del viejo SEUCK.

http://codebase64.org/doku.php?id=base:scrolling_and_seuck_file_player

Solo hace falta que alguien haga una interfaz en QT5 o algun otro framework multiplataforma, ;)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11844
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Programando para C64 en C++
« Respuesta #13 en: Agosto 22, 2016, 20:28:17 »
En la wiki del compilador cc65 hay varios ejemplos de programas hechos con C y/o ensamblador:

https://github.com/cc65/wiki/wiki/Applications-written-in-C-or-C-with-assembler

Parece que lo usan para los menus, programas e incluso sistemas operativos como Contiki o LUnix. Supongo que les llevaria demasiado tiempo hacerlo todo en ensamblador.

Muy bueno ese listado!

Canseco

  • Commodorero
  • **
  • Mensajes: 47
  • SYS 0
    • Ver Perfil
Re:Programando para C64 en C++
« Respuesta #14 en: Septiembre 25, 2016, 18:05:20 »
Interesante la reciente exposicion de Jason Turner, esta vez con C++17

https://www.youtube.com/watch?v=zBkNBP00wJE

Nota graciosa: El Powerpoint/Windows peta y se reinicia solo, pero el C64 no se cuelga ni una vez, ;)