Joder, ya me estáis metiendo en fregados...
Sexy MotherFucker escribió:@wwwendigo @gasega68k @magno , os invoco a este hilo para despejar algunas dudas y enterrar ciertos retro-mitos aprovechando que sois personas con experiencia y conocimiento sobre estos dos procesadores, ya que el seguir repitiendo dogmas fanboys desde la ignorancia no nos hace ningún bien a ciertas edades, ni al foro en general.
He querido debatir este tema en un hilo aparte para alejarnos del tóxico contexto SNES vs MD, dejando a un lado el ambiente de «patio de colegio», y estudiar a estos procesadores desde un punto de vista genérico como micros dentro del contexto de la época en que eran usados masivamente por muchos dispositivos. A vosotros os pido ante todo
HONESTIDAD, y que no os dejéis llevar por animadversiones o preferencias personales.
Si bien he leído mucho sobre ambos chips, y debatido por épocas en foros de retroinformática, no voy a extenderme mucho; simplemente enumeraré las afirmaciones que desde mi (aún) básico conocimiento entiendo que son indiscutibles, y a partir de ahí vosotros expandís, corregís, o respondéis en la medida de lo que queráis/podáis.
Vamos al lío.
Venga, mi opinión será sincera por lo que he visto de ambas cpus.
MOTOROLA-68.000:Ventajas- Lenguaje Ensamblador amigable. Todos los programadores con los que he hablado del M68k, entre ellos David Senabre Albujer (creador de los reportajes «
La Carrera de los Bit y los Mhz») me han acabado diciendo lo mismo; el ensamblador del 68000 es muy cómodo, fiable, y
relativamente fácil de pulir código a bajo nivel en comparación a otros más complicados, hubo un tipo en un foro anglosajón que lo describió como; «un buen lugar en el que estar a la hora de programar».
- No penaliza demasiado en C, por lo que se consiguen resultados aceptablemente óptimos con este lenguaje.
- Tiene un juego de instrucciones muy completo teniendo en cuenta su antiguedad, lo que lo hacía versátil y cómodo, además de ser compatible con sistemas operativos más modernos como Linux.
- Tiene un bus externo de 16 bits, lo cual hace que pueda llevar desde una memoria hasta la cpu valores de 16 bits con los que operar en un solo viaje. Entiendo que también lo vuelve más práctico a la hora de acoplarse a placas de la época.
- Sus registros de 32 bits son útiles para... ¿Cargas de trabajo muy pesadas?
- Las operaciones de punto fijo la hacen apta para optener resultados decentes en materia poligonal a una buena frecuencia, mismamente me parece loable lo que consiguió Gasega en su demo de StarFox usando un M68k a unos irrisorios 7,67 Mhz. Ya a 16 mhz, el ordenador Sharp X-68.000 consigue esto en videojuegos como Geograph Seal:
https://youtu.be/pNYLREOG52kAhí ya vemos colisiones, una velocidad de movimiento notable, cierta IA enemiga, y físicas; aunque ni idea de hasta qué punto tiene que ver el rendimiento vectorial con el sistema gráfico del Sharp.
Contesto punto a punto:
1.- Más que el lenguaje ensamblador amigable lo que tiene es una arquitectura amigable para programarla en ensamblador, que no es lo mismo. Es una cpu con un número de registros, un conjunto de instrucciones y una ortogonalidad en las instrucciones que no era para nada típico en los CISC, por lo que era fácil aprender dado que no te exigía aprender que tal operación usaba como acumulador tal registro porque sí, y una variante estaba penalizada si usabas otros registros diferentes a X, etc. Tenía 16 registros generales y 16 registros para direccionamiento, lo cual lo hacía más flexible, y de aquí parte la respuesta al segundo punto:
2.- No hacía falta compiladores C sofisticados para obtener buenos resultados dada la riqueza de registros y ortogonalidad de la cpu.
3.- El bus de 16 bits era típico en cpus de la época, no era una "feature" especial, de hecho si no me equivoco había un 68000 que se montaba en un bus de 8 bits para datos (¿el 68008?), tiene que ver más con el tema de ahorro de costes y "normalmente" no influía negativamente en el rendimiento (por ejemplo, la comparación del 8086 contra el 8088, normalmente iban igual en casi todo tipo de escenarios, ojo, casi pero no todos).
4.- Los registros de 32 bits están ahí para dar soporte a las instrucciones de 32 bits. Es una arquitectura que estaba pensada desde cero para saltar a los 32 bits (de hecho técnicamente ya estaba ahí desde el primer día), eso sí el coste es que rinda más o menos la mitad de lo que rinde en 16 bits, y gracias. No están ahí para juegos precisamente, este tipo de registros son útiles para programas de corte más profesional, es bueno tenerlos desde el punto del desarrollo de aplicaciones avanzadas, pero en casos particulares y más en juegos no sirven para nada (por lo menos no aún en esa época).
5.- Sí y no. Hay formas de hacer render 3D sin usar punto fijo y usando enteros, pero entiendo que al usar punto fijo es más fácil y directo. De todas formas decir que el punto fijo es la coma flotante de los pobres, realmente no es muy preciso y hasta se puede sufrir una cierta pérdida de precisión por reducir la densidad informativa del tipo de dato (muchas veces se combina el uso de BCD con el formato de punto fijo, y ahí se pierde precisión extra y limita el rango de valores posibles).
Pero sin duda para máquinas de por sí limitadas es una ventaja para estas labores. Otro asunto es que la potencia pura y dura no sea muy para allá para al final usar 3D con estos procesadores.
Si además hablamos de consolas metemos en la ecuación el pedazo de embrollo de usar un sistema de sprites para mostrar la pantalla, lo cual complica y mete carga extra a la cpu con conversiones de bitmap a sprites. En ese sentido si quieres máquinas basadas en el 68000 para ver juegos en 3D, mejor te vas al Amiga o al AtariST.
DESVENTAJAS
- Sufre de una latencia horrible, es unànime donde trate de informarme. Tarda hasta 4 ciclos externos (32 mhz) en operar externamente; ¿Esto es así con cualquier tipo de memorias o bus externo? Internamente también he leído que necesita muchos ciclos para ejecutar multiplicaciones y divisiones, mismamente Fonzie (programador de Paprium) dijo en una entrevista que el 68.000 que monta la Megadrive era extremadamente lento (7,67 Mhz) para aprovechar esas instrucciones pragmáticamente, concretamente dijo; «olvidaos de utilizar la multiplicación mejor». ¿Estáis de acuerdo con él, consideráis que en un M68k a tan baja frecuencia no es conveniente usar m/d? ¿A qué velocidad creéis que debe estar clockeado para que esas instrucciones se ejecuten con la ligereza y solvencia adecuadas? ¿Qué se supone que puede hacer una MD con multis/divs; scaling, rotaciones por software, qué? Tened presente que Fonzie programa principalmente en C, aunque toca el ASM cuando lo ve conveniente.
Tarda un mínimo de 4 ciclos de reloj en hacer una simple suma entre dos registros de enteros, y a partir de ahí sube la cuenta en número de ciclos necesarios. Las operaciones de mul y div son increíblemente lentas ya que se van a cientos de ciclos de reloj para ejecutarlas. NO son usables por tanto para nada que exiga algo de potencia de mul o div (las divisiones de todas formas siempre se han evitado, incluso hoy en día no son recomendables usarlas demasiado, pero no hay punto de comparación entre antes y ahora).
Yo NUNCA usaría ambas, más que nada porque la cpu es de una frecuencia bastante modesta y básicamente tiene un multiplicador muy básico para ahorrar transistores (ya habían gastado muchísimos transistores para el resto del diseño, e incorporar un multiplicador sofisticado en la cpu disparaba aún más la cuenta, así que metieron un multiplicador muy básico de muy pocos bits por pasada que necesitaba a su vez hacer muuchas pasadas, o sea, NO lo uses si no lo necesitas o hay otro camino).
A ver, para documentar un poco el tema:
http://oldwww.nvg.ntnu.no/amiga/MC680x0 ... ndard.HTMLPues ya se ven los tiempos necesarios. unos 150 ciclos para una división y 70 ciclos para una multiplicación. Los tiempos mínimos para la multiplicación comienzan en casi 40 ciclos, si tienes suerte, demasiado lentas.
Para comparar la cpu SA1 basada en el 65c816 necesita entre 5 y 6 ciclos para ambas instrucciones, mucho más rápida en este caso (el SA1 es un "SoC" en cierto aspecto, e incluía una unidad especializada para realizar esto, por cierto SE SUPONE que con la SNES se puede usar los SPPU para realizar estas operaciones, y además con baja latencia, lo que pasa es que no es una característica muy documentada y evidentemente debe ser complejo tener que usar el procesador gráfico para que te machaque multiplicaciones mientras haces otras cosas
![carcajada [carcajad]](/images/smilies/nuevos/risa_ani2.gif)
).
Está claro que la multiplicación y división están para dar soporte a programas avanzados que la necesiten para cálculos esporádicos, pero no para usar de forma masiva.
- Por lo visto es un poco rígida para las microinterrupciones y no sé qué más. Tengo entendido que 68010 se lanzó para subsanar parcialmente algunas de estas taras, consiguiendo un 10% más de rendimiento que su predecesor a la misma frecuencia.
Pregunta; ¿Por qué en vuestra opinión fué el procesador de 16 bits más célebre, popular, y utilizado?
- Lo eligieron ATARI, AMIGA, o SHARP, para montar sus ordenadores personales de 16 bits. Y APPLE creo recordar que también lo incluyó en algún modelo.
- SEGA los incluyó en todas sus recreativas de 16 bits (hasta 2 y 3 micros para las especializadas en scaling), también en la placas de 32 bits como la STV, y en sistemas domésticos como la Megadrive, el Mega CD, o la propia Saturn.
- SNK y CAPCOM coronaron sus placas de 16 bits más potentes con Motorolas a diversas frecuencias; amén de muchas otras compañías para construirse sus propios custom en arcades.
¿Hubos más usos destacables del procesador fuera de los videojuegos y la informática?
Fuera de lo de las microinterrupciones, que no lo sé, fue elegido por su juego de instrucciones y registros, y porque seguía el diseño de lo que se soñaba a finales de los 70 de: "A mainframe on a chip". Motorola tenía ya prestigio por su 6800 (con el que no tenía NADA en común, de hecho la cpu de la SNES sí lo tiene

), porque permitía en sistemas de 16 bits acceder a las ventajas del soft de 32 bits si era necesario, y.... como si fuera esto poco para elegirlo. Con chapuzas como el 8086 campando y reinando, lo raro sería que no hubiera triunfado y más viniendo de la mano de motorola.
Ricoh 65816
Ventajas
- Tiene una latencia extremadamente baja, ya que sólo necesita 1 ciclo de espera (8 Mhz) para poder operar externamente, e igualmente necesita muy pocos ciclos para ejecutar eficientemente su reducido set de instrucciones.
- Por lo visto es muy flexible y rápida realizando microinterrupciones.
- Opera con instruciones de 8 bits muy eficientemente.
No conozco más ventajas.
Latencias de ejecución de instrucciones MUY baja, es normal que sólo necesite 2-3 ciclos de reloj para terminar ciertas instrucciones básicas mientras otras cpus se iban al doble o más allá (CISC).
Es consecuencia de su diseño "hardwired" contra microcódigo, NO tiene ni un sólo opcode que vaya contra microcódigo, todas y cada una de las instrucciones que puede ejecutar están codificadas directamente en el hard y se ejecutan sin necesidad de realizar varias operaciones comandadas por un "miniprograma" (por llamarlo de alguna forma) que sería el microcódigo usado para ejecutar muchas instrucciones en otras cpus CISC (el 68000 mismamente).
Por eso también tiene muchos menos transistores, por no depender de microcódigo y limitarse a instrucciones necesarias y no dar soporte a instrucciones complementarias que se pueden realizar por el programador con las otras más simples.
Página cero. Una zona de memoria especial con poca penalización para usar instrucciones directamente contra memoria (+1 de latencia contra usar sólo registros). Se puede ver como una ventana enorme de registros (cientos), por lo que lo precario que es el procesador a primera vista (sólo un registro acumulador) cambia radicalmente cuando miras la página directa / cero del mismo. Desde el 6800 hasta esta cpu han seguido un diseño de trabajo directo contra memoria en vez de registros que es lo que diferencia radicalmente a esta cpu de la de motorola, y desde el 6800 pasando por el 6502 y pasando por esta cpu han seguido la misma filosofía de crear cpus que funcionan "síncronas" con la memoria (entonces era normal que la memoria fuera igual o más rápida que las cpus) y que usaran esta sincronía para acceder muy rápido a ésta y usando esta área especial de memoria como "registros" totalmente reprogramables (ya que es un área de datos que tú usas como datos que a ti te apetezca definir, char, int o struct, etc).
Si no se sabe o entiende bien cómo usar la página cero estás tirando a la basura el rendimiento de esta cpu, está pensada para usarla y es un cambio radical respecto a 68000 o incluso x86.
Muy bajo consumo, por su diseño hardwired, y facilidad de integración por varias razones (frecuencia, modo de funcionamiento contra memoria, etc).
Desventajas
- Tiene un bus de 8 bits, lo cual limita su rendimiento potencial a la mitad cuando tiene que llevar valores de 16 bits con los que operar, ya que tiene que leer dos veces la memoria.
- Poco rendimiento bajo C.
- Está capado de instrucciones.
No conozco más desventajas
Pregunta; ¿Por qué el micro de 16 bits menos empleado y más vilipendiado de su generación?
El bus de 8 bits limita según qué programa, el hecho de que esta cpu saliera con él y sin implementación especial para usar bus de 16 bits apunta a que no era muy necesario, por lo menos no con la mayoría de programas usados. Ya te digo que había otros antecedentes incluso con variantes del 68000. Su rendimiento no se reduce a la mitad por usar datos de 16 bits, ya que realmente sólo se añade un ciclo de reloj como máximo extra para cargar el dato, y en realidad esta cpu es especialmente rápida accediendo a memoria y sobre todo a la página cero. Si puede realizar en paralelo la carga de un dato mientras procesa una instrucción anterior aún menos (no lo sé, pero el 68000 tiene algo parecido, aunque le viene bien dado que ésta tarda más ciclos en acceder a memoria

).
Las instrucciones no están capadas, es que no usa microcódigo, todas las instrucciones implementadas están de una forma que se intenta optimizar al máximo con la circuitería necesaria, no hay secuencias de operaciones comandadas por instrucciones que vayan por microcódigo. Es un diseño que pretende una cpu de 16 bits lo más rápida posible con los mínimos transistores posibles y prescindiendo de todo aquello que no sea estrictamente necesario. Sí, puede recordar a la filosofía RISC, pero NO es RISC.
Sobre lo de C, depende todo del compilador. La cpu tiene sus peculiaridades como su único registro acumulador y en general no demasiados registros para otras cosas (pero ahí era más "normal que con los registros generalistas al mirar a otras cpus de 16 bits), y un buen compilador debería de ser capaz de generar código bueno con esta cpu si tiene en cuenta cosas como la página directa. Pero si no tiene en cuenta estas cosas evidentemente puede dar mal código, en principio C no es tan distinto del ensamblador una vez te fijes un poco en cómo funciona el lenguaje, cómo se llama a las funciones en realidad, cómo funciona la pila, etc. Así que no es un problema muy real, lo que sí podía ser es que hubiera malos compiladores C en esa época para esta cpu. Un mal compilador o directamente uno muy básico y genérico haría peor trabajo con el 65c816 que con el 68000, que era más fácil de aprovechar por su abundancia de registros.
También si un compilador tenía un código de mierda para implementar instrucciones como mul, pues penalizaría de forma extra. La mayoría de operaciones en C tenían una correspondiente en ensamblador del 65c816, pero en caso de usar operadores como el de multiplicación evidentemente en este caso tenía que generar una secuencia de instrucciones muy larga para simular la multiplicación. Si no estaba optimizada podía dar peores resultados que picando el código directamente en ensamblador, y aún mucho peor que usando la implementación pobre pero existente de mul del 68000. De hecho esta cpu era bastante buena con operadores de bits así que en realidad con un compilador C medio decente debería ser bastante buena (eso no quiere decir que mejor que el 68000, sólo que el problema no está en la cpu).
Si alguien me dijera un lenguaje de programación de más alto nivel que C, pues aún lo entendería, pero es que casi puedes imaginar el código ensamblador que se genera de una función en C ahí te fijes, vamos. Al 68000 lo que sí que le ayuda es su gran número de registros de direcciones para esto, pero de todas formas, si x86 funcionaba bien con C teniendo la arquitectura que tenía..... pues eso. xD
¿Menos usado, vilipendiado? Fuera de los forofos de sega (y sólo porque lo usó nintendo, no nos engañemos) no fue precisamente vilipendiado. De hecho sigue habiendo foros de gente que le siguen dando caña ahora, ya sea para programar para Apple II u otra máquina.
Se usó en ordenadores tan populares como el ya mencionado Apple II, y muchos otros productos, después durante los 80 fue tomando un papel como microcontrolador gracias a su sencillez, pocos transistores necesarios y muy bajo consumo. Eso y que el tema de la página directa de memoria... qué cojones, es que parece que eso se adaptaba como anillo al dedo para microcontrodores.
Perdió popularidad antes que el 68000 porque era una cpu de 16 bits pura, no una mezcla de 16 y 32 bits, y porque no tuvo una serie de sucesores como sí tuvo el motorola explotando la capacidad de ampliación a 32 bits. Y porque era una cpu un poco "dura" de aprender en un inicio si venías de cpus CISC más normales que siempre acababan intentando mejorar ofreciendo más registros, más instrucciones, más de todo aunque fuera a costa del rendimiento.
Micros poco utilizados o vilipendiados son otros, el Z80000 a pesar de que técnicamente era muy notable, o incluso el Z8000 (que era buena cpu pero no se usó como se esperaba y más viniendo de una Zilog exitosa con el Z80).
Como balance final, el motorola es la cpu más flexible en general y más pensada para multitud de potenciales usos, en un tiempo donde las arquitecturas CISC tenían muchos peros según cuál mirases, introdujo una arquitectura bonita y elegante. No fue el único, Zilog lo hizo pero fracasó donde motorola triunfó, pero eso ya es otra historia.
Al final a pesar de toda la elegancia de su arquitectura acabó comiéndose los mocos, porque intel con su x86 poco a poco, limando un mal punto de partida, le fue superando primero en rendimiento y después en la elegancia de cómo evolucionaba su arquitectura, que "parche a parche" iba eliminando los problemas iniciales.
El 65c816 es una arquitectura de 16 bits elegante a su manera, centrada en el minimalismo y eficiencia, pero pensada para su momento y no para expandirse fácilmente. Principios de diseño como el uso directo de memoria contra el aumento de registros requerían cosas que eran normales en aquel entonces (accceso&latencia a memoria casi a la par de a registros) pero el tiempo demostraría que era algo sólo posible en ese momento, que se evolucionaría en otro sentido. De todas formas WDC ya apuntaba maneras hacia el mercado de microcontroladores, así que se puede decir que su diseño fue un éxito a largo plazo por ajustarse a este mercado también.