                 ░            ░▓▄▄▄▄▄
▄             ▓  ▓▀ ▀▀▀▓▄▄▄▄▄  ▀▓█▄ ▀▀▀████▓▄▄▄▄              ▓
██▓██▄▄▄     ▓░        ░    ▀▀▀▀▒▀█▓▄       ▀▀▀▀██▓██▄▄▄     ▓░
  ░▀▀▀▓███▓▄█▒                  ░  ▒   ▀░         ░▀▀▀▓███▓▄█▒
      ░  ▀▀█ ░                     ░                  ░  ▀▀█ ░


                     Quick Commander v3.20
                   Описание для разработчиков


    Здесь  собрано  то,  что  нужно  тем,  кто  пишет программы,
работающие вместе с QC, или проверяет QC на своей машине: что QC
требует от компьютера; какие конфигурации сверх ZX Spectrum 128K
с  AY  и  TR-DOS  5.04T  он  поддерживает, через какие порты и с
какими  особенностями;  где  в файле QC лежат его настройки; как
устроен резидент и как вернуться в QC из своей программы; как QC
работает  с  TR-DOS и какие форматы файлов он понимает. Описание
для  пользователя  -  в  файле  guide_ru.txt. Все числа даны для
релизной сборки QC 3.20.


    :: Что нужно QC

    Процессор Z80 и прерывания IM 1 (QC ставит I = #3F) 50 раз в
секунду:  по  ним  работают  плэйер  и  ожидание кнопок. Пока QC
работает, включено ПЗУ BASIC 48 (бит 4 порта #7FFD всегда 1): QC
вызывает  его процедуры PO_MSG (#0C0A), MAIN_4 (#1303), STMT_RET
(#1B76),  BREAK_KEY  (#1F54),  CLEAR_1  (#1EB7), а также #22B0 и
#30A9.  Кнопки  QC  берет  из  LAST_K (#5C08), которую заполняет
обработчик прерываний ПЗУ; нажатия мыши QC кладет туда же.

    ПЗУ  TR-DOS  -  5.03 и новее: адреса, которые использует QC,
одинаковы  в 5.03, 5.04, 5.04T, 5.04S, 5.5H, 6.07+, 6.10E, 6.11E
и  в  ПЗУ SMUC; в 5.01 они другие. Дисководы - 80 цилиндров, две
стороны:  QC  считает  дорожку  как  цилиндр*2+сторона и пишет в
каталог  тип  диска  #16.  Копия  каталога по умолчанию лежит на
дорожке  161  (цилиндр  80), так что дисковод должен доходить до
80-го цилиндра.

    Память во время работы QC:

        #5B00-#5B7F  таблица страниц (по 2 байта на страницу)
        #5B80, #5B90 набираемое имя, маска
        #5B98        код запуска программы
        #5C00-#5D3A  системные переменные
        #5D3B-#5E51  BASIC-загрузчик с настройками
        #5FE8        стек (растет вниз)
        #6000-#AD7E  код QC
        #AD7F-#ADFF  отметки файлов
        #AE00-#B6FF  каталог рабочего диска (при старте - код
                     настройки QC и проверки памяти, один раз)
        #B700-#BFFF  каталог диска, на который копируют
        #C000-#FFFF  окно страниц: буфер, вьюверы

    Кодовая  страница  -  #D7  (значение порта #7FFD): с #C000 -
загрузчик  и  упакованный  ZX0  код QC, с #FD45 по #FF97 - копия
системных  переменных и BASIC-загрузчика, снятая при загрузке, с
#FFF0   -  метка  "Residentpresent!".  Страницы  2  и  5  QC  не
переключает;  остальные (кроме кодовой, см. ниже) идут под буфер
Copy и Move, по 64 сектора на страницу.


    :: Дисковод: ВГ93 напрямую

    Порты  Beta  Disk отвечают, только пока включено ПЗУ TR-DOS:
оно  включается,  когда  команда  выбирается  из  #3D00-#3DFF, и
выключается  при выборке из ОЗУ. Поэтому QC пишет и читает порты
контроллера  кусками  кода  самого  ПЗУ:  кладет  на стек адреса
нужных  кусков  и входит в ПЗУ через #3D2F (там NOP; RET), часто
цепочкой из нескольких кусков. Порты: #1F - команда и состояние,
#3F  -  дорожка,  #5F  -  сектор,  #7F - данные, #FF - системный
регистр (при чтении бит 7 - INTRQ, бит 6 - DRQ).

    В  системный регистр QC пишет #2C плюс номер дисковода (биты
0-1): бит 2 = 1 - без сброса, бит 3 = 1 - HLT, бит 5 = 1 - как у
TR-DOS,  бит  6  =  0  -  MFM;  бит  4 = 1 (#3C) выбирает первую
сторону,  четные  дорожки  TR-DOS.  Команды:  #08  -  на нулевой
цилиндр,  #18 - позиционирование (шаг 6 мс, без проверки), #80 и
#A0 - чтение и запись сектора, #C0 - чтение адреса, #F0 - запись
дорожки, #D0 - прерывание команды.

    Адреса ПЗУ TR-DOS, которыми пользуется QC:

        #3D2F - вход в ПЗУ (NOP; RET);
        #3D13 - функция 5, чтение секторов: загрузка QC и
                файла кода перед запуском;
        #2A53 - OUT (C),A; RET: регистры ВГ93, порт ATM2;
        #3EF5 - ожидание конца команды;
        #3FE5, #3FCA - чтение (INI) и запись (OUTI) данных;
        #2740 - состояние и позиционирование;
        #2090, #2093, #2099 - чтение и запись сектора;
        #294A, #2920, #2970 - загрузка BASIC-программы;
        #0048 - выход в TR-DOS (кнопка T);
        #3FF0, #3FF3 - OUT и IN для часов SMUC.

    Скорость  (CONFDRV, см. "Настройки в файле QC"): для каждого
дисковода свои биты быстрого чтения и записи; в медленном режиме
после каждого позиционирования QC ждет еще один кадр (EI; HALT).
Кроме  того,  первая  запись  после сброса или выхода на нулевую
дорожку ждет около 0.3 с, если QC не видел, что диск вращается.

    Свой  код QC загружает функцией #3D13 (так готовилось для QC
4.00),  поэтому  грузится  везде,  где  работает  TR-DOS, и с ее
RAM-диска. До 3.20 по умолчанию работал быстрый загрузчик Ursula
2.4  (Nick  Patlaenko):  на  0.4  с быстрее, но он сам работал с
портами  ВГ93, ошибок не проверял и в эмуляторах без этих портов
не работал.

    Ошибки  диска:  после 4 неудачных попыток QC показывает меню
Retry  /  Abort / Ignore / Skip; между попытками он читает адрес
(#C0),  чтобы  поправить регистр дорожки, или выходит на нулевой
цилиндр. Правая кнопка мыши, удержанная 5 кадров во время работы
с диском, - то же, что Break.

    Форматирование:  дорожки  с  159-й по 0-ю, на каждой сектора
1..16    по    порядку    (без    чередования:   поэтому   диск,
отформатированный   QC,   читается  быстрее),  номер  стороны  в
заголовках  - 0, размер сектора - 256 байт; каждая дорожка после
записи  читается.  Restore  disk  так  же переформатирует каждую
дорожку  и  записывает  ее  сектора обратно, Check disk - только
дорожки с ошибками.

    RAM-диск  TR-DOS 6.1xE QC не видит: он доступен только через
#3D13, а QC работает с ВГ93 напрямую.


    :: Расширенная память

    QC  определяет  память  при  каждом  запуске, с выключенными
прерываниями.  Сначала  он  проверяет,  есть  ли 128Кб: включает
страницу  1  (#7FFD  =  #11) и смотрит, изменилась ли страница 0
(#10).  Если  нет  -  это  48Кб  (или #7FFD заперт: QC запущен в
режиме  48Кб),  и  QC пробует только порт ZX-Evolution #F7F7: на
ней  часы  должны оставить ее #EFF7 как есть (см. о часах Gluk).
Иначе   он   пробует  порты  по  порядку,  и  первый  ответивший
определяет машину:

        порт   машина                 биты страницы
        #F7F7  ZX-Evolution           3-7, инверсные
        #FFF7  ATM Turbo 2+           3-5, инверсные
        #AFF7  Pentagon 4096          0, 1
        #1FFD  Scorpion, KAY          4, 6, 7
        #DFFD  Profi                  0-2
        #FDFD  ATM1                   0-2
        #7FFD  Pentagon 1024          5 (с Caps shift)
        #7FFD  128Кб, Pentagon 512    0-2, 6, 7

    Порты  ATM пробуются первыми, с битами 0-2 #7FFD (биты 6 и 7
там  страниц  не выбирают). ZX-Evolution отвечает на оба, но все
4Мб  переключает  только  ее  порт  x7F7  (#F7F7:  8  бит номера
страницы,  биты  0-2  по-прежнему из #7FFD); если #F7F7 нашел не
больше 1024Кб, это ATM. Pentagon 4096 (#AFF7: "Pentagon 4М" в QC
с  3.04,  его  драйвер есть и в ALASM 4.46) пробуется после них:
ZX-Evolution  с прошивкой BaseConf принимает #AFF7 за свой #EFF7
(любой  порт с A12 = 0, A8 = 1 и младшим байтом #F7 вне TR-DOS),
а  0 в нем включает режим Pentagon 1024 и турбо, в котором порты
ATM  страниц  не переключают: QC 3.11, пробовавший #AFF7 первым,
видел  там  512Кб.  Scorpion  GMX  (#DFFD  с  битом  4  #1FFD) и
Pentagon-4096  с  GitHub (#7FFD, #1FFD и #DFFD по его настройке)
не поддерживаются.

    Страницы QC считает так: в каждой комбинации значений портов
он  запоминает  байт  по  адресу  #C000, обнуляет его и отмечает
страницы,  в  которых  байт  остался  нулем  (ненулевой  - та же
страница  под  другим  номером); потом все байты возвращаются на
место,  так  что  содержимое  памяти,  например  RAM-диска,  при
запуске  сохраняется (но не после Copy и Move). Страниц QC берет
не  больше 64 (1024Кб, как QC 3.11: для копирования целого диска
хватает 40), но считает все найденные: в окошке режимов - машина
(zx  -  48Кб  и 128Кб, pen - Pentagon, evo - ZX-Evolution, atm -
ATM1 и ATM2, k/s - Scorpion и KAY, pro - Profi) и вся ее память,
например "evo 4096k". На Pentagon 4096 проба находит 128 страниц
(биты 0 и 1 #AFF7 с битами 0-2, 6 и 7 #7FFD): "pen 2048k".

    Таблица  страниц  (#5B00) - по 2 байта на страницу: значение
расширенного  порта  и  значение  #7FFD;  первыми идут 8 страниц
128Кб.  На  Pentagon биты страницы добавляются к значению #7FFD,
на  остальных  машинах  QC пишет сначала расширенный порт, потом
#7FFD.  В ATM2 и ZX-Evolution значение инвертируется и пишется в
#FFF7  или  #F7F7  через  ПЗУ TR-DOS (#2A53): порты ATM отвечают
только при включенном ПЗУ TR-DOS (так же делает Real Commander).

    Кнопки  при  запуске:  W - только 128Кб (QC работает с одним
портом  #7FFD); Caps shift - Pentagon 1024 по биту 5 порта #7FFD
(без  нее  находится  512Кб).  На  машинах,  где  бит  5 #7FFD -
блокировка  (на  всех,  кроме  Pentagon  1024),  Caps  shift при
запуске  блокирует порт до сброса: QC считает, что у него 128Кб,
но все страницы оказываются нулевой.

    8-я страница используется, только если в CONFIG2 бит 5 = 1 и
в  ПЗУ  BASIC  48  по  адресу  #0008 нет команды JP (#C3). Такая
команда  есть  в ПЗУ Scorpion, у которого в 8-й странице теневой
монитор.

    Кодовую  страницу (с резидентом) QC не берет под буфер, если
в CONFIG2 бит 1 = 1 и памяти больше 128Кб; на 128Кб (и с кнопкой
W)  она идет под буфер, и Copy или Move могут затереть резидент.
Кодовая страница - та, что включает #D7: 7-я на 128Кб, Scorpion,
Profi,  ATM и ZX-Evolution, 31-я на Pentagon 512/1024/4096, 23-я
на KAY 1024. QC находит ее при запуске: тест памяти метит каждую
страницу  номером  ее записи в таблице страниц, и запись кодовой
страницы  меняется  местами  с  записью номер 7, которую драйвер
памяти  пропускает.  До  3.20 пропускалась сама страница номер 7
таблицы  (#17),  и на Pentagon 512/1024/4096 и KAY 1024 резидент
от Copy и Move не был защищен.

    48Кб:  буфер  Copy  и  Move - окно #C000 (16Кб, 64 сектора),
файлы  для  просмотра  и поиска музыки читаются не длиннее 16Кб,
распаковка - тоже в 16Кб, текстовый вьювер не работает.

    +2A/+3  (порт #1FFD с ПЗУ +3) QC не поддерживает. Отдельного
кода  для  таймингов  Pentagon  и других машин в QC нет: паузы -
счетные циклы, с турбо они короче.


    :: Shadow RAM и кнопка Magic

    Если  при загрузке QC с диска держать I, QC щелкает и мигает
бордером зеленым, включает теневое ОЗУ (кэш) чтением порта #FB и
записывает  в него резидент дважды: при #7FFD = #C7 и #D7 (бит 4
выбирает  16Кб  банк теневого ОЗУ на 32Кб). Есть ли теневое ОЗУ,
QC не проверяет; выключается оно чтением порта #7B.

    Каждый  банк:  #0000-#003E - нули (NOP: Reset Service у Gluk
входит  в  теневое  ОЗУ  с  адреса  0  и  доходит до резидента),
#003F-#0067  -  резидент (41 байт, его JR по адресу #0066 - вход
по NMI), с #0068 - копия кодовой страницы с #C000 по #FF97.

    Magic должна давать NMI при включенном теневом ОЗУ. Резидент
ставит  стек  #5FE8, включает страницу #D7, копирует #0068-#3FFF
обратно  в  #C000,  очищает экран и бордер и переходит на #C000.
Загрузчик восстанавливает системные переменные и BASIC-загрузчик
(#5C00-#5E52),  распаковывает  QC  в  #6000  и запускает его; QC
выключает теневое ОЗУ и берет настройки из CMOS, как при запуске
из ПЗУ.


    :: QC в ПЗУ вместо Basic 128

    QC_3_20.rom (16Кб) прошивается вместо ПЗУ Basic 128, то есть
как  ПЗУ  0 (бит 4 #7FFD = 0); ПЗУ 1 должно быть BASIC 48, нужен
Beta  Disk.  Настройки  берутся  из  CMOS; без нее QC стартует с
настройками сборки (режим бута, дисковод A).

    Образ: с #0000 - DI и NOP до #0037, так что и вход по адресу
0, и прерывание IM 1 по #0038 запускают QC. С #0038: стек #5FE8,
бордер  0,  очистка атрибутов, #7FFD = #C7 (кодовая страница: та
же,  что  #D7,  а  ПЗУ  QC  остается  включенным; до 3.20 - #07,
страница 7, и на Pentagon 512/1024/4096 и KAY 1024 QC искал свой
код,  настройки и резидент в другой), копирование образа с #005B
в  #C000  и  переход  на  загрузчик.  С  #005B лежат загрузчик и
упакованный  код  (они  попадают  в  #C000), с #3DA0 - системные
переменные   #5C00-#5D3A   с  дескриптором  файла  "QC  3.20"  и
BASIC-загрузчик  с  настройками  (попадают в #FD45). Вход по NMI
при  включенном  ПЗУ  QC  не  предусмотрен:  по  #0066  там  код
загрузчика.


    :: Часы CMOS

    Работа с часами задается в CONFIG2: бит 2 - работать с CMOS,
бит  3  -  Gluk  (1)  или SMUC (0), бит 4 - чтение и запись (0 -
только часы).

    Gluk:  OUT  (#EFF7),#80  (бит  7  открывает  доступ),  номер
регистра  -  в #DFF7, данные - IN или OUT через #BFF7, затем OUT
(#EFF7),0.  Прочитать этот порт нельзя, и QC пишет весь регистр,
каждый  кадр,  пока  ждет кнопку: другие биты порта, если они на
машине  есть,  обнуляются.  Где  страницы  переключает  порт ATM
(#F7F7  ZX-Evolution  или  #FFF7  ATM2;  на ZX-Evolution - и при
запертом  #7FFD, когда QC запущен в режиме 48Кб, и с кнопкой W),
вместо  этого  пишутся  #94  и #14: бит 2 = 1 держит выключенным
режим Pentagon 1024 (в нем биты 3-5 страницы берутся из #7FFD, и
страницы  буфера  с  8-й  ложатся на первые восемь), бит 4 = 1 -
частоту 3,5 МГц, как их ставит для TR-DOS меню загрузки.

    SMUC:  порты отвечают только при включенном ПЗУ TR-DOS, и QC
обращается  к ним через куски ПЗУ SMUC: OUT (C),A; RET по адресу
#3FF0  и IN A,(C); RET по #3FF3. Чтение: номер регистра в #DFBA,
затем  IN из #DFBA. Запись: номер регистра в #DFBA, #F7 в #FFBA,
данные  в #DFBA, #77 в #FFBA. Эти куски есть в ПЗУ TR-DOS SMUC и
в 6.10E/6.11E, но не в 5.04T: с 5.04T часы SMUC выбирать нельзя.

    Часы:  QC  читает  регистр  #0B; #FF - часов нет, и время не
печатается. Если запись разрешена, QC на время чтения ставит #0B
=  %00000010  (24  часа, BCD) и потом возвращает прежнее. Пока в
регистре  #0A  бит  7  (UIP)  =  1,  кадр  пропускается. Время -
регистры 4, 2, 0 (часы, минуты, секунды в BCD).

    Ячейки  QC:  #10  -  входящий  дисковод (0..3); #15 - CONFIG
(биты  0-2 - исходящий дисковод, 4 - fullcat выключен, 5 - метка
QC, 6 - без зацикливания, 7 - режим бута); #16 - номер файла под
курсором  +  1  (1..#80;  0  -  ничего).  QC пишет их при каждой
отрисовке  курсора,  если  в  CONFIG2  биты  2 и 4 = 1, а читает
только  при запуске из ПЗУ или по Magic при тех же битах; CONFIG
из  #15 берется, только если в нем бит 5 = 1. Ячейка #10 - общая
с   Real   Commander   1.96   и   TR-DOS  6.05E+  (дисковод  для
автозапуска). Бит 7 в #10 у Mr Gluk Reset Service 6.3+ запрещает
запоминать дисковод: тогда QC, как и Gluk, эту ячейку не пишет.


    :: Мышь Kempston

    Порты:  #FBDF - X, #FFDF - Y (инверсный: QC инвертирует его,
чтобы  Y  рос  вниз),  #FADF  - кнопки в битах 0-2 (0 - нажата):
бит 0   -   правая,  бит 1  -  левая,  бит 2  -  третья,  как  у
Kempston-мыши. У ZX-Evolution (и в MAME, pentevo) левая - бит 0:
при бите 7 CONFIG2 = 0 QC переставляет биты 0 и 1 обратно (Quick
Setup:  Mouse:  swapped).  Колесо  не читается. Кнопка считается
нажатой после 3 кадров без изменений.

    Мышь  QC  ищет  при  запуске: целый кадр (1202 чтения #FADF)
читает  ее  кнопки,  и  если  хоть  одна  читается нажатой, мышь
выключается:   так   ее   можно  отключить,  держа  кнопку.  Без
интерфейса  порты  на  большинстве  машин  читают  #FF,  и  мышь
остается  включенной, но ничего не делает. На сером 128 и +2 они
читают  плавающую  шину: байты экрана, пока он рисуется, и #FF в
бордюре;  за кадр среди байтов экрана почти всегда найдется байт
с  нулем  в  битах 0-2, и мышь тоже выключается. В Unreal Speccy
для порядка Kempston-мыши нужно SwapMouse=1.


    :: AY

    Плэйер  релизной  сборки  (PTxPlay  Сергея Булбы) работает с
одним  AY: #FFFD - номер регистра, #BFFD - данные. Регистры 0-12
пишутся  каждый  кадр,  13  -  только когда меняется. Индикаторы
берут  регистры 0-5 и 8-10 из копии плэйера в памяти: то, что он
только что записал в AY (AY не читается). Второй AY (TurboSound)
QC 3.20 не выбирает.


    :: Настройки в файле QC

    Файл   "QC   3.20"   (тип   B,   старт  и  длина  -  279)  -
BASIC-загрузчик:  строка  1  CLEAR  24575:  RANDOMIZE  USR 23925
(числа  спрятаны  за  точками),  за  ней  настройки, загрузчик и
распаковщик;  с  3-го сектора файла - упакованный код. Настройки
начинаются  со  смещения  23 (#17) от начала файла и занимают 35
байт,  в  памяти  после  загрузки  - #5D52-#5D74. Число секторов
упакованного  кода  лежит  по  смещению  74  (#4A):  длина файла
зависит от сборки, ее надо брать из каталога. boot.B, записанный
Save boot, устроен так же, с текущими настройками.

    Ниже  -  эти байты со значениями по умолчанию и смещениями в
файле  (метки  -  как  в  исходнике  QC 3.11; в 3.20 это Config,
Config2,  DriveConfig,  DirectoryCopy,  FileColors, OtherColors,
Colors,       ViewerTextColor      и      ViewerInfoColor      в
src/loader/settings.asm):

        ;0-2: output drive (kept for a return)
        ;3: unused in 3.20 (3.11: H packs with LE)
        ;4: 1 - fullcat off, 0 - fullcat on.
        ;5: 1 - QC config ID, 0 - RC config ID.
        ;6: 1 - play without loop, 0 - loop on.
        ;7: 1 - boot mode, 0 - commander mode.
CONFIG  DB %10111000                        ;#17

        ;0: not used (till 3.20: 1 - fast load QC, Ursula).
        ;1: 1 - keep the code page off the buffer (>128K).
        ;2: 1 - use CMOS, 0 - don't use.
        ;3: 1 - Gluk CMOS, 0 - SMUC CMOS.
        ;4: 1 - read & write CMOS, 0 - clock only.
        ;5: 1 - use page 8 (not on Scorpion), 0 - never.
        ;6: not used.
        ;7: 1 - Kempston mouse buttons, 0 - swapped.
CONFIG2 DB %11111111                        ;#18

        ;0: 1 - fast load, 0 - slow load: Drive A.
        ;1: 1 - fast save, 0 - slow save: Drive A.
        ;2: 1 - fast load, 0 - slow load: Drive B.
        ;3: 1 - fast save, 0 - slow save: Drive B.
        ;4: 1 - fast load, 0 - slow load: Drive C.
        ;5: 1 - fast save, 0 - slow save: Drive C.
        ;6: 1 - fast load, 0 - slow load: Drive D.
        ;7: 1 - fast save, 0 - slow save: Drive D.
            ;D C B A
CONFDRV DB %11111111                        ;#19

KEEP_TS DW #A107                            ;#1A

COLORSF DB #47,#07,#43             ;B C s   ;#1C
        DB #45,#45,#45,#45,#45,#45 ;m M - - S w
        DB #44,#44,#44,#44         ;W t T d
        DB #02,#42,#42,#42,#42     ;p z Z r h
        DB #05,#05,#05,#05,#05     ;H R a A X
COLORSO DB #04,#01,#06             ;scr del oth ;#33
COLORS  DB #5F,#78,#05,#30                  ;#36

    CONFIG: биты 0-2 - исходящий дисковод: QC запоминает его при
запуске программ (в резиденте и CMOS), а при запуске с диска оба
дисковода  берутся  из  системной переменной TR-DOS #5CF6, и эти
биты  файла не используются. Бит 3 в 3.20 не используется. Бит 5
=  1 отличает байт настроек QC от байта Real Commander: CONFIG с
битом  5  =  0,  вернувшийся  из резидента или CMOS, QC не берет
(дисководы  и  курсор  -  берет).  Остальные  биты  -  режимы по
умолчанию.  Это  единственный байт настроек, который меняется во
время работы.

    CONFIG2:  бит  0  не используется (до 3.20 - чем грузить код
QC:  Ursula  или  #3D13);  бит 1 - не брать кодовую страницу под
буфер  при  памяти  больше  128Кб;  биты  2-4  -  часы CMOS (при
бите 4 = 0  настройки  в  CMOS  не пишутся и из нее не читаются,
показываются  только  часы); бит 5 - 8-я страница. Подробнее - в
разделах "Расширенная память" и "Часы CMOS".

    CONFDRV   задает   скорость  чтения  и  записи  для  каждого
дисковода:  в  режиме  fast  скорость  выше  в  ~1.5-2  раза, но
возможна  некорректная  запись  на медленных дисководах (если вы
работаете  под  эмулятором, рекомендуется всегда включать fast);
при  slow гарантируется корректная запись на любых дисководах за
счет    дополнительной    задержки    (одного    кадра)    после
позиционирования.

    KEEP_TS  -  где хранится копия каталога для Keep и autoKeep:
младший  байт  - сектор (считая с 0), старший - дорожка (#A107 -
сектор  7  дорожки  161).  Keep форматирует эту дорожку заново и
пишет  9  секторов  каталога,  начиная  с этого сектора, так что
сектор - не больше 7. Есть ли на дорожке файлы, QC не проверяет.

    COLORSF  - цвета 21 типа файлов, в порядке, обратном таблице
типов  панели  ("XAaRHhrZzpdTtWwSXXMmsCB");  байты 6 и 7, где до
3.20  были  .v  и  .V, не используются. COLORSO - цвета экранных
файлов и шрифтов (их QC узнает по длине: 6912, 6144, 2048, 768),
удаленных файлов и файлов остальных типов. COLORS - цвета самого
QC:  курсор  на  отмеченном  файле,  отмеченные  файлы, текст во
вьювере  по  умолчанию,  информационная строка вьювера. Всего 24
группы файлов по цвету.

    Программа  настройки  может  узнать  файл QC по BASIC-строке
(байты  4-21 файла: FD 2E 0E 00 00 FF 5F 00 3A F9 C0 2E 0E 00 00
75  5D  00) и по команде LD SP,#5FFF (#31 #FF #5F) в начале 3-го
сектора.  Расположение настроек не менялось с 3.11. В образе ПЗУ
настройки лежат со смещения #3EF2.


    :: Резидент и возврат в QC

    Резидент   -  кодовая  страница  #D7  целиком:  загрузчик  с
упакованным  кодом  QC  (с  #C000), копия системных переменных и
BASIC-загрузчика    с    настройками   (#FD45-#FF97)   и   метка
"Residentpresent!"  (#FFF0-#FFFF),  которую  QC пишет при каждом
запуске:  по  ней  TR-DOS 6.10E и новее при сбросе запускает QC.
Цел  ли  резидент,  QC проверяет по слову #FF31 в #C000 страницы
#D7  (команда LD SP,#5FFF загрузчика) и по последним двум байтам
метки  ("t!"  в  #FFFE:  стек  программы портит их первыми): это
"res" в окне режимов и условие Save boot.

    Почему  #D7,  а  не  #17:  до 3.10 QC, как и Real Commander,
держал  резидент  в  странице  #17;  с  3.11  он  в странице #C7
стандарта  Pentagon,  чтобы  его  находили TR-DOS 6.05E+ и 6.10E
(бит  4  выбирает  только ПЗУ, так что #D7 - та же страница, что
#C7).  Там, где #7FFD не смотрит на биты 6 и 7 (128Кб, Scorpion,
Profi,  ATM), #D7 = #17 - 7-я страница; на Pentagon 512/1024 это
31-я, на KAY 1024 - 23-я страница, и программа, которая включает
#17, QC там не найдет.

    Возврат в QC из своей программы:

        LD BC,#7FFD
        LD A,#D7 ;(не #17!!!)
        OUT (C),A
        LD HL,(#C000)
        LD DE,#FF31
        XOR A
        SBC HL,DE
        JP Z,#C000
        LD H,A
        LD L,A
        PUSH HL
        LD A,#10
        OUT (C),A
        JP #3D2F

    Если  резидент  цел, JP #C000 запускает загрузчик: он ставит
стек,  восстанавливает  системные  переменные  и BASIC-загрузчик
(#5C00-#5E52),  распаковывает  QC в #6000 и запускает его. Иначе
включаются  страница  0 и ПЗУ BASIC 48, на стек кладется 0, и JP
#3D2F  (NOP;  RET  в  ПЗУ  TR-DOS) уходит на адрес 0 ПЗУ TR-DOS:
TR-DOS  6.10E и новее найдут метку "Residentpresent!" и запустят
QC,  остальные  просто стартуют. Стек программы должен быть ниже
#C000   (PUSH   выполняется  при  включенной  странице  #D7),  а
прерывания  лучше  запретить  заранее:  загрузчик  запрещает  их
только  второй  командой.  QC  пишет  только порт #7FFD, поэтому
расширенный порт (#1FFD, #DFFD, #FDFD) программе лучше вернуть в
0 до выхода.

    Чего  программа не должна трогать, чтобы вернуться: страницу
#D7  с  #C000  по #FF97 и метку с #FFF0. На 128Кб эта страница -
второй   экран  (#C000-#DAFF):  программа,  показывающая  второй
экран,  резидент  затирает.  Программа, запущенная в режиме 48Кб
(R), вернуться не может: порт #7FFD заблокирован.

    Что QC помнит при запуске программы: перед запуском он пишет
в  страницу  #D7  номер  файла  под курсором + 1 (#FD42), CONFIG
(#FD43)  и  входящий  дисковод  (#FD44)  и  ставит  LaunchedFrom
(#C01E)  =  2.  При  возврате через резидент QC берет их оттуда:
курсор  -  если  он  1..#80,  CONFIG  -  если  в  нем  бит 5 = 1
(исходящий дисковод - из его битов 0-1 в любом случае), входящий
дисковод   -   из  третьего  байта.  Так  восстанавливаются  оба
дисковода, меню, курсор, fullcat и зацикливание. LaunchedFrom: 0
-  запуск  с  диска,  1  -  из  ПЗУ или по Magic, 2 - возврат из
программы.


    :: Запуск программ

    Перед  любым  запуском  QC  пишет  сохраняемое  в  резидент,
включает  страницу  0  и  ПЗУ  BASIC  48  (#7FFD  = #10, порт не
заблокирован),  ставит  CURCHL  =  #5D26 и HL' = #2758, кладет в
дескриптор  TR-DOS  (#5CDD-#5CEC)  запись  файла  из каталога, в
#5CF5  -  дорожку  файла  (головка  выводится  на  нее), DosHook
(#5CC2) = RET, текущий дисковод - в #5CF6, #5D19, #5CF8, #5CF9 и
в  биты 0-1 #5D16, и разрешает прерывания (IY = #5C3A, IM 1, I =
#3F). Системные переменные: LAST_K = 0, REPDEL = 16, REPPER = 1,
FLAGS = #CD, FLAGS2 = 0, P_POSN = 0.

    Файл  кода  загружается  с  поля  старта  файла  и с него же
запускается,  без  вопросов  (до  3.20 адреса загрузки и запуска
запрашивались  в  строке  23);  файл  кода  со  стартом в экране
(#4000-#5AFF)  показывается  вьювером,  как  по  V; файлы других
типов,  кроме  BASIC,  не запускаются. Экран очищается (бордер и
атрибуты  0),  память #5D3B-#FFFF страницы 0 обнуляется, сектора
файла  читаются  функцией  #3D13  (не  дальше  #FFFF), программа
запускается через PUSH IX; JP #3D13, стек - #5FE8. Адрес запуска
ниже #4000 попадает в ПЗУ TR-DOS.

    BASIC-программа: бордер белый, CLEAR (#1EB7) с RAMTOP #FF00,
память  #5D3B-#FE4B  обнуляется,  файл загружается ПЗУ TR-DOS по
дескриптору,  без  поиска  в  каталоге  (поэтому  запускаются  и
удаленные   файлы,   и  файлы  с  одинаковыми  именами),  строка
автозапуска  берется  из  байтов  #80, #AA и номера строки после
программы, выполнение начинается через STMT_RET (#1B76).

    Запуск  в  режиме  48Кб  (R  в  главном  меню):  #7FFD = #30
(страница 0, ПЗУ BASIC 48, бит 5 - блокировка), расширенный порт
-  значение страницы 0. На Pentagon 1024 бит 5 - номер страницы,
а не блокировка.

    Выход  в  TR-DOS  (T):  бордер 7, P_RAMT = #FFFF, переход на
#0048 ПЗУ TR-DOS; в резидент ничего не пишется.


    :: Особенности работы с TR-DOS

    Каталожными и файловыми процедурами TR-DOS QC не пользуется:
9  секторов  каталога  он  читает и пишет сам через ВГ93. Из ПЗУ
TR-DOS  он берет только функцию 5 (#3D13: загрузка своего кода и
файлов  кода),  загрузку BASIC-программы (#294A, #2920, #2970) и
выход  в  TR-DOS  (#0048);  все  остальное - куски кода ПЗУ (см.
"Дисковод: ВГ93 напрямую").

    Геометрия:  дорожка D - это цилиндр D/2, четные дорожки - на
первой  стороне (#3C в системном регистре), нечетные - на второй
(#2C).  Сектор  E  -  0..15,  как у TR-DOS, на диске - номер E+1
(1..16),  по  256  байт;  номер  стороны в заголовке сектора при
чтении  не  проверяется. В сообщениях об ошибках и в сведениях о
файле  сектора  -  0..15. Номер дорожки может быть любым до 255,
чтение и запись переходят с дорожки на дорожку.

    Размер  диска  QC  берет из служебного сектора самого диска:
номер  первого  свободного  сектора  (#E1,  #E2)  плюс свободные
сектора  (#E5-#E6).  Так  что  диски любого размера, в том числе
больше 160 дорожек, сохраняют свой размер. Но Format, Check disk
и  Restore  disk  работают  только  с  дорожками  0-159, а копия
каталога на дорожке 161 на большем диске ляжет поверх файлов: QC
этого не проверяет.

    Тип  диска  (#E3)  QC не читает и всегда пишет #16; двойного
шага  и  одной  стороны  у  QC нет. По коду (не проверялось) это
значит: 40-дорожечный диск (#17) работает только в 40-дорожечном
дисководе,  односторонний (#18, #19) читается неправильно везде,
кроме  нулевой  дорожки, а после записи QC и TR-DOS считает диск
80x2.  Format всегда делает 160 дорожек, Keep и autoKeep требуют
80-го цилиндра.

    Служебный сектор (сектор 8 нулевой дорожки при счете с 0) QC
пересчитывает  в  памяти  после  каждого чтения каталога и перед
каждой  записью:  #00  = 0; #E1, #E2 - первый свободный сектор и
дорожка,  после последней записи каталога, считая удаленные; #E3
=  #16;  #E4  -  число  записей  до  конца  каталога;  #E5-#E6 -
свободные сектора (размер диска минус номер первого свободного);
#E7  = #10; #F4 - число удаленных. Поэтому Files, Deleted и Free
в  панели - собственный счет QC, а не записанные на диске числа.
Байт   #10   в   #E7   при  чтении  не  проверяется:  чужой  или
неотформатированный  диск  QC  показывает как есть, а при записи
ставит  #10  (после  этого его примет и TR-DOS). Остальные байты
сектора QC записывает обратно такими, как прочитал (исключение -
прерванный Copy, см. ниже).

    Имя  диска  у QC - 11 символов: #F5-#FF, до конца сектора; у
TR-DOS  -  8 (#F5-#FC). Format TR-DOS пишет в #FD-#FF нули, и QC
показывает  их  знаком  ▒.  Имя  видно в правой колонке панели и
меняется кнопкой N: не набранные байты остаются как были, Delete
ставит пробел. Format QC пишет в #EA-#F2 9 пробелов, как TR-DOS,
а  не  набранные знаки имени оставляет нулями. CAT и LIST TR-DOS
печатают имя до байта 0 или байта с битом 7: если в #F5-#FF нуля
нет  (набраны  все  11  символов),  печать идет дальше имени (по
исходнику TR-DOS 5.04T, не проверялось).

    Каталог  -  128  записей  по  16 байт; первый байт имени 0 -
конец  каталога, 1 - удаленный файл. Панель показывает записи до
конца  каталога,  удаленные  -  тоже; в режиме Fullcat (F) - все
128,  а  записи  после  конца  -  знаком  ▒  и цветом удаленных.
Отмечать  удаленные  записи  и записи после конца нельзя. Delete
ставит  1,  и  если за удаленными идет конец каталога, вся серия
удаленных  перед  ним  становится  концом  (0),  а  их  место  -
свободным; пишется только каталог.

    Перед  каждой записью каталога (Delete, R, CS+R, N, M, C, G,
K,  Save boot, U) QC читает сектора 0-7 каталога во второй буфер
и   сравнивает   с  каталогом  в  памяти;  служебный  сектор  не
сравнивается.  При  расхождении - Bad disk., команда отменяется,
каталог  перечитывается.  Два  диска с одинаковыми секторами 0-7
(например, два пустых) проверку проходят, и QC запишет служебный
сектор  первого  (имя,  размер) на второй. Сам смену диска QC не
замечает:  каталог  перечитывается  кнопками  1-4  и  5, третьей
кнопкой мыши, при Format, rEstore и после Bad disk.

    Copy:  файлы  копируются  в  порядке  отметки; таблицу этого
порядка  (129 байт) QC держит в служебном секторе рабочего диска
в  памяти,  #40-#C0.  Файлы  дописываются после последней записи
выходного  каталога,  считая удаленные, с его первого свободного
сектора:  удаленные  записи  заново  не используются, одинаковые
имена  не  проверяются.  Перед  копированием  QC  проверяет, что
хватает  секторов  (иначе No Space. Free: n) и что записей будет
не  больше 128 (иначе Cat Over. Free: n); размер выходного диска
-  из  его служебного сектора. После прерванного Copy (Abort, No
Space,  Cat Over) таблица порядка остается в служебном секторе в
памяти и при следующей записи каталога рабочего диска попадет на
диск.  С одним дисководом QC просит менять диски (Insert OUTPUT,
Insert INPUT) и выходной каталог читает только при первой смене.
Если  на выходном диске есть метка autoKeep, пишется и его копия
каталога.

    Move  (M): начиная с первого удаленного файла (после первого
отмеченного,    если    есть   отмеченные)   все   живые   файлы
перечитываются   и  записываются  подряд  с  первого  свободного
сектора;  удаленные  записи  после  этого  места пропадают. Если
памяти  не  хватает на все сразу, каталог пишется по частям, без
копии  autoKeep. Merge (G): отмеченные записи должны идти подряд
в  каталоге (что они подряд и на диске, QC не проверяет). Первая
запись  сохраняет  имя,  тип, старт и длину, растет только число
секторов,  так  что  длина  перестает сходиться с секторами (см.
ниже).   Больше   255  секторов:  первая  запись  получает  255,
следующая  отмеченная  (со  своим  именем)  - остаток; остальной
каталог сдвигается.

    Длина файла для View, U и вьюверов: число секторов - байт 13
записи  (файл  из  0  секторов  не читается: снова панели). Поле
длины  принимается,  если  его старший байт равен числу секторов
минус  1  (младший  байт  не  0) или числу секторов (младший 0);
иначе  длина  -  (секторы-1)*256+#FF. На 48Кб больше 64 секторов
считается как 64 сектора и 16383 байта. Copy и запуск файла кода
берут  байт  13  как  есть:  файл с 0 секторов копируется пустой
записью, а при запуске ничего не загружается.

    Имена  и расширения: 8 символов имени и тип (байт 8); TR-DOS
знает  только тип. QC показывает трехсимвольное расширение - тип
и  два байта поля старта (младший, старший), если оба - #20..#7F
(#7F  печатается знаком копирайта), иначе тип и два пробела. Так
у  любого  типа,  и  у B, у которого в старте - длина программы:
например, CODE 30000 (#7530) выглядит как .C0u. Строка панели: 8
символов имени, узкая точка, тип, два символа расширения и число
секторов (3 цифры, ведущие нули - узкими точками). Байты #00-#1F
и  #B0-#DF  печатаются  клетчатым  знаком ▒, #80-#AF и #E0-#EF -
русскими  буквами,  #F0-#FF - знаками QC; первый байт удаленного
файла (1) - тоже ▒.

    Как  команды пишут расширение. R пишет тип как набран, а два
символа  -  в  поле старта, только если оба печатные (#20..#7F);
два  пробела  дают  #2020,  если  расширение было длинным, а при
коротком  старт не трогают; русские буквы старт не меняют. Маски
(CS+L,  CS+X, CS+R) - 12 символов: имя, точка (не сравнивается),
тип, младший и старший байт старта; сравниваются байты как есть,
▒ - любой байт. CS+R пишет все символы маски, кроме ▒, как есть,
русские  буквы  тоже. U дает тип X для p_X и z_X, иначе C, и два
пробела в старте. Copy переносит запись как есть.

    Цвет  файла  в панели, по порядку проверки: удаленный - цвет
удаленных;  поле  длины  ровно  6912,  6144, 2048 или 768 - цвет
картинок, даже раньше типа (11136 и 49152 сюда не входят); тип p
или  z  с  "_"  в  младшем  байте старта - цвет типа из старшего
байта;   иначе   тип   ищется  (с  учетом  регистра)  в  таблице
"XAaRHhrZzpdTtWwSXXMmsCB",   а   не   найденный   получает  цвет
остальных файлов (так и у D и # TR-DOS). Типы таблицы:

        B  BASIC               p  Hrust
        C  код                 z  .zip, .zx0
        s  .scr, .scl          Z  ZXZip
        m  ProTracker 3        r  .rar, .rzx, .rom
        M  ProTracker 2        h  Hrip
        S  Sound Tracker       H  ALASM
        w  .wav                R  Storm
        W  ZXWord              a  Masm, ZASM
        t  .txt                A  TASM, GENS
        T  .TXT                X  Xas
        d  .diz, .doc

    По  типу  QC  работает  только  с  B (Enter запускает BASIC,
список  бута,  Save  boot)  и  с  p_X,  z_X  (цвет и тип для U);
картинки  он  узнает  по  длине, упакованные файлы и музыку - по
содержимому.

    Русские  буквы:  Edit  переключает  раскладку  ЯВЕРТЫ, буквы
попадают  в  #80-#AF и #E0-#EF (cp866); Ё набрать нельзя. В поле
старта  их пишут только CS+R и U: R и показ расширения принимают
там  только  #20..#7F.  TR-DOS  печатает такие имена через PRINT
BASIC  (#80-#8F  -  блочная  графика,  #90-#A4  - UDG, #A5-#FF -
ключевые слова) и сравнивает имена побайтно.

    BASIC-файлы:  в  списке бута - только тип B без удаленных, в
порядке  каталога.  Запуск  идет по записи каталога, без поиска,
поэтому из файлового меню запускаются и удаленные, и одноименные
файлы;  строка  автозапуска  -  два  байта перед WORKSP, которые
TR-DOS  берет из #AA и номера строки после программы (QC #AA сам
не  проверяет).  Save  boot  всегда  добавляет  еще  один boot.B
(TR-DOS  запустит  первый);  его  старт, длина и сектора - как у
файла, из которого загружен QC.

    Переменные  TR-DOS:  QC  читает  #5CF6  (оба  дисковода  при
запуске  с  диска),  #5CE6-#5CEA  (запись своего файла, для Save
boot)  и  #5CF4,  #5CF5  -  место  кода на диске, которое TR-DOS
оставляет после загрузки BASIC-части (кто загружает файл QC сам,
должен  оставить  их  так  же).  DosHook  (#5CC2) = POP AF; RET:
вызовы  TR-DOS в процедуры BASIC (через #2F72) пропускаются, так
что   в   кусках  ПЗУ,  которые  зовет  QC,  проверка  BREAK  не
срабатывает;  перед запуском программы QC ставит туда RET. Время
шага  дисководов  (#5CFA-#5CFD)  =  8:  бит  7  =  0  (TR-DOS не
проверяет  дисковод  при  выборе),  шаг  6  мс; позиционирование
кусками #2740 идет с шагом 30 мс (#1B).

    Метка  autoKeep - 16 байт "Quick Commander " со смещения #C8
служебного  сектора. Кнопка K пишет или стирает (нулями) метку и
записывает  только  этот  сектор.  Таблица "DIRS" стандарта 8-го
сектора в 3.20 не сделана.

    Копия  каталога:  по  умолчанию сектора 7-15 (при счете с 0)
дорожки  161  - цилиндр 80, вторая сторона (см. KEEP_TS). Каждый
Keep  форматирует  эту  дорожку  заново  (в  первых  9  местах -
заголовки  8..16, в остальных 7 - цилиндр 0, сектор 0) и пишет 9
секторов   каталога;  autoKeep  делает  так  при  каждой  записи
каталога,  если  на диске есть метка. Show сравнивает 9 секторов
копии  с  каталогом  в  памяти;  rEstore  проверяет  байт #10 по
смещению  #E7  служебного  сектора  копии,  форматирует  нулевую
дорожку и пишет 9 секторов на ее сектора 0-8.


    :: Форматы файлов

    Тексты. Текстом QC показывает любой файл до 255 секторов (до
64Кб:   файл   грузится   в   страницы  0-3);  упакованный  файл
показывается   распакованным.   На   48Кб  текстовый  вьювер  не
работает.  Строк  -  не  больше 5460, остальные не показываются.
После  текста  вьювер  ставит метку конца #FF (байт, которого не
бывает в UTF-8).

    Кодировка  - cp866 или UTF-8. Если в тексте нет байтов #80 и
больше,  это  cp866  (в  информационной  строке - DOS). Иначе QC
проверяет  текст  с  первого  такого  байта: до 16 многобайтовых
последовательностей    в    пределах   1024   символов.   Начало
последовательности  -  #C2..#DF  (за  ним  1  байт продолжения),
#E0..#EF  (2),  #F0..#F4 (3); продолжение - #80..#BF. Текст - не
UTF-8,  если  раньше  встретится  байт  #80..#C1  или #F5..#FF в
начале символа или оборванная последовательность. Длинные формы,
суррогаты   и  коды  выше  U+10FFFF  не  проверяются.  Кнопка  C
загружает файл заново в другой кодировке.

    Текст  в UTF-8 QC переводит в cp866 на месте: А..я, Ё, ё - в
их  коды  cp866;  псевдографика  U+25xx  (░▒▓, рамки, █▄▌▐▀) - в
#B0..#DF;  кавычки U+00AB, U+00BB, U+201C, U+201D, U+201E - в ",
а U+2018, U+2019 - в '; тире U+2013 и U+2014 - в -; многоточие -
в  три  точки;  Є,  є  - в Е, е; Ї, ї и украинские I, i (U+0406,
U+0456)  -  в  латинские  I, i; Ў, ў - в У, у; украинские Г, г с
крючком  (U+0490,  U+0491)  - в Г, г; BOM, мягкий перенос и знак
ударения  выбрасываются;  знаки  шрифта вьювера (U+2265, U+2264,
U+2320,  U+2321, U+00F7, U+2248, °, U+2022 и ∙, ·, √, №, U+00B2,
■  и неразрывный пробел) - в его коды #F2..#FF, а ¤ - в #FD (там
у   шрифта   квадрат,   U+00B2);   остальные   символы,   и  все
четырехбайтовые,  -  в  знак  ?.  Байт, с которого не начинается
последовательность,  остается  как  есть;  но cp866 внутри UTF-8
сохраняется  только случайно (например, "ра" в cp866 - #E0 #A0 -
похоже на начало трехбайтовой последовательности и станет ?).

    Шрифт  вьювера  - 256 знаков шириной 4 точки: 64 колонки, 23
строки текста. #00 - пусто, #01-#1F и #7F - знаки cp437 (рожицы,
масти, стрелки, домик), #80-#AF - А..п, #B0-#DF - псевдографика,
#E0-#EF  -  р..я,  #F0  -  Ё,  #F1  - ё, #F2-#FF - знаки U+2265,
U+2264, U+2320, U+2321, U+00F7, U+2248 (больше или равно, меньше
или  равно, половинки интеграла, деление, примерно равно), °, ∙,
·,  √,  №,  U+00B2  (квадрат),  ■ и пусто. В #F2-#F7 и #FD шрифт
расходится с cp866 (там Є є Ї ї Ў ў и ¤).

    Конец  строки  - CR (#0D), LF (#0A), CR LF или байт 0; LF CR
дает  лишнюю  пустую  строку,  а  после  последнего конца строки
пустой строки нет. Табуляция (9) - до следующей колонки, кратной
8. Коды 11, 12, 21-31 и #7F печатаются знаками шрифта.

    Цвета по стандарту ACEdit: коды 1-7 - чернила 1-7 на черном,
8 - обычный цвет текста (из настроек), 14-20 - яркие чернила 1-7
на  черном (код минус 13). Код печатается пробелом и действует с
того  места, где стоит; атрибут - один на два знака, так что код
во  второй  половине  клетки  действует со следующей клетки. Код
прямо перед концом строки (CR, LF или 0) задает цвет, с которого
начинается вся строка; при концах CR LF так не получается (перед
LF  стоит  CR),  а  у  строки, перенесенной по ширине, этот цвет
получает  только  последняя  часть.  Код  0  цвета не задает: он
заканчивает  строку.  Кнопка  M  переключает  режимы: цвета (при
запуске),  коды  видны знаками шрифта и текст одного цвета, коды
скрыты (пробелы) и текст одного цвета.

    Перенос (W): без переноса строки обрезаются на 64-й колонке;
простой  перенос  -  на 64-й колонке; "умный" - после последнего
разделителя  в пределах 64 колонок (пробел . , ! ? - / \ : ;), а
без  разделителя  -  тоже  на  64-й. Строка ровно в 64 знака, за
которой  идет  конец  строки  (или код), лишней пустой строки не
дает.

    Картинки.  Длина  должна  быть  точной,  и младший байт - 0,
кроме  .bsc:  6144 (#1800) - только точки, атрибуты - #07 (белое
на  черном);  6912  (#1B00)  -  экран;  11136  (#2B80) - экран с
бордюром  .bsc;  49152 (#C000) - @-файл, показывается его начало
(6912  байт) как экран. Длина должна сходиться с числом секторов
(см.  "Длина  файла"  выше):  у @-файла - 192 сектора, а на 48Кб
@-файл  не показывается. Space, A и левая кнопка меняют цвета по
кругу:  свои,  черное  на  белом (#38), белое на черном (#07); у
6144  -  белое на черном и черное на белом. Упакованная картинка
узнается  по  длине распакованных данных. Форматы .img и .mlt не
поддерживаются.

    .bsc:  6912  байт  экрана  и  4224  байта  бордюра; картинка
384x304  (по  64  точки  слева  и  справа, 64 строки сверху и 48
снизу),  цвет на каждые 8 точек строки, по два цвета в байте - в
битах  0-2 и 3-5 (биты 6-7 не важны). QC показывает бордюр одним
цветом,  самым  частым  в его рисунке (при равенстве - с большим
номером), а при выходе возвращает черный.

    Шрифты:  768 байт - 96 знаков по 8 байт, сверху вниз (обычно
коды  #20-#7F);  показываются  по  32  знака в строке, в строках
экрана  10-12.  2048  байт  -  256 знаков: сам файл копируется в
верхнюю  треть экрана (#4000), а знаки рисуются в строках 16-23.
Цвета  -  белое  на  черном;  Enter  - следующий файл, остальные
кнопки - выход.

    Спрайты  (Symbol  shift  +  V):  любой  файл как черно-белая
картинка. Строка точек - ширина спрайта байт подряд (старший бит
-  левая  точка),  строки  идут  одна за другой, без знакомест и
атрибутов;  на  экране 184 строки. Ширина - 1..32 байта (вначале
32).  В информационной строке - смещение в файле левого верхнего
байта, десятичное. Файл короче 5888 байт дополняется нулями.

    Музыка: модули Pro Tracker 3 и Vortex Tracker II (PT3) и Pro
Tracker  2  (PT2),  плэйер  PTxPlay  Сергея  Булбы  (release 1).
Текстовый  заголовок  модуля  PT3  QC  ищет  в любом месте файла
(поэтому находит и скомпилированные модули с плэйером): букву T,
за  ней  r, за 4 байта до r - P ("ProTracker") или за 8 байт - V
("Vortex  Tracker"),  и  b через #3F байт от P или V (" by "). В
файлах  до  16Кб ищется весь файл, в больших - по 16-килобайтным
частям; 64 байта заголовка должны лежать в одной части, в файлах
короче 256 байт он не ищется (модуль ищется только по структуре,
см. ниже). Заголовок:

        +#00  "ProTracker 3.x compilation of " (версия
              в +#0D) или "Vortex Tracker II 1.0 module: "
        +#1E  название, 32 байта (строка 22, "PT3.5 : ")
        +#3E  " by "
        +#42  автор, 32 байта (строка 23, "Author: ")
        +#63  таблица нот (биты 0-1)
        +#64  темп
        +#65  число позиций (для полосы позиции)
        +#66  позиция цикла
        +#67  указатель паттернов
        +#69  32 указателя сэмплов
        +#A9  16 указателей орнаментов
        +#C9  список позиций, в конце #FF

    Версия  -  цифра  в  +#0D; не цифра (у Vortex Tracker там r)
считается  6.  Ниже  4  -  старые  таблицы  нот, ниже 5 - старая
таблица громкости, ниже 6 - старое портаменто, с 7 - правило Pro
Tracker 3.7 для команд 1xx и 2xx с задержкой 0. Название и автор
печатаются  шрифтом QC: #20-#AF как есть (#7F - знак копирайта),
#E0-#EF  -  р..я,  #F0-#FF  -  знаки  QC,  #00-#1F  и  #B0-#DF -
клетчатым знаком ▒.

    Если  текстового  заголовка  в  файле  нет, модуль ищется по
устройству  заголовка  в  первых  3Кб  файла  (UniSearch автора,
2005):  темп  1..#3F,  число  позиций  от 1 и позиция цикла в их
пределах,  список  позиций  с #FF прямо перед паттернами, пустой
орнамент  0  (у  PT3  - 0, 1, 0; у PT2 - 1, 0, 0). Так находятся
модули  PT2  (без  плэйера  или  после  плэйера Pro Tracker 2) и
модули  PT3  без  текста.  Формат  в строке 22: PT3.x (версия из
текста),  VT II,  PT3  (без  текста)  или  PT2  (у  PT2 - только
название: автора в заголовке нет).

    Модуль  играется,  если  все  его  48  указателей  сэмплов и
орнаментов  от начала модуля не выходят за #FFFF, то есть модуль
лежит  в  своей  16-килобайтной части файла. Исключение: модуль,
начинающийся  в  последних  6912 байтах части (с #E500), в файле
длиной  от  #4100  байт  переносится в начало окна вместе с 6912
байтами  следующей  части  (не  на  48Кб:  следующей части там в
памяти  нет). Конец мелодии - #FF после списка позиций: с циклом
игра  идет  дальше  с позиции цикла, без цикла AY замолкает и QC
переходит  к  следующему  файлу.  F  -  в  3  раза быстрее. Не в
релизной   сборке:   пары   TurboSound   (PTSPlay,  ключ  сборки
PLAYER=4).

    Hrust 2 (hr2): блок должен начинаться с первого байта файла:

        +0  "hr2"
        +3  флаги: бит 7 = 1 - данные не сжаты
        +4  длина распакованных данных (слово)
        +6  длина упакованного блока, считая с +8
        +8  упакованный блок

    Блок  один,  что  после  него  -  не читается. Распакованные
данные L должны поместиться с запасом: L + L/8 + 272 - не больше
64Кб,  то  есть  до  58012 байт; на 48Кб - до 14321 байта. Файл,
который  начинается  с "hr2", но не прошел проверку, как ZX0 уже
не  пробуется.  Hrust 1.x и архивы Hrip не распаковываются (Hrip
только раскрашивается).

    ZX0:  формат  ZX0  v2,  прямой (поток для dzx0_standard; для
dzx0_turbo  и dzx0_mega - тот же формат); обратный (-b) и старый
формат  v1  (-c)  не  подходят.  Заголовка у ZX0 нет, и поток QC
узнает сам: распаковывает его на пробу, без записи, и проверяет,
что  каждая  ссылка  -  в уже распакованные данные, маркер конца
стоит  точно  на  последнем  байте  файла,  данные  не  обгоняют
непрочитанную  часть  потока и не выходят за 64Кб. Поэтому длина
файла   в   каталоге   должна  быть  точной  длиной  потока,  не
округленной  до  сектора.  Данные  -  до 64Кб; на 48Кб - файл до
16Кб, а данные - в странице 0 с запасом 256 байт.

    Что   пишет   U:   имя   -   набранное   (предлагается   имя
упакованного),  тип  -  X из p_X или z_X, иначе C, поле старта -
два  пробела  (адрес  загрузки  кода  и  длина  BASIC-программы,
которую  TR-DOS  держит в старте, не восстанавливаются), длина -
длина  данных,  число  секторов - по ней; файл пишется с первого
свободного сектора, запись - в конец каталога.


    :: Соглашения с Real Commander

    QC  соблюдает  несколько  соглашений  Real  Commander (Pawel
Kislyak):  ячейка CMOS #10 - текущий дисковод (у QC - входящий);
бит 5 байта настроек (в ячейке CMOS #15 и в резиденте) = 1 - это
настройки  QC,  0  -  RC;  возврат в коммандер - по сигнатуре LD
SP,#??FF  (слово  #FF31)  в  #C000  резидентной  страницы.  Real
Commander  держит  резидент  в  странице  #17 и выходит в TR-DOS
через  JP  15649  (#3D21),  QC - в странице #D7 (см. "Резидент и
возврат в QC").


    :: Лицензия ZX0

    Распаковщик ZX0 в QC (загрузчик распаковывает им код QC, U и
вьюверы  -  файлы ZX0, им же проверяется поток ZX0) - "standard"
из ZX0 v2 Einar Saukas и Urusergi. Его лицензия:

    BSD 3-Clause License

    Copyright (c) 2021, Einar Saukas
    All rights reserved.

    Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:

    1. Redistributions of source code must retain the above
       copyright notice, this list of conditions and the
       following disclaimer.

    2. Redistributions in binary form must reproduce the above
       copyright notice, this list of conditions and the
       following disclaimer in the documentation and/or other
       materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of
       its contributors may be used to endorse or promote
       products derived from this software without specific
       prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.


                 ░            ░▓▄▄▄▄▄
▄             ▓  ▓▀ ▀▀▀▓▄▄▄▄▄  ▀▓█▄ ▀▀▀████▓▄▄▄▄              ▓
██▓██▄▄▄     ▓░        ░    ▀▀▀▀▒▀█▓▄       ▀▀▀▀██▓██▄▄▄     ▓░
  ░▀▀▀▓███▓▄█▒                  ░  ▒   ▀░         ░▀▀▀▓███▓▄█▒
      ░  ▀▀█ ░                     ░                  ░  ▀▀█ ░