Sexy MotherFucker escribió:Si me tengo el tema tan bien empollado es precisamente gracias a tus aportes mamón xDDD. Los devoro.
Me alegro
de que mis tochos le sirvan a alguien
Sexy MotherFucker escribió:Ya que sale el tema y nunca he acabado de entenderlo; ¿Es cierto que los 65816 tienen muy bajo rendimiento bajo C? Al menos es lo que se dice del WDC de SNES, mientras que del Motorola cualquier programador dice justo lo contrario, y por eso se tira muy a menudo de programación alto nivel en esos micros.
Eso depende del compilador, pero en general, los compiladores
de C se llevan mejor con micros con muchos registros como el 68000, x86, i64, Cortex, etc... Realmente la tendencia
de los micros siempre es a tener un banco
de registros
de uso general considerable, creo que eso hace tan especialito al 65C816, que tiene 3 y
de uso específico, no general.
Así a botepronto se me vienen varias limitaciones a la hora
de optimizar código en C si usaras el 65C816:
* Cada variable declarada tendría que estar en memoria: no se podrían optimizar variables locales asignándolas a registros internos para reducir el número
de accesos a memoria externa al tener sólo 3 registros.
* El acceso a arrays se podría hacer usando el registro X o Y dependiendo del tamaño del array, lo cual dificulta la optimización: si quieres acceder a arrays
de cualquier tamaño y en cualquier banco, has
de usar el registro Y, pero la ejecución
de esas instrucciones LDA.b [DP],y son muy lentas. Si quieres más velocidad, indexarías con el registro X pero con ciertas limitaciones (has
de cambiar el banco
de datos, y no puedes salirte
de los 64KBytes
de un banco)
* Para hacer código realmente rápido, es mejor que todos los accesos se hagan en la página directa. Esto implica cambiar ese registro cada bloque
de código que quieras optimizar, lo cual incrementa el tamaño del código. Pero además, la página directa es sólo para el banco $00, por lo que te obliga a tener ahí la memoria RAM (por eso la SNES tiene un mirror
de la memoria RAM en ese banco).
* La convención
de llamada "stdcall" se podría hacer normalmente, pero "fastcall" sería imposible
de implementar con más
de 3 parámetros
de entrada (por los tres registros que tiene).
Igual hay más cosas, pero no se me ocurren ahora y además, no soy ningún experto en C. Seguro alguien puede corregirme en esto que he dicho.
Sexy MotherFucker escribió:Juraría que
@magno aclaró hace tiempo que el bus
de datos externo del SA-1 seguía siendo
de 8 bits... Que confirme o desmienta.
Sí, el bus
de datos con la SNES sigue siendo
de 8 bits, eso no puede variarse. El bus
de 16 bits sólo lo usa con la RAM que lleva el cartucho, ya que ésta se usa como caché para instrucciones y para datos que procesa el SA-1. No es ningún misterio el que tenga 16 bits: simplemente para la época que se lanzó el SA-1 ya eran muy comunes y baratas este tipo
de RAM (ahora dudo
de si era DRAM o SRAM, tendría que mirarlo, aunque apostaría por la primera) y como se usa tanto para datos como para instrucciones, lo suyo es incrementar el ancho
de banda entre procesador y RAM para no tener un cuello
de botella.