Deja Vu #05: CODIFICACIÓN: Explorando la Funcionalidad de MS-PACK y DEPACKER

SoundTrack: !-0 ;)-: POR SECTOR DESPUÉS DE INSTY
__________________________________________

(C) Max/CYBERAX Software
Adición: dAn!!L
__________________________________________

Se tratará del empaquetador MS-PACK, y más concretamente del DEPACKER que se adjunta a los archivos empaquetados. En su forma original, el UNPACKER de MS-PACK debe funcionar con interrupciones desactivadas. Tampoco se prevé la posibilidad de separarlo del bloque (por ejemplo, en su programa hay muchos archivos comprimidos y no tiene sentido tener un descompresor para todos ellos - es suficiente con un único ejemplar). Trabajar con interrupciones habilitadas será útil si es necesario descomprimir algo sin interrumpir la música o la animación. En este caso, la música se coloca en IM 2, y el DEPACKER funciona en modo normal.

Para implementar todo lo anterior están destinadas las siguientes dos programas.

El primer programa - en Basic. Está destinado a separar el DEPACKER del bloque comprimido. Al iniciarlo, solicita que se introduzca el nombre del archivo (no más de 7 letras). Luego, escribe en el disco el bloque sin el descompresor. Se añade un apóstrofo al nombre del archivo original. La longitud del bloque resultante será menor que la del bloque con el DEPACKER en 247 bytes.

1 INPUT "Nombre: ";A$ : RANDOMIZE USR VAL "15619" : REM : LOAD A$ CODE 2 LET O=VAL"PEEK 23782 + 256*PEEK 23783": LET A=VAL "PEEK (O+233) + 256*PEEK (O+234)" : LET L=VAL"3 + PEEK (O+239) + 256*PEEK(O+240)" 3 FOR J=NOT PI TO VAL "4" : POKE VAL"O + 238 + J", PEEK VAL "A - 4 + J" : NEXT J 4 RANDOMIZE USR VAL "15619" : REM : SAVE A$ + "'" CODE VAL "O + 238", L

El segundo programa - en ensamblador. Este es, en realidad, el DEPACKER. (Honestamente, no logré entender el algoritmo de funcionamiento del descompresor. Solo reemplacé todas las operaciones de pila por operaciones con el registro IX, y también traté de ajustar la nueva versión del DEPACKER en 256 bytes.)

ORG 40000
;+---------------------------------------+
;|*** MS-PACK UNPACKER CON INTERRUPCIÓN ***|
;|---------------------------------------|
;| Originalmente escrito por 'MICROSPACE', |
;| remezclado por Max 'CYBERAX Software' |
;+---------------------------------------+
UNPACK LD C,16
LD B,C
LD D,3
EXX
LD HL,SOURCE
;Dirección del bloque empaquetado sin UNPACKER.
;(De dónde descomprimir)
;El bloque debe haber sido obtenido por el programa anterior en Basic.
LD DE,BUF
LD BC,5
LDIR
PUSH HL
POP IX
LD DE,DESTIN
;Dirección en memoria donde se realizará
;la descompresión.
LD H,B
EXX
CALL POP_HL
JR ENTRY
FIRST CALL POP_AF
EXX
LD (DE),A
INC DE
EXX
ENTRY CALL NEWBIT
JR NC,FIRST
LD E,2
L1 XOR A
CALL NEWBIT
RLA
CALL NEWBIT
RLA
CP D
JR C,MET1
ADD A,E
LD E,A
CP 17
JR NZ,L1
XOR A
MET1 ADD A,E
CP 5
JR NC,MET2
CP 2
JR NZ,MET3
EXX
LD C,A
L3 CALL POP_AF
LD L,A
LD A,E
SCF
SBC A,L
LD L,A
LD A,D
SBC A,H
LD H,A
LDIR
LD H,B
EXX
JR ENTRY
L2 EXX
CALL POP_AF
INC A
JR Z,END
INC A
JR NZ,MET4
CALL POP_BC
JR MET5
MET4 ADD A,15
JR NC,MET6
INC B
JR MET6
MET2 JR Z,L2
DEC A
MET3 EXX
MET6 LD C,A
MET5 EXX
CALL NEWBIT
EXX
JR C,L3
EXX
XOR A
LD E,D
L4 CALL NEWBIT
RLA
DEC E
JR NZ,L4
CP 2
JR NC,MET7
INC A
LOOP EXX
LD H,A
JR L3
MET7 CALL NEWBIT
RLA
CP 8
JR NC,MET8
DEC A
JR LOOP
MET8 CALL NEWBIT
RLA
CP 23
JR NC,MET9
SUB 9
JR LOOP
MET9 CALL NEWBIT
RLA
AND 31
CP 31
JR C,LOOP
CALL POP_AF
JR LOOP
END LD HL,BUF
LD C,5
LDIR
;En caso de que use este
;descompresor desde Basic, aquí es recomendable
;insertar comandos de restauración del registro
;HL (de lo contrario, Basic fallará...).
RET
NEWBIT ADD HL,HL
DJNZ MET
LD B,C
POP_HL LD L,(IX)
LD H,(IX+1)
FIN INC IX
INC IX
MET RET
POP_DE LD E,(IX)
LD D,(IX+1)
JR FIN
POP_BC LD C,(IX)
LD B,(IX+1)
JR FIN
POP_AF LD A,(IX)
JR FIN+2
BUF DEFS 5
SIZE EQU $-DEPACK

Las direcciones SOURCE y DESTIN no se eligen al azar. Más bien, se eligen arbitrariamente, pero según ciertas reglas. Supongamos que la longitud del bloque original (no empaquetado) es LEN1, y la longitud del bloque empaquetado (sin UNPACKER) es LEN2. Pueden darse dos casos:

1) Supongamos que se especifica la dirección DESTIN, entonces la dirección SOURCE puede estar en el rango de 16384 a DESTIN-LEN2 o en el rango de DESTIN+LEN1-LEN2 a 65536-LEN2.

2) Se puede fijar la dirección SOURCE, entonces DESTIN puede estar en el rango de 16384 a SOURCE-LEN1+LEN2 o de SOURCE+LEN2 a 65536-LEN1.

Esto es válido bajo la condición de que LEN1 sea mayor que LEN2 (es decir, si el bloque se ha comprimido aunque sea un poco), de lo contrario, estas fórmulas no son válidas. Además, si no se separa el descompresor de tal bloque, este último no podrá descomprimir el bloque correctamente (por ejemplo, se reiniciará).

En conclusión, unas palabras más.

El UNPACKER modificado de esta manera funciona un poco más lento que el original (esto aún sin contar el tiempo que ocupa el procedimiento de manejo de IM 2). Si se necesita la máxima velocidad, se puede proceder de la siguiente manera: ejecutar el UNPACKER original con interrupciones habilitadas...

Para ello, es necesario separar el procedimiento de descompresión del bloque y modificar su inicio de manera similar a mi versión. Al llamarlo, es necesario ajustar los parámetros SOURCE y DESTIN de manera que la distancia entre estos bloques aumente en tantos bytes como el controlador IM 2 lleva a la pila (o más). Permítanme explicar un poco. El DEPACKER original al iniciarse coloca la pila en el bloque empaquetado y comienza a descomprimirlo en la dirección DESTIN, mientras que el bloque descomprimido crece hacia arriba, y el bloque empaquetado 'se aleja' de él, disminuyendo en longitud. Los bytes del bloque empaquetado se retiran con comandos POP. Lo más interesante es que el final del bloque descomprimido nunca 'alcanzará' el inicio del que se está descomprimiendo, ya que se deja un espacio de 5 bytes entre ellos. Si aumentamos artificialmente este espacio (modificando SOURCE o DESTIN), podremos guardar aquí registros y direcciones de retorno al manejar IM 2. También debo señalar que no he verificado el segundo método, pero el primero funciona con éxito en uno de mis programas.

* * *

En adición de la redacción o como se hizo en DEJA VU.

Para no complicarse y no tener que ingresar direcciones manualmente, y si no necesita trabajar con interrupciones habilitadas, realice las siguientes manipulaciones:

1) Empaquete el archivo de código con MS-PACK y se entusiasme con el coeficiente de compresión (si hay varios archivos, por supuesto, empaquete todos).

2) Ejecute el siguiente programa en Basic:

10 CLEAR 25000
20 INPUT "MS:";N$
22 IF N$="" THEN GO SUB 100:GO TO 20
25 RANDOMIZE USR 15619:REM:LOAD N$ CODE
26 IF PEEK 23823 0 THEN GO TO 20
28 LET LEN=PEEK 23784+256*PEEK 23785
30 LET AD=PEEK 23782+256*PEEK 23783:
LET AD2=AD+36:LET AD3=AD+231
40 POKE AD3,PEEK AD2: POKE AD3+1, PEEK (AD2+1)
50 INPUT "NUEVO:";M$
60 IF M$="" THEN GO SUB 100:GO TO 50
70 RANDOMIZE USR 15619:REM:SAVE M$ CODE AD3,LEN-231
80 GO TO 20
100 RANDOMIZE USR 15619:REM:CAT
110 RETURN

3) Ingrese el nombre del archivo empaquetado con MS-PACK (línea 20), si no hay tal archivo, no sucederá nada, de lo contrario se le pedirá el nombre del nuevo archivo; después de ingresar el nombre, se escribirá un nuevo archivo desde la dirección ANTIGUA DIRECCIÓN+231, con una longitud de ANTIGUA LONGITUD-231, es decir, ¡231 bytes más cortos!

4) Cree un descompresor universal, ensamblando en su ensamblador favorito el siguiente listado:

ORG #5B00

LL5B00 LDDR ;o LDIR, ver abajo
LD H,B
POP DE
EXX
POP HL
JR LL5B0E
LL5B08 DEC SP
POP AF
EXX
LD (DE),A
INC DE
EXX
LL5B0E ADD HL,HL
DJNZ LL5B13
POP HL
LD B,C
LL5B13 JR NC,LL5B08
LD E,#02
LL5B17 XOR A
ADD HL,HL
DJNZ LL5B1D
POP HL
LD B,C
LL5B1D RLA
ADD HL,HL
DJNZ LL5B23
POP HL
LD B,C
LL5B23 RLA
CP D
JR C,LL5B2E
ADD A,E
LD E,A
CP #11
JR NZ,LL5B17
XOR A
LL5B2E ADD A,E
CP #05
JR NC,LL5B5C
CP #02
JR NZ,LL5B5F
EXX
LD C,A
LL5B39 DEC SP
POP AF
LD L,A
LD A,E
SCF
SBC A,L
LD L,A
LD A,D
SBC A,H
LD H,A
LDIR
LD H,B
EXX
JR LL5B0E
LL5B49 EXX
DEC SP
POP AF
INC A
JR Z,LL5BAA
INC A
JR NZ,LL5B55
POP BC
JR LL5B61
LL5B55 ADD A,#0F
JR NC,LL5B60
INC B
JR LL5B60
LL5B5C JR Z,LL5B49
DEC A
LL5B5F EXX
LL5B60 LD C,A
LL5B61 EXX
ADD HL,HL
DJNZ LL5B67
POP HL
LD B,C
LL5B67 EXX
JR C,LL5B39
EXX
XOR A
LD E,D
LL5B6D ADD HL,HL
DJNZ LL5B72
POP HL
LD B,C
LL5B72 RLA
DEC E
JR NZ,LL5B6D
CP #02
JR NC,LL5B7F
INC A
LL5B7B EXX
LD H,A
JR LL5B39
LL5B7F ADD HL,HL
DJNZ LL5B84
POP HL
LD B,C
LL5B84 RLA
CP #08
JR NC,LL5B8C
DEC A
JR LL5B7B
LL5B8C ADD HL,HL
DJNZ LL5B91
POP HL
LD B,C
LL5B91 RLA
CP #17
JR NC,LL5B9A
SUB #09
JR LL5B7B
LL5B9A ADD HL,HL
DJNZ LL5B9F
POP HL
LD B,C
LL5B9F RLA
AND #1F
CP #1F
JR C,LL5B7B
DEC SP
POP AF
JR LL5B7B
LL5BAA LD HL,LL5BBC
LD C,#05
LDIR
LD HL,#0000
LL5BB2 EQU $-#02
EXX
LD SP,#0000
LL5BB6 EQU $-#02
EI ; o DI
RET ;
NOP ; o JP #nnnn NOP ;/
LL5BBC NOP
NOP
NOP
NOP
LL5BC0 NOP

;el descompresor universal ocupa menos de 256 bytes! Se coloca tradicionalmente en el búfer de la impresora desde la dirección #5B00. (en este caso, la dirección de inicio será #5BC1=etiqueta DEPACK). En la entrada, el par HL debe establecerse en la dirección del bloque de códigos cargados sin el descompresor (lo que se obtuvo en el punto 3). Para evitar problemas de superposición de datos descomprimidos sobre los que aún no se han descomprimido, recomiendo cargar el archivo en la dirección especificada en el catálogo! La descompresión ocurrirá en la dirección que se especificó en MS-PACK.

Por ejemplo, tenemos un archivo empaquetado con MS-PACK:

"FILE" CODE 49152,10000;

Después de procesarlo con BASIC (puntos 2 y 3) obtendremos un nuevo archivo sin el descompresor:

"FILE+" CODE 49383,9769;

Para descomprimir este archivo, colocamos el descompresor en la dirección #5B00 y descomprimimos de la siguiente manera:

LD HL,49383
JP #5BC1 ;etiqueta DEPACK

El archivo se descomprimirá en la dirección especificada al empaquetarse en MS-PACK (por ejemplo, #C000).

Y, finalmente, un pequeño matiz - si al empaquetar el archivo resulta ser más grande que el original (y esto puede suceder si empaquetamos un archivo pequeño o ya empaquetado - esto se puede ver por el coeficiente de compresión dado en porcentaje), entonces es necesario cambiar el descompresor, colocando LDIR en lugar de LDDR en la dirección #5B00! De este modo, tiene sentido empaquetar archivos pequeños (2 sectores).

En resumen, si se orienta por la cantidad de sectores, en el 90% de los casos se puede ahorrar un sector en el archivo!

Si utiliza el método que propone MAX, en el 96% de los casos se ahorra un sector! Y lo más importante - ¡hay posibilidad de elección! MS-PACK empaca bien archivos de texto pequeños. Si está empaquetando grandes bloques de código, use HRUST 1.0, seguramente mostrará un mejor resultado, y además la posibilidad de guardar el archivo sin el descompresor está prevista por el autor.

A continuación, le paso la palabra a MAX.

-----------------------------------------******************************************
-----------------------------------------
Carga y ejecución de archivos Basic.

Creo que todos saben cómo se inician los programas en los boot. El nombre del archivo se lanza en la línea de Basic (en lugar de los espacios en el comando RUN " "), luego esta línea se ejecuta. En este artículo, explicaré cómo se puede cargar y ejecutar un programa Basic sin utilizar este tipo de trucos. El programa en el listado está escrito con un uso activo de fragmentos de ROM de TR-DOS, así que no se sorprendan por su aspecto torpe.

Supongamos que hay un archivo específico que necesitamos ejecutar. También supongamos que conocemos el encabezado de este archivo (16 bytes). Para la carga, utilizaremos un cierto controlador que puede leer sectores 'B' en la dirección 'HL' desde la pista y sector 'DE' (etiqueta LOAD). Después de la carga, el controlador debe almacenar la última pista y sector en la variable #5CF4. Es deseable tener CLEAR establecido en 65367. Primero, trasladaremos el encabezado a la dirección HEADER, que es igual a 23773. Es deseable ingresar el número del archivo en #5D1E. Luego ejecutamos el siguiente programa:

BAS_RUN LD DE,(23635);inicio del programa Basic LD HL,(23641);bloque de edición de la línea DEC HL PUSH HL PUSH DE AND A SBC HL,DE ;en HL obtuvimos la longitud del antiguo programa Basic, ;es decir, el que está (o no está) ;en memoria antes de la carga. LD DE,(HEADER+9) ;en DE tomamos del encabezado la longitud del nuevo Basic, es decir, el que se necesita cargar. PUSH DE PUSH HL LD HL,5 ADD HL,DE ;aumentamos la longitud del nuevo programa en 5 bytes. LD (23771),HL ;lo metimos en la variable, como en TR-DOS. POP HL POP BC POP DE POP HL PUSH BC CALL #19E5 ;eliminamos el antiguo Basic, desplazando la memoria. POP BC CALL #1655 ;reservamos espacio para el nuevo. INC HL LD BC,(HEADER+11) ;tomamos del encabezado la longitud del nuevo Basic ;sin variables de programa. ADD HL,BC ;sumamos la dirección de inicio. LD (23627),HL ;establecimos la variable del sistema VARS. LD HL,(23635) ;HL - dónde vamos a cargar. LD A,(23772) ;byte alto de la longitud. LD B,A LD DE,(HEADER+14) ;DE - pista y sector. LD (#5CF4),DE DEC B INC B CALL NZ,LOAD ;si hay algo que cargar - cargamos. LD A,(23771) AND A JR Z,NOLOW ;¿es igual a cero el byte bajo de la longitud? PUSH HL LD DE,(#5CF4) LD HL,BUF LD B,1 CALL LOAD ;cargamos el último sector en el búfer. POP DE LD BC,(23771) LD B,0 LD HL,BUF LDIR ;el resto lo trasladamos a donde corresponde. NOLOW LD HL,(23641) DEC HL LD (HL),128 ;metimos por si acaso el marcador de fin. INC HL INC HL LD E,(HL) INC HL LD D,(HL) ;tomamos la cadena de autoarranque LD (23618),DE ;y la metemos en la variable correspondiente. XOR A LD (23620),A ;ponemos a cero el número del operador en la línea. LD (23824),A CALL #16B0 ;no recuerdo exactamente qué es, parece que limpia ;la pila de la calculadora. LD HL,(23635) DEC HL LD (23639),HL ;hicimos RESTORE. LD HL,(23613) LD (23827),HL EXX LD HL,10072 EXX LD IY,#5C3A LD (IY),255 SET 7,(IY+1) RES 5,(IY+1) ;otros ajustes. JP 7037;ejecución... BUF DEFS 256;búfer de carga.

Es mejor colocar este programa en el área de pantalla. Sería bueno limpiar la pantalla antes de transferir el control a la ROM, como lo hace TR-DOS. Por ejemplo, en lugar de JP 7037:

LD HL,7037
PUSH HL
JP 3435

En conclusión, quiero expresar mi agradecimiento a Fedin P.Y. por el libro "Descripción completa y desensamblador completo de TR-SOS 5.04T (5.03)".

Contenido de la publicación: Deja Vu #05

  • Аперативчик - Max
    Instrucciones detalladas sobre la gestión de la interfaz DEJA VU, destacando diferentes métodos de entrada y comandos de navegación. Explicación de las interfaces nuevas y antiguas para mejorar la experiencia del usuario. Discusión sobre funciones adicionales como el desplazamiento de cuadros y la gestión de música.
  • Аперативчик - Max
    Discusión sobre el soporte de máquinas con más de 128k de memoria, lo que lleva a cascarones separados para sistemas de 128k y 256k. Las pruebas se realizaron principalmente en Scorpion y Profi, con la funcionalidad anticipada en otros modelos. El artículo incluye orientación sobre cómo descomprimir archivos fuente y percepciones sobre el uso de algoritmos mejorados.
  • Тема - M.M.A
    Este artículo explora la teoría detrás de la digitalización del sonido en ZX Spectrum, centrándose en los procesos de muestreo y cuantificación. Proporciona ideas prácticas para convertir archivos de sonido utilizando hardware y software específicos. Además, ofrece métodos para mejorar la calidad del sonido trabajando dentro de las limitaciones del hardware.
  • Tema
    El artículo discute la iniciativa Save Our Scene destinada a unir a los usuarios y desarrolladores de Spectrum para promover la distribución de software y mejorar el desarrollo de la escena.
  • Estatuto de la Asociación Amazing Soft Making
    Discusión sobre el estatuto fundacional de la asociación Amazing Soft Making, detallando sus objetivos, criterios de membresía y principios operativos.
  • Teoría de la Creación de Revistas
    El artículo ofrece una guía detallada para aspirantes a creadores de revistas, centrándose en aspectos técnicos como diseño de interfaz, gestión de memoria, formato de texto e integración de música para publicaciones de ZX Spectrum.
  • Gota de Soldadura
    El artículo ofrece un relato personal sobre la compra y el uso del dispositivo General Sound para ZX Spectrum, detallando la instalación y el rendimiento del sonido. Discute los problemas iniciales encontrados y elogia la experiencia de audio mejorada en juegos compatibles. El autor alienta una mayor adaptación del software para el dispositivo y reflexiona sobre las capacidades multimedia con el uso simultáneo de hardware.
  • Gota de Soldadura
    El artículo discute las capacidades de Sound Forge 4.0c para el procesamiento de audio profesional en PC, destacando sus extensas características como la edición de sonido, efectos y herramientas de restauración.
  • SOFTWARE
    El artículo revisa los últimos desarrollos de software para el ZX Spectrum de Samara, incluyendo actualizaciones de MAXSOFT SCREEN PACKER, File Commander y nuevas aplicaciones como S-Terminal.
  • SOFTWARE - Card!nal
    Reseña y guía del juego de aventura gráfica lógica 'Operación R.R.' con instrucciones detalladas de nivel. Discusión sobre elementos del juego como la elección musical y el diseño gráfico. Menciona la participación del nuevo codificador MAX/CYBERAX/BINARY DIMENSION.
  • SOFTWARE
    Discusión sobre el estado actual y la evolución de la demoscena, destacando el auge de las intros de 4K y las próximas competiciones como FUNTOP'98.
  • CODING
    El artículo discute técnicas de programación en lenguaje ensamblador para optimizar el desplazamiento de pantalla en ZX Spectrum, con ejemplos de código y análisis de rendimiento.
  • CODING - RLA
    El artículo explora técnicas de manipulación de pila durante interrupciones de segundo tipo para efectos gráficos en ZX Spectrum. Se discuten soluciones para preservar la integridad de los datos cuando las interrupciones interrumpen las operaciones gráficas. Se proporcionan ejemplos prácticos para manejar problemas de pila de manera eficiente.
  • CODIFICACIÓN
    El artículo describe el empaquetador MS-PACK y su DEPACKER, detallando escenarios de uso y proporcionando ejemplos de código en BASIC y ensamblador para manejar archivos empaquetados. Se enfatiza la optimización del rendimiento al permitir la descompresión con interrupciones habilitadas y al separar el DEPACKER de los archivos empaquetados. Además, incluye ideas sobre técnicas de programación para cargar y ejecutar archivos BASIC en ZX Spectrum.
  • CODIFICACIÓN
    El artículo discute varias técnicas de codificación para ZX Spectrum, centrándose en el renderizado de sprites, algoritmos de rotación y métodos de optimización para mejorar el rendimiento.
  • OTRO MUNDO
    Discusión sobre la evolución de las tecnologías multimedia y su impacto en diversos campos, incluyendo la educación y el entretenimiento. Cubre los avances en hardware y software de computadoras que han facilitado la integración de audio, video y texto. El artículo reflexiona sobre desarrollos pasados y especula sobre el futuro de los sistemas multimedia.
  • OTRO MUNDO
    Comparación de sistemas PC y Amiga que destaca el rendimiento, costos de software y la experiencia del usuario con capacidades multimedia.
  • Lista de Honor
    Entrevista con PROGRESS que discute su trayectoria creativa en ZX Spectrum y AMIGA, abordando desafíos en la creación de demos y el estado actual de la escena.
  • Lista de Honor
    El artículo detalla las actividades y proyectos futuros del equipo de Eternity Industry, con sede en Kovrov, incluidas lanzamientos exitosos y colaboraciones con otros grupos.
  • Lista de Honor
    Discusión sobre el festival Artcomp'98, centrado en su formato por correo y pautas para varias competiciones, incluyendo categorías de demostración, gráficos y música.
  • Lista de Honor
    El artículo proporciona un glosario de términos utilizados en la escena demo, explicando roles como músico, programador y artista gráfico, así como diferentes tipos de demos y efectos. Sirve como un recurso útil para entender la terminología y la dinámica de la comunidad. Esta es una pieza descriptiva destinada a educar a los lectores sobre el argot de la escena demo.
  • Lista de Honor
    El artículo discute los problemas con el soporte del ratón en varias revistas de ZX Spectrum y las frustraciones de los usuarios al encontrar problemas de compatibilidad. Critica a los desarrolladores por no cumplir con los estándares, lo que lleva a malas experiencias para los usuarios. El autor expresa la importancia de mejoras consistentes en el software para la comunidad de ZX Spectrum.
  • Tablero de Honor
    El artículo discute el proceso de creación de imágenes tricolores para ZX Spectrum utilizando Photoshop y un enfoque simplificado. Describe cómo dividir una imagen en canales RGB y convertirlos para su uso en Spectrum. Además, ofrece consejos sobre cómo gestionar los archivos para obtener resultados óptimos.
  • Lista de Honor
    El artículo discute la comparación y las perspectivas sobre varios sistemas informáticos, enfatizando las fortalezas de AMIGA sobre PC y abogando por la apreciación de todas las máquinas.
  • Siete y media
    El artículo discute las absurdidades humorísticas y peculiaridades del entrenamiento militar y la academia, combinando sátira con anécdotas reales y observaciones ingeniosas.
  • Siete y medio
    El artículo ofrece un manual satírico sobre metodologías de programación, burlándose de la rigidez de las prácticas de programación formales y abogando por un enfoque más creativo en la codificación.
  • Siete y medio
    Instrucciones sobre prácticas de sexo seguro, incluyendo pautas sobre elegibilidad, preparación y acciones durante y después de la sesión sexual, además de cómo manejar situaciones de emergencia.
  • Siete y medio
    El artículo discute un llamado a un artista talentoso en Krasnodar para un grupo de ZX Spectrum, plantea preocupaciones sobre las prácticas poco éticas de Scorpion respecto a los derechos de software y critica un video de revisión de E'97.
  • Siete y medio
    El artículo 'Семь и 1/2' narra una divertida aventura de picnic con el equipo editorial de Deja Vu, destacando su camaradería y contratiempos mientras preparaban una barbacoa.
  • Prueba de la Pluma
    El artículo es una visión humorística de las aventuras ficticias de Winnie the Pooh mientras interactúa con computadoras y amigos, discutiendo las absurdidades de la tecnología y la vida diaria.
  • Primera pluma
    El artículo discute la nueva sección de Deja Vu dedicada a la literatura de fantasía y ciencia ficción, que presenta reseñas de libros y participación de los lectores en la creación de contenido.
  • Publicidad
    El artículo es una sección de anuncios de Deja Vu #05, promoviendo colaboraciones con diseñadores y músicos para futuros números, y ofreciendo varios programas y hardware para ZX Spectrum.
  • Noticias
    El artículo anuncia el lanzamiento de una nueva revista, AMIGA RULES, centrada en la computadora AMIGA, abordando la falta de publicaciones de calidad en ruso. Su objetivo es proporcionar información sobre programación, hardware, software y juegos, al tiempo que fomenta una comunidad entre los entusiastas de AMIGA. La revista incluirá contribuciones de los lectores y actualizaciones regulares sobre la escena AMIGA.