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

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


Адрес 1921. Стирание файлов. Вход: установите 23773, 23781, и
произведите поиск файла. Программа устанавливает 23816 и 23815.

1921  XOR A       ;обнуление количества стертых файлов
      LD (23815),A
      JR 1952     ;стирание файлов
────────────────────────────────────────────────────────────────
Адрес 1927. Выполнение команды ERASE. Установите 23825 и 23611.

1927  CALL 7647   ;прием имени файла на стек калькулятора
      CALL 7541   ;если идет проверка на синтаксис, то возврат
      CALL 4142   ;прием расширения файла
      XOR A       ;пока ничего не стерто
      LD (23815),A
      CALL 10543  ;установка и проверка имени стираемого файла
      CALL 1952   ;стирание файла
      JP NZ,1399  ;если стерли файл не в конце каталога, то проверка, сколько
                   файлов стерли
      JP 993      ;сообщение O.K.
────────────────────────────────────────────────────────────────
Адрес 1952. Стирание файлов. Вход: установите 23773, 23781, об-
нулите 23815 и произведите поиск файла. Программа устанавливает
23816 и 23815.

1952  LD A,(23773) ;сохранение первого символа имени файла
      LD (23816),A
      RET NZ       ;если файл не был найден, то возврат
      LD HL,23815  ;стерт еще один файл
      INC (HL)
      PUSH BC      ;сохранение номера файла
      CALL 1021    ;чтение в буфер сектора 8 дорожки 0
      LD A,(24073) ;берем количество файлов на диске
      POP BC       ;восстановление номера файла
      INC C        ;этот файл последний ?
      CP C
      JR NZ,1980   ;если нет, то стирание обычным порядком
      DEC A        ;на диске теперь на 1 файл меньше
      LD (24073),A
      XOR A        ;стираемый файл в конце каталога
1980  PUSH AF      ;сохранение признака метода стирания
      JR Z,1987    ;если файл не в конце каталога,
      LD HL,24089  ;то увеличение на 1 количества стертых файлов
      INC (HL)
1987  PUSH BC      ;сохранение номера стираемого файла
      CALL 7747    ;перезапись сектора 8 дорожки 0
      POP BC       ;восстановление номера стираемого файла
      DEC C
      CALL 5725    ;загрузка описателя файла
      POP AF       ;восстановление флага метода стирания
      JP Z,2002    ;если файл в конце каталога, то первый символ имени будет
                    CHR$ 0
      LD A,1       ;иначе он будет CHR$ 1
2002  LD (23773),A ;установка первого символа имени
      PUSH AF      ;сохранение метода стирания
      CALL 7744    ;запись описателя файла
      LD A,(23816) ;восстановление первого символа имени файла
      LD (23773),A
      POP AF       ;восстановление метода стирания
      JR Z,2023    ;если стерт файл в конце каталога, то реорганизация
                    описателя диска
      CALL 7347    ;поиск следующего файла с таким именем
      JR 1952      ;стирание его, если он есть
2023  CALL 1021    ;чтение сектора 8 дорожки 0
      LD HL,(23787);установка нового начала свободного места
      LD (24070),HL
      LD DE,(23786);установка нового количества свободных секторов
      LD HL,(24074)
      LD D,0
      ADD HL,DE
      LD (24074),HL
      JP 7747      ;перезапись сектора 8 дорожки 0 и возврат
────────────────────────────────────────────────────────────────
Адрес 2048. Позиционирование с быстрой скоростью перемещения го-
ловки. Поместите физический номер дорожки в регистр данных, а
команду позиционирования - в аккумулятор.

2048  AND 252 ;позиционировать с быстрой скоростью
      JP 15770;выдача команды и ожидание INTRQ
────────────────────────────────────────────────────────────────
Адpес 2054. Фирменный знак изготовителей TR-DOS версии 5.04T.

2054  DEFM " Message for hackers: Base version 5.03, High Speed"
      DEFM ", Turbo Format. "
      DEFB 127
      DEFM "Copyright C.C. 1991"
────────────────────────────────────────────────────────────────
Адрес 4096. Текст "Interface one fitted."

4096  DEFB 22,9,5
      DEFM "Interface one fitted."
      DEFB 0
────────────────────────────────────────────────────────────────
Адрес 4120. Выполнение команды "*". Установите 23825 и 23611.

4120  CALL 7647   ;установка CH_ADD и прием имени дисковода на стек калькулятора
      CALL 7541   ;если идет проверка на синтаксис, то возврат
      CALL 1329   ;снятие имени дисковода со стека калькулятора
      LD A,(DE)   ;берем первый символ имени
      CALL 1316   ;вычисление номера дисковода
      LD (23833),A;установка дисковода по умолчанию
      CALL 15819  ;выбор дисковода
      JP 993      ;сообщение O.K.
────────────────────────────────────────────────────────────────
Адрес 4142. Прием расширения файла. Установите 23645 и 23766.

4142  LD B,"C"    ;расширение C
      LD A,(23766);расширение принимать ?
      OR A
      JR NZ,4173  ;если нет, то установка расширения файла
      CALL 7564   ;берем текущий символ
      CP 175      ;это CODE ?
      LD B,"C"    ;расширение C
      JR Z,4173   ;если да, то установка расширения файла
      CP 228      ;это DATA ?
      LD B,"D"    ;расширение D
      JR Z,4173   ;если да, то установка расширения файла
      CP "#"      ;это # ?
      LD B,"#"    ;расширение #
      JR Z,4173   ;если да, то установка расширения файла
      LD B,"B"    ;расширение B
4173  LD HL,23781 ;адрес переменной с расширением файла
      LD (HL),B   ;установка расширения
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 4206. Вывод цветных полос для заставки.

4206  LD HL,22757;адрес линии атрибутов
      LD B,10    ;установка атрибутов
4211  LD (HL),7
      INC HL
      DJNZ 4211
      LD (HL),2
      INC HL
      LD (HL),22
      INC HL
      LD (HL),52
      INC HL
      LD (HL),37
      INC HL
      LD (HL),40
      INC HL
      LD (HL),7
      LD HL,16622;адрес верхней линии пикселей
      LD B,8     ;8 линий пикселей в знакоместе
      XOR A      ;обнуление аккумулятора
4239  PUSH BC    ;сохранение количества линий
      SCF        ;сдвиг пикселей
      RLA
      PUSH HL    ;сохранение адреса линии пикселей
      PUSH AF    ;и байта для заполнения
      LD B,5     ;в линии 5 байтов
4246  INC HL     ;заполнение линии
      LD (HL),A
      DJNZ 4246
      POP AF     ;восстановление байта для заполнения линии,
      POP HL     ;адреса линии
      POP BC     ;и количества линий
      LD DE,256  ;берем адрес следующей линии
      ADD HL,DE
      DJNZ 4239  ;повтор до конца
      RET        ;возврат
────────────────────────────────────────────────────────────────
Адрес 4178. Ввод клавиши с ожиданием.

4178  DI        ;запрет прерываний
      PUSH HL   ;сохранение регистров
      PUSH BC
      PUSH DE
4182  RST 32    ;определение номера нажатой клавиши
      DEFW #028E
      LD C,0    ;режим клавиатуры - C или L
      JR NZ,4182;если нажата бессмысленная комбинация клавиш, то повтор
      RST 32    ;определение кода нажатой клавиши
      DEFW #031E
      JR NC,4182;если ничего не нажато, то повтор
      DEC D     ;режим клавиатуры - C или L
      LD E,A    ;помещение кода клавиши в регистр E
      RST 32    ;обработка клавиш CAPS SHIFT и SYMBOL SHIFT
      DEFW #0333
      POP DE    ;восстановление регистров
      POP BC
      POP HL
      AND 223   ;буква будет заглавная
      EI        ;разрешение прерываний
      RET       ;возврат
────────────────────────────────────────────────────────────────
Адрес 4261. Сообщения команды LIST.

4261  DEFM " Del."
4265  DEFM " File(s)"
      DEFB 0
4275  DEFM "Title:"
      DEFB 160
4282  DEFB 23,17
      DEFM "Disk Drive: "
      DEFB 0
4298  DEFB 23,16," ",0
4302  DEFM " 40 Track S.Side"
      DEFB 0
4322  DEFM " 80 Track S.Side"
      DEFB 0
4342  DEFM " 40 Track D.Side"
      DEFB 0
4362  DEFM " 80 Track D.Side"
      DEFB 0
4382  DEFB 23,16
      DEFM " Free sector "
      DEFB 0
4398  DEFB 13,13
      DEFM "  File Name    Start Length Line"
      DEFB 0
────────────────────────────────────────────────────────────────
Адрес 4433. Выделение 546 байтов в рабочей области. Устанавлива-
ет 23759.

4433  LD HL,(23649);берем адрес рабочей области
      LD (23759),HL;установка адреса пространства
      LD BC,546    ;выделять 546 байтов
      JP 7715      ;выделение области и возврат
────────────────────────────────────────────────────────────────
Адрес 4445. Печать числа из HL с нулями.

4445  XOR A      ;в числе 0 десятков тысяч
      LD DE,10000
4449  SBC HL,DE  ;вычитание из числа 10000
      JR C,4456  ;если получилось число меньше 10000, то следующий разряд
      INC A      ;следующий десяток тысяч
      JR 4449    ;повтор
4556  ADD A,"0"  ;печать десятков тысяч
      CALL 4520
      ADD HL,DE  ;восстановление остатка числа
      XOR A      ;в числе 0 тысяч
4446  LD DE,1000
      SBC HL,DE  ;вычитание из числа 1000
      JR C,4473  ;если получилось число меньше 1000, то следующий разряд
      INC A      ;следующая тысяча
      JR 4446    ;повтор
4473  ADD A,"0"  ;печать тысяч
      CALL 4520
      ADD HL,DE  ;восстановление остатка числа
      XOR A      ;в числе 0 сотен
      LD DE,100
4483  SBC HL,DE  ;вычитание из числа 100
      JR C,4490  ;если получилось число меньше 100, то следующий разряд
      INC A      ;следующая сотня
      JR 4483    ;повтор
4490  ADD A,"0"  ;печать сотен
      CALL 4520
      ADD HL,DE  ;восстановление остатка числа
      XOR A      ;в числе 0 десятков
      LD DE,10
4500  SBC HL,DE  ;вычитание из числа 10
      JR C,4507  ;если получилось число меньше 10, то следующий разряд
      INC A      ;следующий десяток
      JR 4500    ;повтор
4507  ADD A,"0"  ;печать десятков
      CALL 4520
      ADD HL,DE  ;восстановление остатка числа
      LD A,L     ;печать единиц
      ADD A,"0"
      CALL 4520
      RET        ;возврат
────────────────────────────────────────────────────────────────
Адрес 4520. То же, что и 15746.

4520  PUSH HL   ;сохранение HL и DE
      PUSH DE
      CALL 15746;печать символа
      POP DE    ;восстановление DE и HL
      POP HL
      RET       ;возврат
────────────────────────────────────────────────────────────────
Адрес 4528. Проверка достижения конца буфера при работе с ката-
логом. Установите 23801 и 23756, а в HL поместите текущий адрес
буфера. Если конец буфера достигнут, то в буфер загрузится сле-
дующий сектор каталога, а в HL будет 23845.

4528  PUSH HL      ;сохранение HL и BC
      PUSH BC
      LD A,(23801) ;берем номер дисковода из 23801
      LD HL,23798  ;берем номер текущего дисковода
      CP (HL)      ;назначен другой дисковод ?
      CALL NZ,15819;если да, то выбор назначенного дисковода
      POP BC       ;восстановление HL и BC
      POP HL
      CALL 1292    ;проверка достижения конца буфера
      LD A,(HL)    ;берем первый символ имени файла
      OR A         ;конец каталога ?
      JP Z,467     ;если да, то завершение
      CP 1         ;файл стерт ?
      CALL Z,1287  ;если да, то пропуск файла
      RET NZ       ;иначе возврат
      JR 4528      ;если файл был пропущен, то повтор
────────────────────────────────────────────────────────────────
Адрес 4558. Выполнение команды LIST. Установите 23825 и 23611.

4558  CALL 1067    ;проверка второго символа строки
      LD BC,2      ;по умолчанию печатать в поток 2
      LD (23771),BC
      JR Z,4163    ;если второй символ строки ENTER, то вывод каталога
      CP "#"       ;если второй символ строки "#" ?
      JR NZ,4600   ;если нет, то установка дисковода
      LD (23645),HL;установка CH_ADD
      CALL 7691    ;прием номера потока
      CALL 7564    ;берем текущий символ
      CP 13        ;это ENTER ?
      JR Z,4163    ;если да, то вывод каталога
      CP ","       ;это "," ?
      JP NZ,7450   ;если нет, то ошибка
      CALL 7722    ;следующий символ
      CALL 7613    ;прием имени дисковода на стек калькулятора
      JR 4603      ;установка дисковода
4600  CALL 7647    ;установка CH_ADD и прием имени дисковода на стек
                    калькулятора
4603  CALL 7541    ;если идет проверка на синтаксис, то возврат
      CALL 7605    ;снятие имени дисковода со стека калькулятора
      EX DE,HL     ;переброска его адреса в HL
      CALL 7297    ;установка дисковода
4613  CALL 7541    ;если идет проверка на синтаксис, то возврат
      LD A,(23798) ;загрузка имени дисковода в 23801
      LD (23801),A
      CALL 1029    ;настройка на диск
      LD A,(23771) ;берем номер потока
      CP 2         ;это 2 ?
      PUSH AF      ;сохраняем его
      CALL Z,7555  ;если да, то очистка экрана
      POP AF       ;восстановление номера потока
      CP 17        ;он больше 16 ?
      JP NC,7450   ;если да,то ошибка
      CALL 7556    ;открытие потока
      LD A,255     ;буфер не убирать, память не изменять
      LD (23800),A
      CALL 4433    ;выделение памяти в рабочей области
      LD HL,24070  ;начало описателя диска в буфере
      LD DE,(23759);берем адрес WORKSP
      LD BC,32     ;длина описателя диска
      LDIR         ;сохранение описателя диска
      CALL 1000    ;загрузка в буфер сектора 0 дорожки 0
      LD HL,23845  ;адрес буфера
      PUSH HL      ;сохранение его
4670  LD HL,4275   ;адрес сообщения TITLE:
      PUSH BC      ;сохранение BC
      RST 24       ;печать TITLE:
      LD HL,(23759);берем адрес WORKSP
      LD BC,20     ;20-й байт
      ADD HL,BC
      RST 24       ;печать имени диска
      LD HL,4282   ;печать DISC DRIVE:
      RST 24
      LD A,(23798) ;берем номер дисковода
      ADD A,"A"    ;вычисление имени дисковода
      CALL 15746   ;печать его
      CALL 15744   ;перевод строки
      LD HL,(23759);3-й байт описателя диска
      LD BC,3
      ADD HL,BC
      LD A,(HL)    ;берем количество файлов на диске
      LD HL,(23759);19-й байт
      LD BC,19
      ADD HL,BC
      SUB (HL)     ;вычисление количества нестертых файлов
      PUSH HL      ;сохранение адреса 19-го байта описателя диска
      CALL 7587    ;печать количества нестертых файлов
      LD HL,4266   ;печать FILE(S)
      RST 24
      LD HL,(23759);2-й байт описателя диска
      LD BC,2
      ADD HL,BC
      LD A,(HL)    ;берем тип диска
      LD HL,4302   ;адрес сообщения 40 TRACKS,S.SIDE
      CP 25        ;это 25 ?
      JR Z,4754    ;если да, то печать сообщения
      LD HL,4322   ;адрес сообщения 80 TRACKS,S.SIDE
      CP 24        ;это 24 ?
      JR Z,4754    ;если да, то печать сообщения
      LD HL,4342   ;адрес сообщения 40 TRACKS,D.SIDE
      CP 23        ;это 23 ?
      JR Z,4754    ;если да, то печать сообщения
      LD HL,4362   ;адpес сообщения 80 TRACKS,D.SIDE
4754  RST 24       ;печать сообщения
      POP HL       ;восстановление адреса 19-го байта описателя диска
      LD C,(HL)    ;берем количество стертых файлов
      CALL 7588    ;печать его
      LD HL,4261   ;печать DEL.FILES
      RST 24
      LD HL,4382   ;печать FREE SECTORS:
      RST 24
      LD HL,(23759);4-й байт
      LD BC,4
      ADD HL,BC
      LD C,(HL)    ;берем количество свободных секторов
      INC HL
      LD B,(HL)
      CALL 7593    ;печать его
      LD HL,4398   ;печать FILE NAME,START,LENGTH,LINE
      RST 24
      POP BC       ;восстановление BC и текущего адреса в буфеpе
      POP HL
      LD B,16      ;печатать информацию о 16 файлах
4789  CALL 4528    ;проверка достижения конца буфера
      CALL 15744   ;перевод строки
      PUSH BC      ;сохранение количества оставшихся файлов
      PUSH HL      ;и текущего адреса в буфеpе
      CALL 10552   ;печать имени и расширения файла
      LD BC,13     ;13-й байт описателя файла
      POP HL       ;восстановление текущего адреса в буфере
      ADD HL,BC
      LD C,(HL)    ;берем размер файла в секторах
      PUSH BC      ;сохраняем его
      LD A,C       ;загружаем его в C
      LD B,2       ;печатать 2 пробела перед числом
      CP 10        ;длина файла меньше 10 секторов ?
      JR C,4816    ;если да, то печать пробелов
      DEC B        ;печатать один пробел
4816  CP 100       ;длина файла меньше 100 сектоpов ?
      JR NC,4825   ;если нет, то пробелы не печатать
4820  LD A," "     ;печать пробелов
      RST 16
      DJNZ 4820
4825  POP BC       ;восстановление длины файла в секторах
      CALL 7593    ;печать ее
      LD HL,4298   ;16 пробелов
      RST 24
      POP HL       ;восстановление адреса описателя файла в буфере
      PUSH HL      ;и снова сохранение его
      LD BC,9      ;9-й байт описателя
      ADD HL,BC
      LD E,(HL)    ;берем адрес загрузки файла
      INC HL
      LD D,(HL)
      PUSH HL      ;сохранение текущего адреса в описателе файла
      EX DE,HL     ;переброска адреса загрузки файла в HL
      CALL 4445    ;печать его
      LD A," "     ;пробел
      CALL 15746
      POP HL       ;восстановление текущего адреса в описателе файла
      INC HL       ;следующий адрес
      LD E,(HL)    ;берем длину файла
      INC HL
      LD D,(HL)
      EX DE,HL     ;перенос ее в HL
      CALL 4445    ;печать ее
      POP HL       ;восстановление адреса описателя файла
      PUSH HL      ;и снова сохранение его
      LD BC,8      ;8-й байт
      ADD HL,BC
      LD A,(HL)    ;берем расширение файла
      CP "B"       ;это "B" ?
      CALL Z,4891  ;если да, то печать строки автозапуска
      POP HL       ;восстановление адреса описателя файла
      POP BC       ;и счетчика файлов
      LD DE,16     ;адрес следующего описателя файла
      ADD HL,DE
      DJNZ 4789    ;повтор до конца
      PUSH HL      ;сохранение адреса описателя файла
      CALL 15744   ;2 раза перевод строки
      CALL 15744
      JP 4760      ;повтор с самого начала
────────────────────────────────────────────────────────────────
Адрес 4891. Печать строки автостарта прогpаммы на бейсике. В HL
Поместите адрес описателя файла плюс 8 и установите 23759.

4891  LD BC,5      ;берем адрес длины файла в секторах
      ADD HL,BC
      LD B,(HL)    ;берем эту длину
      INC HL       ;следующий адрес в описателе
      LD E,(HL)    ;берем адрес файла на диске
      INC HL
      LD D,(HL)
      DEC B        ;загружать будем 2 сектоpа
      JR Z,4917
      DEC B
      JR Z,4917    ;если длина файла не больше 2-х секторов, то загрузка
                    секторов
      LD A,16      ;на дорожке 16 секторов
4908  INC E        ;следующий сектор
      CP E         ;конец дорожки ?
      JR NZ,4915   ;если да, то
      LD E,0       ;следующий сектор 0
      INC D        ;и берем следующую дорожку
4915  DJNZ 4908    ;повтор до конца
4917  LD HL,(23759);берем адрес рабочей области
      LD BC,33     ;33 байта уже заняты
      ADD HL,BC
      LD B,2       ;загружать 2 сектора
      PUSH HL      ;сохранение адреса загрузки секторов
      CALL 7741    ;загрузка секторов
      LD A,128     ;будем искать конец программы
      POP HL       ;восстановление адреса секторов в памяти
      LD BC,512    ;длина области - 512 байтов
      CPIR         ;поиск конца программы
      LD A,(HL)    ;берем следующий байт
      CP 170       ;это 170 ?
      RET NZ       ;если нет, то возврат
      INC HL       ;берем номер строки автостарта
      LD C,(HL)
      INC HL
      LD B,(HL)
      LD A,B       ;это 0 ?
      OR C
      RET Z        ;если да, то возврат
      PUSH BC      ;сохранение номера строки автостарта
      LD A," "     ;печать пробела
      CALL 15746
      POP BC       ;восстановление номера строки автостарта
      CALL 7593    ;печать его
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 4960. Выполнение команды COPY S. Установите 23825 и 23611.

4960  CALL 7621   ;установка CH_ADD
      CALL 7722   ;следующий символ
      CALL 7613   ;прием имени файла на стек калькулятора
      CALL 7541   ;если идет проверка на синтаксис, то возврат
      CALL 5743   ;резервирование места в памяти
      LD HL,10154 ;печать INSERT SOURCE DISC
      CALL 9991
4981  CALL 4178   ;ввод символа с клавиатуры
      CP "Y"      ;это Y ?
      JR NZ,4981  ;если нет, то повтор
      CALL 7583   ;очистка низа экрана
      CALL 4142   ;прием расширения файла
      CALL 7344   ;установка имени файла
      JP NZ,985   ;если такого файла нет, то ошибка
      CALL 5047   ;копирование файла
      LD A,(23781);расширение файла # ?
      CP "#"
      JP NZ,993   ;если нет, то O.K.
5011  LD A,10     ;файл искать по 10 символам
      LD (23814),A
      LD HL,23782 ;следующий блок
      INC (HL)
      CALL 7575   ;очистка экрана
      LD HL,10154 ;печать INSERT SOURCE DISC
      CALL 9991
5029  CALL 4178   ;ввод клавиши
      CP "Y"      ;это Y ?
      JR NZ,5029  ;если да, то повтор
      CALL 7347   ;поиск блока
      JP NZ,993   ;если не нашли, то O.K.
      CALL 5047   ;копирование блока
      JR 5011     ;повтор
────────────────────────────────────────────────────────────────
Адрес 5047. Копирование файла при одном дисководе. Номер файла
поместите в регистр C.

5047  CALL 5725    ;чтение описателя файла
      LD HL,23782  ;сохранение его части
      LD DE,23789
      LD BC,7
      LDIR
      LD A,(23793) ;установка объема файла в секторах
      LD (23824),A
      CALL 1029    ;настройка на диск
      CALL 15889   ;сохранение режима дисковода
      LD (23769),A
      LD A,255     ;первый проход
      LD (23841),A

Внимание!!! Эта переменная уже занята. В ней хранятся первые 3
символа командной строки.

      CALL 5201     ;копирование файла
      LD HL,(23839) ;берем адрес файла на диске - приемнике
      LD (23787),HL ;устанавливаем его
      LD HL,(23698) ;берем новый адрес свободного места на диске
      LD (24070),HL ;устанавливаем его
      LD HL,24073   ;записали 1 файл
      INC (HL)
      LD C,(HL)     ;берем номер файла
      DEC C
      LD B,0        ;переводим его в двухбайтную форму
      PUSH BC       ;сохраняем его
      LD DE,9       ;записывать сектор 8 дорожки 0
      LD (23796),DE
      CALL 7747     ;запись сектора
      POP BC        ;восстановление номера файла
      CALL 5739     ;чтение и замена описателя файла
      CALL 7747     ;запись сектора с описателем
      RET           ;возврат




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Новости - Вот и подошло, подъехало, приплыло времеце, когда нужно выпустить этот второй номер очередного журнала "Ультиматум".
UFO II - способ для увеличения ученых в игре UFO II.
Премьера - описание программы Catalogue Master.
Игрушки - Hints & Tips: Mickey, Nomad.
Авторы - Над номером работали.

В этот день...   25 апреля