Tutorial muy básico de C para Master System

Diskover escribió:
kusfo79 escribió:@aranya

se puede hacer con materiales mas baratos, y con una impresora mas barata, pero la solución es el molde para inyección de plastico. A ver si consigo que me hagan un presupuesto de una vez...


This.

Sería muy interesante lo del molde.


Hace ya un par de años que lo estoy intentando mover, a ver....

Unos australianos hicieron una solución de baja tecnologia bastante interesante para el SC-3000, SG-1000 y Mark III :

https://www.wired.com/2012/12/diy-mold-making/
Recuerdo que en smspower el Nuke Dukem de master system (el mod del alex Kidd) el autor los vendia en version fisica donde iba el juego completo, ya que para descarga está disponible la demos con unos cuantos niveles.

Y me he tropezado con alguna tienda de repros de Master system. Si han sacrificado cartuchos, vaya barbaridad...
Una duda, por ejemplo con el Duke Nukem, o con cualquier otro juego que se quiera vender en físico.

¿Se les pone algún tipo de protección antidumpeo, o directamente no se pone nada porque va dirigido a otro público?, es decir, el que compra el físico le da igual que esté la ROM por ahí, y el que quiere la ROM nunca pagaría por el físico.

Un saludo.
@John3d

Revo, el del DukeNukem, habló conmigo para los moldes, ya hará dos años, pero como no avanzó el tema, hizo la tirada sacrificando cartuchos.

@aranya
No hay buena protección antidumpeo más que poner cosas raras no estandar en la placa, que no esten emuladas...
@kusfo79 , ¿tipo chips especiales de sonido como el del Paprium?.
De todas formas, yo creo que hoy en día, el juego físico de MS y la ROM no se pisan la una a la otra. El que quiere el juego físico, lo va a seguir comprando igual, esté o no en ROM.

Bueno, es mi opinión.
@aranya

Si, algo de ese estilo. Y estoy de acuerdo contigo, hoy en día, da igual lo que hagas, en general el físico lo pillará el collecionista, y la rom la gente que solo quiere jugar, no me parece incompatible
Creo que empiezo ya con mala pata porque tengo un problema ya en el paso 0 [jaja]

He instalado el sdcc.exe con permisos de administrador, pero al ir a la linea de comandos comprobar que salga la versión del mismo me da error: La ejecución de código no puede continuar porque no se encontró libgcc_s_seh-1.dll. Este problema se puede solucionar reinstalando el programa.

He filtrado este hilo y hubo un usuario con problema parecido que puso espacio entre el -- y version. No es mi caso y también he probado a reinstalar y seleccionar esto al final de la instalación:
Imagen

Que supongo es a lo que te refieres con lo de añadir al PATH ¿no?

¿Debería instalarlo entrando en modo admin en el PC? Creo que ya me pasó con algún programa de la scene que aunque yo le daba a instalar como admin no se instalaba correctamente si no lo hacía desde el perfil de administrador.

Gracias
Hola, yo también estoy teniendo algunos problemillas con el tutorial...

Yo marqué esa casilla para añadirlo al PATH @Calculinho y para poder ver si estaba correcto, tuve que escribir lo siguiente:

sdcc -version

Con dos guiones daba error...prueba a ver...quizá al ser una versión algo ha cambiado en los comandos.

Estoy utilizando un Windows XP en una máquina virtual y no lo instalé como Admin.

Ahora no puedo ahondar en mi problemilla...a ver si mañana puedo sentarme y escribir un poco, porque la verdad es que me ha picado el gusanillo de empezar a estudiar esto [beer]
@isacin buenas y gracias por responder, pero con un guión me da el mismo error. Mañana si eso pruebo a instalar lanzando Windows como admin.
@Calculinho @isacin
Buenas a los dos!

A Isacin le diría que puedes tener problemas por estar instalandolo en un windows tan viejo, creo que es bastante posible que algunas librerias externas no funcionen

A Caculinho, que windows tienes? normalmente si necesita permisos de administrador, te pregunta el propio instalador acerca de ello.
Yo lo instalé en un xp sin admin, hace ya un tiempo, no recuerdo haber tenido problemas.
Prueba a reinicar después de la instalación para que te refresque PATH.
kusfo79 escribió:@Calculinho @isacin
Buenas a los dos!

A Isacin le diría que puedes tener problemas por estar instalandolo en un windows tan viejo, creo que es bastante posible que algunas librerias externas no funcionen

A Caculinho, que windows tienes? normalmente si necesita permisos de administrador, te pregunta el propio instalador acerca de ello.


Windows 10 de 64 bits (no sé si existe todavía el x86). Me pide permisos, pero ya me pasó con otros programas de la scene que para instalarlos tuve que lanzar W10 en modo administrador y darle permisos al programa para que pueda lanzarlo cualquier usuario. Esta noche pruebo a hacer eso y ya comento si funcionó.


SetzerGabbiani escribió:Yo lo instalé en un xp sin admin, hace ya un tiempo, no recuerdo haber tenido problemas.
Prueba a reinicar después de la instalación para que te refresque PATH.


Reinicie también, pero sigue igual. Gracias por la idea!
@kusfo79 buenas noches!

Pues no he tenido problemas hasta ahora con la instalación o uso de SDCC excepto por el tema de usar un único guión para comprobar si lo instalé bien.

Mi problemilla llegó con la imagen de fondo con el logo de Master System que descargué de tu link. Al utilizar el bmp2tile me decía que la imagen no era compatible. La convertí en paint a un bmp de 16 colores y ya la aceptó, creando los tres archivos necesarios.

La cosa se agrava en el siguiente paso, al utilizar el folder2c para convertir los tres archivos a formato "c". El ejecutable lo realiza, crea los bank1.h y bank1.c pero están vacíos, sin nada dentro.

He probado con otras carpetas y sí que crea los dos bank1 con contenido en el archivo .c y .h , así que no sé dónde pueda estar el error. Este comando también lo he probado en Windows 7 y mismo resultado de archivos vacíos.

Lo intentaré en WIndows 10 cuando tenga tiempo. ¡Gracias por la ayuda y el trabajo!
Bueno os comento, tras probar muchas cosas y ver que ninguna iba se me ocurrió volver a descargar el programa por si estaba mal descargado o corrupto. El caso es que ahora en las últimas buids no sale ninguna descarga para los Windows x64 así que busqué la última build estable que es la 3.6.0 creo ¿no? El caso es que instalé esta y a la primera:

Imagen


¿Es posible que mi problema haya sido reportado por más gente y hayan quitado la descarga hasta arreglarlo?

Bueno me han dado las tantas, quería hacer el paso 0 esta noche; pero tendrá que quedarse para otro día [+risas]
@isacin

Has probado de abrir el BMP2tile directamente, y exportar por la interfaz? a ver si te deja grabar como bin los archivos de la imagen.

Y sobre lo de la imagen en formato incorrecto...quizá compartía la original en lugar de la de 16 colores? a alguien más le ha pasado?

@Calculinho
Cuando puedas, mira si ahora te funciona, que tengo curiosidad.
En mi experiencia el BMP2tile no funciona si:

- Las dimensiones de la imagen no son múltiples de 8
- Se superan 16 colores diferentes
- En el caso del PNG si está guardado con una profundidad superior a 8 bits
Lo raro es que igual compartí la imagen con la profundidad que no tocaba?
@kusfo79 te leí esto, pero por ahora voy paso a paso. Hoy he hecho hasta el 1.2.2 sin problema, pero todavía no he podido probar si funcionará.

Después tengo varias preguntas, pero son más por conocer un poco mejor las cosas. Ya te las haré cuando avancé más en el tutorial porque seguramente muchas las vayas resolviendo al ir avanzando.

Gracias!
Bueno, para descansar un poco de Spectrum, y Megadrive.... comienzo a darle
cera a la Master System.

@kusfo79
Hay un par de preguntas ke me dejan de akélla manera...

En el bat de compilación:
- de dónde sale ese archivo "elotroladogame.ihx" si es la primera vez ke voy a compilar?
Ké debo poner en su lugar en el batch, y lo ke es mejor... a ké file se refiere, ké contiene?

En el apartado de DevKitSMS
- Por ké dices ke se han de meter ciertas libs y sus correspondientes rel a la carpeta de desarrollo?
No deberían meterse en la carpeta include, ke sería lo más común en cualkier compilador?
[en el código ya indicamos con la directiva #include ke se van a usar]

Un saludo.
Xputo escribió:Bueno, para descansar un poco de Spectrum, y Megadrive.... comienzo a darle
cera a la Master System.

@kusfo79
Hay un par de preguntas ke me dejan de akélla manera...

En el bat de compilación:
- de dónde sale ese archivo "elotroladogame.ihx" si es la primera vez ke voy a compilar?
Ké debo poner en su lugar en el batch, y lo ke es mejor... a ké file se refiere, ké contiene?

En el apartado de DevKitSMS
- Por ké dices ke se han de meter ciertas libs y sus correspondientes rel a la carpeta de desarrollo?
No deberían meterse en la carpeta include, ke sería lo más común en cualkier compilador?
[en el código ya indicamos con la directiva #include ke se van a usar]

Un saludo.


Respecto a la segunda pregunta, no es lo mismo el #include que los ficheros .rel. Cuando en C o C++ haces un #include simplemente estás referenciando un fichero .h que no suele traer código en sí mismo (excepto macros), sino que sólo suele ser una interfaz. Los ficheros .rel son los que traen el código.
En otras palabras: con el .h dices qué funciones vienen en el .rel. Además los ficheros .h se consumen en tiempo de compilación y los .rel en tiempo de enlace o "linkado".

Todo esto es cómo funciona el lenguaje C, no es algo especifico del DevKitSMS (excepto que las librerías tengan la extensión rel, en otros sistemas operativos son .a o .lib)
@Xputo

Sobre la primera pregunta, el ihx es el fichero de salida después de compilar el juego (es el formato de salida del SDCC). Defines el nombre en la linea que pones
sdcc -o loquesea.ihx game.c 

y luego lo convierte en rom en la linea que pones:
ihx2sms loquesea.ihx loquesea.sms


Sobre la segunda pregunta,puedes poner los .h en un subdirectorio, y los .rel en el mismo, aunque tendras que referenciar los directorios en el .bat. No te va a pillar las libs automaticas, como stdlib, a menos que las incluyas en el directorio libs del SDCC, pero en ese caso, igual tienes problemas si vas a usar el SDCC para otra plataforma como el Amstrad o el Spectrum.

Si necesitas alguna otra respuesta, aquí estamos!
Ahora que estais hablando de C y ficheros .h y #include etc...

¿Existe alguna forma o comando para decirle, o hacer un if que permita que cargue un #include u otro dependiendo de X factores?
Diskover escribió:Ahora que estais hablando de C y ficheros .h y #include etc...

¿Existe alguna forma o comando para decirle, o hacer un if que permita que cargue un #include u otro dependiendo de X factores?


Por supuesto, tienes el #ifdef por ejemplo: https://www.cprogramming.com/reference/ ... ifdef.html
Fale, entendido.
Esperaba ke "lokesea.ihx" fuese un archivo .s ó .a [asm resultante].
Pero vamos, ke es el fichero objeto.

Lo ke comentaba sobre las lib o archivos cabecera y sus .rel es más ke nada por
limpieza en la carpeta de desarrollo.
Estoy acostrumbrado al z88dk en donde cada cosa va en su carpeta y tal. Aunke
por supuesto puedes colocar los archivos donde te plazca... luego ya te lías la manta
a la cabeza para indicar/referenciar todo lo ke uses.

Lo dicho, gracias por las explicaciones... según vaya avanzando iré preguntando lo
ke no entienda.

---- Edito:
Imagino ke usas una versión vieja del bmp2tile basada en línea de comandos, porke
la versión ke yo tengo tiene sus menús y tal, siendo más cómodo. Kizás deberías
cambiar eso en el wiki [eso es cosa tuya] ;) ;) ;)

--- Edito2:
Me ha dado por mirar el header de la ROM y no aparece nada de Sega... cawento
Eso me moskea bastante. Algo pasa akí... para ke no lleve un header correcto.
Al menos el emu traga... XD XD XD
@Xputo

Buenas!

Si, las librerias, como pones, puedes ponerla donde quieras, e incluso en la instalación del propio SDCC, pero eso a mí no me gusta por que uso el SDCC también para otras máquinas. En el tutorial los ficheros están todos a saco en el mismo directorio, por que para empezar prefería no liar a la gente, jeje.

Sobre el bmp2tile, en realidad es al revés, primero salió solo con menus, y luego incluyeron la versión de línea de comandos. Usamos la versión de linea de comandos por que así reexportas los assets cuando le das a compilar, y no necesitas exportar los resources manualmente si los has cambiado.

Por último, lo de la cabecera se hace así:
SMS_EMBED_SEGA_ROM_HEADER(9999, 0); // code 9999 hopefully free, here this means 'homebrew'
SMS_EMBED_SDSC_HEADER_AUTO_DATE(0, 1, "1985Alternativo", "KatKills",
   "Punk Cat Brawler for SMS");

(este es un ejemplo del código del juego que estabamos haciendo en el fnac'n pixels).

Por cierto, si quieres ver un código algo más currado, puedes echar un ojo al repositorio de ese juego:

https://github.com/kusfo/mastersystembrawler
Ah, coño !! Ke hay una función para ello...!!
Yo pensaba ke era un fallo del compilador o algun comando ke se hubiese escapado
al hacer el batch. XD XD XD

Una chorradilla: En algunos ejemplos por ahí he visto ke usan después de la función
SMS_displayOn ();
for (;;);
...un for vacío... para ké... a modo de halt y gastar un ciclo?
[no le veo otro sentido sino]
kusfo79 escribió:@Xputo

Buenas!

Si, las librerias, como pones, puedes ponerla donde quieras, e incluso en la instalación del propio SDCC, pero eso a mí no me gusta por que uso el SDCC también para otras máquinas. En el tutorial los ficheros están todos a saco en el mismo directorio, por que para empezar prefería no liar a la gente, jeje.

Sobre el bmp2tile, en realidad es al revés, primero salió solo con menus, y luego incluyeron la versión de línea de comandos. Usamos la versión de linea de comandos por que así reexportas los assets cuando le das a compilar, y no necesitas exportar los resources manualmente si los has cambiado.

Por último, lo de la cabecera se hace así:
SMS_EMBED_SEGA_ROM_HEADER(9999, 0); // code 9999 hopefully free, here this means 'homebrew'
SMS_EMBED_SDSC_HEADER_AUTO_DATE(0, 1, "1985Alternativo", "KatKills",
   "Punk Cat Brawler for SMS");

(este es un ejemplo del código del juego que estabamos haciendo en el fnac'n pixels).

Por cierto, si quieres ver un código algo más currado, puedes echar un ojo al repositorio de ese juego:

https://github.com/kusfo/mastersystembrawler


El master system brawler es tuyo, kusfo?
@Xputo

Un for sin condiciones es un for que es un loop eterno (como un while(true)). Lo que si lo haces también vacío de cuerpo, eso se queda bloqueado y no sirve para nada...en que ejemplo lo has visto?

@Gammenon Si!, lo estuvimos haciendo en directo en la fnacn'pixels de este año. Aquí hay algunos videos resumen:
https://www.elotrolado.net/viewtopic.php?p=1745886440
Eso pensé el principio, pero me dije "... siempre se usa un While(1), y aunke al compilar
se ahorre algo de peso, va a ser cosa nimia..."
Luego me dije, y si hay algo más ke se me escapa ?

Lo ví en un ejemplo en SMSPower.... y sí lo usan en vez del While de turno.

El de los rizos debes de ser tú... [igual yerro] XD Lo interesante sería ver un vídeo de todo
el proceso.... 'unke fuera pesau verlo del tirón !!'
No lo he visto aún, pero... el tamaño máximo de sprites ke soporta la Master es de?
Y el número máximo de sprites por scanline son 8, correcto?
Pero de tamaño máximo ?
U 8 de cualkier tamaño?
Y cuántos simultáneos en pantalla ?
Se pueden flipear, o sólo es para los tiles?
Xputo escribió:No lo he visto aún, pero... el tamaño máximo de sprites ke soporta la Master es de?
Y el número máximo de sprites por scanline son 8, correcto?
Pero de tamaño máximo ?
U 8 de cualkier tamaño?
Y cuántos simultáneos en pantalla ?
Se pueden flipear, o sólo es para los tiles?

8x16, 8 por linea, 64 en pantalla, sin ningun tipo de flip.
Hay un modo para doblar el tamaño (duplicando pixeles), pero no va bien en los primeros modelos de master.
Gammenon escribió:
Diskover escribió:Ahora que estais hablando de C y ficheros .h y #include etc...

¿Existe alguna forma o comando para decirle, o hacer un if que permita que cargue un #include u otro dependiendo de X factores?


Por supuesto, tienes el #ifdef por ejemplo: https://www.cprogramming.com/reference/ ... ifdef.html


Vale, pero esto solo sirve para cargar cosas antes de que el programa ya este funcionando.

Vamos, que no puedo hacer que me cargue un archivo antes que otro según la pantalla donde esté una vez iniciado el programa. Solo puedo hacerlo antes, en las definiciones del mismo y me imagino que para hacer pruebas y poco más ¿no?
¿Pero que es lo que quieres hacer exactamente?, los ficheros de encabezado no se "cargan", puedes compilarlos/incluirlos de forma condicional como te han explicado, pero una vez obtienes el binario ejecutable ya no hay código fuente.
@Paspallas

Puff... a ver si lo se explicar.

Debido a limitaciones de memoria, no puedo reservar X espacio.

Lo ideal sería poder cargar un array u otro array dependiendo de Y condiciones, aunque compartan nombre y sin que haya conflictos.

Pensé que este método sería el ideal, pero creo que tampoco.
No se si te sigo, pero quizás lo que necesitas es crear un buffer en RAM con el tamaño necesario de forma estática y copiar los datos desde ROM según tus condiciones. La última vez que vi la librería creo que no tenía soporte para reservar memoria de forma dinámica, algo que por otra parte hay que usar con mucho cuidado en estos sistemas tan limitados.
Paspallas escribió:No se si te sigo, pero quizás lo que necesitas es crear un buffer en RAM con el tamaño necesario de forma estática y copiar los datos desde ROM según tus condiciones. La última vez que vi la librería creo que no tenía soporte para reservar memoria de forma dinámica, algo que por otra parte hay que usar con mucho cuidado en estos sistemas tan limitados.


Si, eso sería lo lógico, pero el buffer es demasiado grande y me consume más de la RAM de la que dispongo.
Si necesitas ayuda y quieres hablar por privado ya sabes.
@kusfo79: hay alguna forma de indicar al compilador ke no me redondee la ROM a 16K
sino ke meta lo ke realmente pesa el code?
@Xputo No es el compilador el que redondea, sino la herramienta ihx2sms, de sverx. Si te fijas, al compilar, te pone el porcentage que está ocupado de la rom:

Imagen
El tamaño de la ROM va por múltiplos, no? 16KB, 32KB, etc.
@Gammenon Si, por que por direccionamiento, es lo que el z80 está viendo, bloques de 16kb, 3 a la vez, por tanto ha de ser multiple de 16k aunque sean zeros.
¿El tamaño de la ROM puede llegar a ser el que sea?, es decir, ¿Se puede hacer un juego de MS igual de peso que uno de NeoGeo?, ¿habría algún truco para hacerlo?.
aranya escribió:¿El tamaño de la ROM puede llegar a ser el que sea?, es decir, ¿Se puede hacer un juego de MS igual de peso que uno de NeoGeo?, ¿habría algún truco para hacerlo?.

Con el mapper estandar de sega son 512KB el máximo, teoricamente podría hacerse uno de lo que quieras si creas tu propio mapper.
aranya escribió:¿El tamaño de la ROM puede llegar a ser el que sea?, es decir, ¿Se puede hacer un juego de MS igual de peso que uno de NeoGeo?, ¿habría algún truco para hacerlo?.


El mapper de Sega permitía juegos de hasta 4 Megabits (512kb), y la bios de la SMS I no va con roms más grandes. Tectoy ya sacó juegos de 8 Megabits (1 mb), pero la bios de la SMS I no se las traga. Quitando eso, usando un mapper custom, que "engañara" a la bios, podrías hacer un juego tan grande como quisieras, eso si, solo viendo 48kb a la vez.
Ostras, pues gracias por las respuestas, es que era algo que siempre tuve duda y no terminaba de entender.
kusfo79 escribió:
aranya escribió:¿El tamaño de la ROM puede llegar a ser el que sea?, es decir, ¿Se puede hacer un juego de MS igual de peso que uno de NeoGeo?, ¿habría algún truco para hacerlo?.


El mapper de Sega permitía juegos de hasta 4 Megabits (512kb), y la bios de la SMS I no va con roms más grandes. Tectoy ya sacó juegos de 8 Megabits (1 mb), pero la bios de la SMS I no se las traga. Quitando eso, usando un mapper custom, que "engañara" a la bios, podrías hacer un juego tan grande como quisieras, eso si, solo viendo 48kb a la vez.


Entonces con el SMS Dev lib sólo se pueden crear ROMs de 512KB? Porque entiendo que eso del mapper ya es algo a nivel de hardware
No tengo claro si sverx ha limitado conscientemente el tamaño de las roms a 512kb. Es posible que simplemente vaya incrementando el número de bancos a usar, sin realmente preocuparse si va a petar o no en una consola real...
Hace tiempo, leyendo los comentarios de eruiz, hablaba de que estaba usando el espacio al máximo, y que no cabia nada, nada mas. Bueno, eso me pareció entender a mi.
1022 respuestas
18, 9, 10, 11, 1221