Полное описание и дизассемблер ПЗУ TR-DOS 5.04T (5.03) 1995 г.

Глава 11 - полный дизассемблер ПЗУ TR-DOS 5.04T. (адреса 7587-8501).


Адрес 7587. Печать числа из регистра A. Используется также с ад-
ресов 7588 (печать числа из регистра C) и 7593 (печать числа из
регистра BC).

7587  LD C,A    ;переброска числа в C
7588  LD B,0    ;перевод числа в двухбайтную форму
      JP 7593   ;странная команда!
7593  PUSH BC   ;сохранение числа
      CALL 8433 ;изменение памяти
      POP BC    ;восстановление числа
      RST 24    ;печать числа
      DEFW #1A1B
      CALL 8433 ;восстановление памяти
      RET       ;возврат
────────────────────────────────────────────────────────────────
Адрес 7605. Снятие строки со стека калькулятора. В DE будет ад-
рес строки, в BC - ее длина.

7605  RST 32
      DEFW #2BF1
      RET
────────────────────────────────────────────────────────────────
Адрес 7613. Помещение строки на стек калькулятора. Установите
23645 на начало строки.

7613  RST 32
      DEFW #1C8C
      RET
────────────────────────────────────────────────────────────────
Адрес 7617. Помещение числа из BC на стек калькулятора.

7617  RST 32
      DEFW #1C82
      RET
────────────────────────────────────────────────────────────────
Адрес 7621. Установка CH_ADD на второй символ строки. Установи-
те 23825.

7621  LD HL,(23825);берем адрес строки команды
      INC HL       ;берем адрес ее второго символа
      LD (23645),HL;помещаем его в CH_ADD
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 7629. Принятие 2-х строк на стек калькулятора. Поместите в
23825 адрес первой строки.

7629  CALL 7647 ;прием первой строки на стек калькулятора
      CALL 7564 ;берем текущий символ
      CP ","    ;это запятая ?
      JP NZ,7450;если нет, то ошибка
      CALL 7722 ;следующий символ
      CALL 7613 ;прием второй строки на стек калькулятора
      RET       ;возврат
────────────────────────────────────────────────────────────────
Адрес 7647. Установка CH_ADD и помещение строки на стек кальку-
лятора. Установите 23825.

7647  CALL 7621 ;установка CH_ADD
      JP 7613   ;помещение строки на стек калькулятора
────────────────────────────────────────────────────────────────
Адрес 7653. Принятие одного или двух чисел после символа CODE.
Первое число будет в 23769, второе - в 23771. Если было одно
число, то оно будет в обоих ячейках. Если принято 2 числа, то в
23766 будет 3. На входе установите 23645 и 23611. Используется
также с адреса 7691 (принятие числа; установите 23645 и 23611;
число будет в 23771, а в 23766 будет 3).

7653  CALL 7564    ;берем текущий символ строки
      CP 175       ;это CODE ?
      RET NZ       ;если нет, то возврат
      CALL 7547    ;принятие числа на стек калькулятора
      JR Z,7675    ;если идет проверка на синтаксис, то дальнейшая проверка
      CALL 7609    ;снятие числа со стека калькулятора
      LD (23769),BC;установка первого числа
      LD (23771),BC
7675  CALL 7564    ;берем текущий символ
      CP ","       ;это запятая ?
      JR Z,9691    ;если да, то принятие второго числа
      CP 13        ;это ENTER ?
      JP NZ,7450   ;если нет, то ошибка
      CALL 7541    ;если строка проверяется на синтаксис, то возврат
      RET          ;возврат
7691  CALL 7547    ;прием второго числа на стек калькулятора
      RET Z        ;если проверка на синтаксис, то возврат
      CALL 7609    ;снятие числа со стека калькулятора
      LD (23771),BC;помещение его в 23771
      LD A,3       ;приняли 2 числа
      LD (23766),A
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 7708. Удаление из командной стpоки пятибайтных чисел

7708  LD HL,(23825);берем адрес строки команды
      RST 32       ;удаление из нее пятибайтных чисел
      DEFW #11A7
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 7715. Выделение пространства в рабочей области. В BC по-
местите длину требуемого пространства.

7715  LD HL,(23649);загрузка HL из 23649
      RST 32       ;выделение пространства
      DEFW #0030
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 7722. Выборка следующего символа строки. Установите 23645.

7722  RST 32
      DEFW #0020
      RET
────────────────────────────────────────────────────────────────
Адрес 7726. Удаление области памяти. В HL поместите начало об-
ласти, в DE - длину.

7726  RST 32
      DEFW #19E8
      RET
────────────────────────────────────────────────────────────────
Адрес 7734. Загрузка регистра дорожки. Установите 23761. При вы-
ходе по ошибке в 23831 помещается 255. Можно использовать с адр-
еса 7738 для прямого вывода в порт 63.

7734  CALL 16050;определение номера дорожки, на которой стоит головка
      LD A,H    ;установка регистра дорожки
7738  OUT (63),A
      RET       ;возврат
────────────────────────────────────────────────────────────────
Адрес 7741. Загрузка секторов. Вход: в HL - адрес загрузки,
в D - номер дорожки, в E - номер сектора, в B - кол-во секторов.

7741  XOR A  ;признак загрузки
      JR 7780;переход к подпрограмме загрузки / записи секторов
────────────────────────────────────────────────────────────────
Адрес 7744. Запись информации о файле. На входе в C должен быть
номер файла. Используется также с адресов:
7747 - запись сектора из буфера. Вход: в 23796 установите номер
сектора+1, а в 23797 - номер дорожки.
7757 - запись секторов. В HL - адрес, в D - номер дорожки, в E -
номер сектора, в B - кол-во секторов.
7780 - загрузка / запись секторов. Предварительные установки
как и для предыдущей подпрограммы плюс в A установите 0 для заг-
рузки или что-нибудь другое для записи.

7744  CALL 5739    ;чтение сектора с описателем файла и замена описателя
7747  LD DE,(23796);берем номер сектора для записи
      DEC DE
      LD B,1       ;записывать 1 сектор
      LD HL,23845  ;записывать будем из буфера
7757  PUSH HL      ;сохраним адрес секторов на диске и в памяти
      PUSH DE
      CALL 15889   ;берем тип дисковода
      BIT 7,(HL)   ;он 40-дорожечный ?
      JR Z,7776    ;если да, то записывать можно
      BIT 0,(HL)   ;используем 40 дорожек на 80-дорожечном ?
      JR NZ,7776   ;если нет, то записывать можно
      LD HL,10712  ;адрес сообщения READ ONLY
      JP 7465      ;переход на обработку ошибок

Внимание, ошибка!!! В аккумуляторе забыли установить код ошибки.

7776  POP DE       ;восстановление адресов секторов
      POP HL
7778  LD A,255     ;признак записи
7780  LD (23758),A ;установка признака операции
7783  LD (23796),DE;установка адреса секторов на диске
      PUSH BC      ;сохранение количества секторов
      PUSH HL      ;и адреса загрузки / записи
      CALL 7734    ;чтение индексной области дорожки
      POP HL       ;восстановление адреса загрузки / записи
      POP BC       ;и количества секторов
      XOR A        ;количество секторов равно 0 ?
      OR B
      RET Z        ;если да, то возврат
7797  PUSH BC      ;сохраняем адрес и кол-во секторов
      PUSH HL
      CALL 16134   ;установка адреса загрузки / записи секторов
      LD A,(23796) ;установка номера сектора
      CALL 16130
      LD A,(23797) ;позиционирование головки на дорожку
      CALL 15971
      LD A,(23758) ;берем флаг операции
      OR A         ;загрузка?
      PUSH AF
      CALL Z,16142 ;если да, то загрузка сектора
      POP AF
      CALL NZ,16138;иначе запись сектора
      POP HL       ;берем адрес следующего сектора
      LD DE,256
      ADD HL,DE
      PUSH HL      ;сохраняем его
      LD A,16      ;на дорожке 16 секторов
      LD HL,23796
      INC (HL)     ;следующий сектор
      CP (HL)      ;конец дорожки ?
      JR NZ,7847   ;если да, то номер следующего сектора 0
      LD (HL),0
      LD HL,23797  ;и берем следующую дорожку
      INC (HL)
7847  POP HL       ;восстановление адреса следующего сектора
      POP BC       ;и количества секторов
      DJNZ 7797    ;если не все, то повтор
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 7852. Вычисление количества полных секторов файла из его
длины в байтах. В A должно быть количество секторов файла, а в
DE - длина загружаемой части файла.

7852  PUSH HL    ;сохранение HL
      LD H,A     ;берем полную длину файла
      LD L,0
      PUSH HL    ;сохраняем ее
      SBC HL,DE  ;она меньше длины загрузки ?
      CALL C,7868;если да, то загружать весь файл
      POP HL     ;восстановление полной длины файла
      LD A,H     ;вычисление количества полных секторов из полной длины файла
      POP HL     ;восстановление HL
      RET C      ;если полная длина файла больше длины загрузки,
      LD A,D     ;то количество полных секторов берем из длины загрузки
      RET        ;возврат
────────────────────────────────────────────────────────────────
Адрес 7868. Обнуление 23766 и установка флага C.

7868  XOR A
      LD (23766),A
      SCF
      RET
────────────────────────────────────────────────────────────────
Адрес 7874. Выполнение команды FORMAT. Установите 23825 и 23611.
Используется также с адреса 7901 (повтор форматирования; устано-
вите 23773).

7874  LD HL,65535
      LD (23767),HL;дорожки не проверять
      LD (23769),HL;форматировать одну сторону диска
      LD (23761),HL;ошибку при чтении адресного маркера игнорировать
      CALL 1067    ;следующий символ ENTER ?
      JP Z,7450    ;если да, то ошибка
      CALL 7647    ;прием имени диска на стек калькулятора
      CALL 7541    ;если идет проверка на синтаксис, то возврат
      CALL 7255    ;установка имени диска
7901  CALL 12800   ;выбор быстрого или обычного формата
      AND 128      ;дисковод 40-дорожечный ?
      LD A,40      ;форматировать 40 дорожек
      JR Z,7192    ;если дисковод 80-дорожечный,
      LD A,80      ;то форматировать 80 дорожек
7192  LD (23767),A ;установка количества дорожек
      CALL 15768   ;восстановление
      CALL 8182    ;выбор нижней стороны диска
      CALL 16032   ;задержка в 2168937 тактов
      LD E,1       ;форматирование дорожки с номером 1
      CALL 8189
      CALL 8171    ;выбор верхней стороны диска
      LD E,0       ;форматирование дорожки с номером 0
      CALL 8189
      LD A,(23773) ;форматировать только одну сторону диска
      CP "$"
      JR Z,7963    ;если да, то форматирование диска
      CALL 8182    ;выбор нижней стороны диска
      CALL 16032   ;задержка в 2168937 тактов
      CALL 16053   ;чтение адресного маркера
      LD A,H       ;номер дорожки - 1 ?
      CP 1
      JR NZ,7963   ;если нет, то форматирование диска
      LD A,128     ;форматировать обе стороны диска
      LD (23770),A
7963  CALL 8381    ;форматирование диска
      LD HL,23845  ;адрес начала буфера
      LD (HL),0    ;очистка первого байта
      LD DE,23846  ;адрес второго байта буфера
      LD BC,255    ;осталось очистить 255 байтов
      LDIR         ;очистка буфера
      LD BC,23767  ;адрес переменной с количеством дорожек
      LD DE,23770  ;адрес переменной с количеством сторон
      LD A,(BC)    ;форматировали 80 дорожек ?
      CP 80
      JR Z,8009    ;если да, то диск 80-дорожечный
      LD A,(DE)    ;форматировали 2 стоpоны ?
      CP 128
      JR Z,8002    ;если да, то диск 40-дорожечный двухстоpонний
      LD A,25      ;диск 40-дорожечный односторонний
      LD HL,624    ;свободно 624 сектора
      JR 8021      ;создание описателя диска
8002  LD A,23      ;диск 40-дорожечный двухсторонний
8004  LD HL,1264   ;свободно 1264 сектора
      JR 8021      ;создание описателя диска
8009  LD A,(DE)    ;форматировали 2 стороны ?
      CP 128
      LD A,24      ;если нет, то диск 80-дорожечный односторонний
      JR NZ,8004
      LD A,22      ;иначе диск 80-дорожечный двухсторонний
      LD HL,2544   ;свободно 2544 сектора
8021  LD (24072),A ;установка типа диска
      LD (24074),HL;установка количества свободных секторов
      LD A,1       ;первая свободная дорожка - 1
      LD (24071),A
      LD A,16      ;признак принадлежности диска к TR-DOS
      LD (24076),A
      LD HL,24079  ;9 байтов 32 с адреса 24079
      LD DE,24080
      LD BC,8
      LD (HL),32
      LDIR
      LD HL,23773  ;установка имени диска
      LD DE,24090
      LD BC,8
      LDIR
      CALL 8171    ;выбор верхней стороны диска
      LD B,1       ;записать 1 сектор
      LD DE,8      ;сектор 8 дорожки 0
      LD HL,23845  ;из буфера
      CALL 7778    ;запись сектора
      LD A,(23766) ;берем количество дефектных секторов
      PUSH AF      ;сохраняем его
      XOR A        ;расширение - CHR$ 0
      CALL 12996   ;установка расширения и очистка низа экрана
      LD HL,(24074);берем количество свободных секторов
      LD (23767),HL;сохраняем его
      LD HL,23773  ;печать имени диска
      RST 24
      LD A,13      ;перевод строки
      RST 16
      LD HL,(23767);восстановление количества свободных секторов
      POP AF       ;восстановление количества дефектных секторов
      PUSH HL      ;сохранение количества свободных секторов
      LD D,0       ;перевод количества дефектных секторов в
      LD E,A       ;двухбайтную форму
      SBC HL,DE    ;вычисление количества хороших секторов
      LD B,H       ;переброска его в BC
      LD C,L
      CALL 7593    ;печать его
      LD A,"/"     ;печать "/"
      RST 16
      POP BC       ;восстановление количества свободных секторов
      CALL 7593    ;печать его
      JP 12907     ;запрос повтора форматирования
────────────────────────────────────────────────────────────────
Адрес 8121. Таблица секторов для форматирования обычного диска.
Используется также с адреса 8122 для проверки дорожки.

8121  DEFB 1
8122  DEFB 9,2,10,3,11,4,12,5,13,6,14,7,15,8,16,1
────────────────────────────────────────────────────────────────
Адрес 8138. Определение количества дорожек дисковода. Вход: ус-
тановите время перемещения головки дисковода. Выход: в 23767 и
регистре A будет количество дорожек дисковода.

8138  CALL 15880  ;берем время перемещения головки
      OR 17       ;позиционирование на дорожку 50
      LD B,A
      LD A,50
      CALL 15940
      LD A,2      ;затем на дорожку 2
      CALL 15940
      CALL 15869  ;задержка в 725779 тактов
      IN A,(31)   ;головка в исходном положении ?
      AND 4
      LD A,80     ;если нет, то у дисковода 80 дорожек
      JR Z,8167
      LD A,40     ;иначе 40
8167  LD (23767),A;установка количества дорожек
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 8171. Выбор верхней стороны диска. Установите 23830. Ис-
пользуется также с адреса 8176 (загрузка системного регистра,
код - в аккумуляторе). Вы можете также использовать с адреса
8179 для прямого вывода в порт 255.

8171  LD A,(23830);берем копию системного регистра
      OR 60       ;формат MFM, верхняя сторона, выключение сброса и готовности
8176  LD (23830),A;запоминаем копию системного регистра
8179  OUT (255),A ;установка системного регистра
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 8182. Выбор нижней стороны диска. Установите 23830.

8182  LD A,(23830);берем копию системного регистра
      AND 111     ;формат MFM, нижняя сторона, выключение сброса и готовности
      JR 8176     ;установка системного регистра
────────────────────────────────────────────────────────────────
Адрес 8189. Форматирование дорожки. В регистр Е поместите ее но-
мер и спозиционируйте головку дисковода. Из переменных установи-
те 23768, 23782, 23784 и обнулите 23766. Используется также с
адреса 8137 (проверка дорожки; установите 23768, 23784 и обнули-
те 23766 и спозиционируйте головку).

8189  DI           ;запрет прерываний
      LD A,244     ;запись дорожки
      OUT (31),A
      LD HL,(23782);берем адрес таблицы секторов для форматирования
      LD C,127     ;адрес регистра данных
8199  LD B,10      ;10 раз 78 (первый пробел)
      LD D,78
      CALL 8369    ;запись байта заданное число раз
      LD B,12      ;синхропромежуток
      LD D,0
      CALL 8369
      LD B,3       ;синхроимпульс
      LD D,245
      CALL 8369
      LD D,254     ;1 раз 254 (адресная метка идентификатора)
      CALL 8367    ;запись байта 1 раз
      LD D,E       ;номер дорожки
      CALL 8367
      LD D,0       ;номер стороны (в TR-DOS всегда 0)
      CALL 8367
      LD D,(HL)    ;номер сектора из таблицы
      CALL 8367
      LD D,1       ;длина сектора - 256 байтов
      CALL 8367
      LD D,247     ;запись контрольной суммы
      CALL 8367
      LD B,22      ;второй пробел
      LD D,78
      CALL 8369
      LD B,12      ;синхропромежуток
      LD D,0
      CALL 8369
      LD B,3       ;синхроимпульс
      LD D,245
      CALL 8369
      LD D,251     ;адресная метка данных
      CALL 8367
      LD B,0       ;данные (256 нулей)
      LD D,0
      CALL 8369
      LD D,247     ;запись контрольной суммы
      CALL 8367
      LD B,60      ;третий пробел
      LD D,78
      CALL 8369
      LD A,(HL)    ;берем адрес номера следующего сектора
      INC HL
      CP 16        ;конец таблицы ?
      JR NZ,8199   ;если нет, то форматирование следующего сектора
      LD B,0       ;пробел до конца дорожки
      CALL 8369
      JP M,8310
      CALL 8369
8310  IN A,(31)    ;берем состояние контроллера
      AND 64       ;запись запрещена ?
      JP NZ,16185  ;если да, то сообщение READ ONLY
8317  LD A,(23768) ;дорожку проверять ?
      OR A
      RET NZ       ;если нет, то возврат

Внимание!!! Перед возвратом или выходом по ошибке надо разрешать
прерывания.

      LD C,127     ;адрес регистра данных
      LD A,E       ;установка номера дорожки
      OUT (63),A
      LD HL,(23784);берем адрес таблицы секторов для проверки
8330  LD B,3       ;3 попытки
      LD A,(HL)    ;берем номер сектора из таблицы
      OUT (95),A   ;установка сектора
      PUSH HL      ;сохранение адреса таблицы секторов
8336  DI           ;запрет прерываний
      LD A,128     ;чтение сектора
      OUT (31),A
      PUSH BC      ;сохранение количества попыток
      CALL 16357   ;чтение данных по адресу из HL (в пзу, не страшно)
      IN A,(31)    ;все в порядке ?
      AND 127
      POP BC       ;восстановление счетчика попыток
      JR Z,8358    ;если все в порядке, то следующий сектор
      DJNZ 8336    ;следующая попытка
      LD HL,23766  ;есть 1 битый сектор
      INC (HL)
8358  POP HL       ;восстановление адреса таблицы секторов
      LD A,(HL)    ;берем номер текущего сектора
      INC HL       ;берем адрес номера следующего сектора
      CP 1         ;конец таблицы ?
      JR NZ,8330   ;если нет, то повтор
      EI           ;разрешение прерываний
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 8367. Запись байта 1 pаз. В регистр D поместите байт, в
C - 127 и выдайте команду записи на вг-93. Используется также с
адреса 8369 (запись байта несколько раз; все для 8367 плюс в B
количество выдач).

8367  LD B,1    ;запись 1 раз
8369  IN A,(255);ожидание DRQ или INTRQ
      AND 192
      JR Z,8369
      RET M     ;если поступил INTRQ, то возврат
      OUT (C),D ;выдача байта
      DJNZ 8369 ;повтор до конца
      RET       ;возврат
────────────────────────────────────────────────────────────────
Адрес 8381. Форматирование диска. Установите 23770, 23767,
23782 и 23784.

8381  LD HL,23767 ;берем число форматируемых дорожек
      LD B,(HL)
      XOR A       ;дорожки проверять
      INC HL
      LD (HL),A
      LD E,255    ;начнем с дорожки 0
      PUSH BC     ;сохранение количества дорожек
8390  INC E       ;следующая дорожка
      LD A,E
      LD B,27     ;позиционирование
      CALL 15940
      CALL 8171   ;выбор верхней стороны диска
      CALL 13021  ;печать номера дорожки и форматирование ее
      LD A,(23770);берем флаг количества сторон
      CP 128      ;форматировать 2 стороны ?
      JR NZ,8417  ;если да, то
      CALL 8182   ;выбор нижней стороны диска
      CALL 13071  ;печать номера дорожки и форматирование ее
8417  POP BC      ;восстановление количества дорожек
      DJNZ 8390   ;если еще не все, то повтор
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 8421. Удаление буфера с изменением памяти. На входе уста-
новите переменные 23734, 23800, 23820 и 23832. Выход: в 23832
записывается 255, а если в 23820 выл 0, то туда также засылается
255. Используется также с адреса 8433 (изменение памяти, работа-
ет только с 23734 и 23832).

8421  PUSH AF     ;сохранение AF
      LD A,(23800);ничего не делать ?
      CP 255
      JR Z,8476   ;если да, то возврат
      POP AF      ;восстановление AF
      CALL 10608  ;удаление буфера
8433  PUSH AF     ;сохранение AF
      LD A,(23734);изменение разрешено ?
      CP 244
      JR Z,8476   ;если нет, то возврат
      XOR A
      LD HL,23832 ;подтверждение есть ?
      OR (HL)
      LD (HL),255 ;в следующий раз подтверждение будет
      JR Z,8476   ;если его не было, то возврат
      LD A,(23820);буфер есть ?
      OR A
      LD HL,23747 ;начало первого блока
      LD DE,23859 ;начало второго блока
      JR NZ,8465  ;если есть буфер, то второй блок смещен на 257
      LD DE,24116 ;байтов
8465  LD B,45     ;длина блоков - 45 байтов
8467  LD C,(HL)   ;меняем блоки местами
      LD A,(DE)
      LD (HL),A
      LD A,C
      LD (DE),A
      INC HL
      INC DE
      DJNZ 8467
8476  POP AF      ;восстановление AF
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 8478. Очистка буфера редактора.

8478  LD HL,(23641);берем адрес буфера редактора
      LD (HL),13   ;ENTER
      LD (23643),HL;установка курсора
      INC HL       ;конец области
      LD (HL),128
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 8490. Восстановление командной строки. Установите 23840.

8490  LD DE,(23641);символы переносить в буфер редактора
      LD HL,23840  ;из 23840
      CALL 688     ;перенос символов
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 8501. Принятие команды. Установите 23823 и если там не 0,
то и 23840.

8501  LD A,(23823) ;ошибка была ?
      OR A
      PUSH AF      ;сохранение результата проверки
      CALL NZ,8490 ;если да, то восстановление первых трех символов

Не надо этого делать!!! COPY портит буфер по адресу 23840, а бу-
фер редактора всегда остается цел.

      POP AF       ;восстановление результата проверки
      CALL Z,8478  ;если ошибки не было, то стирание старой строки
      LD HL,(23641);эта команда тоже не нужна
      CALL 15744   ;перевод строки
      LD A,(23833) ;берем номер дисковода по умолчанию
      ADD A,"A"    ;печать его имени
      RST 16
      LD A,">"     ;печать ">"
      RST 16
      LD HL,23610  ;для нормального выхода из редактора
      LD (HL),255
      JP 7568      ;ввод команды и возврат




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От редакции - Поздpавляю вас с наступающим пpаздником!
Добро пожаловаться - о первом номере газеты.
Праздник - Вот и закончился 1997 год...
Самиздат - "Незаконнорождённый АльХимик доктор Фауст Пернатый Змей" №1.
DIY - Схема моего электрофумигатора.

В этот день...   21 ноября