Tutorial muy básico de C para Master System

1, 2, 3, 4, 521
@Gammenon

No tengo ni idea del SDK, lo de las resoluciones 224 y 240 lo se, porque me dieron bastante por saco cuando estaba arreglando unos fallos de los juegos de codemasters en el emulador de master que estaba programando en psp

Sobre los tiles, eso se lo dejo a Kusfo, pero teniendo en cuenta q la vram es de 16kb, y restandole lo que se necesite para tablas, etc no creo q se puedan poner mucho mas de 400 tiles, no creo q llegen a 500 efectivos

Una pantalla completa de 256x192 ya son 768 tiles, por eso decia q la reventaria jeje
theelf escribió:@Gammenon

No tengo ni idea del SDK, lo de las resoluciones 224 y 240 lo se, porque me dieron bastante por saco cuando estaba arreglando unos fallos de los juegos de codemasters en el emulador de master que estaba programando en psp

Sobre los tiles, eso se lo dejo a Kusfo, pero teniendo en cuenta q la vram es de 16kb, y restandole lo que se necesite para tablas, etc no creo q se puedan poner mucho mas de 400 tiles, no creo q llegen a 500 efectivos

Una pantalla completa de 256x192 ya son 768 tiles, por eso decia q la reventaria jeje


Pues parece que sí, que habrá que repetir [+risas] En qué lenguaje sueles programar tus emuladores? Me extraña que los programes y luego digas que tus conocimientos de C sean limitados.
@Gammenon

Si programo algun emulador de CPU normalmente lo hago en ensamblador, alguna vez en basic, pero asm casi siempre

Lo que es la GUI, prefiero usar alguna de otro proyecto ya existente, asi q normalmente en estos casos suele ser C. En caso de no encontrar ninguna, pues depende la plataforma, trataria de usar basic

Mis conocimientos de C son limitados, en el sentido que, por ejemplo, puedo llegar a escribir un emulador en C con mis conocimientos actuales, pero me costaria mucho, y no quedaria todo lo optimizado que me gustaria
Hola.
Lo primero de todo, muchas gracias a @kusfo79 por este tutorial que se está currando.
Por otro lado, decir que estoy instalándolo todo, pero al comprobar en la consola de comandos si se ha instalado bien el sdcc, me sale lo siguiente:
Imagen
Y no se si está bien o no. ¿Podríais ayudarme?
@jrll

Parece q la version q gastas es antigua, tal vez el sddcc.exe que tienes en el path es de alguna otra cosa q intentastes compilar? fijate q estas ejecutando el correcto de tener mas de uno

Y no dejes espacio entre "--" y "version"
Uis, cuantas respuestas en una mañana, vamos paso a paso:

@jrll
El problema es que has puesto un espacio entre -- y version , por eso te da el error. Ponlo junto y debería salirte el número de version del sdcc.

@theelf
La VRAM de la master system permite unos teoricos 512 tiles, pero debido a que parte de la memória se usa para las tablas de atributos de scroll, queda espacio para unos 440 tiles. Los fondos pueden usar cualquiera de los tiles, mientras que los sprites tienen que usar o de los 256 primeros, o de los 256 posteriores, no se pueden combinar. Una ventaja que tiene la master respecto a la nes es que los tiles de fondos se pueden espejar horizontal y verticalmente, con lo que el número de tiles a usar para un fondo que tenga simetrias disminuye mucho.

Sobre la paleta,al tener cuatro posibles niveles para cada canal (R, G, B) se suele tomar como referéncia esos valores que has comentado: 0, 85, 170, 255, pero obviamente, depende bastante de la herramienta usada en la conversión como se mapean los colores que no sean exactos.

Para la paleta de sprites, el primer color de la paleta es el que es tratado como transparente, y solo se usa como color real cuando usamos la paleta de sprites para algún tile del fondo.

@Gammenon
Los modos de 224 y 240 pixels de altura si que están soportados por devkitSMS. Si los quisieramos activar haríamos:
SMS_VDPturnOnFeature(VDPFEATURE_240LINES);
o SMS_VDPturnOnFeature(VDPFEATURE_224LINES)

Si en lugar de eso quisieramos usar los modos gráficos de la SG-1000, deberíamos usar el fichero SGLib.h con las funciones específicas de la SG-1000.
Gracias @kusfo79 y @theelf por vuestras rápidas respuestas. Creo que había conflicto con el gbdk.
Ahora me sale esto. Creo que está bien ¿no?
Imagen
jrll escribió:Gracias @kusfo79 y @theelf por vuestras rápidas respuestas. Creo que había conflicto con el gbdk.
Ahora me sale esto. Creo que está bien ¿no?
Imagen


Está estupendo!
Bueno, he estado con la primera lección y todo parece haber ido bien, salvo que al final, cuando se supone que se genera la rom sms y lo ejecuta el emulador, a mí no me pasa eso. Tan sólo se me crean algunos archivos nuevos en la carpeta, quedando así:
Imagen
El código es el mismo del tutorial. Lo he hecho todo igual, salvo que al proyecto lo he llamado SMSprueba en vez de elotroladogame.
No se qué es lo que falla :-?
Veo que el fichero game.rel está ahí, lo que indica que se ha compilado correctamente el fichero game.c. Sin embargo no veo el game.ihx, producto del linkage.

¿Puedes ejecutar el bat desde la linea de comandos, y así vemos cual es el error?
Al ejecutar el bat con la consola de comandos, me he dado cuenta de que se me había bailado una letra y por eso daba error.
Ahora sí se me crea la rom sms, y tengo así la carpeta del proyecto:
Imagen
Pero el emulador no se ejecuta:
Imagen
¿Tengo que meter el emulador en la misma carpeta que el proyecto para que se inicie automáticamente al ejecutar el bat? Ahora los tengo en carpetas separadas.
Puedes poner el emulicious en el PATH de windows, o sinó, en la linea donde ponemos:
java -jar Emulicious.jar elotroladogame.sms

pones la ruta entera hasta Emulicious.jar, por ejemplo:
java -jar c:\Users\jrll\Desktop\Emulicious\Emulicious.jar elotroladogame.sms

o si la carpeta es "hermana" de la del proyecto:

java -jar ..\Emulicious\Emulicious.jar elotroladogame.sms

A ver si así te sirve!!
Muchas gracias @kusfo79 por tu paciencia.
Ahora si que va todo de maravilla. XD Pronto me pondré con la siguiente lección.
Me parece un hilo muy interesante!

Cuando pueda le meto chicha y pongo por aquí mis progresos [360º]
Ya le agarre la mano a la paleta, la verdad que 6bits dan mucho de si, es una marabilla en este aspecto la master

Imagen
Bueno, pues me he puesto manos a la obra y ya he hecho la lección 2.
No he tenido ningún problema, así que seguiré trasteando un poco más con el pintado de fondos hasta que salga la lección 3 [360º]
Qué bueno! [tadoramo] Cuando aumente mis conocimientos de programación, siempre quise hacer algo de master

A favoritos que vas.
theelf escribió:Ya le agarre la mano a la paleta, la verdad que 6bits dan mucho de si, es una marabilla en este aspecto la master

Imagen


La master con una buena paleta elegida, da muchísimo de si!
@kusfo79

Si, estoy sorprendido la verdad

Ya conocia la paleta y sus limitaciones/bondades, pero te soy sincero, nunca me habia puesto a editar graficos para la master


Justo ahora estaba programando una simulacion de game&watch para Megadrive. Luego que la termine, vere de si puedo hacer un port a Master system siguiendo tu tutorial

Hice una pequenia prueba, y la verdad que no quedaria mal


Imagen
Qué buena pinta tiene esa simulación de game&watch, @theelf
Por cierto, ¿en qué lenguaje estás programando la versión de Mega Drive?
jrll escribió:Qué buena pinta tiene esa simulación de game&watch, @theelf
Por cierto, ¿en qué lenguaje estás programando la versión de Mega Drive?


En basic casi todo, solo use ensamblador para un par de rutinas de dibujado de la pantalla y para el sonido

Megadrive me gusta programar en basic, es mi momento de nostalgia jeje
theelf escribió:
jrll escribió:Qué buena pinta tiene esa simulación de game&watch, @theelf
Por cierto, ¿en qué lenguaje estás programando la versión de Mega Drive?


En basic casi todo, solo use ensamblador para un par de rutinas de dibujado de la pantalla y para el sonido

Megadrive me gusta programar en basic, es mi momento de nostalgia jeje


Pues te está quedando de maravilla, de verdad. [oki]
kusfo79 escribió:Lección 3, Scroll! colgada! :-D


Gracias, me puse un ratito esta maniana con ello, lastima q tengo q trabajar, asi q no podre ponerme de nuevo hasta dentro de unos dias

Estube echando un vistazo al vblank, para ver de q tipo de efectos se podrian hacer, aunque ya te digo, en los 5 minutos q me puse, poco saque en claro

Intente ver de controlar el raster cada linea, pero no salio bien la cosa

Te dejo el link de la rom

http://akihabara-online.com/Megadrive/Master/test5.zip



Cuando termines el tutorial, estaria bien compartir codigo con "trucos" q vallamos descubriendo q se puedan hacer en el devkit, sin tener q echar mano de asm

Ahora no se si andar metiendo ejemplos diferentes a los de tu tutorial lo desviaria mucho, y no es lo q quiero
Ostras!, no se que efecto buscabas, pero mola!!! :-D

De momento en el tutorial no estoy entrando en cosas avanzadas, sobre todo por si hay gente que apenas está empezando a toquetear una consola retro. Espero que a medida que avance, podamos poner esos trucos y otras cosas similares!.

Yo no he probado de hacer efectos de raster aún, pero Sverx colgó un par de roms que había hecho con efectos de raster. Hay algo de explicación aquí:

https://github.com/sverx/devkitSMS/wiki/Advanced
@kusfo79 , he visto que por el foro de SMSPower están muy activos con el tema de GG2SMS. Creo que es Revo y un chico de Barcelona los que no paran de convertir juegos. He visto algún vídeo de los que va subiendo Revo.
¿Esto lo hacen programando no?. Me parece algo realmente interesante, ya que aumenta el catálogo de la MS mucho. Me llamó la atención los dos SOR de la GG, que cuando Revo escoge la opción 2 players, aparece un mensaje para que compruebes el cartucho.

Un saludo.
Gracias por todo este trabajo, @kusfo79. Tienes pensado subir un zip por cada sección del tutorial? Vendría muy bien tener el código fuente ya a mano.
aranya escribió:@kusfo79 , he visto que por el foro de SMSPower están muy activos con el tema de GG2SMS. Creo que es Revo y un chico de Barcelona los que no paran de convertir juegos. He visto algún vídeo de los que va subiendo Revo.
¿Esto lo hacen programando no?. Me parece algo realmente interesante, ya que aumenta el catálogo de la MS mucho. Me llamó la atención los dos SOR de la GG, que cuando Revo escoge la opción 2 players, aparece un mensaje para que compruebes el cartucho.

Un saludo.


Lo hacen modificando la ROM (creo que desensamblan,buscan las partes que se encargan de la creación del tilemap, etc, convierten las paletas..., y luego reemsamblan). Nunca me he puesto a hacerlo, pero creo que al inicio del hilo este que comentas, hay alguna explicación de como han hecho la conversión.

Gammenon escribió:Gracias por todo este trabajo, @kusfo79. Tienes pensado subir un zip por cada sección del tutorial? Vendría muy bien tener el código fuente ya a mano.


Tienes razón, voy a subirlo a partir de esta lección!
@kusfo79

Mi idea era cada 1 pixel, hacer scroll para cada lado, o sea, de los 192 pixeles, 96 a la derecha, 96 a la izquierda de forma entrelazada

Una forma cojonuda por ejemplo, para la presentacion, o inciar un nivel
@kusfo79

Muchas gracias por el tutorial. Ahora no puedo ponerme porque tengo mi propio juego que estoy programando en C++ y OpenGl, pero mirando por encima tu trabajo se puede ver que para Master se proporcionaban herramientas útiles para programar fácilmente (a juzgar por el tutorial del scroll, muy intuitivo y sencillo). Me recuerda un poco a Xna, donde también se proporcionaban muchas herramientas exclusivas de programación de videojuegos.

Estaré atento a la evolución del tuto. [beer]
@Promis

En realidad no se proporcionaba nada de nada. Un triste manual con las especificaciones de la consola y el funcionamiento de sus custom chips y vas que te matas. En la época cada desarrollador tenía que crearse su toolchain y bibliotecas propias. Con las consolas de 32 bits si que ya cambió mucho.

Otro tema es lo que se ha ido desarrollando en la escena los últimos años con devkits que facilitan muchísimo el trabajo.
@Paspallas

Pues vaya faena, trae lo suyo tener que crear un motor para cada juego desarrollado.

De todas formas, tanto en este tutorial, como en el tuyo de Megadrive. La programación, bibliotecas, etc... están ya liberadas y expuestas en internet? O es material de vuestra cosecha lo que nos exponéis aquí? @kusfo79 .

De nuevo gracias a los dos por los tutos.
Promis escribió:Pues vaya faena, trae lo suyo tener que crear un motor para cada juego desarrollado.
No es necesario crear un motor para cada juego, sólo en casos extremos. Por un lado la parte de hardware será universal a cualquier juego, así que una vez que la hagas ya te sirve para siempre.

Luego el resto puede ser o no reusable, pero ya sabemos que mientras más generalista sea un motor, menos eficiente es, y más en máquinas donde cada ciclo cuenta. Depende de cada uno, del tiempo que quiera/pueda emplear, de lo que quiera/necesite exprimir la máquina, etc.
Sí, está claro que los códigos son reusables. Tenemos muchos ejemplos de motores que se han usado en su versión inicial, otra más avanzada.

Un ejemplo claro el Final Fantasy VI y posterior Chrono Trigger en Snes.

Aquí en Master System los Sonic the Hedgehog.

Un saludo.
Promis escribió:@Paspallas

Pues vaya faena, trae lo suyo tener que crear un motor para cada juego desarrollado.

De todas formas, tanto en este tutorial, como en el tuyo de Megadrive. La programación, bibliotecas, etc... están ya liberadas y expuestas en internet? O es material de vuestra cosecha lo que nos exponéis aquí? @kusfo79 .

De nuevo gracias a los dos por los tutos.


Lo de la Master lo ha hecho sverx, un chico italiano, y lo enseñó en SMSPower, la web de referencia de Master System.

http://www.smspower.org/forums/15228-DevkitSMSDevelopYourHomebrewInC

El de Mega lo creó Stef por los foros de spriteminds, y ya hace más tiempo que ronda. Pocket Lucho hizo incluso un tutorial por estos foros hace eones....
@kusfo79

Gracias tío. Imagino que te habrá costado lo tuyo crear el tutorial. Es un trabajo de chinos esto de hacer videojuegos, pero luego tras ver el resultado compensa el esfuerzo.

Un saludo.
He puesto ya un enlace con el fichero zip de la lección 3!
kusfo79 escribió:He puesto ya un enlace con el fichero zip de la lección 3!


Muy bueno, gracias

Si te sirviera de algo, yo voy haciendo mis ejemplos, te los puedo subir para q no tengas q currar tu
Pues molaría! Pero tus pruebas son algo más avanzadas, no? lo digo para subirlas más adelante y que la gente no se asuste jeje
kusfo79 escribió:Pues molaría! Pero tus pruebas son algo más avanzadas, no? lo digo para subirlas más adelante y que la gente no se asuste jeje


No, estoy siguiendo tu tutorial, asi q son basicas. SI q a veces se me va la pinza y trato de probar algo, pero nada mas

No tengo mucho tiempo, asi q lo seguire sin desmadrarme demasiado. Pero q se yo, tal vez puedan servir, a medida q escriba codigo, lo ire posteando


Una pregunta, estuve echando vistazo al codigo del devkit, y vi una funcion interna, llamada SMS_getVCount

No se si no me fije bien, pero no la veo documentada, por lo que puedo leer del codigo, daria el numero de linea donde esta el raster vertical

No logre echar muy bien cuenta de como hacer efectos raster, pero creo q ando un pelin mas cerca

http://www.akihabara-online.com/Megadrive/Master/test6.zip


Si algun dia te pones con los raster, me chiflas, que me parece interesante teniendo en cuenta la limitacion del unico plano
theelf escribió:
kusfo79 escribió:Pues molaría! Pero tus pruebas son algo más avanzadas, no? lo digo para subirlas más adelante y que la gente no se asuste jeje


No, estoy siguiendo tu tutorial, asi q son basicas. SI q a veces se me va la pinza y trato de probar algo, pero nada mas

No tengo mucho tiempo, asi q lo seguire sin desmadrarme demasiado. Pero q se yo, tal vez puedan servir, a medida q escriba codigo, lo ire posteando


Una pregunta, estuve echando vistazo al codigo del devkit, y vi una funcion interna, llamada SMS_getVCount

No se si no me fije bien, pero no la veo documentada, por lo que puedo leer del codigo, daria el numero de linea donde esta el raster vertical

No logre echar muy bien cuenta de como hacer efectos raster, pero creo q ando un pelin mas cerca

http://www.akihabara-online.com/Megadrive/Master/test6.zip


Si algun dia te pones con los raster, me chiflas, que me parece interesante teniendo en cuenta la limitacion del unico plano


Es esto lo que buscas?

/* line interrupt */
void SMS_setLineInterruptHandler (void (*theHandlerFunction)(void));
void SMS_setLineCounter (unsigned char count);
#define SMS_enableLineInterrupt()   SMS_VDPturnOnFeature(0x0010)   /* turns on line IRQ */
#define SMS_disableLineInterrupt()  SMS_VDPturnOffFeature(0x0010)  /* turns off line IRQ */


Con SMS_setLineInterruptHandler() puedes indicarle a la librería la dirección de una función tuya, que se llamará cada vez que se vaya a pintar un nuevo scanline, si no me equivoco.
@Gammenon

Si gracias, antes de postear ya le estuve echando un vistazo, pero al no tener una documentacion completa, no supe bien la funcion. Me fije en el codigo, y vi que actualiza el registro 0x0A del VDP, ahi lo deje

Encontre que SMS_getVCount en un principio lee en que linea estaria, aunque bueno, no me fije demasiado ya que estoy con otras cosas
Que paso?? nadie se anima a postear nada mas??

Porque el tuto ya explica lo suficiente para q muestren algo de codigo muchachos...
Interesantísimo hilo.
A la que acabe la mudanza y tenga mi PC montado, lo intento probar.

Un saludo!!
Yo he tenido un par de semanas liadas, pero esta semana que viene cuelgo la lección de los sprites!!
kusfo79 escribió:Lección 4 Colgada!

Gracias kusfo79! [tadoramo]
@kusfo79

Gracias, puesta en practica [+risas]

Imagen
theelf escribió:@kusfo79

Gracias, puesta en practica [+risas]

Imagen


me encanta!!! [plas] [plas]
theelf escribió:@kusfo79

Gracias, puesta en practica [+risas]

Imagen


Tienes algún proyectillo entre manos, theelf? XD
1022 respuestas
1, 2, 3, 4, 521