CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Mié 18 Oct , 2017 4:07 pm

No es exactamente así. Te indico los detalles correctos:
  1. Global con inicialización (int a=100;)
    • Se reserva doble espacio (en RAM y ROM. RAM contiene la variable, ROM el valor inicial, 100. En nuestro caso, ambos en RAM realmente).
    • La variable no se inicializa, porque el código que copia los valores ROM a RAM está eliminado en CPCtelera (no tiene sentido para juegos en RAM).
    • El valor inicial de la variable es 0, ya que su espacio es estático, por tanto existe en el fichero binario y debe tener un valor ahí que es copiado a memoria junto a todo el binario. Esto es así para todas las variables globales/estáticas.
  2. Global sin inicialización (int x;) y posterior inicialización, por ejemplo, dentro de main (x = 100;)
    • Se reserva un espacio único en memoria (RAM). Al no haber valor inicial, este no debe ser almacenado en ROM.
    • El valor inicial de la variable es 0, dado que es estática (está en el binario).
    • Importante tener en cuenta que X = 100; en el main ocupa espacio (código) y es normalmente más que el que ocupa la variable.
  3. Constante global con inicialización (const int x = 100;)
    • Se reserva un espacio único en memoria (ROM según SDCC, aunque en este caso, será RAM en Amstrad).
    • El valor inicial de la constante es 100. No es necesario tener copia en RAM porque, al ser constante, no se espera que cambie. Por eso sólo se crea un valor.
    • Para modificar su valor hay que hacerlo con un poco de maña (a través de un puntero no constante a esa zona de memoria, o de cualquier otra forma que permita acceder a esa zona de RAM y cambiarla).
  4. Constante global sin inicialización (const int x;)
    • Idéntico al caso anterior, sólo que el valor sería 0.
    • No sé si el compilador te dejará. Debería quejarse, porque las constantes es obligatorio inicializarlas.
Estas son las opciones desde lenguaje C, sin bajar el nivel. Te queda como opción, definir la variable usando ensamblador y declararla en C como extern. De esa forma controlas el espacio exacto y valor inicial (la defines tú) y C accede a ella exactamente como tú quieres.
Ejemplo:

Código: Seleccionar todo

#include <cpctelera.h>
#include <stdio.h>

// SDCC sólo deja ensamblador inline dentro de una función
// Así que creamos una función __naked para que el código compile.
// Esta función sólo producirá una etiqueta (_dummy_function::) en ensamblador
// por lo que no nos generará nada de código adicional
void dummy_function() __naked {
__asm
;; Definimos una variable entera (int, 16 bits) y asignamos un valor
;; Los identificadores en C se convierten en etiquetas con un subrayado delante "_"
;; al ser compilados a ensamblador
_x:: .dw #0x1234
__endasm;
}

// Declaramos en C la existencia de la variable x, indicándole al
// compilador que no debe definirla (crear el espacio), sino sólo
// utilizarla porque ya existe y está definida en otro sitio (extern)
extern int x;

void main(void) {
// Usamos la variable X en lo que queramos, con normalidad
printf("My variable X vale %d\r\n", x);
while(1);
}

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Mié 18 Oct , 2017 4:28 pm

b) Global sin inicialización (int x;) y posterior inicialización, por ejemplo, dentro de main (x = 100;)
  • Se reserva un espacio único en memoria (RAM). Al no haber valor inicial, este no debe ser almacenado en ROM.
  • El valor inicial de la variable es 0, dado que es estática (está en el binario).
  • Importante tener en cuenta que X = 100; en el main ocupa espacio (código) y es normalmente más que el que ocupa la variable.
Esta me ha dejado todo loco <XX Por un lado, lo de que no se duplique (creo que ya lo tengo claro), por otro lado, sigamos adelante y me explico luego...
c) Constante global con inicialización (const int x = 100;)
  • Se reserva un espacio único en memoria (ROM según SDCC, aunque en este caso, será RAM en Amstrad).
  • El valor inicial de la constante es 100. No es necesario tener copia en RAM porque, al ser constante, no se espera que cambie. Por eso sólo se crea un valor.
  • Para modificar su valor hay que hacerlo con un poco de maña (a través de un puntero no constante a esa zona de memoria, o de cualquier otra forma que permita acceder a esa zona de RAM y cambiarla).
Vale, entonces una cuestión que no me queda clara (y que enlaza con lo de arriba)... parece claro que b) y c) son las opciones más adecuadas, por un lado en la opción b) x = 100; ocuparía espacio (código) y es normalmente más que el que ocupa la variable, pero por otro lado, en la opción c) declarar un puntero no constante y usarlo para hacer ptr = &x; *ptr = 100 también ocuparía espacio (código) y normalmente más que el que ocupa la variable (de hecho incluso parece que vaya a ocupar más que el de la opción b)) quizá lo único que facilita la opción b) es ponerle "gratis" el primer valor a la variable ¿no?
d) Constante global sin inicialización (const int x;)
[list
[*] Idéntico al caso anterior, sólo que el valor sería 0.
[*] No sé si el compilador te dejará. Debería quejarse, porque las constantes es obligatorio inicializarlas.[/list]
Compila perfectamente :mrgreen:

GRACIAS POR EL SOPORTE!!!!
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Mié 18 Oct , 2017 4:43 pm

Vale, entonces una cuestión que no me queda clara (y que enlaza con lo de arriba)... parece claro que b) y c) son las opciones más adecuadas, por un lado en la opción b) x = 100; ocuparía espacio (código) y es normalmente más que el que ocupa la variable, pero por otro lado, en la opción c) declarar un puntero no constante y usarlo para hacer ptr = &x; *ptr = 100 también ocuparía espacio (código) y normalmente más que el que ocupa la variable (de hecho incluso parece que vaya a ocupar más que el de la opción b)) quizá lo único que facilita la opción b) es ponerle "gratis" el primer valor a la variable ¿no?
No, el hecho de usar un puntero no tiene porqué hacer que ocupe más. Es muy dependiente de qué código adicional tengas en la función en la que haces la inicialización. Al final, ambos códigos tienen que acceder a una posición de memoria y cambiarla, por lo que harán básicamente lo mismo, o casi lo mismo. Como digo, el cambio puede estar más en la complejidad de la función donde esté incluida la inicialización, que hará que el código que genere SDCC sea uno u otro.

Las opciones no son técnicamente mejores ni peores. Son distintas y dependen de lo que quieras hacer. No hay realmente una opción mejor.

Personalmente, prefiero definir las variables en ensamblador siempre que se trate de variables globales comunes. Sin embargo, para un nivel introductorio, prefiero el uso de constantes para evitar desastres. Usar ensamblador para definir las variables implica que el compilador no revisará si lo hemos hecho bien y podemos desalinear la memoria, con resultados potencialmente nefastos.

En cualquier caso, como digo, lo apropiado es conocer las opciones y elegir la que se prefiera para el uso. Distintos usos pueden suponer distintas opciones como mejores o peores.

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Mié 18 Oct , 2017 5:21 pm

Sí, entiendo, supongo que quieres decir algo así como que a lo mejor ya tenemos disponible algún puntero que podamos reutilizar sin tener que reservar espacio adicional, ok pues muchas gracias otra vez!!!!
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

pacomix
Forum Addict
Forum Addict
Mensajes: 460
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor pacomix » Mié 18 Oct , 2017 8:15 pm

En su día abrí una issue en el proyecto de SDCC explicando el problema.
SDCC asume que se ejecuta desde una rom pero en nuestro caso el disco o cinta es la ROM en sí y lo volcamos a RAM con lo cual el código de inicialización deja de tener sentido en este contexto.
Contestaron que lo habían pillado pero no se si lo dejaron en pendiente o si no lo van a hacer.
Lo mejor en este caso es tener un fichero de ensamblador con etiquetas definidas como .db o .dw y tener la variable definida en los .c como extern.
En mi caso lo hago directamente en el crt0 a partir de la dirección 0x0040


Enviado desde mi iPhone utilizando Tapatalk

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Mié 18 Oct , 2017 11:38 pm

En su día abrí una issue en el proyecto de SDCC explicando el problema.
SDCC asume que se ejecuta desde una rom pero en nuestro caso el disco o cinta es la ROM en sí y lo volcamos a RAM con lo cual el código de inicialización deja de tener sentido en este contexto.
Contestaron que lo habían pillado pero no se si lo dejaron en pendiente o si no lo van a hacer.
Sí, yo también se lo comenté a algunos desarrolladores en su foro. Saberlo lo saben, pero no parece tener prioridad ninguna. Es lógico también: su foco no es el Amstrad CPC o el homebrew, sino la computación embebida.

El caso es que nos haría falta un simple switch -model=ram o similar. Así no habría ningún problema en desarrollar programas que terminan íntegros en RAM.

Avatar de Usuario
Tomasius
Lechoncillo
Lechoncillo
Mensajes: 19
Registrado: Jue 25 Ago , 2016 12:25 pm
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor Tomasius » Jue 23 Nov , 2017 12:09 pm

Hola,

Estoy probando la cpctelera para ver si saco un proyecto pra delante o no y me surge la siguiente duda:

¿hay alguna forma de cambiar la fuente? ](*,)

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 23 Nov , 2017 12:31 pm

¿hay alguna forma de cambiar la fuente? ](*,)
Si te refieres a la fuente de texto a la hora de escribir cadenas de texto en pantalla, las funciones de CPCtelera usan la fuente del sistema que está almacenada en ROM. La única forma de cambiar esa fuente en concreto sería cambiar la ROM del sistema. Estas funciones están diseñadas para ser rápidas y no tener que almacenar en memoria las definiciones de los caracteres de otra fuente, ahorrando espacio.

Si quieres una fuente propia en CPCtelera, lo más sencillo es que te la dibujes como un array de sprites y te hagas una función que pinte los sprites uno al lado del otro. Además, esta aproximación tiene la ventaja de que el dibujado sería mucho más rápido. Dibujar fuentes requiere un procesado intermedio que, aunque CPCtelera lo hace muy rápido, es lento en comparación con pintar sprites.

El uso y gestión de "fuentes de texto" propias en CPCtelera es una cuestión que está en lista de tareas con baja prioridad. La baja prioridad se debe a que hay 2000000 formas distintas de implementarlo y probablemente cada usuario querría una distinta de todas las posibles. Por eso, hasta que no demos con el "anillo único" (una forma útil para mucha gente), seguirá en baja prioridad.

Avatar de Usuario
Tomasius
Lechoncillo
Lechoncillo
Mensajes: 19
Registrado: Jue 25 Ago , 2016 12:25 pm
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor Tomasius » Jue 23 Nov , 2017 1:01 pm

¿hay alguna forma de cambiar la fuente? ](*,)
Si te refieres a la fuente de texto a la hora de escribir cadenas de texto en pantalla, las funciones de CPCtelera usan la fuente del sistema que está almacenada en ROM. La única forma de cambiar esa fuente en concreto sería cambiar la ROM del sistema. Estas funciones están diseñadas para ser rápidas y no tener que almacenar en memoria las definiciones de los caracteres de otra fuente, ahorrando espacio.

Si quieres una fuente propia en CPCtelera, lo más sencillo es que te la dibujes como un array de sprites y te hagas una función que pinte los sprites uno al lado del otro. Además, esta aproximación tiene la ventaja de que el dibujado sería mucho más rápido. Dibujar fuentes requiere un procesado intermedio que, aunque CPCtelera lo hace muy rápido, es lento en comparación con pintar sprites.

El uso y gestión de "fuentes de texto" propias en CPCtelera es una cuestión que está en lista de tareas con baja prioridad. La baja prioridad se debe a que hay 2000000 formas distintas de implementarlo y probablemente cada usuario querría una distinta de todas las posibles. Por eso, hasta que no demos con el "anillo único" (una forma útil para mucha gente), seguirá en baja prioridad.
Gracias por responder tan rápido, me lo imaginaba que tuviera que ser así!!

Intentare hacer "lo del array de Sprites", a ver si le saco punta!!! :-k

dragon131
Forum Addict
Forum Addict
Mensajes: 486
Registrado: Mar 08 Jun , 2010 12:36 pm

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor dragon131 » Jue 08 Mar , 2018 10:27 am

Voy a hacer una pregunta de lo mas rara. :mrgreen: ¿Si piso una pequeña parte del firmware en ram, afectara al cpctelera?

Me explico. Estoy tratando de pasar el babas palace a la gx4000(codigo fuente en mano).

Entonces para hacerlo, tengo que modificar la subrutina de meter la clave para que pueda manejarse con el gamepad. El problema es que al meter los 2 if dentro del do while que necesito, se me va de varas en la memoria y se me va a A8xx despues de compilar, por que el juego esta metido con calzador para usar la memoria libre de basic hasta el último byte.

Asi que la idea seria prescidir de la carga usando amsdos, y hacerla manual desde la carga del cartucho, pisando esa parte del firm, lo que dudo es si puede afectar al cpctelera/juego pisar eso. Es que no veo manera de meterlo para que entre normal.

Mira que por estas cosas no me gusta andar con los codigos fuentes en c en el cpc, en cuanto tienes que añadir algo se lia con alguna cosa de estas.

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 08 Mar , 2018 4:24 pm

Voy a hacer una pregunta de lo mas rara. :mrgreen: ¿Si piso una pequeña parte del firmware en ram, afectara al cpctelera?
No, en absoluto. CPCtelera no es un programa residente, ni un maker, ni un software que corre por debajo. CPCtelera es un entorno de desarrollo, un framework. Cada cual puede hacer los juegos o programas como quiera usando CPCtelera. Incluso se pueden hacer íntegramente en hexadecimal. Es como si preguntases si pisar el firmware puede molestar al compilador de C: evidentemente, no. Por tanto, a CPCtelera no puedes molestarla, porque no es un software. Podrías molestar al propio juego, según como estuviera hecho. De hecho, la mayoría de juegos hechos con CPCtelera (por no decir casi el 100%) lo primero que hacen al empezar la ejecución es deshabilitar el firmware.

En este caso, no puedes molestar tampoco al juego. El problema que tienes es el loader del firmware. Cuando recompilas el juego, si te ocupa 2 bytes más, el loader del firmware ya no puede cargarlo. Y no puede porque sobre esas direcciones que indicas es donde guarda las variables que utiliza para saber por donde está leyendo y escribiendo en memoria. Son las variables del programa loader y, si lo que cargas llega hasta ahí, se sobreescriben provocando que el loader falle. El problema no tiene nada que ver con el juego. Si lo cargas con otro loader, no tendrás ese problema.

Otra cuestión importante, si quisieras introducirlo en ROM. Lo más fácil es que pases el juego a RAM antes de ejecutarlo, ya que desde ROM hay partes que no funcionarían porque usan código automodificable.

dragon131
Forum Addict
Forum Addict
Mensajes: 486
Registrado: Mar 08 Jun , 2010 12:36 pm

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor dragon131 » Jue 08 Mar , 2018 7:27 pm

Si, gracias queda claro, no me habia expresado bien, me referia a si alguna funcion de cpctelera podia llamar al firmware una vez compilado, pero la respuesta es la misma.

Tengo otro problema, no puedo compilar la intro del babas palace el cpctelera me devuelve un error:

"$ make Z80CCFLAGS="--peep-file ${CPCT_PATH}/tools/sdcc-3.5.5/peep/z88dk_speculative_peepholes.def --max-allocs-per-node 2000000 --opt-code-size"
/home/Jose/cpctelera-1.4.2/cpctelera/tools/sdcc-3.6.8-r9946/bin/sdcc -I/home/Jose/cpctelera-1.4.2/cpctelera/src -mz80 --peep-file /home/Jose/cpctelera-1.4.2/cpctelera/tools/sdcc-3.5.5/peep/z88dk_speculative_peepholes.def --max-allocs-per-node 2000000 --opt-code-size -c src/exomizer/exomizer.c -o obj/exomizer/exomizer.rel
cannot open peep rule file
src/exomizer/exomizer.c:50: error 9: FATAL Compiler Internal Error in file '/home/Jose/cpctelera-1.4.2/cpctelera/tools/sdcc-3.6.8-r9946/src/src/z80/gen.c' line number '4587' : Unimplemented __z88dk_callee support on callee side
Contact Author with source code
src/exomizer/exomizer.c:50: warning 85: in function decompress unreferenced function argument : 'source'
src/exomizer/exomizer.c:50: warning 85: in function decompress unreferenced function argument : 'target'
make: *** [/home/Jose/cpctelera-1.4.2/cpctelera//cfg/global_main_makefile.mk:42: obj/exomizer/exomizer.rel] Error 1
"

Vamos que no me la compila.

dragon131
Forum Addict
Forum Addict
Mensajes: 486
Registrado: Mar 08 Jun , 2010 12:36 pm

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor dragon131 » Vie 09 Mar , 2018 12:44 am

Si, gracias queda claro, no me habia expresado bien, me referia a si alguna funcion de cpctelera podia llamar al firmware una vez compilado, pero la respuesta es la misma.

Tengo otro problema, no puedo compilar la intro del babas palace el cpctelera me devuelve un error:

"$ make Z80CCFLAGS="--peep-file ${CPCT_PATH}/tools/sdcc-3.5.5/peep/z88dk_speculative_peepholes.def --max-allocs-per-node 2000000 --opt-code-size"
/home/Jose/cpctelera-1.4.2/cpctelera/tools/sdcc-3.6.8-r9946/bin/sdcc -I/home/Jose/cpctelera-1.4.2/cpctelera/src -mz80 --peep-file /home/Jose/cpctelera-1.4.2/cpctelera/tools/sdcc-3.5.5/peep/z88dk_speculative_peepholes.def --max-allocs-per-node 2000000 --opt-code-size -c src/exomizer/exomizer.c -o obj/exomizer/exomizer.rel
cannot open peep rule file
src/exomizer/exomizer.c:50: error 9: FATAL Compiler Internal Error in file '/home/Jose/cpctelera-1.4.2/cpctelera/tools/sdcc-3.6.8-r9946/src/src/z80/gen.c' line number '4587' : Unimplemented __z88dk_callee support on callee side
Contact Author with source code
src/exomizer/exomizer.c:50: warning 85: in function decompress unreferenced function argument : 'source'
src/exomizer/exomizer.c:50: warning 85: in function decompress unreferenced function argument : 'target'
make: *** [/home/Jose/cpctelera-1.4.2/cpctelera//cfg/global_main_makefile.mk:42: obj/exomizer/exomizer.rel] Error 1
"

Vamos que no me la compila.
Vale, ya esta arreglado, he visto tu post del naked en cpcwiki

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Lun 12 Mar , 2018 12:14 pm

Me alegro de que hayas resuelto el problema de compilación :). Ya nos cuentas cómo va esa conversión a ROM.

dragon131
Forum Addict
Forum Addict
Mensajes: 486
Registrado: Mar 08 Jun , 2010 12:36 pm

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor dragon131 » Mar 20 Mar , 2018 8:30 pm

Huy, quedo muy bien, tuve que cambiar toda la subrutina de meter los códigos, la única pega es que se tiraba milenios compilando. Me he tirado más tiempo esperando que programando. :mrgreen:

El cpr está en la página del babas palace. El código fuente se lo he dado a Rafael Castillo por si quiere reusarlo en un futuro.


¿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