¿Cómo saber el dispositivo del último fichero leído?

Subforo oficial del Sinclair QL: realiza aquí las consultas relativas a tu QL.

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

¿Cómo saber el dispositivo del último fichero leído?

Mensaje por programandala.net » Mar Abr 26, 2011 7:07 pm

Para que un boot cargue las extensiones necesarias independientemente de desde dónde haya sido cargado, necesito saber de qué dispositivo ha sido leído el propio boot.

Lo que busco es una función que devolviera el dispositivo actual, para usarlo con DATA_USE, como en en este ejemplo:

Código: Seleccionar todo

REMark boot file
TK2_EXT
DATA_USE CURRENT_DRIVE$
LRESPR ext_a
LRESPR ext_b
LRESPR ext_c
LRUN main_program_bas


El objetivo es que el programa arranque desde cualquier dispositivo (flpX_,winX_,dosX_,mdvX_...) en el que esté el soporte (un disquete real, una imagen de disquete, un fichero WIN...) , sin que el usuario tenga que hacer nada para redirigir o renombrar el dispositivo, y mucho menos que se vea obligado a usar un número de dispositivo concreto.

No encuentro ninguna función que devuelva el dispositivo desde el que ha sido leído el programa actual. Tampoco en MegaToolkit, Toolkit 3, Turbo Toolkit... Tampoco se me ocurre ningún truco para saberlo, pero sin duda esa información tiene que quedar en alguna parte, probablemente en las variables del sistema.
Marcos Cruz (programandala.net)

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: ¿Cómo saber el dispositivo del último fichero leído?

Mensaje por afx » Mar Abr 26, 2011 8:02 pm

¿Has mirado si el DIY Toolkit tiene algo?

Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

Re: ¿Cómo saber el dispositivo del último fichero leído?

Mensaje por programandala.net » Mié Abr 27, 2011 1:10 pm

afx escribió:¿Has mirado si el DIY Toolkit tiene algo?


Lo había olvidado, gracias. Tampoco hay nada.

En qlforum.co.uk me han dicho que esa información no se guarda en el sistema, pero en alguna parte tiene que estar, aunque sea de forma temporal... Seguro que algún experto en QDOS sabría dónde empezar a buscar.

Es una pena, porque una extensión así permitiría en Q-emuLator, con un simple lrun boot, arrancar un programa independientemente de en qué ranura (1-8) esté «insertado» el fichero (WIN, IMG, MDV, ZIP...) Lo mismo es aplicable a QPC2 (con ficheros WIN o directorios asociados a dispositivos DOS) y a la máquina real, con disquetes o cintas. Normalmente el dispositivo 1 es el de arranque... ¿por qué no voy a poder arrancar un programa desde cualquier otro dispositivo libre, sin tener que modificar su boot? Me parece una curiosa limitación de QDOS.

Bueno, he tenido una idea que voy a intentar: usar las cadenas de DEV_USE para probar automáticamente los ocho dispositivos más habituales. Menos es nada.
Marcos Cruz (programandala.net)

Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

Re: ¿Cómo saber el dispositivo del último fichero leído?

Mensaje por programandala.net » Jue Abr 28, 2011 2:43 pm

programandala.net escribió:Bueno, he tenido una idea que voy a intentar: usar las cadenas de DEV_USE para probar automáticamente los ocho dispositivos más habituales.


El encadenamiento de DEV_USE no es suficientemente flexible en mi caso. Al final he optado por una búsqueda «a lo bruto» del programa (que en mi caso se llama «ayc_bas») en todos los dispositivos win, dos, flp y mdv. Como en QPC2 «win» es la opción preferida y en Q-emuLator «win» es un sinónimo más para cualquer ranura, «win» es la primera búsqueda que se hace.

No es un método muy «sutil», pero es lo más práctico.

El código es este:

Código: Seleccionar todo

deffn prog_device$

  loc dev_offset,number,devs$,dev$
  let dev$=""
  let devs$="windosflpmdv"

  if not prog_found_in("")
    for dev_offset=1 to len(devs$) step 3
      for number=1 to 8
        let dev$=devs$(dev_offset to dev_offset+2)&number&"_"
        if prog_found_in(dev$):exit dev_offset
      endfor number
    next dev_offset
      let dev$=""
    endfor dev_offset
  endif

  ret dev$

enddef

deffn prog_found_in(device$)

  loc channel
  let channel=fopen(device$&"ayc_bas")
  if channel>0:close #channel
  return channel>0

enddef


Basta asignar una variable al inicio y usarla como dispositivo para cargar las extensiones y el programa principal:

Código: Seleccionar todo

let dev$=prog_device$
Marcos Cruz (programandala.net)

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: ¿Cómo saber el dispositivo del último fichero leído?

Mensaje por afx » Mar May 03, 2011 5:10 pm

Una utilidad interesante.

Tal vez se pueda compilar para ser usada como una extensión. Otra cosa que se podría hacer es que la rutina fuera independiente de tu programa "ayc_bas". Tal vez que prog_device$ aceptara como parámetro una cadena que identifique al programa en cuestión, se podría invocar de forma genérica así:

Código: Seleccionar todo

let dev$ = prog_device$ "miPrograma_bas" 

Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

Re: ¿Cómo saber el dispositivo del último fichero leído?

Mensaje por programandala.net » Mié May 04, 2011 12:24 am

afx escribió:

Código: Seleccionar todo

let dev$ = prog_device$ "miPrograma_bas" 


Sí, enseguida lo pensé. Como era para salir del paso en un caso concreto, la dejé así de momento. Pero la simplifique con ftest, que recordé que también está en TK2:

Código: Seleccionar todo

deffn prog_device$

  loc dev_offset,number,devs$,dev$
  let dev$=""
  let devs$="windosflpmdv"

  if ftest("ayc_bas")
    for dev_offset=1 to len(devs$) step 3
      for number=1 to 8
        let dev$=devs$(dev_offset to dev_offset+2)&number&"_"
        if not ftest(dev$&"ayc_bas"):exit dev_offset
      endfor number
    next dev_offset
      let dev$=""
    endfor dev_offset
  endif

  ret dev$

enddef
Marcos Cruz (programandala.net)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados