Inferno #04
22 июня 2003
  Софт  

Sofтинка - Функции операционной системы ZXVGS.


Программное обеспечение Описание Операционные системы Прочие

              Функции ZXVGS

Все функции ZXVGS вызываются через RST #08
с номером  функции в следующем байте (hook
code). Программа  продолжается  с  адреса,
лежащего за hook code.
       RST  #08
       DEFB function
В нижеследующих  таблицах колонки, обозна-
ченные "вход" описывают регистры, содержа-
щие аргументы функции. Колонки, обозначен-
ные "выход" - регистры, в  которых функция
возвращает результат, причём остальные ре-
гистры не меняются. Содержимое AF на входе
игнорируется, состояние F на выходе не оп-
ределено. В  некоторых случаях функция мо-
жет установить 7-й бит регистра R, это бу-
дет означать, что одно или более  экранное
прерывание было пропущено.

      Значение байта после RST 8.

#00-#1a - ошибки интерпретатора Бейсика 
#1b-#31 - Interface 1 hook codes 
#32-#47 - коды команд DISCiPLE 

#78-#7e - для внутреннего использования в 
          RSX'ах 
#7f     - внутренний вызов ПЗУ 
#80-#83 - джойстики 
#84-#85 - мышь 

#87-#88 - скорость 
#89-#8f - клавиатура 
#90-#9f - управление экраном - пока 
          не используется 
#a0-#a1 - информация 
#a2-#a3 - настройка (config) 
#a4-#a5 - звук 
#a6-#a7 - экран 

#ac-#af - RSX'ы 
#b0-#bf - банки памяти 
#c0-#c1 - текущий путь (current path) 
#c2-#c3 - директории 
#c4-#c7 - информация о диске 
#c8-#cf - работа с файлами 
#d0-#db - прямой доступ к файлам 

#e0-#e7 - операции с файлами, имеющими 
          заголовки (headers) 
#e8-#e9 - изображения 
#ea-#eb - отгрузки игр 
#ec-#ed - работа с кусками файлов 
          (raw data) 
#ee-#ef - выбор файлов 
#f0-#f7 - принтер 
#f8-#fb - оверлеи 
#fc-#fe - системные вызовы 
#ff - OK 

Примечания:
 * Interface 1 hook codes обрабатываются 
через MDR.RZX и BI1.RZX. 
 * Команды DISCiPLE обрабатываются через 
MGT.RZX и BD1.RZX. 


          Внутренний вызов ПЗУ

Код #7F зарезервирован для внутренних нужд
системы.
Используется для вызова ПЗУ ZX из системы.


               Джойстики

Примечание. Вызовы  функций #80..#83 могут 
быть  прерваны пользователем. Во избежание
выхода из программы без сохранения резуль-
татов, используйте функцию #A3 (будет дос-
тупна в следующих версиях).

Возможно использование 4 независимых джой-
стиков. Обычно  используются  первые  два.
Смысл  битов  0..4  совместим  со значени-
ем  из  порта   Кемпстон-джойстика   (#1F,
b0=right,b1=left, b2=down,b3=up, b4=fire).
Bit 5 - второй fire (обычно не использует-
ся). Биты 6 и 7,общие для всех джойстиков,
символизируют ещё две кнопки. Bit 6 (HALT)
может вызвать паузу в игре (когда установ-
лен)  или активировать опции. Bit 7 (EXIT)
может  прервать  игру  или вызвать переход
в главное меню.

Спецификация вызовов:

№  название  описание     вход    выход 
#80  J0  read joystick 0   -   A=состояние 
#81  J1  read joystick 1   -   A=состояние 
#82  J2  read joystick 2   -   A=состояние 
#83  J3  read joystick 3   -   A=состояние 


           Использование мыши

Вы можете  использовать внешнюю мышь (обс-
луживаемую вне главной программы), а также
вызывающую  прерывания. Задачи  вычисления
абсолютных координат,рисования указателя и
отслеживания  событий лежат на вашей прог-
рамме.Для использования мыши в любой прог-
рамме руководствуйтесь следующими требова-
ниями:

 1. Запретите прерывания! Включите IM 2.
 2. Установите  значение  регистра I (же- 
лательно #80..#FE). Он не должен указывать 
в ПЗУ! 
 3. Заполните   таблицу  прерываний  (257 
байт  с адреса I*256) одинаковыми байтами. 
Осторожно! Некоторые  типы мышей (AMX) ге- 
нерируют векторы IM 2! 
 4. По адресу, указываемому таблицей пре- 
рываний, разместите: 
       NOP
       NOP
       NOP
       JP   ownint 
"ownint" - адрес   процедуры  обслуживания 
прерываний.Если вам не нужен свой обработ- 
чик, можете поместить EI:RETI вместо этого 
перехода. 
 5. Зарезервируйте  128B буфер для проце- 
дур  обслуживания  мыши.  Поместите  адрес 
этого  буфера  в HL (#5B00..#FF80). Вы  не 
должны  будете  портить  эту область после 
установки мыши. 
 6. Зарезервируйте  байт для хранения го- 
ризонтального смещения.Поместите его адрес 
в BC. 
 7. Зарезервируйте байт для хранения вер- 
тикального  смещения. Поместите  его адрес 
в DE. 
 8. Вызовите  функцию  #84. Она  заполнит 
буфер  и  область  под NOP'ами. И в случае 
необходимости сменит таблицу прерываний. 
 9. Разрешите прерывания! 
Для  старых  программ рекомендуется помес- 
тить XOR A: RET в начало буфера во избежа- 
ние сбоя программы при вызове до инициали- 
зации мыши. 

Координаты  будут меняться по заданным ад-
ресам. Все они  8-битные. Вы можете только
считывать  их и сравнивать с эталонами для
опреденения изменений. Для проверки кнопок
просто вызывайте процедуру из начала буфе-
ра. Она вернёт состояние кнопок в A,сохра-
нив значения остальных регистров (b0=левая
кнопка, b1=правая; установленный  бит ука-
зывает на нажатие).
Обратите внимание,что некоторые типы мышей
(RS232, AMX)  могут генерировать собствен-
ные прерывания, бесполезные для нашей про-
граммы. Все некадровые прерывания "съедаю-
тся" (адрес возврата снимается со стека).И
если адрес возврата ссылается на байт пос-
ле команды HALT, он будет  декрементирован
для продолжения HALT до кадрового прерыва-
ния.
Мышь может быть деактивирована указанием 0
в  качестве  адреса буфера (в HL). Данные,
возвращаемые в этом случае,полезны для RSX
- они помогают отключить драйвер,использу-
емый  главной  программой, подключить свой
драйвер  для обработки запроса, после чего
отключить  свой драйвер и возвратить драй-
вер главной программы.

Спецификация вызовов:

№  название  описание    вход     выход 
#84 MSEINI  установить  I=page   A=result 
              мышь    BC=^xcoord
                      DE=^ycoord
                      HL=^buf
            опросить  HL=???    A=result
              мышь             BC=^xcoord
                               DE=^ycoord
                               HL=^buf
           отключить  HL=0      A=result
              мышь             BC=^xcoord
                               DE=^ycoord
                               HL=^buf 
#85 MSEGET  read state     -     A=keys 
          (для внутр.           B=dy
         использования)         C=dx


                Скорость

Функция #87 переключает  процессор в быст-
рый режим.Скорость не оговаривается - про-
сто считается,что программа работает быст-
рее.
Функция #88 возвращает процессор в станда-
ртый режим 3.5MHz.

Спецификация вызовов:

№  название  описание    вход     выход 
#87  FAST   (Scorpion)    -      A=result 
            ускоряет
             работу
           процессора 
#88  SLOW   (Scorpion)    -      A=result 
           возвращает
             3.5MHz


               Клавиатура

Расширенная клавиатура может использовать-
ся для ввода текста в ряде программ.
Позволяет  использовать несколько дополни-
тельных  клавиш (на эмуляторах, SAM Coupe,
ZX128 keypad).
Будет  использована в Бейсике, если появя-
тся патчи или способы перехвата INT.

Вызов функции #8F??? должен быть помещён в
обработчик IM 2, как минимум с сохранением
AF. Или  может  вызываться  с запрещёнными
прерываниями примерно 50 раз в секунду.

Пока не применяйте!!! Не доделано!!! 

Спецификация вызовов:

№  название  описание    вход     выход 
#8C? KBDGET  get char     ()       (A) 
           from buffer 
#8D? KBDTST  read char    ()       (A) 
           from buffer
            &leave it 
#8E? KBDMOD выбор режима (BC)   (A=result) 
#8F? KBDINT    sync.      ()       (A) 
            interrupt


           Управление экраном

Функции #90..#9F разработаны для отображе-
ния меню, перемещения указателя мыши и вы-
вода текста в 42, 51 или 64 столбца.
В том числе, в дополнительных экранных ре-
жимах.

В текущей версии ZXVGS не реализовано! 

Спецификация вызовов:

№  название  описание    вход     выход 
#9F? CHOICE  ask user  HL=^title  A=result 
           what to do BC=^options

Спецификация вызовов config & system info:

№  название  описание    вход     выход 
#A0?        неизвестно 
#A1?        неизвестно 


           Настройка функций

Команды #A2 и #A3 управляют машиннозависи-
мыми функциями.
Параметры:

Опция         D     E  смысл 
Тип          #80-83 0  не менять 
джойстика           1  Sinclair 1 
                   2  Sinclair 2
                   3  Kempston
                   4  Fuller
                   5  стрелки SAM Coupe
                      + <CNTRL>
                   6  функциональные
                      кнопки SAM Coupe
                   7  (не определено)
                   8  TC2068 left
                      (AY #F5, #F6)
                   9  TC2068 right
                      (AY #F5, F6) 
Тип мыши.    #84    0  Kempston Mouse 
Изменение           1  server mouse 
невозможно,         2  SAM Mouse 
когда драйвер       3  J3 mouse 
активен.            4  AMX Mouse 
                   5  AY mouse
                      (Украинская)
                   6  (не определено)
                   7  (не определено)
                   8  M$ Mouse
                      в YAMOD.8250/0
                   9  M$ Mouse
                      в YAMOD.8250/1
                  10  M$ Mouse
                      в YAMOD.8250/2
                  11  M$ Mouse
                      в YAMOD.8250/3 
Наличие      #A4 маска (1=отсутствие) 
звуковых 
устройств. 

Тип принтера #F7       (не определено) 

Спецификация вызовов:

№  название  описание    вход     выход 
#A2? GETCFG    взять   D=функция A=ошибка 
            установку           E=режим
             функции 
#A3? SETCFG установить D=функция A=ошибка 
            параметр   E=mode0
             функции            E=mode1


            Настройка звука

Функция  #A4 предоставляет сведения о дос-
тупных звуковых устройствах. Bit 0 соотве-
тствует  биперу на порту #FE, bit 1 - про-
цедуре BEEPER в ПЗУ Бейсика.Сброшенный бит
означает - не генерируйте звук этим спосо-
бом (пользователь  не  хочет слышать такой
звук).Установленный bit 2 означает наличие
AY-3-8910/2 по портам #BFFD и #FFFD (а та-
кже  #BEFD  и #FEFD для неверно написанных
плейеров),bit 3 - чип SAA 1099 (SAM Coupe)
по портам #00FF и #01FF. Если один из двух
последних  битов сброшен, вы не должны ис-
пользовать эти порты! Это может привести к
сбою!
Если эта функция вызвана без предваритель-
ного  вызова  функции #A5 (после #AF), она
определяет все доступные звуковые устройс-
тва (совместимость сверху вниз,будет убра-
но).

Функция #A5 используется для автоопределе-
ния звукового устройства. Номер устройства
должен быть в D, а некоторые параметры - в
E. (Звёздочка "*" означает, что устройство
имеет фиксированные адреса портов.)

Параметеры функции #A5

 D       устройство             E 
#01*  AY-3-891X (ZX128)    каналы (в форме 
                              регистра 7) 
#02*  AY-3-8912 (TC2068)   каналы (в форме 
                              регистра 7) 
#03*  оба (1 и 2)          каналы (в форме 
                              регистра 7) 
#04*  SAA1099 (SAM)        каналы (в форме 
                          регистров 14&15
                          ;b6,b7 - выбор) 
#08   8255 ЦАП (MB-02)     каналы b0..b3 

Спецификация вызовов:

№  название  описание    вход     выход 
#A4  SOUND   сведения      -     A=flags 
#A5? OPENSOUND найти    D=номер A=различие 
           устройство  E=каналы E=каналы


             Настройка экрана

#A6? VIDEO      ()    (A,D=ula,E=mode,B,C) 

возвращает тип ULA в D (свойства экрана)
Параметры - в регистре D

Страна   D   компьютер         графика 
Англия  #00  Sinclair ZX    ULA 6C001E-7 
            Spectrum (+)
       #01  Sinclair       AMSTRAD 40056
            ZX+ 128
       #02  Amstrad ZX +2  ULA 7K010E5
       #03  Amstrad ZX     GATE ARRAY
            +2A/+2B/+3      40077
       #0C  MGT SAM Coupe  ASIC 
Порту-  #20  Timex          TS 2068 - 60Hz 
галия        Sinclair 2068 
       #21  Timex          TS 2068 -
            Computer 2068   50Hz, grey
       #22  Timex          TS 2068 -
            Computer 2048   50Hz, black 
Польша  #80  ELWRO 800      ? 
            Junior
       #??  Solum          ? 
Россия  #C0  Pentagon       ? 
       #C1  Scorpion ZS    ? 
др.     #F0  Warajevo emulator 
       #FF  неизвестно

B,C - параметры времени кадровой синхрони-
зации в тактах Z80 (быстрое ОЗУ)

#A7 OPENVIDEO 
Вход         (BC=timing,DE=mode,HL=buffer) 
Выход    (BC=timing,DE=mode,H=tacts,L=len) 

Функции #E8, #E9, #F3  используют значение
экранного режима (screenmode).

LINT: +#80 

Интерфейс LINT генерирует прерывание перед
тем,как отобразится строка,указанная в по-
рту #F9. Прерывание  может быть распознано
чением порта #F9. Присутствие должно опре-
деляться функцией #A???. (На данный момент
такая возможность поддерживается только на
SAM Coupe.)

 основные режимы     неосновные режимы
E   описание         E   описание 
#00 стандартный      #08 стандартные 
   экран с #4000        экраны с #4000
                               и #C000 
#01 стандартный      #09 стандартные 
   экран с #6000        экраны с #4000
                               и #6000 
#02 high colour      #0A high colour 
   экран с #4000        экраны с #4000
                               и #C000 
#03 hires            #0B hires 
   экран с #4000        экраны с #4000
                               и #C000 
#04 стандартный      #0C стандартные 
   экран с #C000        экраны с #4000,
                        #6000,#C000,#E000 
#05 стандартный      #0D стандартные 
   экран с #E000        экраны с #C000
                               и #E000 
#06 high colour      #0E high colour 
   экран с #C000        экран с #4000
                        и #C000 - 1:3 
#07 high colour      #0F high colour 
   экран с #C000        экран с #4000
                        и #C000 - 1:2

При HL>#4000 по адресу HL помещается рело-
цируемый код для выбора одного из основных
экранных режимов. В этом случае L содержит
длину этого кода,а H - требуемое ему число
тактов.Вызовами с H=0 режим выбирается не-
посредственно.

Спецификация вызовов:

№  название  описание    вход     выход 
#A6? VIDEO   информация    ?        A 
             о экране            D=ula
                                 E=mode
                                   B
                                   C 
#A7 OPENVIDEO включить BC=timing BC=timing 
             экранный DE=mode   DE=mode
              режим   HL=buffer  H=tacts
                                 L=len


               Управление
   Резидентными Расширениями Системы
    Resident System Extentions (RSX)

Функция #AC используется  для загрузки RSX
в  память  системы без активации. В случае
отсутствия ошибок (A=0),хэндл (handle) вы-
бранной RSX возвращается в D.

Функция  #AD? вызывает  внутренние функции
имеющегося в наличии RSX.

Функция  #AE  предназначена  для  контроля
всех загруженных RSX.При E=0 помещает в HL
имя файла,который вызвал загрузку програм-
мы или ошибку,если программа была запущена
непосредственно, без  привязки к файлу. BC
должен содержать размер буфера,как минимум
#0080.

Функция #AF загружает RSX, соответствующий
расширению  файла, вслед  за  чем  RSX за-
гружает  требуемый  файл.   Например,  для
файла  "GAME.Z80"  RSX  грузится  из файла
"ZX:Z80.RZX". Это  не происходит  в случае
расширений "V00" (родная  программа ZXVGS)
и "RZX" (грузит RSX  непосредственно, а не
"RZX.RZX").

Функция #AF загружает:
 * для файлов  "*.V00" - требуемую  прог- 
рамму (потом файл "*.SV@", если он есть), 
 * для "*.RZX" - требуемый RSX,
 * для остальных - "ZX:ext.RZX" (если на- 
йдено;"ext" - расширение файла), а имя фа- 
йла будет доступно  через  функцию #AE при 
E=0; 

Спецификация вызовов:

№  название  описание    вход     выход 
#AC RSXINIT взять RSX DE=^rsxname D=handle 
                                 A=ошибка 
#AD? RSXCTRL вызвать   D=handle   ? 
          функцию RSX E=функция  A=ошибка 
#AE RSXINFO информация E=what     ? 
            о RSX        HL      A=ошибка
                         BC 
#AF RSXLOAD загрузить DE=^filename 
          файл RSX'ом            A=ошибка


              Банки памяти

Этими функциями вы можете управлять до 4MB
памяти. (Что  даёт в итоге 4128kB в режиме
16kB или 8208kB в режиме 32kB.)

Введение 

Имеется 16kB переключаемого ОЗУ  в верхней
(section D) области памяти (#C000..#FFFF).
Есть  возможность использовать виртуальные
банки памяти, содержимое которых будет пе-
ремещаться программно. Банки #00..#07 при-
вилегированы  и могут переключаться  быст-
рее, отдельными функциями #B0..#B7 без ар-
гументов.

Банк должен быть открыт перед операциями с
ним. Если  при  открытии не хватает памяти
(ОЗУ  в  случае  невиртуальных  банков или
внешней памяти в случае виртуальных),гене-
рируется  фатальная ошибка. Предварительно
проверяйте свободное место!
Открытый  банк заполняется нулями. Функции
не проверяют PC,SP и I, поэтому их исполь-
зование  в неправильном разрезе может при-
вести к краху системы.

Если по аппаратным причинам невозможно пе-
реключать верхнюю четверть памяти,доступны
только  виртуальные банки (с долгим време-
нем переключения). Если по аппаратным при-
чинам переключаться могут только обе верх-
ние  четверти  памяти  одновременно (32kB,
#8000..#FFFF), то переключение верхней че-
тверти  имитируется  с  или без перезаписи
другой четверти (section C). В этом случае
невозможно  открыть  банк, переключающийся
быстро  и  не  портящий эту section C. Она
скопируется при открытии.

Имеется три типа банков:
 1. Индивидуальные - номера  0..15 - каж- 
дый может открываться в своём режиме. 
 2. Параметрические - номера с 16 до зна- 
чения, возвращаемого в A функцией #BF. Эта 
группа существует, только если функция #BF 
возвратит значение больше 15. Режим откры- 
тия определяется для первого открытого ба- 
нка в этой группе и будет таким же для ос- 
тальных. 
 3. Виртуальные - номера  сверх значения, 
возвращённого функцией #BF. Эта группа су- 
ществует только если функция #BF возвраща- 
ет в A значение меньше 255. Режим открытия 
определяется для первого открытого банка в 
группе  и будет  тем же для остальных. Эти 
банки могут быть открыты только как вирту- 
альные. Для  открытия первого виртуального 
банка  как минимум один из реальных банков 
должен быть открыт  как медленный (bit 0 в 
регистре  D сброшен) - он сменит состояние 
на  виртуальное  и  будет  использован для 
хранения данных из виртуальной памяти (ба- 
нки, открытые особо,сохранят реальное сос- 
тояние). 

Функции 

Функции #B0..#B7 выбирают один из привиле-
гированных банков.Функция #B8 выбирает лю-
бой банк - его номер передаётся в регистре
E.

Функция #B9 предоставляет информацию о ба-
нках.

Функция #BA используется для получения ку-
ска кода, переключающего банки. Более под-
робно см.следующую секцию.

Функция #BB копирует содержимое  section C
во  всех открытых 32kB страницах или игно-
рируется в случае 16kB-страничного режима.

Функция #BC пытается  открыть банк E в ре-
жиме D и  возвращает удавшийся  режим в D.
См. таблицу параметров.

Функция #BD закрывает банк E. Если E явля-
ется включенным в данный момент банком, то
содержимое  верхней четверти памяти стано-
вится  не определено (т.е. может содержать
ПЗУ или #FF-ки) до выбора другого банка.

Функция #BE закрывает все банки.Содержимое
верхней четверти  ОЗУ становится неопреде-
лённым.

Функция #BF возвращает в регистре E  номер
текущего  банка, а в регистре D его режим.
В регистре B возвращается  количество отк-
рытых банков.Регистр A содержит количество
дополнительных банков (за исключением вир-
туальных):
 * 0 - 48 kB (стандартный ZX48)
 * 1 - 64 kB (обычно один 32kB банк; поэ- 
тому называется ZX80kB) 
 * 2 - 80 kB (два дополнительных  банка - 
обычно по 16kB) 
 * 5 - 128 kB (пять дополнительных банков 
- ZX128) 
 * 6 - 144 kB (вид расширенного TC2048)
 * 27 - 480 kB (Pentagon  512kB  с  двумя 
зарезервированными страницами) 

Параметры:

D    вх.данные #BC    вых.данные #BD/BF 
      когда 1       когда 0    когда 1 
0  должен щёлкать  ┌─────────────────────┐ 
  быстро?         │      bit1=0  bit1=1  (не виртуально) │    0 16Kvirt 32Kreal│ 
1  область         │bit0         +copy C │ 
  #8000..#BFFF    │    1 32Kreal 16Kreal│
  не меняется?    └─────────────────────┘ 
2  содержит экран? нету экрана есть экран 
 
3  соответствует   несовместим совместим 
  банку ZX128?    с OUT #7FFD с OUT #7FFD
  OUT(#7FFD),E+16 
4  можно класть    нет,        можно, 
  таблицу IM 2    пойдёт      "снега"
  без "снега"?    "снег"      не будет 
5  процессор будет да, будет   нет, банк 
  тормозить  ULA? тормозить   быстрый 
6  поддерживает 8  нет, только да, 8 бит 
  бит цвета (???) 1 бит       цвета 
7  откроется, даже откроется   не откро- 
  если не соблю-              ется
  дать требований?


Функция #BA - быстрое переключение банков

Позволяет  щёлкать  банки намного быстрее.
Следуйте этим указаниям:
 1. Определите, будет  ли  ваша программа 
работать  в  32kB  страничном режиме. Если 
нет, используйте режим %XXXXXX11 (не будет 
работать  на  некоторых типах аппаратуры). 
В противном  случае  будет  32kB или 16kB. 
Следите за стеком и прерываниями. 
 2. Откройте банк функцией #BC.
 3. Зарезервируйте  32B для программы пе- 
реключения страниц. Программа перемещаема. 
Для использования программы без её переме- 
щения, можете заполнить буфер нулями и по- 
местите его в свою программу.Или заполните 
33 байта  кодом  "RET" (#C9) или "JP (HL)" 
(#E9), в зависимости  от  структуры  вашей 
программы. 
 4. Зарезервируйте  два  байта  в  районе 
#5B00..#7FFE, поместите  их адрес в BC при 
первом  вызова функции #BA (потом BC будет 
игнорироваться). 
 5. Вызовите  функцию  #BA  для помещения 
кода включения банка E по адресу HL. Функ- 
ция вернёт реальную длину кода в BC и чис- 
ло тактов в A. DE укажет на байт после ко- 
да, поэтому вы можете добавлять (с помощью 
LDIR) туда свой код. 
 6. Для выбора банка вызывайте этот код. 
Запомните! 
 * Каждый банк имеет свою программу вклю-
чения.
 * (!!!) Код  можно  переместить  в любое
место и в любое время.
 * Код НЕ ДОЛЖЕН использоваться после за-
крытия банка!
 * Код, выданный функцией #BA, не длиннее
32 байт.
 * Он всегда портит AF, иногда BC и,кроме
того, использует стек.
 * Для вызова любой функции ZXVGS вы ОБЯ-
ЗАНЫ вызвать код,включающий страничку,сто-
явшую до первого вызова этих кодов (после-
дний банк, выбранный функциями #B0..#B8).
 * Код ОБЯЗАН находиться в банке, который
он включет.Проблем не возникнет при разме-
щении  кода  в адресах #4000..#7FFF. После
размещения  его в адресах #8000.. #BFFF вы
можете вызвать функцию #BB для копирования
его в остальные банки. Но если вы захотите
использовать его с адресах #C000..#FFFF,вы
должны  сами скопировать его во включаемую
страничку.
 * В некоторых случаях (например, на эму-
ляторах) функция  #BA возвращает  #FF, что
означает, что  код  содержит вызов функции
#B8. Помните о стеке!!!

Спецификация вызовов:

№  название  описание    вход     выход 
#B0  BNK0    включить      -       A=? 
..    ..   привилегиро- 
#B7  BNK7   ванный банк 
        фатальная ошибка
         при неоткрытом 
#B8  BNKE    включить      -       A=? 
           любой банк
        фатальная ошибка
         при неоткрытом 
#B9 BNKCTRL  сведения  DE=infonum   A 
            о банке               BC
                                  DE
                                  HL 
#BA BNKCODE  получить   E=number  BC=длина 
           программу  HL=^buffer DE=^end
         переключения BC=^word    A=tacts 
#BB BNKCOPY копировать     -       A=? 
           section C
         во все банки 
#BC BNKOPEN  открыть   D=mode0     D=mode1 
             банку    E=number    A=xor 
#BD BNKCLOSE закрыть   E=number    A=? 
             банку 
#BE BNKRESET закрыть       -       A=? 
           все банки 
#BF BNKINFO  сведения      -      B=opened 
             о всех               D=mode
             банках               E=bank
                                 A=memory


           Текущая директория

Спецификация вызовов:

№  название  описание    вход     выход 
#C0 GETPATH Текущий путь DE=^buf  A=ошибка 
           (с диском)           name=DE^ 
Начинается с имени диска и двоеточия 
#C1 SETPATH Сменить путь DE=^name A=ошибка 


     Чтение содержимого директории

Функция  #C2  возвращает элемент каталога,
выбранного  функцией  #C3. HL указывает на
формат  строки (определённый  функцией #C3
используется  либо  при  H=0, либо если HL
указывает на нулевой байт; внутренняя сис-
темная структура возвращается при H=1), DE
указывает на буфер. В этот буфер возвраща-
ется элемент каталога - ASCII текст, гото-
вый  к  отображению. (Используйте HL=0 для
заполнения селектора файлов(fileselector),
потом HL=^'%f%n' для  взятия  имени файла,
выбранного пользователем.)

Функция #C3 выбирает каталог, считает эле-
менты  и  копирует их во внутренний буфер.
(Буфер должен быть освобождён (DE=0) после
окончания  чтения  каталога.) HL указывает
на  строку  формата (системный  формат  по
умолчанию  используется либо при H=0, либо
если HL указывает на нулевой байт;внутрен-
няя  системная  структура возвращается при
H=1).Могут быть использованы следующие си-
мволы форматирования:
 * %a атрибуты
 * %b число allocation units, занятых фа- 
йлом или строка "Dir" 
 * %c комментарий файла
 * %d дата последнего изменения
 * %e расширение файла
 * %f путь к файлу (реальный)
 * %g имя группы файлов (GID)
 * %k номер первого allocation unit
 * %l длина в байтах или строка "Dir"
 * %m имя файла без расширения
 * %n имя файла с расширением
 * %p путь к файлу (the pointed by DE)
 * %s имя файла с расширением(?)
 * %t время последней модификации
 * %u имя пользователя файла (UID)
 * %x атрибуты U*IX
Другие  символы  копируются без изменения.
Десятичное число между % и буквой указыва-
ет фиксированную ширину поля.Положительные
значения - выравнивание  по  правому краю,
отрицательные - по  левому. Значение после
точки  указывает число отрезаемых символов
в строке. Примеры:

"%-16.16m %-3.3e %l" - NeOS 1.0 style 
                                     (DEC) 
"%-8.8m<%1.1e>%3b%13l" - TR-DOS style 
              (параметры start недоступны) 
"%x %-9g%-9u%8l %6d %5t %n" - U*IX style 
                                   (ls -l) 
"%-9.8m%-4.3e%13l%9.8d%9t" - MS-DOS 6.20 
                           style (default)

Внутренняя  системная структура состоит из
следующих полей (не полностью определено):
 * +#00 - - 4B;
 * +#04 - - 4B;
 * +#08 - - 4B;
 * +#0C - - 4B;
 * +#10 - - 4B;
 * +#14 - - 4B;
 * +#18 - - 4B;
 * +#20 - имя файла в ASCIIZ без пути -
          до 32B;

Свободное  пространство на диске можно уз-
нать через функции #C4 или #C5.

Примечание: некоторые  диски (большей час-
тью  сетевые,  типа  "TCP:",  "HTTP:"  или
"FTP:") не показывают все возможные подка-
талоги, а только те,которее были использо-
ваны недавно (или есть в закладках).

Спецификация вызовов:

№  название  описание    вход      выход 
#C2      взять элемент BC=номер   A=ошибка 
           каталога   HL=^buf1  HL^=entry
           (entry)    DE=^format  DE=?
                                  BC=? 
#C3        установить  HL=^name   A=ошибка 
            маску     DE=^format BC=число
           каталога   BC=attr     DE=?
                                  HL=?


            Сведения о диске

Функции #C4 и #C6 возвращают информацию по
указанному диску/пути или файлу.
Функции  #C5  и  #C7  меняют информацию по
указанному диску/пути или файлу, но только
если это возможно.

Параметры

 BC      возвращает      #C4     #C6 
#0000 место на диске в Кб  HL текст ASCIIZ 
#0001 глубина директории   L  текст ASCIIZ 
         (1=корень)

Спецификация вызовов:

№  название  описание    вход      выход 
#C4 GETINFO  получить  DE=^name   A=ошибка 
           параметры  BC=infonum    BC
           в числовом    HL         DE
              виде                  HL 
#C5 SETINFO установить DE=^name   A=ошибка 
           параметры  BC=infonum    BC
           в числовом HL=значение   DE
              виде                  HL 
#C6 GETINF$  получить  DE=^name   A=ошибка 
           параметры  BC=infonum    BC
             в виде   HL=^buf       DE
             строки                 HL 
#C7 SETINF$ установить DE=^name   A=ошибка 
           параметры  BC=infonum    BC
             в виде  HL=^значение   DE
             строки                 HL


        Манипулирование файлами

Функция  #CB  удаляет файлы или директорию
(директория должна быть пуста).

Функция #CC проверяет наличие файла (ошиб-
ка или нет).

Остальные функции пока не определены.

Спецификация вызовов:

№  название  описание     вход      выход 
#C8? RESET инициализация    -     A=ошибка 
        файловой системы 
#C9? FLUSH  освободить      -        -"- 
       все буферы на диск 
#CA? MAKE  создать файл  DE=^name    -"- 
           или каталог 
#CB  KILL  удалить файл  DE=^name    -"- 
       или пустой каталог 
#CC  EXIST   проверить   DE=^name    -"- 
          наличие файла
          или каталога 
#CD? ASSIGN подключает   DE=^name    -"- 
           новый диск   HL=^newname 
#CE? MOVE   move/rename  DE=^oldname -"- 
       файлов/каталогов HL=^newname 
#CF? COPY  дублирование  DE=^srcname -"- 
       файлов/каталогов HL=^desname


      Простейшие файловые функции

Функции  для работы с файлами. Если вы хо-
тите загрузить весь файл в память или сох-
ранить  часть  памяти как файл, посмотрите
сначала функции #E0..#ED.

Функция #D0 всегда закрывает файл с задан-
ным хэндлом. Если в качестве хэндла дан 0,
то закроются все открытые файлы.
Функция #D1 открывает файл на чтение (воз-
вращает ошибку,если файла нет).
Функция  #D2  открывает  файл  на запись -
удалит существующий  файл и создаст новый,
нулевой длины.
Функция  #D3 открывает файл и на чтение, и
на запись.Если файл не существует,он будет
создан с первой записью.

Функции #D4..#D7 используются для чтения и
записи файла. Функции #D4 и #D5 пересылают
указанное  количество  байтов  (возвращает
число байт,переданное на самом деле - если
оно меньше запрошенного,генерируется ошиб-
ка). Функция  #D6 читает байты из файла до
предела или до значений #00 или #0D (вклю-
чая  их). Функция  #D7 записывает байты до
байта #00, который не записывается. Он за-
пишется  только  будучи  первым  байтом  в
строке.

Функция  #D8  возвращает текущую позицию в
файле. Функция  #D9  позволяет переместить
текущую  позицию в файле и возвращает ста-
рую позицию в файле.Смещение отсчитывается
в зависимости  от регистра B: #FF означает
"с начала", #00 "с текущей позиции", а #01
"с конца" файла. Ошибочное  значение возв-
ращается, если пересечено начало или конец
файла. Возможна  адресация файла длиной до
8MB (23 бита адреса).
Функция #DA сообщает, находится ли текущая
позиция в конце файла (EOF).
Функция  #DB урезает файл по текущей пози-
ции.

Следующие  функции - почти  прямые  вызовы
системной структуры FILEDISK. Её определе-
ния ещё могут поменяться в будущем.

Спецификация вызовов:

№  название  описание     вход      выход 
#D0 CLOSE  закрыть файл D=хэндл   A=ошибка 
#D1 OPENI  открыть файл DE=^name  A=ошибка 
           на чтение              D=хэндл 
#D2 OPENO  открыть файл DE=^name  A=ощибка 
           на запись              D=хэндл 
#D3 OPENO  открыть файл DE=^name  A=ощибка 
        на чтение/запись          D=хэндл 
#D4 READ     чтение     D=хэндл  BC=readed 
           из файла    BC=длина  A=ошибка
                       HL=^databuf 
#D5 WRITE    запись     D=хэндл BC=written 
            в файл     BC=длина  A=ошибка
                       HL=^data 
#D6? GETL читать строку D=хэндл   A=ошибка 
           из файла    BC=maxlen BC=длина
                       HL=^linebuf 
#D7? PUTL запись строки D=хэндл   A=ошибка 
            в файл     HL=^line 
#D8 FPOS    получить    D=хэндл   EHL=pos 
       текущую позицию           A=ошибка 
#D9 SEEK   установить   D=хэндл EHL=oldpos 
           позицию     B=откуда  A=ошибка
                       EHL=newpos 
#DA? EOF    проверка    D=хэндл   A=ошибка 
         на окончание 
#DB? TRUNC урезать файл D=хэндл   A=ошибка 
      по текущей позиции


           Файлы с заголовком

Функции #E0..#E7 оперируют файлами с заго-
ловком (наподобие ленточных).

Перед вызовом функций #E4..#E6 тип заголо-
вка должен  быть установлен одной из функ-
ций  #E0..#E3. Эта  установка действует до
следующего   вызова   любой   из   функций
#E0..E3. Если файл существует,то в опреде-
лённых регистрах возвратятся значения,взя-
тые из заголовка этого файла.Если файл от-
сутствует  или  требуемый тип заголовка не
соответствует считанному,возвращается при-
знак ошибки. Ошибка может быть игнорирова-
на,если будет предпринята запись в файл,но
чтение такого файла будет всегда приводить
к ошибке.

На  входе в функцию #E3 размер буфера ука-
зывается в BC. Длина,возвращаемая в BC,ог-
раничена этим размером,тогда как DE содер-
жит  размер реальный. Это сделано во избе-
жание ограничения ленты - вы не можете за-
гружать  с реальной ленты несколько первых
байт длинного файла,и его контрольная сум-
ма не может быть проверена. Также,BC=#1B00
и  HL=#4000  распознаются как ваше желание
загрузить  или  записать  экран (однако вы
можете  загружать его и сохранять с других
адресов).

Чтение и запись выдаёт ошибку,если считано
или записано меньше байт,чем требовалось.В
этом случае проверяйте BC.
Операция верификации эквивалентна чтению и
происходит как на ленте - ошибка,если дан-
ные различаются или файл слишком короткий.

Функция #E7 вызавается перед #E4..#E6. По-
зволяет  установить смещение, которое даёт
возможность  последовательного  доступа  к
файлу. Это означает,например,чтение после-
довательных  частей  файла  в разные банки
памяти. Ошибка возвращается, когда позиция
перейдёт   через   конец   файла.  Функции
#E0..#E3 всегда устанавливают смещение в 0
(сразу после заголовка).

Вызов любой  из функций #E4..#E7 без пред-
варительного вызова одной из #E0..#E3 при-
водит к фатальной ошибке.

Файл с заголовком может быть до 65535 байт
длиной (не  включая  заголовок). Остальное
отрезается. Формат  заголовка может разли-
чаться в разных файловых системах. Поэтому
не приветствуется обработка файлов с заго-
ловком с помощью других функций, за исклю-
чением случаев, когда файл экран или игро-
вая отгрузка.

Для  файлов  с  расширениями, отличными от
".CZX",".DZX",".DAT",".ROM",".SCR",вызыва-
ется соответствющее RSX. Так вы можете,на-
пример, загружать  данные или Бейсик-прог-
рамму из файла "*.Z80"! Более подробно чи-
тайте в документации по RSX.

Спецификация вызовов:

№  название  описание     вход      выход 
#E0 HEADER0 выбор файла DE=^name  A=ошибка 
          типа program BC=prog   DE=длина
                       HL=line   BC=prog
                                 HL=line 
#E1 HEADER1 выбор файла DE=^name  A=ошибка 
              типа     H=тип&имя DE=длина
          number array          H=тип&имя 
#E2 HEADER2 выбор файла DE=^name  A=ошибка 
              типа     H=тип&имя DE=длина
         character array        H=тип&имя 
#E3 HEADER3    выбор    DE=^name  A=ошибка 
            двоичного  BC=maxlen DE=длина
              файла    HL=start  HL=start
                                 BC=длина 
#E4 LOAD    читать файл BC=длина  A=ошибка 
            в память   HL=start BC=readed 
#E5 SAVE  запись в файл BC=длина  A=ошибка 
            из памяти HL=start BC=written 
#E6 VERIFY   сравнить   BC=длина  A=ошибка 
              файл     HL=start
            с памятью         BC=verified 
#E7 SHIFT   переместить DE=shift  A=ошибка 
         позицию в файле


             Экранные файлы

Для чтения или записи спектрумовских экра-
нов могут  быть использованы функции #E8 и
#E9. Операция  всегда  подразумевает  6912
байт  памяти. Разделение этих функций поз-
воляет конвертировать графику из/в различ-
ные графические форматы. Записанный  экран
имеет 256x192 пикселов и 16 цветов,но воз-
можны исключения.Если содержимое загружен-
ного  файла  не совместимо с ограничениями
Spectrum,результат будет не определён.Оши-
бка возвращается,если файл не был записан,
или не существует,или формат не распознан.

В будущих релизах ZXVGS будут использованы
RSX для чтения и записи изображений с рас-
ширениями,отличными от ".SCR" и ".CZX".Эти
функции  могут  также показывать на экране
диалог со списком допустимых форматов,если
не было дано расширение файла,или файл при
чтении отсутствует, или имя файла пустое.

Другие экранные режимы также будут поддер-
жаны.

Спецификация вызовов:

№  название  описание     вход      выход 
#E8 LOADSCR load screen  DE=^name A=ошибка 
            from file   HL=addr 
#E9 SAVESCR save screen  DE=^name A=ошибка 
             to file    HL=addr


         Файлы игровых отгрузок

Функции #EA и #EB разработаны для сохране-
ния  и  восстановления  состояний  игр или
конфигураций системных программ.Вызов этих
функций   позволяет  пользователю  выбрать
один  из  10  таких файлов. При сохранении
пользователь может комментировать файл.Фа-
йлы  сохраняются  с  именем  текущей прог-
раммы  и  одним из расширений "SV0".."SV9"
(выбираемых пользователем).

При  D=0 диалог не появится, и файл примет
расширение по умолчанию ".SV?".В этом слу-
чае  E содержит код символа, помещаемого в
3-ю позицию расширения (непригодные симво-
лы заменяются на "!").Эта возможность пре-
дусмотрена  для  загрузки дефолтной конфи-
гурации при запуске программы или сохране-
ния  её  на выходе. Строка комментария при
сохранении  устанавливается  в "Autosaved"
(могут  быть  включены  дата и время). Это
можно  использовать наряду со стандартными
вызовами (когда пользователь выбирает сам)

Для  функции #EA при HL=0 используется ад-
рес из заголовка.

Расширение  "SV@" (E=#40)  зарезервировано
для  хранения файла таблицы рекордов. Если
файл  существует, ZXVGS  загружает "*.SV@"
сразу после файла "*.V00". Позже файл сох-
раняется, когда пользователь вызывает меню
ZXVGS. В  новых программах он должен будет
сохраняться  функцией #EB при каждой моди-
фикации таблицы рекордов.Файлы "*.SV?" со-
храняются и загружаются на диске "SV:".

Спецификация вызовов:

№  название  описание     вход      выход 
#EA LOADCFG load settings BC=длина A=error 
                         DE=^title
                         HL=addr 
#EB SAVECFG save settings BC=длина A=error 
                         DE=^title
                         HL=addr


          Файлы без заголовка

Функция  #EC используется для загрузки це-
лого  файла  или его начальной части в па-
мять. Код  ошибки  возвращается, если было
загружено меньше байт, чем запрошено.

Функция  #ED  используется  для сохранения
непрерывной  области  памяти  в  файл. Код
ошибки  возвращается, если  было сохранено
меньше байт,чем требовалось (мало места на
диске).

Всегда проверяйте BC при ошибке.

Спецификация вызовов:

№  название  описание     вход      выход 
#EC LOADANY    load    BC=длина   A=ошибка 
            any file  DE=^name  BC=readed
                      HL=addr 
#ED SAVEANY    save    BC=длина   A=ошибка 
            any file  DE=^name BC=written
                      HL=addr


            Селекторы файлов

Функции  #EE  и #EF позволяют пользователю
выбирать  или вводить имя файла или дирек-
тории лёгким  способом. Возможно  указание
имени  по  умолчанию  и ограничение выбора
маской. Маска  может редактироваться поль-
зователем, заисключением "*/",что означает
выбор директории. Имеется также титул опе-
рации. Для  представления  результа (с пу-
тём)  необходимо  зарезервировать 128 байт
под буфер. Функции возвращают ошибку, если
селектор  файлов  был  покинут  по  кнопке
<EDIT>, или имя файла пустое.

Функция  #EE  всегда возвращает экран (об-
ласть памяти #4000.. #5AFF) нетронутой,что
во  многих  ситуациях выливается в ограни-
ченной форме селектора. Функция #EF всегда
использует полноэкранный интерфейс, но ос-
тавляет экран в случайном состоянии. После
этого требуется обновление экрана.

Рекомендуется использование селекторов фа-
йлов  для каждого случая задания имён фай-
лов пользователем.

Если маской является  "*.SZX" или "*.SCR",
то селектор может также позволить выбирать
другие  форматы  графики  и соответственно
может менять расширение.

Спецификация вызовов:

№  название  описание     вход      выход 
#EE FILESELL селектор  DE=^default A=error 
            без порчи BC=^mask   name=DE^
             экрана   HL=^title 
#EF FILESELH селектор  DE=^default A=error 
            с порчей  BC=^mask   name=DE^
             экрана   HL=^title


                Принтер

Функция  #F0  возвращает  контрольный  код
принтера.В регистре E задаётся номер кода,
в HL - адрес буфера под него. В BC задаёт-
ся  максимальная  длина (B  игнорируется -
должен быть 0). Когда контрольные коды по-
мещены в буфер, BC (B=0) содержит количес-
тво  символов, а A равен 0. Если буфер был
слишком  мал, BC возвращает требуемый раз-
мер,а A>0.Если контрольный код недоступен,
то BC=0 и A>0.

Функция #F1 пересылает требуемый контроль-
ный код непосредственно на принтер.См.так-
же функцию #F0.

Функция  #F2  эквивалентна команде Бейсика
COPY.

Функция #F3 печатает экран (256x192), взя-
тый с указанного адреса.

Функция  #F4  имитирует ZX Printer на нор-
мальном символьном принтере.

Функция #F5 имитирует ZX Printer на матри-
чном принтере, но для символьного принтера
работает как функция #F4.

Функция #F6 предназначена для печати текс-
тов с национальными символами. Если в сис-
теме  нет перекодиторания, то эквивалентно
функции  #F7. Значения  1..5  в регистре D
выбирают набор символов ISO-8859-D.

Функция #F7 пересылает байт непосредствен-
но  на принтер (контрольные последователь-
ности можно получить функцией #F0).

Функции  #F0..#F6  обслуживаются   модулем
{PRINTER.RZX}.

        Контрольные коды принтера
          для функций #F0 и #F1:

код   смысл       установка для принтера 
                Epson FX     HP LaserJet
             {EPSONFX.RZX} {LASERJET.RZX} 
#00 число иголок      8            8 
#01 перед печатью  27,65,8         ? 
   экрана 
#02 число точек     224,1          ? 
   в mode1 
#03 выбор mode1  27,75,224,1       ? 
#04 число точек     192,3          ? 
   в mode2 
#05 выбор mode2  27,76,192,3       ? 
#06 код для CR       13           13 
#07 код для LF       10           10 

Спецификация вызовов:

№  название  описание    вход      выход 
#F0 GETPRINT  взять     E=код    A=ошибка 
          контр.код HL=^buffer BC=codelen
           принтера  BC=buflen  code=HL^ 
#F1? SETPRINT выдать    E=код    A=ошибка 
          контр.код 
#F2 DUMP    печать 22      -        A=? 
        строк экранной
           графики 
#F3? DUMPANY  печать  HL=address    A=? 
           24 строк
       экранной графики 
#F4 ZXPRINT   печать   E=символ     A=? 
          символа, как
         на ZX Printer 
#F5? HLPRINT  печать  HL=^pattern   A=? 
            символа,  E=символ
       определённого по HL
         как ZX Printer 
#F6? DEPRINT  печать  D=modificator A=? 
            символа  E=символ
        с модификатором 
#F7 LPRINT    прямой  E=символ      A=? 
        вывод на принтер


                Оверлеи

Функции  #F8..#FB предназначены для управ-
ления оверлеями. Обычно оверлеями являются
следующие  уровни игры. Оверлей может быть
загружен  вызовом  функции #F8 с указанием
номера  оверлея. Подготовка (функция  #F9)
даёт результат на серверных системах и по-
зволяет  поднять скорость загрузки (напри-
мер,на Timex FDD 3000) - не является необ-
ходимой.Загрузка оверлеев в буфер (функция
#FA)  приводит  к ускорению загрузки. Этот
вариант  игнорируется, когда  недостаточно
ОЗУ для хранения. Это может быть использо-
вано  вместо загрузки оверлеев непосредст-
венно в банки памяти (наподобие игр, рабо-
тающих и на ZX48, и на ZX128), поскольку в
буфере оверлеи хранятся в сжатой форме и,к
тому же, могут храниться в теневом ОЗУ под
ПЗУ (MB-02).Функция #FB удаляет оверлей из
буфера. Все  функции  возвращают свободное
место  в буфере в килобайтах. Если свобод-
ного места больше, чем 254kB, возвращается
значение 255.

Спецификация вызовов:

№  название  описание     вход      выход 
#F8 OVRLOAD load overlay  E=номер   A=free 
            E=0 значит
        главную программу 
#F9 OVRPREPARE  load      E=номер   A=free 
          overlay в буфер
      only if multitasking 
#FA OVRSTORE copy overlay E=номер   A=free 
       во внутренний буфер 
#FB OVRREMOVE  remove     E=номер   A=free 
     overlay из внутр.буфера


            Системные вызовы

Функции  #FC..#FF предназначены для выхода
из программы в системное меню и завершения
работы программы.

Функция  #FC только вызывает системное ме-
ню. Программа может быть продолжена.
Функция #FD завершает программу после око-
нчания  её  работы (закрывает все открытые
файлы,банки,очищает буфер оверлеев и т.д.)
Функция  #FE  похожа на #FD, но показывает
нужное сообщение перед выходом в меню.
Функция  #FF зарезервирована для интерпре-
татора  Бейсика, который вызывает её после
выполнения последней инструкции.Это беспо-
лезно для программ ZXVGS. Обычно (без RSX)
слово  из  XPTR  #5C5F  копируется в CHADD
#5C5D, #FF помещается в ERRNR #5C3A,и про-
грамма  продолжается  с  #0058 (обработчик
ошибок).

Спецификация вызовов:

№  название  описание     вход      выход 
#FC MENU   выход в меню,    -       A=??? 
         возврат пунктом
           "Continue" 
#FD QUIT   выход в меню     -         - 
          с сообщением
       "Program finished" 
#FE FATAL  выход в меню  DE=^text 

{zxvgs@yarek.com},{http:\zxvgs.yarek.com} 




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

Похожие статьи:
Doors kick start - новая ОС для Спектрума - DoorsAQUA 7.1, быть или не быть? Breeze разьясняет.
Sofтинка - Релизы ОС ZXVGS и их различия.
Новости - Новая ОС для ZX Spectrum: мини интервью с Павлом Фединым.

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