Usar ZIP's de QDOS desde Windows

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

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Usar ZIP's de QDOS desde Windows

Mensaje por mcleod_ideafix » Dom Jul 25, 2010 11:41 pm

Lo que explico aquí es cómo copiar ficheros, originalmente comprimidos con la versión de ZIP de QDOS, desde un directorio de Windows, a un disquete formateado para QDOS, sin usar emuladores.

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 :)
Web: ZX Projects | Twitter: @zxprojects

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

Re: Usar ZIP's de QDOS desde Windows

Mensaje por afx » Mar Jul 27, 2010 12:15 am

Macleod, gracias por la información.

Por fin, algo de luz en el tema de las dichosas cabeceras de los ejecutables QDOS, y cómo recuperarlas. Esto viene bien también a la hora de transferir ficheros vía puerto Serie, ya que también se pierden las cabeceras en los ficheros ejecutables.


Saludos,
afx.

Responder

¿Quién está conectado?

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