Los ficheros en QDOS pueden ser de tres tipos.
Tipo 0: archivo general. No hay que hacer nada especial. Son archivos generales, por ejemplo, los que se cargan con LRESPR o LBYTES.
Tipo 1: archivo ejecutable. Se carga y ejecuta con EXEC. Son los que nos interesan.
Tipo 2: archivo relocatable. No me los he encontrado todavía.
Los archivos de tipo 1 tienen una cabecera en la que se guarda el tamaño por defecto del bloque de datos. Además, en la propia cabecera se estipula que el tipo de archivo es 1.
Según la información del QDOS Technical Guide, el tipo de archivo se guarda en el byte de offset 5 (contando desde 0) de la cabecera. Si ese byte vale 1, entonces los bytes 6 a 9, inclusive, guardan una doble palabra en formato big endian, que corresponde al tamaño por defecto del área de datos.
Cuando desde QDOS se crea un archivo comprimido, la información de la cabecera se guarda como un recurso aparte del propio stream de datos del fichero. Los descompresores de Windows ignoran esa información extra, y es por eso que al descomprimir un fichero ZIP de QDOS en Windows y copiarlo mediante un emulador, o con la utilidad qltools, no funciona el programa.
Afortunadamente, los descompresores de Windows (WinZIP es el que he usado) pueden mostrar la información extra que se guarda para cada archivo comprimido. Gracias a esto, y a una de las opciones de la utilidad qltools, podremos restituir la información perdida a los ejecutables
Necesitaremos por tanto:
- Las QLTOOLS: http://www.daria.co.uk/misc/ (enlaces en el apartado Introduction) . No confundir con las qlxtools que están justo a continuación en ese apartado. Esta utilidad sirve para copiar desde y hacia disquetes formateados con QDOS.
- Un descompresor de ZIP que permita obtener la información de todos los campos extra que se guardan en el fichero zip. Uno que lo hace es el WinZIP.
Los pasos que he seguido son los siguientes (lo ilustro con un fichero ZIP que contiene el ensamblador de GST, bajado de la web de Radastan)
- Descomprimimos el fichero ZIP en Windows de la manera habitual.
- Usando QLTOOLS copiamos los ficheros descomprimidos al disquete (opción -w). Por ejemplo, si el contenido del ZIP lo hemos descomprimido en C:\QL\QLMAC y nuestra unidad de disco es A:, entonces
Código: Seleccionar todo
C:\QL\QLMAC>for %i in (*.*) do qltools \\.\a: -w %i
Copia todos los ficheros de ese directorio al disquete en formato QDOS.
- Ahora hay que identificar cuáles de estos ficheros son ejecutables y cuáles no. Para ello, cogemos el ZIP original, qlmac.zip y lo abrimos con WinZIP. Usando File -> Properties -> Details obtenemos una ventana de texto con cantidad de información. El fichero comienza con algo parecido a esto:
Código: Seleccionar todo
Testing ...
Current Location part 1 offset 76889
Archive: C:\ql\qlmac.zip 76911 bytes 2010-07-25 21:50:52
End central directory record PK0506 (4+18)
En ese fichero hay un apartado de información por cada archivo comprimido que contiene el ZIP. Buscamos aquellos archivos comprimidos que contienen un campo extra como éste:
Código: Seleccionar todo
Current Location part 1 offset 75827
filename:mac
Current Location part 1 offset 75830
extra field 0xfb4a (SMS/QDOS), 4 header and 72 data bytes:
El "extra field" contiene la información que necesitamos, ni más ni menos que la cabecera perdida de QDOS que necesitamos. Por ejemplo, para este fichero "mac", el campo extra contiene esta información:
Código: Seleccionar todo
51 44 4f 53 30 32 00 00 00 00 77 aa 00 01 00 00 QDOS02....w.....
10 00 00 00 00 00 00 03 6d 61 63 00 00 00 00 00 ........mac.....
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 59 f6 62 de ............Y.b.
00 01 00 03 00 00 00 00 ........
La cabecera real de QDOS comienza aquí en el byte de offset 8. Si contamos desde 0 a partir de ahí, vemos que el byte de offset 5 es un 1, lo que significa que el fichero "mac" es un ejecutable, y que por tanto, los 4 bytes siguientes ( 00 00 10 00 ) constituyen la información del tamaño del área de datos en hexadecimal.
Esa información se la añadimos al fichero en el disquete QDOS usando las qtools, así:
Código: Seleccionar todo
C:\QL\QLMAC>qltools \\.\a: -x mac 0x00001000
Si ahora listamos un directorio de los ficheros en el disquete, veremos que el fichero "mac" tiene el atributo E (de ejecutable) y con un área de datos de 4096 (0x00001000 en decimal)
Pues lo mismo haremos con el resto de ficheros que contengan este campo extra. Al final obtenemos esto:
Código: Seleccionar todo
C:\ql\qlmac>qltools \\.\a: -d
1062/1440 sectors.
clone 749 25/07/110 23:32:36 v1
ed E 21476 25/07/110 23:32:40 v1 (4000)
ex1_asm 14468 25/07/110 23:32:48 v1
ex2_asm 9455 25/07/110 23:32:54 v1
ex3_asm 4476 25/07/110 23:32:59 v1
example_link 394 25/07/110 23:33:01 v0
info_txt 936 25/07/110 23:33:03 v0
install 2438 25/07/110 23:33:05 v0
link E 20182 25/07/110 23:33:07 v0 (4096)
mac E 30634 25/07/110 23:33:11 v0 (4096)
macro_lib 19768 25/07/110 23:33:17 v0
qdos1_in 21330 25/07/110 23:33:22 v0
qdos2_in 17844 25/07/110 23:33:27 v0
window_mgr E 15440 25/07/110 23:33:31 v0 (8192)
El disquete está ahora preparado para ser usado en el QL