Empezando con SDCC

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: Empezando con SDCC

Mensajepor ronaldo » Vie 14 Ago , 2015 10:05 am

No es que te hayas vuelto vago, @na_th_an, haces lo correcto. Automatizar es básico en todo esto y es una de las premisas básicas que sigo en todos los desarrollos que hago. Tener un buen pipeline de trabajo es esencial para que no haya que estar haciendo tareas repetitivas e inútiles.

Con respecto a lo que comentas, te propongo una solución rápida y sencilla:
  • Meter todos los binarios en una subcarpeta /binarios
  • En el script de compilación, meter un paso que convierta los binarios a archivos .c utilizando una utilidad de conversión (como el script que te he puesto antes), y los mueva a donde deban estar.
Con eso es suficiente. Luego, si quieres incluirlos en una parte del código puedes hacer un #include normal y corriente y ya los tienes.

Así, cada vez que crees o actualices un binario nuevo, basta con que esté en la carpeta /binarios para que se auto transforme y puedas incluirlo donde quieras.

Por cierto, si usáis Windows os recomiendo mucho que os paséis a Cygwin. Precisamente para tareas de automatización, no hay nada mejor que utilizar scripts de bash. Todo es empezar a usarlos, y uno nunca vuelve a querer ver un .bat en su vida.

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

Re: Empezando con SDCC

Mensajepor na_th_an » Vie 14 Ago , 2015 10:37 am

El problema es que suelo tenerlos en las partes de ensamblador - de todos modos tengo el preprocesador casi listo :D

Sobre lo otro, tengo todas las utilidades de gnu compiladas para Windows, suelo usar mucho grep. Nunca me ha dado por usarlo también para los scripts - tampoco es que haga cosas muy complejas. Pero los pipes vendrían bien. Bueno, un día que me aburra daré el paso.

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

Re: Empezando con SDCC

Mensajepor na_th_an » Vie 14 Ago , 2015 10:56 am

Bueno, aquí está. Lo he probado con mis fuentes y funciona. Paso el código fuente (freeBasic) por si alguien lo quiere compilar para Linux (debería detectarlo en tiempo de compilación y usar "/" en lugar de "\" para los paths).

Yo lo he probado así: Tengo mi /dev con un montón de .exo que incluyo en el código del juego (niveles, músicas...). Dentro de /dev tengo un directorio "src" que tiene los fuentes originales .hp y .cp que contienen instrucciones BINARY/INCBIN dentro de bloques __asm para incluir dichos .exo.

Si desde /dev ejecuto

Código: Seleccionar todo

..\utils\sdccprepr.exe src .
La pequeña utilidad escanea "src", lee los archivos ".hp" y ".cp", y genera archivos ".h" y ".c" en "." (o sea, en "/dev") incluyendo los binarios como ".DB".

La salida por pantalla es:

Código: Seleccionar todo

SDCC Preprocessor by The Mojon Twins v0.1
Input folder src
Output folder .

Preprocessing src\ababol2a.cp
Writing output to .\ababol2a.c

Preprocessing src\basio.hp
Writing output to .\basio.h

Preprocessing src\config.hp
Writing output to .\config.h

Preprocessing src\definitions.hp
Writing output to .\definitions.h

Preprocessing src\engine.hp
Writing output to .\engine.h

Preprocessing src\levelmanager.hp
Writing output to .\levelmanager.h
Including level0c.exo
Including level1c.exo

Preprocessing src\mysystem.hp
Writing output to .\mysystem.h

Preprocessing src\pantallas.hp
Writing output to .\pantallas.h
Including titlec.exo

Preprocessing src\printer.hp
Writing output to .\printer.h

Preprocessing src\sound.hp
Writing output to .\sound.h
Including m_title.exo
Including m_level_1.exo
Including m_level_2.exo
Including m_level.exo
Including m_gover.exo

Preprocessing src\spriteset.hp
Writing output to .\spriteset.h

DONE!
Por ejemplo, en sound.hp teníamos un...

Código: Seleccionar todo

; [3] Game Over
_song_4:
INCBIN "m_gover.exo"
y ahora hay esto en el sitio equivalente de sound.h:

Código: Seleccionar todo

; [3] Game Over
_song_4:
.DB #0x00, #0x06, #0x34, #0x50, #0x10, #0x00, #0x00, #0x00
.DB #0x00, #0x00, #0x14, #0x35, #0x02, #0x46, #0x04, #0x70
.DB #0x00, #0x00, #0x01, #0x30, #0x01, #0x03, #0x45, #0x63
.DB #0x00, #0x02, #0x04, #0xD3, #0x07, #0x00, #0x3F, #0x01
.DB #0xD2, #0x97, #0x57, #0x59, #0x9F, #0x96, #0x92, #0xBE
.DB #0x52, #0x54, #0x26, #0xCE, #0xF4, #0x94, #0xD7, #0xFE
.DB #0xA8, #0xD4, #0x85, #0xC1, #0x43, #0xA8, #0x07, #0xB8
.DB #0x3F, #0xFD, #0x0F, #0x63, #0x62, #0xA0, #0x04, #0xFD
.DB #0x9E, #0x60, #0x5E, #0xA2, #0xCB, #0x01, #0xF3, #0xE3
.DB #0x51, #0xE0, #0x63, #0x41, #0x80, #0x7E, #0x73, #0x0C
.DB #0xAF, #0xC8, #0xAE, #0xAC, #0xC4, #0xAA, #0x96, #0xEF
.DB #0x5F, #0x3F, #0x03, #0x80, #0xEC, #0x1F, #0xAA, #0xC1
.DB #0x00, #0x00, #0x20
A mí me viene de arte, según mi forma de hacer las cosas. Lo comparto por si a alguien también le viene guay.
Adjuntos
sdccprepr.zip
(22.1 KiB) Descargado 36 veces

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

Re: Empezando con SDCC

Mensajepor ronaldo » Vie 14 Ago , 2015 11:02 am

Acabo de implementar una prueba de concepto y ya funciona él solito :). He hecho un par de modificaciones a un makefile de proyecto para que convierta todos los ficheros .bin que encuentre usando cpct_bin2c antes de compilar.

Con poquito más que una regla como esta en el makefile se arregla todo:

Código: Seleccionar todo

%.c: %.bin
cpct_bin2c $< > $@
Los ficheros binarios, de hecho, no hace falta incluirlos como tal en otro sitio. Esta conversión pasa un binario a un array de C en un fichero independiente. El fichero es compilado por SDCC y linkado al proyecto, añadiendo el binario directamente. Luego, para usarlo desde C es tan fácil como poner una declaración extern:

Código: Seleccionar todo

extern const u8 G_character[192];
Si se quiere usar desde ensamblador, también es igual de fácil

Código: Seleccionar todo

.globl _G_character
No hay que preocuparse de más. Con esto, basta con meter los binarios que uno quiera en la carpeta del proyecto y se autocompilan y enlazan :).

Aquí tenéis un par de enlaces para ver el código del ejemplo que he creado, y os adjunto el DSK para que veáis el resultado: También os dejo un vídeo del proceso de compilación. Veréis que sólo tengo un main.c y un character.bin en la carpeta de fuentes. Pongo make y el binario se convierte a .c, todos los .c se compilan y linkan, los CDT y DSK se generan y funciona directamente. Sólo tengo que lanzar winape y listo :). Coste total de implementación: 15 minutos.

bins.dsk
(199.71 KiB) Descargado 51 veces

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

Re: Empezando con SDCC

Mensajepor ronaldo » Vie 14 Ago , 2015 11:19 am

Por cierto, un detalle importante: bajaos el último snapshot de SDCC y no utilicéis la release SDCC 3.5.0. Hay un par de bugs en las optimizaciones de código de Z80. El snapshot de 11 de agosto tiene ambos corregidos. Para windows x86_64 podéis encontrarlo aquí:
http://sourceforge.net/projects/sdcc/fi ... w32-setup/

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6965
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Re: Empezando con SDCC

Mensajepor MiguelSky » Vie 14 Ago , 2015 12:09 pm

ronaldo, no me deja ver el video, dice que es privado. Por otro lado, buen trabajo, chicos :)

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

Re: Empezando con SDCC

Mensajepor ronaldo » Vie 14 Ago , 2015 12:38 pm

Cierto, @MiguelSky. No me había dado cuenta y había seleccionado privado en lugar de oculto en Youtube.

Ahora deberíais poder verlo. Gracias por avisar :).

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

Re: Empezando con SDCC

Mensajepor Artaburu » Sab 15 Ago , 2015 8:37 am

Gracias a las URL conversaciones con Ronaldo y viendo que ahora SDCC soporta el callee de z88dk para llamar funciones pasando parámetros sin usar la pila, voy a repasar cpcrslib para aprovechar esta ventaja.
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: Empezando con SDCC

Mensajepor ronaldo » Sab 15 Ago , 2015 9:53 am

El que no usa la pila es fastcall; callee usa la pila, pero espera que la función elimine los parámetros de la pila, en lugar de dejarla como estaba. Callee es la que te permite hacer cosas como esta:

Código: Seleccionar todo

pop af ; AF = dirección de retorno
pop hl ; HL = primer parámetro
pop de ; DE = segundo parámetro
pop bc ; BC = tercer parámetro
push af ; Dejar dirección de retorno en la pila, con los parámetros eliminados
....
Sin tener después que restaurar el estado de la pila, ganando bastantes ciclos.

Si te pones, te recomiendo también que revises que todas las funciones salven IX e IY y así te puedes quitar el --fomit-frame-pointer y ganar en tamaño y velocidad de los programas compilados :)

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

Re: Empezando con SDCC

Mensajepor Artaburu » Sab 15 Ago , 2015 12:44 pm

Lo de salvar IX e IY lo apunto también. Aunque me suena que ya hice una prueba cuando me lo comentaste hace unos meswa y no me aportó mucha mejora. Como cuesta poco lo vuelvo a probar ya que me pongo.
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: Empezando con SDCC

Mensajepor ronaldo » Sab 15 Ago , 2015 1:21 pm

El enlace que te he puesto arriba tiene una tabla completa con todos los experimentos que hice de optimización en SDCC. En casi todos los casos, añadir --fomit-frame-pointer (ofp) significa un tamaño de binario más grande y peor rendimiento.

Échale un ojo, porque en el caso de prueba que usé, el Platform Climber, eran +1.741 bytes sobre 15.442 (~11% más tamaño) y hasta +9.000 ciclos de CPU sobre 80.000 (~11% más de consumo de CPU). A mi me parecen cifras como para pensárselo.

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

Re: Empezando con SDCC

Mensajepor na_th_an » Lun 17 Ago , 2015 11:01 am

Bueno, entonces por el momento me espero a que estén las mejoras :)
Buen trabajo, chicos :D

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

Re: Empezando con SDCC

Mensajepor Artaburu » Lun 17 Ago , 2015 2:44 pm

No esperarás mucho, la semana que viene estará todo mejorado :)
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: Empezando con SDCC

Mensajepor ronaldo » Lun 17 Ago , 2015 5:08 pm

Go, Artaburu! Go! =D> =D> =D>

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Empezando con SDCC

Mensajepor KaosOverride » Lun 17 Ago , 2015 9:26 pm

A KaosOverride le gusta este hilo




<XX
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]


¿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