Usando +3DOS con el DivIDE

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Usando +3DOS con el DivIDE

Notapor zup el Dom Sep 25, 2016 9:42 am

Estaba pensando hacer una utilidad para transferir ficheros desde una partición FAT a una IDEDOS, y me he encontrado con un problema: necesito poner en marcha el +3DOS desde un modo USR0. El problema es este:

- Si arranco con el DivIDE deshabilitado, no creo que pueda usar los comandos RST 8 del ESXDOS.
- Si arranco con el DivIDE habilitado, el equipo entra en un entorno USR0 (ROM 48k, paginación y puertos de 128k habilitados) por lo que el +3DOS está K.O. (porque no se ha inicializado, las rutinas de paginación no están en su sitio y las variables de sistema están preparadas para el modo 48k.

Estos son los experimentos que he hecho hasta ahora:

EXPERIMENTO 1: Por todo el morro. Intento leer del disco sin hacer nada más. El código casca (como estaba previsto).

EXPERIMENTO 2: ¿Puede funcionar llamando a dos_init? Pues no. El código casca durante la llamada a dos_init, ya que las rutinas de paginación no existen.

EXPERIMENTO 3: ¿Y si restauro las rutinas de paginación? En la ROM 0 se pueden encontrar las rutinas de paginación que usa el 128k. Las rutinas están a partir de la dirección 189 ($00bd) y ocupan 82 bytes. El código que las copia está en la dirección 374 de la ROM 0 (más sobre esto abajo). La secuencia ahora es:
- Copio las rutinas de paginación a su sitio.
- Llamo a dos_init.
- Intento leer del disco.
El código vuelve a cascar. Hace las llamadas a dos_init y dos_set_drive correctamente, pero cuando hago un dos_open me devuelve el error $1d (access denied, file in use already).

EXPERIMENTO 4: A lo bruto. Copio toda el área de variables a ver qué pasa. El proceso:
- Primero arranco un +3 sin interfaces y me guardo 800 bytes a partir de 23296 (cubre toda el área de variables y parte del BASIC).
- Después, en mi programa (con el DivIDE activo y en modo USR0) meto a martillazos esos 800 bytes en su sitio.
- Llamo a dos_init.
- Leo del disco.
Funciona, pero en cuanto intento volver al BASIC el programa casca. No me importa demasiado, ya que quiero hacer todas las operaciones desde código máquina.

PREGUNTAS:
- ¿Cuál es el procedimiento correcto para usar el +3DOS desde un entorno USR0? ¿Hay uno o soy el primero que lo intenta? ¿Qué áreas deben estar inicializadas para poder usarlo?
- ¿Se puede llamar a las rutinas de inicialización de la ROM? Por lo que veo, esas rutinas NO retornan, sino que van dando saltos hasta que llegan a la presentación del menú principal.
- ¿Tener las variables del BASIC semicorruptas tiene consecuencias en código máquina si llamo a la ROM? Después voy a ir mezclando llamadas al +3DOS con RST 8 (y supongo que con llamadas a otras rutinas como la de impresión y esas cosas) y no me gustaría que el código vaya cascando porque las variables están algo liadas.
- ¿Alguna idea adicional sobre qué precauciones debería tomar?
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...
zup
Freddy Hardest
 
Mensajes: 575
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Usando +3DOS con el DivIDE

Notapor zup el Lun Sep 26, 2016 2:54 pm

Por si alguien quiere investigarlo, he subido este fichero con mi trabajo.

Creo que no hace falta modificar toda el área de variables, sino que las rutinas de paginación que hice para el experimento 3 estaban mal.

Dentro del fichero 7z están los fuentes en ensamblador de los cuatro experimentos. El disco gatito.dsk contiene únicamente el fichero screenshot que intentan cargar los otros ficheros. La cinta contiene los cuatro programas ya ensamblados y listos para usar (gatito 4 incluye una copia del área de variables de un +3). Resultados de mis pruebas:

Spectrum +3 sin interfaces, cargando desde el menú: todos los programas funcionan.

Spectrum +3 sin interfaces, cargando desde USR0:
- El primer programa casca en la función dos_open. No es que retorne error, es que resetea en medio de la función.
- El segundo programa casca en la función dos_init. De nuevo, casca antes de retornar de la función.
- El tercer y cuarto programas funcionan a la perfección.

Spectrum +3e, DivIDE conectado pero deshabilitado: todos los programas funcionan.

Spectrum +3e, DivIDE conectado y habilitado: mismos resultados que cargando desde USR0.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...
zup
Freddy Hardest
 
Mensajes: 575
Registrado: Vie Ago 15, 2008 2:43 pm


Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 1 invitado