Un pequeño ejemplo de desarrollo en C para Spectrum

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por mcleod_ideafix » Lun Ene 07, 2008 3:49 am

Pues nada, que para ver qué tal está el panorama de la programación en C para Spectrum, y con la intención de picar un poco a la gente indecisa o que tienen demasiado respeto al ensamblador, he hecho una cosilla en C para el Spectrum.

De todos es conocido el z88dk con su compilador C. Lo he probado y la verdad es que tiene unas librerías para Spectrum para hacer un montón de cosas.

Yo he estado probando otra alternativa: SDCC (Small Devices C Compiler). Es un compilador de C que vale para Z80A y para otros micros. He hecho pruebas compilando código y viendo el resultado y la verdad es que me ha sorprendido que a veces el código generado no tiene nada que envidiar al que uno realiza a mano en ensamblador.

Lo he escogido porque, a diferencia del compilador del Z88, el SDCC soporta matrices de dos dimensiones, cosa que a mi me interesa mucho. También tiene soporte para punto flotante en el formato IEEE754 de simple precisión (ya sé que el Z88 soporta el calculador interno del Spectrum).

La otra razón para escogerlo (aparte de haber sido el primero que encontré :D) es que parece bastante fácil modificar los parámetros de configuración para generar, pongamossssss, un cartucho de IF2.

Tiene también un montón de cosas muy mejorables (por ejemplo, el ensamblador que lleva no me gusta, yo quiero mi pasmoooooo :'( )

Bueno, sea o no la panacea, lo que he hecho es coger un programa en BASIC que escribí para el concurso de BASIC de Radastan del año 2005 (Fireman) y lo he reescrito en C. Incluyo el código fuente e instrucciones sobre cómo compilarlo con SDCC y convertir el código resultante a un TAP. Espero que le sea útil a cualquiera que quiera escribir código rápido para el Spectrum.

Para el desarrollo uso ConTEXT, SDCC, una utilidad propia para convertir del formato de Motorola a un TAP, que incluyo en el ZIP, y Spectaculator. Usando las teclas programables del ConTEXT, saigno F9 a la compilación, F10 a la conversión del S19 a un TAP, y F11 para cargar el TAP en el Spectaculator. Así, la secuencia de compilación es F9, F10 y F11 (mirando la pantalla de estado por si hay errores en algún paso). F11 carga Spectaculator (specstub.exe) con el TAP y lo puedo ejecutar de golpe. Si algo sale mal, reseteo al Spectrum y a empezar de nuevo.

Aquí está el ZIP.
Web: ZX Projects | Twitter: @zxprojects

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por Bubu » Lun Ene 07, 2008 7:48 pm

Mc, enhorabuena, al final me vas a picar con lo del C. Pero es que de momento el ASM es una espinita que tengo clavá desde los 12 años. Primero haré un juego en ASM, y luego creo que me dedicaré el resto de mi vía a hacerlos en C, jiji, que es más intuitivo y cómodo. Pues he probao tu Fireman, y va de lux, salvo que no se borra el menú principal, y además ahora suena mientras los quemados caen. En el de BASIC sólo sonaba el rebote en la camilla. Muy bien, tíu.

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por mcleod_ideafix » Lun Ene 07, 2008 10:33 pm

Bubu escribió:y va de lux, salvo que no se borra el menú principal

Errr... anda! Pues a mi no me hace nada de eso. Lo estoy probando con Spectaculator...
Web: ZX Projects | Twitter: @zxprojects

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por Bubu » Lun Ene 07, 2008 10:41 pm

Coño, es verdura, ahora no se me queda el menú principás dibujado en la pantalla. Pero te juro que lo he visto antes. Bueno, el caso es que la gran mejora en C es que ahora muevo sin parar el muñeco y el quemao sigue su curso. En el de BASIC si no paro de mover el muñeco el quemao se queda bloqueado, jiji.

Avatar de Usuario
sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por sromero » Mar Ene 08, 2008 10:47 am

Bubu escribió:Mc, enhorabuena, al final me vas a picar con lo del C. Pero es que de momento el ASM es una espinita que tengo clavá desde los 12 años. Primero haré un juego en ASM, y luego creo que me dedicaré el resto de mi vía a hacerlos en C, jiji, que es más intuitivo y cómodo.


Nada te impide hacer la lógica y bloque principal del programa en C, y las funciones criticas en ASM.

De hecho, es lo más cómodo y sencillo.
NoP / Compiler

utopian
Manic Miner
Mensajes: 219
Registrado: Jue May 10, 2007 2:28 pm

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por utopian » Mar Ene 08, 2008 11:05 am

Hey, muy interesante :). Una curiosidad, ¿has comparado la velocidad del código que genera el SDCC con el z88dk? Creo recordar que el SDCC usaba los registros IX e IY de cuando en cuando, mientras que el z88dk no, y según cómo los use puede ser una ventaja.

Avatar de Usuario
sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por sromero » Mar Ene 08, 2008 1:37 pm

utopian escribió:Hey, muy interesante :). Una curiosidad, ¿has comparado la velocidad del código que genera el SDCC con el z88dk? Creo recordar que el SDCC usaba los registros IX e IY de cuando en cuando, mientras que el z88dk no, y según cómo los use puede ser una ventaja.


Podría ser interesante hacer un par de benchmarks con algunas tareas comunes (quicksorts, recorrer vectores, operaciones con matrices, operaciones varias generales, etc) y ver cuál de los 2 compiladores saca mejor código...
NoP / Compiler

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por Gandulf » Mar Ene 08, 2008 1:41 pm

Hombre, quicksort no es algo que se haga en juegos de spectrum precisamente. Yo haría el benchmark con código real de un juego de speccy, para ver que tal optimiza el código máquina que genera, en cuanto a uso de registros/memoria, etc; creo que sería mucho más interesante, aunque me temo que no se notaría, ya que el 90% o más del tiempo de ejecución de los juegos en C lo lleva a cabo la splib, que creo que está en ensamblador prácticamente en su totalidad (ya comentarán los que programan en C para 8 bits, que yo ni lo he mirado ni lo voy a mirar)
Un saludo,

Gandulf

Avatar de Usuario
sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por sromero » Mar Ene 08, 2008 2:03 pm

Gandulf escribió:Hombre, quicksort no es algo que se haga en juegos de spectrum precisamente. Yo haría el benchmark con código real de un juego de speccy, para ver que tal optimiza el código máquina que genera, en cuanto a uso de registros/memoria, etc; creo que sería mucho más interesante, aunque me temo que no se notaría, ya que el 90% o más del tiempo de ejecución de los juegos en C lo lleva a cabo la splib, que creo que está en ensamblador prácticamente en su totalidad (ya comentarán los que programan en C para 8 bits, que yo ni lo he mirado ni lo voy a mirar)


Lo del quicksort lo digo por ver qué tal optimiza algoritmos generales...

O sea, por ver qué tal optimiza operaciones como asignar variables, comparaciones, etc... que al fin y al cabo constituyen esa lógica del programa que se corresponde con el 10% que no es "tiempo de SPLIB".

saludos.
NoP / Compiler

utopian
Manic Miner
Mensajes: 219
Registrado: Jue May 10, 2007 2:28 pm

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por utopian » Mar Ene 08, 2008 4:26 pm

La splib sí que está implementada íntegramente en ASM, aunque tiene unos wrappers en C para cada función, que cogen los parámetros y llaman a las funciones en ASM (bastante lentillo).

Aún así, no estaría de más ver qué tal de rápido es. En el Cannon Bubble tuve que pasar a ensamblador alguna que otra función, porque la versión compilada era excesivamente lenta. En concreto, la función que calculaba la trayectoria de las bolas, rebotes, etc, era realmente puñetera :shock:

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por mcleod_ideafix » Mar Ene 08, 2008 10:13 pm

Bueno, pues cogeré algunos algoritmos estándares (manejo de punteros, vectores, optimización de bulces, etc...) a ver cómo los resuelven uno y otro compilador. El SDCC me parece que genera un código bastante rápido por las "sorpresas" que me he encontrado (por ejemplo, darse cuenta que el índice de un bucle for no se usa en el cuerpo del mismo, y entonces cambiar el bucle para que sea decreciente y poder usar el ld a,b ; or c ; jr nz, bucle , en lugar de la opción con los dos CP para comparar con un número concreto).

Yo soy un defensor del ensamblador para programar en el Spectrum, pero es que se pueden hacer muchas cosas en C que no son críticas en velocidad, y ganas tiempo de desarrollo y depuración, además de que es más fácil adaptar cosas que tienes hechas para otras arquitecturas (como mi algoritmo para dibujar círcunferencias mucho más rápido que el CIRCLE del Basic).

Y sí, ya sé que el splib tiene de todo, pero el splib tiene un fallo: no lo he hecho yo, y en mis programas (los de Spectrum), me gusta controlar el 100% del código.
Web: ZX Projects | Twitter: @zxprojects

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por Gandulf » Mar Ene 08, 2008 10:25 pm

Pues por eso no me voy a pasar a C. Te entiendo perfectamente, McLeod. A mi no me gusta diseñar juegos, me gusta programarlos. No quiero que un gran porcentaje del código que se ejecuta en mi juego no sea mío. Lo puedes controlar igual porque tienes los fuentes, pero al fin y al cabo no es tu código. Esto hoy en día ya no se tiene en cuenta, pero cuando me pongo con el spectrum prefiero estar con la mente en modo "carca".

Tambien entiendo que a la gente que le gusta diseñar juegos, programar la parte gráfica le trae al pairo, porque lo que buscar es el resultado final y la jugabilidad (no es mi caso).

Sin irse por los cerros de úbeda, la verdad es que sí es interesante ese benchmark, y sobre todo ver el asm resultante, tanto en cuestión de velocidad como de espacio ocupado.
Un saludo,

Gandulf

Avatar de Usuario
radastan
Phantomas
Mensajes: 2201
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por radastan » Mié Ene 09, 2008 10:18 am

Gandulf escribió:Pues por eso no me voy a pasar a C. Te entiendo perfectamente, McLeod. A mi no me gusta diseñar juegos, me gusta programarlos. No quiero que un gran porcentaje del código que se ejecuta en mi juego no sea mío. Lo puedes controlar igual porque tienes los fuentes, pero al fin y al cabo no es tu código. Esto hoy en día ya no se tiene en cuenta, pero cuando me pongo con el spectrum prefiero estar con la mente en modo "carca".


Apoyo la moción, hasta las rutinas más trilladas de gráficos me gusta programarlas a mi modo, en muchos casos luego he comparado y son prácticamente iguales a las que puedes encontrar ya realizadas, pero odio tener código en mis proyectos que no sepa como funcionan o que yo no lo haya programado. Te da sensación de "control" y es la única forma de tener bien estructurado el código (aparte de poder aprovechar partes de algunas subrutinas para otras subrutinas sin repetir el código).

El C me resultaría extremadamente cómodo, se programar en ANSI C, pero no lo veo práctico para un ZX Spectrum en muchos casos y veo abstracto combinar dos lenguajes en un código (ASM y C), le quita flexibilidad y portabilidad al lenguaje C.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por Gandulf » Mié Ene 09, 2008 10:22 am

Hombre, cómodo es. Recuerdo cuando programaba en MS-DOS en Pascambler, mezclando en turbopascal el Pascal de toda la vida y el ASM. En mi caso me imagino que si realmente lo que me gustara fuera el diseñar el juego, como producto, pensaría de otro modo.
Un saludo,

Gandulf

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un pequeño ejemplo de desarrollo en C para Spectrum

Mensaje por na_th_an » Mié Ene 09, 2008 1:43 pm

radastan escribió:veo abstracto combinar dos lenguajes en un código (ASM y C), le quita flexibilidad y portabilidad al lenguaje C.


No tanto. Fíjate que BeTiled comparte un montón de código entre las versiones de Spectrum y MSX. Un Z80 es un Z80 :)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados