Mensajepor na_th_an » Jue, 26 Feb 2015, 08:15
Es muy probable que al adaptar Arkos Player no hayáis protegido el ISR contra los problemas que presentan los modelos de 128K y +2 gris, y que pueden producir basura (cuando menos) o cuelgues (a veces).
Los detalles del pete son raros, oscuros, y un poco liantes, pero creo recordar que si, cuando ocurre una interrupción, I es mayor o igual a $C0, y está paginada una RAM impar, hay problemas. Para solucionarlo, nosotros, en la ISR, guardamos el valor de I y lo ponemos a 0. Durante la ISR, I no vale para nada, así que no pasa nada. Justo al final de la ISR, volvemos a restaurarle su valor original.
Nosotros lo corregimos de una forma un tanto liosa, para ahorrar memoria, pero que funciona y nos ha salvado el culer. Como SetRAMBank siempre se ejecuta con las interrupciones deshabilitadas o desde dentro de la ISR, y siempre que hay una RAM distinta de la 0 las interrupciones están deshabilitadas, hacemos estos manejes ahí.
Si se va a paginar RAM0, se pone en I el valor correcto. Si se va a paginar RAMX, con X>0, se pone en I el valor "0", que nos saca del "rango del error".
¿Cuál es el valor de I correcto? En nuestro caso es F0. ¿Cómo lo sé? Lo miré con el debugger en Spectaculator. Soy muy poco dale fran para estas cosas.
$this->bbcode_second_pass_code('', 'void SetRAMBank(void) {
#asm
.SetRAMBank
ld a, b
or a
jp z, restISR
xor a
ld i, a
jp keepGoing
.restISR
ld a, $f0
ld i, a
.keepGoing
ld a, 16
or b
ld bc, $7ffd
out (C), a
#endasm
}')
Y diréis "pero si el código de 128k.h es el que sale en Goku Mal, y el que venía en la Churrera, y que se ha usado en otros juegos, y estos no se cuelgan" - cierto. El tema es que creo que nadie sabe las circunstancias exactas que producen los cuelgues, y parece que ocurren dependiendo del código que se ejecute. Así de sencillo. Es posible que el cambio al reproductor de Arkos esté encendiendo la mecha.
Si no es esto, habría que ver qué ocurre. Según he leído en facebook, el cuelgue es tras interrumpir la música que suena tras la carga.
Hay que buscarse a alguien con un 128K o un +2 gris para hacer estas pruebas.
Como diría Rorshach: "Urm..."