¿Cómo programaron para Nintendo 64?

Es una duda que siempre tengo, ¿cómo lo hacían?.

¿Ensamblador?
¿C?
¿Lenguaje propio?

He visto un vídeo en el que se pueden editar niveles del Mario 64, pero creo que el código fuente del juego no está puesto por ningún lado.

Códigos fuente de juegos he visto el del Quake II, Quake III (ambos en C y una conversión a Delphi del Quake II) y algunos Sonic de Mega Drive (en ensamblador del Motorola 68000).

Me gustaría ver algún fuente de Nintendo 64, ¿sabeis si hay?.

Gracias y saludos.
C + ensamblador de MIPS.

Saludos.
Gracias, como puedes ver me estoy interesando por el tema. Voy a ver si encuentr algo más de info y la posteo aquí.

Saludos.
playstation escribió:Gracias, como puedes ver me estoy interesando por el tema. Voy a ver si encuentr algo más de info y la posteo aquí.

Saludos.


Mira en Dextrose, ahí tienes todo lo que necesites.

Además, en el (ESTO ES ABANDONAWARE, NO PIRATERÍA) programa de P2P "eMule" puedes encontrar el ANTIGUO SDK de Nintendo 64 oficial, que ya NO tiene UTILIDAD.

GUIÑO, GUIÑO. Etc...

Saludos (especialmente a los moderadores ;)).
andoba escribió:C + ensamblador de MIPS.
Saludos.


¿¿?? ¿Qué se supone que es un ensamblador de MIPS? MIPS significa Mega/Million Instructions Per Second, con lo que eso que has dicho sería decir que hay un lenguaje que ensambla Kilómetros Por Hora....

La N64 se programaba con un kit de desarrollo propio que venía a escribirse en C; los programadores recibían de manos de Nintendo un kit con una placa de desarrollo, el manual de uso y las librerías de programación junto con una especie de entorno de desarrollo. Pero parece que ese kit era fallón, no generaba código muy depurado y encima no era todo lo potente que podría ser, y ése fue uno de los motivos por el que Squaresoft devolvió el kit que había recibido de Nintendo para que empezara a programar el motor del Final Fantasy VII (del que ya tenían hechos los modelos de escenarios y personajes) y parece que era muy complicado generar los efectos y gráficos querían con dicho kit.
Sé que en la última etapa de la N64 estaba disponible una nueva versión que no tenía nada que ver en cuanto a potencia gráfica y versatilidad con el primero que puso a disposición de los programadores.

¿¿No os habéis preguntado nunca por qué había tanta diferencia gráfica en los primeros juegos de N64 entre los que hacía Nintendo y los que hacían otras Third-Parties?? Es evidente que los que programaban en Nintendo, dominaban el hardware y podían hacer virguerías saltándose las librerías que ellos mismos ponían a disposición de los programadores de Third-Parties....
magno escribió:
¿¿?? ¿Qué se supone que es un ensamblador de MIPS? MIPS significa Mega/Million Instructions Per Second, con lo que eso que has dicho sería decir que hay un lenguaje que ensambla Kilómetros Por Hora....

La N64 se programaba con un kit de desarrollo propio que venía a escribirse en C; los programadores recibían de manos de Nintendo un kit con una placa de desarrollo, el manual de uso y las librerías de programación junto con una especie de entorno de desarrollo. Pero parece que ese kit era fallón, no generaba código muy depurado y encima no era todo lo potente que podría ser, y ése fue uno de los motivos por el que Squaresoft devolvió el kit que había recibido de Nintendo para que empezara a programar el motor del Final Fantasy VII (del que ya tenían hechos los modelos de escenarios y personajes) y parece que era muy complicado generar los efectos y gráficos querían con dicho kit.
Sé que en la última etapa de la N64 estaba disponible una nueva versión que no tenía nada que ver en cuanto a potencia gráfica y versatilidad con el primero que puso a disposición de los programadores.

¿¿No os habéis preguntado nunca por qué había tanta diferencia gráfica en los primeros juegos de N64 entre los que hacía Nintendo y los que hacían otras Third-Parties?? Es evidente que los que programaban en Nintendo, dominaban el hardware y podían hacer virguerías saltándose las librerías que ellos mismos ponían a disposición de los programadores de Third-Parties....


A la serie Silicon Graphics RXXXX también se le suele llamar MIPS.

Entonces C + ensamblador de SGI R4000, ¿ok?

El kit ese que dices es por qué era el de Silicon Graphics, y para hacer modelos en 2 horas bien, pero para hacer juegos que van a 60 FPS ya no tanto.

Por eso luego hicieron otros microcodes para el chip gráfico, por qué el de Nintendo para un juego no servía.
magno escribió:
¿¿?? ¿Qué se supone que es un ensamblador de MIPS? MIPS significa Mega/Million Instructions Per Second, con lo que eso que has dicho sería decir que hay un lenguaje que ensambla Kilómetros Por Hora....




Esto es un procesador MIPS

Imagen

Y por ahí se puede encontrar el manual de programación para ensamblador MIPS.

Que una palabraje signifique algo como Millones de Instrucciones por segundo, no quiere decir que no se utilice para denominar otras cosas, como estos dispositivos de 32/64 bits :P

Edito: Me se olvidaba decir que en este caso, MIPS es el acrónimo de Microprocessor without Interlocked Pipeline Stages, o lo que es lo mismo (más o menos), microprocesador sin fases intermedias con arquitectura de tubería (cosas de la segmentación y paralelismo en procesadores y demás xD)

Y voy más allá...si quieres hasta te pongo un ejemplo de programa en este ensamblador, con su codificación en hex, su traducción a mnemónicos y unas líneas de comentario:

MIPS R4000 escribió:INICIO:

90030F00 LBU R3,0E00h(R0) ;SE SACA EL NUMERO DE DATOS A PROCESAR

240A0000 ADDIU R10,R0,0000h ;SE PONE EL CONTADOR DE LAS TABLAS A 0
24040000 ADDIU R4,R0,0000h ;SE PONE EL CONTEO DE LA TABLA A A 0
24050000 ADDIU R5,R0,0000h ;SE PONE EL CONTEO DE LA TABLA B A 0
24060001 ADDIU R6,R0,0001h ;R6 A 1, QUE VA A SER NUESTRO 1 PARA COMPARAR
24070010 ADDIU R7,R0,0010h ;R7 A 10h (16) QUE VA A SERVIR DE REFERENCIA PARA ROTAR
24090000 ADDIU R9,R0,0000h ;SE PONE EL INDICE DEL BUCLE PRINCIPAL A 0
240C0000 ADDIU R12,R0,0000h ;SE PONE A 0 EL CONTADOR DE LA TABLA R

BUCLE:

95410A00 LHU R1,0A00(R10) ;SE SACA EL DATO DE LA TABLA A
95420C00 LHU R2,0C00(R10) ;SE SACA EL DATO DE LA TABLA B
24040000 ADDIU R4,R0,0000h ;SE PONE EL CONTEO DE LA TABLA A A 0
24050000 ADDIU R5,R0,0000h ;SE PONE EL CONTEO DE LA TABLA B A 0
00074021 ADDU R8,R0,R7 ;SE PONE EL INDICE DE LOS BUCLES DE ROTACION A 10h(16)

BUCLEROTAA:

00265824 AND R11,R1,R6 ;SE HACE LA AND ENTRE EL DATO Y EL 1 PARA SACAR EL PRIMER BIT
008B2021 ADDU R4,R4,R11 ;Y SE SUMA AL CONTEO DE LA TABLA A
00010842 SRL R1,R1,0001h ;SE ROTA EL DATO DE LA TABLA A A LA DERECHA
01064023 SUBU R8,R8,R6 ;SE DECREMENTA EL INDICE DEL BUCLEROTAA
1500FFFB BEQ R8,R0,BUCLEROTAA;SI R8(INDICE) ES 0 SALE DEL BUCLE, SI NO RETROCEDE FFFB

24E80000 ADDIU R8,R7,0000h ;SE VUELVE A PONER EL INDICE A 10h(16)

BUCLEROTAB:

00465824 AND R11,R2,R6 ;MISMAS OPERACIONES QUE EN EL BUCLE ANTERIOR
00AB2821 ADDU R5,R5,R11
00021042 SRL R2,R2,0001h
01064023 SUBU R8,R8,R6
1500FFFB BEQ R8,R0,BUCLEROTAB

00852022 SUB R4,R4,R5 ;SE RESTAN LOS CONTEOS Y SE ALMACENA EN R4
04830003 BGEZL R4,NUMPOSITIVO;SALTA SI EL NUMERO EN R4 ES POSITIVO
00000000 NOP

00042022 SUB R4,R0,R4 ;SI ES NEGATIVO, SE RESTA 0-NUMERO PARA OBTENER SU COMPLEMENTARIO
24840080 ADDIU R4,R4,0080h ;Y SE LE SUMA 0080h PARA PONER EL BIT DE SIGNO A 1 (NEGATIVO)

NUMPOSITIVO:

A1840E01 SB R4,0E01(R12) ;SE ALMACENA EL RESULTADO EN LA TABLA R

254A0002 ADDIU R10,R10,0002h ;SE AUMENTA EL CONTADOR DE TABLAS
258C0001 ADDIU R12,R12,0001h ;SE AUMENTA EL CONTADOR DE LA TABLA R
25290001 ADDIU R9,R9,0001h ;SE AUMENTA EL CONTADOR DEL BUCLE PRINCIPAL

1523FFE6 BNE R9,R3,BUCLE ;SI NO HA TERMINADO CON LOS DATOS VUELVE AL PRINCIPIO DEL BUCLE (FFE6)

END


Más informació...en wikipedia:

http://es.wikipedia.org/wiki/Arquitectura_MIPS


Ahí queda ;P
jebiman escribió:
Esto es un procesador MIPS

Imagen

Y por ahí se puede encontrar el manual de programación para ensamblador MIPS.

Que una palabraje signifique algo como Millones de Instrucciones por segundo, no quiere decir que no se utilice para denominar otras cosas, como estos dispositivos de 64 bits :P

Y voy más allá...si quieres hasta te pongo un ejemplo de programa en este ensamblador, con su codificación en hex, su traducción a mnemónicos y unas líneas de comentario:



Ahí queda ;P


magno: Imagen Ves, ves XD
Sí, sí, veo, veo..... veo cómo os habéis colado los dos XD

MIPS es una denominación como la de CISC o RISC, NO UN MICROPROCESADOR, NI TAMPOCO UN TIPO DE ENSAMBLADOR ESPECIAL [flipa]

A ver si después de 7 años trabajando con ellos primero a nivel académico y luego como profesional, más la cantidad de cosas que he programado para SNES, resulta que no sé nada de microprocesadores..... [fumando]

Y por cierto, ese ensamblador que ha puesto ahí jebiman podría ser de cualquier micro.... Es más, es casi IDÉNTICO al de un Picoblaze que es el que estoy usando en estos momentos en el trabajo....... Y no, no es un MIPS, ni RISC, ni CISC, ya que ni tan siquiera cumple la arquitectura Harvard.....

Lo que sí es cierto es lo que dijo anadoba, que las primeras estaciones Silicon Grapchis llevaban unos micros a los que se denominó MIPS, pero eso eso no quiere decir que se programara en ensamblador para MIPS, porque precisamente las librerías que proporcionaba Nintendo eran eso, código ensamblador optimizado (como casi todas las librerías para sistemas embebidos). Además, no tiene sentido que eso fuera así porque el MIPS era el micro de la estación de modelado NO DE LA NINTENDO 64. Y sigo añadiendo "peros" y es que los modelos gráficos no se tenían por qué hacer en una estación Silicon Graphics, aunque en Nintendo lo hacían por ese acuerdo al que llegaron con ella, porque RAREWare las usaba, porque se basaron en esa arquitectua para hacer la N64, etc....

Así que jebiman, como ves yo también sé ser un quedón, pero sin recurrir a la wikipedia....
magno escribió:Sí, sí, veo, veo..... veo cómo os habéis colado los dos XD

MIPS es una denominación como la de CISC o RISC, NO UN MICROPROCESADOR, NI TAMPOCO UN TIPO DE ENSAMBLADOR ESPECIAL [flipa]

A ver si después de 7 años trabajando con ellos primero a nivel académico y luego como profesional, más la cantidad de cosas que he programado para SNES, resulta que no sé nada de microprocesadores..... [fumando]

Y por cierto, ese ensamblador que ha puesto ahí jebiman podría ser de cualquier micro.... Es más, es casi IDÉNTICO al de un Picoblaze que es el que estoy usando en estos momentos en el trabajo....... Y no, no es un MIPS, ni RISC, ni CISC, ya que ni tan siquiera cumple la arquitectura Harvard.....

Lo que sí es cierto es lo que dijo anadoba, que las primeras estaciones Silicon Grapchis llevaban unos micros a los que se denominó MIPS, pero eso eso no quiere decir que se programara en ensamblador para MIPS, porque precisamente las librerías que proporcionaba Nintendo eran eso, código ensamblador optimizado (como casi todas las librerías para sistemas embebidos). Además, no tiene sentido que eso fuera así porque el MIPS era el micro de la estación de modelado NO DE LA NINTENDO 64. Y sigo añadiendo "peros" y es que los modelos gráficos no se tenían por qué hacer en una estación Silicon Graphics, aunque en Nintendo lo hacían por ese acuerdo al que llegaron con ella, porque RAREWare las usaba, porque se basaron en esa arquitectua para hacer la N64, etc....

Así que jebiman, como ves yo también sé ser un quedón, pero sin recurrir a la wikipedia....


Pos fale tío...xD. Ya veo como tienes que tener la razón, simplemente he recurrido a la wikipedia porque viene información a nivel básico sobre el tema, pero amos, como lo sabes todo, pos ala [beer]...

Yo paso [Ooooo]
¿Que no existen los procesadores MIPS? ¿Entonces qué es esto? ¿Una empresa fantasma? XD

http://www.mips.com/
r09 escribió:¿Que no existen los procesadores MIPS? ¿Entonces qué es esto? ¿Una empresa fantasma? XD

http://www.mips.com/


No, lo que dice magno no es que no existan, sino que simplemente es una denominación...como CISC o RISC...aunque un procesador denominado MIPS es un RISC, y no tenga nada que ver una cosa con la otra, pero bueno, y en parte tb tiene razón, es una forma de denominar un tipo concreto de arquitectura dentro de los microprocesadores de arquitectura RISC, igual que existen otras arquitecturas como el 8086 o x86, y tienen su forma de ensamblar concreta....

Todo es relativo desde su punto de vista, pero como él tiene razón, yo ya me callo [pos eso]
jebiman escribió:
No, lo que dice magno no es que no existan, sino que simplemente es una denominación...como CISC o RISC...aunque un procesador denominado MIPS es un RISC, y no tenga nada que ver una cosa con la otra, pero bueno, y en parte tb tiene razón, es una forma de denominar un tipo concreto de arquitectura dentro de los microprocesadores de arquitectura RISC, igual que existen otras arquitecturas como el 8086 o x86, y tienen su forma de ensamblar concreta....

Todo es relativo desde su punto de vista, pero como él tiene razón, yo ya me callo [pos eso]



Yo no he dicho que tenga razón, he dicho que yo también sé ir de quedón como tú has hecho, porque tu primer post del hilo no ha sido precisamente un intento de corrección, sino de vacilar con información que has sacado de la wikipedia como podía haber hecho cualquier otra persona. Y simplemente frases como Y voy más allá...si quieres hasta te pongo un ejemplo de programa en este ensamblador, con su codificación en hex, su traducción a mnemónicos y unas líneas de comentario ó Ahí queda ;P son de chulito, no de intentar hacer una explicación útil. Es más, no sé tan siquiera a qué venía ese trozo de ensamblador ahí de pegote que no explica nada de nada. Por cierto que esa pataleta rabiosa de ir intentando hacer ver erróneamente que los demás quieren tener razón a toda costa, es un poco pueril, ¿no crees? Mejor no defenderse con esos ataques absurdos e intentar no ser tan chulito en las respuestas, porque te puedes encontrar a alguien que sí que sepa del tema y te deje en evidencia.


Y bueno, r09, parece que has entendido lo que has querido, porque NADIE ha dicho en ningún momento que no existan esos microprocesadores..... Y esa empresa es la que proporciona CORES, CORES, no microprocesadores en sí mismos. El Picoblaze que yo comentaba antes es un core y los ARM y un largo etcétera. No existe un microprocesador MIPS, existe un microprocesador RISC con nucleo MIPS que se llame Sextium VI, por ejemplo...
Pero esos cores pertenecen a una arquitectura con un juego de instrucciones propio, que es lo que se estaba diciendo en este hilo.

Saludos.
r09 escribió:Pero esos cores pertenecen a una arquitectura con un juego de instrucciones propio, que es lo que se estaba diciendo en este hilo.

Saludos.



Pues no, no se estaba diciendo eso :D Realmente lo que se decía es que se programaba en la N64 con ensamblador de MIPS y eso no es cierto, por muchas razones, aunque estaría bien que si alguien lo supiera 100% lo dijera. Yo ya os digo que mis fuentes son de la Revista Nintendo Acción, así que igual no es del todo fiable (sobre todo porque en aquellas revistas cambiaban las cosas de número a número).

Por otro lado, los juegos de instrucciones JAMÁS van ligados a las arquitecturas sino a los microprocesadores. Por poner varios ejemplos, la arquitectura x86 ha tenido diferentes juegos de instrucciones e incluso procesadores equivalentes como el Athlon XP y el Pentium IV no comparten el mismo juego; otro ejemplo, el procesador 65C186 es un RISC, que tiene un juego de instrucciones totalmente diferente a cualquier otro RISC que yo he visto (Alpha, ARM...). El MC68000 es un procesador CISC que tiene un juego de instrucciones TOTALMENTE diferente a un x86 (Pentium, Athlon...). Lo único que cambia entre unas arquitecturas y otras son la cantidad de instrucciones y lo que llegan a ejecutar cada una dentro del micro, de modo que los RISC tienen menos instrucciones y menos potentes (hacen menos cosas) pero se ejecutan mucho más rápido en el cauce.
Resumiendo, que tú no puedes ver un puñado de instruccuiones y determinar directamente si el micro es RISC, CISC, MIPS o lo que sea.

Un ejemplo para ilustrar esto es que yo he trabajado con la arquitectura ARM32, que era un core que simplemente arrastrábamos sobre el ASIC, y al que añadíamos nuevas funcionalidades, por lo que el juego de instrucciones en realidad se ampliaba y no era el mismo que otro ARM. Desde el exterior se veían unas instrucciones pero internamente éstas se ejecutaban al estilo de microcódigo por el ARM32. El micro realmente era un ARM (como podría haber sido un MIPS si hubiéramos comprado ese core a la empresa correspondiente) pero no tenía el juego de instrucciones de un ARM porque sólo usábamos el core para lo que necesitábamos, no para ser el núcleo del micro.
Otro ejemplo son los decoders de MPEG-2 para los DVDs y demás, que se pueden basar en un MIPS, pero le añaden una instrucción más para calcular diferencias entre píxeles o hacer la transformada DCT a modo de instrucción.
Illo, magno, te estás llendo mucho por las ramas diciendo que si voy de chulo y polladas del estilo...

Creo que yo no he ido de listo en ningún momento, y si sabes mucho, no hagas comentarios del estilo del primer post que has dejado, diciendo que MIPS es millones de instrucciones por segundo y cosas así cuando sabes de qué se está hablando, porque así demuestras, que si sabes de esto, el primero que ha ido de chulo has sido tú.

Es como si llego yo a un hilo y digo..."FLOPS??? eso suena como FLIP FLAP FLOP huhuhuhuhu [fies] " en plan bobaino y luego resulta que dejo un post de la reostia explicando de donde viene la creación de las instrucciones en coma flotante (to ofuscao) y que la teoría de computación es asi o asá cuando te han contestado para decirte que no, que FLOPS es otra cosa...

En fin, que me parece muy bien que sepas más que yo porque trabajas con ello, pero el que está chuleando aquí a los demás eres tú.

Y ya, haya paz

La wikipedia está para recurrir a ella (y más por mi parte que paso de escribir rollos enormes explicando de todo), y el código pegao ahí...bueno, era para que se viera simplemente, si quieres dejo tb un manual para si hay interesados en aprender a codificar instrucciones para un simulador de R4000, pero ya lo veo innecesario, pues como has dicho, tampoco ha ayudado de mucho.

Salud!

PD: y no, no voy de quedón solo porque me haya ido a buscar a wikipedia como si no tubiera ni putas de el tema, si sé algo, aunque no sea a modo de experto o profesional, es porque en su día me lo tuve que empoyar como buen becario en la universidad. Y repito, que la wikipedia la uso de apoyo para quién le interese vaya a buscar información fácil y entendible.
jebiman escribió:En fin, que me parece muy bien que sepas más que yo porque trabajas con ello, pero el que está chuleando aquí a los demás eres tú.


Si yo fuera de listo o chulo como dices, hubiera metido ese rollo sobre los cores en mi primera respuesta para quedar como re-dios, pero no, eso no me mola, no es mi estilo.
Si he dicho lo de MegaInstructions Per Second ha sido porque es el error más común para los profanos del tema... Nunca me pude imaginar que andoba habría confundido los MIPS con un core de un micro que sólo se usa a nivel MUY profesional, ni que tampoco se estaba refiriendo a los micros de las estaciones Silicon Graphics porque éstas no tienen nada que ver con el micro de la N64. Lo más normal era pensar que lo había confundido con MegaInstructions Per Second, como alguna gente que conozco que en su momento decía que la Play tenía un procesador MIPS-30, confundiendo el modelo del micro R3000 con su capacidad.

Y no, no me voy por las ramas; tú eres el primero que has venido al post intentando adoctrinar a la gente con cierto tonito ácido que no me ha gustado. Pero claro, si a ti te responden de la misma forma que tú haces, parece que no te sienta muy bien... Pues así es como me he sentido yo con tu primera respuesta. :P

Ale, pos eso, haya paz y que alguien que sepa del tema vuelva a meter este hilo on-topic una vez resuelto este lío.
Chachi, pues el tono ácido ha salido sin querer, sólo quería dar información al respecto...corrigiendo un poco lo que has dicho sobre el micro en un principio, que como incorrección, he querido corregir del mejor modo posible, pero parece que no has admitido dicha corrección debido a la accidez de mi respuesta y dicha corrección ha llevado a otra cada vez corrigiendo más el tono hacia una accidez más grande que ni los limones corregidos con incorrecciones incorrectas. [qmparto]

Al final en qué quedamos? que el correcto o incorrecto que la Nintendo 64 se programe en C con código ensamblador embebido del tipo que sea me da ya iwal (el tipo xD)?

Sin más te pido disculpas, y punto pelota con el tema, que sino vamos a acabar queriendo ponernos todo el rato uno encima del otro, tanto por mi acidez, como por la tuya.

Fin del offtopic

Y salud!
Pos nada, disculpas aceptadas y acepta tú las mías por haberme sublevado ;)

En cuanto al on-topic, realmente pienso que no se programaba en ensamblador debido a la complejidad del subsistema gráfico, lo cual hace que se usaran llamadas a dichas librerías que sí estaban programadas en ensamblador (supongo...) ya que son las que proporcionaba Nintendo. No me imagino un programa en ensamblador que realice cálculos de coordenadas, prespectivas, Z-Buffer, texturas y demás que se incluya en un programa principal a pelo...

Por ejemplo, en la SNES sí se usaba un híbrido. En los juegos con los que yo he trabajado de la última etapa de la SNES, se pueden observar en el código ensamblador estructuras que parecen claramente generadas por un compilador C (pero esto es intuición, ya que al hacer hacking sólo se tiene disponible el código en ensamblador final generado por cualquiera herramienta que pudiera haberse usado originalmente) y cuando entras en la parte gráfica, las rutinas de texto por pantalla, o de fondos o de sprites sí parecen escritas en ensamblador. Pero claro, esto sí podía ser viable con una subsistema gráfico como el de la SNES o MEgadrive que eran "pasivos" (el procesador gráfico no calculaba, sino que simplemente generaba la imagen en base a unas configuraciones preestablecidas).

Si realmente se programara en ensamblador, se tendría que tener un absoluto dominio del hardware para poder sacarle partido, así que supongo que utilizarían unas librerías muy similares al OpenGL.

En cuanto al programa principal, motor del juego y demás, supongo que sí sería en C o algún derivado/sucedáneo. Nintendo siempre ha sido muy suya en estos temas por lo que dudo que usara un C estándar... Sólo por joder, vamos...
18 respuestas