El desarrollo homebrew por parte de aficionados para la Sega Saturn prácticamente no existe, a diferencia de otras consolas clásicas que sí que tienen más proyectos y una comunidad sensiblemente activa en este campo. A parte del SDK oficial de SEGA, solo existía el Saturn Orbit, que es una especie de adaptación de Rockin'-B (omnipresente siempre en estos temas para la Saturn) y que ha comentado en varios tutoriales nuestro amigo y compañero del foro, FacundoARG. NOTA Edición: Ahora que recuerdo también existe el Game Basic que era comercial, todavía no lo he investigado. NOTA Edición 2: Tambien está disponible el libyaul que es totalmente open source.
Saturn Orbit si no me equivoco, y disculpadme si meto la pata porque en estos temas no sé prácticamente nada, es una especie de adaptación para trabajar con lenguaje C y las librerías de SEGA con compilador gcc optimizado para los procesadores de la Saturn. Un IDE (Integrated development enviroment) que tiene especificadas las librerías para compilar para la 32 bits de SEGA.
Sin embargo, este Saturn Lua Player tiene la capacidad de correr aplicaciones programadas en el lenguaje de programación Lua. Esas aplicaciones pueden tener acceso a cientos de funciones API y librerías que pueden ser necesarias como SGL (SEGA Graphics Library), PCM, GFS y STM.
Digamos que Lua Player para la Saturn es un intérprete del lenguaje de programación Lua, que hace buen uso de las librerías oficiales de SEGA para la Saturn. Es muy sencillo a la hora de ponerte a probar, ya que no necesita ningún tipo de configuración o setup, y solo te hace falta un editor de textos como el notepad y un emulador para empezar a programar en la Saturn.
¿Qué es Lua? El lenguaje del que parte este player portado a Saturn
Lua es un lenguaje de programación, basado en C y en Perl, imperativo, estructurado y bastante ligero que fue diseñado como un lenguaje interpretado con una semántica extendible. El nombre significa "luna" en portugués.
Más info en Wikipedia (que es de donde lo he copiado): http://es.wikipedia.org/wiki/Lua
Teóricamente Lua es más accesible y sencillo que otros lenguajes de programación, así que debería resultar más fácil para los principiantes hacer sus pinitos con el Lua Player que con el Saturn Orbit...
O sea que, vamos al grano. Voy a poneros un pequeño tutorial con un ejemplo por si queréis empezar a trastear con el Lua Player para Saturn.
NOTA: No tengo ni idea de programación. Solo hice cuatro chorradas en los tiempos de los 8 bits con el BASIC y poca cosa más. Quiero decir que teneis que coger todo esto con pinzas
Descargar Lua Player de Saturn
Como comentaba antes este entorno no tiene ningún tipo de configuración o problemas para instalarlo y demás. Es cuestión de bajarlo y empezar a picar código o liarse a probar con los ejemplos que vienen incluidos.
Por lo tanto, lo primero que tenemos que hacer es descargarlo y rápidamente estaremos ya funcionando. Podéis bajarlo en esa maravillosa página llamada SEGASaturno ( ) siguiendo este enlace, o en la web donde originalmente el gran Rockin'-B lo hizo público.
Bien, ya teneis el archivo comprido SaturnLuaPlayer_080701_R1. Lo descomprimis y vereis que os crea una carpeta llamada SaturnLuaPlayer. Ya podemos comenzar.
Primeros pasos
Si os fijais, teneis varias carpetas con diferentes contenidos (documentación, tools, librerías y demás historias), lo que nos interesa ahora para comenzar es la carpeta samples, donde están evidentemente los ejemplos.
Veremos diferentes carpetas con ejemplos que son proyectos que podemos probar y ver el código para copiar/trastear/modificar cosas, e incluso tratar de averiguar cómo funcionan. Tenemos la carpeta CHROME, DESIGN3, TORUS3, etc...
Bien, podéis probarlos todos en emulador si os apetece para ver como lucen estos ejemplos hechos con el Lua Player y fliparnos un poco de paso con lo que podríamos llegar a hacer. Para ello ejecutamos makeiso_all.bat que vemos en la carpeta samples y se compilan todas las isos de cada carpeta de ejemplos para que las podemos testear.
Usando emulador y unidad virtual para testear lo que programemos
Podríamos quemar cada iso en un CDROM y probarlo directamente en la Sega Saturn, pero está claro que lo mejor de momento es que usemos un emulador para catar los ejemplos y las cosas que podamos programar nosotros.
Una opción sería utilizar el Yabause, que directamente puede cargar isos y que podéis descargar en su página oficial: http://yabause.org
Pero yo prefiero usar el SSF porque es más fiel a la máquina original. No permite usar isos directamente, así que tendremos que montar las isos en una unidad virtual. Podeis bajar el emulador SSF aqui: http://www7a.biglobe.ne.jp/~phantasy/ssf/index.html (nota la pagina oficial se ha mudado y no recuerdo ahora donde, cuando la encuentre de nuevo la pongo)
Bajadlo desde nuestra web mismo.
Para el SSF, como decía, necesitais emular la iso con un CDROM virtual, algo que igual ya estáis acostumbrados a hacer para otros menesteres. Bajad el DAEMON Tools Lite 4, por ejemplo, si no lo tenéis, la versión Free de aquí:
http://www.daemon-tools.cc/products/dtLite#features
Instaladlo y ya contaréis con una o varias unidades virtuales para probar las isos que vayamos haciendo.
Vale, tenemos todo lo necesario. Estamos listos. Vamos a probar los ejemplos que vienen con el Lua Player y que hemos compilado con el makeiso_all.bat que hemos ejecutado anteriormente.
Abrimos el Daemon Tools y veremos la unidad virtual que nos ha creado tras la instalación. En mi caso es la letra M:, si le dais al boton derecho os aperece la opción "Montar" (también se puede arrastrar directamente la iso sobre la unidad). La seleccionamos y buscamos la iso de la carpeta samples/ CHROME para empezar. Vereis que en esa carpeta se encuentra el archivo sample.iso, lo montamos y ejecutamos el emulador.
En el SSF, a parte de necesitar la bios para un mejor funcionamiento (en este caso no lo recomiendo porque para esto va bien y así nos saltamos la animación de Saturn ide inicio cada vez), lo debeis configurar con la letra del CDROM para que sea la misma que la del Daemon Tools y así trague la unidad virtual y las isos que vayamos montando. Yo como os comentaba en Option del SSF en CD drive he seleccionado la letra M, haced vosotros lo propio con vuestra letra correspondiente. Bien, reiniciamos para que quede guardada la letra del CD pertinente (el SSF tras cada cambio en configuración hay que cerrar y abrir el emulador para que lo guarde) y lo ejecutamos de nuevo. Obtenemos esto:
NOTA Edición: He comprobado que si el SSF lo corres sin bios de la Saturn pueden mostrar mal algunos ejemplos y por ende algunas cosas que programemos (por ejemplo los colores de las letras no se ven bien en ocasiones). Así que es bueno que useis el emulador con BIOS.
Un objeto tridimensional rotando y mostrando varios valores de lo que va procesando, pintando en pantalla y demás. Muy bonito, luego veremos que el código se las trae
Podéis ir probando asi todos los ejemplos de las diferentes carpetas, tendréis el sample.iso correspondiente en cada carpeta DESIGN3, S_4_5, SBKLIB, etc. Probadlos todos si queréis, hay cosas bastante impresionantes para ser homebrew de la Saturn.
Al lío, primer ejemplo
Bueno, ya nos hemos hecho pajas mentales de lo que se puede hacer con este Lua Player. Ahora tendrás ganas de empezar a programar por ejemplo un Virtua Fighter 3 en hi-res y con los mismos gráficos que el Shenmue de Saturn... Bromas a parte, podemos ver el código de todos esos ejemplos para hacernos una idea de cómo están hechos.
El source code está en la carpeta de cada sample. Por ejemplo en el ejemplo DESIGN3, esta la carpeta cd y el código fuente está en el archivo 0_orig.lua. Vale para todos los ejemplos, siempre será así. Si lo abris con el bloc de notas os saldrá el contenido que empieza de esta guisa:
--/*----------------------------------------------------------------------*/
--/* Design Check 3 */
--/*----------------------------------------------------------------------*/
local max_texture = 2
-- Note: GFS_Init() has already been called in the Saturn Lua Player
local len = GFS_Load_name("DATA.BIN", 0, CPU_WRAM_LO, CPU_WRAM_LO_LEN)-- filename case sensitive !!!!
if len == nil or len <= 0 then
slPrint("Error loading data file!", 9, 3)
end
local object_sample = CPU_WRAM_LO + 0x000
local tex_sample = CPU_WRAM_LO + 0x220
local pic_sample = CPU_WRAM_LO + 0x210
local cam = {}
cam.pos = {}
cam.ang = {}
cam.sca = {}
cam.base = getnewuserdata(4*3*4)--
local old_pos = {}
local old_scl = {}
--/* Design Check 3 */
--/*----------------------------------------------------------------------*/
local max_texture = 2
-- Note: GFS_Init() has already been called in the Saturn Lua Player
local len = GFS_Load_name("DATA.BIN", 0, CPU_WRAM_LO, CPU_WRAM_LO_LEN)-- filename case sensitive !!!!
if len == nil or len <= 0 then
slPrint("Error loading data file!", 9, 3)
end
local object_sample = CPU_WRAM_LO + 0x000
local tex_sample = CPU_WRAM_LO + 0x220
local pic_sample = CPU_WRAM_LO + 0x210
local cam = {}
cam.pos = {}
cam.ang = {}
cam.sca = {}
cam.base = getnewuserdata(4*3*4)--
local old_pos = {}
local old_scl = {}
Y sigue bastante... Si no entendeis nada no os preocupéis, ya somos dos.
Vamos a hacer nuestro primer ejemplo de prueba, bien sencillo para que nos familiaricemos un poco con el rollo.
Nos podemos crear una carpeta nueva llamada por ejemplo Samples Mios y ahí copiamos un sample original para modificarlo y hacer nuestros testeos. Copiamos, por coger uno, la carpeta del sample CHROME: osea toda la carpeta CHROME la copiamos al directorio que hemos creado llamado Samples Mios. Lo mejor es que una vez copiada le cambiemos el nombre y le llamemos por ejemplo TEXTO Y VARIABLE, que es lo que vamos a hacer en esta primera prueba de toma de contacto.
Nota de edición: Asegurate que en el directorio que crees para meter tus pruebas, en este caso Samples Mios, en la raiz copies el IP.bin que viene en la carpeta original Samples, de lo contrario no podrás generar las isos del código que crees ya que el mkisofs.exe que lo hace necesita la Ip.bin (te aparecerían isos que pesarían 0kbs)
Perfecto, vamos a editar el código en nuestra carpeta TEXTO Y VARIABLE así que buscamos el archivo que tiene el código fuente para modificarlo. No es otro que 0_orig.lua, que esta dentro del directorio cd como hemos dicho con anterioridad.
Abrimos 0_orig.lua con el bloc de notas para modificarlo. Borramos todo lo que tiene y ponemos este código sencillo que me he inventado yo:
slInitSystem(TV_720x576,NULL,1)
local sega = 20
slPrint("www.segasaturno.com", 11, 3)
slPrint("Esto es una primera prueba", 5, 6)
slPrint("El valor de la variable es", 5, 7)
slPrint(sega, 32, 7)
slPrint("Saturn Lua Player", 11, 9)
while true do slSynch() end
local sega = 20
slPrint("www.segasaturno.com", 11, 3)
slPrint("Esto es una primera prueba", 5, 6)
slPrint("El valor de la variable es", 5, 7)
slPrint(sega, 32, 7)
slPrint("Saturn Lua Player", 11, 9)
while true do slSynch() end
¡Listo! Este ya se entiende algo mejor, ¿verdad? Guardamos este 0_orig.lua y ya tenemos preparado para "compilar" nuestra primera iso creada por nosotros y probarla en el emulador.
Si vais un directorio hacia atrás en nuestra carpeta TEXTO Y VARIABLE veréis que tenemos un ejecutable llamado makeiso_for_debugging.bat, que como su nombre indica se encarga de crear la iso con el código que acabamos de copiar. Lo ejecutamos e inmediatamente obtenemos nuestra iso con el archivo que se generará y que veremos que se llama sample.iso.
El mismo proceso nos va a tocar hacer. La montamos en la unidad virtual del Daemon Tools, ejecutamos el SSF y obtenemos nuestro primer programa ejecutándose:
No es tan impresionante como los ejemplos que hemos visto antes y que venían con el Lua Player, pero lo hemos hecho nosotros y el código es corto y medio entendible a simple vista para newbies.
Repasemos el código de nuevo, esta vez con anotaciones digamos "para tontos", para que se comprenda mejor qué estamos haciendo con cada comando:
slInitSystem(TV_720x576,NULL,1) -- pone el modo de video
local sega = 20 -- define la variable local sega y le asigna un valor de 20
slPrint("www.segasaturno.com", 11, 3) -- escribe en pantalla este mensaje en la linea 3 y tras 11 espacios
slPrint("Esto es una primera prueba", 5, 6) -- escribe en pantalla este mensaje en la linea 6 y tras 5 espacios
slPrint("El valor de la variable es", 5, 7) -- escribe en pantalla este mensaje en la línea 7 y tras 5 espacios
slPrint(sega, 32, 7) -- escribe en pantalla el valor de la variable sega que hemos definido al comienzo en la línea 7 tras 32 espacios para que quede justo después de la frase de antes
slPrint("Saturn Lua Player", 11, 9) -- escribe en pantalla este mensaje en la línea 9 y tras 11 espacios para finalizar
while true do slSynch() end -- lo mete en bucle creo algo así como mientras que sea cierto haz esto hasta el infinito
local sega = 20 -- define la variable local sega y le asigna un valor de 20
slPrint("www.segasaturno.com", 11, 3) -- escribe en pantalla este mensaje en la linea 3 y tras 11 espacios
slPrint("Esto es una primera prueba", 5, 6) -- escribe en pantalla este mensaje en la linea 6 y tras 5 espacios
slPrint("El valor de la variable es", 5, 7) -- escribe en pantalla este mensaje en la línea 7 y tras 5 espacios
slPrint(sega, 32, 7) -- escribe en pantalla el valor de la variable sega que hemos definido al comienzo en la línea 7 tras 32 espacios para que quede justo después de la frase de antes
slPrint("Saturn Lua Player", 11, 9) -- escribe en pantalla este mensaje en la línea 9 y tras 11 espacios para finalizar
while true do slSynch() end -- lo mete en bucle creo algo así como mientras que sea cierto haz esto hasta el infinito
Ahora sí que queda bastante más claro, ¿verdad?
Con la tontería hemos aprendido algo más sin darnos casi cuenta, si escribimos -- detrás de cada orden podemos poner un comentario para identificar qué hace ese comando y escribir nuestra anotaciones personalizadas.
Probadlo si quereis, cambiar el código por el que os he puesto con comentarios (o cread comentarios propios para testearlo), recread la iso de nuevo y montadla en el Daemon y vereis que sigue funcionando igual en el emulador. Eso quiere decir que todo lo que pongamos detrás de -- lo interpreta como un comentario y no da error ni se lia con ese texto. Esto creo que se denomina REMARK o algo asi, en BASIC me parece que se hacía con REM. Parece una gilipollez pero viene muy bien anotarse cosas, sobre todo cuando nuestros códigos comiencen a complicarse y convertirse en galimatías que hasta a nosotros nos costará entender.
LUA y SEGA
Mirando de nuevo nuestro código tan sencillo llego a otra conclusión. Si os fijáis parece que hay órdenes que son del lenguaje Lua y otras que son de la librerías de SEGA.
Por ejemplo:
Citar:
Esto lo he sacado de algun sample de documentación de Lua de cómo definir el valor de una variable local y ha funcionado. O sea yo interpreto que esto es Lua.
Sin embargo, otra orden como esta:
Citar:
Esto es Sega Library. No os saldrá nada así en la documentación de Lua, los print en Lua son directamente print y lo he probado y no parece funcionar. Así que tenemos que usar este print particular para que escriba en pantalla, este print es de las librerías gráfica de Sega con casi toda seguridad, si os fijais empieza por "sl" (sega library) lo que le delata.
Así que llego a la conclusión de que habrá que trabajar unos temas como pueden ser variables, procesos, rutinas y demás programándolos con Lua, pero para otras cosas particulares tendremos que "hablarle" a la Saturn en su lenguaje con las librerías de Sega para que nos haga caso.
Creo entender pues que con el Saturn Orbit sucede algo similar pero con el lenguaje C. Aquí es con Lua, que en principio es más sencillo.
¿Y ahora qué hago?
Pues eso mismo me pregunto yo. Sería cuestión de investigar y hacer cosas más complicadas. Estas historias suelen ser al principio todo basado casi en la prueba y el error (os cansaréis de cambiar código, regenerar la iso, montarla en el daemon y rularla de nuevo en el emulador).
Una buena idea quizás para inspirarse un poco sería echarle un ojo a la documentación sobre Lua que incluye este Player, está en la carpeta docs\Lua
Tenemos el manual de programación y luego el de referencia en dos pdfs bien majos. Ahí en docs también tenemos las carpetas SBL y SGL con pdfs oficiales (SEGA Confidential, lol!) y varios textos que nos pueden ayudar y mucho.
Añado yo además en clave SEGA este manual que puede ser muy interesante y no está incluido en la documentación del Lua Player. Se trata del Manual de referencia del desarrollador, donde estan creo que todas las funciones (los comandos sl que hablábamos antes) listados y explicados cómo funcionan, así como estructuras, apéndices y demás. Me parece que puede venir muy bien, la verdad.
Junto a esto y los ejemplos que vienen podemos tratar de descifrar cómo diablos hacen las cosas. Objetos en 3D, uso de sprites, como se cargan texturas, reproducir audio... se me ocurren muchas cuestiones... Supongo que hay que ir paso a paso y armarse de paciencia.
No creo que nadie del foro se anime a hacer nada, sinceramente. Ni siquiera tengo demasiada fe en que nadie haya leido todo este tutorial al completo , solo lo pongo para documentar un poco el Lua Player de Rockin'-B que por lo que veo estaba muy huerfano de este tipo de cosas en todo internet y me da un poco de pena, si soy sincero.
Con este entorno Rockin'-B y otro colaborador suyo estaban programando la videoaventura Police Officer Smith que quizás recordaréis. En teoría se podrían llegar a hacer homebrew bastante ambiciosos...
En fin, espero que os haya gustado el tutorial y alguno se anime a hacer sus pinitos. También espero que amigos como Indiket, FacundoARG, vbt y demás compañeros que pasan por aquí y saben de programación igual les pique el gusanillo, o puedan echarnos un cable si surgiera alguna duda probando otras cosas.
Un saludo y pongo deberes para mi o para quien se atreva a ver si se pueden llegar a hacer.
DEBERES:
Pintar texto con diferentes colores en pantalla
Pintar un sprite en pantalla, no solo letras!
BONUS:
Existe Lua Player para PSP. Creo que igual la idea surgió de aquí para llevarlo a Saturn. ¿Se podrían portar homebrew sencillos como estos a Saturn gracias al estar los dos en Lua?:
http://bugz.luaplayer.org/gallery/index.html
(creo que va a ser que no )
Enlaces de interés:
Web oficial de Lua: http://www.lua.org/
Manual en castellano (es 5.1 pero creo que servirá): http://www.lua.org/manual/5.1/es/manual.html
Lua Users: http://lua-users.org/
Documentación dev Saturn: http://koti.kapsi.fi/~antime/sega/docs.html
Más de dev en SegaXtreme (foro donde normalmente hablan de Orbit, pero nos puede servir para Lua Player por el tema de las librerías de SEGA): http://segaxtreme.net/forum/forumdisplay.php?fid=34