¿Diferencias RETN/RET?
Publicado: Dom Mar 11, 2018 11:52 am
La historia es que para quitar óxido a mis habilidades, quiero hacer mi propia versión de un programa que convierta snapshots de Spectrum en ficheros TAP o DSK.
De momento, voy a centrarme en la conversión SNA a TAP. Para hacerlo más "auténtico", quiero que haga una cinta que parezca haber sido grabada con uno de los transfers de la época (Transtape, Phoenix, Pokeador automático). Por ejemplo, en el caso del Transtape, eso significaría un bloque BASIC, seguido de uno de 75 bytes y otro sin cabecera de 49052 bytes.
Después de esta introducción, el problema:
Leyendo la documentación del formato SNA, me llama la atención la frase "When the registers have been loaded, a RETN command is required to start the program". Tiene lógica, ya que "supuestamente" hemos grabado usando una NMI. El tema es que, mirando los cargadores que usan los interfaces, todos ejecutan el programa usando RET.
Supongo que eso es porque (al cargar el programa) realmente no estamos volviendo de una interrupción. La pregunta es... ¿debería usar RET o RETN al volver? ¿Da lo mismo en este caso o tengo que parchear el cargador?
Gracias
DATO INTERESANTE: Buscando en la ROM del 48k, he encontrado en la dirección 7805 estas instrucciones:
Visto así, parece una tontería, pero permite paginar y retornar sin consumir demasiados bytes. En el caso del transfer Phoenix (que corrompe muy poquito la pantalla), solo deja en la pantalla las instrucciones para cargar los registros y retornar. Las instrucciones para cargar el último bloque son las siguientes:
Suponiendo que quisiera hacer un cargador para cargar desde disco +3, podría ejecutar el código desde la página 7 y (después de cargar todos los bloques en su sitio) acabar usando algo así:
De manera que el código que pone la página 0 y desactiva la paginación se ejecuta realmente la ROM y me evito problemas raros o corromper más pantalla.
De momento, voy a centrarme en la conversión SNA a TAP. Para hacerlo más "auténtico", quiero que haga una cinta que parezca haber sido grabada con uno de los transfers de la época (Transtape, Phoenix, Pokeador automático). Por ejemplo, en el caso del Transtape, eso significaría un bloque BASIC, seguido de uno de 75 bytes y otro sin cabecera de 49052 bytes.
Después de esta introducción, el problema:
Leyendo la documentación del formato SNA, me llama la atención la frase "When the registers have been loaded, a RETN command is required to start the program". Tiene lógica, ya que "supuestamente" hemos grabado usando una NMI. El tema es que, mirando los cargadores que usan los interfaces, todos ejecutan el programa usando RET.
Supongo que eso es porque (al cargar el programa) realmente no estamos volviendo de una interrupción. La pregunta es... ¿debería usar RET o RETN al volver? ¿Da lo mismo en este caso o tengo que parchear el cargador?
Gracias
DATO INTERESANTE: Buscando en la ROM del 48k, he encontrado en la dirección 7805 estas instrucciones:
Código: Seleccionar todo
out (c),a
ret
Código: Seleccionar todo
ld ix,64000
ld de,1536
ld hl,16384
push hl
jp xxx ; que en realidad luego salta a 1378
Código: Seleccionar todo
di
ld hl,16384
push hl
ld a,48 ; el phoenix solo hace snapshots de 48k...
ld bc,32765
jp 7805