SDCC, CPCRSLIB y Arkos

Programando el Amstrad en BASIC, C, etc.
na_th_an
Forero habitual
Forero habitual
Mensajes: 182
Registrado: Jue 05 Feb , 2009 9:37 am

SDCC, CPCRSLIB y Arkos

Mensajepor na_th_an » Lun 18 Abr , 2016 10:08 am

Buenas, amigos.

Queremos retomar un viejo proyecto cepecero nuestro, el Platform Medley, y crear una versión mejor, renovada y, sobre todo, completa (para los que conozcan el juego, recordaréis que nos quedamos sin publicar la segunda carga).

Al ser un juego tan secillo y que lo vamos a empezar de cero, creo que es lo ideal para empezar con SDCC.

¿Cuál es la versión más reciente de CPCRSLIB, la que se puede descargar de SourceForge?
¿Qué versión de SDCC necesito para que todo vaya sobre ruedas?
¿Existe alguna integración de Arkos Player con CPCRSLIB?

Muchas gracias a todos :)

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: SDCC, CPCRSLIB y Arkos

Mensajepor Artaburu » Lun 18 Abr , 2016 5:21 pm

Hola na_th_an
La última version oficial es la de sourceforge, sí. Échale un vistazo y mira si te cuadra ya que está un tanto abandonada porque estoy a otros menesteres. Creo que tiene todo lo que había para z88dk y alguna cosa más.
Sobre Arkos no hay funciones cpcrslib pero es fácil de meter llamándolo desde asm inline. Eso sí, es algo más delicado el tema que con wyzplayer ya que las canciones deben ser compiladas en la dirección de memoria que se vayan a ubicar.

Tengo reciente el tema del Arkos player en SDCC así que puedo colgar unas instrucciones básicas.... O creo que las colgué ya... Revisaré.
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: SDCC, CPCRSLIB y Arkos

Mensajepor Artaburu » Lun 18 Abr , 2016 6:40 pm

Sobre el Arkos, funciona con los mismos principios que el Wyz, vamos, que se pone en la interrupcion que cada 6 veces, una llame al player.
La pega que tiene es que las canciones se deben compilar en una dirección de memoria y ejecutarlas desde esa posición de memoria, si no, la cosa o no suena o suena fatal o peor.
El primer paso es activar la canción, el segundo tocar y el tercero parar de tocar.
Los FX van en una segunda canción que también hay que activar antes de llamar a los FX. La llamada es un poco más complicada que en WYZ porque hay que especificar muchas cosas.
Os dejo el código del arkos que estoy usando en Galactic Tomb, la interrupción y las llamadas a los efectos.

Yo cargo el Arkos en &0350:
En la inicialización, DE apunta a la canción. Recordad que se ha tenido que compilar en el tracker para esa dirección de memoria.

Código: Seleccionar todo

__asm
ld de,#0x1010
call #0x350+0x6c5 ; PLY_INIT
__endasm;

Esta es la parada de la música:

Código: Seleccionar todo

__asm
call 0x350+0x71a ;PLY_STOP
__endasm;
Los FX se activan igual (en mi caso es una canción en &7e00):

Código: Seleccionar todo

__asm
ld de,#0x7e00
call #0x350+0x6c5 ; PLY_INIT
__endasm;
y para llamar un FX (cuidado que también se estropean los registros):

Código: Seleccionar todo

__asm
fx_disparo:
; push hl
; push de
; push bc
; push af
xor a
ld hl,#0x0f01
ld de,#0x0027
ld bc,#0
; To play a sound effect =
; A = No Channel (0,1,2)
; L = SFX Number (>0)
; H = Volume (0...F)
; E = Note (0...143)
; D = Speed (0 = As original, 1...255 = new Speed (1 is the fastest))
; BC = Inverted Pitch (-#FFFF -> FFFF). 0 is no pitch. The higher the pitch, the lower the sound.
call 0x0a8d ;PLY_SFX_Init
; pop af
; pop bc
; pop de
; pop hl
ret
__endasm;
Esta es una interrupción que se instala y llama al player. Ojo que se corrompen todos los registros, los normales y los espejo (HL',DE',BC'):

Código: Seleccionar todo

void inst_interrup1(void)
{
__asm
DI
ld a,#0xc3
LD (#0x0038),a
ld hl,#interrupcion0
LD (#0x0039),HL
xor a
ld (#contador+1),a
ei
ret
interrupcion0:
di
push bc
push hl
push de
push af
contador8:
ld a,#0
inc a
cp #6
jp nz,c1118
exx
push de
push hl
push bc
push af
push ix
push iy
call 0x350+1 ;PLY_PLAY
pop iy
pop ix
pop af
pop bc
pop hl
pop de
exx
xor a
c1118:
ld (#contador8+1),a
pop af
pop de
pop hl
pop bc
ei
ret
__endasm;
}
Adjuntos
ArkosP.rar
(10.33 KiB) Descargado 43 veces
Salu2,
Arta

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

Re: SDCC, CPCRSLIB y Arkos

Mensajepor ronaldo » Lun 18 Abr , 2016 7:12 pm

@na_th_an, acabo de subir a Github una actualización que permite instalar CPCRSLib en el framwork de CPCtelera con sólo poner un comando. Con esto podéis usar todo el framework automatizado de CPCtelera para compilar y gestionar un proyecto de CPCRSLib, e incluso combinar funciones de una y otra librería a vuestro gusto, si quieréis. Por ejemplo, podéis usar las funciones de Arkos Player de CPCtelera, el hook de interrupciones y las funciones de CPCRSLib para el resto.

Para usar esto, una vez tenemos CPCtelera instalada (bajada de Github, última versión), sólo hay que pone este comando en el terminal de cygwin:

Código: Seleccionar todo

cpct_installrslib
Con eso, CPCRSLib se baja, se configura y se compila solita. Después, para crear un proyecto nuevo que use CPCRSLib, se usa este comando:

Código: Seleccionar todo

cpct_mkproject -c miproyecto
Así se crea un nuevo proyecto en la carpeta "miproyecto" con todo listo. Sólo hay que entrar y escribir 'make' para compilarlo y generar DSK Y CDT.

Si lo probáis y tenéis cualquier duda, ya sabéis dónde estamos :)

na_th_an
Forero habitual
Forero habitual
Mensajes: 182
Registrado: Jue 05 Feb , 2009 9:37 am

Re: SDCC, CPCRSLIB y Arkos

Mensajepor na_th_an » Mar 19 Abr , 2016 11:51 am

¡Vaya! Eso es todo un lujazo. En cuanto tenga rato y mi PC de desarrollo me instalo toda la mandanga y empiezo a hacer algunas pruebas. ¡¡Muchas gracias!! Ya te comentaré como va todo. Ya estuve ayer echando un ojillo a la doc para ver cómo instalarlo todo.

Sobre Arkos, tengo que ver cómo lo tienes montado en la CPCTelera. @Artaburu, conozco la biblioteca, usé una implementación base de SyX y NightWolf para meterla en la MK2 de Spectrum como opción. Sé lo de las ubicaciones fijas. Como no me gusta el trabajo manual, escribí una pequeña herramienta que va compilando las canciones y construyendo un índice de forma automática, de forma que se puede integrar todo en el toolchain y olvidarse (algo 100% necesario ya que así podemos cambiar las canciones mil veces sin tener que estar recalculando offsets). Le echaré un vistazo, si esto no está ya resuelto en la CPCTelera adaptaré mi herramienta al CPC. ¿Dónde soléis colocar las canciones? Supongo que lo suyo es establecer un límite superior en RAM e irlas apilando hacia abajo ¿Cuál es la dirección de memoria más alta que puede usarse? Creo recordar que no podías pegarte mucho a $C000 porque había tiestos importantes ahí...

Una vez resuelva esto me pondré con Platformer Medley. Es un motor muy sencillo que podría tener listo en una tarde si no me interrumpen mucho :)

EDITO:

Leyendo la doc, veo que hay que ubicar las canciones de forma manual. Cuando me ponga con esto lo primero que haré será la herramienta que las compile y genere código en las ubicaciones correctas.

La herramienta toma una lista de canciones. La canción que contiene los efectos de sonido va marcada por un "<" tras el nombre del archivo (por ejemplo, así es como funciona la que hice para MK2).

- Se establece una dirección de memoria actual en el punto más alto posible de la RAM.
- Para cada entrada de la lista, se llama a akstobin -a (y -s si se detecta "<" en la lista) con la dirección actual.
- El archivo binario resultante se convierte a código dentro de un array nombrada según alguna convención y ubicada en el sitio correcto (la dirección actual con __at).
- Se calcula la longitud del binario, y se resta de la dirección actual para obtener la nueva. Hecho esto se sigue procesando la lista.

Me surgen unas cuantas dudas, sobre todo por lo poquísimo que piloto de CPC, pero principalmente: ¿Estaría bien este enfoque, establecer una dirección superior y construir hacia abajo? ¿Qué dirección puedo usar como base?

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

Re: SDCC, CPCRSLIB y Arkos

Mensajepor ronaldo » Mar 19 Abr , 2016 2:30 pm

El tema de las direcciones de memoria de las músicas de momento sigue manual, porque todavía estoy pensando en una forma de automatizarlo que sea completamente seamless para todo tipo de usuarios. El problema en sí no es colocar las músicas, el problema es asegurarse de que no solapas otra parte del código. Cuando posicionas algo con __at, el compilador lo pone ahí y ya está, pero no hace nada más. Si tienes algo en la dirección 5000 y tu código empieza en la 4000, si tu código ocupa más de 1000, ambas cosas quedan solapadas. Son cosas del compilador que no tiene resueltas y son un poco engorrosas. Por lo menos, eso sí, cuando compilas te dice "Overlapped record" y ya sabes que tienes cosas solapadas.

De momento, la mejor solución para tener canciones "relocatables" que se me ha ocurrido pasa por generar un array de 0's o un array de magic bytes con el tamaño de la canción al compilar, cambiar la dirección del binario de la canción tras la compilación (cuando ya se sabe dónde está) y parchear el binario del juego introduciendo a mano el binario de la canción en su sitio, pero ya cambiado de posición. Es un proceso complejo, y no me termina de convencer, pero es lo mejor que he diseñado hasta ahora. Para la próxima versión, probablemente lo implementaré.

De momento, mi recomendación personal es poner las canciones al principio de la memoria: de 0040 en adelante. Si sabes lo que ocupan las canciones, puedes mover fácilmente la posición inicial del binario para que empiece justo después y no se solapen. Sólo tienes que generar tu lista de canciones al comienzo, sumar lo que ocupan todas + 40h y ya tienes la dirección para poner el binario. Esta dirección se la asignas a Z80CODELOC en build_config.mk y listo, tu código empieza justo después de donde guardas la música.

Respecto a lo que preguntas de la memoria, en C000 empieza la de vídeo, como sabes. Justo antes de C000 está la pila, que crece hacia abajo, aunque la podéis cambiar de sitio fácilmente. Antes de la pila están todas las variables del firmware, que sólo debéis respetar si usáis el firmware para algo. En caso contrario, podéis usar toda esa memoria a vuestro antojo.

na_th_an
Forero habitual
Forero habitual
Mensajes: 182
Registrado: Jue 05 Feb , 2009 9:37 am

Re: SDCC, CPCRSLIB y Arkos

Mensajepor na_th_an » Mar 19 Abr , 2016 4:10 pm

Sí, los problemas de solapamiento me los sé, que splib2 (la biblioteca sobre la que trabajamos en Spectrum) coloca sus tiestos en la parte alta de la RAM y como te cueles mucho con el binario la lías. Es el pan de cada día.

En la parte inferior de la memoria es donde antes se ubicaba las estructuras del tilemap de CPCRSLIB, pero como ahora se compilan con el resto de la biblioteca esto ya no es necesario.

Sí, me parece buen sitio ahí. Puedo adaptar mi herramienta para que genere a partir de cierta dirección que se le pase por parámetro, y luego hacer que el juego se construya a partir del punto donde terminan las canciones. Cuestión de probar varias historias hasta dar con la forma más adecuada.

Otra forma es que la herramienta genere, por un lado, un binario con las canciones (considerando una dirección fija de inicio), y por otro un archivo .h con los inicios de cada canción en constantes o dentro de un array (o playlist). Ese .h se compilaría con el juego. Al final, para construir el juego se emplearían los dos binarios: el generado con las canciones y el compilado con el juego. Esto se parece más a lo que hago para MK2... Al ser para 128K las músicas van en un binario que se mete en una de las páginas de RAM extra del Spectrum (junto con el player, además), y junto al juego lo que se compila es una cabecera que indica la dirección de inicio de cada canción.

Hay muchas formas de obrar, cuando pueda ponerme a cacharrear veré por donde tiro.


¿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