A falta de fuentes del compilador, he podido hacerme una idea de las etiquetas no declaradas usando Superglús 1.0-beta4 pero utilizando una versión moderna, que genera warnings, de glulxa.
Para la prueba uso un viejo cadabra.txp.
El warning más repetido (con mucha diferencia) se refiere a la etiqueta
glkresult (la única que he analizado), utilizada en las llamadas a glk para almacenar el valor de retorno. Con dos apariciones,
interrupt_proc. Con una aparición,
flag2147483646,
nombreanterior y
canal_sonido.
En otro frente, he estado intentando entender el
workaround de glulxe. Si lo he entendido bien, es preocupante. Se ha aplicado para dos opcodes: glk y copy. En el fondo, ambos casos se tratan de la misma manera: si detecta que la escritura va a caer en la dirección 0, simplemente descarta la escritura (si el primer argumento de store_operand() es cero, no se almacena nada).
Para el primer opcode, esto significa que el valor de retorno de la llamada se pierde. Esto no es problemático casi nunca en el código generado por Superglús en el fichero ula, porque rara vez lo utiliza. Pero hay casos en los que sí. En especial me ha llamado la atención durante las rutinas de save/load. En ellas se utiliza el valor de retorno (recordemos, que se ha perdido) para hacer saltos condicionales (jz/jnz) y --aquí entra en juego también el otro opcode parcheado-- se usa copy hacia el stack para utilizarlo en posteriores instrucciones.
Con esto en mente, he probado salvar y cargar en 007. Efectivamente, provocan error:
Código:
Glulxe faltal error: Reference to nonexistent Glk object.
Intuyo que el
workaround menos intrusivo (suponiendo que nunca existirá una lectura legítima del contenido original de la posición 0 de la ROM) es considerar la dirección de memoria 0 como de lectura/escritura. Se me ocurren otras posibilidades, pero suenan más complicadas y quizá no factibles en la práctica.
Si, en glulxe, elimino los dos parches actuales en los opcodes y hago este cambio en vm.c...
Código:
*/
void verify_address_write(glui32 addr, glui32 count)
{
+#ifdef TOLERATE_SUPERGLUS_BUG
+ if (addr == 0) return;
+#endif /* TOLERATE_SUPERGLUS_BUG */
if (addr < ramstart)
fatal_error_i("Memory write to read-only address", addr);
if (addr >= endmem)
... ya no da error y, como prueba, he conseguido salvar y cargar en Pitufos Crisis (donde tampoco se podía, mismo error que en 007).
[Si este if ocurriera en tiempo de ejecución, se podría hacer algo como lo que dice Fernando, que se pudiera escoger el modo de compatibilidad sobre la marcha, en vez de tener que decidirlo en tiempo de compilación del intérprete. En Quixe intuyo que se tiene que poder hacer algo similar sin afectar al rendimiento, pero tendría que analizar sus fuentes.]
No sé si esto cubre el resto de los bugs provocados por las etiquetas que no he analizado. Tampoco hay que perder de vista que varias obras anteriores a 2009 utilizaron versiones anteriores a la 1.0-beta4 y pueden tener bugs extra. Pero creo que no vamos a peor respecto a lo que ocurre en intérpretes que no validan la escritura. Lo que no sé es si David Kinder activaría esta opción o si volvería a la táctica (como en 0.5.2) de publicar dos ejecutables; esto es similar, aunque bastante más concreto, a lo que hace VERIFY_MEMORY_ACCESS=0.
Lo peor de todo este asunto es que tendríamos que ir convenciendo a cada mantenedor/distribuidor de intérpretes para que hiciera algo equivalente, a riesgo de posibles efectos colaterales en obras de otros sistemas. O a zarf para que añada una feísima excepción en la especificación.
Si pudieramos recompilar o parchear los binarios de todas estas obras con bug (y para ello primero tendríamos que tener perfectamente localizados las variantes y/o diferentes bugs posibles), nos quitaríamos de encima todo este cuento de nunca acabar.
Repasando la lista de obras creadas con Superglús antes de 2009, según el wiki, sin fuentes encuentro (salvo error u omisión): 007, Sherwood, Fray Guillermo, Legado, Catedral, Náufrago, Pitufos y Witchcraft. Aunque si profundizamos un poco más igual aparecen fuentes, como los que hay en la descarga de Pitufos.
Con fuentes, aunque no sé si recompiladas: Rur, Sidra y McArra's.
http://wiki.caad.es/Categor%C3%ADa:Aven ... rgl%C3%BAs