Usando +3DOS con el DivIDE
Publicado: 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?
- 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?