Deja Vu #05: КОДИРОВАНИЕ: Изучение Функциональности MS-PACK и DEPACKER

SoundTrack: !-0 ;)-: BY SECTOR AFTER INSTY
__________________________________________

(C) Max/CYBERAX Software
Дополнение: dAn!!L
__________________________________________

Речь пойдет о паковщике MS-PACK, а точнее о DEPACKER'е, который он присоединяет к упакованным файлам. В исходном виде UNPACKER MS-PACK'а должен работать при запрещенных прерываниях. Также не предусмотрена возможность его отделения от блока (например, в вашей программе много сжатых файлов и нет смысла всем из них иметь распаковщик - достаточно одного экземпляра). Работа с включенными прерываниями пригодится, если необходимо распаковать что-либо, не тормозя при этом музыку или анимацию. В этом случае музыка вешается на IM 2, а DEPACKER работает в основном режиме.

Для реализации всего вышеописанного и предназначены две следующие программы.

Первая программа - на бейсике. Она предназначена для отделения DEPACKER'a от скомпрессированного блока. При запуске она просит ввести имя файла (не более 7 букв). Затем она записывает на диск блок без распаковщика. К имени исходного файла добавляется апостроф. Длина полученного блока будет меньше, чем у блока с DEPACKER'ом на 247 байт.

1 INPUT "Name: ";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

Вторая программа - на ассемблере. Это и есть, собственно, DEPACKER. (Честно говоря, я так и не разобрался в алгоритме работы распаковщика. Я только заменил в нем все операции со стеком на операции с регистром IX, а также постарался уместить новый вариант DEPACKER'а в 256 байт.)

ORG 40000
;+---------------------------------------+
;|*** MS-PACK UNPACKER WITH INTERRUPT ***|
;|---------------------------------------|
;| Originally written by 'MICROSPACE', |
;| remixed by Max 'CYBERAX Software' |
;+---------------------------------------+
UNPACK LD C,16
LD B,C
LD D,3
EXX
LD HL,SOURCE
;Адрес запакованного блока без UNPACKER'а.
;(Откуда распаковывать)
;Блок должен быть получен предыдущей программкой на бейсике.
LD DE,BUF
LD BC,5
LDIR
PUSH HL
POP IX
LD DE,DESTIN
;Адрес в памяти, куда будет производиться
;распаковка.
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
;В случае,если вы будете использовать этот
;декомпрессор из бейсика, здесь желательно
;вставить команды восстановления регистра
;HL' (иначе бейсик сглючит...).
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

Адреса SOURCE и DESTIN выбираются не произвольно. Вернее произвольно, но по определенным правилам. Пусть длина исходного блока (незапакованного) равна LEN1, а длина упакованного (без UNPACKER'а) - LEN2. Возможны два случая:

1) Допустим задан адрес DESTIN, тогда адрес SOURCE может лежать в диапазоне от 16384 до DESTIN-LEN2 или в диапазоне от DESTIN+LEN1-LEN2 до 65536-LEN2.

2) Можно зафиксировать адрес SOURCE, тогда DESTIN может лежать в диапазоне от 16384 до SOURCE-LEN1+LEN2 или от SOURCE+LEN2 до 65536-LEN1.

Это справедливо при условии, что LEN1 больше LEN2 (т.е., если блок хоть немного, но сжался), в противном случае эти формулы не годятся. Более того, если от такого блока не отделять распаковщик, то последний вообще не сможет распаковать этот блок корректно (например, сбросится).

В заключении еще несколько слов.

Переделанный таким образом UNPACKER работает несколько медленнее оригинала (это еще без учета времени, занимаемого процедурой обработки IM 2). Если нужна максимальная скорость, можно поступить следующим образом: запускать оригинальный UNPACKER при разрешенных прерываниях...

Для этого необходимо отделить процедуру распаковки от блока и переделать ее начало аналогично моему варианту. При вызове нужно скорректировать параметры SOURCE и DESTIN так, чтобы расстояние между этими блоками увеличилось на столько байт, сколько заносит на стек обработчик IM 2 (или больше). Немного поясню. Оригинальный DEPACKER при запуске ставит стек на запакованный блок и начинает его распаковывать в адрес DESTIN, при этом распакованный блок растет вверх, а запакованный 'убегает' от него, уменьшаясь в длине. Байты запакованного блока снимаются командами POP. Самое интересное, что конец распакованного блока никогда не 'догонит' начало распаковывающегося, т.к. между ними оставлен зазор в 5 байт. Если мы искусственно увеличим этот зазор (изменив SOURCE или DESTIN), то сможем сохранять здесь регистры и адреса возвратов при обработке IM 2. Также отмечу, что второй способ я не проверял, а вот первый успешно работает в одной из моих программ.

* * *

В дополнение от редакции или как сделано в DEJA VU.

Чтобы недолго мучаться и не задавать вручную адреса и если вам не надо работать с разрешенными прерываниями, то выполняем следующие манипуляции:

1) Пакуем MS-PACK'ом кодовый файл и круто тащимся от коэффициента компрессии (если файлов несколько, то, конечно, пакуем их все).

2) Запускаем следующую программку на 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 "NEW:";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) Вводим имя запакованного MS-PACK'ом файла (строка 20), если такого файла нет, то ничего не произойдет, в противном случае запросится имя нового файла; после ввода имени запишется новый файл с адреса СТАРЫЙ АДРЕС+231, длиной СТАРАЯ ДЛИНА-231, т.е. на 231 байт короче!

4) Создаем универсальный депакер, ассемблируя в любимом ассемблере следующий листинг:

ORG #5B00

LL5B00 LDDR ;либо LDIR, см. ниже
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 ; либо DI
RET ;
NOP ; либо JP #nnnn NOP ;/
LL5BBC NOP
NOP
NOP
NOP
LL5BC0 NOP

;запуск депакера на входе hl=адрес файла без депакера
DEPACK DI
LD (LL5BB6),SP
EXX
LD (LL5BB2),HL
LD C,#10
LD B,C
LD D,#03
EXX
LD SP,HL
POP HL
LD (LL5BE2),HL
POP HL
LD DE,LL5BC0
LD BC,#0005
LDDR
POP HL
POP DE
POP BC
LD SP,#0000
LL5BE2 EQU $-#02
JP LL5B00

Комментарии: универсальный распаковщик занимает меньше 256 байт! Традиционно располагается в буфере принтера с адреса #5B00. (в этом случае адрес запуска будет равен #5BC1=метка DEPACK). На входе в пару HL необходимо задать адрес загруженного блока кодов без депакера (то, что получилось в пункте 3). Чтобы избежать проблем с наложением распаковывающихся данных на еще не распакованные, советую грузить файл по адресу, заданному в каталоге! Распаковка будет происходить в тот адрес, который был задан в MS-PACK'е.

Например, имеем запакованный MS-PACK'ом файл:

"FILE" CODE 49152,10000;

Обработав его BASIC'ом (пункты 2 и 3) получим новый файл без депакера:

"FILE+" CODE 49383,9769;

Чтобы распаковать данный файл, помещаем распаковщик по адресу #5B00 и распаковываем следующим образом:

LD HL,49383
JP #5BC1 ;метка DEPACK

Файл распакуется по адресу заданному при упаковке в MS-PACK'е (например #C000).

И, наконец, маленький нюанс - если при упаковке файл получился больше исходного (а такое может быть, если мы пакуем маленький файл или уже запакованный файл - это видно по коэффициенту компрессии заданному в процентах), то необходимо изменить депакер, по адресу #5B00 поместить не LDDR а LDIR! Таким образом имеет смысл паковать и маленькие файлы (2 сектора).

В итоге, если ориентироваться по количеству секторов то в 90% случаев удается сэкономить один сектор в файле!

Если использовать метод, который приводит MAX, то в 96% случаев экономим один сектор! А самое главное - есть возможность выбора! MS-PACK хорошо пакует небольшие текстовые файлы. Если вы пакуете большие кодовые блоки, то используйте HRUST 1.0, наверняка он покажет лучший результат, да и возможность сохранения файла без упаковщика предусмотрена автором.

Дальше передаю слово MAX'у.

------------------------------------------
******************************************
------------------------------------------

Загрузка и запуск бейсик-файлов.

Думаю, все знают, как в boot'ах обычно запускаются программы. Имя файла кидается в строку бейсика (вместо пробелов в команде RUN " "), затем эта строка запускается. В данной статье я расскажу, как можно загрузить и запустить бейсик-программу без использования подобного рода фокусов. Программа в листинге написана с активным использованием фрагментов ПЗУ TR-DOS, поэтому не удивляйтесь ее корявому виду.

Пусть есть конкретный файл, который нужно запустить. Также допустим, что мы знаем заголовок этого файла (16 байт). Для загрузки будем использовать некий драйвер, умеющий читать 'B' секторов в адрес 'HL' с дорожки и сектора 'DE' (метка LOAD). Опосля загрузки, драйвер должен заносить последний трек и сектор в переменную #5CF4. CLEAR желательно иметь установленным на 65367. Первым делом перекинем заголовок в адрес HEADER, равный 23773. Номер файла желательно занести в #5D1E. Затем запускаем следующую прогу:

BAS_RUN LD DE,(23635);начало бейс. пр. LD HL,(23641);обл. ред. строки DEC HL PUSH HL PUSH DE AND A SBC HL,DE ;в HL получили длину старой бейсик-проги, ;т.е. той, что находится (или не находится) ;в памяти до загрузки. LD DE,(HEADER+9) ;в DE взяли из заголовка длину нового бейсика, т.е. того, который нужно грузить. PUSH DE PUSH HL LD HL,5 ADD HL,DE ;длину новой проги увеличили на 5 байт. LD (23771),HL ;засунули в переменную, как в TR-DOS. POP HL POP BC POP DE POP HL PUSH BC CALL #19E5 ;удаляем старый бейсик, сдвигая память. POP BC CALL #1655 ;резервируем место для нового. INC HL LD BC,(HEADER+11) ;взяли из заголовка длину нового бейсика ;без программных переменных. ADD HL,BC ;прибавили адрес начала. LD (23627),HL ;установили системную переменную VARS. LD HL,(23635) ;HL - куда будем грузить. LD A,(23772) ;старший байт длины. LD B,A LD DE,(HEADER+14) ;DE - трек и сектор. LD (#5CF4),DE DEC B INC B CALL NZ,LOAD ;если есть что грузить - грузим. LD A,(23771) AND A JR Z,NOLOW ;равен ли нулю младший байт длины? PUSH HL LD DE,(#5CF4) LD HL,BUF LD B,1 CALL LOAD ;грузанули последний сектор в буфер. POP DE LD BC,(23771) LD B,0 LD HL,BUF LDIR ;остаток перебросили куда надо. NOLOW LD HL,(23641) DEC HL LD (HL),128 ;занесли на всякий случай маркер конца. INC HL INC HL LD E,(HL) INC HL LD D,(HL) ;взяли строку автостарта LD (23618),DE ;и занесли ее в соотв. переменную. XOR A LD (23620),A ;занулили номер оператора в строке. LD (23824),A CALL #16B0 ;точно не помню что такое, кажется очистка ;стека калькулятора. LD HL,(23635) DEC HL LD (23639),HL ;сделали 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) ;прочие установки. JP 7037;запуск... BUF DEFS 256;буфер загрузки.

Располагать сию программу лучше в экранной области. Неплохо бы почистить скрин перед передачей управления в ПЗУ, как это делает TR-DOS. Например, вместо JP 7037:

LD HL,7037
PUSH HL
JP 3435

В заключении хочу выразить благодарность Федину П.Ю. за книгу "Полное описание и полный дизассемблер TR-SOS 5.04T (5.03)".

Оглавление издания: Deja Vu #05

  • Аперативчик - Max
    Подробные инструкции по управлению интерфейсом DEJA VU, выделены разные методы ввода и команды навигации. Объяснение новых и старых интерфейсов для улучшенного пользовательского опыта. Обсуждение дополнительных функций, таких как фреймовый скроллинг и управление музыкой.
  • Аперативчик - Max
    Обсуждение поддержки машин с памятью более 128к, что привело к наличию отдельных оболочек для систем 128к и 256к. Тестирование проводилось в основном на Scorpion и Profi, предполагается работа на других моделях. Статья содержит инструкции по распаковке исходников и информацию об использовании улучшенных алгоритмов.
  • Тема - M.M.A
    Статья исследует теорию оцифровки звука на ZX Spectrum, акцентируя внимание на процессах дискретизации и квантования. Она предлагает практические советы по конвертации звуковых файлов с использованием определенного оборудования и программного обеспечения. Также даются методы улучшения качества звука с учетом аппаратных ограничений.
  • Тема
    Статья обсуждает инициативу Save Our Scene, направленную на объединение пользователей и разработчиков Spectrum для продвижения дистрибуции ПО и улучшения развития сцены.
  • Устав Ассоциации Amazing Soft Making
    Обсуждение устава ассоциации Amazing Soft Making, в котором изложены ее цели, критерии членства и принципы функционирования.
  • Теория Журналостроения
    Статья содержит подробное руководство для начинающих создателей журналов, сосредотачиваясь на технических аспектах, таких как дизайн интерфейса, управление памятью, форматирование текста и интеграция музыки для публикаций на ZX Spectrum.
  • Капля припоя
    Статья представляет личный опыт покупки и использования устройства General Sound для ZX Spectrum, описывая установку и качество звука. Обсуждаются первоначальные проблемы и восхищение улучшенным звуковым сопровождением в совместимых играх. Автор призывает к дальнейшей адаптации программного обеспечения для устройства и размышляет о мультимедийных возможностях с одновременным использованием оборудования.
  • Капля припоя
    Статья описывает возможности Sound Forge 4.0c для профессиональной обработки звука на ПК, подчеркивая его обширные функции, такие как редактирование звука, эффекты и инструменты восстановления.
  • SOFTWARE
    Статья рассматривает последние разработки программного обеспечения для ZX Spectrum из Самары, включая обновления MAXSOFT SCREEN PACKER, File Commander и новые приложения, такие как S-Terminal.
  • SOFTWARE - Card!nal
    Обзор и прохождение логической графической приключенческой игры 'Операция Р.Р.' с подробными инструкциями по уровням. Обсуждение элементов игры, таких как выбор музыки и графический дизайн. Упоминается участие нового кодера MAX/CYBERAX/BINARY DIMENSION.
  • SOFTWARE
    Обсуждение текущего состояния и эволюции демосцены, подчеркивающее рост 4K интро и предстоящие конкурсы, такие как FUNTOP'98.
  • CODING
    Статья обсуждает техники кодирования на ассемблере для оптимизации прокрутки экрана на ZX Spectrum, включает примеры кода и анализ производительности.
  • CODING - RLA
    Статья рассматривает методы манипуляции со стеком при прерываниях второго рода для графических эффектов на ZX Spectrum. Обсуждаются решения для сохранения целостности данных, когда прерывания нарушают графические операции. Приведены практические примеры для эффективного решения проблем со стеком.
  • КОДИРОВАНИЕ
    Статья описывает паковщик MS-PACK и его DEPACKER, детализируя сценарии использования и предоставляя примеры кода на BASIC и ассемблере для работы с упакованными файлами. Подчеркивается оптимизация производительности, позволяющая распаковку с включенными прерываниями и отделение DEPACKER от упакованных файлов. Дополнительно включены идеи о техниках программирования для загрузки и выполнения BASIC-файлов на ZX Spectrum.
  • КОДИРОВАНИЕ
    Статья обсуждает различные техники кодирования для ZX Spectrum, сосредоточиваясь на выводе спрайтов, алгоритмах поворота и методах оптимизации для повышения производительности.
  • ДРУГОЙ МИР
    Обсуждение эволюции мультимедийных технологий и их влияния на различные области, включая образование и развлечения. Охватываются достижения в аппаратном и программном обеспечении, которые способствовали интеграции аудио, видео и текста. Статья отражает прошлые достижения и предполагает будущее мультимедийных систем.
  • АНО ДРУГОЙ МИР
    Сравнение систем PC и Amiga, подчеркивающее производительность, стоимость программного обеспечения и пользовательский опыт с мультимедийными возможностями.
  • Доска почета
    Интервью с PROGRESS обсуждает их творческий путь на ZX Spectrum и AMIGA, касаясь проблем в демомейкинге и текущего состояния сцены.
  • Доска почета
    Статья описывает деятельность и будущие проекты команды Eternity Industry из Коврова, включая успешные релизы и сотрудничество с другими группами.
  • Доска почета
    Обсуждение фестиваля Artcomp'98, сосредоточенное на его формате участия по почте и правилах для различных конкурсов, включая демо, графику и музыку.
  • Доска почета
    Статья представляет собой глоссарий терминов, используемых в демосцене, объясняя роли, такие как музыкант, программист и художник, а также различные типы демо и эффектов. Она служит полезным ресурсом для понимания терминологии и динамики сообщества. Это описание, направленное на просвещение читателей о жаргоне демосцены.
  • Доска почета
    Статья обсуждает проблемы с поддержкой мыши в различных изданиях ZX Spectrum и разочарование пользователей при столкновении с несовместимостями. Критика разработчиков за несоблюдение стандартов приводит к плохому пользовательскому опыту. Автор подчеркивает важность постоянного улучшения программного обеспечения для сообщества ZX Spectrum.
  • Доска почета
    Статья обсуждает процесс создания триколорных изображений для ZX Spectrum с использованием Photoshop и упрощенного подхода. Описывается, как разделить изображение на RGB-каналы и конвертировать их для использования на Spectrum. Также даны советы по управлению файлами для достижения оптимальных результатов.
  • Доска почета
    Статья обсуждает сравнение и перспективы различных компьютерных систем, акцентируя внимание на сильных сторонах AMIGA по сравнению с PC и призывая ценить все машины.
  • Семь и 1/2
    Статья обсуждает юмористические абсурдности и особенности военного обучения и академической жизни, сочетая сатиру с реальными анекдотами и остроумными наблюдениями.
  • Семь и 1/2
    Статья представляет собой сатирический мануал по методологиям программирования, высмеивая жесткость формальных практик программирования и выступая за более креативный подход к коду.
  • Семь и 1/2
    Инструкция по технике безопасного секса, включая рекомендации по допуску, подготовке, действиям во время и после сеанса, а также действиям в аварийных ситуациях.
  • Семь и 1/2
    Статья обсуждает призыв к талантливому художнику в Краснодаре для группы ZX Spectrum, поднимает вопросы об unethical практике Scorpion по правам на софт и критикует видеообзор E'97.
  • Семь и 1/2
    Статья 'Семь и 1/2' описывает забавное приключение пикника команды редакторов Deja Vu, подчеркивая их товарищество и неудачи при приготовлении шашлыка.
  • Проба пера
    Статья представляет собой юмористическое описание вымышленных приключений Винни-Пуха в взаимодействии с компьютерами и друзьями, обсуждая абсурдность технологий и повседневной жизни.
  • Проба пера
    Статья посвящена новому разделу журнала Deja Vu, посвященному литературе фэнтези и фантастики, включая обзоры книг и участие читателей в создании контента.
  • Реклама
    Статья является рекламной секцией журнала Deja Vu #05, предлагая сотрудничество с дизайнерами и музыкантами для будущих выпусков, а также предлагая различные программное обеспечение и оборудование для ZX Spectrum.
  • Новости
    Статья объявляет о запуске нового журнала AMIGA RULES, посвященного компьютеру AMIGA, на фоне нехватки качественных русскоязычных изданий. Он направлен на предоставление информации о программировании, аппаратном обеспечении, программном обеспечении и играх, а также на формирование сообщества среди поклонников AMIGA. Журнал будет включать материалы от читателей и регулярные обновления о сцене AMIGA.